Frage

Ich habe Code in meiner Anwendung, der auf „Open Document“ (odoc)-Ereignisse reagiert.Unter Mac OS X Tiger und Leopard funktioniert dieser Code einwandfrei:

- (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;
            }
        }
    }
}

Unter Mac OS X Snow Leopard funktioniert dieser Code jedoch nicht.Hier ist ein Dump eines AppleEvents von einem Leopard-System:

{ 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
          }
        }
    }
}

Hier ist ein Dump eines AppleEvents von einem Snow Leopard-System:

{ 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.......
          }
        }
    }
}

Der Typ „Alis“ wurde durch den neuen Typ „Lesezeichen“ von Snow Leopard ersetzt.Wie kann ich diesen Code so ändern, dass er:

a) testet und verarbeitet den neuen Typ „bmrk“, d. h. ermittelt den absoluten Pfad der Datei
b) arbeitet weiterhin an Tiger und Leopard

?

Oder kann ich dem Betriebssystem irgendwie mitteilen, dass ich immer noch Odoc-Ereignisse möchte, die „alis“-Strukturen enthalten?

War es hilfreich?

Lösung

Die hier enthaltenen „Lesezeichendaten“ können mithilfe einiger neuer CFURL- und/oder NSURL-APIs verarbeitet werden, die in Snow Leopard eingeführt wurden. +[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error] ist die NSURL-API, mit der Sie die im Ereignisdeskriptor enthaltenen Lesezeichendaten auflösen können.

Möglicherweise können Sie den Deskriptor auch mithilfe von in einen Alias ​​umwandeln coerceToDescriptorType: Methode verwenden und auf diese Weise damit umgehen, dachte, es sei nicht dokumentiert, ob Snow Leopard dafür einen eingebauten Zwangshandler enthält (es scheint aber sicher so zu sein).

Was die Tiger/Leopard-Kompatibilität betrifft, werden Ihnen auf keinem dieser Systeme Lesezeichendaten übergeben, sodass der Aufruf der neuen NSURL-Methode(n) kein Problem darstellen sollte, da dieser Codepfad auf den älteren Systemen niemals befolgt wird.

Übrigens enthält die Header-Datei „AEDataModel.h“ symbolische Konstanten für die vier von Ihnen verwendeten Zeichencodes, die Sie verwenden können typeAlias anstatt 'alis', typeBookmark anstatt 'bmrk', und so weiter.Dadurch wird der Code tendenziell etwas besser lesbar und der Compiler schützt Sie vor Tippfehlern und dergleichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top