# File: objc_xmlrpc_server.py
# An RPC mass server for the service described in objx_xmlrpc_protocol.txt
# using the "B" (binary) variant of the protocol.
#
# Version 2 - G. Weber, 2009 Oct 17, for Python3.
# Version 1 -  G. Weber 2007

# import xmlrpc.client
from xmlrpc.server import *
import pickle
from solid import Sphere, Cube

def start_server (host="localhost", port=8000, start=False):

    """Create a SimpleXMLRPCServer.  If start is True, start it.
    Regardless, return the server object."""
    
    def mass (wrapped_bin, density):
        # wrapped_bin is a Binary wrapping of a pickled object
        pickled_bin = wrapped_bin.data # extract binary datafrom Binary
        obj = pickle.loads(pickled_bin) # unpickle binary data
        return density * obj.volume()
    
    server = SimpleXMLRPCServer((host, port))
    server.register_function(mass)

    # Allow server to tell about itself, e.g., list its methods
    server.register_introspection_functions()
    
    if start:
        # now run
        print()
        print("Press Control-C to interrupt the server.")
        print()
        try:
            server.serve_forever()
        except KeyboardInterrupt:
            print("Server stopped due to keyboard interrupt.")

    return server

def usage ():
    print("Usage: python objc_xmlrpc_server.py <host> <port>")

def main (args):
    if len(args) >= 2:
        host = args[1]
        try:
            port = int(args[2])
            start_server(host, port, start=True)
        except ValueError:
            print("Sorry, %s is not a valid port number" % args[2])
            usage()
            sys.exit(1)
    else:
        usage()
        sys.exit(2)


if __name__ == "__main__":
    main(sys.argv)
