Author: dmeyer
Date: Fri Oct 28 19:32:07 2005
New Revision: 881

Added:
   trunk/vfs/src/client.py
   trunk/vfs/src/server.py
   trunk/vfs/test/client.py
   trunk/vfs/test/server.py

Log:
start playing with client server architecture

Added: trunk/vfs/src/client.py
==============================================================================
--- (empty file)
+++ trunk/vfs/src/client.py     Fri Oct 28 19:32:07 2005
@@ -0,0 +1,11 @@
+from kaa.base import ipc
+from kaa.notifier import Signal
+
+class Client(object):
+    def __init__(self):
+        self._ipc = ipc.IPCClient('vfs')
+        self._server = self._ipc.get_object('vfs')
+
+    def listdir(self, dirname):
+        return self._server.query(dir=dirname)
+        

Added: trunk/vfs/src/server.py
==============================================================================
--- (empty file)
+++ trunk/vfs/src/server.py     Fri Oct 28 19:32:07 2005
@@ -0,0 +1,187 @@
+import os
+
+from kaa.base import ipc
+from kaa.base.db import *
+from kaa.notifier import Signal
+
+class Item(object):
+    def __init__(self, data, parent, db):
+        self.data = data
+        self.parent = parent
+        self.db = db
+        if isinstance(self.data, dict) and parent and parent.isdir():
+
+            # TODO: handle parents not based on file:
+
+            if self.parent['url'] == 'file:/':
+                self.data['url'] = 'file:/' + self.data['name']
+            else:
+                self.data['url'] = self.parent['url'] + '/' + self.data['name']
+        self.__changes = {}
+
+
+    def __id__(self):
+        return (self.data['type'], self.data["id"])
+    
+
+    def __str__(self):
+        if isinstance(self.data, str):
+            return 'new file %s' % self.data
+        return self.data['name']
+
+
+    def __getitem__(self, key):
+        if self.data.has_key(key):
+            return self.data[key]
+        if self.data.has_key('tmp:' + key):
+            return self.data['tmp:' + key]
+
+        # TODO: maybe get cover from parent (e.g. cover in a dir)
+        # Or should that be stored in each item
+        
+        return None
+
+
+    def isdir(self):
+        if isinstance(self.data, (str, unicode)):
+            return os.path.isdir(self.parent['url'][5:] + '/' + self.data)
+        return self.data['type'] == 'dir'
+
+    
+
+
+class Query(object):
+    def __init__(self, db):
+        self._db = db
+        self.items = []
+
+class DirectoryQuery(Query):
+    def __init__(self, server, db, **kwargs):
+        Query.__init__(self, db)
+        self.dir = server.get_dir(kwargs['dir'])
+        
+        dirname = os.path.normpath(self.dir['url'][5:])
+        files = self._db.query(parent = ("dir", self.dir["id"]))
+        fs_listing = os.listdir(dirname)
+
+        # TODO: add OVERLAY_DIR support
+        # Ignore . files
+        
+        for f in files[:]:
+            if f['name'] in fs_listing:
+                # file still there
+                fs_listing.remove(f['name'])
+                self.items.append(Item(f, self, self._db))
+            else:
+                # file deleted
+                files.remove(f)
+                # FIXME: remove from database
+
+        for f in fs_listing:
+            # new files
+            self.items.append(Item(f, self, self._db))
+            
+        for i in self.items:
+            print i
+        print 'DONE'
+        
+class Server(object):
+    def __init__(self, dbdir):
+        self.signals = {
+            "updated": Signal(),
+        }
+
+        self._db = Database(dbdir + '/db')
+
+        self.register_object_type_attrs("dir",
+            name = (str, ATTR_KEYWORDS),
+            mtime = (int, ATTR_SIMPLE))
+
+        self.register_object_type_attrs("file",
+            name = (str, ATTR_KEYWORDS),
+            mtime = (int, ATTR_SIMPLE))
+
+        self.register_object_type_attrs("video",
+            name = (str, ATTR_KEYWORDS),
+            mtime = (int, ATTR_SIMPLE),
+            title = (unicode, ATTR_KEYWORDS),
+            width = (int, ATTR_SIMPLE),
+            height = (int, ATTR_SIMPLE),
+            length = (int, ATTR_SIMPLE))
+
+        self.register_object_type_attrs("audio",
+            name = (str, ATTR_KEYWORDS),
+            mtime = (int, ATTR_SIMPLE),
+            title = (unicode, ATTR_KEYWORDS),
+            artist = (unicode, ATTR_KEYWORDS | ATTR_INDEXED),
+            album = (unicode, ATTR_KEYWORDS),
+            genre = (unicode, ATTR_INDEXED),
+            samplerate = (int, ATTR_SIMPLE),
+            length = (int, ATTR_SIMPLE),
+            bitrate = (int, ATTR_SIMPLE),
+            trackno = (int, ATTR_SIMPLE))
+        
+        self.register_object_type_attrs("image",
+            name = (str, ATTR_KEYWORDS),
+            mtime = (int, ATTR_SIMPLE),
+            width = (int, ATTR_SEARCHABLE),
+            height = (int, ATTR_SEARCHABLE),
+            date = (int, ATTR_SEARCHABLE))
+
+        # TODO: add more known types
+        
+        root = self._db.query(type="dir", name="/")
+        if not root:
+            root = self._db.add_object("dir", name="/")
+            # FIXME: get current data from database
+            root = self._db.query(type='dir', name='/')[0]
+        else:
+            root = root[0]
+        root['url'] = 'file:/'
+        root = Item(root, None, self._db)
+        self._dir_cache = { '/': root }
+        self._parent_cache = { root.__id__(): root }
+        
+        self._ipc = ipc.IPCServer('vfs')
+        self._ipc.signals["client_closed"].connect_weak(self._client_closed)
+        self._ipc.register_object(self, "vfs")
+
+
+    def register_object_type_attrs(self, *args, **kwargs):
+        return self._db.register_object_type_attrs(*args, **kwargs)
+
+    
+    def query(self, **kwargs):
+        if 'dir' in kwargs:
+            return DirectoryQuery(self, self._db, **kwargs)
+        raise AttributeError('query not supported')
+
+        
+    def get_dir(self, dirname):
+        if dirname in self._dir_cache:
+            return self._dir_cache[dirname]
+        pdir = self.get_dir(os.path.dirname(dirname))
+        print pdir
+        parent = ("dir", pdir["id"])
+
+        # TODO: handle dirs on romdrives which don't have '/'
+        # as basic parent
+        
+        name = os.path.basename(dirname)
+        current = self._db.query(type="dir", name=name, parent=parent)
+        if not current:
+            current = self._db.add_object("dir", name=name, parent=parent)
+        else:
+            current = current[0]
+        current['url'] = 'file:' + dirname
+        current = Item(current, pdir, self._db)
+        self._dir_cache[dirname] = current
+        self._parent_cache[current.__id__()] = current
+        return current
+
+        
+    def _client_closed(self, client):
+        for signal in self.signals.values():
+            for callback in signal:
+                if ipc.get_ipc_from_proxy(callback) == client:
+                    signal.disconnect(callback)

Added: trunk/vfs/test/client.py
==============================================================================
--- (empty file)
+++ trunk/vfs/test/client.py    Fri Oct 28 19:32:07 2005
@@ -0,0 +1,15 @@
+import kaa.vfs.client
+import kaa
+
+def foo(self):
+    print 'done 2'
+    
+c = kaa.vfs.client.Client()
+l = c.listdir('/home/dmeyer/video')
+print l
+for i in l.items:
+    print i
+#l.update(__ipc_async = foo)
+print 'done'
+print l
+kaa.main()

Added: trunk/vfs/test/server.py
==============================================================================
--- (empty file)
+++ trunk/vfs/test/server.py    Fri Oct 28 19:32:07 2005
@@ -0,0 +1,5 @@
+import kaa.vfs.server
+import kaa
+
+guide = kaa.vfs.server.Server("foo")
+kaa.main()


-------------------------------------------------------
This SF.Net email is sponsored by the JBoss Inc.
Get Certified Today * Register for a JBoss Training Course
Free Certification Exam for All Training Attendees Through End of 2005
Visit http://www.jboss.com/services/certification for more information
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to