[gnome-network-displays/cc-tmp: 49/80] cc: better error handling




commit 36f097c44d77accf1b927427f24c771f90f7ed4c
Author: Anupam Kumar <kyteinsky gmail com>
Date:   Sun Sep 4 14:08:25 2022 +0530

    cc: better error handling

 src/cc/cc-comm.c |  37 ++++-----
 src/cc/cc-comm.h |   5 +-
 src/cc/cc-ctrl.c | 236 ++++++++++++++++++++++++++++++++-----------------------
 src/cc/cc-ctrl.h |   2 +-
 src/nd-cc-sink.c |   9 ++-
 5 files changed, 164 insertions(+), 125 deletions(-)
---
diff --git a/src/cc/cc-comm.c b/src/cc/cc-comm.c
index c9d6814..42fd397 100644
--- a/src/cc/cc-comm.c
+++ b/src/cc/cc-comm.c
@@ -134,7 +134,7 @@ cc_comm_message_read_cb (GObject      *source_object,
       if (error)
         {
           g_error ("CcComm: Error reading message from stream: %s", error->message);
-          comm->closure->fatal_error_cb (comm->closure, &error);
+          comm->closure->fatal_error_cb (comm->closure, g_steal_pointer (&error));
           return;
         }
       g_error ("CcComm: Error reading message from stream.");
@@ -189,7 +189,7 @@ cc_comm_header_read_cb (GObject      *source_object,
       if (error)
         {
           g_error ("CcComm: Error reading header from stream: %s", error->message);
-          comm->closure->fatal_error_cb (comm->closure, &error);
+          comm->closure->fatal_error_cb (comm->closure, g_steal_pointer (&error));
           return;
         }
       g_error ("CcComm: Error reading header from stream.");
@@ -307,12 +307,10 @@ void
 cc_comm_close_connection (CcComm *comm)
 {
   g_autoptr (GError) error = NULL;
-  gboolean close_ok;
 
   if (comm->con != NULL)
     {
-      close_ok = g_io_stream_close (G_IO_STREAM (comm->con), NULL, &error);
-      if (!close_ok)
+      if (!g_io_stream_close (G_IO_STREAM (comm->con), NULL, &error))
         {
           if (error != NULL)
             g_warning ("CcComm: Error closing communication client connection: %s", error->message);
@@ -328,16 +326,19 @@ cc_comm_close_connection (CcComm *comm)
 static gboolean
 cc_comm_tls_send (CcComm  * comm,
                   uint8_t * message,
-                  gssize    size,
-                  GError  **error)
+                  gssize    size)
 {
   GOutputStream *ostream;
   gssize io_bytes;
+  g_autoptr (GError) err = NULL;
+
+  if (g_cancellable_is_cancelled (comm->cancellable))
+    return FALSE;
 
   if (!G_IS_TLS_CONNECTION (comm->con))
     {
-      g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_CONNECTED,
-                           "Connection has not been established");
+      g_error ("Connection has not been established");
+      comm->closure->fatal_error_cb (comm->closure, NULL);
       return FALSE;
     }
 
@@ -348,13 +349,12 @@ cc_comm_tls_send (CcComm  * comm,
   /* start sending data synchronously */
   while (size > 0)
     {
-      io_bytes = g_output_stream_write (ostream, message, size, comm->cancellable, error);
+      io_bytes = g_output_stream_write (ostream, message, size, comm->cancellable, &err);
 
       if (io_bytes <= 0)
         {
-          g_warning ("CcComm: Failed to write: %s", (*error)->message);
-          comm->closure->fatal_error_cb (comm->closure, error);
-          g_clear_error (error);
+          g_warning ("CcComm: Failed to write: %s", err->message);
+          comm->closure->fatal_error_cb (comm->closure, g_steal_pointer (&err));
           return FALSE;
         }
 
@@ -435,8 +435,7 @@ gboolean
 cc_comm_send_request (CcComm       *comm,
                       gchar        *destination_id,
                       CcMessageType message_type,
-                      gchar        *utf8_payload,
-                      GError      **error)
+                      gchar        *utf8_payload)
 {
   Cast__Channel__CastMessage message;
   guint32 packed_size = 0;
@@ -458,7 +457,7 @@ cc_comm_send_request (CcComm       *comm,
                                   &binary_payload,
                                   NULL))
         {
-          *error = g_error_new (1, 1, "Auth message building failed!");
+          g_error ("Auth message building failed!");
           return FALSE;
         }
       break;
@@ -472,10 +471,9 @@ cc_comm_send_request (CcComm       *comm,
                                   NULL,
                                   utf8_payload))
         {
-          *error = g_error_new (1, 1, "Message building failed for message type: %d", message_type);
+          g_error ("Message building failed for message type: %d", message_type);
           return FALSE;
         }
-      break;
     }
 
   packed_size = cast__channel__cast_message__get_packed_size (&message);
@@ -496,6 +494,5 @@ cc_comm_send_request (CcComm       *comm,
 
   return cc_comm_tls_send (comm,
                            sock_buffer,
-                           packed_size + 4,
-                           error);
+                           packed_size + 4);
 }
diff --git a/src/cc/cc-comm.h b/src/cc/cc-comm.h
index 6f68224..17f96d5 100644
--- a/src/cc/cc-comm.h
+++ b/src/cc/cc-comm.h
@@ -31,7 +31,7 @@ struct _CcCommClosure
   gpointer userdata;
   void (*message_received_cb) (struct _CcCommClosure *closure,
                                Cast__Channel__CastMessage *message);
-  void (*fatal_error_cb) (struct _CcCommClosure *closure, GError **error);
+  void (*fatal_error_cb) (struct _CcCommClosure *closure, GError *error);
 };
 
 typedef struct _CcCommClosure CcCommClosure;
@@ -71,7 +71,6 @@ void cc_comm_close_connection (CcComm *comm);
 gboolean cc_comm_send_request (CcComm       *comm,
                                gchar        *destination_id,
                                CcMessageType message_type,
-                               gchar        *utf8_payload,
-                               GError      **error);
+                               gchar        *utf8_payload);
 
 G_END_DECLS
