Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <mpg@redhat.com>2006-05-09 18:30:54 (GMT)
committer Marco Pesenti Gritti <mpg@redhat.com>2006-05-09 18:30:54 (GMT)
commitf286d1505d2f202d0491fb72660b4d8788ae7aed (patch)
treeba89f01d2904ded4bfb17ba4a5b7f014e83c4258
parentc9105311c514002a11b7aa5475b07b584cf7a3f3 (diff)
Check in initial model stuff, unused
-rw-r--r--Makefile.am2
-rw-r--r--chat/model.py116
2 files changed, 116 insertions, 2 deletions
diff --git a/Makefile.am b/Makefile.am
index a3aa9e7..64267ce 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -6,5 +6,3 @@ sugardir = $(pythondir)/sugar
sugar_PYTHON = \
__init__.py \
sugar_globals.py
-
-EXTRA_DIST = sugar
diff --git a/chat/model.py b/chat/model.py
new file mode 100644
index 0000000..201d786
--- /dev/null
+++ b/chat/model.py
@@ -0,0 +1,116 @@
+import p2p
+
+class ModelListener:
+ def __init__(self):
+ pass
+
+ def model_changed(self, key, value):
+ pass
+
+class Model:
+ def __init__(self):
+ creator = Owner.getInstance()
+ self._uri = "urn:model:" + creator.get_id() + ":" + random()
+ self._values = {}
+ self.__listeners = []
+
+ def get_value(self, key):
+ return self._values[key]
+
+ def set_value(self, key, value):
+ self._values[key] = value
+ notify_changed(key, value)
+
+ def add_listener(self, listener):
+ self.__listeners.add(listener)
+
+ def notify_changed(self, key, value):
+ for listener in self.__listeners:
+ listener.model_changed(key, value)
+
+ def serialize(model):
+ return [ self._uri, self._values ]
+
+ serialize = staticmethod(serialize)
+
+ def deserialize(data):
+ [uri, values] = data
+
+ # FIXME How damn I do this right in python?
+ model = Model()
+ model._uri = uri
+ model._values = values
+
+ return model
+
+ deserialize = staticmethod(deserialize)
+
+class ModelChangeSet:
+ def __init__(self):
+ self._values = {}
+
+ def add(self, key, value):
+ self._values[key] = value
+
+class ClientModelListener(ModelListener):
+ def __init__(self, client, model):
+ self._model = model
+
+ def model_changed(self, key, value):
+ client.add_change(self._model, key, value)
+
+class ModelStore:
+ instance = None
+
+ def __init__(self):
+ self._models = {}
+ self._group = p2p.Group.get_instance()
+
+ input_pipe = p2p.InputPipe(self._group, "model-store")
+ input_pipe.listen(self._model_request)
+
+ def get_instance():
+ if not ModelStore.instance:
+ ModelStore.instance = ModelStore()
+ return ModelStore.instance
+
+ get_instance = staticmethod(get_instance)
+
+ def add_model(self, model):
+ self._models[model.get_id(), model]
+
+ def _model_request(self, buddy, msg):
+ parts = msg.split(':')
+ model_id = self._group.get_buddy(parts[3])
+ model = self._models[model_id]
+ return model.serialize()
+
+class ModelContext:
+ def __init__(self):
+ self._store = ModelStore.get_instance()
+ self._changes = {}
+
+ def _add_model(self, model):
+ self._store.add_model(model)
+
+ change_set = ModelChangeSet()
+ self.__changes[model_id, change_set]
+
+ listener = ClientModelListener(self)
+ model.add_listener(listener)
+
+ def fetch(self, model_uri):
+ parts = model_uri.split(':')
+ buddy = Group.get_instance().get_buddy(parts[2])
+
+ output_pipe = p2p.OutputPipe(group, buddy, "model-store")
+ model = output_pipe.send(model_uri)
+
+ self._add_model(model)
+
+ def commit(self):
+ pass
+
+ def add_change(self, model, key, value):
+ change_set = self.__changes[model.get_id()]
+ change_set.add(key, value)