glib/Makefile.am | 2 + glib/demo/annots.c | 69 +++++++++------------------------------------ glib/demo/info.cc | 27 +---------------- glib/demo/utils.c | 2 - glib/demo/utils.h | 2 - glib/poppler-annot.cc | 26 +++++++++------- glib/poppler-attachment.cc | 4 +- glib/poppler-date.cc | 66 +++++++++++++++++++++++++++++++++++++++++++ glib/poppler-date.h | 30 +++++++++++++++++++ glib/poppler-document.cc | 45 +++++------------------------ glib/poppler-private.h | 2 - glib/poppler.h | 1 12 files changed, 142 insertions(+), 134 deletions(-)
New commits: commit 0750c6502faeabff571f5730b567097e793dca64 Author: Carlos Garcia Campos <[email protected]> Date: Tue Apr 21 20:04:27 2009 +0200 [glib-demo] Fix dates handling in annots demo diff --git a/glib/demo/annots.c b/glib/demo/annots.c index fb3ffcf..338f5dd 100644 --- a/glib/demo/annots.c +++ b/glib/demo/annots.c @@ -187,64 +187,18 @@ gchar * get_markup_date (PopplerAnnotMarkup *poppler_annot) { GDate *date; + struct tm t; + time_t timet; - if ((date = poppler_annot_markup_get_date (poppler_annot))) { - gchar *text; - - text = g_strdup_printf ("D: %d:", g_date_get_day (date)); - - switch (g_date_get_month (date)) - { - case G_DATE_BAD_MONTH: - text = g_strdup_printf ("%s,M: Bad", text); - break; - case G_DATE_JANUARY: - text = g_strdup_printf ("%s,M: January", text); - break; - case G_DATE_FEBRUARY: - text = g_strdup_printf ("%s,M: February", text); - break; - case G_DATE_MARCH: - text = g_strdup_printf ("%s,M: March", text); - break; - case G_DATE_APRIL: - text = g_strdup_printf ("%s,M: April", text); - break; - case G_DATE_MAY: - text = g_strdup_printf ("%s,M: May", text); - break; - case G_DATE_JUNE: - text = g_strdup_printf ("%s,M: June", text); - break; - case G_DATE_JULY: - text = g_strdup_printf ("%s,M: July", text); - break; - case G_DATE_AUGUST: - text = g_strdup_printf ("%s,M: August", text); - break; - case G_DATE_SEPTEMBER: - text = g_strdup_printf ("%s,M: September", text); - break; - case G_DATE_OCTOBER: - text = g_strdup_printf ("%s,M: October", text); - break; - case G_DATE_NOVEMBER: - text = g_strdup_printf ("%s,M: November", text); - break; - case G_DATE_DECEMBER: - text = g_strdup_printf ("%s,M: December", text); - break; - default: - text = g_strdup_printf ("%s,M: Unknown", text); - break; - } - text = g_strdup_printf ("%s,Y: %d", text, g_date_get_year (date)); + date = poppler_annot_markup_get_date (poppler_annot); + if (!date) + return NULL; - g_free (date); - return text; - } + g_date_to_struct_tm (date, &t); + g_date_free (date); - return NULL; + timet = mktime (&t); + return timet == (time_t) - 1 ? NULL : pgd_format_date (timet); } const gchar * @@ -417,6 +371,7 @@ pgd_annot_view_set_annot (GtkWidget *annot_view, GEnumValue *enum_value; gint row = 0; gchar *text, *warning; + time_t timet; alignment = gtk_bin_get_child (GTK_BIN (annot_view)); if (alignment) { @@ -444,6 +399,10 @@ pgd_annot_view_set_annot (GtkWidget *annot_view, g_free (text); text = poppler_annot_get_modified (annot); + if (poppler_date_parse (text, &timet)) { + g_free (text); + text = pgd_format_date (timet); + } pgd_table_add_property (GTK_TABLE (table), "<b>Modified:</b>", text, &row); g_free (text); commit fe73bf9771e8294af4c8a11ec4c2891ff8f8d859 Author: Carlos Garcia Campos <[email protected]> Date: Tue Apr 21 20:02:25 2009 +0200 [glib-demo] GTime is deprecated, use time_t instead diff --git a/glib/demo/utils.c b/glib/demo/utils.c index 5fd0a10..d1fa8ff 100644 --- a/glib/demo/utils.c +++ b/glib/demo/utils.c @@ -238,7 +238,7 @@ pgd_action_view_set_action (GtkWidget *action_view, } gchar * -pgd_format_date (GTime utime) +pgd_format_date (time_t utime) { time_t time = (time_t) utime; char s[256]; diff --git a/glib/demo/utils.h b/glib/demo/utils.h index a757482..72c3ef3 100644 --- a/glib/demo/utils.h +++ b/glib/demo/utils.h @@ -36,7 +36,7 @@ void pgd_table_add_property_with_value_widget (GtkTable *table, GtkWidget *pgd_action_view_new (PopplerDocument *document); void pgd_action_view_set_action (GtkWidget *action_view, PopplerAction *action); -gchar *pgd_format_date (GTime utime); +gchar *pgd_format_date (time_t utime); G_END_DECLS commit 6d468cfa0cb89760e5d6cca43521cde6d99aa52e Author: Carlos Garcia Campos <[email protected]> Date: Tue Apr 21 20:00:20 2009 +0200 [glib-demo] Use format_date from utils and remove duplicated code diff --git a/glib/demo/info.cc b/glib/demo/info.cc index 574b0f5..87be8ea 100644 --- a/glib/demo/info.cc +++ b/glib/demo/info.cc @@ -22,29 +22,6 @@ #include "info.h" #include "utils.h" -static gchar * -poppler_format_date (GTime utime) -{ - time_t time = (time_t) utime; - char s[256]; - const char *fmt_hack = "%c"; - size_t len; - -#ifdef HAVE_LOCALTIME_R - struct tm t; - if (time == 0 || !localtime_r (&time, &t)) return NULL; - len = strftime (s, sizeof (s), fmt_hack, &t); -#else - struct tm *t; - if (time == 0 || !(t = localtime (&time)) ) return NULL; - len = strftime (s, sizeof (s), fmt_hack, t); -#endif - - if (len == 0 || s[0] == '\0') return NULL; - - return g_locale_to_utf8 (s, -1, NULL, NULL, NULL); -} - static void pgd_info_add_permissions (GtkTable *table, PopplerPermissions permissions, @@ -220,11 +197,11 @@ pgd_info_create_widget (PopplerDocument *document) pgd_table_add_property (GTK_TABLE (table), "<b>Linearized:</b>", linearized, &row); g_free (linearized); - str = poppler_format_date (creation_date); + str = pgd_format_date (creation_date); pgd_table_add_property (GTK_TABLE (table), "<b>Creation Date:</b>", str, &row); g_free (str); - str = poppler_format_date (mod_date); + str = pgd_format_date (mod_date); pgd_table_add_property (GTK_TABLE (table), "<b>Modification Date:</b>", str, &row); g_free (str); commit e5f5ea01d0da4c4d877b93755523dc2a7f2ec049 Author: Carlos Garcia Campos <[email protected]> Date: Tue Apr 21 19:57:11 2009 +0200 [glib] Fix poppler_annot_markup_get_date() Date field in Markup annots is also a PDF format date string, so it should be parsed and the resulting time_t used to create a correct GDate. diff --git a/glib/poppler-annot.cc b/glib/poppler-annot.cc index 2cb00cd..58a2478 100644 --- a/glib/poppler-annot.cc +++ b/glib/poppler-annot.cc @@ -455,22 +455,22 @@ poppler_annot_markup_get_date (PopplerAnnotMarkup *poppler_annot) { AnnotMarkup *annot; GooString *annot_date; + time_t timet; g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), NULL); annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + annot_date = annot->getDate (); + if (!annot_date) + return NULL; - if ((annot_date = annot->getDate ())) { - GDateYear year = g_ascii_digit_value (annot_date->getChar(2)) * 1000 + - g_ascii_digit_value (annot_date->getChar(3)) * 100 + - g_ascii_digit_value (annot_date->getChar(4)) * 10 + - g_ascii_digit_value (annot_date->getChar(5)); - GDateMonth month = (GDateMonth) (g_ascii_digit_value (annot_date->getChar(6)) * 10 + - g_ascii_digit_value (annot_date->getChar(7))); - GDateDay day = g_ascii_digit_value (annot_date->getChar(8)) * 10 + - g_ascii_digit_value (annot_date->getChar(9)); - - return g_date_new_dmy (day, month, year); + if (_poppler_convert_pdf_date_to_gtime (annot_date, &timet)) { + GDate *date; + + date = g_date_new (); + g_date_set_time_t (date, timet); + + return date; } return NULL; commit 876ad1bcc8a7b2f37656bf15cee7eb888fd46ed4 Author: Carlos Garcia Campos <[email protected]> Date: Tue Apr 21 19:36:33 2009 +0200 [glib] Add info about the return value in poppler_annot_get_modified() doc diff --git a/glib/poppler-annot.cc b/glib/poppler-annot.cc index 5e5a4aa..2cb00cd 100644 --- a/glib/poppler-annot.cc +++ b/glib/poppler-annot.cc @@ -301,7 +301,9 @@ poppler_annot_get_name (PopplerAnnot *poppler_annot) * poppler_annot_get_modified: * @poppler_annot: a #PopplerAnnot * - * Retrieves the last modification data of @poppler_annot. + * Retrieves the last modification data of @poppler_annot. The returned + * string will be either a PDF format date or a text string. + * See also #poppler_date_parse() * * Return value: a new allocated string with the last modification data of * @poppler_annot. It must be freed with g_free() when done. commit 8c54a15e1715721ee7af7e82c90b8dda3689c65f Author: Carlos Garcia Campos <[email protected]> Date: Tue Apr 21 19:35:14 2009 +0200 [glib] Fix a typo in poppler_date_parse documentation diff --git a/glib/poppler-date.cc b/glib/poppler-date.cc index f29a819..2444f93 100644 --- a/glib/poppler-date.cc +++ b/glib/poppler-date.cc @@ -27,7 +27,7 @@ * @timet: an uninitialized #time_t * * Parses a PDF format date string and converts it to a #time_t. Returns #FALSE - * if the parsing file or the input string is not a valid PDF format date string + * if the parsing fails or the input string is not a valid PDF format date string * * Return value: #TRUE, if @timet was set **/ commit 39d09fa237d06fa93b02eb916d2c0242c4e8fe85 Author: Carlos Garcia Campos <[email protected]> Date: Tue Apr 21 19:29:32 2009 +0200 [glib] Add poppler_date_parse to parse PDF format date strings We need to make this public because the field M in the Annot dictionary might be a Date string (in PDF date format) or a text string. According to the PDF spec: "The preferred format is a date string as described in Section 3.8.3, âDates,â but viewer applications should be prepared to accept and display a string in any format". The only way to know whether it's a PDF date string or not, is by trying to parse it. For this reason poppler_annot_get_modified() returns a gchar * instead of a time_t. So, viewers should try to parse the string in order to convert it to a time_t, and if it fails to parse, use the date string as provided by the document. diff --git a/glib/Makefile.am b/glib/Makefile.am index fe75c67..1548ce1 100644 --- a/glib/Makefile.am +++ b/glib/Makefile.am @@ -45,6 +45,7 @@ EXTRA_DIST = \ poppler_glib_public_headers = \ poppler-action.h \ + poppler-date.h \ poppler-document.h \ poppler-page.h \ poppler-attachment.h \ @@ -64,6 +65,7 @@ lib_LTLIBRARIES = libpoppler-glib.la libpoppler_glib_la_SOURCES = \ $(BUILT_SOURCES) \ poppler-action.cc \ + poppler-date.cc \ poppler-document.cc \ poppler-page.cc \ poppler-attachment.cc \ diff --git a/glib/poppler-attachment.cc b/glib/poppler-attachment.cc index 1c3eef0..2e2d12d 100644 --- a/glib/poppler-attachment.cc +++ b/glib/poppler-attachment.cc @@ -94,8 +94,8 @@ _poppler_attachment_new (PopplerDocument *document, attachment->size = emb_file->size (); - _poppler_convert_pdf_date_to_gtime (emb_file->createDate (), &attachment->ctime); - _poppler_convert_pdf_date_to_gtime (emb_file->modDate (), &attachment->mtime); + _poppler_convert_pdf_date_to_gtime (emb_file->createDate (), (time_t *)&attachment->ctime); + _poppler_convert_pdf_date_to_gtime (emb_file->modDate (), (time_t *)&attachment->mtime); attachment->checksum = g_string_new_len (emb_file->checksum ()->getCString (), emb_file->checksum ()->getLength ()); diff --git a/glib/poppler-date.cc b/glib/poppler-date.cc new file mode 100644 index 0000000..f29a819 --- /dev/null +++ b/glib/poppler-date.cc @@ -0,0 +1,66 @@ +/* poppler-date.cc: glib interface to poppler + * + * Copyright (C) 2009 Carlos Garcia Campos <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <DateInfo.h> + +#include "poppler-date.h" + +/** + * poppler_date_parse: + * @date: string to parse + * @timet: an uninitialized #time_t + * + * Parses a PDF format date string and converts it to a #time_t. Returns #FALSE + * if the parsing file or the input string is not a valid PDF format date string + * + * Return value: #TRUE, if @timet was set + **/ +gboolean +poppler_date_parse (const gchar *date, + time_t *timet) +{ + gint year, mon, day, hour, min, sec, tz_hour, tz_minute; + gchar tz; + struct tm time; + time_t retval; + + /* See PDF Reference 1.3, Section 3.8.2 for PDF Date representation */ + // TODO do something with the timezone information + if (!parseDateString (date, &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute)) + return FALSE; + + time.tm_year = year - 1900; + time.tm_mon = mon - 1; + time.tm_mday = day; + time.tm_hour = hour; + time.tm_min = min; + time.tm_sec = sec; + time.tm_wday = -1; + time.tm_yday = -1; + time.tm_isdst = -1; /* 0 = DST off, 1 = DST on, -1 = don't know */ + + /* compute tm_wday and tm_yday and check date */ + retval = mktime (&time); + if (retval == (time_t) - 1) + return FALSE; + + *timet = retval; + + return TRUE; +} diff --git a/glib/poppler-date.h b/glib/poppler-date.h new file mode 100644 index 0000000..2bb52b2 --- /dev/null +++ b/glib/poppler-date.h @@ -0,0 +1,30 @@ +/* poppler-date.h: glib interface to poppler + * + * Copyright (C) 2009 Carlos Garcia Campos <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_DATE_H__ +#define __POPPLER_DATE_H__ + +#include "poppler.h" + +G_BEGIN_DECLS +gboolean poppler_date_parse (const gchar *date, + time_t *timet); +G_END_DECLS + +#endif /* __POPPLER_DATE_H__ */ diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc index 3387bec..17eec51 100644 --- a/glib/poppler-document.cc +++ b/glib/poppler-document.cc @@ -30,7 +30,6 @@ #include <Stream.h> #include <FontInfo.h> #include <PDFDocEncoding.h> -#include <DateInfo.h> #include <OptionalContent.h> #include "poppler.h" @@ -567,7 +566,7 @@ static void info_dict_get_date (Dict *info_dict, const gchar *key, GValue *value) { Object obj; - GTime result; + time_t result; if (!info_dict->lookup ((gchar *)key, &obj)->isString ()) { obj.free (); @@ -1895,13 +1894,10 @@ poppler_document_get_form_field (PopplerDocument *document, gboolean _poppler_convert_pdf_date_to_gtime (GooString *date, - GTime *gdate) + time_t *gdate) { - int year, mon, day, hour, min, sec, tz_hour, tz_minute; - char tz; - struct tm time; - gchar *date_string, *ds; - GTime result; + gchar *date_string; + gboolean retval; if (date->hasUnicodeMarker()) { date_string = g_convert (date->getCString () + 2, @@ -1910,34 +1906,9 @@ _poppler_convert_pdf_date_to_gtime (GooString *date, } else { date_string = g_strndup (date->getCString (), date->getLength ()); } - ds = date_string; - - /* See PDF Reference 1.3, Section 3.8.2 for PDF Date representation */ - // TODO do something with the timezone information - if (!parseDateString(ds, &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute)) { - g_free (ds); - return FALSE; - } - - time.tm_year = year - 1900; - time.tm_mon = mon - 1; - time.tm_mday = day; - time.tm_hour = hour; - time.tm_min = min; - time.tm_sec = sec; - time.tm_wday = -1; - time.tm_yday = -1; - time.tm_isdst = -1; /* 0 = DST off, 1 = DST on, -1 = don't know */ - - /* compute tm_wday and tm_yday and check date */ - result = mktime (&time); - if (result == (time_t) - 1) { - g_free (ds); - return FALSE; - } - - g_free (ds); - *gdate = result; - return TRUE; + retval = poppler_date_parse (date_string, gdate); + g_free (date_string); + + return retval; } diff --git a/glib/poppler-private.h b/glib/poppler-private.h index 1cb1eac..e8ace14 100644 --- a/glib/poppler-private.h +++ b/glib/poppler-private.h @@ -111,7 +111,7 @@ PopplerAnnot *_poppler_annot_free_text_new (Annot *annot); char *_poppler_goo_string_to_utf8(GooString *s); gboolean _poppler_convert_pdf_date_to_gtime (GooString *date, - GTime *gdate); + time_t *gdate); /* * A convenience macro for boxed type implementations, which defines a diff --git a/glib/poppler.h b/glib/poppler.h index d554093..b1a7730 100644 --- a/glib/poppler.h +++ b/glib/poppler.h @@ -125,5 +125,6 @@ G_END_DECLS #include "poppler-enums.h" #include "poppler-attachment.h" #include "poppler-annot.h" +#include "poppler-date.h" #endif /* __POPPLER_GLIB_H__ */
_______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
