高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1152
Using Navigation Services to filter QuickTime files


Q: 自分の QuickTime 対応アプリケーションでフォルダナビゲーション機能(Navigation Services)を使っています。ナビゲーションサービスの[ Open(開く)]ダイアログボックスで QuickTime が開けるすべてのファイルを表示させたいのですが、そのための簡単な方法はありますか?

A: はい、あります。QuickTime の CanQuickTimeOpenFile 関数を使えば、ファイルが、 グラフィックスインポータを使ってまたはそのままムービーとして、QuickTime により開けるどうかを調べることができます。アプリケーション定義のナビゲーションサービスフィルタ関数からこの API を呼び出すだけで、QuickTime が開けるファイルのすべてを表示できます。以下は、その方法を示すナビゲーションサービス フィルタ関数の例です。



 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 );
}

リスト 1  CanQuickTimeOpenFile 関数を使ってファイルをフィルタ処理する、 アプリケーション定義のナビゲーションサービスフィルタ関数の例



参考文献:

CanQuickTimeOpenFile に関する文献については、以下のアドレスの QuickTime オンライン文書を参照してください。
http://developer.apple.com/techpubs/quicktime/qtdevdocs/APIREF/SOURCESI/canquicktimeopenfile.htm


[2002 年 6 月 15 日]