<<>> <> <> <> <> <> <> <> <> DIRECTORY AccessCH USING [Problem], AdobeCommon USING [--ChangeSystem, DataHandle, FreeHintStrings, GetDataSW, GetDescList, --Handle, InitialSetStatus--, LockedSysDescPtr--, PostMessage, ReportFields, ReportFieldsSeq, SetStatus--, StringArray--], <> AdobeOps USING [ARNumber, ARSystemHandle--, DefaultInfoObject--, FieldList, nilARNumber, QLHandle, QueryList, SetOfARs, ToolType, UserOrderSequence, UserSpecifiedOrder], <> AdobeP75V2, AdobeToolContext, ARAccess, Ascii USING [NUL], BasicTime USING [GMT], Convert USING [CardFromRope, RopeFromTime], <> IO USING [Close, EndOf, GetChar, PutChar, STREAM], <> <> CmFile USING [ Close, Error, FindSection, FreeString, Handle, NextItem, Open], CrRPC USING [BulkDataSink], <> PFS USING [Delete, PathFromRope, StreamOpen], <> Rope USING [Cat, Concat, Equal, Fetch, Length, Substr, ROPE], <> <> <> <> <> Token USING [ Alphabetic, AlphaNumeric, Brackets, Decimal, Filtered, FilterProcType, FreeTokenString, FreeStringHandle, Line, MaybeQuoted, NonWhiteSpace, Handle, StringToHandle, SyntaxError], XNSAdobeClientOps USING [GetSystemDefaultUserFile, StubError, UnknownAddress]; --Window USING [Handle, Place]; AdobeCommonImplE: CEDAR PROGRAM IMPORTS AccessCH, AdobeCommon, --AdobeCommonInternal, AdobeOps, AdobeServer, AdobeToolContext, ARAccess, Convert--, MFile, MStream--, CmFile, IO, PFS --Put, --, Rope--Stream, --String--, Token, XNSAdobeClientOps EXPORTS AdobeCommon = BEGIN <> ValueSequencePtr: TYPE = REF ValueSequence; ValueSequence: TYPE = RECORD [ seq: SEQUENCE length: CARDINAL OF Rope.ROPE]; InvalidFieldName: SIGNAL = CODE; SyntaxError: SIGNAL = CODE; CatchErrors: PUBLIC PROCEDURE [ h: AdobeCommon.Handle, --item: FormSW.ItemHandle, index: CARDINAL, --windowData: AdobeCommon.DataHandle, --proc: PROC[h: AdobeCommon.Handle]] = { errorMessage: Rope.ROPE; BEGIN ENABLE { AccessCH.Problem => { SELECT type FROM noClearinghouse => errorMessage ¬ "Clearinghouse is unavailable."; authProblem => errorMessage ¬ "Authentication problem."; badDatabaseName => errorMessage ¬ "badDatabaseName."; badDatabaseFile => errorMessage ¬ "Can't open database file."; accessProblem => errorMessage ¬ "access problem in reaching clearinghouse."; ENDCASE => errorMessage ¬ "AccessCH.Problem"}; < {>> <> <>> <> <>> <> <>> <> < errorMessage _ "Invalid login.";>> < errorMessage _ "systemAlreadyExists."; -- should never happen>> < errorMessage _ "File not found.";>> <>> <> < errorMessage _ "Adobe server is down.";>> <>> <> < errorMessage _ "Courier timed out.";>> <>> <> <<"Parameter Inconsistency - this tool and the Adobe service aren't compatible!";>> < GOTO GetNewSystemDescription;>> < errorMessage _ "systemNotRegistered."; -- should never happen>> <>> <> < errorMessage _ "Unknown Adobe service problem.";>> < errorMessage _ "Too many connections to Adobe service. Try again later.";>> < errorMessage _ "Unexpected Adobe service problem.";>> <> ABORTED => {errorMessage ¬ "Aborted!"; GOTO ErrorExit}}; proc[h]; <> EXITS < {>> <> <> <> <> <<"This system description has become obsolete! "];>> <> <> <<"Retrieve new system description? Click to confirm."];>> <> <> <> <> <<"Retrieving new system description..."];>> <> <> ErrorExit => { AdobeCommon.PostMessage[h, TRUE, errorMessage]; h.isBusy ¬ FALSE}; END}; ReadTil: PROCEDURE [r: Rope.ROPE, currentIndex: CARD, c: CHAR] RETURNS [newIndex: CARD] ~ { i: INT; FOR i ¬ currentIndex + 1, i + 1 UNTIL i >= r.Length[] OR r.Fetch[i] = c DO ENDLOOP; RETURN[i]; }; AdobeTimeRope: PUBLIC PROCEDURE [time: BasicTime.GMT] RETURNS [timeRope: Rope.ROPE ¬ NIL] = { cedarTime: Rope.ROPE ¬ Convert.RopeFromTime[time, years, seconds, FALSE, FALSE, FALSE]; index, tmp: CARD ¬ 0; timeRope ¬ timeRope.Cat["-", Rope.Substr[cedarTime, index, 3], "-"]; index ¬ ReadTil[cedarTime, index, ' ] + 1; tmp ¬ ReadTil[cedarTime, index, ',] ; timeRope ¬ Rope.Concat[Rope.Substr[cedarTime, index, tmp - index], timeRope]; index ¬ tmp + 4; timeRope ¬ timeRope.Cat[Rope.Substr[cedarTime, index, 2], " "]; index ¬ index + 3; tmp ¬ ReadTil[cedarTime, index, 'X]; timeRope ¬ timeRope.Concat[Rope.Substr[cedarTime, index, tmp-index]]; }; SetFSWOrderAndDefaultFromUserFile: PUBLIC PROCEDURE [ systemName: Rope.ROPE, arSH: AdobeOps.ARSystemHandle, server: Rope.ROPE] = BEGIN fL: AdobeOps.FieldList ¬ arSH.fieldList; localName: Rope.ROPE ¬ GetLocalName[systemName]; userFile: Rope.ROPE ¬ localName; cmH: CmFile.Handle ¬ NIL; noUserFile: BOOLEAN ¬ FALSE; localName ¬ NIL; <> userFile ¬ ConvertToUserFileName[userFile]; userFile ¬ userFile.Concat[".user"]; <<[] _ String.AppendExtensionIfNeeded[>> <<@userFile, ".user", AdobeOps.z];>> <> cmH ¬ CmFile.Open[ userFile ! CmFile.Error => IF code = fileNotFound THEN { [cmH, noUserFile] ¬ GetUserFileFromService[ systemName, userFile]; IF noUserFile THEN CONTINUE ELSE RETRY}]; FOR tool: AdobeOps.ToolType IN AdobeOps.ToolType DO <> <> IF noUserFile THEN arSH.formSWOrderArray[tool] ¬ AllDisplayed[fL.length] ELSE arSH.formSWOrderArray[tool] ¬ SearchUserFileForDisplayed[ cmH, fL, tool]; ENDLOOP; <> IF ~noUserFile THEN { cmH ¬ CmFile.Close[cmH]; }; <> END; <<>> AllDisplayed: PROCEDURE [length: CARDINAL] RETURNS [formSWOrder: AdobeOps.UserSpecifiedOrder] = BEGIN ENABLE UNWIND => NULL; --AdobeOps.z.FREE[@formSWOrder]; formSWOrder ¬ NEW[AdobeOps .UserOrderSequence[length]]; FOR i: CARDINAL IN [0..length) DO formSWOrder[i] ¬ i; <> <> ENDLOOP; END; <<>> SearchUserFileForDisplayed: PROCEDURE [cmH: CmFile.Handle, fL: AdobeOps.FieldList, tool: AdobeOps.ToolType] RETURNS [formSWOrder: AdobeOps.UserSpecifiedOrder] = BEGIN toolNames: ARRAY AdobeOps.ToolType OF Rope.ROPE ¬ [ "Edit", "Submit", "Report", "Query", "Sort", "QueryList"]; isADefault: BOOLEAN ¬ FALSE; values: ValueSequencePtr ¬ NIL; name, value, default: Rope.ROPE ¬ NIL; TempOrderType: TYPE = RECORD [ index: CARDINAL ¬ 0, order: AdobeOps.UserSpecifiedOrder ¬ NIL]; tempOrder: TempOrderType ¬ []; incr: CARDINAL = 1; <<>> TruncateSequence: PROCEDURE [order: TempOrderType] RETURNS [formSWOrder: AdobeOps.UserSpecifiedOrder] = { IF tool # report THEN { formSWOrder ¬ NEW[ AdobeOps .UserOrderSequence[order.index]]; FOR i: CARDINAL IN [0..formSWOrder.length) DO formSWOrder[i] ¬ order.order[i]; ENDLOOP} ELSE { hasOrder: AdobeCommon.ReportFields ¬ NEW[ AdobeCommon .ReportFieldsSeq[order.order.length]]; reportCount: CARDINAL ¬ 0; FOR i: CARDINAL IN [0..hasOrder.length) DO hasOrder[i] ¬ FALSE; ENDLOOP; formSWOrder ¬ NEW[ AdobeOps .UserOrderSequence[order.order.length]]; FOR i: CARDINAL IN [0..order.order.length) DO IF order.order[i] # LAST[CARDINAL] THEN { formSWOrder[reportCount] ¬ order.order[i]; hasOrder[order.order[i]] ¬ TRUE; reportCount ¬ reportCount + 1}; ENDLOOP; FOR i: CARDINAL IN [0..order.order.length) DO IF ~hasOrder[i] THEN { formSWOrder[reportCount] ¬ i; reportCount ¬ reportCount + 1}; ENDLOOP; <> }; <> }; <<>> IF CmFile.FindSection[h: cmH, title: toolNames[tool]] THEN BEGIN ENABLE UNWIND => { <> name ¬ CmFile.FreeString[name]; value ¬ CmFile.FreeString[value]; IF values # NIL THEN { <> <> <> }}; tempOrder ¬ [ index: 0, order: NEW[AdobeOps .UserOrderSequence[fL.length]]]; IF tool = report THEN FOR i: CARDINAL IN [0..tempOrder.order.length) DO tempOrder.order[i] ¬ LAST[CARDINAL]; ENDLOOP; [name, value] ¬ CmFile.NextItem[h: cmH]; WHILE name # NIL DO fLIndex: CARDINAL ¬ FindFieldInFL[ name, fL ! InvalidFieldName => { <> <> <> <> name ¬ CmFile.FreeString[name]; value ¬ CmFile.FreeString[value]; [name, value] ¬ CmFile.NextItem[h: cmH]; LOOP}]; <> [fL[fLIndex].defaultInfo[tool].place, fL[fLIndex].defaultInfo[ tool].width, default] ¬ ParseValueToken[ value ! SyntaxError => { <> <> <> GOTO syntaxError}]; <> IF default # NIL THEN IF --there is no systemMust value -- (fL[fLIndex].defaultInfo[tool].default.Length = 0) THEN fL[fLIndex].defaultInfo[tool].default ¬ default ELSE {}; --AdobeOps.z.FREE[@default]; IF tool # report THEN { tempOrder.order[tempOrder.index] ¬ fLIndex; tempOrder.index ¬ tempOrder.index + incr} ELSE { IF fL[fLIndex].defaultInfo[tool].place.ord # 0 AND CARDINAL[fL[fLIndex].defaultInfo[tool].place.ord] <= fL.length THEN { tempOrder.order[fL[fLIndex].defaultInfo[tool].place.ord - 1] ¬ fLIndex; tempOrder.index ¬ tempOrder.index + incr}}; name ¬ CmFile.FreeString[name]; value ¬ CmFile.FreeString[value]; [name, value] ¬ CmFile.NextItem[h: cmH]; ENDLOOP; name ¬ CmFile.FreeString[name]; value ¬ CmFile.FreeString[value]; RETURN[TruncateSequence[tempOrder]] END ELSE RETURN[AllDisplayed[fL.length]]; EXITS syntaxError => RETURN[AllDisplayed[fL.length]]; END; <<>> <<>> <<<< Not Apparently used>> <> <> <> <> <> <>>> <<>> FindFieldInFL: PROCEDURE [name: Rope.ROPE, fL: AdobeOps.FieldList] RETURNS [index: CARDINAL] = BEGIN FOR i: CARDINAL IN [0..fL.length) DO IF Rope.Equal[name, fL[i].name] THEN RETURN[i]; ENDLOOP; ERROR InvalidFieldName; END; <<>> ParseValueToken: PROCEDURE [token: Rope.ROPE] RETURNS [ place: AdobeP75V2.Coordinate, width: CARDINAL, default: Rope.ROPE ¬ NIL] = BEGIN index: CARDINAL ¬ 0; labels: ARRAY [0..2) OF Rope.ROPE ¬ ["x", "y"]; sH: Token.Handle ¬ NIL; temp, string: Rope.ROPE ¬ NIL; thereIsADefault: BOOLEAN ¬ FALSE; <<>> MustBeBracketed: Token.FilterProcType = {RETURN[FALSE]}; <<>> <> IF (token.Length > 0) AND (token.Fetch[0] = '[) THEN BEGIN ENABLE UNWIND => { [] ¬ Token.FreeTokenString[string]; [] ¬ Token.FreeStringHandle[sH]; }; sH ¬ Token.StringToHandle[token]; <> string ¬ Token.MaybeQuoted[ sH, NIL, MustBeBracketed, Token.Brackets]; [place, width] ¬ GetXYFromString[ string ! Token.SyntaxError => ERROR SyntaxError]; string ¬ Token.FreeTokenString[string]; IF sH.break # Ascii.NUL THEN BEGIN temp ¬ Token.MaybeQuoted[sH, NIL, Token.Line]; default ¬ temp; <> temp ¬ Token.FreeTokenString[temp]; END; sH ¬ Token.FreeStringHandle[sH]; END ELSE ERROR SyntaxError; END; <<>> GetXYFromString: PROCEDURE [string: Rope.ROPE] RETURNS [place: AdobeP75V2.Coordinate, width: CARDINAL ¬ 0] = BEGIN temp: Rope.ROPE ¬ NIL; sh: Token.Handle ¬ Token.StringToHandle[string]; gotOne: BOOLEAN ¬ FALSE; <<>> Numeric: Token.FilterProcType = BEGIN RETURN[SELECT c FROM IN ['0..'9] => TRUE, ENDCASE => FALSE]; END; <<>> DO ENABLE UNWIND => { [] ¬ Token.FreeTokenString[temp]; [] ¬ Token.FreeStringHandle[sh]}; temp ¬ Token.Filtered[sh, NIL, Token.Alphabetic]; <<': was consumed and now is in sh.break>> IF sh.break = Ascii.NUL THEN EXIT; SELECT TRUE FROM Rope.Equal[temp, "x"] => place.ord ¬ Token.Decimal[h: sh]; Rope.Equal[temp, "y"] => BEGIN temp ¬ Token.FreeTokenString[temp]; temp ¬ Token.MaybeQuoted[ h: sh, data: NIL, filter: Token.AlphaNumeric]; IF temp.Length > 4 THEN BEGIN tempHandle: Token.Handle ¬ Token.StringToHandle[temp]; lineNumStr: Rope.ROPE ¬ Token.Filtered[ h: tempHandle, data: NIL, filter: Numeric, skip: nonToken]; place.co ¬ 2 --FormSW.line0-- - Convert.CardFromRope[lineNumStr]; --String.StringToDecimal[lineNumStr]; lineNumStr ¬ Token.FreeTokenString[lineNumStr]; [] ¬ Token.FreeStringHandle[tempHandle]; END ELSE place.co ¬ Convert.CardFromRope[temp]; --String.StringToDecimal[temp]; END; Rope.Equal[temp, "w"] => width ¬ Token.Decimal[h: sh]; ENDCASE => ERROR SyntaxError; temp ¬ Token.FreeTokenString[temp]; ENDLOOP; [] ¬ Token.FreeStringHandle[sh]; RETURN[place, width]; END; GetUserFileFromService: PROCEDURE [systemName, userFileName, server: Rope.ROPE ¬ NIL] RETURNS [cmH: CmFile.Handle, noUserFile: BOOLEAN ¬ FALSE] = BEGIN userSH: IO.STREAM ¬ PFS.StreamOpen[PFS.PathFromRope[userFileName], write]; <> <> { ENABLE XNSAdobeClientOps.UnknownAddress, XNSAdobeClientOps.StubError => GOTO noUserFileExit; GSDUFile: CrRPC.BulkDataSink = { IF checkAbort[h] THEN { noUserFile ¬ TRUE; RETURN[FALSE]; }; IF IO.EndOf[s] THEN { noUserFile ¬ TRUE; RETURN[FALSE]; }; WHILE NOT IO.EndOf[s] DO IO.PutChar[userSH, IO.GetChar[s]]; ENDLOOP; RETURN[FALSE]; }; <> XNSAdobeClientOps.GetSystemDefaultUserFile[ server: server--System.nullNetworkAddress--, system: systemName, to: GSDUFile]; <<= 0);>> IO.Close[userSH]; <> IF noUserFile THEN PFS.Delete[PFS.PathFromRope[userFileName]]; <> EXITS noUserFileExit => { IF userSH # NIL THEN IO.Close[userSH]; --Stream.Delete[userSH]; PFS.Delete[PFS.PathFromRope[userFileName]]; <> RETURN[NIL, TRUE]}}; END; <<>> ConvertToUserFileName: PROCEDURE [userFileName: Rope.ROPE] RETURNS [Rope.ROPE ¬ NIL] = { i, offset: CARDINAL ¬ 0; newUFN: Rope.ROPE ¬ NIL; FOR i IN [0.. userFileName.Length) DO IF userFileName.Fetch[i] # ' THEN newUFN ¬ ARAccess.AppendChar[newUFN, userFileName.Fetch[i]]; ENDLOOP; RETURN[newUFN] }; <<>> <> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <> <<(data.tool = queryList AND index = 8>> <<<< AdobeCommon.resultPos>> ) THEN>> <> <> <> <> <> <> <> <> <> <<(data.tool = queryList AND index = 8>> <<<< AdobeCommon.resultPos>> ) THEN {>> <> <> <> <> <> <> <> <> <> <> <> <<>> GetNextAR: PUBLIC PROCEDURE [ set: AdobeOps.SetOfARs, current: AdobeCommon.SetStatus] RETURNS [ nextAR: AdobeOps.ARNumber, newStatus: AdobeCommon.SetStatus] = <> { newStatus ¬ current; IF set = NIL OR set.len = 0 THEN RETURN[AdobeOps.nilARNumber, newStatus]; IF newStatus = AdobeCommon.InitialSetStatus THEN RETURN[set[0].startValue, [0, 0]]; IF set[current.setIndex].runLength <= current.runOffset + 1 THEN { newStatus.runOffset ¬ 0; newStatus.setIndex ¬ newStatus.setIndex + 1; IF newStatus.setIndex >= set.len THEN RETURN[AdobeOps.nilARNumber, newStatus]} ELSE newStatus.runOffset ¬ newStatus.runOffset + 1; nextAR ¬ set[newStatus.setIndex].startValue + newStatus.runOffset; }; <<>> GetPreviousAR: PUBLIC PROCEDURE [ set: AdobeOps.SetOfARs, current: AdobeCommon.SetStatus] RETURNS [ nextAR: AdobeOps.ARNumber, newStatus: AdobeCommon.SetStatus] = <> BEGIN newStatus ¬ current; IF current = AdobeCommon.InitialSetStatus THEN RETURN[ set[set.len - 1].startValue + set[set.len - 1].runLength - 1, [ runOffset: CARDINAL[set[set.len - 1].runLength - 1], setIndex: set.len - 1]]; IF current.runOffset < 1 THEN { IF newStatus.setIndex = 0 THEN RETURN[0, newStatus]; newStatus.setIndex ¬ newStatus.setIndex - 1; newStatus.runOffset ¬ CARDINAL[ set[newStatus.setIndex].runLength - 1]} ELSE newStatus.runOffset ¬ newStatus.runOffset - 1; nextAR ¬ set[newStatus.setIndex].startValue + newStatus.runOffset; END; <<>> FindThisQL: PUBLIC PROC[qlName: Rope.ROPE ¬ NIL, arSH: AdobeCommon.Handle] RETURNS [ql: AdobeOps.QueryList ¬ NIL] ~ { IF Rope.Equal["SysQL", qlName, FALSE] OR qlName = NIL OR qlName.Length = 0 THEN ql ¬ arSH.systemHandle.sysQL ELSE FOR q: AdobeOps.QLHandle ¬ arSH.systemHandle.otherQLs, q.next UNTIL q = NIL DO IF Rope.Equal[qlName, q.qL.name, FALSE] THEN ql ¬ q.qL; ENDLOOP; RETURN[ql]; }; <> <> <> <> <> <> <> <> <> <> <> <> <<>> GetLocalName: PROCEDURE [fullName: Rope.ROPE] RETURNS [localName: Rope.ROPE] = { i: INT ¬ 0; localName ¬ NIL; --String.MakeString[AdobeOps.z, fullName.length]; WHILE i < fullName.Length[] AND fullName.Fetch[i] # ': --AND i < NSName.maxFullNameLength-- DO localName ¬ ARAccess.AppendChar[localName, fullName.Fetch[i]]; <> i ¬ i + 1; ENDLOOP; <> }; <<>> <> <> END.. <> <> <>