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