static void
_proxy_items_removed_cb (DBusGProxy *proxy,
                         GPtrArray  *items,
                         gpointer    userdata)
{
  SwClientItemView *view = SW_CLIENT_ITEM_VIEW (userdata);
  SwClientItemViewPrivate *priv = GET_PRIVATE (view);
  gint i = 0;
  GList *items_list = NULL;

  for (i = 0; i < items->len; i++)
  {
    GValueArray *varray = (GValueArray *)g_ptr_array_index (items, i);
    const gchar *uid;
    SwItem *item;

    uid = g_value_get_string (g_value_array_get_nth (varray, 1));

    item = g_hash_table_lookup (priv->uuid_to_items,
                                uid);

    if (item)
    {
      /* Must ref up because g_hash_table_remove drops ref */
      items_list = g_list_append (items_list, sw_item_ref (item));
      g_hash_table_remove (priv->uuid_to_items, uid);
    }
  }

  /* If handler wants a ref then it should ref it up */
  g_signal_emit (view, signals[ITEMS_REMOVED_SIGNAL], 0, items_list);

  g_list_foreach (items_list, (GFunc)sw_item_unref, NULL);
  g_list_free (items_list);
}
static void
_proxy_items_added_cb (DBusGProxy *proxy,
                       GPtrArray  *items,
                       gpointer    userdata)
{
  SwClientItemView *view = SW_CLIENT_ITEM_VIEW (userdata);
  SwClientItemViewPrivate *priv = GET_PRIVATE (view);
  gint i = 0;
  GList *items_list = NULL;

  for (i = 0; i < items->len; i++)
  {
    GValueArray *varray = (GValueArray *)g_ptr_array_index (items, i);
    SwItem *item;

    /* First reference dropped when list freed */
    item = _sw_item_from_value_array (varray);

    g_hash_table_insert (priv->uuid_to_items,
                         g_strdup (item->uuid),
                         sw_item_ref (item));

    items_list = g_list_append (items_list, item);
  }

  /* If handler wants a ref then it should ref it up */
  g_signal_emit (view, signals[ITEMS_ADDED_SIGNAL], 0, items_list);

  g_list_foreach (items_list, (GFunc)sw_item_unref, NULL);
  g_list_free (items_list);
}
static void
_view_items_added_cb (SwClientItemView *view,
                      GList            *items,
                      gpointer          userdata)
{
  PengeEverythingPane *pane = PENGE_EVERYTHING_PANE (userdata);
  PengeEverythingPanePrivate *priv = GET_PRIVATE (pane);
  GList *l;

  for (l = items; l; l = l->next)
  {
    SwItem *item = (SwItem *)l->data;
    g_debug (G_STRLOC ": Item added: %s", item->uuid);
    g_hash_table_insert (priv->uuid_to_sw_items,
                         g_strdup (item->uuid),
                         sw_item_ref (item));
  }

  penge_everything_pane_queue_update (pane);
}
static void
_proxy_items_changed_cb (DBusGProxy *proxy,
                         GPtrArray  *items,
                         gpointer    userdata)
{
  SwClientItemView *view = SW_CLIENT_ITEM_VIEW (userdata);
  SwClientItemViewPrivate *priv = GET_PRIVATE (view);
  gint i = 0;
  GList *items_list = NULL;

  for (i = 0; i < items->len; i++)
  {
    GValueArray *varray = (GValueArray *)g_ptr_array_index (items, i);
    SwItem *item;
    const gchar *uid;

    uid = g_value_get_string (g_value_array_get_nth (varray, 1));

    item = g_hash_table_lookup (priv->uuid_to_items,
                                uid);

    if (item)
    {
      _sw_item_update_from_value_array (item, varray);
      items_list = g_list_append (items_list, sw_item_ref (item));
    } else {
      g_critical (G_STRLOC ": Item changed before added: %s", uid);
    }
  }

  /* If handler wants a ref then it should ref it up */
  g_signal_emit (view, signals[ITEMS_CHANGED_SIGNAL], 0, items_list);

  g_list_foreach (items_list, (GFunc)sw_item_unref, NULL);
  g_list_free (items_list);
}