----------------------------------------------------------------------------
                       ax7z.spi v0.7 for 7-zip 4.57+ s_y3b4
----------------------------------------------------------------------------
                                                    2010/06/16 Yak!

****************************************************************************
 本バージョンは beta 版です。まだ大きなバグが残っている可能性が高いです。
****************************************************************************

1.概要
  Makito Miyano 氏による 7-zip の解凍エンジンを利用した susieプラグインで
  ある、ax7z.spi v0.7 を 7-zip 4.57 以降向けにビルドした上、汎用ソリッド書庫
  展開高速化機能を追加して ax7z_s.spi としたものです。
  一部アプリケーションで相対パスつきアーカイブの処理に失敗する点と、取得できる
  場合には CRC 値も返すよう修正してあります。
  また、パスワード付き書庫も扱えるようにしています。

  7-zip が対応している形式全てを扱うことが可能です。
  7-zip 4.65 の DLL を使用している場合は、
    7z, ZIP, GZIP, BZIP2, TAR, ARJ, CAB, CHM, CPIO, DEB, DMG, HFS, ISO, LZH,
    LZMA, MSI, NSIS, RAR, RPM, UDF, WIM, XAR, Z
  となります。
  拡張子によって対応形式かどうかを判別しています。
  7-zip の DLL から取得できる情報以外に追加で拡張子を指定可能です。
  デフォルトで iso 用として bin, img, mdf を追加しています。
  ただし、これらのファイルが全て開けるわけではありません。

  もともと ax7z.spi には同じ Makito Miyano 氏作のビューワ Hamana 向けに
  ソリッド書庫展開用特別ルーチンが実装されていますが、Hamana 専用でした。
  他ソフトにおいてもソリッド書庫展開高速化を図るべく ax7z_s.spi として
  実装を行っています。
  といっても現状では何のことはない一度全て展開してまう、という方式となって
  います。
  なお、本プラグインは Hamana では正常に動作しません。汎用ソリッド書庫展開
  高速化機能なし版をご利用ください。

  現状 beta 版であり「6.既知の不具合・仕様」の通り色々と制限事項、機能不足が
  ありますのでご注意ください。

  このソフトとの組み合わせで有効だった、あるいは、うまく動作しなかった等の
  フィードバックを頂ければ幸いです。

2.動作環境
  ax7z_s.spi 単独では動作しません。他に 7-zip 4.57 以降に含まれる 7z.dll が
  以下のいずれかの場所に必要です。
  ※ 7-zip 4.62, 4.65 の 7z.dll でも動作しているようです。

  ・ax7z_s.spi と同じフォルダ
  ・レジストリ HKCR\Software\7-zip\Path (文字列)に設定されたフォルダ
  ・レジストリ HKLM\Software\7-zip\Path (文字列)に設定されたフォルダ

  7-zip のインストーラによって上記レジストリ値が設定されるので、
  インストーラでインストールされた場合は、他に何もする必要はありません。

3.設定の説明

  通常の設定ダイアログもオリジナル版 ax7z.spi から変更しました。

  上側、DLL defined :となっているのが 7z.dll が対応している拡張子、形式の
  リストです。選択状態になっているものが有効です。
  Select all, Unselect all はそれぞれ全てを選択、非選択にします。
  Load default は全選択で、かつ、ユーザー定義拡張子(後述)を
  bin;img;mdf にします。

  下側 User-defined: がユーザー定義拡張子で、7z.dll で指定されている拡張子
  以外で ax7z_s.spi で扱いたい拡張子を指定します。
  ; 区切りで拡張子のみ(.不要)のリストで入力します。
  拡張子の順番は保存されません(次回設定時にはソートされています)。
  Solid... ボタンを押すことによりソリッド書庫展開に関する設定ダイアログが
  開きます。

  最下段の stay password dialog on top はパスワード入力用ダイアログを
  最前面にするかどうかの設定です。

  ソリッド書庫展開に関する設定ダイアログについて説明します。
  左側のチェックボックスが 7-zip、rar についてソリッド書庫展開高速化を
  有効にするかどうかです。
  Look-ahead は現在無効なので無視してください。
  Max はキャッシュサイズ制限値、Purge は制限値を超えた際のキャッシュ削除
  1 回のサイズです。制限値が -1 の場合、無制限となります。メモリ、ディスクの
  双方が有効の場合は、メモリが優先的に使用され、メモリから削除される内容が
  ディスクに書き出されます。なお、ディスクキャッシュでは、現在展開中の
  書庫の内容は制限値を超えても削除されません。Purge 値が小さい場合は
  キャッシュ削除の回数が増え、大きい場合には削除する必要がなかったもの
  まで削除される可能性が高くなります。
  Cache folder でディスクキャッシュの場所を指定します。Browse... で
  フォルダ選択ダイアログが開きます。なお、多数のファイルが作成されますので
  キャッシュ専用ディレクトリの作成をお勧めします。
  Cache clear... でキャッシュの削除を行います。動作が変な場合は、一度
  キャッシュを削除してみると良いかもしれません。

