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/15 21:48:04 UTC

android commit: [CB-2632] Implement FileReader.readAsBinaryString

Updated Branches:
  refs/heads/master 7755a902d -> 66b827e50


[CB-2632] Implement FileReader.readAsBinaryString


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/66b827e5
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/66b827e5
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/66b827e5

Branch: refs/heads/master
Commit: 66b827e5029d2706eb5b6531093120cd6b0d8635
Parents: 7755a90
Author: Andrew Grieve <ag...@chromium.org>
Authored: Fri Mar 15 16:47:33 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Fri Mar 15 16:47:33 2013 -0400

----------------------------------------------------------------------
 framework/src/org/apache/cordova/FileUtils.java |  167 +++++-------------
 1 files changed, 43 insertions(+), 124 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/66b827e5/framework/src/org/apache/cordova/FileUtils.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/FileUtils.java b/framework/src/org/apache/cordova/FileUtils.java
index a137193..2910a65 100755
--- a/framework/src/org/apache/cordova/FileUtils.java
+++ b/framework/src/org/apache/cordova/FileUtils.java
@@ -22,6 +22,7 @@ import android.database.Cursor;
 import android.net.Uri;
 import android.os.Environment;
 import android.provider.MediaStore;
+import android.util.Log;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.cordova.api.CallbackContext;
@@ -49,9 +50,6 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLDecoder;
 import java.nio.channels.FileChannel;
-//import android.content.Context;
-
-//import android.app.Activity;
 
 /**
  * This class provides SD card file and directory services to JavaScript.
@@ -113,40 +111,29 @@ public class FileUtils extends CordovaPlugin {
                 callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, b));
             }
             else if (action.equals("readAsText")) {
-                int start = 0;
-                int end = Integer.MAX_VALUE;
-                if (args.length() >= 3) {
-                    start = args.getInt(2);
-                }
-                if (args.length() >= 4) {
-                    end = args.getInt(3);
-                }
+                String encoding = args.getString(1);
+                int start = args.getInt(2);
+                int end = args.getInt(3);
 
-                this.readAsText(args.getString(0), args.getString(1), start, end, callbackContext);
+                this.readFileAs(args.getString(0), start, end, callbackContext, encoding, PluginResult.MESSAGE_TYPE_STRING);
             }
             else if (action.equals("readAsDataURL")) {
-                int start = 0;
-                int end = Integer.MAX_VALUE;
-                if (args.length() >= 2) {
-                    start = args.getInt(1);
-                }
-                if (args.length() >= 3) {
-                    end = args.getInt(2);
-                }
+                int start = args.getInt(1);
+                int end = args.getInt(2);
 
-                this.readAsDataURL(args.getString(0), start, end, callbackContext);
+                this.readFileAs(args.getString(0), start, end, callbackContext, null, -1);
             }
             else if (action.equals("readAsArrayBuffer")) {
-                int start = 0;
-                int end = Integer.MAX_VALUE;
-                if (args.length() >= 2) {
-                    start = args.getInt(1);
-                }
-                if (args.length() >= 3) {
-                    end = args.getInt(2);
-                }
+                int start = args.getInt(1);
+                int end = args.getInt(2);
 
-                this.readAsBinary(args.getString(0), start, end, callbackContext);
+                this.readFileAs(args.getString(0), start, end, callbackContext, null, PluginResult.MESSAGE_TYPE_ARRAYBUFFER);
+            }
+            else if (action.equals("readAsBinaryString")) {
+                int start = args.getInt(1);
+                int end = args.getInt(2);
+
+                this.readFileAs(args.getString(0), start, end, callbackContext, null, PluginResult.MESSAGE_TYPE_BINARYSTRING);
             }
             else if (action.equals("write")) {
                 long fileSize = this.write(args.getString(0), args.getString(1), args.getInt(2));
@@ -929,27 +916,6 @@ public class FileUtils extends CordovaPlugin {
         return getEntry(new File(path));
     }
 
-    /**
-     * Identifies if action to be executed returns a value and should be run synchronously.
-     *
-     * @param action	The action to execute
-     * @return			T=returns value
-     */
-    public boolean isSynch(String action) {
-        if (action.equals("testSaveLocationExists")) {
-            return true;
-        }
-        else if (action.equals("getFreeDiskSpace")) {
-            return true;
-        }
-        else if (action.equals("testFileExists")) {
-            return true;
-        }
-        else if (action.equals("testDirectoryExists")) {
-            return true;
-        }
-        return false;
-    }
 
     //--------------------------------------------------------------------------
     // LOCAL METHODS
