From: Dawid Juszczak Date: Wed, 2 Oct 2019 14:25:12 +0000 (+0200) Subject: [mediacontroller][fix] fix metadata issue X-Git-Tag: accepted/tizen/unified/20191004.003652~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6c4b976fdef5b27b86316bc3cd1b63006db6b0a5;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [mediacontroller][fix] fix metadata issue 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 --- diff --git a/src/mediacontroller/mediacontroller_api.js b/src/mediacontroller/mediacontroller_api.js index 8907113..823abf0 100755 --- a/src/mediacontroller/mediacontroller_api.js +++ b/src/mediacontroller/mediacontroller_api.js @@ -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; diff --git a/src/mediacontroller/mediacontroller_instance.cc b/src/mediacontroller/mediacontroller_instance.cc index 268aa28..f31ed1f 100644 --- a/src/mediacontroller/mediacontroller_instance.cc +++ b/src/mediacontroller/mediacontroller_instance.cc @@ -26,12 +26,10 @@ #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) diff --git a/src/mediacontroller/mediacontroller_utils.cc b/src/mediacontroller/mediacontroller_utils.cc index cf39455..d2b2ec0 100644 --- a/src/mediacontroller/mediacontroller_utils.cc +++ b/src/mediacontroller/mediacontroller_utils.cc @@ -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 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::string* state) { 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::string* rating) { 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::string* contentType) { 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, double* position) { 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::object* metadata) { ScopeLogger(); - char *value = nullptr; + char* value = nullptr; SCOPE_EXIT { free(value); }; picojson::value to_decode = picojson::value(picojson::object()); - picojson::object &obj = to_decode.get(); + picojson::object& obj = to_decode.get(); 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::string& action, + std::string* ability_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, void* user_data) -> bool { + char* name = 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(user_data); + auto playlists = static_cast(user_data); picojson::value value = picojson::value(picojson::object()); - picojson::object &obj = value.get(); + picojson::object& obj = value.get(); - 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; + char* encoded_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(to_encode.at("seasonNumber").get()); - const char *season_title = to_encode.at("seasonTitle").is() + number = static_cast(to_encode.at(kSeasonNumber).get()); + const char* season_title = to_encode.at(kSeasonTitle).is() ? nullptr - : to_encode.at("seasonTitle").get().c_str(); + : to_encode.at(kSeasonTitle).get().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(to_encode.at("episodeNumber").get()); - const char *episode_title = to_encode.at("episodeTitle").is() + number = static_cast(to_encode.at(kEpisodeNumber).get()); + const char* episode_title = to_encode.at(kEpisodeTitle).is() ? nullptr - : to_encode.at("episodeTitle").get().c_str(); + : to_encode.at(kEpisodeTitle).get().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(to_encode.at("resolutionWidth").get()); - u_int height = static_cast(to_encode.at("resolutionHeight").get()); + u_int width = static_cast(to_encode.at(kResolutionWidth).get()); + u_int height = static_cast(to_encode.at(kResolutionHeight).get()); 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(); - (*encoded).insert(std::make_pair(entry.first, picojson::value(value_str))); + std::string value_str = to_encode.at(name).get(); + (*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(); + if (!to_decode.get(kSeason).is()) { + val = to_decode.get(kSeason).get(); - 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(); + if (!to_decode.get(kEpisode).is()) { + val = to_decode.get(kEpisode).get(); - 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(); - u_int width = 0; - u_int height = 0; + if (!to_decode.get(kResolution).is()) { + val = to_decode.get(kResolution).get(); + 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::value("") : to_decode.get(name); } } diff --git a/src/mediacontroller/mediacontroller_utils.h b/src/mediacontroller/mediacontroller_utils.h index be730c2..69e9a4a 100644 --- a/src/mediacontroller/mediacontroller_utils.h +++ b/src/mediacontroller/mediacontroller_utils.h @@ -30,14 +30,12 @@ namespace mediacontroller { typedef std::function 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 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