[MediaController] Adding, updating and sending item. 47/200047/11
authorLukasz Bardeli <l.bardeli@samsung.com>
Wed, 17 Apr 2019 05:38:44 +0000 (07:38 +0200)
committerLukasz Bardeli <l.bardeli@samsung.com>
Wed, 17 Apr 2019 05:38:44 +0000 (07:38 +0200)
Add methods
- addItem
- updatePlaybackItem
- sendPlaybackItem
Add callback
- onplaybackitemrequest

[Verification] Code compiles without error. Tested in chrome console
ACR: TWDAPI-199

Signed-off-by: Lukasz Bardeli <l.bardeli@samsung.com>
Change-Id: Iffeec9bc0473f9a9df54d3fbd5a57dfc3ca21913

src/mediacontroller/mediacontroller_api.js
src/mediacontroller/mediacontroller_client.cc
src/mediacontroller/mediacontroller_client.h
src/mediacontroller/mediacontroller_instance.cc
src/mediacontroller/mediacontroller_instance.h
src/mediacontroller/mediacontroller_server.cc
src/mediacontroller/mediacontroller_server.h

index 269fde940752732fbca2a61d6efe04c91a759c5f..b1e450a6729fde03777449ebcc93dfa2cc307d61 100755 (executable)
@@ -153,6 +153,10 @@ var ServerPlaybackInfoListener = new ListenerManager(native_, '_ServerPlaybackIn
   if (msg.action === 'onrepeatstaterequest') {
     listener[msg.action](msg.state, msg.clientName);
   }
+  if (msg.action === 'onplaybackitemrequest') {
+    listener[msg.action](msg.playlistName, msg.index, msg.state, msg.position, msg.clientName);
+  }
+
 });
 
 var ServerInfoStatusListener = new ListenerManager(native_, '_ServerInfoStatusListener', function(msg, listener) {
@@ -585,7 +589,8 @@ MediaControllerServer.prototype.addChangeRequestPlaybackInfoListener = function(
       'onplaybackpositionrequest',
       'onshufflemoderequest',
       'onrepeatmoderequest',
-      'onrepeatstaterequest'
+      'onrepeatstaterequest',
+      'onplaybackitemrequest'
     ]
   }]);
 
@@ -712,6 +717,24 @@ MediaControllerServer.prototype.deletePlaylist = function(name, successCallback,
   }
 };
 
+MediaControllerServer.prototype.updatePlaybackItem = function(playlistName, index) {
+  var args = validator_.validateArgs(arguments, [
+    {name: 'playlistName', type: types_.STRING},
+    {name: 'index', type: types_.STRING}
+  ]);
+
+  var data = {
+    playlistName: args.playlistName,
+    index: args.index
+  };
+
+  var result = native_.callSync('MediaControllerServer_updatePlaybackItem', data);
+
+  if (native_.isFailure(result)) {
+    throw native_.getErrorObject(result);
+  }
+};
+
 function MediaControllerClient() {}
 
 MediaControllerClient.prototype.findServers = function(successCallback, errorCallback) {
@@ -999,6 +1022,29 @@ MediaControllerServerInfo.prototype.removePlaybackInfoChangeListener = function(
   }
 };
 
