cocos2d-xにあるHttpRequestとHttpClientを使ったダウンロード通信をした際に、
通信中の転送量の状態が取得出来ない為、HttpClientに少し追加をして
取得できるようにしちゃいます。
※libcurlで0から作るのが面倒くさい人向け
※cocos2dのHttpClient自体を編集することになるので自己責任で
あと、転送量を知りたいのは大体GET通信だけだと思うので、
HttpClientのGETにだけ追加したいと思います。
#使用バージョン
cocos2d-x 3.2
#追加方法
##network/HttpClient.cppのprocessGetTaskに処理の追加
network/HttpClient.cppのprocessGetTaskに処理の追加をします。
CURLOPT_NOPROGRESSをfalseにすることで、CURLOPT_PROGRESSFUNCTIONのコールバックを有効にすることが出来ます。
CURLOPT_PROGRESSFUNCTIONのコールバックに、現在の転送しているサイズ等が引数として入ります。
CURLOPT_PROGRESSDATAは、CURLOPT_PROGRESSFUNCTIONのコールバックの第1引数に入るポインタの設定が出来ます。
今回は使わないのでnullptrを設定しています。
bool ok = curl.init(request, callback, stream, headerCallback, headerStream, errorBuffer)
&& curl.setOption(CURLOPT_FOLLOWLOCATION, true)
+ && curl.setOption(CURLOPT_NOPROGRESS, false)
+ && curl.setOption(CURLOPT_PROGRESSFUNCTION, getProgressValueCallBack)
+ && curl.setOption(CURLOPT_PROGRESSDATA, nullptr)
&& curl.perform(responseCode);
##追加した処理に対応した、コールバック関数と、転送量の状態を保存しておく変数とget/setを追加
追加した処理に対応した、コールバック関数と、転送量の状態を保存しておく変数とget/setを追加します。
###転送量状態を保存しておく変数とget/setの追加
inline int getTimeoutForRead() {return _timeoutForRead;};
+ // 転送量%を取得
+ inline int getProgressValue() {return _progressValue;};
+ // 転送量%を設定
+ inline void setProgressValue(int value) {_progressValue = value;};
private:
int _timeoutForConnect;
int _timeoutForRead;
+ int _progressValue; // 転送量状態.
###コールバック関数の追加
コールバックの引数には、CURLOPT_PROGRESSDATAで指定したポインタ、受信総量、現在の受信量、送信総量、現在の送信料が返って来ます。
これでは、dlnowとdltotalから、0〜100%の整数値で算出しています。
変数の型を変えて少数点まで出したり、変数を増やして、個別に値を取るといった実装も可能です。
+static int getProgressValueCallBack(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
+{
+ // 算出計算後、setで値を設定
+ HttpClient::getInstance()->setProgressValue((dlnow/dltotal)*100);
+
+ return 0;
+}
これで、実装自体は完了です。
#使用方法
通信開始後、
HttpClient::getInstance()->getProgressValue()
を使用することで値が取得出来ます。