2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "mediacontroller/mediacontroller_instance.h"
19 #include "common/current_application.h"
20 #include "common/logger.h"
21 #include "common/picojson.h"
22 #include "common/platform_result.h"
23 #include "common/scope_exit.h"
24 #include "common/task-queue.h"
25 #include "common/tools.h"
27 #include "mediacontroller/mediacontroller_utils.h"
29 #define MediaControllerUnknownErrorMsg "Unknown error occurred."
30 #define MediaControllerServerUnknownErrorMsg "Failed: server_"
31 #define MediaControllerClientUnknownErrorMsg "Failed: client_"
34 namespace mediacontroller {
36 using namespace privileges;
37 using namespace attributes;
39 using common::ErrorCode;
40 using common::PlatformResult;
41 using common::TaskQueue;
43 MediaControllerInstance::MediaControllerInstance() {
45 using namespace std::placeholders;
47 #define REGISTER_METHOD(M) \
48 RegisterSyncHandler(#M, std::bind(&MediaControllerInstance::M, this, _1, _2))
51 REGISTER_METHOD(MediaControllerManagerCreateServer);
52 REGISTER_METHOD(MediaControllerServerUpdatePlaybackState);
53 REGISTER_METHOD(MediaControllerServerUpdatePlaybackPosition);
54 REGISTER_METHOD(MediaControllerServerUpdatePlaybackAgeRating);
55 REGISTER_METHOD(MediaControllerServerUpdateRepeatMode);
56 REGISTER_METHOD(MediaControllerServerUpdateRepeatState);
57 REGISTER_METHOD(MediaControllerServerUpdateShuffleMode);
58 REGISTER_METHOD(MediaControllerServerUpdateMetadata);
59 REGISTER_METHOD(MediaControllerServerUpdatePlaybackContentType);
60 REGISTER_METHOD(MediaControllerServerUpdatePlaybackContentType);
61 REGISTER_METHOD(MediaControllerServerAddChangeRequestPlaybackInfoListener);
62 REGISTER_METHOD(MediaControllerServerRemoveChangeRequestPlaybackInfoListener);
63 REGISTER_METHOD(MediaControllerServerAddSearchRequestListener);
64 REGISTER_METHOD(MediaControllerServerRemoveSearchRequestListener);
65 REGISTER_METHOD(MediaControllerServerAddCommandListener);
66 REGISTER_METHOD(MediaControllerServerReplyCommand);
67 REGISTER_METHOD(MediaControllerServerRemoveCommandListener);
68 REGISTER_METHOD(MediaControllerServerCreatePlaylist);
69 REGISTER_METHOD(MediaControllerServerSavePlaylist);
70 REGISTER_METHOD(MediaControllerServerDeletePlaylist);
71 REGISTER_METHOD(MediaControllerServerUpdatePlaybackItem);
73 REGISTER_METHOD(MediaControllerServerGetAllPlaylists);
74 REGISTER_METHOD(MediaControllerServerUpdateIconURI);
75 REGISTER_METHOD(MediaControllerServerSavePlaybackAbilities);
76 REGISTER_METHOD(MediaControllerServerSetDisplayModeAbility);
77 REGISTER_METHOD(MediaControllerServerSetDisplayRotationAbility);
78 REGISTER_METHOD(MediaControllerServerSetSimpleAbility);
79 REGISTER_METHOD(MediaControllerServerGetAllClientsInfo);
82 REGISTER_METHOD(MediaControllerClientInfoSendEvent);
85 REGISTER_METHOD(MediaControllerManagerGetClient);
86 REGISTER_METHOD(MediaControllerClientFindServers);
87 REGISTER_METHOD(MediaControllerClientGetLatestServerInfo);
88 REGISTER_METHOD(MediaControllerClientGetPlaybackInfo);
89 REGISTER_METHOD(MediaControllerClientGetPlaybackAbility);
90 REGISTER_METHOD(MediaControllerClientGetDisplayModeAbility);
91 REGISTER_METHOD(MediaControllerClientGetDisplayRotationAbility);
92 REGISTER_METHOD(MediaControllerClientGetSimpleAbility);
93 REGISTER_METHOD(MediaControllerClientFindSubscribedServers);
94 REGISTER_METHOD(MediaControllerClientSendEventReply);
95 REGISTER_METHOD(MediaControllerClientSetCustomEventListener);
96 REGISTER_METHOD(MediaControllerClientUnsetCustomEventListener);
99 REGISTER_METHOD(MediaControllerServerInfoSendPlaybackState);
100 REGISTER_METHOD(MediaControllerServerInfoSendPlaybackPosition);
101 REGISTER_METHOD(MediaControllerServerInfoSendRepeatMode);
102 REGISTER_METHOD(MediaControllerServerInfoSendRepeatState);
103 REGISTER_METHOD(MediaControllerServerInfoSendShuffleMode);
104 REGISTER_METHOD(MediaControllerServerInfoSendSearchRequest);
105 REGISTER_METHOD(MediaControllerServerInfoSendCommand);
106 REGISTER_METHOD(MediaControllerServerInfoAddServerStatusChangeListener);
107 REGISTER_METHOD(MediaControllerServerInfoRemoveServerStatusChangeListener);
108 REGISTER_METHOD(MediaControllerServerInfoAddPlaybackInfoChangeListener);
109 REGISTER_METHOD(MediaControllerServerInfoRemovePlaybackInfoChangeListener);
110 REGISTER_METHOD(MediaControllerServerInfoSendPlaybackItem);
111 REGISTER_METHOD(MediaControllerServerInfoAddPlaylistUpdatedListener);
112 REGISTER_METHOD(MediaControllerServerInfoRemovePlaylistUpdatedListener);
113 REGISTER_METHOD(MediaControllerServerInfoGetAllPlaylists);
114 REGISTER_METHOD(MediaControllerServerInfoGetIconURI);
115 REGISTER_METHOD(MediaControllerClientAddAbilityChangeListener);
116 REGISTER_METHOD(MediaControllerClientRemoveAbilityChangeListener);
117 REGISTER_METHOD(MediaControllerServerInfoPlaybackInfoSendPlaybackAction);
118 REGISTER_METHOD(MediaControllerServerInfoPlaybackInfoSendPlaybackPosition);
119 REGISTER_METHOD(MediaControllerServerInfoPlaybackInfoSendShuffleMode);
120 REGISTER_METHOD(MediaControllerServerInfoPlaybackInfoSendRepeatState);
123 REGISTER_METHOD(MediaControllerAbilitiesInfoSubscribe);
124 REGISTER_METHOD(MediaControllerAbilitiesInfoUnsubscribe);
127 REGISTER_METHOD(MediaControllerPlaylistAddItem);
128 REGISTER_METHOD(MediaControllerPlaylistGetItems);
131 REGISTER_METHOD(MediaControllerSubtitlesUpdateEnabled);
132 REGISTER_METHOD(MediaControllerSubtitlesAddChangeRequestListener);
133 REGISTER_METHOD(MediaControllerSubtitlesRemoveChangeRequestListener);
135 REGISTER_METHOD(MediaControllerSubtitlesInfoGetEnabled);
136 REGISTER_METHOD(MediaControllerSubtitlesInfoSendRequest);
137 REGISTER_METHOD(MediaControllerSubtitlesInfoAddModeChangeListener);
138 REGISTER_METHOD(MediaControllerSubtitlesInfoRemoveModeChangeListener);
141 REGISTER_METHOD(MediaControllerMode360UpdateEnabled);
142 REGISTER_METHOD(MediaControllerMode360AddChangeRequestListener);
143 REGISTER_METHOD(MediaControllerMode360RemoveChangeRequestListener);
145 REGISTER_METHOD(MediaControllerMode360InfoGetEnabled);
146 REGISTER_METHOD(MediaControllerMode360InfoSendRequest);
147 REGISTER_METHOD(MediaControllerMode360InfoAddModeChangeListener);
148 REGISTER_METHOD(MediaControllerMode360InfoRemoveModeChangeListener);
151 REGISTER_METHOD(MediaControllerDisplayModeUpdateType);
152 REGISTER_METHOD(MediaControllerDisplayModeAddChangeRequestListener);
153 REGISTER_METHOD(MediaControllerDisplayModeRemoveChangeRequestListener);
155 REGISTER_METHOD(MediaControllerDisplayModeInfoGetType);
156 REGISTER_METHOD(MediaControllerDisplayModeInfoSendType);
157 REGISTER_METHOD(MediaControllerDisplayModeInfoAddModeChangeListener);
158 REGISTER_METHOD(MediaControllerDisplayModeInfoRemoveModeChangeListener);
161 REGISTER_METHOD(MediaControllerDisplayRotationUpdate);
162 REGISTER_METHOD(MediaControllerDisplayRotationAddChangeRequestListener);
163 REGISTER_METHOD(MediaControllerDisplayRotationRemoveChangeRequestListener);
165 REGISTER_METHOD(MediaControllerDisplayRotationInfoGet);
166 REGISTER_METHOD(MediaControllerDisplayRotationInfoSend);
167 REGISTER_METHOD(MediaControllerDisplayRotationInfoAddChangeListener);
168 REGISTER_METHOD(MediaControllerDisplayRotationInfoRemoveChangeListener);
171 REGISTER_METHOD(MediaControllerPlaylistsGetPlaylist);
174 REGISTER_METHOD(MediaControllerPlaylistsInfoSendPlaybackItem);
175 REGISTER_METHOD(MediaControllerPlaylistsInfoGetPlaylist);
177 #undef REGISTER_METHOD
180 MediaControllerInstance::~MediaControllerInstance() {
182 std::lock_guard<std::mutex> lock(playlist_map_mutex_);
183 for (auto const& s : server_playlist_map_) {
184 for (auto const& v : s.second) {
185 if (MEDIA_CONTROLLER_ERROR_NONE != mc_playlist_destroy(v.second)) {
186 LoggerE("Unable to destroy playlist %s", v.first.c_str());
192 #define CHECK_EXIST(args, name, out) \
193 if (!args.contains(name)) { \
194 std::string msg = std::string(name) + " is required argument"; \
195 LogAndReportError(PlatformResult(ErrorCode::TYPE_MISMATCH_ERR, msg), &out); \
199 #define CHECK_TYPE(args, name, type, out) \
200 if (!args.get(name).is<type>()) { \
201 std::string msg = std::string(name) + " is not a " + #type; \
202 LogAndReportError(PlatformResult(ErrorCode::TYPE_MISMATCH_ERR, msg), &out); \
206 #define CHECK_ARGS(args, name, type, out) \
207 CHECK_EXIST(args, name, out) \
208 CHECK_TYPE(args, name, type, out)
210 void MediaControllerInstance::MediaControllerManagerCreateServer(const picojson::value& args,
211 picojson::object& out) {
214 CHECK_PRIVILEGE_ACCESS(kPrivilegeMediaControllerServer, &out);
221 server_ = std::make_shared<MediaControllerServer>();
222 const PlatformResult& result = server_->Init();
225 LogAndReportError(result, &out, ("Failed to create server."));
231 void MediaControllerInstance::MediaControllerServerUpdatePlaybackState(const picojson::value& args,
232 picojson::object& out) {
234 CHECK_EXIST(args, kState, out)
237 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
238 (MediaControllerServerUnknownErrorMsg));
242 const std::string& state = args.get(kState).get<std::string>();
243 const PlatformResult& result = server_->SetPlaybackState(state);
245 LogAndReportError(result, &out, ("Failed server_->SetPlaybackState()"));
252 void MediaControllerInstance::MediaControllerServerUpdateIconURI(const picojson::value& args,
253 picojson::object& out) {
255 CHECK_EXIST(args, kIconURI, out);
258 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
259 (MediaControllerServerUnknownErrorMsg));
263 const char* icon_uri = nullptr;
264 if (args.get(kIconURI).is<std::string>()) {
265 icon_uri = args.get(kIconURI).get<std::string>().c_str();
266 } else if (!args.get(kIconURI).is<picojson::null>()) {
268 PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Icon URI must be a string or null."), &out,
269 ("Icon URI is not a string or null."));
273 PlatformResult result = server_->UpdateIconURI(icon_uri);
275 LogAndReportError(result, &out, ("Failed server_->UpdateIconURI()"));
282 void MediaControllerInstance::MediaControllerServerUpdatePlaybackPosition(
283 const picojson::value& args, picojson::object& out) {
286 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
287 (MediaControllerServerUnknownErrorMsg));
291 CHECK_EXIST(args, kPosition, out)
293 double position = args.get(kPosition).get<double>();
294 const PlatformResult& result = server_->SetPlaybackPosition(position);
296 LogAndReportError(result, &out, ("Failed: server_->SetPlaybackPosition()"));
303 void MediaControllerInstance::MediaControllerServerUpdatePlaybackAgeRating(
304 const picojson::value& args, picojson::object& out) {
307 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Server handle not initialized."),
308 &out, (MediaControllerServerUnknownErrorMsg));
312 CHECK_EXIST(args, kRating, out)
314 const std::string& rating = args.get(kRating).get<std::string>();
315 const PlatformResult& result = server_->SetContentAgeRating(rating);
317 LogAndReportError(result, &out, ("Failed: server_->SetContentAgeRating()"));
324 void MediaControllerInstance::MediaControllerServerUpdateShuffleMode(const picojson::value& args,
325 picojson::object& out) {
328 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
329 (MediaControllerServerUnknownErrorMsg));
333 CHECK_EXIST(args, kMode, out)
335 bool mode = args.get(kMode).get<bool>();
337 const PlatformResult& result = server_->SetShuffleMode(mode);
339 LogAndReportError(result, &out, ("Failed: server_->SetShuffleMode()"));
346 void MediaControllerInstance::MediaControllerServerUpdatePlaybackContentType(
347 const picojson::value& args, picojson::object& out) {
350 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
351 (MediaControllerServerUnknownErrorMsg));
355 CHECK_ARGS(args, kContentType, std::string, out);
356 std::string content_type = args.get(kContentType).get<std::string>();
358 PlatformResult result = server_->SetContentType(content_type);
360 LogAndReportError(result, &out, ("Failed: server_>SetContentType()"));
367 void MediaControllerInstance::MediaControllerServerUpdateRepeatMode(const picojson::value& args,
368 picojson::object& out) {
370 common::tools::PrintDeprecationWarningFor("updateRepeatMode()", "updateRepeatState()");
373 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
374 (MediaControllerServerUnknownErrorMsg));
378 CHECK_EXIST(args, kMode, out)
380 bool mode = args.get(kMode).get<bool>();
382 const PlatformResult& result = server_->SetRepeatMode(mode);
384 LogAndReportError(result, &out, ("Failed: server_->SetRepeatMode()"));
391 void MediaControllerInstance::MediaControllerServerUpdateRepeatState(const picojson::value& args,
392 picojson::object& out) {
394 CHECK_EXIST(args, kState, out)
396 const std::string& state = args.get(kState).get<std::string>();
398 const PlatformResult& result = server_->SetRepeatState(state);
400 LogAndReportError(result, &out, ("Failed: server_->SetRepeatState()"));
407 void MediaControllerInstance::MediaControllerServerUpdateMetadata(const picojson::value& args,
408 picojson::object& out) {
411 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
412 (MediaControllerServerUnknownErrorMsg));
416 CHECK_EXIST(args, kMetadata, out)
418 const picojson::object& metadata = args.get(kMetadata).get<picojson::object>();
420 const PlatformResult& result = server_->SetMetadata(metadata);
422 LogAndReportError(result, &out, ("Failed: server_->SetMetadata()"));
429 void MediaControllerInstance::MediaControllerServerAddChangeRequestPlaybackInfoListener(
430 const picojson::value& args, picojson::object& out) {
433 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
434 (MediaControllerServerUnknownErrorMsg));
438 CHECK_EXIST(args, kListenerId, out)
440 JsonCallback callback = [this, args](picojson::value* data) -> void {
442 LoggerE("No data passed to json callback");
446 picojson::object& request_o = data->get<picojson::object>();
447 request_o[kListenerId] = args.get(kListenerId);
449 Instance::PostMessage(this, data->serialize().c_str());
452 auto result = server_->SetChangeRequestPlaybackInfoListener(callback);
454 LogAndReportError(result, &out);
460 void MediaControllerInstance::MediaControllerServerRemoveChangeRequestPlaybackInfoListener(
461 const picojson::value& args, picojson::object& out) {
464 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
465 (MediaControllerServerUnknownErrorMsg));
469 auto result = server_->UnsetChangeRequestPlaybackInfoListener();
471 LogAndReportError(result, &out);
475 void MediaControllerInstance::MediaControllerServerAddSearchRequestListener(
476 const picojson::value& args, picojson::object& out) {
480 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Server not initialized."), &out,
481 (MediaControllerServerUnknownErrorMsg));
485 JsonCallback on_request = [this, args](picojson::value* request) -> void {
486 picojson::object& request_o = request->get<picojson::object>();
487 request_o[kListenerId] = args.get(kListenerId);
488 Instance::PostMessage(this, request->serialize().c_str());
491 auto result = server_->SetSearchRequestListener(on_request);
493 LogAndReportError(result, &out);
500 void MediaControllerInstance::MediaControllerServerRemoveSearchRequestListener(
501 const picojson::value& args, picojson::object& out) {
505 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Server not initialized."), &out,
506 (MediaControllerServerUnknownErrorMsg));
510 auto result = server_->UnsetSearchRequestListener();
512 LogAndReportError(result, &out);
517 void MediaControllerInstance::MediaControllerServerAddCommandListener(const picojson::value& args,
518 picojson::object& out) {
521 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
522 (MediaControllerServerUnknownErrorMsg));
526 JsonCallback on_command = [this, args](picojson::value* request) -> void {
527 picojson::object& request_o = request->get<picojson::object>();
528 request_o[kListenerId] = args.get(kListenerId);
530 Instance::PostMessage(this, request->serialize().c_str());
533 auto result = server_->SetCommandListener(on_command);
535 LogAndReportError(result, &out);
541 void MediaControllerInstance::MediaControllerServerReplyCommand(const picojson::value& args,
542 picojson::object& out) {
545 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
546 (MediaControllerServerUnknownErrorMsg));
550 CHECK_EXIST(args, kClientName, out);
551 CHECK_EXIST(args, kRequestId, out);
552 CHECK_EXIST(args, kReply, out);
554 if (args.get(kRequestId).is<picojson::null>()) {
555 LoggerD("The request was sent without reply listener, skipping");
560 auto client_name = args.get(kClientName).get<std::string>();
561 auto request_id = args.get(kRequestId).get<std::string>();
563 auto reply = args.get(kReply);
564 CHECK_EXIST(reply, kCode, out);
565 CHECK_EXIST(reply, kData, out);
567 LoggerD("reply json: %s", reply.serialize().c_str());
568 int code = static_cast<int>(reply.get(kCode).get<double>());
569 auto data = reply.get(kData);
571 auto result = server_->CommandReply(client_name, request_id, code, data);
573 LogAndReportError(result, &out);
580 void MediaControllerInstance::MediaControllerServerRemoveCommandListener(
581 const picojson::value& args, picojson::object& out) {
584 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
585 (MediaControllerServerUnknownErrorMsg));
589 auto result = server_->UnsetCommandListener();
591 LogAndReportError(result, &out);
597 void MediaControllerInstance::MediaControllerServerCreatePlaylist(const picojson::value& args,
598 picojson::object& out) {
601 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
602 (MediaControllerServerUnknownErrorMsg));
606 CHECK_ARGS(args, kPlaylistName, std::string, out)
608 picojson::value playlist_info = picojson::value();
609 std::string serverName = common::CurrentApplication::GetInstance().GetApplicationId();
610 auto playlistName = args.get(kPlaylistName).get<std::string>();
611 PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
612 std::lock_guard<std::mutex> lock(playlist_map_mutex_);
614 if (server_playlist_map_.find(serverName) != server_playlist_map_.end() &&
615 server_playlist_map_[serverName].find(playlistName) !=
616 server_playlist_map_[serverName].end()) {
617 result = LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR,
618 "Playlist with given name already exists");
619 LogAndReportError(result, &out);
622 mc_playlist_h playlist_handle = nullptr;
623 result = server_->CreatePlaylist(serverName, playlistName, &playlist_info, playlist_handle);
625 LogAndReportError(result, &out, ("Failed: server_->CreatePlaylist"));
629 server_playlist_map_[serverName][playlistName] = playlist_handle;
631 ReportSuccess(playlist_info, out);
634 void MediaControllerInstance::MediaControllerServerSavePlaylist(const picojson::value& args,
635 picojson::object& out) {
638 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
639 (MediaControllerServerUnknownErrorMsg));
643 CHECK_EXIST(args, kCallbackId, out)
644 CHECK_ARGS(args, kPlaylistName, std::string, out)
645 CHECK_ARGS(args, kServerName, std::string, out)
647 auto save = [this, args]() -> void {
648 picojson::value response = picojson::value(picojson::object());
649 picojson::object& response_obj = response.get<picojson::object>();
650 response_obj[kCallbackId] = args.get(kCallbackId);
652 auto name = args.get(kPlaylistName).get<std::string>();
653 auto serverName = args.get(kServerName).get<std::string>();
655 PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
658 std::lock_guard<std::mutex> lock(playlist_map_mutex_);
659 if (server_playlist_map_.find(serverName) == server_playlist_map_.end() ||
660 server_playlist_map_[serverName].find(name) == server_playlist_map_[serverName].end()) {
661 result = LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR,
662 "Playlist with given name doesn't exist");
663 LogAndReportError(result, &response_obj,
664 ("Failed: MediaControllerInstance::MediaControllerServerSavePlaylist"));
665 Instance::PostMessage(this, response.serialize().c_str());
669 result = server_->SavePlaylist(server_playlist_map_[serverName][name]);
672 ReportSuccess(response_obj);
674 LogAndReportError(result, &response_obj, ("Failed: server_->SavePlaylist"));
677 Instance::PostMessage(this, response.serialize().c_str());
680 TaskQueue::GetInstance().Async(save);
685 void MediaControllerInstance::MediaControllerServerDeletePlaylist(const picojson::value& args,
686 picojson::object& out) {
689 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
690 (MediaControllerServerUnknownErrorMsg));
694 CHECK_EXIST(args, kCallbackId, out)
695 CHECK_ARGS(args, kPlaylistName, std::string, out)
697 auto del = [this, args]() -> void {
698 picojson::value response = picojson::value(picojson::object());
699 picojson::object& response_obj = response.get<picojson::object>();
700 response_obj[kCallbackId] = args.get(kCallbackId);
702 auto name = args.get(kPlaylistName).get<std::string>();
703 std::string serverName = common::CurrentApplication::GetInstance().GetApplicationId();
705 PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
708 std::lock_guard<std::mutex> lock(playlist_map_mutex_);
710 if (server_playlist_map_.find(serverName) == server_playlist_map_.end() ||
711 server_playlist_map_[serverName].find(name) == server_playlist_map_[serverName].end()) {
712 result = LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR,
713 "Playlist with given name doesn't exist");
714 LogAndReportError(result, &response_obj,
715 ("Failed: MediaControllerInstance::MediaControllerServerDeletePlaylist"));
716 Instance::PostMessage(this, response.serialize().c_str());
719 result = server_->DeletePlaylist(server_playlist_map_[serverName][name]);
722 ReportSuccess(response_obj);
724 LogAndReportError(result, &response_obj, ("Failed: server_->DeletePlaylist"));
727 if (MEDIA_CONTROLLER_ERROR_NONE !=
728 mc_playlist_destroy(server_playlist_map_[serverName][name])) {
729 LoggerE("Unable to destroy playlist %s", name.c_str());
732 server_playlist_map_[serverName].erase(name);
735 Instance::PostMessage(this, response.serialize().c_str());
738 TaskQueue::GetInstance().Async(del);
743 void MediaControllerInstance::MediaControllerServerUpdatePlaybackItem(const picojson::value& args,
744 picojson::object& out) {
747 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
748 (MediaControllerServerUnknownErrorMsg));
752 CHECK_ARGS(args, kPlaylistName, std::string, out)
753 CHECK_ARGS(args, kIndex, std::string, out)
755 auto result = server_->UpdatePlaybackItem(args.get(kPlaylistName).get<std::string>(),
756 args.get(kIndex).get<std::string>());
758 LogAndReportError(result, &out);
765 void MediaControllerInstance::MediaControllerServerGetAllPlaylists(const picojson::value& args,
766 picojson::object& out) {
769 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
770 (MediaControllerServerUnknownErrorMsg));
774 auto get = [this, args]() -> void {
775 picojson::value response = picojson::value(picojson::object());
776 picojson::object& response_obj = response.get<picojson::object>();
778 response_obj[kCallbackId] = args.get(kCallbackId);
780 std::string app_id = common::CurrentApplication::GetInstance().GetApplicationId();
782 if (app_id.empty()) {
783 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Error while get playlists"),
784 &response_obj, ("CurrentApplication::GetInstance().GetApplicationId()"));
785 Instance::PostMessage(this, response.serialize().c_str());
789 std::map<std::string, mc_playlist_h> new_playlists_map;
790 auto result = utils::GetAllPlaylistsHandles(app_id, &new_playlists_map);
792 LogAndReportError(result, &response_obj, ("Failed: utils::GetAllPlaylists"));
793 Instance::PostMessage(this, response.serialize().c_str());
796 // update the list of stored handles
798 std::lock_guard<std::mutex> lock(playlist_map_mutex_);
800 utils::UpdatePlaylistHandleMap(app_id, new_playlists_map, server_playlist_map_);
801 picojson::value playlists = utils::CreatePlaylistsJSON(app_id, new_playlists_map);
803 response_obj[kResult] = picojson::value{playlists};
805 ReportSuccess(response_obj);
806 Instance::PostMessage(this, response.serialize().c_str());
809 TaskQueue::GetInstance().Async(get);
814 void MediaControllerInstance::MediaControllerServerSavePlaybackAbilities(
815 const picojson::value& args, picojson::object& out) {
819 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
820 (MediaControllerServerUnknownErrorMsg));
824 for (auto e : types::MediaControllerPlaybackActionEnum) {
825 CHECK_ARGS(args, e.first, std::string, out);
828 const PlatformResult& result = server_->SavePlaybackAbilities(args);
830 LogAndReportError(result, &out, ("Failed server_->SavePlaybackAbilities()"));
837 void MediaControllerInstance::MediaControllerServerSetDisplayModeAbility(
838 const picojson::value& args, picojson::object& out) {
842 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
843 (MediaControllerServerUnknownErrorMsg));
847 CHECK_ARGS(args, kMode, std::string, out)
848 CHECK_ARGS(args, kSupport, std::string, out)
850 std::string support = args.get(kSupport).get<std::string>();
851 std::string mode = args.get(kMode).get<std::string>();
853 const PlatformResult& result = server_->SetDisplayModeAbility(mode, support);
855 LogAndReportError(result, &out, ("Failed server_->SetDisplayModeAbility()"));
862 void MediaControllerInstance::MediaControllerServerSetDisplayRotationAbility(
863 const picojson::value& args, picojson::object& out) {
867 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
868 (MediaControllerServerUnknownErrorMsg));
872 CHECK_ARGS(args, kDisplayRotationAbility, std::string, out)
873 CHECK_ARGS(args, kSupport, std::string, out)
875 std::string display_rotation_ability = args.get(kDisplayRotationAbility).get<std::string>();
876 std::string support = args.get(kSupport).get<std::string>();
877 const PlatformResult& result =
878 server_->SetDisplayRotationAbility(display_rotation_ability, support);
880 LogAndReportError(result, &out, ("Failed server_->SetDisplayRotationAbility()"));
887 void MediaControllerInstance::MediaControllerServerSetSimpleAbility(const picojson::value& args,
888 picojson::object& out) {
892 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
893 (MediaControllerServerUnknownErrorMsg));
897 CHECK_ARGS(args, kAbilityType, std::string, out)
898 CHECK_ARGS(args, kSupport, std::string, out)
900 std::string ability_type = args.get(kAbilityType).get<std::string>();
901 std::string support = args.get(kSupport).get<std::string>();
902 const PlatformResult& result = server_->SetSimpleAbility(ability_type, support);
904 LogAndReportError(result, &out, ("Failed server_->SetSimpleAbility()"));
911 void MediaControllerInstance::MediaControllerServerGetAllClientsInfo(const picojson::value& args,
912 picojson::object& out) {
915 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occurred."), &out,
916 ("Failed: server_"));
920 picojson::array clientsInfo;
921 auto result = server_->GetAllClientsInfo(&clientsInfo);
923 LogAndReportError(result, &out);
927 ReportSuccess(picojson::value(clientsInfo), out);
930 void MediaControllerInstance::MediaControllerClientInfoSendEvent(const picojson::value& args,
931 picojson::object& out) {
934 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occurred."), &out,
935 ("Failed: server_"));
939 CHECK_ARGS(args, kEventName, std::string, out);
940 CHECK_EXIST(args, kEventData, out);
941 CHECK_ARGS(args, kClientName, std::string, out);
942 CHECK_ARGS(args, kReplyListener, std::string, out);
944 JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
945 picojson::object& reply_obj = reply->get<picojson::object>();
946 reply_obj[kListenerId] = args.get(kReplyListener);
947 Instance::PostMessage(this, reply->serialize().c_str());
950 char* request_id = nullptr;
955 PlatformResult result =
956 server_->SendEvent(args.get(kEventName).get<std::string>().c_str(), args.get(kEventData),
957 args.get(kClientName).get<std::string>().c_str(), reply_cb, &request_id);
960 out[kRequestId] = picojson::value(std::string(request_id));
963 LogAndReportError(result, &out, ("Failed to send event."));
967 void MediaControllerInstance::MediaControllerManagerGetClient(const picojson::value& args,
968 picojson::object& out) {
971 CHECK_PRIVILEGE_ACCESS(kPrivilegeMediaControllerClient, &out);
978 client_ = std::make_shared<MediaControllerClient>();
979 const PlatformResult& result = client_->Init();
982 LogAndReportError(result, &out, ("Failed: client_->Init()"));
988 void MediaControllerInstance::MediaControllerClientSendEventReply(const picojson::value& args,
989 picojson::object& out) {
992 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occurred."), &out,
993 ("Failed: client_"));
997 CHECK_ARGS(args, kServerName, std::string, out);
998 CHECK_EXIST(args, kResult, out);
999 CHECK_ARGS(args, kRequestId, std::string, out);
1000 CHECK_ARGS(args, kResultCode, double, out);
1003 client_->SendEventReply(args.get(kServerName).get<std::string>().c_str(), args.get(kResult),
1004 static_cast<int>(args.get(kResultCode).get<double>()),
1005 args.get(kRequestId).get<std::string>().c_str());
1008 LogAndReportError(result, &out);
1015 void MediaControllerInstance::MediaControllerClientSetCustomEventListener(
1016 const picojson::value& args, picojson::object& out) {
1019 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occurred."), &out,
1020 ("Failed: client_"));
1024 CHECK_ARGS(args, kListenerId, std::string, out);
1026 JsonCallback callback = [this, args](picojson::value* data) -> void {
1027 if (nullptr == data) {
1028 LoggerE("No data passed to json callback");
1032 picojson::object& request_o = data->get<picojson::object>();
1033 request_o[kListenerId] = args.get(kListenerId);
1035 Instance::PostMessage(this, data->serialize().c_str());
1038 auto result = client_->SetCustomEventListener(callback);
1040 LogAndReportError(result, &out);
1047 void MediaControllerInstance::MediaControllerClientUnsetCustomEventListener(
1048 const picojson::value& args, picojson::object& out) {
1051 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occurred."), &out,
1052 ("Failed: client_"));
1056 auto result = client_->UnsetCustomEventListener();
1058 LogAndReportError(result, &out);
1065 void MediaControllerInstance::MediaControllerClientFindServers(const picojson::value& args,
1066 picojson::object& out) {
1069 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1070 (MediaControllerClientUnknownErrorMsg));
1074 CHECK_EXIST(args, kCallbackId, out)
1076 auto search = [this, args]() -> void {
1077 picojson::value response = picojson::value(picojson::object());
1078 picojson::object& response_obj = response.get<picojson::object>();
1080 picojson::value servers = picojson::value(picojson::array());
1081 PlatformResult result = client_->FindServers(&servers.get<picojson::array>());
1083 response_obj[kCallbackId] = args.get(kCallbackId);
1085 ReportSuccess(servers, response_obj);
1087 LogAndReportError(result, &response_obj, ("Failed to find servers"));
1090 Instance::PostMessage(this, response.serialize().c_str());
1093 TaskQueue::GetInstance().Async(search);
1098 void MediaControllerInstance::MediaControllerClientGetLatestServerInfo(const picojson::value& args,
1099 picojson::object& out) {
1102 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1103 (MediaControllerClientUnknownErrorMsg));
1107 picojson::value server_info = picojson::value();
1108 PlatformResult result = client_->GetLatestServerInfo(&server_info);
1110 LogAndReportError(result, &out, ("Failed: client_->GetLatestServerInfo"));
1114 ReportSuccess(server_info, out);
1117 void MediaControllerInstance::MediaControllerClientGetPlaybackInfo(const picojson::value& args,
1118 picojson::object& out) {
1121 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1122 (MediaControllerClientUnknownErrorMsg));
1126 CHECK_EXIST(args, kName, out)
1128 picojson::value playback_info = picojson::value(picojson::object());
1129 PlatformResult result = client_->GetPlaybackInfo(args.get(kName).get<std::string>(),
1130 &playback_info.get<picojson::object>());
1133 LogAndReportError(result, &out, ("Failed: client_->GetPlaybackInfo"));
1137 ReportSuccess(playback_info, out);
1140 void MediaControllerInstance::MediaControllerClientGetPlaybackAbility(const picojson::value& args,
1141 picojson::object& out) {
1145 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1146 (MediaControllerClientUnknownErrorMsg));
1150 CHECK_ARGS(args, kServerName, std::string, out)
1151 CHECK_ARGS(args, kAction, std::string, out)
1153 std::string server_name = args.get(kServerName).get<std::string>();
1154 std::string action = args.get(kAction).get<std::string>();
1155 picojson::value ability = picojson::value(picojson::object());
1156 PlatformResult result = client_->GetPlaybackAbility(server_name, action, &ability);
1158 LogAndReportError(result, &out, ("Failed: client_->GetPlaybackAbility"));
1162 ReportSuccess(ability, out);
1165 void MediaControllerInstance::MediaControllerClientGetDisplayModeAbility(
1166 const picojson::value& args, picojson::object& out) {
1170 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1171 (MediaControllerClientUnknownErrorMsg));
1175 CHECK_ARGS(args, kServerName, std::string, out)
1176 CHECK_ARGS(args, kMode, std::string, out)
1178 std::string server_name = args.get(kServerName).get<std::string>();
1179 std::string mode = args.get(kMode).get<std::string>();
1180 std::string ability;
1181 PlatformResult result = client_->GetDisplayModeAbility(server_name, mode, &ability);
1183 LogAndReportError(result, &out, ("Failed: client_->GetDisplayModeAbility"));
1187 ReportSuccess(picojson::value(ability), out);
1190 void MediaControllerInstance::MediaControllerClientGetDisplayRotationAbility(
1191 const picojson::value& args, picojson::object& out) {
1195 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1196 (MediaControllerClientUnknownErrorMsg));
1200 CHECK_ARGS(args, kServerName, std::string, out)
1201 CHECK_ARGS(args, kDisplayRotationAbility, std::string, out)
1203 std::string server_name = args.get(kServerName).get<std::string>();
1204 std::string display_rotation_ability = args.get(kDisplayRotationAbility).get<std::string>();
1205 std::string ability;
1207 PlatformResult result =
1208 client_->GetDisplayRotationAbility(server_name, display_rotation_ability, &ability);
1210 LogAndReportError(result, &out, ("Failed: client_->GetDisplayRotationAbility"));
1214 ReportSuccess(picojson::value(ability), out);
1217 void MediaControllerInstance::MediaControllerClientGetSimpleAbility(const picojson::value& args,
1218 picojson::object& out) {
1222 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1223 (MediaControllerClientUnknownErrorMsg));
1227 CHECK_ARGS(args, kAbilityType, std::string, out)
1228 CHECK_ARGS(args, kServerName, std::string, out)
1230 picojson::value ability_val = picojson::value();
1231 std::string ability_type = args.get(kAbilityType).get<std::string>();
1232 std::string server_name = args.get(kServerName).get<std::string>();
1233 PlatformResult result = client_->GetSimpleAbility(server_name, ability_type, &ability_val);
1235 LogAndReportError(result, &out, ("Failed: client_->GetSimpleAbility"));
1239 ReportSuccess(ability_val, out);
1242 void MediaControllerInstance::MediaControllerClientFindSubscribedServers(
1243 const picojson::value& args, picojson::object& out) {
1247 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1248 (MediaControllerClientUnknownErrorMsg));
1252 CHECK_EXIST(args, kCallbackId, out)
1254 picojson::value callback_id = args.get(kCallbackId);
1256 auto search = [this, callback_id]() -> void {
1257 picojson::value response = picojson::value(picojson::object());
1258 picojson::object& response_obj = response.get<picojson::object>();
1260 picojson::value servers = picojson::value(picojson::array());
1261 PlatformResult result = client_->FindSubscribedServers(&servers.get<picojson::array>());
1263 response_obj[kCallbackId] = callback_id;
1265 ReportSuccess(servers, response_obj);
1267 LogAndReportError(result, &response_obj, ("Failed to find subscribed servers"));
1270 Instance::PostMessage(this, response.serialize().c_str());
1273 TaskQueue::GetInstance().Async(search);
1278 void MediaControllerInstance::MediaControllerServerInfoSendPlaybackState(
1279 const picojson::value& args, picojson::object& out) {
1282 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1283 (MediaControllerClientUnknownErrorMsg));
1287 CHECK_EXIST(args, kCallbackId, out)
1288 CHECK_EXIST(args, kName, out)
1289 CHECK_EXIST(args, kState, out)
1291 auto send = [this, args]() -> void {
1292 picojson::value response = picojson::value(picojson::object());
1293 picojson::object& response_obj = response.get<picojson::object>();
1294 response_obj[kCallbackId] = args.get(kCallbackId);
1296 PlatformResult result = client_->SendPlaybackState(args.get(kName).get<std::string>(),
1297 args.get(kState).get<std::string>());
1300 ReportSuccess(response_obj);
1302 LogAndReportError(result, &response_obj, ("Failed: client_->SendPlaybackState"));
1305 Instance::PostMessage(this, response.serialize().c_str());
1308 TaskQueue::GetInstance().Async(send);
1313 void MediaControllerInstance::MediaControllerServerInfoSendPlaybackPosition(
1314 const picojson::value& args, picojson::object& out) {
1317 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1318 (MediaControllerClientUnknownErrorMsg));
1322 CHECK_ARGS(args, kCallbackId, double, out)
1323 CHECK_ARGS(args, kServerName, std::string, out)
1324 CHECK_ARGS(args, kPosition, double, out)
1326 auto send = [this, args]() -> void {
1327 picojson::value response = picojson::value(picojson::object());
1328 picojson::object& response_obj = response.get<picojson::object>();
1329 response_obj[kCallbackId] = args.get(kCallbackId);
1330 const std::string& server_name = args.get(kServerName).get<std::string>();
1331 const unsigned long long position =
1332 static_cast<unsigned long long>(args.get(kPosition).get<double>());
1334 PlatformResult result = client_->SendPlaybackPosition(server_name, position);
1337 ReportSuccess(response_obj);
1339 LogAndReportError(result, &response_obj, ("Failed: client_->SendPlaybackPosition"));
1342 Instance::PostMessage(this, response.serialize().c_str());
1345 TaskQueue::GetInstance().Async(send);
1350 void MediaControllerInstance::MediaControllerServerInfoSendShuffleMode(const picojson::value& args,
1351 picojson::object& out) {
1355 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1356 (MediaControllerClientUnknownErrorMsg));
1360 CHECK_ARGS(args, kCallbackId, double, out)
1361 CHECK_ARGS(args, kServerName, std::string, out)
1362 CHECK_ARGS(args, kMode, bool, out)
1364 auto send = [this, args]() -> void {
1365 picojson::value response = picojson::value(picojson::object());
1366 picojson::object& response_obj = response.get<picojson::object>();
1367 response_obj[kCallbackId] = args.get(kCallbackId);
1369 const std::string& server_name = args.get(kServerName).get<std::string>();
1370 const bool mode = args.get(kMode).get<bool>();
1372 PlatformResult result = client_->SendShuffleMode(server_name, mode);
1375 ReportSuccess(response_obj);
1377 LogAndReportError(result, &response_obj, ("Failed to send shuffle mode."));
1380 Instance::PostMessage(this, response.serialize().c_str());
1383 TaskQueue::GetInstance().Async(send);
1388 void MediaControllerInstance::MediaControllerServerInfoSendRepeatMode(const picojson::value& args,
1389 picojson::object& out) {
1391 common::tools::PrintDeprecationWarningFor("sendRepeatMode()", "sendRepeatState()");
1393 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1394 (MediaControllerClientUnknownErrorMsg));
1398 CHECK_EXIST(args, kCallbackId, out)
1399 CHECK_EXIST(args, kName, out)
1400 CHECK_EXIST(args, kMode, out)
1402 auto send = [this, args]() -> void {
1403 picojson::value response = picojson::value(picojson::object());
1404 picojson::object& response_obj = response.get<picojson::object>();
1405 response_obj[kCallbackId] = args.get(kCallbackId);
1407 PlatformResult result =
1408 client_->SendRepeatMode(args.get(kName).get<std::string>(), args.get(kMode).get<bool>());
1411 ReportSuccess(response_obj);
1413 LogAndReportError(result, &response_obj, ("Failed to send repeat mode."));
1416 Instance::PostMessage(this, response.serialize().c_str());
1419 TaskQueue::GetInstance().Async(send);
1424 void MediaControllerInstance::MediaControllerServerInfoSendRepeatState(const picojson::value& args,
1425 picojson::object& out) {
1428 auto send = [this, args]() {
1429 picojson::value response = picojson::value(picojson::object());
1430 picojson::object& response_obj = response.get<picojson::object>();
1431 response_obj[kCallbackId] = args.get(kCallbackId);
1433 const std::string& server_name = args.get(kServerName).get<std::string>();
1434 const std::string& state = args.get(kState).get<std::string>();
1436 PlatformResult result = client_->SendRepeatState(server_name, state);
1439 ReportSuccess(response_obj);
1441 LogAndReportError(result, &response_obj, ("Failed to send repeat state."));
1444 Instance::PostMessage(this, response.serialize().c_str());
1447 TaskQueue::GetInstance().Async(send);
1452 void MediaControllerInstance::MediaControllerServerInfoSendSearchRequest(
1453 const picojson::value& args, picojson::object& out) {
1457 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Client not initialized."), &out,
1458 (MediaControllerClientUnknownErrorMsg));
1462 CHECK_EXIST(args, kListenerId, out);
1463 CHECK_EXIST(args, kName, out);
1464 CHECK_EXIST(args, kRequest, out);
1466 JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
1467 picojson::object& reply_obj = reply->get<picojson::object>();
1468 reply_obj[kListenerId] = args.get(kListenerId);
1469 Instance::PostMessage(this, reply->serialize().c_str());
1472 char* request_id = nullptr;
1477 PlatformResult result = client_->SendSearchRequest(args.get(kName).get<std::string>(),
1478 args.get(kRequest), reply_cb, &request_id);
1482 out[kRequestId] = picojson::value(std::string(request_id));
1484 LogAndReportError(result, &out, ("Failed to send command."));
1488 void MediaControllerInstance::MediaControllerServerInfoSendCommand(const picojson::value& args,
1489 picojson::object& out) {
1492 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1493 (MediaControllerClientUnknownErrorMsg));
1497 CHECK_EXIST(args, kListenerId, out)
1498 CHECK_EXIST(args, kName, out)
1499 CHECK_EXIST(args, kCommand, out)
1500 CHECK_EXIST(args, kData, out)
1502 JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
1503 picojson::object& reply_obj = reply->get<picojson::object>();
1504 reply_obj[kListenerId] = args.get(kListenerId);
1505 Instance::PostMessage(this, reply->serialize().c_str());
1508 char* request_id = nullptr;
1513 PlatformResult result = client_->SendCommand(args.get(kName).get<std::string>(),
1514 args.get(kCommand).get<std::string>(),
1515 args.get(kData), reply_cb, &request_id);
1519 out[kRequestId] = picojson::value(std::string(request_id));
1521 LogAndReportError(result, &out, ("Failed to send command."));
1525 void MediaControllerInstance::MediaControllerServerInfoAddServerStatusChangeListener(
1526 const picojson::value& args, picojson::object& out) {
1529 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1530 (MediaControllerClientUnknownErrorMsg));
1534 CHECK_EXIST(args, kListenerId, out)
1536 JsonCallback callback = [this, args](picojson::value* data) -> void {
1537 if (nullptr == data) {
1538 LoggerE("No data passed to json callback");
1542 picojson::object& request_o = data->get<picojson::object>();
1543 request_o[kListenerId] = args.get(kListenerId);
1545 Instance::PostMessage(this, data->serialize().c_str());
1548 auto result = client_->SetServerStatusChangeListener(callback);
1550 LogAndReportError(result, &out);
1556 void MediaControllerInstance::MediaControllerServerInfoRemoveServerStatusChangeListener(
1557 const picojson::value& args, picojson::object& out) {
1560 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1561 (MediaControllerClientUnknownErrorMsg));
1565 auto result = client_->UnsetServerStatusChangeListener();
1567 LogAndReportError(result, &out);
1571 void MediaControllerInstance::MediaControllerServerInfoAddPlaybackInfoChangeListener(
1572 const picojson::value& args, picojson::object& out) {
1575 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1576 (MediaControllerClientUnknownErrorMsg));
1580 CHECK_EXIST(args, kListenerId, out)
1582 JsonCallback callback = [this, args](picojson::value* data) -> void {
1584 LoggerE("No data passed to json callback");
1588 picojson::object& request_o = data->get<picojson::object>();
1589 request_o[kListenerId] = args.get(kListenerId);
1591 Instance::PostMessage(this, data->serialize().c_str());
1594 auto result = client_->SetPlaybackInfoListener(callback);
1596 LogAndReportError(result, &out);
1603 void MediaControllerInstance::MediaControllerServerInfoRemovePlaybackInfoChangeListener(
1604 const picojson::value& args, picojson::object& out) {
1606 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1607 (MediaControllerClientUnknownErrorMsg));
1611 auto result = client_->UnsetPlaybackInfoListener();
1613 LogAndReportError(result, &out);
1617 void MediaControllerInstance::MediaControllerServerInfoSendPlaybackItem(const picojson::value& args,
1618 picojson::object& out) {
1622 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Client not initialized."), &out,
1623 (MediaControllerClientUnknownErrorMsg));
1627 CHECK_ARGS(args, kServerName, std::string, out)
1628 CHECK_ARGS(args, kPlaylistName, std::string, out)
1629 CHECK_ARGS(args, kIndex, std::string, out)
1630 CHECK_ARGS(args, kState, std::string, out)
1631 CHECK_ARGS(args, kPosition, double, out)
1633 const std::string& server_name = args.get(kServerName).get<std::string>();
1634 const std::string& playlist_name = args.get(kPlaylistName).get<std::string>();
1635 const std::string& index = args.get(kIndex).get<std::string>();
1636 const std::string& state = args.get(kState).get<std::string>();
1637 const int position = static_cast<unsigned long long>(args.get(kPosition).get<double>());
1639 auto result = client_->SendPlaybackItem(server_name, playlist_name, index, state, position);
1641 LogAndReportError(result, &out);
1648 void MediaControllerInstance::MediaControllerServerInfoAddPlaylistUpdatedListener(
1649 const picojson::value& args, picojson::object& out) {
1652 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1653 (MediaControllerClientUnknownErrorMsg));
1657 CHECK_EXIST(args, kListenerId, out)
1659 JsonCallback callback = [this, args](picojson::value* data) -> void {
1661 LoggerE("No data passed to json callback");
1665 picojson::object& request_o = data->get<picojson::object>();
1666 request_o[kListenerId] = args.get(kListenerId);
1668 Instance::PostMessage(this, data->serialize().c_str());
1671 auto result = client_->SetPlaylistUpdateListener(callback);
1673 LogAndReportError(result, &out);
1680 void MediaControllerInstance::MediaControllerServerInfoRemovePlaylistUpdatedListener(
1681 const picojson::value& args, picojson::object& out) {
1683 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1684 (MediaControllerClientUnknownErrorMsg));
1688 auto result = client_->UnsetPlaylistUpdateListener();
1690 LogAndReportError(result, &out);
1697 void MediaControllerInstance::MediaControllerServerInfoGetAllPlaylists(const picojson::value& args,
1698 picojson::object& out) {
1701 CHECK_ARGS(args, kServerName, std::string, out)
1703 auto get = [this, args]() -> void {
1704 picojson::value response = picojson::value(picojson::object());
1705 picojson::object& response_obj = response.get<picojson::object>();
1707 response_obj[kCallbackId] = args.get(kCallbackId);
1709 std::map<std::string, mc_playlist_h> new_playlists_map;
1710 std::string serverName = args.get(kServerName).get<std::string>();
1711 auto result = utils::GetAllPlaylistsHandles(serverName, &new_playlists_map);
1713 LogAndReportError(result, &response_obj, ("Failed: utils::GetAllPlaylists"));
1714 Instance::PostMessage(this, response.serialize().c_str());
1717 // update the list of stored handles
1719 std::lock_guard<std::mutex> lock(playlist_map_mutex_);
1720 utils::UpdatePlaylistHandleMap(serverName, new_playlists_map, server_playlist_map_);
1721 picojson::value playlists = utils::CreatePlaylistsJSON(serverName, new_playlists_map);
1723 response_obj[kResult] = picojson::value{playlists};
1725 ReportSuccess(response_obj);
1726 Instance::PostMessage(this, response.serialize().c_str());
1729 TaskQueue::GetInstance().Async(get);
1734 void MediaControllerInstance::MediaControllerPlaylistsInfoGetPlaylist(const picojson::value& args,
1735 picojson::object& out) {
1738 CHECK_ARGS(args, kServerName, std::string, out);
1739 CHECK_ARGS(args, kPlaylistName, std::string, out);
1741 const std::string& server_name = args.get(kServerName).get<std::string>();
1742 const std::string& playlist_name = args.get(kPlaylistName).get<std::string>();
1743 picojson::value playlist_info = picojson::value(picojson::object());
1744 picojson::object& playlist_obj = playlist_info.get<picojson::object>();
1746 PlatformResult result = utils::GetPlaylist(server_name, playlist_name, &playlist_obj);
1748 LogAndReportError(result, &out, ("Failed: utils::GetPlaylist"));
1752 ReportSuccess(playlist_info, out);
1755 void MediaControllerInstance::MediaControllerServerInfoGetIconURI(const picojson::value& args,
1756 picojson::object& out) {
1758 CHECK_ARGS(args, kName, std::string, out);
1761 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1762 (MediaControllerClientUnknownErrorMsg));
1766 std::string server_name = args.get(kName).get<std::string>();
1768 common::optional<std::string> icon_uri;
1769 PlatformResult status = client_->GetServerIconURI(server_name, &icon_uri);
1771 LogAndReportError(status, &out, ("Failed: client_->GetServerIconURI()"));
1775 picojson::object result;
1777 result[kIconURI] = picojson::value(*icon_uri);
1779 result[kIconURI] = picojson::value();
1782 ReportSuccess(picojson::value(result), out);
1785 void MediaControllerInstance::MediaControllerServerInfoPlaybackInfoSendPlaybackAction(
1786 const picojson::value& args, picojson::object& out) {
1789 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1790 (MediaControllerClientUnknownErrorMsg));
1794 CHECK_ARGS(args, kServerName, std::string, out)
1795 CHECK_ARGS(args, kAttribute, std::string, out)
1796 CHECK_ARGS(args, kListenerId, std::string, out)
1798 JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
1800 picojson::object& reply_obj = reply->get<picojson::object>();
1801 reply_obj[kListenerId] = args.get(kListenerId);
1802 Instance::PostMessage(this, reply->serialize().c_str());
1804 LoggerW("No reply passed to json callback, ignoring");
1808 char* request_id = nullptr;
1813 const std::string& server_name = args.get(kServerName).get<std::string>();
1814 const std::string& action = args.get(kAttribute).get<std::string>();
1816 PlatformResult result = client_->SendPlaybackAction(server_name, action, reply_cb, &request_id);
1820 out[kRequestId] = picojson::value(std::string(request_id));
1822 LogAndReportError(result, &out, ("Failed to send playback action."));
1826 void MediaControllerInstance::MediaControllerServerInfoPlaybackInfoSendPlaybackPosition(
1827 const picojson::value& args, picojson::object& out) {
1830 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1831 (MediaControllerClientUnknownErrorMsg));
1835 CHECK_ARGS(args, kServerName, std::string, out)
1836 CHECK_ARGS(args, kAttribute, double, out)
1837 CHECK_ARGS(args, kListenerId, std::string, out)
1839 JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
1841 picojson::object& reply_obj = reply->get<picojson::object>();
1842 reply_obj[kListenerId] = args.get(kListenerId);
1843 Instance::PostMessage(this, reply->serialize().c_str());
1845 LoggerW("No reply passed to json callback, ignoring");
1849 char* request_id = nullptr;
1854 const std::string& server_name = args.get(kServerName).get<std::string>();
1855 const unsigned long long position =
1856 static_cast<unsigned long long>(args.get(kAttribute).get<double>());
1858 PlatformResult result =
1859 client_->SendPlaybackPosition(server_name, position, reply_cb, &request_id);
1863 out[kRequestId] = picojson::value(std::string(request_id));
1865 LogAndReportError(result, &out, ("Failed to send playback position."));
1869 void MediaControllerInstance::MediaControllerServerInfoPlaybackInfoSendShuffleMode(
1870 const picojson::value& args, picojson::object& out) {
1873 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1874 (MediaControllerClientUnknownErrorMsg));
1878 CHECK_ARGS(args, kServerName, std::string, out)
1879 CHECK_ARGS(args, kAttribute, bool, out)
1880 CHECK_ARGS(args, kListenerId, std::string, out)
1882 JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
1884 picojson::object& reply_obj = reply->get<picojson::object>();
1885 reply_obj[kListenerId] = args.get(kListenerId);
1886 Instance::PostMessage(this, reply->serialize().c_str());
1888 LoggerW("No reply passed to json callback, ignoring");
1892 char* request_id = nullptr;
1897 const std::string& server_name = args.get(kServerName).get<std::string>();
1898 const bool mode = args.get(kAttribute).get<bool>();
1900 PlatformResult result = client_->SendShuffleMode(server_name, mode, reply_cb, &request_id);
1904 out[kRequestId] = picojson::value(std::string(request_id));
1906 LogAndReportError(result, &out, ("Failed to send playback position."));
1910 void MediaControllerInstance::MediaControllerServerInfoPlaybackInfoSendRepeatState(
1911 const picojson::value& args, picojson::object& out) {
1914 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1915 (MediaControllerClientUnknownErrorMsg));
1919 CHECK_ARGS(args, kServerName, std::string, out)
1920 CHECK_ARGS(args, kAttribute, std::string, out)
1921 CHECK_ARGS(args, kListenerId, std::string, out)
1923 JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
1925 picojson::object& reply_obj = reply->get<picojson::object>();
1926 reply_obj[kListenerId] = args.get(kListenerId);
1927 Instance::PostMessage(this, reply->serialize().c_str());
1929 LoggerW("No reply passed to json callback, ignoring");
1933 char* request_id = nullptr;
1938 const std::string& server_name = args.get(kServerName).get<std::string>();
1939 const std::string& state = args.get(kAttribute).get<std::string>();
1941 PlatformResult result = client_->SendRepeatState(server_name, state, reply_cb, &request_id);
1945 out[kRequestId] = picojson::value(std::string(request_id));
1947 LogAndReportError(result, &out, ("Failed to send playback position."));
1951 void MediaControllerInstance::MediaControllerClientAddAbilityChangeListener(
1952 const picojson::value& args, picojson::object& out) {
1956 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1957 (MediaControllerClientUnknownErrorMsg));
1961 CHECK_EXIST(args, kListenerId, out)
1963 picojson::value listener_id = args.get(kListenerId);
1965 JsonCallback callback = [this, listener_id](picojson::value* data) -> void {
1967 LoggerE("No data passed to json callback");
1971 picojson::object& request_o = data->get<picojson::object>();
1972 request_o[kListenerId] = listener_id;
1974 Instance::PostMessage(this, data->serialize().c_str());
1977 auto result = client_->SetAbilityChangeListener(callback);
1979 LogAndReportError(result, &out);
1986 void MediaControllerInstance::MediaControllerClientRemoveAbilityChangeListener(
1987 const picojson::value& args, picojson::object& out) {
1991 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
1992 (MediaControllerClientUnknownErrorMsg));
1996 auto result = client_->UnsetAbilityChangeListener();
1998 LogAndReportError(result, &out);
2005 void MediaControllerInstance::MediaControllerAbilitiesInfoSubscribe(const picojson::value& args,
2006 picojson::object& out) {
2010 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2011 (MediaControllerClientUnknownErrorMsg));
2015 CHECK_ARGS(args, kServerName, std::string, out)
2017 const std::string& server_name = args.get(kServerName).get<std::string>();
2018 auto result = client_->SubscribeServer(server_name);
2020 LogAndReportError(result, &out);
2027 void MediaControllerInstance::MediaControllerAbilitiesInfoUnsubscribe(const picojson::value& args,
2028 picojson::object& out) {
2032 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2033 (MediaControllerClientUnknownErrorMsg));
2037 CHECK_ARGS(args, kServerName, std::string, out)
2039 const std::string& server_name = args.get(kServerName).get<std::string>();
2040 auto result = client_->UnsubscribeServer(server_name);
2042 LogAndReportError(result, &out);
2049 void MediaControllerInstance::MediaControllerPlaylistAddItem(const picojson::value& args,
2050 picojson::object& out) {
2053 // MediaControllerPlaylistAddItem is implemented in MediaControllerServer because
2054 // mc_server_add_item_to_playlist need mc_server_h as parameter
2056 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Server not initialized."), &out,
2057 (MediaControllerServerUnknownErrorMsg));
2061 CHECK_ARGS(args, kIndex, std::string, out)
2062 CHECK_ARGS(args, kMetadata, picojson::object, out)
2063 CHECK_ARGS(args, kName, std::string, out)
2065 const picojson::object& metadata = args.get(kMetadata).get<picojson::object>();
2067 auto name = args.get(kName).get<std::string>();
2069 std::string serverName = "";
2070 if (args.contains(kServerName)) {
2071 serverName = args.get(kServerName).get<std::string>();
2073 serverName = common::CurrentApplication::GetInstance().GetApplicationId();
2076 PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
2077 std::lock_guard<std::mutex> lock(playlist_map_mutex_);
2079 if (server_playlist_map_.find(serverName) == server_playlist_map_.end() ||
2080 server_playlist_map_[serverName].find(name) == server_playlist_map_[serverName].end()) {
2081 result = LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Playlist with given name doesn't exist");
2082 LogAndReportError(result, &out);
2086 result = server_->MediaControllerPlaylistAddItem(server_playlist_map_[serverName][name],
2087 args.get(kIndex).get<std::string>(), metadata);
2089 LogAndReportError(result, &out);
2096 void MediaControllerInstance::MediaControllerPlaylistGetItems(const picojson::value& args,
2097 picojson::object& out) {
2100 CHECK_EXIST(args, kCallbackId, out)
2101 CHECK_ARGS(args, kName, std::string, out)
2102 CHECK_ARGS(args, kServerName, std::string, out)
2104 auto get = [this, args]() -> void {
2105 picojson::value response = picojson::value(picojson::object());
2106 picojson::object& response_obj = response.get<picojson::object>();
2108 response_obj[kCallbackId] = args.get(kCallbackId);
2110 picojson::value items{picojson::array{}};
2112 auto name = args.get(kName).get<std::string>();
2113 auto serverName = args.get(kServerName).get<std::string>();
2115 PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
2117 std::lock_guard<std::mutex> lock(playlist_map_mutex_);
2119 if (server_playlist_map_.find(serverName) == server_playlist_map_.end() ||
2120 server_playlist_map_[serverName].find(name) == server_playlist_map_[serverName].end()) {
2122 LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Playlist with given name doesn't exist");
2123 LogAndReportError(result, &response_obj,
2124 ("Failed: MediaControllerInstance::MediaControllerPlaylistGetItems"));
2125 Instance::PostMessage(this, response.serialize().c_str());
2129 result = utils::MediaControllerPlaylistGetItems(server_playlist_map_[serverName][name],
2130 &items.get<picojson::array>());
2133 LogAndReportError(result, &response_obj, ("Failed: utils::MediaControllerPlaylistGetItems"));
2134 Instance::PostMessage(this, response.serialize().c_str());
2138 response_obj[kResult] = picojson::value{items};
2139 ReportSuccess(response_obj);
2140 Instance::PostMessage(this, response.serialize().c_str());
2143 TaskQueue::GetInstance().Async(get);
2148 void MediaControllerInstance::MediaControllerPlaylistsGetPlaylist(const picojson::value& args,
2149 picojson::object& out) {
2152 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2153 (MediaControllerServerUnknownErrorMsg));
2156 CHECK_ARGS(args, kPlaylistName, std::string, out);
2158 const std::string& playlist_name = args.get(kPlaylistName).get<std::string>();
2159 const std::string& app_id = common::CurrentApplication::GetInstance().GetApplicationId();
2160 picojson::value playlist_info = picojson::value(picojson::object());
2161 picojson::object& playlist_obj = playlist_info.get<picojson::object>();
2163 std::lock_guard<std::mutex> lock(playlist_map_mutex_);
2164 mc_playlist_h handle = nullptr;
2165 if (server_playlist_map_.find(app_id) != server_playlist_map_.end() &&
2166 server_playlist_map_[app_id].find(playlist_name) != server_playlist_map_[app_id].end()) {
2167 LoggerD("Using saved handle");
2168 handle = server_playlist_map_[app_id][playlist_name];
2171 auto result = utils::GetPlaylist(app_id, playlist_name, &playlist_obj, &handle);
2173 LogAndReportError(result, &out, ("Failed: utils::GetPlaylist"));
2177 // update the list of stored handles
2178 server_playlist_map_[app_id][playlist_name] = handle;
2180 ReportSuccess(playlist_info, out);
2184 void MediaControllerInstance::MediaControllerSubtitlesUpdateEnabled(const picojson::value& args,
2185 picojson::object& out) {
2189 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2190 (MediaControllerServerUnknownErrorMsg));
2194 CHECK_ARGS(args, kEnabled, bool, out);
2196 const bool enabled = args.get(kEnabled).get<bool>();
2197 PlatformResult result = server_->UpdateSubtitlesEnabled(enabled);
2199 LogAndReportError(result, &out, ("Failed server_->UpdateSubtitlesEnabled()"));
2205 void MediaControllerInstance::MediaControllerSubtitlesAddChangeRequestListener(
2206 const picojson::value& args, picojson::object& out) {
2209 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2210 (MediaControllerServerUnknownErrorMsg));
2214 CHECK_ARGS(args, kListenerId, std::string, out)
2216 JsonCallback callback = [this, args](picojson::value* data) -> void {
2218 LoggerE("No data passed to json callback");
2221 picojson::object& request_o = data->get<picojson::object>();
2222 request_o[kListenerId] = args.get(kListenerId);
2224 Instance::PostMessage(this, data->serialize().c_str());
2227 auto result = server_->SetSubtitlesChangeRequestListener(callback);
2229 LogAndReportError(result, &out);
2236 void MediaControllerInstance::MediaControllerSubtitlesRemoveChangeRequestListener(
2237 const picojson::value& args, picojson::object& out) {
2240 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2241 (MediaControllerServerUnknownErrorMsg));
2245 auto result = server_->UnsetSubtitlesChangeRequestListener();
2247 LogAndReportError(result, &out);
2253 void MediaControllerInstance::MediaControllerSubtitlesInfoGetEnabled(const picojson::value& args,
2254 picojson::object& out) {
2257 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2258 (MediaControllerClientUnknownErrorMsg));
2262 CHECK_ARGS(args, kName, std::string, out)
2264 bool enabled = false;
2265 PlatformResult result =
2266 client_->GetSubtitlesEnabled(args.get(kName).get<std::string>(), &enabled);
2269 LogAndReportError(result, &out, ("Failed: client_->GetSubtitlesEnabled"));
2273 ReportSuccess(picojson::value(enabled), out);
2276 void MediaControllerInstance::MediaControllerSubtitlesInfoSendRequest(const picojson::value& args,
2277 picojson::object& out) {
2280 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2281 (MediaControllerClientUnknownErrorMsg));
2285 CHECK_ARGS(args, kListenerId, std::string, out)
2286 CHECK_ARGS(args, kName, std::string, out)
2287 CHECK_ARGS(args, kEnabled, bool, out)
2289 JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
2291 picojson::object& reply_obj = reply->get<picojson::object>();
2292 reply_obj[kListenerId] = args.get(kListenerId);
2293 Instance::PostMessage(this, reply->serialize().c_str());
2295 LoggerW("No reply passed to json callback, ignoring");
2299 char* request_id = nullptr;
2304 PlatformResult result = client_->SendSubtitlesEnabled(
2305 args.get(kName).get<std::string>(), args.get(kEnabled).get<bool>(), reply_cb, &request_id);
2309 out[kRequestId] = picojson::value(std::string(request_id));
2311 LogAndReportError(result, &out, ("Failed to send command."));
2315 void MediaControllerInstance::MediaControllerSubtitlesInfoAddModeChangeListener(
2316 const picojson::value& args, picojson::object& out) {
2319 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2320 (MediaControllerClientUnknownErrorMsg));
2324 CHECK_ARGS(args, kListenerId, std::string, out)
2326 JsonCallback callback = [this, args](picojson::value* data) -> void {
2327 if (nullptr == data) {
2328 LoggerE("No data passed to json callback");
2332 picojson::object& request_o = data->get<picojson::object>();
2333 request_o[kListenerId] = args.get(kListenerId);
2335 Instance::PostMessage(this, data->serialize().c_str());
2338 auto result = client_->SetSubtitlesInfoChangeListener(callback);
2340 LogAndReportError(result, &out);
2347 void MediaControllerInstance::MediaControllerSubtitlesInfoRemoveModeChangeListener(
2348 const picojson::value& args, picojson::object& out) {
2351 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2352 (MediaControllerClientUnknownErrorMsg));
2356 auto result = client_->UnsetSubtitlesInfoChangeListener();
2358 LogAndReportError(result, &out);
2366 void MediaControllerInstance::MediaControllerMode360UpdateEnabled(const picojson::value& args,
2367 picojson::object& out) {
2371 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2372 (MediaControllerServerUnknownErrorMsg));
2376 CHECK_ARGS(args, kEnabled, bool, out)
2378 const bool enabled = args.get(kEnabled).get<bool>();
2379 PlatformResult result = server_->UpdateMode360Enabled(enabled);
2381 LogAndReportError(result, &out, ("Failed server_->UpdateMode360Enabled()"));
2387 void MediaControllerInstance::MediaControllerMode360AddChangeRequestListener(
2388 const picojson::value& args, picojson::object& out) {
2391 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2392 (MediaControllerServerUnknownErrorMsg));
2396 CHECK_ARGS(args, kListenerId, std::string, out)
2398 JsonCallback callback = [this, args](picojson::value* data) -> void {
2400 LoggerE("No data passed to json callback");
2403 picojson::object& request_o = data->get<picojson::object>();
2404 request_o[kListenerId] = args.get(kListenerId);
2406 Instance::PostMessage(this, data->serialize().c_str());
2409 auto result = server_->SetMode360ChangeRequestListener(callback);
2411 LogAndReportError(result, &out);
2418 void MediaControllerInstance::MediaControllerMode360RemoveChangeRequestListener(
2419 const picojson::value& args, picojson::object& out) {
2422 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2423 (MediaControllerServerUnknownErrorMsg));
2427 auto result = server_->UnsetMode360ChangeRequestListener();
2429 LogAndReportError(result, &out);
2435 void MediaControllerInstance::MediaControllerMode360InfoGetEnabled(const picojson::value& args,
2436 picojson::object& out) {
2439 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2440 (MediaControllerClientUnknownErrorMsg));
2444 CHECK_ARGS(args, kName, std::string, out)
2446 bool enabled = false;
2447 PlatformResult result = client_->GetMode360Enabled(args.get(kName).get<std::string>(), &enabled);
2450 LogAndReportError(result, &out, ("Failed: client_->GetMode360Enabled"));
2454 ReportSuccess(picojson::value(enabled), out);
2457 void MediaControllerInstance::MediaControllerMode360InfoSendRequest(const picojson::value& args,
2458 picojson::object& out) {
2461 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2462 (MediaControllerClientUnknownErrorMsg));
2466 CHECK_ARGS(args, kListenerId, std::string, out)
2467 CHECK_ARGS(args, kName, std::string, out)
2468 CHECK_ARGS(args, kEnabled, bool, out)
2470 JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
2472 picojson::object& reply_obj = reply->get<picojson::object>();
2473 reply_obj[kListenerId] = args.get(kListenerId);
2474 Instance::PostMessage(this, reply->serialize().c_str());
2476 LoggerW("No reply passed to json callback, ignoring");
2480 char* request_id = nullptr;
2485 PlatformResult result = client_->SendMode360Enabled(
2486 args.get(kName).get<std::string>(), args.get(kEnabled).get<bool>(), reply_cb, &request_id);
2490 out[kRequestId] = picojson::value(std::string(request_id));
2492 LogAndReportError(result, &out, ("Failed to send command."));
2496 void MediaControllerInstance::MediaControllerMode360InfoAddModeChangeListener(
2497 const picojson::value& args, picojson::object& out) {
2500 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2501 (MediaControllerClientUnknownErrorMsg));
2505 CHECK_ARGS(args, kListenerId, std::string, out)
2507 JsonCallback callback = [this, args](picojson::value* data) -> void {
2508 if (nullptr == data) {
2509 LoggerE("No data passed to json callback");
2513 picojson::object& request_o = data->get<picojson::object>();
2514 request_o[kListenerId] = args.get(kListenerId);
2516 Instance::PostMessage(this, data->serialize().c_str());
2519 auto result = client_->SetMode360InfoChangeListener(callback);
2521 LogAndReportError(result, &out);
2528 void MediaControllerInstance::MediaControllerMode360InfoRemoveModeChangeListener(
2529 const picojson::value& args, picojson::object& out) {
2532 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2533 (MediaControllerClientUnknownErrorMsg));
2537 auto result = client_->UnsetMode360InfoChangeListener();
2539 LogAndReportError(result, &out);
2547 void MediaControllerInstance::MediaControllerDisplayModeUpdateType(const picojson::value& args,
2548 picojson::object& out) {
2552 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2553 (MediaControllerServerUnknownErrorMsg));
2557 CHECK_ARGS(args, kType, std::string, out);
2559 const std::string type = args.get(kType).get<std::string>();
2560 PlatformResult result = server_->UpdateDisplayModeType(type);
2562 LogAndReportError(result, &out, ("Failed server_->UpdateDisplayModeType()"));
2568 void MediaControllerInstance::MediaControllerDisplayModeAddChangeRequestListener(
2569 const picojson::value& args, picojson::object& out) {
2572 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2573 (MediaControllerServerUnknownErrorMsg));
2577 CHECK_ARGS(args, kListenerId, std::string, out)
2579 JsonCallback callback = [this, args](picojson::value* data) -> void {
2581 LoggerE("No data passed to json callback");
2584 picojson::object& request_o = data->get<picojson::object>();
2585 request_o[kListenerId] = args.get(kListenerId);
2587 Instance::PostMessage(this, data->serialize().c_str());
2590 auto result = server_->SetDisplayModeChangeRequestListener(callback);
2592 LogAndReportError(result, &out);
2599 void MediaControllerInstance::MediaControllerDisplayModeRemoveChangeRequestListener(
2600 const picojson::value& args, picojson::object& out) {
2603 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2604 (MediaControllerServerUnknownErrorMsg));
2608 auto result = server_->UnsetDisplayModeChangeRequestListener();
2610 LogAndReportError(result, &out);
2616 void MediaControllerInstance::MediaControllerDisplayModeInfoGetType(const picojson::value& args,
2617 picojson::object& out) {
2620 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2621 (MediaControllerClientUnknownErrorMsg));
2625 CHECK_ARGS(args, kName, std::string, out)
2628 PlatformResult result = client_->GetDisplayModeType(args.get(kName).get<std::string>(), &type);
2631 LogAndReportError(result, &out, ("Failed: client_->GetDisplayModeType"));
2635 ReportSuccess(picojson::value(type), out);
2638 void MediaControllerInstance::MediaControllerDisplayModeInfoSendType(const picojson::value& args,
2639 picojson::object& out) {
2642 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2643 (MediaControllerClientUnknownErrorMsg));
2647 CHECK_ARGS(args, kListenerId, std::string, out)
2648 CHECK_ARGS(args, kName, std::string, out)
2649 CHECK_ARGS(args, kType, std::string, out)
2651 JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
2652 picojson::object& reply_obj = reply->get<picojson::object>();
2653 reply_obj[kListenerId] = args.get(kListenerId);
2654 Instance::PostMessage(this, reply->serialize().c_str());
2657 char* request_id = nullptr;
2662 PlatformResult result =
2663 client_->SendDisplayModeType(args.get(kName).get<std::string>(),
2664 args.get(kType).get<std::string>(), reply_cb, &request_id);
2668 out[kRequestId] = picojson::value(std::string(request_id));
2670 LogAndReportError(result, &out, ("Failed to send command."));
2674 void MediaControllerInstance::MediaControllerDisplayModeInfoAddModeChangeListener(
2675 const picojson::value& args, picojson::object& out) {
2678 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2679 (MediaControllerClientUnknownErrorMsg));
2683 CHECK_ARGS(args, kListenerId, std::string, out)
2685 JsonCallback callback = [this, args](picojson::value* data) -> void {
2686 if (nullptr == data) {
2687 LoggerE("No data passed to json callback");
2691 picojson::object& request_o = data->get<picojson::object>();
2692 request_o[kListenerId] = args.get(kListenerId);
2694 Instance::PostMessage(this, data->serialize().c_str());
2697 auto result = client_->SetDisplayModeInfoChangeListener(callback);
2699 LogAndReportError(result, &out);
2706 void MediaControllerInstance::MediaControllerDisplayModeInfoRemoveModeChangeListener(
2707 const picojson::value& args, picojson::object& out) {
2710 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2711 (MediaControllerClientUnknownErrorMsg));
2715 auto result = client_->UnsetDisplayModeInfoChangeListener();
2717 LogAndReportError(result, &out);
2725 void MediaControllerInstance::MediaControllerDisplayRotationUpdate(const picojson::value& args,
2726 picojson::object& out) {
2730 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2731 (MediaControllerServerUnknownErrorMsg));
2735 CHECK_ARGS(args, kDisplayRotation, std::string, out)
2737 const std::string display_rotation = args.get(kDisplayRotation).get<std::string>();
2738 PlatformResult result = server_->UpdateDisplayRotation(display_rotation);
2740 LogAndReportError(result, &out, ("Failed server_->UpdateDisplayRotation()"));
2746 void MediaControllerInstance::MediaControllerDisplayRotationAddChangeRequestListener(
2747 const picojson::value& args, picojson::object& out) {
2750 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2751 (MediaControllerServerUnknownErrorMsg));
2755 CHECK_ARGS(args, kListenerId, std::string, out)
2757 JsonCallback callback = [this, args](picojson::value* data) -> void {
2759 LoggerE("No data passed to json callback");
2762 picojson::object& request_o = data->get<picojson::object>();
2763 request_o[kListenerId] = args.get(kListenerId);
2765 Instance::PostMessage(this, data->serialize().c_str());
2768 auto result = server_->SetDisplayRotationChangeRequestListener(callback);
2770 LogAndReportError(result, &out);
2777 void MediaControllerInstance::MediaControllerDisplayRotationRemoveChangeRequestListener(
2778 const picojson::value& args, picojson::object& out) {
2781 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2782 (MediaControllerServerUnknownErrorMsg));
2786 auto result = server_->UnsetDisplayRotationChangeRequestListener();
2788 LogAndReportError(result, &out);
2794 void MediaControllerInstance::MediaControllerDisplayRotationInfoGet(const picojson::value& args,
2795 picojson::object& out) {
2798 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2799 (MediaControllerClientUnknownErrorMsg));
2803 CHECK_ARGS(args, kName, std::string, out)
2805 std::string rotation;
2806 PlatformResult result =
2807 client_->GetDisplayRotation(args.get(kName).get<std::string>(), &rotation);
2810 LogAndReportError(result, &out, ("Failed: client_->GetDisplayRotation"));
2814 ReportSuccess(picojson::value(rotation), out);
2817 void MediaControllerInstance::MediaControllerDisplayRotationInfoSend(const picojson::value& args,
2818 picojson::object& out) {
2821 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2822 (MediaControllerClientUnknownErrorMsg));
2826 CHECK_ARGS(args, kListenerId, std::string, out)
2827 CHECK_ARGS(args, kName, std::string, out)
2828 CHECK_ARGS(args, kDisplayRotation, std::string, out)
2830 JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
2832 picojson::object& reply_obj = reply->get<picojson::object>();
2833 reply_obj[kListenerId] = args.get(kListenerId);
2834 Instance::PostMessage(this, reply->serialize().c_str());
2836 LoggerW("No reply passed to json callback, ignoring");
2840 char* request_id = nullptr;
2845 PlatformResult result = client_->SendDisplayRotation(
2846 args.get(kName).get<std::string>(), args.get(kDisplayRotation).get<std::string>(), reply_cb,
2851 out[kRequestId] = picojson::value(std::string(request_id));
2853 LogAndReportError(result, &out, ("Failed to send display rotation command."));
2857 void MediaControllerInstance::MediaControllerDisplayRotationInfoAddChangeListener(
2858 const picojson::value& args, picojson::object& out) {
2861 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2862 (MediaControllerClientUnknownErrorMsg));
2866 CHECK_ARGS(args, kListenerId, std::string, out)
2868 JsonCallback callback = [this, args](picojson::value* data) -> void {
2869 if (nullptr == data) {
2870 LoggerE("No data passed to json callback");
2874 picojson::object& request_o = data->get<picojson::object>();
2875 request_o[kListenerId] = args.get(kListenerId);
2877 Instance::PostMessage(this, data->serialize().c_str());
2880 auto result = client_->SetDisplayRotationInfoChangeListener(callback);
2882 LogAndReportError(result, &out);
2889 void MediaControllerInstance::MediaControllerDisplayRotationInfoRemoveChangeListener(
2890 const picojson::value& args, picojson::object& out) {
2893 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2894 (MediaControllerClientUnknownErrorMsg));
2898 auto result = client_->UnsetDisplayRotationInfoChangeListener();
2900 LogAndReportError(result, &out);
2907 void MediaControllerInstance::MediaControllerPlaylistsInfoSendPlaybackItem(
2908 const picojson::value& args, picojson::object& out) {
2911 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, MediaControllerUnknownErrorMsg), &out,
2912 (MediaControllerClientUnknownErrorMsg));
2916 CHECK_ARGS(args, kServerName, std::string, out)
2917 CHECK_ARGS(args, kPlaylistName, std::string, out)
2918 CHECK_ARGS(args, kIndex, std::string, out)
2919 CHECK_ARGS(args, kAction, std::string, out)
2920 CHECK_ARGS(args, kPosition, double, out)
2922 JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
2924 picojson::object& reply_obj = reply->get<picojson::object>();
2925 reply_obj[kListenerId] = args.get(kListenerId);
2926 Instance::PostMessage(this, reply->serialize().c_str());
2928 LoggerW("No reply passed to json callback, ignoring");
2932 char* request_id = nullptr;
2937 const std::string& server_name = args.get(kServerName).get<std::string>();
2938 const std::string& playlist_name = args.get(kPlaylistName).get<std::string>();
2939 const std::string& index = args.get(kIndex).get<std::string>();
2940 const std::string& action = args.get(kAction).get<std::string>();
2941 const int position = static_cast<unsigned long long>(args.get(kPosition).get<double>());
2943 PlatformResult result = client_->SendPlaybackItem(server_name, playlist_name, index, action,
2944 position, reply_cb, &request_id);
2947 out[kRequestId] = picojson::value(std::string(request_id));
2950 LogAndReportError(result, &out, ("Failed to send playback position."));
2956 } // namespace mediacontroller
2957 } // namespace extension