Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "docprophandler.hxx"
21 :
22 : #include <com/sun/star/beans/PropertyAttribute.hpp>
23 : #include <com/sun/star/beans/PropertyExistException.hpp>
24 : #include <com/sun/star/lang/Locale.hpp>
25 :
26 : #include <osl/time.h>
27 : #include <i18nlangtag/languagetag.hxx>
28 :
29 : #include <vector>
30 : #include <boost/algorithm/string.hpp>
31 :
32 : #include "oox/helper/attributelist.hxx"
33 :
34 : using namespace ::com::sun::star;
35 :
36 : namespace oox {
37 : namespace docprop {
38 :
39 3020 : OOXMLDocPropHandler::OOXMLDocPropHandler( const uno::Reference< uno::XComponentContext >& xContext,
40 : const uno::Reference< document::XDocumentProperties > xDocProp )
41 : : m_xContext( xContext )
42 : , m_xDocProp( xDocProp )
43 : , m_nState( 0 )
44 : , m_nBlock( 0 )
45 : , m_nType( 0 )
46 3020 : , m_nInBlock( 0 )
47 : {
48 3020 : if ( !xContext.is() || !xDocProp.is() )
49 0 : throw uno::RuntimeException();
50 3020 : }
51 :
52 6040 : OOXMLDocPropHandler::~OOXMLDocPropHandler()
53 : {
54 6040 : }
55 :
56 7060 : void OOXMLDocPropHandler::InitNew()
57 : {
58 7060 : m_nState = 0;
59 7060 : m_nBlock = 0;
60 7060 : m_aCustomPropertyName = "";
61 7060 : m_nType = 0;
62 7060 : m_nInBlock = 0;
63 7060 : }
64 :
65 17840 : void OOXMLDocPropHandler::AddCustomProperty( const uno::Any& aAny )
66 : {
67 17840 : if ( !m_aCustomPropertyName.isEmpty() )
68 : {
69 : const uno::Reference< beans::XPropertyContainer > xUserProps =
70 17840 : m_xDocProp->getUserDefinedProperties();
71 17840 : if ( !xUserProps.is() )
72 0 : throw uno::RuntimeException();
73 :
74 : try
75 : {
76 17840 : xUserProps->addProperty( m_aCustomPropertyName,
77 17840 : beans::PropertyAttribute::REMOVABLE, aAny );
78 : }
79 334 : catch( beans::PropertyExistException& )
80 : {
81 : // conflicts with core and extended properties are possible
82 : }
83 0 : catch( uno::Exception& )
84 : {
85 : OSL_FAIL( "Can not add custom property!" );
86 17840 : }
87 : }
88 17840 : }
89 :
90 6238 : util::DateTime OOXMLDocPropHandler::GetDateTimeFromW3CDTF( const OUString& aChars )
91 : {
92 6238 : oslDateTime aOslDTime = { 0, 0, 0, 0, 0, 0, 0, 0 };
93 6238 : const sal_Int32 nLen = aChars.getLength();
94 6238 : if ( nLen >= 4 )
95 : {
96 6238 : aOslDTime.Year = (sal_Int16)aChars.copy( 0, 4 ).toInt32();
97 :
98 6238 : if ( nLen >= 7 && aChars[4] == (sal_Unicode)'-' )
99 : {
100 6238 : aOslDTime.Month = (sal_uInt16)aChars.copy( 5, 2 ).toInt32();
101 :
102 6238 : if ( nLen >= 10 && aChars[7] == (sal_Unicode)'-' )
103 : {
104 6238 : aOslDTime.Day = (sal_uInt16)aChars.copy( 8, 2 ).toInt32();
105 :
106 6238 : if ( nLen >= 16 && aChars[10] == (sal_Unicode)'T' && aChars[13] == (sal_Unicode)':' )
107 : {
108 6238 : aOslDTime.Hours = (sal_uInt16)aChars.copy( 11, 2 ).toInt32();
109 6238 : aOslDTime.Minutes = (sal_uInt16)aChars.copy( 14, 2 ).toInt32();
110 :
111 6238 : sal_Int32 nOptTime = 0;
112 6238 : if ( nLen >= 19 && aChars[16] == (sal_Unicode)':' )
113 : {
114 6238 : aOslDTime.Seconds = (sal_uInt16)aChars.copy( 17, 2 ).toInt32();
115 6238 : nOptTime += 3;
116 6238 : if ( nLen >= 20 && aChars[19] == (sal_Unicode)'.' )
117 : {
118 162 : nOptTime += 1;
119 162 : sal_Int32 digitPos = 20;
120 688 : while (nLen > digitPos && digitPos < 29)
121 : {
122 526 : sal_Unicode c = aChars[digitPos];
123 526 : if ( c < '0' || c > '9')
124 : break;
125 364 : aOslDTime.NanoSeconds *= 10;
126 364 : aOslDTime.NanoSeconds += c - '0';
127 364 : ++digitPos;
128 : }
129 162 : if ( digitPos < 29 )
130 : {
131 : // read less digits than 9
132 : // add correct exponent of 10
133 162 : nOptTime += digitPos - 20;
134 1256 : for(; digitPos<29; ++digitPos)
135 : {
136 1094 : aOslDTime.NanoSeconds *= 10;
137 : }
138 : }
139 : else
140 : {
141 : //skip digits with more precision than we can handle
142 0 : while(nLen > digitPos)
143 : {
144 0 : sal_Unicode c = aChars[digitPos];
145 0 : if ( c < '0' || c > '9')
146 : break;
147 0 : ++digitPos;
148 : }
149 0 : nOptTime += digitPos - 20;
150 : }
151 : }
152 : }
153 :
154 6238 : sal_Int32 nModif = 0;
155 6238 : if ( nLen >= 16 + nOptTime + 6 )
156 : {
157 0 : if ( ( aChars[16 + nOptTime] == (sal_Unicode)'+' || aChars[16 + nOptTime] == (sal_Unicode)'-' )
158 0 : && aChars[16 + nOptTime + 3] == (sal_Unicode)':' )
159 : {
160 0 : nModif = aChars.copy( 16 + nOptTime + 1, 2 ).toInt32() * 3600;
161 0 : nModif += aChars.copy( 16 + nOptTime + 4, 2 ).toInt32() * 60;
162 0 : if ( aChars[16 + nOptTime] == (sal_Unicode)'-' )
163 0 : nModif *= -1;
164 : }
165 : }
166 :
167 6238 : if ( nModif )
168 : {
169 : // convert to UTC time
170 : TimeValue aTmp;
171 0 : if ( osl_getTimeValueFromDateTime( &aOslDTime, &aTmp ) )
172 : {
173 0 : aTmp.Seconds -= nModif;
174 0 : osl_getDateTimeFromTimeValue( &aTmp, &aOslDTime );
175 : }
176 : }
177 : }
178 : }
179 : }
180 : }
181 :
182 : return util::DateTime( aOslDTime.NanoSeconds, aOslDTime.Seconds,
183 : aOslDTime.Minutes, aOslDTime.Hours,
184 6238 : aOslDTime.Day, aOslDTime.Month, aOslDTime.Year, false);
185 : }
186 :
187 22 : uno::Sequence< OUString > OOXMLDocPropHandler::GetKeywordsSet( const OUString& aChars )
188 : {
189 22 : if ( !aChars.isEmpty() )
190 : {
191 22 : std::string aUtf8Chars = OUStringToOString( aChars, RTL_TEXTENCODING_UTF8 ).getStr();
192 22 : std::vector<std::string> aUtf8Result;
193 22 : boost::split( aUtf8Result, aUtf8Chars, boost::is_any_of(" ,;:\t"), boost::token_compress_on );
194 :
195 22 : if (!aUtf8Result.empty())
196 : {
197 22 : uno::Sequence< OUString > aResult( aUtf8Result.size() );
198 22 : OUString* pResultValues = aResult.getArray();
199 240 : for ( std::vector< std::string >::const_iterator i = aUtf8Result.begin();
200 160 : i != aUtf8Result.end(); ++i, ++pResultValues )
201 58 : *pResultValues = OUString( i->c_str(), static_cast< sal_Int32 >( i->size() ),RTL_TEXTENCODING_UTF8 );
202 :
203 22 : return aResult;
204 0 : }
205 : }
206 0 : return uno::Sequence< OUString >();
207 : }
208 :
209 8058 : void OOXMLDocPropHandler::UpdateDocStatistic( const OUString& aChars )
210 : {
211 8058 : uno::Sequence< beans::NamedValue > aSet = m_xDocProp->getDocumentStatistics();
212 16116 : OUString aName;
213 :
214 8058 : switch( m_nBlock )
215 : {
216 : case EXTPR_TOKEN( Characters ):
217 1774 : aName = "CharacterCount";
218 1774 : break;
219 :
220 : case EXTPR_TOKEN( Pages ):
221 1774 : aName = "PageCount";
222 1774 : break;
223 :
224 : case EXTPR_TOKEN( Words ):
225 1844 : aName = "WordCount";
226 1844 : break;
227 :
228 : case EXTPR_TOKEN( Paragraphs ):
229 2666 : aName = "ParagraphCount";
230 2666 : break;
231 :
232 : default:
233 : OSL_FAIL( "Unexpected statistic!" );
234 0 : break;
235 : }
236 :
237 8058 : if ( !aName.isEmpty() )
238 : {
239 8058 : bool bFound = false;
240 8058 : sal_Int32 nLen = aSet.getLength();
241 18868 : for ( sal_Int32 nInd = 0; nInd < nLen; nInd++ )
242 10828 : if ( aSet[nInd].Name.equals( aName ) )
243 : {
244 18 : aSet[nInd].Value = uno::makeAny( aChars.toInt32() );
245 18 : bFound = true;
246 18 : break;
247 : }
248 :
249 8058 : if ( !bFound )
250 : {
251 8040 : aSet.realloc( nLen + 1 );
252 8040 : aSet[nLen].Name = aName;
253 8040 : aSet[nLen].Value = uno::makeAny( aChars.toInt32() );
254 : }
255 :
256 8058 : m_xDocProp->setDocumentStatistics( aSet );
257 8058 : }
258 8058 : }
259 :
260 : // com.sun.star.xml.sax.XFastDocumentHandler
261 :
262 7060 : void SAL_CALL OOXMLDocPropHandler::startDocument()
263 : throw (xml::sax::SAXException, uno::RuntimeException, std::exception)
264 : {
265 7060 : }
266 :
267 7060 : void SAL_CALL OOXMLDocPropHandler::endDocument()
268 : throw (xml::sax::SAXException, uno::RuntimeException, std::exception)
269 : {
270 7060 : InitNew();
271 7060 : }
272 :
273 7060 : void SAL_CALL OOXMLDocPropHandler::setDocumentLocator( const uno::Reference< xml::sax::XLocator >& )
274 : throw (xml::sax::SAXException, uno::RuntimeException, std::exception)
275 : {
276 7060 : }
277 :
278 : // com.sun.star.xml.sax.XFastContextHandler
279 :
280 122466 : void SAL_CALL OOXMLDocPropHandler::startFastElement( ::sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttribs )
281 : throw (xml::sax::SAXException, uno::RuntimeException, std::exception)
282 : {
283 122466 : if ( !m_nInBlock && !m_nState )
284 : {
285 14120 : if ( nElement == COREPR_TOKEN( coreProperties )
286 4040 : || nElement == EXTPR_TOKEN( Properties )
287 1030 : || nElement == CUSTPR_TOKEN( Properties ) )
288 : {
289 7060 : m_nState = nElement;
290 : }
291 : else
292 : {
293 : OSL_FAIL( "Unexpected file format!" );
294 : }
295 : }
296 115406 : else if ( m_nState && m_nInBlock == 1 ) // that tag should contain the property name
297 : {
298 : // Currently the attributes are ignored for the core properties since the only
299 : // known attribute is xsi:type that can only be used with dcterms:created and
300 : // dcterms:modified, and this element is allowed currently to have only one value dcterms:W3CDTF
301 61160 : m_nBlock = nElement;
302 :
303 122320 : if ( xAttribs.is() && xAttribs->hasAttribute( XML_name ) )
304 5422 : m_aCustomPropertyName = xAttribs->getValue( XML_name );
305 : }
306 54246 : else if ( m_nState && m_nInBlock && m_nInBlock == 2 && getNamespace( nElement ) == NMSP_officeDocPropsVT )
307 : {
308 7514 : m_nType = nElement;
309 : }
310 : else
311 : {
312 : OSL_FAIL( "For now unexpected tags are ignored!" );
313 : }
314 :
315 122466 : if ( m_nInBlock == SAL_MAX_INT32 )
316 0 : throw uno::RuntimeException();
317 :
318 122466 : m_nInBlock++;
319 122466 : }
320 :
321 0 : void SAL_CALL OOXMLDocPropHandler::startUnknownElement( const OUString& aNamespace, const OUString& aName, const uno::Reference< xml::sax::XFastAttributeList >& )
322 : throw (xml::sax::SAXException, uno::RuntimeException, std::exception)
323 : {
324 : SAL_WARN("oox", "Unknown element " << aNamespace << ":" << aName);
325 :
326 0 : if ( m_nInBlock == SAL_MAX_INT32 )
327 0 : throw uno::RuntimeException();
328 :
329 0 : m_nInBlock++;
330 0 : }
331 :
332 122466 : void SAL_CALL OOXMLDocPropHandler::endFastElement( ::sal_Int32 )
333 : throw (xml::sax::SAXException, uno::RuntimeException, std::exception)
334 : {
335 122466 : if ( m_nInBlock )
336 : {
337 122466 : m_nInBlock--;
338 :
339 122466 : if ( !m_nInBlock )
340 7060 : m_nState = 0;
341 115406 : else if ( m_nInBlock == 1 )
342 : {
343 61160 : m_nBlock = 0;
344 61160 : m_aCustomPropertyName = "";
345 : }
346 54246 : else if ( m_nInBlock == 2 )
347 7514 : m_nType = 0;
348 : }
349 122466 : }
350 :
351 0 : void SAL_CALL OOXMLDocPropHandler::endUnknownElement( const OUString&, const OUString& )
352 : throw (xml::sax::SAXException, uno::RuntimeException, std::exception)
353 : {
354 0 : if ( m_nInBlock )
355 0 : m_nInBlock--;
356 0 : }
357 :
358 122466 : uno::Reference< xml::sax::XFastContextHandler > SAL_CALL OOXMLDocPropHandler::createFastChildContext( ::sal_Int32, const uno::Reference< xml::sax::XFastAttributeList >& )
359 : throw (xml::sax::SAXException, uno::RuntimeException, std::exception)
360 : {
361 : // Should the arguments be parsed?
362 122466 : return uno::Reference< xml::sax::XFastContextHandler >( static_cast< xml::sax::XFastContextHandler* >( this ) );
363 : }
364 :
365 0 : uno::Reference< xml::sax::XFastContextHandler > SAL_CALL OOXMLDocPropHandler::createUnknownChildContext( const OUString&, const OUString&, const uno::Reference< xml::sax::XFastAttributeList >& )
366 : throw (xml::sax::SAXException, uno::RuntimeException, std::exception)
367 : {
368 0 : return uno::Reference< xml::sax::XFastContextHandler >( static_cast< xml::sax::XFastContextHandler* >( this ) );
369 : }
370 :
371 75916 : void SAL_CALL OOXMLDocPropHandler::characters( const OUString& aChars )
372 : throw (xml::sax::SAXException, uno::RuntimeException, std::exception)
373 : {
374 : try
375 : {
376 75916 : if ( (m_nInBlock == 2) || ((m_nInBlock == 3) && m_nType) )
377 : {
378 53876 : if ( m_nState == COREPR_TOKEN( coreProperties ) )
379 : {
380 15766 : switch( m_nBlock )
381 : {
382 : case COREPR_TOKEN( category ):
383 0 : m_aCustomPropertyName = "category";
384 0 : AddCustomProperty( uno::makeAny( aChars ) ); // the property has string type
385 0 : break;
386 :
387 : case COREPR_TOKEN( contentStatus ):
388 0 : m_aCustomPropertyName = "contentStatus";
389 0 : AddCustomProperty( uno::makeAny( aChars ) ); // the property has string type
390 0 : break;
391 :
392 : case COREPR_TOKEN( contentType ):
393 4 : m_aCustomPropertyName = "contentType";
394 4 : AddCustomProperty( uno::makeAny( aChars ) ); // the property has string type
395 4 : break;
396 :
397 : case COREPR_TOKEN( identifier ):
398 0 : m_aCustomPropertyName = "identifier";
399 0 : AddCustomProperty( uno::makeAny( aChars ) ); // the property has string type
400 0 : break;
401 :
402 : case COREPR_TOKEN( version ):
403 0 : m_aCustomPropertyName = "version";
404 0 : AddCustomProperty( uno::makeAny( aChars ) ); // the property has string type
405 0 : break;
406 :
407 : case DCT_TOKEN( created ):
408 2992 : if ( aChars.getLength() >= 4 )
409 2992 : m_xDocProp->setCreationDate( GetDateTimeFromW3CDTF( aChars ) );
410 2992 : break;
411 :
412 : case DC_TOKEN( creator ):
413 2464 : m_xDocProp->setAuthor( aChars );
414 2464 : break;
415 :
416 : case DC_TOKEN( description ):
417 10 : m_xDocProp->setDescription( aChars );
418 10 : break;
419 :
420 : case COREPR_TOKEN( keywords ):
421 22 : m_xDocProp->setKeywords( GetKeywordsSet( aChars ) );
422 22 : break;
423 :
424 : case DC_TOKEN( language ):
425 1018 : if ( aChars.getLength() >= 2 )
426 1018 : m_xDocProp->setLanguage( LanguageTag::convertToLocale( aChars) );
427 1018 : break;
428 :
429 : case COREPR_TOKEN( lastModifiedBy ):
430 2532 : m_xDocProp->setModifiedBy( aChars );
431 2532 : break;
432 :
433 : case COREPR_TOKEN( lastPrinted ):
434 386 : if ( aChars.getLength() >= 4 )
435 386 : m_xDocProp->setPrintDate( GetDateTimeFromW3CDTF( aChars ) );
436 386 : break;
437 :
438 : case DCT_TOKEN( modified ):
439 2846 : if ( aChars.getLength() >= 4 )
440 2846 : m_xDocProp->setModificationDate( GetDateTimeFromW3CDTF( aChars ) );
441 2846 : break;
442 :
443 : case COREPR_TOKEN( revision ):
444 : try
445 : {
446 2940 : m_xDocProp->setEditingCycles(
447 2940 : static_cast<sal_Int16>(aChars.toInt32()) );
448 : }
449 0 : catch (lang::IllegalArgumentException &)
450 : {
451 : // ignore
452 : }
453 2940 : break;
454 :
455 : case DC_TOKEN( subject ):
456 106 : m_xDocProp->setSubject( m_xDocProp->getSubject() + aChars );
457 106 : break;
458 :
459 : case DC_TOKEN( title ):
460 446 : m_xDocProp->setTitle( m_xDocProp->getTitle() + aChars );
461 446 : break;
462 :
463 : default:
464 : OSL_FAIL( "Unexpected core property!" );
465 : }
466 : }
467 38110 : else if ( m_nState == EXTPR_TOKEN( Properties ) )
468 : {
469 32600 : switch( m_nBlock )
470 : {
471 : case EXTPR_TOKEN( Application ):
472 2920 : m_xDocProp->setGenerator( aChars );
473 2920 : break;
474 :
475 : case EXTPR_TOKEN( Template ):
476 2604 : m_xDocProp->setTemplateName( aChars );
477 2604 : break;
478 :
479 : case EXTPR_TOKEN( TotalTime ):
480 : try
481 : {
482 2940 : m_xDocProp->setEditingDuration( aChars.toInt32() );
483 : }
484 0 : catch (lang::IllegalArgumentException &)
485 : {
486 : // ignore
487 : }
488 2940 : break;
489 :
490 : case EXTPR_TOKEN( Characters ):
491 : case EXTPR_TOKEN( Pages ):
492 : case EXTPR_TOKEN( Words ):
493 : case EXTPR_TOKEN( Paragraphs ):
494 8058 : UpdateDocStatistic( aChars );
495 8058 : break;
496 :
497 : case EXTPR_TOKEN( HyperlinksChanged ):
498 1912 : m_aCustomPropertyName = "HyperlinksChanged";
499 1912 : AddCustomProperty( uno::makeAny( aChars.toBoolean() ) ); // the property has boolean type
500 1912 : break;
501 :
502 : case EXTPR_TOKEN( LinksUpToDate ):
503 1912 : m_aCustomPropertyName = "LinksUpToDate";
504 1912 : AddCustomProperty( uno::makeAny( aChars.toBoolean() ) ); // the property has boolean type
505 1912 : break;
506 :
507 : case EXTPR_TOKEN( ScaleCrop ):
508 1912 : m_aCustomPropertyName = "ScaleCrop";
509 1912 : AddCustomProperty( uno::makeAny( aChars.toBoolean() ) ); // the property has boolean type
510 1912 : break;
511 :
512 : case EXTPR_TOKEN( SharedDoc ):
513 1912 : m_aCustomPropertyName = "ShareDoc";
514 1912 : AddCustomProperty( uno::makeAny( aChars.toBoolean() ) ); // the property has boolean type
515 1912 : break;
516 :
517 : case EXTPR_TOKEN( DocSecurity ):
518 1844 : m_aCustomPropertyName = "DocSecurity";
519 1844 : AddCustomProperty( uno::makeAny( aChars.toInt32() ) ); // the property has sal_Int32 type
520 1844 : break;
521 :
522 : case EXTPR_TOKEN( HiddenSlides ):
523 70 : m_aCustomPropertyName = "HiddenSlides";
524 70 : AddCustomProperty( uno::makeAny( aChars.toInt32() ) ); // the property has sal_Int32 type
525 70 : break;
526 :
527 : case EXTPR_TOKEN( MMClips ):
528 70 : m_aCustomPropertyName = "MMClips";
529 70 : AddCustomProperty( uno::makeAny( aChars.toInt32() ) ); // the property has sal_Int32 type
530 70 : break;
531 :
532 : case EXTPR_TOKEN( Notes ):
533 70 : m_aCustomPropertyName = "Notes";
534 70 : AddCustomProperty( uno::makeAny( aChars.toInt32() ) ); // the property has sal_Int32 type
535 70 : break;
536 :
537 : case EXTPR_TOKEN( Slides ):
538 70 : m_aCustomPropertyName = "Slides";
539 70 : AddCustomProperty( uno::makeAny( aChars.toInt32() ) ); // the property has sal_Int32 type
540 70 : break;
541 :
542 : case EXTPR_TOKEN( AppVersion ):
543 1912 : m_aCustomPropertyName = "AppVersion";
544 1912 : AddCustomProperty( uno::makeAny( aChars ) ); // the property has string type
545 1912 : break;
546 :
547 : case EXTPR_TOKEN( Company ):
548 620 : m_aCustomPropertyName = "Company";
549 620 : AddCustomProperty( uno::makeAny( aChars ) ); // the property has string type
550 620 : break;
551 :
552 : case EXTPR_TOKEN( HyperlinkBase ):
553 0 : m_aCustomPropertyName = "HyperlinkBase";
554 0 : AddCustomProperty( uno::makeAny( aChars ) ); // the property has string type
555 0 : break;
556 :
557 : case EXTPR_TOKEN( Manager ):
558 0 : m_aCustomPropertyName = "Manager";
559 0 : AddCustomProperty( uno::makeAny( aChars ) ); // the property has string type
560 0 : break;
561 :
562 : case EXTPR_TOKEN( PresentationFormat ):
563 70 : m_aCustomPropertyName = "PresentationFormat";
564 70 : AddCustomProperty( uno::makeAny( aChars ) ); // the property has string type
565 70 : break;
566 :
567 : case EXTPR_TOKEN( CharactersWithSpaces ):
568 : case EXTPR_TOKEN( Lines ):
569 : case EXTPR_TOKEN( DigSig ):
570 : case EXTPR_TOKEN( HeadingPairs ):
571 : case EXTPR_TOKEN( HLinks ):
572 : case EXTPR_TOKEN( TitlesOfParts ):
573 : // ignored during the import currently
574 3704 : break;
575 :
576 : default:
577 : OSL_FAIL( "Unexpected extended property!" );
578 : }
579 : }
580 5510 : else if ( m_nState == CUSTPR_TOKEN( Properties ) )
581 : {
582 5510 : if ( m_nBlock == CUSTPR_TOKEN( property ) )
583 : {
584 : // this is a custom property
585 5510 : switch( m_nType )
586 : {
587 : case VT_TOKEN( bool ):
588 3186 : AddCustomProperty( uno::makeAny( aChars.toBoolean() ) );
589 3186 : break;
590 :
591 : case VT_TOKEN( bstr ):
592 : case VT_TOKEN( lpstr ):
593 : case VT_TOKEN( lpwstr ):
594 : // the property has string type
595 1364 : AddCustomProperty( uno::makeAny( AttributeConversion::decodeXString( aChars ) ) );
596 1364 : break;
597 :
598 : case VT_TOKEN( date ):
599 : case VT_TOKEN( filetime ):
600 14 : AddCustomProperty( uno::makeAny( GetDateTimeFromW3CDTF( aChars ) ) );
601 14 : break;
602 :
603 : case VT_TOKEN( i1 ):
604 : case VT_TOKEN( i2 ):
605 0 : AddCustomProperty( uno::makeAny( (sal_Int16)aChars.toInt32() ) );
606 0 : break;
607 :
608 : case VT_TOKEN( i4 ):
609 : case VT_TOKEN( int ):
610 888 : AddCustomProperty( uno::makeAny( aChars.toInt32() ) );
611 888 : break;
612 :
613 : case VT_TOKEN( i8 ):
614 0 : AddCustomProperty( uno::makeAny( aChars.toInt64() ) );
615 0 : break;
616 :
617 : case VT_TOKEN( r4 ):
618 0 : AddCustomProperty( uno::makeAny( aChars.toFloat() ) );
619 0 : break;
620 :
621 : case VT_TOKEN( r8 ):
622 10 : AddCustomProperty( uno::makeAny( aChars.toDouble() ) );
623 10 : break;
624 :
625 : default:
626 : // all the other types are ignored;
627 48 : break;
628 : }
629 : }
630 : else
631 : {
632 : OSL_FAIL( "Unexpected tag in custom property!" );
633 : }
634 : }
635 : }
636 : }
637 0 : catch( uno::RuntimeException& )
638 : {
639 0 : throw;
640 : }
641 0 : catch( xml::sax::SAXException& )
642 : {
643 0 : throw;
644 : }
645 0 : catch( uno::Exception& e )
646 : {
647 : throw xml::sax::SAXException(
648 : OUString("Error while setting document property!"),
649 : uno::Reference< uno::XInterface >(),
650 0 : uno::makeAny( e ) );
651 : }
652 75916 : }
653 :
654 0 : void SAL_CALL OOXMLDocPropHandler::ignorableWhitespace( const OUString& )
655 : throw (xml::sax::SAXException, uno::RuntimeException)
656 : {
657 0 : }
658 :
659 0 : void SAL_CALL OOXMLDocPropHandler::processingInstruction( const OUString&, const OUString& )
660 : throw (xml::sax::SAXException, uno::RuntimeException)
661 : {
662 0 : }
663 :
664 : } // namespace docprop
665 : } // namespace oox
666 :
667 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|