[empathy: 46/148] First implementation of error handling



commit a6b83fc7b0d3a0dbbd2d0266f6b2250221e803bb
Author: Cosimo Cecchi <cosimo cecchi collabora co uk>
Date:   Mon May 4 02:14:43 2009 +0200

    First implementation of error handling
    
    Implement the callback in EmpathyFTManager.
    Erase a redundant is_cancelled property in EmpathyFTHandler and rely on
    the GCancellable, which is shared by EmpathyTpFile and EmpathyFTHandler.
---
 libempathy/empathy-ft-handler.c |   61 ++++++++++++++++-----------------------
 libempathy/empathy-ft-handler.h |    2 -
 libempathy/empathy-tp-file.c    |   34 +--------------------
 libempathy/empathy-tp-file.h    |    2 -
 src/empathy-ft-manager.c        |   48 +++++++++++++++++++++---------
 5 files changed, 60 insertions(+), 87 deletions(-)

diff --git a/libempathy/empathy-ft-handler.c b/libempathy/empathy-ft-handler.c
index 765de8b..d7a65aa 100644
--- a/libempathy/empathy-ft-handler.c
+++ b/libempathy/empathy-ft-handler.c
@@ -97,7 +97,6 @@ typedef struct {
   TpFileTransferState current_state;
 
   gboolean is_completed;
-  gboolean is_cancelled;
 } EmpathyFTHandlerPriv;
 
 static guint signals[LAST_SIGNAL] = { 0 };
@@ -302,6 +301,7 @@ empathy_ft_handler_init (EmpathyFTHandler *self)
     EMPATHY_TYPE_FT_HANDLER, EmpathyFTHandlerPriv);
 
   self->priv = priv;
+  priv->cancellable = g_cancellable_new ();
 }
 
 /* private functions */
@@ -342,6 +342,18 @@ hash_data_free (HashingData *data)
 }
 
 static void
+emit_error_signal (EmpathyFTHandler *handler,
+                   const GError *error)
+{
+  EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+
+  if (!g_cancellable_is_cancelled (priv->cancellable))
+    g_cancellable_cancel (priv->cancellable);
+
+  g_signal_emit (handler, signals[TRANSFER_ERROR], 0, error);
+}
+
+static void
 ft_transfer_operation_callback (EmpathyTpFile *tp_file,
                                 const GError *error,
                                 gpointer user_data)
