From f280896e33a622c13a0a84dd3fc2276bbdd30f72 Mon Sep 17 00:00:00 2001 From: Joseph Spiros Date: Wed, 29 Jan 2003 09:42:12 +0000 Subject: [PATCH] I'd like to introduce you to ITAppleEventCenter, our new facility for sending and receiving AppleEvent data, without the need for our apps to work with nasty Carbon calls directly --- ITAppleEvent.h | 2 +- ITAppleEventCenter.h | 28 +++++++++ ITAppleEventCenter.m | 131 ++++++++++++++++++++++++++++++++++++++++++ ITStringScanner.h | 2 +- ITVirtualMemoryInfo.h | 2 +- 5 files changed, 162 insertions(+), 3 deletions(-) create mode 100755 ITAppleEventCenter.h create mode 100755 ITAppleEventCenter.m diff --git a/ITAppleEvent.h b/ITAppleEvent.h index bf54bca..2eabfa1 100755 --- a/ITAppleEvent.h +++ b/ITAppleEvent.h @@ -9,7 +9,7 @@ * Responsibility : Joseph Spiros * : Kent Sutherland * - * Copyright (c) 2002 iThink Software. + * Copyright (c) 2002 - 2003 iThink Software. * All Rights Reserved * */ diff --git a/ITAppleEventCenter.h b/ITAppleEventCenter.h new file mode 100755 index 0000000..4a71835 --- /dev/null +++ b/ITAppleEventCenter.h @@ -0,0 +1,28 @@ +/* + * ITFoundation + * ITAppleEventCenter + * + * A class for sending and recieving AppleEvent data. + * Who wants to mess with that Carbon shit anyway? + * + * Original Author : Joseph Spiros + * Responsibility : Joseph Spiros + * : Kent Sutherland + * : Matt Judy + * + * Copyright (c) 2002 - 2003 iThink Software. + * All Rights Reserved + * + */ + +#import +#import + + +@interface ITAppleEventCenter : NSObject { + +} ++ (id)sharedCenter; +- (NSString*)runAEWithRequestedKey:(NSString*)key eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn; +- (void)printCarbonDesc:(AEDesc*)desc; +@end diff --git a/ITAppleEventCenter.m b/ITAppleEventCenter.m new file mode 100755 index 0000000..273fecb --- /dev/null +++ b/ITAppleEventCenter.m @@ -0,0 +1,131 @@ +#import "ITAppleEventCenter.h" + +Boolean MyAEIdleCallback ( + EventRecord * theEvent, + SInt32 * sleepTime, + RgnHandle * mouseRgn + ); + +Boolean MyAEIdleCallback ( + EventRecord * theEvent, + SInt32 * sleepTime, + RgnHandle * mouseRgn + ) +{ + return FALSE; +} + +@implementation ITAppleEventCenter + +static ITAppleEventCenter *_sharedAECenter = nil; + ++ (id)sharedCenter +{ + if( _sharedAECenter != nil ) { + return _sharedAECenter; + } else { + _sharedAECenter = [[ITAppleEventCenter alloc] init]; + return _sharedAECenter; + } +} + +- (NSString*)runAEWithRequestedKey:(NSString*)key eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn +{ + AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]); + AEEventID eID = *((unsigned long*)[eventID UTF8String]); + + const char *sendString = [[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('%s'), from:'null'() }", [key UTF8String]] UTF8String]; + NSString *_finalString; + + // Variables for building and sending the event + AppleEvent sendEvent, replyEvent; + //AEDesc replyDesc; + AEIdleUPP upp = NewAEIdleUPP(&MyAEIdleCallback); + + // Variables for getting the result + char *charResult; + DescType resultType; + Size resultSize, charResultSize; + + // Variables for error checking + AEBuildError buildError; + OSStatus err; + OSErr err2, err3; + //Ptr buffer; + //Size length; + + // Start Code + // ^ Most pointless comment EVAR! + // ^^ Nope, that one is + + NSLog(@"_sendString: %s", sendString); + + // The problem is, if I use eClass and eID in place of 'core' and 'getd' respectively, It won't build a valid AppleEvent :'( + err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString); + + [self printCarbonDesc:&sendEvent]; + + if (err) { + NSLog(@"%d:%d at \"%@\"",buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]); + } + + err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, upp, NULL); + + [self printCarbonDesc:&replyEvent]; + + if (err) { + NSLog(@"Send Error: %i",err); + } else { + + unichar* result=0; + + err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize); + result=malloc(resultSize); + //err2 = AEGetParamDesc(&replyEvent, keyDirectObject, typeWildCard, &replyDesc); + + if (err2) { NSLog(@"Error After AESizeOfParam: %i", err2); } else { + //if (err2) { NSLog(@"Error After AEGetParamDesc: %i", err2); } else { + + err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, result, resultSize, &charResultSize); + //length = AEGetDescDataSize(&replyDesc); + //buffer = malloc(length); + + //err3 = AEGetDescData(&replyDesc, buffer, length); + + if (err3) { NSLog(@"Error After AEGetParamPtr: %i", err3); } else { + + // if (err3) { NSLog(@"Error After AEGetDescData: %i", err3); } else { + + _finalString = [[NSString stringWithCharacters:result length:charResultSize/sizeof(unichar)] copy]; + + /* _finalString = [NSString stringWithCString:buffer length:length]; + + if ( (! [_finalString isEqualToString:@""]) && + ([_finalString characterAtIndex:0] == '\"') && + ([_finalString characterAtIndex:[_finalString length] - 1] == '\"') ) { + _finalString = [_finalString substringWithRange:NSMakeRange(1, [_finalString length] - 2)]; + } + free(buffer); + buffer = nil; */ + + } + } + } + + //NSLog(@"Result Size: %i", charResultSize); + //NSLog(@"Result: %c", charResult); + + AEDisposeDesc(&sendEvent); + AEDisposeDesc(&replyEvent); + + return _finalString; +} + +- (void)printCarbonDesc:(AEDesc*)desc { + Handle xx; + AEPrintDescToHandle(desc,&xx); + NSLog(@"Handle: %s", *xx); + DisposeHandle(xx); +} + +@end diff --git a/ITStringScanner.h b/ITStringScanner.h index 8fb0122..fd38770 100755 --- a/ITStringScanner.h +++ b/ITStringScanner.h @@ -8,7 +8,7 @@ * Responsibility : Alexander Strange * : Joseph Spiros * - * Copyright (c) 2002 iThink Software. + * Copyright (c) 2002 - 2003 iThink Software. * All Rights Reserved * */ diff --git a/ITVirtualMemoryInfo.h b/ITVirtualMemoryInfo.h index f0e3bb8..0451a5e 100755 --- a/ITVirtualMemoryInfo.h +++ b/ITVirtualMemoryInfo.h @@ -10,7 +10,7 @@ * Responsibility : Joseph Spiros * : Matt Judy * - * Copyright (c) 2002 iThink Software. + * Copyright (c) 2002 - 2003 iThink Software. * All Rights Reserved * */ -- 2.20.1