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