package com.mediafire.sdk.uploader;
import com.mediafire.sdk.MFApiException;
import com.mediafire.sdk.MFException;
import com.mediafire.sdk.MFSessionNotStartedException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.*;
/**
* Uploader which handles MediaFireUpload requests. Pausable.
*/
public class MediaFireUploader implements MediaFireUploadHandler {
private final MediaFireUploadExecutor executor;
private final LinkedBlockingDeque<Runnable> queue;
private final ArrayList<MediaFireUploadHandler> handlers = new ArrayList<MediaFireUploadHandler>();
private boolean coreThreadsStarted = false;
public MediaFireUploader(int concurrentUploads) {
this.queue = new LinkedBlockingDeque<Runnable>();
this.executor = new MediaFireUploadExecutor(concurrentUploads, 10, 10, TimeUnit.SECONDS, queue);
}
/**
* adds a handler to be notified of upload state changes (@see MediaFireUploadHandler}
*
* @param handler MediaFireUploadHandler
*/
public void addHandler(MediaFireUploadHandler handler) {
handlers.add(handler);
}
/**
* removes a handler to be notified of upload state changes (@see MediaFireUploadHandler}
*
* @param handler MediaFireUploadHandler
*/
public void removeHandler(MediaFireUploadHandler handler) {
handlers.remove(handler);
}
/**
* gets the current queue size
*
* @return int
*/
public int getQueueSize() {
return queue.size();
}
/**
* adds an upload to the queue
*
* @param mediaFireUpload a MediaFireUpload
*/
public void schedule(MediaFireUpload mediaFireUpload) {
queue.offer(mediaFireUpload);
}
/**
* pauses uploading from the queue
*/
public void pause() {
executor.pause();
}
/**
* resumes uploading from the queue (must be called to start uploading initially.
*/
public void resume() {
if (!coreThreadsStarted) {
coreThreadsStarted = true;
executor.prestartAllCoreThreads();
}
executor.resume();
}
/**
* if the uploader is paused
* @return true if paused
*/
public boolean isPaused() {
return executor.isPaused();
}
/**
* if the uploader is running
* @return true if running
*/
public boolean isRunning() {
return executor.isRunning();
}
/**
* clears the upload queue
*/
public void clear() {
queue.clear();
}
/**
* whether or not the upload queue is empty
*
* @return true if the upload queue is empty
*/
public boolean isEmpty() {
return queue.isEmpty();
}
@Override
public void uploadFailed(long id, MFException e) {
for (MediaFireUploadHandler handler : handlers) {
handler.uploadFailed(id, e);
}
}
@Override
public void uploadFailed(long id, MFApiException e) {
for (MediaFireUploadHandler handler : handlers) {
handler.uploadFailed(id, e);
}
}
@Override
public void uploadFailed(long id, MFSessionNotStartedException e) {
for (MediaFireUploadHandler handler : handlers) {
handler.uploadFailed(id, e);
}
}
@Override
public void uploadFailed(long id, IOException e) {
for (MediaFireUploadHandler handler : handlers) {
handler.uploadFailed(id, e);
}
}
@Override
public void uploadFailed(long id, InterruptedException e) {
for (MediaFireUploadHandler handler : handlers) {
handler.uploadFailed(id, e);
}
}
@Override
public void uploadProgress(long id, double percentFinished) {
for (MediaFireUploadHandler handler : handlers) {
handler.uploadProgress(id, percentFinished);
}
}
@Override
public void uploadFinished(long id, String quickKey, String fileName) {
for (MediaFireUploadHandler handler : handlers) {
handler.uploadFinished(id, quickKey, fileName);
}
}
@Override
public void uploadPolling(long id, int statusCode, String description) {
for (MediaFireUploadHandler handler : handlers) {
handler.uploadPolling(id, statusCode, description);
}
}
}