[evince/wip/gpoo/fix-warnings: 2/6] Use GDateTime for handling document properties
- From: Germán Poo-Caamaño <gpoo src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince/wip/gpoo/fix-warnings: 2/6] Use GDateTime for handling document properties
- Date: Sun, 17 Oct 2021 17:09:20 +0000 (UTC)
commit ed1e94af8d07fe2783572ae3f6c2695b5685834d
Author: Germán Poo-Caamaño <gpoo gnome org>
Date: Sat Oct 16 14:57:25 2021 -0300
Use GDateTime for handling document properties
* GTime is deprecated as it not 2038-year safe
* Add deprecation information to no break the API (yet)
backend/pdf/ev-poppler.c | 92 +++++++++++++++++------------------------
libdocument/ev-document-info.h | 4 +-
libdocument/ev-document.c | 6 ++-
properties/ev-properties-view.c | 8 ++--
4 files changed, 49 insertions(+), 61 deletions(-)
---
diff --git a/backend/pdf/ev-poppler.c b/backend/pdf/ev-poppler.c
index 351d57bc..a53ff31d 100644
--- a/backend/pdf/ev-poppler.c
+++ b/backend/pdf/ev-poppler.c
@@ -839,50 +839,6 @@ pdf_document_get_subject_from_metadata (xmlXPathContextPtr xpathCtx)
return pdf_document_get_localized_object_from_metadata (xpathCtx, SUBJECT);
}
-static void
-pdf_document_get_dates_from_metadata (GTime *result, xmlXPathContextPtr xpathCtx)
-{
- xmlChar *modifydate = NULL;
- xmlChar *createdate = NULL;
- xmlChar *metadate = NULL;
- char *datestr;
- GTimeVal tmp_time;
-
- /* reads modify date */
- modifydate = pdf_document_get_xmptag_from_path (xpathCtx, MOD_DATE);
- /* reads pdf create date */
- createdate = pdf_document_get_xmptag_from_path (xpathCtx, CREATE_DATE);
- /* reads pdf metadata date */
- metadate = pdf_document_get_xmptag_from_path (xpathCtx, META_DATE);
-
- if (modifydate != NULL) {
- /* return buffer */
- datestr = g_strdup_printf ("%s", modifydate);
- g_time_val_from_iso8601 (datestr, &tmp_time);
- result[0] = (GTime)tmp_time.tv_sec;
- g_free (datestr);
- }
-
- if (createdate != NULL) {
- datestr = g_strdup_printf ("%s", createdate);
- g_time_val_from_iso8601 (datestr, &tmp_time);
- result[1] = (GTime)tmp_time.tv_sec;
- g_free (datestr);
- }
-
- if (metadate != NULL) {
- datestr = g_strdup_printf ("%s", metadate);
- g_time_val_from_iso8601 (datestr, &tmp_time);
- result[2] = (GTime)tmp_time.tv_sec;
- g_free (datestr);
- }
-
- /* Cleanup */
- xmlFree (modifydate);
- xmlFree (createdate);
- xmlFree (metadate);
-}
-
static EvDocumentLicense *
pdf_document_get_license_from_metadata (xmlXPathContextPtr xpathCtx)
{
@@ -951,7 +907,11 @@ pdf_document_parse_metadata (const gchar *metadata,
gchar *subject;
gchar *creatortool;
gchar *producer;
- GTime dates[3] = {0};
+ gchar *datestr;
+ gchar *modified_date;
+ gchar *creation_date;
+ gchar *metadata_date;
+ GDateTime *dt = NULL;
doc = xmlParseMemory (metadata, strlen (metadata));
if (doc == NULL)
@@ -963,12 +923,21 @@ pdf_document_parse_metadata (const gchar *metadata,
return; /* invalid xpath context */
}
- pdf_document_get_dates_from_metadata (dates, xpathCtx);
+ /* reads pdf metadata date */
+ metadata_date = (gchar *)pdf_document_get_xmptag_from_path (xpathCtx, META_DATE);
+ if (metadata_date != NULL) {
+ datestr = g_strdup_printf ("%s", metadata_date);
+ dt = g_date_time_new_from_iso8601 (datestr, NULL);
+ g_free (datestr);
+ g_free (metadata_date);
+ }
+
/* From PDF spec, if the PDF modified date is newer than metadata date,
* it indicates that the file was edited by a non-XMP aware software.
* Then, the information dictionary is considered authoritative and the
* XMP metadata should not be displayed. */
- if (dates[2] >= info->modified_date) {
+ if (info->modified_date == NULL || dt == NULL ||
+ ! (g_date_time_compare (dt, info->modified_date) == -1)) {
fmt = pdf_document_get_format_from_metadata (xpathCtx);
if (fmt != NULL) {
@@ -1012,15 +981,32 @@ pdf_document_parse_metadata (const gchar *metadata,
info->producer = producer;
}
- if (dates[0] != 0)
- info->modified_date = dates[0];
+ /* reads modify date */
+ modified_date = (gchar *)pdf_document_get_xmptag_from_path (xpathCtx, MOD_DATE);
+ if (modified_date != NULL) {
+ g_clear_pointer (&info->modified_date, g_date_time_unref);
+
+ datestr = g_strdup_printf ("%s", modified_date);
+ info->modified_date = g_date_time_new_from_iso8601 (datestr, NULL);
+ g_free (datestr);
+ g_free (modified_date);
+ }
+
+ /* reads pdf create date */
+ creation_date = (gchar *)pdf_document_get_xmptag_from_path (xpathCtx, CREATE_DATE);
+ if (creation_date != NULL) {
+ g_clear_pointer (&info->creation_date, g_date_time_unref);
- if (dates[1] != 0)
- info->creation_date = dates[1];
+ datestr = g_strdup_printf ("%s", creation_date);
+ info->creation_date = g_date_time_new_from_iso8601 (datestr, NULL);
+ g_free (datestr);
+ g_free (creation_date);
+ }
}
info->license = pdf_document_get_license_from_metadata (xpathCtx);
+ g_clear_pointer (&dt, g_date_time_unref);
xmlXPathFreeContext (xpathCtx);
xmlFreeDoc (doc);
}
@@ -1071,8 +1057,8 @@ pdf_document_get_info (EvDocument *document)
"permissions", &permissions,
"creator", &(info->creator),
"producer", &(info->producer),
- "creation-date", &(info->creation_date),
- "mod-date", &(info->modified_date),
+ "creation-datetime", &(info->creation_date),
+ "mod-datetime", &(info->modified_date),
"linearized", &linearized,
"metadata", &metadata,
NULL);
diff --git a/libdocument/ev-document-info.h b/libdocument/ev-document-info.h
index ebeeea36..d05e48cc 100644
--- a/libdocument/ev-document-info.h
+++ b/libdocument/ev-document-info.h
@@ -124,8 +124,8 @@ struct _EvDocumentInfo
char *producer;
char *linearized;
char *security;
- GTime creation_date;
- GTime modified_date;
+ GDateTime *creation_date;
+ GDateTime *modified_date;
EvDocumentLayout layout;
EvDocumentMode mode;
guint ui_hints;
diff --git a/libdocument/ev-document.c b/libdocument/ev-document.c
index 1cd6af5c..3751f28a 100644
--- a/libdocument/ev-document.c
+++ b/libdocument/ev-document.c
@@ -1187,8 +1187,8 @@ ev_document_info_copy (EvDocumentInfo *info)
copy->producer = g_strdup (info->producer);
copy->linearized = g_strdup (info->linearized);
- copy->creation_date = info->creation_date;
- copy->modified_date = info->modified_date;
+ copy->creation_date = g_date_time_add (info->creation_date, 0);
+ copy->modified_date = g_date_time_add (info->modified_date, 0);
copy->layout = info->layout;
copy->mode = info->mode;
copy->ui_hints = info->ui_hints;
@@ -1216,6 +1216,8 @@ ev_document_info_free (EvDocumentInfo *info)
g_free (info->producer);
g_free (info->linearized);
g_free (info->security);
+ g_clear_pointer (&(info->creation_date), g_date_time_unref);
+ g_clear_pointer (&(info->modified_date), g_date_time_unref);
ev_document_license_free (info->license);
g_free (info);
diff --git a/properties/ev-properties-view.c b/properties/ev-properties-view.c
index 3e34e23b..e964af3c 100644
--- a/properties/ev-properties-view.c
+++ b/properties/ev-properties-view.c
@@ -392,19 +392,19 @@ ev_properties_view_set_info (EvPropertiesView *properties, const EvDocumentInfo
set_property (properties, GTK_GRID (grid), CREATOR_PROPERTY, info->creator, &row);
}
if (info->fields_mask & EV_DOCUMENT_INFO_CREATION_DATE) {
- if (info->creation_date == -1) {
+ if (info->creation_date == NULL) {
set_property (properties, GTK_GRID (grid), CREATION_DATE_PROPERTY, NULL, &row);
} else {
- text = ev_document_misc_format_date (info->creation_date);
+ text = ev_document_misc_format_datetime (info->creation_date);
set_property (properties, GTK_GRID (grid), CREATION_DATE_PROPERTY, text, &row);
g_free (text);
}
}
if (info->fields_mask & EV_DOCUMENT_INFO_MOD_DATE) {
- if (info->modified_date == -1) {
+ if (info->modified_date == NULL) {
set_property (properties, GTK_GRID (grid), MOD_DATE_PROPERTY, NULL, &row);
} else {
- text = ev_document_misc_format_date (info->modified_date);
+ text = ev_document_misc_format_datetime (info->modified_date);
set_property (properties, GTK_GRID (grid), MOD_DATE_PROPERTY, text, &row);
g_free (text);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]