@@ -353,8 +365,7 @@ ft_transfer_operation_callback (EmpathyTpFile *tp_file,
 
   if (error != NULL)
     {
-      priv->is_cancelled = TRUE;
-      g_signal_emit (handler, signals[TRANSFER_ERROR], 0, error);
+      emit_error_signal (handler, error);
     }
   else 
     {
@@ -386,24 +397,21 @@ ft_handler_create_channel_cb (EmpathyDispatchOperation *operation,
 {
   EmpathyFTHandler *handler = user_data;
   EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
-  GError *my_error = NULL;
+  GError *my_error = (GError *) error;
 
   DEBUG ("Dispatcher create channel CB");
 
-  if (error != NULL)
+  if (my_error == NULL)
     {
-      priv->is_cancelled = TRUE;
-      g_signal_emit (handler, signals[TRANSFER_ERROR], 0, error);
-      return;
+      g_cancellable_set_error_if_cancelled (priv->cancellable, &my_error);
     }
 
-  g_cancellable_set_error_if_cancelled (priv->cancellable, &my_error);
-
   if (my_error != NULL)
     {
-      priv->is_cancelled = TRUE;
-      g_signal_emit (handler, signals[TRANSFER_ERROR], 0, my_error);
-      g_clear_error (&my_error);
+      emit_error_signal (handler, my_error);
+
+      if (my_error != error)
+        g_clear_error (&my_error);
 
       return;
     }
@@ -570,9 +578,7 @@ cleanup:
 
   if (error != NULL)
     {
-      priv->is_cancelled = TRUE;
-      g_signal_emit (handler, signals[TRANSFER_ERROR], 0, error);
-      g_clear_error (&error);
+      emit_error_signal (handler, error);
     }
   else
     {
@@ -664,8 +670,7 @@ ft_handler_read_async_cb (GObject *source,
   stream = g_file_read_finish (priv->gfile, res, &error);
   if (error != NULL)
     {
-      priv->is_cancelled = TRUE;
-      g_signal_emit (handler, signals[TRANSFER_ERROR], 0, error);
+      emit_error_signal (handler, error);
       g_clear_error (&error);
 
       return;
@@ -705,9 +710,7 @@ ft_handler_complete_request (EmpathyFTHandler *handler)
           EMPATHY_FT_ERROR_NOT_SUPPORTED,
           _("File transfer not supported by remote contact"));
 
-      priv->is_cancelled = TRUE;
-      g_signal_emit (handler, signals[TRANSFER_ERROR], 0, myerr);
-      g_clear_error (&myerr);
+      emit_error_signal (handler, myerr);
 
       return;
     }
@@ -918,7 +921,6 @@ empathy_ft_handler_start_transfer (EmpathyFTHandler *handler)
   g_return_if_fail (EMPATHY_IS_FT_HANDLER (handler));
 
   priv = GET_PRIV (handler);
-  priv->cancellable = g_cancellable_new ();
 
   if (priv->tpfile == NULL)
     {
@@ -1010,19 +1012,6 @@ empathy_ft_handler_get_gfile (EmpathyFTHandler *handler)
   return priv->gfile;
 }
 
-TpFileTransferState
-empathy_ft_handler_get_state (EmpathyFTHandler *handler,
-                              char **state_string)
-{
-  EmpathyFTHandlerPriv *priv;
-
-  g_return_val_if_fail (EMPATHY_IS_FT_HANDLER (handler), -1);
-
-  priv = GET_PRIV (handler);
-
-  return priv->current_state;
-}
-
 gboolean
 empathy_ft_handler_is_incoming (EmpathyFTHandler *handler)
 {
@@ -1083,5 +1072,5 @@ empathy_ft_handler_is_cancelled (EmpathyFTHandler *handler)
 
   priv = GET_PRIV (handler);
 
-  return priv->is_cancelled;
+  return g_cancellable_is_cancelled (priv->cancellable);
 }
\ No newline at end of file
diff --git a/libempathy/empathy-ft-handler.h b/libempathy/empathy-ft-handler.h
index c561fe2..728db80 100644
--- a/libempathy/empathy-ft-handler.h
+++ b/libempathy/empathy-ft-handler.h
@@ -77,8 +77,6 @@ const char * empathy_ft_handler_get_filename (EmpathyFTHandler *handler);
 const char * empathy_ft_handler_get_content_type (EmpathyFTHandler *handler);
 EmpathyContact * empathy_ft_handler_get_contact (EmpathyFTHandler *handler);
 GFile * empathy_ft_handler_get_gfile (EmpathyFTHandler *handler);
-TpFileTransferState empathy_ft_handler_get_state (EmpathyFTHandler *handler,
-                                                   char **state_string);
 gboolean empathy_ft_handler_is_incoming (EmpathyFTHandler *handler);
 guint64 empathy_ft_handler_get_transferred_bytes (EmpathyFTHandler *handler);
 guint64 empathy_ft_handler_get_total_bytes (EmpathyFTHandler *handler);
diff --git a/libempathy/empathy-tp-file.c b/libempathy/empathy-tp-file.c
index 098440a..88d13f3 100644
--- a/libempathy/empathy-tp-file.c
+++ b/libempathy/empathy-tp-file.c
@@ -737,37 +737,6 @@ empathy_tp_file_is_incoming (EmpathyTpFile *tp_file)
   return priv->incoming;
 }
 
-/**
- * empathy_tp_file_get_state:
- * @tp_file: an #EmpathyTpFile
- * @reason: return location for state change reason, or %NULL
- *
- * Gets the current state of @tp_file. If @reason is not %NULL, then
- * it is set to the reason of the last state change.
- *
- * Return value: a #TpFileTransferState
- */
-TpFileTransferState
-empathy_tp_file_get_state (EmpathyTpFile *tp_file,
-                           TpFileTransferStateChangeReason *reason)
-{
-  EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
-
-  g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file),
-      TP_FILE_TRANSFER_STATE_NONE);
-
-  if (reason != NULL)
-    *reason = priv->state_change_reason;
-
-  return priv->state;
-}
-
-/**
- * empathy_tp_file_cancel:
- * @tp_file: an #EmpathyTpFile
- *
- * Cancels the file transfer, @tp_file.
- */
 void
 empathy_tp_file_cancel (EmpathyTpFile *tp_file)
 {
@@ -781,7 +750,8 @@ empathy_tp_file_cancel (EmpathyTpFile *tp_file)
   tp_cli_channel_call_close (priv->channel, -1,
     NULL, NULL, NULL, NULL);
 
-  if (priv->cancellable != NULL)
+  if (priv->cancellable != NULL &&
+      !g_cancellable_is_cancelled (priv->cancellable))
     g_cancellable_cancel (priv->cancellable);
 }
 
diff --git a/libempathy/empathy-tp-file.h b/libempathy/empathy-tp-file.h
index 04da254..612c00a 100644
--- a/libempathy/empathy-tp-file.h
+++ b/libempathy/empathy-tp-file.h
@@ -93,8 +93,6 @@ void empathy_tp_file_close (EmpathyTpFile *tp_file);
 
 gboolean empathy_tp_file_is_incoming (EmpathyTpFile *tp_file);
 
-TpFileTransferState empathy_tp_file_get_state (EmpathyTpFile *tp_file, guint *reason);
-
 G_END_DECLS
 
 #endif /* __EMPATHY_TP_FILE_H__ */
diff --git a/src/empathy-ft-manager.c b/src/empathy-ft-manager.c
index 5424e05..8d94e39 100644
--- a/src/empathy-ft-manager.c
+++ b/src/empathy-ft-manager.c
@@ -125,12 +125,7 @@ ft_manager_update_buttons (EmpathyFTManager *manager)
   GtkTreeSelection *selection;
   GtkTreeModel *model;
   GtkTreeIter iter;
-<<<<<<< HEAD:src/empathy-ft-manager.c
-  EmpathyTpFile *tp_file;
-  TpFileTransferState state;
-=======
   EmpathyFTHandler *handler;
->>>>>>> Use the proper TP interface instead of emp_cli:src/empathy-ft-manager.c
   gboolean open_enabled = FALSE;
   gboolean abort_enabled = FALSE;
   gboolean is_completed, is_cancelled;
@@ -146,19 +141,10 @@ ft_manager_update_buttons (EmpathyFTManager *manager)
       is_cancelled = empathy_ft_handler_is_cancelled (handler);
 
       /* I can open the file if the transfer is completed and was incoming */
-<<<<<<< HEAD:src/empathy-ft-manager.c
-      open_enabled = (state == TP_FILE_TRANSFER_STATE_COMPLETED &&
-        empathy_tp_file_is_incoming (tp_file));
-
-      /* I can abort if the transfer is not already finished */
-      abort_enabled = (state != TP_FILE_TRANSFER_STATE_CANCELLED &&
-        state != TP_FILE_TRANSFER_STATE_COMPLETED);
-=======
       open_enabled = (is_completed && empathy_ft_handler_is_incoming (handler));
 
       /* I can abort if the transfer is not already finished */
       abort_enabled = (is_cancelled == FALSE && is_completed == FALSE);
->>>>>>> Use the proper TP interface instead of emp_cli:src/empathy-ft-manager.c
 
       g_object_unref (handler);
     }
@@ -387,7 +373,39 @@ ft_handler_transfer_error_cb (EmpathyFTHandler *handler,
                               GError *error,
                               EmpathyFTManager *manager)
 {
-  /* TODO: implement */
+  const char *contact_name, *filename;
+  char *first_line, *message;
+  gboolean incoming;
+  GtkTreeRowReference *row_ref;
+
+  DEBUG ("Transfer error %s", error->message);
+
+  row_ref = ft_manager_get_row_from_handler (manager, handler);
+  g_return_if_fail (row_ref != NULL);
+
+  incoming = empathy_ft_handler_is_incoming (handler);  
+  contact_name = empathy_contact_get_name
+    (empathy_ft_handler_get_contact (handler));
+  filename = empathy_ft_handler_get_filename (handler);
+
+  if (incoming)
+    /* translators: first %s is filename, second %s
+     * is the contact name */
+    first_line = g_strdup_printf (_("Error receiving \"%s\" from %s"), filename,
+        contact_name);
+  else
+    /* translators: first %s is filename, second %s
+     * is the contact name */
+    first_line = g_strdup_printf (_("Error sensing \"%s\" to %s"), filename,
+        contact_name);
+
+  message = g_strdup_printf ("%s\n%s", first_line, error->message);
+
+  ft_manager_update_handler_message (manager, row_ref, message);
+  ft_manager_update_buttons (manager);
+
+  g_free (first_line);
+  g_free (message);
 }
 
 static void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]