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