joliet_reader

rock_ridge_readerと同じインタフェースでjoliet_readerを作成し、ISO 9660/Joliet/Rock Ridge対応のiso_file_sourceに組み込みました。
joliet_reader.hpp
iso_file_source_impl.hpp


ようやく3つのフォーマットに対応できたわけですが、一つのボリューム記述子が3つともに対応している場合、Joliet優先になっています。 (2/18追記: 大ボケ。一つのボリューム記述子がISO9660とJolietに対応することはありません。以下の議論は意味がない可能性があります。)
これはボリューム記述子を見ただけではRock Ridgeに対応しているか判断できないためです。
解決策としては、

  • Rock Ridgeかどうか判定するために予めルートディレクトリの内容まで確認する。
  • とりあえずボリューム記述子を選択してRock Ridgeかどうか確認する。違ったら別のボリューム記述子を選択する。(ユーザーによるリトライ)

が考えられます。


どの階層でやるかの違いだけで、本質的には同じですね。
ボリューム記述子をすべて読み終わった後で、各ボリューム記述子に対するルートディレクトリを読むようにすればそれほど複雑にはならないので、上の案でやってみようと思います。