From: Piotr Kosko Date: Fri, 2 Dec 2016 13:40:35 +0000 (+0100) Subject: [Convergence] Fixed clientInfo in callback of start method X-Git-Tag: submit/tizen/20161206.092612^2~2^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=78dc7d8010d0e9377de12c9f085beeeabe5339ae;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Convergence] Fixed clientInfo in callback of start method [Feature] Fixed filling clientInfo when calling start callback of client service (both for service found on other device with startDiscovery and for local service created with constructor) Change-Id: If2d0e1808df46a8e41415a98e680c86ed0bedf59 Signed-off-by: Piotr Kosko --- diff --git a/src/convergence/convergence_api.js b/src/convergence/convergence_api.js index 708fbc06..3d4650db 100644 --- a/src/convergence/convergence_api.js +++ b/src/convergence/convergence_api.js @@ -714,8 +714,9 @@ native_.addListener('APP_COMMUNICATION_SERVICE_LISTENER', function(result) { native_.callIfPossible(s._connectCallback, s); break; case 'onStart': + var clientInfo = (result.clientInfo ? new ClientInfo(result.clientInfo) : null); native_.callIfPossible(s._startCallback, - new ChannelInfo(result.channel.uri, result.channel.id), null); + new ChannelInfo(result.channel.uri, result.channel.id), clientInfo); break; case 'onPublish': native_.callIfPossible(s._sendCallback, diff --git a/src/convergence/convergence_app_communication_service.cc b/src/convergence/convergence_app_communication_service.cc index 4272e4ee..2b71890b 100644 --- a/src/convergence/convergence_app_communication_service.cc +++ b/src/convergence/convergence_app_communication_service.cc @@ -37,6 +37,7 @@ using common::TizenSuccess; namespace { static const std::string kChannel = "channel"; +static const std::string kClientInfo = "clientInfo"; } // namespace ConvergenceAppCommunicationService::ConvergenceAppCommunicationService() @@ -72,7 +73,7 @@ common::TizenResult ConvergenceAppCommunicationService::Start( return LogAndCreateTizenError(AbortError, "Service with specified type does not exist"); } - UpdateListener(cur_listener_id); + UpdateListener(cur_listener_id, REMOTE_SERVICE_START); const int error = conv_service_start(service_handle, channel->GetHandle(), nullptr); if (CONV_ERROR_NONE != error) { @@ -185,8 +186,11 @@ void ConvergenceAppCommunicationService::ServiceListenerCb(conv_service_h servic param[kChannel] = ConvergenceChannel::ToJson(channel_handle); param[kServiceResultType] = picojson::value(result_type); - if ((kServiceResultTypeOnStart == result_type) - || (kServiceResultTypeOnPublish == result_type) + if (kServiceResultTypeOnStart == result_type) { + if (callbackParam->client_info_) { + param[kClientInfo] = callbackParam->client_info_->ToJson(); + } + } else if ((kServiceResultTypeOnPublish == result_type) || (kServiceResultTypeOnStop == result_type)) { // The service doesn't send any callback with thie response } else if (kServiceResultTypeOnMessage == result_type) { @@ -194,10 +198,20 @@ void ConvergenceAppCommunicationService::ServiceListenerCb(conv_service_h servic ConvergencePayloadArray::ExtractPayloadString(result, "from")); // Define the string as a constant param[kPayload] = ConvergencePayloadArray::ToJson(result); } else if (kServiceResultTypeOnConnect == result_type) { - //param["clientInfo"] = ConvergenceClientInfo(result).ToJson(); - //callbackParam->plugin_->ReplyAsync(kAppCommunicationClientServiceConnectCallback, - // callbackParam->callback_id_, true, param); - return; + // just filling client_info_ member in CallbackParam + if (!callbackParam->client_info_) { + callbackParam->client_info_ = new ConvergenceClientInfo(result); + } + if (LOCAL_SERVICE_START != callbackParam->type_) { + // for non-local services just set clientInfo and not trigger callback + return; + } else { + // but trigger this callback for local services and pretend that this is onStart signal + param[kServiceResultType] = picojson::value(kServiceResultTypeOnStart); + if (callbackParam->client_info_) { + param[kClientInfo] = callbackParam->client_info_->ToJson(); + } + } } else if (kServiceResultTypeOnClientConnect == result_type) { // TODO the service doesn't send any callback with thie response return; // TODO @@ -217,7 +231,8 @@ void ConvergenceAppCommunicationService::ServiceListenerCb(conv_service_h servic callbackParam->callback_id_, true, param); } -void ConvergenceAppCommunicationService::UpdateListener(const int cur_listener_id) { +void ConvergenceAppCommunicationService::UpdateListener(const int cur_listener_id, + ServiceRequestType type) { ScopeLogger(); // TODO make sure that callback is not called twice for the same listener @@ -255,7 +270,7 @@ void ConvergenceAppCommunicationService::UpdateListener(const int cur_listener_i free(sver); } - CallbackParam *param = new CallbackParam(convergence_plugin_, cur_listener_id); + CallbackParam *param = new CallbackParam(convergence_plugin_, cur_listener_id, type); const int error = conv_service_set_listener_cb(service_handle, ServiceListenerCb, param); if (CONV_ERROR_NONE != error) { @@ -348,24 +363,24 @@ common::TizenResult ConvergenceAppCommunicationServerService::Start( const int cur_listener_id) { ScopeLogger(); + LoggerI("Starting service [0x%x] with handle [0x%x]", this, service_handle_); + std::unique_ptr ch_ptr(channel); // auto release memory in case of error - /* By implementation, the local App Communication Service doesn't send - * the callback confirming that the Start is successful. - * So we are sending this callback manually - */ - picojson::object param; - param[kServiceListenerStatus] = picojson::value(kServiceListenerStatusOk); + conv_service_h service_handle = FindServiceHandle(); + if (!service_handle) { + return LogAndCreateTizenError(AbortError, "Service with specified type does not exist"); + } - param[kChannel] = ConvergenceChannel::ToJson(channel->GetHandle()); // Define string as constant - param[kServiceResultType] = picojson::value(kServiceResultTypeOnStart); + UpdateListener(cur_listener_id, LOCAL_SERVICE_START); - common::TizenResult result = ConvergenceAppCommunicationService::Start(channel, cur_listener_id); - if (!result) { - return result; + const int error = conv_service_start(service_handle, channel->GetHandle(), nullptr); + if (CONV_ERROR_NONE != error) { + return LogAndCreateTizenError(AbortError, "conv_service_start [fail]"); } - convergence_plugin_->ReplyAsync(kAppCommunicationListenerCallback, cur_listener_id, true, param); - return result; + opened_channels.push_back(ch_ptr.release()); + + return TizenSuccess(); } common::TizenResult ConvergenceAppCommunicationServerService::Stop( diff --git a/src/convergence/convergence_app_communication_service.h b/src/convergence/convergence_app_communication_service.h index 38218867..10ec5d9f 100644 --- a/src/convergence/convergence_app_communication_service.h +++ b/src/convergence/convergence_app_communication_service.h @@ -55,12 +55,12 @@ class ConvergenceAppCommunicationService : public ConvergenceService { common::TizenResult SetListener(const int cur_listener_id); common::TizenResult RemoveListener(); private: - void UpdateListener(const int cur_listener_id); static void ServiceListenerCb(conv_service_h service_handle, conv_channel_h channel_handle, conv_error_e error, conv_payload_h result, void* user_data); protected: + void UpdateListener(const int cur_listener_id, ServiceRequestType type = UNKNOWN_REQUEST_TYPE); std::vector callback_param_gc_; }; diff --git a/src/convergence/convergence_client_info.cc b/src/convergence/convergence_client_info.cc index 6dece11e..b75c2e73 100644 --- a/src/convergence/convergence_client_info.cc +++ b/src/convergence/convergence_client_info.cc @@ -76,7 +76,7 @@ picojson::value ConvergenceClientInfo::ToJson() const { ScopeLogger(); picojson::object clientInfo; clientInfo["isHost"] = picojson::value(static_cast(isHost_)); - clientInfo["connectionTime"] = picojson::value(static_cast(connectionTime_)); + clientInfo["connectTime"] = picojson::value(static_cast(connectionTime_)); clientInfo["clientId"] = picojson::value(clientId_); return picojson::value(clientInfo); } diff --git a/src/convergence/convergence_utils.h b/src/convergence/convergence_utils.h index 50e04904..2d17d8ae 100644 --- a/src/convergence/convergence_utils.h +++ b/src/convergence/convergence_utils.h @@ -24,6 +24,7 @@ #include #include "common/tizen_result.h" +#include "convergence_client_info.h" namespace extension { namespace convergence { @@ -62,12 +63,23 @@ static const std::string kServiceListenerStatusError = "listener_error"; static const std::string kServiceListenerError = "error"; } // namespace +enum ServiceRequestType { + LOCAL_SERVICE_START, + REMOTE_SERVICE_START, + UNKNOWN_REQUEST_TYPE +}; + struct CallbackParam { - CallbackParam(ConvergenceInstance *plg, int cbId) - : plugin_(plg), callback_id_(cbId), remote_method_() {} + CallbackParam(ConvergenceInstance *plg, int cbId, ServiceRequestType type = UNKNOWN_REQUEST_TYPE) + : plugin_(plg), callback_id_(cbId), remote_method_(), client_info_(nullptr), type_(type) {} + ~CallbackParam() { + delete client_info_; + } ConvergenceInstance *plugin_; int callback_id_; std::string remote_method_; + ConvergenceClientInfo* client_info_; + ServiceRequestType type_; };