Merge branch 'master' into notification-service
[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 onProviderChanged(OIC::Service::NSProvider *provider,OIC::Service::NSResponse response)\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     //TODO: Modify to call ProviderChanged Cb adding topic in Java\r
191     jmethodID mid = env->GetMethodID(\r
192                         cls,\r
193                         "onSubscriptionAccepted",\r
194                         "(Lorg/iotivity/service/ns/consumer/Provider;)V");\r
195     if (!mid)\r
196     {\r
197         LOGE ("Failed to Get MethodID for onSubscriptionAccepted");\r
198         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
199         return ;\r
200     }\r
201 \r
202     env->CallVoidMethod(jAcceptListener, mid, obj_provider);\r
203 \r
204     env->DeleteLocalRef(jAcceptListener);\r
205     env->DeleteLocalRef(cls_provider);\r
206     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
207     return ;\r
208 \r
209 }\r
210 \r
211 jobject getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type)\r
212 {\r
213     switch (type)\r
214     {\r
215         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT:\r
216             {\r
217                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
218                                           "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
219                 return env->GetStaticObjectField(g_cls_Message, fieldID);\r
220             }\r
221         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE:\r
222             {\r
223                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
224                                           "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
225                 return env->GetStaticObjectField(g_cls_Message, fieldID);\r
226             }\r
227         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT:\r
228             {\r
229                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
230                                           "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
231                 return env->GetStaticObjectField(g_cls_Message, fieldID);\r
232             }\r
233         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO:\r
234             {\r
235                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
236                                           "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
237                 return env->GetStaticObjectField(g_cls_Message, fieldID);\r
238             }\r
239         default:\r
240             return NULL;\r
241     }\r
242     return NULL;\r
243 }\r
244 \r
245 void onMessagePosted(OIC::Service::NSMessage *message)\r
246 {\r
247     LOGD ("ConsumerService_onMessagePosted");\r
248 \r
249     jint envRet;\r
250     JNIEnv *env = GetJNIEnv(&envRet);\r
251     if (NULL == env) return ;\r
252 \r
253     jobject jPostListener = (jobject) env->NewLocalRef(g_obj_postListener);\r
254     if (!jPostListener)\r
255     {\r
256         LOGE ("Failed to Get jPostListener");\r
257         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
258         return ;\r
259     }\r
260 \r
261     LOGD ("id : %llu\n", message->getMessageId());\r
262     LOGD ("title : %s\n", message->getTitle().c_str());\r
263     LOGD ("content : %s\n", message->getContentText().c_str());\r
264     LOGD ("source : %s\n", message->getSourceName().c_str());\r
265 \r
266     jlong jMessageId = (jlong) message->getMessageId();\r
267     jstring jProviderId = env->NewStringUTF(message->getProviderId().c_str());\r
268     jstring jTitle = env->NewStringUTF(message->getTitle().c_str());\r
269     jstring jContentText = env->NewStringUTF(message->getContentText().c_str());\r
270     jstring jSourceName = env->NewStringUTF(message->getSourceName().c_str());\r
271 \r
272     jstring jTime = env->NewStringUTF(message->getTime().c_str());\r
273     jlong jTTL = (jlong) message->getTTL();\r
274 \r
275     jlong pMessage = (long) message;\r
276 \r
277     jclass cls_message = (jclass) (env->NewLocalRef(g_cls_Message));\r
278     if (!cls_message)\r
279     {\r
280         LOGE ("Failed to Get ObjectClass for Message");\r
281         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
282         return ;\r
283     }\r
284     jmethodID mid_message = env->GetMethodID(\r
285                                 cls_message, "<init>",\r
286                                 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");\r
287     if (!mid_message)\r
288     {\r
289         LOGE ("Failed to Get MethodID for Message<init>");\r
290         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
291         return ;\r
292     }\r
293     jobject obj_message = env->NewObject(cls_message, mid_message,\r
294                                          jTitle, jContentText, jSourceName);\r
295 \r
296     jfieldID fid_nativeHandle = env->GetFieldID(cls_message, "mNativeHandle", "J");\r
297     if (!fid_nativeHandle)\r
298     {\r
299         LOGE("Failed to get nativeHandle for Message");\r
300         return;\r
301     }\r
302     env->SetLongField(obj_message, fid_nativeHandle, pMessage);\r
303 \r
304     jfieldID fid_messageId = env->GetFieldID(cls_message, "mMessageId", "J");\r
305     if (!fid_messageId)\r
306     {\r
307         LOGE("Failed to get field MessageID for Message");\r
308         return;\r
309     }\r
310     env->SetLongField(obj_message, fid_messageId, jMessageId);\r
311 \r
312     jfieldID fid_providerId = env->GetFieldID(cls_message, "mProviderId", "Ljava/lang/String;");\r
313     if (!fid_providerId)\r
314     {\r
315         LOGE("Failed to get field ProviderID for Message");\r
316         return;\r
317     }\r
318     env->SetObjectField(obj_message, fid_providerId, jProviderId);\r
319 \r
320     jfieldID fid_time = env->GetFieldID(cls_message, "mTime", "Ljava/lang/String;");\r
321     if (!fid_time)\r
322     {\r
323         LOGE("Failed to get field Time for Message");\r
324         return;\r
325     }\r
326     env->SetObjectField(obj_message, fid_time, jTime);\r
327 \r
328     jfieldID fid_ttl = env->GetFieldID(cls_message, "mTTL", "J");\r
329     if (!fid_ttl)\r
330     {\r
331         LOGE("Failed to get field TTL for Message");\r
332         return;\r
333     }\r
334     env->SetLongField(obj_message, fid_ttl, jTTL);\r
335 \r
336     OIC::Service::NSMediaContents *mediaCont = message->getMediaContents();\r
337     if (mediaCont != nullptr)\r
338     {\r
339         jstring jIconImage = env->NewStringUTF(mediaCont->getIconImage().c_str());\r
340         jclass cls_mediaContents = (jclass) (env->NewLocalRef(g_cls_MediaContents));\r
341         if (!cls_mediaContents)\r
342         {\r
343             LOGE ("Failed to Get ObjectClass for MediaContents");\r
344             if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
345             return ;\r
346         }\r
347         jmethodID mid_mediaContents = env->GetMethodID(\r
348                                           cls_mediaContents, "<init>", "(Ljava/lang/String;)V");\r
349         if (!mid_mediaContents)\r
350         {\r
351             LOGE ("Failed to Get MethodID for MediaContents<init>");\r
352             if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
353             return ;\r
354         }\r
355         jobject obj_mediaContents = env->NewObject(cls_mediaContents, mid_mediaContents,\r
356                                     jIconImage);\r
357 \r
358         jfieldID fid_mediaContents = env->GetFieldID(cls_message, "mMediaContents",\r
359                                      "Lorg/iotivity/service/ns/common/MediaContents;");\r
360         if (!fid_mediaContents)\r
361         {\r
362             LOGE("Failed to get field mediaContents for Message");\r
363             return;\r
364         }\r
365         env->SetObjectField(obj_message, fid_mediaContents, obj_mediaContents);\r
366 \r
367     }\r
368 \r
369     jobject jType = getJavaMessageType(env, message->getType());\r
370     if (!jType)\r
371     {\r
372         LOGE("Failed to get Type value for Message");\r
373         return;\r
374     }\r
375     jfieldID fid_type = env->GetFieldID(cls_message, "mType",\r
376                                         "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
377     if (!fid_type)\r
378     {\r
379         LOGE("Failed to get field Type for Message");\r
380         return;\r
381     }\r
382     env->SetObjectField(obj_message, fid_type, jType);\r
383 \r
384 \r
385     jclass cls = env->GetObjectClass(jPostListener);\r
386     if (!cls)\r
387     {\r
388         LOGE ("Failed to Get ObjectClass for jPostListener");\r
389         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
390         return ;\r
391     }\r
392     jmethodID mid = env->GetMethodID(\r
393                         cls,\r
394                         "onMessageReceived",\r
395                         "(Lorg/iotivity/service/ns/common/Message;)V");\r
396     if (!mid)\r
397     {\r
398         LOGE ("Failed to Get MethodID for onMessageReceived");\r
399         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
400         return ;\r
401     }\r
402 \r
403     env->CallVoidMethod(jPostListener, mid, obj_message);\r
404 \r
405     env->DeleteLocalRef(jPostListener);\r
406     env->DeleteLocalRef(cls_message);\r
407     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
408     return ;\r
409 }\r
410 \r
411 void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync)\r
412 {\r
413     LOGD ("ConsumerService_onSyncInfoReceived");\r
414 \r
415     jint envRet;\r
416     JNIEnv *env = GetJNIEnv(&envRet);\r
417     if (NULL == env) return ;\r
418 \r
419     jobject jSyncListener = (jobject) env->NewLocalRef(g_obj_syncListener);\r
420     if (!jSyncListener)\r
421     {\r
422         LOGE ("Failed to Get jSyncListener");\r
423         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
424         return ;\r
425     }\r
426 \r
427     LOGD ("Sync ID : %llu\n", sync->getMessageId());\r
428     LOGD ("Sync ProviderId : %s\n", sync->getProviderId().c_str());\r
429     LOGD ("Sync STATE : %d\n", (int) sync->getState());\r
430 \r
431     jlong jMessageId = (jlong) sync->getMessageId();\r
432     jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str());\r
433     jint jState = (jint) sync->getState();\r
434 \r
435     jclass cls_sync = (jclass) (env->NewLocalRef(g_cls_SyncInfo));\r
436     if (!cls_sync)\r
437     {\r
438         LOGE ("Failed to Get ObjectClass for SyncInfo");\r
439         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
440         return ;\r
441     }\r
442     jmethodID mid_sync = env->GetMethodID(\r
443                              cls_sync, "<init>", "(JLjava/lang/String;I)V");\r
444     if (!mid_sync)\r
445     {\r
446         LOGE ("Failed to Get MethodID for SyncInfo<init>");\r
447         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
448         return ;\r
449     }\r
450     jobject obj_sync = env->NewObject(cls_sync, mid_sync,\r
451                                       jMessageId, jProviderId, jState);\r
452 \r
453     jclass cls = env->GetObjectClass(jSyncListener);\r
454     if (!cls)\r
455     {\r
456         LOGE ("Failed to Get ObjectClass for jSyncListener");\r
457         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
458         return ;\r
459     }\r
460     jmethodID mid = env->GetMethodID(\r
461                         cls,\r
462                         "onSyncInfoReceived",\r
463                         "(Lorg/iotivity/service/ns/common/SyncInfo;)V");\r
464     if (!mid)\r
465     {\r
466         LOGE ("Failed to Get MethodID for onSyncInfoReceived");\r
467         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
468         return ;\r
469     }\r
470 \r
471     env->CallVoidMethod(jSyncListener, mid, obj_sync);\r
472 \r
473     env->DeleteLocalRef(jSyncListener);\r
474     env->DeleteLocalRef(cls_sync);\r
475     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
476     return ;\r
477 }\r
478 \r
479 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeStart\r
480 (JNIEnv *env, jobject jObj, jobject jDiscoverListener, jobject jAccpetListener)\r
481 {\r
482     LOGD ("ConsumerService_StartConsumer");\r
483     if (!jDiscoverListener || !jAccpetListener)\r
484     {\r
485         ThrowNSException(NS_ERROR, "Listener cannot be null");\r
486         return ;\r
487     }\r
488 \r
489     if (g_obj_discoverListener != NULL)\r
490     {\r
491         env->DeleteGlobalRef(g_obj_discoverListener);\r
492     }\r
493     if (g_obj_acceptListener != NULL)\r
494     {\r
495         env->DeleteGlobalRef(g_obj_acceptListener);\r
496     }\r
497 \r
498     g_obj_discoverListener = (jobject) env->NewGlobalRef(jDiscoverListener);\r
499     g_obj_acceptListener = (jobject) env->NewGlobalRef(jAccpetListener);\r
500 \r
501     OIC::Service::NSConsumerService::ConsumerConfig cfg;\r
502     cfg.m_discoverCb = onDiscoverProvider;\r
503     cfg.m_changedCb = onProviderChanged;\r
504 \r
505     OIC::Service::NSConsumerService::getInstance()->Start(cfg);\r
506 \r
507 }\r
508 \r
509 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeStop\r
510 (JNIEnv *env, jobject jObj)\r
511 {\r
512     LOGD ("ConsumerService_StopConsumer");\r
513 \r
514     env->DeleteGlobalRef(g_obj_postListener);\r
515     env->DeleteGlobalRef(g_obj_discoverListener);\r
516     env->DeleteGlobalRef(g_obj_syncListener);\r
517     env->DeleteGlobalRef(g_obj_acceptListener);\r
518     g_obj_postListener = NULL;\r
519     g_obj_discoverListener = NULL;\r
520     g_obj_syncListener = NULL;\r
521     g_obj_acceptListener = NULL;\r
522     OIC::Service::NSConsumerService::getInstance()->Stop();\r
523 }\r
524 \r
525 JNIEXPORT jint JNICALL\r
526 Java_org_iotivity_service_ns_consumer_ConsumerService_nativeEnableRemoteService\r
527 (JNIEnv *env, jobject jObj, jstring jServerAddress)\r
528 {\r
529     LOGD ("ConsumerService_EnableRemoteService");\r
530     if (!jServerAddress)\r
531     {\r
532         ThrowNSException(NS_ERROR, "EnableRemoteService server address NULL");\r
533         return (jint) OIC::Service::NSResult::ERROR;\r
534     }\r
535     const char *serverAddress = env->GetStringUTFChars(jServerAddress, 0);\r
536     OIC::Service::NSResult res =\r
537         OIC::Service::NSConsumerService::getInstance()->EnableRemoteService(std::string(serverAddress));\r
538     env->ReleaseStringUTFChars(jServerAddress, serverAddress);\r
539     return (jint) res;\r
540 }\r
541 \r
542 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeRescanProvider\r
543 (JNIEnv *env, jobject jObj)\r
544 {\r
545     LOGD ("ConsumerService_RescanProvider");\r
546 \r
547     OIC::Service::NSConsumerService::getInstance()->RescanProvider();\r
548 }\r
549 \r
550 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeGetProvider\r
551 (JNIEnv *env, jobject jObj, jstring jProviderId)\r
552 {\r
553     LOGD ("ConsumerService_GetProvider");\r
554     if (!jProviderId)\r
555     {\r
556         ThrowNSException(NS_ERROR, "ProviderId cannot be null");\r
557         return NULL;\r
558     }\r
559 \r
560     const char *providerId = env->GetStringUTFChars(jProviderId, 0);\r
561 \r
562     OIC::Service::NSProvider *provider =\r
563         OIC::Service::NSConsumerService::getInstance()->getProvider(std::string(providerId));\r
564     if (provider == nullptr)\r
565     {\r
566         ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
567         return NULL;\r
568     }\r
569 \r
570     LOGD ("ProviderId : %s\n", provider->getProviderId().c_str());\r
571 \r
572     jProviderId = env->NewStringUTF(provider->getProviderId().c_str());\r
573     jlong pProvider = (long)provider;\r
574 \r
575     jclass cls_provider = (jclass) (env->NewLocalRef(g_cls_Provider));\r
576     if (!cls_provider)\r
577     {\r
578         LOGE ("Failed to Get ObjectClass for Provider");\r
579         return NULL;\r
580     }\r
581     jmethodID mid_provider = env->GetMethodID(\r
582                                  cls_provider, "<init>", "(Ljava/lang/String;)V");\r
583     if (!mid_provider)\r
584     {\r
585         LOGE ("Failed to Get MethodID for Provider<init>");\r
586         return NULL;\r
587     }\r
588     jobject obj_provider = env->NewObject(cls_provider, mid_provider,\r
589                                           jProviderId);\r
590 \r
591     jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J");\r
592     if (!nativeHandle)\r
593     {\r
594         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
595         return NULL;\r
596     }\r
597     env->SetLongField(obj_provider, nativeHandle, pProvider);\r
598 \r
599     env->DeleteLocalRef(cls_provider);\r
600     env->ReleaseStringUTFChars(jProviderId, providerId);\r
601 \r
602     return obj_provider;\r
603 }\r
604 \r
605 OIC::Service::NSProvider *getNativeProvider(JNIEnv *env, jobject jObj)\r
606 {\r
607     jclass providerClass = env->GetObjectClass(jObj);\r
608     if (!providerClass)\r
609     {\r
610         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
611         return NULL;\r
612     }\r
613     jfieldID jproviderId = env->GetFieldID(providerClass, "mProviderId", "Ljava/lang/String;");\r
614     if (!jproviderId)\r
615     {\r
616         ThrowNSException(NS_ERROR, "Failed to get providerId for Provider");\r
617         return NULL;\r
618     }\r
619     jstring jprovider_id = (jstring) env->GetObjectField(jObj, jproviderId);\r
620     if (!jprovider_id)\r
621     {\r
622         ThrowNSException(NS_ERROR, "ProviderId cannot be null");\r
623         return NULL;\r
624     }\r
625 \r
626     const char *providerId = env->GetStringUTFChars(jprovider_id, 0);\r
627     LOGD ("ProviderId : %s\n", providerId);\r
628 \r
629     OIC::Service::NSProvider *provider =\r
630         OIC::Service::NSConsumerService::getInstance()->getProvider(std::string(providerId));\r
631     if (provider == nullptr)\r
632     {\r
633         ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
634         return NULL;\r
635     }\r
636     env->ReleaseStringUTFChars(jprovider_id, providerId);\r
637     return provider;\r
638 }\r
639 \r
640 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSubscribe\r
641 (JNIEnv *env, jobject jObj)\r
642 {\r
643     LOGD ("Provider_Subscribe");\r
644     jclass providerClass = env->GetObjectClass(jObj);\r
645     if (!providerClass)\r
646     {\r
647         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
648         return ;\r
649     }\r
650 \r
651     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
652     if (!nativeHandle)\r
653     {\r
654         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
655         return ;\r
656     }\r
657     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
658     if (jProvider)\r
659     {\r
660         LOGD ("calling subscribe on mNativeHandle");\r
661         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
662         provider->subscribe();\r
663     }\r
664     else\r
665     {\r
666         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
667         if (provider == nullptr)\r
668         {\r
669             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
670             return;\r
671         }\r
672         LOGD ("calling subscribe on ProviderID");\r
673         provider->subscribe();\r
674     }\r
675 }\r
676 \r
677 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUnsubscribe\r
678 (JNIEnv *env, jobject jObj)\r
679 {\r
680     LOGD ("Provider_Unsubscribe");\r
681 \r
682     jclass providerClass = env->GetObjectClass(jObj);\r
683     if (!providerClass)\r
684     {\r
685         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
686         return ;\r
687     }\r
688 \r
689     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
690     if (!nativeHandle)\r
691     {\r
692         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
693         return ;\r
694     }\r
695     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
696     if (jProvider)\r
697     {\r
698         LOGD ("calling unSubscribe on mNativeHandle");\r
699         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
700         provider->unSubscribe();\r
701     }\r
702     else\r
703     {\r
704         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
705         if (provider == nullptr)\r
706         {\r
707             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
708             return;\r
709         }\r
710         LOGD ("calling unSubscribe on ProviderID");\r
711         provider->unSubscribe();\r
712     }\r
713 }\r
714 \r
715 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSendSyncInfo\r
716 (JNIEnv *env, jobject jObj, jlong jMessageId, jint jSyncType)\r
717 {\r
718     LOGD ("Provider_SendSyncInfo");\r
719     if (!jMessageId)\r
720     {\r
721         ThrowNSException(NS_ERROR, "MessageId cannot be 0");\r
722         return ;\r
723     }\r
724 \r
725     jclass providerClass = env->GetObjectClass(jObj);\r
726     if (!providerClass)\r
727     {\r
728         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
729         return ;\r
730     }\r
731 \r
732     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
733     if (!nativeHandle)\r
734     {\r
735         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
736         return ;\r
737     }\r
738     uint64_t messageId = (uint64_t) jMessageId;\r
739 \r
740     LOGD("!!!!!!jMessageId: %lld", jMessageId);\r
741     LOGD("!!!!!!messageId: %lld", messageId);\r
742 \r
743     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
744     if (jProvider)\r
745     {\r
746         LOGD ("calling SendSyncInfo on mNativeHandle");\r
747         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
748         provider->SendSyncInfo(messageId, (OIC::Service::NSSyncInfo::NSSyncType)jSyncType);\r
749     }\r
750     else\r
751     {\r
752         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
753         if (provider == nullptr)\r
754         {\r
755             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
756             return;\r
757         }\r
758         LOGD ("calling SendSyncInfo on ProviderID");\r
759         provider->SendSyncInfo(messageId, (OIC::Service::NSSyncInfo::NSSyncType)jSyncType);\r
760     }\r
761 }\r
762 \r
763 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSetListener\r
764 (JNIEnv *env, jobject jObj, jobject jPostListener, jobject jSyncListener)\r
765 {\r
766     LOGD ("Provider_SetListener");\r
767     if (!jPostListener || !jSyncListener)\r
768     {\r
769         ThrowNSException(NS_ERROR, "Listener cannot be null");\r
770         return ;\r
771     }\r
772 \r
773     jclass providerClass = env->GetObjectClass(jObj);\r
774     if (!providerClass)\r
775     {\r
776         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
777         return ;\r
778     }\r
779 \r
780     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
781     if (!nativeHandle)\r
782     {\r
783         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
784         return ;\r
785     }\r
786     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
787     if (jProvider)\r
788     {\r
789         LOGD ("calling SetListener on mNativeHandle");\r
790         if (g_obj_postListener != NULL)\r
791         {\r
792             env->DeleteGlobalRef(g_obj_postListener);\r
793         }\r
794         if (g_obj_syncListener != NULL)\r
795         {\r
796             env->DeleteGlobalRef(g_obj_syncListener);\r
797         }\r
798         g_obj_syncListener = NULL;\r
799         g_obj_acceptListener = NULL;\r
800         g_obj_postListener = (jobject) env->NewGlobalRef(jPostListener);\r
801         g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);\r
802 \r
803         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
804         provider->setListener(onMessagePosted, onSyncInfoReceived);\r
805     }\r
806     else\r
807     {\r
808         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
809         if (provider == nullptr)\r
810         {\r
811             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
812             return;\r
813         }\r
814         LOGD ("calling SetListener on ProviderID");\r
815         if (g_obj_postListener != NULL)\r
816         {\r
817             env->DeleteGlobalRef(g_obj_postListener);\r
818         }\r
819         if (g_obj_syncListener != NULL)\r
820         {\r
821             env->DeleteGlobalRef(g_obj_syncListener);\r
822         }\r
823         g_obj_syncListener = NULL;\r
824         g_obj_acceptListener = NULL;\r
825         g_obj_postListener = (jobject) env->NewGlobalRef(jPostListener);\r
826         g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);\r
827 \r
828         provider->setListener(onMessagePosted, onSyncInfoReceived);\r
829     }\r
830 }\r
831 \r
832 // JNI OnLoad\r
833 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)\r
834 {\r
835     LOGD("ConsumerService_JNI_OnLoad");\r
836     g_jvm = jvm;\r
837 \r
838     JNIEnv *env;\r
839     if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)\r
840     {\r
841         LOGE("Failed to get the environment using GetEnv()");\r
842         return JNI_ERR;\r
843     }\r
844 \r
845     jclass localMessage = env->FindClass(\r
846                               "org/iotivity/service/ns/common/Message");\r
847     if (!localMessage)\r
848     {\r
849         LOGE("Failed to get local Message class");\r
850         return JNI_ERR;\r
851     }\r
852     g_cls_Message = (jclass) (env->NewGlobalRef(localMessage));\r
853     if (!g_cls_Message)\r
854     {\r
855         LOGE("Failed to set Global Message reference");\r
856         return JNI_ERR;\r
857     }\r
858 \r
859     jclass localProvider = env->FindClass(\r
860                                "org/iotivity/service/ns/consumer/Provider");\r
861     if (!localProvider)\r
862     {\r
863         LOGE("Failed to get local Provider class");\r
864         return JNI_ERR;\r
865     }\r
866     g_cls_Provider = (jclass) (env->NewGlobalRef(localProvider));\r
867     if (!g_cls_Provider)\r
868     {\r
869         LOGE("Failed to set Global Provider reference");\r
870         return JNI_ERR;\r
871     }\r
872 \r
873     jclass localSyncInfo = env->FindClass(\r
874                                "org/iotivity/service/ns/common/SyncInfo");\r
875     if (!localSyncInfo)\r
876     {\r
877         LOGE("Failed to get local SyncInfo class");\r
878         return JNI_ERR;\r
879     }\r
880     g_cls_SyncInfo = (jclass) (env->NewGlobalRef(localSyncInfo));\r
881     if (!g_cls_SyncInfo)\r
882     {\r
883         LOGE("Failed to set Global NSSyncInfo reference");\r
884         return JNI_ERR;\r
885     }\r
886 \r
887     jclass localMediaContents = env->FindClass(\r
888                                     "org/iotivity/service/ns/common/MediaContents");\r
889     if (!localMediaContents)\r
890     {\r
891         LOGE("Failed to get local MediaContents class");\r
892         return JNI_ERR;\r
893     }\r
894     g_cls_MediaContents = (jclass) (env->NewGlobalRef(localMediaContents));\r
895     if (!g_cls_MediaContents)\r
896     {\r
897         LOGE("Failed to set Global MediaContents reference");\r
898         return JNI_ERR;\r
899     }\r
900 \r
901     env->DeleteLocalRef(localMessage);\r
902     env->DeleteLocalRef(localProvider);\r
903     env->DeleteLocalRef(localSyncInfo);\r
904     env->DeleteLocalRef(localMediaContents);\r
905 \r
906     return NSExceptionInit(env);\r
907 }\r
908 \r
909 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)\r
910 {\r
911     LOGI("ConsumerService_JNI_OnUnload");\r
912     JNIEnv *env;\r
913 \r
914     if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)\r
915     {\r
916         LOGE("Failed to get the environment using GetEnv()");\r
917         return ;\r
918     }\r
919 \r
920     env->DeleteGlobalRef(g_cls_Message);\r
921     env->DeleteGlobalRef(g_cls_Provider);\r
922     env->DeleteGlobalRef(g_cls_SyncInfo);\r
923     env->DeleteGlobalRef(g_cls_MediaContents);\r
924 }\r