/*
* Copyright (c) 2010 Zhihua (Dennis) Jiang
*
* Licensed 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 com.gwtmobile.phonegap.client;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArrayString;
public class File {
protected File() {}
public static native FileReader newReaderInstance() /*-{
return new $wnd.FileReader();
}-*/;
public static native FileWriter newWriterInstance(String filePath) /*-{
return new $wnd.FileWriter(filePath);
}-*/;
public static native FileWriter newWriterInstance(String filePath, boolean append) /*-{
return new $wnd.FileWriter(filePath, append);
}-*/;
// fileMgr methods are not in phonegap doc yet.
public static String[] getRootPaths() {
JsArrayString jsArray = getRootPathsNative();
String[] array = new String[jsArray.length()];
for (int i = 0; i < jsArray.length(); i++) {
array[i] = jsArray.get(i);
}
return array;
}
private static native JsArrayString getRootPathsNative() /*-{
return $wnd.navigator.fileMgr.getRootPaths();
}-*/;
public static String[] getFileBasePaths() {
JsArrayString jsArray = getFileBasePathsNative();
String[] array = new String[jsArray.length()];
for (int i = 0; i < jsArray.length(); i++) {
array[i] = jsArray.get(i);
}
return array;
}
private static native JsArrayString getFileBasePathsNative() /*-{
return $wnd.navigator.fileMgr.getFileBasePathsNative();
}-*/;
public static native void testFileExists(String fileName, FileMgrCallback callback) /*-{
$wnd.navigator.fileMgr.testFileExists(fileName, function(success){
callback.@com.gwtmobile.phonegap.client.FileMgr.FileMgrCallback::onSuccess(Z)(success);
}, function(error){
callback.@com.gwtmobile.phonegap.client.FileMgr.FileMgrCallback::onError(Lcom/gwtmobile/phonegap/client/FileMgr$FileError;)(error);
});
}-*/;
public static native void testDirectoryExists(String dirName, FileMgrCallback callback) /*-{
$wnd.navigator.fileMgr.testDirectoryExists(dirName, function(success){
callback.@com.gwtmobile.phonegap.client.FileMgr.FileMgrCallback::onSuccess(Z)(success);
}, function(error){
callback.@com.gwtmobile.phonegap.client.FileMgr.FileMgrCallback::onError(Lcom/gwtmobile/phonegap/client/FileMgr$FileError;)(error);
});
}-*/;
public static native void createDirectory(String dirName, FileMgrCallback callback) /*-{
$wnd.navigator.fileMgr.createDirectory(dirName, function(success){
callback.@com.gwtmobile.phonegap.client.FileMgr.FileMgrCallback::onSuccess(Z)(success);
}, function(error){
callback.@com.gwtmobile.phonegap.client.FileMgr.FileMgrCallback::onError(Lcom/gwtmobile/phonegap/client/FileMgr$FileError;)(error);
});
}-*/;
public static native void deleteDirectory(String dirName, FileMgrCallback callback) /*-{
$wnd.navigator.fileMgr.deleteDirectory(dirName, function(success){
callback.@com.gwtmobile.phonegap.client.FileMgr.FileMgrCallback::onSuccess(Z)(success);
}, function(error){
callback.@com.gwtmobile.phonegap.client.FileMgr.FileMgrCallback::onError(Lcom/gwtmobile/phonegap/client/FileMgr$FileError;)(error);
});
}-*/;
public static native void deleteFile(String fileName, FileMgrCallback callback) /*-{
$wnd.navigator.fileMgr.deleteFile(fileName, function(success){
callback.@com.gwtmobile.phonegap.client.FileMgr.FileMgrCallback::onSuccess(Z)(success);
}, function(error){
callback.@com.gwtmobile.phonegap.client.FileMgr.FileMgrCallback::onError(Lcom/gwtmobile/phonegap/client/FileMgr$FileError;)(error);
});
}-*/;
public static native void getFreeDiskSpace(FreeDiskSpaceCallback callback) /*-{
$wnd.navigator.fileMgr.getFreeDiskSpace(function(freeDiskSpace){
callback.@com.gwtmobile.phonegap.client.FileMgr.FreeDiskSpaceCallback::onSuccess(D)(freeDiskSpace);
}, function(error){
callback.@com.gwtmobile.phonegap.client.FileMgr.FreeDiskSpaceCallback::onError(Lcom/gwtmobile/phonegap/client/FileMgr$FileError;)(error);
});
}-*/;
public static class FileBase extends JavaScriptObject {
protected FileBase() {};
protected final native int getReadyStateNative() /*-{
return this.readyState;
}-*/;
// TODO: phonegap doc does not mention this property on the reader. but the code seems to differ.
public final native String getFileName() /*-{
return this.fileName;
}-*/;
// move this method to base so onload event does not have to cast target to a reader.
// writer does not have this property and this method should not be called on a writer.
public final native String getResult() /*-{
return this.result;
}-*/;
public final native FileError getError() /*-{
return this.error;
}-*/;
public final native void onProgress(Callback callback) /*-{
this.onprogress = function(event) {
callback.@com.gwtmobile.phonegap.client.FileMgr.EventCallback::onEvent(Lcom/gwtmobile/phonegap/client/FileMgr$Event;)(event);
};
}-*/;
public final native void onAbort(Callback callback) /*-{
this.onabort = function(event) {
callback.@com.gwtmobile.phonegap.client.FileMgr.EventCallback::onEvent(Lcom/gwtmobile/phonegap/client/FileMgr$Event;)(event);
};
}-*/;
public final native void onError(Callback callback) /*-{
this.onerror = function(event) {
callback.@com.gwtmobile.phonegap.client.FileMgr.EventCallback::onEvent(Lcom/gwtmobile/phonegap/client/FileMgr$Event;)(event);
};
}-*/;
public final native void abort() /*-{
this.abort();
}-*/;
}
public static class FileReader extends FileBase {
protected FileReader() {};
public enum ReadyState { EMPTY, LOADING, DONE };
public final ReadyState getReadyState() {
return ReadyState.values()[getReadyStateNative()];
}
public final native void onLoadStart(Callback callback) /*-{
this.onloadstart = function(event) {
callback.@com.gwtmobile.phonegap.client.FileMgr.EventCallback::onEvent(Lcom/gwtmobile/phonegap/client/FileMgr$Event;)(event);
};
}-*/;
public final native void onLoad(Callback callback) /*-{
this.onload = function(event) {
callback.@com.gwtmobile.phonegap.client.FileMgr.EventCallback::onEvent(Lcom/gwtmobile/phonegap/client/FileMgr$Event;)(event);
};
}-*/;
public final native void onLoadEnd(Callback callback) /*-{
this.onloadend = function(event) {
callback.@com.gwtmobile.phonegap.client.FileMgr.EventCallback::onEvent(Lcom/gwtmobile/phonegap/client/FileMgr$Event;)(event);
};
}-*/;
public final native void readAsDataURL(String fileName) /*-{
this.readAsDataURL(fileName);
}-*/;
public final native void readAsText(String fileName) /*-{
this.readAsText(fileName);
}-*/;
}
public static class FileWriter extends FileBase {
protected FileWriter() {};
public enum ReadyState { INIT, WRITING, DONE };
public final ReadyState getReadyState() {
return ReadyState.values()[getReadyStateNative()];
}
public final long getLength() {
return (long) getLengthNative();
};
private final native double getLengthNative() /*-{
return this.length;
}-*/;
public final long getPosition() {
return (long) getPositionNative();
};
private final native double getPositionNative() /*-{
return this.position;
}-*/;
public final native void onWriteStart(Callback callback) /*-{
this.onwritestart = function(event) {
callback.@com.gwtmobile.phonegap.client.FileMgr.EventCallback::onEvent(Lcom/gwtmobile/phonegap/client/FileMgr$Event;)(event);
};
}-*/;
public final native void onWrite(Callback callback) /*-{
this.onwrite = function(event) {
callback.@com.gwtmobile.phonegap.client.FileMgr.EventCallback::onEvent(Lcom/gwtmobile/phonegap/client/FileMgr$Event;)(event);
};
}-*/;
public final native void onWriteEnd(Callback callback) /*-{
this.onwriteend = function(event) {
callback.@com.gwtmobile.phonegap.client.FileMgr.EventCallback::onEvent(Lcom/gwtmobile/phonegap/client/FileMgr$Event;)(event);
};
}-*/;
public final void seek(long offset) {
seek((double)offset);
}
private final native void seek(double offset) /*-{
this.seek(offset);
}-*/;
public final void truncate(long size) {
truncate((double)size);
}
private final native void truncate(double size) /*-{
this.truncate(size);
}-*/;
public final native void write(String text) /*-{
this.write(text);
}-*/;
}
public enum FileErrorCode {
NO_ERROR, //addition to phonegap codes to fill the 0 position.
NOT_FOUND_ERR,
SECURITY_ERR,
ABORT_ERR,
NOT_READABLE_ERR,
ENCODING_ERR,
NO_MODIFICATION_ALLOWED_ERR,
INVALID_STATE_ERR,
SYNTAX_ERR
};
public static class FileError extends JavaScriptObject {
protected FileError() {};
public final FileErrorCode getCode() {
return FileErrorCode.values()[getCodeNative()];
}
private final native int getCodeNative() /*-{
// Hey phonegap, where is the consistency?
return this.code || this;
}-*/;
}
public interface Callback {
void onEvent(Event evt);
}
public interface FileMgrCallback {
void onSuccess(boolean success);
void onError(FileError error);
}
public interface FreeDiskSpaceCallback {
void onSuccess(double freeDiskSpace);
void onError(FileError error);
}
public static class Event extends JavaScriptObject {
protected Event() {};
public final native String getType() /*-{
return this.type;
}-*/;
public final native FileBase getTarget() /*-{
return this.target;
}-*/;
}
}