Author: dmeyer
Date: Tue Mar 21 13:59:48 2006
New Revision: 1314

Removed:
   trunk/epg/test/epgclient.py
   trunk/epg/test/epgserver.py
Modified:
   trunk/epg/src/__init__.py
   trunk/epg/src/client.py
   trunk/epg/src/server.py

Log:
Rework client / server stuff for better freevo integration
o make it possible to add network ipc connection during runtime
o to not auto start server


Modified: trunk/epg/src/__init__.py
==============================================================================
--- trunk/epg/src/__init__.py   (original)
+++ trunk/epg/src/__init__.py   Tue Mar 21 13:59:48 2006
@@ -1,48 +1,44 @@
-import os
-import logging
-from socket import gethostbyname, gethostname
-
 from kaa.db import QExpr
-from kaa import ipc
-from client import *
-from server import *
+
 from channel import Channel
 from program import Program
+from client import Client
+from server import Server
 
-__all__ = [ 'connect', 'Channel', 'Program', 'DEFAULT_EPG_PORT', 
'GuideClient', 'GuideServer', 'QExpr' ]
+__all__ = [ 'connect', 'Channel', 'Program', 'Client', 'Server', 'QExpr',
+            'get_channels', 'search' ]
 
 # connected client object
-_client = None
+guide  = None
+_address = None
 
-def connect(epgdb, address='127.0.0.1', logfile='/tmp/kaa-epg.log', 
loglevel=logging.INFO):
+def connect(address, auth_secret=None):
     """
     """
-    global _client
-
-    if _client and _client.ping() != False:
-        return _client
-
-    if address.split(':')[0] not in ['127.0.0.1', '0.0.0.0'] and \
-       address.split(':')[0] != gethostbyname(gethostname()):
-        # epg is remote:  host:port
-        if address.find(':') >= 0:
-            host, port = address.split(':', 1)
-        else:
-            host = address
-            port = DEFAULT_EPG_PORT
+    global guide
+    global _address
+    
+    if guide and guide.connected and _address == address:
+        return guide
 
-        # create socket, pass it to client
-        _client = GuideClient((host, int(port)))
+    guide = Client(address, auth_secret)
+    _address = address
+    return guide
 
-    else:
-        # EPG is local, only use unix socket
 
-        # get server filename
-        server = os.path.join(os.path.dirname(__file__), 'server.py')
+def get_channels():
+    if guide:
+        return guide.get_channels()
+    return []
 
-        _client = ipc.launch([server, logfile, str(loglevel), epgdb, address], 
-                              5, GuideClient, "epg")
 
-    return _client
+def get_channel(*args, **kwargs):
+    if guide:
+        return guide.get_channel(*args, **kwargs)
+    return []
 
 
+def search(*args, **kwargs):
+    if guide:
+        return guide.search(*args, **kwargs)
+    return []

Modified: trunk/epg/src/client.py
==============================================================================
--- trunk/epg/src/client.py     (original)
+++ trunk/epg/src/client.py     Tue Mar 21 13:59:48 2006
@@ -7,34 +7,32 @@
 from channel import *
 from program import *
 
-__all__ = ['GuideClient']
+__all__ = ['Client']
 
 log = logging.getLogger()
 
 
-class GuideClient(object):
+class Client(object):
     def __init__(self, server_or_socket, auth_secret = None):
-        if type(server_or_socket) == GuideServer:
-            self._server = server_or_socket
-            self._ipc = None
-        else:
-            self._ipc = ipc.IPCClient(server_or_socket, auth_secret = 
auth_secret)
-            self._server = self._ipc.get_object("guide")
+        self.connected = True
+        self._ipc = ipc.IPCClient(server_or_socket, auth_secret = auth_secret)
+        self._server = self._ipc.get_object("guide")
 
         self.signals = {
             "updated": Signal(),
-            "update_progress": Signal()
+            "update_progress": Signal(),
+            "disconnected": Signal()
         }
-    
+
         self._load()
+        self._ipc.signals["closed"].connect(self._disconnected)
         self._server.signals["updated"].connect(self._updated)
         
self._server.signals["update_progress"].connect(self.signals["update_progress"].emit)
 
-    def ping(self):
-        if self._ipc:
-            return self._ipc.ping()
-        else:
-            return False
+    def _disconnected(self):
+        self.connected = False
+        self.signals["disconnected"].emit()
+
         
     def _updated(self):
         self._load()

Modified: trunk/epg/src/server.py
==============================================================================
--- trunk/epg/src/server.py     (original)
+++ trunk/epg/src/server.py     Tue Mar 21 13:59:48 2006
@@ -1,36 +1,18 @@
-import libxml2, sys, time, os, weakref, logging
+import sys, time, os, weakref, logging
 from types import ListType
 
 from kaa.db import *
 from kaa import ipc
 from kaa.notifier import Signal
 
