From 7530c21a9f6d5eff2d1826acdc7a8d8e286f7008 Mon Sep 17 00:00:00 2001 From: Braden Shepherdson Date: Thu, 17 Jan 2013 15:58:38 -0500 Subject: [PATCH] Full binary data support. - Removed BinaryEcho; made Echo support a new binaryEcho action. - Added CordovaArgs wrapper for JSONArray, and a new overload for execute that accepts a CordovaArgs. There is now a default implementation for the JSONArray version of execute that builds a CordovaArgs and calls that version of execute. The default implementation for the CordovaArgs execute is to return false. - Added byte[] version of success() in CallbackContext. --- .../src/org/apache/cordova/BinaryEcho.java | 55 --------- .../src/org/apache/cordova/CordovaArgs.java | 112 ++++++++++++++++++ .../org/apache/cordova/CordovaArguments.java | 33 ------ framework/src/org/apache/cordova/Echo.java | 10 +- .../apache/cordova/api/CallbackContext.java | 9 ++ .../org/apache/cordova/api/CordovaPlugin.java | 23 +++- 6 files changed, 149 insertions(+), 93 deletions(-) delete mode 100644 framework/src/org/apache/cordova/BinaryEcho.java create mode 100644 framework/src/org/apache/cordova/CordovaArgs.java delete mode 100644 framework/src/org/apache/cordova/CordovaArguments.java diff --git a/framework/src/org/apache/cordova/BinaryEcho.java b/framework/src/org/apache/cordova/BinaryEcho.java deleted file mode 100644 index 38ca9393..00000000 --- a/framework/src/org/apache/cordova/BinaryEcho.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -package org.apache.cordova; - -import org.apache.cordova.api.CallbackContext; -import org.apache.cordova.api.CordovaPlugin; -import org.apache.cordova.api.PluginResult; - -import org.json.JSONArray; -import org.json.JSONException; - -public class BinaryEcho extends CordovaPlugin { - - /** - * Executes the request. - * - * @param action The action to execute. - * @param args JSONArry of arguments for the plugin. - * @param callbackContext The callback context used when calling back into JavaScript. - * @return True if the action was valid, false if not. - */ - public boolean execute(String action, JSONArray args, CallbackContext callbackContext) { - try { - if (action.equals("echo")) { - byte[] data = CordovaArguments.getArrayBuffer(args, 0); - - // Don't return any result now, since status results will be sent when events come in from broadcast receiver - PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, data); - callbackContext.sendPluginResult(pluginResult); - return true; - } - } catch (JSONException e) { - e.printStackTrace(); - } - - return false; - } -} - diff --git a/framework/src/org/apache/cordova/CordovaArgs.java b/framework/src/org/apache/cordova/CordovaArgs.java new file mode 100644 index 00000000..3a8b7c0f --- /dev/null +++ b/framework/src/org/apache/cordova/CordovaArgs.java @@ -0,0 +1,112 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +import org.json.JSONArray; +import org.json.JSONException; + +import android.util.Base64; + +public class CordovaArgs { + private JSONArray baseArgs; + + public CordovaArgs(JSONArray args) { + this.baseArgs = args; + } + + + // Pass through the basics to the base args. + public Object get(int index) throws JSONException { + return baseArgs.get(index); + } + + public boolean getBoolean(int index) throws JSONException { + return baseArgs.getBoolean(index); + } + + public double getDouble(int index) throws JSONException { + return baseArgs.getDouble(index); + } + + public int getInt(int index) throws JSONException { + return baseArgs.getInt(index); + } + + public JSONArray getJSONArray(int index) throws JSONException { + return baseArgs.getJSONArray(index); + } + + public Object getJSONObject(int index) throws JSONException { + return baseArgs.getJSONObject(index); + } + + public long getLong(int index) throws JSONException { + return baseArgs.getLong(index); + } + + public String getString(int index) throws JSONException { + return baseArgs.getString(index); + } + + + public Object opt(int index) { + return baseArgs.opt(index); + } + + public boolean optBoolean(int index) { + return baseArgs.optBoolean(index); + } + + public double optDouble(int index) { + return baseArgs.optDouble(index); + } + + public int optInt(int index) { + return baseArgs.optInt(index); + } + + public JSONArray optJSONArray(int index) { + return baseArgs.optJSONArray(index); + } + + public Object optJSONObject(int index) { + return baseArgs.optJSONObject(index); + } + + public long optLong(int index) { + return baseArgs.optLong(index); + } + + public String optString(int index) { + return baseArgs.optString(index); + } + + public boolean isNull(int index) { + return baseArgs.isNull(index); + } + + + // The interesting custom helpers. + public byte[] getArrayBuffer(int index) throws JSONException { + String encoded = baseArgs.getString(index); + return Base64.decode(encoded, Base64.DEFAULT); + } +} + + diff --git a/framework/src/org/apache/cordova/CordovaArguments.java b/framework/src/org/apache/cordova/CordovaArguments.java deleted file mode 100644 index e71c39c8..00000000 --- a/framework/src/org/apache/cordova/CordovaArguments.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -package org.apache.cordova; - -import org.json.JSONArray; -import org.json.JSONException; - -import android.util.Base64; - -public class CordovaArguments { - public static byte[] getArrayBuffer(JSONArray args, int index) throws JSONException { - String encoded = args.getString(index); - return Base64.decode(encoded, Base64.DEFAULT); - } -} - - diff --git a/framework/src/org/apache/cordova/Echo.java b/framework/src/org/apache/cordova/Echo.java index 5f1fed66..b84cc3f8 100644 --- a/framework/src/org/apache/cordova/Echo.java +++ b/framework/src/org/apache/cordova/Echo.java @@ -20,24 +20,28 @@ package org.apache.cordova; import org.apache.cordova.api.CallbackContext; import org.apache.cordova.api.CordovaPlugin; -import org.json.JSONArray; import org.json.JSONException; public class Echo extends CordovaPlugin { @Override - public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { - final String result = args.isNull(0) ? null : args.getString(0); + public boolean execute(String action, CordovaArgs args, final CallbackContext callbackContext) throws JSONException { if ("echo".equals(action)) { + final String result = args.isNull(0) ? null : args.getString(0); callbackContext.success(result); return true; } else if ("echoAsync".equals(action)) { + final String result = args.isNull(0) ? null : args.getString(0); cordova.getThreadPool().execute(new Runnable() { public void run() { callbackContext.success(result); } }); return true; + } else if ("binaryEcho".equals(action)) { + final byte[] result = args.getArrayBuffer(0); + callbackContext.success(result); + return true; } return false; } diff --git a/framework/src/org/apache/cordova/api/CallbackContext.java b/framework/src/org/apache/cordova/api/CallbackContext.java index 86cc813c..2f7b15f2 100644 --- a/framework/src/org/apache/cordova/api/CallbackContext.java +++ b/framework/src/org/apache/cordova/api/CallbackContext.java @@ -71,6 +71,15 @@ public class CallbackContext { sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); } + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(byte[] message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + /** * Helper for success callbacks that just returns the Status.OK by default * diff --git a/framework/src/org/apache/cordova/api/CordovaPlugin.java b/framework/src/org/apache/cordova/api/CordovaPlugin.java index 18f3c558..f4c785e1 100644 --- a/framework/src/org/apache/cordova/api/CordovaPlugin.java +++ b/framework/src/org/apache/cordova/api/CordovaPlugin.java @@ -18,12 +18,12 @@ */ package org.apache.cordova.api; +import org.apache.cordova.CordovaArgs; import org.apache.cordova.CordovaWebView; import org.json.JSONArray; import org.json.JSONException; import android.content.Intent; - /** * Plugins must extend this class and override one of the execute methods. */ @@ -76,9 +76,28 @@ public class CordovaPlugin { * @return Whether the action was valid. */ public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + CordovaArgs cordovaArgs = new CordovaArgs(args); + return execute(action, cordovaArgs, callbackContext); + } + + /** + * Executes the request. + * + * This method is called from the WebView thread. To do a non-trivial amount of work, use: + * cordova.getThreadPool().execute(runnable); + * + * To run on the UI thread, use: + * cordova.getActivity().runOnUiThread(runnable); + * + * @param action The action to execute. + * @param args The exec() arguments, wrapped with some Cordova helpers. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return Whether the action was valid. + */ + public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException { return false; } - + /** * Called when the system is about to start resuming a previous activity. *