gmyth-stream/server/plugins/comm/xmlrpc.py
author rosfran
Fri Apr 13 22:40:49 2007 +0100 (2007-04-13)
branchtrunk
changeset 550 aaf53e3d0b26
parent 484 27e83a8f68d7
permissions -rw-r--r--
[svn r555] Fixes the _dispose handler, and adds the GMythFile instances.
renatofilho@484
     1
import lib
renatofilho@484
     2
import SimpleXMLRPCServer
renatofilho@484
     3
renatofilho@484
     4
renatofilho@484
     5
class Handler:
renatofilho@484
     6
renatofilho@484
     7
    def __init__(self, recv_pool, send_pool):
renatofilho@484
     8
        self.recv_pool = recv_pool
renatofilho@484
     9
        self.send_pool = send_pool
renatofilho@484
    10
        self.getMsg = self.sendMsg
renatofilho@484
    11
renatofilho@484
    12
    def _listMethods(self):
renatofilho@484
    13
        return ['setup', 'play', 'stop', 'close', 'getMsg']
renatofilho@484
    14
renatofilho@484
    15
    def _methodHelp(self, method):
renatofilho@484
    16
renatofilho@484
    17
        if method == 'setup':
morphbr@492
    18
            return "Setup the Media: setup( filename, mux, vcodec, vbitrate,"\
morphbr@492
    19
                   " fps, acodec, abitrate, width, height, port, options"
renatofilho@484
    20
        elif method == 'play':
renatofilho@484
    21
            return "Play the Media: play()"
renatofilho@484
    22
        elif method == 'stop':
renatofilho@484
    23
            return "Stop the Media: stop()"
renatofilho@484
    24
        elif method == 'close':
renatofilho@484
    25
            return "Close the connection: close()"
renatofilho@484
    26
        elif method == 'getMsg':
renatofilho@484
    27
            return "Return the first message in the pool: getMsg()"
renatofilho@484
    28
        else:
renatofilho@484
    29
            # By convention, return empty
renatofilho@484
    30
            # string if no help is available
renatofilho@484
    31
            return ""
renatofilho@484
    32
renatofilho@484
    33
    def setup(self, filename, mux, vcodec, vbitrate,\
morphbr@492
    34
            fps, acodec, abitrate, width, height, port, options):
morphbr@492
    35
morphbr@492
    36
        msg = "%s %s %s %s %s %s %s" % (filename, mux, vcodec, vbitrate,\
morphbr@492
    37
                                        fps, acodec, abitrate, width, height, port)
morphbr@492
    38
morphbr@492
    39
        if len(options) > 0:
morphbr@492
    40
            for opt in options:
morphbr@492
    41
                msg += " %s" % opt
morphbr@492
    42
renatofilho@484
    43
        self.recv_pool.append("SETUP")
morphbr@492
    44
        self.recv_pool.append(msg)
renatofilho@484
    45
        return self.sendMsg()
renatofilho@484
    46
renatofilho@484
    47
    def play(self):
renatofilho@484
    48
        self.recv_pool.append("PLAY")
renatofilho@484
    49
        return self.sendMsg()
renatofilho@484
    50
renatofilho@484
    51
    def stop(self):
renatofilho@484
    52
        self.recv_pool.append("STOP")
renatofilho@484
    53
        return self.sendMsg()
renatofilho@484
    54
renatofilho@484
    55
    def close(self):
renatofilho@484
    56
        self.recv_pool.append("CLOSE")
renatofilho@484
    57
        return self.sendMsg()
renatofilho@484
    58
renatofilho@484
    59
    def sendMsg(self):
renatofilho@484
    60
        if self.send_pool != []:
renatofilho@484
    61
            return self.send_pool.pop(0)
renatofilho@484
    62
        else:
renatofilho@484
    63
            return ""
renatofilho@484
    64
renatofilho@484
    65
renatofilho@484
    66
class Server:
renatofilho@484
    67
renatofilho@484
    68
    def __init__(self, config):
renatofilho@484
    69
        self.host = 'localhost'
renatofilho@484
    70
        self.port = int(config.get("Comm", "port"))
renatofilho@484
    71
        self.finish = 0
renatofilho@484
    72
        self.recv_pool = []
renatofilho@484
    73
        self.send_pool = []
renatofilho@484
    74
renatofilho@484
    75
        self.handler = Handler(self.recv_pool, self.send_pool)
renatofilho@484
    76
renatofilho@484
    77
        self.xmlrpc = SimpleXMLRPCServer.SimpleXMLRPCServer((self.host, self.port))
renatofilho@484
    78
        self.xmlrpc.register_instance(self.handler)
renatofilho@484
    79
renatofilho@484
    80
renatofilho@484
    81
    def getMsg(self, size):
renatofilho@484
    82
        if self.recv_pool != []:
renatofilho@484
    83
            return self.recv_pool.pop(0)
renatofilho@484
    84
        else:
renatofilho@484
    85
            return ""
renatofilho@484
    86
renatofilho@484
    87
    def sendMsg(self, msg):
renatofilho@484
    88
        self.send_pool.append(msg)
renatofilho@484
    89
renatofilho@484
    90
    def Ack(self, command):
renatofilho@484
    91
        msg = "[%s] Command %s received" % (lib.now(), command)
renatofilho@484
    92
        self.sendMsg(msg + "\n")
renatofilho@484
    93
renatofilho@484
    94
    def getRequest(self):
renatofilho@484
    95
        self.xmlrpc.handle_request()
renatofilho@484
    96
        return (0, "RPC Client")
renatofilho@484
    97
renatofilho@484
    98
    def disconnect_client(self, connection):
renatofilho@484
    99
        connection = 0
renatofilho@484
   100
renatofilho@484
   101
    def stop(self):
renatofilho@484
   102
        self.xmlrpc.server_close()