[iotcon] fix some API implementation bug 49/99549/1
authorjk.pu <jk.pu@samsung.com>
Wed, 23 Nov 2016 08:29:47 +0000 (17:29 +0900)
committerjk.pu <jk.pu@samsung.com>
Wed, 23 Nov 2016 08:35:40 +0000 (17:35 +0900)
1. TimeoutError is not invoked at findResource/DeviceInfo/PlatformInfo and get/put/post/delete
2. FindDeviceInfo/FindPlatformInfo successCallback is only called once.

Change-Id: Ib840ff4b9b10980422724280ab5c699d0331e7b0
Signed-off-by: jk.pu <jk.pu@samsung.com>
src/iotcon/iotcon_api.js
src/iotcon/iotcon_instance.cc
src/iotcon/iotcon_instance.h

index 1afe4a0ae1c4a0d6a39fb4ef45ad1207d70c9f09..e33a562cea238f87ff5fbece5ddad96fdad39225 100644 (file)
@@ -1115,6 +1115,8 @@ Client.prototype.removePresenceEventListener = function() {
   }
 };
 
+var findDeviceInfoListener = createListener('FindDeviceInfoListener');
+var globalFindDeviceInfoId = 0;
 Client.prototype.findDeviceInfo = function() {
   var args = validator.validateMethod(arguments, [{
     name: 'hostAddress',
@@ -1139,7 +1141,7 @@ Client.prototype.findDeviceInfo = function() {
   }]);
 
   var callArgs = {};
-
+  callArgs.id = ++globalFindDeviceInfoId;
   callArgs.hostAddress = args.hostAddress;
   callArgs.query = args.query;
   callArgs.connectivityType = args.connectivityType;
@@ -1152,13 +1154,17 @@ Client.prototype.findDeviceInfo = function() {
     }
   };
 
-  var result = native.call('IotconClient_findDeviceInfo', callArgs, callback);
+  var result = native.call('IotconClient_findDeviceInfo', callArgs);
 
   if (native.isFailure(result)) {
     throw native.getErrorObject(result);
+  }else{
+    findDeviceInfoListener.addListener(callArgs.id, callback);
   }
 };
 
+var findPlatformInfoListener = createListener('FindPlatformInfoListener');
+var globalFindPlatformInfoId = 0;
 Client.prototype.findPlatformInfo = function() {
   var args = validator.validateMethod(arguments, [{
     name: 'hostAddress',
@@ -1183,6 +1189,7 @@ Client.prototype.findPlatformInfo = function() {
   }]);
 
   var callArgs = {};
+  callArgs.id = ++globalFindPlatformInfoId;
   callArgs.hostAddress = args.hostAddress;
   callArgs.query = args.query;
   callArgs.connectivityType = args.connectivityType;
@@ -1195,10 +1202,12 @@ Client.prototype.findPlatformInfo = function() {
     }
   };
 
-  var result = native.call('IotconClient_findPlatformInfo', callArgs, callback);
+  var result = native.call('IotconClient_findPlatformInfo', callArgs);
 
   if (native.isFailure(result)) {
     throw native.getErrorObject(result);
+  }else{
+    findPlatformInfoListener.addListener(callArgs.id, callback);
   }
 };
 
index 73bdb1e4b5d4c7bc58badefa8cc381f22fb4aa83..d8d68d6046b97729d4047902c337aa28d68adc36 100644 (file)
@@ -39,6 +39,11 @@ struct CallbackData {
   common::PostCallback fun;
 };
 
+struct CallbackData2 {
+  common::PostCallback fun;
+  bool   callback_called;
+};
+
 long long GetId(const picojson::object& args) {
   return static_cast<long long>(args.find(kId)->second.get<double>());
 }
