接上篇,用miniblink 的GET方式下载文件,他的几个Demo 都可以下载文件。但是,如果用post data 方式,然后服务器返回 Content-Disposition 的文件头,而且要下载的数据在 response data里面的话,miniblink 是没有提供接口的。 一般来说,都是用wkeOnDownload 函数,设置好回调函数,在 typedef bool(WKE_CALL_TYPE*wkeDownloadCallback)(wkeWebView webView, void* param, const char* url); 中有 却只有 需要下载的 http,所以是 miniblink提供的API 是不能满足需求的。
还好,经过查看源码,有一个 wkeOnDownload2 函数,只是在 wke.cpp中存在,而在wke.h 中并没有提供出来,所以需要手动添加。这个接口。并且添加好接口后,还需要修改 miniblink 的源码。
添加接口与修改miniblink 源码的方法在如下:
1. 在wke.h 中 的 wkeDownloadCallback 下面添加如下代码,也就是添加 wkeDownload2Callback 回调函数的头文件。
typedef bool(WKE_CALL_TYPE*wkeDownloadCallback)(wkeWebView webView, void* param, const char* url);
typedef enum _wkeDownloadOpt {
kWkeDownloadOptCancel,
kWkeDownloadOptCacheData,
} wkeDownloadOpt;
typedef void* wkeNetJob;
typedef void(WKE_CALL_TYPE*wkeNetJobDataRecvCallback)(void* ptr, wkeNetJob job, const char* data, int length);
typedef void(WKE_CALL_TYPE*wkeNetJobDataFinishCallback)(void* ptr, wkeNetJob job, wkeLoadingResult result);
typedef struct _wkeNetJobDataBind {
void* param;
wkeNetJobDataRecvCallback recvCallback;
wkeNetJobDataFinishCallback finishCallback;
}wkeNetJobDataBind;
typedef wkeDownloadOpt(WKE_CALL_TYPE*wkeDownload2Callback)(
wkeWebView webView,
void* param,
size_t expectedContentLength,
const char* url,
const char* mime,
const char* disposition,
wkeNetJob job,
wkeNetJobDataBind* dataBind);
2. 在wke.h 中 添加:
ITERATOR3(void, wkeOnDownload2, wkeWebView webView, wkeDownload2Callback callback, void* param, "") \
位置如下:
ITERATOR3(void, wkeOnDownload, wkeWebView webView, wkeDownloadCallback callback, void* param, "") \
ITERATOR3(void, wkeOnDownload2, wkeWebView webView, wkeDownload2Callback callback, void* param, "") \
那么这样添加两处,就可以在 demo中调用 wkeOnDownload2 函数了。
不如如果在回调函数中 on_wkeDownload2Callback 的返回值为 kWkeDownloadOptCacheData 的话,程序为崩溃。但是呢,必须设置为kWkeDownloadOptCacheData 这个返回值,miniblink 才会去调用
typedef void(WKE_CALL_TYPE*wkeNetJobDataRecvCallback)(void* ptr, wkeNetJob job, const char* data, int length);
typedef void(WKE_CALL_TYPE*wkeNetJobDataFinishCallback)(void* ptr, wkeNetJob job, wkeLoadingResult result);
这两个回调函数,所以需要查看源码
wkeDownloadOpt WKE_CALL_TYPE Window::on_wkeDownload2Callback(wkeWebView webView, void* param, size_t expectedContentLength, const char* url, const char* mime, const char* disposition, wkeNetJob job, wkeNetJobDataBind* dataBind)
{
wkeDownloadOpt opt = kWkeDownloadOptCacheData;
return opt;
}
在miniblink中
static bool dispatchDownloadToWke(WebPage* page, WebURLLoaderInternal* job, const utf8* url , const AtomicString& contentType)函数
->
if (kWkeDownloadOptCacheData == opt) {
job->m_dataBind = new wkeNetJobDataBind();
*(job->m_dataBind) = dataBind;
return false;
}
就是这个 return false,导致,后面的调用函数无法执行。 修改为 return true。然后在编译源码。调用 on_wkeDownload2Callback成功。
并且成功调用 wkeNetJobDataRecvCallback,并且在 wkeNetJobDataRecvCallback 中,可获取response 的data 也就是下载内容。