From 81edd67b21c6d4a846ce2d014344a88da8530567 Mon Sep 17 00:00:00 2001 From: "nikhil.a" Date: Sun, 28 Aug 2016 21:38:10 +0530 Subject: [PATCH] 1) Modified JNI to fix few issues. 2) Update cpp-wrapper code causing issue with JAVA API's. Change-Id: I55b5b0d85fce9011287868773e17144f9ce4ea61 Signed-off-by: nikhil.a Reviewed-on: https://gerrit.iotivity.org/gerrit/11005 Tested-by: jenkins-iotivity Reviewed-by: Uze Choi Tested-by: Uze Choi (cherry picked from commit dfd2b5b33435d137d2344482bba6d9d5710e8823) Reviewed-on: https://gerrit.iotivity.org/gerrit/11039 Reviewed-by: Madan Lanka --- .../org/iotivity/service/ns/common/TopicsList.java | 5 +- .../org/iotivity/service/ns/consumer/Provider.java | 4 +- .../main/jni/consumer/JniNotificationConsumer.cpp | 351 ++++++++++++++------- .../main/jni/provider/JniNotificationProvider.cpp | 166 ++++++---- .../notification/cpp-wrapper/common/NSMessage.cpp | 2 +- .../notification/cpp-wrapper/common/NSSyncInfo.cpp | 2 +- .../cpp-wrapper/consumer/src/NSProvider.cpp | 2 +- .../cpp-wrapper/provider/src/NSConsumer.cpp | 2 +- 8 files changed, 356 insertions(+), 178 deletions(-) diff --git a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/TopicsList.java b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/TopicsList.java index 6175e77..8572ccc 100644 --- a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/TopicsList.java +++ b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/TopicsList.java @@ -42,9 +42,10 @@ public class TopicsList Iterator it = getTopicsList().iterator(); while(it.hasNext()) { - if(it.next().getTopicName().equals(topicName)) + Topic element = it.next(); + if(element.getTopicName().equals(topicName)) { - mTopicsList.remove(it.next()); + mTopicsList.remove(element); } } } diff --git a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/Provider.java b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/Provider.java index a25e7c1..622a09b 100755 --- a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/Provider.java +++ b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/Provider.java @@ -74,7 +74,7 @@ public class Provider nativeSetListener(onMessageReceivedListner, onSyncInfoReceivedListner); } - public int SelectInterestTopics(Vector topicsList) throws NSException + public int SelectInterestTopics(TopicsList topicsList) throws NSException { return nativeSelectInterestTopics(topicsList); } @@ -96,5 +96,5 @@ public class Provider OnMessageReceivedListner onMessageReceivedListner, OnSyncInfoReceivedListner onSyncInfoReceivedListner ) throws NSException; - private native int nativeSelectInterestTopics(Vector topicsList) throws NSException; + private native int nativeSelectInterestTopics(TopicsList topicsList) throws NSException; } diff --git a/service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.cpp b/service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.cpp index e8c6664..88ed756 100755 --- a/service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.cpp +++ b/service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.cpp @@ -31,6 +31,7 @@ static jobject g_obj_acceptListener = NULL; jclass g_cls_Message; jclass g_cls_Provider; jclass g_cls_SyncInfo; +jclass g_cls_SyncType; jclass g_cls_MediaContents; jclass g_cls_TopicState; jclass g_cls_Message_Type; @@ -65,52 +66,91 @@ static JNIEnv *GetJNIEnv(jint *ret) } } -jobject getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type) +jobject getJavaResponse(JNIEnv *env, OIC::Service::NSResponse response) { - LOGD ("ConsumerService_getJavaMessageType - IN"); - switch (type) + LOGD ("ConsumerService_getJavaResponse - IN"); + switch (response) { - case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT: - { - static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, - "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;"); - return env->GetStaticObjectField(g_cls_Message, fieldID); - } - case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE: + case OIC::Service::NSResponse::ALLOW: { - static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, - "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;"); - return env->GetStaticObjectField(g_cls_Message, fieldID); + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response, + "ALLOW", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;"); + return env->GetStaticObjectField(g_cls_Response, fieldID); } - case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT: + case OIC::Service::NSResponse::DENY: { - static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, - "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;"); - return env->GetStaticObjectField(g_cls_Message, fieldID); + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response, + "DENY", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;"); + return env->GetStaticObjectField(g_cls_Response, fieldID); } - case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO: + case OIC::Service::NSResponse::TOPIC: { - static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, - "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;"); - return env->GetStaticObjectField(g_cls_Message, fieldID); + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response, + "TOPIC", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;"); + return env->GetStaticObjectField(g_cls_Response, fieldID); } default: return NULL; } - LOGD ("ConsumerService_getJavaMessageType - OUT"); + LOGD ("ConsumerService_getJavaResponse - OUT"); return NULL; } -jobject getJavaState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState) +jobject getJavaSyncType(JNIEnv *env, OIC::Service::NSSyncInfo::NSSyncType nsType) +{ + LOGD ("ConsumerService_getJavaSyncType - IN"); + + // SyncType + jclass cls_SyncType = (jclass) (env->NewLocalRef(g_cls_SyncType)); + if (!cls_SyncType) + { + LOGE ("Failed to Get ObjectClass for SyncType"); + return NULL; + } + jobject syncType; + switch (nsType) + { + case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_UNREAD: + { + static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, + "UNREAD", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); + syncType = env->GetStaticObjectField(cls_SyncType, fieldID); + } + case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ : + { + static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, + "READ", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); + syncType = env->GetStaticObjectField(cls_SyncType, fieldID); + } + case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED : + { + static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, + "DELETED", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); + syncType = env->GetStaticObjectField(cls_SyncType, fieldID); + } + + } + + if (syncType == NULL) + { + LOGD("Error: object of field Synctype is null"); + } + + env->DeleteLocalRef(cls_SyncType); + LOGD ("ConsumerService_getJavaSyncType - OUT"); + return syncType; +} + +jobject getJavaTopicState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState) { - LOGD ("ConsumerService_getJavaState - IN"); + LOGD ("ConsumerService_getJavaTopicState - IN"); // TopicState jclass cls_topicState = (jclass) (env->NewLocalRef(g_cls_TopicState)); if (!cls_topicState) { LOGE ("Failed to Get ObjectClass for TopicState Type"); - return nullptr; + return NULL; } jobject obj_topicState; @@ -132,16 +172,14 @@ jobject getJavaState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState) } if (obj_topicState == NULL) { - LOGE("Error: object of field TopicState is null"); - return NULL; + LOGD("Error: object of field TopicState is null"); } env->DeleteLocalRef(cls_topicState); - LOGD ("ConsumerService_getJavaState - OUT"); + LOGD ("ConsumerService_getJavaTopicState - OUT"); return obj_topicState; } - jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList) { LOGD ("ConsumerService_getJavaTopicsList - IN"); @@ -158,11 +196,21 @@ jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList) return NULL; } jobject obj_topicList = env->NewObject(cls_topicList, mid_topicList); - jmethodID mid_addTopic = - env->GetMethodID(cls_topicList, "addTopic", "(Lorg/iotivity/service/ns/common/Topic;)V"); + if (!obj_topicList) + { + LOGE ("Failed to Get object for TopicsList"); + return NULL; + } + jmethodID mid_addTopic = env->GetMethodID(cls_topicList, "addTopic", + "(Ljava/lang/String;Lorg/iotivity/service/ns/common/Topic$TopicState;)V"); + if (!mid_addTopic) + { + LOGE ("Failed to Get MethodID for addTopic"); + return NULL; + } for (auto it : topicList->getTopicsList()) { - jobject jState = getJavaState(env, it->getState()); + jobject jState = getJavaTopicState(env, it->getState()); std::string topicName = it->getTopicName(); jstring jTopicName = env->NewStringUTF(topicName.c_str()); env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState); @@ -172,9 +220,9 @@ jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList) return obj_topicList; } -OIC::Service::NSTopic::NSTopicState getNativeState(JNIEnv *env, jobject jTopic) +bool getNativeTopicState(JNIEnv *env, jobject jTopic , OIC::Service::NSTopic::NSTopicState &state ) { - LOGD ("ConsumerService_getNativeState - IN"); + LOGD ("ConsumerService_getNativeTopicState - IN"); jclass cls_topic = env->GetObjectClass( jTopic); // TopicState @@ -182,29 +230,26 @@ OIC::Service::NSTopic::NSTopicState getNativeState(JNIEnv *env, jobject jTopic) if (!cls_TopicState) { LOGE ("Failed to Get ObjectClass for cls_TopicState Type"); - ThrowNSException(NS_ERROR, "TopicState class not found "); - return OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED; + return false; } jmethodID mid = env->GetMethodID(cls_TopicState, "ordinal", "()I"); - jfieldID fid_state = env->GetFieldID( cls_TopicState, "mState", + jfieldID fid_state = env->GetFieldID( cls_topic, "mState", "Lorg/iotivity/service/ns/common/Topic$TopicState;"); if (fid_state == NULL) { LOGE("Error: jfieldID for state type is null"); - ThrowNSException(NS_ERROR, "TopicState fid not found "); - return OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED; + return false; } jobject jobj = env->GetObjectField( jTopic, fid_state); if (jobj == NULL) { LOGE("Error: object of field state Type is null"); - ThrowNSException(NS_ERROR, "TopicState obj is null "); - return OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED; + return false; } jint jState = env->CallIntMethod(jobj, mid); - OIC::Service::NSTopic::NSTopicState state = (OIC::Service::NSTopic::NSTopicState) jState; - LOGD ("ConsumerService_getNativeState - OUT"); - return state; + state = (OIC::Service::NSTopic::NSTopicState) jState; + LOGD ("ConsumerService_getNativeTopicState - OUT"); + return true; } @@ -212,8 +257,12 @@ const char *getNativeTopicName(JNIEnv *env, jobject jTopic) { LOGD ("ConsumerService_getNativeTopicName - IN"); jclass cls_topic = env->GetObjectClass( jTopic); - jfieldID fid_name = env->GetFieldID( cls_topic, "mTopicname", - "Ljava/lang/String;"); + if (cls_topic == NULL) + { + LOGE("Error: Class for Topic is null"); + return nullptr; + } + jfieldID fid_name = env->GetFieldID( cls_topic, "mTopicName", "Ljava/lang/String;"); if (fid_name == NULL) { LOGE("Error: jfieldID for Topic Name is null"); @@ -239,8 +288,12 @@ OIC::Service::NSTopicsList *getNativeTopicsList(JNIEnv *env, jobject jTopicList) LOGD ("ConsumerService_getNativeTopicsList - IN"); jclass cls_topicList = env->GetObjectClass( jTopicList); - jfieldID fid_list = env->GetFieldID( cls_topicList, "mTopicsList", - "Ljava/util/Vector;"); + if (cls_topicList == NULL) + { + LOGE("Error: Class for Topic List is null"); + return nullptr; + } + jfieldID fid_list = env->GetFieldID( cls_topicList, "mTopicsList", "Ljava/util/Vector;"); if (fid_list == NULL) { LOGE("Error: jfieldID for Topic List is null"); @@ -253,16 +306,45 @@ OIC::Service::NSTopicsList *getNativeTopicsList(JNIEnv *env, jobject jTopicList) return nullptr; } jclass cls_vec = env->FindClass("java/util/Vector"); - jmethodID sizeMethod = env->GetMethodID(cls_vec, "size", "()I;"); + if (cls_vec == NULL) + { + LOGE("Error: Class for Vector not found"); + return nullptr; + } + jmethodID sizeMethod = env->GetMethodID(cls_vec, "size", "()I"); + if (sizeMethod == NULL) + { + LOGE("Error: MethodId for Vector Size not found"); + return nullptr; + } int size = env->CallIntMethod(jobj, sizeMethod); jmethodID getMethod = env->GetMethodID(cls_vec, "get", "(I)Ljava/lang/Object;"); + if (getMethod == NULL) + { + LOGE("Error: MethodId for Vector get not found"); + return nullptr; + } OIC::Service::NSTopicsList *nsTopicList = new OIC::Service::NSTopicsList(); for (int index = 0; index < size; index++) { jobject topicObj = env->CallObjectMethod(jobj, getMethod, index); + if (topicObj == NULL) + { + LOGE("Error: object of field Topic is null"); + return nullptr; + } const char *name = getNativeTopicName(env, topicObj); + if (name == nullptr) + { + LOGE("Error: Couldn't find topic Name"); + return nullptr; + } std::string topicName(name); - OIC::Service::NSTopic::NSTopicState state = getNativeState(env, topicObj); + OIC::Service::NSTopic::NSTopicState state; + if (!getNativeTopicState(env, topicObj, state)) + { + return nullptr; + } nsTopicList->addTopic(topicName, state); } @@ -272,36 +354,6 @@ OIC::Service::NSTopicsList *getNativeTopicsList(JNIEnv *env, jobject jTopicList) return nsTopicList; } -jobject getJavaResponse(JNIEnv *env, OIC::Service::NSResponse response) -{ - LOGD ("ConsumerService_getJavaResponse - IN"); - switch (response) - { - case OIC::Service::NSResponse::ALLOW: - { - static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response, - "ALLOW", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;"); - return env->GetStaticObjectField(g_cls_Response, fieldID); - } - case OIC::Service::NSResponse::DENY: - { - static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response, - "DENY", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;"); - return env->GetStaticObjectField(g_cls_Response, fieldID); - } - case OIC::Service::NSResponse::TOPIC: - { - static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response, - "TOPIC", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;"); - return env->GetStaticObjectField(g_cls_Response, fieldID); - } - default: - return NULL; - } - LOGD ("ConsumerService_getJavaResponse - OUT"); - return NULL; -} - OIC::Service::NSProvider *getNativeProvider(JNIEnv *env, jobject jObj) { LOGD ("ConsumerService_getNativeProvider - IN"); @@ -361,6 +413,11 @@ jobject getJavaProvider(JNIEnv *env, OIC::Service::NSProvider *provider) return NULL; } jobject obj_provider = env->NewObject(cls_provider, mid_provider, jProviderId); + if (!obj_provider) + { + LOGE("Failed to create new Object for Provider"); + return NULL; + } jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J"); if (!nativeHandle) @@ -371,10 +428,10 @@ jobject getJavaProvider(JNIEnv *env, OIC::Service::NSProvider *provider) env->SetLongField(obj_provider, nativeHandle, pProvider); jfieldID fid_topic = env->GetFieldID(cls_provider, "mTopicsList", - "Lorg/iotivity/service/ns/common/TopicsList"); + "Lorg/iotivity/service/ns/common/TopicsList;"); if (!fid_topic) { - LOGE("Failed to get nativeHandle for Provider"); + LOGE("Failed to get TopicList for Provider"); return NULL; } jobject topicList = getJavaTopicsList(env, provider->getTopicList()); @@ -384,6 +441,41 @@ jobject getJavaProvider(JNIEnv *env, OIC::Service::NSProvider *provider) return obj_provider; } +jobject getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type) +{ + LOGD ("ConsumerService_getJavaMessageType - IN"); + switch (type) + { + case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT: + { + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, + "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;"); + return env->GetStaticObjectField(g_cls_Message, fieldID); + } + case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE: + { + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, + "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;"); + return env->GetStaticObjectField(g_cls_Message, fieldID); + } + case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT: + { + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, + "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;"); + return env->GetStaticObjectField(g_cls_Message, fieldID); + } + case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO: + { + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, + "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;"); + return env->GetStaticObjectField(g_cls_Message, fieldID); + } + default: + return NULL; + } + LOGD ("ConsumerService_getJavaMessageType - OUT"); + return NULL; +} jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message) { @@ -422,7 +514,11 @@ jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message) } jobject obj_message = env->NewObject(cls_message, mid_message, jTitle, jContentText, jSourceName); - + if (!obj_message) + { + LOGE ("Failed to Get Java Object for Message"); + return NULL; + } jfieldID fid_nativeHandle = env->GetFieldID(cls_message, "mNativeHandle", "J"); if (!fid_nativeHandle) { @@ -503,19 +599,18 @@ jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message) } jobject jType = getJavaMessageType(env, message->getType()); - if (!jType) - { - LOGE("Failed to get Type value for Message"); - return NULL; - } - jfieldID fid_type = env->GetFieldID(cls_message, "mType", - "Lorg/iotivity/service/ns/common/Message$MessageType;"); - if (!fid_type) + if (jType) { - LOGE("Failed to get field Type for Message"); - return NULL; + jfieldID fid_type = env->GetFieldID(cls_message, "mType", + "Lorg/iotivity/service/ns/common/Message$MessageType;"); + if (!fid_type) + { + LOGE("Failed to get field Type for Message"); + return NULL; + } + env->SetObjectField(obj_message, fid_type, jType); } - env->SetObjectField(obj_message, fid_type, jType); + env->DeleteLocalRef(cls_message); LOGD ("ConsumerService_getJavaMessage - OUT"); return obj_message; @@ -573,7 +668,7 @@ void onDiscoverProvider(OIC::Service::NSProvider *provider) void onProviderChanged(OIC::Service::NSProvider *provider, OIC::Service::NSResponse response) { - LOGD ("ConsumerService_onSubscriptionAccepted -IN"); + LOGD ("ConsumerService_onProviderChanged -IN"); jint envRet; JNIEnv *env = GetJNIEnv(&envRet); @@ -616,7 +711,7 @@ void onProviderChanged(OIC::Service::NSProvider *provider, OIC::Service::NSRespo env->DeleteLocalRef(jAcceptListener); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - LOGD ("ConsumerService_onSubscriptionAccepted -OUT"); + LOGD ("ConsumerService_onProviderChanged -OUT"); return ; } @@ -692,25 +787,39 @@ void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync) jlong jMessageId = (jlong) sync->getMessageId(); jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str()); - jint jState = (jint) sync->getState(); - - jclass cls_sync = (jclass) (env->NewLocalRef(g_cls_SyncInfo)); - if (!cls_sync) + jobject syncType = getJavaSyncType(env, sync->getState()); + if (!syncType) + { + LOGE ("Failed to Get syncType for SyncInfo"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + jclass cls_SyncInfo = (jclass) (env->NewLocalRef(g_cls_SyncInfo)); + if (!cls_SyncInfo) { LOGE ("Failed to Get ObjectClass for SyncInfo"); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); return ; } - jmethodID mid_sync = env->GetMethodID( - cls_sync, "", "(JLjava/lang/String;I)V"); - if (!mid_sync) + jmethodID mid_syncInfo = env->GetMethodID( + cls_SyncInfo, + "", + "(JLjava/lang/String;Lorg/iotivity/service/ns/common/SyncInfo$SyncType;)V"); + if (!mid_syncInfo) { - LOGE ("Failed to Get MethodID for SyncInfo"); + LOGE ("Failed to Get MethodID for SyncInfo"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + + jobject obj_syncInfo = env->NewObject( cls_SyncInfo, mid_syncInfo, + jMessageId, jProviderId, syncType); + if (!obj_syncInfo) + { + LOGE ("Failed to Get Object for SyncInfo"); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); return ; } - jobject obj_sync = env->NewObject(cls_sync, mid_sync, - jMessageId, jProviderId, jState); jclass cls = env->GetObjectClass(jSyncListener); if (!cls) @@ -730,10 +839,10 @@ void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync) return ; } - env->CallVoidMethod(jSyncListener, mid, obj_sync); + env->CallVoidMethod(jSyncListener, mid, obj_syncInfo); env->DeleteLocalRef(jSyncListener); - env->DeleteLocalRef(cls_sync); + env->DeleteLocalRef(cls_SyncInfo); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); LOGD ("ConsumerService_onSyncInfoReceived - OUT"); return ; @@ -828,6 +937,7 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_ } const char *providerId = env->GetStringUTFChars(jProviderId, 0); + LOGD ("java_ProviderId : %s\n", providerId); OIC::Service::NSProvider *provider = OIC::Service::NSConsumerService::getInstance()->getProvider(std::string(providerId)); @@ -836,8 +946,7 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_ ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist"); return NULL; } - - LOGD ("ProviderId : %s\n", provider->getProviderId().c_str()); + LOGD ("native_ProviderId : %s\n", provider->getProviderId().c_str()); jProviderId = env->NewStringUTF(provider->getProviderId().c_str()); jlong pProvider = (long)provider; @@ -846,6 +955,7 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_ if (!cls_provider) { LOGE ("Failed to Get ObjectClass for Provider"); + ThrowNSException(NS_ERROR, "Couldn't find objectClass for Provider"); return NULL; } jmethodID mid_provider = env->GetMethodID( @@ -853,6 +963,7 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_ if (!mid_provider) { LOGE ("Failed to Get MethodID for Provider"); + ThrowNSException(NS_ERROR, "Couldn't find MethodID for Provider"); return NULL; } jobject obj_provider = env->NewObject(cls_provider, mid_provider, @@ -1055,8 +1166,6 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSetL { env->DeleteGlobalRef(g_obj_syncListener); } - g_obj_syncListener = NULL; - g_obj_acceptListener = NULL; g_obj_postListener = (jobject) env->NewGlobalRef(jPostListener); g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener); @@ -1080,8 +1189,6 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSetL { env->DeleteGlobalRef(g_obj_syncListener); } - g_obj_syncListener = NULL; - g_obj_acceptListener = NULL; g_obj_postListener = (jobject) env->NewGlobalRef(jPostListener); g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener); @@ -1202,6 +1309,20 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) return JNI_ERR; } + jclass localSyncType = env->FindClass( + "org/iotivity/service/ns/common/SyncInfo$SyncType"); + if (!localSyncType) + { + LOGE("Failed to get local SyncType enum"); + return JNI_ERR; + } + g_cls_SyncType = (jclass) (env->NewGlobalRef(localSyncType)); + if (!g_cls_SyncType) + { + LOGE("Failed to set Global SyncType reference"); + return JNI_ERR; + } + jclass localMediaContents = env->FindClass( "org/iotivity/service/ns/common/MediaContents"); if (!localMediaContents) @@ -1287,6 +1408,7 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) env->DeleteLocalRef(localMessage); env->DeleteLocalRef(localProvider); env->DeleteLocalRef(localSyncInfo); + env->DeleteLocalRef(localSyncType); env->DeleteLocalRef(localMediaContents); env->DeleteLocalRef(localTopicState); env->DeleteLocalRef(localMessageType); @@ -1311,6 +1433,7 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved) env->DeleteGlobalRef(g_cls_Message); env->DeleteGlobalRef(g_cls_Provider); env->DeleteGlobalRef(g_cls_SyncInfo); + env->DeleteGlobalRef(g_cls_SyncType); env->DeleteGlobalRef(g_cls_MediaContents); env->DeleteGlobalRef(g_cls_TopicState); env->DeleteGlobalRef(g_cls_Message_Type); diff --git a/service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.cpp b/service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.cpp index 80c02a0..f8ee789 100644 --- a/service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.cpp +++ b/service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.cpp @@ -183,6 +183,25 @@ OIC::Service::NSMessage *getNativeMessage(JNIEnv *env, jobject jMsg) } LOGD("Message Source: %s\n", messageSource); + // Message Topic + jfieldID fid_topic = env->GetFieldID( cls, "mTopic", "Ljava/lang/String;"); + if (fid_topic == NULL) + { + LOGE("Error: jfieldID for topic is null"); + return nullptr; + } + jstring jtopic = (jstring)env->GetObjectField( jMsg, fid_topic); + const char *topic = ""; + if (jtopic) + { + topic = env->GetStringUTFChars( jtopic, NULL); + } + else + { + LOGD("Info: topic is null"); + } + LOGD("Topic : %s\n", topic); + // Message MediaContents jfieldID fid_media = env->GetFieldID( cls, "mMediaContents", "Lorg/iotivity/service/ns/common/MediaContents;"); @@ -232,6 +251,7 @@ OIC::Service::NSMessage *getNativeMessage(JNIEnv *env, jobject jMsg) nsMsg->setContentText(std::string(messageBody)); nsMsg->setSourceName(std::string(messageSource)); nsMsg->setMediaContents(media); + nsMsg->setTopic(std::string(topic)); env->DeleteLocalRef(cls_messageType); env->DeleteLocalRef(cls_MediaContents); @@ -252,6 +272,10 @@ OIC::Service::NSMessage *getNativeMessage(JNIEnv *env, jobject jMsg) { env->ReleaseStringUTFChars(jmsgSource, messageSource); } + if (jtopic) + { + env->ReleaseStringUTFChars(jtopic, topic); + } if (jiconImage) { env->ReleaseStringUTFChars(jiconImage, iconImage); @@ -262,16 +286,16 @@ OIC::Service::NSMessage *getNativeMessage(JNIEnv *env, jobject jMsg) } -jobject getJavaState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState) +jobject getJavaTopicState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState) { - LOGD("JNIProviderService: getJavaState - IN"); + LOGD("JNIProviderService: getJavaTopicState - IN"); // TopicState jclass cls_topicState = (jclass) (env->NewLocalRef(g_cls_TopicState)); if (!cls_topicState) { LOGE ("Failed to Get ObjectClass for TopicState Type"); - return nullptr; + return NULL; } jobject obj_topicState; @@ -294,10 +318,9 @@ jobject getJavaState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState) if (obj_topicState == NULL) { LOGE("Error: object of field TopicState is null"); - return NULL; } env->DeleteLocalRef(cls_topicState); - LOGD("JNIProviderService: getJavaState - OUT"); + LOGD("JNIProviderService: getJavaTopicState - OUT"); return obj_topicState; } @@ -317,11 +340,21 @@ jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList) return NULL; } jobject obj_topicList = env->NewObject(cls_topicList, mid_topicList); - jmethodID mid_addTopic = - env->GetMethodID(cls_topicList, "addTopic", "(Lorg/iotivity/service/ns/common/Topic;)V"); + if (!obj_topicList) + { + LOGE ("Failed to Get object for TopicsList"); + return NULL; + } + jmethodID mid_addTopic = env->GetMethodID(cls_topicList, "addTopic", + "(Ljava/lang/String;Lorg/iotivity/service/ns/common/Topic$TopicState;)V"); + if (!mid_addTopic) + { + LOGE ("Failed to Get MethodID for addTopic"); + return NULL; + } for (auto it : topicList->getTopicsList()) { - jobject jState = getJavaState(env, it->getState()); + jobject jState = getJavaTopicState(env, it->getState()); std::string topicName = it->getTopicName(); jstring jTopicName = env->NewStringUTF(topicName.c_str()); env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState); @@ -331,6 +364,52 @@ jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList) return obj_topicList; } +jobject getJavaSyncType(JNIEnv *env, OIC::Service::NSSyncInfo::NSSyncType nsType) +{ + LOGD ("JNIProviderService: getJavaSyncType - IN"); + + // SyncType + jclass cls_SyncType = (jclass) (env->NewLocalRef(g_cls_SyncType)); + if (!cls_SyncType) + { + LOGE ("Failed to Get ObjectClass for SyncType"); + return NULL; + } + jobject syncType; + switch (nsType) + { + case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_UNREAD: + { + static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, + "UNREAD", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); + syncType = env->GetStaticObjectField(cls_SyncType, fieldID); + } + case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ : + { + static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, + "READ", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); + syncType = env->GetStaticObjectField(cls_SyncType, fieldID); + } + case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED : + { + static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, + "DELETED", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); + syncType = env->GetStaticObjectField(cls_SyncType, fieldID); + } + + } + + if (syncType == NULL) + { + LOGE("Error: object of field Synctype is null"); + } + + env->DeleteLocalRef(cls_SyncType); + LOGD ("JNIProviderService: getJavaSyncType - OUT"); + return syncType; +} + + void onSubscribeListenerCb(OIC::Service::NSConsumer *consumer) { LOGD("JNIProviderService_onSubscribeListenerCb - IN"); @@ -362,7 +441,7 @@ void onSubscribeListenerCb(OIC::Service::NSConsumer *consumer) jmethodID mid_consumer = env->GetMethodID( cls_consumer, "", - "(JLjava/lang/String;Lorg/iotivity/service/ns/provider/Consumer)V"); + "(Ljava/lang/String;)V"); if (!mid_consumer) { LOGE ("Failed to Get MethodID for Consumer"); @@ -418,38 +497,13 @@ void onSyncInfoListenerCb(OIC::Service::NSSyncInfo *sync) jlong jMessageId = (long) sync->getMessageId(); jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str()); - jobject syncType; - - jclass cls_SyncType = (jclass) (env->NewLocalRef(g_cls_SyncType)); - if (!cls_SyncType) + jobject syncType = getJavaSyncType(env, sync->getState()); + if (!syncType) { - LOGE ("Failed to Get ObjectClass for SyncType"); + LOGE ("Failed to Get syncType for SyncInfo"); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); return ; } - switch (sync->getState()) - { - case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_UNREAD: - { - static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, - "UNREAD", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); - syncType = env->GetStaticObjectField(cls_SyncType, fieldID); - } - case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ : - { - static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, - "READ", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); - syncType = env->GetStaticObjectField(cls_SyncType, fieldID); - } - case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED : - { - static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, - "DELETED", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); - syncType = env->GetStaticObjectField(cls_SyncType, fieldID); - } - - } - jclass cls_SyncInfo = (jclass) (env->NewLocalRef(g_cls_SyncInfo)); if (!cls_SyncInfo) { @@ -460,7 +514,7 @@ void onSyncInfoListenerCb(OIC::Service::NSSyncInfo *sync) jmethodID mid_syncInfo = env->GetMethodID( cls_SyncInfo, "", - "(JLjava/lang/String;Lorg/iotivity/service/ns/common/SyncInfo$SyncType)V"); + "(JLjava/lang/String;Lorg/iotivity/service/ns/common/SyncInfo$SyncType;)V"); if (!mid_syncInfo) { LOGE ("Failed to Get MethodID for SyncInfo"); @@ -468,8 +522,14 @@ void onSyncInfoListenerCb(OIC::Service::NSSyncInfo *sync) return ; } - jobject obj_syncInfo = env->NewObject( cls_SyncInfo, mid_syncInfo, jMessageId, jProviderId, - syncType); + jobject obj_syncInfo = env->NewObject( cls_SyncInfo, mid_syncInfo, + jMessageId, jProviderId, syncType); + if (!obj_syncInfo) + { + LOGE ("Failed to Get Object for SyncInfo"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } jclass cls = env->GetObjectClass( jSyncListener); if (!cls) @@ -478,8 +538,10 @@ void onSyncInfoListenerCb(OIC::Service::NSSyncInfo *sync) if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); return; } - jmethodID mid = env->GetMethodID( cls, "onMessageSynchronized", - "(Lorg/iotivity/service/ns/common/SyncInfo)V"); + jmethodID mid = env->GetMethodID( + cls, + "onSyncInfoReceived", + "(Lorg/iotivity/service/ns/common/SyncInfo;)V"); if (!mid) { LOGE("Failed to Get MethodID"); @@ -490,7 +552,6 @@ void onSyncInfoListenerCb(OIC::Service::NSSyncInfo *sync) env->DeleteLocalRef(jSyncListener); env->DeleteLocalRef(cls_SyncInfo); - env->DeleteLocalRef(cls_SyncType); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); LOGD("JNIProviderService: OnSyncInfoListenerCb - OUT"); @@ -734,7 +795,7 @@ JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeAcce if (!jconId) { ThrowNSException(NS_ERROR, "ProviderId cannot be null"); - return (jint) OIC::Service::NSResult::ERROR;; + return (jint) OIC::Service::NSResult::ERROR; } const char *conId = env->GetStringUTFChars( jconId, NULL); std::string consumerId(conId); @@ -744,18 +805,12 @@ JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeAcce OIC::Service::NSConsumer *consumer = OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId); - int result = consumer->acceptSubscription(consumer, (bool)jAccepted); - if (jAccepted) - { - LOGD("Subscription Accepted"); - } - else - { - LOGD("Subscription Denied"); - } + if (consumer) + return (jint) consumer->acceptSubscription(consumer, (bool)jAccepted); + LOGE("Couldn't find consumer"); LOGD("JNIProviderService: nativeAcceptSubscription - OUT"); - return result; + return (jint) OIC::Service::NSResult::ERROR; } JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeSelectTopic (JNIEnv *env, jobject jObj, jstring jConsumerId, jstring jTopicName) @@ -838,6 +893,7 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeG ThrowNSException(NS_ERROR, "Consumer does exists"); return NULL; } + env->ReleaseStringUTFChars(jConsumerId, id); OIC::Service::NSTopicsList *topicList = nsConsumer->getConsumerTopics(); if (topicList == nullptr) { @@ -845,8 +901,6 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeG return NULL; } jobject obj_topicList = getJavaTopicsList(env, topicList); - - env->ReleaseStringUTFChars(jConsumerId, id); LOGD("JNIProviderService: nativeGetConsumerTopics - OUT"); return obj_topicList; } diff --git a/service/notification/cpp-wrapper/common/NSMessage.cpp b/service/notification/cpp-wrapper/common/NSMessage.cpp index 8556295..a8aae6e 100755 --- a/service/notification/cpp-wrapper/common/NSMessage.cpp +++ b/service/notification/cpp-wrapper/common/NSMessage.cpp @@ -37,7 +37,7 @@ namespace OIC if (msg != nullptr) { m_messageId = msg->messageId; - m_providerId.assign(msg->providerId, NS_UTILS_UUID_STRING_SIZE); + m_providerId = msg->providerId; m_type = (NSMessageType)msg->type; diff --git a/service/notification/cpp-wrapper/common/NSSyncInfo.cpp b/service/notification/cpp-wrapper/common/NSSyncInfo.cpp index c5f173c..5b9ab58 100755 --- a/service/notification/cpp-wrapper/common/NSSyncInfo.cpp +++ b/service/notification/cpp-wrapper/common/NSSyncInfo.cpp @@ -33,7 +33,7 @@ namespace OIC if (syncInfo != nullptr) { m_messageId = syncInfo->messageId; - m_providerId.assign(syncInfo->providerId, NS_UTILS_UUID_STRING_SIZE); + m_providerId = syncInfo->providerId; m_state = (NSSyncType) syncInfo->state; } } diff --git a/service/notification/cpp-wrapper/consumer/src/NSProvider.cpp b/service/notification/cpp-wrapper/consumer/src/NSProvider.cpp index c65e552..ce90f51 100755 --- a/service/notification/cpp-wrapper/consumer/src/NSProvider.cpp +++ b/service/notification/cpp-wrapper/consumer/src/NSProvider.cpp @@ -63,7 +63,7 @@ namespace OIC m_syncInfoCb = NULL; if (provider != nullptr) { - m_providerId.assign(provider->providerId, NS_UTILS_UUID_STRING_SIZE); + m_providerId = provider->providerId; if (provider->topicLL != nullptr) m_topicList = new NSTopicsList(provider->topicLL); else diff --git a/service/notification/cpp-wrapper/provider/src/NSConsumer.cpp b/service/notification/cpp-wrapper/provider/src/NSConsumer.cpp index 7c99f3d..58a0fae 100755 --- a/service/notification/cpp-wrapper/provider/src/NSConsumer.cpp +++ b/service/notification/cpp-wrapper/provider/src/NSConsumer.cpp @@ -40,7 +40,7 @@ namespace OIC { if (consumer != nullptr) { - m_consumerId.assign(consumer->consumerId, NS_UTILS_UUID_STRING_SIZE); + m_consumerId = consumer->consumerId; } } -- 2.7.4