التعامل مع "وثيقة فتح" (تكاليف التشغيل المباشرة الأخرى) الأحداث في سنو ليوبارد

StackOverflow https://stackoverflow.com/questions/1446835

  •  22-07-2019
  •  | 
  •  

سؤال

ولدي التعليمات البرمجية في طلبي هذا ردا على "فتح المستند" (تكاليف التشغيل المباشرة الأخرى) الأحداث. في نظام التشغيل Mac OS X النمر والفهد، وهذا الرمز يعمل على ما يرام:

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

وتحت ماك 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.......
          }
        }
    }
}

تم استبدال 'أليس' نوع من سنو ليوبارد الجديد "المرجعية" نوع. كيف يمكنني تعديل هذه التعليمات البرمجية بحيث:

وأ) اختبارات ويعالج "bmrk 'نوع جديد، أي الحصول على المسار المطلق للملف
ب) تواصل العمل على النمر والنمر

وأم أن بعض الطريقة استطيع ان اقول نظام التشغيل الذي ما زلت أريد الأحداث تكاليف التشغيل المباشرة الأخرى التي تحتوي على هياكل 'أليس'؟

هل كانت مفيدة؟

المحلول

وو"المرجعية البيانات" الواردة هنا يمكن التعامل معها باستخدام بعض CFURL جديدة و / أو واجهات برمجة التطبيقات NSURL التي تم تقديمها في سنو ليوبارد. <وأ href = "http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/occ/clm/NSURL/URLByResolvingBookmarkData:options : relativeToURL: bookmarkDataIsStale: خطأ: "يختلط =" noreferrer "> + [NSURL URLByResolvingBookmarkData: خيارات: relativeToURL: bookmarkDataIsStale: خطأ] هو API NSURL يمكنك استخدامها لحل البيانات المرجعية المدرجة في واصف الحدث.

وأنت قد تكون ايضا قادرة على إجبار اصف إلى مستعار باستخدام طريقة coerceToDescriptorType: والتعامل معها بهذه الطريقة، ويعتقد انها ليست موثقة أم لا سنو ليوبارد يتضمن المدمج في معالج الإكراه لهذا (من المؤكد يبدو كما ينبغي على الرغم من).

وأما عن التوافق النمر / ليوبارد، فلن يتم تمرير بيانات مرجعية في أي من تلك النظم، لذلك استدعاء الأسلوب NSURL جديد (ق) لا ينبغي أن يكون مشكلة، لأن لن أتبع ذلك مسار رمز على النظم القديمة.

وراجع للشغل، ملف الرأس "AEDataModel.h" يحتوي على الثوابت رمزية لرموز شار أربعة الذي تستخدمه، بحيث يمكنك استخدام typeAlias بدلا من 'alis'، typeBookmark بدلا من 'bmrk'، وهكذا دواليك. الذي يميل إلى جعل رمز قليلا أكثر قابلية للقراءة ويتيح للمترجم حمايتك ضد الأخطاء المطبعية وكذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top