[MediaController] Add listener playlist updated. 54/200154/10
authorLukasz Bardeli <l.bardeli@samsung.com>
Thu, 18 Apr 2019 05:46:26 +0000 (07:46 +0200)
committerLukasz Bardeli <l.bardeli@samsung.com>
Thu, 18 Apr 2019 05:46:26 +0000 (07:46 +0200)
Add methods
- addPlaylistUpdatedListener
- removePlaylistUpdatedListener

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

Change-Id: Iec717785c4e12ad464d9a302d1b1ccc98ff16acf
Signed-off-by: Lukasz Bardeli <l.bardeli@samsung.com>
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

index b1e450a6729fde03777449ebcc93dfa2cc307d61..d8b80cb7a32025beef3f5b468127dc548af2f691 100755 (executable)
@@ -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();
index dfb4bbb285f77c4555ce1eb085bf16c64ca9db16..68d85de2328516377da45a8e9b4b44df6df6f958 100644 (file)
@@ -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<MediaControllerClient *>(user_data);
+
+  picojson::value data = picojson::value(picojson::object());
+  picojson::object &data_o = data.get<picojson::object>();
+
+  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
index e55bda1c93f9264835413e2af939837737a25a6b..177945b8f91f6e1f390964f64d0d32225fa5df06 100644 (file)
@@ -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
index f1be7fa081e00b44e660e79dbf77d730d713b0cb..dc45e99c91c3b858efb81702bd83382ea2140166 100644 (file)
@@ -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<picojson::object>();
     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<picojson::object>();
+    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
index 078e70201b49c45a1037dbc6c970f01a0e2376a5..ee9b976a3641fe121d1e52e0cca8cd6886529cf6 100644 (file)
@@ -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);