-__all__ = ['DEFAULT_EPG_PORT', 'GuideServer']
-
-DEFAULT_EPG_PORT = 4132
+__all__ = [ 'Server']
 
 log = logging.getLogger('epg')
 
-# TODO: merge updates when processing instead of wipe.
 
-class GuideServer(object):
-    def __init__(self, socket, address = None, dbfile = "/tmp/GuideServer.db", 
-                 auth_secret = None, log_file = "/tmp/GuideServer.log", 
-                 log_level = logging.INFO):
-
-        # setup logger
-        # TODO: get a better format!  half of my screen is taken up before 
getting
-        #       to the log message.  A better time format would help, ie:
-        #       '%Y%m%d %H:%M:%S'
-        f = logging.Formatter('%(asctime)s %(levelname)-8s [%(name)6s] '+\
-                              '%(filename)s %(lineno)s: '+\
-                              '%(message)s')
-        handler = logging.FileHandler(log_file)
-        handler.setFormatter(f)
-        logging.getLogger().addHandler(handler)
+class Server(object):
+    def __init__(self, dbfile):
 
-        # setup log
-        logging.getLogger().setLevel(log_level)
         log.info('start EPG server')
         log.info('using database in %s', dbfile)
 
@@ -59,27 +41,24 @@
         self._db = db
         self._load()
         
-        self._ipc = ipc.IPCServer(socket, auth_secret = auth_secret)
+        self._ipc = ipc.IPCServer('epg')
         
self._ipc.signals["client_connected"].connect_weak(self._client_connected)
         self._ipc.signals["client_closed"].connect_weak(self._client_closed)
         self._ipc.register_object(self, "guide")
 
         self._ipc_net = None
- 
-        if address and \
-           address.split(':')[0] not in ['127.0.0.1', '0.0.0.0']:
-            # listen on tcp port too
-            if address.find(':') >= 0:
-                host, port = address.split(':', 1)
-            else:
-                host = address
-                port = DEFAULT_EPG_PORT
+            
 
-            self._ipc_net = ipc.IPCServer((host, int(port)), auth_secret = 
auth_secret)
-            log.info('listening on address %s:%s', host, port)
-            
self._ipc_net.signals["client_connected"].connect_weak(self._client_connected)
-            
self._ipc_net.signals["client_closed"].connect_weak(self._client_closed)
-            self._ipc_net.register_object(self, "guide")
+    def connect_to_network(self, address, auth_secret=None):
+        # listen on tcp port too
+        host, port = address.split(':', 1)
+
+        self._ipc_net = ipc.IPCServer((host, int(port)), auth_secret = 
auth_secret)
+        log.info('listening on address %s:%s', host, port)
+        
self._ipc_net.signals["client_connected"].connect_weak(self._client_connected)
+        
self._ipc_net.signals["client_closed"].connect_weak(self._client_closed)
+        self._ipc_net.register_object(self, "guide")
+        return self._ipc_net.socket.getsockname()
 
 
     def _load(self):
@@ -315,64 +294,3 @@
 
     def get_num_programs(self):
         return self._num_programs
-
-
-if __name__ == "__main__":
-    # ARGS: log file, log level, db file
-
-    # python imports
-    import gc
-    import sys
-    
-    # kaa imports
-    from kaa.notifier import Timer, execute_in_timer, loop
-    
-    @execute_in_timer(Timer, 1)
-    def garbage_collect():
-        g = gc.collect()
-        if g:
-            log.debug('gc: deleted %s objects' % g)
-        if gc.garbage:
-            log.warning('gc: found %s garbage objects' % len(gc.garbage))
-            for g in gc.garbage:
-                log.warning(g)
-        return True
-
-
-    shutdown_timer = 5
-
-    @execute_in_timer(Timer, 1)
-    def autoshutdown():
-        global shutdown_timer
-        global _server
-
-        #log.debug("clients: %s", len(_server._clients))
-        if _server and len(_server._clients) > 0:
-            shutdown_timer = 5
-            return True
-        shutdown_timer -= 1
-        if shutdown_timer == 0:
-            log.info('shutdown EPG server')
-            sys.exit(0)
-        return True
-    
-    try:
-        # detach for parent using a new sesion
-        os.setsid()
-    except OSError:
-        # looks like we are started from the shell
-        # TODO: start some extra debug here and disable autoshutdown
-        pass
-    
-    if len(sys.argv) < 5:
-        address = None
-    else:
-        address=sys.argv[4]
-
-    _server = GuideServer("epg", log_file=str(sys.argv[1]), 
-                          log_level=int(sys.argv[2]), dbfile=sys.argv[3],
-                          address=sys.argv[4])
-
-    garbage_collect()
-    autoshutdown()
-    loop()


-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to