[MediaController] Refactoring internal implementation into dedicated CAPI 59/182859/1
authorSzymon Jastrzebski <s.jastrzebsk@partner.samsung.com>
Wed, 13 Dec 2017 09:31:43 +0000 (10:31 +0100)
committerSzymon Jastrzebski <s.jastrzebsk@partner.samsung.com>
Thu, 28 Jun 2018 09:18:22 +0000 (11:18 +0200)
[Verification] TCT pass rates: 100% A 100% M

Change-Id: Id01a8988a122d0055f662eabe066a4b3f35bb48b
Signed-off-by: Szymon Jastrzebski <s.jastrzebsk@partner.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_server.cc
src/mediacontroller/mediacontroller_server.h

index f8b3db5c0cf1380702558833afde26b1287c2173..fa7160bf7dc570d294940420e03a7f08962ae494 100755 (executable)
@@ -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) {
index e6597e5102b809778f62d13e7bdb4380f2e0e4ce..950ab6f8364944f20dc9787427b2cc5d5b60b492 100644 (file)
@@ -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<mc_playback_states_e>(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<unsigned long long>(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
index f359dc5167de401e85a736aa57e010f33869fb06..bb7cb8a1c11804ed65ac2844979b00544af895ef 100644 (file)
@@ -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_;
index 5baaaa455d4bab1b607eeb9404ef6f45d3a78f33..350c4d698b7f74585eb814f12daaf06acbbdd2fc 100644 (file)
@@ -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
index 66c6b3a9938b640c8f02e8ddc26b4c19c1d99a98..76aab28ca171dc87448904552ed499f4e1c5b156 100644 (file)
@@ -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<mc_playback_states_e>(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<unsigned long long>(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<mc_meta_e>(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<double>();
-    server->SetPlaybackPosition(position);
-    server->OnPlaybackPositionCommand(client_name, static_cast<unsigned long long>(position),
-                                      server);
-    server->CommandReply(client_name, reply_id_str, data);
-    return;
-  }
-  if (command == kInternalCommandSendShuffleMode) {
-    bool mode = data.get("mode").get<bool>();
-    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<bool>();
-    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<picojson::object>();
 
-  if (server->command_listener_) {
-    picojson::value request = picojson::value(picojson::object());
-    picojson::object& request_o = request.get<picojson::object>();
+  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);
 }
 
index 8654a69532c957ebe42541ac47fe487b52dd1834..311056023f8b68fc85afdb1db84668b919147f20 100644 (file)
@@ -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_;