nlib
nn::nlib::CurlInputStream クラスfinal

libcurlを用いてダウンロードを行うためのストリームクラスです。 [詳解]

#include "nn/nlib/CurlInputStream.h"

+ nn::nlib::CurlInputStream の継承関係図

公開メンバ関数

CURL * GetEasyHandle () const noexcept
 libcurleasy_handleを返します。 [詳解]
 
CURLcode GetCurlError () const noexcept
 libcurleasy_handleを引数にとる関数で発生したエラーコードを返します。 [詳解]
 
CURLMcode GetCurlMultiError () const noexcept
 libcurlmulti_handleを引数にとる関数で発生したエラーコードを返します。 [詳解]
 
CURLcode SetUrl (const char *url) noexcept
 読み込むURLを設定します。 [詳解]
 
bool StartDownload () noexcept
 
コンストラクタ、デストラクタ、及び初期化
constexpr CurlInputStream () noexcept
 デフォルトコンストラクタです。実行後Init()による初期化を必要とします。
 
virtual ~CurlInputStream () noexcept override
 デストラクタです。 [詳解]
 
errno_t Init (BufferSize buffer_size) noexcept
 ストリームを初期化します。 [詳解]
 
errno_t Init () noexcept
 Init(kBufferSize1x)を実行します。
 
- 基底クラス nn::nlib::InputStream に属する継承公開メンバ関数
errno_t GetErrorValue () const noexcept
 エラー値を取得します。 [詳解]
 
size_t Pos () const noexcept
 ストリーム上の現在位置を返します。 [詳解]
 
uint64_t Pos64 () const noexcept
 ストリーム上の現在位置を64bit値で返します。 [詳解]
 
bool IsEos () noexcept
 ストリームを最後まで読み終えている場合trueを返します。最後まで読み終えていない場合やエラーが発生している場合はfalseを返します。 [詳解]
 
int Read () noexcept
 ストリームから1バイトを読み込みます。 [詳解]
 
int Peek () noexcept
 ストリームを消費せずに次の1バイトを読み込みます。 [詳解]
 
size_t Skip (size_t nbytes) noexcept
 nbytes を読み飛ばします。 [詳解]
 
size_t Read (void *ptr, size_t nbytes) noexcept
 ptr で示されるメモリにnbytes 読み込みます。 [詳解]
 
template<size_t N>
size_t Read (nlib_byte_t(&buf)[N]) noexcept
 上記関数のテンプレートオーバーロードです。
 
bool Close () noexcept
 ストリームを閉じます。成功した場合にはtrueを返します。 [詳解]
 
bool Mark (size_t readlimit) noexcept
 現在の読み込み位置にGoBackToMark()で戻ることができるように設定します。 [詳解]
 
bool GoBackToMark () noexcept
 最後にMark()を実行した読み込み位置に戻ります。 [詳解]
 
bool IsMarkSupported () const noexcept
 このストリームがMark()GoBackToMark()をサポートしていればtrueを返します。
 
 operator bool () const
 オブジェクトが初期化済みで内部でエラーが発生していなければtrue、発生していればfalseを返します。
 
constexpr InputStream () noexcept
 デフォルトコンストラクタです。 派生クラスから呼び出されます。
 
virtual ~InputStream () noexcept
 デストラクタです。 派生クラスから呼び出されます。
 

その他の継承メンバ

- 基底クラス nn::nlib::InputStream に属する継承限定公開メンバ関数
void SetBuffer (void *p, size_t nbytes, bool is_mark_supported, bool is_buf_readonly) noexcept
 InputStreamが持つバッファを設定します。 [詳解]
 
void SetError (errno_t e) const noexcept
 InputStreamにエラーを設定します。 [詳解]
 

詳解

libcurlを用いてダウンロードを行うためのストリームクラスです。

説明
このクラスを用いることで、libcurlによって取得したデータをInputStreamのインターフェイスで扱うことができるようになります。 典型的には以下のようなコードを記述して利用することになります。
errno_t e = stream.Init();
SUCCEED_IF(e == 0);
SUCCEED_IF(stream.SetUrl("https://www.nintendo.co.jp") == CURLE_OK);
SUCCEED_IF(stream.StartDownload());
char buf[256];
size_t nread = stream.Read(buf, 255);
if (nread == 0) {
nlib_printf("CURLCode: %d\n", stream.GetCurlError());
nlib_printf("CURLMcode :%d\n", stream.GetCurlMultiError());
return false;
}
buf[nread] = '\0';
(void)stream.Close(); // reusable after Close()
nlib_printf("%s\n", buf);
/*
Output:
......
*/
オブジェクトの状態遷移
オブジェクトの状態遷移の概略は以下のとおりです。
dot_inline_dotgraph_5.png

