LCOV - code coverage report
Current view: top level - oox/source/docprop - docprophandler.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 293 0.0 %
Date: 2014-04-14 Functions: 0 20 0.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             : 
      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: */

Generated by: LCOV version 1.10