}
/**
+ * API for for requesting unsubscription of Notification service
+ * @throws NSException failure to subscribe
+ */
+ public void unsubscribe() throws NSException {
+ nativeUnsubscribe();
+ }
+
+ /**
* API for for requesting subscription status from Provider of Notification
* service
*
}
private native void nativeSubscribe() throws NSException;
+ private native void nativeUnsubscribe() throws NSException;
private native void nativeSendSyncInfo(long messageId, int syncType)
throws NSException;
return;\r
}\r
\r
+JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUnsubscribe\r
+(JNIEnv *env, jobject jObj)\r
+{\r
+ LOGD ("Provider_UnSubscribe -IN");\r
+ jclass providerClass = env->GetObjectClass(jObj);\r
+ if (!providerClass)\r
+ {\r
+ ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
+ return ;\r
+ }\r
+\r
+ jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
+ if (!nativeHandle)\r
+ {\r
+ ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
+ return ;\r
+ }\r
+ jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
+ if (jProvider)\r
+ {\r
+ LOGD ("calling subscribe on mNativeHandle");\r
+ OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
+ provider->unsubscribe();\r
+ }\r
+ else\r
+ {\r
+ OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
+ if (provider == nullptr)\r
+ {\r
+ ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
+ return;\r
+ }\r
+ LOGD ("calling subscribe on ProviderID");\r
+ provider->unsubscribe();\r
+ }\r
+ LOGD ("Provider_UnSubscribe -OUT");\r
+ return;\r
+}\r
+\r
JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSendSyncInfo\r
(JNIEnv *env, jobject jObj, jlong jMessageId, jint jSyncType)\r
{\r
JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSubscribe\r
(JNIEnv *, jobject);\r
\r
+\r
+/*\r
+ * Class: org_iotivity_service_ns_consumer_Provider\r
+ * Method: nativeUnsubscribe\r
+ * Signature: ()V\r
+ */\r
+JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUnsubscribe\r
+(JNIEnv *, jobject);\r
+\r
/*\r
* Class: org_iotivity_service_ns_consumer_Provider\r
* Method: nativeSendSyncInfo\r
/**\r
* Initialize notification service for consumer\r
* @param providerDiscovered Callback function pointers to ProviderDiscoveredCallback,\r
+ * @return ::NS_OK or result code of NSResult\r
*/\r
- void start(ProviderDiscoveredCallback providerDiscovered);\r
+ NSResult start(ProviderDiscoveredCallback providerDiscovered);\r
\r
/**\r
* Terminate notification service for consumer\r
+ * @return ::NS_OK or result code of NSResult\r
*/\r
- void stop();\r
+ NSResult stop();\r
\r
/**\r
* Request to discover to remote address as parameter.\r
\r
/**\r
* Request discovery manually\r
+ * @return ::NS_OK or result code of NSResult\r
*/\r
- void rescanProvider();\r
+ NSResult rescanProvider();\r
\r
/**\r
* get the callback for ProviderDiscovered\r
\r
/**\r
* This method is for requesting subscription of Notification service.\r
- *\r
+ * @return ::NS_OK or result code of NSResult\r
*/\r
- void subscribe();\r
+ NSResult subscribe();\r
+\r
+ /**\r
+ * Request to unsubscribe in order not to receive notification message from provider\r
+ * @return ::NS_OK or result code of NSResult\r
+ */\r
+ NSResult unsubscribe();\r
\r
/**\r
* This method is for requesting subscription status from Provider of Notification service.\r
*\r
* @param messageId - id of type message.\r
* @param type - NSSyncType of Notification service.\r
+ * @return ::NS_OK or result code of NSResult\r
*/\r
- void sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type);\r
+ NSResult sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type);\r
\r
/**\r
* This method is for registering for listeners of Notification .\r
NS_LOG(DEBUG, "initiating the callback for Response : NS_STOPPED");\r
changeCallback((NSProviderState)state);\r
}\r
+ delete oldProvider;\r
}\r
}\r
NS_LOG(DEBUG, "onNSProviderStateChanged - OUT");\r
NSConsumerService::getInstance()->getAcceptedProviders().size());\r
for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
{\r
+ NS_LOG_V(DEBUG, "it->getProviderId : %s", it->getProviderId().c_str());\r
if (it->getProviderId() == nsMessage->getProviderId())\r
{\r
NS_LOG(DEBUG, "Found Provider with given ID");\r
void onNSSyncInfoReceived(::NSSyncInfo *syncInfo)\r
{\r
NS_LOG(DEBUG, "onNSSyncInfoReceived - IN");\r
+ NS_LOG_V(DEBUG, "syncInfo->providerId : %s", syncInfo->providerId);\r
+\r
NSSyncInfo *nsSyncInfo = new NSSyncInfo(syncInfo);\r
+\r
for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
{\r
+ NS_LOG_V(DEBUG, "it->getProviderId : %s", it->getProviderId().c_str());\r
if (it->getProviderId() == nsSyncInfo->getProviderId())\r
{\r
NS_LOG(DEBUG, "Found Provider with given ID");\r
return &s_instance;\r
}\r
\r
- void NSConsumerService::start(NSConsumerService::ProviderDiscoveredCallback providerDiscovered)\r
+ NSResult NSConsumerService::start(NSConsumerService::ProviderDiscoveredCallback providerDiscovered)\r
{\r
NS_LOG(DEBUG, "start - IN");\r
+ for (auto it : getAcceptedProviders())\r
+ {\r
+ delete it;\r
+ }\r
+ getAcceptedProviders().clear();\r
+\r
m_providerDiscoveredCb = providerDiscovered;\r
NSConsumerConfig nsConfig;\r
nsConfig.changedCb = onProviderStateReceived;\r
nsConfig.messageCb = onNSMessageReceived;\r
nsConfig.syncInfoCb = onNSSyncInfoReceived;\r
\r
- NSStartConsumer(nsConfig);\r
+ NSResult result = (NSResult) NSStartConsumer(nsConfig);\r
NS_LOG(DEBUG, "start - OUT");\r
- return;\r
+ return result;\r
}\r
\r
- void NSConsumerService::stop()\r
+ NSResult NSConsumerService::stop()\r
{\r
NS_LOG(DEBUG, "stop - IN");\r
- NSStopConsumer();\r
+ m_providerDiscoveredCb = NULL;\r
for (auto it : getAcceptedProviders())\r
{\r
delete it;\r
}\r
getAcceptedProviders().clear();\r
+\r
+ NSResult result = (NSResult) NSStopConsumer();\r
NS_LOG(DEBUG, "stop - OUT");\r
- return;\r
+ return result;\r
}\r
\r
NSResult NSConsumerService::enableRemoteService(const std::string &serverAddress)\r
return result;\r
}\r
\r
- void NSConsumerService::rescanProvider()\r
+ NSResult NSConsumerService::rescanProvider()\r
{\r
NS_LOG(DEBUG, "rescanProvider - IN");\r
- NSRescanProvider();\r
+ NSResult result = (NSResult) NSRescanProvider();\r
NS_LOG(DEBUG, "rescanProvider - OUT");\r
- return;\r
+ return result;\r
}\r
\r
NSConsumerService::ProviderDiscoveredCallback NSConsumerService::getProviderDiscoveredCb()\r
\r
NSProvider *NSConsumerService::getProvider(const std::string &id)\r
{\r
+ NS_LOG_V(DEBUG, "getAcceptedProviders size : %d", (int) getAcceptedProviders().size());\r
for (auto it : getAcceptedProviders())\r
{\r
+ NS_LOG_V(DEBUG, "getProvider stored providerId : %s", it->getProviderId().c_str());\r
+ NS_LOG_V(DEBUG, "getProvider requesting providerId : %s", id.c_str());\r
if (it->getProviderId() == id)\r
{\r
NS_LOG(DEBUG, "getProvider : Found Provider with given ID");\r
return m_subscribedState;\r
}\r
\r
- void NSProvider::subscribe()\r
+ NSResult NSProvider::subscribe()\r
{\r
NS_LOG(DEBUG, "Subscribe - IN");\r
- NSSubscribe(getProviderId().c_str());\r
+ NSResult result = (NSResult) NSSubscribe(getProviderId().c_str());\r
NS_LOG(DEBUG, "Subscribe - OUT");\r
+ return result;\r
+ }\r
+\r
+ NSResult NSProvider::unsubscribe()\r
+ {\r
+ NS_LOG(DEBUG, "unsubscribe - IN");\r
+ NSResult result = (NSResult) NSUnsubscribe(getProviderId().c_str());\r
+ NS_LOG(DEBUG, "unsubscribe - OUT");\r
+ return result;\r
}\r
\r
bool NSProvider::isSubscribed()\r
return false;\r
}\r
\r
- void NSProvider::sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type)\r
+ NSResult NSProvider::sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type)\r
{\r
NS_LOG(DEBUG, "SendSyncInfo - IN");\r
- NSConsumerSendSyncInfo(m_providerId.c_str(), messageId, (::NSSyncType)type);\r
+ NSResult result = (NSResult) NSConsumerSendSyncInfo(m_providerId.c_str(), messageId,\r
+ (::NSSyncType)type);\r
NS_LOG(DEBUG, "SendSyncInfo - OUT");\r
- return;\r
+ return result;\r
}\r
\r
void NSProvider::setListener(NSProvider::ProviderStateCallback stateHandle,\r
std::cout << "3. SendSyncInfo" << std::endl;\r
std::cout << "4. GetTopicList" << std::endl;\r
std::cout << "5. UpdateTopicList" << std::endl;\r
+ std::cout << "6. Subscribe provider" << std::endl;\r
+ std::cout << "7. UnSubscribe provider" << std::endl;\r
+ std::cout << "8. Rescan provider" << std::endl;\r
#ifdef WITH_CLOUD\r
- std::cout << "6. Enable NS Consumer RemoteService" << std::endl;\r
+ std::cout << "9. Enable NS Consumer RemoteService" << std::endl;\r
#endif\r
- std::cout << "7. Exit" << std::endl;\r
+ std::cout << "10. Exit" << std::endl;\r
\r
std::cout << "Input: " << std::endl;\r
std::cin >> num;\r
provider->sendSyncInfo(mainMessageId,\r
OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
}\r
+ break;\r
}\r
- break;\r
case 2:\r
{\r
std::cout << "Sending Delete Sync" << std::endl;\r
provider->sendSyncInfo(mainMessageId,\r
OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED);\r
}\r
+ break;\r
}\r
- break;\r
default:\r
{\r
cout << "Invalid Input!. sending default Read Sync";\r
}\r
}\r
}\r
+ break;\r
}\r
- break;\r
case 5:\r
{\r
std::cout << "UpdateTopicList" << std::endl;\r
delete topicList;\r
delete provider;\r
}\r
+ break;\r
}\r
- break;\r
-#ifdef WITH_CLOUD\r
case 6:\r
{\r
+ std::cout << "Subscribe provider" << std::endl;\r
+ if (!mainProvider.empty())\r
+ {\r
+ OIC::Service::NSProvider *provider =\r
+ NSConsumerService::getInstance()->getProvider(mainProvider);\r
+ if (provider != nullptr )\r
+ {\r
+ std::cout << "calling Subscribe on discovered mainProvider" << std::endl;\r
+ if (!provider->isSubscribed())\r
+ {\r
+ std::cout << "start Subscribing" << std::endl;\r
+ provider->subscribe();\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ case 7:\r
+ {\r
+ std::cout << "UnSubscribe provider" << std::endl;\r
+ if (!mainProvider.empty())\r
+ {\r
+ OIC::Service::NSProvider *provider =\r
+ NSConsumerService::getInstance()->getProvider(mainProvider);\r
+ if (provider != nullptr )\r
+ {\r
+ std::cout << "calling UnSubscribe on discovered mainProvider" << std::endl;\r
+ if (provider->isSubscribed())\r
+ {\r
+ std::cout << "start UnSubscribing" << std::endl;\r
+ provider->unsubscribe();\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ case 8:\r
+ {\r
+ std::cout << "Rescan Provider" << std::endl;\r
+ NSConsumerService::getInstance()->rescanProvider();\r
+ break;\r
+ }\r
+\r
+#ifdef WITH_CLOUD\r
+ case 9:\r
+ {\r
std::cout << "Enable NS Consumer RemoteService" << std::endl;\r
std::cout << "Input the Server Address :";\r
std::cin >> REMOTE_SERVER_ADDRESS;\r
break;\r
}\r
#endif\r
- case 7:\r
+ case 10:\r
{\r
std::cout << "Exit" << std::endl;\r
NSConsumerService::getInstance()->stop();\r
std::cout << "Sending Read Sync" << std::endl;\r
NSProviderService::getInstance()->sendSyncInfo(mainMessageId,\r
OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
+ break;\r
}\r
- break;\r
case 2:\r
{\r
std::cout << "Sending Delete Sync" << std::endl;\r
NSProviderService::getInstance()->sendSyncInfo(mainMessageId,\r
OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED);\r
+ break;\r
}\r
- break;\r
default:\r
{\r
cout << "Invalid Input!. sending default Read Sync";\r
}\r
std::cout << "GetConsumerTopicList completed" << std::endl;\r
}\r
+ break;\r
}\r
- break;\r
\r
case 12:\r
{\r
std::cout << (int) it->getState() << std::endl;\r
}\r
delete nsTopics;\r
+ break;\r
}\r
- break;\r
#ifdef WITH_CLOUD\r
case 13:\r
{\r
* This method is for setting icon image for the Notification service media contents.\r
* This function is valid only when subControllability is set true.\r
* @param accepted - as bool.\r
+ * @return :: OK or result code of NSResult\r
*/\r
- int acceptSubscription(bool accepted);\r
+ NSResult acceptSubscription(bool accepted);\r
\r
/**\r
* Select a topic name for a consumer\r
* Send read-check to provider in order to synchronize notification status with other consumers\r
* @param[in] messageId ID of Notification message to synchronize the status\r
* @param[in] type NotificationSyncType of the SyncInfo message\r
+ * @return :: OK or result code of NSResult\r
*/\r
- void sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type);\r
+ NSResult sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type);\r
\r
/**\r
* Initialize NSMessage class, This function is valid only when subControllability is set true.\r
return m_consumerId;\r
}\r
\r
- int NSConsumer::acceptSubscription(bool accepted)\r
+ NSResult NSConsumer::acceptSubscription(bool accepted)\r
{\r
NS_LOG(DEBUG, "acceptSubscription - IN");\r
NSResult result = (NSResult) NSAcceptSubscription(getConsumerId().c_str(), accepted);\r
NS_LOG(DEBUG, "acceptSubscription - OUT");\r
- return (int) result;\r
+ return result;\r
}\r
\r
NSResult NSConsumer::setTopic(const std::string &topicName)\r
\r
NSProviderService::~NSProviderService()\r
{\r
+ m_config.m_subscribeRequestCb = NULL;\r
+ m_config.m_syncInfoCb = NULL;\r
for (auto it : getAcceptedConsumers())\r
{\r
delete it;\r
{\r
NS_LOG(DEBUG, "start - IN");\r
\r
+ for (auto it : getAcceptedConsumers())\r
+ {\r
+ delete it;\r
+ }\r
+ getAcceptedConsumers().clear();\r
+\r
m_config = config;\r
NSProviderConfig nsConfig;\r
nsConfig.subRequestCallback = onConsumerSubscribedCallback;\r
NSResult NSProviderService::stop()\r
{\r
NS_LOG(DEBUG, "stop - IN");\r
+\r
+ m_config.m_subscribeRequestCb = NULL;\r
+ m_config.m_syncInfoCb = NULL;\r
+ for (auto it : getAcceptedConsumers())\r
+ {\r
+ delete it;\r
+ }\r
+ getAcceptedConsumers().clear();\r
+\r
NSResult result = (NSResult) NSStopProvider();\r
NS_LOG(DEBUG, "stop - OUT");\r
return result;\r
return result;\r
}\r
\r
- void NSProviderService::sendSyncInfo(uint64_t messageId,\r
- NSSyncInfo::NSSyncType type)\r
+ NSResult NSProviderService::sendSyncInfo(uint64_t messageId,\r
+ NSSyncInfo::NSSyncType type)\r
{\r
NS_LOG(DEBUG, "sendSyncInfo - IN");\r
- NSProviderSendSyncInfo(messageId, (NSSyncType)type);\r
+ NSResult result = (NSResult) NSProviderSendSyncInfo(messageId, (NSSyncType)type);\r
NS_LOG(DEBUG, "sendSyncInfo - OUT");\r
- return;\r
+ return result;\r
}\r
\r
NSMessage *NSProviderService::createMessage()\r
\r
NSConsumer *NSProviderService::getConsumer(const std::string &id)\r
{\r
+ NS_LOG_V(DEBUG, "getAcceptedConsumers size : %d", (int) getAcceptedConsumers().size());\r
for (auto it : getAcceptedConsumers())\r
{\r
+ NS_LOG_V(DEBUG, "getConsumer stored consumerId : %s", it->getConsumerId().c_str());\r
+ NS_LOG_V(DEBUG, "getConsumer requesting consumerId : %s", id.c_str());\r
if (it->getConsumerId() == id)\r
{\r
NS_LOG(DEBUG, "getConsumer : Found Consumer with given ID");\r
e.printStackTrace();
}
}
+ public void unsubscribe() {
+ lockObject = new CountDownLatch(1);
+ response = new Response();
+ provCb.set(lockObject, response);
+ provCb.setState(Provider.ProviderState.STOPPED);
+ Provider mProvider = disCb.getProvider();
+ setListener(mProvider);
+ try {
+ if (mProvider.isSubscribed()) {
+ Log.i(TAG, "subscribed");
+ mProvider.unsubscribe();
+ }
+ lockObject.await(4000, TimeUnit.MILLISECONDS);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
public long sendMessage() {
lockObject = new CountDownLatch(1);
} catch (Exception e) {
e.printStackTrace();
}
+ assertEquals(true, response.get());
}
@Test
subscribe(state);
assertEquals(true, response.get());
}
+ @Test
+ public void ExpectUnSubscribeSuccess() {
+ startAfter(false);
+ assertEquals(true, response.get());
+ Provider.ProviderState state = Provider.ProviderState.ALLOW;
+ subscribe(state);
+ assertEquals(true, response.get());
+ unsubscribe();
+ assertEquals(true, response.get());
+ }
@Test
public void ExpectReceiveNotification() {
startAfter(false);
}
}
+ public void subscribe() {
+ try {
+ mProvider.subscribe();
+ Log.i(TAG, "Notification consumer subscribe: " );
+ } catch (Exception e) {
+ Log.e(TAG, "Exception: subscribe : " + e);
+ }
+ }
+
+ public void unsubscribe() {
+ try {
+ mProvider.unsubscribe();
+ Log.i(TAG, "Notification consumer unsubscribe: ");
+ } catch (Exception e) {
+ Log.e(TAG, "Exception: unsubscribe : " + e);
+ }
+ }
public void getTopicsList() {
if (mProvider != null) {
try {
private Button btnStart;
private Button btnStop;
private Button btnRescan;
+ private Button btnSubscribe;
+ private Button btnUnsubscribe;
private Button btnEnableRemoteService;
private Button btnGetTopicList;
private Button btnUpdateTopicList;
btnStart = (Button) findViewById(R.id.BtnStart);
btnStop = (Button) findViewById(R.id.BtnStop);
btnRescan = (Button) findViewById(R.id.BtnRescan);
+ btnSubscribe = (Button) findViewById(R.id.BtnSubscribe);
+ btnUnsubscribe = (Button) findViewById(R.id.BtnUnsubscribe);
btnEnableRemoteService = (Button) findViewById(
R.id.BtnEnableRemoteService);
btnGetTopicList = (Button) findViewById(R.id.BtnGetTopicList);
signOut.setEnabled(false);
btnEnableRemoteService.setEnabled(false);
+ btnSubscribe.setOnClickListener(mClickListener);
+ btnUnsubscribe.setOnClickListener(mClickListener);
signUp.setOnClickListener(mClickListener);
signIn.setOnClickListener(mClickListener);
signOut.setOnClickListener(mClickListener);
mConsumerSample.rescanProvider();
}
break;
+ case R.id.BtnSubscribe: {
+ if (!isStarted) {
+ Log.e(TAG,
+ "Fail to Subscribe. Service has not been started");
+ showToast("Error : Service has not been started");
+ break;
+ }
+ TvLog.append("Subscribe NS-Consumer\n");
+ mConsumerSample.subscribe();
+ }
+ break;
+ case R.id.BtnUnsubscribe: {
+ if (!isStarted) {
+ Log.e(TAG,
+ "Fail to Unsubscribe. Service has not been started");
+ showToast("Error : Service has not been started");
+ break;
+ }
+ TvLog.append("Unsubscribe NS-Consumer\n");
+ mConsumerSample.unsubscribe();
+ }
+ break;
case R.id.BtnEnableRemoteService: {
if (!isStarted) {
Log.e(TAG,
\r
<Button\r
android:layout_height="wrap_content"\r
+ android:layout_width="150dp"\r
+ android:id="@+id/BtnSubscribe"\r
+ android:text="Subscribe"/>\r
+ <Button\r
+ android:layout_height="wrap_content"\r
+ android:layout_width="150dp"\r
+ android:id="@+id/BtnUnsubscribe"\r
+ android:text="Unsubscribe" />\r
+ </LinearLayout>\r
+ <LinearLayout\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:paddingLeft="5dp"\r
+ android:paddingRight="5dp"\r
+ android:orientation="horizontal"\r
+ android:weightSum="1">\r
+\r
+ <Button\r
+ android:layout_height="wrap_content"\r
android:layout_width="100dp"\r
android:id="@+id/signup"\r
android:text="Sign Up"/>\r