From: Michal Michalski Date: Tue, 8 Oct 2019 13:10:50 +0000 (+0200) Subject: [mediacontroller] Add MediaControllerClient::SetCustomEventListener() X-Git-Tag: submit/tizen/20191009.054725~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F68%2F215468%2F3;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [mediacontroller] Add MediaControllerClient::SetCustomEventListener() [ACR] http://suprem.sec.samsung.net/jira/browse/TWDAPI-209 MediaControllerClient::SetCustomEventListener() method implementation. [Verification] Will be verified later with SendEvent(). Signed-off-by: Michal Michalski Change-Id: Id30be750edc940e331053c353dc0944ef7d2f18a --- diff --git a/src/mediacontroller/mediacontroller_api.js b/src/mediacontroller/mediacontroller_api.js index 3bd97ab3..5c9a847b 100755 --- a/src/mediacontroller/mediacontroller_api.js +++ b/src/mediacontroller/mediacontroller_api.js @@ -112,6 +112,12 @@ ListenerManager.prototype.removeServerInfoListener = function(watchId) { } }; +var EventReplyListenerManager = new utils_.CommonListenerManager( + native_, + '_EventReplyListener' +); +EventReplyListenerManager.listenerIdToRequestId = {}; + var ServerCommandListener = new ListenerManager( native_, '_ServerCommandListener', @@ -2858,6 +2864,41 @@ function MediaControllerClientInfo(data) { function MediaControllerClient() {} +var EventReceivedCallback = function(msg, listener) { + var result = listener(msg.serverName, msg.eventName, msg.eventData); + if (type_.isUndefined(result)) { + result = null; + } + var nativeData = { + result: result.data, + resultCode: result.resultCode, + serverName: msg.serverName, + requestId: msg.requestId + }; + //var nativeResult = native_.callSync('MediaControllerClient_sendEventReply', nativeData); + //if (native_.isFailure(nativeResult)) { + // throw native_.getErrorObject(nativeResult); + //} +}; + +MediaControllerClient.prototype.setCustomEventListener = function(listener) { + var args = validator_.validateArgs(arguments, [ + { name: 'listener', type: types_.FUNCTION } + ]); + + var result = native_.callSync('MediaControllerClient_setCustomEventListener', { + listenerId: 'MediaControllerClientEventsListener' + }); + + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } else { + native_.addListener('MediaControllerClientEventsListener', function(msg) { + EventReceivedCallback(msg, listener); + }); + } +}; + MediaControllerClient.prototype.findServers = function(successCallback, errorCallback) { var args = validator_.validateArgs(arguments, [ { name: 'successCallback', type: types_.FUNCTION }, diff --git a/src/mediacontroller/mediacontroller_client.cc b/src/mediacontroller/mediacontroller_client.cc index f5fead32..5159fadc 100644 --- a/src/mediacontroller/mediacontroller_client.cc +++ b/src/mediacontroller/mediacontroller_client.cc @@ -35,6 +35,7 @@ using common::JsonToBundle; using common::PlatformResult; using common::tools::ReportError; using common::tools::ReportSuccess; +using common::BundleJsonIterator; MediaControllerClient::MediaControllerClient() : handle_(nullptr), subscribed_servers{} { ScopeLogger(); @@ -106,6 +107,18 @@ PlatformResult MediaControllerClient::Init() { return PlatformResult(ErrorCode::NO_ERROR); } +PlatformResult MediaControllerClient::SetCustomEventListener(const JsonCallback& callback) { + ScopeLogger(); + int ret = mc_client_set_custom_event_received_cb(handle_, OnEventReceived, this); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Failed to set custom event listener", + ("mc_client_set_custom_event_received_cb() error: %d, message: %s", + ret, get_error_message(ret))); + } + custom_event_listener_ = callback; + return PlatformResult(ErrorCode::NO_ERROR); +} + PlatformResult MediaControllerClient::FindServers(picojson::array* servers) { ScopeLogger(); int ret; @@ -1647,5 +1660,28 @@ void MediaControllerClient::OnDisplayRotationUpdate(const char* server_name, client->display_rotation_update_listener(&data); } +void MediaControllerClient::OnEventReceived(const char* server_name, const char* request_id, + const char* event_name, bundle* data, void* user_data) { + ScopeLogger(); + auto* client = static_cast(user_data); + + auto args = picojson::value(picojson::object()); + auto& args_obj = args.get(); + + picojson::array array; + bundle_foreach(data, BundleJsonIterator, &array); + + args_obj[kServerName] = picojson::value(std::string(server_name)); + args_obj[kEventName] = picojson::value(std::string(event_name)); + args_obj[kEventData] = picojson::value(array); + args_obj[kRequestId] = picojson::value(std::string(request_id)); + + if (nullptr != client->custom_event_listener_) { + client->custom_event_listener_(&args); + } else { + LoggerW("custom_event_listener_ is not set"); + } +} + } // namespace mediacontroller } // namespace extension diff --git a/src/mediacontroller/mediacontroller_client.h b/src/mediacontroller/mediacontroller_client.h index f460e12c..270bf049 100644 --- a/src/mediacontroller/mediacontroller_client.h +++ b/src/mediacontroller/mediacontroller_client.h @@ -105,6 +105,8 @@ class MediaControllerClient { common::PlatformResult SetDisplayRotationInfoChangeListener(const JsonCallback& callback); common::PlatformResult UnsetDisplayRotationInfoChangeListener(); + common::PlatformResult SetCustomEventListener(const JsonCallback& callback); + private: mc_client_h handle_; @@ -113,14 +115,11 @@ class MediaControllerClient { JsonCallback command_reply_callback_; JsonCallback playlist_update_listener_; JsonCallback ability_listener_; - // subtitles JsonCallback subtitles_update_listener_; - // mode 360 JsonCallback mode360_update_listener_; - // display mode JsonCallback display_mode_update_listener_; - // displayRotation JsonCallback display_rotation_update_listener; + JsonCallback custom_event_listener_; std::list subscribed_servers; @@ -152,6 +151,8 @@ class MediaControllerClient { // displayRotation static void OnDisplayRotationUpdate(const char* server_name, mc_display_rotation_e rotation, void* user_data); + static void OnEventReceived(const char* server_name, const char* request_id, const char* event, + bundle* data, void* user_data); }; } // namespace mediacontroller diff --git a/src/mediacontroller/mediacontroller_instance.cc b/src/mediacontroller/mediacontroller_instance.cc index 766828cb..fb562b91 100644 --- a/src/mediacontroller/mediacontroller_instance.cc +++ b/src/mediacontroller/mediacontroller_instance.cc @@ -107,6 +107,8 @@ MediaControllerInstance::MediaControllerInstance() { REGISTER_SYNC("MediaControllerClient_getSimpleAbility", MediaControllerClientGetSimpleAbility); REGISTER_ASYNC("MediaControllerClient_findSubscribedServers", MediaControllerClientFindSubscribedServers); + REGISTER_SYNC("MediaControllerClient_setCustomEventListener", + MediaControllerClientSetCustomEventListener); // server_info REGISTER_SYNC("MediaControllerServerInfo_sendPlaybackState", @@ -907,6 +909,38 @@ void MediaControllerInstance::MediaControllerManagerGetClient(const picojson::va ReportSuccess(out); } +void MediaControllerInstance::MediaControllerClientSetCustomEventListener( + const picojson::value& args, picojson::object& out) { + ScopeLogger(); + if (!client_) { + LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out, + ("Failed: client_")); + return; + } + + CHECK_ARGS(args, kListenerId, std::string, out); + + JsonCallback callback = [this, args](picojson::value* data) -> void { + if (nullptr == data) { + LoggerE("No data passed to json callback"); + return; + } + + picojson::object& request_o = data->get(); + request_o[kListenerId] = args.get(kListenerId); + + Instance::PostMessage(this, data->serialize().c_str()); + }; + + auto result = client_->SetCustomEventListener(callback); + if (!result) { + LogAndReportError(result, &out); + return; + } + + ReportSuccess(out); +} + void MediaControllerInstance::MediaControllerClientFindServers(const picojson::value& args, picojson::object& out) { ScopeLogger(); diff --git a/src/mediacontroller/mediacontroller_instance.h b/src/mediacontroller/mediacontroller_instance.h index 8110eb65..6a6f5925 100644 --- a/src/mediacontroller/mediacontroller_instance.h +++ b/src/mediacontroller/mediacontroller_instance.h @@ -91,6 +91,8 @@ class MediaControllerInstance : public common::ParsedInstance { picojson::object& out); void MediaControllerClientFindSubscribedServers(const picojson::value& args, picojson::object& out); + void MediaControllerClientSetCustomEventListener(const picojson::value& args, + picojson::object& out); // serverInfo void MediaControllerServerInfoSendPlaybackState(const picojson::value& args, diff --git a/src/mediacontroller/mediacontroller_utils.cc b/src/mediacontroller/mediacontroller_utils.cc index d2b2ec0e..1404b224 100644 --- a/src/mediacontroller/mediacontroller_utils.cc +++ b/src/mediacontroller/mediacontroller_utils.cc @@ -53,6 +53,11 @@ const char* kDisplayMode = "displayMode"; const char* kDisplayRotation = "displayRotation"; const char* kDisplayRotationAbility = "displayRotationAbility"; const char* kEnabled = "enabled"; +const char* kEpisode = "episode"; +const char* kEpisodeNumber = "episodeNumber"; +const char* kEpisodeTitle = "episodeTitle"; +const char* kEventData = "eventData"; +const char* kEventName = "eventName"; const char* kExtraData = "extraData"; const char* kIconURI = "iconURI"; const char* kIndex = "index"; @@ -68,22 +73,19 @@ const char* kRepeatMode = "repeatMode"; const char* kReply = "reply"; const char* kRequest = "request"; const char* kRequestId = "requestId"; +const char* kResolution = "resolution"; +const char* kResolutionHeight = "resolutionHeight"; +const char* kResolutionWidth = "resolutionWidth"; const char* kResult = "result"; +const char* kSeason = "season"; +const char* kSeasonNumber = "seasonNumber"; +const char* kSeasonTitle = "seasonTitle"; const char* kServerName = "serverName"; const char* kShuffleMode = "shuffleMode"; const char* kState = "state"; const char* kSupport = "support"; const char* kType = "type"; const char* kValue = "value"; -const char* kSeason = "season"; -const char* kSeasonNumber = "seasonNumber"; -const char* kSeasonTitle = "seasonTitle"; -const char* kEpisode = "episode"; -const char* kEpisodeNumber = "episodeNumber"; -const char* kEpisodeTitle = "episodeTitle"; -const char* kResolution = "resolution"; -const char* kResolutionWidth = "resolutionWidth"; -const char* kResolutionHeight = "resolutionHeight"; } // attributes diff --git a/src/mediacontroller/mediacontroller_utils.h b/src/mediacontroller/mediacontroller_utils.h index 69e9a4ad..2bd30625 100644 --- a/src/mediacontroller/mediacontroller_utils.h +++ b/src/mediacontroller/mediacontroller_utils.h @@ -54,6 +54,8 @@ extern const char* kDisplayMode; extern const char* kDisplayRotation; extern const char* kDisplayRotationAbility; extern const char* kEnabled; +extern const char* kEventData; +extern const char* kEventName; extern const char* kExtraData; extern const char* kIconURI; extern const char* kIndex;