217
if (dg_output && g_variant_n_children (dg_output) == 2)
219
GVariant *devices_variant = NULL;
221
g_variant_get (dg_output, "(&s@a{ss})",
227
if (g_variant_is_of_type (devices_variant, G_VARIANT_TYPE ("a{ss}")))
231
g_variant_get (devices_variant,
234
devices = g_hash_table_new (g_str_hash, g_str_equal);
235
while ((item = g_variant_iter_next_value (iter)))
244
g_hash_table_insert (devices, key, value);
247
g_variant_unref (devices_variant);
249
g_variant_unref (dg_output);
251
g_object_unref (source_object);
253
if (error || (ret_error && ret_error[0] != '\0'))
256
g_warning ("%s", error->message);
258
if (ret_error && ret_error[0] != '\0')
259
g_warning ("%s", ret_error);
271
keys = g_hash_table_get_keys (devices);
272
for (iter = keys; iter; iter = iter->next)
276
cut = g_strrstr ((gchar *)iter->data, ":");
278
index = atoi (cut + 1);
280
if (index > max_index)
286
pp->num_devices = max_index + 1;
287
pp->devices = g_new0 (CupsDevice, pp->num_devices);
289
g_hash_table_foreach (devices, store_device_parameter, pp);
291
/* Assign names to devices */
292
for (i = 0; i < pp->num_devices; i++)
296
if (pp->devices[i].device_id)
298
name = get_tag_value (pp->devices[i].device_id, "mdl");
299
name = g_strcanon (name, ALLOWED_CHARACTERS, '-');
301
else if (pp->devices[i].device_info)
303
name = g_strdup (pp->devices[i].device_info);
304
name = g_strcanon (name, ALLOWED_CHARACTERS, '-');
307
pp->devices[i].display_name = name;
311
* Don't show duplicates.
312
* Show devices with device-id.
313
* Other preferences should apply here.
315
for (i = 0; i < pp->num_devices; i++)
317
for (j = 0; j < pp->num_devices; j++)
321
if (g_strcmp0 (pp->devices[i].display_name, pp->devices[j].display_name) == 0)
219
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
221
if (dg_output && g_variant_n_children (dg_output) == 2)
223
GVariant *devices_variant = NULL;
225
g_variant_get (dg_output, "(&s@a{ss})",
231
if (g_variant_is_of_type (devices_variant, G_VARIANT_TYPE ("a{ss}")))
235
g_variant_get (devices_variant,
238
devices = g_hash_table_new (g_str_hash, g_str_equal);
239
while ((item = g_variant_iter_next_value (iter)))
248
g_hash_table_insert (devices, key, value);
251
g_variant_unref (devices_variant);
253
g_variant_unref (dg_output);
255
g_object_unref (source_object);
257
if (error || (ret_error && ret_error[0] != '\0'))
260
g_warning ("%s", error->message);
262
if (ret_error && ret_error[0] != '\0')
263
g_warning ("%s", ret_error);
275
keys = g_hash_table_get_keys (devices);
276
for (iter = keys; iter; iter = iter->next)
280
cut = g_strrstr ((gchar *)iter->data, ":");
282
index = atoi (cut + 1);
284
if (index > max_index)
290
pp->num_devices = max_index + 1;
291
pp->devices = g_new0 (CupsDevice, pp->num_devices);
293
g_hash_table_foreach (devices, store_device_parameter, pp);
295
/* Assign names to devices */
296
for (i = 0; i < pp->num_devices; i++)
300
if (pp->devices[i].device_id)
302
name = get_tag_value (pp->devices[i].device_id, "mdl");
303
name = g_strcanon (name, ALLOWED_CHARACTERS, '-');
305
else if (pp->devices[i].device_info)
307
name = g_strdup (pp->devices[i].device_info);
308
name = g_strcanon (name, ALLOWED_CHARACTERS, '-');
311
pp->devices[i].display_name = name;
315
* Don't show duplicates.
316
* Show devices with device-id.
317
* Other preferences should apply here.
319
for (i = 0; i < pp->num_devices; i++)
321
for (j = 0; j < pp->num_devices; j++)
323
if (pp->devices[i].device_id && !pp->devices[j].show)
325
if (g_strcmp0 (pp->devices[i].display_name, pp->devices[j].display_name) == 0)
325
pp->devices[i].show = TRUE;
327
if (pp->devices[i].device_id && !pp->devices[j].show)
329
pp->devices[i].show = TRUE;
333
g_hash_table_destroy (devices);
334
actualize_devices_list (pp);
337
g_hash_table_destroy (devices);
338
actualize_devices_list (pp);
341
widget = (GtkWidget*)
342
gtk_builder_get_object (pp->builder, "get-devices-status-label");
343
gtk_label_set_text (GTK_LABEL (widget), " ");
345
widget = (GtkWidget*)
346
gtk_builder_get_object (pp->builder, "spinner");
347
gtk_spinner_stop (GTK_SPINNER (widget));
348
gtk_widget_set_sensitive (widget, FALSE);
350
if (pp->cancellable != NULL)
352
g_object_unref (pp->cancellable);
353
pp->cancellable = NULL;
356
g_clear_error (&error);
337
widget = (GtkWidget*)
338
gtk_builder_get_object (pp->builder, "get-devices-status-label");
339
gtk_label_set_text (GTK_LABEL (widget), " ");
341
widget = (GtkWidget*)
342
gtk_builder_get_object (pp->builder, "spinner");
343
gtk_spinner_stop (GTK_SPINNER (widget));
344
gtk_widget_set_sensitive (widget, FALSE);
346
g_clear_error (&error);
821
836
g_clear_error (&error);
827
dbus_g_proxy_call (proxy, "PrinterSetAcceptJobs", &error,
828
G_TYPE_STRING, pp->devices[device_id].display_name,
829
G_TYPE_BOOLEAN, TRUE,
832
G_TYPE_STRING, &ret_error,
835
dbus_g_proxy_call (proxy, "PrinterSetEnabled", &error,
836
G_TYPE_STRING, pp->devices[device_id].display_name,
837
G_TYPE_BOOLEAN, TRUE,
839
G_TYPE_STRING, &ret_error,
842
if (error || (ret_error && ret_error[0] != '\0'))
845
g_warning ("%s", error->message);
847
if (ret_error && ret_error[0] != '\0')
848
g_warning ("%s", ret_error);
850
g_clear_error (&error);
854
if (g_strcmp0 (pp->devices[device_id].device_class, "direct") == 0)
856
gchar *commands = get_dest_attr (pp->devices[device_id].display_name, "printer-commands");
857
gchar *commands_lowercase = g_ascii_strdown (commands, -1);
858
ipp_t *response = NULL;
860
if (g_strrstr (commands_lowercase, "AutoConfigure"))
862
response = execute_maintenance_command (pp->devices[device_id].display_name,
864
/* Translators: Name of job which makes printer to autoconfigure itself */
865
_("Automatic configuration"));
868
if (response->state == IPP_ERROR)
869
/* Translators: An error has occured during execution of AutoConfigure CUPS maintenance command */
870
g_warning ("An error has occured during automatic configuration of new printer.");
871
ippDelete (response);
875
g_free (commands_lowercase);
879
841
g_object_unref (proxy);
989
951
g_clear_error (&error);
956
g_object_unref (proxy);
961
/* Set some options of the new printer */
965
GError *error = NULL;
966
char *ret_error = NULL;
969
proxy = get_dbus_proxy (MECHANISM_BUS,
976
dbus_g_proxy_call (proxy, "PrinterSetAcceptJobs", &error,
977
G_TYPE_STRING, pp->devices[device_id].display_name,
978
G_TYPE_BOOLEAN, TRUE,
981
G_TYPE_STRING, &ret_error,
986
g_warning ("%s", error->message);
987
g_clear_error (&error);
990
if (ret_error && ret_error[0] != '\0')
991
g_warning ("%s", ret_error);
994
dbus_g_proxy_call (proxy, "PrinterSetEnabled", &error,
995
G_TYPE_STRING, pp->devices[device_id].display_name,
996
G_TYPE_BOOLEAN, TRUE,
998
G_TYPE_STRING, &ret_error,
1003
g_warning ("%s", error->message);
1004
g_clear_error (&error);
1007
if (ret_error && ret_error[0] != '\0')
1008
g_warning ("%s", ret_error);
1011
if (g_strcmp0 (pp->devices[device_id].device_class, "direct") == 0)
1013
gchar *commands = get_dest_attr (pp->devices[device_id].display_name, "printer-commands");
1014
gchar *commands_lowercase = g_ascii_strdown (commands, -1);
1015
ipp_t *response = NULL;
1017
if (g_strrstr (commands_lowercase, "AutoConfigure"))
995
dbus_g_proxy_call (proxy, "PrinterSetAcceptJobs", &error,
996
G_TYPE_STRING, pp->devices[device_id].display_name,
997
G_TYPE_BOOLEAN, TRUE,
1000
G_TYPE_STRING, &ret_error,
1003
dbus_g_proxy_call (proxy, "PrinterSetEnabled", &error,
1004
G_TYPE_STRING, pp->devices[device_id].display_name,
1005
G_TYPE_BOOLEAN, TRUE,
1007
G_TYPE_STRING, &ret_error,
1010
if (error || (ret_error && ret_error[0] != '\0'))
1019
response = execute_maintenance_command (pp->devices[device_id].display_name,
1021
/* Translators: Name of job which makes printer to autoconfigure itself */
1022
_("Automatic configuration"));
1013
g_warning ("%s", error->message);
1015
if (ret_error && ret_error[0] != '\0')
1016
g_warning ("%s", ret_error);
1018
g_clear_error (&error);
1025
if (response->state == IPP_ERROR)
1026
g_warning ("An error has occured during automatic configuration of new printer.");
1027
ippDelete (response);
1031
g_free (commands_lowercase);
1035
/* Set default PaperSize according to the locale */
1036
locale = setlocale (LC_PAPER, NULL);
1038
locale = setlocale (LC_MESSAGES, NULL);
1042
const char *ppd_file_name = NULL;
1043
ppd_file_t *ppd_file = NULL;
1044
gchar **value = NULL;
1048
* http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/territory_language_information.html
1050
if (g_regex_match_simple ("[^_.@]{2,3}_(BZ|CA|CL|CO|CR|GT|MX|NI|PA|PH|PR|SV|US|VE)",
1051
locale, G_REGEX_ANCHORED, G_REGEX_MATCH_ANCHORED))
1052
paper_size = g_strdup ("Letter");
1054
paper_size = g_strdup ("A4");
1056
ppd_file_name = cupsGetPPD (pp->devices[device_id].display_name);
1059
ppd_file = ppdOpenFile (ppd_file_name);
1022
if (g_strcmp0 (pp->devices[device_id].device_class, "direct") == 0)
1024
gchar *commands = get_dest_attr (pp->devices[device_id].display_name, "printer-commands");
1025
gchar *commands_lowercase = g_ascii_strdown (commands, -1);
1026
ipp_t *response = NULL;
1028
if (g_strrstr (commands_lowercase, "AutoConfigure"))
1062
ppdMarkDefaults (ppd_file);
1063
for (i = 0; i < ppd_file->num_groups; i++)
1064
for (j = 0; j < ppd_file->groups[i].num_options; j++)
1065
if (g_strcmp0 ("PageSize", ppd_file->groups[i].options[j].keyword) == 0)
1030
response = execute_maintenance_command (pp->devices[device_id].display_name,
1032
/* Translators: Name of job which makes printer to autoconfigure itself */
1033
_("Automatic configuration"));
1067
for (k = 0; k < ppd_file->groups[i].options[j].num_choices; k++)
1036
if (response->state == IPP_ERROR)
1037
/* Translators: An error has occured during execution of AutoConfigure CUPS maintenance command */
1038
g_warning ("An error has occured during automatic configuration of new printer.");
1039
ippDelete (response);
1069
if (g_ascii_strncasecmp (paper_size,
1070
ppd_file->groups[i].options[j].choices[k].choice,
1071
strlen (paper_size)) == 0 &&
1072
!ppd_file->groups[i].options[j].choices[k].marked)
1074
value = g_new0 (gchar *, 2);
1075
value[0] = g_strdup (ppd_file->groups[i].options[j].choices[k].choice);
1043
g_free (commands_lowercase);
1047
g_object_unref (proxy);
1081
ppdClose (ppd_file);
1083
g_unlink (ppd_file_name);
1088
dbus_g_proxy_call (proxy, "PrinterAddOptionDefault", &error,
1089
G_TYPE_STRING, pp->devices[device_id].display_name,
1090
G_TYPE_STRING, "PageSize-default",
1093
G_TYPE_STRING, &ret_error,
1098
g_warning ("%s", error->message);
1099
g_clear_error (&error);
1102
if (ret_error && ret_error[0] != '\0')
1103
g_warning ("%s", ret_error);
1107
g_free (paper_size);
1109
g_object_unref (proxy);