/**
     * 
     * TODO 数据上传监听器
     * 2012-1-10 下午5:34:01
     * @author zhuoran.xu
     *
     */
    public class MyTransferListener implements FTPDataTransferListener {
    
        long percent = 0L;
        //传输中止时触发
        public void aborted() {
            Log.d("MyFTPClient","file aborted");
            Log.i("MyFTPClient","MyFTPClientaborted:" + uploadSize);
saveBreakpointInfo();
disconnect();
context.unregisterReceiver(connctionChangeReceiver);
        }
        //文件传输完成时,触发
        public void completed() {
         //文件传输完成时,将已上传文件大小置空
         uploadSize = 0;
         String fileName = getFileName(path);
         String [] keys = getKeys(fileName);
     //文件传输完成时,将本地化信息清空。
         editor.remove(fileName);
         editor.remove(keys[0]);
         editor.remove(keys[1]);
         editor.remove(keys[2]);
         editor.commit();
        
         disconnect();
        
         context.unregisterReceiver(connctionChangeReceiver);
        
         Intent intent = new Intent();
         intent.setAction(UPLOAD_COMPLETED_ACTION);
         intent.putExtra("path", path);
         context.sendBroadcast(intent);
         Log.d("MyFTPClient","file completed");
        }
        //传输失败时触发
        public void failed() {
            Log.d("MyFTPClient","file failed");
            Log.i("MyFTPClient","MyFTPClientFailed:"+uploadSize);
            saveBreakpointInfo();
         disconnect();
         context.unregisterReceiver(connctionChangeReceiver);
        }
        //文件开始上传或下载时触发
        public void started() {
            Log.d("MyFTPClient","file start");
        }
        //显示已经传输的字节数
        public void transferred(int arg0) {
            uploadSize += arg0;
            percent = (long)(uploadSize*100/(fileSize*1.0));
            Log.d("MyFTPClient","percent:"+percent+"%  UploadSize:"+uploadSize+"byte");
        }
    }
    /**
     * 
     * TODO 终止数据的上传,在上传线程中调用无效,需在其他线程中调用。
     */
    private void abortDataTransfer() {
try {
ftp.abortCurrentDataTransfer(false);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (FTPIllegalReplyException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
    
    /**
     * 
     * TODO 断开和服务端的连接
     */
private void disconnect() {
if(ftp != null){
try {
ftp.disconnect(false);
} catch (Exception e) {
e.printStackTrace();

}
}
    
    /**
     * 
     * TODO 根据路径获取文件名
     * @param path
     * @return 
     */
    private String getFileName(String path){
     String fileName = null;
     path = path.trim();
     fileName = path.substring(path.lastIndexOf("/")+1);
     return fileName;
    }
    /**
     * 
     * TODO 往SharedPreferences中存储断点信息,以要上传的文件名(UUID)为Key
     */
private void saveBreakpointInfo() {
String fileName = getFileName(path);
Log.i(TAG, "fileName:" + fileName);
Log.i(TAG, "saveBreakpointInfo");
String [] keys = getKeys(fileName);
        //拼接要存入的断点信息
        try {
//将断点信息存入
         editor.putString(fileName, fileName);
editor.putString(keys[0], path);
editor.putString(keys[1], serverPath);
editor.putLong(keys[2], uploadSize);
boolean b = editor.commit();
Log.i(TAG, "Is save successfully?" + b);
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
/**
 * 
 * TODO 构造存入sharedPreferences里的key值
 * @param fileName
 * @return
 */
private String [] getKeys(String fileName){
String keyPath = fileName + "_Path";//sharedPreferences里保存文件路径的key
String keyServerPath = fileName + "_ServerPath";//sharedPreferences里保存服务端存储路径的key
String keyUploadSize = fileName + "_UploadSize";//sharedPreferences里保存已上传文件大小的key
String [] keys = {keyPath ,keyServerPath ,keyUploadSize};
return keys;
}

/**
 * 
 * TODO 网络状态广播接收者
 * 2012-1-11 下午5:54:06
 * @author zhuoran.xu
 *
 */
class ConnectionChangeReceiver extends BroadcastReceiver {
private static final String TAG = "ConnectionChangeReceiver";
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager =(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (activeNetInfo != null && activeNetInfo.isConnected()) {
Log.i(TAG,"hava active network");
Toast.makeText(context, "Active Network Type : " + activeNetInfo.getTypeName(), 1).show();
}else{
Log.i(TAG, "have no active network");
try {
ftp.abortCurrentDataTransfer(false);
} catch (IOException e) {
e.printStackTrace();
} catch (FTPIllegalReplyException e) {
e.printStackTrace();
}
}
// if (mobNetInfo != null){
// Toast.makeText(context, "Mobile Network Type : " + mobNetInfo.getTypeName(), 1).show();
// }
}
}
}