/*
Copyright 2012-2013, Polyvi Inc. (http://polyvi.github.io/openxface)
This program is distributed under the terms of the GNU General Public License.
This file is part of xFace.
xFace is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
xFace is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with xFace. If not, see <http://www.gnu.org/licenses/>.
*/
package com.polyvi.xface.extension.advancedfiletransfer;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import com.polyvi.xface.extension.XCallbackContext;
import com.polyvi.xface.extension.XExtensionContext;
import com.polyvi.xface.plugin.api.XIWebContext;
public class XFileTransferManager {
private static final String COMMAND_DOWNLOAD = "download";
/**
* 为每个app创建一个Map<String, XIFileTransfer>,第一个key代表appId, Map<String,
* XIFileTransfer>表示为每个source创建一个XIFileTransfer,
* 这里的key在下载时表示服务器地址,上传是表示要上传的文件地址
*/
private Map<String, Map<String, XIFileTransfer>> mHashMapFileTransfers = new HashMap<String, Map<String, XIFileTransfer>>();
/** 为每个app创建一个XFileTransferRecorder,因为给个应用有自己单独的配置文件,这里的key代表appId */
private Map<String, XFileTransferRecorder> mFileTransferRecorders = new HashMap<String, XFileTransferRecorder>();
private Context mContext;
public XFileTransferManager(Context context) {
mContext = context;
}
public XFileTransferManager() {
}
/**
* 当文件传输完成后移除XIFileTransfer
* @param source 下载时表示服务器地址,上传是表示要上传的文件地址
*/
public void removeFileTranferTask(String appId, String source) {
Map<String, XIFileTransfer> fileTransfers = mHashMapFileTransfers.get(appId);
if (fileTransfers != null) {
fileTransfers.remove(source);
}
}
/**
* 当有文件传输任务发起时,增加一个传输任务
* @param source 下载时表示服务器地址,上传是表示要上传的文件地址
* @param target 下载时表示存储下载文件的本地地址,上传是表示要上传的服务器地址
* @param extensionContext XExtensionContext对象
* @param callbackCtx 回调上下文环境
* @param webContext 当前应用
* @param type 传输的类型(上传或下载两种)
*/
public void addFileTranferTask(String source, String target, XExtensionContext extensionContext,
XCallbackContext callbackCtx, XIWebContext webContext, String type) {
Map<String, XIFileTransfer> fileTransfers = mHashMapFileTransfers.get(webContext.getApplication().getAppId());
if(fileTransfers == null) {
fileTransfers = new HashMap<String, XIFileTransfer>();
}
XIFileTransfer fileTransfer = getFileTransfer(fileTransfers, source, target, extensionContext, webContext, type);
if(!mHashMapFileTransfers.containsValue(fileTransfers)) {
mHashMapFileTransfers.put(webContext.getApplication().getAppId(), fileTransfers);
}
fileTransfer.transfer(callbackCtx);
}
/**
* 获取XIFileTransfer对象,如果Map<String, XIFileTransfer>中有就直接获取,没有就创建
* @param fileTransfers 存储XIFileTransfer对象的Map
* @param source 下载时表示服务器地址,上传是表示要上传的文件地址
* @param target 下载时表示存储下载文件的本地地址,上传是表示要上传的服务器地址
* @param extensionContext XExtensionContext对象
* @param webContext 当前应用
* @param type 传输的类型(上传或下载两种)
*/
private XIFileTransfer getFileTransfer(Map<String, XIFileTransfer> fileTransfers, String source, String target,
XExtensionContext extensionContext, XIWebContext webContext, String type) {
XFileTransferRecorder fileTransferRecorder = mFileTransferRecorders.get(webContext.getApplication().getAppId());
if (fileTransferRecorder == null) {
fileTransferRecorder = new XFileTransferRecorder(webContext);
mFileTransferRecorders.put(webContext.getApplication().getAppId(), fileTransferRecorder);
}
XIFileTransfer fileTransfer = fileTransfers.get(source);
if (fileTransfer == null) {
if (type.equals(COMMAND_DOWNLOAD)) {
fileTransfer = new XFileDownloader(mContext,source, target,
extensionContext, webContext.getApplication(), fileTransferRecorder, this);
} else {
fileTransfer = new XFileUploader(source, target,
extensionContext, webContext, fileTransferRecorder, this);
}
fileTransfers.put(source, fileTransfer);
}
return fileTransfer;
}
/**
* 暂停指定的文件传输任务
* @param source 下载时表示服务器地址,上传是表示要上传的文件地址
*/
public void pause(String appId, String source) {
Map<String, XIFileTransfer> fileTransfers = mHashMapFileTransfers.get(appId);
if (fileTransfers != null) {
XIFileTransfer fileTransfer = fileTransfers.get(source);
if (fileTransfer != null) {
fileTransfer.pause();
}
}
}
/**
* 停止某个app中的所有文件传输任务
*/
public void stopAllByApp(String appId) {
Map<String, XIFileTransfer> fileTransfers = mHashMapFileTransfers.get(appId);
if (fileTransfers != null) {
for (XIFileTransfer fileTransfer : fileTransfers.values()) {
fileTransfer.pause();
}
}
}
/**
* 停止所有app中的所有任务
*/
public void stopAll() {
for (Map<String, XIFileTransfer> fileTransfers : mHashMapFileTransfers.values()) {
for (XIFileTransfer fileTransfer : fileTransfers.values()) {
fileTransfer.pause();
}
}
}
/**
* 取消指定的文件传输任务
* @param appId 当前app的id
* @param source 下载时表示服务器地址,上传是表示要上传的文件地址
* @param target 下载时表示存储下载文件的本地地址,上传是表示要上传的服务器地址
*/
public void cancel(String appId, String source, String target, String type) {
pause(appId, source);
removeFileTranferTask(appId, source);
XFileTransferRecorder recorder = mFileTransferRecorders.get(appId);
if (type.equals(COMMAND_DOWNLOAD)) {
if (null != recorder) {
recorder.deleteDownloadInfo(source);
}
File file = new File(target);
if (file.exists()) {
file.delete();
}
} else {
if (null != recorder) {
recorder.deleteUploadInfo(source);
}
}
}
public Map<String, Map<String, XIFileTransfer>> getHashMapFileTransfer() {
return mHashMapFileTransfers;
}
public Map<String, XFileTransferRecorder> getFileTransferRecorders() {
return mFileTransferRecorders;
}
}