Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/messenger.py
diff options
context:
space:
mode:
Diffstat (limited to 'messenger.py')
-rw-r--r--messenger.py123
1 files changed, 53 insertions, 70 deletions
diff --git a/messenger.py b/messenger.py
index f989559..489be0e 100644
--- a/messenger.py
+++ b/messenger.py
@@ -39,81 +39,79 @@ class Messenger(ExportedGObject):
self.linkbar = linkbar
self.model = model
self.owner = owner
- _logger.debug('Owner=%s %s' %(self.owner.props.nick, self.owner.props.color))
self.tube.watch_participants(self.participant_change_cb)
-
+
def participant_change_cb(self, added, removed):
- for handle in removed:
- _logger.debug('Member %s left' %(self.tube.participants[handle]))
- if self.tube.participants[handle] == self.members[0]:
- # TOFIX: the creator leaves the activity, name a new leader
- _logger.debug('The creator leaves.')
- # if self.id == 1:
- # _logger.debug('I become the new leader.')
- # self.is_initiator = True
+ _logger.debug('Participants change add=%s rem=%s' %(added, removed))
+ for handle, bus_name in added:
+ _logger.debug('Add member handle=%s bus_name=%s' %(str(handle), str(bus_name)))
+ self.members.append(bus_name)
+
+ for handle, bus_name in removed:
+ _logger.debug('Remove member handle=%s bus_name=%s' %(str(handle), str(bus_name)))
try:
- self.members.remove(self.tube.participants[handle])
+ self.members.remove(bus_name)
except ValueError:
# already absent
- pass
-
+ pass
+
if not self.entered:
self.tube.add_signal_receiver(self._add_link_receiver, '_add_link', IFACE, path=PATH, sender_keyword='sender',
byte_arrays=True)
- self.tube.add_signal_receiver(self._rm_link_receiver, '_rm_link', IFACE, path=PATH, sender_keyword='sender',
- byte_arrays=True)
- self.tube.add_signal_receiver(self._hello_receiver, '_hello_signal', IFACE, path=PATH, sender_keyword='sender')
if self.is_initiator:
- _logger.debug('Initialising a new shared browser, I am %s .'%self.tube.get_unique_name())
- self.id = self.tube.get_unique_name()
- self.members = [self.id]
+ _logger.debug('Initialising a new shared browser, I am %s .'%self.tube.get_unique_name())
else:
- self._hello_signal()
+ # sync with other members
+ self.bus_name = self.tube.get_unique_name()
+ _logger.debug('Joined I am %s .'%self.bus_name)
+ for member in self.members:
+ if member != self.bus_name:
+ _logger.debug('Get info from %s' %member)
+ self.tube.get_object(member, PATH).sync_with_members(self.model.get_links_ids(), dbus_interface=IFACE, reply_handler=self.reply_sync, error_handler=lambda e:self.error_sync(e, 'transfering file'))
+
self.entered = True
- @dbus.service.signal(IFACE, signature='')
- def _hello_signal(self):
- '''Notify current members that you joined '''
- _logger.debug('Sending hello to all')
-
- def _hello_receiver(self, sender=None):
- '''A new member joined the activity, sync linkbar'''
- self.members.append(sender)
- if self.is_initiator:
- self.tube.get_object(sender, PATH).init_members(self.members)
- for link in self.model.links:
+ def reply_sync(self, a_ids):
+ a_ids.pop()
+ for link in self.model.links:
+ if link['hash'] not in a_ids:
if link['deleted'] == 0:
- self.tube.get_object(sender, PATH).transfer_links(link['url'], link['title'], link['color'], link['owner'], base64.b64encode(link['thumb']),dbus_interface=IFACE, reply_handler=self.reply_transfer, error_handler=lambda e:self.error_transfer(e, 'transfering file'))
-
- def reply_transfer(self):
- pass
+ self.tube.get_object(sender, PATH).send_link(link['hash'], link['url'], link['title'], link['color'],
+ link['owner'], base64.b64encode(link['thumb']))
- def error_transfer(self, e, when):
+ def error_sync(self, e, when):
_logger.error('Error %s: %s'%(when, e))
- @dbus.service.method(dbus_interface=IFACE, in_signature='as', out_signature='')
- def init_members(self, members):
- '''Sync the list of members '''
- _logger.debug('Data received to sync member list.')
- self.members = members
- self.id = self.members.index(self.tube.get_unique_name())
-
- @dbus.service.method(dbus_interface=IFACE, in_signature='sssss', out_signature='')
- def transfer_links(self, url, title, color, owner, buffer):
- '''Sync the link list with the others '''
- _logger.debug('Data received to sync link list.')
- thumb = base64.b64decode(buffer)
- self.model.links.append( {'hash':sha.new(url).hexdigest(), 'url':url, 'title':title, 'thumb':thumb,
- 'owner':owner, 'color':color, 'deleted':0} )
- self.linkbar._add_link(url, thumb, color, title, owner, len(self.model.links)-1)
-
- def add_link(self, url, title, color, owner, thumb):
- _logger.debug('Add Link: %s '%url)
- self._add_link(url, title, color, owner, base64.b64encode(thumb))
+ @dbus.service.method(dbus_interface=IFACE, in_signature='as', out_signature='as', sender_keyword='sender')
+ def sync_with_members(self, b_ids, sender=None):
+ '''Sync with members '''
+ b_ids.pop()
+ # links the caller wants from me
+ for link in self.model.links:
+ if link['hash'] not in b_ids:
+ if link['deleted'] == 0:
+ self.tube.get_object(sender, PATH).send_link(link['hash'], link['url'], link['title'], link['color'],
+ link['owner'], base64.b64encode(link['thumb']))
+ a_ids = self.model.get_links_ids()
+ a_ids.append('')
+ # links I want from the caller
+ return a_ids
+ @dbus.service.method(dbus_interface=IFACE, in_signature='ssssss', out_signature='')
+ def send_link(self, id, url, title, color, owner, buffer):
+ '''Send link'''
+ _logger.debug('Received data for link.')
+ a_ids = self.model.get_links_ids()
+ if id not in a_ids:
+ thumb = base64.b64decode(buffer)
+ self.model.links.append( {'hash':sha.new(url).hexdigest(), 'url':url, 'title':title, 'thumb':thumb,
+ 'owner':owner, 'color':color, 'deleted':0} )
+ self.linkbar._add_link(url, thumb, color, title, owner, len(self.model.links)-1)
+
@dbus.service.signal(IFACE, signature='sssss')
def _add_link(self, url, title, color, owner, thumb):
'''Signal to send the link information (add)'''
+ _logger.debug('Add Link: %s '%url)
def _add_link_receiver(self, url, title, color, owner, thumb, sender=None):
'''Member sent a link'''
@@ -126,18 +124,3 @@ class Messenger(ExportedGObject):
self.linkbar._add_link(url, buffer, color, title, owner, len(self.model.links)-1)
_logger.debug('Added link: %s to linkbar.'%(url))
- def rm_link(self, linkname):
- _logger.debug('Remove Link: %s '%linkname)
- self._rm_link(linkname)
-
- @dbus.service.signal(IFACE, signature='s')
- def _rm_link(self, linkname):
- '''Signal to send the link information (rm)'''
-
- def _rm_link_receiver(self, linkname, sender=None):
- '''Member sent signal to remove a link'''
- handle = self.tube.bus_name_to_handle[sender]
- if self.tube.self_handle != handle:
- self.linkbar._rm_link_messenger(linkname)
- _logger.debug('Removed link: %s from linkbar.'%(linkname))
-