}
});
+var ServerInfoPlaylistUpdatedListener = new ListenerManager(native_, '_ServerInfoPlaylistUpdatedListener', function(msg, listener) {
+ if (msg.action === 'onplaylistupdated') {
+ listener[msg.action](msg.serverName, new MediaControllerPlaylist(msg));
+ }
+ if (msg.action === 'onplaylistdeleted') {
+ listener[msg.action](msg.serverName, msg.name);
+ }
+});
+
var EditManager = function() {
this.isAllowed = false;
};
}
};
+MediaControllerServerInfo.prototype.addPlaylistUpdatedListener = function(listener) {
+ var args = validator_.validateArgs(arguments, [{
+ name: 'listener',
+ type: types_.LISTENER,
+ values: [
+ 'onplaylistupdated',
+ 'onplaylistdeleted'
+ ]
+ }]);
+
+ if (type_.isEmptyObject(ServerInfoPlaylistUpdatedListener.listeners)) {
+ var result = native_.callSync(
+ 'MediaControllerServerInfo_addPlaylistUpdatedListener', {
+ listenerId: ServerInfoPlaylistUpdatedListener.listenerName
+ });
+ if (native_.isFailure(result)) {
+ throw native_.getErrorObject(result);
+ }
+ }
+
+ return ServerInfoPlaylistUpdatedListener.addListener(args.listener, this.name);
+};
+
+MediaControllerServerInfo.prototype.removePlaylistUpdatedListener = function(watchId) {
+ var args = validator_.validateArgs(arguments, [
+ {name: 'watchId', type: types_.LONG}
+ ]);
+
+ ServerInfoPlaylistUpdatedListener.removeListener(args.watchId);
+
+ if (type_.isEmptyObject(ServerInfoPlaylistUpdatedListener.listeners)) {
+ var result = native_.callSync('MediaControllerServerInfo_removePlaylistUpdatedListener');
+
+ if (native_.isFailure(result)) {
+ throw native_.getErrorObject(result);
+ }
+ }
+};
+
var MediaControllerPlaylistItem = function(data) {
var _index = "";
var _metadata = new MediaControllerMetadata();
LoggerE("Failed to unset playback info listener");
}
+ if (nullptr != playlist_update_listener_ && !UnsetPlaylistUpdateListener()) {
+ LoggerE("Failed to unset playlist update listener");
+ }
+
if (nullptr != handle_ && MEDIA_CONTROLLER_ERROR_NONE != mc_client_destroy(handle_)) {
LoggerE("Unable to destroy media controller client");
}
}
ret =
- mc_client_send_custom_cmd(handle_, server_name.c_str(), command.c_str(), bundle, &request_id);
+ mc_client_send_custom_cmd(handle_, server_name.c_str(), command.c_str(), bundle, request_id);
if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
return LogAndCreateResult(
ErrorCode::UNKNOWN_ERR, "Error sending custom command",
return PlatformResult(ErrorCode::NO_ERROR);
}
+void MediaControllerClient::OnPlaylistUpdate(const char *server_name, mc_playlist_update_mode_e mode,
+ const char *playlist_name, mc_playlist_h playlist, void *user_data) {
+ ScopeLogger();
+ MediaControllerClient *client = static_cast<MediaControllerClient *>(user_data);
+
+ picojson::value data = picojson::value(picojson::object());
+ picojson::object &data_o = data.get<picojson::object>();
+
+ if (MC_PLAYLIST_UPDATED == mode) {
+ // Create or Update playlist
+ data_o["action"] = picojson::value(std::string("onplaylistupdated"));
+ } else {
+ data_o["action"] = picojson::value(std::string("onplaylistdeleted"));
+ }
+
+ data_o["name"] = picojson::value(std::string(playlist_name));
+ data_o["serverName"] = picojson::value(std::string(server_name));
+
+ client->playlist_update_listener_(&data);
+}
+
+PlatformResult MediaControllerClient::SetPlaylistUpdateListener(const JsonCallback& callback) {
+ ScopeLogger();
+
+ int ret = mc_client_set_playlist_updated_cb(handle_, OnPlaylistUpdate, this);
+
+ if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+ return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to add playlist listener",
+ ("mc_client_set_playlist_updated_cb() error: %d, message: %s", ret,
+ get_error_message(ret)));
+ }
+
+ playlist_update_listener_ = callback;
+
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult MediaControllerClient::UnsetPlaylistUpdateListener() {
+ ScopeLogger();
+
+ int ret = mc_client_unset_playlist_updated_cb(handle_);
+
+ if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+ return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to remove playlist listener",
+ ("mc_client_unset_playlist_updated_cb() error: %d, message: %s", ret,
+ get_error_message(ret)));
+ }
+
+ playlist_update_listener_ = nullptr;
+
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
} // namespace mediacontroller
} // namespace extension
common::PlatformResult SendPlaybackItem(const std::string& name, const std::string& playlist_name,
const std::string& index, const std::string& state,
double position);
+ common::PlatformResult SetPlaylistUpdateListener(const JsonCallback& callback);
+ common::PlatformResult UnsetPlaylistUpdateListener();
private:
mc_client_h handle_;
JsonCallback playback_info_listener_;
JsonCallback server_status_listener_;
JsonCallback command_reply_callback_;
+ JsonCallback playlist_update_listener_;
static bool FindServersCallback(const char* server_name, void* user_data);
static void OnShuffleModeUpdate(const char* server_name, mc_shuffle_mode_e mode, void* user_data);
static void OnRepeatModeUpdate(const char* server_name, mc_repeat_mode_e mode, void* user_data);
static void OnMetadataUpdate(const char* server_name, mc_metadata_h metadata_h, void* user_data);
+ static void OnPlaylistUpdate(const char *server_name, mc_playlist_update_mode_e mode,
+ const char *playlist_name, mc_playlist_h playlist, void *user_data);
};
} // namespace mediacontroller
MediaControllerServerInfoRemovePlaybackInfoChangeListener);
REGISTER_SYNC("MediaControllerServerInfo_sendPlaybackItem",
MediaControllerServerInfoSendPlaybackItem);
+ REGISTER_SYNC("MediaControllerServerInfo_addPlaylistUpdatedListener",
+ MediaControllerServerInfoAddPlaylistUpdateListener);
+ REGISTER_SYNC("MediaControllerServerInfo_removePlaylistUpdatedListener",
+ MediaControllerServerInfoRemovePlaylistUpdateListener);
// playlist
REGISTER_SYNC("MediaControllerPlaylist_addItem", MediaControllerPlaylistAddItem);
LoggerE("No data passed to json callback");
return;
}
+
picojson::object& request_o = data->get<picojson::object>();
request_o["listenerId"] = args.get("listenerId");
ReportSuccess(out);
}
-void MediaControllerInstance::MediaControllerPlaylistAddItem(const picojson::value& args,
- picojson::object& out) {
+void MediaControllerInstance::MediaControllerServerInfoAddPlaylistUpdateListener(
+ const picojson::value& args, picojson::object& out) {
+ ScopeLogger();
+ if (!client_) {
+ LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out,
+ ("Failed: client_"));
+ return;
+ }
+
+ CHECK_EXIST(args, "listenerId", out)
+
+ JsonCallback callback = [this, args](picojson::value* data) -> void {
+ if (!data) {
+ LoggerE("No data passed to json callback");
+ return;
+ }
+
+ picojson::object& request_o = data->get<picojson::object>();
+ request_o["listenerId"] = args.get("listenerId");
+
+ Instance::PostMessage(this, data->serialize().c_str());
+ };
+
+ auto result = client_->SetPlaylistUpdateListener(callback);
+ if (!result) {
+ LogAndReportError(result, &out);
+ return;
+ }
+
+ ReportSuccess(out);
+}
+
+void MediaControllerInstance::MediaControllerServerInfoRemovePlaylistUpdateListener(
+ const picojson::value& args, picojson::object& out) {
+ if (!client_) {
+ LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out,
+ ("Failed: client_"));
+ return;
+ }
+
+ auto result = client_->UnsetPlaylistUpdateListener();
+ if (!result) {
+ LogAndReportError(result, &out);
+ return;
+ }
+
+ ReportSuccess(out);
+}
+
+void MediaControllerInstance::MediaControllerPlaylistAddItem(
+ const picojson::value& args, picojson::object& out) {
ScopeLogger();
// MediaControllerPlaylistAddItem is implemented in MediaControllerServer because
picojson::object& out);
void MediaControllerServerInfoSendPlaybackItem(const picojson::value& args,
picojson::object& out);
+ void MediaControllerServerInfoAddPlaylistUpdateListener(const picojson::value& args,
+ picojson::object& out);
+ void MediaControllerServerInfoRemovePlaylistUpdateListener(const picojson::value& args,
+ picojson::object& out);
// playlist
void MediaControllerPlaylistAddItem(const picojson::value& args, picojson::object& out);