今回はMac OSではとても重要であった、CreatorとTypeの付加方法を説明します。Creatorに関しては、実際にプログラムに組み込んでいきます。Typeに関しては、付加方法を説明します。
そう言えば、まだ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の付加もCreatorと同様の方法で行えます。Keyは、NSFileHFSTypeCodeになります。
なお、JPEGファイルは、拡張子さえ付いていれば、Typeを付加する必要はありませんし、付加する方法もCreatorと同じですので、今回はTypeの付加の実装は行わないこととします。
それでは、今回はここまでとさせていただきます。