diff --git a/xpinstall/packager/mac/ASEncoder/rsrc/ASEncoder.rsrc b/xpinstall/packager/mac/ASEncoder/rsrc/ASEncoder.rsrc index 76f2f05c2334..739bd9f9fcfa 100644 Binary files a/xpinstall/packager/mac/ASEncoder/rsrc/ASEncoder.rsrc and b/xpinstall/packager/mac/ASEncoder/rsrc/ASEncoder.rsrc differ diff --git a/xpinstall/packager/mac/ASEncoder/src/ASEncoderUsage.script b/xpinstall/packager/mac/ASEncoder/src/ASEncoderUsage.script index 4c246a438326..6a03b9684360 100644 --- a/xpinstall/packager/mac/ASEncoder/src/ASEncoderUsage.script +++ b/xpinstall/packager/mac/ASEncoder/src/ASEncoderUsage.script @@ -49,24 +49,15 @@ on run set kTargetFile to "HD:genJS:ASEncoder" + set kTargetFolder to "HD:genJS" tell application "ASEncoder" activate -- pre-condition: kTargetFile is set to a local un-encoded (containing a res fork) file -- encode should succeed - set bSuccess to encode file kTargetFile - SUCCESS_MSG(kTargetFile, "encode", bSuccess) - -- encode should fail - set bSuccess to encode file kTargetFile - SUCCESS_MSG(kTargetFile, "encode", bSuccess) - - -- decode should succeed - set bSuccess to decode file kTargetFile - SUCCESS_MSG(kTargetFile, "decode", bSuccess) - --decode should fail - set bSuccess to decode file kTargetFile - SUCCESS_MSG(kTargetFile, "decode", bSuccess) + set bSuccess to encode file kTargetFolder + SUCCESS_MSG(kTargetFolder, "encode", bSuccess) -- post-condition: kTargetFile is a decoded (containing a res fork) file as it originally was diff --git a/xpinstall/packager/mac/ASEncoder/src/nsASEApp.cpp b/xpinstall/packager/mac/ASEncoder/src/nsASEApp.cpp index eb7759e5bef7..0f5ed244fb14 100644 --- a/xpinstall/packager/mac/ASEncoder/src/nsASEApp.cpp +++ b/xpinstall/packager/mac/ASEncoder/src/nsASEApp.cpp @@ -29,6 +29,7 @@ #include "nsEventHandler.h" #include "nsAppleSingleEncoder.h" #include "nsAppleSingleDecoder.h" +#include "MoreFilesExtras.h" Boolean gDone; @@ -77,8 +78,9 @@ EncodeEvent(AppleEvent *appEvent, AppleEvent *reply, SInt32 handlerRefCon) { OSErr err = noErr; FSSpec param; - Boolean result = false; + Boolean result = false, isDir = false; AEDesc fileDesc; + long dummy; // extract FSSpec from params err = AEGetParamDesc(appEvent, keyDirectObject, typeFSS, &fileDesc); @@ -91,15 +93,26 @@ EncodeEvent(AppleEvent *appEvent, AppleEvent *reply, SInt32 handlerRefCon) if (err != noErr) goto reply; - // check if given file has res fork (takes care of existence check) - if (nsAppleSingleEncoder::HasResourceFork(¶m)) + FSpGetDirectoryID(¶m, &dummy, &isDir); + + // if folder recursively traverse and encode contents + if (isDir) { - // encode given file nsAppleSingleEncoder encoder; - err = encoder.Encode(¶m); + err = encoder.EncodeFolder(¶m); } else - err = -1; // so that result boolean is set to false + { + // it's a file not a folder so proceed as usual + + // check if given file has res fork (takes care of existence check) + if (nsAppleSingleEncoder::HasResourceFork(¶m)) + { + // encode given file + nsAppleSingleEncoder encoder; + err = encoder.Encode(¶m); + } + } // if noErr thus far if (err == noErr) @@ -112,10 +125,8 @@ reply: // package reply AEPutParamPtr(reply, keyDirectObject, typeBoolean, &result, sizeof(result)); - // set err to noErr -- boolean takes care of failures - err = noErr; - - return err; + // boolean takes care of failures + return noErr; } pascal OSErr @@ -123,8 +134,9 @@ DecodeEvent(AppleEvent *appEvent, AppleEvent *reply, SInt32 handlerRefCon) { OSErr err = noErr; FSSpec param, outFile; - Boolean result = false; + Boolean result = false, isDir = false; AEDesc fileDesc; + long dummy; // extract FSSpec from params err = AEGetParamDesc(appEvent, keyDirectObject, typeFSS, &fileDesc); @@ -136,16 +148,27 @@ DecodeEvent(AppleEvent *appEvent, AppleEvent *reply, SInt32 handlerRefCon) err = nsASEApp::GotRequiredParams(appEvent); if (err != noErr) goto reply; - - // check if given file is in AS format (takes care of existence check) - if (nsAppleSingleDecoder::IsAppleSingleFile(¶m)) + + FSpGetDirectoryID(¶m, &dummy, &isDir); + + // if folder recursively traverse and encode contents + if (isDir) { - // decode given file nsAppleSingleDecoder decoder; - err = decoder.Decode(¶m, &outFile); + err = decoder.DecodeFolder(¶m); } else - err = -1; // so that result boolean is set to false + { + // it's a file not a folder so proceed as usual + + // check if given file is in AS format (takes care of existence check) + if (nsAppleSingleDecoder::IsAppleSingleFile(¶m)) + { + // decode given file + nsAppleSingleDecoder decoder; + err = decoder.Decode(¶m, &outFile); + } + } // if noErr thus far if (err == noErr) @@ -158,10 +181,8 @@ reply: // package reply AEPutParamPtr(reply, keyDirectObject, typeBoolean, &result, sizeof(result)); - // set err to noErr -- boolean takes care of failures - err = noErr; - - return err; + // boolean takes care of failures + return noErr; } pascal OSErr diff --git a/xpinstall/packager/mac/ASEncoder/src/nsASEApp.h b/xpinstall/packager/mac/ASEncoder/src/nsASEApp.h index 9fc98fdba522..034d3a8dc2ac 100644 --- a/xpinstall/packager/mac/ASEncoder/src/nsASEApp.h +++ b/xpinstall/packager/mac/ASEncoder/src/nsASEApp.h @@ -72,7 +72,9 @@ extern Boolean gDone; #define rMenuFile 129 #define rMenuItemASEncode 1 #define rMenuItemASDecode 2 -#define rMenuItemQuit 4 +#define rMenuItemASEncodeFolder 3 +#define rMenuItemASDecodeFolder 4 +#define rMenuItemQuit 6 #define rMenuEdit 130 #define rAboutBox 129 diff --git a/xpinstall/packager/mac/ASEncoder/src/nsAppleSingleEncoder.cpp b/xpinstall/packager/mac/ASEncoder/src/nsAppleSingleEncoder.cpp index d4526bd5eaa9..90e16fe1b8f2 100644 --- a/xpinstall/packager/mac/ASEncoder/src/nsAppleSingleEncoder.cpp +++ b/xpinstall/packager/mac/ASEncoder/src/nsAppleSingleEncoder.cpp @@ -28,6 +28,8 @@ #include #include #include "nsAppleSingleDecoder.h" /* AppleSingle struct definitions */ +#include "MoreFilesExtras.h" +#include "IterateDirectory.h" nsAppleSingleEncoder::nsAppleSingleEncoder() { @@ -117,6 +119,79 @@ nsAppleSingleEncoder::Encode(FSSpecPtr aInFile, FSSpecPtr aOutFile) return err; } +pascal void +EncodeDirIterateFilter(const CInfoPBRec * const cpbPtr, Boolean *quitFlag, void *yourDataPtr) +{ + OSErr err = noErr; + FSSpec currFSp; + nsAppleSingleEncoder* thisObj = NULL; + Boolean isDir = false; + long dummy; + + // param check + if (!yourDataPtr || !cpbPtr || !quitFlag) + return; + + *quitFlag = false; + + // extract 'this' -- an nsAppleSingleEncoder instance + thisObj = (nsAppleSingleEncoder*) yourDataPtr; + thisObj->ReInit(); + + // make an FSSpec from the CInfoPBRec* + err = FSMakeFSSpec(cpbPtr->hFileInfo.ioVRefNum, cpbPtr->hFileInfo.ioFlParID, + cpbPtr->hFileInfo.ioNamePtr, &currFSp); + if (err == noErr) + { + FSpGetDirectoryID(&currFSp, &dummy, &isDir); + + // if current FSSpec is file + if (!isDir) + { + // if file has res fork + if (nsAppleSingleEncoder::HasResourceFork(&currFSp)) + { + // encode file + thisObj->Encode(&currFSp); + } + } + else + { + // else if current FSSpec is folder ignore + // XXX never reached? + return; + } + } +} + +OSErr +nsAppleSingleEncoder::EncodeFolder(FSSpecPtr aFolder) +{ + OSErr err = noErr; + long dummy; + Boolean isDir = false; + + // check that FSSpec is folder + if (aFolder) + { + FSpGetDirectoryID(aFolder, &dummy, &isDir); + if (!isDir) + return dirNFErr; + } + + // recursively enumerate contents of folder (maxLevels=0 means recurse all) + FSpIterateDirectory(aFolder, 0, EncodeDirIterateFilter, (void*)this); + + return err; +} + +void +nsAppleSingleEncoder::ReInit() +{ + mInFile = NULL; + mOutFile = NULL; +} + OSErr nsAppleSingleEncoder::WriteHeader() { diff --git a/xpinstall/packager/mac/ASEncoder/src/nsAppleSingleEncoder.h b/xpinstall/packager/mac/ASEncoder/src/nsAppleSingleEncoder.h index 21603b65bad9..cea151119c1a 100644 --- a/xpinstall/packager/mac/ASEncoder/src/nsAppleSingleEncoder.h +++ b/xpinstall/packager/mac/ASEncoder/src/nsAppleSingleEncoder.h @@ -45,6 +45,8 @@ public: static Boolean HasResourceFork(FSSpecPtr aFile); OSErr Encode(FSSpecPtr aFile); OSErr Encode(FSSpecPtr aInFile, FSSpecPtr aOutFile); + OSErr EncodeFolder(FSSpecPtr aFolder); + void ReInit(); static OSErr FSpGetCatInfo(CInfoPBRec *pb, FSSpecPtr aFile); diff --git a/xpinstall/packager/mac/ASEncoder/src/nsEventHandler.cpp b/xpinstall/packager/mac/ASEncoder/src/nsEventHandler.cpp index aef596926900..792afa6ac346 100644 --- a/xpinstall/packager/mac/ASEncoder/src/nsEventHandler.cpp +++ b/xpinstall/packager/mac/ASEncoder/src/nsEventHandler.cpp @@ -138,6 +138,20 @@ nsEventHandler::HandleKeyDown() menuChoice |= rMenuItemASDecode; break; + case 'F': + case 'f': + menuChoice = rMenuFile; + menuChoice <<= 16; + menuChoice |= rMenuItemASEncodeFolder; + break; + + case 'O': + case 'o': + menuChoice = rMenuFile; + menuChoice <<= 16; + menuChoice |= rMenuItemASDecodeFolder; + break; + case 'Q': case 'q': menuChoice = rMenuFile; @@ -213,7 +227,25 @@ nsEventHandler::HandleMenuChoice(SInt32 aChoice) } } break; - + + case rMenuItemASEncodeFolder: /* AS Encode Folder... */ + err = selector.SelectFolder(&file); + if (err == noErr) + { + nsAppleSingleEncoder encoder; + err = encoder.EncodeFolder(&file); + } + break; + + case rMenuItemASDecodeFolder: /* AS Decode Folder... */ + err = selector.SelectFolder(&file); + if (err == noErr) + { + nsAppleSingleDecoder decoder; + err = decoder.DecodeFolder(&file); + } + break; + case rMenuItemQuit: /* Quit */ nsASEApp::SetCompletionStatus(true); break;