[mediacontroller] Add MediaControllerClient::SetCustomEventListener() 68/215468/3
authorMichal Michalski <m.michalski2@partner.samsung.com>
Tue, 8 Oct 2019 13:10:50 +0000 (15:10 +0200)
committerPiotr Kosko <p.kosko@samsung.com>
Wed, 9 Oct 2019 04:53:39 +0000 (04:53 +0000)
[ACR] http://suprem.sec.samsung.net/jira/browse/TWDAPI-209

MediaControllerClient::SetCustomEventListener() method implementation.

[Verification] Will be verified later with SendEvent().

Signed-off-by: Michal Michalski <m.michalski2@partner.samsung.com>
Change-Id: Id30be750edc940e331053c353dc0944ef7d2f18a

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_utils.cc
src/mediacontroller/mediacontroller_utils.h

index 3bd97ab..5c9a847 100755 (executable)
@@ -112,6 +112,12 @@ ListenerManager.prototype.removeServerInfoListener = function(watchId) {
     }
 };
 
+var EventReplyListenerManager = new utils_.CommonListenerManager(
+    native_,
+    '_EventReplyListener'
+);
+EventReplyListenerManager.listenerIdToRequestId = {};
+
 var ServerCommandListener = new ListenerManager(
     native_,
     '_ServerCommandListener',
@@ -2858,6 +2864,41 @@ function MediaControllerClientInfo(data) {
 
 function MediaControllerClient() {}
 
+var EventReceivedCallback = function(msg, listener) {
+    var result = listener(msg.serverName, msg.eventName, msg.eventData);
+    if (type_.isUndefined(result)) {
+        result = null;
+    }
+    var nativeData = {
+        result: result.data,
+        resultCode: result.resultCode,
+        serverName: msg.serverName,
+        requestId: msg.requestId
+    };
+    //var nativeResult = native_.callSync('MediaControllerClient_sendEventReply', nativeData);
+    //if (native_.isFailure(nativeResult)) {
+    //    throw native_.getErrorObject(nativeResult);
+    //}
+};
+
+MediaControllerClient.prototype.setCustomEventListener = function(listener) {
+    var args = validator_.validateArgs(arguments, [
+        { name: 'listener', type: types_.FUNCTION }
+    ]);
+
+    var result = native_.callSync('MediaControllerClient_setCustomEventListener', {
+        listenerId: 'MediaControllerClientEventsListener'
+    });
+
+    if (native_.isFailure(result)) {
+        throw native_.getErrorObject(result);
+    } else {
+        native_.addListener('MediaControllerClientEventsListener', function(msg) {
+            EventReceivedCallback(msg, listener);
+        });
+    }
+};
+
 MediaControllerClient.prototype.findServers = function(successCallback, errorCallback) {
     var args = validator_.validateArgs(arguments, [
         { name: 'successCallback', type: types_.FUNCTION },
index f5fead3..5159fad 100644 (file)
@@ -35,6 +35,7 @@ using common::JsonToBundle;
 using common::PlatformResult;
 using common::tools::ReportError;
 using common::tools::ReportSuccess;
+using common::BundleJsonIterator;
 
 MediaControllerClient::MediaControllerClient() : handle_(nullptr), subscribed_servers{} {
   ScopeLogger();
@@ -106,6 +107,18 @@ PlatformResult MediaControllerClient::Init() {
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
+PlatformResult MediaControllerClient::SetCustomEventListener(const JsonCallback& callback) {
+  ScopeLogger();
+  int ret = mc_client_set_custom_event_received_cb(handle_, OnEventReceived, this);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Failed to set custom event listener",
+                              ("mc_client_set_custom_event_received_cb() error: %d, message: %s",
+                               ret, get_error_message(ret)));
+  }
+  custom_event_listener_ = callback;
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
 PlatformResult MediaControllerClient::FindServers(picojson::array* servers) {
   ScopeLogger();
   int ret;
@@ -1647,5 +1660,28 @@ void MediaControllerClient::OnDisplayRotationUpdate(const char* server_name,
   client->display_rotation_update_listener(&data);
 }
 
+void MediaControllerClient::OnEventReceived(const char* server_name, const char* request_id,
+                                            const char* event_name, bundle* data, void* user_data) {
+  ScopeLogger();
+  auto* client = static_cast<MediaControllerClient*>(user_data);
+
+  auto args = picojson::value(picojson::object());
+  auto& args_obj = args.get<picojson::object>();
+
+  picojson::array array;
+  bundle_foreach(data, BundleJsonIterator, &array);
+
+  args_obj[kServerName] = picojson::value(std::string(server_name));
+  args_obj[kEventName] = picojson::value(std::string(event_name));
+  args_obj[kEventData] = picojson::value(array);
+  args_obj[kRequestId] = picojson::value(std::string(request_id));
+
+  if (nullptr != client->custom_event_listener_) {
+    client->custom_event_listener_(&args);
+  } else {
+    LoggerW("custom_event_listener_ is not set");
+  }
+}
+
 }  // namespace mediacontroller
 }  // namespace extension
index f460e12..270bf04 100644 (file)
@@ -105,6 +105,8 @@ class MediaControllerClient {
   common::PlatformResult SetDisplayRotationInfoChangeListener(const JsonCallback& callback);
   common::PlatformResult UnsetDisplayRotationInfoChangeListener();
 
+  common::PlatformResult SetCustomEventListener(const JsonCallback& callback);
+
  private:
   mc_client_h handle_;
 
@@ -113,14 +115,11 @@ class MediaControllerClient {
   JsonCallback command_reply_callback_;
   JsonCallback playlist_update_listener_;
   JsonCallback ability_listener_;
-  // subtitles
   JsonCallback subtitles_update_listener_;
-  // mode 360
   JsonCallback mode360_update_listener_;
-  // display mode
   JsonCallback display_mode_update_listener_;
-  // displayRotation
   JsonCallback display_rotation_update_listener;
+  JsonCallback custom_event_listener_;
 
   std::list<std::string> subscribed_servers;
 
@@ -152,6 +151,8 @@ class MediaControllerClient {
   // displayRotation
   static void OnDisplayRotationUpdate(const char* server_name, mc_display_rotation_e rotation,
                                       void* user_data);
+  static void OnEventReceived(const char* server_name, const char* request_id, const char* event,
+                              bundle* data, void* user_data);
 };
 
 }  // namespace mediacontroller
index 766828c..fb562b9 100644 (file)
@@ -107,6 +107,8 @@ MediaControllerInstance::MediaControllerInstance() {
   REGISTER_SYNC("MediaControllerClient_getSimpleAbility", MediaControllerClientGetSimpleAbility);
   REGISTER_ASYNC("MediaControllerClient_findSubscribedServers",
                  MediaControllerClientFindSubscribedServers);
+  REGISTER_SYNC("MediaControllerClient_setCustomEventListener",
+                MediaControllerClientSetCustomEventListener);
 
   // server_info
   REGISTER_SYNC("MediaControllerServerInfo_sendPlaybackState",
@@ -907,6 +909,38 @@ void MediaControllerInstance::MediaControllerManagerGetClient(const picojson::va
   ReportSuccess(out);
 }
 
+void MediaControllerInstance::MediaControllerClientSetCustomEventListener(
+    const picojson::value& args, picojson::object& out) {
+  ScopeLogger();
+  if (!client_) {
+    LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out,
+                      ("Failed: client_"));
+    return;
+  }
+
+  CHECK_ARGS(args, kListenerId, std::string, out);
+
+  JsonCallback callback = [this, args](picojson::value* data) -> void {
+    if (nullptr == data) {
+      LoggerE("No data passed to json callback");
+      return;
+    }
+
+    picojson::object& request_o = data->get<picojson::object>();
+    request_o[kListenerId] = args.get(kListenerId);
+
+    Instance::PostMessage(this, data->serialize().c_str());
+  };
+
+  auto result = client_->SetCustomEventListener(callback);
+  if (!result) {
+    LogAndReportError(result, &out);
+    return;
+  }
+
+  ReportSuccess(out);
+}
+
 void MediaControllerInstance::MediaControllerClientFindServers(const picojson::value& args,
                                                                picojson::object& out) {
   ScopeLogger();
index 8110eb6..6a6f592 100644 (file)
@@ -91,6 +91,8 @@ class MediaControllerInstance : public common::ParsedInstance {
                                                         picojson::object& out);
   void MediaControllerClientFindSubscribedServers(const picojson::value& args,
                                                   picojson::object& out);
+  void MediaControllerClientSetCustomEventListener(const picojson::value& args,
+                                                   picojson::object& out);
 
   // serverInfo
   void MediaControllerServerInfoSendPlaybackState(const picojson::value& args,
index d2b2ec0..1404b22 100644 (file)
@@ -53,6 +53,11 @@ const char* kDisplayMode = "displayMode";
 const char* kDisplayRotation = "displayRotation";
 const char* kDisplayRotationAbility = "displayRotationAbility";
 const char* kEnabled = "enabled";
+const char* kEpisode = "episode";
+const char* kEpisodeNumber = "episodeNumber";
+const char* kEpisodeTitle = "episodeTitle";
+const char* kEventData = "eventData";
+const char* kEventName = "eventName";
 const char* kExtraData = "extraData";
 const char* kIconURI = "iconURI";
 const char* kIndex = "index";
@@ -68,22 +73,19 @@ const char* kRepeatMode = "repeatMode";
 const char* kReply = "reply";
 const char* kRequest = "request";
 const char* kRequestId = "requestId";
+const char* kResolution = "resolution";
+const char* kResolutionHeight = "resolutionHeight";
+const char* kResolutionWidth = "resolutionWidth";
 const char* kResult = "result";
+const char* kSeason = "season";
+const char* kSeasonNumber = "seasonNumber";
+const char* kSeasonTitle = "seasonTitle";
 const char* kServerName = "serverName";
 const char* kShuffleMode = "shuffleMode";
 const char* kState = "state";
 const char* kSupport = "support";
 const char* kType = "type";
 const char* kValue = "value";
-const char* kSeason = "season";
-const char* kSeasonNumber = "seasonNumber";
-const char* kSeasonTitle = "seasonTitle";
-const char* kEpisode = "episode";
-const char* kEpisodeNumber = "episodeNumber";
-const char* kEpisodeTitle = "episodeTitle";
-const char* kResolution = "resolution";
-const char* kResolutionWidth = "resolutionWidth";
-const char* kResolutionHeight = "resolutionHeight";
 
 }  // attributes
 
index 69e9a4a..2bd3062 100644 (file)
@@ -54,6 +54,8 @@ extern const char* kDisplayMode;
 extern const char* kDisplayRotation;
 extern const char* kDisplayRotationAbility;
 extern const char* kEnabled;
+extern const char* kEventData;
+extern const char* kEventName;
 extern const char* kExtraData;
 extern const char* kIconURI;
 extern const char* kIndex;