@@ -965,59 +931,39 @@ public class FileUtils extends CordovaPlugin {
      * @param end               End position to stop at (exclusive).
      * @return                  Contents of file.
      */
-    public void readAsText(final String filename, final String encoding, final int start, final int end, final CallbackContext callbackContext) {
-        Runnable readAsTextRunnable = new Runnable() {
+    public void readFileAs(final String filename, final int start, final int end, final CallbackContext callbackContext, final String encoding, final int resultType) {
+        this.cordova.getThreadPool().execute(new Runnable() {
             public void run() {
                 try {
-                    int diff = end - start;
-                    byte[] bytes = new byte[1000];
-                    BufferedInputStream bis = new BufferedInputStream(FileHelper.getInputStreamFromUriString(filename, cordova), 1024);
-                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
-                    int numRead = 0;
-
-                    if (start > 0) {
-                        bis.skip(start);
-                    }
-
-                    while ( diff > 0 && (numRead = bis.read(bytes, 0, Math.min(1000, diff))) >= 0) {
-                        diff -= numRead;
-                        bos.write(bytes, 0, numRead);
+                    byte[] bytes = readAsBinaryHelper(filename, start, end);
+                    
+                    PluginResult result;
+                    switch (resultType) {
+                        case PluginResult.MESSAGE_TYPE_STRING:
+                            result = new PluginResult(PluginResult.Status.OK, new String(bytes, encoding));
+                            break;
+                        case PluginResult.MESSAGE_TYPE_ARRAYBUFFER:
+                            result = new PluginResult(PluginResult.Status.OK, bytes);
+                            break;
+                        case PluginResult.MESSAGE_TYPE_BINARYSTRING:
+                            result = new PluginResult(PluginResult.Status.OK, bytes, true);
+                            break;
+                        default: // Base64.
+                            String contentType = FileHelper.getMimeType(filename, cordova);
+                            byte[] base64 = Base64.encodeBase64(bytes);
+                            String s = "data:" + contentType + ";base64," + new String(base64, "US-ASCII");
+                            result = new PluginResult(PluginResult.Status.OK, s);
                     }
 
-                    String result = new String(bos.toByteArray(), encoding);
-                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result));
+                    callbackContext.sendPluginResult(result);
+                } catch (FileNotFoundException e) {
+                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, NOT_FOUND_ERR));
                 } catch (IOException e) {
-                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, e.getLocalizedMessage()));
+                    Log.d(LOG_TAG, e.getLocalizedMessage());
+                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, NOT_READABLE_ERR));
                 }
             }
-        };
-
-        this.cordova.getThreadPool().execute(readAsTextRunnable);
-    }
-
-    /**
-     * Read the contents of a file as binary.
-     * This is done in a background thread; the result is sent to the callback.
-     *
-     * @param filename          The name of the file.
-     * @param encoding          The encoding to return contents as.  Typical value is UTF-8. (see http://www.iana.org/assignments/character-sets)
-     * @param start             Start position in the file.
-     * @param end               End position to stop at (exclusive).
-     * @return                  Contents of file.
-     */
-    public void readAsBinary(final String filename, final int start, final int end, final CallbackContext callbackContext) {
-        Runnable readAsBinaryRunnable = new Runnable() {
-            public void run() {
-                try {
-                    byte[] result = readAsBinaryHelper(filename, start, end);
-                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result));
-                } catch (IOException e) {
-                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, e.getLocalizedMessage()));
-                }
-            }
-        };
-
-        this.cordova.getThreadPool().execute(readAsBinaryRunnable);
+        });
     }
 
     /**
@@ -1050,33 +996,6 @@ public class FileUtils extends CordovaPlugin {
     }
 
     /**
-     * Read the contents of a file as a base64 encoded data URL.
-     *
-     * @param filename        The name of the file.
-     * @param start           Start position in the file.
-     * @param end             End position to stop at (exclusive).
-     * @return                Contents of file = data:<media type>;base64,<data>
-     */
-    public void readAsDataURL(final String filename, final int start, final int end, final CallbackContext callbackContext) {
-        Runnable readAsDataUrlRunnable = new Runnable() {
-            public void run() {
-                try {
-                    // Determine content type from file name
-                    String contentType = FileHelper.getMimeType(filename, cordova);
-
-                    byte[] base64 = Base64.encodeBase64(readAsBinaryHelper(filename, start, end));
-                    String result = "data:" + contentType + ";base64," + new String(base64);
-                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result));
-                } catch (IOException e) {
-                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, e.getLocalizedMessage()));
-                }
-            }
-        };
-
-        this.cordova.getThreadPool().execute(readAsDataUrlRunnable);
-    }
-
-    /**
      * Write contents of file.
      *
      * @param filename			The name of the file.