Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar/p2p/Buddy.py
blob: dd420819984ad9cb85e056c443f6ebbe9d364f36 (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
86
87
88
89
90
91
92
93
94
import pwd
import os

from Service import Service
from sugar import env

PRESENCE_SERVICE_TYPE = "_olpc_presence._tcp"
PRESENCE_SERVICE_PORT = 6000

__buddy_service_types = [PRESENCE_SERVICE_TYPE]

def recognize_buddy_service_type(stype):
	if stype not in __buddy_service_types:
		__buddy_service_types.append(stype)

def get_recognized_buddy_service_types():
	return __buddy_service_types[:]


class Buddy(object):
	def __init__(self, service):
		self._services = {}
		self._services[service.get_type()] = service
		self._nick_name = service.get_name()
		self._address = service.get_address()
		self._icon = None

	def get_icon(self):
		"""Return the buddies icon, if any."""
		return self._icon
		
	def get_address(self):
		return self._address

	def add_service(self, service):
		if service.get_name() != self._nick_name:
			return False
		if service.get_address() != self._address:
			return False
		if self._services.has_key(service.get_type()):
			return False
		self._services[service.get_type()] = service

	def remove_service(self, stype):
		if self._services.has_key(stype):
			del self._services[stype]

	def get_service(self, stype):
		if self._services.has_key(stype):
			return self._services[stype]
		return None
		
	def get_nick_name(self):
		return self._nick_name

	def set_icon(self, icon):
		"""Can only set icon for other buddies.  The Owner
		takes care of setting it's own icon."""
		self._icon = icon
		

class Owner(Buddy):
	"""Class representing the owner of this machine/instance."""
	def __init__(self, group):
		self._group = group
	
		nick = pwd.getpwuid(os.getuid())[0]
		if not nick or not len(nick):
			nick = "n00b"

		self._presence_service = Service(nick, PRESENCE_SERVICE_TYPE, PRESENCE_SERVICE_PORT)
		Buddy.__init__(self, self._presence_service)

		user_dir = env.get_user_dir()
		if not os.path.exists(user_dir):
			try:
				os.makedirs(user_dir)
			except OSError:
				pass

		for fname in os.listdir(user_dir):
			if not fname.startswith("buddy-icon."):
				continue
			fd = open(os.path.join(user_dir, fname), "r")
			self._icon = fd.read()
			fd.close()
			break

	def set_icon(self, icon):
		"""Can only set icon in constructor for now."""
		pass
		
	def register(self):
		self._presence_service.register(self._group)