DIRECTORY Commander USING [CommandProc, Register], CommanderOps, Convert USING [CardFromRope, Error], IO, PFS, PFSClass, PFSPrefixMap, PFSNames, Rope, UserProfile USING [Token], XNSRemoteFileDeserialize; XNSFileCommandsImpl: CEDAR PROGRAM IMPORTS Commander, CommanderOps, Convert, IO, PFS, PFSClass, PFSPrefixMap, PFSNames, Rope, UserProfile, XNSRemoteFileDeserialize ~ BEGIN ROPE: TYPE ~ Rope.ROPE; STREAM: TYPE ~ IO.STREAM; PATH: TYPE ~ PFSNames.PATH; ChangeFileType: Commander.CommandProc = { fileName: ROPE ฌ CommanderOps.NextArgument[cmd]; arg: ROPE; newFileType: CARD32; fs: PFSClass.FSHandle; nameOnFS: PATH; attributes: PFS.CreateOptions; openFile: PFS.OpenFile; IF fileName = NIL THEN { msg ฌ "No fileName supplied\n"; GOTO failed; }; IF ( arg ฌ CommanderOps.NextArgument[cmd] ) = NIL THEN { msg ฌ "No newFileType supplied\n"; GOTO failed; }; IF arg.Fetch[0] = 't THEN { SELECT TRUE FROM arg.Equal["tUnspecified", FALSE] => newFileType ฌ 0; arg.Equal["tDirectory", FALSE] => newFileType ฌ 1; arg.Equal["tText", FALSE] => newFileType ฌ 2; ENDCASE => { msg ฌ IO.PutFR1["Unknown filetype (%g) supplied\n", [rope[arg]]]; GOTO failed; }; } ELSE { ok: BOOL ฌ TRUE; newFileType ฌ Convert.CardFromRope[arg ! Convert.Error => { ok ฌ FALSE; CONTINUE} ]; IF NOT ok THEN { msg ฌ IO.PutFR1["Could not parse (%g) as a cardinal\n", [rope[arg]] ]; GOTO failed; }; }; msg ฌ ServerAndStuff[fileName].err; IF msg # NIL THEN GOTO failed; attributes.fileType ฌ [newFileType]; openFile ฌ PFS.Open[PFS.PathFromRope[fileName]]; PFS.SetAttributes[openFile, attributes]; PFS.Close[openFile]; EXITS failed=> result ฌ $Failure; }; PrintFileType: Commander.CommandProc = { fileName: ROPE ฌ CommanderOps.NextArgument[cmd]; arg: ROPE; fileType: CARD32; fs: PFSClass.FSHandle; nameOnFS: PATH; attributes: PFS.CreateOptions; openFile: PFS.OpenFile; IF fileName = NIL THEN { msg ฌ "No fileName supplied\n"; GOTO failed; }; msg ฌ ServerAndStuff[fileName].err; IF msg # NIL THEN GOTO failed; openFile ฌ PFS.Open[PFS.PathFromRope[fileName]]; fileType ฌ PFS.GetInfo[openFile].fileType; IO.PutF1[cmd.out, "type is %g.\n", IO.card[fileType]]; PFS.Close[openFile]; EXITS failed=> result ฌ $Failure; }; Deserialize: Commander.CommandProc = { desDir, arrow, server, directory, source: ROPE ฌ NIL; destinationDirectory, fileName, nameOnFS: PATH; sourceStr: STREAM; arg: ROPE; fs: PFSClass.FSHandle; arg ฌ CommanderOps.NextArgument[cmd]; IF arg = NIL THEN { msg ฌ "No arguments\n"; GOTO Die }; arrow ฌ CommanderOps.NextArgument[cmd]; IF arrow = NIL THEN { desDir ฌ UserProfile.Token["XNSMail.DeserializeDir", NIL]; IF ( desDir = NIL ) THEN { msg ฌ "No destination directory supplied\n"; GOTO Die; }; source ฌ arg; } ELSE { desDir ฌ arg; IF NOT arrow.Equal["_"] THEN { msg ฌ IO.PutFR1["Expected a _ but saw a %g\n", [rope[arrow]] ]; GOTO Die; }; IF ( source ฌ CommanderOps.NextArgument[cmd] ) = NIL THEN { msg ฌ "No source name after _\n"; GOTO Die; }; }; destinationDirectory ฌ PFS.PathFromRope[desDir]; IF NOT PFSNames.IsADirectory[destinationDirectory] THEN { msg ฌ IO.PutFR1["%g is not a directory\n", [rope[desDir]] ]; GOTO Die; }; fileName ฌ PFSNames.ExpandName[name: PFS.PathFromRope[source], wDir: PFS.GetWDir[] ]; [fs, nameOnFS, msg] ฌ ServerAndStuff[desDir]; IF msg # NIL THEN GOTO Die; BEGIN ENABLE UNWIND => { sourceStr.Close[] }; sourceStr ฌ PFS.StreamOpen[fileName]; XNSRemoteFileDeserialize.XNSDeserialize[fs, nameOnFS, sourceStr, NIL]; END; sourceStr.Close[]; cmd.out.PutF["\n%g has been deserialized to %g\n", [rope[PFS.RopeFromPath[fileName]]], [rope[PFS.RopeFromPath[destinationDirectory]]] ]; EXITS Die => result ฌ $Failure; }; ServerAndStuff: PROC[fileName: ROPE] RETURNS[ fs: PFSClass.FSHandle, nameOnFS: PATH, err: ROPE ฌ NIL ] = { translation: PFSPrefixMap.PrefixTableEntry ฌ PFSPrefixMap.TranslateAndGetHints[PFS.PathFromRope[fileName]]; IF NOT translation.translation.IsAbsolute[] THEN { err ฌ Rope.Cat["The prefix map produced a relative translation for ", fileName, " and an absolute translation is required."]; RETURN }; fs ฌ PFSClass.GetFS[translation.fsName ! PFSClass.Error => { err ฌ msg; CONTINUE } ]; IF fs # NIL THEN IF fs.flavor # $XNS THEN err ฌ IO.PutFR1["Wrong flavor of file (%g) - not XNS\n", [atom[fs.flavor]] ]; nameOnFS ฌ translation.nameOnFS; }; cftDoc: ROPE ~ "fileName { tUnspecified tDirectory tText } | fileName newType(as number)"; deserializeDoc: ROPE ~ "directory _ serialized-fileName | serialized-fileName (uses profile option XNSMail.DeserializeDir as the destination directory)"; pftDoc: ROPE ~ "fileName"; Init: PROC = { Commander.Register["ChangeFileType", ChangeFileType, cftDoc]; Commander.Register["Deserialize", Deserialize, deserializeDoc]; Commander.Register["PrintFileType", PrintFileType, pftDoc]; }; Init[]; END. .. T XNSFileCommandsImpl.mesa Copyright ำ 1990, 1992 by Xerox Corporation. All rights reserved. Willie-s, January 31, 1992 5:51 pm PST Weiser, March 31, 1991 5:47 pm PST Copied Types and Constants [cmd: Handle] RETURNS [result: REF _ NIL, msg: ROPE _ NIL] CommandObject = [in, out, err: STREAM, commandLine, command: ROPE, ...] [cmd: Handle] RETURNS [result: REF _ NIL, msg: ROPE _ NIL] CommandObject = [in, out, err: STREAM, commandLine, command: ROPE, ...] [cmd: Handle] RETURNS [result: REF _ NIL, msg: ROPE _ NIL] CommandObject = [in, out, err: STREAM, commandLine, command: ROPE, ...] สุ–(cedarcode) style•NewlineDelimiter ™šœ™Jšœ ฯeœ7™BJ™&J™"J™—codešฯk ˜ Kšœ žœ˜(K˜ Kšœžœ˜$Kšžœ˜Kšžœ˜K˜ K˜ K˜ Kšœ˜Kšœ žœ ˜Kšœ˜K˜—šฯnœžœž˜"Kšžœ#žœžœO˜€Kšœž˜—K™head™Kšžœžœžœ˜Kšžœžœžœžœ˜Kšžœžœ žœ˜K˜—šŸœ˜)š œžœ žœžœžœžœ™:Kšœžœžœ™G—Kšœ žœ"˜0Kšœžœ˜ Kšœ žœ˜K˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ ˜šžœ žœžœ˜K˜Kšžœ˜ K˜—šžœ,žœžœ˜8K˜"Kšžœ˜ K˜K˜—šžœžœ˜šžœžœž˜Kšœžœ˜4Kšœžœ˜2Kšœžœ˜-šžœ˜ Kšœžœ9˜AKšžœ˜ K˜——K˜šžœ˜Kšœžœžœ˜KšœAžœžœ˜Tšžœžœžœ˜Kšœžœ>˜FKšžœ˜ K˜—Kšœ˜——K˜#Kšžœžœžœžœ˜K˜$Kšœ žœžœ˜0Kšžœ%˜(Kšžœ˜K˜šž˜K˜—K˜K˜K˜—šŸ œ˜(š œžœ žœžœžœžœ™:Kšœžœžœ™G—Kšœ žœ"˜0Kšœžœ˜ Kšœ žœ˜K˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ ˜šžœ žœžœ˜K˜Kšžœ˜ K˜—K˜K˜#Kšžœžœžœžœ˜Kšœ žœžœ˜0Kšœžœžœ˜*Kšžœ!žœ˜6Kšžœ˜K˜šž˜K˜—K˜K˜K˜K˜—šŸ œ˜&š œžœ žœžœžœžœ™:Kšœžœžœ™G—Kšœ*žœžœ˜5Kšœ*žœ˜/Kšœ žœ˜Kšœžœ˜ Kšœ˜K˜K˜%Kšžœžœžœžœ˜7K˜'šžœ žœžœ˜Kšœ5žœ˜:šžœ žœžœž˜K˜,Kšžœ˜ K˜—K˜ K˜šžœ˜K˜ šžœžœžœ˜Kšœžœ7˜?Kšžœ˜ K˜—šžœ/žœžœž˜;K˜!Kšžœ˜ K˜—K˜——K˜Kšœžœ˜0šžœžœ-žœ˜9Kšœžœ4˜