代码之家  ›  专栏  ›  技术社区  ›  Paul J. Lucas

在雪豹中处理“打开文档”(ODOC)事件

  •  1
  • Paul J. Lucas  · 技术社区  · 16 年前

    我的应用程序中有响应“打开文档”(odoc)事件的代码。在Mac OS X Tiger and 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;
                }
            }
        }
    }
    

    然而,在mac os x雪豹下,这段代码不起作用。下面是豹系统的appleevent转储:

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

    下面是雪豹系统的appleevent转储:

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

    “alis”类型已经被新的雪豹“书签”类型所取代。如何修改此代码,使之:

    a)测试并处理新的“bmrk”类型,即获取文件的绝对路径
    b)继续研究虎豹

    ?

    或者我可以告诉操作系统,我仍然想要包含“ALI”结构的OODC事件?

    1 回复  |  直到 16 年前
        1
  •  5
  •   Brian Webster    16 年前

    这里包含的“书签数据”可以使用在雪豹中引入的一些新的CFUL和/或NSURL API来处理。 +[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error] NSURL API可以用来解决事件描述符中包含的书签数据。

    您还可以使用 coerceToDescriptorType: 方法并以这种方式处理它,虽然没有记录雪豹是否为此包含内置的强制处理程序(但看起来确实应该如此)。

    至于tiger/leopard兼容性,在这两个系统上都不会向您传递书签数据,因此调用新的nsurl方法应该不是问题,因为在旧系统上永远不会遵循该代码路径。

    BTW,头文件“AEDATAMODEL .H”包含您正在使用的四个字符代码的符号常量,因此您可以使用 typeAlias 而不是 'alis' , typeBookmark 而不是 'bmrk' ,等等。这会使代码更具可读性,并让编译器保护您不受拼写错误等的影响。