From: jk.pu Date: Wed, 23 Nov 2016 08:29:47 +0000 (+0900) Subject: [iotcon] fix some API implementation bug X-Git-Tag: submit/tizen/20161128.110522^2~15^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bff596ca6dbc0d57beb3e90880a9a821ff58c22f;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [iotcon] fix some API implementation bug 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 --- diff --git a/src/iotcon/iotcon_api.js b/src/iotcon/iotcon_api.js index 1afe4a0a..e33a562c 100644 --- a/src/iotcon/iotcon_api.js +++ b/src/iotcon/iotcon_api.js @@ -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); } }; diff --git a/src/iotcon/iotcon_instance.cc b/src/iotcon/iotcon_instance.cc index 73bdb1e4..d8d68d60 100644 --- a/src/iotcon/iotcon_instance.cc +++ b/src/iotcon/iotcon_instance.cc @@ -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(args.find(kId)->second.get()); } @@ -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()); - if (!result) { - LoggerE("ResponseToJson() failed"); + common::TizenResult ret = common::TizenSuccess(); + + switch (err) { + case IOTCON_ERROR_NONE: + ret = IotconUtils::ResponseToJson(response, &value.get()); + 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(user_data); + CallbackData2* data = static_cast(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(user_data); + CallbackData2* data = static_cast(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()); + 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(); 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(); + + obj.insert(std::make_pair(kId, picojson::value{static_cast(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(user_data); + CallbackData2* data = static_cast(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()); + 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(); 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(); + + obj.insert(std::make_pair(kId, picojson::value{static_cast(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)); diff --git a/src/iotcon/iotcon_instance.h b/src/iotcon/iotcon_instance.h index 2d44f5c9..a417e642 100644 --- a/src/iotcon/iotcon_instance.h +++ b/src/iotcon/iotcon_instance.h @@ -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);