Bug 561801 - "scheduled printing" doesn't function as expected

2009-01-21  Marek Kasik  <mkasik@redhat.com>
	Bug 561801 - "scheduled printing" doesn't function as expected

	* gtk/gtkprintunixdialog: Add tooltip.
	* modules/printbackends/cups/gtkprintbackendcups.c: Add conversion
	  from local time to utc time for scheduled printing.

svn path=/trunk/; revision=22158
This commit is contained in:
Marek Kasik 2009-01-21 15:03:14 +00:00 committed by Marek Kašík
parent e4bc68ba04
commit 6dbb29a5d4
3 changed files with 114 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2009-01-21 Marek Kasik <mkasik@redhat.com>
Bug 561801 - "scheduled printing" doesn't function as expected
* gtk/gtkprintunixdialog: Add tooltip.
* modules/printbackends/cups/gtkprintbackendcups.c: Add conversion
from local time to utc time for scheduled printing.
2009-01-20 Federico Mena Quintero <federico@novell.com>
http://bugzilla.gnome.org/show_bug.cgi?id=545980 -

View File

@ -2692,6 +2692,8 @@ create_job_page (GtkPrintUnixDialog *dialog)
GtkWidget *main_table, *label;
GtkWidget *frame, *table, *radio;
GtkWidget *entry, *widget;
const gchar *at_tooltip;
const gchar *on_hold_tooltip;
main_table = gtk_table_new (2, 2, FALSE);
gtk_container_set_border_width (GTK_CONTAINER (main_table), 12);
@ -2761,6 +2763,12 @@ create_job_page (GtkPrintUnixDialog *dialog)
*/
radio = gtk_radio_button_new_with_mnemonic (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)),
_("A_t:"));
/* Translators: Ability to parse the am/pm format depends on actual locale.
* You can remove the am/pm values below for your locale if they are not supported.
*/
at_tooltip = _("Specify the time of print,\n e.g. 15:30, 2:35 pm, 14:15:20, 11:46:30 am, 4 pm");
gtk_widget_set_tooltip_text (radio, at_tooltip);
priv->print_at_radio = radio;
gtk_widget_show (radio);
gtk_table_attach (GTK_TABLE (table), radio,
@ -2768,6 +2776,7 @@ create_job_page (GtkPrintUnixDialog *dialog)
0, 0);
entry = gtk_entry_new ();
gtk_widget_set_tooltip_text (entry, at_tooltip);
priv->print_at_entry = entry;
gtk_widget_show (entry);
gtk_table_attach (GTK_TABLE (table), entry,
@ -2780,6 +2789,8 @@ create_job_page (GtkPrintUnixDialog *dialog)
*/
radio = gtk_radio_button_new_with_mnemonic (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)),
_("On _hold"));
on_hold_tooltip = _("Hold the job until it is explicitly released");
gtk_widget_set_tooltip_text (radio, on_hold_tooltip);
priv->print_hold_radio = radio;
gtk_widget_show (radio);
gtk_table_attach (GTK_TABLE (table), radio,

View File

@ -19,12 +19,17 @@
* Boston, MA 02111-1307, USA.
*/
#ifdef __linux__
#define _GNU_SOURCE
#endif
#include "config.h"
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <time.h>
#include <cups/cups.h>
#include <cups/language.h>
@ -3476,6 +3481,83 @@ foreach_option_get_settings (GtkPrinterOption *option,
gtk_print_settings_set (settings, option->name, value);
}
static gboolean
supports_am_pm (void)
{
struct tm tmp_tm = { 0 };
char time[8];
int length;
length = strftime (time, sizeof (time), "%p", &tmp_tm);
return length != 0;
}
/* Converts local time to UTC time. Local time has to be in HH:MM format or
* in HH:MM:SS format or in HH:MM:SS {am, pm} format or in HH:MM {am, pm} format
* or in HH {am, pm} format.
* Returns a newly allocated string holding UTC time in HH:MM:SS format
* or NULL.
*/
gchar *
localtime_to_utctime (const char *local_time)
{
const char *formats_0[] = {" %I : %M : %S %p ", " %H : %M : %S ", " %I : %M %p ", " %H : %M ", " %I %p "};
const char *formats_1[] = {" %H : %M : %S ", " %H : %M "};
const char *end = NULL;
struct tm *actual_local_time;
struct tm *actual_utc_time;
struct tm local_print_time;
struct tm utc_print_time;
struct tm diff_time;
gchar *utc_time = NULL;
int i, n;
if (local_time == NULL || local_time[0] == '\0')
return NULL;
n = supports_am_pm () ? G_N_ELEMENTS (formats_0) : G_N_ELEMENTS (formats_1);
for (i = 0; i < n; i++)
{
local_print_time.tm_hour = 0;
local_print_time.tm_min = 0;
local_print_time.tm_sec = 0;
if (supports_am_pm ())
end = strptime (local_time, formats_0[i], &local_print_time);
else
end = strptime (local_time, formats_1[i], &local_print_time);
if (end != NULL && end[0] == '\0')
break;
}
if (end != NULL && end[0] == '\0')
{
time_t rawtime;
time (&rawtime);
actual_utc_time = g_memdup (gmtime (&rawtime), sizeof (struct tm));
actual_local_time = g_memdup (localtime (&rawtime), sizeof (struct tm));
diff_time.tm_hour = actual_utc_time->tm_hour - actual_local_time->tm_hour;
diff_time.tm_min = actual_utc_time->tm_min - actual_local_time->tm_min;
diff_time.tm_sec = actual_utc_time->tm_sec - actual_local_time->tm_sec;
utc_print_time.tm_hour = ((local_print_time.tm_hour + diff_time.tm_hour) + 24) % 24;
utc_print_time.tm_min = ((local_print_time.tm_min + diff_time.tm_min) + 60) % 60;
utc_print_time.tm_sec = ((local_print_time.tm_sec + diff_time.tm_sec) + 60) % 60;
utc_time = g_strdup_printf ("%02d:%02d:%02d",
utc_print_time.tm_hour,
utc_print_time.tm_min,
utc_print_time.tm_sec);
}
return utc_time;
}
static void
cups_printer_get_settings_from_options (GtkPrinter *printer,
GtkPrinterOptionSet *options,
@ -3506,8 +3588,21 @@ cups_printer_get_settings_from_options (GtkPrinter *printer,
print_at = gtk_print_settings_get (settings, "print-at");
print_at_time = gtk_print_settings_get (settings, "print-at-time");
if (strcmp (print_at, "at") == 0)
gtk_print_settings_set (settings, "cups-job-hold-until", print_at_time);
{
gchar *utc_time = NULL;
utc_time = localtime_to_utctime (print_at_time);
if (utc_time != NULL)
{
gtk_print_settings_set (settings, "cups-job-hold-until", utc_time);
g_free (utc_time);
}
else
gtk_print_settings_set (settings, "cups-job-hold-until", print_at_time);
}
else if (strcmp (print_at, "on-hold") == 0)
gtk_print_settings_set (settings, "cups-job-hold-until", "indefinite");
}