| #include <u.h> |
| #include <stdio.h> |
| #include <Carbon/Carbon.h> |
| |
| AUTOFRAMEWORK(Carbon) |
| |
| static OSErr Handler(const AppleEvent *event, AppleEvent *reply, long handlerRefcon); |
| |
| int |
| main(void) |
| { |
| AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, Handler, 0, false); |
| RunApplicationEventLoop(); |
| return 0; |
| } |
| |
| static OSErr |
| GetFullPathname(FSSpec *fss, char *path, int len) |
| { |
| FSRef fsr; |
| OSErr err; |
| |
| *path = '\0'; |
| err = FSpMakeFSRef(fss, &fsr); |
| if (err == fnfErr) { |
| /* FSSpecs can point to non-existing files, fsrefs can't. */ |
| FSSpec fss2; |
| int tocopy; |
| |
| err = FSMakeFSSpec(fss->vRefNum, fss->parID, |
| (unsigned char*)"", &fss2); |
| if (err) |
| return err; |
| err = FSpMakeFSRef(&fss2, &fsr); |
| if (err) |
| return err; |
| err = (OSErr)FSRefMakePath(&fsr, (unsigned char*)path, len-1); |
| if (err) |
| return err; |
| /* This part is not 100% safe: we append the filename part, but |
| ** I'm not sure that we don't run afoul of the various 8bit |
| ** encodings here. Will have to look this up at some point... |
| */ |
| strcat(path, "/"); |
| tocopy = fss->name[0]; |
| if ((strlen(path) + tocopy) >= len) |
| tocopy = len - strlen(path) - 1; |
| if (tocopy > 0) |
| strncat(path, (char*)fss->name+1, tocopy); |
| } |
| else { |
| if (err) |
| return err; |
| err = (OSErr)FSRefMakePath(&fsr, (unsigned char*)path, len); |
| if (err) |
| return err; |
| } |
| return 0; |
| } |
| |
| static void |
| chk(int err) |
| { |
| if(err != 0) { |
| printf("err %d\n", err); |
| exit(1); |
| } |
| } |
| |
| static OSErr |
| Handler(const AppleEvent *event, AppleEvent *reply, long handlerRefcon) |
| { |
| AEDesc list; |
| DescType type; |
| FSSpec f; |
| AEKeyword keyword; |
| Size actual; |
| long len; |
| char s[1000]; |
| |
| chk(AEGetParamDesc(event, keyDirectObject, typeAEList, &list)); |
| chk(AECountItems(&list, &len)); |
| chk(AEGetNthPtr(&list, 1, typeFSS, &keyword, &type, (Ptr*)&f, sizeof(FSSpec), &actual)); |
| chk(GetFullPathname(&f, s, sizeof s)); |
| printf("%s\n", s); |
| fflush(stdout); |
| |
| // uncomment to keep handling more open events |
| exit(0); |
| } |