|
|
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, generic, package body My_Message, seg_055c8b, seg_055c92
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦this⟧
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
with Byte_Defs;
with Bounded_String;
with Const_Orb;
with Io_Exceptions;
with Transport;
with Transport_Defs;
with Utils;
package body My_Message is
function Initialize (Op : Kind_Of_Message;
Cont : My_String;
Req_I : Positive := Positive'Last;
L_I : My_String;
R_I : My_String) return Object is
begin
case Op is
when Request =>
return Object'(Operation => Request,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I,
Remote_Identifier => R_I);
when Reply =>
return Object'(Operation => Reply,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I,
Remote_Identifier => R_I);
when Reply_Filtration =>
return Object'(Operation => Reply_Filtration,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I,
Remote_Identifier => R_I);
when Forward =>
return Object'(Operation => Forward,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I,
Remote_Identifier => R_I);
when others =>
null;
end case;
end Initialize;
function Initialize (Op : Kind_Of_Message;
Cont : My_String;
Req_I : Positive := Positive'Last;
L_I : My_String) return Object is
R_I : My_String;
begin
case Op is
when Registration =>
return Object'(Operation => Registration,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Unregistration =>
return Object'(Operation => Unregistration,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Request =>
Bounded_String.Copy (R_I, Const_Orb.No_Remote_Id);
return Object'(Operation => Request,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I,
Remote_Identifier => R_I);
when Forward =>
return Object'(Operation => Forward,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I,
Remote_Identifier => R_I);
when Forward_Filtration =>
return Object'(Operation => Forward_Filtration,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Forward_Reply =>
return Object'(Operation => Forward_Reply,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Publication =>
return Object'(Operation => Publication,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Unpublication =>
return Object'(Operation => Unpublication,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Publication_Filter =>
return Object'(Operation => Publication_Filter,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Unpublication_Filter =>
return Object'(Operation => Unpublication_Filter,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Subscription =>
return Object'(Operation => Subscription,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Unsubscription =>
return Object'(Operation => Unsubscription,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Filtration =>
return Object'(Operation => Filtration,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Unfiltration =>
return Object'(Operation => Unfiltration,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Reply_Error =>
return Object'(Operation => Reply_Error,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Reply_Filtration =>
return Object'(Operation => Reply_Filtration,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I,
Remote_Identifier => R_I);
when Reply_Subscription =>
return Object'(Operation => Reply_Subscription,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Content =>
return Object'(Operation => Content,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Notification =>
return Object'(Operation => Notification,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when Query =>
return Object'(Operation => Query,
Content => Cont,
Request_Identifier => Req_I,
Local_Identifier => L_I);
when others =>
null;
end case;
end Initialize;
generic
Char : Character;
procedure Extract (Target : in out My_String;
Source : My_String;
Crt : in out Positive);
procedure Extract (Target : in out My_String;
Source : My_String;
Crt : in out Positive) is
begin
while Bounded_String.Char_At (Source, Crt) /= Char loop
Bounded_String.Append (Target,
Bounded_String.Char_At (Source, Crt));
Crt := Crt + 1;
end loop;
Crt := Crt + 1;
end Extract;
function Image (Mess : Object) return My_String is
Buffer : My_String;
Separator : constant Character := '#';
begin
Bounded_String.Copy
(Buffer, Separator & Kind_Of_Message'Image (Mess.Operation) &
Separator & Bounded_String.Image (Mess.Content) &
Separator &
Bounded_String.Image (Mess.Local_Identifier) &
Separator);
if Mess.Operation = Request or Mess.Operation = Forward or
Mess.Operation = Reply or Mess.Operation = Reply_Filtration then
Bounded_String.Append
(Buffer, Bounded_String.Image (Mess.Remote_Identifier) &
Separator);
end if;
Bounded_String.Append
(Buffer, Positive'Image (Mess.Request_Identifier) & Separator);
return Buffer;
end Image;
function Value (Mess : My_String) return Object is
Separator : constant Character := '#';
Crt, Last : Positive;
Op : Kind_Of_Message;
Buffer : My_String;
Cont_Tmp, L_Id_Tmp, R_Id_Tmp, Req_Id_Tmp : My_String;
procedure Extract_Value is new Extract (Char => Separator);
begin
Crt := 1;
if Bounded_String.Char_At (Mess, Crt) = Separator then
Crt := Crt + 1;
else
Text_Io.Put_Line ("First separator is missing");
end if;
Extract_Value (Target => Buffer, Source => Mess, Crt => Crt);
Kind_Of_Mess_Io.Get (Bounded_String.Image (Buffer), Op,
Last); -- Transforme un string en enumeration
Extract_Value (Target => Cont_Tmp, Source => Mess, Crt => Crt);
Extract_Value (Target => L_Id_Tmp, Source => Mess, Crt => Crt);
if Op = Request or Op = Reply or
Op = Forward or Op = Reply_Filtration then
Extract_Value (Target => R_Id_Tmp, Source => Mess, Crt => Crt);
Extract_Value (Target => Req_Id_Tmp, Source => Mess, Crt => Crt);
return Initialize (Op => Op,
Cont => Cont_Tmp,
Req_I => Positive'Value
(Bounded_String.Image (Req_Id_Tmp)),
L_I => L_Id_Tmp,
R_I => R_Id_Tmp);
else
Extract_Value (Target => Req_Id_Tmp, Source => Mess, Crt => Crt);
return Initialize (Op => Op,
Cont => Cont_Tmp,
Req_I => Positive'Value
(Bounded_String.Image (Req_Id_Tmp)),
L_I => L_Id_Tmp);
end if;
end Value;
function Get_Operation (Mess : Object) return Kind_Of_Message is
begin
return Mess.Operation;
end Get_Operation;
function Get_Content (Mess : Object) return My_String is
begin
return Mess.Content;
end Get_Content;
function Get_Request_Identifier (Mess : Object) return Positive is
begin
return Mess.Request_Identifier;
end Get_Request_Identifier;
function Get_Local_Identifier (Mess : Object) return My_String is
begin
return Mess.Local_Identifier;
end Get_Local_Identifier;
function Get_Remote_Identifier (Mess : Object) return My_String is
begin
return Mess.Remote_Identifier;
end Get_Remote_Identifier;
procedure Send (Mess : in out Object; Rem_Id : My_String) is
Connection : Transport.Connection_Id;
Status : Transport_Defs.Status_Code;
Local_Socket, Remote_Socket : Transport_Defs.Socket_Id (0 .. 1);
Local_Host, Remote_Host, Host_Tmp : Const_Orb.Host;
Separator : constant Character := '%';
Crt, Last : Positive;
Count : Natural;
L_H : String (1 .. 15);
Buffer, R_Id_Tmp, R_H_Tmp : My_String;
procedure Extract_Send is new Extract (Char => Separator);
package Host_Io is new Text_Io.Enumeration_Io (Const_Orb.Host);
begin
while not Transport.Is_Open (Connection) loop
Transport.Open (Connection => Connection,
Status => Status,
Network => Const_Orb.Our_Network);
end loop;
if Get_Operation (Mess) = Registration then
loop
begin
Text_Io.Put ("Type your machine's name: ");
Host_Io.Get (Host_Tmp);
exit;
exception
when Io_Exceptions.Data_Error =>
Text_Io.Put_Line (" Bad argument !");
Text_Io.Put ("You must type one of these names: ");
for I in Const_Orb.Host loop
Host_Io.Put (I);
Text_Io.Put (", ");
end loop;
Text_Io.Put_Line ("");
end;
end loop;
Host_Io.Put (L_H, Host_Tmp);
Text_Io.New_Line;
Bounded_String.Copy (Mess.Local_Identifier,
Utils.Byte_String_To_String
(Byte_Defs.Byte_String
(Transport.Local_Socket (Connection))) &
Separator & L_H & Separator);
Text_Io.Put_Line ("Waiting for the connection with ORB...");
end if;
Crt := Positive'First;
Extract_Send (Target => R_Id_Tmp, Source => Rem_Id, Crt => Crt);
Remote_Socket := Transport_Defs.Socket_Id
(Utils.String_To_Byte_String
(Bounded_String.Image (R_Id_Tmp)));
Extract_Send (Target => R_H_Tmp, Source => Rem_Id, Crt => Crt);
Const_Orb.Host_Io.Get (From => Bounded_String.Image (R_H_Tmp),
Item => Remote_Host,
Last => Last);
while not Transport.Is_Connected (Connection) loop
Transport.Connect
(Connection, Status,
Const_Orb.Our_Host_Table (Remote_Host), Remote_Socket);
end loop;
Transport.Transmit
(Connection, Status,
Utils.String_To_Byte_String (Bounded_String.Image (Image (Mess))),
Count);
Text_Io.Put_Line (Natural'Image (Count) &
" bytes have been transmitted. Message : " &
Bounded_String.Image (Image (Mess)));
Transport.Disconnect (Connection);
Transport.Close (Connection);
end Send;
procedure Receive (Mess : out Object; Local_Id : My_String) is
Connection : Transport.Connection_Id;
Status : Transport_Defs.Status_Code;
Local_Socket : Transport_Defs.Socket_Id (0 .. 1);
Data : Byte_Defs.Byte_String (1 .. 255);
Count : Natural;
Separator : constant Character := '%';
L_Id_Tmp : My_String;
Crt : Positive;
procedure Extract_Receive is new Extract (Char => Separator);
begin
Crt := Positive'First;
Extract_Receive (Target => L_Id_Tmp, Source => Local_Id, Crt => Crt);
Local_Socket := Transport_Defs.Socket_Id
(Utils.String_To_Byte_String
(Bounded_String.Image (L_Id_Tmp)));
while not Transport.Is_Open (Connection) loop
Transport.Open (Connection, Status,
Const_Orb.Our_Network, Local_Socket);
end loop;
Transport.Connect (Connection, Status);
Transport.Receive (Connection, Status, Data, Count);
Mess := Value (Bounded_String.Value
(Utils.Byte_String_To_String (Data)));
Transport.Disconnect (Connection);
Transport.Close (Connection);
end Receive;
end My_Message;
nblk1=15
nid=a
hdr6=24
[0x00] rec0=1d rec1=00 rec2=01 rec3=046
[0x01] rec0=17 rec1=00 rec2=14 rec3=03a
[0x02] rec0=14 rec1=00 rec2=04 rec3=072
[0x03] rec0=14 rec1=00 rec2=0e rec3=01a
[0x04] rec0=05 rec1=00 rec2=03 rec3=02a
[0x05] rec0=12 rec1=00 rec2=05 rec3=068
[0x06] rec0=0b rec1=00 rec2=0f rec3=02c
[0x07] rec0=12 rec1=00 rec2=07 rec3=068
[0x08] rec0=19 rec1=00 rec2=10 rec3=04e
[0x09] rec0=1a rec1=00 rec2=02 rec3=046
[0x0a] rec0=19 rec1=00 rec2=08 rec3=02a
[0x0b] rec0=10 rec1=00 rec2=11 rec3=080
[0x0c] rec0=1f rec1=00 rec2=0d rec3=008
[0x0d] rec0=18 rec1=00 rec2=0c rec3=03e
[0x0e] rec0=16 rec1=00 rec2=15 rec3=056
[0x0f] rec0=12 rec1=00 rec2=13 rec3=02c
[0x10] rec0=1a rec1=00 rec2=0b rec3=02c
[0x11] rec0=19 rec1=00 rec2=06 rec3=000
[0x12] rec0=19 rec1=00 rec2=0b rec3=054
[0x13] rec0=05 rec1=00 rec2=06 rec3=000
[0x14] rec0=00 rec1=00 rec2=00 rec3=000
tail 0x21760f06a87c05ce0ce1c 0x42a00088462060003
Free Block Chain:
0xa: 0000 00 09 03 fc 00 39 20 20 20 20 20 20 20 20 20 20 ┆ 9 ┆
0x9: 0000 00 12 00 17 80 14 6c 5f 49 64 65 6e 74 69 66 69 ┆ l_Identifi┆
0x12: 0000 00 00 00 09 80 06 74 65 6d 20 3d 3e 06 73 20 3a ┆ tem => s :┆