@@ -54,18 +59,18 @@ void RemoteResourceResponseCallback(iotcon_remote_resource_h resource,
 
   if (data) {
     picojson::value value{picojson::object{}};
-    auto result = IotconUtils::ConvertIotconError(err);
-
-    if (result) {
-      result = IotconUtils::ResponseToJson(response, &value.get<picojson::object>());
-      if (!result) {
-        LoggerE("ResponseToJson() failed");
+    common::TizenResult ret = common::TizenSuccess();
+
+    switch (err) {
+          case IOTCON_ERROR_NONE:
+            ret = IotconUtils::ResponseToJson(response, &value.get<picojson::object>());
+            break;
+          case IOTCON_ERROR_TIMEOUT:
+            LoggerD("IOTCON_TIMEOUT ");
+          default:
+            ret = IotconUtils::ConvertIotconError(err);
       }
-    } else {
-      LoggerE("RemoteResourceResponseCallback() reports error");
-    }
-
-    data->fun(result, value);
+      data->fun(ret, value);
   } else {
     LoggerE("Native callback data is null");
   }
@@ -74,6 +79,8 @@ void RemoteResourceResponseCallback(iotcon_remote_resource_h resource,
 const common::ListenerToken kGeneratedPinToken{"GeneratedPinListener"};
 const common::ListenerToken kResourceRequestListenerToken{"ResourceRequestListener"};
 const common::ListenerToken kFindResourceListenerToken{"FindResourceListener"};
+const common::ListenerToken kFindDeviceInfoListenerToken{"FindDeviceInfoListener"};
+const common::ListenerToken kFindPlatformInfoListenerToken{"FindPlatformInfoListener"};
 const common::ListenerToken kPresenceEventListenerToken{"PresenceEventListener"};
 const common::ListenerToken kRemoteResourceStateChangeListener
                                 {"RemoteResourceStateChangeListener"};
@@ -141,7 +148,8 @@ IotconInstance::IotconInstance() : initialized_(false), presence_started_(false)
   REGISTER_SYNC("IotconServer_stopPresence", ServerStopPresence);
   REGISTER_SYNC("Iotcon_setDeviceName", SetDeviceName);
   REGISTER_SYNC("IotconClient_findResource", ClientFindResource);
-
+  REGISTER_SYNC("IotconClient_findDeviceInfo", ClientFindDeviceInfo);
+  REGISTER_SYNC("IotconClient_findPlatformInfo", ClientFindPlatformInfo);
 #undef REGISTER_SYNC
 
 #define REGISTER_ASYNC(c, x) \
@@ -151,8 +159,6 @@ IotconInstance::IotconInstance() : initialized_(false), presence_started_(false)
   REGISTER_ASYNC("IotconRemoteResource_methodPut", RemoteResourceMethodPut);
   REGISTER_ASYNC("IotconRemoteResource_methodPost", RemoteResourceMethodPost);
   REGISTER_ASYNC("IotconRemoteResource_methodDelete", RemoteResourceMethodDelete);
-  REGISTER_ASYNC("IotconClient_findDeviceInfo", ClientFindDeviceInfo);
-  REGISTER_ASYNC("IotconClient_findPlatformInfo", ClientFindPlatformInfo);
 
 #undef REGISTER_ASYNC
 }
@@ -1156,7 +1162,7 @@ common::TizenResult IotconInstance::RemoteResourceSetTimeInterval(const picojson
 bool IotconInstance::ResourceFoundCallback(iotcon_remote_resource_h resource,
                                            iotcon_error_e result, void *user_data) {
   ScopeLogger();
-  CallbackData* data = static_cast<CallbackData*>(user_data);
+  CallbackData2* data = static_cast<CallbackData2*>(user_data);
   if (nullptr == data) {
     LoggerE("ResourceFoundCallback() failed.  Ignoring callback");
     return IOTCON_FUNC_STOP;
@@ -1166,6 +1172,11 @@ bool IotconInstance::ResourceFoundCallback(iotcon_remote_resource_h resource,
     case IOTCON_ERROR_NONE:
       break;
     case IOTCON_ERROR_TIMEOUT:
+      LoggerD("IOTCON_TIMEOUT data->callback_called :%d", data->callback_called);
+      if(!data->callback_called){
+          auto ret = IotconUtils::ConvertIotconError(result);
+          data->fun(ret, picojson::value{});
+      }
       delete data;
       return IOTCON_FUNC_STOP;
     default:
@@ -1181,6 +1192,7 @@ bool IotconInstance::ResourceFoundCallback(iotcon_remote_resource_h resource,
     data->fun(ret, picojson::value{});
     return IOTCON_FUNC_STOP;
   }
+  data->callback_called = true;
   data->fun(ret, json_result);
 
   return IOTCON_FUNC_CONTINUE;
@@ -1232,7 +1244,10 @@ common::TizenResult IotconInstance::ClientFindResource(const picojson::object& a
 
     Post(kFindResourceListenerToken, common::TizenSuccess{response});
   };
-  CallbackData* data = new CallbackData{response};
+
+  CallbackData2* data = new CallbackData2{};
+  data->fun = response;
+  data->callback_called = false;
 
   LoggerD("Running find with:\nhost_address: %s,\nconnectivity_type: %d",
           host_address, connectivity_type);
@@ -1315,7 +1330,7 @@ bool IotconDeviceInfoCb(iotcon_device_info_h device_info,
                           iotcon_error_e result, void *user_data) {
   ScopeLogger();
 
-  CallbackData* data = static_cast<CallbackData*>(user_data);
+  CallbackData2* data = static_cast<CallbackData2*>(user_data);
   if (nullptr == data) {
     LoggerE("IotconDeviceInfoCb() failed.  Ignoring callback");
     return IOTCON_FUNC_STOP;
@@ -1327,8 +1342,14 @@ bool IotconDeviceInfoCb(iotcon_device_info_h device_info,
   switch (result) {
     case IOTCON_ERROR_NONE:
       ret = IotconUtils::DeviceInfoToJson(device_info,&v.get<picojson::object>());
+      data->callback_called = true;
       break;
     case IOTCON_ERROR_TIMEOUT:
+      LoggerD("IOTCON_TIMEOUT data->callback_called :%d", data->callback_called);
+      if(!data->callback_called){
+          ret = IotconUtils::ConvertIotconError(result);
+          data->fun(ret, v);
+      }
       delete data;
       return IOTCON_FUNC_STOP;
     default:
@@ -1340,8 +1361,7 @@ bool IotconDeviceInfoCb(iotcon_device_info_h device_info,
   return IOTCON_FUNC_CONTINUE;
 }
 
-common::TizenResult IotconInstance::ClientFindDeviceInfo(const picojson::object& args,
-                                                         const common::AsyncToken& token) {
+common::TizenResult IotconInstance::ClientFindDeviceInfo(const picojson::object& args) {
   ScopeLogger();
 
   CHECK_PRIVILEGE(kPrivilegeIotcon);
@@ -1373,7 +1393,24 @@ common::TizenResult IotconInstance::ClientFindDeviceInfo(const picojson::object&
   std::string con_type = args.find(kConnectivityType)->second.get<std::string>();
   iotcon_connectivity_type_e con_type_e = IotconUtils::ToConnectivityType(con_type);
 
-  CallbackData* data = new CallbackData{SimplePost(token)};
+  long long id = GetId(args);
+  auto response = [this, id](const common::TizenResult& res, const picojson::value& v) {
+    picojson::value response{picojson::object{}};
+    auto& obj = response.get<picojson::object>();
+
+    obj.insert(std::make_pair(kId, picojson::value{static_cast<double>(id)}));
+    if(res) {
+      common::tools::ReportSuccess(v, obj);
+    } else {
+      common::tools::ReportError(res, &obj);
+    }
+
+    Post(kFindDeviceInfoListenerToken, common::TizenSuccess{response});
+  };
+
+  CallbackData2* data = new CallbackData2{};
+  data->fun = response;
+  data->callback_called = false;
 
   auto result = IotconUtils::ConvertIotconError(
        iotcon_find_device_info(host_address, con_type_e, query, IotconDeviceInfoCb, data));
@@ -1390,7 +1427,7 @@ bool IotconPlatformInfoCb(iotcon_platform_info_h platform_info,
                           iotcon_error_e result, void *user_data) {
   ScopeLogger();
 
-  CallbackData* data = static_cast<CallbackData*>(user_data);
+  CallbackData2* data = static_cast<CallbackData2*>(user_data);
   if (nullptr == data) {
     LoggerE("IotconPlatformInfoCb() failed.  Ignoring callback");
     return IOTCON_FUNC_STOP;
@@ -1402,8 +1439,14 @@ bool IotconPlatformInfoCb(iotcon_platform_info_h platform_info,
   switch (result) {
     case IOTCON_ERROR_NONE:
       ret = IotconUtils::PlatformInfoToJson(platform_info,&v.get<picojson::object>());
+      data->callback_called = true;
       break;
     case IOTCON_ERROR_TIMEOUT:
+      LoggerD("IOTCON_TIMEOUT data->callback_called :%d", data->callback_called);
+      if(!data->callback_called){
+          ret = IotconUtils::ConvertIotconError(result);
+          data->fun(ret, v);
+      }
       delete data;
       return IOTCON_FUNC_STOP;
     default:
@@ -1415,8 +1458,7 @@ bool IotconPlatformInfoCb(iotcon_platform_info_h platform_info,
   return IOTCON_FUNC_CONTINUE;
 }
 
-common::TizenResult IotconInstance::ClientFindPlatformInfo(const picojson::object& args,
-                                                           const common::AsyncToken& token) {
+common::TizenResult IotconInstance::ClientFindPlatformInfo(const picojson::object& args) {
   ScopeLogger();
 
   CHECK_PRIVILEGE(kPrivilegeIotcon);
@@ -1448,7 +1490,24 @@ common::TizenResult IotconInstance::ClientFindPlatformInfo(const picojson::objec
   std::string con_type = args.find(kConnectivityType)->second.get<std::string>();
   iotcon_connectivity_type_e con_type_e = IotconUtils::ToConnectivityType(con_type);
 
-  CallbackData* data = new CallbackData{SimplePost(token)};
+  long long id = GetId(args);
+  auto response = [this, id](const common::TizenResult& res, const picojson::value& v) {
+    picojson::value response{picojson::object{}};
+    auto& obj = response.get<picojson::object>();
+
+    obj.insert(std::make_pair(kId, picojson::value{static_cast<double>(id)}));
+    if(res) {
+      common::tools::ReportSuccess(v, obj);
+    } else {
+      common::tools::ReportError(res, &obj);
+    }
+
+    Post(kFindPlatformInfoListenerToken, common::TizenSuccess{response});
+  };
+
+  CallbackData2* data = new CallbackData2{};
+  data->fun = response;
+  data->callback_called = false;
 
   auto result = IotconUtils::ConvertIotconError(
        iotcon_find_platform_info(host_address, con_type_e, query, IotconPlatformInfoCb, data));
index 2d44f5c9145aff8dc16bb3b18034dabcc7e99a24..a417e64223ee8fc209bf287fa90aad403c7e70a9 100644 (file)
@@ -66,10 +66,8 @@ class IotconInstance : public common::TizenInstance {
   common::TizenResult ClientFindResource(const picojson::object& args);
   common::TizenResult ClientAddPresenceEventListener(const picojson::object& args);
   common::TizenResult ClientRemovePresenceEventListener(const picojson::object& args);
-  common::TizenResult ClientFindDeviceInfo(const picojson::object& args,
-                                           const common::AsyncToken& token);
-  common::TizenResult ClientFindPlatformInfo(const picojson::object& args,
-                                             const common::AsyncToken& token);
+  common::TizenResult ClientFindDeviceInfo(const picojson::object& args);
+  common::TizenResult ClientFindPlatformInfo(const picojson::object& args);
   common::TizenResult ServerCreateResource(const picojson::object& args);
   common::TizenResult ServerRemoveResource(const picojson::object& args);
   common::TizenResult ServerStartPresence(const picojson::object& args);