Qt 4.8 - обнаружение вставки и удаления SD-карты на mac-mini (OS X Lion)

Я совершенно не знаком с разработкой приложений на Mac. Здесь я разработал только 2-3 приложения, использующие Qt и не используя objective-c/cocoa/xcode.

Есть ли способ обнаружить, когда SD-карта вставлена ​​в Mac mini (OS X Lion) в Qt 4 (4,8)?

I (re) много искал в Интернете, а также в stackoverflow - и некоторые результаты появились - но все для Android и Windows - ничего не связано с Mac (mini OS X Lion).

До сих пор я нашел это:

  • на Mac (mini) устройство чтения карт рассматривается как любое другое USB-устройство.
  • Я также нашел этот пример в Mac Developer Library. Надеюсь, эта ссылка доступна для всех.
    Этот пример... "демонстрирует использование IOKitLib и IOUSBLib для настройки асинхронных обратных вызовов, когда USB-устройство подключено к системе или удалено из системы". Следовательно, это достижимо.
    Я хочу сделать то же самое в Qt.

Я хочу определить, когда была вставлена ​​SD-карта, затем я хочу показать свое приложение, получить ввод и переместить выбранные файлы с карты на локальный диск.
Ясно, что все просто: просто обнаружить карту и показать приложение (из лотка или сведенного к минимуму состояния) является важной и сложной частью.

Я бы очень признателен, если вы можете указать мне в правильном направлении.
Спасибо заранее!


Update:

Я еще исследовал и обнаружил, что:

  • в Linux мы можем использовать udev(libudev) для достижения таких вещей.
  • но потом я обнаружил, что udev - это конкретный Linux и не найдет этого в OS X.
    Ответы здесь предлагаю use the diskutil activity command to continuously monitor disks being mounted or ejected.
    Я нашел нечто очень похожее здесь и здесь, но для Linux с использованием правил udev: (
  • последним и, по-видимому, наиболее актуальным является то, что:
    • diskutil plist и IOKit(DiskArbitration) должны быть частью решения, которое я ищу
  • Наконец, здесь я узнал о launchd plist и Lingon

Теперь... У меня намного больше, чем вчера, но мне все равно нужна помощь, чтобы собрать все это вместе и использовать его в приложении Qt. Я был бы очень признателен за то, что кто-то направил меня к окончательному результату. Я буду продолжать работать над этим и обновлять, если я действительно могу создать что-то полезное.

Спасибо заранее!:)

Ответ 1

Я думаю, вам нужно создать агент запуска , который использует Структура DiskArbitration для контроля за монтированием новых дисков. Этот агент будет запущен в фоновом режиме, когда пользователь войдет в систему. Когда ваш помощник обнаружит, что новый диск установлен, он может проверить свойства DADiskRef, представляющие диск, чтобы решить, представляет ли он интерес для вашего приложения. Если это так, он может затем запустить пользовательскую часть вашего приложения, используя API LaunchServices.

Эскиз кода для регистрации для событий монтирования дисков с использованием DiskArbitration выглядит следующим образом:

#include <Foundation/Foundation.h>
#include <DiskArbitration/DiskArbitration.h>

static void diskAppearedCallback(DADiskRef disk, void* context)
{
    CFDictionaryRef description = DADiskCopyDescription(disk);
    NSLog(@"Disk appeared: %@", description);
    CFRelease(description);
}

int main(int argc, char **argv)
{
    DASessionRef session = DASessionCreate(kCFAllocatorDefault);
    DARegisterDiskAppearedCallback(session, kDADiskDescriptionMatchVolumeMountable, diskAppearedCallback, 0);
    DASessionScheduleWithRunLoop(session, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

    CFRunLoopRun();

    return 0;
}

Словарь, возвращаемый DADiskCopyDescription, содержит ряд атрибутов, которые могут оказаться полезными при определении того, интересует ли вновь установленный диск, в том числе, является ли носитель удаляемым, эжектируемым и т.д.