print portal: Report errors properly
authorMatthias Clasen <mclasen@redhat.com>
Wed, 27 Sep 2023 21:25:42 +0000 (17:25 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 28 Sep 2023 00:42:45 +0000 (20:42 -0400)
The portal printoperation inmplementation
relies on the file printbackend to be available.
If it isn't, we should report a proper error
status insetad of running into assertions deep
inside the printoperation code.

gtk/print/gtkprintoperation-portal.c

index 474d705467cd77a0f1895eb8666456e8b8d04b36..afc276067bf95f3504da1eb56a05aab3aa8849f8 100644 (file)
@@ -384,6 +384,8 @@ find_file_printer (void)
   for (l = backends; l; l = l->next)
     {
       GtkPrintBackend *backend = l->data;
+
+      /* FIXME: this needs changes for cpdb */
       if (strcmp (G_OBJECT_TYPE_NAME (backend), "GtkPrintBackendFile") == 0)
         {
           printers = gtk_print_backend_get_printer_list (backend);
@@ -427,11 +429,6 @@ prepare_print_response (GDBusConnection *connection,
       GtkPrintSettings *settings;
       GtkPageSetup *page_setup;
       GtkPrinter *printer;
-      char *filename;
-      char *uri;
-      int fd;
-
-      portal->result = GTK_PRINT_OPERATION_RESULT_APPLY;
 
       v = g_variant_lookup_value (options, "settings", G_VARIANT_TYPE_VARDICT);
       settings = gtk_print_settings_new_from_gvariant (v);
@@ -444,15 +441,28 @@ prepare_print_response (GDBusConnection *connection,
       g_variant_lookup (options, "token", "u", &portal->token);
 
       printer = find_file_printer ();
+      if (printer)
+        {
+          char *filename;
+          int fd;
+          char *uri;
 
-      fd = g_file_open_tmp ("gtkprintXXXXXX", &filename, NULL);
-      uri = g_filename_to_uri (filename, NULL, NULL);
-      gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_OUTPUT_URI, uri);
-      g_free (uri);
-      close (fd);
+          fd = g_file_open_tmp ("gtkprintXXXXXX", &filename, NULL);
+          uri = g_filename_to_uri (filename, NULL, NULL);
+          gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_OUTPUT_URI, uri);
+          g_free (uri);
+          close (fd);
 
-      finish_print (portal, printer, page_setup, settings);
-      g_free (filename);
+          finish_print (portal, printer, page_setup, settings);
+          g_free (filename);
+
+          portal->result = GTK_PRINT_OPERATION_RESULT_APPLY;
+        }
+      else
+        {
+          portal->do_print = FALSE;
+          portal->result = GTK_PRINT_OPERATION_RESULT_ERROR;
+        }
     }
   else
     {