暗号化ZIPの復号

暗号化ZIPの復号に対応しました。
raw_zip_file.hppの差分
zip_file.hppの差分
サンプルの差分
Cのライブラリなんかだと、パスワードが必要になった時に呼ばれるコールバック関数を設定できるようになっていることが多いと思いますが、コールバック関数の呼び出しは永久にブロックするかもしれない操作で、どうしてもライブラリの使い方を狭めてしまいます。
そこでコールバック関数は使わず、ヘッダ構造体に暗号化フラグを追加して、利用者側でフラグをチェックするようにしました。

std::string get_password(); // パスワード取得関数

bool need_pswd = true;
io_ex::zip_file_source zip("hoge.zip");
while (zip.next_entry())
{
    const io_ex::zip::header& head = zip.header();

    // パスワードが必要
    if (head.encrypted && need_pswd)
    {
        zip.password(get_password());
        need_pswd = false;
    }

    // ...
}

この例では、全エントリのパスワードが共通であることを想定しています。
パスワードのチェックは最初のread()で行われ、パスワードが正しくない場合はpassword_incorrect例外が送出されます。
Sourceの状態はread()呼び出し前と変わらないので、この例外を捕捉してパスワードを再設定することでリトライ処理も行えます。


あと、昨日書き忘れましたが、bzip2圧縮のZIPに対応しています。
raw_zip_file.hppの差分
zip_file.hppの差分
7-Zipがbzip2に対応していたので、それをサンプルデータとしました。