/*
* Copyright 2011 Daniel Kurka
*
* 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.googlecode.gwtphonegap.client.file.browser;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.googlecode.gwtphonegap.client.file.FileError;
import com.googlecode.gwtphonegap.client.file.FileWriter;
import com.googlecode.gwtphonegap.client.file.WriterCallback;
import com.googlecode.gwtphonegap.client.file.browser.dto.FileWriterDTO;
import com.googlecode.gwtphonegap.client.file.browser.service.FileSystemController;
/**
* @author Daniel Kurka
*
*/
public class FileWriterBrowserImpl implements FileWriter {
private final FileSystemController controller;
private FileWriterDTO result;
private WriterCallback<FileWriter> onWriteStartCallback;
private WriterCallback<FileWriter> onWriteCallback;
private WriterCallback<FileWriter> onAbortCallback;
private WriterCallback<FileWriter> onErrorCallback;
private WriterCallback<FileWriter> onWriteEndCallback;
private int status;
private FileError error;
private boolean abort;
/**
* @param result
*/
public FileWriterBrowserImpl(FileWriterDTO result, FileSystemController controller) {
this.result = result;
this.controller = controller;
status = FileWriter.INIT;
}
@Override
public int getReadyState() {
return status;
}
@Override
public String getFileName() {
return result.getName();
}
@Override
public long getLength() {
return result.getSize();
}
@Override
public long getPosition() {
return result.getPosition();
}
@Override
public FileError getError() {
return error;
}
@Override
public void setOnWriteStartCallback(WriterCallback<FileWriter> callback) {
this.onWriteStartCallback = callback;
}
@Override
public void setOnProgressCallback(WriterCallback<FileWriter> callback) {
// TODO Auto-generated method stub
}
@Override
public void setOnWriteCallback(WriterCallback<FileWriter> callback) {
this.onWriteCallback = callback;
}
@Override
public void setOnAbortCallback(WriterCallback<FileWriter> callback) {
this.onAbortCallback = callback;
}
@Override
public void setOnErrorCallback(WriterCallback<FileWriter> callback) {
this.onErrorCallback = callback;
}
@Override
public void setOnWriteEndCallback(WriterCallback<FileWriter> callback) {
this.onWriteEndCallback = callback;
}
@Override
public void abort() {
abort = true;
if (onAbortCallback != null) {
onAbortCallback.onCallback(this);
}
}
@Override
public void seek(long position) {
result.setPosition(position);
}
@Override
public void truncate(long position) {
//TODO how do we implement this for devmode?
//lets just put out a warning....
//and fix this later
Window.alert("truncate not working in dev mode");
}
@Override
public void write(String text) {
if (status != INIT) {
throw new RuntimeException("this filewriter has already been used");
}
status = WRITING;
if (onWriteStartCallback != null) {
onWriteStartCallback.onCallback(FileWriterBrowserImpl.this);
}
controller.writeFile(result, text, new AsyncCallback<FileWriterDTO>() {
@Override
public void onFailure(Throwable caught) {
if (abort)
return;
status = DONE;
FileErrorException ex;
if (caught instanceof FileErrorException) {
FileErrorException fileErrorException = (FileErrorException) caught;
ex = fileErrorException;
} else {
ex = new FileErrorException(FileError.INVALID_STATE_ERR);
}
FileWriterBrowserImpl.this.error = ex;
if (onErrorCallback != null) {
onErrorCallback.onCallback(FileWriterBrowserImpl.this);
}
if (onWriteEndCallback != null) {
onWriteEndCallback.onCallback(FileWriterBrowserImpl.this);
}
}
@Override
public void onSuccess(FileWriterDTO result) {
if (abort)
return;
status = DONE;
FileWriterBrowserImpl.this.result = result;
if (onWriteCallback != null) {
onWriteCallback.onCallback(FileWriterBrowserImpl.this);
}
if (onWriteEndCallback != null) {
onWriteEndCallback.onCallback(FileWriterBrowserImpl.this);
}
}
});
}
}