LCOV - code coverage report
Current view: top level - oox/source/docprop - docprophandler.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 225 289 77.9 %
Date: 2015-06-13 12:38:46 Functions: 15 18 83.3 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.11