1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * xlsx-read-docprops.c : import MS Office Open xlsx document properties.
5 * Copyright (C) 2011 Andreas J. Guelzow All Rights Reserved
6 * (aguelzow@pyrshep.ca)
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public
10 * License as published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
26 * DO * NOT * COMPILE * DIRECTLY *
27 * DO * NOT * COMPILE * DIRECTLY *
28 * DO * NOT * COMPILE * DIRECTLY *
30 * included via xlsx-read.c
34 xlsx_read_core_keys (GsfXMLIn
*xin
, G_GNUC_UNUSED GsfXMLBlob
*blob
)
36 XLSXReadState
*state
= (XLSXReadState
*)xin
->user_state
;
37 gchar
**strs
, **orig_strs
;
38 GsfDocPropVector
*keywords
;
39 GValue v
= G_VALUE_INIT
;
42 if (strlen (xin
->content
->str
) == 0)
45 orig_strs
= strs
= g_strsplit (xin
->content
->str
, " ", 0);
46 keywords
= gsf_docprop_vector_new ();
48 while (strs
!= NULL
&& *strs
!= NULL
&& strlen (*strs
) > 0) {
49 g_value_init (&v
, G_TYPE_STRING
);
50 g_value_set_string (&v
, *strs
);
51 gsf_docprop_vector_append (keywords
, &v
);
56 g_strfreev(orig_strs
);
59 GValue
*val
= g_new0 (GValue
, 1);
60 g_value_init (val
, GSF_DOCPROP_VECTOR_TYPE
);
61 g_value_set_object (val
, keywords
);
62 gsf_doc_meta_data_insert (state
->metadata
,
63 g_strdup (xin
->node
->user_data
.v_str
), val
);
65 g_object_unref (keywords
);
67 maybe_update_progress (xin
);
71 xlsx_read_prop_type (GsfXMLIn
*xin
, GType g_type
)
73 XLSXReadState
*state
= (XLSXReadState
*)xin
->user_state
;
74 GValue
*res
= g_new0 (GValue
, 1);
75 if (gsf_xml_gvalue_from_str (res
, g_type
, xin
->content
->str
))
76 gsf_doc_meta_data_insert
78 g_strdup (xin
->node
->user_data
.v_str
), res
);
84 xlsx_read_prop (GsfXMLIn
*xin
, G_GNUC_UNUSED GsfXMLBlob
*blob
)
86 xlsx_read_prop_type (xin
, G_TYPE_STRING
);
89 xlsx_read_prop_dt (GsfXMLIn
*xin
, G_GNUC_UNUSED GsfXMLBlob
*blob
)
91 xlsx_read_prop_type (xin
, GSF_TIMESTAMP_TYPE
);
95 xlsx_read_prop_int (GsfXMLIn
*xin
, G_GNUC_UNUSED GsfXMLBlob
*blob
)
97 xlsx_read_prop_type (xin
, G_TYPE_INT
);
101 xlsx_read_prop_boolean (GsfXMLIn
*xin
, G_GNUC_UNUSED GsfXMLBlob
*blob
)
103 xlsx_read_prop_type (xin
, G_TYPE_BOOLEAN
);
107 xlsx_read_property_begin (GsfXMLIn
*xin
, xmlChar
const **attrs
)
109 XLSXReadState
*state
= (XLSXReadState
*)xin
->user_state
;
110 xmlChar
const *fmt_id
= NULL
, *pid
= NULL
, *name
= NULL
;
112 for (; attrs
!= NULL
&& attrs
[0] && attrs
[1] ; attrs
+= 2)
113 if (0 == strcmp (attrs
[0], "fmtid"))
115 else if (0 == strcmp (attrs
[0], "pid"))
117 else if (0 == strcmp (attrs
[0], "name"))
120 state
->meta_prop_name
= g_strdup (name
);
122 state
->meta_prop_name
= g_strdup_printf ("%s-%s", fmt_id
, pid
);
126 xlsx_read_property_end (GsfXMLIn
*xin
, G_GNUC_UNUSED GsfXMLBlob
*blob
)
128 XLSXReadState
*state
= (XLSXReadState
*)xin
->user_state
;
129 g_free (state
->meta_prop_name
);
130 state
->meta_prop_name
= NULL
;
131 maybe_update_progress (xin
);
135 xlsx_read_custom_property_type (GsfXMLIn
*xin
, GType g_type
)
137 XLSXReadState
*state
= (XLSXReadState
*)xin
->user_state
;
140 if (state
->meta_prop_name
== NULL
) {
141 xlsx_warning (xin
, _("Corrupt file: Second child element in custom property encountered."));
145 res
= g_new0 (GValue
, 1);
146 if (gsf_xml_gvalue_from_str (res
, g_type
, xin
->content
->str
)) {
147 gsf_doc_meta_data_insert
149 state
->meta_prop_name
, res
);
150 state
->meta_prop_name
= NULL
;
154 maybe_update_progress (xin
);
158 xlsx_read_custom_property (GsfXMLIn
*xin
, G_GNUC_UNUSED GsfXMLBlob
*blob
)
160 xlsx_read_custom_property_type (xin
, xin
->node
->user_data
.v_int
);
164 xlsx_read_property_date (GsfXMLIn
*xin
, G_GNUC_UNUSED GsfXMLBlob
*blob
)
166 xlsx_read_custom_property_type (xin
, GSF_TIMESTAMP_TYPE
);
169 static GsfXMLInNode
const xlsx_docprops_custom_dtd
[] = {
170 GSF_XML_IN_NODE_FULL (START
, START
, -1, NULL
, GSF_XML_NO_CONTENT
, FALSE
, TRUE
, NULL
, NULL
, 0),
171 GSF_XML_IN_NODE_FULL (START
, CUSTOM_PROPS
, XL_NS_PROP_CUSTOM
, "Properties", GSF_XML_NO_CONTENT
, FALSE
, TRUE
, NULL
, NULL
, 0),
172 GSF_XML_IN_NODE (CUSTOM_PROPS
, CUSTOM_PROP
, XL_NS_PROP_CUSTOM
, "property", GSF_XML_NO_CONTENT
, &xlsx_read_property_begin
, &xlsx_read_property_end
),
173 GSF_XML_IN_NODE_FULL (CUSTOM_PROP
, CUSTOM_PROP_LPWSTR
, XL_NS_PROP_VT
, "lpwstr", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_custom_property
, G_TYPE_STRING
),
174 GSF_XML_IN_NODE_FULL (CUSTOM_PROP
, CUSTOM_PROP_LPSTR
, XL_NS_PROP_VT
, "lpstr", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_custom_property
, G_TYPE_STRING
),
175 GSF_XML_IN_NODE_FULL (CUSTOM_PROP
, CUSTOM_PROP_I4
, XL_NS_PROP_VT
, "i4", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_custom_property
, G_TYPE_INT
),
176 GSF_XML_IN_NODE_FULL (CUSTOM_PROP
, CUSTOM_PROP_BOOL
, XL_NS_PROP_VT
, "bool", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_custom_property
, G_TYPE_BOOLEAN
),
177 GSF_XML_IN_NODE (CUSTOM_PROP
, CUSTOM_PROP_DATE
, XL_NS_PROP_VT
, "date", GSF_XML_CONTENT
, NULL
, &xlsx_read_property_date
),
181 static GsfXMLInNode
const xlsx_docprops_extended_dtd
[] = {
182 GSF_XML_IN_NODE_FULL (START
, START
, -1, NULL
, GSF_XML_NO_CONTENT
, FALSE
, TRUE
, NULL
, NULL
, 0),
183 GSF_XML_IN_NODE_FULL (START
, X_PROPS
, XL_NS_PROP
, "Properties", GSF_XML_NO_CONTENT
, FALSE
, TRUE
, NULL
, NULL
, 0),
184 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_TEMPLATE
, XL_NS_PROP
, "Template", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_TEMPLATE
),
185 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_MANAGER
, XL_NS_PROP
, "Manager", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_MANAGER
),
186 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_COMPANY
, XL_NS_PROP
, "Company", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_COMPANY
),
187 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_PAGES
, XL_NS_PROP
, "Pages", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_int
, .v_str
= GSF_META_NAME_PAGE_COUNT
),
188 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_WORDS
, XL_NS_PROP
, "Words", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_int
, .v_str
= GSF_META_NAME_WORD_COUNT
),
189 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_CHARACTERS
, XL_NS_PROP
, "Characters", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_int
, .v_str
= GSF_META_NAME_CHARACTER_COUNT
),
190 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_PRESENTATION_FORMAT
, XL_NS_PROP
, "PresentationFormat", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_PRESENTATION_FORMAT
),
191 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_LINES
, XL_NS_PROP
, "Lines", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_int
, .v_str
= GSF_META_NAME_LINE_COUNT
),
192 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_PARAGRAPHS
, XL_NS_PROP
, "Paragraphs", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_int
, .v_str
= GSF_META_NAME_PARAGRAPH_COUNT
),
193 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_SLIDES
, XL_NS_PROP
, "Slides", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_int
, .v_str
= GSF_META_NAME_SLIDE_COUNT
),
194 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_NOTES
, XL_NS_PROP
, "Notes", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_NOTE_COUNT
),
195 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_TOTAL_TIME
, XL_NS_PROP
, "TotalTime", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_int
, .v_str
= GSF_META_NAME_EDITING_DURATION
),
196 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_HIDDEN_SLIDES
, XL_NS_PROP
, "HiddenSlides", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_int
, .v_str
= GSF_META_NAME_HIDDEN_SLIDE_COUNT
),
197 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_MMCLIPS
, XL_NS_PROP
, "MMClips", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_int
, .v_str
= GSF_META_NAME_MM_CLIP_COUNT
),
198 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_SCALE_CROP
, XL_NS_PROP
, "ScaleCrop", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_boolean
, .v_str
= GSF_META_NAME_SCALE
),
199 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_LINKS_UP_TO_DATE
, XL_NS_PROP
, "LinksUpToDate", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_boolean
, .v_str
= GSF_META_NAME_LINKS_DIRTY
),
200 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_CHARACTERS_WITH_SPACES
, XL_NS_PROP
, "CharactersWithSpaces", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_int
, .v_str
= GSF_META_NAME_BYTE_COUNT
),
201 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_SHARED_DOC
, XL_NS_PROP
, "SharedDoc", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_boolean
, .v_str
= "xlsx:SharedDoc"),
202 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_HYPERLINK_BASE
, XL_NS_PROP
, "HyperlinkBase", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= "xlsx:HyperlinkBase"),
203 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_HYPERLINKS_CHANGED
, XL_NS_PROP
, "HyperlinksChanged", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_boolean
, .v_str
= "xlsx:HyperlinksChanged"),
204 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_DOC_SECURITY
, XL_NS_PROP
, "DocSecurity", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_int
, .v_str
= GSF_META_NAME_SECURITY
),
205 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_DIG_SIG
, XL_NS_PROP
, "DigSig", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, NULL
, .v_str
= ""),
206 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_HEADING_PAIRS
, XL_NS_PROP
, "HeadingPairs", GSF_XML_NO_CONTENT
, FALSE
, FALSE
, NULL
, NULL
, .v_str
= ""),
207 GSF_XML_IN_NODE (X_PROP_HEADING_PAIRS
, X_PROP_SUB_VECTOR
, XL_NS_PROP_VT
, "vector", GSF_XML_NO_CONTENT
, NULL
, NULL
),
208 GSF_XML_IN_NODE (X_PROP_SUB_VECTOR
, X_PROP_SUB_LPWSTR
, XL_NS_PROP_VT
, "lpwstr", GSF_XML_NO_CONTENT
, NULL
, NULL
),
209 GSF_XML_IN_NODE (X_PROP_SUB_VECTOR
, X_PROP_SUB_LPSTR
, XL_NS_PROP_VT
, "lpstr", GSF_XML_NO_CONTENT
, NULL
, NULL
),
210 GSF_XML_IN_NODE (X_PROP_SUB_VECTOR
, X_PROP_SUB_I4
, XL_NS_PROP_VT
, "i4", GSF_XML_NO_CONTENT
, NULL
, NULL
),
211 GSF_XML_IN_NODE (X_PROP_SUB_VECTOR
, X_PROP_SUB_VARIANT
, XL_NS_PROP_VT
, "variant", GSF_XML_NO_CONTENT
, NULL
, NULL
),
212 GSF_XML_IN_NODE (X_PROP_SUB_VARIANT
, X_PROP_SUB_LPWSTR
, XL_NS_PROP_VT
, "lpwstr", GSF_XML_2ND
, NULL
, NULL
),
213 GSF_XML_IN_NODE (X_PROP_SUB_VARIANT
, X_PROP_SUB_LPSTR
, XL_NS_PROP_VT
, "lpstr", GSF_XML_2ND
, NULL
, NULL
),
214 GSF_XML_IN_NODE (X_PROP_SUB_VARIANT
, X_PROP_SUB_I4
, XL_NS_PROP_VT
, "i4", GSF_XML_2ND
, NULL
, NULL
),
215 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_HLINKS
, XL_NS_PROP
, "HLinks", GSF_XML_NO_CONTENT
, FALSE
, FALSE
, NULL
, NULL
, .v_str
= ""),
216 GSF_XML_IN_NODE (X_PROP_HLINKS
, X_PROP_SUB_VECTOR
, XL_NS_PROP_VT
, "vector", GSF_XML_2ND
, NULL
, NULL
),
217 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_TITLES_OF_PARTS
, XL_NS_PROP
, "TitlesOfParts", GSF_XML_NO_CONTENT
, FALSE
, FALSE
, NULL
, NULL
, .v_str
= ""),
218 GSF_XML_IN_NODE (X_PROP_TITLES_OF_PARTS
, X_PROP_SUB_VECTOR
, XL_NS_PROP_VT
, "vector", GSF_XML_2ND
, NULL
, NULL
),
219 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_APPLICATION
, XL_NS_PROP
, "Application", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, NULL
, .v_str
= ""),
220 GSF_XML_IN_NODE_FULL (X_PROPS
, X_PROP_APP_VERSION
, XL_NS_PROP
, "AppVersion", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, NULL
, .v_str
= ""),
224 static GsfXMLInNode
const xlsx_docprops_core_dtd
[] = {
225 GSF_XML_IN_NODE_FULL (START
, START
, -1, NULL
, GSF_XML_NO_CONTENT
, FALSE
, TRUE
, NULL
, NULL
, 0),
226 GSF_XML_IN_NODE_FULL (START
, CORE_PROPS
, XL_NS_PROP_CP
, "coreProperties", GSF_XML_NO_CONTENT
, FALSE
, TRUE
, NULL
, NULL
, 0),
227 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_CATEGORY
, XL_NS_PROP_CP
, "category", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_CATEGORY
),
228 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_CONTENT_STATUS
, XL_NS_PROP_CP
, "contentStatus", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= "cp:contentStatus"),
229 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_CONTENT_TYPE
, XL_NS_PROP_CP
, "contentType", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= "cp:contentType"),
230 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_KEYWORDS
, XL_NS_PROP_CP
, "keywords", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_core_keys
, .v_str
= GSF_META_NAME_KEYWORDS
),
231 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_LAST_NODIFIED_BY
, XL_NS_PROP_CP
, "lastModifiedBy", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_CREATOR
),
232 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_LAST_PRINTED
, XL_NS_PROP_CP
, "lastPrinted", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_dt
, .v_str
= GSF_META_NAME_PRINT_DATE
),
233 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_REVISION
, XL_NS_PROP_CP
, "revision", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_REVISION_COUNT
),
234 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_VERSION
, XL_NS_PROP_CP
, "version", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= "cp:version"),
235 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_CREATOR
, XL_NS_PROP_DC
, "creator", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_INITIAL_CREATOR
),
236 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_DESCRIPTION
, XL_NS_PROP_DC
, "description", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_DESCRIPTION
),
237 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_IDENTIFIER
, XL_NS_PROP_DC
, "identifier", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= "dc:identifier"),
238 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_LANGUAGE
, XL_NS_PROP_DC
, "language", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_LANGUAGE
),
239 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_SUBJECT
, XL_NS_PROP_DC
, "subject", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_SUBJECT
),
240 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_TITLE
, XL_NS_PROP_DC
, "title", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop
, .v_str
= GSF_META_NAME_TITLE
),
241 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_CREATED
, XL_NS_PROP_DCTERMS
, "created", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_dt
, .v_str
= GSF_META_NAME_DATE_CREATED
),
242 GSF_XML_IN_NODE_FULL (CORE_PROPS
, PROP_MODIFIED
, XL_NS_PROP_DCTERMS
, "modified", GSF_XML_CONTENT
, FALSE
, FALSE
, NULL
, &xlsx_read_prop_dt
, .v_str
= GSF_META_NAME_DATE_MODIFIED
),
247 xlsx_read_docprops_core (XLSXReadState
*state
)
251 in
= gsf_open_pkg_open_rel_by_type
252 (GSF_INPUT (state
->zip
),
253 "http://schemas.openxmlformats.org/package/2006/relationships/metadata/"
254 "core-properties", NULL
);
256 if (in
== NULL
) return;
258 start_update_progress (state
, in
, _("Reading core properties..."), 0.9, 0.94);
259 xlsx_parse_stream (state
, in
, xlsx_docprops_core_dtd
);
260 end_update_progress (state
);
264 xlsx_read_docprops_extended (XLSXReadState
*state
)
268 in
= gsf_open_pkg_open_rel_by_type
269 (GSF_INPUT (state
->zip
),
270 "http://schemas.openxmlformats.org/officeDocument/2006/relationships/"
271 "extended-properties", NULL
);
273 if (in
== NULL
) return;
275 start_update_progress (state
, in
, _("Reading extended properties..."), 0.94, 0.97);
276 xlsx_parse_stream (state
, in
, xlsx_docprops_extended_dtd
);
277 end_update_progress (state
);
281 xlsx_read_docprops_custom (XLSXReadState
*state
)
285 in
= gsf_open_pkg_open_rel_by_type
286 (GSF_INPUT (state
->zip
),
287 "http://schemas.openxmlformats.org/officeDocument/2006/relationships/"
288 "custom-properties", NULL
);
290 if (in
== NULL
) return;
292 start_update_progress (state
, in
, _("Reading custom properties..."), 0.97, 1.);
293 xlsx_parse_stream (state
, in
, xlsx_docprops_custom_dtd
);
294 end_update_progress (state
);
298 xlsx_read_docprops (XLSXReadState
*state
)
300 state
->metadata
= gsf_doc_meta_data_new ();
302 xlsx_read_docprops_core (state
);
303 xlsx_read_docprops_extended (state
);
304 xlsx_read_docprops_custom (state
);
306 go_doc_set_meta_data (GO_DOC (state
->wb
), state
->metadata
);
307 g_object_unref (state
->metadata
);
308 state
->metadata
= NULL
;