diff --git a/src/cc/cc-ctrl.c b/src/cc/cc-ctrl.c
index c67a755..0682b7c 100644
--- a/src/cc/cc-ctrl.c
+++ b/src/cc/cc-ctrl.c
@@ -19,6 +19,9 @@
 #include "cc-ctrl.h"
 #include "cc-comm.h"
 
+/* FUNCTION DECLS */
+static void cc_ctrl_fatal_error (CcCtrl *ctrl);
+
 /* WAITING FOR */
 
 static void
@@ -42,22 +45,25 @@ cc_ctrl_is_waiting_for (CcCtrl *ctrl, CcWaitingFor waiting_for)
 /* SEND HELPER FUNCTIONS */
 
 static gboolean
-cc_ctrl_send_auth (CcCtrl *ctrl, GError **error)
+cc_ctrl_send_auth (CcCtrl *ctrl)
 {
-  g_debug ("CcCtrl: Sending auth");
-
-  return cc_comm_send_request (&ctrl->comm,
+  gboolean send_ok = cc_comm_send_request (&ctrl->comm,
                                CC_DEFAULT_RECEIVER_ID,
                                CC_MESSAGE_TYPE_AUTH,
-                               NULL,
-                               error);
+                               NULL);
+
+  if (!send_ok)
+    {
+      g_error ("CcCtrl: Failed to send auth message");
+      cc_ctrl_fatal_error (ctrl);
+    }
+  
+  return send_ok;
 }
 
 static gboolean
-cc_ctrl_send_connect (CcCtrl *ctrl, gchar *destination_id, GError **error)
+cc_ctrl_send_connect (CcCtrl *ctrl, gchar *destination_id)
 {
-  g_debug ("CcCtrl: Sending CONNECT");
-
   JsonNode *origin = cc_json_helper_build_node (NULL);
   JsonNode *senderInfo = cc_json_helper_build_node (
     "sdkType", CC_JSON_TYPE_INT, 2,
@@ -75,34 +81,44 @@ cc_ctrl_send_connect (CcCtrl *ctrl, gchar *destination_id, GError **error)
     "senderInfo", CC_JSON_TYPE_OBJECT, senderInfo,
     NULL);
 
-  return cc_comm_send_request (&ctrl->comm,
+  gboolean send_ok = cc_comm_send_request (&ctrl->comm,
                                destination_id,
                                CC_MESSAGE_TYPE_CONNECT,
-                               json,
-                               error);
+                               json);
+
+  if (!send_ok)
+    {
+      g_error ("CcCtrl: Failed to send connect message");
+      cc_ctrl_fatal_error (ctrl);
+    }
+
+  return send_ok;
 }
 
 static gboolean
