2010-10-11 13 views
6

Ich schreibe eine Anwendung, die Uniform Type Identifiers verwendet. Genauer gesagt, rufe ich UTTypeCreateAllIdentifiersForTag() und übergibt es verschiedene MIME Typen.Geben Sie für einen UTI (Uniform Type Identifier) ​​alle Typen an, denen er entspricht.

Meine Hoffnung war, dass diese Funktion (im Unterschied zu UTTypeCreatePreferredIdentifierForTag()) mir die spezifischsten UTI sowie alle HWIs, denen es entspricht, geben würde. Dies scheint nicht der Fall zu sein - es gibt entweder ein einzelnes UTI zurück, oder die sekundären UTIs sind falsch.

Es ist die UTTypeConformsTo() Funktion in der gleichen Header-Datei definiert, aber ich würde eine Funktion bevorzugen, die ein Array aller Typen zurückgibt, denen diese UTI entspricht.

Es scheint, dass Hoffnung für mich, wie MDItemCopyAttributeList() wird eine solche Liste zurückgeben. Das heißt, es erfordert eine MDItemRef, die entweder aus einem Dateipfad oder URL erstellt werden kann - das ist nicht so toll. Manchmal werden meine Daten nur im Speicher gespeichert und ich habe nur einen MIME-Typ.

Muss ich die gesamte Datenbank der Harnwegsinfekte durchlaufen, um diese Informationen zu erhalten, oder fehlt mir etwas?

Antwort

7

Ich war tatsächlich etwas fehlt: die sehr offensichtliche Lösung. Während ich durch die von LaunchServices exportierten Symbole schleppte (und bemerkte das interessante, aber private UTTypeCopyPedigree()), wurde ich an UTTypeCopyDeclaration() erinnert, welches definiert ist.

UTTypeCopyDeclaration() wird eine UTI gegeben und gibt (als CFDictionaryRef) die Eigenschaftenliste zurück, in der die UTI definiert wurde. Das Objekt in diesem Wörterbuch mit Schlüssel kUTTypeConformsToKey ist entweder ein CFArrayRef oder CFStringRef. Im Fall eines Arrays kann rekursiv iteriert werden, bis ein Basistyp erreicht ist.

So habe ich einen Vererbungsbaum für eine bestimmte UTI aufgebaut. Ich hoffe, das hilft jedem anderen mit dem gleichen Problem.