1 #include <Controls.h>
2 #include <TextUtils.h>
3 #include <Menus.h>
4 #include <Errors.h>
5 #include <StandardFile.h>
6 #include <ToolUtils.h>
7 #include <Devices.h>
8 #include <Folders.h>
9 #include <Events.h>
10 #include <LowMem.h>
11 #include <Dialogs.h>
12 #include <MacMemory.h>
13 #include <Files.h>
14 #include <LowMem.h>
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <stdarg.h>
18 #include <Files.h>
19 #include <Fonts.h>
20 #include "filter.h"
21 #include <AppleEvents.h>
22 #include <AERegistry.h>
23 
24 
25 
26 static  AEEventHandlerUPP	OAPPHandlerUPP, ODOCHandlerUPP, PDOCHandlerUPP,
27 							QUITHandlerUPP, DOSCHandlerUPP;
28 
29 
30 
31 static void			EventInit( void );
32 static pascal OSErr	DoOpenApp( AppleEvent *theAppleEvent,AppleEvent *reply, long refCon);
33 static pascal OSErr	DoOpenDoc( AppleEvent *theAppleEvent,AppleEvent *reply, long refCon);
34 static pascal OSErr	DoScript(  AppleEvent *theAppleEvent,AppleEvent *reply, long refCon);
35 static void 		SetUpMenus(void);
36 static void 		DoCommand(long mResult);
37 
38 static OSErr		GotRequiredParams( AppleEvent *appleEventPtr );
39 static int 			FullToFolder(StringPtr name, short *volume, long *folder);
40 
41 
42 
43 // Globals
44 
45 static Boolean 		gDone = false;
46 
47 static QDGlobals 	qd;
48 static int 			argc;
49 static char 		**argv, appName[64];
50 
ccommand(char *** argvPtr)51 int ccommand( char ***argvPtr)
52 {
53 	int 					i;
54 	EventRecord				event;
55 	OSErr 					myErr = noErr;
56 	fullPath				app;
57 	Point					thePoint;
58 	short 					thePart;
59 	WindowPtr 				whichWindow;
60 	unsigned char 			theChar;
61 
62 
63 	InitGraf(&qd.thePort);
64 	InitFonts();
65 	InitWindows();
66 	InitMenus();
67 	FlushEvents(everyEvent,0);
68 	TEInit();
69 	InitDialogs( nil );
70 	InitCursor();
71 	MaxApplZone();
72 
73 	for(i=0; i<10; i++)
74 		MoreMasters();
75 
76 	setLibToResFile();
77 
78 	if( makePathToHost ( &app ) == 0 )
79 	{
80 		p2cstr( app.name );
81 		strcpy( appName, (char*)app.name);
82 	}
83 	else
84 		strcpy( appName, "dummy");
85 
86 
87 
88 	EventInit();
89 	SetUpMenus();
90 
91 	argc = 0; argv = nil;
92 
93 
94 	while( !gDone )
95 	{
96 		if ( WaitNextEvent ( everyEvent, &event, 20L, nil) )
97 		{
98 			switch ( event.what )
99 			{
100 				case	kHighLevelEvent:
101 					AEProcessAppleEvent( &event );
102 					break;
103 				case mouseDown:
104 					thePoint = event.where;
105 					switch (thePart = FindWindow(thePoint, &whichWindow))
106 					{
107 						case inSysWindow:
108 	  						SystemClick(&event, whichWindow);
109 	  						break;
110 
111 						case inMenuBar:
112 	  						DoCommand(MenuSelect(thePoint));
113 	  						break;
114 					}
115 					break;
116 				case keyDown:
117       			case autoKey:
118 					theChar = (unsigned char)BitAnd(event.message, charCodeMask);
119 					if (BitAnd(event.modifiers, cmdKey) != 0)
120 	  						DoCommand(MenuKey(theChar));
121 					break;
122 			}
123 		}
124 	}
125 
126 	*argvPtr = argv;
127 	return argc;
128 }
129 
130 
131 
EventInit(void)132 static void	EventInit( void )
133 {
134 	OSErr	err;
135 	OAPPHandlerUPP = NewAEEventHandlerProc(DoOpenApp);
136 	err = AEInstallEventHandler ( kCoreEventClass, kAEOpenApplication, OAPPHandlerUPP, 0L, false );
137 
138 	ODOCHandlerUPP = NewAEEventHandlerProc(DoOpenDoc);
139 	if( err == noErr) err = AEInstallEventHandler ( kCoreEventClass, kAEOpenDocuments, ODOCHandlerUPP, 0L, false );
140 
141 	PDOCHandlerUPP = NewAEEventHandlerProc(DoOpenApp);
142 	if( err == noErr) err = AEInstallEventHandler ( kCoreEventClass, kAEPrintDocuments, PDOCHandlerUPP, 0L, false );
143 
144 	QUITHandlerUPP = NewAEEventHandlerProc(DoOpenApp);
145 	if( err == noErr) err = AEInstallEventHandler ( kCoreEventClass, kAEQuitApplication, QUITHandlerUPP, 0L, false );
146 
147 	DOSCHandlerUPP = NewAEEventHandlerProc(DoScript);
148 	if( err == noErr) err = AEInstallEventHandler ( kAEMiscStandards, kAEDoScript, DOSCHandlerUPP, 0L, false);
149 
150 	if( err != noErr) PrintError("Could not initialize AE Handler");
151 	return;
152 }
153 
DoOpenApp(AppleEvent * theAppleEvent,AppleEvent * reply,long refCon)154 static pascal OSErr	DoOpenApp( AppleEvent *theAppleEvent,
155 						AppleEvent *reply, long refCon)
156 {
157 	OSErr		err = noErr;
158 	return err;
159 }
160 
161 
DoScript(AppleEvent * theAppleEvent,AppleEvent * reply,long refCon)162 static pascal OSErr	DoScript( AppleEvent *theAppleEvent,
163 						AppleEvent *reply, long refCon)
164 {
165 	DescType	returned;
166 	OSErr		err = noErr;
167 	long		length;
168 	char 		*theScript, *ch, *c;
169 	int			i;
170 
171 	theScript = (char*) NewPtr(10);
172 	if(theScript == nil)
173 	{
174 		PrintError("Not enough memory");
175 		goto _DoScript_Exit;
176 	}
177 	err = AEGetParamPtr( theAppleEvent, keyDirectObject,
178 						typeChar, &returned,  theScript , 10, &length);
179 
180 	DisposePtr(theScript);
181 	theScript = (char*) NewPtr(length + 1);
182 	if(theScript == nil)
183 	{
184 		PrintError("Not enough memory");
185 		goto _DoScript_Exit;
186 	}
187 
188 	err = AEGetParamPtr( theAppleEvent, keyDirectObject,
189 						typeChar, &returned,  theScript , length, &length);
190 
191 	if( err!= noErr)
192 	{
193 		PrintError( "Could not receive DoScript Command");
194 		goto _DoScript_Exit;
195 	}
196 	theScript[length] = 0;
197 	// printf("%s\n", theScript); fflush(stdout);
198 
199 	// get number of args, calculate argc
200 
201 	argc = 1; ch = theScript;
202 
203 	while( *ch != 0 )
204 	{
205 		switch( *ch )
206 		{
207 			case ' ':
208 			case '\t': 	ch++;
209 						break;
210 			case '"': 	argc++; ch++;
211 						while( *ch!='"' && *ch!=0 ) ch++;
212 						if( *ch == 0 )
213 						{
214 							PrintError("Syntax Error in Script");
215 							goto _DoScript_Exit;
216 						}
217 						ch++;
218 						break;
219 			default:	argc++; while( *ch!=' ' && *ch!='\t' && *ch!=0 ) ch++;
220 			 			break;
221 		}
222 	}
223 
224 	// Fill argv array
225 
226 	argv = (char**)NewPtr( argc * sizeof( char* ) );
227 	if( argv == nil )
228 	{
229 		PrintError("Not enough memory");
230 		goto _DoScript_Exit;
231 	}
232 
233 	argv[0] = (char*) NewPtr( strlen( appName ) + 1 );
234 	if( argv[0] == nil )
235 	{
236 		PrintError("Not enough memory");
237 		goto _DoScript_Exit;
238 	}
239 	strcpy( argv[0], appName );
240 
241 	ch = theScript; i=0;
242 
243 	while( *ch != 0 && i<argc )
244 	{
245 		switch( *ch )
246 		{
247 			case ' ':
248 			case '\t': 	ch++;
249 						break;
250 			case '"': 	i++; ch++; c = ch;
251 						while( *c!='"' && *c!=0 ) c++;
252 						argv[i] = (char*) NewPtr( c-ch+1 );
253 						if( argv[i] == nil )
254 						{
255 							PrintError("Not enough memory");
256 							goto _DoScript_Exit;
257 						}
258 						c=argv[i];
259 						while(*ch!='"') *c++=*ch++;
260 						*c=0; ch++;
261 						break;
262 			default:	i++; c = ch;
263 						while( *c!=' ' && *c!='\t' && *c!=0 ) c++;
264 						argv[i] = (char*) NewPtr( c-ch+1 );
265 						if( argv[i] == nil )
266 						{
267 							PrintError("Not enough memory");
268 							goto _DoScript_Exit;
269 						}
270 						c=argv[i];
271 						while(*ch!=' ' && *ch!='\t' && *ch!=0 ) *c++=*ch++;
272 						*c=0;
273 						break;
274 		}
275 	}
276 
277 _DoScript_Exit:
278 
279 	gDone = true;
280 	DisposePtr( theScript );
281 
282 	return err;
283 }
284 
285 
286 
DoOpenDoc(AppleEvent * theAppleEvent,AppleEvent * reply,long refCon)287 static pascal OSErr	DoOpenDoc( AppleEvent *theAppleEvent,
288 						AppleEvent *reply, long refCon)
289 {
290 	AEDescList			fileSpecList;
291 	OSErr				err = noErr;
292 	DescType			type;
293 	Size				actual;
294 	AEKeyword			keyword;
295 	int					i;
296 	long				numFiles=0;
297 	FSSpec f;
298 
299 
300 	err = AEGetParamDesc( theAppleEvent, keyDirectObject,
301 						typeAEList, &fileSpecList );
302 	if(err == noErr)
303 	{
304 		err = GotRequiredParams( theAppleEvent );
305 		if(err == noErr)
306 			{
307 				err = AECountItems( &fileSpecList, &numFiles );
308 			}
309 	}
310 	if(err != noErr)
311 	{
312 		PrintError("Error receiving ODOC AppleEvent");
313 		goto _ODOC_exit;
314 	}
315 
316 	argc = numFiles + 1;
317 
318 	// Fill argv array
319 
320 	argv = (char**)NewPtr( argc * sizeof( char* ) );
321 	if( argv == nil )
322 	{
323 		PrintError("Not enough memory");
324 		goto _ODOC_exit;
325 	}
326 
327 
328 	argv[0] = (char*) NewPtr( strlen( appName ) + 1 );
329 	if( argv[0] == nil )
330 	{
331 		PrintError("Not enough memory");
332 		goto _ODOC_exit;
333 	}
334 	strcpy( argv[0], appName );
335 
336 	for( i=1; i<argc; i++)
337 	{
338 		argv[i] = (char*) NewPtr( 256 );
339 		if( argv[i] == nil )
340 		{
341 			PrintError("Not enough memory");
342 			goto _ODOC_exit;
343 		}
344 		err = AEGetNthPtr( &fileSpecList, i,
345 				typeFSS, &keyword, &type, (Ptr)&f,
346 				sizeof(FSSpec), &actual);
347 
348 		if( err != noErr )
349 		{
350 			PrintError("Error processing file list");
351 			goto _ODOC_exit;
352 		}
353 
354 		if( FullPathtoString ( &f, argv[i]) )
355 		{
356 			PrintError("Error processing file list");
357 			goto _ODOC_exit;
358 		}
359 	}
360 
361 
362 _ODOC_exit:
363 	gDone = true;
364 	return err;
365 
366 }
367 
368 
GotRequiredParams(AppleEvent * appleEventPtr)369 static OSErr	GotRequiredParams( AppleEvent *appleEventPtr )
370 {
371 	DescType		returnedType;
372 	Size			actualSize;
373 	OSErr			err;
374 
375 	err = AEGetAttributePtr( appleEventPtr,
376 					keyMissedKeywordAttr, typeWildCard,
377 					&returnedType, nil, 0, &actualSize );
378 	if ( err == errAEDescNotFound )
379 			return(noErr);
380 	else if (err == noErr)
381 		return(errAEEventNotHandled);
382 	else
383 		return(err);
384 }
385 
386 
387 
FullToFolder(StringPtr name,short * volume,long * folder)388 static int FullToFolder(StringPtr name, short *volume, long *folder)
389 {	CInfoPBRec dirInfo; HVolumeParam hvp; short i;
390 	dirInfo.dirInfo.ioNamePtr = name;
391 	dirInfo.dirInfo.ioDrDirID = 0;
392 	dirInfo.dirInfo.ioVRefNum = 0;
393 	dirInfo.dirInfo.ioFDirIndex = 0;
394 	if (PBGetCatInfo (&dirInfo, 0) == noErr) {
395 		if (dirInfo.dirInfo.ioFlAttrib & 0x10) {
396 			*folder = dirInfo.dirInfo.ioDrDirID;
397 			hvp.ioNamePtr = name;
398 			for (i = 0; i < name[0]; i++)
399 				if (name[i+1] == ':')
400 					{ name[0] = i + 1; break; }
401 			hvp.ioVolIndex = -1;
402 			hvp.ioVRefNum = 0;
403 			PBHGetVInfo ((HParmBlkPtr)&hvp, 0);
404 			*volume = hvp.ioVRefNum;
405 		}
406 		else {	*volume = 0, *folder = 0; return -1; }
407 	}
408 	else if (dirInfo.dirInfo.ioResult == fnfErr
409 		 || dirInfo.dirInfo.ioResult == dirNFErr)
410 	{	dirInfo.dirInfo.ioNamePtr = (StringPtr)name;
411 		dirInfo.dirInfo.ioDrDirID = 0;
412 		dirInfo.dirInfo.ioVRefNum = 0;
413 		if (PBDirCreate((HParmBlkPtr)&dirInfo, false) == noErr) {
414 			*volume = dirInfo.dirInfo.ioVRefNum;
415 			*folder = dirInfo.dirInfo.ioDrDirID;
416 		}
417 		else {	*volume = 0, *folder = 0;
418 			return dirInfo.dirInfo.ioResult;
419 		}
420 	}
421 	else	{ *volume = 0, *folder = 0; return dirInfo.dirInfo.ioResult; }
422 	return noErr;
423 }
424 
425 
StringtoFullPath(fullPath * file,char * path)426 int StringtoFullPath(fullPath *file, char *path)
427 {
428 	unsigned char ppath[255];
429 	int i,k;
430 
431 	/* Make p string */
432 
433 	strcpy((char*)&(ppath[1]), path);
434 	*ppath = (unsigned char) strlen(path);
435 
436 	/* Get basename */
437 	k = 0;
438 	for(i = 0; i<= ppath[0]; i++)
439 		if(ppath[i] == ':') k=i;
440 	for(i=k; i  <= ppath[0]; i++)
441 		file->name[i-k] = ppath[i];
442 	file->name[0] = ppath[0] - k;
443 
444 	/* and dirname */
445 	ppath[0] = k;
446 
447 	return( FullToFolder((StringPtr) ppath, &(file->vRefNum), &(file->parID)));
448 
449 }
450 
451 
452 
453 
getFileName(fullPath * path)454 char *getFileName( fullPath *path )
455 {
456 	p2cstr( path->name );
457 	return (char*) path->name;
458 }
459 
SetUpMenus(void)460 static void SetUpMenus(void)
461 {
462 	MenuHandle menu;
463 
464 	DeleteMenu(1);
465 	InsertMenu(menu = NewMenu(1, "\p\024"), 0);
466 	AppendMenu(menu, "\pAbout...;(-");
467 	AppendResMenu(menu, 'DRVR');
468 	DeleteMenu(2);
469 	InsertMenu(menu = NewMenu(2, "\pFile"), 0);
470 	AppendMenu(menu, "\p(New/N;Open/O;Run/R;Save/S;Save As...;(-;Quit/Q");
471 	DeleteMenu(3);
472 	InsertMenu(menu = NewMenu(3, "\pEdit"), 0);
473 	AppendMenu(menu, "\p(Undo/Z;(-;(Cut/X;(Copy/C;(Paste/V;(Clear");
474 
475 	DrawMenuBar();
476 }
477 
478 
DoCommand(long mResult)479 static void 		DoCommand(long mResult)
480 {
481   short theItem, theMenu;
482   MenuHandle appleMenu;
483   Str255 name;
484 
485   theItem = mResult & 65535L;
486   theMenu = ((unsigned long)mResult) >> 16;
487 
488   switch (theMenu)
489   {
490 		case 1:		/*  Apple  */
491 			switch(theItem)
492 			{
493 				case 1: PrintError( "%s\n %s", appName, LONGVERSION );
494 						break;
495 				default:appleMenu = GetMenuHandle( 1);
496 						GetMenuItemText(appleMenu, theItem, name);
497 						OpenDeskAcc(name);
498 						break;
499 			}
500 			break;
501 		case 2:		/*  File  */
502 			switch(theItem)
503 			{
504 				case 1: break;
505 				case 2: {	// Open file
506 							fullPath f;
507 
508 							if( FindFile( &f ) == 0 )
509 							{
510 								char** temp;
511 								int i;
512 								if( argc==0 )
513 								{
514 									argc=1;
515 									argv=(char**)NewPtr(sizeof(char*));
516 									if(argv==nil)
517 									{
518 										PrintError("Not enough memory");
519 										exit(0);
520 									}
521 									argv[0] = (char*)NewPtr(strlen(appName)+1);
522 									strcpy(argv[0], appName );
523 								}
524 								argc+=1;
525 								temp = (char**)NewPtr(argc * sizeof(char*));
526 								for(i=0; i<argc-1; i++)
527 									temp[i]=argv[i];
528 								temp[argc-1] = (char*) NewPtr( 256 );
529 								if( temp[argc-1] == nil )
530 								{
531 									PrintError("Not enough memory");
532 									exit(0);
533 								}
534 								if( FullPathtoString ( &f, temp[argc-1]) )
535 								{
536 									PrintError("Error processing file list");
537 									exit(0);
538 								}
539 								DisposePtr( (char*)argv );
540 								argv = temp;
541 							}
542 						}
543 						break;
544 				case 3:	// Run
545 						gDone = TRUE;
546 						break;
547 				case 4: // Save
548 				case 5: {// Save As...
549 							fullPath f;
550 
551 							if( SaveFileAs( &f, "Save Result As...", "Result" ) == 0 )
552 							{
553 								char** temp;
554 								int i;
555 								if( argc==0 )
556 								{
557 									argc=1;
558 									argv=(char**)NewPtr(sizeof(char*));
559 									if(argv==nil)
560 									{
561 										PrintError("Not enough memory");
562 										exit(0);
563 									}
564 									argv[0] = (char*)NewPtr(strlen(appName)+1);
565 									strcpy(argv[0], appName );
566 								}
567 								argc+=2;
568 								temp = (char**)NewPtr(argc * sizeof(char*));
569 								for(i=0; i<argc-2; i++)
570 									temp[i]=argv[i];
571 								temp[argc-2] = (char*) NewPtr( 3 );
572 								strcpy(temp[argc-2], "-o");
573 								temp[argc-1] = (char*) NewPtr( 256 );
574 								if( temp[argc-1] == nil )
575 								{
576 									PrintError("Not enough memory");
577 									exit(0);
578 								}
579 								if( FullPathtoString ( &f, temp[argc-1]) )
580 								{
581 									PrintError("Error processing file list");
582 									exit(0);
583 								}
584 								DisposePtr( (char*)argv );
585 								argv = temp;
586 							}
587 						}
588 						break;
589 
590 				case 7: exit(0);
591 						break;
592 			}
593 	}
594 	HiliteMenu(0);
595 }
596 
597