LoginSignup
8
7

More than 5 years have passed since last update.

cocos2d-xの通信で転送量を取得出来るように(お手軽に)

Posted at

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を設定しています。

network/HttpClient.cpp
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の追加

network/HttpClient.h
    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%の整数値で算出しています。
変数の型を変えて少数点まで出したり、変数を増やして、個別に値を取るといった実装も可能です。

network/HttpClient.cpp
+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()
を使用することで値が取得出来ます。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7