You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by mm...@apache.org on 2013/01/14 22:40:43 UTC

js commit: [ios] CB-2189: Implement ArrayBuffer native->js.

Updated Branches:
  refs/heads/master d41650bec -> 099a51d15


[ios] CB-2189: Implement ArrayBuffer native->js.


Project: http://git-wip-us.apache.org/repos/asf/cordova-js/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-js/commit/099a51d1
Tree: http://git-wip-us.apache.org/repos/asf/cordova-js/tree/099a51d1
Diff: http://git-wip-us.apache.org/repos/asf/cordova-js/diff/099a51d1

Branch: refs/heads/master
Commit: 099a51d157bf9bfcb112075f5406453504f40d72
Parents: d41650b
Author: Michal Mocny <mm...@gmail.com>
Authored: Mon Jan 14 14:43:39 2013 -0500
Committer: Michal Mocny <mm...@gmail.com>
Committed: Mon Jan 14 16:20:49 2013 -0500

----------------------------------------------------------------------
 lib/ios/exec.js |   56 +++++++++++++++++++++++++++++++++-----------------
 1 files changed, 37 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-js/blob/099a51d1/lib/ios/exec.js
----------------------------------------------------------------------
diff --git a/lib/ios/exec.js b/lib/ios/exec.js
index b8bc850..f8bff52 100644
--- a/lib/ios/exec.js
+++ b/lib/ios/exec.js
@@ -64,6 +64,41 @@ function shouldBundleCommandJson() {
     return false;
 }
 
+function massageArgsJsToNative(args) {
+    var encodeArrayBufferAs8bitString = function(ab) {
+        return String.fromCharCode.apply(null, new Uint8Array(ab));
+    };
+    var encodeArrayBufferAsBase64 = function(ab) {
+        return window.btoa(encodeArrayBufferAs8bitString(ab));
+    };
+    args.forEach(function(arg, i) {
+        if (arg instanceof ArrayBuffer) {
+            args[i] = {
+                'CDVType': 'ArrayBuffer',
+                'data': encodeArrayBufferAsBase64(arg)
+            };
+        } // else if (arg instanceof OTHER_TYPE)
+    });
+    return args;
+}
+
+function massagePayloadNativeToJs(payload) {
+    if (payload && payload.hasOwnProperty('CDVType') && payload.CDVType == 'ArrayBuffer') {
+        var stringToArrayBuffer = function(str) {
+            var ret = new Uint8Array(str.length);
+            for (var i = 0; i < str.length; i++) {
+                ret[i] = str.charCodeAt(i);
+            }
+            return ret.buffer;
+        };
+        var base64ToArrayBuffer = function(b64) {
+            return stringToArrayBuffer(atob(b64));
+        };
+        payload = base64ToArrayBuffer(payload.data);
+    }
+    return payload;
+}
+
 function iOSExec() {
     // XHR mode does not work on iOS 4.2, so default to IFRAME_NAV for such devices.
     // XHR mode's main advantage is working around a bug in -webkit-scroll, which
@@ -103,25 +138,7 @@ function iOSExec() {
             {success:successCallback, fail:failCallback};
     }
 
-    // Binary!
-    var encodeArrayBufferAsBase64 = function(ab) {
-        var arr = new Uint8Array(ab);
-        var binary = '';
-        var len = arr.length;
-        for (var i = 0; i < len; i++) {
-            binary += String.fromCharCode(arr[i]);
-        }
-        return window.btoa(binary);
-    };
-    actionArgs.forEach(function(arg, i) {
-        if (Object.prototype.toString.call(arg) != Object.prototype.toString.call(new ArrayBuffer())) {
-            return;
-        }
-        actionArgs[i] = {
-            'CDVType': 'ArrayBuffer',
-            'data': encodeArrayBufferAsBase64(arg)
-        };
-    });
+    actionArgs = massageArgsJsToNative(actionArgs);
 
     var command = [callbackId, service, action, actionArgs];
 
@@ -188,6 +205,7 @@ iOSExec.nativeFetchMessages = function() {
 iOSExec.nativeCallback = function(callbackId, status, payload, keepCallback) {
     return iOSExec.nativeEvalAndFetch(function() {
         var success = status === 0 || status === 1;
+        payload = massagePayloadNativeToJs(payload);
         cordova.callbackFromNative(callbackId, success, status, payload, keepCallback);
     });
 };