]> git.0d.be Git - empathy.git/commitdiff
Merge remote-tracking branch 'jonny/ft'
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Tue, 29 Nov 2011 14:56:11 +0000 (15:56 +0100)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Tue, 29 Nov 2011 14:56:11 +0000 (15:56 +0100)
Conflicts:
libempathy/empathy-tp-file.c

1  2 
libempathy/Makefile.am
libempathy/empathy-client-factory.c
libempathy/empathy-ft-handler.c
po/POTFILES.in
src/empathy-ft-manager.c

diff --combined libempathy/Makefile.am
index b2c42f96c58f711389ea0be95c1b372b45e0a035,1d7df96156a5352ab40cd31d3a90983c05de29f4..cd03022738025a7aa923ca0b4062dafc11803a28
@@@ -36,7 -36,6 +36,7 @@@ libempathy_headers =                          
        empathy-client-factory.h \
        empathy-connection-managers.h           \
        empathy-connectivity.h                  \
 +      empathy-connection-aggregator.h         \
        empathy-contact-groups.h                \
        empathy-contact-list.h                  \
        empathy-contact-manager.h               \
@@@ -63,7 -62,6 +63,6 @@@
        empathy-tp-chat.h                       \
        empathy-tp-contact-factory.h            \
        empathy-tp-contact-list.h               \
-       empathy-tp-file.h                       \
        empathy-tp-roomlist.h                   \
        empathy-tp-streamed-media.h             \
        empathy-types.h                         \
@@@ -80,7 -78,6 +79,7 @@@ libempathy_handwritten_source =                               
        empathy-client-factory.c \
        empathy-connection-managers.c                   \
        empathy-connectivity.c                          \
 +      empathy-connection-aggregator.c         \
        empathy-contact-groups.c                        \
        empathy-contact-list.c                          \
        empathy-contact-manager.c                       \
        empathy-tp-chat.c                               \
        empathy-tp-contact-factory.c                    \
        empathy-tp-contact-list.c                       \
-       empathy-tp-file.c                               \
        empathy-tp-roomlist.c                           \
        empathy-tp-streamed-media.c                     \
        empathy-utils.c
index a02b8b144f662c5e9ecc25de5540ba2f25da141e,3794ef60d237d375e25861160e14807664630e92..035c5695625fb5404c8754c4a944d4e86824f811
@@@ -24,7 -24,6 +24,6 @@@
  #include "empathy-client-factory.h"
  
  #include "empathy-tp-chat.h"
- #include "empathy-tp-file.h"
  #include "empathy-utils.h"
  
  #include <telepathy-yell/telepathy-yell.h>
@@@ -88,11 -87,6 +87,6 @@@ empathy_client_factory_create_channel (
      {
        return TP_CHANNEL (call_channel_new_with_factory (
              TP_SIMPLE_CLIENT_FACTORY (factory), conn, path, properties, error));
-     }
-   else if (!tp_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER))
-     {
-       return TP_CHANNEL (empathy_tp_file_new (
-             TP_SIMPLE_CLIENT_FACTORY (factory), conn, path, properties, error));
      }
  
    return chainup->create_channel (factory, conn, path, properties, error);
@@@ -158,33 -152,6 +152,33 @@@ empathy_client_factory_dup_connection_f
    feature = TP_CONNECTION_FEATURE_BALANCE;
    g_array_append_val (features, feature);
  
 +  feature = TP_CONNECTION_FEATURE_CONTACT_BLOCKING;
 +  g_array_append_val (features, feature);
 +
 +  /* Most empathy-* may allow user to add a contact to his contact list. We
 +   * need this property to check if the connection allows it. It's cheap to
 +   * prepare anyway as it will just call GetAll() on the ContactList iface. */
 +  feature = TP_CONNECTION_FEATURE_CONTACT_LIST_PROPERTIES;
 +  g_array_append_val (features, feature);
 +
 +  return features;
 +}
 +
 +static GArray *
 +empathy_client_factory_dup_contact_features (TpSimpleClientFactory *factory,
 +        TpConnection *connection)
 +{
 +  GArray *features;
 +  TpContactFeature feature;
 +
 +  features = chainup->dup_contact_features (factory, connection);
 +
 +  /* Needed by empathy_individual_add_menu_item_new to check if a contact is
 +   * already in the contact list. This feature is pretty cheap to prepare as
 +   * it doesn't prepare the full roster. */
 +  feature = TP_CONTACT_FEATURE_SUBSCRIPTION_STATES;
 +  g_array_append_val (features, feature);
 +
    return features;
  }
  