-cc_ctrl_send_disconnect (CcCtrl *ctrl, gchar *destination_id, GError **error)
+cc_ctrl_send_disconnect (CcCtrl *ctrl, gchar *destination_id)
 {
-  g_debug ("CcCtrl: Sending CLOSE");
-
   gchar *json = cc_json_helper_build_string (
     "type", CC_JSON_TYPE_STRING, "CLOSE",
     NULL);
 
-  return cc_comm_send_request (&ctrl->comm,
+  gboolean send_ok = cc_comm_send_request (&ctrl->comm,
                                destination_id,
                                CC_MESSAGE_TYPE_DISCONNECT,
-                               json,
-                               error);
+                               json);
+
+  if (!send_ok)
+    {
+      g_error ("CcCtrl: Failed to send disconnect message");
+      cc_ctrl_fatal_error (ctrl);
+    }
+
+  return send_ok;
 }
 
 static gboolean
-cc_ctrl_send_get_status (CcCtrl *ctrl, gchar *destination_id, GError **error)
+cc_ctrl_send_get_status (CcCtrl *ctrl, gchar *destination_id)
 {
-  g_debug ("CcCtrl: Sending GET_STATUS");
-
   gchar *json = cc_json_helper_build_string (
     "type", CC_JSON_TYPE_STRING, "GET_STATUS",
     "requestId", CC_JSON_TYPE_INT, ctrl->request_id++,
@@ -111,19 +127,22 @@ cc_ctrl_send_get_status (CcCtrl *ctrl, gchar *destination_id, GError **error)
   gboolean send_ok = cc_comm_send_request (&ctrl->comm,
                                destination_id,
                                CC_MESSAGE_TYPE_RECEIVER,
-                               json,
-                               error);
+                               json);
+
   if (send_ok)
     cc_ctrl_set_waiting_for (ctrl, CC_RWAIT_TYPE_RECEIVER_STATUS);
+  else
+    {
+      g_error ("CcCtrl: Failed to send get status message");
+      cc_ctrl_fatal_error (ctrl);
+    }
 
   return send_ok;
 }
 
 static gboolean
-cc_ctrl_send_get_app_availability (CcCtrl *ctrl, gchar *destination_id, gchar *appId, GError **error)
+cc_ctrl_send_get_app_availability (CcCtrl *ctrl, gchar *destination_id, gchar *appId)
 {
-  g_debug ("CcCtrl: Sending GET_APP_AVAILABILITY");
-
   g_autoptr (GArray) appIds = g_array_new (FALSE, FALSE, sizeof (gchar *));
   g_array_append_val (appIds, CC_MIRRORING_APP_ID);
 
@@ -136,19 +155,22 @@ cc_ctrl_send_get_app_availability (CcCtrl *ctrl, gchar *destination_id, gchar *a
   gboolean send_ok = cc_comm_send_request (&ctrl->comm,
                                destination_id,
                                CC_MESSAGE_TYPE_RECEIVER,
-                               json,
-                               error);
+                               json);
 
   if (send_ok)
     cc_ctrl_set_waiting_for (ctrl, CC_RWAIT_TYPE_GET_APP_AVAILABILITY);
+  else
+    {
+      g_error ("CcCtrl: Failed to send get app availability message");
+      cc_ctrl_fatal_error (ctrl);
+    }
+
   return send_ok;
 }
 
 static gboolean
