You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ag...@apache.org on 2013/03/20 16:48:53 UTC
[09/40] js commit: CB-2530 and CB-2239 Multipart plugin result
CB-2530 and CB-2239 Multipart plugin result
This patch does a bunch:
* [ios&android] Adds support for multiple argument callbacks for
win/fail (by way of updating callbackFromNative)
* Adds MultiPart message type, which supports an array or return
arguments from a plugin result (and will massage each argument, such
as ArrayBuffers)
* Update Echo plugin to test MultiPart messages
Project: http://git-wip-us.apache.org/repos/asf/cordova-js/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-js/commit/f4142e7d
Tree: http://git-wip-us.apache.org/repos/asf/cordova-js/tree/f4142e7d
Diff: http://git-wip-us.apache.org/repos/asf/cordova-js/diff/f4142e7d
Branch: refs/heads/cb2227
Commit: f4142e7d76abfbc1082c7b79732a7fe62d4e4e58
Parents: aa5548f
Author: Michal Mocny <mm...@gmail.com>
Authored: Mon Feb 25 13:22:41 2013 -0500
Committer: Michal Mocny <mm...@gmail.com>
Committed: Mon Feb 25 13:25:32 2013 -0500
----------------------------------------------------------------------
lib/android/exec.js | 2 +-
lib/common/plugin/echo.js | 25 ++++++++++++++++++++-----
lib/cordova.js | 10 +++++-----
lib/ios/exec.js | 37 +++++++++++++++++++++++++++----------
4 files changed, 53 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-js/blob/f4142e7d/lib/android/exec.js
----------------------------------------------------------------------
diff --git a/lib/android/exec.js b/lib/android/exec.js
index 506fd3d..7a101c6 100644
--- a/lib/android/exec.js
+++ b/lib/android/exec.js
@@ -203,7 +203,7 @@ function processMessage(message) {
} else {
payload = JSON.parse(message.slice(nextSpaceIdx + 1));
}
- cordova.callbackFromNative(callbackId, success, status, payload, keepCallback);
+ cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback);
} else {
console.log("processMessage failed: invalid message:" + message);
}
http://git-wip-us.apache.org/repos/asf/cordova-js/blob/f4142e7d/lib/common/plugin/echo.js
----------------------------------------------------------------------
diff --git a/lib/common/plugin/echo.js b/lib/common/plugin/echo.js
index 87a495f..76fe3f0 100644
--- a/lib/common/plugin/echo.js
+++ b/lib/common/plugin/echo.js
@@ -19,7 +19,8 @@
*
*/
-var exec = require('cordova/exec');
+var exec = require('cordova/exec'),
+ utils = require('cordova/utils');
/**
* Sends the given message through exec() to the Echo plugin, which sends it back to the successCallback.
@@ -29,10 +30,24 @@ var exec = require('cordova/exec');
* @param forceAsync Whether to force an async return value (for testing native->js bridge).
*/
module.exports = function(successCallback, errorCallback, message, forceAsync) {
- var action = forceAsync ? 'echoAsync' : 'echo';
- if (!forceAsync && message.constructor == ArrayBuffer) {
- action = 'echoArrayBuffer';
+ var action = 'echo';
+ var messageIsMultipart = (utils.typeName(message) == "Array");
+ var args = messageIsMultipart ? message : [message];
+
+ if (utils.typeName(message) == 'ArrayBuffer') {
+ if (forceAsync) {
+ console.warn('Cannot echo ArrayBuffer with forced async, falling back to sync.');
+ }
+ action += 'ArrayBuffer';
+ } else if (messageIsMultipart) {
+ if (forceAsync) {
+ console.warn('Cannot echo MultiPart Array with forced async, falling back to sync.');
+ }
+ action += 'MultiPart';
+ } else if (forceAsync) {
+ action += 'Async';
}
- exec(successCallback, errorCallback, "Echo", action, [message]);
+
+ exec(successCallback, errorCallback, "Echo", action, args);
};
http://git-wip-us.apache.org/repos/asf/cordova-js/blob/f4142e7d/lib/cordova.js
----------------------------------------------------------------------
diff --git a/lib/cordova.js b/lib/cordova.js
index ef68b2b..a31c40e 100644
--- a/lib/cordova.js
+++ b/lib/cordova.js
@@ -189,7 +189,7 @@ var cordova = {
*/
callbackSuccess: function(callbackId, args) {
try {
- cordova.callbackFromNative(callbackId, true, args.status, args.message, args.keepCallback);
+ cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback);
} catch (e) {
console.log("Error in error callback: " + callbackId + " = "+e);
}
@@ -202,7 +202,7 @@ var cordova = {
// TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative.
// Derive success from status.
try {
- cordova.callbackFromNative(callbackId, false, args.status, args.message, args.keepCallback);
+ cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback);
} catch (e) {
console.log("Error in error callback: " + callbackId + " = "+e);
}
@@ -211,13 +211,13 @@ var cordova = {
/**
* Called by native code when returning the result from an action.
*/
- callbackFromNative: function(callbackId, success, status, message, keepCallback) {
+ callbackFromNative: function(callbackId, success, status, args, keepCallback) {
var callback = cordova.callbacks[callbackId];
if (callback) {
if (success && status == cordova.callbackStatus.OK) {
- callback.success && callback.success(message);
+ callback.success && callback.success.apply(null, args);
} else if (!success) {
- callback.fail && callback.fail(message);
+ callback.fail && callback.fail.apply(null, args);
}
// Clear callback if not expecting any more results
http://git-wip-us.apache.org/repos/asf/cordova-js/blob/f4142e7d/lib/ios/exec.js
----------------------------------------------------------------------
diff --git a/lib/ios/exec.js b/lib/ios/exec.js
index 58e73d2..5e237d9 100644
--- a/lib/ios/exec.js
+++ b/lib/ios/exec.js
@@ -68,6 +68,7 @@ function massageArgsJsToNative(args) {
if (!args || utils.typeName(args) != 'Array') {
return args;
}
+ var ret = [];
var encodeArrayBufferAs8bitString = function(ab) {
return String.fromCharCode.apply(null, new Uint8Array(ab));
};
@@ -76,17 +77,19 @@ function massageArgsJsToNative(args) {
};
args.forEach(function(arg, i) {
if (utils.typeName(arg) == 'ArrayBuffer') {
- args[i] = {
+ ret.push({
'CDVType': 'ArrayBuffer',
'data': encodeArrayBufferAsBase64(arg)
- };
+ });
+ } else {
+ ret.push(arg);
}
});
- return args;
+ return ret;
}
-function massagePayloadNativeToJs(payload) {
- if (payload && payload.hasOwnProperty('CDVType') && payload.CDVType == 'ArrayBuffer') {
+function massageMessageNativeToJs(message) {
+ if (message.CDVType == 'ArrayBuffer') {
var stringToArrayBuffer = function(str) {
var ret = new Uint8Array(str.length);
for (var i = 0; i < str.length; i++) {
@@ -97,9 +100,23 @@ function massagePayloadNativeToJs(payload) {
var base64ToArrayBuffer = function(b64) {
return stringToArrayBuffer(atob(b64));
};
- payload = base64ToArrayBuffer(payload.data);
+ message = base64ToArrayBuffer(message.data);
}
- return payload;
+ return message;
+}
+
+function convertMessageToArgsNativeToJs(message) {
+ var args = [];
+ if (!message || !message.hasOwnProperty('CDVType')) {
+ args.push(message);
+ } else if (message.CDVType == 'MultiPart') {
+ message.messages.forEach(function(e) {
+ args.push(massageMessageNativeToJs(e));
+ });
+ } else {
+ args.push(massageMessageNativeToJs(message));
+ }
+ return args;
}
function iOSExec() {
@@ -206,11 +223,11 @@ iOSExec.nativeFetchMessages = function() {
return json;
};
-iOSExec.nativeCallback = function(callbackId, status, payload, keepCallback) {
+iOSExec.nativeCallback = function(callbackId, status, message, keepCallback) {
return iOSExec.nativeEvalAndFetch(function() {
var success = status === 0 || status === 1;
- payload = massagePayloadNativeToJs(payload);
- cordova.callbackFromNative(callbackId, success, status, payload, keepCallback);
+ var args = convertMessageToArgsNativeToJs(message);
+ cordova.callbackFromNative(callbackId, success, status, args, keepCallback);
});
};