@@@ -202,9 -169,6 +196,9 @@@ empathy_client_factory_class_init (Empa
  
    simple_class->dup_connection_features =
      empathy_client_factory_dup_connection_features;
 +
 +  simple_class->dup_contact_features =
 +    empathy_client_factory_dup_contact_features;
  }
  
  static void
index 3d652524061bb2557228c838c1d12f1cd921725a,4b2d7e025f9cb1cb255b6f577d1acf78b043049b..c701b193d9e5c6ef491d1296e69e6e5cc7a4cd4a
@@@ -76,7 -76,7 +76,7 @@@ G_DEFINE_TYPE (EmpathyFTHandler, empath
  #define BUFFER_SIZE 4096
  
  enum {
-   PROP_TP_FILE = 1,
+   PROP_CHANNEL = 1,
    PROP_G_FILE,
    PROP_CONTACT,
    PROP_CONTENT_TYPE,
@@@ -120,7 -120,7 +120,7 @@@ typedef struct 
    gboolean dispose_run;
  
    GFile *gfile;
-   EmpathyTpFile *tpfile;
+   TpFileTransferChannel *channel;
    GCancellable *cancellable;
    gboolean use_hash;
  
@@@ -188,8 -188,8 +188,8 @@@ do_get_property (GObject *object
        case PROP_G_FILE:
          g_value_set_object (value, priv->gfile);
          break;
-       case PROP_TP_FILE:
-         g_value_set_object (value, priv->tpfile);
+       case PROP_CHANNEL:
+         g_value_set_object (value, priv->channel);
          break;
        case PROP_USER_ACTION_TIME:
          g_value_set_int64 (value, priv->user_action_time);
@@@ -233,8 -233,8 +233,8 @@@ do_set_property (GObject *object
        case PROP_G_FILE:
          priv->gfile = g_value_dup_object (value);
          break;
-       case PROP_TP_FILE:
-         priv->tpfile = g_value_dup_object (value);
+       case PROP_CHANNEL:
+         priv->channel = g_value_dup_object (value);
          break;
        case PROP_USER_ACTION_TIME:
          priv->user_action_time = g_value_get_int64 (value);
@@@ -264,10 -264,10 +264,10 @@@ do_dispose (GObject *object
      priv->gfile = NULL;
    }
  
-   if (priv->tpfile != NULL) {
-     empathy_tp_file_close (priv->tpfile);
-     g_object_unref (priv->tpfile);
-     priv->tpfile = NULL;
+   if (priv->channel != NULL) {
+     tp_channel_close_async (TP_CHANNEL (priv->channel), NULL, NULL);
+     g_object_unref (priv->channel);
+     priv->channel = NULL;
    }
  
    if (priv->cancellable != NULL) {
@@@ -410,15 -410,15 +410,15 @@@ empathy_ft_handler_class_init (EmpathyF
    g_object_class_install_property (object_class, PROP_G_FILE, param_spec);
  
    /**
-    * EmpathyFTHandler:tp-file:
+    * EmpathyFTHandler:channel:
     *
-    * The underlying #EmpathyTpFile managing the transfer
+    * The underlying #TpFileTransferChannel managing the transfer
     */
-   param_spec = g_param_spec_object ("tp-file",
-     "tp-file", "The file's channel wrapper",
-     EMPATHY_TYPE_TP_FILE,
+   param_spec = g_param_spec_object ("channel",
+     "channel", "The file transfer channel",
+     TP_TYPE_FILE_TRANSFER_CHANNEL,
      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
-   g_object_class_install_property (object_class, PROP_TP_FILE, param_spec);
+   g_object_class_install_property (object_class, PROP_CHANNEL, param_spec);
  
    param_spec = g_param_spec_int64 ("user-action-time", "user action time",
      "User action time",
    /**
     * EmpathyFTHandler::transfer-started
     * @handler: the object which has received the signal
-    * @tp_file: the #EmpathyTpFile for which the transfer has started
+    * @channel: the #TpFileTransferChannel for which the transfer has started
     *
     * This signal is emitted when the actual transfer starts.
     */
          G_SIGNAL_RUN_LAST, 0, NULL, NULL,
          g_cclosure_marshal_generic,
          G_TYPE_NONE,
-         1, EMPATHY_TYPE_TP_FILE);
+         1, TP_TYPE_FILE_TRANSFER_CHANNEL);
  
    /**
     * EmpathyFTHandler::transfer-done
     * @handler: the object which has received the signal
-    * @tp_file: the #EmpathyTpFile for which the transfer has started
+    * @channel: the #TpFileTransferChannel for which the transfer has started
     *
     * This signal will be emitted when the actual transfer is completed
     * successfully.
          G_SIGNAL_RUN_LAST, 0, NULL, NULL,
          g_cclosure_marshal_generic,
          G_TYPE_NONE,
-         1, EMPATHY_TYPE_TP_FILE);
+         1, TP_TYPE_FILE_TRANSFER_CHANNEL);
  
    /**
     * EmpathyFTHandler::transfer-error
@@@ -634,34 -634,6 +634,6 @@@ emit_error_signal (EmpathyFTHandler *ha
    g_signal_emit (handler, signals[TRANSFER_ERROR], 0, error);
  }
  
- static void
- ft_transfer_operation_callback (EmpathyTpFile *tp_file,
-     const GError *error,
-     gpointer user_data)
- {
-   EmpathyFTHandler *handler = user_data;
-   EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
-   DEBUG ("Transfer operation callback, error %p", error);
-   if (error != NULL)
-     {
-       emit_error_signal (handler, error);
-     }
-   else
-     {
-       priv->is_completed = TRUE;
-       g_signal_emit (handler, signals[TRANSFER_DONE], 0, tp_file);
-       empathy_tp_file_close (tp_file);
-       if (empathy_ft_handler_is_incoming (handler) && priv->use_hash)
-         {
-           check_hash_incoming (handler);
-         }
-     }
- }
  static void
  update_remaining_time_and_speed (EmpathyFTHandler *handler,
      guint64 transferred_bytes)
  }
  
  static void
- ft_transfer_progress_callback (EmpathyTpFile *tp_file,
-     guint64 transferred_bytes,
-     gpointer user_data)
+ ft_transfer_transferred_bytes_cb (TpFileTransferChannel *channel,
+     GParamSpec *pspec,
+     EmpathyFTHandler *handler)
  {
-   EmpathyFTHandler *handler = user_data;
    EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+   guint64 bytes;
  
    if (empathy_ft_handler_is_cancelled (handler))
      return;
  
-   if (transferred_bytes == 0)
+   bytes = tp_file_transfer_channel_get_transferred_bytes (channel);
+   if (priv->transferred_bytes == 0)
      {
        priv->last_update_time = empathy_time_get_current ();
-       g_signal_emit (handler, signals[TRANSFER_STARTED], 0, tp_file);
+       g_signal_emit (handler, signals[TRANSFER_STARTED], 0, channel);
      }
  
-   if (priv->transferred_bytes != transferred_bytes)
+   if (priv->transferred_bytes != bytes)
      {
-       update_remaining_time_and_speed (handler, transferred_bytes);
+       update_remaining_time_and_speed (handler, bytes);
  
        g_signal_emit (handler, signals[TRANSFER_PROGRESS], 0,
-           transferred_bytes, priv->total_bytes, priv->remaining_time,
+           bytes, priv->total_bytes, priv->remaining_time,
            priv->speed);
      }
  }
  
+ static void
+ ft_transfer_provide_cb (GObject *source,
+     GAsyncResult *result,
+     gpointer user_data)
+ {
+   TpFileTransferChannel *channel = TP_FILE_TRANSFER_CHANNEL (source);
+   EmpathyFTHandler *handler = user_data;
+   GError *error = NULL;
+   if (!tp_file_transfer_channel_provide_file_finish (channel, result, &error))
+     {
+       emit_error_signal (handler, error);
+       g_clear_error (&error);
+     }
+ }
+ static void
+ ft_transfer_accept_cb (GObject *source,
+     GAsyncResult *result,
+     gpointer user_data)
+ {
+   TpFileTransferChannel *channel = TP_FILE_TRANSFER_CHANNEL (source);
+   EmpathyFTHandler *handler = user_data;
+   GError *error = NULL;
+   if (!tp_file_transfer_channel_accept_file_finish (channel, result, &error))
+     {
+       emit_error_signal (handler, error);
+       g_clear_error (&error);
+     }
+ }
+ static GError *
+ error_from_state_change_reason (TpFileTransferStateChangeReason reason)
+ {
+   const char *string;
+   GError *retval = NULL;
+   string = NULL;
+   switch (reason)
+     {
+       case TP_FILE_TRANSFER_STATE_CHANGE_REASON_NONE:
+         string = _("No reason was specified");
+         break;
+       case TP_FILE_TRANSFER_STATE_CHANGE_REASON_REQUESTED:
+         string = _("The change in state was requested");
+         break;
+       case TP_FILE_TRANSFER_STATE_CHANGE_REASON_LOCAL_STOPPED:
+         string = _("You canceled the file transfer");
+         break;
+       case TP_FILE_TRANSFER_STATE_CHANGE_REASON_REMOTE_STOPPED:
+         string = _("The other participant canceled the file transfer");
+         break;
+       case TP_FILE_TRANSFER_STATE_CHANGE_REASON_LOCAL_ERROR:
+         string = _("Error while trying to transfer the file");
+         break;
+       case TP_FILE_TRANSFER_STATE_CHANGE_REASON_REMOTE_ERROR:
+         string = _("The other participant is unable to transfer the file");
+         break;
+       default:
+         string = _("Unknown reason");
+         break;
+     }
+   retval = g_error_new_literal (EMPATHY_FT_ERROR_QUARK,
+       EMPATHY_FT_ERROR_TP_ERROR, string);
+   return retval;
+ }
+ static void
+ ft_transfer_state_cb (TpFileTransferChannel *channel,
+     GParamSpec *pspec,
+     EmpathyFTHandler *handler)
+ {
+   EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+   TpFileTransferStateChangeReason reason;
+   TpFileTransferState state = tp_file_transfer_channel_get_state (
+       channel, &reason);
+   if (state == TP_FILE_TRANSFER_STATE_COMPLETED)
+     {
+       priv->is_completed = TRUE;
+       g_signal_emit (handler, signals[TRANSFER_DONE], 0, channel);
+       tp_channel_close_async (TP_CHANNEL (channel), NULL, NULL);
+       if (empathy_ft_handler_is_incoming (handler) && priv->use_hash)
+         {
+           check_hash_incoming (handler);
+         }
+     }
+   else if (state == TP_FILE_TRANSFER_STATE_CANCELLED)
+     {
+       GError *error = error_from_state_change_reason (reason);
+       emit_error_signal (handler, error);
+       g_clear_error (&error);
+     }
+ }
  static void
  ft_handler_create_channel_cb (GObject *source,
      GAsyncResult *result,
        return;
      }
  
-   priv->tpfile = EMPATHY_TP_FILE (channel);
+   priv->channel = TP_FILE_TRANSFER_CHANNEL (channel);
  
-   empathy_tp_file_offer (priv->tpfile, priv->gfile, priv->cancellable,
-       ft_transfer_progress_callback, handler,
-       ft_transfer_operation_callback, handler);
+   tp_g_signal_connect_object (priv->channel, "notify::state",
+       G_CALLBACK (ft_transfer_state_cb), handler, 0);
+   tp_g_signal_connect_object (priv->channel, "notify::transferred-bytes",
+       G_CALLBACK (ft_transfer_transferred_bytes_cb), handler, 0);
+   tp_file_transfer_channel_provide_file_async (priv->channel, priv->gfile,
+       ft_transfer_provide_cb, handler);
  }
  
  static void
@@@ -1054,7 -1133,7 +1133,7 @@@ set_content_hash_type_from_classes (Emp
  
    if (!support_ft)
      {
 -      g_array_free (possible_values, TRUE);
 +      g_array_unref (possible_values);
        return FALSE;
      }
  
      }
  
  out:
 -  g_array_free (possible_values, TRUE);
 +  g_array_unref (possible_values);
  
    DEBUG ("Hash enabled %s; setting content hash type as %u",
           priv->use_hash ? "True" : "False", priv->content_hash_type);
@@@ -1332,7 -1411,7 +1411,7 @@@ empathy_ft_handler_new_outgoing (Empath
  
  /**
   * empathy_ft_handler_new_incoming:
-  * @tp_file: the #EmpathyTpFile wrapping the incoming channel
+  * @channel: the #TpFileTransferChannel proxy to the incoming channel
   * @callback: callback to be called when the handler has been created
   * @user_data: user data to be passed to @callback
   *
   * is ready.
   */
  void
- empathy_ft_handler_new_incoming (EmpathyTpFile *tp_file,
+ empathy_ft_handler_new_incoming (TpFileTransferChannel *channel,
      EmpathyFTHandlerReadyCallback callback,
      gpointer user_data)
  {
    EmpathyFTHandler *handler;
    CallbacksData *data;
-   TpFileTransferChannel *ft_chan = (TpFileTransferChannel *) tp_file;
    EmpathyFTHandlerPriv *priv;
  
-   g_return_if_fail (EMPATHY_IS_TP_FILE (tp_file));
+   g_return_if_fail (TP_IS_FILE_TRANSFER_CHANNEL (channel));
  
    handler = g_object_new (EMPATHY_TYPE_FT_HANDLER,
-       "tp-file", tp_file, NULL);
+       "channel", channel, NULL);
  
    priv = GET_PRIV (handler);
  
    data->user_data = user_data;
    data->handler = g_object_ref (handler);
  
-   priv->total_bytes = tp_file_transfer_channel_get_size (ft_chan);
+   priv->total_bytes = tp_file_transfer_channel_get_size (channel);
  
    priv->transferred_bytes = tp_file_transfer_channel_get_transferred_bytes (
-       ft_chan);
+       channel);
  
-   priv->filename = g_strdup (tp_file_transfer_channel_get_filename (ft_chan));
+   priv->filename = g_strdup (tp_file_transfer_channel_get_filename (channel));
  
    priv->content_type = g_strdup (tp_file_transfer_channel_get_mime_type (
-       ft_chan));
+       channel));
  
    priv->description = g_strdup (tp_file_transfer_channel_get_description (
-       ft_chan));
+       channel));
  
-   tp_cli_dbus_properties_call_get_all (tp_file,
+   tp_cli_dbus_properties_call_get_all (channel,
        -1, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER,
        channel_get_all_properties_cb, data, NULL, G_OBJECT (handler));
  }
@@@ -1397,16 -1475,20 +1475,20 @@@ empathy_ft_handler_start_transfer (Empa
  
    priv = GET_PRIV (handler);
  
-   if (priv->tpfile == NULL)
+   if (priv->channel == NULL)
      {
        ft_handler_complete_request (handler);
      }
    else
      {
        /* TODO: add support for resume. */
-       empathy_tp_file_accept (priv->tpfile, 0, priv->gfile, priv->cancellable,
-           ft_transfer_progress_callback, handler,
-           ft_transfer_operation_callback, handler);
+       tp_file_transfer_channel_accept_file_async (priv->channel,
+           priv->gfile, 0, ft_transfer_accept_cb, handler);
+       tp_g_signal_connect_object (priv->channel, "notify::state",
+           G_CALLBACK (ft_transfer_state_cb), handler, 0);
+       tp_g_signal_connect_object (priv->channel, "notify::transferred-bytes",
+           G_CALLBACK (ft_transfer_transferred_bytes_cb), handler, 0);
      }
  }
  
@@@ -1427,13 -1509,13 +1509,13 @@@ empathy_ft_handler_cancel_transfer (Emp
  
    priv = GET_PRIV (handler);
  
-   /* if we don't have an EmpathyTpFile, we are hashing, so
+   /* if we don't have a channel, we are hashing, so
     * we can just cancel the GCancellable to stop it.
     */
-   if (priv->tpfile == NULL)
+   if (priv->channel == NULL)
      g_cancellable_cancel (priv->cancellable);
    else
-     empathy_tp_file_cancel (priv->tpfile);
+     tp_channel_close_async (TP_CHANNEL (priv->channel), NULL, NULL);
  }
  
  /**
@@@ -1587,10 -1669,10 +1669,10 @@@ empathy_ft_handler_is_incoming (Empathy
  
    priv = GET_PRIV (handler);
  
-   if (priv->tpfile == NULL)
+   if (priv->channel == NULL)
      return FALSE;
  
-   return !tp_channel_get_requested ((TpChannel *) priv->tpfile);
+   return !tp_channel_get_requested ((TpChannel *) priv->channel);
  }
  
  /**
diff --combined po/POTFILES.in
index 46cb3a0d5e76ab1bf14311d3bee6926c3810ed40,355089aa8879bc8e6e4b3ef39f4f4e58df853f8b..2d0012f65d5f13333779e1e0d745f96b967c7e60
@@@ -8,7 -8,6 +8,6 @@@ data/empathy-accounts.desktop.in.i
  libempathy/empathy-ft-handler.c
  libempathy/empathy-message.c
  libempathy/empathy-tp-contact-list.c
- libempathy/empathy-tp-file.c
  libempathy/empathy-utils.c
  libempathy/empathy-time.c
  
@@@ -36,6 -35,7 +35,6 @@@ libempathy-gtk/empathy-contact-blocking
  libempathy-gtk/empathy-chat-text-view.c
  libempathy-gtk/empathy-contact-dialogs.c
  [type: gettext/glade]libempathy-gtk/empathy-contact-dialogs.ui
 -libempathy-gtk/empathy-contact-list-view.c
  libempathy-gtk/empathy-contact-menu.c
  libempathy-gtk/empathy-contact-search-dialog.c
  libempathy-gtk/empathy-contact-widget.c
@@@ -57,8 -57,6 +56,8 @@@ libempathy-gtk/empathy-log-window.
  [type: gettext/glade]libempathy-gtk/empathy-log-window.ui
  libempathy-gtk/empathy-new-message-dialog.c
  libempathy-gtk/empathy-new-call-dialog.c
 +libempathy-gtk/empathy-bad-password-dialog.c
 +libempathy-gtk/empathy-base-password-dialog.c
  libempathy-gtk/empathy-password-dialog.c
  libempathy-gtk/empathy-presence-chooser.c
  libempathy-gtk/empathy-protocol-chooser.c
diff --combined src/empathy-ft-manager.c
index 606600e990aad239801bdbd1a848e86f7a817e26,bc15262a1b3f7bc63b0cee98cc86db7a8bc17bd0..18ca1938a3e57041a9eb6ba70b09ee61f1f382f4
@@@ -37,7 -37,6 +37,6 @@@
  
  #define DEBUG_FLAG EMPATHY_DEBUG_FT
  #include <libempathy/empathy-debug.h>
- #include <libempathy/empathy-tp-file.h>
  #include <libempathy/empathy-utils.h>
  
  #include <libempathy-gtk/empathy-ui-utils.h>
@@@ -518,7 -517,7 +517,7 @@@ do_real_transfer_done (EmpathyFTManage
  
  static void
  ft_handler_transfer_done_cb (EmpathyFTHandler *handler,
-                              EmpathyTpFile *tp_file,
+                              TpFileTransferChannel *channel,
                               EmpathyFTManager *manager)
  {
    if (empathy_ft_handler_is_incoming (handler) &&
@@@ -574,7 -573,7 +573,7 @@@ ft_handler_transfer_progress_cb (Empath
  
  static void
  ft_handler_transfer_started_cb (EmpathyFTHandler *handler,
-                                 EmpathyTpFile *tp_file,
+                                 TpFileTransferChannel *channel,
                                  EmpathyFTManager *manager)
  {
    guint64 transferred_bytes, total_bytes;
@@@ -1082,7 -1081,7 +1081,7 @@@ empathy_ft_manager_finalize (GObject *o
  
    DEBUG ("FT Manager %p", object);
  
 -  g_hash_table_destroy (priv->ft_handler_to_row_ref);
 +  g_hash_table_unref (priv->ft_handler_to_row_ref);
  
    G_OBJECT_CLASS (empathy_ft_manager_parent_class)->finalize (object);
  }