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