[MediaController] Server status listener
authorRafal Galka <r.galka@samsung.com>
Thu, 23 Apr 2015 08:56:46 +0000 (10:56 +0200)
committerRafal Galka <r.galka@samsung.com>
Tue, 28 Apr 2015 10:25:18 +0000 (19:25 +0900)
Change-Id: Ic5b89245c0242c2a5310b0de34771678780b0320
Signed-off-by: Rafal Galka <r.galka@samsung.com>
src/mediacontroller/mediacontroller_api.js
src/mediacontroller/mediacontroller_client.cc
src/mediacontroller/mediacontroller_client.h
src/mediacontroller/mediacontroller_instance.cc

index 1c1b774..d41e3a4 100644 (file)
@@ -77,18 +77,7 @@ var ServerPlaybackInfoListener = new ListenerManager(native_, '_ServerPlaybackIn
 });
 
 var ServerInfoStatusListener = new ListenerManager(native_, '_ServerInfoStatusListener', function(msg, listener) {
-  if (msg.action === 'onplaybackstaterequest') {
-    listener[msg.action](msg.state);
-  }
-  if (msg.action === 'onplaybackpositionrequest') {
-    listener[msg.action](msg.position);
-  }
-  if (msg.action === 'onshufflemoderequest' || msg.action === 'onrepeatmoderequest') {
-    listener[msg.action](msg.mode);
-  }
-  if (msg.action === 'onmetadatachanged') {
-    listener[msg.action](new MediaControllerMetadata(msg.metadata));
-  }
+  listener(msg.state);
 });
 
 var ServerInfoPlaybackInfoListener = new ListenerManager(native_, '_ServerInfoPlaybackInfoListener', function(msg, listener) {
index 2fd88b4..d36a8ca 100644 (file)
@@ -231,6 +231,70 @@ PlatformResult MediaControllerClient::GetMetadata(
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
+PlatformResult MediaControllerClient::SetServerStatusChangeListener(
+    JsonCallback callback) {
+
+  if (callback && server_status_listener_) {
+    LOGGER(ERROR) << "Listener already registered";
+    return PlatformResult(ErrorCode::INVALID_STATE_ERR,
+                          "Listener already registered");
+  }
+
+  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) {
+      LOGGER(ERROR) << "Unable to set server status listener, error: " << ret;
+      return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                            "Unable to set server status listener");
+    }
+
+  } else { // unset platform callbacks
+
+    ret = mc_client_unset_server_update_cb(handle_);
+    if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+      LOGGER(ERROR) << "Unable to unset server status listener, error: " << ret;
+      return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                            "Unable to unset server status listener");
+    }
+
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+void MediaControllerClient::OnServerStatusUpdate(const char* server_name,
+                                                 mc_server_state_e state,
+                                                 void* user_data) {
+  LOGGER(DEBUG) << "entered";
+
+  MediaControllerClient* client = static_cast<MediaControllerClient*>(user_data);
+
+  if (!client->server_status_listener_) {
+    LOGGER(DEBUG) << "No server status listener registered, skipping";
+    return;
+  }
+
+  // server state
+  std::string state_str;
+  PlatformResult result = Types::PlatformEnumToString(
+      Types::kMediaControllerServerState, static_cast<int>(state), &state_str);
+  if (!result) {
+    LOGGER(ERROR) << "PlatformEnumToString failed, error: " << result.message();
+    return;
+  }
+
+  picojson::value data = picojson::value(picojson::object());
+  picojson::object& data_o = data.get<picojson::object>();
+
+  data_o["state"] = picojson::value(state_str);
+
+  client->server_status_listener_(&data);
+}
+
 PlatformResult MediaControllerClient::SetPlaybackInfoListener(
     JsonCallback callback) {
 
index eb36266..8cf04b3 100644 (file)
@@ -31,12 +31,19 @@ class MediaControllerClient {
   common::PlatformResult SendPlaybackState(const std::string& server_name,
                                            const std::string& state);
 
+  common::PlatformResult SetServerStatusChangeListener(JsonCallback callback);
   common::PlatformResult SetPlaybackInfoListener(JsonCallback callback);
+
  private:
   mc_client_h handle_;
   JsonCallback playback_info_listener_;
+  JsonCallback server_status_listener_;
 
   static bool FindServersCallback(const char* server_name, void* user_data);
+
+  static void OnServerStatusUpdate(const char *server_name,
+                                   mc_server_state_e state,
+                                   void *user_data);
   static void OnPlaybackUpdate(const char *server_name,
                                mc_playback_h playback,
                                void *user_data);
index f171f09..229383d 100644 (file)
@@ -529,28 +529,47 @@ void MediaControllerInstance::MediaControllerServerInfoSendCommand(
 void MediaControllerInstance::MediaControllerServerInfoAddServerStatusChangeListener(
     const picojson::value& args,
     picojson::object& out) {
+  LOGGER(DEBUG) << "entered";
 
-  // implement it
+  if (!client_) {
+    ReportError(PlatformResult(ErrorCode::INVALID_STATE_ERR,
+                               "Client not initialized."), &out);
+    return;
+  }
 
-  // if success
-  // ReportSuccess(out);
-  // if error
-  // ReportError(out);
+  CHECK_EXIST(args, "listenerId", out)
+
+  JsonCallback callback = [this, args](picojson::value* data) -> void {
+    LOGGER(DEBUG) << "entered";
+
+    if (nullptr == data) {
+      LOGGER(ERROR) << "No data passed to json callback";
+      return;
+    }
+
+    picojson::object& request_o = data->get<picojson::object>();
+    request_o["listenerId"] = args.get("listenerId");
+
+    PostMessage(data->serialize().c_str());
+  };
+
+  client_->SetServerStatusChangeListener(callback);
+
+  ReportSuccess(out);
 }
 
 void MediaControllerInstance::MediaControllerServerInfoRemoveServerStatusChangeListener(
     const picojson::value& args,
     picojson::object& out) {
-  CHECK_EXIST(args, "watchId", out)
-
-  double watchId = args.get("watchId").get<double>();
+  LOGGER(DEBUG) << "entered";
 
-  // implement it
+  if (!client_) {
+    ReportError(PlatformResult(ErrorCode::INVALID_STATE_ERR,
+                               "Client not initialized."), &out);
+    return;
+  }
 
-  // if success
-  // ReportSuccess(out);
-  // if error
-  // ReportError(out);
+  client_->SetServerStatusChangeListener(nullptr);
 }
 
 void MediaControllerInstance::MediaControllerServerInfoAddPlaybackInfoChangeListener(