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 : private boost::noncopyable { public: virtual ~iso_directory_parser(){} void fix_records(std::vector<iso_directory_record>& records) { this->do_fix_records(records); } iso::header make_header(const iso_directory_record& rec) { return this->do_make_header(rec); } private: // ディレクトリレコードの配列を修正する virtual void do_fix_records(std::vector<iso_directory_record>& records) = 0; // iso_directory_recordからiso::headerに変換する (Rock Ridgeをパースする) virtual iso::header do_make_header(const iso_directory_record& rec) = 0; };
iso_directory_recordにはRock Ridge用のメンバがなく、iso::headerにはエクステント位置のメンバがないため、do_fix_records()でディレクトリトラバースに必要な分だけパースして、残りはdo_make_header()でパースすることにしました。
iso_directory_parserとその派生クラスの実装は素直に書けたのですが、それを使う側のコードがグチャグチャになってしまいました。
iso_file_reader.hpp
iso_file_source_impl.hppの差分
もう少し調整が必要です。