285
316
GVariant *parameters,
286
317
gpointer user_data)
288
GsdPrintNotificationsManager *manager = (GsdPrintNotificationsManager *) user_data;
289
gboolean printer_is_accepting_jobs;
290
gboolean my_job = FALSE;
291
gboolean known_reason;
293
gchar *printer_name = NULL;
294
gchar *primary_text = NULL;
295
gchar *secondary_text = NULL;
297
gchar *printer_uri = NULL;
298
gchar *printer_state_reasons = NULL;
299
gchar *job_state_reasons = NULL;
300
gchar *job_name = NULL;
301
gchar *job_uri = NULL;
303
ipp_t *request, *response;
306
gint job_impressions_completed;
319
process_new_notifications (user_data);
323
process_cups_notification (GsdPrintNotificationsManager *manager,
324
const char *notify_subscribed_event,
325
const char *notify_text,
326
const char *notify_printer_uri,
327
const char *printer_name,
329
const char *printer_state_reasons,
330
gboolean printer_is_accepting_jobs,
333
const char *job_state_reasons,
334
const char *job_name,
335
gint job_impressions_completed)
337
ipp_attribute_t *attr;
338
gboolean my_job = FALSE;
339
gboolean known_reason;
341
gchar *primary_text = NULL;
342
gchar *secondary_text = NULL;
343
gchar *job_uri = NULL;
344
ipp_t *request, *response;
307
345
static const char * const reasons[] = {
371
409
/* Translators: The printer has detected an error (same as in system-config-printer) */
372
410
N_("There is a problem on printer '%s'.") };
374
if (g_strcmp0 (signal_name, "PrinterAdded") != 0 &&
375
g_strcmp0 (signal_name, "PrinterDeleted") != 0 &&
376
g_strcmp0 (signal_name, "PrinterStateChanged") != 0 &&
377
g_strcmp0 (signal_name, "JobCompleted") != 0 &&
378
g_strcmp0 (signal_name, "JobState") != 0 &&
379
g_strcmp0 (signal_name, "JobCreated") != 0)
412
if (g_strcmp0 (notify_subscribed_event, "printer-added") != 0 &&
413
g_strcmp0 (notify_subscribed_event, "printer-deleted") != 0 &&
414
g_strcmp0 (notify_subscribed_event, "printer-state-changed") != 0 &&
415
g_strcmp0 (notify_subscribed_event, "job-completed") != 0 &&
416
g_strcmp0 (notify_subscribed_event, "job-state-changed") != 0 &&
417
g_strcmp0 (notify_subscribed_event, "job-created") != 0)
382
if (g_variant_n_children (parameters) == 1) {
383
g_variant_get (parameters, "(&s)", &text);
384
} else if (g_variant_n_children (parameters) == 6) {
385
g_variant_get (parameters, "(&s&s&su&sb)",
390
&printer_state_reasons,
391
&printer_is_accepting_jobs);
392
} else if (g_variant_n_children (parameters) == 11) {
393
ipp_attribute_t *attr;
395
g_variant_get (parameters, "(&s&s&su&sbuu&s&su)",
400
&printer_state_reasons,
401
&printer_is_accepting_jobs,
406
&job_impressions_completed);
420
if (notify_job_id > 0) {
408
421
if ((http = httpConnectEncrypt (cupsServer (), ippPort (),
409
422
cupsEncryption ())) == NULL) {
410
423
g_debug ("Connection to CUPS server \'%s\' failed.", cupsServer ());
413
job_uri = g_strdup_printf ("ipp://localhost/jobs/%d", job_id);
425
job_uri = g_strdup_printf ("ipp://localhost/jobs/%d", notify_job_id);
415
427
request = ippNewRequest (IPP_GET_JOB_ATTRIBUTES);
416
428
ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_URI,
433
445
g_free (job_uri);
437
g_warning ("Invalid number of parameters for signal '%s'", signal_name);
441
if (g_strcmp0 (signal_name, "PrinterAdded") == 0) {
449
if (g_strcmp0 (notify_subscribed_event, "printer-added") == 0) {
442
450
cupsFreeDests (manager->priv->num_dests, manager->priv->dests);
443
451
manager->priv->num_dests = cupsGetDests (&manager->priv->dests);
445
/* Translators: New printer has been added */
446
453
if (is_local_dest (printer_name,
447
454
manager->priv->dests,
448
455
manager->priv->num_dests)) {
456
/* Translators: New printer has been added */
449
457
primary_text = g_strdup (_("Printer added"));
450
458
secondary_text = g_strdup (printer_name);
452
} else if (g_strcmp0 (signal_name, "PrinterDeleted") == 0) {
453
/* Translators: A printer has been removed */
460
} else if (g_strcmp0 (notify_subscribed_event, "printer-deleted") == 0) {
454
461
if (is_local_dest (printer_name,
455
462
manager->priv->dests,
456
463
manager->priv->num_dests)) {
464
/* Translators: A printer has been removed */
457
465
primary_text = g_strdup (_("Printer removed"));
458
466
secondary_text = g_strdup (printer_name);
461
469
cupsFreeDests (manager->priv->num_dests, manager->priv->dests);
462
470
manager->priv->num_dests = cupsGetDests (&manager->priv->dests);
463
} else if (g_strcmp0 (signal_name, "JobCompleted") == 0 && my_job) {
471
} else if (g_strcmp0 (notify_subscribed_event, "job-completed") == 0 && my_job) {
464
472
g_hash_table_remove (manager->priv->printing_printers,
506
514
secondary_text = g_strdup_printf (_("\"%s\" on %s"), job_name, printer_name);
508
516
case IPP_JOB_STOPPED:
517
g_hash_table_remove (manager->priv->printing_printers,
519
/* Translators: A print job has been stopped */
520
primary_text = g_strdup (_("Printing stopped"));
521
/* Translators: "print-job xy" on a printer */
522
secondary_text = g_strdup_printf (_("\"%s\" on %s"), job_name, printer_name);
509
524
case IPP_JOB_CANCELED:
525
g_hash_table_remove (manager->priv->printing_printers,
527
/* Translators: A print job has been canceled */
528
primary_text = g_strdup (_("Printing canceled"));
529
/* Translators: "print-job xy" on a printer */
530
secondary_text = g_strdup_printf (_("\"%s\" on %s"), job_name, printer_name);
510
532
case IPP_JOB_ABORTED:
533
g_hash_table_remove (manager->priv->printing_printers,
535
/* Translators: A print job has been aborted */
536
primary_text = g_strdup (_("Printing aborted"));
537
/* Translators: "print-job xy" on a printer */
538
secondary_text = g_strdup_printf (_("\"%s\" on %s"), job_name, printer_name);
511
540
case IPP_JOB_COMPLETED:
512
541
g_hash_table_remove (manager->priv->printing_printers,
543
/* Translators: A print job has been completed */
544
primary_text = g_strdup (_("Printing completed"));
545
/* Translators: "print-job xy" on a printer */
546
secondary_text = g_strdup_printf (_("\"%s\" on %s"), job_name, printer_name);
518
} else if (g_strcmp0 (signal_name, "JobCreated") == 0 && my_job) {
551
} else if (g_strcmp0 (notify_subscribed_event, "job-created") == 0 && my_job) {
519
552
if (job_state == IPP_JOB_PROCESSING) {
520
553
g_hash_table_insert (manager->priv->printing_printers,
521
554
g_strdup (printer_name), NULL);
846
process_new_notifications (gpointer user_data)
848
GsdPrintNotificationsManager *manager = (GsdPrintNotificationsManager *) user_data;
849
ipp_attribute_t *attr;
850
const gchar *notify_subscribed_event = NULL;
851
const gchar *printer_name = NULL;
852
const gchar *notify_text = NULL;
853
const gchar *notify_printer_uri = NULL;
854
const gchar *job_state_reasons = NULL;
855
const gchar *job_name = NULL;
856
const char *attr_name;
857
gboolean printer_is_accepting_jobs = FALSE;
858
gchar *printer_state_reasons = NULL;
860
guint notify_job_id = 0;
863
gint printer_state = -1;
865
gint job_impressions_completed = -1;
866
gint notify_sequence_number = -1;
869
request = ippNewRequest (IPP_GET_NOTIFICATIONS);
871
ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_NAME,
872
"requesting-user-name", NULL, cupsUser ());
874
ippAddInteger (request, IPP_TAG_OPERATION, IPP_TAG_INTEGER,
875
"notify-subscription-ids", manager->priv->subscription_id);
877
ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
880
ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
883
ippAddInteger (request, IPP_TAG_OPERATION, IPP_TAG_INTEGER,
884
"notify-sequence-numbers",
885
manager->priv->last_notify_sequence_number + 1);
888
response = cupsDoRequest (CUPS_HTTP_DEFAULT, request, "/");
891
for (attr = ippFindAttribute (response, "notify-sequence-number", IPP_TAG_INTEGER);
893
attr = ippNextAttribute (response)) {
895
attr_name = ippGetName (attr);
896
if (g_strcmp0 (attr_name, "notify-sequence-number") == 0) {
897
notify_sequence_number = ippGetInteger (attr, 0);
899
if (notify_sequence_number > manager->priv->last_notify_sequence_number)
900
manager->priv->last_notify_sequence_number = notify_sequence_number;
902
if (notify_subscribed_event != NULL) {
903
process_cups_notification (manager,
904
notify_subscribed_event,
909
printer_state_reasons,
910
printer_is_accepting_jobs,
915
job_impressions_completed);
917
g_clear_pointer (&printer_state_reasons, g_free);
918
g_clear_pointer (&job_state_reasons, g_free);
921
notify_subscribed_event = NULL;
923
notify_printer_uri = NULL;
926
printer_state_reasons = NULL;
927
printer_is_accepting_jobs = FALSE;
930
job_state_reasons = NULL;
932
job_impressions_completed = -1;
933
} else if (g_strcmp0 (attr_name, "notify-subscribed-event") == 0) {
934
notify_subscribed_event = ippGetString (attr, 0, NULL);
935
} else if (g_strcmp0 (attr_name, "notify-text") == 0) {
936
notify_text = ippGetString (attr, 0, NULL);
937
} else if (g_strcmp0 (attr_name, "notify-printer-uri") == 0) {
938
notify_printer_uri = ippGetString (attr, 0, NULL);
939
} else if (g_strcmp0 (attr_name, "printer-name") == 0) {
940
printer_name = ippGetString (attr, 0, NULL);
941
} else if (g_strcmp0 (attr_name, "printer-state") == 0) {
942
printer_state = ippGetInteger (attr, 0);
943
} else if (g_strcmp0 (attr_name, "printer-state-reasons") == 0) {
944
reasons = g_new0 (gchar *, ippGetCount (attr) + 1);
945
for (i = 0; i < ippGetCount (attr); i++)
946
reasons[i] = g_strdup (ippGetString (attr, i, NULL));
947
printer_state_reasons = g_strjoinv (",", reasons);
948
g_strfreev (reasons);
949
} else if (g_strcmp0 (attr_name, "printer-is-accepting-jobs") == 0) {
950
printer_is_accepting_jobs = ippGetBoolean (attr, 0);
951
} else if (g_strcmp0 (attr_name, "notify-job-id") == 0) {
952
notify_job_id = ippGetInteger (attr, 0);
953
} else if (g_strcmp0 (attr_name, "job-state") == 0) {
954
job_state = ippGetInteger (attr, 0);
955
} else if (g_strcmp0 (attr_name, "job-state-reasons") == 0) {
956
reasons = g_new0 (gchar *, ippGetCount (attr) + 1);
957
for (i = 0; i < ippGetCount (attr); i++)
958
reasons[i] = g_strdup (ippGetString (attr, i, NULL));
959
job_state_reasons = g_strjoinv (",", reasons);
960
g_strfreev (reasons);
961
} else if (g_strcmp0 (attr_name, "job-name") == 0) {
962
job_name = ippGetString (attr, 0, NULL);
963
} else if (g_strcmp0 (attr_name, "job-impressions-completed") == 0) {
964
job_impressions_completed = ippGetInteger (attr, 0);
968
if (notify_subscribed_event != NULL) {
969
process_cups_notification (manager,
970
notify_subscribed_event,
975
printer_state_reasons,
976
printer_is_accepting_jobs,
981
job_impressions_completed);
983
g_clear_pointer (&printer_state_reasons, g_free);
984
g_clear_pointer (&job_state_reasons, g_free);
987
if (response != NULL)
988
ippDelete (response);
815
994
scp_handler (GsdPrintNotificationsManager *manager,
910
1086
"notify-events", num_events, NULL, events);
911
1087
ippAddString (request, IPP_TAG_SUBSCRIPTION, IPP_TAG_KEYWORD,
912
1088
"notify-pull-method", NULL, "ippget");
913
ippAddString (request, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI,
914
"notify-recipient-uri", NULL, "dbus://");
1089
if (server_is_local (cupsServer ())) {
1090
ippAddString (request, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI,
1091
"notify-recipient-uri", NULL, "dbus://");
915
1093
ippAddInteger (request, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER,
916
1094
"notify-lease-duration", SUBSCRIPTION_DURATION);
917
1095
response = cupsDoRequest (http, request, "/");
1027
1230
GsdPrintNotificationsManager *manager = (GsdPrintNotificationsManager *) user_data;
1028
1231
GSocketClient *client;
1029
1232
gchar *address;
1233
int port = ippPort ();
1031
1235
if (!manager->priv->dests) {
1032
address = g_strdup_printf ("%s:%d", cupsServer (), ippPort ());
1034
if (address && address[0] != '/') {
1035
client = g_socket_client_new ();
1037
g_debug ("Initiating test connection to CUPS server \'%s:%d\'.", cupsServer (), ippPort ());
1039
g_socket_client_connect_to_host_async (client,
1043
cups_connection_test_cb,
1046
g_object_unref (client);
1049
manager->priv->num_dests = cupsGetDests (&manager->priv->dests);
1050
gnome_settings_profile_msg ("got dests");
1052
renew_subscription (user_data);
1053
g_timeout_add_seconds (RENEW_INTERVAL, renew_subscription_with_connection_test, manager);
1236
address = g_strdup_printf ("%s:%d", cupsServer (), port);
1238
client = g_socket_client_new ();
1240
g_debug ("Initiating test connection to CUPS server \'%s:%d\'.", cupsServer (), port);
1242
g_socket_client_connect_to_host_async (client,
1246
cups_connection_test_cb,
1249
g_object_unref (client);
1056
1250
g_free (address);