echo
exampleWe consider building a simple “Echo” CORBA server and client. This application echoes a string. The source code for this example is located in the examples/corba/echo directory in the PolyORB distribution. This applications uses only basic elements of CORBA.
To build this application, you need the following pieces of code:
echo
object
echo
object
echo
objectThis interface defines an echo
object with a unique method
echoString
. Per construction, this method returns its argument.
interface Echo { string echoString (in string Mesg); }; |
echo
objectPackage Echo.Impl
is an implementation of this interface. This
implementation follows the IDL-to-Ada mapping.
------------------------------------------------------------------------------ -- -- -- POLYORB COMPONENTS -- -- -- -- E C H O . I M P L -- -- -- -- S p e c -- -- -- -- Copyright (C) 2002-2012, Free Software Foundation, Inc. -- -- -- -- This is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- -- ware Foundation; either version 3, or (at your option) any later ver- -- -- sion. This software is distributed in the hope that it will be useful, -- -- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- -- -- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -- -- License for more details. -- -- -- -- You should have received a copy of the GNU General Public License and -- -- a copy of the GCC Runtime Library Exception along with this program; -- -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -- <http://www.gnu.org/licenses/>. -- -- -- -- PolyORB is maintained by AdaCore -- -- (email: sales@adacore.com) -- -- -- ------------------------------------------------------------------------------ with CORBA; with PortableServer; package Echo.Impl is -- My own implementation of echo object. -- This is simply used to define the operations. type Object is new PortableServer.Servant_Base with null record; type Object_Acc is access Object; function EchoString (Self : access Object; Mesg : CORBA.String) return CORBA.String; end Echo.Impl;
------------------------------------------------------------------------------ -- -- -- POLYORB COMPONENTS -- -- -- -- E C H O . I M P L -- -- -- -- B o d y -- -- -- -- Copyright (C) 2002-2012, Free Software Foundation, Inc. -- -- -- -- This is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- -- ware Foundation; either version 3, or (at your option) any later ver- -- -- sion. This software is distributed in the hope that it will be useful, -- -- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- -- -- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -- -- License for more details. -- -- -- -- You should have received a copy of the GNU General Public License and -- -- a copy of the GCC Runtime Library Exception along with this program; -- -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -- <http://www.gnu.org/licenses/>. -- -- -- -- PolyORB is maintained by AdaCore -- -- (email: sales@adacore.com) -- -- -- ------------------------------------------------------------------------------ with Ada.Text_IO; with Echo.Skel; pragma Warnings (Off, Echo.Skel); -- No entity from Echo.Skel is referenced. package body Echo.Impl is ---------------- -- EchoString -- ---------------- function EchoString (Self : access Object; Mesg : CORBA.String) return CORBA.String is pragma Warnings (Off); pragma Unreferenced (Self); pragma Warnings (On); S : String := CORBA.To_Standard_String (Mesg); L : Natural := S'Last; begin if S'Length > 13 then L := S'First + 12; S (L - 2 .. L) := (others => '.'); end if; Ada.Text_IO.Put_Line ("Echoing string: « " & S (S'First .. L) & " »"); return Mesg; end EchoString; end Echo.Impl;
Note: Echo.Impl
body requires a dependency on
Echo.Skel
to ensure the elaboration of skeleton code and the
correct setup of PolyORB's internals.
Client and server code demonstrate how to make a remote invocation on a CORBA object, and how to set up an object on a server node.
Note: the dependency on PolyORB.Setup.Client
or
PolyORB.Setup.No_Tasking_Server
enforces compile-time
configuration, see Sample files.
IOR
), which is passed on command
line.
------------------------------------------------------------------------------ -- -- -- POLYORB COMPONENTS -- -- -- -- C L I E N T -- -- -- -- B o d y -- -- -- -- Copyright (C) 2002-2012, Free Software Foundation, Inc. -- -- -- -- This is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- -- ware Foundation; either version 3, or (at your option) any later ver- -- -- sion. This software is distributed in the hope that it will be useful, -- -- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- -- -- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -- -- License for more details. -- -- -- -- As a special exception under Section 7 of GPL version 3, you are granted -- -- additional permissions described in the GCC Runtime Library Exception, -- -- version 3.1, as published by the Free Software Foundation. -- -- -- -- You should have received a copy of the GNU General Public License and -- -- a copy of the GCC Runtime Library Exception along with this program; -- -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -- <http://www.gnu.org/licenses/>. -- -- -- -- PolyORB is maintained by AdaCore -- -- (email: sales@adacore.com) -- -- -- ------------------------------------------------------------------------------ -- echo client. with Ada.Command_Line; with Ada.Text_IO; with CORBA.ORB; with Echo; with PolyORB.Setup.Client; pragma Warnings (Off, PolyORB.Setup.Client); with PolyORB.Utils.Report; procedure Client is use Ada.Command_Line; use Ada.Text_IO; use PolyORB.Utils.Report; Sent_Msg, Rcvd_Msg : CORBA.String; myecho : Echo.Ref; begin New_Test ("Echo client"); CORBA.ORB.Initialize ("ORB"); if Argument_Count /= 1 then Put_Line ("usage : client <IOR_string_from_server>|-i"); return; end if; -- Getting the CORBA.Object CORBA.ORB.String_To_Object (CORBA.To_CORBA_String (Ada.Command_Line.Argument (1)), myecho); -- Checking if it worked if Echo.Is_Nil (myecho) then Put_Line ("main : cannot invoke on a nil reference"); return; end if; -- Sending message Sent_Msg := CORBA.To_CORBA_String (Standard.String'("Hello Ada !")); Rcvd_Msg := Echo.echoString (myecho, Sent_Msg); -- Printing result Put_Line ("I said : " & CORBA.To_Standard_String (Sent_Msg)); Put_Line ("The object answered : " & CORBA.To_Standard_String (Rcvd_Msg)); End_Report; exception when E : CORBA.Transient => declare Memb : CORBA.System_Exception_Members; begin CORBA.Get_Members (E, Memb); Put ("received exception transient, minor"); Put (CORBA.Unsigned_Long'Image (Memb.Minor)); Put (", completion status: "); Put_Line (CORBA.Completion_Status'Image (Memb.Completed)); End_Report; end; end Client;
RootPOA
. Then an IOR
reference is built to enable
interaction with other nodes.
------------------------------------------------------------------------------ -- -- -- POLYORB COMPONENTS -- -- -- -- S E R V E R -- -- -- -- B o d y -- -- -- -- Copyright (C) 2002-2012, Free Software Foundation, Inc. -- -- -- -- This is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- -- ware Foundation; either version 3, or (at your option) any later ver- -- -- sion. This software is distributed in the hope that it will be useful, -- -- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- -- -- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -- -- License for more details. -- -- -- -- As a special exception under Section 7 of GPL version 3, you are granted -- -- additional permissions described in the GCC Runtime Library Exception, -- -- version 3.1, as published by the Free Software Foundation. -- -- -- -- You should have received a copy of the GNU General Public License and -- -- a copy of the GCC Runtime Library Exception along with this program; -- -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -- <http://www.gnu.org/licenses/>. -- -- -- -- PolyORB is maintained by AdaCore -- -- (email: sales@adacore.com) -- -- -- ------------------------------------------------------------------------------ with Ada.Text_IO; with CORBA.Impl; with CORBA.Object; with CORBA.ORB; with PortableServer.POA.Helper; with PortableServer.POAManager; with Echo.Impl; with PolyORB.CORBA_P.CORBALOC; -- Setup server node: use no tasking default configuration with PolyORB.Setup.No_Tasking_Server; pragma Warnings (Off, PolyORB.Setup.No_Tasking_Server); procedure Server is begin declare Argv : CORBA.ORB.Arg_List := CORBA.ORB.Command_Line_Arguments; begin CORBA.ORB.Init (CORBA.ORB.To_CORBA_String ("ORB"), Argv); declare Root_POA : PortableServer.POA.Local_Ref; Ref : CORBA.Object.Ref; Obj : constant CORBA.Impl.Object_Ptr := new Echo.Impl.Object; begin -- Retrieve Root POA Root_POA := PortableServer.POA.Helper.To_Local_Ref (CORBA.ORB.Resolve_Initial_References (CORBA.ORB.To_CORBA_String ("RootPOA"))); PortableServer.POAManager.Activate (PortableServer.POA.Get_The_POAManager (Root_POA)); -- Set up new object Ref := PortableServer.POA.Servant_To_Reference (Root_POA, PortableServer.Servant (Obj)); -- Output IOR Ada.Text_IO.Put_Line ("'" & CORBA.To_Standard_String (CORBA.Object.Object_To_String (Ref)) & "'"); Ada.Text_IO.New_Line; -- Output corbaloc Ada.Text_IO.Put_Line ("'" & CORBA.To_Standard_String (PolyORB.CORBA_P.CORBALOC.Object_To_Corbaloc (Ref)) & "'"); -- Launch the server CORBA.ORB.Run; end; end; end Server;
To compile this demo,
$ idlac echo.idl
$ gnatmake client.adb `polyorb-config`
$ gnatmake server.adb `polyorb-config`
Note the use of backticks (`). This means that polyorb-config is first executed, and then the command line is replaced with the output of the script, setting up library and include paths and library names.
To run this demo:
$ ./server Loading configuration from polyorb.conf No polyorb.conf configuration file. 'IOR:01534f410d00000049444c3[..]'
$ ./client 'IOR:01534f410d00000049444c3[..]' Echoing string: " Hello Ada ! " I said : Hello Ada ! The object answered : Hello Ada !