Cocoaでいこう! Macらしく 第15回
Yoshiki(DreamField)
この記事は、MOSAが発行するデベロッパ向けのデジタルマガジンMOSADeN 第75号(2003年7月22日発行)に掲載された記事です。2〜3ヶ月遅れで、ここに掲載して行きます。

今回はMac OSではとても重要であった、CreatorとTypeの付加方法を説明します。Creatorに関しては、実際にプログラムに組み込んでいきます。Typeに関しては、付加方法を説明します。

保存ファイルにCreatorを付けよう

そう言えば、まだTinyViewのCreatorを設定していませんでした。これではCreatorの付加のしようが無いので、まずはこれをやっておきましょう。Interface Builderで、TinyViewのプロジェクトを開いて下さい。開いたら、ターゲットを開いて、TinyViewを選んで下さい。そして、Info.plistのエントリの中の、シンプルビューの中の、基本情報を選択して下さい。ここにあるシグネチャが、Mac OSで言う所のCreatorになります(fig.01)。初期値は「????」になっていますので、これの代わりに「TNVW」と入れて下さい。これでTinyViewのCreatorが決まりました。

シグネイチャをセットする
[fig.01] シグネイチャをセットする

次に、MyDocument.mにCreatorを付加するコードを追加します。MyDocumentのスーパークラスである、NSDocumentのリファレンスを参照して下さい。リファレンスは、通常の方法でDeveloper Toolsをインストールしていれば、次の場所にあるはずです。

file:///Developer/Documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/Classes/NSDocument.html

リファレンスをずーっと見て行きますと、「Writing of HFS Creator and File Type Codes」と言う見出しがあります。CreatorとTypeを付加する方法はここに書いてあります。これを読めば分かりますが、要するにこの手の属性の値は、NSDictionaryクラスのインスタンスにセットしてフレームワークに渡すようになっています。NSDictionaryクラスと言うのは、Keyと、それに対するValue(値)を登録できるクラスです。つまり、Keyの種類を増やせばいくらでも拡張できるということです。これは、とても賢い方法であると思います。

具体的には、次の手順を取ります。ファイルを保存する時、fileAttributesToWriteToFile:ofType:saveOperation:が呼び出されます。このメソッドが返す値が、先程説明したNSDictionaryのインスタンスのアドレスです。ですから、このメソッドをオーバライドして、CreatorやTypeをセットする処理を追加すれば良いことになります。では、実装して行きましょう。今回は、Creatorのみセットすることにします。MyDocument.mに、次のメソッドを追加して下さい。

- (NSDictionary *)fileAttributesToWriteToFile:(NSString *)fullDocumentPath
                                       ofType:(NSString *)documentTypeName
                                saveOperation:(NSSaveOperationType)saveOperationType
{
    NSDictionary *theDictionary;
    NSMutableDictionary *theMutableDictionary;
    NSNumber *theCreator;

    theDictionary = [ super fileAttributesToWriteToFile:fullDocumentPath
                                                 ofType:documentTypeName
                                          saveOperation:saveOperationType];
    theMutableDictionary = [ NSMutableDictionary dictionaryWithDictionary:theDictionary];
    theCreator = [ NSNumber numberWithUnsignedLong:NSHFSTypeCodeFromFileType( @"'TNVW'")];
    [ theMutableDictionary setObject:theCreator forKey:NSFileHFSCreatorCode];
    return theMutableDictionary;
}

上記ソースの説明を行います。まずはオーバライドしたスーパークラスのメソッドを呼び出し、NSDictionaryクラスのインスタンスを受け取ります。これを行う理由は、スーパークラスでも値をセットしているからです。

theDictionary = [ super fileAttributesToWriteToFile:fullDocumentPath
                                                 ofType:documentTypeName
                                          saveOperation:saveOperationType];

これにCreatorをセットすれば良いわけですが、残念ながらNSDictionaryクラスのインスタンスは内容を変更できません。そこで、変更可能なNSMutableDictionaryクラスのインスタンスを、これと同じ内容で生成します。

theMutableDictionary = [ NSMutableDictionary dictionaryWithDictionary:theDictionary];

次にそこにセットするクリエイタを生成します。

theCreator = [ NSNumber numberWithUnsignedLong:NSHFSTypeCodeFromFileType( @"'TNVW'")];

NSHFSTypeCodeFromFileType()は、本来はタイプを表すNSStringクラスの文字列を数値に変換する関数ですが、クリエイタとタイプは同じ4文字ですから、クリエイタにも使えます。この関数の結果の値から、NSNumberクラスのインスタンスを生成します。NSNumberは数値を格納するラッパクラスです。これを、先程のNSMutableDictionaryクラスのインスタンスにセットします。

 [ theMutableDictionary setObject:theCreator forKey:NSFileHFSCreatorCode];

Creatorをセットする時のKeyはNSFileHFSCreatorCodeになります。これはフレームワークで宣言されています。

最後に、CreatorをセットしたNSMutableDictionaryクラスのインスタンスのアドレスを返します。

return theMutableDictionary;

このメソッドが返すのはNSDictionaryクラスのインスタンスのアドレスであると先程書きましたが、NSMutableDictionaryクラスはNSDictionaryクラスを継承していますので、これでも良いことになります。

では、ビルドして適当なJPEGを開き、これを別名で保存してみて下さい。保存したら、一度ウィンドウを閉じて下さい。そして、保存したファイルをダブルクリックしてみて下さい。今度は、TinyViewで開かれたと思います。これは、TinyViewのCreatorが付加されるようになったからです。この様にして、保存したファイルにCreatorが付加されるようになりました。

Typeの付加方法

Typeの付加もCreatorと同様の方法で行えます。Keyは、NSFileHFSTypeCodeになります。

なお、JPEGファイルは、拡張子さえ付いていれば、Typeを付加する必要はありませんし、付加する方法もCreatorと同じですので、今回はTypeの付加の実装は行わないこととします。

それでは、今回はここまでとさせていただきます。

前頁目次次頁