4.パスワード付き書庫への対応

  パスワード付き書庫を開くとパスワード入力ダイアログが表示されます。
  基本的に入力されたパスワードはキャッシュされ、解凍エラーが発生した場合か、
  別の書庫を開いた場合、特定条件下でソリッド書庫を開いた場合に破棄されます。
  OK は通常のパスワード入力、Skip は解凍エラーを無視して次のファイルへ、
  Skip Archive は別の書庫まで解凍エラーを無視して処理を進めます。
  ファイル名が暗号化されている書庫の場合、Skip は選択できません。
  解凍エラー発生時の再入力の場合はダイアログのメッセージが Extract error,
  (以下略)のように表示が変わります。
  なお、異なるパスワードの書庫を開いた際に、解凍エラーと同じ表示になりますが、
  これはキャッシュされたパスワードで展開しようとしてエラーになるからです。

  ダイアログのタイトルバーで右クリック(あるいは Alt+スペース)で表示される
  メニューにある TopMost をチェックする、あるいはチェックを外すことにより
  ダイアログを最前面にするかどうかを切り替えることができます。
  デフォルト設定を切り替えたい場合は設定ダイアログで可能です。
  「3.設定の説明」を参照ください。

  パスワード周りについては実装も詰め切れておらず、また、そもそもどのような
  仕様にするべきか悩んでいる面もあり、提案、意見、要望等ありましたら掲示板
  にでもお願いいたします。

5.動作確認
  WindowsXP Professional SP3 + Core2 Duo T7600 + Mobility FireGL V5250
  あふｗ v1.8b4 / Leeyes v2.6.0 / Hamana v1.48 / MassiGra v0.29

6.コンパイル方法
  以下の手順でコンパイルできます。
  なお外部ライブラリでバイナリ作成に使用したバージョンは 7-zip 4.57,
  SQLite 3.6.23.1, Boost 1.37 です。

  1) 7-zip の本家サイト(http://www.7-zip.org/)より 7-zipのソースを
     取得します。
  2) SQLite の本家サイト(http://www.sqlite.org/)より SQLite のソースを
     取得します。
  3) Boost の本家サイト(http://www.boost.org/)よりソースを取得してビルド
     するか、バイナリインストーラを http://www.boostpro.com/products/free
     からダウンロードして実行、インストールします。
  4) Makito Miyano 氏のサイト(http://miyano.s53.xrea.com/)より ax7z.spi
     v0.7(ax7z20060619.zip)を取得します。
  5) ax7z20060619.zip 中の ax7z_src.zipを解凍します。
  6) 解凍すると 7zというフォルダができるので、そのフォルダに
     1) で取得した 7-zip のソース一式を解凍します。
  7) ax7z20060619-457y2b5.patch を適用します。
  8) sqlite3 フォルダ以下に 2) で取得した sqlite3 のソース一式を解凍
     します。
  9) 00am.slnを開き Boost のヘッダ検索パス、ライブラリ検索パスを調整して
     ビルドします。

  なお、UDF/ISO ブリッジへの暫定対応のため、7-zipのソースを一部改変
　しています(4.65 のソースからの back port 相当)。
  7-zipの関数を利用する部分は 7z/7zip/Bundles/ax7z 以下にあります。

7.著作権・免責等
  ファイルの圧縮、解凍の基本部分の著作権は Igor Pavlov 氏にあります。
  7z 圧縮方式の BZip2 アルゴリズムは Julian Seward 氏が作成し
  PPMD アルゴリズムは Dmitry Shkarin 氏が作成しています。
  susieプラグイン 作成部分に関しては Makito Miyano 氏が著作権を保有し
  ています。
  SQLite は Hwaci 社より Public Domain で配布されています。
  Boost ライブラリは Boost Software License で配布されています。

  ax7z.spi および ax7z_s.spi は GNU Lesser General Public License (LGPL)の元で
  配布されています。ソフトの改変、再配布等については LGPL に従ってください。
  http://www.gnu.org/copyleft/lesser.ja.html

  また、本ソフトウェアを使用することによって如何なる損害が発生しても
  作者は一切責任を負わないものとします。
  全ては自己責任の元でお使いください。

