PROTOKOLL MPX ------------- (MPX: Multiplexprotokoll för adMix) Koppling mellan adMix och GUI Version 1.21 (Ursprunglig version 1.20) Senaste ändringsdatum: 971124 Torbjörn Gard Elektrondata AB Copyright (c) 1997 Elektrondata AB ALLA RÄTTIGHETER FÖRBEHÅLLNA Denna text är relativt tekniskt inriktad avsedd för programmerare som ska implementera klientdelan av programvaran. Den beskriver bara i undantagsfall hur implementeringen bör göras. Den går inte in på detaljer hur serversidan ser ut eller hur den fungerar. Detta förutsätts vara känt. Därför kan det inte rimligtvis vara lätt läsning för andra. Allmän översikt --------------- /usr/adMix/bin/mpx startas via /usr/adMix/csh/INSTALL/mpxStart och stoppas via /usr/adMix/csh/INSTALL/mpxStop. Dessa script utnyttjas vid installation av uppdatering av adMix. En eller flera MPX/Serverprocesser finns igång hela tiden. En process per TCP-port. I praktiken räcker det med en port. När en uppkoppling sker tar en kopia av serverprocessen hand om denna. Denna kopia kallas GUI/Server. GUI/Servern hanterar en klientens (kallas GUI nedan) alla adMix-rutiner. All kommunikation FRÅN GUI passerar denna serverprocess. Det omvända förhållandet gäller ej. GUI/Servern tar emot kommandon från GUI. Vissa hanteras direkt. Andra skickas vidare till adMix/runtime. Nästan alla meddelanden har formen: meddelandetyp XXX status X loggnivå X Reserverat X(03) sekvensnr Long subSekvensnr Long length Long GUI Applikationspekare X(Variabel) adMix Applikationspekare X(Variabel) message X(Variabel) PROTOKOLL Koppling mellan adMix och GUI. Meddelandetyp ------------- Anger vad som ska göras. Består av tre fält "family", "type" och "subtype". Loggnivå -------- Loggning kan ske i servern på olika nivåer 0-9. Noll gör att ingen loggning produceras (annat än fel). Loggnivå sätts vid behov via protokolltyp "105". Om det för enskilt kommando sätts till annat än blankt, så gäller den nivån för det kommandot. Nivån återställs sedan. Loggnivå behöver alltså inte anges från klienten i varje meddelande. Aktuell loggnivå returneras i alla meddelanden. Loggnivå kan aktiveras och deaktiveras i centralt i servern utan klientens medverkan. För närvarande används fyra nivåer: "0" Ingen loggning "1" Endast kommandon och svar "5" Test "9" Allt Status ------ "0" OK "1" Felmeddelande på engelska (runtime error) "2" Statusmeddelande på svenska (text saknas eventuellt i "message") "5" Varningsmeddelande på engelska "9" Syntaxfel i protokoll Vid fel eller varning skickas text tillbaka i meddelande. GUI/adMix hanterar på lämpligt sätt beroende på status- och protokoll- typ. Implementeringen av protokollet i UNIX är inte "robust". Den håller inte reda på tidigare rapporterade felaktigheter. Det är alltså upp till implementeringen av GUI att se till att agera på om returvärde i "status" indikerar ett fel. Om adMix applikationspekare har blivit korrumperat sker antagligen en "memory violation". Meddelande om detta skickas i så fall tillbaka till GUI. Reserverat avser en area som ännu inte används. Ska vara blank tills vidare. TCP portnummer 2913 används i normalfallet. PROTOKOLL Koppling mellan adMix och GUI. Sekvensnr --------- Sekvensnr uppdateras av GUI. Det startar med 1. För varje skrivning till GUI-servern adderas 1. Kontroll sker vid mottagning att korrekt sekvensnr är angivet. I annat fall genereras ett protokollfel. Vid svar från applikation alternativt GUI-server, så bifogas alltid senaste sekvensnr. Med senaste avses det sekvensnr som processen känner till. En transaktion kan ge upphov till ett eller flera svar. Som ett särfall kommer en rapport att generera alla rader med samma sekvensnr som transaktionen som startade rapporten. Tusentals svar kan alltså i detta fall ges samma sekvensnr. (I detta ökas subsekvensnr med ett för varje svar.) Sekvensnr används med flera syften: - Avslöjar felprogrammering på ett tidigt stadium. - Genom att logga sekvensnr tillsammans med transaktionen ges möjlighet vid behov att lägga samman loggar från GUI och UNIX. - GUI kan vid behov använda sekvensnr som referens. subSekvensnr ------------ Detta sekvensnr är ett komplement till sekvensnr ovan. Det nollställs innan varje transaktion till servern. Vid svar från servern ökas detta nummer med ett. Om servern skickar flera transaktioner som ett resultat av ett enstaka kommando från GUI, så kommer de följande transaktionerna att vara numrerade från två och uppåt. Syftet med detta sekvensnr är att man ska kunna vara säker på att loggen är i korrekt ordning efter sortering per sekvensnummer. PROTOKOLL Koppling mellan adMix och GUI. Applikationspekare ------------------ Som en del av initieringen bestäms hur stor vardera sidans applikations- pekare ska vara. Se meddelandetyp "B10". Denna area ska reserveras och skickas tillbaka med svaret. Den applikationspekare är till för att förenkla hantering av: i GUI: Olika företag Olika applikationer i adMix Olika företag Olika användare Olika applikationer Målsättningen är att information om vad som har gjorts eller vad som förväntas komma inte ska sparas. Varje meddelandetyp ska i möjligaste mån vara fristående. Information som måste sparas ska lagras i applikationspekarens data. GUIs applikationspekare utnyttjas inte i adMix. Å andra sidan måste GUI använda adMix applikationspekare som adressat i varje meddelande (om sådan krävs). Alla meddelanden kräver ett svar. Vissa undantag finns i samband med fatala fel. Situation då båda sidorna samtidigt väntar på svar får ej inträffa. I denna text kallas klienten som körs i Windows för GUI. I UNIX finns en MPX-Server. Den hanterar uppkopplingar. För varje GUI (användare) finns en GUI-Server. Dessutom finns en menyserver per företag och GUI. Övriga processer som körs i UNIX-servern kallas applikationer. En applikation kan bestå av en eller flera COBOL-program. PROTOKOLL Koppling mellan adMix och GUI. Startschema ----------- Med följande kommandon uppdateras Windows GUI programvara. Denna del sköts av en liten uppstartsdel av programmet. Den hanterar inkopiering av nytt huvudprogram. Lämpligtvis används följande startschema: Punkt till punkt 1. Startprogram start 2 2. Kontroll om huvudprogram finns Finns 6 Finns ej 3 3. Kopieringsprogram start 4 4. Kopiering av huvudprogram från UNIX görs 5 5. Kopieringsprogram avslutas 6 6. Huvudprogram start 7 7. Kontroll om senaste version körs Senaste version 9 Ej senaste version 8 8. Huvudprogram avslutas 3 9. Protokoll körs etc.. Genom ovanstående förfaringssätt så räcker det att distribuera tre små program till varje PC (setup,startprogram och kopieringsprogram). Borde räcka med en diskett för detta. PROTOKOLL Koppling mellan adMix och GUI. Applikationspekare ------------------ Reservering av utrymme. Denna reservation måste göras först av alla kommandon: Först efter detta utbyte finns information om var meddelandearea startar. I denna meddelandetyp skickas 20 bytes. "B"-meddelanden har formen: type XXX status X loggnivå X Reserverat X(03) sekvensnr Long subSekvensnr Long length Long "B10": GUI ---> adMix Kommando: Reservera GUI applikationspekare. length = Önskad storlek "B10": GUI <--- adMix Svar: Reservera adMix applikationspekare. length = Önskad storlek Klart 960106 PROTOKOLL Koppling mellan adMix och GUI. Bufferstorlek ------------- Följande kommando används för att reservera bufferstorlek på vardera sidan. Ska vara samma på båda sidor. Först sker ett utbyte av önskade bufferstorlekar. Sedan gäller den minsta av de storlekar som utväxlats. Dock gäller som minsta bufferstorlek 1520 tecken. För "C"-meddelande gäller inte regeln att "length" anger längd på "message". Endast i fall status inte är "0" (felmeddelande) så är "message" ifylld. "C10": GUI ---> adMix Kommando: Reservera bufferstorlek Önskad bufferstorlek length = Önskad storlek "C10": GUI <--- adMix Svar: Reservera bufferstorlek Önskad bufferstorlek "C11": GUI ---> adMix Bestäm bufferstorlek length = Bestämd storlek "C11": GUI <--- adMix Bestäm bufferstorlek status "0": length = Bufferstorlek OK status "1": length = variabel Message: "Felmeddelande" Klart 960106 PROTOKOLL Koppling mellan adMix och GUI. Kryptering ---------- Följande kommando med svar anger att kryptering ska användas. Krypteringen gäller för sessionen och kan inte stängas av förrän nästa session startas. Kryptering sker via slumptalsgenerator och funktion XOR i två separata krypteringar/dekrypteringar. Den första tar hand om meddelandehuvud och den följande tar hand om eventuellt meddelande. Svaret är krypterat. "101": GUI ---> adMix Start av kryptering Message: Kommaseparerad lista "9," 9 Slumptalsgeneratorns frö "101": GUI <--- adMix Krypterat svar med kontrollmöjlighet. Message: "" PROTOKOLL Koppling mellan adMix och GUI. Protokollversion. ---------------- "110": GUI ---> adMix Vilken version? Message: Version: "1.21" X(04) "110": GUI <--- adMix Svar: Vilken version? Status "0": OK length = 4 Message: Version: "1.21" X(04) Klart 960106 Testversioner ------------- Detta kommando är inte obligatoriskt. Grundvärde: Testversioner av programvaran används inte. "114": GUI ---> adMix Testversioner av program ska användas. Message: Kommaseparerad lista "9," 0 = Ej testversioner (default) 1 = Testversioner "114": GUI <--- adMix Bekräftelse Klart 960607 Loggnivå -------- Detta kommando är inte obligatoriskt. Grundvärde: Ingen logg. "115": GUI ---> adMix Ange loggnivå i servern. Message: Kommaseparerad lista "9," 9 = Loggnivå (0-9) 0: Avstängd log "115": GUI <--- adMix Bekräftelse Klart 960530 PROTOKOLL Koppling mellan adMix och GUI. Versionskontroll ---------------- Registernamn refererar till register under "/usr/adMix/mpx/pub" för att UNIX säkerhet inte ska sättas ur spel. Kontroll sker att ett ogiltigt registernamn inte anges. Ogiltiga registernamn är sådana som innehåller "../", " " eller "~". "121": GUI ---> adMix Kommando: Vilken är senaste version? Message: Kommaseparerad lista "Registernamn," "121": GUI <--- adMix Svar: Senaste version: Message: Kommaseparerad lista "datum,tid,storlek,registernamn," Datum 9(06) "YYMMDD" Tid 9(08) "HH:MM:SS" Storlek max 9(09) Registernamn Inkl. directorynamn Klart 960306 Kopiering --------- Endast register i "/usr/adMix/mpx/pub" kan hämtas. Kopiering avslutas när length = 0. Kopiering startas med kommando: "125": GUI ---> adMix Kommando: Skicka register Message: Kommaseparerad lista "Registernamn,X," X: Ascii/Binary konvertering "B": Binär överföring "A": Ascii: Översättning av åäö (default) Kommando: Skicka mera Message: (tomt) length = 0 Svarsmeddelanden skickas tills hela registret är överfört. Subsekvensnr ökas med ett för varje meddelande. "125": GUI <--- adMix Svar: Kopiering. length = antal byte End of File: length = 0 Register i GU/Servern stängs. Message: Registerinnehåll Klart 960306 PROTOKOLL Koppling mellan adMix och GUI Operatör -------- Operatör och password anges för lokal lagring i GUI. Denna information skickas. Denna information används för identifiering av GUI/dator/ operatör. Kontroll sker att operatör finns i /etc/passwd. Kontroll av password görs. Kontroll mot maximalt antal användare (MPX-protokoll) sker. Maximalt antal användare lagras i register /usr/adMix/adm/funktion. Om detta register saknas, så sätts maximalt antal till 1 för provkörning. Antal aktiva användare ligger i "shared memory". "210": GUI ---> adMix Operatör och password Message: Kommaseparerad lista "Operatör,Password," Operatör max X(12) Password max X(14) "210": GUI <--- adMix Svar: status "0": OK length = 0 status "1": status "5": length = Variabel Message: "Varningsmeddelande" Klart 960106 Här väljs giltiga företag. En lista på företagsnamn samt i vilket adMix-directory de ligger hämtas. Val av aktuellt företag görs. Detta val kan göras flera gånger. Det resulterar då i flera meny och applikationsfönster i GUI. "220": GUI ---> adMix Kommando: Skicka företagslista: length = 0 "220": GUI <--- adMix Svar: Företagslista. Message: Kommaseparerad lista: Företag:Directory,Företag:Directory,... Klart 960108 När menyprocess startas sker en överföring av viss information till den nya processens standard input. Denna information läses först när processen har startats. Under tiden väntar operatörsservern. Väntetiden blir förhållandevis lång. När läsning har genomförts så betraktas uppstarten OK och meddelande om detta skickas tillbaka till GUI. Om läsning ej sker, så skickas stället ett felmeddelande till GUI. PROTOKOLL Koppling mellan adMix och GUI Meny ---- "230" GUI ---> adMix Kommando: Starta meny-process Message: Kommaseparerad lista: "Directory,Text-1,Text-2,Text-3,Text-4,Text-5," Directory format ex: /usr/adMix/01 Text-1..5 max X(21) per styck "Client/Server Meny,Version,Personnamn, Maskinnamn,," 1. "Client/Server Meny" 2. GUI Version 3. Personnamn Lokalt namn eller login 4. Maskinnamn Fylls i om det är känt 5. Om text-5 lämnas blank så fylls ip-adress och portnummer automatiskt in i denna. Texten kommer tills vidare att enbart användas för information i kommando "px". "230" GUI <--- adMix Svar: Starta meny-process OBS! Detta meddelande innehåller menyns applikationspekare. Denna måste sparas undan som nödvändig information för kommande kommandon. Den utgör då adressat till denna specifika meny. Klart 960108 PROTOKOLL Koppling mellan adMix och GUI Initiering av meny ------------------ Initiering av meny kan innebära att inslag måste göras av behörighets- kod och/eller aktiveringskod. Behörighetskod kan ev. lagras lokalt i GUI. Aktiveringskod är Elektrondatas kod. Lagras ej lokalt. "310" GUI ---> adMix Kommando: Initiering av meny "310" GUI <--- adMix "311": Ange aktiveringskod "311" GUI ---> adMix Aktiveringskod Message: Kommaseparerad lista "Aktiveringskod," "Aktiveringskod" max X(10) "311" GUI <--- adMix Svar: Initiering av meny Klart 960111 Exempel: adMix <- GUI "3100" # Initiering Ett av tre alternativa svar skickas från adMix: adMix -> GUI "3102 Felmeddelande" # eller adMix -> GUI "3100" # Inga koder behöver anges eller adMix -> GUI "3110" # Aktiveringskod krävs Aktiveringskod: adMix <- GUI "3110 Superhemli" # Aktiveringskod skickas Ett av två alternativa svar skickas från adMix: adMix -> GUI "3110" # Aktiveringskod OK eller adMix -> GUI "3112 Kod stämmer ej" # Aktiveringskod ej OK PROTOKOLL Koppling mellan adMix och GUI Menyinformation --------------- Sedan hämtas menyinformation. Denna information gäller aktuellt företag och operatör. Menyinnehåll hämtas sedan. Menyinnehåll kan på varje nivå vara antingen en menyingång eller en applikation. GUI håller reda på den struktur som leder ner till den startade applikationen: Menyval som gjorts måste applikationen få veta. "321" GUI ---> adMix Kommando: Skicka menyinformation: length = 0 "321" GUI <--- adMix Svar: Menyinformation Message: Kommaseparerad lista "Företagsnamn,Licensnr,Spooler," Förtagsnamn max X(21) Licensnr max 9(05) Företagets licnr. Spooler max X(10) Utskriftskö Klart 960111 PROTOKOLL Koppling mellan adMix och GUI Operatörsinformation -------------------- Om behörighetskod krävs returneras inte information enligt "331". I stället sätts meddelandetyp till "332" och behörighetskod måste anges. "331" GUI ---> adMix Operatörsinformation Message: Kommaseparerad lista "Operatör," Operatör max X(12) "331" GUI <--- adMix Operatörsinformation Message: Kommaseparerad lista "Recordnummer,Menynamn,Spooler,ModeCode, Print Screen,Level,Språk," Recordnummer max 9(05) Recordnummer där aktuell operatör ska starta sin meny. Menynamn max X(24) Spooler max X(10) Utskriftskö ModeCode max X(01) Kod arbetssätt (se förklaring "modeCode") Print Screen max X(01) Kod för om försättsblad skrivs automatiskt för operatören. Denna kod kan överstyras vid applikationsstart Användning i GUI odefinierad fn. Level max 9(02) Nivåkod 1-99 (Endast information. Menysökning sker på denna nivå. Används dock vid programstart eftersom koden teoretiskt kan användas i applikationen) Språk Operatörens språkkod. Används vid sökning efter översatta texter. Om behörighetkod anges korrekt lämnas svar i form av meddelandetyp "331". "332" GUI ---> adMix Behörighetkod Message: Kommaseparerad lista "Behörighetskod," Behörighetskod max X(12) "332" GUI <--- adMix Behörighetskod felaktig Message: Felmeddelande Klart 960111 Exempel behörighetskod: adMix <- GUI "3310" # Operatörsinformation Ett av två alternativa svar skickas från adMix: adMix -> GUI "3310" # Behörighetskod behövs ej. # Operatörsinformation bifogas. eller adMix -> GUI "3320" # Behörighetskod måste anges adMix <- GUI "3320 Superhemligt" # Behörighetskod Ett av två alternativa svar skickas från adMix: adMix -> GUI "3310" # Behörighetskod OK # Operatörsinformation bifogas. eller adMix -> GUI "3322" Kod stämmer ej" # Behörighetskod ej OK PROTOKOLL Koppling mellan adMix och GUI Arbetssätt ---------- "351" GUI ---> adMix Arbetssätt "351" GUI <--- adMix Arbetssätt Message: Kommaseparerad lista "Antal,Arbetssätt:ModeCode, Arbetssätt:ModeCode,...," Antal max 9(03) Listantal Arbetssätt max X(21) Text ModeCode max X (se förklaring "modeCode") "352" GUI ---> adMix Skrivare "352" GUI <--- adMix Skrivare Message: Kommaseparerad lista "Antal,skrivare:text:radmax: offset:codeSet,skrivare,...," Antal max 9(03) Listantal Skrivare max X(10) Text max X(35) Radmax max 9(02) 0-99 Max antal rader per rapportsida. Offset max 9(02) 0-99 Offset är antal tecken högerförskjutning av rader. codeSet max X(01) 1-3 "1" ISO8859 "2" DOS_IBM "3" ROMAN_8 Se "Teckenset" Klart 960111 PROTOKOLL Koppling mellan adMix och GUI Menyval etc ----------- I detta läge har man kommit fram till den faktiska menyn och kan få information om vad som finns att välja. Vissa menyingångar i adMix skickas inte i denna information. Det är koppling till UNIX shell och byte av företag. Även här kan inslag av behörighetskod behövas. Det första kommandot ger information om tillgängliga menyer på översta nivån. Recordnummer finns tillgängligt efter operatörs- information. "361" GUI ---> adMix Kommando: Toppmeny Skicka modulinformation Message: Kommaseparerad lista "recordnummer," Recordnummer max 9(05) "361" GUI <--- adMix Svar: Toppmeny Modulinformation Layout enligt protkolltyp "371". Dock är menynamn blankt om recordnummer = 1 (vilket är det normala). Klart 960114 PROTOKOLL Koppling mellan adMix och GUI Undermenyer tas fram med följande kommando. Om behörighetskod är känd för viss meny, så kan "372" användas direkt. Vid korrekt angiven behörighet eller då behörighet inte krävs, så returneras alltid transaktionstyp "371" eller "373". "371" GUI ---> adMix Kommando: Menyval Agera på menyval. Första gången fylls startmeny, etc i från menyinformtion. Rutin 1-5 blanka. Om undermeny sker svar via denna meddelandetyp. Message: Kommaseparerad lista "recordnummer," Recordnummer max 9(05) "371" GUI <--- adMix Svar: Menyval eller behörighetskod Menyval Kommaseparerad lista Message: "Menynamn,Spooler,Antal,Menyingång,..," Menynamn: max X(21) Spooler: max X(10) Antal:Antal menyingångar max 9(02) Menyingång: Kolonseparerad lista "X:Menynamn:Record:9" X: M=Menyingång A=Applikation ":" Separator Menynamn max X(21) ":" Separator Record: Menyadress max 9(05) ":" Separator 9: Behörighetskod 0=Behörighetskod krävs ej 1=Behörighetskod krävs ... Flera menyingångar "372" GUI ---> adMix Menyval med behörighetskod Message: Kommaseparerad lista "recordnummer,behörighetskod," Recordnummer max 9(05) Behörighetskod X(12) "372" GUI <--- adMix Message: Behörighetskod måste anges "373" GUI <--- adMix Applikation kan startas. Message: Kommaseparerad lista: "Programnamn,Spooler,Menyval," Programnamn max X(14) COBOL-namn Spooler max X(10) Utskriftskö Menyval max X(21) Menyvalsnamn Klart 960115 PROTOKOLL Koppling mellan adMix och GUI Exempel menyval med behörighetskod: adMix <- GUI "3710 12345," # Menyval Ett av tre alternativa svar skickas från adMix: adMix -> GUI "3710" # Menyvalslista lämnas eller adMix -> GUI "3720" # Behörighetskod måste anges eller adMix -> GUI "3730" # Applikation kan startas adMix <- GUI "3720 12345,Superhemligt," # Behörighetskod Ett av tre alternativa svar skickas från adMix: adMix -> GUI "3710" # Menyvalslista (behörighet ok) eller adMix -> GUI "3722 Kod stämmer ej" # Behörighetskod ej OK eller adMix -> GUI "3730" # Applikation kan startas Avsluta menyprocess "390" GUI ---> adMix Avsluta meny "390" GUI <--- adMix Meny avslutas PROTOKOLL Koppling mellan adMix och GUI Applikation ----------- Följande kommando används för att starta en applikation. "411" GUI ---> adMix Kommando: Starta applikation Message: Kommaseparerad lista. "Programnamn,Spooler,ModeCode,Level, Print Screen,Radmax,CodeSet,Offset,språk, Rutin-1,Rutin-2,Rutin-3,Rutin-4,Rutin-5," Programnamn max X(14) COBOL-namn Spooler max X(10) Utskriftskö ModeCode max X(01) Kod arbetssätt (se förklaring "modeCode") Level max 9(02) Menynivå Print Screen max X(01) Radmax max 9(02) Rader/sida CodeSet max X(01) 0-3 "1" ISO8859 "2" DOS_IBM "3" ROMAN_8 Se "Teckenset" Offset max 9(02) Högerjustering Språk max X(03) Från operatör Rutin-1 max X(21) Menynamn Rutin-2 max X(21) Rutin-3 max X(21) Rutin-4 max X(21) Rutin-5 max X(21) "411" GUI <--- adMix Applikation startad Svar vid start via GUI/meny. Svaret kommer med en viss fördröjning eftersom runtimesystem, och COBOL-program ska starta och svara på initialt meddelande innan svar lämnas (ca. 1 sek). OBS! Detta svar är dock kritiskt efterssom det vid start av ny applikation är nödvändigt för GUI-Servern att medela GUI om adMix applikationspekare för en nystartad process. Detta är en förutsättning för att GUI ska kunna adressera olika applikationer i adMix! Applikationspekaren MÅSTE tas från detta meddelande efterssom den nystartade applikationen inte returnerar någonting utan kommando. (Och kommando kan inte skickas utan applikationpekare). För att det inte ska råda någon förvirring om vilken applikation som just har startats, så bör nog sekvensnummer utnyttjas som kontroll. Klart 960119 PROTOKOLL Koppling mellan adMix och GUI Applikationen har nu startats. Information om applikationen, från applikationen ska nu hämtas. "420" GUI ---> adMix Kommando: Skicka programinformation. "420" GUI <--- adMix Svar: Skicka programinformation. Message: Programinformation (se definition) Klart 960210 Följando kommando är inlagt för att "Kommando/Svar"-strategin ska kunna bibehållas. Fältinnehåll eller operatörsval av annan typ utgör då fortsättningsvis kommandon, så som det bör vara. "421" GUI ---> adMix Kommando: Fortsätt! Applikation väntar på detta kommando innan något ytterligare sker. Skickas när terminaldata ska skickas från applikationen. Detta kommando används endast EN gång per applikation i ett läge när GUI är redo att ta emot terminaldata. I fortsättningen sker "Kommando/Svar"-sekvens via 511-Fältinnehåll/511-Formulär (där fältinnehåll är kommandot!) (Observera att svar även kan ske via fönster). "421" GUI <--- adMix (SAKNAS) Detta svar existerar inte. Svar kommer via formulärdata, fönsterdata eller också kan eventuellt applikationen avslutas utan vidare hantering och skickar då avslutsmeddelande. Klart 960205 PROTOKOLL Koppling mellan adMix och GUI Processer kan eventuellt behöva avbrytas. Följande kommandon kan användas för kommandon som förbigår processernas normala indatakanal. "431" GUI ---> adMix Kommando: Avbrottssignal. För vissa applikationer ska ett avbrott kunna ges. Detta sker fn i UNIX med hjälp av signal SIGQUIT (som i adMix fångas upp, sätter en flagga men i övrigt ignoreras). "431" GUI <--- adMix Svar: Avbrott genererat. EJ HELT IMPLEMENTERAT ÄNNU! "432" GUI ---> adMix Kommando: Nödstopp Applikation avbryts: Nödstopp: length = 0 Skickas om möjligt som prioriterat meddelande. Meddelandetypen skickas t ex om applikationsfönster tas bort eller om Windows avslutas. "432" GUI <--- adMix Svar: Nödstopp genererat. Klart 960216 "433" GUI ---> adMix Kommando: Avbrottssignal med processnr. Applikationen avbryts. Endast bakgrundsprocesser får avbrytas med detta kommando. Och då endast i nödfall. Message: Kommaseparerad lista "processnr," Klart 960215 Ej testat "433" GUI <--- adMix Svar: Avbrott uppfattat. Avslutas. Applikationspekare är nollställda. Detta meddelande kommer från den avbrutna processen. Message: Programinformation (se definition) Klart 960216 Ej testat PROTOKOLL Koppling mellan adMix och GUI På grund av konstruktionen i samband med bakgrundsprocesser så finns fn. för dessa enbart en enkelriktad kommunikation som riktar sig från en adMix bakgrundsprocess till GUI. adMix <--- GUI-Server <-------- GUI !----------------------------> GUI Bakgrundsprocess --------------> GUI adMix kanal till GUI är samma kanal som bakgrundsprcessen har. Det är också samma som går från GUI till GUI-servern. Alltså kan bakgrunds- rutinen inte läsa denna eftersom den då skulle "stjäla" meddelanden avsedda för GUI-servern! (Om denna lösning visar sig vara otillfred- ställande måste ytterligare ett portnummer användas för kommunikation. Denna kontakt skulle då initieras från bakgrundsprocessen.) Följande meddelandetyp kan komma som svar på nästan alla typer av kommandon som riktar sig till en applikation (eller ev. även start av applikation i menyn). Om bakgrundsprocessen skapar en rapport så kommer rapportraderna att ha samma sekvensnummer som denna transaktion. Både adMix och GUIs applikationspekare är nollställda. Anledningen till detta är att de inte går att använda efterssom processen är ny. Om behov finns går ursprunget att härleda via sekvensnummer. En bakgrundsrutin som skapar en rapport består av två processer. Den första sköter bearbetningen och den andra dirigerar utdata till önskat ställe. Det är den första processen som avses med processnr nedan. Det är denna process som ska avbrytas om rapporten ska stoppas. "441" GUI <--- adMix Svar: Bakgrundsprocess startas: Ny process Applikationspekare nollställda. Message: Processinformation (se definition) "442" GUI <--- adMix Information: COBOL bakgrundsrutin startas. Denna meddelandetyp kan komma en eller flera gånger per process. Lägg märke till att förutom programnamn så kan även rutin-1..5 vara olika för de olika transaktionerna. Applikationspekare nollställda. Message: Programinformation (se definition) "443" GUI <--- adMix Information: COBOL rutin startas. Message: Programinformation (se definition) Exempel 1: adMix -> GUI "4410" # Bakgrundsprocess startas adMix -> GUI "4420" # COBOL-bakgrundsrutin startas . . (Eventuellt flera meddelanden med typ "442". . adMix -> GUI "4830" # Bakgrundsprocess avslutas Exempel 2: adMix -> GUI "4430" # COBOL-förgrundsrutin startas . . (Eventuellt flera meddelanden med typ "443". . adMix -> GUI "4800" # Applikation avslutas PROTOKOLL Koppling mellan adMix och GUI Lokal skrivare -------------- Lägg märke till att meddelandetyp "451" initieras från adMix. De kan komma när som helst och måste hanteras i bakgrunden. Det är operatören som innan utskriften startas har bestämt vad som ska ske med utdata. Det är fritt val för GUI att bestämma möjligheter men samtidigt hålla reda på vad som ska ske med varje meddelandetyp. Det kan samtidigt vara flera dataflöden på väg till "Lokal skrivare"! Rapporter skickas till GUI i form av kompletta rader i nästintill full buffer. Inga svar förväntas (eller är möjliga). Sekvensnr är samma för alla meddelanden i rapporten och är identiskt med sekvensnr i meddelandetyp "442" ovan. Subsekvensnr ökas med ett för varje transaktion. Subsekvensnr har en egenhet som måste förklaras. Bakgrundsrutiner består av två processer när en rapport skapas. När den andra processen skapas så har subsekvensnr blivit större än 1 (ca 3). Detta nummer får den andra processen tillgång till. När den skriver första gången ökas detta med ett (ca 4). Den första processen skriver ytterligare svar. Dessa ökas också med ett för varje gång. Resultatet blir att flera subsekvensnr förekommer flera gånger: Men ett nummer (ca 3) förekommer endast en gång. Både adMix och GUIs applikationspekare är nollställda. Observera att utskriftssätt (modeCode=2,3) behandlas identiskt. Det är implementeringen av GUI som avgör hur dessa ska särbehandlas: "Visa på terminal" och "Utskrift på terminalskrivare" enligt adMix nomenklatur. Det är tänkbart att avslutsmeddelande "483" kan komma innan det sista meddelandet "451" för en viss rapport. En tom transaktion "451" anger avslut. "451" GUI <--- adMix Length=0: Innebär slut på rapporten. Message: Rapportöverföring (se definition) "451" GUI ---> adMix Saknas! Klart 960215 PROTOKOLL Koppling mellan adMix och GUI Kontroll av diskutrymme sker i adMix normalt i samband med inslag av CR. Dvs i samband med avslut av varje formulär/fönster. Diskutrymmet kontrolleras i aktuellt directory. Om detta underskrider gränsen för första varningen, så visas text: Varning! Tillgängligt diskutrymme nu endast XXX block Om detta underskrider gränsen för andra varningen, så visas text: Varning! Diskutrymme saknas nu nästan helt. (XXX block) Åtgärd fordras. Om utrymmet är noll eller mycket nära noll (100?), så visas text: Varning!# Disken är nu helt fylld. (X block) Avsluta och åtgärda! Gränserna är normalt 20000 respektive 10000 block. Denna kontroll bör göras på motsvarande sätt i GUI som idag sker i adMix. Den aktiva applikationen bör utnyttjas för denna kontroll. Detta görs lämpligen efter att applikationen har skickat terminal- information. "471" GUI ---> adMix Kontroll av diskutrymme Händelsestyrd: Applikationsberoende godtycklig tidpunkt (se definition) "471" GUI <--- adMix Svar diskutrymme Message: Kommaseparerad lista "ledigt,varning 1,varning 2," ledigt Antal 512 byte block Lediga block avser det som går att utnyttja. De block som i vissa filsystem är reserverade för superuser är inte medräknade. varning 1 Antal block då första varningsmeddelandet ska visas. varning 2 Antal block då andra varningsmeddelandet ska visas. Klart 960215 PROTOKOLL Koppling mellan adMix och GUI Processinformation ------------------ Denna protokolltyp används när GUI vill ha aktuell processinformation. "472" GUI ---> adMix Händelsestyrd: Applikationsberoende godtycklig tidpunkt. (se definition) "472" GUI <--- adMix Message: Processinformation (se definition) Klart 960617 Följande protokolltyp används för att få fram information om en enskild process via dess processnummer. Kommandot kan adresseras till en godtycklig applikation (ej meny). "473" GUI ---> adMix Händelsestyrd: Applikationsberoende godtycklig tidpunkt. (se definition) Message: Kommaseparerad lista: "99999," 99999: Processnummer "473" GUI <--- adMix Message: Processinformation (se definition) Klart 960617 (Ej testat) PROTOKOLL Koppling mellan adMix och GUI Följande meddelandetyp kan komma som svar på nästan alla typer av kommandon som riktar sig till en applikation (eller ev. även efter start av applikation från menyn). "480" GUI <--- adMix Applikation avslutas. Message: Programinformation (se definition) Klart 960215 "481" GUI ---> adMix Meddela GUI-Server Meddela GUI-Server om applikationens avslut Detta meddelande tas om hand av GUI-servern och skickas inte vidare till adMix. Meddelandet är avsett för att GUI-servern ska deallokera minne etc. "481" GUI <--- adMix Bekräftelse från GUI-Server Klart 960215 "483" GUI <--- adMix Bakgrundsprocess avslutas. Applikationspekare nollställda. Inget svar ska skickas. Message: Processinformation (se definition) Klart 960215 Exempel 1: adMix -> GUI "4800" # Applikation avslutas adMix <- GUI "4810" # Meddela GUI-Server adMix -> GUI "4810" # Bekräftelse från GUI-server Exempel 2: adMix -> GUI "4830" # Bakgrundsprocess avslutas PROTOKOLL Koppling mellan adMix och GUI Formulär och fönster -------------------- Formulär och fönsterspecifikationer. adMix applikationer är skrivna på så sätt att information som skickas till terminal alltid är det minsta möjliga. Detta görs genom att en kopia av terminalutseendet alltid upprätthålls i minnet. Vid uppdatering så jämförs uppdaterings- information med terminalminnet. Endast förändringar skickas. Implementeringen av X-Window är gjord på samma sätt. Kopplingen mot GUI görs på samma sätt. Minimering av information som skickas görs av adMix. GUI ska för detta ändamål uppträda som som en terminalemulering. En applikation startas normalt med ett formulär. Om det startas med ett fönster så kommer fönster först att tas bort innan ett eventuellt formulär ska visas, eller också består applikationen enbart av fönster som lagras på varandra. Meddelande "501" skickas från adMix när adMix är klar att ta emot meddelande. Om formulär tidigare har skickats så betyder det att alla delar av formuläret har skickats. Meddelandet innehåller (förutom information om att applikationen är redo att ta emot data) även den aktiva positionen (fält/radnummer). OBS: Noll i detta fält ska ignoreras. Applikationen har nämligen möjlighet att till vissa delar ange aktivt fält/radnummer redan i samband med att formulär/fönsterbeskrivning skickas. Normalt så kommer en terminaluppdatering efter data till applikationen. Men det behöver inte vara så. Istället kan applikationen ta emot data från GUI och direkt behandla detta och sedan vänta på mer. Kanske lite dålig stil, men så kan vissa applikationer vara skrivna. För att lösa detta, så skickas en tom terminaluppdatering (av samma typ som skulle ha kommit) för att uppmärksamma GUI om att applikationen väntar på nästa kommando (indata). "501" GUI <--- adMix Svar: Aktivt fält/radnummer. Positionering till fält i formulär eller fönster. Message: Kommaseparerad lista "9," "9" Fältnummer/Radnummer Första fält=0 OBS! Ignorera noll! Första rad=1 "," Separator mot framtida fält. Klart 960127 "511" GUI ---> adMix Fältinnehåll Kommando: Innehåll i formulär Message: Terminalindata (se definition) Aktuella avslutstangenter eller knappar: CR/LF="1" DELETE="2" (Se definition) "511" GUI <--- adMix Formulär Skickas som svar på terminaluppdateringskommando. Ett formulär är ett fönster som innehåller 21 rader med 80 kolumner. Det är 21 rader istället för 24 efterssom de tre första utesluts på grund av att de inte behövs. Formulär kan skickas i omgångar. Första gången så skickas minst fönsterbeskrivning. Subsekvensnr ökas med ett för varje meddelande. Message: Fönsterbeskrivning (se definition) Subset av modifierad VT100 Fältbeskrivning (se definition). Klart 960127 PROTOKOLL Koppling mellan adMix och GUI Generella fönsterrutiner. ------------------------ Denna meddelandetyp initierar användning av fönster i applikationen. (Kommando/Svar-strategi är lite luddig i detta ögonblick men kan bibehållas med lite ansträngning.) "521" GUI <--- adMix Initiera nytt ospecificerat fönster. Avsikten är att förbereda GUI på att applikationen som en nödvändig fortsättning ska öppna ett fönster till. "521" GUI ---> adMix Initiera nytt ospecificerat fönster. status "1": Ett fönster till ska inte skapas. (Applikationen betraktar detta som ett godkänt fel och backar tillbaka). När adMix vill stänga fönster skickas följande besked till GUI innan. GUI svarar på detta och fönster/fönsterdata tas bort på båda sidor. "522" GUI <--- adMix Stäng senaste fönster "522" GUI ---> adMix Stäng senaste fönster En hjälpknapp, tangent eller liknande ska kunna aktivera hjälptext per inslagsfält/fönsterrad via följande kommando. "525" GUI ---> adMix Hjälptext Händelsestyrd: Applikationsberoende godtycklig tidpunkt. (se definition) Vid lyckad sökning skapas ett hjälptextfönster ("532"). Hjälptexter visas inte för menyn. Message: Kommaseparerad lista "fältnr/radnr,söksträng," fältnr/radnr Aktuellt fält/rad söksträng Eventuell söksträng som ersätter fältnr/radnr. Behöver ej anges. "525" GUI <--- adMix Hälptext Lägg märke till att detta svar endast kommer vid misslyckad sökning. Avsikten är att informera om detta samt att ge underlag för meddelande till operatören. Message: Kommaseparerad lista "fält/radnr,söksträng,register 1,register 2, register 3," Fält/radnr Retur av angivet nr. söksträng Lokaliserad via fältnr eller retur av angiven söksträng. register 1-3 Genomsökta register. Klart 960229 PROTOKOLL Koppling mellan adMix och GUI Fritt fönsterformulär --------------------- Detta är ett formulär för inslag av indata i fält. Cursorn kan inte röra sig utanför fälten. Flera inslagsfält per rad är möjliga. "531" GUI <--- adMix Fritt fönsterformulär Message: Fönsterbeskrivning (se definition) Terminaluppdatering (se definition) Fältbeskrivning (se definition). "531" GUI ---> adMix Innehåll i fritt fönsterformulär Message: Terminalindata (se definition) Aktuella tangenter CR/LF="1" DELETE="2" (Se definition) Klart 960205 "532" GUI <--- adMix Hjälptextfönster Message: Fönsterbeskrivning (se definition) Terminaluppdatering (se definition) Hypertextlänkar (se definition). Klart 960229 "532" GUI ---> adMix Hjälptextfönster Händelsestyrd: Applikationsberoende godtycklig tidpunkt. (se definition) Message: Terminalindata (se definition) Aktuella tangenter CR/LF="1" DELETE="2" (Se definition) Klart 960229 PROTOKOLL Koppling mellan adMix och GUI Urvalsfönster ------------- Lista av rader i ett fönster. Med piltangent eller mus ska en rad väljas. Som en del av fönstret ska finnas två knappar: Avbryt och OK. Avbryt ger returkod: DELETE. Delete-tangent ska också ge denna kod. "551" GUI <--- adMix Urvalsfönster Message: Fönsterbeskrivning (se definition) Data Terminaluppdatering (se definition) Urvalsknapp (se definition) "551" GUI ---> adMix Svar för urvalsfönster Message: Terminalindata (se definition) Aktuella tangenter CR/LF="1" DELETE="2" (Se definition) Vänsterpil="3" Högerpil="4" Uppåtpil="5" Tab="7" Backtab="8" Backspace="9" Home="H" Klart 960205 PROTOKOLL Koppling mellan adMix och GUI Urvalslista ----------- Lista av rader där listan är så stor att alla rader inte syns samtidigt. Rullningslist används för att se resten. I övrigt funtkon som urvals- fönster. Exakt funktion av detta fönster är ospecificerat eftersom det inte är klart ännu. "561" GUI <--- adMix Urvalslista: Hela listan finns med Message: Fönsterbeskrivning (se definition) Data Terminaluppdatering (se definition) "561" GUI ---> adMix Urvalslista Message: Tangent X(01) (Se urvalsfönster) Rad 9(03) Data Innehåll i vald rad. PROTOKOLL Koppling mellan adMix och GUI Editeringsfönster ----------------- Editering av fri text i fönster. "571" GUI <--- adMix Editeringsfönster Message: Fönsterbeskrivning (se definition) Data Terminaluppdatering (se definition) "571" GUI ---> adMix Editeringsfönster Message: Terminalindata (se definition) Aktuella tangenter CR/LF="1" DELETE="2" (Se definition) Klart 960315 PROTOKOLL Koppling mellan adMix och GUI "581" GUI <--- adMix Meddelandefönster Message: Fönsterbeskrivning (se definition) Data Terminaluppdatering (se definition) "581" GUI ---> adMix Operatören har klickat på OK eller retur. Klart 960315 PROTOKOLL Koppling mellan adMix och GUI Diverse applikationsoberoende kommandon som hanteras i GUI/Servern. Loggmeddelande -------------- Om meddelande ska lägger i GUI/Server logg görs det med detta kommando. "811": GUI ---> adMix Loggmeddelande Message: Valfri text "811": GUI <--- adMix Bekräftelse Klart 960717 Byte av password: Implementerat i version 1.21 ---------------------------------------------- Operatören ska själv kunna byta ut sitt UNIX password. Lagring av detta görs dock inte i /etc/passwd utan i /usr/adMix/mpx/data/passwd. Ändringen görs genom att gammalt password ett fält medan det nya anges två gånger i två olika fält. Lokal kontroll att dessa två är identiska. Inslag ska vara osynliga med "*"-markering. "821": GUI ---> adMix Byte av password Message: Kommaseparerad lista "gammalt password,nytt password," gammalt password max X(14) nytt password max X(14) "821": GUI <--- adMix Bekräftelse Klart 971028 Återutskrift av rapport: Implementerat i version 1.21 ----------------------------------------------------- Det förekommer ofta att rapporter måste skrivas ut igen. Detta kommando skickar tillbaka en lista över operatörens rapporter som kan skrivas ut en gång till. Endast de rapporter som operatören har skapat finns med i denna lista. "831": GUI ---> adMix Skicka lista på rapporter Message: Kommaseparerad lista "företag," företag: ex /usr/adMix/01 Svaret begränsas i storlek till max bufferSize. Om rapporter för återutskrift saknas för operatören, är Message tomt. "831": GUI <--- adMix Lista Message: Kommaseparerad lista "Rapportnamn,datum,tid,storlek,namn,..." namn: Registernamn Rapportnamn: Text enligt menyn datum: Rapportens datum tid: tt:mm:ss storlek: Antal tecken i rapport sidor: Antal sidor i rapport : Avslut ... Nästa listrad Klart 971029 Hämta rapport: Implementerat i version 1.21 ------------------------------------------- Om en rapport har skrivits ut endast delvis t ex p g a problem med skrivaren, är det önskvärt att kunna skriva ut resten av rapporten. Detta kommando är avsett för lokal hantering i GUI för senare ev utskrift till skrivare via nätverk (Samba). Observera att detta kommando måste fullföljas innan GUI kan skicka ytterligare kommandon. Rapporten kan hämtas med följande kommando. "832": GUI ---> adMix Skicka rapport Message: Kommaseparerad lista "företag,registernamn," företag: ex /usr/adMix/01 registernamn: ex "lpr/xxxxx" Sekvensnr är samma för alla meddelanden i rapporten. Subsekvensnr ökas med ett för varje transaktion. "832": GUI <--- adMix Length=0: Innebär slut på rapporten. Message: Rapportöverföring (se definition) Klart 971029 Skriv ut rapport: Implementerat i version 1.21 ---------------------------------------------- Detta kommando ger möjlighet att skriva ut tidigare skriven rapport på valfri skrivare. Registernamn ska vara en ur listan över rapporter som operatören kan skriva enligt ovan. "833": GUI ---> adMix Skriv ut rapport Message: Kommaseparerad lista "företag,registernamn,spooler,antal," företag: ex /usr/adMix/01 registernamn: ex "lpr/xxxxx" spooler: Utskriftskö antal: Antal kopior "833": GUI <--- adMix Bekräftelse Klart 971029 PROTOKOLL Koppling mellan adMix och GUI Undersök möjlighet att skicka dessa som prioriterade meddelanden. "990" GUI ---> adMix Fatal error: length = 0 "990" GUI <--- adMix Fatal error: length = 0 Avsluta med meddelandefönster. EJ KLART PROTOKOLL Koppling mellan adMix och GUI Protokollexempel som visar logg efter verklig körning via GUI "client". Lägg märke till att meddelandetyp 411 (sekvensnr 18) får två svar. Det första svaret innebar att applikationen gick bra att starta. Nästa är en bildskärmsdefinition via meddelandetyp 511. Sekvensnummer 1-3 är 'hardwired' i min simpla testklient (därav andra tider). Datum Tid Sekvensnr Typ S Längd (S=Status) ------------------------------------------------------------------------ 960201 14:45:42 1 mpx <- GUI: B10 0 4 "" (bytes=16+0) 960201 14:45:42 1 mpx -> GUI: B10 0 4 "" (bytes=24+0) 960201 14:45:42 2 mpx <- GUI: C10 0 16384 "" (bytes=24+0) 960201 14:45:42 2 mpx -> GUI: C10 0 8192 "" (bytes=24+0) 960201 14:45:42 3 mpx <- GUI: C11 0 16384 "" (bytes=24+0) 960201 14:45:42 3 mpx -> GUI: C11 0 8192 "" (bytes=24+0) ------------------------------------------------------------------------ 960611 12:18:03 4 0 mpx <- GUI: 110 0 4 "1.21" (bytes=28+4 fd=3 log=9) 960611 12:18:03 4 1 mpx -> GUI: 110 0 4 "1.21" (bytes=28+4 fd=3 log=9) 960611 12:18:03 5 0 mpx <- GUI: 114 0 2 "1," (bytes=28+2 fd=3 log=9) 960611 12:18:03 5 1 mpx -> GUI: 114 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:03 6 0 mpx <- GUI: 121 0 8 "testreg," (bytes=28+8 fd=3 log=9) 960611 12:18:03 6 1 mpx -> GUI: 121 0 46 "960315,10:37:31,68,/usr/adMix/mpx/pub/testreg," (bytes=28+46 fd=3 log=9) 960611 12:18:03 7 0 mpx <- GUI: 210 0 20 "demo,Superhemligt-1," (bytes=28+20 fd=3 log=9) 960611 12:18:03 7 1 mpx -> GUI: 210 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:03 8 0 mpx <- GUI: 220 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:03 8 1 mpx -> GUI: 220 0 148 "ESIX DEMO:/usr/adMix/01,Västerhavsfisk Fsg AB:/usr/adMix/02,Smögen Försäljning AB:/usr/adMix/04,ESIX DEMO:/usr/adMix/kt,Torbjörn Gard:/usr/adMix/tg," (bytes=28+148 fd=3 log=9) 960611 12:18:03 9 0 mpx <- GUI: 230 0 54 "/usr/adMix/tg,Client/Server Meny,Torbjörn Gard,xdev,,," (bytes=28+54 fd=3 log=9) 960611 12:18:03 9 1 mpx -> GUI: 230 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:03 10 0 mpx <- GUI: 310 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:05 10 1 mpx -> GUI: 310 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:05 11 0 mpx <- GUI: 321 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:05 11 1 mpx -> GUI: 321 0 30 " Torbjörn Gard,1,adMix," (bytes=28+30 fd=3 log=9) 960611 12:18:05 12 0 mpx <- GUI: 331 0 5 "demo," (bytes=28+5 fd=3 log=9) 960611 12:18:05 12 1 mpx -> GUI: 332 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:05 13 0 mpx <- GUI: 332 0 13 "Superhemligt," (bytes=28+13 fd=3 log=9) 960611 12:18:05 13 1 mpx -> GUI: 331 0 42 "30,Demonstrationsmästaren,lager,2,J,98,GB," (bytes=28+42 fd=3 log=9) 960611 12:18:05 14 0 mpx <- GUI: 351 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:05 14 1 mpx -> GUI: 351 0 147 "7,:1,Lokal hantering typ 1:2,Lokal hantering typ 2:3,Bestämd utskriftskö:4,Utskrift Under natten:5,Startinslag generellt:G,Startinslag personlig:P," (bytes=28+147 fd=3 log=9) 960611 12:18:05 15 0 mpx <- GUI: 352 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:05 15 1 mpx -> GUI: 352 0 338 "11,/dev/null:Ingen utskrift:48:0:0,/tmp/ut:Temporär utskriftsregister:41:0:0,Caesar:Överföring till Caesar:99:0:0,adMix:Standardskrivare:41:0:0,disk:Utskrift på disk:68:0:0,dokument:Dokumentskrivare:66:0:0,fax:fax:70:0:0,lager:Skrivare på lager:41:0:0,laser:HP Laserskrivare:41:0:0,liggande:Bred matrisskrivare:41:0:0,lpr:Standard:41:0:0," (bytes=28+338 fd=3 log=9) 960611 12:18:05 16 0 mpx <- GUI: 361 0 2 "1," (bytes=28+2 fd=3 log=9) 960611 12:18:05 16 1 mpx -> GUI: 361 0 512 ",,26,M:Offerter:1,M:Order & fakturering:2,M:Behov & planering:3,M:Inköp:4,M:Lager:5,M:Statistik:6,M:Kundreskontra:7,M:Leverantörsreskontra:8,M:Affärsredovisning:9,M:Projektredovisning:10,M:Förkalkyl:11,M:Registervård:12,M:Tidsredovisning:13,M:Lön:14,M:Likviditetsanalys:15,M:Marknadsanalys:16,M:MPS:18,M:Tidur:19,M:Efterkalkyl:20,M:Fönstersökning:24,M:Kassarutiner:26,M:Direktreklam:27,M:Presentationsgrafik:28,M:Rapportgenerator:29,M:Systemadministratör:30,M:Byte av företag:32," (bytes=28+512 fd=3 log=9) 960611 12:18:05 17 0 mpx <- GUI: 371 0 4 "12,," (bytes=28+4 fd=3 log=9) 960611 12:18:05 17 1 mpx -> GUI: 372 0 534 "" (bytes=28+534 fd=3 log=9) 960611 12:18:05 18 0 mpx <- GUI: 372 0 8 "12,kod2," (bytes=28+8 fd=3 log=9) 960611 12:18:05 18 1 mpx -> GUI: 371 0 359 "Registervård,,15,M:Kunder:750,M:Artiklar:751,A:Kontrollpost:752,A:Leverantörer:753,A:Valutor:754,A:Royalty/leverantör:755,A:Betalningsvillkor:756,A:Leveransvillkor/sätt:757,A:Standardtexter:758,A:Klassificering:759,M:Utskrifter:760,A:Personliga snabbval:761,A:Generella snabbval:762,M:Primärskrivning:763,A:Diverse saldon:764," (bytes=28+359 fd=3 log=9) 960611 12:18:05 19 0 mpx <- GUI: 371 0 5 "760,," (bytes=28+5 fd=3 log=9) 960611 12:18:06 19 1 mpx -> GUI: 371 0 291 "Utskrifter,,11,A:Kunder:720,A:Kundetiketter:721,A:Kunder/Sökbegrepp:722,A:Artiklar:723,A:Leverantörer:724,A:Leverantörsetiketter:725,A:Registerlistor:726,A:Artikeletiketter:729,A:Rabatter Säljare/Kund:1380,M:Rapportgenerator:1381,M:Genererade rapporter:1382," (bytes=28+291 fd=3 log=9) 960611 12:18:06 20 0 mpx <- GUI: 371 0 5 "720,," (bytes=28+5 fd=3 log=9) 960611 12:18:06 20 1 mpx -> GUI: 373 0 20 "rgv/axs041Z,,Kunder," (bytes=28+20 fd=3 log=9) 960611 12:18:06 21 0 mpx <- GUI: 411 0 68 "rgv/axs041Z,adMix,3,99,J,41,0,0,GB,Registervård,Utskrifter,Kunder,,," (bytes=28+68 fd=3 log=9) 960611 12:18:06 21 1 mpx -> GUI: 411 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:06 22 0 mpx <- GUI: 420 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:06 22 1 mpx -> GUI: 420 0 68 "9453,rgv/axs041Z,3,adMix,Registervård,Utskrifter,Kunder,,,834495486," (bytes=28+68 fd=3 log=9) 960611 12:18:06 23 0 mpx <- GUI: 421 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:07 23 1 mpx -> GUI: 511 0 302 ">I0,0,21,80,0,1,1,32,0,0,5,0,0,0,0,>c01;00H>d>c01;01H>1mAntal listor....:>A,1,1,19,1,,()<>c02;01HRubriktext......:>A,2,2,19,60,,()<>c04;18HFr.o.m. kund....................>N,3,4,52,10,,()<>c06;18HT.o.m. kund.....................>N,4,6,52,10,,()<>c08;18H1 eller 2 kunder per sida.......>N,5,8,52,1,,()1<" (bytes=28+302 fd=3 log=9) 960611 12:18:07 24 0 mpx <- GUI: 501 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:07 24 1 mpx -> GUI: 501 0 2 "0," (bytes=28+2 fd=3 log=9) 960611 12:18:07 25 0 mpx <- GUI: 511 0 88 "1,0,0,1Rubriktext.................................................X 11 201" (bytes=28+88 fd=3 log=9) 960611 12:18:07 25 1 mpx -> GUI: 443 0 68 "9453,rgv/axs041Z,3,adMix,Registervård,Utskrifter,Kunder,,,834495487," (bytes=28+68 fd=3 log=9) 960611 12:18:07 25 2 mpx -> GUI: 480 0 67 "9453,rgv/axs041,3,adMix,Registervård,Utskrifter,Kunder,,,834495487," (bytes=28+67 fd=3 log=9) 960611 12:18:07 25 2 mpx -> GUI: 441 0 21 "9455,1,129,834495487," (bytes=28+21 fd=3 log=9) 960611 12:18:08 25 3 mpx -> GUI: 442 0 67 "9455,rgv/axs041,3,adMix,Registervård,Utskrifter,Kunder,,,834495487," (bytes=28+67 fd=3 log=9) 960611 12:18:09 25 4 mpx -> GUI: 451 0 5398 " ________________________________________________________________________________ ! ! ! ! ! ! ! ! ! Antal listor....: 1 ! ! Rubriktext......: Rubriktext.................................................X ! ! ! ! Fr.o.m. kund.................... 11 ! ! ! ! T.o.m. kund..................... 20 ! ! ! ! 1 eller 2 kunder per sida....... 1 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !________________________________________________________________________________! BS adMix Registervård Utskrifter Kunder 1996-06-11 12:18 Sida 1BE BS Rubriktext.................................................X demo Torbjörn GardBE BS Utskriftsintervall Fr.o.m: 11 T.o.m: 20BE Kundnr...................: 11 Sökbegrepp...............: J Namn/Attention...........: J / Adress/Postadress........: / 431 05 Göteborg Station/Telefon..........: / Telefon..... Distrikt/Kategori/Säljare: 1 / 1 / 1 Prislista/Rabatt (%).....: 1 / Leveransvillkor..........: 1 Leveranssätt.............: 10 Kreditgräns (Tkr)........: Betalningsvillkor........: 1 Reskontra/Kravspärr (J/J): J / Räntespärr/Inkasso (J/J).: / Moms (0-6)...............: 1 25.000 Anmärkning...............: BS adMix Registervård Utskrifter Kunder 1996-06-11 12:18 Sida 2BE BS Rubriktext.................................................X demo Torbjörn GardBE Kundnr...................: 17 Sökbegrepp...............: testkund koppl Namn/Attention...........: testkund 17 / Adress/Postadress........: Gatan 13 / Stan Station/Telefon..........: Stan / 13 13 13 Distrikt/Kategori/Säljare: / / Prislista/Rabatt (%).....: 1 / Leveransvillkor..........: 1 Leveranssätt.............: 2 Kreditgräns (Tkr)........: Betalningsvillkor........: 3 Reskontra/Kravspärr (J/J): J / Räntespärr/Inkasso (J/J).: / Moms (0-6)...............: 1 25.000 Anmärkning...............: BS adMix Registervård Utskrifter Kunder 1996-06-11 12:18 Sida 3BE BS Rubriktext.................................................X demo Torbjörn GardBE Kundnr...................: 18 Sökbegrepp...............: ICA BÖRSEN UMEÅ Namn/Attention...........: ICA BÖRSEN / IDNR: 304204 Adress/Postadress........: BODBYN 8333 / 905 90 UMEÅ Station/Telefon..........: / 090-570 90 Distrikt/Kategori/Säljare: / / Prislista/Rabatt (%).....: 1 / Leveransvillkor..........: 1 Leveranssätt.............: 2 Kreditgräns (Tkr)........: Betalningsvillkor........: 1 Reskontra/Kravspärr (J/J): J / Räntespärr/Inkasso (J/J).: / Moms (0-6)...............: 1 25.000 Anmärkning...............: " (bytes=28+5398 fd=3 log=9) 960611 12:18:08 25 4 mpx -> GUI: 442 0 67 "9455,rgv/axs041,3,adMix,Registervård,Utskrifter,Kunder,,,834495488," (bytes=28+67 fd=3 log=9) 960611 12:18:09 25 5 mpx -> GUI: 451 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:08 25 5 mpx -> GUI: 442 0 67 "9455,rgv/axs041,3,adMix,Registervård,Utskrifter,Kunder,,,834495488," (bytes=28+67 fd=3 log=9) 960611 12:18:09 25 6 mpx -> GUI: 483 0 21 "9455,1,129,834495487," (bytes=28+21 fd=3 log=9) 960611 12:18:07 26 0 mpx <- GUI: 481 0 0 "" (bytes=28+0 fd=3 log=9) 960611 12:18:07 26 1 mpx -> GUI: 481 0 0 "" (bytes=28+0 fd=3 log=9) PROTOKOLL Koppling mellan adMix och GUI Exempel fel & varning: --------------------- <- GUI: C190 0 4 4 "" (bytes=16 16) Type: C19: Error: Unsupported protocol subtype -> GUI: C199 46 4 4 "Type: C19: Error: Unsupported protocol subtype" (bytes=63 16) <- GUI: C900 0 4 4 "" (bytes=16 16) Type: C90: Error: Unsupported protocol type -> GUI: C909 43 4 4 "Type: C90: Error: Unsupported protocol type" (bytes=60 16) <- GUI: D000 0 4 4 "" (bytes=16 16) Type: D00: Error: Unsupported protocol family -> GUI: D009 45 4 4 "Type: D00: Error: Unsupported protocol family" (bytes=62 16) <- GUI: 1100 4 4 4 "1.19" (bytes=20 16) Type: 110: Warning: Different protocol versions: UNIX=1.21 GUI=1.19 -> GUI: 1105 71 4 4 "Type: 110: Warning: Different protocol versions: UNIX=1.21 Windows=1.19" (bytes=88 16) ----------------------------------------------------------------------- PROTOKOLL Koppling mellan adMix och GUI Diverse förklaringar -------------------- modeCode -------- "1" Standard UNIX-Spooler Idag: Namn på utskriftskö finns angiven i menyn. Denna används då. Client/Server: Utdata till skrivare skickas direkt till UNIX Spooler. "2" Visas på terminal Idag: Utskrifter visas på terminal. Bläddring framåt och åt sidorna men inte bakåt. Kan avbrytas godtyckligt. Client/Server: Utdata till skrivare skickas till GUI. Hantering sker enligt förvalt sätt lokalt i PC. "3" Terminalskrivare Idag: Skickas till skrivare ansluten till terminalen per en viss given max genomsnittshastighet. Kan inte avbrytas av operatören. Client/Server: Utdata till skrivare skickas till GUI. Hantering sker enligt förvalt sätt lokalt i PC. Lämpligtvis hanteras "2" och "3" på identiska sätt. Då kan t.ex operatören i förväg bestämma hur var och en av dessa ska behandlas. De val som kan komma ifråga kan vara: Utskrift till skrivare Spara i register Läggas in i MS/Word (som startas) Till excel (som startas) Utskriftssätt väljs när indata kommer Denna lista av valmöjligheter bör vara dynamisk. Operatören bör kunna komplettera eller ta bort i den. PROTOKOLL Koppling mellan adMix och GUI modeCode (forts) ---------------- "4" Annan utskriftskö Idag: Operatören väljer en specifik utskriftskö. Denna kö överstyr alla andra val (utom om applikationen anger annan). Client/Server: Utdata till skrivare skickas direkt till UNIX Spooler. "5" Inläggning i kö för körning under natten Idag: Applikationen startas inte. Läggs i stället i kö för körning under natten. Utskriftskö blir då enligt standard från menyspecifikation. Client/Server: Ingen speciell hantering önskvärd eller möjlig. "6" Utskriftssätt väljs vid applikationsstart Idag: Vid start av applikation visas sida där val enligt "1" - "5" ovan kan anges. Client/Server: En överlappning av funktioner. Denna kod bör förbjudas i servern. Avakta med implementering. "G" Inläggning av generella startinslag "P" Inläggning av personliga startinslag Idag: Vid uppstart av bakgrundsrutiner visas först en sida med startinslag. Dessa startinslag kan anges permanent om denna funktion används. De lagras då i ett register. Innehållet läggs sedan vid uppstart in i de fält som finns i sidan. Bakgrundsrutinen startas ej. Client/Server: Ingen speciell hantering önskvärd. "S" Inläggning av generella snabbval. "s" Inläggning av personliga snabbval. Idag: Snabbval är en komplettering till menyn. Vid val av denna funktion sker ingen uppstart av applikationen, utan istället uppdateras ett register. Innehållet kan sedan visas i en fönsterlista vid godtycklig senare tidpunkt. Uppstart kan då ske från detta fönster. Client/Server: Ingen speciell hantering önskvärd. PROTOKOLL Koppling mellan adMix och GUI Syntaxkontroller ---------------- En viss mängd syntaxkontroller sker. De kan delas in i följande grupper: Protokollsyntax: Endast godkända meddelandetyp släpps igenom. Kontroll att applikationspekare är korrekt. Status: Får inte vara annat än "0" vid familjetyper upp t o m "4" (f.n). Längder: . Kontrollerar att meddelandelängd stämmer. . Kontrollerar att meddelandelängd inte är större än bufferstorlek. . Kontrollerar att indatalängd stämmer med förväntad. meddelandetyp: . Menyn är händelsestyrd, men initieringen måste ske i bestämd ordning. . adMix applikationer förväntar sig en enstaka eller ett fåtal typer i ett givet ögonblick. Andra varianter tillåts inte. De typer som är tillåtna utöver den förväntade typen, kallas "händelsestyrda". (Se defini- tion) Kommaseparerad lista -------------------- adMix --> GUI En kommaseparerad lista slutar alltid med ett kommatecken. Det finns alltså ett bestämt antal kommatecken för varje sådan lista. adMix <-- GUI Ingen kontroll finns att rätt antal kommatecken finns med. Rutinerna söker normalt tills de hittar nästa. Finns inget så kan "memory violation" inträffa. Meddelande skickas dock till GUI om så sker. Teckenset --------- ISO8859 (vad gäller åäö ÅÄÖ) konverteras till adMix format (7-bits ascii) när meddelanden tas emot från GUI. Allt som skickas till GUI konverteras på motsvarande sätt. Val av teckenset borde läggas in i protokollet. (Teckenuppsättning internt är adMix normala. Dvs ascii 7 bitar. Dock finns möjlighet att ange att "åäöÅÄÖ" ska läggas i 8-bits format. Det finns tre varianter: ISO8859, DOS_IBM eller ROMAN_8. Detta anges i startscript "/usr/adMix/mpx/script/adMix" i environmenvariabel "CODE_SET". Exempel använder ISO8859.) PROTOKOLL Koppling mellan adMix och GUI Händelsestyrd ---------------- Normalt väntar en applikation på en viss given meddelandetyp. Vissa utvalda meddelandetyper kan dock hanteras när som helst. 1. Applikationsberoende godtycklig tidpunkt ------------------------------------------- Innebär att transaktionen kan ske när som helst när en applikation adresseras. Programinformation ------------------ Programinformation skickas av ett antal olika meddelandetyper. Den är beskriven här för att slippa upprepningar. Meddelandet är identiskt för olika meddelandetyper. Räkna med att förändringar (kompletteringar) kommer att ske i detta meddelande. Processnr bifogas för alla processer, men ska bara användas i sam- band med bakgrundsrutiner vid behov. (Och som intern referens för bakgrundsrutiner!) Programinformation kan komma flera gånger per process. I princip kan alla fält utom processnr ändras från gång till gång efterssom applikationen har möjlighet att ändra innehållet. Kommaseparerad lista: Programinformation. "Processnr,Programnamn,ModeCode,Spooler, Rutin-1,Rutin-2,Rutin-3,Rutin-4,Rutin-5,statusändring, Flaggor,Meddelande," processnr max 9(05) Programnamn max X(14) COBOL-namn ModeCode max X(01) Kod arbetssätt (se förklaring "modeCode") Spooler max X(10) Utskriftskö Rutin-1 max X(21) Menynamn Rutin-2 max X(21) Rutin-3 max X(21) Rutin-4 max X(21) Rutin-5 max X(21) statusändring 9(09) Senaste statusändring i rutinen. sekunder: tid i UNIX-format 960726 Flaggor max 9(05) Innehåll COBOL-specifikt fn. 960726 Meddelande max X(56) Innehåll COBOL-specifikt fn. Kan innehålla ID-begrepp, koder, etc. PROTOKOLL Koppling mellan adMix och GUI Processinformation ------------------ Kommaseparerad lista. "Processnr,Startad av,Flaggor,Starttid, Status,Level,Statusändring,Cputid,Ack cputid, bakgrundskod,rutin-1,rutin-2,rutin-3,rutin-4,rutin-5, Programnamn,modeCode,spooler,argv,fileStatus,fileName," Processnr max 9(05) Startad av (parent process) max 9(05) Flaggor Attention: 0/1 0 = Processen antagligen ointressant för operatören. 1 = Processen är intressant. Operatören ska kunna se att processen startats och någon typ av besked när den har avslutats. Besked om start måste dock fördröjas tills meddelande "442" har kommit. Övriga bitar kan fn. ignoreras. Starttid 9(09) sekunder: tid i UNIX-format Status: Processstatus Level: Menynivå 1-99 Statusändring: Senaste statusändring sekunder: tid i UNIX-format Cputid: CPU-sekunder (sek/10) Ack cputid: Ackumulerade CPU-sekunder (sek/10) (Inklusive avslutade subprocesser) bakgrundskod: Blankt, B, W Blankt = Interaktiv process B = Bakgrundsprocess W = Vänteläge Rutin-1: max X(21) Menynamn Rutin-2: max X(21) Rutin-3: max X(21) Rutin-4: max X(21) Rutin-5: max X(21) Programnamn: max X(14) COBOL-namn ModeCode: max X(01) Kod arbetssätt (se förklaring "modeCode") Spooler max X(10) Utskriftskö argv: max X(12) Senaste CALL/Registernamn fileStatus: max X(04) COBOL filstatus normalt blankt fileName: max X(18) COBOL filstatus normalt blankt PROTOKOLL Koppling mellan adMix och GUI Rapportöverföring ----------------- Rapporter till GUI skickas med bufferstorlek lika med bufferSize-256 tecken åt gången. Kompletta rader skickas. Varje meddelande kan därför innehålla hundratals rader. ESC-Sekvens behöver inte finnas. Men om det finns med så inleds den med en kod och avslutas med en annan. Flera samtidigt aktiva koder kan överlappa varandra helt eller delvis. Kompletta rader enligt: "Text ......" "BS" "IS" "LS" "US" "SS" "FS" Text 7-bits Ascii (modifierad enligt "CODE-SET") max ca. X(256) "BE" "IE" "LE" "UE" "SE" "FE" ... Ytterligare textrad(er) Form Feed ... Ytterligare textrad(er) = Hex 1B Det finns dock inget som hindrar att ESC-Sekvenser överlappar flera rader. Jag känner dock inte till något sådant fall. PROTOKOLL Koppling mellan adMix och GUI Format ------ Short: Network format unsigned short integer (16 bit) Long: Network format unsigned long integer (32 bit) "DELETE" ------- Detta motsvaras av en Delete-tangent eller en knapp markerad med texten "Avbryt". I dagens system genererar detta en transaktion till COBOL som är helt blank. Applikationerna uppfattar detta som ett kommando: Avslut, avbryt, backa, etc beroende på applikation. För de meddelandetyper där denna funktion skickas ska blanka tecken inte skickas. Det som ska skickas är "2,9,9," där "2" är kod för delete och 9,9, är aktuellt fältnummer (rad) och kolumn (editering) där operatören befann sig. De enda fall då innehåll i meddelande ska skickas är vid: - Urvalsfönster - Fönsterlista I dessa fall skickas innehåll i den rad (knapp) som är aktiv. Fönsterbeskrivning. ------------------ Denna fönsterbeskrivning skickas endast första gången som ett fönster uppdateras. Inledes med ">I". Kommaseparerad lista: ">I9,9,9,9,9,9,9,9,9,9,9,9,9,9,9," ">I" Inledning till fönsterbeskrivning. Fält 1: Offset: Radnummer (se FIXED_POSITION & REL_POSITION) Fält 2: Offset: Kolumn (se FIXED_POSITION & REL_POSITION) Fält 3: Antal rader i fönster (1-21) Fält 4: Antal kolumner i fönster (1-80) Fält 5: Typ av ram (kan eventuellt utnyttjas). Fält 6: Typ av rambelysning (kan eventuellt utnyttjas) Fält 7: Typ av textbelysning (kan eventuellt utnyttjas) Fält 8: Flaggor. (Se definition) Fält 9: Urval f o m radnummer (Urvalsfönster & urvalslista) Fält 10: Urval t o m radnummer (Urvalsfönster & urvalslista) Fält 11: Antal inslagsfält Fält 12: Antal knappar (urvalsfönster) Fält 13: Antal separatorer Fält 14: Urvalslista: Totalt antal rader Fält 15: Urvalslista: Hoppa över antal rader första gången. För urvalsfönster och urvalslista gäller att antal inslagsfält är noll samt att urval för radnummer och urval för kolumn är större än noll. För urvalslista gäller att rader i urvalslista ovan är större än noll. Antal rader för fönster och hoppa över antal första gången. För fönsterformulär gäller att antal inslagsfält är större än noll och att fältbeskrivningar finns med. För fönster utan inslag (NO_INPUT) gäller att det tas bort vid inslag av normal avslutsfunktion (tangent eller knapp, ospeci- ficerat så länge). PROTOKOLL Koppling mellan adMix och GUI Flaggor: Funktionsflaggor: ------------------------- define(NO_INPUT,1) Endast visa information. Ingen indata. define(INVISIBLE_CURSOR,2) (Ej relevant) define(NEW_SIZE,4) (Ej relevant) define(FREE_FORMAT,8) (Ej relevant) define(HELP_WINDOW,16) (Ej relevant) define(NO_BORDER,32) Om möjligt: Ingen ram. define(FIXED_POSITION,64) Position för övre vänster hörne angiven i rad, kolumn. define(WINDOW_LIST,128) (Ej relevant) (Separat meddelandetyp) define(REL_POSITION,256) Position för övre vänster hörne angiven i rad, kolumn relativt föregående fönster. define(EDIT_WINDOW,512) (Ej relevant) (Separat meddelandetyp) define(ECHO_OFF,1024) Hemligt inslag. Visa "*" istället. define(WINDOW_MESSAGE,2048) (Ej relevant) (Separat meddelandetyp) PROTOKOLL Koppling mellan adMix och GUI Terminalindata -------------- "X,99,99,..." X Tangent (se respektive meddelandetyp) 99 Fält/Radnummer 99 Kolumn (endast ifylld för editeringsfönster) ... Indata Olika fönstertyper och formulär använder olika format för "Indata": - Formulär och fönsterformulär: För formulär gäller att numeriska fält ska vara högerjusterade. Alfanumeriska som de är. Fältinnehåll skickas i den ordning de är definierade. OBS: Alltså ej enligt position. Fält för fält inklusive alla blanka och ej ändrade fält. Inga separatorer. Observera att det i adMix är möjligt att definiera fält i en ordning som inte motsvarar ordning på terminalen! Aktuellt fält returneras. Knappar för OK och Avbryt. - Hjälptextfönster För hjälptexter gäller att valt fält (eller knapp?) ska returneras m a p fältnummer och innehåll. Innehållets längd kontrolleras. Knappar för OK och Avbryt. - Urvalsfönster: Urvalsfönster är organiserade så att vissa rader kan väljas. Dessa visas i GUI som knappar som kan väljas. Knapparna har nummer från ett och uppåt. Detta nummer läggs i fält/radnummer när kommando ska skickas. Textinnehåll skickas också. Ingen redigering. Även blanka i början och slutet. Knappar för OK och Avbryt. Urvalsfönster ska dessutom ha knappar för piltangenter, home-tangent. - Fönsterlista: Fönsterlista är i grunden samma som urvalsfönster men listan är komplett. Endast en mindre del visas samtidigt. Som del av fönsterbeskrivning finns information om vilken listdel som ska visas. I övrigt som urvalsfönster. - Editeringsfönster: Innehåll i editeringsfönster rad för rad utan linefeed. Dvs. allt skickas. Rad och kolumn för cursorposition ska vara ifylld. PROTOKOLL Koppling mellan adMix och GUI Vid inslag i alfanumeriska fält tillåts tecken: Siffror 0-9 Bokstäver a-ö, A-Ö Blankt " " Alla 7-bits specialtecken utom "^`@#_<> Vid inslag i numeriska fält tillåts tecken: Heltal 0-9 . Decimalpunkt , Decimalkomma (konverteras till '.' av GUI) Decimaler 0-9 (behöver inte behandla mer än 5 decimaler) - Minustecken (före eller efter belopp) PROTOKOLL Koppling mellan adMix och GUI Terminaluppdatering. ------------------- I grunden vad som ska visas på terminalen. En terminaluppdatering kan ha längd 0 (dvs ingen uppdatering ska ske). Positionering av cursor, clear page, line, etc definieras i termcap. Fönsterseparator består av gadget eller liknande som sträcker sig från ena sidan till den andra vågrätt i ett fönster. Inslagsfält beskrivs under begreppet fältbeskrivning. När en fältbeskrivning kommer så ska den läggas in i GUI. Om den redan fanns definierad på samma sätt tidigare, så läggs fältinnehåll in i fältet. Fältbeskrivning. --------------- Fältbeskrivning definieras inom begreppet terminaluppdatering som en kommaseparerad lista: ">X,9,9,9,9,...,(...)...<" > Escape X A=Alfanumeriskt inslagsfält. N=Numeriskt inslagsfält 9 Fältnummer (1-999) 9 Rad 9 Kolumn 9 Längd (1-99) ... Eventuellt framtida fält ( Inledning till alternativvalssyntax. ... Alternativvalssyntax ) Avslutning alternativvalssyntax. ... Fältinnehåll vänsterjusterat. Numeriska fält kan innehålla 0-9, . och - Vad gäller alfanumeriska se tillåtna inslag. < Avslut av fältinnehåll. Efter inledning av fält (>N, >A) kommer två parenteser. Mellan dessa kommer i framtiden att läggas in valbara alternativ enligt viss syntax. Förutsätt alltså inte att dessa parenteser kommer i anslutning till varandra. För närvarande är det antagligen bäst att söka efter ')' för att komma till fältinnehåll. OBS: Endast ändrade fält skickas från adMix. Dvs. ändring m a p beskrivning eller fältinnehåll. Om en fältbeskrivning kommer, så är den komplett vad gäller beskrivning och innehåll. Om innehåll ska vara helt blankt, så är fältinnehåll dock tomt. PROTOKOLL Koppling mellan adMix och GUI Hypertextlänk ------------- Hypertextlänkar har följande syntax: ">H,N,L,...<" > Escape H Hjälptextfält , Separator N Nummer 1-99 , Separator L Längd , Separator ... Text i fält < Avslut Urvalsknapp ----------- Urvalsknapp används i urvalsfönster. För urvalsknapp gäller att den skickas första gången eller då innehåll ändras av applikationen. Knappnummer nedan tjänar som index. (Alternativt kan rad användas.) Det finns enbart en urvalsknapp per rad. Den behöver dock inte starta i första positionen men den sträcker sig alltid till högra kanten av fönstret. ">B,99,99,99,99,...<" > Escape B Knapp (Button) 99 Knappnummer (1-..) 99 Rad (0-..) 99 Startkolumn (0-..) 99 Längd (avser maximal textlängd) 99 Offset av text inom knapp (högerförskjutning) ... Text < Avslut av knappinnehåll. PROTOKOLL Koppling mellan adMix och GUI Exempel på läsning av protokoll. PROTOCOL har utseende: typedef struct protocol *protocolPointer; typedef struct protocol ä char *family; char *type; char *subtype; char *status; char *debugLevelå; int sequence; int subSequence; int length; APPLICATION a; char *message; /* Message content */ å _PROTOCOL; #define PROTOCOL _PROTOCOL * #define OFFSET_LENGTH 8 CONNECTION c är en struktur som bl.a har följande variabler: typedef struct connectionData *connectionPointer; typedef struct connectionData ä int fd; /* Connection file descriptor */ int bufferSize; char *buffer; int headerSize; /* Message offset in buffer */ PROTOCOL p; int GUILength; /* Längd applikationspekare */ int adMixLength; /* Längd applikationspekare */ å _CONNECTION; PROTOKOLL Koppling mellan adMix och GUI /* * mpxGetMessage: Läser nästa meddelande garanterat komplett * (om meddelandet korrekt). */ mpxgetMessage( c, fd ) CONNECTION c; int fd; ä int length; u_long net_length; /* * Läs först protokollhuvud! */ if ( ( length = read_exact_length( fd, c->buffer, c->headerSize ) ) == 0 ) ä return( 0 ); å /* * Ta fram meddelandelängd. */ memcpy( &net_length, &c->bufferÄOFFSET_LENGTHÅ, sizeof( u_long ) ); c->p->length = ntohl( net_length ); if ( c->p->length == 0 ) ä /* * Meddelande består bara av protokollhuvud! */ c->p->messageÄ0Å = NULL; return( length ); å /* * Läs sedan meddelandet! * Placera efter huvud. */ if ( ( length = read_exact_length( fd, &c->bufferÄc->headerSizeÅ, c->p->length ) ) == 0 ) ä return( 0 ); å c->p->messageÄc->p->lengthÅ = NULL; return( c->headerSize + c->p->length ); å PROTOKOLL Koppling mellan adMix och GUI /* * read_exact: Läser exakt det förväntade antalet tecken. * Returnerar noll vid misslyckande. * Annars den förväntade längden. */ static read_exact_length( fd, p, length ) int fd; char *p; int length; ä int n, r; for ( r=length; r > 0; r -= n, p +=n ) ä switch ( n = read( fd, p, r ) ) ä case 0: /* * Förbindelsen är bruten! */ return( 0 ); case -1: error( "mpxgetMessage: read" ); return( 0 ); default: break; å å return( length ); å