Archivers

iso_file_sink

なんとかISO 9660 Level-1の出力まで実装できました。 iso_file_sink_impl.hpp iso_directory_writer.hpp 基本的には昨日のコードとiso9660_file_sinkのコードを混ぜたものになっています。 ディレクトリの名前が8.3形式に変更された場合に、その配下のファ…

ISO 9660のファイル名変換

一遍に実装しようとして混乱してきたので、とりあえずファイル名の置換部分だけ書いてみました。 作業記録として、コードを貼っときます。

続 ISOファイル出力の構想

ISOファイル出力でファイルIDの振り直しに梃子摺っています。 ISO 9660の場合、使用できない文字は振り直し Jolietの場合、文字に制限がないので振り直しはないが、UCS-2に変換する必要あり Rock Ridgeの場合、上記に加えて深いディレクトリ階層の移動が加わ…

ISOファイル出力の構想

ISO 9660の出力で難しいのはパステーブルとディレクトリーレコードの管理です。 以前実装したiso9660_file_sinkでは、エントリを追加するたびにパステーブル内の順序を調整していました。 Rock Ridgeの対応を考えた場合、ディレクトリのリロケートをいつ行う…

続々 拡張可能なヘッダ

ここ数日悩みましたが、 Rock Ridgeのパースの有無でディレクトリトラバースが変わってしまうこと Sinkでは複数のボリューム記述子を出力するなど、予めフォーマットが固定されていないと実装が困難であること などから、2/20の実装のまま行くことにしました…

続 拡張可能なヘッダ

う〜ん、なかなかうまくまとまりません。 どこまでカスタマイズ可能にするか、実行時の多相化とコンパイル時の多相化のどちらを使うべきか悩みどころが多いです。 あらゆる箇所をカスタマイズさせるのは無理があるので、2/20の実装と2/21の目標の折衷案とし…

parse_system_use_field

昨日の案でSystem Use Fieldのパーサー部分を実装してみました。 <hamigaki/archivers/rrip/parser_map.hpp> <hamigaki/archivers/susp/parser.hpp> // mpl::for_eachから呼ぶためのラッパー template<class State, class Header> class call_parser { public: call_parser(State& state, const char* signature, bool& result, Header& head, const char* da…</class></hamigaki/archivers/susp/parser.hpp></hamigaki/archivers/rrip/parser_map.hpp>

拡張可能なヘッダ

う〜ん。 iso_file_sourceのコードですが、どこを弄ったらよいやら分からなくなってきたので明確な目標を設定したいと思います。 SUSP(System Use Sharing Protocol)に基づいたRock Ridge以外の(あるいはRock Ridgeを拡張した)プロトコルを簡単に追加できる…

iso_directory_parser

おおよそ機能の方針で実装できました。 iso_directory_parser.hpp iso9660_directory_parser.hpp joliet_directory_parser.hpp rock_ridge_directory_parser.hpp iso_directory_parserのインタフェースは少し変わりました。 class iso_directory_parser : pr…

Rock Ridge 再検討

Rock Ridgeのコードを眺めていたところ、ディレクトリのトラバースに関する処理もディレクトリレコードの修正だけで対応できることに気が付きました。 "CL" System Use Entry (子ディレクトリの位置) "PL" System Use Entry (親ディレクトリの位置) →そのデ…

volume_desc::rrip

volume_descriptorをvolume_info(各ボリューム記述子の共通項目)とvolume_desc(それ以外)に分離して、volume_descにはRock Ridgeのバージョンを追加しました。 iso/headers.hppの差分 ついでにJolietの場合はボリューム記述子内の文字列をナロー文字に変換す…

joliet_reader

rock_ridge_readerと同じインタフェースでjoliet_readerを作成し、ISO 9660/Joliet/Rock Ridge対応のiso_file_sourceに組み込みました。 joliet_reader.hpp iso_file_source_impl.hpp ようやく3つのフォーマットに対応できたわけですが、一つのボリューム記…

rock_ridge_reader

Rock Ridge用の「ディレクトリのトラバースと親パスの管理」を実装して、とりあえずrock_ridge_file_sourceの実装を置き換えてみました。 rock_ridge_reader.hpp rock_ridge_file_source_impl.hpp rock_ridge_file_source_implはボリューム記述子を選択した…

続 Rock Ridgeを含めた共通化

だいぶ考えがまとまってきました。 Rock Ridgeでは実際のファイル名とファイルIDが異なるため、ディレクトリレコードのファイルIDに基づく二分探索ができません。 このため、rock_ridge_file_sourceはディレクトリのトラバースに二分探索を使わないで済むよ…

Rock Ridgeを含めた共通化

昨日はrock_ridge_file_sourceをとりあえず作ったわけですが、ほとんどiso9660_file_sourceと同じ処理ですから、うまく共通化できないものかと考えています。 Rock Ridgeの深いディレクトリ階層を実装した感触からすると、 ボリューム記述子のパース(共通) …

