[mediacontroller][fix] fix metadata issue 18/215218/5
authorDawid Juszczak <d.juszczak@samsung.com>
Wed, 2 Oct 2019 14:25:12 +0000 (16:25 +0200)
committerDawid Juszczak <d.juszczak@samsung.com>
Thu, 3 Oct 2019 10:19:17 +0000 (12:19 +0200)
Problem was connected to PlaybackInfo.metadata.
It was throwing an error while null value was set as encoded attributes
like resolution, episode and season. Now it is fixed by checking if
value is null before decoding it.

[Verification]
tested manually on chrome console
tct-deprecatedapi-tizen-tests 100% PASS
tct-mediacontroller-tizen-tests 100% PASS

Change-Id: Ibc0f44591b75dd53348ff1db2900e3da581534a0
Signed-off-by: Dawid Juszczak <d.juszczak@samsung.com>
src/mediacontroller/mediacontroller_api.js
src/mediacontroller/mediacontroller_instance.cc
src/mediacontroller/mediacontroller_utils.cc
src/mediacontroller/mediacontroller_utils.h

index 8907113..823abf0 100755 (executable)
@@ -3350,7 +3350,7 @@ MediaControllerServerInfo.prototype.sendCommand = function(
     var replyListenerId = ReplyCommandListener.addListener(callback);
     var result = native_.callSync('MediaControllerServerInfo_sendCommand', nativeData);
     if (native_.isFailure(result)) {
-      throw native_.getErrorObject(result);
+        throw native_.getErrorObject(result);
     }
 
     ReplyCommandListener.requestIdToListenerId[replyListenerId] = result.requestId;
index 268aa28..f31ed1f 100644 (file)
 
 #include "mediacontroller/mediacontroller_utils.h"
 
-
 #define MediaControllerUnknownErrorMsg "Unknown error occurred."
 #define MediaControllerServerUnknownErrorMsg "Failed: server_"
 #define MediaControllerClientUnknownErrorMsg "Failed: client_"
 
-
 namespace extension {
 namespace mediacontroller {
 
@@ -780,7 +778,7 @@ void MediaControllerInstance::MediaControllerServerSavePlaybackAbilities(
     return;
   }
 
-  for (auto e: types::MediaControllerPlaybackActionEnum) {
+  for (auto e : types::MediaControllerPlaybackActionEnum) {
     CHECK_ARGS(args, e.first, std::string, out);
   }
   CHECK_ARGS(args, "TOGGLE_PLAY_PAUSE", std::string, out)
index cf39455..d2b2ec0 100644 (file)
@@ -27,15 +27,14 @@ namespace mediacontroller {
 
 using common::ErrorCode;
 using common::PlatformResult;
+using namespace attributes;
 
 namespace privileges {
 
-const char* kPrivilegeMediaControllerClient =
-    "http://tizen.org/privilege/mediacontroller.client";
-const char* kPrivilegeMediaControllerServer =
-    "http://tizen.org/privilege/mediacontroller.server";
+const char* kPrivilegeMediaControllerClient = "http://tizen.org/privilege/mediacontroller.client";
+const char* kPrivilegeMediaControllerServer = "http://tizen.org/privilege/mediacontroller.server";
 
-} // privileges
+}  // privileges
 
 namespace attributes {
 
@@ -76,8 +75,17 @@ const char* kState = "state";
 const char* kSupport = "support";
 const char* kType = "type";
 const char* kValue = "value";
-
-} // attributes
+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
 
 namespace types {
 
@@ -180,7 +188,7 @@ const common::PlatformEnum<mc_display_rotation_e> MediaControllerDisplayRotation
     {"ROTATION_180", MC_DISPLAY_ROTATION_180},
     {"ROTATION_270", MC_DISPLAY_ROTATION_270}};
 
-PlatformResult ConvertPlaybackState(mc_playback_h playback_h, std::string *state) {
+PlatformResult ConvertPlaybackState(mc_playback_h playback_h, std::stringstate) {
   ScopeLogger();
 
   int ret;
@@ -205,7 +213,7 @@ PlatformResult ConvertPlaybackState(mc_playback_h playback_h, std::string *state
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-PlatformResult ConvertContentAgeRating(mc_playback_h playback_h, std::string *rating) {
+PlatformResult ConvertContentAgeRating(mc_playback_h playback_h, std::stringrating) {
   ScopeLogger();
 
   mc_content_age_rating_e rating_e = MC_CONTENT_RATING_ALL;
@@ -226,7 +234,7 @@ PlatformResult ConvertContentAgeRating(mc_playback_h playback_h, std::string *ra
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-PlatformResult ConvertContentType(mc_playback_h playback_h, std::string *contentType) {
+PlatformResult ConvertContentType(mc_playback_h playback_h, std::stringcontentType) {
   ScopeLogger();
   mc_content_type_e content_type_e = MC_CONTENT_TYPE_UNDECIDED;
   int ret = mc_client_get_playback_content_type(playback_h, &content_type_e);
@@ -245,7 +253,7 @@ PlatformResult ConvertContentType(mc_playback_h playback_h, std::string *content
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-PlatformResult ConvertPlaybackPosition(mc_playback_h playback_h, double *position) {
+PlatformResult ConvertPlaybackPosition(mc_playback_h playback_h, doubleposition) {
   ScopeLogger();
 
   int ret;
@@ -263,16 +271,16 @@ PlatformResult ConvertPlaybackPosition(mc_playback_h playback_h, double *positio
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-PlatformResult ConvertMetadata(mc_metadata_h metadata_h, picojson::object *metadata) {
+PlatformResult ConvertMetadata(mc_metadata_h metadata_h, picojson::objectmetadata) {
   ScopeLogger();
 
-  char *value = nullptr;
+  charvalue = nullptr;
   SCOPE_EXIT {
     free(value);
   };
 
   picojson::value to_decode = picojson::value(picojson::object());
-  picojson::object &obj = to_decode.get<picojson::object>();
+  picojson::objectobj = to_decode.get<picojson::object>();
 
   for (auto entry : MediaControllerMetadataAttributeEnum) {
     int ret = mc_metadata_get(metadata_h, entry.second, &value);
@@ -282,7 +290,7 @@ PlatformResult ConvertMetadata(mc_metadata_h metadata_h, picojson::object *metad
                                  ret, get_error_message(ret)));
     }
 
-    obj[entry.first] = picojson::value(value);
+    obj[entry.first] = value ? picojson::value(value) : picojson::value();
   }
 
   PlatformResult result = utils::DecodeMetadata(to_decode, metadata);
@@ -293,8 +301,8 @@ PlatformResult ConvertMetadata(mc_metadata_h metadata_h, picojson::object *metad
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-PlatformResult ConvertPlaybackAbility(mc_playback_ability_h ability_h, const std::string &action,
-                                      std::string *ability_str) {
+PlatformResult ConvertPlaybackAbility(mc_playback_ability_h ability_h, const std::stringaction,
+                                      std::stringability_str) {
   ScopeLogger();
 
   mc_ability_support_e ability_e;
@@ -330,11 +338,11 @@ PlatformResult ConvertPlaybackAbility(mc_playback_ability_h ability_h, const std
 
 }  // namespace types
 
-PlatformResult utils::GetAllPlaylists(const std::string &app_id, picojson::array *playlists) {
+PlatformResult utils::GetAllPlaylists(const std::string& app_id, picojson::array* playlists) {
   ScopeLogger();
 
-  auto OnPlaylists = [](mc_playlist_h playlist, void *user_data) -> bool {
-    char *name = nullptr;
+  auto OnPlaylists = [](mc_playlist_h playlist, voiduser_data) -> bool {
+    charname = nullptr;
 
     SCOPE_EXIT {
       free(name);
@@ -346,12 +354,12 @@ PlatformResult utils::GetAllPlaylists(const std::string &app_id, picojson::array
       return false;
     }
 
-    auto playlists = static_cast<picojson::array *>(user_data);
+    auto playlists = static_cast<picojson::array*>(user_data);
 
     picojson::value value = picojson::value(picojson::object());
-    picojson::object &obj = value.get<picojson::object>();
+    picojson::objectobj = value.get<picojson::object>();
 
-    obj.insert(std::make_pair("name", picojson::value{name}));
+    obj.insert(std::make_pair(kName, picojson::value{name}));
     playlists->push_back(value);
 
     return true;
@@ -383,18 +391,15 @@ ErrorCode utils::ConvertMediaControllerError(int e) {
   return error;
 }
 
-bool utils::isEncodable(const std::string &name) {
-  if (name == "season" || name == "episode" || name == "resolution") {
-    return true;
-  }
-  return false;
+bool utils::isMetadataAttributeEncodable(const std::string& name) {
+  return name == kSeason || name == kEpisode || name == kResolution;
 }
 
-PlatformResult utils::EncodeMetadata(const picojson::object &to_encode, picojson::object *encoded) {
+PlatformResult utils::EncodeMetadata(const picojson::object& to_encode, picojson::object* encoded) {
   ScopeLogger();
 
   int ret = 0;
-  char *encoded_value = nullptr;
+  charencoded_value = nullptr;
   int number = 0;
 
   SCOPE_EXIT {
@@ -403,10 +408,10 @@ PlatformResult utils::EncodeMetadata(const picojson::object &to_encode, picojson
 
   // season
   try {
-    number = static_cast<int>(to_encode.at("seasonNumber").get<double>());
-    const char *season_title = to_encode.at("seasonTitle").is<picojson::null>()
+    number = static_cast<int>(to_encode.at(kSeasonNumber).get<double>());
+    const char* season_title = to_encode.at(kSeasonTitle).is<picojson::null>()
                                    ? nullptr
-                                   : to_encode.at("seasonTitle").get<std::string>().c_str();
+                                   : to_encode.at(kSeasonTitle).get<std::string>().c_str();
 
     ret = mc_metadata_encode_season(number, season_title, &encoded_value);
     if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
@@ -415,17 +420,17 @@ PlatformResult utils::EncodeMetadata(const picojson::object &to_encode, picojson
           ("mc_metadata_encode_season() error: %d, message: %s", ret, get_error_message(ret)));
     }
 
-    (*encoded).insert(std::make_pair("season", picojson::value(encoded_value)));
+    (*encoded).insert(std::make_pair(kSeason, picojson::value(encoded_value)));
   } catch (...) {
     LoggerE("Season formation missing! - This should never happened.");
   }
 
   // episode
   try {
-    number = static_cast<int>(to_encode.at("episodeNumber").get<double>());
-    const char *episode_title = to_encode.at("episodeTitle").is<picojson::null>()
+    number = static_cast<int>(to_encode.at(kEpisodeNumber).get<double>());
+    const char* episode_title = to_encode.at(kEpisodeTitle).is<picojson::null>()
                                     ? nullptr
-                                    : to_encode.at("episodeTitle").get<std::string>().c_str();
+                                    : to_encode.at(kEpisodeTitle).get<std::string>().c_str();
 
     ret = mc_metadata_encode_episode(number, episode_title, &encoded_value);
     if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
@@ -434,15 +439,15 @@ PlatformResult utils::EncodeMetadata(const picojson::object &to_encode, picojson
           ("mc_metadata_encode_episode() error: %d, message: %s", ret, get_error_message(ret)));
     }
 
-    (*encoded).insert(std::make_pair("episode", picojson::value(encoded_value)));
+    (*encoded).insert(std::make_pair(kEpisode, picojson::value(encoded_value)));
   } catch (...) {
     LoggerE("Episode formation missing! - This should never happened.");
   }
 
   // resolution
   try {
-    u_int width = static_cast<u_int>(to_encode.at("resolutionWidth").get<double>());
-    u_int height = static_cast<u_int>(to_encode.at("resolutionHeight").get<double>());
+    u_int width = static_cast<u_int>(to_encode.at(kResolutionWidth).get<double>());
+    u_int height = static_cast<u_int>(to_encode.at(kResolutionHeight).get<double>());
 
     ret = mc_metadata_encode_resolution(width, height, &encoded_value);
     if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
@@ -451,7 +456,7 @@ PlatformResult utils::EncodeMetadata(const picojson::object &to_encode, picojson
           ("mc_metadata_encode_resolution() error: %d, message: %s", ret, get_error_message(ret)));
     }
 
-    (*encoded).insert(std::make_pair("resolution", picojson::value(encoded_value)));
+    (*encoded).insert(std::make_pair(kResolution, picojson::value(encoded_value)));
   } catch (...) {
     LoggerE("Resolution formation missing! - This should never happened.");
   }
@@ -459,10 +464,10 @@ PlatformResult utils::EncodeMetadata(const picojson::object &to_encode, picojson
   // other metadata attributes
   for (auto entry : types::MediaControllerMetadataAttributeEnum) {
     std::string name = entry.first;
-    if (name != "season" && name != "episode" && name != "resolution") {
+    if (!isMetadataAttributeEncodable(name)) {
       try {
-        std::string value_str = to_encode.at(entry.first).get<std::string>();
-        (*encoded).insert(std::make_pair(entry.first, picojson::value(value_str)));
+        std::string value_str = to_encode.at(name).get<std::string>();
+        (*encoded).insert(std::make_pair(name, picojson::value(value_str)));
       } catch (...) {
         LoggerE("%s formation missing! - This should never happened.", name.c_str());
       }
@@ -472,13 +477,14 @@ PlatformResult utils::EncodeMetadata(const picojson::object &to_encode, picojson
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-PlatformResult utils::DecodeMetadata(const picojson::value &to_decode, picojson::object *decoded) {
+PlatformResult utils::DecodeMetadata(const picojson::value& to_decode, picojson::object* decoded) {
   ScopeLogger();
 
   int ret = 0;
   int number = 0;
-  char *season_title = nullptr;
-  char *episode_title = nullptr;
+  char* season_title = nullptr;
+  char* episode_title = nullptr;
+  std::string val;
 
   SCOPE_EXIT {
     free(season_title);
@@ -486,54 +492,60 @@ PlatformResult utils::DecodeMetadata(const picojson::value &to_decode, picojson:
   };
 
   // decode season
-  std::string val = to_decode.get("season").get<std::string>();
+  if (!to_decode.get(kSeason).is<picojson::null>()) {
+    val = to_decode.get(kSeason).get<std::string>();
 
-  ret = mc_metadata_decode_season(val.c_str(), &number, &season_title);
-  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
-    return LogAndCreateResult(
-        ErrorCode::UNKNOWN_ERR, "Error while decoding season",
-        ("mc_metadata_decode_season() error: %d, message: %s", ret, get_error_message(ret)));
-  }
+    ret = mc_metadata_decode_season(val.c_str(), &number, &season_title);
+    if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+      return LogAndCreateResult(
+          ErrorCode::UNKNOWN_ERR, "Error while decoding season",
+          ("mc_metadata_decode_season() error: %d, message: %s", ret, get_error_message(ret)));
+    }
 
-  (*decoded)["seasonNumber"] = picojson::value((double)number);
-  (*decoded)["episodeTitle"] =
-      season_title ? picojson::value(std::string(season_title)) : picojson::value();
+    (*decoded)[kSeasonNumber] = picojson::value((double)number);
+    (*decoded)[kSeasonTitle] =
+        season_title ? picojson::value(std::string(season_title)) : picojson::value();
+  }
 
   // decode episode
-  val = to_decode.get("episode").get<std::string>();
+  if (!to_decode.get(kEpisode).is<picojson::null>()) {
+    val = to_decode.get(kEpisode).get<std::string>();
 
-  ret = mc_metadata_decode_episode(val.c_str(), &number, &episode_title);
-  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
-    return LogAndCreateResult(
-        ErrorCode::UNKNOWN_ERR, "Error while decoding episode",
-        ("mc_metadata_decode_episode() error: %d, message: %s", ret, get_error_message(ret)));
-  }
+    ret = mc_metadata_decode_episode(val.c_str(), &number, &episode_title);
+    if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+      return LogAndCreateResult(
+          ErrorCode::UNKNOWN_ERR, "Error while decoding episode",
+          ("mc_metadata_decode_episode() error: %d, message: %s", ret, get_error_message(ret)));
+    }
 
-  (*decoded)["episodeNumber"] = picojson::value((double)number);
-  (*decoded)["episodeTitle"] =
-      episode_title ? picojson::value(std::string(episode_title)) : picojson::value();
+    (*decoded)[kEpisodeNumber] = picojson::value((double)number);
+    (*decoded)[kEpisodeTitle] =
+        episode_title ? picojson::value(std::string(episode_title)) : picojson::value();
+  }
 
   // decode resolution
-  val = to_decode.get("resolution").get<std::string>();
-  u_int width = 0;
-  u_int height = 0;
+  if (!to_decode.get(kResolution).is<picojson::null>()) {
+    val = to_decode.get(kResolution).get<std::string>();
+    u_int width = 0;
+    u_int height = 0;
 
-  ret = mc_metadata_decode_resolution(val.c_str(), &width, &height);
-  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
-    return LogAndCreateResult(
-        ErrorCode::UNKNOWN_ERR, "Error while decoding resolution",
-        ("mc_metadata_decode_resolution() error: %d, message: %s", ret, get_error_message(ret)));
-  }
+    ret = mc_metadata_decode_resolution(val.c_str(), &width, &height);
+    if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+      return LogAndCreateResult(
+          ErrorCode::UNKNOWN_ERR, "Error while decoding resolution",
+          ("mc_metadata_decode_resolution() error: %d, message: %s", ret, get_error_message(ret)));
+    }
 
-  (*decoded)["resolutionWidth"] = picojson::value((double)width);
-  (*decoded)["resolutionHeight"] = picojson::value((double)height);
+    (*decoded)[kResolutionWidth] = picojson::value((double)width);
+    (*decoded)[kResolutionHeight] = picojson::value((double)height);
+  }
 
   // now rewrite not encoded attributes
   for (auto entry : types::MediaControllerMetadataAttributeEnum) {
     std::string name = entry.first;
-    // to omit decoded attributes
-    if (!isEncodable(name)) {
-      (*decoded)[name] = to_decode.get(name);
+    if (!isMetadataAttributeEncodable(name)) {
+      (*decoded)[name] =
+          to_decode.get(name).is<picojson::null>() ? picojson::value("") : to_decode.get(name);
     }
   }
 
index be730c2..69e9a4a 100644 (file)
@@ -30,14 +30,12 @@ namespace mediacontroller {
 
 typedef std::function<void(picojson::value*)> JsonCallback;
 
-
 namespace privileges {
 
 extern const char* kPrivilegeMediaControllerClient;
 extern const char* kPrivilegeMediaControllerServer;
 
-} // privileges
-
+}  // privileges
 
 namespace attributes {
 
@@ -78,9 +76,17 @@ extern const char* kState;
 extern const char* kSupport;
 extern const char* kType;
 extern const char* kValue;
-
-} // attributes
-
+extern const char* kSeason;
+extern const char* kSeasonNumber;
+extern const char* kSeasonTitle;
+extern const char* kEpisode;
+extern const char* kEpisodeNumber;
+extern const char* kEpisodeTitle;
+extern const char* kResolution;
+extern const char* kResolutionWidth;
+extern const char* kResolutionHeight;
+
+}  // attributes
 
 namespace types {
 
@@ -111,7 +117,7 @@ extern const common::PlatformEnum<mc_display_rotation_e> MediaControllerDisplayR
 namespace utils {
 common::PlatformResult GetAllPlaylists(const std::string& app_id, picojson::array* playlists);
 common::ErrorCode ConvertMediaControllerError(int e);
-bool isEncodable(const std::string& name);
+bool isMetadataAttributeEncodable(const std::string& name);
 common::PlatformResult EncodeMetadata(const picojson::object& to_encode, picojson::object* encoded);
 common::PlatformResult DecodeMetadata(const picojson::value& to_decode, picojson::object* decoded);
 }  // namespace utils