WM_DEVICECHANGE на OS X

Продолжение к WM_DEVICECHANGE и все все все (потому и заголовок такой), только на маке.

На OS X, казалось бы, все хорошо, там есть такое:

DARegisterDiskAppearedCallback(m_session, kDADiskDescriptionMatchVolumeMountable, mountCallback2, this);

Ну и дальше в том же духе. И на всовывание USB-карточки прилетает callback.

Дальше мы хотим узнать, что же нам всунули, идем получать список маунтов:

CFURLEnumeratorRef enumerator = CFURLEnumeratorCreateForMountedVolumes(NULL, kCFURLEnumeratorSkipInvisibles, NULL);

Фигак, а нашего тома в этом списке еще нет.

Причем, понятно, если мы в отладчике все проходим, пошагово, то все есть. А если вживую - то нет. Только отладочная печать, только хардкор.

Решение понятное: опять поллинг. Но можно не по таймеру, а "до успеха" (или пока к этому же разделу не прилетел unmount callback, что влегкую может быть если контакт у USB хреновый).

Чума, короче, на оба дома.

Comments

А в DARegisterDiskDescriptionChangedCallback, случайно, не прилетает что надо?

В смысле - туда прилетит уже после того, как оно в volume list появится "по всей системе"?

Интересная мысль, но у меня уже с поллингом все хорошо. То есть я хватаю оба коллбека, DiskAppeared и DescriptionChanged, а дальше делаю три запроса к списку томов и к их типу. Если список/тип меняются, значит что-то обновилось.

Работает.