From 72e03f83412fce9ee94a738573ab4f84565b993d Mon Sep 17 00:00:00 2001 From: Szymon Jastrzebski Date: Wed, 13 Dec 2017 10:31:43 +0100 Subject: [PATCH] [MediaController] Refactoring internal implementation into dedicated CAPI [Verification] TCT pass rates: 100% A 100% M Change-Id: Id01a8988a122d0055f662eabe066a4b3f35bb48b Signed-off-by: Szymon Jastrzebski --- src/mediacontroller/mediacontroller_api.js | 39 +-- src/mediacontroller/mediacontroller_client.cc | 226 +++++++++-------- src/mediacontroller/mediacontroller_client.h | 7 +- .../mediacontroller_instance.cc | 40 ++- src/mediacontroller/mediacontroller_server.cc | 234 +++++++++++------- src/mediacontroller/mediacontroller_server.h | 8 +- 6 files changed, 320 insertions(+), 234 deletions(-) diff --git a/src/mediacontroller/mediacontroller_api.js b/src/mediacontroller/mediacontroller_api.js index f8b3db5c..fa7160bf 100755 --- a/src/mediacontroller/mediacontroller_api.js +++ b/src/mediacontroller/mediacontroller_api.js @@ -23,15 +23,6 @@ var validator_ = utils_.validator; var types_ = validator_.Types; var native_ = new xwalk.utils.NativeManager(extension); -// TODO(r.galka) CAPI have no dedicated methods for position/shuffle/repeat change. -// It should be updated when new version of CAPI will be available. -// For now implementation is using internal commands. -var internal_commands_ = { - sendPlaybackPosition: '__internal_sendPlaybackPosition', - sendShuffleMode: '__internal_sendShuffleMode', - sendRepeatMode: '__internal_sendRepeatMode' -}; - function ListenerManager(native, listenerName, handle) { this.listeners = {}; this.listenerNameToIds = {}; @@ -661,10 +652,11 @@ MediaControllerServerInfo.prototype.sendPlaybackPosition = function(position, su }; var data = { - position: args.position + position: args.position, + name: this.name }; - sendDefinedCommand(this.name, internal_commands_.sendPlaybackPosition, data, callback); + native_.call('MediaControllerServerInfo_sendPlaybackPosition', data, callback); }; MediaControllerServerInfo.prototype.sendShuffleMode = function(mode, successCallback, errorCallback) { @@ -683,9 +675,10 @@ MediaControllerServerInfo.prototype.sendShuffleMode = function(mode, successCall }; var data = { - mode: args.mode + mode: args.mode, + name: this.name }; - sendDefinedCommand(this.name, internal_commands_.sendShuffleMode, data, callback); + native_.call('MediaControllerServerInfo_sendShuffleMode', data, callback); }; MediaControllerServerInfo.prototype.sendRepeatMode = function(mode, successCallback, errorCallback) { @@ -704,24 +697,10 @@ MediaControllerServerInfo.prototype.sendRepeatMode = function(mode, successCallb }; var data = { - mode: args.mode - }; - sendDefinedCommand(this.name, internal_commands_.sendRepeatMode, data, callback); -}; - -function sendDefinedCommand(name_, command_, data_, callback_) { - var nativeData = { - command: command_, - data: data_, - name: name_ + mode: args.mode, + name: this.name }; - - var replyId = ReplyCommandListener.addListener(callback_); - - nativeData.replyId = replyId; - nativeData.listenerId = ReplyCommandListener.listenerName; - - native_.call('MediaControllerServerInfo_sendCommand', nativeData, callback_); + native_.call('MediaControllerServerInfo_sendRepeatMode', data, callback); }; MediaControllerServerInfo.prototype.sendCommand = function(command, data, successCallback, errorCallback) { diff --git a/src/mediacontroller/mediacontroller_client.cc b/src/mediacontroller/mediacontroller_client.cc index e6597e51..950ab6f8 100644 --- a/src/mediacontroller/mediacontroller_client.cc +++ b/src/mediacontroller/mediacontroller_client.cc @@ -37,18 +37,24 @@ MediaControllerClient::MediaControllerClient() : handle_(nullptr) { MediaControllerClient::~MediaControllerClient() { ScopeLogger(); - if (handle_) { - int ret = mc_client_destroy(handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - LoggerE("Unable to destroy media controller client"); - } + + if (nullptr != server_status_listener_ && !UnsetServerStatusChangeListener()) { + LoggerE("Failed to unset server status change listener"); + } + + if (nullptr != playback_info_listener_ && !UnsetPlaybackInfoListener()) { + LoggerE("Failed to unset playback info listener"); + } + + if (nullptr != handle_ && MEDIA_CONTROLLER_ERROR_NONE != mc_client_destroy(handle_)) { + LoggerE("Unable to destroy media controller client"); } } PlatformResult MediaControllerClient::Init() { ScopeLogger(); int ret = mc_client_create(&handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Unable to create media controller client", ("mc_client_create() error: %d, message: %s", ret, get_error_message(ret))); @@ -62,7 +68,7 @@ PlatformResult MediaControllerClient::FindServers(picojson::array* servers) { int ret; ret = mc_client_foreach_server(handle_, FindServersCallback, servers); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Unable to fetch active servers, error", ("mc_client_foreach_server() error: %d, message: %s", ret, get_error_message(ret))); @@ -120,7 +126,7 @@ PlatformResult MediaControllerClient::GetLatestServerInfo(picojson::value* serve }; mc_server_state_e state; ret = mc_client_get_latest_server_info(handle_, &name, &state); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error getting latest server info", ("mc_client_get_latest_server_info() error: %d, message: %s", ret, get_error_message(ret))); @@ -154,7 +160,7 @@ PlatformResult MediaControllerClient::GetPlaybackInfo(const std::string& server_ mc_playback_h playback_h; ret = mc_client_get_server_playback_info(handle_, server_name.c_str(), &playback_h); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error getting playback info", ("mc_client_get_server_playback_info() error: %d, message: %s", ret, get_error_message(ret))); @@ -183,7 +189,7 @@ PlatformResult MediaControllerClient::GetPlaybackInfo(const std::string& server_ // shuffle mode mc_shuffle_mode_e shuffle; ret = mc_client_get_server_shuffle_mode(handle_, server_name.c_str(), &shuffle); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error getting shuffle mode", ("mc_client_get_server_shuffle_mode() error: %d, message: %s", ret, get_error_message(ret))); @@ -192,7 +198,7 @@ PlatformResult MediaControllerClient::GetPlaybackInfo(const std::string& server_ // repeat mode mc_repeat_mode_e repeat; ret = mc_client_get_server_repeat_mode(handle_, server_name.c_str(), &repeat); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error getting repeat mode", ("mc_client_get_server_repeat_mode() error: %d, message: %s", ret, get_error_message(ret))); @@ -222,7 +228,7 @@ PlatformResult MediaControllerClient::GetMetadata(const std::string& server_name mc_metadata_h metadata_h; ret = mc_client_get_server_metadata(handle_, server_name.c_str(), &metadata_h); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error getting server metadata", ("mc_client_get_server_metadata() error: %d, message: %s", ret, get_error_message(ret))); @@ -240,32 +246,30 @@ PlatformResult MediaControllerClient::GetMetadata(const std::string& server_name return PlatformResult(ErrorCode::NO_ERROR); } -PlatformResult MediaControllerClient::SetServerStatusChangeListener(JsonCallback callback) { +PlatformResult MediaControllerClient::SetServerStatusChangeListener(const JsonCallback& callback) { ScopeLogger(); - if (callback && server_status_listener_) { - return LogAndCreateResult(ErrorCode::INVALID_STATE_ERR, "Listener already registered"); + + int ret = mc_client_set_server_update_cb(handle_, OnServerStatusUpdate, this); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to set server status listener", + ("mc_client_set_server_update_cb() error: %d, message: %s", ret, get_error_message(ret))); } 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) { - return LogAndCreateResult( - ErrorCode::UNKNOWN_ERR, "Unable to set server status listener", - ("mc_client_set_server_update_cb() error: %d, message: %s", ret, get_error_message(ret))); - } + return PlatformResult(ErrorCode::NO_ERROR); +} - } else { // unset platform callbacks - ret = mc_client_unset_server_update_cb(handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to unset server status listener", - ("mc_client_unset_server_update_cb() error: %d, message: %s", ret, - get_error_message(ret))); - } +PlatformResult MediaControllerClient::UnsetServerStatusChangeListener() { + ScopeLogger(); + int ret = mc_client_unset_server_update_cb(handle_); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to unset server status listener", + ("mc_client_unset_server_update_cb() error: %d, message: %s", ret, get_error_message(ret))); } - + server_status_listener_ = nullptr; return PlatformResult(ErrorCode::NO_ERROR); } @@ -297,78 +301,73 @@ void MediaControllerClient::OnServerStatusUpdate(const char* server_name, mc_ser client->server_status_listener_(&data); } -PlatformResult MediaControllerClient::SetPlaybackInfoListener(JsonCallback callback) { +PlatformResult MediaControllerClient::SetPlaybackInfoListener(const JsonCallback& callback) { ScopeLogger(); - if (callback && playback_info_listener_) { - return LogAndCreateResult(ErrorCode::INVALID_STATE_ERR, "Listener already registered"); - } + int failed_setter = 0; + SCOPE_EXIT { + int (*unsetters[])(mc_client_h) = { + mc_client_unset_playback_update_cb, mc_client_unset_shuffle_mode_update_cb, + mc_client_unset_repeat_mode_update_cb, + /*mc_client_unset_metadata_update_cb the last unsetter will never be used*/}; + for (int i = 0; i < failed_setter; ++i) { + auto ret = unsetters[i](handle_); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + LoggerE("Fail (%d) returned by the [%d] unsetter", ret, i); + } + } + }; - playback_info_listener_ = callback; + int ret = mc_client_set_playback_update_cb(handle_, OnPlaybackUpdate, this); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to register playback listener", + ("mc_client_set_playback_update_cb() error: %d, message: %s", ret, get_error_message(ret))); + } - int ret; - if (callback) { // set platform callbacks - ret = mc_client_set_playback_update_cb(handle_, OnPlaybackUpdate, this); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to register playback listener", - ("mc_client_set_playback_update_cb() error: %d, message: %s", ret, - get_error_message(ret))); - } + ret = mc_client_set_shuffle_mode_update_cb(handle_, OnShuffleModeUpdate, this); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + failed_setter = 1; + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to register shuffle mode listener", + ("mc_client_set_shuffle_mode_update_cb() error: %d, message: %s", ret, + get_error_message(ret))); + } - ret = mc_client_set_shuffle_mode_update_cb(handle_, OnShuffleModeUpdate, this); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to register shuffle mode listener", - ("mc_client_set_shuffle_mode_update_cb() error: %d, message: %s", - ret, get_error_message(ret))); - } + ret = mc_client_set_repeat_mode_update_cb(handle_, OnRepeatModeUpdate, this); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + failed_setter = 2; + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to register repeat mode listener", + ("mc_client_set_repeat_mode_update_cb() error: %d, message: %s", ret, + get_error_message(ret))); + } - ret = mc_client_set_repeat_mode_update_cb(handle_, OnRepeatModeUpdate, this); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to register repeat mode listener", - ("mc_client_set_repeat_mode_update_cb() error: %d, message: %s", - ret, get_error_message(ret))); - } + ret = mc_client_set_metadata_update_cb(handle_, OnMetadataUpdate, this); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + failed_setter = 3; + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to register metadata listener", + ("mc_client_set_metadata_update_cb() error: %d, message: %s", ret, get_error_message(ret))); + } - ret = mc_client_set_metadata_update_cb(handle_, OnMetadataUpdate, this); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to register metadata listener", - ("mc_client_set_metadata_update_cb() error: %d, message: %s", ret, - get_error_message(ret))); - } + playback_info_listener_ = callback; - } else { // unset platform callbacks - ret = mc_client_unset_playback_update_cb(handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to unregister playback listener", - ("mc_client_unset_playback_update_cb() error: %d, message: %s", ret, - get_error_message(ret))); - } + return PlatformResult(ErrorCode::NO_ERROR); +} - ret = mc_client_unset_shuffle_mode_update_cb(handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, - "Unable to unregister shuffle mode listener", - ("mc_client_unset_shuffle_mode_update_cb() error: %d, message: %s", - ret, get_error_message(ret))); - } +PlatformResult MediaControllerClient::UnsetPlaybackInfoListener() { + ScopeLogger(); + // Even though if one of below functions fails, let's try to unset as much listeners as we can. + // In the Javascript layer, the removePlaybackInfoChangeListener() method always succeeds, so we + // do not need to catch the returned value. - ret = mc_client_unset_repeat_mode_update_cb(handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to unregister repeat mode listener", - ("mc_client_unset_repeat_mode_update_cb() error: %d, message: %s", - ret, get_error_message(ret))); - } + mc_client_unset_playback_update_cb(handle_); + mc_client_unset_shuffle_mode_update_cb(handle_); + mc_client_unset_repeat_mode_update_cb(handle_); + mc_client_unset_metadata_update_cb(handle_); - ret = mc_client_unset_metadata_update_cb(handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - LoggerE("Unable to unregister metadata listener, error: %d", ret); - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to unregister metadata listener", - ("mc_client_unset_metadata_update_cb() error: %d, message: %s", ret, - get_error_message(ret))); - } - } + playback_info_listener_ = nullptr; return PlatformResult(ErrorCode::NO_ERROR); -}; +} void MediaControllerClient::OnPlaybackUpdate(const char* server_name, mc_playback_h playback, void* user_data) { @@ -487,14 +486,14 @@ PlatformResult MediaControllerClient::SendCommand(const std::string& server_name int ret; ret = bundle_add(bundle, "replyId", reply_id.c_str()); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Unable to add replyId to bundle", ("bundle_add(replyId) error: %d, message: %s", ret, get_error_message(ret))); } ret = bundle_add(bundle, "data", data.serialize().c_str()); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Unable to add data to bundle", ("bundle_add(data) error: %d, message: %s", ret, get_error_message(ret))); @@ -502,7 +501,7 @@ PlatformResult MediaControllerClient::SendCommand(const std::string& server_name ret = mc_client_send_custom_command(handle_, server_name.c_str(), command.c_str(), bundle, OnCommandReply, this); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error sending custom command", ("mc_client_send_custom_command() error: %d, message: %s", ret, get_error_message(ret))); @@ -530,7 +529,7 @@ void MediaControllerClient::OnCommandReply(const char* server_name, int result_c }; ret = bundle_get_str(bundle, "replyId", &reply_id_str); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { LoggerE("bundle_get_str(replyId) failed, error: %d", ret); return; } @@ -538,7 +537,7 @@ void MediaControllerClient::OnCommandReply(const char* server_name, int result_c reply_o["replyId"] = picojson::value(std::string(reply_id_str)); ret = bundle_get_str(bundle, "data", &data_str); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { LoggerE("bundle_get_str(data) failed, error: %d", ret); return; } @@ -569,7 +568,7 @@ PlatformResult MediaControllerClient::SendPlaybackState(const std::string& serve int ret; ret = mc_client_send_playback_state_command(handle_, server_name.c_str(), static_cast(state_e)); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error sending playback state", ("mc_client_send_playback_state_command() error: %d, message: %s", ret, get_error_message(ret))); @@ -580,21 +579,42 @@ PlatformResult MediaControllerClient::SendPlaybackState(const std::string& serve PlatformResult MediaControllerClient::SendPlaybackPosition(const std::string& server_name, double position) { - // TODO(r.galka) implement when dedicated method will be available in CAPI + ScopeLogger(); + int ret = mc_client_send_playback_position_command(handle_, server_name.c_str(), + static_cast(position)); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error sending playback position", + ("mc_client_send_playback_position_command() error: %d, message: %s", + ret, get_error_message(ret))); + } - return LogAndCreateResult(ErrorCode::NOT_SUPPORTED_ERR, "Not supported"); + return PlatformResult(ErrorCode::NO_ERROR); } PlatformResult MediaControllerClient::SendShuffleMode(const std::string& server_name, bool mode) { - // TODO(r.galka) implement when dedicated method will be available in CAPI + ScopeLogger(); + int ret = mc_client_send_shuffle_mode_command(handle_, server_name.c_str(), + mode ? MC_SHUFFLE_MODE_ON : MC_SHUFFLE_MODE_OFF); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error sending shuffle mode", + ("mc_client_send_shuffle_mode_command() error: %d, message: %s", ret, + get_error_message(ret))); + } - return LogAndCreateResult(ErrorCode::NOT_SUPPORTED_ERR, "Not supported"); + return PlatformResult(ErrorCode::NO_ERROR); } PlatformResult MediaControllerClient::SendRepeatMode(const std::string& server_name, bool mode) { - // TODO(r.galka) implement when dedicated method will be available in CAPI + ScopeLogger(); + int ret = mc_client_send_repeat_mode_command(handle_, server_name.c_str(), + mode ? MC_REPEAT_MODE_ON : MC_REPEAT_MODE_OFF); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error sending repeat mode", + ("mc_client_send_repeat_mode_command() error: %d, message: %s", ret, + get_error_message(ret))); + } - return LogAndCreateResult(ErrorCode::NOT_SUPPORTED_ERR, "Not supported"); + return PlatformResult(ErrorCode::NO_ERROR); } } // namespace mediacontroller diff --git a/src/mediacontroller/mediacontroller_client.h b/src/mediacontroller/mediacontroller_client.h index f359dc51..bb7cb8a1 100644 --- a/src/mediacontroller/mediacontroller_client.h +++ b/src/mediacontroller/mediacontroller_client.h @@ -49,8 +49,11 @@ class MediaControllerClient { const picojson::value& data, const std::string& reply_id, const JsonCallback& reply_cb); - common::PlatformResult SetServerStatusChangeListener(JsonCallback callback); - common::PlatformResult SetPlaybackInfoListener(JsonCallback callback); + common::PlatformResult SetServerStatusChangeListener(const JsonCallback& callback); + common::PlatformResult UnsetServerStatusChangeListener(); + + common::PlatformResult SetPlaybackInfoListener(const JsonCallback& callback); + common::PlatformResult UnsetPlaybackInfoListener(); private: mc_client_h handle_; diff --git a/src/mediacontroller/mediacontroller_instance.cc b/src/mediacontroller/mediacontroller_instance.cc index 5baaaa45..350c4d69 100644 --- a/src/mediacontroller/mediacontroller_instance.cc +++ b/src/mediacontroller/mediacontroller_instance.cc @@ -260,7 +260,10 @@ void MediaControllerInstance::MediaControllerServerAddChangeRequestPlaybackInfoL Instance::PostMessage(this, data->serialize().c_str()); }; - server_->SetChangeRequestPlaybackInfoListener(callback); + auto result = server_->SetChangeRequestPlaybackInfoListener(callback); + if (!result) { + LogAndReportError(result, &out); + } ReportSuccess(out); } @@ -274,7 +277,10 @@ void MediaControllerInstance::MediaControllerServerRemoveChangeRequestPlaybackIn return; } - server_->SetChangeRequestPlaybackInfoListener(nullptr); + auto result = server_->UnsetChangeRequestPlaybackInfoListener(); + if (!result) { + LogAndReportError(result, &out); + } } void MediaControllerInstance::MediaControllerServerAddCommandListener(const picojson::value& args, @@ -293,7 +299,10 @@ void MediaControllerInstance::MediaControllerServerAddCommandListener(const pico Instance::PostMessage(this, request->serialize().c_str()); }; - server_->set_command_listener(on_command); + auto result = server_->SetCommandListener(on_command); + if (!result) { + LogAndReportError(result, &out); + } ReportSuccess(out); } @@ -326,7 +335,10 @@ void MediaControllerInstance::MediaControllerServerRemoveCommandListener( return; } - server_->set_command_listener(nullptr); + auto result = server_->UnsetCommandListener(); + if (!result) { + LogAndReportError(result, &out); + } ReportSuccess(out); } @@ -625,7 +637,10 @@ void MediaControllerInstance::MediaControllerServerInfoAddServerStatusChangeList Instance::PostMessage(this, data->serialize().c_str()); }; - client_->SetServerStatusChangeListener(callback); + auto result = client_->SetServerStatusChangeListener(callback); + if (!result) { + LogAndReportError(result, &out); + } ReportSuccess(out); } @@ -639,7 +654,10 @@ void MediaControllerInstance::MediaControllerServerInfoRemoveServerStatusChangeL return; } - client_->SetServerStatusChangeListener(nullptr); + auto result = client_->UnsetServerStatusChangeListener(); + if (!result) { + LogAndReportError(result, &out); + } } void MediaControllerInstance::MediaControllerServerInfoAddPlaybackInfoChangeListener( @@ -665,7 +683,10 @@ void MediaControllerInstance::MediaControllerServerInfoAddPlaybackInfoChangeList Instance::PostMessage(this, data->serialize().c_str()); }; - client_->SetPlaybackInfoListener(callback); + auto result = client_->SetPlaybackInfoListener(callback); + if (!result) { + LogAndReportError(result, &out); + } ReportSuccess(out); } @@ -678,7 +699,10 @@ void MediaControllerInstance::MediaControllerServerInfoRemovePlaybackInfoChangeL return; } - client_->SetPlaybackInfoListener(nullptr); + auto result = client_->UnsetPlaybackInfoListener(); + if (!result) { + LogAndReportError(result, &out); + } } #undef CHECK_EXIST diff --git a/src/mediacontroller/mediacontroller_server.cc b/src/mediacontroller/mediacontroller_server.cc index 66c6b3a9..76aab28c 100644 --- a/src/mediacontroller/mediacontroller_server.cc +++ b/src/mediacontroller/mediacontroller_server.cc @@ -44,17 +44,17 @@ MediaControllerServer::MediaControllerServer() : handle_(nullptr) { MediaControllerServer::~MediaControllerServer() { ScopeLogger(); - if (handle_) { - int ret; - ret = mc_server_unset_custom_command_received_cb(handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - LoggerE("Unable to unset command callback, error: %d", ret); - } + if (nullptr != change_request_playback_info_listener_ && + !UnsetChangeRequestPlaybackInfoListener()) { + LoggerE("Failed to unset change request playback info listener"); + } - ret = mc_server_destroy(handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - LoggerE("mc_server_destroy() failed, error: %d", ret); - } + if (nullptr != command_listener_ && !UnsetCommandListener()) { + LoggerE("Failed to unset command listener"); + } + + if (nullptr != handle_ && MEDIA_CONTROLLER_ERROR_NONE != mc_server_destroy(handle_)) { + LoggerE("Unable to destroy media controller server"); } } @@ -62,19 +62,12 @@ PlatformResult MediaControllerServer::Init() { ScopeLogger(); int ret = mc_server_create(&handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Unable to create media controller server", ("mc_server_create() error: %d, message: %s", ret, get_error_message(ret))); } - ret = mc_server_set_custom_command_received_cb(handle_, OnCommandReceived, this); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to set command callback", - ("mc_server_set_custom_command_received_cb() error: %d, message: %s", - ret, get_error_message(ret))); - } - return PlatformResult(ErrorCode::NO_ERROR); } @@ -90,14 +83,14 @@ PlatformResult MediaControllerServer::SetPlaybackState(const std::string& state) } int ret = mc_server_set_playback_state(handle_, static_cast(state_int)); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error setting playback state", ("mc_server_set_playback_state() error: %d, message: %s", ret, get_error_message(ret))); } ret = mc_server_update_playback_info(handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error updating playback info", ("mc_server_update_playback_info() error: %d, message: %s", ret, get_error_message(ret))); @@ -110,14 +103,14 @@ PlatformResult MediaControllerServer::SetPlaybackPosition(double position) { ScopeLogger(); int ret = mc_server_set_playback_position(handle_, static_cast(position)); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error setting playback position", ("mc_server_set_playback_position() error: %d, message: %s", ret, get_error_message(ret))); } ret = mc_server_update_playback_info(handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error updating playback info", ("mc_server_update_playback_info() error: %d, message: %s", ret, get_error_message(ret))); @@ -130,7 +123,7 @@ PlatformResult MediaControllerServer::SetShuffleMode(bool mode) { ScopeLogger(); int ret = mc_server_update_shuffle_mode(handle_, mode ? MC_SHUFFLE_MODE_ON : MC_SHUFFLE_MODE_OFF); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error updating shuffle mode", ("mc_server_update_shuffle_mode() error: %d, message: %s", ret, get_error_message(ret))); @@ -143,7 +136,7 @@ PlatformResult MediaControllerServer::SetRepeatMode(bool mode) { ScopeLogger(); int ret = mc_server_update_repeat_mode(handle_, mode ? MC_REPEAT_MODE_ON : MC_REPEAT_MODE_OFF); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error updating repeat mode", ("mc_server_update_repeat_mode() error: %d, message: %s", ret, get_error_message(ret))); @@ -165,7 +158,7 @@ PlatformResult MediaControllerServer::SetMetadata(const picojson::object& metada ret = mc_server_set_metadata(handle_, static_cast(attribute_int), i->second.to_str().c_str()); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error setting metadata", ("mc_server_set_metadata(%s) error: %d, message: %s", i->first.c_str(), ret, get_error_message(ret))); @@ -173,7 +166,7 @@ PlatformResult MediaControllerServer::SetMetadata(const picojson::object& metada } ret = mc_server_update_metadata(handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error updating metadata", ("mc_server_update_metadata() error: %d, message: %s", ret, get_error_message(ret))); @@ -197,13 +190,13 @@ void MediaControllerServer::OnCommandReceived(const char* client_name, const cha }; ret = bundle_get_str(bundle, "data", &data_str); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { LoggerE("bundle_get_str(data) failed, error: %d", ret); return; } ret = bundle_get_str(bundle, "replyId", &reply_id_str); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { LoggerE("bundle_get_str(replyId) failed, error: %d", ret); return; } @@ -216,44 +209,15 @@ void MediaControllerServer::OnCommandReceived(const char* client_name, const cha return; } - // TODO(r.galka) CAPI have no dedicated methods for position/shuffle/repeat change. - // It should be updated when new version of CAPI will be available. - // For now implementation is using internal commands. - if (command == kInternalCommandSendPlaybackPosition) { - double position = data.get("position").get(); - server->SetPlaybackPosition(position); - server->OnPlaybackPositionCommand(client_name, static_cast(position), - server); - server->CommandReply(client_name, reply_id_str, data); - return; - } - if (command == kInternalCommandSendShuffleMode) { - bool mode = data.get("mode").get(); - server->SetShuffleMode(mode); - server->OnShuffleModeCommand(client_name, mode ? MC_SHUFFLE_MODE_ON : MC_SHUFFLE_MODE_OFF, - server); - server->CommandReply(client_name, reply_id_str, data); - return; - } - if (command == kInternalCommandSendRepeatMode) { - bool mode = data.get("mode").get(); - server->SetRepeatMode(mode); - server->OnRepeatModeCommand(client_name, mode ? MC_REPEAT_MODE_ON : MC_REPEAT_MODE_OFF, server); - server->CommandReply(client_name, reply_id_str, data); - return; - } + picojson::value request = picojson::value(picojson::object()); + picojson::object& request_o = request.get(); - if (server->command_listener_) { - picojson::value request = picojson::value(picojson::object()); - picojson::object& request_o = request.get(); + request_o["clientName"] = picojson::value(std::string(client_name)); + request_o["command"] = picojson::value(std::string(command)); + request_o["replyId"] = picojson::value(std::string(reply_id_str)); + request_o["data"] = data; - request_o["clientName"] = picojson::value(std::string(client_name)); - request_o["command"] = picojson::value(std::string(command)); - request_o["replyId"] = picojson::value(std::string(reply_id_str)); - request_o["data"] = data; - - server->command_listener_(&request); - } + server->command_listener_(&request); } PlatformResult MediaControllerServer::CommandReply(const std::string& client_name, @@ -269,21 +233,21 @@ PlatformResult MediaControllerServer::CommandReply(const std::string& client_nam }; ret = bundle_add(bundle, "replyId", reply_id.c_str()); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Unable to add replyId to bundle", ("bundle_add(replyId) error: %d, message: %s", ret, get_error_message(ret))); } ret = bundle_add(bundle, "data", data.serialize().c_str()); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Unable to add data to bundle", ("bundle_add(data) error: %d, message: %s", ret, get_error_message(ret))); } ret = mc_server_send_command_reply(handle_, client_name.c_str(), 0, bundle); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error sending command reply", ("mc_server_send_command_reply() error: %d, message: %s", ret, get_error_message(ret))); @@ -292,34 +256,130 @@ PlatformResult MediaControllerServer::CommandReply(const std::string& client_nam return PlatformResult(ErrorCode::NO_ERROR); } -PlatformResult MediaControllerServer::SetChangeRequestPlaybackInfoListener(JsonCallback callback) { +PlatformResult MediaControllerServer::SetCommandListener(const JsonCallback& callback) { ScopeLogger(); - if (callback && change_request_playback_info_listener_) { - return LogAndCreateResult(ErrorCode::INVALID_STATE_ERR, "Listener already registered"); + int ret = mc_server_set_custom_command_received_cb(handle_, OnCommandReceived, this); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to set command callback", + ("mc_server_set_custom_command_received_cb() error: %d, message: %s", + ret, get_error_message(ret))); } + command_listener_ = callback; - change_request_playback_info_listener_ = callback; + return PlatformResult(ErrorCode::NO_ERROR); +} - int ret; - if (callback) { // set platform callbacks - ret = mc_server_set_playback_state_command_received_cb(handle_, OnPlaybackStateCommand, this); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - return LogAndCreateResult( - ErrorCode::UNKNOWN_ERR, "Unable to set playback state command listener", - ("mc_server_set_playback_state_command_received_cb() error: %d, message: %s", ret, - get_error_message(ret))); - } - } else { // unset platform callbacks - ret = mc_server_unset_playback_state_command_received_cb(handle_); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - return LogAndCreateResult( - ErrorCode::UNKNOWN_ERR, "Unable to unset playback state command listener", - ("mc_server_unset_playback_state_command_received_cb() error: %d, message: %s", ret, - get_error_message(ret))); +PlatformResult MediaControllerServer::UnsetCommandListener() { + ScopeLogger(); + + int ret = mc_server_unset_custom_command_received_cb(handle_); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to unset command callback", + ("mc_server_set_custom_command_received_cb() error: %d, message: %s", + ret, get_error_message(ret))); + } + command_listener_ = nullptr; + + return PlatformResult(ErrorCode::NO_ERROR); +} + +PlatformResult MediaControllerServer::SetChangeRequestPlaybackInfoListener( + const JsonCallback& callback) { + ScopeLogger(); + int failed_setter = 0; + SCOPE_EXIT { + int (*unsetters[])(mc_server_h) = { + mc_server_unset_playback_state_command_received_cb, + mc_server_unset_playback_position_command_received_cb, + mc_server_unset_shuffle_mode_command_received_cb, + /*mc_server_unset_repeat_mode_command_received_cb the last unsetter will never be used*/}; + for (int i = 0; i < failed_setter; ++i) { + auto ret = unsetters[i](handle_); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + LoggerE("Fail (%d) returned by the [%d] unsetter", ret, i); + } } + }; + + int ret = mc_server_set_playback_state_command_received_cb(handle_, OnPlaybackStateCommand, this); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to set playback state command listener", + ("mc_server_set_playback_state_command_received_cb() error: %d, message: %s", ret, + get_error_message(ret))); + } + + ret = + mc_server_set_playback_position_command_received_cb(handle_, OnPlaybackPositionCommand, this); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + failed_setter = 1; + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to set playback position command listener", + ("mc_server_set_playback_state_command_received_cb() error: %d, message: %s", ret, + get_error_message(ret))); + } + + ret = mc_server_set_shuffle_mode_command_received_cb(handle_, OnShuffleModeCommand, this); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + failed_setter = 2; + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to set shuffle mode command listener", + ("mc_server_set_shuffle_mode_command_received_cb() error: %d, message: %s", ret, + get_error_message(ret))); + } + + ret = mc_server_set_repeat_mode_command_received_cb(handle_, OnRepeatModeCommand, this); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + failed_setter = 3; + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to set repeat mode command listener", + ("mc_server_set_repeat_mode_command_received_cb() error: %d, message: %s", ret, + get_error_message(ret))); + } + + change_request_playback_info_listener_ = callback; + + return PlatformResult(ErrorCode::NO_ERROR); +} + +PlatformResult MediaControllerServer::UnsetChangeRequestPlaybackInfoListener() { + ScopeLogger(); + + int ret = mc_server_unset_playback_state_command_received_cb(handle_); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to unset playback state command listener", + ("mc_server_unset_playback_state_command_received_cb() error: %d, message: %s", ret, + get_error_message(ret))); } + ret = mc_server_unset_playback_position_command_received_cb(handle_); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to unset playback position command listener", + ("mc_server_unset_playback_position_command_received_cb() error: %d, message: %s", ret, + get_error_message(ret))); + } + + ret = mc_server_unset_shuffle_mode_command_received_cb(handle_); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to unset shuffle mode command listener", + ("mc_server_unset_shuffle_mode_command_received_cb() error: %d, message: %s", ret, + get_error_message(ret))); + } + + ret = mc_server_unset_repeat_mode_command_received_cb(handle_); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to unset repeat mode command listener", + ("mc_server_unset_repeat_mode_command_received_cb() error: %d, message: %s", ret, + get_error_message(ret))); + } + + change_request_playback_info_listener_ = nullptr; + return PlatformResult(ErrorCode::NO_ERROR); } diff --git a/src/mediacontroller/mediacontroller_server.h b/src/mediacontroller/mediacontroller_server.h index 8654a695..31105602 100644 --- a/src/mediacontroller/mediacontroller_server.h +++ b/src/mediacontroller/mediacontroller_server.h @@ -38,14 +38,14 @@ class MediaControllerServer { common::PlatformResult SetRepeatMode(bool mode); common::PlatformResult SetMetadata(const picojson::object& metadata); - common::PlatformResult SetChangeRequestPlaybackInfoListener(JsonCallback callback); + common::PlatformResult SetChangeRequestPlaybackInfoListener(const JsonCallback& callback); + common::PlatformResult UnsetChangeRequestPlaybackInfoListener(); common::PlatformResult CommandReply(const std::string& client_name, const std::string& reply_id, const picojson::value& data); - void set_command_listener(const JsonCallback& func) { - command_listener_ = func; - } + common::PlatformResult SetCommandListener(const JsonCallback& callback); + common::PlatformResult UnsetCommandListener(); private: mc_server_h handle_; -- 2.34.1