From 76b7b12b0b0e90a5460e7ce588fee6c30ed55576 Mon Sep 17 00:00:00 2001
From: Aleksey Lim <alsroot@member.fsf.org>
Date: Mon, 22 Nov 2010 13:56:03 +0000
Subject: [PATCH] Do not remove bodies on offline status #2483

While body is switching between offline/available only presence status
is being changed, but previous code remove body on offline and did not add
it back
---
 src/jarabe/desktop/grid.py       |    7 +++++++
 src/jarabe/model/buddy.py        |    3 +++
 src/jarabe/model/neighborhood.py |   28 ++++++++++++++++++++++++----
 3 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/src/jarabe/desktop/grid.py b/src/jarabe/desktop/grid.py
index f3412c9..e42c5a5 100644
--- a/src/jarabe/desktop/grid.py
+++ b/src/jarabe/desktop/grid.py
@@ -16,6 +16,7 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 import random
+import logging
 
 import gobject
 import gtk
@@ -83,6 +84,12 @@ class Grid(_sugarext.Grid):
             self._collisions.remove(child)
 
     def move(self, child, x, y, locked=False):
+        if child not in self._child_rects:
+            import traceback
+            logging.warn('Grid.move, child %r is not counted:\n%s',
+                    child, ''.join(traceback.format_stack()))
+            return
+
         self.remove_weight(self._child_rects[child])
 
         rect = self._child_rects[child]
diff --git a/src/jarabe/model/buddy.py b/src/jarabe/model/buddy.py
index 5f3176e..77b500a 100644
--- a/src/jarabe/model/buddy.py
+++ b/src/jarabe/model/buddy.py
@@ -190,6 +190,9 @@ def get_owner_instance():
 
 class BuddyModel(BaseBuddyModel):
     __gtype_name__ = 'SugarBuddyModel'
+
+    offline = True
+
     def __init__(self, **kwargs):
 
         self._account = None
diff --git a/src/jarabe/model/neighborhood.py b/src/jarabe/model/neighborhood.py
index 91dd059..e770cce 100644
--- a/src/jarabe/model/neighborhood.py
+++ b/src/jarabe/model/neighborhood.py
@@ -165,6 +165,8 @@ class _Account(gobject.GObject):
                                  gobject.TYPE_NONE, ([object, object])),
         'buddy-removed':        (gobject.SIGNAL_RUN_FIRST,
                                  gobject.TYPE_NONE, ([object])),
+        'buddy-presence-changed': (gobject.SIGNAL_RUN_FIRST,
+                                 gobject.TYPE_NONE, ([object, object])),
         'buddy-joined-activity': (gobject.SIGNAL_RUN_FIRST,
                                   gobject.TYPE_NONE, ([object, object])),
         'buddy-left-activity':   (gobject.SIGNAL_RUN_FIRST,
@@ -386,10 +388,8 @@ class _Account(gobject.GObject):
         for handle, presence in presences.iteritems():
             if handle in self._buddy_handles:
                 presence_type, status_, message_ = presence
-                if presence_type == CONNECTION_PRESENCE_TYPE_OFFLINE:
-                    contact_id = self._buddy_handles[handle]
-                    del self._buddy_handles[handle]
-                    self.emit('buddy-removed', contact_id)
+                self.emit('buddy-presence-changed',
+                        self._buddy_handles[handle], presence_type)
 
     def __buddy_info_updated_cb(self, handle, properties):
         logging.debug('_Account.__buddy_info_updated_cb %r', handle)
@@ -664,6 +664,9 @@ class Neighborhood(gobject.GObject):
         account.connect('buddy-added', self.__buddy_added_cb)
         account.connect('buddy-updated', self.__buddy_updated_cb)
         account.connect('buddy-removed', self.__buddy_removed_cb)
+        account.connect('buddy-presence-changed',
+                self.__buddy_presence_changed_cb)
+
         account.connect('buddy-joined-activity',
                         self.__buddy_joined_activity_cb)
         account.connect('buddy-left-activity', self.__buddy_left_activity_cb)
@@ -863,6 +866,23 @@ class Neighborhood(gobject.GObject):
         if buddy.props.key is not None:
             self.emit('buddy-removed', buddy)
 
+    def __buddy_presence_changed_cb(self, account, contact_id, presence_type):
+        if contact_id not in self._buddies:
+            logging.debug('Neighborhood.__buddy_presence_changed_cb Unknown ' \
+                    'buddy with contact_id %r', contact_id)
+            return
+
+        buddy = self._buddies[contact_id]
+        offline = (presence_type == CONNECTION_PRESENCE_TYPE_OFFLINE);
+
+        if buddy.offline != offline:
+            buddy.offline = offline
+            if buddy.props.key is not None:
+                if offline:
+                    self.emit('buddy-removed', buddy)
+                else:
+                    self.emit('buddy-added', buddy)
+
     def __activity_added_cb(self, account, room_handle, activity_id):
         logging.debug('__activity_added_cb %r %r', room_handle, activity_id)
         if activity_id in self._activities:
-- 
1.7.2.2