-cc_ctrl_send_launch_app (CcCtrl *ctrl, gchar *destination_id, gchar *appId, GError **error)
+cc_ctrl_send_launch_app (CcCtrl *ctrl, gchar *destination_id, gchar *appId)
 {
-  g_debug ("CcCtrl: Sending LAUNCH");
-
   gchar *json = cc_json_helper_build_string (
     "type", CC_JSON_TYPE_STRING, "LAUNCH",
     "launguage", CC_JSON_TYPE_STRING, "en-US",
@@ -159,19 +181,22 @@ cc_ctrl_send_launch_app (CcCtrl *ctrl, gchar *destination_id, gchar *appId, GErr
   gboolean send_ok = cc_comm_send_request (&ctrl->comm,
                                destination_id,
                                CC_MESSAGE_TYPE_RECEIVER,
-                               json,
-                               error);
+                               json);
 
   if (send_ok)
     cc_ctrl_set_waiting_for (ctrl, CC_RWAIT_TYPE_RECEIVER_STATUS);
+  else
+    {
+      g_error ("CcCtrl: Failed to send launch app message");
+      cc_ctrl_fatal_error (ctrl);
+    }
+
   return send_ok;
 }
 
 static gboolean
-cc_ctrl_send_close_app (CcCtrl *ctrl, gchar *sessionId, GError **error)
+cc_ctrl_send_close_app (CcCtrl *ctrl, gchar *sessionId)
 {
-  g_debug ("CcCtrl: Sending STOP");
-
   gchar *json = cc_json_helper_build_string (
     "type", CC_JSON_TYPE_STRING, "STOP",
     "sessionId", CC_JSON_TYPE_STRING, sessionId,
@@ -181,11 +206,16 @@ cc_ctrl_send_close_app (CcCtrl *ctrl, gchar *sessionId, GError **error)
   gboolean send_ok = cc_comm_send_request (&ctrl->comm,
                                sessionId,
                                CC_MESSAGE_TYPE_RECEIVER,
-                               json,
-                               error);
+                               json);
 
   if (send_ok)
     cc_ctrl_set_waiting_for (ctrl, CC_RWAIT_TYPE_RECEIVER_STATUS);
+  else
+    {
+      g_error ("CcCtrl: Failed to send close app message");
+      cc_ctrl_fatal_error (ctrl);
+    }
+
   return send_ok;
 }
 
@@ -277,11 +307,16 @@ cc_ctrl_send_offer (CcCtrl *ctrl, gchar *destination_id, GError **error)
   gboolean send_ok = cc_comm_send_request (&ctrl->comm,
                                destination_id,
                                CC_MESSAGE_TYPE_WEBRTC,
-                               cc_json_helper_node_to_string (root),
-                               error);
+                               cc_json_helper_node_to_string (root));
 
   if (send_ok)
     cc_ctrl_set_waiting_for (ctrl, CC_RWAIT_TYPE_ANSWER);
+  else
+    {
+      g_error ("CcCtrl: Failed to send OFFER message");
+      cc_ctrl_fatal_error (ctrl);
+    }
+
   return send_ok;
 }
 
@@ -294,8 +329,8 @@ cc_ctrl_check_waiting_for (CcCtrl *ctrl)
   if (ctrl->waiting_for == CC_RWAIT_TYPE_NONE)
     return G_SOURCE_CONTINUE;
 
-  g_warning ("CcCtrl: Timed out waiting for %d", ctrl->waiting_for);
-  ctrl->closure->end_stream (ctrl->closure);
+  g_error ("CcCtrl: Timed out waiting for %d", ctrl->waiting_for);
+  cc_ctrl_fatal_error (ctrl);
 
   return G_SOURCE_REMOVE;
 }
@@ -310,15 +345,9 @@ cc_ctrl_send_ping (CcCtrl *ctrl)
   if (!cc_comm_send_request (&ctrl->comm,
                              CC_DEFAULT_RECEIVER_ID,
                              CC_MESSAGE_TYPE_PING,
-                             NULL,
-                             &error))
+                             NULL))
     {
-      if (error != NULL)
-        {
-          g_warning ("CcCtrl: Failed to send ping message: %s", error->message);
-          return G_SOURCE_REMOVE;
-        }
-      g_warning ("CcCtrl: Failed to send ping message");
+      g_error ("CcCtrl: Failed to send ping message");
       return G_SOURCE_REMOVE;
     }
 
@@ -332,16 +361,22 @@ cc_ctrl_send_offer_cb (CcCtrl *ctrl)
 {
   g_autoptr (GError) error = NULL;
   if (!cc_ctrl_send_offer (ctrl, ctrl->session_id, &error))
-    g_warning ("CcCtrl: Failed to send OFFER to the mirroring app: %s", error->message);
+    {
+      if (error)
+        g_warning ("CcCtrl: Failed to send OFFER to the mirroring app: %s", error->message);
+      else
+        g_warning ("CcCtrl: Failed to send OFFER to the mirroring app");
+    }
   return G_SOURCE_REMOVE;
 }
 
 static void
