التعامل مع "وثيقة فتح" (تكاليف التشغيل المباشرة الأخرى) الأحداث في سنو ليوبارد
-
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'
، وهكذا دواليك. الذي يميل إلى جعل رمز قليلا أكثر قابلية للقراءة ويتيح للمترجم حمايتك ضد الأخطاء المطبعية وكذا.