Создание дескриптора AppleEvent для псевдонима в OS X 10.8

У меня в проекте есть следующий код

NSAppleEventDescriptor *JHCreateAliasDescriptorForURL(NSURL *aURL) {
    NSAppleEventDescriptor *retObj = nil;
    FSRef fsReference;

    if (CFURLGetFSRef((__bridge CFURLRef)aURL, &fsReference)) {
        AliasHandle aliasHandle = NULL;
        OSStatus err = FSNewAliasMinimal(&fsReference, &aliasHandle);
        if (err == noErr && aliasHandle != NULL) {

            HLock((Handle)aliasHandle);
            retObj = [NSAppleEventDescriptor descriptorWithDescriptorType:typeAlias
                            data:[NSData dataWithBytes:*aliasHandle
                                                length:GetHandleSize((Handle)aliasHandle)]];
            HUnlock((Handle)aliasHandle);
            DisposeHandle((Handle)aliasHandle);
        }
    }

    return retObj;
}

Он создает дескриптор псевдонима, который передает файл программе, которая не поддерживает приложение, но реагирует на это событие AppleEvent.

Когда я компилирую это под 10.8, я получаю предупреждения, потому что все функции Carbon FSNewAlias* устарели, и мы должны использовать объекты непрозрачных закладок NSData из NSURL API. Однако мне не удалось превратить эти данные в псевдонимы дескрипторов AppleEvent.

Как я могу сделать дескриптор typeAlias в 10.8 без FSNewAlias*?


person iluvcapra    schedule 30.03.2013    source источник


Ответы (2)


Вы в принципе не можете. (Современная замена псевдониму - CFURLBookmark. Существует процедура для создания закладки из данных псевдонима, но не наоборот.) Однако вы можете создать другой тип файлового дескриптора. который может быть приведен к псевдониму - самый простой - typeFileURL, где содержимое - это просто байты URL-адреса. По общему признанию, это зависит от того, правильно ли написано целевое приложение, но оно должно работать.

person Chris N    schedule 31.03.2013
comment
Я попробую это сделать, но подозреваю, что мое принимающее приложение этого не сделает - это очень проприетарное приложение. (Я не называю имена, но это Avid Pro Tools.) - person iluvcapra; 01.04.2013
comment
Я подозреваю, что вы действительно можете использовать приведение типов в своем собственном коде, чтобы создать запись псевдонима из URL-адреса файла без устаревшего API, а затем поместить это в событие, которое вы отправляете. То есть сохранить typeFileURL в записи, а затем получить typeAlias. Затем сохраните это typeAlias. - person Ken Thomases; 01.04.2013
comment
Честно говоря, Avid пришлось бы изо всех сил, чтобы их сторона не работала. Однако если бы они это сделали, то предложение Кена о принуждении сработало бы, за исключением того, что я бы использовал -[NSAppleEventDescriptor coerceToDescriptorType:] (или, если хотите, AECoerceDesc). - person Chris N; 01.04.2013

В случае, если кто-то еще ищет более прямое решение, что-то вроде этого хорошо работает для создания дескриптора Apple Event из данных закладок:

+ (NSAppleEventDescriptor *)descriptorWithBookmarkDataForFileURL:(NSURL *)fileURL {
    NSData *targetBookmarkData = [fileURL bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil relativeToURL:nil error:nil];
    return [NSAppleEventDescriptor descriptorWithDescriptorType:typeBookmarkData data:targetBookmarkData];
}
person AriX    schedule 09.05.2014
comment
Я впервые попробовал это, когда у меня возникла эта проблема - ваше решение работает в целом, но не для конкретного приложения, которое я использовал. Он только хочет увидеть псевдоним, он не может обрабатывать typeBookmarkData. - person iluvcapra; 13.05.2014
comment
Понятно. Моим ответом на это было бы принуждение, но похоже, что это то, что вы в конечном итоге сделали, но вместо этого с URL-адресом файла. - person AriX; 14.05.2014
comment
Думаю, я пробовал это, но по какой-то причине это не сработало. Похоже, что если вы можете принудительно указать закладку на путь к файлу, это лишает смысла создание закладок. - person iluvcapra; 14.05.2014
comment
Не совсем понимаю, что вы имеете в виду! Закладки - это просто более современная версия псевдонимов; оба могут быть приведены к путям к файлам. Но это не одно и то же (т.е. если вы сохраните закладку в файл, а затем переместите ее в другое место, ее все равно можно будет найти, тогда как путь к файлу изменится) - person AriX; 15.05.2014