久しぶりに
大昔いじっていたソフトのエンハンスをしてみた。
最初出したのが2003年だったらしい。
そのころ、Windows CEなるOSのものがあってWindows APIでコーディングをしていた。
Win32APIをクラスラップしたり、http周りもWinSockをやったりして実装してた。
2017年あたりまで修正したりしていたものだけど、
- httpsまでは実装してられない。
- CE自体も死んでるんで使っている人もおらんだろう
ってことで、放置してた。
ふと最近同じようのものをAndroid向けにKotlin+WebView+React実装してみた。
その際、画面デザインとか機能を調べるために古いソースを引っ張り出してビルドしてみる気になった。
今更https周りをたたくのはやってられないので、C++のhttpsクライアントを探してみたところ、libcurlがVisual Studio 2019でもビルドできるらしいということなので早速入手してみた。
プロジェクトファイルでちょっと警告されたような気もするが、サクッとビルドできた。
後は、元のソースのhttp周りのクラスをWinSockからlibcurlにサクッと置き換えて完成。
#途中、置換するたびにSJISのコードがUTF-8に変換されてビルドが通らんとかいろいろあったが。
完成したってことで興味本位で行数を調べてみたら、こんな感じ。
結構書いているもんだ。
今だとできないだろうね。
行数 | ファイル数 | |
---|---|---|
C++ | 22,225 | 101 |
C | 726 | 9 |
H | 7,554 | 104 |
libcurlをざっくり眺めたらWINDOWS_WCEとか使っていてWindows CEでもビルドができなくはないかも。
ただ、ビルド環境が手元にないしで未着手。どうしたもんかね。
これだけだとあれなので、libcurlのざっくり使うものを書いておこう。
libcurl関数概要
関数名 | 概要 |
---|---|
curl_global_init | 初期化 |
curl_easy_init | CURLを取得 |
curl_easy_setopt | パラメターを指定 |
curl_easy_perform | http処理を実行 |
curl_easy_cleanup | CURLを解放 |
curl_easy_setoptパラメーター概要
パラメーター | 概要 |
---|---|
CURLOPT_CUSTOMREQUEST | httpメソッドを指定 |
CURLOPT_URL | URLを指定 |
CURLOPT_HTTPHEADER | httpヘッダーを指定 |
CURLOPT_POSTFIELDS | request-bodyを指定 |
CURLOPT_WRITEFUNCTION | 受信関数 |
CURLOPT_WRITEDATA | 受信関数のユーザーデータ |
CURLOPT_HEADER | httpヘッダーも受信関数で受け取る |
例
// 呼び出し
Writer writer;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &writer);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeToUserData);
//受信関数
static size_t writeToHandle(char* ptr, size_t size, size_t nmemb, void* userdata)
{
// NOTE: CURLOPT_WRITEDATAで渡した情報をキャストで取得
Writer* writer = (Writer*)userdata;
// NOTE: メンバー関数を呼び出して......
return handle->write(ptr, size * nmemb);
}