From 668f9ca33587cd1ad880e5d3a18beb499c3f64db Mon Sep 17 00:00:00 2001 From: Lukasz Bardeli Date: Thu, 18 Apr 2019 07:46:26 +0200 Subject: [PATCH] [MediaController] Add listener playlist updated. Add methods - addPlaylistUpdatedListener - removePlaylistUpdatedListener [Verification] Code compiles without error. Tested in chrome console ACR: TWDAPI-199 Change-Id: Iec717785c4e12ad464d9a302d1b1ccc98ff16acf Signed-off-by: Lukasz Bardeli --- src/mediacontroller/mediacontroller_api.js | 48 +++++++++++++++ src/mediacontroller/mediacontroller_client.cc | 59 ++++++++++++++++++- src/mediacontroller/mediacontroller_client.h | 5 ++ .../mediacontroller_instance.cc | 58 +++++++++++++++++- .../mediacontroller_instance.h | 4 ++ 5 files changed, 171 insertions(+), 3 deletions(-) diff --git a/src/mediacontroller/mediacontroller_api.js b/src/mediacontroller/mediacontroller_api.js index b1e450a6..d8b80cb7 100755 --- a/src/mediacontroller/mediacontroller_api.js +++ b/src/mediacontroller/mediacontroller_api.js @@ -182,6 +182,15 @@ var ServerInfoPlaybackInfoListener = new ListenerManager(native_, '_ServerInfoPl } }); +var ServerInfoPlaylistUpdatedListener = new ListenerManager(native_, '_ServerInfoPlaylistUpdatedListener', function(msg, listener) { + if (msg.action === 'onplaylistupdated') { + listener[msg.action](msg.serverName, new MediaControllerPlaylist(msg)); + } + if (msg.action === 'onplaylistdeleted') { + listener[msg.action](msg.serverName, msg.name); + } +}); + var EditManager = function() { this.isAllowed = false; }; @@ -1045,6 +1054,45 @@ MediaControllerServerInfo.prototype.sendPlaybackItem = function(playlistName, in } }; +MediaControllerServerInfo.prototype.addPlaylistUpdatedListener = function(listener) { + var args = validator_.validateArgs(arguments, [{ + name: 'listener', + type: types_.LISTENER, + values: [ + 'onplaylistupdated', + 'onplaylistdeleted' + ] + }]); + + if (type_.isEmptyObject(ServerInfoPlaylistUpdatedListener.listeners)) { + var result = native_.callSync( + 'MediaControllerServerInfo_addPlaylistUpdatedListener', { + listenerId: ServerInfoPlaylistUpdatedListener.listenerName + }); + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } + } + + return ServerInfoPlaylistUpdatedListener.addListener(args.listener, this.name); +}; + +MediaControllerServerInfo.prototype.removePlaylistUpdatedListener = function(watchId) { + var args = validator_.validateArgs(arguments, [ + {name: 'watchId', type: types_.LONG} + ]); + + ServerInfoPlaylistUpdatedListener.removeListener(args.watchId); + + if (type_.isEmptyObject(ServerInfoPlaylistUpdatedListener.listeners)) { + var result = native_.callSync('MediaControllerServerInfo_removePlaylistUpdatedListener'); + + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } + } +}; + var MediaControllerPlaylistItem = function(data) { var _index = ""; var _metadata = new MediaControllerMetadata(); diff --git a/src/mediacontroller/mediacontroller_client.cc b/src/mediacontroller/mediacontroller_client.cc index dfb4bbb2..68d85de2 100644 --- a/src/mediacontroller/mediacontroller_client.cc +++ b/src/mediacontroller/mediacontroller_client.cc @@ -55,6 +55,10 @@ MediaControllerClient::~MediaControllerClient() { LoggerE("Failed to unset playback info listener"); } + if (nullptr != playlist_update_listener_ && !UnsetPlaylistUpdateListener()) { + LoggerE("Failed to unset playlist update listener"); + } + if (nullptr != handle_ && MEDIA_CONTROLLER_ERROR_NONE != mc_client_destroy(handle_)) { LoggerE("Unable to destroy media controller client"); } @@ -514,7 +518,7 @@ PlatformResult MediaControllerClient::SendCommand(const std::string& server_name } ret = - mc_client_send_custom_cmd(handle_, server_name.c_str(), command.c_str(), bundle, &request_id); + mc_client_send_custom_cmd(handle_, server_name.c_str(), command.c_str(), bundle, request_id); if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error sending custom command", @@ -717,5 +721,58 @@ PlatformResult MediaControllerClient::SendPlaybackItem(const std::string& name, return PlatformResult(ErrorCode::NO_ERROR); } +void MediaControllerClient::OnPlaylistUpdate(const char *server_name, mc_playlist_update_mode_e mode, + const char *playlist_name, mc_playlist_h playlist, void *user_data) { + ScopeLogger(); + MediaControllerClient *client = static_cast(user_data); + + picojson::value data = picojson::value(picojson::object()); + picojson::object &data_o = data.get(); + + if (MC_PLAYLIST_UPDATED == mode) { + // Create or Update playlist + data_o["action"] = picojson::value(std::string("onplaylistupdated")); + } else { + data_o["action"] = picojson::value(std::string("onplaylistdeleted")); + } + + data_o["name"] = picojson::value(std::string(playlist_name)); + data_o["serverName"] = picojson::value(std::string(server_name)); + + client->playlist_update_listener_(&data); +} + +PlatformResult MediaControllerClient::SetPlaylistUpdateListener(const JsonCallback& callback) { + ScopeLogger(); + + int ret = mc_client_set_playlist_updated_cb(handle_, OnPlaylistUpdate, this); + + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to add playlist listener", + ("mc_client_set_playlist_updated_cb() error: %d, message: %s", ret, + get_error_message(ret))); + } + + playlist_update_listener_ = callback; + + return PlatformResult(ErrorCode::NO_ERROR); +} + +PlatformResult MediaControllerClient::UnsetPlaylistUpdateListener() { + ScopeLogger(); + + int ret = mc_client_unset_playlist_updated_cb(handle_); + + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to remove playlist listener", + ("mc_client_unset_playlist_updated_cb() error: %d, message: %s", ret, + get_error_message(ret))); + } + + playlist_update_listener_ = nullptr; + + return PlatformResult(ErrorCode::NO_ERROR); +} + } // namespace mediacontroller } // namespace extension diff --git a/src/mediacontroller/mediacontroller_client.h b/src/mediacontroller/mediacontroller_client.h index e55bda1c..177945b8 100644 --- a/src/mediacontroller/mediacontroller_client.h +++ b/src/mediacontroller/mediacontroller_client.h @@ -58,6 +58,8 @@ class MediaControllerClient { common::PlatformResult SendPlaybackItem(const std::string& name, const std::string& playlist_name, const std::string& index, const std::string& state, double position); + common::PlatformResult SetPlaylistUpdateListener(const JsonCallback& callback); + common::PlatformResult UnsetPlaylistUpdateListener(); private: mc_client_h handle_; @@ -65,6 +67,7 @@ class MediaControllerClient { JsonCallback playback_info_listener_; JsonCallback server_status_listener_; JsonCallback command_reply_callback_; + JsonCallback playlist_update_listener_; static bool FindServersCallback(const char* server_name, void* user_data); @@ -76,6 +79,8 @@ class MediaControllerClient { static void OnShuffleModeUpdate(const char* server_name, mc_shuffle_mode_e mode, void* user_data); static void OnRepeatModeUpdate(const char* server_name, mc_repeat_mode_e mode, void* user_data); static void OnMetadataUpdate(const char* server_name, mc_metadata_h metadata_h, void* user_data); + static void OnPlaylistUpdate(const char *server_name, mc_playlist_update_mode_e mode, + const char *playlist_name, mc_playlist_h playlist, void *user_data); }; } // namespace mediacontroller diff --git a/src/mediacontroller/mediacontroller_instance.cc b/src/mediacontroller/mediacontroller_instance.cc index f1be7fa0..dc45e99c 100644 --- a/src/mediacontroller/mediacontroller_instance.cc +++ b/src/mediacontroller/mediacontroller_instance.cc @@ -104,6 +104,10 @@ MediaControllerInstance::MediaControllerInstance() { MediaControllerServerInfoRemovePlaybackInfoChangeListener); REGISTER_SYNC("MediaControllerServerInfo_sendPlaybackItem", MediaControllerServerInfoSendPlaybackItem); + REGISTER_SYNC("MediaControllerServerInfo_addPlaylistUpdatedListener", + MediaControllerServerInfoAddPlaylistUpdateListener); + REGISTER_SYNC("MediaControllerServerInfo_removePlaylistUpdatedListener", + MediaControllerServerInfoRemovePlaylistUpdateListener); // playlist REGISTER_SYNC("MediaControllerPlaylist_addItem", MediaControllerPlaylistAddItem); @@ -318,6 +322,7 @@ void MediaControllerInstance::MediaControllerServerAddChangeRequestPlaybackInfoL LoggerE("No data passed to json callback"); return; } + picojson::object& request_o = data->get(); request_o["listenerId"] = args.get("listenerId"); @@ -937,8 +942,57 @@ void MediaControllerInstance::MediaControllerServerInfoSendPlaybackItem(const pi ReportSuccess(out); } -void MediaControllerInstance::MediaControllerPlaylistAddItem(const picojson::value& args, - picojson::object& out) { +void MediaControllerInstance::MediaControllerServerInfoAddPlaylistUpdateListener( + const picojson::value& args, picojson::object& out) { + ScopeLogger(); + if (!client_) { + LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out, + ("Failed: client_")); + return; + } + + CHECK_EXIST(args, "listenerId", out) + + JsonCallback callback = [this, args](picojson::value* data) -> void { + if (!data) { + LoggerE("No data passed to json callback"); + return; + } + + picojson::object& request_o = data->get(); + request_o["listenerId"] = args.get("listenerId"); + + Instance::PostMessage(this, data->serialize().c_str()); + }; + + auto result = client_->SetPlaylistUpdateListener(callback); + if (!result) { + LogAndReportError(result, &out); + return; + } + + ReportSuccess(out); +} + +void MediaControllerInstance::MediaControllerServerInfoRemovePlaylistUpdateListener( + const picojson::value& args, picojson::object& out) { + if (!client_) { + LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out, + ("Failed: client_")); + return; + } + + auto result = client_->UnsetPlaylistUpdateListener(); + if (!result) { + LogAndReportError(result, &out); + return; + } + + ReportSuccess(out); +} + +void MediaControllerInstance::MediaControllerPlaylistAddItem( + const picojson::value& args, picojson::object& out) { ScopeLogger(); // MediaControllerPlaylistAddItem is implemented in MediaControllerServer because diff --git a/src/mediacontroller/mediacontroller_instance.h b/src/mediacontroller/mediacontroller_instance.h index 078e7020..ee9b976a 100644 --- a/src/mediacontroller/mediacontroller_instance.h +++ b/src/mediacontroller/mediacontroller_instance.h @@ -79,6 +79,10 @@ class MediaControllerInstance : public common::ParsedInstance { picojson::object& out); void MediaControllerServerInfoSendPlaybackItem(const picojson::value& args, picojson::object& out); + void MediaControllerServerInfoAddPlaylistUpdateListener(const picojson::value& args, + picojson::object& out); + void MediaControllerServerInfoRemovePlaylistUpdateListener(const picojson::value& args, + picojson::object& out); // playlist void MediaControllerPlaylistAddItem(const picojson::value& args, picojson::object& out); -- 2.34.1