From: Rafal Galka Date: Thu, 23 Apr 2015 08:56:46 +0000 (+0200) Subject: [MediaController] Server status listener X-Git-Tag: submit/tizen_mobile/20150603.064609~1^2~124 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=40555d0e52598ca55985d12ef654beed2a3448cf;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [MediaController] Server status listener Change-Id: Ic5b89245c0242c2a5310b0de34771678780b0320 Signed-off-by: Rafal Galka --- diff --git a/src/mediacontroller/mediacontroller_api.js b/src/mediacontroller/mediacontroller_api.js index 1c1b774..d41e3a4 100644 --- a/src/mediacontroller/mediacontroller_api.js +++ b/src/mediacontroller/mediacontroller_api.js @@ -77,18 +77,7 @@ var ServerPlaybackInfoListener = new ListenerManager(native_, '_ServerPlaybackIn }); var ServerInfoStatusListener = new ListenerManager(native_, '_ServerInfoStatusListener', function(msg, listener) { - if (msg.action === 'onplaybackstaterequest') { - listener[msg.action](msg.state); - } - if (msg.action === 'onplaybackpositionrequest') { - listener[msg.action](msg.position); - } - if (msg.action === 'onshufflemoderequest' || msg.action === 'onrepeatmoderequest') { - listener[msg.action](msg.mode); - } - if (msg.action === 'onmetadatachanged') { - listener[msg.action](new MediaControllerMetadata(msg.metadata)); - } + listener(msg.state); }); var ServerInfoPlaybackInfoListener = new ListenerManager(native_, '_ServerInfoPlaybackInfoListener', function(msg, listener) { diff --git a/src/mediacontroller/mediacontroller_client.cc b/src/mediacontroller/mediacontroller_client.cc index 2fd88b4..d36a8ca 100644 --- a/src/mediacontroller/mediacontroller_client.cc +++ b/src/mediacontroller/mediacontroller_client.cc @@ -231,6 +231,70 @@ PlatformResult MediaControllerClient::GetMetadata( return PlatformResult(ErrorCode::NO_ERROR); } +PlatformResult MediaControllerClient::SetServerStatusChangeListener( + JsonCallback callback) { + + if (callback && server_status_listener_) { + LOGGER(ERROR) << "Listener already registered"; + return PlatformResult(ErrorCode::INVALID_STATE_ERR, + "Listener already registered"); + } + + server_status_listener_ = callback; + + int ret; + if (callback) { // set platform callbacks + + ret = mc_client_set_server_update_cb(handle_, OnServerStatusUpdate, this); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + LOGGER(ERROR) << "Unable to set server status listener, error: " << ret; + return PlatformResult(ErrorCode::UNKNOWN_ERR, + "Unable to set server status listener"); + } + + } else { // unset platform callbacks + + ret = mc_client_unset_server_update_cb(handle_); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + LOGGER(ERROR) << "Unable to unset server status listener, error: " << ret; + return PlatformResult(ErrorCode::UNKNOWN_ERR, + "Unable to unset server status listener"); + } + + } + + return PlatformResult(ErrorCode::NO_ERROR); +} + +void MediaControllerClient::OnServerStatusUpdate(const char* server_name, + mc_server_state_e state, + void* user_data) { + LOGGER(DEBUG) << "entered"; + + MediaControllerClient* client = static_cast(user_data); + + if (!client->server_status_listener_) { + LOGGER(DEBUG) << "No server status listener registered, skipping"; + return; + } + + // server state + std::string state_str; + PlatformResult result = Types::PlatformEnumToString( + Types::kMediaControllerServerState, static_cast(state), &state_str); + if (!result) { + LOGGER(ERROR) << "PlatformEnumToString failed, error: " << result.message(); + return; + } + + picojson::value data = picojson::value(picojson::object()); + picojson::object& data_o = data.get(); + + data_o["state"] = picojson::value(state_str); + + client->server_status_listener_(&data); +} + PlatformResult MediaControllerClient::SetPlaybackInfoListener( JsonCallback callback) { diff --git a/src/mediacontroller/mediacontroller_client.h b/src/mediacontroller/mediacontroller_client.h index eb36266..8cf04b3 100644 --- a/src/mediacontroller/mediacontroller_client.h +++ b/src/mediacontroller/mediacontroller_client.h @@ -31,12 +31,19 @@ class MediaControllerClient { common::PlatformResult SendPlaybackState(const std::string& server_name, const std::string& state); + common::PlatformResult SetServerStatusChangeListener(JsonCallback callback); common::PlatformResult SetPlaybackInfoListener(JsonCallback callback); + private: mc_client_h handle_; JsonCallback playback_info_listener_; + JsonCallback server_status_listener_; static bool FindServersCallback(const char* server_name, void* user_data); + + static void OnServerStatusUpdate(const char *server_name, + mc_server_state_e state, + void *user_data); static void OnPlaybackUpdate(const char *server_name, mc_playback_h playback, void *user_data); diff --git a/src/mediacontroller/mediacontroller_instance.cc b/src/mediacontroller/mediacontroller_instance.cc index f171f09..229383d 100644 --- a/src/mediacontroller/mediacontroller_instance.cc +++ b/src/mediacontroller/mediacontroller_instance.cc @@ -529,28 +529,47 @@ void MediaControllerInstance::MediaControllerServerInfoSendCommand( void MediaControllerInstance::MediaControllerServerInfoAddServerStatusChangeListener( const picojson::value& args, picojson::object& out) { + LOGGER(DEBUG) << "entered"; - // implement it + if (!client_) { + ReportError(PlatformResult(ErrorCode::INVALID_STATE_ERR, + "Client not initialized."), &out); + return; + } - // if success - // ReportSuccess(out); - // if error - // ReportError(out); + CHECK_EXIST(args, "listenerId", out) + + JsonCallback callback = [this, args](picojson::value* data) -> void { + LOGGER(DEBUG) << "entered"; + + if (nullptr == data) { + LOGGER(ERROR) << "No data passed to json callback"; + return; + } + + picojson::object& request_o = data->get(); + request_o["listenerId"] = args.get("listenerId"); + + PostMessage(data->serialize().c_str()); + }; + + client_->SetServerStatusChangeListener(callback); + + ReportSuccess(out); } void MediaControllerInstance::MediaControllerServerInfoRemoveServerStatusChangeListener( const picojson::value& args, picojson::object& out) { - CHECK_EXIST(args, "watchId", out) - - double watchId = args.get("watchId").get(); + LOGGER(DEBUG) << "entered"; - // implement it + if (!client_) { + ReportError(PlatformResult(ErrorCode::INVALID_STATE_ERR, + "Client not initialized."), &out); + return; + } - // if success - // ReportSuccess(out); - // if error - // ReportError(out); + client_->SetServerStatusChangeListener(nullptr); } void MediaControllerInstance::MediaControllerServerInfoAddPlaybackInfoChangeListener(