MacosX DiskArbitration Frameworkのサンプルコード

2011/10/4-3

今日、「画像を縮小してロゴを付けるGIMPスクリプト(Flickr用)」という記事を公開したのですが、これを見た知人から「ねえねえ、SDカードを繋げた瞬間に自動的にファイル名を変更して保存してくれる機能が欲しい」というようなご意見を頂いたのですが、MacosXでそういったイベントを取得する方法を知らなかったので調べてみました。

DiskArbitration Frameworkを使えば良いというのはすぐにわかったのですが、あまり詳しい説明がなさそうだったので、DiskArbitration FrameworkのReferenceを見ながらサンプルコードを書いてみました。 こんなサンプルコードをすぐに必要な人は少ないと思うので、そのうちこれを必要とする誰かが検索エンジン経由で発見するという感じになると思いますが、誰かのお役に立てれば幸いです。


#import <DiskArbitration/DiskArbitration.h>

/*
DADiskAppearedCallbackの型

typedef void ( *DADiskAppearedCallback )(
    DADiskRef disk,
    void *context );  
*/
void my_callback(DADiskRef disk, void *data)
{
  if (data != NULL) {
    printf("================================\n");
    printf("%s [%s]\n", (char *)data, DADiskGetBSDName(disk));
    printf("================================\n");
  }

  /* ディスク情報を取得する例 */
  CFDictionaryRef desc;
  desc = DADiskCopyDescription(disk);

  CFIndex count = CFDictionaryGetCount(desc);
  if (count > 0) {
    CFStringRef *keys[count];
    CFStringRef *values[count];

    CFDictionaryGetKeysAndValues(desc,
       (const void **)keys, (const void **)values);

    /* 「Macintosh HD」などの名前のkeyは「DAVolumeName」です */

    int i;
    for (i=0; i<count; i++) {
      CFShow(keys[i]);
      CFShow(values[i]);
    }
  }

  CFRelease(desc);
}

int
main()
{
  DASessionRef session;

  session = DASessionCreate(kCFAllocatorDefault);

/*
 :::: memo ::::
extern void DARegisterDiskAppearedCallback(
    DASessionRef session, 
    CFDictionaryRef match, 
    DADiskAppearedCallback callback, 
    void *context );  
*/

  /*
   * 登録するコールバック関数は両方とも同じものです。
   * このサンプルでは、第4引数の文字列が
   * コールバック関数内でprintfされます。
   */
  DARegisterDiskAppearedCallback(session, NULL, my_callback,
      (void *)"DiskAppeared");
  DARegisterDiskDisappearedCallback(session, NULL, my_callback,
      (void *)"DiskDisappeared");

  DASessionScheduleWithRunLoop(session,
      CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

  CFRunLoopRun();

  CFRelease(session);

  return 0;
}

コンパイルは以下のコマンドで可能です。

gcc -framework DiskArbitration -framework CoreFoundation filename.m

たまに、こうやって知らないAPIを調べるのって楽しいですね。

最近のエントリ

過去記事

過去記事一覧

IPv6基礎検定

YouTubeチャンネルやってます!