#!/usr/bin/env python

# Copyright 2004 W. Borgert, GNU General Public License

# This test code is chaotic, because it combines CORBA client and
# server, both with variants for four different Python ORBs, one of
# which doesn't even support the POA.  Never ever do such thing in
# real-world applications!

import os, socket, sys

def usage():
    print >>sys.stderr, \
          "usage:\n%s " % sys.argv[0] + \
          "server|client default|Fnorb|omniORB|ORBitPy|pyORBit"
    sys.exit(-1)

if len(sys.argv) != 3:
    usage()

if sys.argv[1] == 'server':
    SERVER = True
elif sys.argv[1] == 'client':
    SERVER = False
else:
    usage()

if SERVER:
    file('echo.idl', 'w').write("""
module Test {
    interface Echo {
        string do_echo(in string message);
        void quit();
    };
};
""")

if sys.argv[2] == "default":
    import CORBA
elif sys.argv[2] == "Fnorb":
    from Fnorb.orb import CORBA
elif sys.argv[2] == "omniORB":
    from omniORB import CORBA
elif sys.argv[2] == "ORBitPy":
    import CORBA
elif sys.argv[2] == "pyORBit":
    from ORBit import CORBA
else:
    usage()

try:
    if CORBA.ORB_ID == "The ORB called Fnorb v1.1.Return.of.Fnorb":
        os.system("fnidl echo.idl")
        print "using Fnorb"
    elif CORBA.ORB_ID == "omniORB4":
        import omniORB
        omniORB.importIDL("./echo.idl")
        print "using omniORB"
    elif CORBA.ORB_ID == "orbit-local-orb":
        print "using ORBitPy" # magically takes '*.idl' from cwd!
    else:
        print "using unknown ORB"
except AttributeError: # pyORBit's CORBA has no ORB_ID
    import ORBit
    ORBit.load_file("./echo.idl")
    print "using pyORBit"

if SERVER:
    try:
        import Test__POA
        base = Test__POA.Echo
        HAVE_POA = True
    except:
        import Fnorb.orb.BOA # Fnorb does not have the POA
        import Test_skel
        base = Test_skel.Echo_skel
        HAVE_POA = False
else:
    import Test
    class base: pass

class EchoServant(base):
    def do_echo(self, message):
        print "Got: '%s'" % message
        return "Hi!"
    def quit(self):
        print "Good-bye!"
        global boa, orb
        if HAVE_POA:
            orb.shutdown(0)
        else:
            boa._fnorb_quit()

if __name__ == '__main__':
    del sys.argv[1:3] # pyORBit doesn't like some arguments
    orb = CORBA.ORB_init(sys.argv)
    if SERVER:
        servant = EchoServant()
        if HAVE_POA: # modern ORB with POA: omniORB, ORBitPy, pyORBit
            objref = servant._this()
            file('iorfile', 'w').write(orb.object_to_string(objref))
            poa = orb.resolve_initial_references("RootPOA")
            poaManager = poa._get_the_POAManager() 
            poaManager.activate()
            orb.run()
        else: # vintage ORB without POA: Fnorb
            boa = Fnorb.orb.BOA.BOA_init(sys.argv)
            objref = boa.create('obj', EchoServant._FNORB_ID)
            boa.obj_is_ready(objref, servant)
            file('iorfile', 'w').write(orb.object_to_string(objref))
            try:
                boa._fnorb_mainloop()
            except TypeError: # we don't do a clean shutdown
                pass
            try: # clean up files generated by fnidl
                os.unlink("Test/__init__.py")
                os.unlink("Test/__init__.pyc")
                os.rmdir("Test")
                os.unlink("Test_skel/__init__.py")
                os.unlink("Test_skel/__init__.pyc")
                os.rmdir("Test_skel")
            except:
                pass
        os.unlink("iorfile")
        os.unlink("echo.idl")
    else: # client code
        ior = file('iorfile').read()
        obj = orb.string_to_object(ior)
        echo = obj._narrow(Test.Echo)
        print echo.do_echo("Hello!")
        try: # as we kill the server, an exception may occur
            echo.quit()
        except CORBA.COMM_FAILURE:
            print "pyORBit -o )- pyORBit or Fnorb -o )- any ORB?"
        except CORBA.TRANSIENT:
            print "pyORBit -o )- omniORB?"
        except socket.error:
            print "pyORBit -o )- Fnorb?"
