Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar/p2p/Model.py
blob: 795b7cc0f92f8458aab9706106efd00332e0a3fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
MODEL_SERVICE_TYPE = "_olpc_model._tcp"
MODEL_SERVICE_PORT = 6300

import xmlrpclib

from sugar.p2p.Service import Service
import network

class RemoteModel:
	def __init__(self, service):
		self._service = service
		
		addr = "http://%s:%d" % (service.get_address(), service.get_port())
		self._client = xmlrpclib.ServerProxy(addr)

	def get_value(self, key):
		return self._client.get_value(key)
		
	def set_value(self, key, value):
		self._client.set_value(key, value)

class ModelRequestHandler(object):
	def __init__(self, model):
		self._model = model

	def get_value(self, key):
		return self._model.get_value(key)

	def set_value(self, key, value):
		return self._model.set_value(key, value)

class LocalModel:
	def __init__(self, group, model_id):
		self._group = group
		self._model_id = model_id
		self._values = {}
		
		self._setup_service()
	
	def get_value(self, key):
		return self._values[key]
		
	def set_value(self, key, value):
		self._values[key] = value

	def _setup_service(self):
		service = Service(self._model_id, MODEL_SERVICE_TYPE,
						  '', MODEL_SERVICE_PORT)
		self._setup_server(service)
		service.register(self._group)
		
	# FIXME this is duplicated with StreamReader
	def _setup_server(self, service):
		started = False
		tries = 10
		port = service.get_port()
		while not started and tries > 0:
			try:
				p2p_server = network.GlibXMLRPCServer(("", port))
				p2p_server.register_instance(ModelRequestHandler(self))
				started = True
			except:
				port = port + 1
				tries = tries - 1
		service.set_port(port)
		
class Store:
	def __init__(self, group):
		self._group = group
		self._local_models = {}
	
	def create_model(self, model_id):
		model = LocalModel(self._group, model_id)
		self._local_models[model_id] = model
		return model
	
	def get_model(self, model_id):
		if self._local_models.has_key(model_id):
			return self._local_models(model_id)
		else:
			service = self._group.get_service(model_id, MODEL_SERVICE_TYPE)
			if service:
				return RemoteModel(service)
			else:
				return None