-cc_ctrl_mirroring_app_init (CcCtrl *ctrl, GError **error)
+cc_ctrl_mirroring_app_init (CcCtrl *ctrl)
 {
-  if (!cc_ctrl_send_connect (ctrl, ctrl->session_id, error))
+  g_autoptr (GError) err = NULL;
+  if (!cc_ctrl_send_connect (ctrl, ctrl->session_id))
     {
-      g_warning ("CcCtrl: Failed to send CONNECT to the mirroring app: %s", (*error)->message);
+      g_error ("CcCtrl: Failed to send CONNECT to the mirroring app");
       return;
     }
 
@@ -364,16 +399,16 @@ cc_ctrl_handle_get_app_availability (CcCtrl *ctrl, JsonReader *reader)
           if (g_strcmp0 (available, "APP_AVAILABLE"))
             {
               /* launch the app now */
-              if (!cc_ctrl_send_launch_app (ctrl, CC_DEFAULT_RECEIVER_ID, CC_MIRRORING_APP_ID, &error))
+              if (!cc_ctrl_send_launch_app (ctrl, CC_DEFAULT_RECEIVER_ID, CC_MIRRORING_APP_ID))
                 {
-                  g_warning ("CcCtrl: Failed to launch the app: %s", error->message);
+                  g_error ("CcCtrl: Failed to launch the app");
                   return;
                 }
             }
           
           /* since the app is not available, stop attempts */
           g_warning ("CcCtrl: %s app is not available, quiting", CC_MIRRORING_APP_ID);
-          ctrl->closure->end_stream (ctrl->closure);
+          cc_ctrl_fatal_error (ctrl);
         }
     }
 }
@@ -407,9 +442,9 @@ cc_ctrl_handle_receiver_status (CcCtrl *ctrl, JsonParser *parser)
       if (ctrl->state >= CC_CTRL_STATE_APP_OPEN) /* app closed unexpectedly */
         g_debug ("CcCtrl: App closed unexpectedly");
 
-      if (!cc_ctrl_send_launch_app (ctrl, CC_DEFAULT_RECEIVER_ID, CC_MIRRORING_APP_ID, &error))
+      if (!cc_ctrl_send_launch_app (ctrl, CC_DEFAULT_RECEIVER_ID, CC_MIRRORING_APP_ID))
         {
-          g_warning ("CcCtrl: Failed to launch the app: %s", error->message);
+          g_error ("CcCtrl: Failed to launch the app");
           return;
         }
 
@@ -441,14 +476,14 @@ cc_ctrl_handle_receiver_status (CcCtrl *ctrl, JsonParser *parser)
                   g_clear_pointer (&ctrl->session_id, g_free);
                   ctrl->session_id = g_strdup (sessionId);
 
-                  cc_ctrl_mirroring_app_init (ctrl, &error);
+                  cc_ctrl_mirroring_app_init (ctrl);
                   return;
                 }
 
               /* some other app is open, check if `CC_MIRRORING_APP_ID` is available */
-              if (!cc_ctrl_send_get_app_availability (ctrl, CC_MIRRORING_APP_ID, CC_DEFAULT_RECEIVER_ID, 
&error))
+              if (!cc_ctrl_send_get_app_availability (ctrl, CC_MIRRORING_APP_ID, CC_DEFAULT_RECEIVER_ID))
                 {
-                  g_warning ("CcCtrl: Failed to send GET_APP_AVAILABILITY: %s", error->message);
+                  g_error ("CcCtrl: Failed to send GET_APP_AVAILABILITY");
                   return;
                 }
             }
@@ -475,16 +510,14 @@ cc_ctrl_handle_close (CcCtrl *ctrl, Cast__Channel__CastMessage *message)
   if (g_strcmp0 (message->source_id, CC_DEFAULT_RECEIVER_ID) == 0)
     {
       g_warning ("CcCtrl: Receiver closed the connection");
-      ctrl->closure->end_stream (ctrl->closure);
+      cc_ctrl_fatal_error (ctrl);
       return;
     }
 
   /* the app closed */
   g_debug ("CcCtrl: App sent a close message, launching again");
-  if (!cc_ctrl_send_launch_app (ctrl, CC_DEFAULT_RECEIVER_ID, CC_MIRRORING_APP_ID, &error))
-    {
-      g_warning ("CcCtrl: Failed to launch app");
-    }
+  if (!cc_ctrl_send_launch_app (ctrl, CC_DEFAULT_RECEIVER_ID, CC_MIRRORING_APP_ID))
+    g_error ("CcCtrl: Failed to launch app");
 }
 
 void
