LCOV - code coverage report
Current view: top level - oox/source/docprop - docprophandler.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 225 293 76.8 %
Date: 2014-11-03 Functions: 15 20 75.0 %
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 <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: */

Generated by: LCOV version 1.10