MacosX DiskArbitration Frameworkのサンプルコード
今日、「画像を縮小してロゴを付ける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採用状況が50%を超えている件について
- 「ピアリング戦記」の英訳版EPUBを無料配布します!
- IPv4アドレス移転の売買価格推移および移転組織ランキング100
- 例示用IPv6アドレス 3fff::/20 が新たに追加
- ShowNet 2024のL2L3
- ShowNet 2024 ローカル5G
過去記事