Deep Directory Hierarchies

rock_ridge_file_sourceを作成して、深いディレクトリ階層もサポートしました。 rock_ridge_file_source_impl.hpp とりあえず動くことを第一に考えて書いたので、前のコードからコピペしまくりです。 ISO 9660ではディレクトリ階層は(ルートを1と数えて)8階…

仕切り直し

名前空間iso9660にISO 9660以外のものがたくさん追加されてしまったため、前言撤回になりますが、名前空間をisoに変更しました。 ちなみにViewCVSはディレクトリのリビジョンまで面倒見てくれないので、古いディレクトリを見ると404になります。日記内のリン…

device_numberの組み込み

昨日作成したdevice_numberを使って、iso_image_file_sourceに「"PN" System Use Entry」を実装しました。 iso_image_file_source_impl.hppの差分 Rock Ridgeでは、デバイスメジャー/マイナー番号をそれぞれ32ビット符号なし整数で記録します。 これらの値を…

"SL" System Use Entry

昨日のVistaでの問題は、UACに対応してもテストの途中で何度もボタンを押すことになって不便なので、コマンドプロンプトを管理者権限で起動することで回避することにしました。 さて、今日から開発を再開です。 今日はiso_image_file_sourceでシンボリックリ…

"TF" System Use Entry

"PX"(ファイルモードとuid/gid)と"TF"(各種ファイル時間)のSystem Use Entryに対応しました。 iso_image_file_source_impl.hppの差分"TF" System Use Entryで扱う時間は次のいずれかの形式です。 struct date_time { char year[4]; char month[2]; char day[…

Rock Ridge

iso_image_file_sourceでRock Ridgeをサポートしました。 とりあえず、ファイル名を記録している「"NM" System Use Entry」だけパースしています。 iso9660_file_source_impl.hppの差分 iso_image_file_source_impl.hppの差分 これまではJolietのボリューム…

"CE" Sytem Use Entry

iso9660_file_sourceにSystem Use Sharing Protocol(SUSP)を実装しました。 iso9660_file_source_impl.hppの差分 SUSPはディレクトリレコードの末尾にある自由領域「Sytem Useフィールド」を使います。 ディレクトリレコードのサイズは1バイトで記録されてい…

System Use Sharing Protocol

ISO 9660の作業に戻りました。 iso9660_file_sinkのJoliet対応が面倒なのと対応フォーマットを増やすたびにコードの構造が大きく変わりそうな気がしたので、先にiso9660_file_sourceの対応フォーマットを増やすことにしました。 というわけで、POSIX用の拡張…

iso9660_file_sink

iso9660_file_sinkを実装しました。 iso9660_file_sink_impl.hpp 自分で作ったisoファイルをマウントしてエクスプローラで閲覧すると、喜びも一入です。 昨日悩んでいたディレクトリ情報やディレクトリ構造の持ち方ですが、 // ディレクトリエントリの情報 s…

iso_file_sink

ISO 9660の出力を考えています。 流れとしては、 ヘッダ(ボリューム記述子など)をダミーで埋める 各ファイルの内容を出力する フッタ(パステーブル、ディレクトリレコード)を出力する シークで戻ってヘッダを埋めなおす となります。 処理2で各エントリの情…

iso9660_file_reader

Joliet対応でぐちゃぐちゃになったコードを整理しました。 iso9660_file_source_impl.hppの差分 実装上、ISO 9660とJolietの違いは、 ファイルIDの比較方法 ファイルIDからファイルパスへの変換 だけなので、これらの操作だけ抽象クラスにまとめれば、至ると…

Order of Directory Records

Jolietのテストをしていて、RecordNow DXがJoliet仕様と違う出力をする場合があることに気が付きました。 ISO 9660ではディレクトリエントリの情報を予めソートした状態で格納します。 各エントリには「ベース名.拡張子;バージョン番号」形式のファイルIDが…

続 Joliet

なんとかJolietの読み出しができました。 iso9660_file_source_impl.hppの差分 実際に実装してみて分かったのですが、JolietはISO 9660の拡張であるものの、ISO 9660の上位にあるものではなく、並列に存在するもののようです。 なので、joliet_file_sourceの…

Joliet

Jolietの仕様はWikipedia経由でここに見つかりました。 http://bmrc.berkeley.edu/people/chaffee/jolspec.html ISO 9660ではISO 2022のエスケープシーケンスをサポートしていて、エスケープシーケンスに応じてボリューム情報やパス情報を持つことができます…

iso_image_file_source

iso9660_file_sourceのラッパーとして、iso_image_file_sourceを作成しました。 iso_image_file_source_impl.hpp iso9660_file_source_impl.hppの差分 昨日書いていたように、関連ファイルと最新版以外のファイルを読み飛ばしているだけです。 ファイル名の…