Johnny

表面的激烈是由于内心的单薄,真正的力量如同流水一般沉静
随笔 - 1, 文章 - 5, 评论 - 0, 引用 - 0
数据加载中……

迅雷下载开放引擎Demo的 Java版本+注释版

package skj.thunder;

import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.WString;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.LongByReference;
import com.sun.jna.ptr.NativeLongByReference;


public class ThunderUtil {
    
    
static {
        
// 注册dll
        Native.register("D:\\Workspace\\myresource\\thunderdll\\XLDownload");
    }
    
    
// --------XLError.h中的状态--------------
    public static final int XL_ERROR_FAIL = 268435456;
    
public static final int XL_SUCCESS = 0;
    
public static final int XL_ERROR_FILE_NAME_INVALID = XL_ERROR_FAIL + 12;
    
public static final int XL_ERROR_ADD_TASK_TRAY_ICON_FAIL = XL_ERROR_FAIL + 4;
    
public static final int XL_ERROR_FILE_ALREADY_EXIST = XL_ERROR_FAIL + 16;
    
public static final int XL_ERROR_INVALID_TASK_TYPE = XL_ERROR_FAIL + 15;
    
public static final int XL_ERROR_BUFFER_TOO_SMALL = XL_ERROR_FAIL + 22;
    
public static final int XL_ERROR_CANNOT_CONTINUE_TASK = XL_ERROR_FAIL + 20;
    
public static final int XL_ERROR_INIT_TASK_TRAY_ICON_FAIL = XL_ERROR_FAIL + 3;
    
public static final int XL_ERROR_INVALID_ARG = XL_ERROR_FAIL + 10;
    
public static final int XL_ERROR_CREATE_DIRECTORY_FAIL = XL_ERROR_FAIL + 8;
    
public static final int XL_ERROR_STRING_IS_EMPTY = XL_ERROR_FAIL + 6;
    
public static final int XL_ERROR_TASK_DONT_EXIST = XL_ERROR_FAIL + 11;
    
public static final int XL_ERROR_UNINITAILIZE = XL_ERROR_FAIL + 1;
    
public static final int XL_ERROR_POINTER_IS_NULL = XL_ERROR_FAIL + 5;
    
public static final int XL_ERROR_CANNOT_PAUSE_TASK = XL_ERROR_FAIL + 21;
    
public static final int XL_ERROR_PATH_DONT_INCLUDE_FILENAME = XL_ERROR_FAIL + 7;
    
public static final int XL_ERROR_WRITE_CFG_FILE_FAIL = XL_ERROR_FAIL + 19;
    
public static final int XL_ERROR_INIT_THREAD_EXIT_TOO_EARLY = XL_ERROR_FAIL + 23;
    
public static final int XL_ERROR_READ_CFG_FILE_FAIL = XL_ERROR_FAIL + 18;
    
public static final int XL_ERROR_NOTIMPL = XL_ERROR_FAIL + 13;
    
public static final int XL_ERROR_MEMORY_ISNT_ENOUGH = XL_ERROR_FAIL + 9;
    
public static final int XL_ERROR_FILE_DONT_EXIST = XL_ERROR_FAIL + 17;
    
public static final int XL_ERROR_UNSPORTED_PROTOCOL = XL_ERROR_FAIL + 2;
    
public static final int XL_ERROR_TASKNUM_EXCEED_MAXNUM = XL_ERROR_FAIL + 14;
    
    
// -------XLDownload中Task的状态------------
    /**
     * 开始建立连接
     
*/
    
public static final int XL_STATUS_CONNECT = 0;
    
    
/**
     * 开始下载 
     
*/
    
public static final int XL_STATUS_DOWNLOAD = 2;
    
    
/**
     * 暂停
     
*/
    
public static final int XL_STATUS_PAUSE = 10;
    
    
/**
     * 下载成功
     
*/
    
public static final int XL_STATUS_SUCESS = 11;
    
    
/**
     * 下载失败
     
*/
    
public static final int XL_STATUS_FAIL = 12;
    
    
// ------XLDownload中的方法签名---------------------
    
    
/**
     * 初始化引擎
     * 
@return TRUE,表示成功;FALSE,表示失败。 
     
*/
    
public static native boolean XLInitDownloadEngine();
    
    
/**
     * 下载指定的资源,并保存到本地文件,只支持HTTP,不支持动态链
     * 
@param pszFileName 下载资源的本地文件名
     * 
@param pszUrl 资源的URL,不能为NULL
     * 
@param pszRefUrl 资源的引用页,可以为NULL
     * 
@param lTaskId 【传出参数】唯一标识引擎创建的任务,该参数可以作为XLQueryTaskInfo、XLStopTask的第一个参数。如果该参数值为0,表示引擎创建任务失败
     * 
@return XL_SUCCESS,表示成功。其他值,表示失败
     
*/
    
public static native int XLURLDownloadToFile(WString pszFileName, WString pszUrl, WString pszRefUrl, NativeLongByReference lTaskId);
    
    
/**
     * 查询指定任务的当前状态
     * 
@param lTaskId 指定将要查询的任务。通过调用XLURLDownloadToFile可以获取一个任务ID
     * 
@param plStatus 【传出参数】返回任务的当前状态。可能的取值,参见XLDownload.h
     * 
@param pullFileSize 【传出参数】文件大小,单位是字节
     * 
@param pullRecvSize 【传出参数】已经下载到的数据,单位是字节
     * 
@return
     
*/
    
public static native int XLQueryTaskInfo(NativeLong lTaskId, NativeLongByReference plStatus, LongByReference pullFileSize, LongByReference pullRecvSize);
    
    
/**
     * 暂停指定任务,并返回新的任务ID
     * 
@param lTaskId 任务ID。通过调用XLURLDownloadToFile可以获取一个任务ID
     * 
@param lNewTaskId 【传出参数】当返回值等于XL_SUCCESS时,返回新的任务ID;否则,值未定义
     * 
@return XL_SUCCESS,表示成功;其他值,表示失败。
     
*/
    
public static native int XLPauseTask(NativeLong lTaskId, NativeLongByReference lNewTaskId);
    
    
/**
     * 恢复已暂停的任务
     * 
@param lTaskId 任务ID
     * 
@return XL_SUCCESS,表示成功;其他值,表示失败。 
     
*/
    
public static native int XLContinueTask(NativeLong lTaskId);
    
    
/**
     * 从指定的TD文件开始新任务
     * 
@param pszTdFileFullPath TD文件的完整路径及文件名
     * 
@param lTaskId 【传出参数】调用成功时,返回新建任务的ID
     * 
@return XL_SUCCESS,表示成功;其他,表示失败。详见XLError.h
     
*/
    
public static native int XLContinueTaskFromTdFile(String pszTdFileFullPath, NativeLongByReference lTaskId);
    
    
/**
     * 停止指定任务 
     * 【注意】每个任务,无论下载成功或失败,最后都必须调用一次XLStopTask。否则,会导致资源泄漏。
     * 
@param lTaskId 要停止的任务ID
     
*/
    
public static native void XLStopTask(NativeLong lTaskId);
    
    
/**
     * 进行一些资源回收操作
     * 【注意】当不再使用引擎时,必须调用该函数,否则会导致资源泄漏。
     * 
@return TRUE,表示成功;FALSE,表示失败。 
     
*/
    
public static native boolean XLUninitDownloadEngine();
    
    
/**
     * 将错误码对应的错误消息拷贝至指定的缓冲区。
     * 
@param dwErrorId 开放下载引擎定义的错误码,详见XLError.h
     * 
@param pszBuffer 缓冲区首地址
     * 
@param dwSize 【传出参数】传入时,指定缓冲区长度;函数返回时,如果缓冲区长度不足,该参数被设置成所需的缓冲区长度。该参数的单位是字符数,不是字节数。 
     * 
@return
     
*/
    
public static native int XLGetErrorMsg(int dwErrorId, String pszBuffer, IntByReference dwSize);
    
    
    
//-------------------工具函数----------------
    
    
/**
     * long转NativeLongByReference
     * 
@param value
     * 
@return
     
*/
    
public static NativeLongByReference makeNativeRefLong(long value) {
        NativeLongByReference ullFileSize 
= new NativeLongByReference();
        ullFileSize.setValue(
new NativeLong(value));
        
return ullFileSize;
    }
    
    
/**
     * NativeLongByReference转long
     * 
@param longRef
     * 
@return
     
*/
    
public static long getLongValue(NativeLongByReference longRef) {
        
return longRef.getValue().longValue();
    }

    
    
// 测试代码:  http://xldoc.xl7.xunlei.com/0000000026/index.html的C语言的Java翻版
    public static void main( String[] args) throws InterruptedException {
        
int result;
        
        
try {
            
if (!XLInitDownloadEngine()) {
                System.out.println(
"Initialize download engine failed.");
                
return;
            }
            
            NativeLongByReference lTaskId 
= makeNativeRefLong(0);
            result 
= XLURLDownloadToFile(
                    
new WString("d:\\xxx.flv"), 
                    
new WString("http://f6.r.56.com/f6.c95.56.com/flvdownload/5/4/135175960260hd.flv?v=1&t=clnCNmA07nD3NWUGnVwBQQ&r=36978&e=1351849624"), 
                    
new WString(""), 
                    lTaskId);
            System.out.println(
"result code: " + result);
            System.out.println(
"task id: " + getLongValue(lTaskId));
        
if (XL_SUCCESS != result) {
                XLUninitDownloadEngine();
                System.out.println(
"Create new task failed, error code: " + ( result - XL_ERROR_FAIL) );
                
return;
            }
        System.out.println(
"Begin download file.");
        
        
do {
                Thread.sleep(
1000);

                LongByReference ullFileSize 
= new LongByReference(0);
                LongByReference ullRecvSize 
= new LongByReference(0);
                NativeLongByReference lStatus 
= makeNativeRefLong(-1);
                NativeLong nativeLong 
= new NativeLong();
                nativeLong.setValue(getLongValue(lTaskId));
                
                result 
= XLQueryTaskInfo(nativeLong, lStatus, ullFileSize, ullRecvSize);
                
if (XL_SUCCESS == result) {
                    
// 输出进度信息
                    if (0 != ullFileSize.getValue()) {
                        
double douProgress = (double) ullRecvSize.getValue() / (double) ullFileSize.getValue();
                        douProgress 
*= 100.0;
                        System.out.println(
"Download progress:" + douProgress);
                    } 
else {
                        System.out.println(
"File size is zero.");
                    }

                    
if (XL_STATUS_SUCESS == getLongValue(lStatus)) {
                        System.out.println(
"Download successfully.\n");
                        
break;
                    }

                    
if (XL_STATUS_FAIL == getLongValue(lStatus)) {
                        System.out.println(
"Download failed.");
                        
break;
                    }
                }
            } 
while (XL_SUCCESS == result);
        XLStopTask(lTaskId.getValue());
        } 
finally {
            XLUninitDownloadEngine();
        }
        
    }
}

posted on 2012-11-02 17:44 瓢菝的雨夜 阅读(1344) 评论(0)  编辑  收藏