Updated JAVA and JNI API's for Topic Resource
[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 jclass g_cls_TopicState;\r
36 jclass g_cls_Message_Type;\r
37 jclass g_cls_Response;\r
38 jclass g_cls_Topic;\r
39 jclass g_cls_TopicsList;\r
40 \r
41 static JNIEnv *GetJNIEnv(jint *ret)\r
42 {\r
43     JNIEnv *env = NULL;\r
44 \r
45     *ret = g_jvm->GetEnv((void **) &env, JNI_CURRENT_VERSION);\r
46     switch (*ret)\r
47     {\r
48         case JNI_OK:\r
49             return env;\r
50         case JNI_EDETACHED:\r
51             if (g_jvm->AttachCurrentThread(&env, NULL) != JNI_OK)\r
52             {\r
53                 LOGE ("Failed to get the environment");\r
54                 return NULL;\r
55             }\r
56             else\r
57             {\r
58                 return env;\r
59             }\r
60         case JNI_EVERSION:\r
61             LOGE ("JNI version is not supported");\r
62         default:\r
63             LOGE ("Failed to get the environment");\r
64             return NULL;\r
65     }\r
66 }\r
67 \r
68 jobject getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type)\r
69 {\r
70     LOGD ("ConsumerService_getJavaMessageType - IN");\r
71     switch (type)\r
72     {\r
73         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT:\r
74             {\r
75                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
76                                           "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
77                 return env->GetStaticObjectField(g_cls_Message, fieldID);\r
78             }\r
79         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE:\r
80             {\r
81                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
82                                           "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
83                 return env->GetStaticObjectField(g_cls_Message, fieldID);\r
84             }\r
85         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT:\r
86             {\r
87                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
88                                           "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
89                 return env->GetStaticObjectField(g_cls_Message, fieldID);\r
90             }\r
91         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO:\r
92             {\r
93                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
94                                           "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
95                 return env->GetStaticObjectField(g_cls_Message, fieldID);\r
96             }\r
97         default:\r
98             return NULL;\r
99     }\r
100     LOGD ("ConsumerService_getJavaMessageType - OUT");\r
101     return NULL;\r
102 }\r
103 \r
104 jobject getJavaState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState)\r
105 {\r
106     LOGD ("ConsumerService_getJavaState - IN");\r
107 \r
108     // TopicState\r
109     jclass cls_topicState = (jclass) (env->NewLocalRef(g_cls_TopicState));\r
110     if (!cls_topicState)\r
111     {\r
112         LOGE ("Failed to Get ObjectClass for TopicState Type");\r
113         return nullptr;\r
114     }\r
115 \r
116     jobject obj_topicState;\r
117     switch (nsState)\r
118     {\r
119         case OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED:\r
120             {\r
121                 static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,\r
122                                           "UNSUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");\r
123                 obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID);\r
124             }\r
125         case OIC::Service::NSTopic::NSTopicState::SUBSCRIBED:\r
126             {\r
127                 static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,\r
128                                           "SUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");\r
129                 obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID);\r
130             }\r
131 \r
132     }\r
133     if (obj_topicState == NULL)\r
134     {\r
135         LOGE("Error: object of field  TopicState  is null");\r
136         return NULL;\r
137     }\r
138 \r
139     env->DeleteLocalRef(cls_topicState);\r
140     LOGD ("ConsumerService_getJavaState - OUT");\r
141     return obj_topicState;\r
142 }\r
143 \r
144 \r
145 jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList)\r
146 {\r
147     LOGD ("ConsumerService_getJavaTopicsList - IN");\r
148     jclass cls_topicList = (jclass) (env->NewLocalRef(g_cls_TopicsList));\r
149     if (!cls_topicList)\r
150     {\r
151         LOGE ("Failed to Get ObjectClass for TopicsList");\r
152         return NULL;\r
153     }\r
154     jmethodID mid_topicList = env->GetMethodID(cls_topicList, "<init>", "()V");\r
155     if (!mid_topicList)\r
156     {\r
157         LOGE ("Failed to Get MethodID for TopicsList<init>");\r
158         return NULL;\r
159     }\r
160     jobject obj_topicList = env->NewObject(cls_topicList, mid_topicList);\r
161     jmethodID mid_addTopic =\r
162         env->GetMethodID(cls_topicList, "addTopic", "(Lorg/iotivity/service/ns/common/Topic;)V");\r
163     for (auto it : topicList->getTopicsList())\r
164     {\r
165         jobject jState = getJavaState(env, it->getState());\r
166         std::string topicName = it->getTopicName();\r
167         jstring jTopicName = env->NewStringUTF(topicName.c_str());\r
168         env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState);\r
169     }\r
170     env->DeleteLocalRef(cls_topicList);\r
171     LOGD ("ConsumerService_getJavaTopicsList - OUT");\r
172     return obj_topicList;\r
173 }\r
174 \r
175 OIC::Service::NSTopic::NSTopicState getNativeState(JNIEnv *env,  jobject jTopic)\r
176 {\r
177     LOGD ("ConsumerService_getNativeState - IN");\r
178 \r
179     jclass cls_topic = env->GetObjectClass( jTopic);\r
180     // TopicState\r
181     jclass cls_TopicState = (jclass) (env->NewLocalRef(g_cls_TopicState));\r
182     if (!cls_TopicState)\r
183     {\r
184         LOGE ("Failed to Get ObjectClass for cls_TopicState Type");\r
185         ThrowNSException(NS_ERROR, "TopicState class  not found ");\r
186         return OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED;\r
187     }\r
188     jmethodID mid = env->GetMethodID(cls_TopicState, "ordinal", "()I");\r
189     jfieldID fid_state = env->GetFieldID( cls_TopicState, "mState",\r
190                                           "Lorg/iotivity/service/ns/common/Topic$TopicState;");\r
191     if (fid_state == NULL)\r
192     {\r
193         LOGE("Error: jfieldID for state type  is null");\r
194         ThrowNSException(NS_ERROR, "TopicState fid  not found ");\r
195         return OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED;\r
196     }\r
197     jobject jobj = env->GetObjectField( jTopic, fid_state);\r
198     if (jobj == NULL)\r
199     {\r
200         LOGE("Error: object of field  state Type is null");\r
201         ThrowNSException(NS_ERROR, "TopicState obj  is null ");\r
202         return OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED;\r
203     }\r
204     jint jState = env->CallIntMethod(jobj, mid);\r
205     OIC::Service::NSTopic::NSTopicState  state = (OIC::Service::NSTopic::NSTopicState) jState;\r
206     LOGD ("ConsumerService_getNativeState - OUT");\r
207     return state;\r
208 \r
209 }\r
210 \r
211 const char *getNativeTopicName(JNIEnv *env,  jobject jTopic)\r
212 {\r
213     LOGD ("ConsumerService_getNativeTopicName - IN");\r
214     jclass cls_topic = env->GetObjectClass( jTopic);\r
215     jfieldID fid_name = env->GetFieldID( cls_topic, "mTopicname",\r
216                                          "Ljava/lang/String;");\r
217     if (fid_name == NULL)\r
218     {\r
219         LOGE("Error: jfieldID for Topic Name  is null");\r
220         return nullptr;\r
221     }\r
222     jstring jTopicName = (jstring) env->GetObjectField( jTopic, fid_name);\r
223     const char *topicName;\r
224     if (jTopicName)\r
225     {\r
226         topicName = env->GetStringUTFChars( jTopicName, NULL);\r
227     }\r
228     else\r
229     {\r
230         LOGI("Info: topicName is null");\r
231     }\r
232     LOGD ("ConsumerService_getNativeTopicName - OUT");\r
233     return topicName;\r
234 \r
235 }\r
236 \r
237 OIC::Service::NSTopicsList *getNativeTopicsList(JNIEnv *env, jobject jTopicList)\r
238 {\r
239     LOGD ("ConsumerService_getNativeTopicsList - IN");\r
240 \r
241     jclass cls_topicList = env->GetObjectClass( jTopicList);\r
242     jfieldID fid_list = env->GetFieldID( cls_topicList, "mTopicsList",\r
243                                          "Ljava/util/Vector;");\r
244     if (fid_list == NULL)\r
245     {\r
246         LOGE("Error: jfieldID for Topic List  is null");\r
247         return nullptr;\r
248     }\r
249     jobject jobj = env->GetObjectField( jTopicList, fid_list);\r
250     if (jobj == NULL)\r
251     {\r
252         LOGE("Error: object of field  Topic List is null");\r
253         return nullptr;\r
254     }\r
255     jclass cls_vec = env->FindClass("java/util/Vector");\r
256     jmethodID sizeMethod = env->GetMethodID(cls_vec,  "size", "()I;");\r
257     int size = env->CallIntMethod(jobj, sizeMethod);\r
258     jmethodID getMethod = env->GetMethodID(cls_vec,  "get", "(I)Ljava/lang/Object;");\r
259     OIC::Service::NSTopicsList *nsTopicList = new OIC::Service::NSTopicsList();\r
260     for (int index = 0; index < size; index++)\r
261     {\r
262         jobject topicObj = env->CallObjectMethod(jobj, getMethod, index);\r
263         const char *name =  getNativeTopicName(env, topicObj);\r
264         std::string topicName(name);\r
265         OIC::Service::NSTopic::NSTopicState state = getNativeState(env, topicObj);\r
266         nsTopicList->addTopic(topicName, state);\r
267     }\r
268 \r
269     env->DeleteLocalRef(cls_vec);\r
270     env->DeleteLocalRef(cls_topicList);\r
271     LOGD ("ConsumerService_getNativeTopicsList - OUT");\r
272     return nsTopicList;\r
273 }\r
274 \r
275 jobject getJavaResponse(JNIEnv *env, OIC::Service::NSResponse response)\r
276 {\r
277     LOGD ("ConsumerService_getJavaResponse - IN");\r
278     switch (response)\r
279     {\r
280         case OIC::Service::NSResponse::ALLOW:\r
281             {\r
282                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response,\r
283                                           "ALLOW", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;");\r
284                 return env->GetStaticObjectField(g_cls_Response, fieldID);\r
285             }\r
286         case OIC::Service::NSResponse::DENY:\r
287             {\r
288                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response,\r
289                                           "DENY", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;");\r
290                 return env->GetStaticObjectField(g_cls_Response, fieldID);\r
291             }\r
292         case OIC::Service::NSResponse::TOPIC:\r
293             {\r
294                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response,\r
295                                           "TOPIC", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;");\r
296                 return env->GetStaticObjectField(g_cls_Response, fieldID);\r
297             }\r
298         default:\r
299             return NULL;\r
300     }\r
301     LOGD ("ConsumerService_getJavaResponse - OUT");\r
302     return NULL;\r
303 }\r
304 \r
305 OIC::Service::NSProvider *getNativeProvider(JNIEnv *env, jobject jObj)\r
306 {\r
307     LOGD ("ConsumerService_getNativeProvider - IN");\r
308     jclass providerClass = env->GetObjectClass(jObj);\r
309     if (!providerClass)\r
310     {\r
311         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
312         return NULL;\r
313     }\r
314     jfieldID jproviderId = env->GetFieldID(providerClass, "mProviderId", "Ljava/lang/String;");\r
315     if (!jproviderId)\r
316     {\r
317         ThrowNSException(NS_ERROR, "Failed to get providerId for Provider");\r
318         return NULL;\r
319     }\r
320     jstring jprovider_id = (jstring) env->GetObjectField(jObj, jproviderId);\r
321     if (!jprovider_id)\r
322     {\r
323         ThrowNSException(NS_ERROR, "ProviderId cannot be null");\r
324         return NULL;\r
325     }\r
326 \r
327     const char *providerId = env->GetStringUTFChars(jprovider_id, 0);\r
328     LOGD ("ProviderId : %s\n", providerId);\r
329 \r
330     OIC::Service::NSProvider *provider =\r
331         OIC::Service::NSConsumerService::getInstance()->getProvider(std::string(providerId));\r
332     if (provider == nullptr)\r
333     {\r
334         ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
335         return NULL;\r
336     }\r
337     env->ReleaseStringUTFChars(jprovider_id, providerId);\r
338     LOGD ("ConsumerService_getNativeProvider - OUT");\r
339     return provider;\r
340 }\r
341 \r
342 jobject getJavaProvider(JNIEnv *env, OIC::Service::NSProvider *provider)\r
343 {\r
344     LOGD ("ConsumerService_getJavaProvider - IN");\r
345     LOGD ("ProviderId : %s\n", provider->getProviderId().c_str());\r
346 \r
347     jstring jProviderId = env->NewStringUTF(provider->getProviderId().c_str());\r
348     jlong pProvider = (long)provider;\r
349 \r
350     jclass cls_provider = (jclass) (env->NewLocalRef(g_cls_Provider));\r
351     if (!cls_provider)\r
352     {\r
353         LOGE ("Failed to Get ObjectClass for Provider");\r
354         return NULL;\r
355     }\r
356     jmethodID mid_provider = env->GetMethodID(\r
357                                  cls_provider, "<init>", "(Ljava/lang/String;)V");\r
358     if (!mid_provider)\r
359     {\r
360         LOGE ("Failed to Get MethodID for Provider<init>");\r
361         return NULL;\r
362     }\r
363     jobject obj_provider = env->NewObject(cls_provider, mid_provider, jProviderId);\r
364 \r
365     jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J");\r
366     if (!nativeHandle)\r
367     {\r
368         LOGE("Failed to get nativeHandle for Provider");\r
369         return NULL;\r
370     }\r
371     env->SetLongField(obj_provider, nativeHandle, pProvider);\r
372 \r
373     jfieldID fid_topic = env->GetFieldID(cls_provider, "mTopicsList",\r
374                                          "Lorg/iotivity/service/ns/common/TopicsList");\r
375     if (!fid_topic)\r
376     {\r
377         LOGE("Failed to get nativeHandle for Provider");\r
378         return NULL;\r
379     }\r
380     jobject topicList = getJavaTopicsList(env, provider->getTopicList());\r
381     env->SetObjectField(obj_provider, fid_topic, topicList);\r
382     env->DeleteLocalRef(cls_provider);\r
383     LOGD ("ConsumerService_getJavaProvider - OUT");\r
384     return obj_provider;\r
385 }\r
386 \r
387 \r
388 jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message)\r
389 {\r
390     LOGD ("ConsumerService_getJavaMessage - IN");\r
391 \r
392     LOGD ("id : %llu\n", message->getMessageId());\r
393     LOGD ("title : %s\n", message->getTitle().c_str());\r
394     LOGD ("content : %s\n", message->getContentText().c_str());\r
395     LOGD ("source : %s\n", message->getSourceName().c_str());\r
396 \r
397     jlong jMessageId = (jlong) message->getMessageId();\r
398     jstring jProviderId = env->NewStringUTF(message->getProviderId().c_str());\r
399     jstring jTitle = env->NewStringUTF(message->getTitle().c_str());\r
400     jstring jContentText = env->NewStringUTF(message->getContentText().c_str());\r
401     jstring jSourceName = env->NewStringUTF(message->getSourceName().c_str());\r
402     jstring jTopic = env->NewStringUTF(message->getTopic().c_str());\r
403 \r
404     jstring jTime = env->NewStringUTF(message->getTime().c_str());\r
405     jlong jTTL = (jlong) message->getTTL();\r
406 \r
407     jlong pMessage = (long) message;\r
408 \r
409     jclass cls_message = (jclass) (env->NewLocalRef(g_cls_Message));\r
410     if (!cls_message)\r
411     {\r
412         LOGE ("Failed to Get ObjectClass for Message");\r
413         return NULL ;\r
414     }\r
415     jmethodID mid_message = env->GetMethodID(\r
416                                 cls_message, "<init>",\r
417                                 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");\r
418     if (!mid_message)\r
419     {\r
420         LOGE ("Failed to Get MethodID for Message<init>");\r
421         return NULL;\r
422     }\r
423     jobject obj_message = env->NewObject(cls_message, mid_message,\r
424                                          jTitle, jContentText, jSourceName);\r
425 \r
426     jfieldID fid_nativeHandle = env->GetFieldID(cls_message, "mNativeHandle", "J");\r
427     if (!fid_nativeHandle)\r
428     {\r
429         LOGE("Failed to get nativeHandle for Message");\r
430         return NULL;\r
431     }\r
432     env->SetLongField(obj_message, fid_nativeHandle, pMessage);\r
433 \r
434     jfieldID fid_messageId = env->GetFieldID(cls_message, "mMessageId", "J");\r
435     if (!fid_messageId)\r
436     {\r
437         LOGE("Failed to get field MessageID for Message");\r
438         return NULL;\r
439     }\r
440     env->SetLongField(obj_message, fid_messageId, jMessageId);\r
441 \r
442     jfieldID fid_providerId = env->GetFieldID(cls_message, "mProviderId", "Ljava/lang/String;");\r
443     if (!fid_providerId)\r
444     {\r
445         LOGE("Failed to get field ProviderID for Message");\r
446         return NULL;\r
447     }\r
448     env->SetObjectField(obj_message, fid_providerId, jProviderId);\r
449 \r
450     jfieldID fid_time = env->GetFieldID(cls_message, "mTime", "Ljava/lang/String;");\r
451     if (!fid_time)\r
452     {\r
453         LOGE("Failed to get field Time for Message");\r
454         return NULL;\r
455     }\r
456     env->SetObjectField(obj_message, fid_time, jTime);\r
457 \r
458     jfieldID fid_ttl = env->GetFieldID(cls_message, "mTTL", "J");\r
459     if (!fid_ttl)\r
460     {\r
461         LOGE("Failed to get field TTL for Message");\r
462         return NULL;\r
463     }\r
464     env->SetLongField(obj_message, fid_ttl, jTTL);\r
465 \r
466     jfieldID fid_topic = env->GetFieldID(cls_message, "mTopic", "Ljava/lang/String;");\r
467     if (!fid_topic)\r
468     {\r
469         LOGE("Failed to get mTopic for Message");\r
470         return NULL;\r
471     }\r
472     env->SetObjectField(obj_message, fid_topic, jTopic);\r
473 \r
474     OIC::Service::NSMediaContents *mediaCont = message->getMediaContents();\r
475     if (mediaCont != nullptr)\r
476     {\r
477         jstring jIconImage = env->NewStringUTF(mediaCont->getIconImage().c_str());\r
478         jclass cls_mediaContents = (jclass) (env->NewLocalRef(g_cls_MediaContents));\r
479         if (!cls_mediaContents)\r
480         {\r
481             LOGE ("Failed to Get ObjectClass for MediaContents");\r
482             return NULL;\r
483         }\r
484         jmethodID mid_mediaContents = env->GetMethodID(\r
485                                           cls_mediaContents, "<init>", "(Ljava/lang/String;)V");\r
486         if (!mid_mediaContents)\r
487         {\r
488             LOGE ("Failed to Get MethodID for MediaContents<init>");\r
489             return NULL;\r
490         }\r
491         jobject obj_mediaContents = env->NewObject(cls_mediaContents, mid_mediaContents,\r
492                                     jIconImage);\r
493 \r
494         jfieldID fid_mediaContents = env->GetFieldID(cls_message, "mMediaContents",\r
495                                      "Lorg/iotivity/service/ns/common/MediaContents;");\r
496         if (!fid_mediaContents)\r
497         {\r
498             LOGE("Failed to get field mediaContents for Message");\r
499             return NULL;\r
500         }\r
501         env->SetObjectField(obj_message, fid_mediaContents, obj_mediaContents);\r
502 \r
503     }\r
504 \r
505     jobject jType = getJavaMessageType(env, message->getType());\r
506     if (!jType)\r
507     {\r
508         LOGE("Failed to get Type value for Message");\r
509         return NULL;\r
510     }\r
511     jfieldID fid_type = env->GetFieldID(cls_message, "mType",\r
512                                         "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
513     if (!fid_type)\r
514     {\r
515         LOGE("Failed to get field Type for Message");\r
516         return NULL;\r
517     }\r
518     env->SetObjectField(obj_message, fid_type, jType);\r
519     env->DeleteLocalRef(cls_message);\r
520     LOGD ("ConsumerService_getJavaMessage - OUT");\r
521     return obj_message;\r
522 }\r
523 \r
524 void onDiscoverProvider(OIC::Service::NSProvider *provider)\r
525 {\r
526     LOGD ("ConsumerService_onDiscoverProvider - IN");\r
527 \r
528     jint envRet;\r
529     JNIEnv *env = GetJNIEnv(&envRet);\r
530     if (NULL == env) return ;\r
531 \r
532     jobject jDiscoverListener = (jobject) env->NewLocalRef(g_obj_discoverListener);\r
533     if (!jDiscoverListener)\r
534     {\r
535         LOGE ("Failed to Get jDiscoverListener");\r
536         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
537         return ;\r
538     }\r
539 \r
540     jobject obj_provider = getJavaProvider(env, provider);\r
541     if (!obj_provider)\r
542     {\r
543         LOGE ("Failed to Get Provider Object");\r
544         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
545         return ;\r
546     }\r
547 \r
548     jclass cls = env->GetObjectClass(jDiscoverListener);\r
549     if (!cls)\r
550     {\r
551         LOGE ("Failed to Get ObjectClass for jDiscoverListener");\r
552         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
553         return ;\r
554     }\r
555     jmethodID mid = env->GetMethodID(\r
556                         cls,\r
557                         "onProviderDiscovered",\r
558                         "(Lorg/iotivity/service/ns/consumer/Provider;)V");\r
559     if (!mid)\r
560     {\r
561         LOGE ("Failed to Get MethodID for onProviderDiscovered");\r
562         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
563         return ;\r
564     }\r
565 \r
566     env->CallVoidMethod(jDiscoverListener, mid, obj_provider);\r
567 \r
568     env->DeleteLocalRef(jDiscoverListener);\r
569     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
570     LOGD ("ConsumerService_onDiscoverProvider - OUT");\r
571     return ;\r
572 }\r
573 \r
574 void onProviderChanged(OIC::Service::NSProvider *provider, OIC::Service::NSResponse response)\r
575 {\r
576     LOGD ("ConsumerService_onSubscriptionAccepted -IN");\r
577 \r
578     jint envRet;\r
579     JNIEnv *env = GetJNIEnv(&envRet);\r
580     if (NULL == env) return ;\r
581 \r
582     jobject jAcceptListener = (jobject) env->NewLocalRef(g_obj_acceptListener);\r
583     if (!jAcceptListener)\r
584     {\r
585         LOGE ("Failed to Get jAcceptListener");\r
586         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
587         return ;\r
588     }\r
589     jobject obj_provider = getJavaProvider(env, provider);\r
590     if (!obj_provider)\r
591     {\r
592         LOGE ("Failed to Get Provider Object");\r
593         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
594         return ;\r
595     }\r
596 \r
597     jclass cls = env->GetObjectClass(jAcceptListener);\r
598     if (!cls)\r
599     {\r
600         LOGE ("Failed to Get ObjectClass for jAcceptListener");\r
601         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
602         return ;\r
603     }\r
604     jmethodID mid = env->GetMethodID(\r
605                         cls,\r
606                         "onProviderChanged",\r
607                         "(Lorg/iotivity/service/ns/consumer/Provider;Lorg/iotivity/service/ns/consumer/ConsumerService$Response;)V");\r
608     if (!mid)\r
609     {\r
610         LOGE ("Failed to Get MethodID for onProviderChanged");\r
611         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
612         return ;\r
613     }\r
614     jobject obj_response = getJavaResponse(env, response);\r
615     env->CallVoidMethod(jAcceptListener, mid, obj_provider, obj_response);\r
616 \r
617     env->DeleteLocalRef(jAcceptListener);\r
618     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
619     LOGD ("ConsumerService_onSubscriptionAccepted -OUT");\r
620     return ;\r
621 \r
622 }\r
623 \r
624 void onMessagePosted(OIC::Service::NSMessage *message)\r
625 {\r
626     LOGD ("ConsumerService_onMessagePosted -IN");\r
627 \r
628     jint envRet;\r
629     JNIEnv *env = GetJNIEnv(&envRet);\r
630     if (NULL == env) return ;\r
631 \r
632     jobject jPostListener = (jobject) env->NewLocalRef(g_obj_postListener);\r
633     if (!jPostListener)\r
634     {\r
635         LOGE ("Failed to Get jPostListener");\r
636         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
637         return ;\r
638     }\r
639 \r
640     jobject obj_message = getJavaMessage( env, message);\r
641     if (!obj_message)\r
642     {\r
643         LOGE ("Failed to Get Message Object");\r
644         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
645         return ;\r
646     }\r
647     jclass cls = env->GetObjectClass(jPostListener);\r
648     if (!cls)\r
649     {\r
650         LOGE ("Failed to Get ObjectClass for jPostListener");\r
651         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
652         return ;\r
653     }\r
654     jmethodID mid = env->GetMethodID(\r
655                         cls,\r
656                         "onMessageReceived",\r
657                         "(Lorg/iotivity/service/ns/common/Message;)V");\r
658     if (!mid)\r
659     {\r
660         LOGE ("Failed to Get MethodID for onMessageReceived");\r
661         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
662         return ;\r
663     }\r
664 \r
665     env->CallVoidMethod(jPostListener, mid, obj_message);\r
666 \r
667     env->DeleteLocalRef(jPostListener);\r
668     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
669     LOGD ("ConsumerService_onMessagePosted -OUT");\r
670     return ;\r
671 }\r
672 \r
673 void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync)\r
674 {\r
675     LOGD ("ConsumerService_onSyncInfoReceived - IN");\r
676 \r
677     jint envRet;\r
678     JNIEnv *env = GetJNIEnv(&envRet);\r
679     if (NULL == env) return ;\r
680 \r
681     jobject jSyncListener = (jobject) env->NewLocalRef(g_obj_syncListener);\r
682     if (!jSyncListener)\r
683     {\r
684         LOGE ("Failed to Get jSyncListener");\r
685         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
686         return ;\r
687     }\r
688 \r
689     LOGD ("Sync ID : %llu\n", sync->getMessageId());\r
690     LOGD ("Sync ProviderId : %s\n", sync->getProviderId().c_str());\r
691     LOGD ("Sync STATE : %d\n", (int) sync->getState());\r
692 \r
693     jlong jMessageId = (jlong) sync->getMessageId();\r
694     jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str());\r
695     jint jState = (jint) sync->getState();\r
696 \r
697     jclass cls_sync = (jclass) (env->NewLocalRef(g_cls_SyncInfo));\r
698     if (!cls_sync)\r
699     {\r
700         LOGE ("Failed to Get ObjectClass for SyncInfo");\r
701         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
702         return ;\r
703     }\r
704     jmethodID mid_sync = env->GetMethodID(\r
705                              cls_sync, "<init>", "(JLjava/lang/String;I)V");\r
706     if (!mid_sync)\r
707     {\r
708         LOGE ("Failed to Get MethodID for SyncInfo<init>");\r
709         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
710         return ;\r
711     }\r
712     jobject obj_sync = env->NewObject(cls_sync, mid_sync,\r
713                                       jMessageId, jProviderId, jState);\r
714 \r
715     jclass cls = env->GetObjectClass(jSyncListener);\r
716     if (!cls)\r
717     {\r
718         LOGE ("Failed to Get ObjectClass for jSyncListener");\r
719         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
720         return ;\r
721     }\r
722     jmethodID mid = env->GetMethodID(\r
723                         cls,\r
724                         "onSyncInfoReceived",\r
725                         "(Lorg/iotivity/service/ns/common/SyncInfo;)V");\r
726     if (!mid)\r
727     {\r
728         LOGE ("Failed to Get MethodID for onSyncInfoReceived");\r
729         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
730         return ;\r
731     }\r
732 \r
733     env->CallVoidMethod(jSyncListener, mid, obj_sync);\r
734 \r
735     env->DeleteLocalRef(jSyncListener);\r
736     env->DeleteLocalRef(cls_sync);\r
737     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
738     LOGD ("ConsumerService_onSyncInfoReceived - OUT");\r
739     return ;\r
740 }\r
741 \r
742 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeStart\r
743 (JNIEnv *env, jobject jObj, jobject jDiscoverListener, jobject jAccpetListener)\r
744 {\r
745     LOGD ("ConsumerService_StartConsumer - IN");\r
746     if (!jDiscoverListener || !jAccpetListener)\r
747     {\r
748         ThrowNSException(NS_ERROR, "Listener cannot be null");\r
749         return ;\r
750     }\r
751 \r
752     if (g_obj_discoverListener != NULL)\r
753     {\r
754         env->DeleteGlobalRef(g_obj_discoverListener);\r
755     }\r
756     if (g_obj_acceptListener != NULL)\r
757     {\r
758         env->DeleteGlobalRef(g_obj_acceptListener);\r
759     }\r
760 \r
761     g_obj_discoverListener = (jobject) env->NewGlobalRef(jDiscoverListener);\r
762     g_obj_acceptListener = (jobject) env->NewGlobalRef(jAccpetListener);\r
763 \r
764     OIC::Service::NSConsumerService::ConsumerConfig cfg;\r
765     cfg.m_discoverCb = onDiscoverProvider;\r
766     cfg.m_changedCb = onProviderChanged;\r
767 \r
768     OIC::Service::NSConsumerService::getInstance()->Start(cfg);\r
769     LOGD ("ConsumerService_StartConsumer - OUT");\r
770     return;\r
771 \r
772 }\r
773 \r
774 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeStop\r
775 (JNIEnv *env, jobject jObj)\r
776 {\r
777     LOGD ("ConsumerService_StopConsumer - IN");\r
778 \r
779     env->DeleteGlobalRef(g_obj_postListener);\r
780     env->DeleteGlobalRef(g_obj_discoverListener);\r
781     env->DeleteGlobalRef(g_obj_syncListener);\r
782     env->DeleteGlobalRef(g_obj_acceptListener);\r
783     g_obj_postListener = NULL;\r
784     g_obj_discoverListener = NULL;\r
785     g_obj_syncListener = NULL;\r
786     g_obj_acceptListener = NULL;\r
787     OIC::Service::NSConsumerService::getInstance()->Stop();\r
788     LOGD ("ConsumerService_StopConsumer - OUT");\r
789     return;\r
790 }\r
791 \r
792 JNIEXPORT jint JNICALL\r
793 Java_org_iotivity_service_ns_consumer_ConsumerService_nativeEnableRemoteService\r
794 (JNIEnv *env, jobject jObj, jstring jServerAddress)\r
795 {\r
796     LOGD ("ConsumerService_EnableRemoteService - IN");\r
797     if (!jServerAddress)\r
798     {\r
799         ThrowNSException(NS_ERROR, "EnableRemoteService server address NULL");\r
800         return (jint) OIC::Service::NSResult::ERROR;\r
801     }\r
802     const char *serverAddress = env->GetStringUTFChars(jServerAddress, 0);\r
803     OIC::Service::NSResult res =\r
804         OIC::Service::NSConsumerService::getInstance()->EnableRemoteService(std::string(serverAddress));\r
805     env->ReleaseStringUTFChars(jServerAddress, serverAddress);\r
806     LOGD ("ConsumerService_EnableRemoteService - OUT");\r
807     return (jint) res;\r
808 }\r
809 \r
810 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeRescanProvider\r
811 (JNIEnv *env, jobject jObj)\r
812 {\r
813     LOGD ("ConsumerService_RescanProvider - IN");\r
814     OIC::Service::NSConsumerService::getInstance()->RescanProvider();\r
815     LOGD ("ConsumerService_RescanProvider - OUT");\r
816     return;\r
817 \r
818 }\r
819 \r
820 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeGetProvider\r
821 (JNIEnv *env, jobject jObj, jstring jProviderId)\r
822 {\r
823     LOGD ("ConsumerService_GetProvider - IN");\r
824     if (!jProviderId)\r
825     {\r
826         ThrowNSException(NS_ERROR, "ProviderId cannot be null");\r
827         return NULL;\r
828     }\r
829 \r
830     const char *providerId = env->GetStringUTFChars(jProviderId, 0);\r
831 \r
832     OIC::Service::NSProvider *provider =\r
833         OIC::Service::NSConsumerService::getInstance()->getProvider(std::string(providerId));\r
834     if (provider == nullptr)\r
835     {\r
836         ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
837         return NULL;\r
838     }\r
839 \r
840     LOGD ("ProviderId : %s\n", provider->getProviderId().c_str());\r
841 \r
842     jProviderId = env->NewStringUTF(provider->getProviderId().c_str());\r
843     jlong pProvider = (long)provider;\r
844 \r
845     jclass cls_provider = (jclass) (env->NewLocalRef(g_cls_Provider));\r
846     if (!cls_provider)\r
847     {\r
848         LOGE ("Failed to Get ObjectClass for Provider");\r
849         return NULL;\r
850     }\r
851     jmethodID mid_provider = env->GetMethodID(\r
852                                  cls_provider, "<init>", "(Ljava/lang/String;)V");\r
853     if (!mid_provider)\r
854     {\r
855         LOGE ("Failed to Get MethodID for Provider<init>");\r
856         return NULL;\r
857     }\r
858     jobject obj_provider = env->NewObject(cls_provider, mid_provider,\r
859                                           jProviderId);\r
860 \r
861     jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J");\r
862     if (!nativeHandle)\r
863     {\r
864         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
865         return NULL;\r
866     }\r
867     env->SetLongField(obj_provider, nativeHandle, pProvider);\r
868 \r
869     env->DeleteLocalRef(cls_provider);\r
870     env->ReleaseStringUTFChars(jProviderId, providerId);\r
871     LOGD ("ConsumerService_GetProvider - OUT");\r
872     return obj_provider;\r
873 }\r
874 \r
875 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeGetMessage\r
876 (JNIEnv *env, jobject jObj, jlong jMsgId)\r
877 {\r
878     LOGI("JNIConsumerService: nativeGetMessage - IN");\r
879 \r
880     OIC::Service::NSMessage *msg  =\r
881         OIC::Service::NSConsumerService::getInstance()->getMessage((uint64_t)jMsgId);\r
882     if (msg == nullptr)\r
883     {\r
884         ThrowNSException(NS_ERROR, "Message doesn't exist");\r
885         return NULL;\r
886     }\r
887 \r
888     jobject obj_msg = getJavaMessage(env, msg);\r
889 \r
890     LOGI("JNIConsumerService: nativeGetMessage - OUT");\r
891     return obj_msg;\r
892 }\r
893 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSubscribe\r
894 (JNIEnv *env, jobject jObj)\r
895 {\r
896     LOGD ("Provider_Subscribe -IN");\r
897     jclass providerClass = env->GetObjectClass(jObj);\r
898     if (!providerClass)\r
899     {\r
900         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
901         return ;\r
902     }\r
903 \r
904     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
905     if (!nativeHandle)\r
906     {\r
907         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
908         return ;\r
909     }\r
910     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
911     if (jProvider)\r
912     {\r
913         LOGD ("calling subscribe on mNativeHandle");\r
914         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
915         provider->subscribe();\r
916     }\r
917     else\r
918     {\r
919         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
920         if (provider == nullptr)\r
921         {\r
922             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
923             return;\r
924         }\r
925         LOGD ("calling subscribe on ProviderID");\r
926         provider->subscribe();\r
927     }\r
928     LOGD ("Provider_Subscribe -OUT");\r
929     return;\r
930 }\r
931 \r
932 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUnsubscribe\r
933 (JNIEnv *env, jobject jObj)\r
934 {\r
935     LOGD ("Provider_Unsubscribe - IN");\r
936 \r
937     jclass providerClass = env->GetObjectClass(jObj);\r
938     if (!providerClass)\r
939     {\r
940         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
941         return ;\r
942     }\r
943 \r
944     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
945     if (!nativeHandle)\r
946     {\r
947         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
948         return ;\r
949     }\r
950     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
951     if (jProvider)\r
952     {\r
953         LOGD ("calling unSubscribe on mNativeHandle");\r
954         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
955         provider->unSubscribe();\r
956     }\r
957     else\r
958     {\r
959         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
960         if (provider == nullptr)\r
961         {\r
962             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
963             return;\r
964         }\r
965         LOGD ("calling unSubscribe on ProviderID");\r
966         provider->unSubscribe();\r
967     }\r
968     LOGD ("Provider_Unsubscribe - IN");\r
969     return;\r
970 }\r
971 \r
972 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSendSyncInfo\r
973 (JNIEnv *env, jobject jObj, jlong jMessageId, jint jSyncType)\r
974 {\r
975     LOGD ("Provider_SendSyncInfo - IN");\r
976     if (!jMessageId)\r
977     {\r
978         ThrowNSException(NS_ERROR, "MessageId cannot be 0");\r
979         return ;\r
980     }\r
981 \r
982     jclass providerClass = env->GetObjectClass(jObj);\r
983     if (!providerClass)\r
984     {\r
985         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
986         return ;\r
987     }\r
988 \r
989     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
990     if (!nativeHandle)\r
991     {\r
992         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
993         return ;\r
994     }\r
995     uint64_t messageId = (uint64_t) jMessageId;\r
996 \r
997     LOGD("!!!!!!jMessageId: %lld", jMessageId);\r
998     LOGD("!!!!!!messageId: %lld", messageId);\r
999 \r
1000     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
1001     if (jProvider)\r
1002     {\r
1003         LOGD ("calling SendSyncInfo on mNativeHandle");\r
1004         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
1005         provider->SendSyncInfo(messageId, (OIC::Service::NSSyncInfo::NSSyncType)jSyncType);\r
1006     }\r
1007     else\r
1008     {\r
1009         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
1010         if (provider == nullptr)\r
1011         {\r
1012             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
1013             return;\r
1014         }\r
1015         LOGD ("calling SendSyncInfo on ProviderID");\r
1016         provider->SendSyncInfo(messageId, (OIC::Service::NSSyncInfo::NSSyncType)jSyncType);\r
1017     }\r
1018     LOGD ("Provider_SendSyncInfo - OUT");\r
1019     return;\r
1020 }\r
1021 \r
1022 \r
1023 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSetListener\r
1024 (JNIEnv *env, jobject jObj, jobject jPostListener, jobject jSyncListener)\r
1025 {\r
1026     LOGD ("Provider_SetListener - IN");\r
1027     if (!jPostListener || !jSyncListener)\r
1028     {\r
1029         ThrowNSException(NS_ERROR, "Listener cannot be null");\r
1030         return ;\r
1031     }\r
1032 \r
1033     jclass providerClass = env->GetObjectClass(jObj);\r
1034     if (!providerClass)\r
1035     {\r
1036         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
1037         return ;\r
1038     }\r
1039 \r
1040     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
1041     if (!nativeHandle)\r
1042     {\r
1043         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
1044         return ;\r
1045     }\r
1046     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
1047     if (jProvider)\r
1048     {\r
1049         LOGD ("calling SetListener on mNativeHandle");\r
1050         if (g_obj_postListener != NULL)\r
1051         {\r
1052             env->DeleteGlobalRef(g_obj_postListener);\r
1053         }\r
1054         if (g_obj_syncListener != NULL)\r
1055         {\r
1056             env->DeleteGlobalRef(g_obj_syncListener);\r
1057         }\r
1058         g_obj_syncListener = NULL;\r
1059         g_obj_acceptListener = NULL;\r
1060         g_obj_postListener = (jobject) env->NewGlobalRef(jPostListener);\r
1061         g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);\r
1062 \r
1063         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
1064         provider->setListener(onMessagePosted, onSyncInfoReceived);\r
1065     }\r
1066     else\r
1067     {\r
1068         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
1069         if (provider == nullptr)\r
1070         {\r
1071             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
1072             return;\r
1073         }\r
1074         LOGD ("calling SetListener on ProviderID");\r
1075         if (g_obj_postListener != NULL)\r
1076         {\r
1077             env->DeleteGlobalRef(g_obj_postListener);\r
1078         }\r
1079         if (g_obj_syncListener != NULL)\r
1080         {\r
1081             env->DeleteGlobalRef(g_obj_syncListener);\r
1082         }\r
1083         g_obj_syncListener = NULL;\r
1084         g_obj_acceptListener = NULL;\r
1085         g_obj_postListener = (jobject) env->NewGlobalRef(jPostListener);\r
1086         g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);\r
1087 \r
1088         provider->setListener(onMessagePosted, onSyncInfoReceived);\r
1089     }\r
1090     LOGD ("Provider_SetListener - OUT");\r
1091     return;\r
1092 }\r
1093 \r
1094 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSelectInterestTopics\r
1095 (JNIEnv *env, jobject jObj, jobject jTopicsList)\r
1096 {\r
1097     LOGD("Provider_SelectInterestTopics -IN");\r
1098     if (!jTopicsList)\r
1099     {\r
1100         LOGI("Fail to select Interest Topics - Topic List is null");\r
1101         ThrowNSException(NS_ERROR, "TopicList cannot be null");\r
1102         return (jint) OIC::Service::NSResult::ERROR;\r
1103     }\r
1104     OIC::Service::NSTopicsList *nsTopicsList = getNativeTopicsList(env, jTopicsList);\r
1105     if (nsTopicsList == nullptr)\r
1106     {\r
1107         ThrowNSException(NS_ERROR, "NSTopicList cannot be created ");\r
1108         return (jint) OIC::Service::NSResult::ERROR;\r
1109     }\r
1110 \r
1111     jclass providerClass = env->GetObjectClass(jObj);\r
1112     if (!providerClass)\r
1113     {\r
1114         ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
1115         return  (jint) OIC::Service::NSResult::ERROR;\r
1116     }\r
1117 \r
1118     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
1119     if (!nativeHandle)\r
1120     {\r
1121         ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
1122         return  (jint) OIC::Service::NSResult::ERROR;\r
1123     }\r
1124     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
1125     OIC::Service::NSResult result;\r
1126     if (jProvider)\r
1127     {\r
1128         LOGD ("calling subscribe on mNativeHandle");\r
1129         OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
1130         result = provider->selectInterestTopics(nsTopicsList);\r
1131     }\r
1132     else\r
1133     {\r
1134         OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
1135         if (provider == nullptr)\r
1136         {\r
1137             ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
1138             return (jint) OIC::Service::NSResult::ERROR;\r
1139         }\r
1140         LOGD ("calling subscribe on ProviderID");\r
1141         result = provider->selectInterestTopics(nsTopicsList);\r
1142     }\r
1143     if (result !=  OIC::Service::NSResult::OK)\r
1144     {\r
1145         LOGI("Fail to select Interest Topics");\r
1146     }\r
1147     LOGD("Provider_SelectInterestTopics -OUT");\r
1148     return (jint) result;\r
1149 }\r
1150 // JNI OnLoad\r
1151 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)\r
1152 {\r
1153     LOGD("ConsumerService_JNI_OnLoad");\r
1154     g_jvm = jvm;\r
1155 \r
1156     JNIEnv *env;\r
1157     if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)\r
1158     {\r
1159         LOGE("Failed to get the environment using GetEnv()");\r
1160         return JNI_ERR;\r
1161     }\r
1162 \r
1163     jclass localMessage = env->FindClass(\r
1164                               "org/iotivity/service/ns/common/Message");\r
1165     if (!localMessage)\r
1166     {\r
1167         LOGE("Failed to get local Message class");\r
1168         return JNI_ERR;\r
1169     }\r
1170     g_cls_Message = (jclass) (env->NewGlobalRef(localMessage));\r
1171     if (!g_cls_Message)\r
1172     {\r
1173         LOGE("Failed to set Global Message reference");\r
1174         return JNI_ERR;\r
1175     }\r
1176 \r
1177     jclass localProvider = env->FindClass(\r
1178                                "org/iotivity/service/ns/consumer/Provider");\r
1179     if (!localProvider)\r
1180     {\r
1181         LOGE("Failed to get local Provider class");\r
1182         return JNI_ERR;\r
1183     }\r
1184     g_cls_Provider = (jclass) (env->NewGlobalRef(localProvider));\r
1185     if (!g_cls_Provider)\r
1186     {\r
1187         LOGE("Failed to set Global Provider reference");\r
1188         return JNI_ERR;\r
1189     }\r
1190 \r
1191     jclass localSyncInfo = env->FindClass(\r
1192                                "org/iotivity/service/ns/common/SyncInfo");\r
1193     if (!localSyncInfo)\r
1194     {\r
1195         LOGE("Failed to get local SyncInfo class");\r
1196         return JNI_ERR;\r
1197     }\r
1198     g_cls_SyncInfo = (jclass) (env->NewGlobalRef(localSyncInfo));\r
1199     if (!g_cls_SyncInfo)\r
1200     {\r
1201         LOGE("Failed to set Global NSSyncInfo reference");\r
1202         return JNI_ERR;\r
1203     }\r
1204 \r
1205     jclass localMediaContents = env->FindClass(\r
1206                                     "org/iotivity/service/ns/common/MediaContents");\r
1207     if (!localMediaContents)\r
1208     {\r
1209         LOGE("Failed to get local MediaContents class");\r
1210         return JNI_ERR;\r
1211     }\r
1212     g_cls_MediaContents = (jclass) (env->NewGlobalRef(localMediaContents));\r
1213     if (!g_cls_MediaContents)\r
1214     {\r
1215         LOGE("Failed to set Global MediaContents reference");\r
1216         return JNI_ERR;\r
1217     }\r
1218     jclass localTopicState = env->FindClass(\r
1219                                  "org/iotivity/service/ns/common/Topic$TopicState");\r
1220     if (!localTopicState)\r
1221     {\r
1222         LOGE("Failed to get local TopicState enum");\r
1223         return JNI_ERR;\r
1224     }\r
1225     g_cls_TopicState = (jclass) (env->NewGlobalRef(localTopicState));\r
1226     if (!g_cls_TopicState)\r
1227     {\r
1228         LOGE("Failed to set Global TopicState reference");\r
1229         return JNI_ERR;\r
1230     }\r
1231 \r
1232     jclass localTopic = env->FindClass(\r
1233                             "org/iotivity/service/ns/common/Topic");\r
1234     if (!localTopic)\r
1235     {\r
1236         LOGE("Failed to get local TopicState enum");\r
1237         return JNI_ERR;\r
1238     }\r
1239     g_cls_Topic = (jclass) (env->NewGlobalRef(localTopic));\r
1240     if (!g_cls_Topic)\r
1241     {\r
1242         LOGE("Failed to set Global Topic reference");\r
1243         return JNI_ERR;\r
1244     }\r
1245 \r
1246     jclass localMessageType = env->FindClass(\r
1247                                   "org/iotivity/service/ns/common/Message$MessageType");\r
1248     if (!localMessageType)\r
1249     {\r
1250         LOGE("Failed to get local Message Type class");\r
1251         return JNI_ERR;\r
1252     }\r
1253     g_cls_Message_Type = (jclass) (env->NewGlobalRef(localMessageType));\r
1254     if (!g_cls_Message_Type)\r
1255     {\r
1256         LOGE("Failed to set Global Message Type reference");\r
1257         return JNI_ERR;\r
1258     }\r
1259 \r
1260     jclass localResponse = env->FindClass(\r
1261                                "org/iotivity/service/ns/consumer/ConsumerService$Response");\r
1262     if (!localResponse)\r
1263     {\r
1264         LOGE("Failed to get localResponse  Type class");\r
1265         return JNI_ERR;\r
1266     }\r
1267     g_cls_Response = (jclass) (env->NewGlobalRef(localResponse));\r
1268     if (!g_cls_Response)\r
1269     {\r
1270         LOGE("Failed to set Global Response Type reference");\r
1271         return JNI_ERR;\r
1272     }\r
1273 \r
1274     jclass localTopicsList = env->FindClass(\r
1275                                  "org/iotivity/service/ns/common/TopicsList");\r
1276     if (!localTopicsList)\r
1277     {\r
1278         LOGE("Failed to get local Topic class");\r
1279         return JNI_ERR;\r
1280     }\r
1281     g_cls_TopicsList = (jclass) (env->NewGlobalRef(localTopicsList));\r
1282     if (!g_cls_TopicsList)\r
1283     {\r
1284         LOGE("Failed to set Global TopicsList reference");\r
1285         return JNI_ERR;\r
1286     }\r
1287     env->DeleteLocalRef(localMessage);\r
1288     env->DeleteLocalRef(localProvider);\r
1289     env->DeleteLocalRef(localSyncInfo);\r
1290     env->DeleteLocalRef(localMediaContents);\r
1291     env->DeleteLocalRef(localTopicState);\r
1292     env->DeleteLocalRef(localMessageType);\r
1293     env->DeleteLocalRef(localResponse);\r
1294     env->DeleteLocalRef(localTopic);\r
1295     env->DeleteLocalRef(localTopicsList);\r
1296 \r
1297     return NSExceptionInit(env);\r
1298 }\r
1299 \r
1300 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)\r
1301 {\r
1302     LOGI("ConsumerService_JNI_OnUnload");\r
1303     JNIEnv *env;\r
1304 \r
1305     if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)\r
1306     {\r
1307         LOGE("Failed to get the environment using GetEnv()");\r
1308         return ;\r
1309     }\r
1310 \r
1311     env->DeleteGlobalRef(g_cls_Message);\r
1312     env->DeleteGlobalRef(g_cls_Provider);\r
1313     env->DeleteGlobalRef(g_cls_SyncInfo);\r
1314     env->DeleteGlobalRef(g_cls_MediaContents);\r
1315     env->DeleteGlobalRef(g_cls_TopicState);\r
1316     env->DeleteGlobalRef(g_cls_Message_Type);\r
1317     env->DeleteGlobalRef(g_cls_Response);\r
1318     env->DeleteGlobalRef(g_cls_Topic);\r
1319     env->DeleteGlobalRef(g_cls_TopicsList);\r
1320 }\r