From db604bb0b85ac1ca2e157aa6d695645737a0b66d Mon Sep 17 00:00:00 2001 From: Lukasz Bardeli Date: Wed, 24 Apr 2019 10:54:56 +0200 Subject: [PATCH] [MediaController] getItems and getAllPlaylists implemented. - getItems - server getAllPlaylists - client getAllPlaylists [Verification] Code compiles without error. Tested in chrome console ACR: TWDAPI-199 Change-Id: Idd6594b76d52eeb6e96574f2fbcd5bf82a2245dc Signed-off-by: Lukasz Bardeli --- src/mediacontroller/mediacontroller.gyp | 4 +- src/mediacontroller/mediacontroller_api.js | 113 +++++++++++++++ src/mediacontroller/mediacontroller_client.cc | 27 +++- src/mediacontroller/mediacontroller_client.h | 6 +- .../mediacontroller_instance.cc | 127 +++++++++++++++- .../mediacontroller_instance.h | 3 + src/mediacontroller/mediacontroller_server.cc | 137 ++++++++++++------ src/mediacontroller/mediacontroller_server.h | 4 +- ...ller_types.cc => mediacontroller_utils.cc} | 41 +++++- ...roller_types.h => mediacontroller_utils.h} | 10 +- 10 files changed, 406 insertions(+), 66 deletions(-) rename src/mediacontroller/{mediacontroller_types.cc => mediacontroller_utils.cc} (89%) rename src/mediacontroller/{mediacontroller_types.h => mediacontroller_utils.h} (90%) diff --git a/src/mediacontroller/mediacontroller.gyp b/src/mediacontroller/mediacontroller.gyp index 9e91e325..be5c821a 100755 --- a/src/mediacontroller/mediacontroller.gyp +++ b/src/mediacontroller/mediacontroller.gyp @@ -19,8 +19,8 @@ 'mediacontroller_instance.h', 'mediacontroller_server.cc', 'mediacontroller_server.h', - 'mediacontroller_types.cc', - 'mediacontroller_types.h', + 'mediacontroller_utils.cc', + 'mediacontroller_utils.h', ], 'conditions': [ ['tizen == 1', { diff --git a/src/mediacontroller/mediacontroller_api.js b/src/mediacontroller/mediacontroller_api.js index d8b80cb7..a7a95112 100755 --- a/src/mediacontroller/mediacontroller_api.js +++ b/src/mediacontroller/mediacontroller_api.js @@ -359,6 +359,8 @@ var MediaControllerPlaybackInfo = function(data) { var _repeatState = MediaControllerRepeatState.REPEAT_OFF; var _ageRating = MediaControllerContentAgeRating.ALL; var _metadata = new MediaControllerMetadata(); + var _index = null; + var _playlistName = null; Object.defineProperties(this, { state: { get: function() { @@ -423,6 +425,24 @@ var MediaControllerPlaybackInfo = function(data) { _metadata = edit_.isAllowed && v ? new MediaControllerMetadata(v) : _metadata; }, enumerable: true + }, + index: { + get: function() { + return _index; + }, + set: function(v) { + _index = edit_.isAllowed && v ? v : _index; + }, + enumerable: true + }, + playlistName: { + get: function() { + return _playlistName; + }, + set: function(v) { + _playlistName = edit_.isAllowed && v ? v : _playlistName; + }, + enumerable: true } }); @@ -742,8 +762,41 @@ MediaControllerServer.prototype.updatePlaybackItem = function(playlistName, inde if (native_.isFailure(result)) { throw native_.getErrorObject(result); } + + edit_.allow(); + this.playbackInfo.index = args.index; + this.playbackInfo.playlistName = args.playlistName; + edit_.disallow(); }; +MediaControllerServer.prototype.getAllPlaylists = function(successCallback, errorCallback) { + var args = validator_.validateArgs(arguments, [ + {name: 'successCallback', type: types_.FUNCTION, optional: false, nullable: false}, + {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true} + ]); + + var callback = function(result) { + if (native_.isFailure(result)) { + native_.callIfPossible(args.errorCallback, native_.getErrorObject(result)); + return; + } + var data = native_.getResultObject(result); + var playlists = []; + + for(var i = 0; i < data.length; i++) { + playlists.push(new MediaControllerPlaylist(data[i])); + } + + native_.callIfPossible(args.successCallback, playlists); + }; + + var result = native_.call('MediaControllerServer_getAllPlaylists', {}, callback); + + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } +} + function MediaControllerClient() {} MediaControllerClient.prototype.findServers = function(successCallback, errorCallback) { @@ -1031,6 +1084,34 @@ MediaControllerServerInfo.prototype.removePlaybackInfoChangeListener = function( } }; +MediaControllerServerInfo.prototype.getAllPlaylists = function(successCallback, errorCallback) { + var args = validator_.validateArgs(arguments, [ + {name: 'successCallback', type: types_.FUNCTION, optional: false, nullable: false}, + {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true} + ]); + + var callback = function(result) { + if (native_.isFailure(result)) { + native_.callIfPossible(args.errorCallback, native_.getErrorObject(result)); + return; + } + var data = native_.getResultObject(result); + var playlists = []; + + for(var i = 0; i < data.length; i++) { + playlists.push(new MediaControllerPlaylist(data[i])); + } + + native_.callIfPossible(args.successCallback, playlists); + }; + + var result = native_.call('MediaControllerServerInfo_getAllPlaylists', {name:this.name}, callback); + + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } +} + MediaControllerServerInfo.prototype.sendPlaybackItem = function(playlistName, index, state, position) { var args = validator_.validateArgs(arguments, [ {name: 'playlistName', type: types_.STRING}, @@ -1172,4 +1253,36 @@ MediaControllerPlaylist.prototype.addItem = function(index, metadata) { } } +MediaControllerPlaylist.prototype.getItems = function(successCallback, errorCallback) { + var args = validator_.validateArgs(arguments, [ + {name: 'successCallback', type: types_.FUNCTION, optional: false, nullable: false}, + {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true} + ]); + + var data = { + name: this.name + }; + + var callback = function(result) { + if (native_.isFailure(result)) { + native_.callIfPossible(args.errorCallback, native_.getErrorObject(result)); + return; + } + var data = native_.getResultObject(result); + var items = []; + + for(var i = 0; i < data.length; i++) { + items.push(new MediaControllerPlaylistItem(data[i])); + } + + native_.callIfPossible(args.successCallback, items); + }; + + var result = native_.call('MediaControllerPlaylist_getItems', data, callback); + + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } +} + exports = new MediaControllerManager(); diff --git a/src/mediacontroller/mediacontroller_client.cc b/src/mediacontroller/mediacontroller_client.cc index 68d85de2..0899a3f7 100644 --- a/src/mediacontroller/mediacontroller_client.cc +++ b/src/mediacontroller/mediacontroller_client.cc @@ -24,8 +24,6 @@ #include "common/scope_exit.h" #include "common/tools.h" -#include "mediacontroller/mediacontroller_types.h" - namespace extension { namespace mediacontroller { @@ -179,6 +177,8 @@ PlatformResult MediaControllerClient::GetPlaybackInfo(const std::string& server_ ScopeLogger(); int ret; + char* index = nullptr; + char* playlist_name = nullptr; mc_playback_h playback_h; ret = mc_client_get_server_playback_info(handle_, server_name.c_str(), &playback_h); if (MEDIA_CONTROLLER_ERROR_NONE != ret) { @@ -189,6 +189,8 @@ PlatformResult MediaControllerClient::GetPlaybackInfo(const std::string& server_ SCOPE_EXIT { mc_client_destroy_playback(playback_h); + free(index); + free(playlist_name); }; // playback state @@ -240,6 +242,13 @@ PlatformResult MediaControllerClient::GetPlaybackInfo(const std::string& server_ return result; } + ret = mc_client_get_playlist_item_info(playback_h, &playlist_name, &index); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Error getting playlistName and index", + ("mc_client_get_playlist_item_info() error: %d, message: %s", ret, get_error_message(ret))); + } + // fill return object (*playback_info)["state"] = picojson::value(state); (*playback_info)["position"] = picojson::value(position); @@ -247,6 +256,10 @@ PlatformResult MediaControllerClient::GetPlaybackInfo(const std::string& server_ (*playback_info)["shuffleMode"] = picojson::value(shuffle == MC_SHUFFLE_MODE_ON); (*playback_info)["repeatMode"] = picojson::value(repeat == MC_REPEAT_MODE_ON); (*playback_info)["metadata"] = metadata; + (*playback_info)["index"] = picojson::value(std::string(index ? index : "")); + (*playback_info)["playlistName"] = + picojson::value(std::string(playlist_name ? playlist_name : "")); + ; return PlatformResult(ErrorCode::NO_ERROR); } @@ -721,13 +734,15 @@ 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) { +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); + MediaControllerClient* client = static_cast(user_data); picojson::value data = picojson::value(picojson::object()); - picojson::object &data_o = data.get(); + picojson::object& data_o = data.get(); if (MC_PLAYLIST_UPDATED == mode) { // Create or Update playlist diff --git a/src/mediacontroller/mediacontroller_client.h b/src/mediacontroller/mediacontroller_client.h index 177945b8..7acfbc38 100644 --- a/src/mediacontroller/mediacontroller_client.h +++ b/src/mediacontroller/mediacontroller_client.h @@ -22,7 +22,7 @@ #include "common/platform_result.h" -#include "mediacontroller/mediacontroller_types.h" +#include "mediacontroller/mediacontroller_utils.h" namespace extension { namespace mediacontroller { @@ -79,8 +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); + 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 dc45e99c..1dd1fb5b 100644 --- a/src/mediacontroller/mediacontroller_instance.cc +++ b/src/mediacontroller/mediacontroller_instance.cc @@ -16,6 +16,7 @@ #include "mediacontroller/mediacontroller_instance.h" +#include "common/current_application.h" #include "common/logger.h" #include "common/picojson.h" #include "common/platform_result.h" @@ -23,7 +24,7 @@ #include "common/task-queue.h" #include "common/tools.h" -#include "mediacontroller/mediacontroller_types.h" +#include "mediacontroller/mediacontroller_utils.h" namespace extension { namespace mediacontroller { @@ -76,6 +77,7 @@ MediaControllerInstance::MediaControllerInstance() { REGISTER_ASYNC("MediaControllerServer_deletePlaylist", MediaControllerServerDeletePlaylist); REGISTER_SYNC("MediaControllerServer_updatePlaybackItem", MediaControllerServerUpdatePlaybackItem); + REGISTER_ASYNC("MediaControllerServer_getAllPlaylists", MediaControllerServerGetAllPlaylists); // client REGISTER_SYNC("MediaControllerManager_getClient", MediaControllerManagerGetClient); @@ -108,9 +110,12 @@ MediaControllerInstance::MediaControllerInstance() { MediaControllerServerInfoAddPlaylistUpdateListener); REGISTER_SYNC("MediaControllerServerInfo_removePlaylistUpdatedListener", MediaControllerServerInfoRemovePlaylistUpdateListener); + REGISTER_ASYNC("MediaControllerServerInfo_getAllPlaylists", + MediaControllerServerInfoGetAllPlaylists); // playlist REGISTER_SYNC("MediaControllerPlaylist_addItem", MediaControllerPlaylistAddItem); + REGISTER_ASYNC("MediaControllerPlaylist_getItems", MediaControllerPlaylistGetItems); #undef REGISTER_SYNC #undef REGISTER_ASYNC @@ -522,6 +527,44 @@ void MediaControllerInstance::MediaControllerServerUpdatePlaybackItem(const pico ReportSuccess(out); } +void MediaControllerInstance::MediaControllerServerGetAllPlaylists(const picojson::value& args, + picojson::object& out) { + ScopeLogger(); + + auto get = [this, args]() -> void { + picojson::value response = picojson::value(picojson::object()); + picojson::object& response_obj = response.get(); + + response_obj["callbackId"] = args.get("callbackId"); + + std::string app_id = common::CurrentApplication::GetInstance().GetApplicationId(); + + if (app_id.empty()) { + LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Error while get playlists"), + &response_obj, ("CurrentApplication::GetInstance().GetApplicationId()")); + Instance::PostMessage(this, response.serialize().c_str()); + return; + } + + picojson::value playlists{picojson::array{}}; + auto result = utils::GetAllPlaylists(app_id, &playlists.get()); + + if (!result) { + LogAndReportError(result, &response_obj, ("Failed: utils::GetAllPlaylists")); + Instance::PostMessage(this, response.serialize().c_str()); + return; + } + + response_obj["result"] = picojson::value{playlists}; + ReportSuccess(response_obj); + Instance::PostMessage(this, response.serialize().c_str()); + }; + + TaskQueue::GetInstance().Async(get); + + ReportSuccess(out); +} + void MediaControllerInstance::MediaControllerManagerGetClient(const picojson::value& args, picojson::object& out) { ScopeLogger(); @@ -817,7 +860,6 @@ void MediaControllerInstance::MediaControllerServerInfoSendCommand(const picojso if (result) { ReportSuccess(out); - out["requestId"] = picojson::value(std::string(request_id)); } else { LogAndReportError(result, &out, ("Failed to send command.")); } @@ -991,8 +1033,41 @@ void MediaControllerInstance::MediaControllerServerInfoRemovePlaylistUpdateListe ReportSuccess(out); } -void MediaControllerInstance::MediaControllerPlaylistAddItem( - const picojson::value& args, picojson::object& out) { +void MediaControllerInstance::MediaControllerServerInfoGetAllPlaylists(const picojson::value& args, + picojson::object& out) { + ScopeLogger(); + + CHECK_ARGS(args, "name", std::string, out) + + auto get = [this, args]() -> void { + picojson::value response = picojson::value(picojson::object()); + picojson::object& response_obj = response.get(); + + response_obj["callbackId"] = args.get("callbackId"); + + picojson::value playlists{picojson::array{}}; + + auto result = utils::GetAllPlaylists(args.get("name").get(), + &playlists.get()); + + if (!result) { + LogAndReportError(result, &response_obj, ("Failed: utils::GetAllPlaylists")); + Instance::PostMessage(this, response.serialize().c_str()); + return; + } + + response_obj["result"] = picojson::value{playlists}; + ReportSuccess(response_obj); + Instance::PostMessage(this, response.serialize().c_str()); + }; + + TaskQueue::GetInstance().Async(get); + + ReportSuccess(out); +} + +void MediaControllerInstance::MediaControllerPlaylistAddItem(const picojson::value& args, + picojson::object& out) { ScopeLogger(); // MediaControllerPlaylistAddItem is implemented in MediaControllerServer because @@ -1004,7 +1079,7 @@ void MediaControllerInstance::MediaControllerPlaylistAddItem( } CHECK_ARGS(args, "index", std::string, out) - CHECK_ARGS(args, "metadata",picojson::object, out) + CHECK_ARGS(args, "metadata", picojson::object, out) CHECK_ARGS(args, "name", std::string, out) const picojson::object& metadata = args.get("metadata").get(); @@ -1019,6 +1094,48 @@ void MediaControllerInstance::MediaControllerPlaylistAddItem( ReportSuccess(out); } +void MediaControllerInstance::MediaControllerPlaylistGetItems(const picojson::value& args, + picojson::object& out) { + ScopeLogger(); + + // MediaControllerPlaylistGetItems is implemented in MediaControllerServer because + // mc_playlist_foreach_item need mc_playlist_h as parameter which is already stored in server + if (!server_) { + LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out, + ("Failed: server_")); + return; + } + CHECK_EXIST(args, "callbackId", out) + CHECK_ARGS(args, "name", std::string, out) + + auto get = [this, args]() -> void { + picojson::value response = picojson::value(picojson::object()); + picojson::object& response_obj = response.get(); + + response_obj["callbackId"] = args.get("callbackId"); + + picojson::value items{picojson::array{}}; + + auto result = server_->MediaControllerPlaylistGetItems(args.get("name").get(), + &items.get()); + + if (!result) { + LogAndReportError(result, &response_obj, + ("Failed: server_->MediaControllerPlaylistGetItems")); + Instance::PostMessage(this, response.serialize().c_str()); + return; + } + + response_obj["result"] = picojson::value{items}; + ReportSuccess(response_obj); + Instance::PostMessage(this, response.serialize().c_str()); + }; + + TaskQueue::GetInstance().Async(get); + + ReportSuccess(out); +} + #undef CHECK_EXIST } // namespace mediacontroller diff --git a/src/mediacontroller/mediacontroller_instance.h b/src/mediacontroller/mediacontroller_instance.h index ee9b976a..a614174b 100644 --- a/src/mediacontroller/mediacontroller_instance.h +++ b/src/mediacontroller/mediacontroller_instance.h @@ -55,6 +55,7 @@ class MediaControllerInstance : public common::ParsedInstance { void MediaControllerServerSavePlaylist(const picojson::value& args, picojson::object& out); void MediaControllerServerDeletePlaylist(const picojson::value& args, picojson::object& out); void MediaControllerServerUpdatePlaybackItem(const picojson::value& args, picojson::object& out); + void MediaControllerServerGetAllPlaylists(const picojson::value& args, picojson::object& out); // client void MediaControllerManagerGetClient(const picojson::value& args, picojson::object& out); @@ -83,9 +84,11 @@ class MediaControllerInstance : public common::ParsedInstance { picojson::object& out); void MediaControllerServerInfoRemovePlaylistUpdateListener(const picojson::value& args, picojson::object& out); + void MediaControllerServerInfoGetAllPlaylists(const picojson::value& args, picojson::object& out); // playlist void MediaControllerPlaylistAddItem(const picojson::value& args, picojson::object& out); + void MediaControllerPlaylistGetItems(const picojson::value& args, picojson::object& out); std::shared_ptr client_; std::shared_ptr server_; diff --git a/src/mediacontroller/mediacontroller_server.cc b/src/mediacontroller/mediacontroller_server.cc index 73a39adb..b8de4842 100644 --- a/src/mediacontroller/mediacontroller_server.cc +++ b/src/mediacontroller/mediacontroller_server.cc @@ -23,8 +23,6 @@ #include "common/scope_exit.h" #include "common/tools.h" -#include "mediacontroller/mediacontroller_types.h" - namespace extension { namespace mediacontroller { @@ -54,6 +52,7 @@ MediaControllerServer::~MediaControllerServer() { if (nullptr != command_listener_ && !UnsetCommandListener()) { LoggerE("Failed to unset command listener"); } + for (auto const& v : playlist_handle_map_) { if (MEDIA_CONTROLLER_ERROR_NONE != mc_playlist_destroy(v.second)) { LoggerE("Unable to destroy playlist %s", v.first.c_str()); @@ -274,7 +273,8 @@ PlatformResult MediaControllerServer::SetMetadata(const picojson::object& metada } void MediaControllerServer::OnCommandReceived(const char* client_name, const char* request_id, - const char* command, bundle* bundle, void* user_data) { + const char* command, bundle* bundle, + void* user_data) { ScopeLogger(); MediaControllerServer* server = static_cast(user_data); @@ -367,11 +367,13 @@ PlatformResult MediaControllerServer::UnsetCommandListener() { return PlatformResult(ErrorCode::NO_ERROR); } -PlatformResult MediaControllerServer::CreatePlaylist(const std::string& name, picojson::value* playlist_info) { +PlatformResult MediaControllerServer::CreatePlaylist(const std::string& name, + picojson::value* playlist_info) { ScopeLogger(); if (playlist_handle_map_.find(name) != playlist_handle_map_.end()) { - return LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR, "Playlist with given name already exists"); + return LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR, + "Playlist with given name already exists"); } mc_playlist_h playlist_handle_ = nullptr; @@ -379,9 +381,9 @@ PlatformResult MediaControllerServer::CreatePlaylist(const std::string& name, pi int ret = mc_server_create_playlist(handle_, name.c_str(), &playlist_handle_); if (MEDIA_CONTROLLER_ERROR_NONE != ret) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to createPlaylist", - ("mc_server_create_playlist() error: %d, message: %s", - ret, get_error_message(ret))); + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Unable to createPlaylist", + ("mc_server_create_playlist() error: %d, message: %s", ret, get_error_message(ret))); } playlist_handle_map_[name] = playlist_handle_; @@ -402,15 +404,16 @@ PlatformResult MediaControllerServer::SavePlaylist(const std::string& name) { ScopeLogger(); if (playlist_handle_map_.find(name) == playlist_handle_map_.end()) { - return LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR, "Playlist with given name doesn't exist"); + return LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR, + "Playlist with given name doesn't exist"); } int ret = mc_server_update_playlist_done(handle_, playlist_handle_map_[name]); if (MEDIA_CONTROLLER_ERROR_NONE != ret) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error saving playlist", - ("mc_server_update_playlist_done() error: %d, message: %s", ret, - get_error_message(ret))); + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Error saving playlist", + ("mc_server_update_playlist_done() error: %d, message: %s", ret, get_error_message(ret))); } return PlatformResult(ErrorCode::NO_ERROR); @@ -420,15 +423,16 @@ PlatformResult MediaControllerServer::DeletePlaylist(const std::string& name) { ScopeLogger(); if (playlist_handle_map_.find(name) == playlist_handle_map_.end()) { - return LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR, "Playlist with given name doesn't exist"); + return LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR, + "Playlist with given name doesn't exist"); } int ret = mc_server_delete_playlist(handle_, playlist_handle_map_[name]); if (MEDIA_CONTROLLER_ERROR_NONE != ret) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error deleting playlist", - ("mc_server_delete_playlist() error: %d, message: %s", ret, - get_error_message(ret))); + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Error deleting playlist", + ("mc_server_delete_playlist() error: %d, message: %s", ret, get_error_message(ret))); } playlist_handle_map_.erase(name); @@ -436,19 +440,21 @@ PlatformResult MediaControllerServer::DeletePlaylist(const std::string& name) { return PlatformResult(ErrorCode::NO_ERROR); } -PlatformResult MediaControllerServer::UpdatePlaybackItem(const std::string& playlist_name, const std::string& index) { +PlatformResult MediaControllerServer::UpdatePlaybackItem(const std::string& playlist_name, + const std::string& index) { ScopeLogger(); if (playlist_handle_map_.find(playlist_name) == playlist_handle_map_.end()) { - return LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR, "Playlist with given name doesn't exist"); + return LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR, + "Playlist with given name doesn't exist"); } int ret = mc_server_set_playlist_item_info(handle_, playlist_name.c_str(), index.c_str()); if (MEDIA_CONTROLLER_ERROR_NONE != ret) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error updating playback item", - ("mc_server_set_playlist_item_info() error: %d, message: %s", ret, - get_error_message(ret))); + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Error updating playback item", + ("mc_server_set_playlist_item_info() error: %d, message: %s", ret, get_error_message(ret))); } ret = mc_server_update_playback_info(handle_); @@ -458,22 +464,19 @@ PlatformResult MediaControllerServer::UpdatePlaybackItem(const std::string& play ("mc_server_update_playback_info() error: %d, message: %s", ret, get_error_message(ret))); } - return PlatformResult(ErrorCode::NO_ERROR); } -PlatformResult MediaControllerServer::MediaControllerPlaylistAddItem(const std::string &name, const std::string &index, - const picojson::object &metadata) -{ +PlatformResult MediaControllerServer::MediaControllerPlaylistAddItem( + const std::string& name, const std::string& index, const picojson::object& metadata) { ScopeLogger(); - if (playlist_handle_map_.find(name) == playlist_handle_map_.end()) - { - return LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR, "Playlist with given name doesn't exist"); + if (playlist_handle_map_.find(name) == playlist_handle_map_.end()) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Playlist with given name doesn't exist"); } int attribute_int = MC_META_MEDIA_TITLE, ret = MEDIA_CONTROLLER_ERROR_NONE; - for (const auto& v: metadata) { + for (const auto& v : metadata) { LoggerD("Key: %s - Value: %s ", v.first.c_str(), v.second.to_str().c_str()); PlatformResult result = Types::StringToPlatformEnum(Types::kMediaControllerMetadataAttribute, @@ -482,14 +485,57 @@ PlatformResult MediaControllerServer::MediaControllerPlaylistAddItem(const std:: return result; } - ret = mc_server_add_item_to_playlist(handle_, playlist_handle_map_[name], index.c_str(), static_cast(attribute_int), + ret = mc_server_add_item_to_playlist(handle_, playlist_handle_map_[name], index.c_str(), + static_cast(attribute_int), v.second.to_str().c_str()); - if (MEDIA_CONTROLLER_ERROR_NONE != ret) - { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error adding playlist item", - ("mc_server_add_item_to_playlist() error: %d, message: %s", ret, - get_error_message(ret))); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Error adding playlist item", + ("mc_server_add_item_to_playlist() error: %d, message: %s", ret, get_error_message(ret))); + } + } + + return PlatformResult(ErrorCode::NO_ERROR); +} + +PlatformResult MediaControllerServer::MediaControllerPlaylistGetItems(const std::string& name, + picojson::array* items) { + ScopeLogger(); + + if (playlist_handle_map_.find(name) == playlist_handle_map_.end()) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Playlist with given name doesn't exist"); + } + + auto OnPlaylistItemCommand = [](const char* index, mc_metadata_h metadata, + void* user_data) -> bool { + ScopeLogger(); + + auto items = static_cast(user_data); + + picojson::value metadata_v = picojson::value(picojson::object()); + picojson::object& metadata_obj = metadata_v.get(); + + auto result = Types::ConvertMetadata(metadata, &metadata_obj); + if (!result) { + return false; } + + picojson::value value = picojson::value(picojson::object()); + picojson::object& obj = value.get(); + + obj.insert(std::make_pair("index", picojson::value{index})); + obj.insert(std::make_pair("metadata", metadata_v)); + items->push_back(value); + + return true; + }; + + int ret = mc_playlist_foreach_item(playlist_handle_map_[name], OnPlaylistItemCommand, items); + + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Error while get playlist item", + ("mc_playlist_foreach_item() error: %d, message: %s", ret, get_error_message(ret))); } return PlatformResult(ErrorCode::NO_ERROR); @@ -508,8 +554,7 @@ PlatformResult MediaControllerServer::SetChangeRequestPlaybackInfoListener( int (*unsetters[])(mc_server_h) = { mc_server_unset_playback_action_cmd_received_cb, mc_server_unset_playback_position_cmd_received_cb, - mc_server_unset_shuffle_mode_cmd_received_cb, - mc_server_unset_repeat_mode_cmd_received_cb, + mc_server_unset_shuffle_mode_cmd_received_cb, mc_server_unset_repeat_mode_cmd_received_cb, /*mc_server_unset_playlist_cmd_received_cb the last unsetter will never be used*/}; // This loop is no-op in case of success. @@ -560,7 +605,8 @@ PlatformResult MediaControllerServer::SetChangeRequestPlaybackInfoListener( ret = mc_server_set_playlist_cmd_received_cb(handle_, OnPlaybackItemCommand, this); if (MEDIA_CONTROLLER_ERROR_NONE != ret) { failed_setter = 4; - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to set playback item command listener", + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, + "Unable to set playback item command listener", ("mc_server_set_playlist_cmd_received_cb() error: %d, message: %s", ret, get_error_message(ret))); } @@ -607,10 +653,10 @@ PlatformResult MediaControllerServer::UnsetChangeRequestPlaybackInfoListener() { ret = mc_server_unset_playlist_cmd_received_cb(handle_); if (MEDIA_CONTROLLER_ERROR_NONE != ret) { - return LogAndCreateResult( - ErrorCode::UNKNOWN_ERR, "Unable to unset playback item command listener", - ("mc_server_unset_playlist_cmd_received_cb() error: %d, message: %s", ret, - get_error_message(ret))); + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, + "Unable to unset playback item command listener", + ("mc_server_unset_playlist_cmd_received_cb() error: %d, message: %s", + ret, get_error_message(ret))); } change_request_playback_info_listener_ = nullptr; @@ -735,9 +781,10 @@ void MediaControllerServer::OnRepeatModeCommand(const char* client_name, const c server->change_request_playback_info_listener_(&data); } -void MediaControllerServer::OnPlaybackItemCommand(const char* client_name, const char *request_id, - const char *playlist_name, const char *index, mc_playback_action_e action, - unsigned long long position, void *user_data) { +void MediaControllerServer::OnPlaybackItemCommand(const char* client_name, const char* request_id, + const char* playlist_name, const char* index, + mc_playback_action_e action, + unsigned long long position, void* user_data) { ScopeLogger(); MediaControllerServer* server = static_cast(user_data); diff --git a/src/mediacontroller/mediacontroller_server.h b/src/mediacontroller/mediacontroller_server.h index 9ddd321a..7b990fef 100644 --- a/src/mediacontroller/mediacontroller_server.h +++ b/src/mediacontroller/mediacontroller_server.h @@ -21,7 +21,7 @@ #include #include "common/platform_result.h" -#include "mediacontroller/mediacontroller_types.h" +#include "mediacontroller/mediacontroller_utils.h" namespace extension { namespace mediacontroller { @@ -57,6 +57,8 @@ class MediaControllerServer { common::PlatformResult MediaControllerPlaylistAddItem(const std::string& name, const std::string& index, const picojson::object& metadata); + common::PlatformResult MediaControllerPlaylistGetItems(const std::string& name, + picojson::array* items); private: mc_server_h handle_; diff --git a/src/mediacontroller/mediacontroller_types.cc b/src/mediacontroller/mediacontroller_utils.cc similarity index 89% rename from src/mediacontroller/mediacontroller_types.cc rename to src/mediacontroller/mediacontroller_utils.cc index 3c03d5db..e643c858 100644 --- a/src/mediacontroller/mediacontroller_types.cc +++ b/src/mediacontroller/mediacontroller_utils.cc @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "mediacontroller/mediacontroller_types.h" +#include "mediacontroller/mediacontroller_utils.h" #include @@ -249,5 +249,44 @@ PlatformResult Types::ConvertMetadata(mc_metadata_h metadata_h, picojson::object return PlatformResult(ErrorCode::NO_ERROR); } +PlatformResult utils::GetAllPlaylists(const std::string& app_id, picojson::array* playlists) { + ScopeLogger(); + + auto OnPlaylists = [](mc_playlist_h playlist, void* user_data) -> bool { + + char* name = nullptr; + + SCOPE_EXIT { + free(name); + }; + + int ret = mc_playlist_get_name(playlist, &name); + + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return false; + } + + auto playlists = static_cast(user_data); + + picojson::value value = picojson::value(picojson::object()); + picojson::object& obj = value.get(); + + obj.insert(std::make_pair("name", picojson::value{name})); + playlists->push_back(value); + + return true; + }; + + int ret = mc_playlist_foreach_playlist(app_id.c_str(), OnPlaylists, playlists); + + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Error while get playlists", + ("mc_playlist_foreach_playlist() error: %d, message: %s", ret, get_error_message(ret))); + } + + return PlatformResult(ErrorCode::NO_ERROR); +} + } // namespace mediacontroller } // namespace extension diff --git a/src/mediacontroller/mediacontroller_types.h b/src/mediacontroller/mediacontroller_utils.h similarity index 90% rename from src/mediacontroller/mediacontroller_types.h rename to src/mediacontroller/mediacontroller_utils.h index dc0ed4f9..97dff6a1 100644 --- a/src/mediacontroller/mediacontroller_types.h +++ b/src/mediacontroller/mediacontroller_utils.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef MEDIACONTROLLER_MEDIACONTROLLER_TYPES_H_ -#define MEDIACONTROLLER_MEDIACONTROLLER_TYPES_H_ +#ifndef MEDIACONTROLLER_MEDIACONTROLLER_UTILS_H_ +#define MEDIACONTROLLER_MEDIACONTROLLER_UTILS_H_ #include #include @@ -62,7 +62,11 @@ class Types { static PlatformEnumReverseMap platform_enum_reverse_map_; }; +namespace utils { +common::PlatformResult GetAllPlaylists(const std::string& app_id, picojson::array* playlists); +} + } // namespace mediacontroller } // namespace extension -#endif // MEDIACONTROLLER_MEDIACONTROLLER_TYPES_H_ +#endif // MEDIACONTROLLER_MEDIACONTROLLER_UTILS_H_ -- 2.34.1