+MediaControllerServerInfo.prototype.sendPlaybackItem = function(playlistName, index, state, position) {
+  var args = validator_.validateArgs(arguments, [
+    {name: 'playlistName', type: types_.STRING},
+    {name: 'index', type: types_.STRING},
+    {name: 'state', type: types_.ENUM, values: Object.keys(MediaControllerPlaybackState)},
+    {name: 'position', type: types_.UNSIGNED_LONG_LONG}
+  ]);
+
+  var data = {
+    name: this.name,
+    playlistName: args.playlistName,
+    index: args.index,
+    state: args.state,
+    position: args.position
+  };
+
+  var result = native_.callSync('MediaControllerServerInfo_sendPlaybackItem', data);
+
+  if (native_.isFailure(result)) {
+    throw native_.getErrorObject(result);
+  }
+};
+
 var MediaControllerPlaylistItem = function(data) {
   var _index = "";
   var _metadata = new MediaControllerMetadata();
@@ -1059,4 +1105,23 @@ function MediaControllerPlaylist(data) {
   edit_.disallow();
 }
 
+MediaControllerPlaylist.prototype.addItem = function(index, metadata) {
+  var args = validator_.validateArgs(arguments, [
+    {name: 'index', type: types_.STRING},
+    {name: 'metadata', type: types_.DICTIONARY}
+  ]);
+
+  var data = {
+    index: args.index,
+    metadata: args.metadata,
+    name: this.name
+  };
+
+  var result = native_.callSync('MediaControllerPlaylist_addItem', data);
+
+  if (native_.isFailure(result)) {
+    throw native_.getErrorObject(result);
+  }
+}
+
 exports = new MediaControllerManager();
index c2c59d7d0e65b33c2bcd08dd77e5f2272d58a50f..dfb4bbb285f77c4555ce1eb085bf16c64ca9db16 100644 (file)
@@ -498,8 +498,7 @@ void MediaControllerClient::OnMetadataUpdate(const char* server_name, mc_metadat
 PlatformResult MediaControllerClient::SendCommand(const std::string& server_name,
                                                   const std::string& command,
                                                   const picojson::value& data,
-                                                  const JsonCallback& reply_cb,
-                                                  char** request_id) {
+                                                  const JsonCallback& reply_cb, char** request_id) {
   ScopeLogger();
   bundle* bundle = bundle_create();
   SCOPE_EXIT {
@@ -689,5 +688,34 @@ PlatformResult MediaControllerClient::SendRepeatState(const std::string& server_
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
+PlatformResult MediaControllerClient::SendPlaybackItem(const std::string& name,
+                                                       const std::string& playlist_name,
+                                                       const std::string& index,
+                                                       const std::string& state, double position) {
+  ScopeLogger();
+
+  int state_e;
+  // In Native API, since Tizen 5.0 an action instead of a state is sent to change the state of a
+  // server. In Web API the names were not refactored.
+  PlatformResult result =
+      Types::StringToPlatformEnum(Types::kMediaControllerPlaybackAction, state, &state_e);
+
+  if (!result) {
+    return result;
+  }
+
+  int ret = mc_client_send_playlist_cmd(handle_, name.c_str(), playlist_name.c_str(), index.c_str(),
+                                        static_cast<mc_playback_action_e>(state_e),
+                                        static_cast<unsigned long long>(position), nullptr);
+
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(
+        ErrorCode::UNKNOWN_ERR, "Error sending playlist item",
+        ("mc_client_send_playlist_cmd() error: %d, message: %s", ret, get_error_message(ret)));
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
 }  // namespace mediacontroller
 }  // namespace extension
index f10243c1c9270d981766859a89ede9455bb1fcc2..e55bda1c93f9264835413e2af939837737a25a6b 100644 (file)
@@ -55,6 +55,9 @@ class MediaControllerClient {
 
   common::PlatformResult SetPlaybackInfoListener(const JsonCallback& callback);
   common::PlatformResult UnsetPlaybackInfoListener();
+  common::PlatformResult SendPlaybackItem(const std::string& name, const std::string& playlist_name,
+                                          const std::string& index, const std::string& state,
+                                          double position);
 
  private:
   mc_client_h handle_;
index 6d350ece18c26f1171aa6591288400e97783ca31..f1be7fa081e00b44e660e79dbf77d730d713b0cb 100644 (file)
@@ -19,9 +19,9 @@
 #include "common/logger.h"
 #include "common/picojson.h"
 #include "common/platform_result.h"
+#include "common/scope_exit.h"
 #include "common/task-queue.h"
 #include "common/tools.h"
-#include "common/scope_exit.h"
 
 #include "mediacontroller/mediacontroller_types.h"
 
@@ -71,12 +71,11 @@ MediaControllerInstance::MediaControllerInstance() {
   REGISTER_SYNC("MediaControllerServer_replyCommand", MediaControllerServerReplyCommand);
   REGISTER_SYNC("MediaControllerServer_removeCommandListener",
                 MediaControllerServerRemoveCommandListener);
-  REGISTER_SYNC("MediaControllerServer_createPlaylist",
-                MediaControllerServerCreatePlaylist);
-  REGISTER_ASYNC("MediaControllerServer_savePlaylist",
-                MediaControllerServerSavePlaylist);
-  REGISTER_ASYNC("MediaControllerServer_deletePlaylist",
-                MediaControllerServerDeletePlaylist);
+  REGISTER_SYNC("MediaControllerServer_createPlaylist", MediaControllerServerCreatePlaylist);
+  REGISTER_ASYNC("MediaControllerServer_savePlaylist", MediaControllerServerSavePlaylist);
+  REGISTER_ASYNC("MediaControllerServer_deletePlaylist", MediaControllerServerDeletePlaylist);
+  REGISTER_SYNC("MediaControllerServer_updatePlaybackItem",
+                MediaControllerServerUpdatePlaybackItem);
 
   // client
   REGISTER_SYNC("MediaControllerManager_getClient", MediaControllerManagerGetClient);
@@ -103,6 +102,11 @@ MediaControllerInstance::MediaControllerInstance() {
                 MediaControllerServerInfoAddPlaybackInfoChangeListener);
   REGISTER_SYNC("MediaControllerServerInfo_removePlaybackInfoChangeListener",
                 MediaControllerServerInfoRemovePlaybackInfoChangeListener);
+  REGISTER_SYNC("MediaControllerServerInfo_sendPlaybackItem",
+                MediaControllerServerInfoSendPlaybackItem);
+
+  // playlist
+  REGISTER_SYNC("MediaControllerPlaylist_addItem", MediaControllerPlaylistAddItem);
 
 #undef REGISTER_SYNC
 #undef REGISTER_ASYNC
@@ -119,6 +123,17 @@ MediaControllerInstance::~MediaControllerInstance() {
     return;                                                                                       \
   }
 
+#define CHECK_TYPE(args, name, type, out)                                                    \
+  if (!args.get(name).is<type>()) {                                                          \
+    LogAndReportError(PlatformResult(ErrorCode::TYPE_MISMATCH_ERR, name " is not a " #type), \
+                      &out);                                                                 \
+    return;                                                                                  \
+  }
+
+#define CHECK_ARGS(args, name, type, out) \
+  CHECK_EXIST(args, name, out)            \
+  CHECK_TYPE(args, name, type, out)
+
 void MediaControllerInstance::MediaControllerManagerCreateServer(const picojson::value& args,
                                                                  picojson::object& out) {
   ScopeLogger();
@@ -303,7 +318,6 @@ void MediaControllerInstance::MediaControllerServerAddChangeRequestPlaybackInfoL
       LoggerE("No data passed to json callback");
       return;
     }
-
     picojson::object& request_o = data->get<picojson::object>();
     request_o["listenerId"] = args.get("listenerId");
 
@@ -370,10 +384,8 @@ void MediaControllerInstance::MediaControllerServerReplyCommand(const picojson::
   CHECK_EXIST(args, "requestId", out)
   CHECK_EXIST(args, "data", out)
 
-  server_->CommandReply(
-    args.get("clientName").get<std::string>(),
-    args.get("requestId").get<std::string>(),
-    args.get("data"));
+  server_->CommandReply(args.get("clientName").get<std::string>(),
+                        args.get("requestId").get<std::string>(), args.get("data"));
 
   ReportSuccess(out);
 }
@@ -395,8 +407,8 @@ void MediaControllerInstance::MediaControllerServerRemoveCommandListener(
   ReportSuccess(out);
 }
 
-void MediaControllerInstance::MediaControllerServerCreatePlaylist(
-    const picojson::value& args, picojson::object& out) {
+void MediaControllerInstance::MediaControllerServerCreatePlaylist(const picojson::value& args,
+                                                                  picojson::object& out) {
   ScopeLogger();
   if (!server_) {
     LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out,
@@ -404,7 +416,7 @@ void MediaControllerInstance::MediaControllerServerCreatePlaylist(
     return;
   }
 
-  CHECK_EXIST(args, "name", out)
+  CHECK_ARGS(args, "name", std::string, out)
 
   picojson::value playlist_info = picojson::value();
 
@@ -417,8 +429,8 @@ void MediaControllerInstance::MediaControllerServerCreatePlaylist(
   ReportSuccess(playlist_info, out);
 }
 
-void MediaControllerInstance::MediaControllerServerSavePlaylist(
-    const picojson::value& args, picojson::object& out) {
+void MediaControllerInstance::MediaControllerServerSavePlaylist(const picojson::value& args,
+                                                                picojson::object& out) {
   ScopeLogger();
   if (!server_) {
     LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out,
@@ -427,7 +439,7 @@ void MediaControllerInstance::MediaControllerServerSavePlaylist(
   }
 
   CHECK_EXIST(args, "callbackId", out)
-  CHECK_EXIST(args, "name", out)
+  CHECK_ARGS(args, "name", std::string, out)
 
   auto save = [this, args]() -> void {
     picojson::value response = picojson::value(picojson::object());
@@ -450,8 +462,8 @@ void MediaControllerInstance::MediaControllerServerSavePlaylist(
   ReportSuccess(out);
 }
 
-void MediaControllerInstance::MediaControllerServerDeletePlaylist(
-    const picojson::value& args, picojson::object& out) {
+void MediaControllerInstance::MediaControllerServerDeletePlaylist(const picojson::value& args,
+                                                                  picojson::object& out) {
   ScopeLogger();
   if (!server_) {
     LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out,
@@ -460,7 +472,7 @@ void MediaControllerInstance::MediaControllerServerDeletePlaylist(
   }
 
   CHECK_EXIST(args, "callbackId", out)
-  CHECK_EXIST(args, "name", out)
+  CHECK_ARGS(args, "name", std::string, out)
 
   auto del = [this, args]() -> void {
     picojson::value response = picojson::value(picojson::object());
@@ -483,6 +495,28 @@ void MediaControllerInstance::MediaControllerServerDeletePlaylist(
   ReportSuccess(out);
 }
 
+void MediaControllerInstance::MediaControllerServerUpdatePlaybackItem(const picojson::value& args,
+                                                                      picojson::object& out) {
+  ScopeLogger();
+  if (!server_) {
+    LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out,
+                      ("Failed: server_"));
+    return;
+  }
+
+  CHECK_ARGS(args, "playlistName", std::string, out)
+  CHECK_ARGS(args, "index", std::string, out)
+
+  auto result = server_->UpdatePlaybackItem(args.get("playlistName").get<std::string>(),
+                                            args.get("index").get<std::string>());
+  if (!result) {
+    LogAndReportError(result, &out);
+    return;
+  }
+
+  ReportSuccess(out);
+}
+
 void MediaControllerInstance::MediaControllerManagerGetClient(const picojson::value& args,
                                                               picojson::object& out) {
   ScopeLogger();
@@ -772,12 +806,9 @@ void MediaControllerInstance::MediaControllerServerInfoSendCommand(const picojso
     free(request_id);
   };
 
-  PlatformResult result = client_->SendCommand(
-      args.get("name").get<std::string>(),
-      args.get("command").get<std::string>(),
-      args.get("data"),
-      reply_cb,
-      &request_id);
+  PlatformResult result = client_->SendCommand(args.get("name").get<std::string>(),
+                                               args.get("command").get<std::string>(),
+                                               args.get("data"), reply_cb, &request_id);
 
   if (result) {
     ReportSuccess(out);
@@ -878,6 +909,62 @@ void MediaControllerInstance::MediaControllerServerInfoRemovePlaybackInfoChangeL
   }
 }
 
+void MediaControllerInstance::MediaControllerServerInfoSendPlaybackItem(const picojson::value& args,
+                                                                        picojson::object& out) {
+  ScopeLogger();
+
+  if (!client_) {
+    LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Client not initialized."), &out,
+                      ("Failed: client_"));
+    return;
+  }
+
+  CHECK_ARGS(args, "name", std::string, out)
+  CHECK_ARGS(args, "playlistName", std::string, out)
+  CHECK_ARGS(args, "index", std::string, out)
+  CHECK_ARGS(args, "state", std::string, out)
+  CHECK_ARGS(args, "position", double, out)
+
+  auto result = client_->SendPlaybackItem(
+      args.get("name").get<std::string>(), args.get("playlistName").get<std::string>(),
+      args.get("index").get<std::string>(), args.get("state").get<std::string>(),
+      args.get("position").get<double>());
+  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
+  // mc_server_add_item_to_playlist need mc_server_h as parameter
+  if (!server_) {
+    LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Server not initialized."), &out,
+                      ("Failed: server_"));
+    return;
+  }
+
+  CHECK_ARGS(args, "index", std::string, out)
+  CHECK_ARGS(args, "metadata",picojson::object, out)
+  CHECK_ARGS(args, "name", std::string, out)
+
+  const picojson::object& metadata = args.get("metadata").get<picojson::object>();
+
+  auto result = server_->MediaControllerPlaylistAddItem(
+      args.get("name").get<std::string>(), args.get("index").get<std::string>(), metadata);
+  if (!result) {
+    LogAndReportError(result, &out);
+    return;
+  }
+
+  ReportSuccess(out);
+}
+
 #undef CHECK_EXIST
 
 }  // namespace mediacontroller
index 227da85cf9fd39f65f105d9b60ce06fccf26a705..078e70201b49c45a1037dbc6c970f01a0e2376a5 100644 (file)
@@ -54,6 +54,7 @@ class MediaControllerInstance : public common::ParsedInstance {
   void MediaControllerServerCreatePlaylist(const picojson::value& args, picojson::object& out);
   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);
 
   // client
   void MediaControllerManagerGetClient(const picojson::value& args, picojson::object& out);
@@ -76,6 +77,11 @@ class MediaControllerInstance : public common::ParsedInstance {
                                                               picojson::object& out);
   void MediaControllerServerInfoRemovePlaybackInfoChangeListener(const picojson::value& args,
                                                                  picojson::object& out);
+  void MediaControllerServerInfoSendPlaybackItem(const picojson::value& args,
+                                                 picojson::object& out);
+
+  // playlist
+  void MediaControllerPlaylistAddItem(const picojson::value& args, picojson::object& out);
 
   std::shared_ptr<MediaControllerClient> client_;
   std::shared_ptr<MediaControllerServer> server_;
index 973ea8577f97cfecfa90ff0834db5e1a0f99a5f5..73a39adb5b7e5275ced49fdda3528ccd4553b42b 100644 (file)
@@ -54,7 +54,6 @@ 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());
@@ -275,8 +274,7 @@ 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<MediaControllerServer*>(user_data);
@@ -438,10 +436,70 @@ PlatformResult MediaControllerServer::DeletePlaylist(const std::string& name) {
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
+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");
+  }
+
+  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)));
+  }
+
+  ret = mc_server_update_playback_info(handle_);
+  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)));
+  }
+
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+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");
+  }
+
+  int attribute_int = MC_META_MEDIA_TITLE, ret = MEDIA_CONTROLLER_ERROR_NONE;
+  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,
+                                                        v.first, &attribute_int);
+    if (!result) {
+      return result;
+    }
+
+    ret = mc_server_add_item_to_playlist(handle_, playlist_handle_map_[name], index.c_str(),  static_cast<mc_meta_e>(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)));
+    }
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
 PlatformResult MediaControllerServer::SetChangeRequestPlaybackInfoListener(
     const JsonCallback& callback) {
   ScopeLogger();
   int failed_setter = 0;
+
   SCOPE_EXIT {
     // Lambda function used to clean all set listeners (in case of failure of
     // SetPlaybackInfoListener method).
@@ -451,7 +509,8 @@ PlatformResult MediaControllerServer::SetChangeRequestPlaybackInfoListener(
         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 the last unsetter will never be used*/};
+        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.
     for (int i = 0; i < failed_setter; ++i) {
@@ -498,6 +557,14 @@ PlatformResult MediaControllerServer::SetChangeRequestPlaybackInfoListener(
                                ret, get_error_message(ret)));
   }
 
+  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",
+                              ("mc_server_set_playlist_cmd_received_cb() error: %d, message: %s",
+                               ret, get_error_message(ret)));
+  }
+
   change_request_playback_info_listener_ = callback;
 
   return PlatformResult(ErrorCode::NO_ERROR);
