packageskj.thunder;importcom.sun.jna.Native;importcom.sun.jna.NativeLong;importcom.sun.jna.WString;importcom.sun.jna.ptr.IntByReference;importcom.sun.jna.ptr.LongByReference;importcom.sun.jna.ptr.NativeLongByReference;publicclassThunderUtil {static{//注册dllNative.register("D:\\Workspace\\myresource\\thunderdll\\XLDownload");

}//--------XLError.h中的状态--------------publicstaticfinalintXL_ERROR_FAIL=268435456;publicstaticfinalintXL_SUCCESS=0;publicstaticfinalintXL_ERROR_FILE_NAME_INVALID=XL_ERROR_FAIL+12;publicstaticfinalintXL_ERROR_ADD_TASK_TRAY_ICON_FAIL=XL_ERROR_FAIL+4;publicstaticfinalintXL_ERROR_FILE_ALREADY_EXIST=XL_ERROR_FAIL+16;publicstaticfinalintXL_ERROR_INVALID_TASK_TYPE=XL_ERROR_FAIL+15;publicstaticfinalintXL_ERROR_BUFFER_TOO_SMALL=XL_ERROR_FAIL+22;publicstaticfinalintXL_ERROR_CANNOT_CONTINUE_TASK=XL_ERROR_FAIL+20;publicstaticfinalintXL_ERROR_INIT_TASK_TRAY_ICON_FAIL=XL_ERROR_FAIL+3;publicstaticfinalintXL_ERROR_INVALID_ARG=XL_ERROR_FAIL+10;publicstaticfinalintXL_ERROR_CREATE_DIRECTORY_FAIL=XL_ERROR_FAIL+8;publicstaticfinalintXL_ERROR_STRING_IS_EMPTY=XL_ERROR_FAIL+6;publicstaticfinalintXL_ERROR_TASK_DONT_EXIST=XL_ERROR_FAIL+11;publicstaticfinalintXL_ERROR_UNINITAILIZE=XL_ERROR_FAIL+1;publicstaticfinalintXL_ERROR_POINTER_IS_NULL=XL_ERROR_FAIL+5;publicstaticfinalintXL_ERROR_CANNOT_PAUSE_TASK=XL_ERROR_FAIL+21;publicstaticfinalintXL_ERROR_PATH_DONT_INCLUDE_FILENAME=XL_ERROR_FAIL+7;publicstaticfinalintXL_ERROR_WRITE_CFG_FILE_FAIL=XL_ERROR_FAIL+19;publicstaticfinalintXL_ERROR_INIT_THREAD_EXIT_TOO_EARLY=XL_ERROR_FAIL+23;publicstaticfinalintXL_ERROR_READ_CFG_FILE_FAIL=XL_ERROR_FAIL+18;publicstaticfinalintXL_ERROR_NOTIMPL=XL_ERROR_FAIL+13;publicstaticfinalintXL_ERROR_MEMORY_ISNT_ENOUGH=XL_ERROR_FAIL+9;publicstaticfinalintXL_ERROR_FILE_DONT_EXIST=XL_ERROR_FAIL+17;publicstaticfinalintXL_ERROR_UNSPORTED_PROTOCOL=XL_ERROR_FAIL+2;publicstaticfinalintXL_ERROR_TASKNUM_EXCEED_MAXNUM=XL_ERROR_FAIL+14;//-------XLDownload中Task的状态------------/*** 开始建立连接*/publicstaticfinalintXL_STATUS_CONNECT=0;/*** 开始下载*/publicstaticfinalintXL_STATUS_DOWNLOAD=2;/*** 暂停*/publicstaticfinalintXL_STATUS_PAUSE=10;/*** 下载成功*/publicstaticfinalintXL_STATUS_SUCESS=11;/*** 下载失败*/publicstaticfinalintXL_STATUS_FAIL=12;//------XLDownload中的方法签名---------------------/*** 初始化引擎

*@returnTRUE,表示成功;FALSE,表示失败。*/publicstaticnativebooleanXLInitDownloadEngine();/*** 下载指定的资源,并保存到本地文件,只支持HTTP,不支持动态链

*@parampszFileName 下载资源的本地文件名

*@parampszUrl 资源的URL,不能为NULL

*@parampszRefUrl 资源的引用页,可以为NULL

*@paramlTaskId 【传出参数】唯一标识引擎创建的任务,该参数可以作为XLQueryTaskInfo、XLStopTask的第一个参数。如果该参数值为0,表示引擎创建任务失败

*@returnXL_SUCCESS,表示成功。其他值,表示失败*/publicstaticnativeintXLURLDownloadToFile(WString pszFileName, WString pszUrl, WString pszRefUrl, NativeLongByReference lTaskId);/*** 查询指定任务的当前状态

*@paramlTaskId 指定将要查询的任务。通过调用XLURLDownloadToFile可以获取一个任务ID

*@paramplStatus 【传出参数】返回任务的当前状态。可能的取值,参见XLDownload.h

*@parampullFileSize 【传出参数】文件大小,单位是字节

*@parampullRecvSize 【传出参数】已经下载到的数据,单位是字节

*@return*/publicstaticnativeintXLQueryTaskInfo(NativeLong lTaskId, NativeLongByReference plStatus, LongByReference pullFileSize, LongByReference pullRecvSize);/*** 暂停指定任务,并返回新的任务ID

*@paramlTaskId 任务ID。通过调用XLURLDownloadToFile可以获取一个任务ID

*@paramlNewTaskId 【传出参数】当返回值等于XL_SUCCESS时,返回新的任务ID;否则,值未定义

*@returnXL_SUCCESS,表示成功;其他值,表示失败。*/publicstaticnativeintXLPauseTask(NativeLong lTaskId, NativeLongByReference lNewTaskId);/*** 恢复已暂停的任务

*@paramlTaskId 任务ID

*@returnXL_SUCCESS,表示成功;其他值,表示失败。*/publicstaticnativeintXLContinueTask(NativeLong lTaskId);/*** 从指定的TD文件开始新任务

*@parampszTdFileFullPath TD文件的完整路径及文件名

*@paramlTaskId 【传出参数】调用成功时,返回新建任务的ID

*@returnXL_SUCCESS,表示成功;其他,表示失败。详见XLError.h*/publicstaticnativeintXLContinueTaskFromTdFile(String pszTdFileFullPath, NativeLongByReference lTaskId);/*** 停止指定任务

* 【注意】每个任务,无论下载成功或失败,最后都必须调用一次XLStopTask。否则,会导致资源泄漏。

*@paramlTaskId 要停止的任务ID*/publicstaticnativevoidXLStopTask(NativeLong lTaskId);/*** 进行一些资源回收操作

* 【注意】当不再使用引擎时,必须调用该函数,否则会导致资源泄漏。

*@returnTRUE,表示成功;FALSE,表示失败。*/publicstaticnativebooleanXLUninitDownloadEngine();/*** 将错误码对应的错误消息拷贝至指定的缓冲区。

*@paramdwErrorId 开放下载引擎定义的错误码,详见XLError.h

*@parampszBuffer 缓冲区首地址

*@paramdwSize 【传出参数】传入时,指定缓冲区长度;函数返回时,如果缓冲区长度不足,该参数被设置成所需的缓冲区长度。该参数的单位是字符数,不是字节数。

*@return*/publicstaticnativeintXLGetErrorMsg(intdwErrorId, String pszBuffer, IntByReference dwSize);//-------------------工具函数----------------/*** long转NativeLongByReference
*@paramvalue
*@return*/publicstaticNativeLongByReference makeNativeRefLong(longvalue) {
NativeLongByReference ullFileSize=newNativeLongByReference();
ullFileSize.setValue(newNativeLong(value));returnullFileSize;
}/*** NativeLongByReference转long
*@paramlongRef
*@return*/publicstaticlonggetLongValue(NativeLongByReference longRef) {returnlongRef.getValue().longValue();
}//测试代码:http://xldoc.xl7.xunlei.com/0000000026/index.html的C语言的Java翻版publicstaticvoidmain( String[] args)throwsInterruptedException {intresult;try{if(!XLInitDownloadEngine()) {
System.out.println("Initialize download engine failed.");return;
}
NativeLongByReference lTaskId=makeNativeRefLong(0);
result=XLURLDownloadToFile(newWString("d:\\xxx.flv"),newWString("http://f6.r.56.com/f6.c95.56.com/flvdownload/5/4/135175960260hd.flv?v=1&t=clnCNmA07nD3NWUGnVwBQQ&r=36978&e=1351849624"),newWString(""),
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=newLongByReference(0);
LongByReference ullRecvSize=newLongByReference(0);
NativeLongByReference lStatus=makeNativeRefLong(-1);
NativeLong nativeLong=newNativeLong();
nativeLong.setValue(getLongValue(lTaskId));
result=XLQueryTaskInfo(nativeLong, lStatus, ullFileSize, ullRecvSize);if(XL_SUCCESS==result) {//输出进度信息if(0!=ullFileSize.getValue()) {doubledouProgress=(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();
}
}
}