OSStatus GetFSSpecFromAEDesc( FSSpec *fsspec, AEDesc* theItem )
{
OSStatus err = noErr;
AEDesc coerceDesc = { NULL, NULL };
AEDesc coerceDesc2 = { NULL, NULL };
FSSpec fsSpec;
/* AEDesc がまだ FSSpec でない場合は、FSSpec に変換する... */
if ( theItem->descriptorType != typeFSS )
{
err = AECoerceDesc( theItem, typeFSS, &coerceDesc2 );
/* AEDesc から FSSpec を取得する */
if ( err == noErr )
{
theItem = &coerceDesc2;
}
}
err = AEGetDescData( theItem, fsspec, sizeof(fsSpec) );
AEDisposeDesc( &coerceDesc2 );
return( err );
}
pascal Boolean NavLaunchServicesFilterProc(
AEDesc* theItem,
void* info,
NavCallBackUserData ioUserData,
NavFilterModes filterMode
)
{
#pragma unused(ioUserData)
NavFileOrFolderInfo *myInfo = (NavFileOrFolderInfo *)info;
OSStatus err = noErr;
Boolean showItem = false;
FSSpec fsspec;
if ( filterMode == kNavFilteringBrowserList )
{
if (theItem->descriptorType == typeFSS)
{
/* ファイルまたはフォルダのどちらか? */
if (myInfo->isFolder)
{
/* すべてのフォルダを表示 */
showItem = true;
}
else /* ファイルはあるがフォルダはない */
{
Boolean outCanOpenWithGraphicsImporter = false;
Boolean outCanOpenAsMovie = false;
err = GetFSSpecFromAEDesc( &fsspec, theItem );
if ( err != noErr ) goto BailWithError;
/*
CanQuickTimeOpenFile 関数に関する参考文献を、本文書の最後に示します。
対象ファイルの FSSpec を渡すだけで、QuickTime は、
outCanOpenWithGraphicsImporter パラメータと outCanOpenAsMovie パラメータの中で、
ファイルがグラフィックスインポータを使って、またはそのままムービーとして
開けるかどうかを示す値を返します。
特に興味深いのは、inFlags
パラメータとして渡せる各種のフラグです。
これらは、QuickTime の検索方法に影響を与えます。次に各種フラグのリストを示します。
- inFlags 定数 -
kQTDontUseDataToFindImporter
このフラグは、ファイル中のデータを検索には利用しないように QuickTime に指示します。
これにより、開けるファイルがないという結果が返される場合には特に検索の速度は上がりますが、
QuickTime は、ファイルタイプやファイル拡張子で認識できないファイルを
開けないと報告することになります。
kQTDontLookForMovieImporterIfGraphicsImporterFound
このフラグは、ファイルを開く方法が見つかった時点で、
QuickTime に検索を終了するように指示します。ファイルが、グラフィックスインポータを使って
またはそのままムービーとして開けるかどうかを知りたい場合、
そしてその方法を問わない場合にこのフラグを渡します。
kQTAllowOpeningStillImagesAsMovies
このフラグは、QuickTime に、静止画をムービーとして開くことを検討するように指示します。
このフラグをグラフィックスインポータで開けるとき、
QuickTime は自動的に、ファイルをムービーとして開けると報告します。
kQTAllowImportersThatWouldCreateNewFile
このフラグは、QuickTime に、新しいファイルを作成するインポータを含めるように指示します。
このフラグがクリアされている場合、
QuickTime は、新しいファイルを作成しなくてもそのまま
インポートできるインポータのみを含めます。
kQTAllowAggressiveImporters
このフラグは、PICT や TEXT のような通例ムービーとは考えられない
ファイルタイプのためにムービーインポータを含めるように指示します。
このフラグがクリアされている場合、
QuickTime は、これらのムービーインポータを除外します。
検索の速度が向上するので、ファイルを開く方法にこだわらない場合は、
kQTDontLookForMovieImporterIfGraphicsImporterFound
フラグの使用を推奨します。状況によっては、検索の速度を向上させる
kQTDontUseDataToFindImporter フラグを使うのが便利かもしれませんが、
欠点は、拡張子またはファイルタイプを認識できないファイルをスキップしてしまうことです。
*/
err = CanQuickTimeOpenFile(
&fsspec,
/* fileType */
myInfo->fileAndFolder.fileInfo.finderInfo.fdType,
/* ファイルの拡張子、わからない場合は 0 */
0,
/* ファイルをグラフィックスインポータで開ける場合は true を返す
&outCanOpenWithGraphicsImporter,
/* ファイルをムービーインポータで開ける場合は true を返す
*/
&outCanOpenAsMovie,
/* ファイルをグラフィックスインポータまたはムービーインポータの
どちらでも開ける場合は、true を返すが
QuickTime はグラフィックスインポータの使用を優先する */
nil,
/* inFlags
QuickTime に、ファイルを見つけ次第検索を終了するように指示するために
kQTDontLookForMovieImporterIfGraphicsImporterFound を指定する。
ファイルを、グラフィックスインポータを使って開けるか、ムービーとして開けるかは問わない */
kQTDontLookForMovieImporterIfGraphicsImporterFound
);
if ( err != noErr ) goto BailWithError;
if ((outCanOpenWithGraphicsImporter) || (outCanOpenAsMovie))
{
/* 成功。ファイルは、グラフィックスインポータまたはムービーインポータの
どちらでも開ける */
showItem = true;
}
}
}
}
return (showItem);
BailWithError:
return( false );
}
|