* limitations under the License.
*/
-var JSON_ = xwalk.JSON;
var validator_ = xwalk.utils.validator;
var types_ = validator_.Types;
var type_ = xwalk.utils.type;
var converter_ = xwalk.utils.converter;
-var privUtils_ = xwalk.utils;
+var native_ = new xwalk.utils.NativeManager(extension);
+
+var LOCAL_MESSAGE_PORT_LISTENER_ID = 'LocalMessagePortListener';
var callbackId = 0;
var callbacks = {};
var ports = [];
-extension.setMessageListener(function(json) {
- var msg = JSON_.parse(json);
- var listeners = callbacks[msg['local_port_id']];
+function MessagePortChangeCallback(msg) {
+ var listeners = callbacks[msg['localPortId']];
var rmp;
- privUtils_.log('Listeners length:' + listeners.length);
-
if (!msg.hasOwnProperty('remotePort'))
rmp = null;
else
func(msg.message, rmp);
}, 0);
}
-
-});
+}
function nextCallbackId() {
return callbackId++;
}
-var ExceptionMap = {
- 'UnknownError' : WebAPIException.UNKNOWN_ERR,
- 'TypeMismatchError' : WebAPIException.TYPE_MISMATCH_ERR,
- 'InvalidValuesError' : WebAPIException.INVALID_VALUES_ERR,
- 'IOError' : WebAPIException.IO_ERR,
- 'ServiceNotAvailableError' : WebAPIException.SERVICE_NOT_AVAILABLE_ERR,
- 'SecurityError' : WebAPIException.SECURITY_ERR,
- 'NetworkError' : WebAPIException.NETWORK_ERR,
- 'NotSupportedError' : WebAPIException.NOT_SUPPORTED_ERR,
- 'NotFoundError' : WebAPIException.NOT_FOUND_ERR,
- 'InvalidAccessError' : WebAPIException.INVALID_ACCESS_ERR,
- 'AbortError' : WebAPIException.ABORT_ERR,
- 'QuotaExceededError' : WebAPIException.QUOTA_EXCEEDED_ERR
-};
-
-function callNative(cmd, args) {
- var json = {'cmd': cmd, 'args': args};
- var argjson = JSON_.stringify(json);
- var resultString = extension.internal.sendSyncMessage(argjson);
- var result = JSON_.parse(resultString);
-
- if (typeof result !== 'object') {
- throw new WebAPIException(WebAPIException.UNKNOWN_ERR);
- }
-
- if (result['status'] == 'success') {
- if (result['result']) {
- return result['result'];
- }
- return true;
- }
- else if (result['status'] == 'error') {
- var err = result['error'];
- if (err) {
- if (ExceptionMap[err.name]) {
- throw new WebAPIException(ExceptionMap[err.name], err.message);
- } else {
- throw new WebAPIException(WebAPIException.UNKNOWN_ERR, err.message);
- }
- }
- return false;
- }
-}
-
-
-function callNativeWithCallback(cmd, args, callback) {
- if (callback) {
- var id = nextCallbackId();
- args['callbackId'] = id;
- callbacks[id] = callback;
- }
-
- return callNative(cmd, args);
-}
-
-function SetReadOnlyProperty(obj, n, v) {
- Object.defineProperty(obj, n, {value: v, writable: false});
-}
-
-
function MessagePortManager() {
// constructor of MessagePortManager
}
'Port name cannot be empty.');
}
- var localPortId;
+ var localPortId; // TODO remove
var nativeParam = {
'localMessagePortName': args.localMessagePortName
};
- try {
-
- localPortId = callNative('MessagePortManager_requestLocalMessagePort', nativeParam);
+ var result = native_.callSync('MessagePortManager_requestLocalMessagePort', nativeParam);
- } catch (e) {
- throw e;
+ if (native_.isSuccess(result)) {
+ var returnObject = new LocalMessagePort(args.localMessagePortName, false);
+ ports[nativeParam.localMessagePortName] = native_.getResultObject(result);
+ } else {
+ throw native_.getErrorObject(result);
}
- var returnObject = new LocalMessagePort(args.localMessagePortName, false);
- ports[nativeParam.localMessagePortName] = localPortId;
-
return returnObject;
};
'localMessagePortName': args.localMessagePortName
};
- try {
-
- var localPortId = callNative('MessagePortManager_requestTrustedLocalMessagePort', nativeParam);
+ var result = native_.callSync('MessagePortManager_requestTrustedLocalMessagePort', nativeParam);
- } catch (e) {
- throw e;
+ if (native_.isSuccess(result)) {
+ var returnObject = new LocalMessagePort(args.localMessagePortName, true);
+ ports[nativeParam.localMessagePortName] = native_.getResultObject(result);
+ } else {
+ throw native_.getErrorObject(result);
}
- var returnObject = new LocalMessagePort(args.localMessagePortName, true);
- ports[nativeParam.localMessagePortName] = localPortId;
-
return returnObject;
};
'remoteMessagePortName': args.remoteMessagePortName
};
- try {
-
- var syncResult = callNative('MessagePortManager_requestRemoteMessagePort', nativeParam);
+ var result = native_.callSync('MessagePortManager_requestRemoteMessagePort', nativeParam);
- } catch (e) {
- throw e;
+ if (native_.isFailure(result)) {
+ throw native_.getErrorObject(result);
}
var returnObject = new RemoteMessagePort(args.remoteMessagePortName, args.appId, false);
'remoteMessagePortName': args.remoteMessagePortName
};
- try {
+ var result = native_.callSync('MessagePortManager_requestTrustedRemoteMessagePort', nativeParam);
- var syncResult = callNative('MessagePortManager_requestTrustedRemoteMessagePort', nativeParam);
-
- } catch (e) {
- throw e;
+ if (native_.isFailure(result)) {
+ throw native_.getErrorObject(result);
}
var returnObject = new RemoteMessagePort(args.remoteMessagePortName, args.appId, true);
{'name' : 'listener', 'type': types_.FUNCTION, 'nullable': false}
]);
+ native_.addListener(LOCAL_MESSAGE_PORT_LISTENER_ID, MessagePortChangeCallback);
+
var portId = ports[this.messagePortName];
if (!callbacks.hasOwnProperty(portId)) callbacks[portId] = [];
{'name' : 'watchId', 'type': types_.LONG, 'nullable': false, 'optional': false }
]);
- var to_delete;
+ var toDelete;
var listeners = callbacks[ports[this.messagePortName]];
for (var i = 0, j = listeners.length; i < j; i++) {
- var listener_id = listeners[i][1];
- if (watchId == listener_id) {
- to_delete = i;
+ var listenerId = listeners[i][1];
+ if (watchId == listenerId) {
+ toDelete = i;
break;
}
}
- if (typeof to_delete === 'undefined')
+ if (typeof toDelete === 'undefined')
throw new WebAPIException(WebAPIException.NOT_FOUND_ERR,
'The port of the target application is not found.');
- listeners.splice(to_delete, 1);
+ listeners.splice(toDelete, 1);
};
'nullable' : true, 'values' : LocalMessagePort }
]);
- var filtered_data = new Array(args.data.length);
- var unique_data_key = {};
- var data_length = args.data.length;
- for (var i = 0; i < data_length; i++) {
+ var filteredData = new Array(args.data.length);
+ var uniqueDataKey = {};
+ var dataLength = args.data.length;
+ for (var i = 0; i < dataLength; i++) {
if (!args.data[i].hasOwnProperty('key')) {
throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR,
'MessagePortDataItem should contain \'key\' property.');
throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR,
'Property \'key\' should not be empty.');
}
- if (true === unique_data_key[key]) {
+ if (true === uniqueDataKey[key]) {
throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR,
'Property \'key\' should not be duplicated.');
}
var value = args.data[i].value;
if (type_.isString(value)) {
- filtered_data[i] = { key: key, value: value, valueType: 'stringValueType'};
+ filteredData[i] = { key: key, value: value, valueType: 'stringValueType'};
} else if(type_.isArray(value)) {
var arrayMember = value[0];
if(type_.isString(arrayMember)) {
'Invalid array value');
}
}
- filtered_data[i] = { key: key, value: value, valueType: 'stringArrayValueType'};
+ filteredData[i] = { key: key, value: value, valueType: 'stringArrayValueType'};
} else if(!type_.isArray(arrayMember)) {
if (!_isOctet(value)) {
throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR,
'Data is not octet array');
}
- filtered_data[i] = { key: key, value: value, valueType: 'byteStreamValueType'};
+ filteredData[i] = { key: key, value: value, valueType: 'byteStreamValueType'};
} else {
for(var j=0;j<value.length;j++) {
if (!_isOctet(value[j])) {
'Data is not octet array');
}
}
- filtered_data[i] = { key: key, value: value, valueType: 'byteStreamArrayValueType'};
+ filteredData[i] = { key: key, value: value, valueType: 'byteStreamArrayValueType'};
}
} else {
// convert any other value to string -> backward compatibility
- filtered_data[i] = { key: key, value: converter_.toString(value), valueType: 'stringValueType'};
+ filteredData[i] = { key: key, value: converter_.toString(value), valueType: 'stringValueType'};
}
- unique_data_key[key] = true;
+ uniqueDataKey[key] = true;
}
var nativeParam = {
'appId': this.appId,
'messagePortName': this.messagePortName,
- 'data': filtered_data,
+ 'data': filteredData,
'trusted': this.isTrusted,
- 'local_port_id': args.localMessagePort ? ports[args.localMessagePort.messagePortName] : -1
+ 'localPortId': args.localMessagePort ? ports[args.localMessagePort.messagePortName] : -1
};
- var syncResult = callNative('RemoteMessagePort_sendMessage', nativeParam);
+ var result = native_.callSync('RemoteMessagePort_sendMessage', nativeParam);
+
+ if (native_.isFailure(result)) {
+ throw native_.getErrorObject(result);
+ }
};
exports = new MessagePortManager();