@@ -538,6 +605,14 @@ PlatformResult MediaControllerServer::UnsetChangeRequestPlaybackInfoListener() {
          get_error_message(ret)));
   }
 
+  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)));
+  }
+
   change_request_playback_info_listener_ = nullptr;
 
   return PlatformResult(ErrorCode::NO_ERROR);
@@ -660,5 +735,34 @@ 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) {
+  ScopeLogger();
+
+  MediaControllerServer* server = static_cast<MediaControllerServer*>(user_data);
+
+  std::string state;
+  PlatformResult result = Types::PlatformEnumToString(Types::kMediaControllerPlaybackAction,
+                                                      static_cast<int>(action), &state);
+
+  if (!result) {
+    LoggerE("PlatformEnumToString failed, error: %s", result.message().c_str());
+    return;
+  }
+
+  picojson::value data = picojson::value(picojson::object());
+  picojson::object& data_o = data.get<picojson::object>();
+
+  data_o["action"] = picojson::value(std::string("onplaybackitemrequest"));
+  data_o["playlistName"] = picojson::value(playlist_name);
+  data_o["index"] = picojson::value(index);
+  data_o["state"] = picojson::value(state);
+  data_o["position"] = picojson::value(static_cast<double>(position));
+  data_o["clientName"] = picojson::value(client_name);
+
+  server->change_request_playback_info_listener_(&data);
+}
+
 }  // namespace mediacontroller
 }  // namespace extension
index 55476db1cdd160184b6eb66dad695d985e4981d7..9ddd321a5801bbee4f5f7d6a8e8a5a76f6e1158e 100644 (file)
@@ -52,6 +52,11 @@ class MediaControllerServer {
   common::PlatformResult CreatePlaylist(const std::string& name, picojson::value* playlist_info);
   common::PlatformResult SavePlaylist(const std::string& name);
   common::PlatformResult DeletePlaylist(const std::string& name);
+  common::PlatformResult UpdatePlaybackItem(const std::string& name, const std::string& index);
+
+  common::PlatformResult MediaControllerPlaylistAddItem(const std::string& name,
+                                                        const std::string& index,
+                                                        const picojson::object& metadata);
 
  private:
   mc_server_h handle_;
@@ -76,6 +81,10 @@ class MediaControllerServer {
                                    mc_shuffle_mode_e mode, void* user_data);
   static void OnRepeatModeCommand(const char* client_name, const char* request_id,
                                   mc_repeat_mode_e mode, void* user_data);
+  static void 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);
 
   static void OnCommandReceived(const char* client_name, const char* request_id,
                                 const char* command, bundle* data, void* user_data);