});
var ServerInfoStatusListener = new ListenerManager(native_, '_ServerInfoStatusListener', function(msg, listener) {
- if (msg.action === 'onplaybackstaterequest') {
- listener[msg.action](msg.state);
- }
- if (msg.action === 'onplaybackpositionrequest') {
- listener[msg.action](msg.position);
- }
- if (msg.action === 'onshufflemoderequest' || msg.action === 'onrepeatmoderequest') {
- listener[msg.action](msg.mode);
- }
- if (msg.action === 'onmetadatachanged') {
- listener[msg.action](new MediaControllerMetadata(msg.metadata));
- }
+ listener(msg.state);
});
var ServerInfoPlaybackInfoListener = new ListenerManager(native_, '_ServerInfoPlaybackInfoListener', function(msg, listener) {
return PlatformResult(ErrorCode::NO_ERROR);
}
+PlatformResult MediaControllerClient::SetServerStatusChangeListener(
+ JsonCallback callback) {
+
+ if (callback && server_status_listener_) {
+ LOGGER(ERROR) << "Listener already registered";
+ return PlatformResult(ErrorCode::INVALID_STATE_ERR,
+ "Listener already registered");
+ }
+
+ server_status_listener_ = callback;
+
+ int ret;
+ if (callback) { // set platform callbacks
+
+ ret = mc_client_set_server_update_cb(handle_, OnServerStatusUpdate, this);
+ if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+ LOGGER(ERROR) << "Unable to set server status listener, error: " << ret;
+ return PlatformResult(ErrorCode::UNKNOWN_ERR,
+ "Unable to set server status listener");
+ }
+
+ } else { // unset platform callbacks
+
+ ret = mc_client_unset_server_update_cb(handle_);
+ if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+ LOGGER(ERROR) << "Unable to unset server status listener, error: " << ret;
+ return PlatformResult(ErrorCode::UNKNOWN_ERR,
+ "Unable to unset server status listener");
+ }
+
+ }
+
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+void MediaControllerClient::OnServerStatusUpdate(const char* server_name,
+ mc_server_state_e state,
+ void* user_data) {
+ LOGGER(DEBUG) << "entered";
+
+ MediaControllerClient* client = static_cast<MediaControllerClient*>(user_data);
+
+ if (!client->server_status_listener_) {
+ LOGGER(DEBUG) << "No server status listener registered, skipping";
+ return;
+ }
+
+ // server state
+ std::string state_str;
+ PlatformResult result = Types::PlatformEnumToString(
+ Types::kMediaControllerServerState, static_cast<int>(state), &state_str);
+ if (!result) {
+ LOGGER(ERROR) << "PlatformEnumToString failed, error: " << result.message();
+ return;
+ }
+
+ picojson::value data = picojson::value(picojson::object());
+ picojson::object& data_o = data.get<picojson::object>();
+
+ data_o["state"] = picojson::value(state_str);
+
+ client->server_status_listener_(&data);
+}
+
PlatformResult MediaControllerClient::SetPlaybackInfoListener(
JsonCallback callback) {
common::PlatformResult SendPlaybackState(const std::string& server_name,
const std::string& state);
+ common::PlatformResult SetServerStatusChangeListener(JsonCallback callback);
common::PlatformResult SetPlaybackInfoListener(JsonCallback callback);
+
private:
mc_client_h handle_;
JsonCallback playback_info_listener_;
+ JsonCallback server_status_listener_;
static bool FindServersCallback(const char* server_name, void* user_data);
+
+ static void OnServerStatusUpdate(const char *server_name,
+ mc_server_state_e state,
+ void *user_data);
static void OnPlaybackUpdate(const char *server_name,
mc_playback_h playback,
void *user_data);
void MediaControllerInstance::MediaControllerServerInfoAddServerStatusChangeListener(
const picojson::value& args,
picojson::object& out) {
+ LOGGER(DEBUG) << "entered";
- // implement it
+ if (!client_) {
+ ReportError(PlatformResult(ErrorCode::INVALID_STATE_ERR,
+ "Client not initialized."), &out);
+ return;
+ }
- // if success
- // ReportSuccess(out);
- // if error
- // ReportError(out);
+ CHECK_EXIST(args, "listenerId", out)
+
+ JsonCallback callback = [this, args](picojson::value* data) -> void {
+ LOGGER(DEBUG) << "entered";
+
+ if (nullptr == data) {
+ LOGGER(ERROR) << "No data passed to json callback";
+ return;
+ }
+
+ picojson::object& request_o = data->get<picojson::object>();
+ request_o["listenerId"] = args.get("listenerId");
+
+ PostMessage(data->serialize().c_str());
+ };
+
+ client_->SetServerStatusChangeListener(callback);
+
+ ReportSuccess(out);
}
void MediaControllerInstance::MediaControllerServerInfoRemoveServerStatusChangeListener(
const picojson::value& args,
picojson::object& out) {
- CHECK_EXIST(args, "watchId", out)
-
- double watchId = args.get("watchId").get<double>();
+ LOGGER(DEBUG) << "entered";
- // implement it
+ if (!client_) {
+ ReportError(PlatformResult(ErrorCode::INVALID_STATE_ERR,
+ "Client not initialized."), &out);
+ return;
+ }
- // if success
- // ReportSuccess(out);
- // if error
- // ReportError(out);
+ client_->SetServerStatusChangeListener(nullptr);
}
void MediaControllerInstance::MediaControllerServerInfoAddPlaybackInfoChangeListener(