Merge "Merge remote-tracking branch 'origin/master' into notification-service" into...
[platform/upstream/iotivity.git] / service / notification / android / notification-service / src / main / jni / consumer / JniNotificationConsumer.cpp
1 //******************************************************************\r
2 //\r
3 // Copyright 2016 Samsung Electronics All Rights Reserved.\r
4 //\r
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
6 //\r
7 // Licensed under the Apache License, Version 2.0 (the "License");\r
8 // you may not use this file except in compliance with the License.\r
9 // You may obtain a copy of the License at\r
10 //\r
11 //      http://www.apache.org/licenses/LICENSE-2.0\r
12 //\r
13 // Unless required by applicable law or agreed to in writing, software\r
14 // distributed under the License is distributed on an "AS IS" BASIS,\r
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16 // See the License for the specific language governing permissions and\r
17 // limitations under the License.\r
18 //\r
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
20 \r
21 #include "JniNotificationConsumer.h"\r
22 #include "NSConsumerService.h"\r
23 \r
24 static JavaVM *g_jvm = NULL;\r
25 \r
26 static jobject g_obj_postListener = NULL;\r
27 static jobject g_obj_discoverListener = NULL;\r
28 static jobject g_obj_syncListener = NULL;\r
29 static jobject g_obj_acceptListener = NULL;\r
30 \r
31 jclass g_cls_Message;\r
32 jclass g_cls_Provider;\r
33 jclass g_cls_SyncInfo;\r
34 jclass g_cls_MediaContents;\r
35 \r
36 static JNIEnv *GetJNIEnv(jint *ret)\r
37 {\r
38     JNIEnv *env = NULL;\r
39 \r
40     *ret = g_jvm->GetEnv((void **) &env, JNI_CURRENT_VERSION);\r
41     switch (*ret)\r
42     {\r
43         case JNI_OK:\r
44             return env;\r
45         case JNI_EDETACHED:\r
46             if (g_jvm->AttachCurrentThread(&env, NULL) != JNI_OK)\r
47             {\r
48                 LOGE ("Failed to get the environment");\r
49                 return NULL;\r
50             }\r
51             else\r
52             {\r
53                 return env;\r
54             }\r
55         case JNI_EVERSION:\r
56             LOGE ("JNI version is not supported");\r
57         default:\r
58             LOGE ("Failed to get the environment");\r
59             return NULL;\r
60     }\r
61 }\r
62 \r
63 void onDiscoverProvider(OIC::Service::NSProvider *provider)\r
64 {\r
65     LOGD ("ConsumerService_onDiscoverProvider");\r
66 \r
67     jint envRet;\r
68     JNIEnv *env = GetJNIEnv(&envRet);\r
69     if (NULL == env) return ;\r
70 \r
71     jobject jDiscoverListener = (jobject) env->NewLocalRef(g_obj_discoverListener);\r
72     if (!jDiscoverListener)\r
73     {\r
74         LOGE ("Failed to Get jDiscoverListener");\r
75         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
76         return ;\r
77     }\r
78 \r
79     LOGD ("ProviderId : %s\n", provider->getProviderId().c_str());\r
80 \r
81     jstring jProviderId = env->NewStringUTF(provider->getProviderId().c_str());\r
82     jlong pProvider = (long)provider;\r
83 \r
84     jclass cls_provider = (jclass) (env->NewLocalRef(g_cls_Provider));\r
85     if (!cls_provider)\r
86     {\r
87         LOGE ("Failed to Get ObjectClass for Provider");\r
88         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
89         return ;\r
90     }\r
91     jmethodID mid_provider = env->GetMethodID(\r
92                                  cls_provider, "<init>", "(Ljava/lang/String;)V");\r
93     if (!mid_provider)\r
94     {\r
95         LOGE ("Failed to Get MethodID for Provider<init>");\r
96         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
97         return ;\r
98     }\r
99     jobject obj_provider = env->NewObject(cls_provider, mid_provider,\r
100                                           jProviderId);\r
101 \r
102     jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J");\r
103     if (!nativeHandle)\r
104     {\r
105         LOGE("Failed to get nativeHandle for Provider");\r
106         return;\r
107     }\r
108     env->SetLongField(obj_provider, nativeHandle, pProvider);\r
109 \r
110     jclass cls = env->GetObjectClass(jDiscoverListener);\r
111     if (!cls)\r
112     {\r
113         LOGE ("Failed to Get ObjectClass for jDiscoverListener");\r
114         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
115         return ;\r
116     }\r
117     jmethodID mid = env->GetMethodID(\r
118                         cls,\r
119                         "onProviderDiscovered",\r
120                         "(Lorg/iotivity/service/ns/consumer/Provider;)V");\r
121     if (!mid)\r
122     {\r
123         LOGE ("Failed to Get MethodID for onProviderDiscovered");\r
124         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
125         return ;\r
126     }\r
127 \r
128     env->CallVoidMethod(jDiscoverListener, mid, obj_provider);\r
129 \r
130     env->DeleteLocalRef(jDiscoverListener);\r
131     env->DeleteLocalRef(cls_provider);\r
132     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
133     return ;\r
134 }\r
135 \r
136 void onSubscriptionAccepted(OIC::Service::NSProvider *provider)\r
137 {\r
138     LOGD ("ConsumerService_onSubscriptionAccepted");\r
139 \r
140     jint envRet;\r
141     JNIEnv *env = GetJNIEnv(&envRet);\r
142     if (NULL == env) return ;\r
143 \r
144     jobject jAcceptListener = (jobject) env->NewLocalRef(g_obj_acceptListener);\r
145     if (!jAcceptListener)\r
146     {\r
147         LOGE ("Failed to Get jAcceptListener");\r
148         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
149         return ;\r
150     }\r
151 \r
152     LOGD ("ProviderId : %s\n", provider->getProviderId().c_str());\r
153 \r
154     jstring jProviderId = env->NewStringUTF(provider->getProviderId().c_str());\r
155     jlong pProvider = (long)provider;\r
156 \r
157     jclass cls_provider = (jclass) (env->NewLocalRef(g_cls_Provider));\r
158     if (!cls_provider)\r
159     {\r
160         LOGE ("Failed to Get ObjectClass for Provider");\r
161         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
162         return ;\r
163     }\r
164     jmethodID mid_provider = env->GetMethodID(\r
165                                  cls_provider, "<init>", "(Ljava/lang/String;)V");\r
166     if (!mid_provider)\r
167     {\r
168         LOGE ("Failed to Get MethodID for Provider<init>");\r
169         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
170         return ;\r
171     }\r
172     jobject obj_provider = env->NewObject(cls_provider, mid_provider,\r
173                                           jProviderId);\r
174 \r
175     jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J");\r
176     if (!nativeHandle)\r
177     {\r
178         LOGE("Failed to get nativeHandle for Provider");\r
179         return;\r
180     }\r
181     env->SetLongField(obj_provider, nativeHandle, pProvider);\r
182 \r
183     jclass cls = env->GetObjectClass(jAcceptListener);\r
184     if (!cls)\r
185     {\r
186         LOGE ("Failed to Get ObjectClass for jAcceptListener");\r
187         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
188         return ;\r
189     }\r
190     jmethodID mid = env->GetMethodID(\r
191                         cls,\r
192                         "onSubscriptionAccepted",\r
193                         "(Lorg/iotivity/service/ns/consumer/Provider;)V");\r
194     if (!mid)\r
195     {\r
196         LOGE ("Failed to Get MethodID for onSubscriptionAccepted");\r
197         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
198         return ;\r
199     }\r
200 \r
201     env->CallVoidMethod(jAcceptListener, mid, obj_provider);\r
202 \r
203     env->DeleteLocalRef(jAcceptListener);\r
204     env->DeleteLocalRef(cls_provider);\r
205     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
206     return ;\r
207 \r
208 }\r
209 \r
210 jobject getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type)\r
211 {\r
212     switch (type)\r
213     {\r
214         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT:\r
215             {\r
216                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
217                                           "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
218                 return env->GetStaticObjectField(g_cls_Message, fieldID);\r
219             }\r
220         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE:\r
221             {\r
222                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
223                                           "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
224                 return env->GetStaticObjectField(g_cls_Message, fieldID);\r
225             }\r
226         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT:\r
227             {\r
228                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
229                                           "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
230                 return env->GetStaticObjectField(g_cls_Message, fieldID);\r
231             }\r
232         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO:\r
233             {\r
234                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
235                                           "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
236                 return env->GetStaticObjectField(g_cls_Message, fieldID);\r
237             }\r
238         default:\r
239             return NULL;\r
240     }\r
241     return NULL;\r
242 }\r
243 \r
244 void onMessagePosted(OIC::Service::NSMessage *message)\r
245 {\r
246     LOGD ("ConsumerService_onMessagePosted");\r
247 \r
248     jint envRet;\r
249     JNIEnv *env = GetJNIEnv(&envRet);\r
250     if (NULL == env) return ;\r
251 \r
252     jobject jPostListener = (jobject) env->NewLocalRef(g_obj_postListener);\r
253     if (!jPostListener)\r
254     {\r
255         LOGE ("Failed to Get jPostListener");\r
256         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
257         return ;\r
258     }\r
259 \r
260     LOGD ("id : %llu\n", message->getMessageId());\r
261     LOGD ("title : %s\n", message->getTitle().c_str());\r
262     LOGD ("content : %s\n", message->getContentText().c_str());\r
263     LOGD ("source : %s\n", message->getSourceName().c_str());\r
264 \r
265     jlong jMessageId = (jlong) message->getMessageId();\r
266     jstring jProviderId = env->NewStringUTF(message->getProviderId().c_str());\r
267     jstring jTitle = env->NewStringUTF(message->getTitle().c_str());\r
268     jstring jContentText = env->NewStringUTF(message->getContentText().c_str());\r
269     jstring jSourceName = env->NewStringUTF(message->getSourceName().c_str());\r
270 \r
271     jstring jTime = env->NewStringUTF(message->getTime().c_str());\r
272     jlong jTTL = (jlong) message->getTTL();\r
273 \r
274     jlong pMessage = (long) message;\r
275 \r
276     jclass cls_message = (jclass) (env->NewLocalRef(g_cls_Message));\r
277     if (!cls_message)\r
278     {\r
279         LOGE ("Failed to Get ObjectClass for Message");\r
280         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
281         return ;\r
282     }\r
283     jmethodID mid_message = env->GetMethodID(\r
284                                 cls_message, "<init>",\r
285                                 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");\r
286     if (!mid_message)\r
287     {\r
288         LOGE ("Failed to Get MethodID for Message<init>");\r
289         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
290         return ;\r
291     }\r
292     jobject obj_message = env->NewObject(cls_message, mid_message,\r
293                                          jTitle, jContentText, jSourceName);\r
294 \r
295     jfieldID fid_nativeHandle = env->GetFieldID(cls_message, "mNativeHandle", "J");\r
296     if (!fid_nativeHandle)\r
297     {\r
298         LOGE("Failed to get nativeHandle for Message");\r
299         return;\r
300     }\r
301     env->SetLongField(obj_message, fid_nativeHandle, pMessage);\r
302 \r
303     jfieldID fid_messageId = env->GetFieldID(cls_message, "mMessageId", "J");\r
304     if (!fid_messageId)\r
305     {\r
306         LOGE("Failed to get field MessageID for Message");\r
307         return;\r
308     }\r
309     env->SetLongField(obj_message, fid_messageId, jMessageId);\r
310 \r
311     jfieldID fid_providerId = env->GetFieldID(cls_message, "mProviderId", "Ljava/lang/String;");\r
312     if (!fid_providerId)\r
313     {\r
314         LOGE("Failed to get field ProviderID for Message");\r
315         return;\r
316     }\r
317     env->SetObjectField(obj_message, fid_providerId, jProviderId);\r
318 \r
319     jfieldID fid_time = env->GetFieldID(cls_message, "mTime", "Ljava/lang/String;");\r
320     if (!fid_time)\r
321     {\r
322         LOGE("Failed to get field Time for Message");\r
323         return;\r
324     }\r
325     env->SetObjectField(obj_message, fid_time, jTime);\r
326 \r
327     jfieldID fid_ttl = env->GetFieldID(cls_message, "mTTL", "J");\r
328     if (!fid_ttl)\r
329     {\r
330         LOGE("Failed to get field TTL for Message");\r
331         return;\r
332     }\r
333     env->SetLongField(obj_message, fid_ttl, jTTL);\r
334 \r
335     OIC::Service::NSMediaContents *mediaCont = message->getMediaContents();\r
336     if (mediaCont != nullptr)\r
337     {\r
338         jstring jIconImage = env->NewStringUTF(mediaCont->getIconImage().c_str());\r
339         jclass cls_mediaContents = (jclass) (env->NewLocalRef(g_cls_MediaContents));\r
340         if (!cls_mediaContents)\r
341         {\r
342             LOGE ("Failed to Get ObjectClass for MediaContents");\r
343             if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
344             return ;\r
345         }\r
346         jmethodID mid_mediaContents = env->GetMethodID(\r
347                                           cls_mediaContents, "<init>", "(Ljava/lang/String;)V");\r
348         if (!mid_mediaContents)\r
349         {\r
350             LOGE ("Failed to Get MethodID for MediaContents<init>");\r
351             if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
352             return ;\r
353         }\r
354         jobject obj_mediaContents = env->NewObject(cls_mediaContents, mid_mediaContents,\r
355                                     jIconImage);\r
356 \r
357         jfieldID fid_mediaContents = env->GetFieldID(cls_message, "mMediaContents",\r
358                                      "Lorg/iotivity/service/ns/common/MediaContents;");\r
359         if (!fid_mediaContents)\r
360         {\r
361             LOGE("Failed to get field mediaContents for Message");\r
362             return;\r
363         }\r
364         env->SetObjectField(obj_message, fid_mediaContents, obj_mediaContents);\r
365 \r
366     }\r
367 \r
368     jobject jType = getJavaMessageType(env, message->getType());\r
369     if (!jType)\r
370     {\r
371         LOGE("Failed to get Type value for Message");\r
372         return;\r
373     }\r
374     jfieldID fid_type = env->GetFieldID(cls_message, "mType",\r
375                                         "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
376     if (!fid_type)\r
377     {\r
378         LOGE("Failed to get field Type for Message");\r
379         return;\r
380     }\r
381     env->SetObjectField(obj_message, fid_type, jType);\r
382 \r
383 \r
384     jclass cls = env->GetObjectClass(jPostListener);\r
385     if (!cls)\r
386     {\r
387         LOGE ("Failed to Get ObjectClass for jPostListener");\r
388         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
389         return ;\r
390     }\r
391     jmethodID mid = env->GetMethodID(\r
392                         cls,\r
393                         "onMessageReceived",\r
394                         "(Lorg/iotivity/service/ns/common/Message;)V");\r
395     if (!mid)\r
396     {\r
397         LOGE ("Failed to Get MethodID for onMessageReceived");\r
398         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
399         return ;\r
400     }\r
401 \r
402     env->CallVoidMethod(jPostListener, mid, obj_message);\r
403 \r
404     env->DeleteLocalRef(jPostListener);\r
405     env->DeleteLocalRef(cls_message);\r
406     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
407     return ;\r
408 }\r
409 \r
410 void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync)\r
411 {\r
412     LOGD ("ConsumerService_onSyncInfoReceived");\r
413 \r
414     jint envRet;\r
415     JNIEnv *env = GetJNIEnv(&envRet);\r
416     if (NULL == env) return ;\r
417 \r
418     jobject jSyncListener = (jobject) env->NewLocalRef(g_obj_syncListener);\r
419     if (!jSyncListener)\r
420     {\r
421         LOGE ("Failed to Get jSyncListener");\r
422         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
423         return ;\r
424     }\r
425 \r
426     LOGD ("Sync ID : %llu\n", sync->getMessageId());\r
427     LOGD ("Sync ProviderId : %s\n", sync->getProviderId().c_str());\r
428     LOGD ("Sync STATE : %d\n", (int) sync->getState());\r
429 \r
430     jlong jMessageId = (jlong) sync->getMessageId();\r
431     jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str());\r
432     jint jState = (jint) sync->getState();\r
433 \r
434     jclass cls_sync = (jclass) (env->NewLocalRef(g_cls_SyncInfo));\r
435     if (!cls_sync)\r
436     {\r
437         LOGE ("Failed to Get ObjectClass for SyncInfo");\r
438         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
439         return ;\r
440     }\r
441     jmethodID mid_sync = env->GetMethodID(\r
442                              cls_sync, "<init>", "(JLjava/lang/String;I)V");\r
443     if (!mid_sync)\r
444     {\r
445         LOGE ("Failed to Get MethodID for SyncInfo<init>");\r
446         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
447         return ;\r
448     }\r
449     jobject obj_sync = env->NewObject(cls_sync, mid_sync,\r
450                                       jMessageId, jProviderId, jState);\r
451 \r
452     jclass cls = env->GetObjectClass(jSyncListener);\r
453     if (!cls)\r
454     {\r
455         LOGE ("Failed to Get ObjectClass for jSyncListener");\r
456         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
457         return ;\r
458     }\r
459     jmethodID mid = env->GetMethodID(\r
460                         cls,\r
461                         "onSyncInfoReceived",\r
462                         "(Lorg/iotivity/service/ns/common/SyncInfo;)V");\r
463     if (!mid)\r
464     {\r
465         LOGE ("Failed to Get MethodID for onSyncInfoReceived");\r
466         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
467         return ;\r
468     }\r
469 \r
470     env->CallVoidMethod(jSyncListener, mid, obj_sync);\r
471 \r
472     env->DeleteLocalRef(jSyncListener);\r
473     env->DeleteLocalRef(cls_sync);\r
474     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
475     return ;\r
476 }\r
477 \r
478 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeStart\r
479 (JNIEnv *env, jobject jObj, jobject jDiscoverListener, jobject jAccpetListener)\r
480 {\r
481     LOGD ("ConsumerService_StartConsumer");\r
482     if (!jDiscoverListener || !jAccpetListener)\r
483     {\r
484         ThrowNSException(NS_ERROR, "Listener cannot be null");\r
485         return ;\r
486     }\r
487 \r
488     if (g_obj_discoverListener != NULL)\r
489     {\r
490         env->DeleteGlobalRef(g_obj_discoverListener);\r
491     }\r
492     if (g_obj_acceptListener != NULL)\r
493     {\r
494         env->DeleteGlobalRef(g_obj_acceptListener);\r
495     }\r
496 \r
497     g_obj_discoverListener = (jobject) env->NewGlobalRef(jDiscoverListener);\r
498     g_obj_acceptListener = (jobject) env->NewGlobalRef(jAccpetListener);\r
499 \r
500     OIC::Service::NSConsumerService::ConsumerConfig cfg;\r
501     cfg.m_discoverCb = onDiscoverProvider;\r
502     cfg.m_acceptedCb = onSubscriptionAccepted;\r
503 \r
504     OIC::Service::NSConsumerService::getInstance()->Start(cfg);\r
505 \r
506 }\r
507 \r
508 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeStop\r
509 (JNIEnv *env, jobject jObj)\r
510 {\r
511     LOGD ("ConsumerService_StopConsumer");\r
512 \r
513     env->DeleteGlobalRef(g_obj_postListener);\r
514     env->DeleteGlobalRef(g_obj_discoverListener);\r
515     env->DeleteGlobalRef(g_obj_syncListener);\r
516     env->DeleteGlobalRef(g_obj_acceptListener);\r
517     g_obj_postListener = NULL;\r
518     g_obj_discoverListener = NULL;\r
519     g_obj_syncListener = NULL;\r
520     g_obj_acceptListener = NULL;\r
521     OIC::Service::NSConsumerService::getInstance()->Stop();\r
522 }\r
523 \r
524 JNIEXPORT jint JNICALL\r
525 Java_org_iotivity_service_ns_consumer_ConsumerService_nativeEnableRemoteService\r
526 (JNIEnv *env, jobject jObj, jstring jServerAddress)\r
527 {\r
528     LOGD ("ConsumerService_EnableRemoteService");\r
529     if (!jServerAddress)\r
530     {\r
531         ThrowNSException(NS_ERROR, "EnableRemoteService server address NULL");\r
532         return (jint) OIC::Service::Result::ERROR;\r
533     }\r
534     const char *serverAddress = env->GetStringUTFChars(jServerAddress, 0);\r
535     OIC::Service::Result res =\r
536         OIC::Service::NSConsumerService::getInstance()->EnableRemoteService(std::string(serverAddress));\r
537     env->ReleaseStringUTFChars(jServerAddress, serverAddress);\r
538     return (jint) res;\r
539 }\r
540 \r
541 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeRescanProvider\r
542 (JNIEnv *env, jobject jObj)\r
543 {\r
544     LOGD ("ConsumerService_RescanProvider");\r
545 \r
546     OIC::Service::NSConsumerService::getInstance()->RescanProvider();\r
547 }\r
548 \r
549 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeGetProvider\r
550 (JNIEnv *env, jobject jObj, jstring jProviderId)\r
551 {\r
552     LOGD ("ConsumerService_GetProvider");\r
553     if (!jProviderId)\r
554     {\r
555         ThrowNSException(NS_ERROR, "ProviderId cannot be null");\r
556         return NULL;\r
557     }\r
558 \r
559     const char *providerId = env->GetStringUTFChars(jProviderId, 0);\r
560 \r
561     OIC::Service::NSProvider *provider =\r
562         OIC::Service::NSConsumerService::getInstance()->getProvider(std::string(providerId));\r
563     if (provider == nullptr)\r
564     {\r
565         ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
566         return NULL;\r
567     }\r
568 \r
569     LOGD ("ProviderId : %s\n", provider->getProviderId().c_str());\r
570 \r
571     jProviderId = env->NewStringUTF(provider->getProviderId().c_str());\r
572     jlong pProvider = (long)provider;\r
573 \r
574     jclass cls_provider = (jclass) (env->NewLocalRef(g_cls_Provider));\r
575     if (!cls_provider)\r
576     {\r
577         LOGE ("Failed to Get ObjectClass for Provider");\r
578         return NULL;\r
579     }\r
580     jmethodID mid_provider = env->GetMethodID(\r
581                                  cls_provider, "<init>", "(Ljava/lang/String;)V");\r
582     if (!mid_provider)\r
583     {\r
584         LOGE ("Failed to Get MethodID for Provider<init>");\r
585         return NULL;\r
586     }\r
587     jobject obj_provider = env->NewObject(cls_provider, mid_provider,\r
588                                           jProviderId);\r
589 \r
590     jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J");\r
591     if (!nativeHandle)\r
592     {\r
593         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
594         return NULL;\r
595     }\r
596     env->SetLongField(obj_provider, nativeHandle, pProvider);\r
597 \r
598     env->DeleteLocalRef(cls_provider);\r
599     env->ReleaseStringUTFChars(jProviderId, providerId);\r
600 \r
601     return obj_provider;\r
602 }\r
603 \r
604 OIC::Service::NSProvider *getNativeProvider(JNIEnv *env, jobject jObj)\r
605 {\r
606     jclass providerClass = env->GetObjectClass(jObj);\r
607     if (!providerClass)\r
608     {\r
609         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
610         return NULL;\r
611     }\r
612     jfieldID jproviderId = env->GetFieldID(providerClass, "mProviderId", "Ljava/lang/String;");\r
613     if (!jproviderId)\r
614     {\r
615         ThrowNSException(NS_ERROR, "Failed to get providerId for Provider");\r
616         return NULL;\r
617     }\r
618     jstring jprovider_id = (jstring) env->GetObjectField(jObj, jproviderId);\r
619     if (!jprovider_id)\r
620     {\r
621         ThrowNSException(NS_ERROR, "ProviderId cannot be null");\r
622         return NULL;\r
623     }\r
624 \r
625     const char *providerId = env->GetStringUTFChars(jprovider_id, 0);\r
626     LOGD ("ProviderId : %s\n", providerId);\r
627 \r
628     OIC::Service::NSProvider *provider =\r
629         OIC::Service::NSConsumerService::getInstance()->getProvider(std::string(providerId));\r
630     if (provider == nullptr)\r
631     {\r
632         ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
633         return NULL;\r
634     }\r
635     env->ReleaseStringUTFChars(jprovider_id, providerId);\r
636     return provider;\r
637 }\r
638 \r
639 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSubscribe\r
640 (JNIEnv *env, jobject jObj)\r
641 {\r
642     LOGD ("Provider_Subscribe");\r
643     jclass providerClass = env->GetObjectClass(jObj);\r
644     if (!providerClass)\r
645     {\r
646         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
647         return ;\r
648     }\r
649 \r
650     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
651     if (!nativeHandle)\r
652     {\r
653         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
654         return ;\r
655     }\r
656     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
657     if (jProvider)\r
658     {\r
659         LOGD ("calling subscribe on mNativeHandle");\r
660         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
661         provider->subscribe();\r
662     }\r
663     else\r
664     {\r
665         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
666         if (provider == nullptr)\r
667         {\r
668             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
669             return;\r
670         }\r
671         LOGD ("calling subscribe on ProviderID");\r
672         provider->subscribe();\r
673     }\r
674 }\r
675 \r
676 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUnsubscribe\r
677 (JNIEnv *env, jobject jObj)\r
678 {\r
679     LOGD ("Provider_Unsubscribe");\r
680 \r
681     jclass providerClass = env->GetObjectClass(jObj);\r
682     if (!providerClass)\r
683     {\r
684         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
685         return ;\r
686     }\r
687 \r
688     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
689     if (!nativeHandle)\r
690     {\r
691         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
692         return ;\r
693     }\r
694     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
695     if (jProvider)\r
696     {\r
697         LOGD ("calling unSubscribe on mNativeHandle");\r
698         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
699         provider->unSubscribe();\r
700     }\r
701     else\r
702     {\r
703         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
704         if (provider == nullptr)\r
705         {\r
706             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
707             return;\r
708         }\r
709         LOGD ("calling unSubscribe on ProviderID");\r
710         provider->unSubscribe();\r
711     }\r
712 }\r
713 \r
714 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSendSyncInfo\r
715 (JNIEnv *env, jobject jObj, jlong jMessageId, jint jSyncType)\r
716 {\r
717     LOGD ("Provider_SendSyncInfo");\r
718     if (!jMessageId)\r
719     {\r
720         ThrowNSException(NS_ERROR, "MessageId cannot be 0");\r
721         return ;\r
722     }\r
723 \r
724     jclass providerClass = env->GetObjectClass(jObj);\r
725     if (!providerClass)\r
726     {\r
727         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
728         return ;\r
729     }\r
730 \r
731     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
732     if (!nativeHandle)\r
733     {\r
734         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
735         return ;\r
736     }\r
737     uint64_t messageId = (uint64_t) jMessageId;\r
738 \r
739     LOGD("!!!!!!jMessageId: %lld", jMessageId);\r
740     LOGD("!!!!!!messageId: %lld", messageId);\r
741 \r
742     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
743     if (jProvider)\r
744     {\r
745         LOGD ("calling SendSyncInfo on mNativeHandle");\r
746         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
747         provider->SendSyncInfo(messageId, (OIC::Service::NSSyncInfo::NSSyncType)jSyncType);\r
748     }\r
749     else\r
750     {\r
751         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
752         if (provider == nullptr)\r
753         {\r
754             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
755             return;\r
756         }\r
757         LOGD ("calling SendSyncInfo on ProviderID");\r
758         provider->SendSyncInfo(messageId, (OIC::Service::NSSyncInfo::NSSyncType)jSyncType);\r
759     }\r
760 }\r
761 \r
762 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSetListener\r
763 (JNIEnv *env, jobject jObj, jobject jPostListener, jobject jSyncListener)\r
764 {\r
765     LOGD ("Provider_SetListener");\r
766     if (!jPostListener || !jSyncListener)\r
767     {\r
768         ThrowNSException(NS_ERROR, "Listener cannot be null");\r
769         return ;\r
770     }\r
771 \r
772     jclass providerClass = env->GetObjectClass(jObj);\r
773     if (!providerClass)\r
774     {\r
775         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
776         return ;\r
777     }\r
778 \r
779     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
780     if (!nativeHandle)\r
781     {\r
782         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
783         return ;\r
784     }\r
785     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
786     if (jProvider)\r
787     {\r
788         LOGD ("calling SetListener on mNativeHandle");\r
789         if (g_obj_postListener != NULL)\r
790         {\r
791             env->DeleteGlobalRef(g_obj_postListener);\r
792         }\r
793         if (g_obj_syncListener != NULL)\r
794         {\r
795             env->DeleteGlobalRef(g_obj_syncListener);\r
796         }\r
797         g_obj_syncListener = NULL;\r
798         g_obj_acceptListener = NULL;\r
799         g_obj_postListener = (jobject) env->NewGlobalRef(jPostListener);\r
800         g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);\r
801 \r
802         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
803         provider->setListener(onMessagePosted, onSyncInfoReceived);\r
804     }\r
805     else\r
806     {\r
807         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
808         if (provider == nullptr)\r
809         {\r
810             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
811             return;\r
812         }\r
813         LOGD ("calling SetListener on ProviderID");\r
814         if (g_obj_postListener != NULL)\r
815         {\r
816             env->DeleteGlobalRef(g_obj_postListener);\r
817         }\r
818         if (g_obj_syncListener != NULL)\r
819         {\r
820             env->DeleteGlobalRef(g_obj_syncListener);\r
821         }\r
822         g_obj_syncListener = NULL;\r
823         g_obj_acceptListener = NULL;\r
824         g_obj_postListener = (jobject) env->NewGlobalRef(jPostListener);\r
825         g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);\r
826 \r
827         provider->setListener(onMessagePosted, onSyncInfoReceived);\r
828     }\r
829 }\r
830 \r
831 // JNI OnLoad\r
832 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)\r
833 {\r
834     LOGD("ConsumerService_JNI_OnLoad");\r
835     g_jvm = jvm;\r
836 \r
837     JNIEnv *env;\r
838     if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)\r
839     {\r
840         LOGE("Failed to get the environment using GetEnv()");\r
841         return JNI_ERR;\r
842     }\r
843 \r
844     jclass localMessage = env->FindClass(\r
845                               "org/iotivity/service/ns/common/Message");\r
846     if (!localMessage)\r
847     {\r
848         LOGE("Failed to get local Message class");\r
849         return JNI_ERR;\r
850     }\r
851     g_cls_Message = (jclass) (env->NewGlobalRef(localMessage));\r
852     if (!g_cls_Message)\r
853     {\r
854         LOGE("Failed to set Global Message reference");\r
855         return JNI_ERR;\r
856     }\r
857 \r
858     jclass localProvider = env->FindClass(\r
859                                "org/iotivity/service/ns/consumer/Provider");\r
860     if (!localProvider)\r
861     {\r
862         LOGE("Failed to get local Provider class");\r
863         return JNI_ERR;\r
864     }\r
865     g_cls_Provider = (jclass) (env->NewGlobalRef(localProvider));\r
866     if (!g_cls_Provider)\r
867     {\r
868         LOGE("Failed to set Global Provider reference");\r
869         return JNI_ERR;\r
870     }\r
871 \r
872     jclass localSyncInfo = env->FindClass(\r
873                                "org/iotivity/service/ns/common/SyncInfo");\r
874     if (!localSyncInfo)\r
875     {\r
876         LOGE("Failed to get local SyncInfo class");\r
877         return JNI_ERR;\r
878     }\r
879     g_cls_SyncInfo = (jclass) (env->NewGlobalRef(localSyncInfo));\r
880     if (!g_cls_SyncInfo)\r
881     {\r
882         LOGE("Failed to set Global NSSyncInfo reference");\r
883         return JNI_ERR;\r
884     }\r
885 \r
886     jclass localMediaContents = env->FindClass(\r
887                                     "org/iotivity/service/ns/common/MediaContents");\r
888     if (!localMediaContents)\r
889     {\r
890         LOGE("Failed to get local MediaContents class");\r
891         return JNI_ERR;\r
892     }\r
893     g_cls_MediaContents = (jclass) (env->NewGlobalRef(localMediaContents));\r
894     if (!g_cls_MediaContents)\r
895     {\r
896         LOGE("Failed to set Global MediaContents reference");\r
897         return JNI_ERR;\r
898     }\r
899 \r
900     env->DeleteLocalRef(localMessage);\r
901     env->DeleteLocalRef(localProvider);\r
902     env->DeleteLocalRef(localSyncInfo);\r
903     env->DeleteLocalRef(localMediaContents);\r
904 \r
905     return NSExceptionInit(env);\r
906 }\r
907 \r
908 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)\r
909 {\r
910     LOGI("ConsumerService_JNI_OnUnload");\r
911     JNIEnv *env;\r
912 \r
913     if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)\r
914     {\r
915         LOGE("Failed to get the environment using GetEnv()");\r
916         return ;\r
917     }\r
918 \r
919     env->DeleteGlobalRef(g_cls_Message);\r
920     env->DeleteGlobalRef(g_cls_Provider);\r
921     env->DeleteGlobalRef(g_cls_SyncInfo);\r
922     env->DeleteGlobalRef(g_cls_MediaContents);\r
923 }\r