CurlInputStream.h31 行目に定義があります。

構築子と解体子

◆ ~CurlInputStream()

nn::nlib::CurlInputStream::~CurlInputStream ( )
overridevirtualnoexcept

デストラクタです。

説明
内部でcurl_multi_cleanup()及びcurl_easy_cleanup()が実行されます。

関数詳解

◆ GetCurlError()

nn::nlib::CurlInputStream::GetCurlError ( ) const
noexcept

libcurleasy_handleを引数にとる関数で発生したエラーコードを返します。

戻り値
CURLcode型の値
説明
libcurlに起因するエラーでストリームがエラーを返した場合、エラーコードを取得できます。 エラーコードの詳細はlibcurlのマニュアルを参照してください。
参照
http://curl.haxx.se/libcurl/c/libcurl-errors.html#CURLcode

◆ GetCurlMultiError()

nn::nlib::CurlInputStream::GetCurlMultiError ( ) const
noexcept

libcurlmulti_handleを引数にとる関数で発生したエラーコードを返します。

戻り値
CURLMcode型の値
説明
libcurlに起因するエラーでストリームがエラーを返した場合、エラーコードを取得できます。 エラーコードの詳細はlibcurlのマニュアルを参照してください。
参照
http://curl.haxx.se/libcurl/c/libcurl-errors.html#CURLMcode

◆ GetEasyHandle()

nn::nlib::CurlInputStream::GetEasyHandle ( ) const
noexcept

libcurleasy_handleを返します。

戻り値
libcurleasy_handle
説明
Init()を実行した後、オプションを設定するために利用する必要があります。
参照
http://curl.haxx.se/libcurl/c/curl_easy_setopt.html

◆ Init()

nn::nlib::CurlInputStream::Init ( BufferSize  buffer_size)
noexcept

ストリームを初期化します。

引数
[in]buffer_sizeストリームが保持するバッファ・サイズ
戻り値
0成功した場合
EALREADY既に初期化済みの場合
ENOMEMメモリの確保に失敗した場合やlibcurlのハンドルの初期化に失敗した場合
ENOTSUPlibcurlが古い等の理由でオプションの設定に失敗した場合
説明
引数によりストリームのバッファ・サイズが設定されます。
buffer_size ストリームのバッファ・サイズ
kBufferSize1x CURL_MAX_WRITE_SIZE
kBufferSize2x CURL_MAX_WRITE_SIZE * 2
kBufferSize3x CURL_MAX_WRITE_SIZE * 3
kBufferSize4x CURL_MAX_WRITE_SIZE * 4
ストリームのバッファを確保した後、curl_easy_init(), curl_multi_init(), curl_multi_add_handle()によりハンドルが初期化されます。 その後、curl_easy_setopt()で以下のようなオプションを設定します。
オプション名
CURLOPT_WRITEFUNCTION CurlInputStream内部のコールバック関数
CURLOPT_WRITEDATA CurlInputStream内部の領域
CURLOPT_TIMEOUT 5
CURLOPT_LOW_SPEED_LIMIT 1024
CURLOPT_LOW_SPEED_TIME 5
CURLOPT_FOLLOWLOCATION 1
CURLOPT_MAXREDIRS 8
CURLOPT_ACCEPT_ENCODING "gzip,deflate"
この関数の実行後、GetEasyHandle()によりeasy_handleを取得しURL等の動作オプションを設定する必要があります。 ただし、CURLOPT_WRITEFUNCTION, CURLOPT_WRITEDATAの設定を上書きしてはいけません。

◆ SetUrl()

nn::nlib::CurlInputStream::SetUrl ( const char *  url)
noexcept

読み込むURLを設定します。

引数
[in]urlURL文字列
戻り値
CURLcode型の値
説明
内部でcurl_easy_setopt()を用いて、CURLOPT_URLオプションを設定します。

◆ StartDownload()

nn::nlib::CurlInputStream::StartDownload ( )
noexcept
戻り値
成功した場合はtrue
説明
この関数を実行することで読み込みを開始します。 この関数を呼ばずにRead()でストリームを読んでも問題ありませんが、データを受信するまでブロックします。 読み込みを開始してから実際に読み込むまでに何らかの処理をしたい場合にはこの関数を利用することができます。
失敗した場合はストリームにエラーをセットします。

このクラス詳解は次のファイルから抽出されました: