解决miniblink 回调函数 on_wkeDownload2Callback 返回值为kWkeDownloadOptCacheData 程序异常

接上篇,用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 也就是下载内容。

 

 

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chen249191508

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值