2009-09-18 12 views
1

J'ai dans ma demande le code correspondant à la réponse aux événements "Open Document" (odoc). Sous Mac OS X Tiger et Leopard, ce code fonctionne très bien:Gestion des événements "Open Document" (odoc) dans Snow Leopard

- (void) handleOpenDocumentEvent: 
    (NSAppleEventDescriptor*)event 
    withReplyEvent:(NSAppleEventDescriptor*)replyEvent 
{ 
    NSAppleEventDescriptor const *const dirObj = 
     [event descriptorForKeyword:keyDirectObject]; 
    DescType const dirObjType = [dirObj descriptorType]; 

    if (dirObjType == 'alis') { 
     // 
     // Open a single file. 
     // 
     NSData const *const data = [dirObj data]; 
     AliasHandle const fileHandle = 
      reinterpret_cast<AliasHandle>(::NewHandle([data length])); 
     if (fileHandle) { 
      [data getBytes:*fileHandle]; 
      err = [self queueFile:fileHandle fromSender:senderSig]; 
     } 
    } else if (dirObjType == 'list') { 
     // 
     // Open multiple files. 
     // 
     AliasHandle fileHandle = 
      reinterpret_cast<AliasHandle>(::NewHandle(0)); 
     if (fileHandle) { 
      int const numItems = [dirObj numberOfItems]; 
      for (int i = 1; i <= numItems; ++i) { 
       NSData const *const data = [[dirObj descriptorAtIndex:i] data]; 
       ::SetHandleSize(reinterpret_cast<Handle>(fileHandle), [data length]); 
       if ((err = ::MemError()) != noErr) 
        break; 
       [data getBytes:*fileHandle]; 
       err = [self queueFile:fileHandle fromSender:senderSig]; 
       if (err != noErr) 
        break; 
      } 
     } 
    } 
} 

Sous Mac OS X Snow Leopard, cependant, ce code ne fonctionne pas. Voici une décharge d'un AppleEvent d'un système Leopard:

{ 1 } 'aevt': aevt/odoc (i386){ 
      return id: 1012269061 (0x3c560005) 
    transaction id: 0 (0x0) 
    interaction level: 112 (0x70) 
    reply required: 0 (0x0) 
      remote: 0 (0x0) 
     for recording: 0 (0x0) 
     reply port: 150031 (0x24a0f) 
    target: 
    { 1 } 'psn ': 8 bytes { 
     { 0x0, 0x655655 } (iPhoto) 
    } 
    fEventSourcePSN: { 0x0,0x655655 } (iPhoto) 
    optional attributes: 
    < empty record > 
    event data: 
    { 1 } 'aevt': - 1 items { 
     key '----' - 
     { 1 } 'list': - 1 elements { 
      { 1 } 'alis': 326 bytes { 
      /Users/pjl/Pictures/IMG_8501.JPG 
      } 
     } 
    } 
} 

Voici une décharge d'un AppleEvent d'un système Snow Leopard:

{ 1 } 'aevt': aevt/odoc (i386){ 
      return id: 5173 (0x1435) 
    transaction id: 0 (0x0) 
    interaction level: 112 (0x70) 
    reply required: 0 (0x0) 
      remote: 0 (0x0) 
     for recording: 0 (0x0) 
     reply port: 81695 (0x13f1f) 
    target: 
    { 1 } 'psn ': 8 bytes { 
     { 0x0, 0x17c17c } (iPhoto) 
    } 
    fEventSourcePSN: { 0x0,0x17c17c } (iPhoto) 
    optional attributes: 
    < empty record > 
    event data: 
    { 1 } 'aevt': - 1 items { 
     key '----' - 
     { 1 } 'list': - 1 elements { 
      { 1 } 'bmrk': 944 bytes { 
        000: 626f 6f6b b003 0000 0000 0110 1000 0000  book............ 
        001: c002 0000 0500 0000 0101 0000 5573 6572  ............User 
        002: 7300 0000 0300 0000 0101 0000 706a 6c00  s...........pjl. 
        003: 0800 0000 0101 0000 5069 6374 7572 6573  ........Pictures 
        004: 0e00 0000 0101 0000 6950 686f 746f 204c  ........iPhoto L 
        005: 6962 7261 7279 0000 0800 0000 0101 0000  ibrary.......... 
        006: 4d6f 6469 6669 6564 0400 0000 0101 0000  Modified........ 
        007: 3230 3037 0b00 0000 0101 0000 4a75 6e20  2007........Jun 
        008: 392c 2032 3030 3700 0c00 0000 0101 0000  9, 2007......... 
        009: 494d 475f 3633 3837 2e6a 7067 2000 0000  IMG_6387.jpg ... 
        .... 
        058: 0000 0000 30f0 0000 3002 0000 0000 0000  ....0...0....... 
      } 
     } 
    } 
} 

Le type 'Alis' a été remplacé par le nouveau Type "signet" de Snow Leopard. Comment puis-je modifier ce code afin que:

a) des tests pour et gère le nouveau type, à savoir « de bmrk », obtenir le chemin absolu du fichier
b) continue de travailler sur Tiger et Leopard

?

Ou est-ce que je peux dire au système d'exploitation que je veux toujours des événements odoc qui contiennent des structures 'alis'?

Répondre

5

Les «données de signets» incluses ici peuvent être gérées à l'aide de nouvelles API CFURL et/ou NSURL qui ont été introduites dans Snow Leopard. +[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error] est l'API NSURL que vous pouvez utiliser pour résoudre les données de signet incluses dans le descripteur d'événement. Vous pouvez également contraindre le descripteur à un alias en utilisant la méthode coerceToDescriptorType: et le gérer de cette façon, sans penser que Snow Leopard inclue un gestionnaire de coercition intégré pour cela (il semble bien que devrait cependant). En ce qui concerne la compatibilité Tiger/Leopard, vous ne recevrez jamais de données de signets sur ces systèmes, donc l'appel des nouvelles méthodes NSURL ne devrait pas poser de problème, car ce chemin de code ne sera jamais suivi les systèmes plus anciens.

BTW, le fichier d'en-tête « AEDataModel.h » contient des constantes symboliques pour les quatre codes ombles que vous utilisez, vous pouvez utiliser typeAlias au lieu de 'alis', typeBookmark au lieu de 'bmrk', et ainsi de suite. Cela tend à rendre le code un peu plus lisible et permet au compilateur de vous protéger contre les fautes de frappe et autres.

+0

Merci! Mon code sortant utilise AliasHandles. Est-il possible que je puisse convertir un NSURL en un de ceux? Les docs ne semblaient pas avoir un moyen facile. –

+0

Il n'y a pas moyen de passer de NSURL -> AliasHandle directement, vous devez d'abord convertir en FSRef en utilisant CFURLGetFSRef(), puis créer un alias en utilisant FSNewAlias ​​(). –