8.既知の不具合・仕様

  ・Unicode に非対応。
  ・Hamana でパスワード付き zip を開けない。
    (Hamana では zip の処理が内蔵ルーチン優先のため。
     Susie プラグイン側では対応不可能)
  ・展開途中に別の書庫を開くとパスワード入力ダイアログが連続して複数回開く
    場合がある。
  ・ソリッド書庫を開くとパスワード付きでなくともキャッシュしていたパスワードを
    消去する場合がある。
    (条件によってはパスワードの再入力ができないので安全側に倒すためです)
  ・エラーチェックが甘すぎる。
  ・常に書庫全体を展開する。
  ・使用するソフトの仕様によっては高速化どころか鈍速化する可能性がある。
  ・ファイル単体が 2GB を超えると正常動作しない。
    (Susie plugin 仕様自体の制限)

9.連絡先
  不具合、要望、感想等は Yak! <yak_ex@mx.scn.tv> までお願いします。
  本パッチ版について Makito Miyano 氏に質問したりしないようお願いします。

10.TODO
  ・7-zip 4.65 への移行
  ・設定値の整合性チェック
  ・キャッシュの挙動の調整
    ・単発モード(同一プロセス内でのみキャッシュ有効)の追加
    ・先読み対象の設定
    ・終了時にメモリ内容をディスクへ吐き出し
    ・メモリ、ディスクの二重持ち？
    ・キャッシュ削除、マーク処理の効率化
  ・リファクタリング
    ・ヘッダ、実装の分離の調整
    ・責任分割の再考
  ・エラーチェック、例外処理
  ・展開のバックグラウンド化(マルチスレッド化)

11.History
  2010/06/16 (s_y3b4)
    - パスワード入力用ダイアログを最前面にする設定を追加
    - SQLite を 3.6.23.1 に更新

  2009/10/21 (s_y3b3)
    - gzip, bzip2 系の書庫(.tar.gz, .tgz 等)が展開できなかった点を修正
    - ファイル名が暗号化された書庫に対応
    - パスワードの取り扱いを変更(4.参照)
    - キャッシュ用フォルダ指定の末尾\の有無の揺れに対応
    - SQLite を 3.6.19 に更新

  2009/09/03 (s_y3b2)
    - 同パス書庫ファイルに対するガードを強化(掲示板報告内容に対する暫定対応)

  2009/08/23 (s_y3b1)
    - パスワードのキャッシュに対応(解凍対象書庫変更まで有効)
    - SQLite を 3.6.17 に更新

  2009/08/11 (s_y3b0)
    - SQLite を 3.6.16 に更新
    - ソリッド書庫展開高速化版を分離

  2009/02/22 (y2b5)
    - パスワードに対応
    - 7-zip の DLL が対応している形式全てに対応できるように変更
    - SQLite を 3.6.11 に更新

  2009/02/12 (y2b4)
    - UDF/ISO ブリッジに暫定的に対応(7-zip 4.65 の DLL が必要)

  2009/02/12 (y2b3)
    - SQLite を 3.6.10 に更新
    - iso に対応

  2009/01/01 (y2b2)
    - SQLite を 3.6.7 に更新
    - 書庫ファイルの更新時刻かサイズが変化した場合、ファイルキャッシュを削除
    - スレッド間排他制御追加
    - (Susie plugin 仕様範囲内で) 2GB の壁を排除
    - キャッシュ済みマーク、チェック、削除のバグを修正

  2008/12/14 (y2b1)
    - 書庫タイプ(rar, 7-zip)による汎用ソリッド書庫展開高速化の有効・
      無効設定を追加
    - メモリキャッシュ、ディスクキャッシュの併用、サイズ制限を追加

  2008/11/16 (y2b0)
    - 汎用ソリッド書庫展開高速化の concept proof 版を実装

  2008/03/02 (y1)
    - 取得できる場合は CRC 値を返すよう修正

  2008/01/16 (初版)
    - ax7z.spi v0.7 を 7-zip ver4.57 用にビルド