@@ -526,7 +559,7 @@ cc_ctrl_handle_received_msg (CcCommClosure *closure,
       break;
     case CC_RWAIT_TYPE_LAUNCH_ERROR:
       g_warning ("CcCtrl: Failed to launch app");
-      ctrl->closure->end_stream (ctrl->closure);
+      cc_ctrl_fatal_error (ctrl);
       break;
     case CC_RWAIT_TYPE_ANSWER:
       cc_ctrl_unset_waiting_for (ctrl, CC_RWAIT_TYPE_ANSWER);
@@ -548,17 +581,32 @@ cc_ctrl_handle_received_msg (CcCommClosure *closure,
     case CC_RWAIT_TYPE_UNKNOWN:
     default:
       g_warning ("CcCtrl: Unknown message type");
-      ctrl->closure->end_stream (ctrl->closure);
+      cc_ctrl_fatal_error (ctrl);
       break;
     }
 }
 
+static void
+cc_ctrl_fatal_error (CcCtrl *ctrl)
+{
+  if (ctrl->state == CC_CTRL_STATE_ERROR) /* function has already been called */
+    return;
+
+  ctrl->closure->end_stream (ctrl->closure);
+  ctrl->state = CC_CTRL_STATE_ERROR;
+}
+
 void
-cc_ctrl_fatal_error (CcCommClosure *closure, GError **error)
+cc_ctrl_fatal_error_closure (CcCommClosure *closure, GError *error)
 {
   /* XXX: add error arg in end_stream and display an error message to user */
+  if (error)
+    g_warning ("CcCtrl: Fatal error: %s", error->message);
+  else
+    g_error ("CcCtrl: Fatal error");
+
   CcCtrl *ctrl = (CcCtrl *) closure->userdata;
-  ctrl->closure->end_stream (ctrl->closure);
+  cc_ctrl_fatal_error (ctrl);
 }
 
 CcCommClosure *
@@ -567,7 +615,7 @@ cc_ctrl_get_callback_closure (CcCtrl *ctrl)
   CcCommClosure *closure = (CcCommClosure *) g_malloc (sizeof (CcCommClosure));
   closure->userdata = ctrl;
   closure->message_received_cb = cc_ctrl_handle_received_msg;
-  closure->fatal_error_cb = cc_ctrl_fatal_error;
+  closure->fatal_error_cb = cc_ctrl_fatal_error_closure;
   return closure;
 }
 
@@ -584,22 +632,22 @@ cc_ctrl_connection_init (CcCtrl *ctrl, gchar *remote_address)
 
   if (!cc_comm_make_connection (&ctrl->comm, remote_address, &error))
     {
-      g_warning ("CcCtrl: Failed to make connection to %s: %s", remote_address, error->message);
+      if (error != NULL)
+        g_warning ("CcCtrl: Failed to make connection to %s: %s", remote_address, error->message);
+      else
+        g_warning ("CcCtrl: Failed to make connection to %s", remote_address);
       return FALSE;
     }
 
-  if (!cc_ctrl_send_auth (ctrl, &error))
-    {
-      g_warning ("CcCtrl: Failed to send auth: %s", error->message);
-      return FALSE;
-    }
+  if (!cc_ctrl_send_auth (ctrl))
+    return FALSE;
 
-  if (!cc_ctrl_send_connect (ctrl, CC_DEFAULT_RECEIVER_ID, &error))
+  if (!cc_ctrl_send_connect (ctrl, CC_DEFAULT_RECEIVER_ID))
     {
-      g_warning ("CcCtrl: Failed to send connect: %s", error->message);
+      g_warning ("CcCtrl: Failed to send connect");
       return FALSE;
     }
-  
+
   /* since tls_send is a synchronous call */
   ctrl->state = CC_CTRL_STATE_CONNECTED;
   
@@ -612,9 +660,9 @@ cc_ctrl_connection_init (CcCtrl *ctrl, gchar *remote_address)
                                                               ctrl);
 
   /* we can skip some message interchange if the mirroring app is already up */
