function ListenerManager(native, listenerName, handle) {
this.listeners = {};
+ this.listenerNameToIds = {};
+ this.listenerIdToName = {};
this.nextId = 1;
this.nativeSet = false;
this.native = native;
return id;
};
+ListenerManager.prototype.addServerInfoListener = function(callback, name) {
+ var id = this.nextId;
+ if (!this.nativeSet) {
+ this.native.addListener(this.listenerName, function(msg) {
+ if (this.listenerNameToIds.hasOwnProperty(msg.name)) {
+ var cbArray = this.listenerNameToIds[msg.name];
+ for (var i = 0; i < cbArray.length; ++i) {
+ var watchId = cbArray[i];
+ this.handle(msg, this.listeners[watchId], watchId);
+ }
+ }
+ }.bind(this));
+
+ this.nativeSet = true;
+ }
+
+ this.listenerIdToName[id] = name;
+ if (this.listenerNameToIds[name]) {
+ this.listenerNameToIds[name].push(id);
+ } else {
+ this.listenerNameToIds[name] = [id];
+ }
+ this.listeners[id] = callback;
+ ++this.nextId;
+ return id;
+};
+
ListenerManager.prototype.removeListener = function(watchId) {
if (this.listeners.hasOwnProperty(watchId)) {
delete this.listeners[watchId];
}
};
+function removeArrayElement(arr, elem) {
+ var index = arr.indexOf(elem);
+ if (index !== -1) {
+ arr.splice(index, 1);
+ }
+}
+
+ListenerManager.prototype.removeServerInfoListener = function(watchId) {
+ this.removeListener(watchId);
+ if (this.listenerIdToName.hasOwnProperty(watchId)) {
+ var name = this.listenerIdToName[watchId];
+ removeArrayElement(this.listenerNameToIds[name], watchId);
+ delete this.listenerIdToName[watchId];
+ }
+};
+
var ServerCommandListener = new ListenerManager(native_, '_ServerCommandListener', function(msg, listener) {
var data = undefined;
data = listener(msg.clientName, msg.command, msg.data);
throw native_.getErrorObject(result);
}
}
-
- return ServerInfoStatusListener.addListener(args.listener);
+ return ServerInfoStatusListener.addServerInfoListener(args.listener, this.name);
};
MediaControllerServerInfo.prototype.removeServerStatusChangeListener = function(watchId) {
{name: 'watchId', type: types_.LONG}
]);
- ServerInfoStatusListener.removeListener(args.watchId);
+ ServerInfoStatusListener.removeServerInfoListener(args.watchId);
if (type_.isEmptyObject(ServerInfoStatusListener.listeners)) {
native_.callSync('MediaControllerServerInfo_removeServerStatusChangeListener');
}
}
- return ServerInfoPlaybackInfoListener.addListener(args.listener);
+ return ServerInfoPlaybackInfoListener.addServerInfoListener(args.listener, this.name);
};
MediaControllerServerInfo.prototype.removePlaybackInfoChangeListener = function(watchId) {
{name: 'watchId', type: types_.LONG}
]);
- ServerInfoPlaybackInfoListener.removeListener(args.watchId);
+ ServerInfoPlaybackInfoListener.removeServerInfoListener(args.watchId);
if (type_.isEmptyObject(ServerInfoPlaybackInfoListener.listeners)) {
native_.callSync('MediaControllerServerInfo_removePlaybackInfoChangeListener');
picojson::object& data_o = data.get<picojson::object>();
data_o["state"] = picojson::value(state_str);
+ data_o["name"] = picojson::value(server_name);
client->server_status_listener_(&data);
}
data_o["action"] = picojson::value(std::string("onplaybackchanged"));
data_o["state"] = picojson::value(state);
data_o["position"] = picojson::value(position);
+ data_o["name"] = picojson::value(server_name);
client->playback_info_listener_(&data);
}
data_o["action"] = picojson::value(std::string("onshufflemodechanged"));
data_o["mode"] = picojson::value(mode == MC_SHUFFLE_MODE_ON);
+ data_o["name"] = picojson::value(server_name);
client->playback_info_listener_(&data);
}
data_o["action"] = picojson::value(std::string("onrepeatmodechanged"));
data_o["mode"] = picojson::value(mode == MC_REPEAT_MODE_ON);
+ data_o["name"] = picojson::value(server_name);
client->playback_info_listener_(&data);
}
data_o["action"] = picojson::value(std::string("onmetadatachanged"));
data_o["metadata"] = metadata;
+ data_o["name"] = picojson::value(server_name);
client->playback_info_listener_(&data);
}
return;
}
reply_o["data"] = data;
+ reply_o["name"] = picojson::value(server_name);
client->command_reply_callback_(&reply);
}