|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 22528 (0x5800) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Generic_Agent, seg_057482
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─⟦cfc2e13cd⟧ »Space Info Vol 2« └─⟦this⟧
with Queue_Generic; with Transport; package body Generic_Agent is package Queue_Mail is new Queue_Generic (Element => Frame_Defs.Frame); The_Connection : Orb_Defs.Connection_Id; -- The connection used to send a mail to the ORB The_Success : Boolean; -- Variable to detect error during mail sending The_Agent_Socket : Orb_Defs.Socket_Id := Orb_Defs.Null_Socket_Id; -- The socket during the mail sending Registrated : Boolean := False; -- -- les taches de ce package -- task Dispatcher is entry Dispose; end Dispatcher; task Agent_As_A_Server is entry Dispose; entry Give_Request (The_Request : Frame_Defs.Frame); end Agent_As_A_Server; task Agent_As_A_Customer is entry Dispose; entry Give_Job_Answer (The_Answer : Frame_Defs.Frame); entry Is_There_An_Answer (The_Success : out Boolean); entry Take_Job_Answer (The_Answer : out Frame_Defs.Frame); end Agent_As_A_Customer; procedure Convert (To_Be_Converted : Frame_Defs.Frame; Converted : out Frame_Defs.Communication_Data) is begin Frame_Defs.Get_Frame (To_Be_Converted, Converted); end Convert; package Agent_Mailer is new Mail_Sender (Frame_Defs.Frame, Convert); -- -- procedures et fonctions internes -- procedure Init is begin Text_Io.Put_Line ("Generic_Agent is going to initiate its letter box."); Letter_Box_Frames.Init; -- Init of the agent's letter box object Text_Io.Put_Line ("Generic_Agent is going to initiate its connector."); Connector_Frames.Init (The_Agent_Socket); -- Init of the agent's connector object Agent_Mailer.Init (The_Connection, Orb_Defs.Network_Kind, The_Agent_Socket); -- Init of the agent's variables used to send mail end Init; procedure Send_Mail_To_Orb (The_Time_Out : Natural; Success : out Boolean; The_Mail_To_Send : Frame_Defs.Frame) is begin Text_Io.Put_Line ("Agent is going to send :"); Text_Io.Put_Line (Frame_Defs.Image (The_Mail_To_Send)); Agent_Mailer.Send_Mail (The_Connection => The_Connection, The_Remote_Host => (193, 54, 146, 132), The_Remote_Socket => Orb_Defs.Default_Orb_Socket, The_Time_Out => The_Time_Out, Success => Success, The_Mail_To_Send => The_Mail_To_Send); Text_Io.Put_Line ("Going out of send_mail_to_orb"); end Send_Mail_To_Orb; procedure Dispatch (The_Mail : Frame_Defs.Frame) is The_Service_Kind : Orb_Defs.Class; The_Service : Orb_Defs.Funct; begin Frame_Defs.Get (The_String_Field => Frame_Defs.Service_Kind_Field, The_Frame => The_Mail, The_Str => The_Service_Kind); Frame_Defs.Get (The_String_Field => Frame_Defs.Service_Field, The_Frame => The_Mail, The_Str => The_Service); -- trier les retours de job et les autres requetes (check ou demandes de job a l'agent) Text_Io.Put_Line ("DISPATCHER working on " & The_Service_Kind & " " & The_Service); if The_Service_Kind = "rjob" then Agent_As_A_Customer.Give_Job_Answer (The_Mail); elsif The_Service_Kind = "regi" then if The_Service = "ok " then Registrated := True; end if; elsif The_Service_Kind = "unre" then if The_Service = "ok " then Registrated := False; end if; elsif The_Service_Kind /= "chck" then Agent_As_A_Server.Give_Request (The_Mail); end if; end Dispatch; procedure Reverse_Adresses (The_Frame : in out Frame_Defs.Frame) is Dest_Ad, Exp_Ad : Orb_Defs.Host_Id; Dest_Socket, Exp_Socket : Orb_Defs.Socket_Id; begin Frame_Defs.Get (Frame_Defs.Exp_Host_Field, The_Frame, Exp_Ad); Frame_Defs.Get (Frame_Defs.Dest_Host_Field, The_Frame, Dest_Ad); Frame_Defs.Set (Frame_Defs.Exp_Host_Field, Dest_Ad, The_Frame); Frame_Defs.Set (Frame_Defs.Dest_Host_Field, Exp_Ad, The_Frame); Frame_Defs.Get (Frame_Defs.Exp_Socket_Field, The_Frame, Exp_Socket); Frame_Defs.Get (Frame_Defs.Dest_Socket_Field, The_Frame, Dest_Socket); Frame_Defs.Set (Frame_Defs.Exp_Socket_Field, Dest_Socket, The_Frame); Frame_Defs.Set (Frame_Defs.Dest_Socket_Field, Exp_Socket, The_Frame); end Reverse_Adresses; task body Dispatcher is Done : Boolean := False; The_Mail : Frame_Defs.Frame; begin -- init of the objects used by this agent Init; loop select accept Dispose do Done := True; end Dispose; else if Letter_Box_Frames.Check = True then -- is there a letter ? Letter_Box_Frames.Read (The_Mail); -- if so then read it Dispatch (The_Mail); -- and dispatch it end if; exit when Done = True; end select; end loop; end Dispatcher; task body Agent_As_A_Customer is The_Answers_Fifo : Queue_Mail.Queue; Done : Boolean := False; begin loop select accept Give_Job_Answer (The_Answer : Frame_Defs.Frame) do Queue_Mail.Add (The_Answers_Fifo, The_Answer); Text_Io.Put_Line ("Job answer added to the answer fifo."); end Give_Job_Answer; or accept Take_Job_Answer (The_Answer : out Frame_Defs.Frame) do The_Answer := Queue_Mail.First (The_Answers_Fifo); Queue_Mail.Delete (The_Answers_Fifo); Text_Io.Put_Line ("Job answer extracted from the fifo."); end Take_Job_Answer; or accept Is_There_An_Answer (The_Success : out Boolean) do The_Success := not Queue_Mail.Is_Empty (The_Answers_Fifo); end Is_There_An_Answer; or accept Dispose do Done := True; end Dispose; end select; delay (3.0); Text_Io.Put_Line ("Agent as a customer is alive."); exit when Done = True; end loop; end Agent_As_A_Customer; task body Agent_As_A_Server is The_Requests_Fifo : Queue_Mail.Queue; Done : Boolean := False; begin loop select accept Give_Request (The_Request : Frame_Defs.Frame) do Queue_Mail.Add (The_Requests_Fifo, The_Request); Text_Io.Put_Line ("Request added to the request fifo."); end Give_Request; or accept Dispose do Done := True; end Dispose; else -- faire bosser le Treat ici. if not Queue_Mail.Is_Empty (The_Requests_Fifo) then declare The_Frame : Frame_Defs.Frame; The_Service_Kind : Orb_Defs.Class; The_Service : Orb_Defs.Funct; Treat_Result : V_String.Variable_String; The_Success : Boolean; begin -- recuperer la frame et extraire les champs specifiant le job demande The_Frame := Queue_Mail.First (The_Requests_Fifo); Queue_Mail.Delete (The_Requests_Fifo); Frame_Defs.Get (Frame_Defs.Service_Kind_Field, The_Frame, The_Service_Kind); Frame_Defs.Get (Frame_Defs.Service_Field, The_Frame, The_Service); Text_Io.Put_Line ("Agent is going to treat with " & The_Service_Kind & " and " & The_Service); Treat_Result := V_String.Value (Treat (The_Service_Kind, The_Service)); -- modification de la trame pour le retour Frame_Defs.Set (Frame_Defs.Nom_Exp_Field, Name, The_Frame); Frame_Defs.Set (Frame_Defs.Service_Kind_Field, "rjob", The_Frame); Frame_Defs.Set (Frame_Defs.Service_Field, "rjob", The_Frame); Frame_Defs.Set (Frame_Defs.Message_Field, Treat_Result, The_Frame); Reverse_Adresses (The_Frame); Send_Mail_To_Orb (200, The_Success, The_Frame); end; end if; end select; delay (3.0); Text_Io.Put_Line ("Agent as a server is alive."); exit when Done = True; end loop; end Agent_As_A_Server; -- -- declarations des fonctions et procedures visibles -- procedure Close is begin Agent_Mailer.Close (The_Connection); Text_Io.Put_Line ("The connection was closed by the Agent."); Letter_Box_Frames.Dispose; Text_Io.Put_Line ("Letter box's agent disposed."); Connector_Frames.Dispose; Text_Io.Put_Line ("Connector's agent disposed."); Agent_As_A_Server.Dispose; Text_Io.Put_Line ("Server task disposed."); Agent_As_A_Customer.Dispose; Text_Io.Put_Line ("Customer task disposed."); Dispatcher.Dispose; Text_Io.Put_Line ("Dispatcher task disposed."); end Close; procedure Register (The_Contract_Descriptor : Contract_Descriptor) is The_Frame : Frame_Defs.Frame; begin -- fabrication de la trame de registration Frame_Defs.Init_Frame (Name, Orb_Defs.Default_Orb_Socket, Orb_Defs.Default_Orb_Host, Connector_Frames.Get_Current_Socket, Transport.Local_Host (Orb_Defs.Network_Kind), 0, 0, "regi", "serv", V_String.Image (The_Contract_Descriptor.Data), The_Frame); Send_Mail_To_Orb (100, The_Success, The_Frame); if The_Success = True then Text_Io.Put_Line ("Registration Contract sending was successfull !"); else Text_Io.Put_Line ("Registration Contract sending failed !!!"); end if; end Register; procedure Unregister is The_Frame : Frame_Defs.Frame; begin -- fabrication de la trame de unregistration Frame_Defs.Init_Frame (Name, Orb_Defs.Default_Orb_Socket, Orb_Defs.Default_Orb_Host, Connector_Frames.Get_Current_Socket, Transport.Local_Host (Orb_Defs.Network_Kind), 0, 0, "unre", "serv", "Happy to unregister", The_Frame); Send_Mail_To_Orb (100, The_Success, The_Frame); if The_Success = True then Text_Io.Put_Line ("Unregistration Contract sending was successfull !"); else Text_Io.Put_Line ("Unregistration Contract sending failed !!!"); end if; end Unregister; procedure Ask_For_A_Job (The_Wanted_Class : Orb_Defs.Class; The_Wanted_Function : Orb_Defs.Funct; The_Job_Number : in Natural) is The_Frame : Frame_Defs.Frame; begin -- fabrication de la trame de demande Frame_Defs.Init_Frame (Name, Orb_Defs.Null_Socket_Id, Orb_Defs.Null_Host_Id, Connector_Frames.Get_Current_Socket, Transport.Local_Host (Orb_Defs.Network_Kind), 0, The_Job_Number, The_Wanted_Class, The_Wanted_Function, "I want you to find a worker for me !", The_Frame); Send_Mail_To_Orb (100, The_Success, The_Frame); if The_Success = True then Text_Io.Put_Line ("Ask for a job sending was successfull !"); else Text_Io.Put_Line ("Ask for a job sending sending failed !!!"); end if; end Ask_For_A_Job; function Is_There_A_Job_Result return Boolean is The_Check : Boolean; begin Agent_As_A_Customer.Is_There_An_Answer (The_Check); return The_Check; end Is_There_A_Job_Result; procedure Get_Job_Result (The_Number : out Natural; The_Job_Answer : in out V_String.Variable_String) is The_Frame : Frame_Defs.Frame; The_Service : Orb_Defs.Funct; begin Agent_As_A_Customer.Take_Job_Answer (The_Frame); -- recuperer le numero de la reponse Frame_Defs.Get (Frame_Defs.Message_Number_Field, The_Frame, The_Number); Frame_Defs.Get (Frame_Defs.Service_Field, The_Frame, The_Service); if The_Service = "fail" then The_Job_Answer := V_String.Value ("fail"); else -- recuperer le contenu de la reponse Frame_Defs.Get (Frame_Defs.Message_Field, The_Frame, The_Job_Answer); end if; end Get_Job_Result; function Is_Registrated return Boolean is begin return Registrated; end Is_Registrated; -- methodes manipulant le descripteur de contrat procedure Add_Field (The_Descriptor : in out Contract_Descriptor; The_Item : String) is begin V_String.Append (The_Descriptor.Data, The_Item); end Add_Field; procedure Add_Field (The_Descriptor : in out Contract_Descriptor; The_Number : Natural) is begin V_String.Append (The_Descriptor.Data, Natural'Image (The_Number)); end Add_Field; end Generic_Agent;
nblk1=15 nid=5 hdr6=20 [0x00] rec0=25 rec1=00 rec2=01 rec3=046 [0x01] rec0=1d rec1=00 rec2=0c rec3=006 [0x02] rec0=17 rec1=00 rec2=13 rec3=026 [0x03] rec0=1b rec1=00 rec2=0a rec3=008 [0x04] rec0=1b rec1=00 rec2=04 rec3=012 [0x05] rec0=22 rec1=00 rec2=14 rec3=028 [0x06] rec0=21 rec1=00 rec2=02 rec3=04a [0x07] rec0=1d rec1=00 rec2=12 rec3=04e [0x08] rec0=11 rec1=00 rec2=0e rec3=014 [0x09] rec0=12 rec1=00 rec2=11 rec3=02c [0x0a] rec0=1e rec1=00 rec2=0f rec3=012 [0x0b] rec0=18 rec1=00 rec2=07 rec3=028 [0x0c] rec0=15 rec1=00 rec2=06 rec3=056 [0x0d] rec0=19 rec1=00 rec2=15 rec3=054 [0x0e] rec0=1f rec1=00 rec2=09 rec3=07a [0x0f] rec0=07 rec1=00 rec2=03 rec3=000 [0x10] rec0=01 rec1=00 rec2=0e rec3=000 [0x11] rec0=01 rec1=00 rec2=0e rec3=000 [0x12] rec0=07 rec1=00 rec2=09 rec3=032 [0x13] rec0=1f rec1=00 rec2=03 rec3=00a [0x14] rec0=01 rec1=00 rec2=0e rec3=000 tail 0x21764511a87c77d7fb846 0x42a00088462060003 Free Block Chain: 0x5: 0000 00 10 03 fb 80 2b 20 20 20 20 20 20 20 20 20 20 ┆ + ┆ 0x10: 0000 00 08 03 fc 00 42 20 20 20 20 20 20 20 20 20 20 ┆ B ┆ 0x8: 0000 00 0d 03 f9 80 0f 65 6e 20 44 6f 6e 65 20 3d 20 ┆ en Done = ┆ 0xd: 0000 00 0b 03 fc 80 05 31 33 32 29 2c 05 00 3e 20 20 ┆ 132), > ┆ 0xb: 0000 00 00 01 81 80 04 6c 65 63 74 04 00 00 00 00 21 ┆ lect !┆