-  if (!cc_ctrl_send_get_status (ctrl, CC_DEFAULT_RECEIVER_ID, &error))
+  if (!cc_ctrl_send_get_status (ctrl, CC_DEFAULT_RECEIVER_ID))
     {
-      g_warning ("CcCtrl: Failed to send get status: %s", error->message);
+      g_error ("CcCtrl: Failed to send get status");
       return FALSE;
     }
 
@@ -622,32 +670,24 @@ cc_ctrl_connection_init (CcCtrl *ctrl, gchar *remote_address)
 }
 
 void
-cc_ctrl_finish (CcCtrl *ctrl, GError **r_error)
+cc_ctrl_finish (CcCtrl *ctrl)
 {
-  g_autoptr(GError) err = NULL;
-
   g_clear_handle_id (&ctrl->ping_timeout_handle, g_source_remove);
   g_clear_handle_id (&ctrl->waiting_check_timeout_handle, g_source_remove);
 
   /* close app if open */
   if (ctrl->state >= CC_CTRL_STATE_APP_OPEN)
     {
-      if (!cc_ctrl_send_disconnect (ctrl, CC_DEFAULT_RECEIVER_ID, &err))
-        {
-          g_warning ("CcCtrl: Error closing virtual connection to app: %s", err->message);
-          g_clear_error (&err);
-        }
-      if (!cc_ctrl_send_close_app (ctrl, ctrl->session_id, &err))
-        {
-          g_warning ("CcCtrl: Error closing app: %s", err->message);
-          g_clear_error (&err);
-        }
+      if (!cc_ctrl_send_disconnect (ctrl, CC_DEFAULT_RECEIVER_ID))
+        g_error ("CcCtrl: Error closing virtual connection to app");
+      if (!cc_ctrl_send_close_app (ctrl, ctrl->session_id))
+        g_error ("CcCtrl: Error closing app");
       g_clear_pointer (&ctrl->session_id, g_free);
     }
 
   /* close the virtual connection */
-  if (!cc_ctrl_send_disconnect (ctrl, CC_DEFAULT_RECEIVER_ID, NULL))
-    g_warning ("CcCtrl: Error closing virtual connection: %s", err->message);
+  if (!cc_ctrl_send_disconnect (ctrl, CC_DEFAULT_RECEIVER_ID))
+    g_error ("CcCtrl: Error closing virtual connection");
 
   /* free up the resources */
   g_clear_pointer (&ctrl->comm.closure, g_free);
diff --git a/src/cc/cc-ctrl.h b/src/cc/cc-ctrl.h
index bc9ef7f..50a6f10 100644
--- a/src/cc/cc-ctrl.h
+++ b/src/cc/cc-ctrl.h
@@ -66,7 +66,7 @@ typedef struct _CcCtrl CcCtrl;
 
 /* public functions */
 gboolean cc_ctrl_connection_init (CcCtrl *ctrl, gchar *remote_address);
-void cc_ctrl_finish (CcCtrl *ctrl, GError **error);
+void cc_ctrl_finish (CcCtrl *ctrl);
 
 // XXX: is this required?
 // G_DEFINE_AUTOPTR_CLEANUP_FUNC (CcCtrl, g_object_unref)
diff --git a/src/nd-cc-sink.c b/src/nd-cc-sink.c
index 7799f65..0cacc81 100644
--- a/src/nd-cc-sink.c
+++ b/src/nd-cc-sink.c
@@ -354,8 +354,11 @@ nd_cc_sink_sink_start_stream (NdSink *sink)
   if (!cc_ctrl_connection_init (&self->ctrl, self->remote_address))
     {
       g_warning ("NdCCSink: Failed to init cc-ctrl");
-      self->state = ND_SINK_STATE_ERROR;
-      g_object_notify (G_OBJECT (self), "state");
+      if (self->state != ND_SINK_STATE_ERROR)
+        {
+          self->state = ND_SINK_STATE_ERROR;
+          g_object_notify (G_OBJECT (self), "state");
+        }
       g_clear_object (&self->server);
 
       return NULL;
@@ -410,7 +413,7 @@ nd_cc_sink_sink_start_stream (NdSink *sink)
 static void
 nd_cc_sink_sink_stop_stream_int (NdCCSink *self)
 {
-  cc_ctrl_finish (&self->ctrl, NULL);
+  cc_ctrl_finish (&self->ctrl);
 
   self->cancellable = g_cancellable_new ();
 


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