#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "filter.h" #include #include static AEEventHandlerUPP OAPPHandlerUPP, ODOCHandlerUPP, PDOCHandlerUPP, QUITHandlerUPP, DOSCHandlerUPP; static void EventInit( void ); static pascal OSErr DoOpenApp( AppleEvent *theAppleEvent,AppleEvent *reply, long refCon); static pascal OSErr DoOpenDoc( AppleEvent *theAppleEvent,AppleEvent *reply, long refCon); static pascal OSErr DoScript( AppleEvent *theAppleEvent,AppleEvent *reply, long refCon); static void SetUpMenus(void); static void DoCommand(long mResult); static OSErr GotRequiredParams( AppleEvent *appleEventPtr ); static int FullToFolder(StringPtr name, short *volume, long *folder); // Globals static Boolean gDone = false; static QDGlobals qd; static int argc; static char **argv, appName[64]; int ccommand( char ***argvPtr) { int i; EventRecord event; OSErr myErr = noErr; fullPath app; Point thePoint; short thePart; WindowPtr whichWindow; unsigned char theChar; InitGraf(&qd.thePort); InitFonts(); InitWindows(); InitMenus(); FlushEvents(everyEvent,0); TEInit(); InitDialogs( nil ); InitCursor(); MaxApplZone(); for(i=0; i<10; i++) MoreMasters(); setLibToResFile(); if( makePathToHost ( &app ) == 0 ) { p2cstr( app.name ); strcpy( appName, (char*)app.name); } else strcpy( appName, "dummy"); EventInit(); SetUpMenus(); argc = 0; argv = nil; while( !gDone ) { if ( WaitNextEvent ( everyEvent, &event, 20L, nil) ) { switch ( event.what ) { case kHighLevelEvent: AEProcessAppleEvent( &event ); break; case mouseDown: thePoint = event.where; switch (thePart = FindWindow(thePoint, &whichWindow)) { case inSysWindow: SystemClick(&event, whichWindow); break; case inMenuBar: DoCommand(MenuSelect(thePoint)); break; } break; case keyDown: case autoKey: theChar = (unsigned char)BitAnd(event.message, charCodeMask); if (BitAnd(event.modifiers, cmdKey) != 0) DoCommand(MenuKey(theChar)); break; } } } *argvPtr = argv; return argc; } static void EventInit( void ) { OSErr err; OAPPHandlerUPP = NewAEEventHandlerProc(DoOpenApp); err = AEInstallEventHandler ( kCoreEventClass, kAEOpenApplication, OAPPHandlerUPP, 0L, false ); ODOCHandlerUPP = NewAEEventHandlerProc(DoOpenDoc); if( err == noErr) err = AEInstallEventHandler ( kCoreEventClass, kAEOpenDocuments, ODOCHandlerUPP, 0L, false ); PDOCHandlerUPP = NewAEEventHandlerProc(DoOpenApp); if( err == noErr) err = AEInstallEventHandler ( kCoreEventClass, kAEPrintDocuments, PDOCHandlerUPP, 0L, false ); QUITHandlerUPP = NewAEEventHandlerProc(DoOpenApp); if( err == noErr) err = AEInstallEventHandler ( kCoreEventClass, kAEQuitApplication, QUITHandlerUPP, 0L, false ); DOSCHandlerUPP = NewAEEventHandlerProc(DoScript); if( err == noErr) err = AEInstallEventHandler ( kAEMiscStandards, kAEDoScript, DOSCHandlerUPP, 0L, false); if( err != noErr) PrintError("Could not initialize AE Handler"); return; } static pascal OSErr DoOpenApp( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon) { OSErr err = noErr; return err; } static pascal OSErr DoScript( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon) { DescType returned; OSErr err = noErr; long length; char *theScript, *ch, *c; int i; theScript = (char*) NewPtr(10); if(theScript == nil) { PrintError("Not enough memory"); goto _DoScript_Exit; } err = AEGetParamPtr( theAppleEvent, keyDirectObject, typeChar, &returned, theScript , 10, &length); DisposePtr(theScript); theScript = (char*) NewPtr(length + 1); if(theScript == nil) { PrintError("Not enough memory"); goto _DoScript_Exit; } err = AEGetParamPtr( theAppleEvent, keyDirectObject, typeChar, &returned, theScript , length, &length); if( err!= noErr) { PrintError( "Could not receive DoScript Command"); goto _DoScript_Exit; } theScript[length] = 0; // printf("%s\n", theScript); fflush(stdout); // get number of args, calculate argc argc = 1; ch = theScript; while( *ch != 0 ) { switch( *ch ) { case ' ': case '\t': ch++; break; case '"': argc++; ch++; while( *ch!='"' && *ch!=0 ) ch++; if( *ch == 0 ) { PrintError("Syntax Error in Script"); goto _DoScript_Exit; } ch++; break; default: argc++; while( *ch!=' ' && *ch!='\t' && *ch!=0 ) ch++; break; } } // Fill argv array argv = (char**)NewPtr( argc * sizeof( char* ) ); if( argv == nil ) { PrintError("Not enough memory"); goto _DoScript_Exit; } argv[0] = (char*) NewPtr( strlen( appName ) + 1 ); if( argv[0] == nil ) { PrintError("Not enough memory"); goto _DoScript_Exit; } strcpy( argv[0], appName ); ch = theScript; i=0; while( *ch != 0 && iname[i-k] = ppath[i]; file->name[0] = ppath[0] - k; /* and dirname */ ppath[0] = k; return( FullToFolder((StringPtr) ppath, &(file->vRefNum), &(file->parID))); } char *getFileName( fullPath *path ) { p2cstr( path->name ); return (char*) path->name; } static void SetUpMenus(void) { MenuHandle menu; DeleteMenu(1); InsertMenu(menu = NewMenu(1, "\p\024"), 0); AppendMenu(menu, "\pAbout...;(-"); AppendResMenu(menu, 'DRVR'); DeleteMenu(2); InsertMenu(menu = NewMenu(2, "\pFile"), 0); AppendMenu(menu, "\p(New/N;Open/O;Run/R;Save/S;Save As...;(-;Quit/Q"); DeleteMenu(3); InsertMenu(menu = NewMenu(3, "\pEdit"), 0); AppendMenu(menu, "\p(Undo/Z;(-;(Cut/X;(Copy/C;(Paste/V;(Clear"); DrawMenuBar(); } static void DoCommand(long mResult) { short theItem, theMenu; MenuHandle appleMenu; Str255 name; theItem = mResult & 65535L; theMenu = ((unsigned long)mResult) >> 16; switch (theMenu) { case 1: /* Apple */ switch(theItem) { case 1: PrintError( "%s\n %s", appName, LONGVERSION ); break; default:appleMenu = GetMenuHandle( 1); GetMenuItemText(appleMenu, theItem, name); OpenDeskAcc(name); break; } break; case 2: /* File */ switch(theItem) { case 1: break; case 2: { // Open file fullPath f; if( FindFile( &f ) == 0 ) { char** temp; int i; if( argc==0 ) { argc=1; argv=(char**)NewPtr(sizeof(char*)); if(argv==nil) { PrintError("Not enough memory"); exit(0); } argv[0] = (char*)NewPtr(strlen(appName)+1); strcpy(argv[0], appName ); } argc+=1; temp = (char**)NewPtr(argc * sizeof(char*)); for(i=0; i