From 86abe2346bedc98a249621b080ec85841918c9cc Mon Sep 17 00:00:00 2001 From: erich koslovsky Date: Sun, 19 Aug 2007 14:31:37 +0000 Subject: Added support to sink members of the shared browser session when they come back. Some cleanups. --- (limited to 'messenger.py') 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)) - -- cgit v0.9.1