● ToolBox API徒然草(2005/04/15)

  このニュースは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

 〜 Navigation Service APIの活用(その6) 〜


今回は,最後の自作ルーチンnavCheckImportExtention()を紹介し、それをNavGetFile()のフィルタルーチンから使うケースを解説します。また、ファイルタイプも拡張子も付いていない画像ファイルに遭遇した場合、それがオープンできるかどうかを判断するために用いる便利なルーチンも紹介します。

前回、「拡張子のみ」でその種類を判断しなければいけないファイルのために、NULL(ゼロ)を含めたいくつかの特殊ファイルタイプもNavTypeList構造体へ追加しておく必要があると説明しました。ここでは「未定義」のファイルタイプとして、NULLの他に、'????' 、'****'、' '(スペース4つ)の3つを追加しましたが、これは筆者の経験から加えた物であり(笑)Apple社がそう定義しているわけではないのでご了承ください。また、UNIX環境からMac OS 9起動マシン経由で入ってくる画像ファイルの中には、そのタイプが'TEXT'だったりする物もありますので状況によってはさらに注意が必要です。

以下が、navCheckImportExtention()ルーチンです。非常に原始的な方法(文字列比較)で拡張子をチェックし、ファイルタイプは「未定義」だが拡張子が目的の内容であれば、*typeに対象タイプを代入し1を返します。また、ファイルタイプが設定済みで未定義タイプでなければゼロを、未定義タイプで内容が目的の拡張子でない場合には-1を返します。今回のソースコードは誌面の関係上、チェック対象をJPEGファイルのみに限定しています。本来ならば、必要とされる画像種類の数だけ文字列比較の箇所を増やす必要があります。また、厳密に比較するならば、大文字と小文字が混在した拡張子や、4文字「.jpeg」などの、ある程度予想されるイレギュラルな拡張子にも対応する必要があるでしょう。はっきり言って、やり出したらきりがない「どこで妥協するのだ?」作業となります。



上記ルーチンをNavGetFile()のフィルタルーチンで利用すれば、そのファイルのタイプが未定義でも、ファイル名選択ダイアログのブラウザで通常表示(グレー表示ではない)することが可能です。以下のnavFilterProc()が、navCheckImportExtention()を用いたフィルタルーチンです。



利用するための登録は簡単です。NavGetFile()を実行する時に、以下のようにフィルタルーチンとして引数で渡してやります。NavFileOrFolderInfo構造体の詳しい内容についてはNavigation.hを参照してください。また、フィルタルーチンで表示判別の対象となるファイルは、先んじてNavTypeListHandle(NavTypeList構造体)で設定したファイルタイプを持つ物のみとなりますので、くれぐれも注意してください。

NavGetFile( NULL,&reply,&opt,NULL,NULL,navFilterProc,list,NULL );

ファイルタイプが未定義でも、ちゃんと拡張子があれば種類の判断は可能なのですが(嘘の拡張子が付いていたらダメ)、中には両方とも存在しないファイルがあります。こうなると、「ファイルの中身」をサーチし、その種類を判断するという「最終手段」を取らざるをえなくなります。具体的に言えば、画像ファイルのヘッダ情報を読み込み、そこに正しい情報が記載されているかどうかをチェックするわけです。しかし、すべての画像ファイルについて「いちいちそこまでやってられない!」と言うのが開発者の本音なわけです(笑)。そこで最後に、QuickTime GraphicsImporterコンポーネントの能力を使い、ファイルのMIME(Multipurpose Internet Mail Extensions)情報を得ることで、そこからファイル種類を判別するnaviCheckMIMEList()ルーチンを紹介しておきます。



このルーチンは、「正体不明」のファイルの正体を突き止める最終手段としてそこそこ役に立ちます。今回は、MIME情報も得たいケースを考え、QTAtomから抽出したMIMEタイプを一度パスカル文字列に変換してから比較していますが、もちろんこの手間を省き直接バイナリ比較してもかまいません。前回も言及しましたが、現在のNavigation Serviceは「拡張子」の扱が非常に貧弱なのが最大の弱点です。それだけ、以前からMacintoshが採用している(今でもしているが...)ファイルタイプと言う仕組みが理解しやすく取り扱いが楽だった証拠にもなります。しかし、こうなってしまった現状としては、この「鬼っ子」をもう少しうまく手なずけるための有用なAPIが、早急にNavigation Serviceに実装されることを切望したいと思います。

次回は「Navigation Service APIの活用」の最終回となります。FSSpecの代わりにFSRefを得るために有用なシートウィンドウ版の「フォルダ選択ダイアログ」と「ファイル名選択ダイアログ」を紹介したいと思います。


copyright 2005 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp