1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sfx2.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp> 32*cdf0e10cSrcweir #include <com/sun/star/util/DateTime.hpp> 33*cdf0e10cSrcweir #include <com/sun/star/util/Date.hpp> 34*cdf0e10cSrcweir #include <com/sun/star/util/Time.hpp> 35*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp> 36*cdf0e10cSrcweir #include <com/sun/star/beans/NamedValue.hpp> 37*cdf0e10cSrcweir #include <com/sun/star/beans/StringPair.hpp> 38*cdf0e10cSrcweir #include <com/sun/star/embed/ElementModes.hpp> 39*cdf0e10cSrcweir #include <com/sun/star/xml/sax/XParser.hpp> 40*cdf0e10cSrcweir #include <com/sun/star/document/XImporter.hpp> 41*cdf0e10cSrcweir #include <com/sun/star/document/XExporter.hpp> 42*cdf0e10cSrcweir #include <com/sun/star/io/XActiveDataSource.hpp> 43*cdf0e10cSrcweir #include <com/sun/star/document/XFilter.hpp> 44*cdf0e10cSrcweir #include <com/sun/star/embed/XTransactedObject.hpp> 45*cdf0e10cSrcweir #include <com/sun/star/lang/Locale.hpp> 46*cdf0e10cSrcweir #include <com/sun/star/util/XModifiable.hpp> 47*cdf0e10cSrcweir #include <com/sun/star/document/XDocumentProperties.hpp> 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir #include <unotools/configmgr.hxx> 50*cdf0e10cSrcweir #include <tools/inetdef.hxx> 51*cdf0e10cSrcweir #include <unotools/bootstrap.hxx> 52*cdf0e10cSrcweir #include <cppuhelper/interfacecontainer.hxx> 53*cdf0e10cSrcweir #include <osl/mutex.hxx> 54*cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 55*cdf0e10cSrcweir #include <vcl/svapp.hxx> 56*cdf0e10cSrcweir #include <vos/mutex.hxx> 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir #include <tools/errcode.hxx> 59*cdf0e10cSrcweir #include <svl/cntwids.hrc> 60*cdf0e10cSrcweir #include <comphelper/string.hxx> 61*cdf0e10cSrcweir #include <comphelper/sequenceasvector.hxx> 62*cdf0e10cSrcweir #include <comphelper/storagehelper.hxx> 63*cdf0e10cSrcweir #include <sot/storage.hxx> 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir #include <sfx2/objuno.hxx> 66*cdf0e10cSrcweir #include <sfx2/sfx.hrc> 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir #include <vector> 69*cdf0e10cSrcweir #include <algorithm> 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir #include "sfx2/sfxresid.hxx" 72*cdf0e10cSrcweir #include "doc.hrc" 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir using namespace ::com::sun::star; 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir // TODO/REFACTOR: provide service for MS formats 77*cdf0e10cSrcweir // TODO/REFACTOR: IsEncrypted is never set nor read 78*cdf0e10cSrcweir // Generator is not saved ATM; which value?! 79*cdf0e10cSrcweir // Generator handling must be implemented 80*cdf0e10cSrcweir // Deprecate "Theme", rework IDL 81*cdf0e10cSrcweir // AutoLoadEnabled is deprecated?! 82*cdf0e10cSrcweir // Reasonable defaults for DateTime 83*cdf0e10cSrcweir // MIMEType readonly?! 84*cdf0e10cSrcweir // Announce changes about Theme, Language, Generator, removed entries etc. 85*cdf0e10cSrcweir // IsEncrypted is necessary for binary formats! 86*cdf0e10cSrcweir // Open: When to call PrepareDocInfoForSave? Currently only called for own formats and HTML/Writer 87*cdf0e10cSrcweir // Open: How to load and save EditingTime to MS formats 88*cdf0e10cSrcweir // PPT-Export should use SavePropertySet 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir //============================================================================= 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir // The number of user defined fields handled by the evil XDocumentInfo 93*cdf0e10cSrcweir // interface. There are exactly 4. No more, no less. 94*cdf0e10cSrcweir #define FOUR 4 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir #define PROPERTY_UNBOUND 0 97*cdf0e10cSrcweir #define PROPERTY_MAYBEVOID ::com::sun::star::beans::PropertyAttribute::MAYBEVOID 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir const SfxItemPropertyMapEntry* lcl_GetDocInfoPropertyMap() 100*cdf0e10cSrcweir { 101*cdf0e10cSrcweir static SfxItemPropertyMapEntry aDocInfoPropertyMap_Impl[] = 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir { "Author" , 6 , WID_FROM, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND, 0 }, 104*cdf0e10cSrcweir { "AutoloadEnabled" , 15, MID_DOCINFO_AUTOLOADENABLED, &::getBooleanCppuType(), PROPERTY_UNBOUND, 0 }, 105*cdf0e10cSrcweir { "AutoloadSecs" , 12, MID_DOCINFO_AUTOLOADSECS, &::getCppuType((const sal_Int32*)0), PROPERTY_UNBOUND, 0 }, 106*cdf0e10cSrcweir { "AutoloadURL" , 11, MID_DOCINFO_AUTOLOADURL, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND, 0 }, 107*cdf0e10cSrcweir { "CreationDate" , 12, WID_DATE_CREATED, &::getCppuType((const ::com::sun::star::util::DateTime*)0),PROPERTY_MAYBEVOID, 0 }, 108*cdf0e10cSrcweir { "DefaultTarget" , 13, MID_DOCINFO_DEFAULTTARGET, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND, 0 }, 109*cdf0e10cSrcweir { "Description" , 11, MID_DOCINFO_DESCRIPTION, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND, 0 }, 110*cdf0e10cSrcweir { "DocumentStatistic", 17 , MID_DOCINFO_STATISTIC, &::getCppuType((const uno::Sequence< beans::NamedValue >*)0), PROPERTY_UNBOUND, 0 }, 111*cdf0e10cSrcweir { "EditingCycles" , 13, MID_DOCINFO_REVISION, &::getCppuType((const sal_Int16*)0), PROPERTY_UNBOUND, 0 }, 112*cdf0e10cSrcweir { "EditingDuration" , 15, MID_DOCINFO_EDITTIME, &::getCppuType((const sal_Int32*)0), PROPERTY_UNBOUND, 0 }, 113*cdf0e10cSrcweir { "Generator" , 9, SID_APPLICATION, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND, 0 }, 114*cdf0e10cSrcweir { "Keywords" , 8 , WID_KEYWORDS, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND, 0 }, 115*cdf0e10cSrcweir { "Language" , 8, MID_DOCINFO_CHARLOCALE, &::getCppuType((const lang::Locale*)0), PROPERTY_UNBOUND, 0 }, 116*cdf0e10cSrcweir { "MIMEType" , 8 , WID_CONTENT_TYPE, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND | ::com::sun::star::beans::PropertyAttribute::READONLY, 0 }, 117*cdf0e10cSrcweir { "ModifiedBy" , 10, MID_DOCINFO_MODIFICATIONAUTHOR, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND, 0 }, 118*cdf0e10cSrcweir { "ModifyDate" , 10, WID_DATE_MODIFIED, &::getCppuType((const ::com::sun::star::util::DateTime*)0),PROPERTY_MAYBEVOID, 0 }, 119*cdf0e10cSrcweir { "PrintDate" , 9 , MID_DOCINFO_PRINTDATE, &::getCppuType((const ::com::sun::star::util::DateTime*)0),PROPERTY_MAYBEVOID, 0 }, 120*cdf0e10cSrcweir { "PrintedBy" , 9 , MID_DOCINFO_PRINTEDBY, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND, 0 }, 121*cdf0e10cSrcweir { "Subject" , 7 , MID_DOCINFO_SUBJECT, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND, 0 }, 122*cdf0e10cSrcweir { "Template" , 8 , MID_DOCINFO_TEMPLATE, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND, 0 }, 123*cdf0e10cSrcweir { "TemplateFileName", 16, SID_TEMPLATE_NAME, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND, 0 }, 124*cdf0e10cSrcweir { "TemplateDate" , 12, MID_DOCINFO_TEMPLATEDATE, &::getCppuType((const ::com::sun::star::util::DateTime*)0),PROPERTY_MAYBEVOID, 0 }, 125*cdf0e10cSrcweir { "Title" , 5 , WID_TITLE, &::getCppuType((const ::rtl::OUString*)0), PROPERTY_UNBOUND, 0 }, 126*cdf0e10cSrcweir {0,0,0,0,0,0} 127*cdf0e10cSrcweir }; 128*cdf0e10cSrcweir return aDocInfoPropertyMap_Impl; 129*cdf0e10cSrcweir } 130*cdf0e10cSrcweir 131*cdf0e10cSrcweir static sal_uInt16 aDaysInMonth[12] = { 31, 28, 31, 30, 31, 30, 132*cdf0e10cSrcweir 31, 31, 30, 31, 30, 31 }; 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir inline sal_uInt16 DaysInMonth( sal_uInt16 nMonth, sal_uInt16 nYear ) 135*cdf0e10cSrcweir { 136*cdf0e10cSrcweir if ( nMonth != 2 ) 137*cdf0e10cSrcweir return aDaysInMonth[nMonth-1]; 138*cdf0e10cSrcweir else 139*cdf0e10cSrcweir { 140*cdf0e10cSrcweir if ( (((nYear % 4) == 0) && ((nYear % 100) != 0)) || 141*cdf0e10cSrcweir ((nYear % 400) == 0) ) 142*cdf0e10cSrcweir return aDaysInMonth[nMonth-1] + 1; 143*cdf0e10cSrcweir else 144*cdf0e10cSrcweir return aDaysInMonth[nMonth-1]; 145*cdf0e10cSrcweir } 146*cdf0e10cSrcweir } 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir bool IsValidDateTime( const util::DateTime& rDT ) 149*cdf0e10cSrcweir { 150*cdf0e10cSrcweir if ( !rDT.Month || (rDT.Month > 12) ) 151*cdf0e10cSrcweir return false; 152*cdf0e10cSrcweir if ( !rDT.Day || (rDT.Day > DaysInMonth( rDT.Month, rDT.Year )) ) 153*cdf0e10cSrcweir return false; 154*cdf0e10cSrcweir else if ( rDT.Year <= 1582 ) 155*cdf0e10cSrcweir { 156*cdf0e10cSrcweir if ( rDT.Year < 1582 ) 157*cdf0e10cSrcweir return false; 158*cdf0e10cSrcweir else if ( rDT.Month < 10 ) 159*cdf0e10cSrcweir return false; 160*cdf0e10cSrcweir else if ( (rDT.Month == 10) && (rDT.Day < 15) ) 161*cdf0e10cSrcweir return false; 162*cdf0e10cSrcweir } 163*cdf0e10cSrcweir 164*cdf0e10cSrcweir return true; 165*cdf0e10cSrcweir } 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir struct OUStringHashCode 168*cdf0e10cSrcweir { 169*cdf0e10cSrcweir size_t operator()( const ::rtl::OUString& sString ) const 170*cdf0e10cSrcweir { 171*cdf0e10cSrcweir return sString.hashCode(); 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir }; 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir struct SfxExtendedItemPropertyMap : public SfxItemPropertyMapEntry 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir ::com::sun::star::uno::Any aValue; 178*cdf0e10cSrcweir }; 179*cdf0e10cSrcweir 180*cdf0e10cSrcweir void Copy( const uno::Reference < document::XStandaloneDocumentInfo >& rSource, const uno::Reference < document::XStandaloneDocumentInfo >& rTarget ) 181*cdf0e10cSrcweir { 182*cdf0e10cSrcweir try 183*cdf0e10cSrcweir { 184*cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xSet( rSource, uno::UNO_QUERY ); 185*cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xTarget( rTarget, uno::UNO_QUERY ); 186*cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xSetInfo = xSet->getPropertySetInfo(); 187*cdf0e10cSrcweir uno::Reference< beans::XPropertyContainer > xContainer( rTarget, uno::UNO_QUERY ); 188*cdf0e10cSrcweir uno::Sequence< beans::Property > lProps = xSetInfo->getProperties(); 189*cdf0e10cSrcweir const beans::Property* pProps = lProps.getConstArray(); 190*cdf0e10cSrcweir sal_Int32 c = lProps.getLength(); 191*cdf0e10cSrcweir sal_Int32 i = 0; 192*cdf0e10cSrcweir for (i=0; i<c; ++i) 193*cdf0e10cSrcweir { 194*cdf0e10cSrcweir uno::Any aValue = xSet->getPropertyValue( pProps[i].Name ); 195*cdf0e10cSrcweir if ( pProps[i].Attributes & ::com::sun::star::beans::PropertyAttribute::REMOVABLE ) 196*cdf0e10cSrcweir // QUESTION: DefaultValue?! 197*cdf0e10cSrcweir xContainer->addProperty( pProps[i].Name, pProps[i].Attributes, aValue ); 198*cdf0e10cSrcweir try 199*cdf0e10cSrcweir { 200*cdf0e10cSrcweir // it is possible that the propertysets from XML and binary files differ; we shouldn't break then 201*cdf0e10cSrcweir xTarget->setPropertyValue( pProps[i].Name, aValue ); 202*cdf0e10cSrcweir } 203*cdf0e10cSrcweir catch ( uno::Exception& ) {} 204*cdf0e10cSrcweir } 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir sal_Int16 nCount = rSource->getUserFieldCount(); 207*cdf0e10cSrcweir sal_Int16 nSupportedCount = rTarget->getUserFieldCount(); 208*cdf0e10cSrcweir for ( sal_Int16 nInd = 0; nInd < nCount && nInd < nSupportedCount; nInd++ ) 209*cdf0e10cSrcweir { 210*cdf0e10cSrcweir ::rtl::OUString aPropName = rSource->getUserFieldName( nInd ); 211*cdf0e10cSrcweir rTarget->setUserFieldName( nInd, aPropName ); 212*cdf0e10cSrcweir ::rtl::OUString aPropVal = rSource->getUserFieldValue( nInd ); 213*cdf0e10cSrcweir rTarget->setUserFieldValue( nInd, aPropVal ); 214*cdf0e10cSrcweir } 215*cdf0e10cSrcweir } 216*cdf0e10cSrcweir catch ( uno::Exception& ) {} 217*cdf0e10cSrcweir } 218*cdf0e10cSrcweir 219*cdf0e10cSrcweir class MixedPropertySetInfo : public ::cppu::WeakImplHelper1< ::com::sun::star::beans::XPropertySetInfo > 220*cdf0e10cSrcweir { 221*cdf0e10cSrcweir private: 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir SfxItemPropertyMap _aPropertyMap; 224*cdf0e10cSrcweir ::rtl::OUString* _pUserKeys; 225*cdf0e10cSrcweir uno::Reference<beans::XPropertySet> _xUDProps; 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir public: 228*cdf0e10cSrcweir 229*cdf0e10cSrcweir MixedPropertySetInfo( const SfxItemPropertyMapEntry* pFixProps, 230*cdf0e10cSrcweir ::rtl::OUString* pUserKeys, 231*cdf0e10cSrcweir uno::Reference<beans::XPropertySet> xUDProps); 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir virtual ~MixedPropertySetInfo(); 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > SAL_CALL getProperties( ) throw (::com::sun::star::uno::RuntimeException); 236*cdf0e10cSrcweir virtual ::com::sun::star::beans::Property SAL_CALL getPropertyByName( const ::rtl::OUString& aName ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException); 237*cdf0e10cSrcweir virtual ::sal_Bool SAL_CALL hasPropertyByName( const ::rtl::OUString& Name ) throw (::com::sun::star::uno::RuntimeException); 238*cdf0e10cSrcweir }; 239*cdf0e10cSrcweir 240*cdf0e10cSrcweir //----------------------------------------------------------------------------- 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir MixedPropertySetInfo::MixedPropertySetInfo(const SfxItemPropertyMapEntry* pFixProps, 243*cdf0e10cSrcweir ::rtl::OUString* pUserKeys, 244*cdf0e10cSrcweir uno::Reference<beans::XPropertySet> xUDProps) 245*cdf0e10cSrcweir : _aPropertyMap( pFixProps ) 246*cdf0e10cSrcweir , _pUserKeys(pUserKeys) 247*cdf0e10cSrcweir , _xUDProps(xUDProps) 248*cdf0e10cSrcweir { 249*cdf0e10cSrcweir } 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir //----------------------------------------------------------------------------- 252*cdf0e10cSrcweir 253*cdf0e10cSrcweir MixedPropertySetInfo::~MixedPropertySetInfo() 254*cdf0e10cSrcweir { 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir 257*cdf0e10cSrcweir //----------------------------------------------------------------------------- 258*cdf0e10cSrcweir 259*cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > SAL_CALL MixedPropertySetInfo::getProperties() 260*cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 261*cdf0e10cSrcweir { 262*cdf0e10cSrcweir ::comphelper::SequenceAsVector< ::com::sun::star::beans::Property > lProps; 263*cdf0e10cSrcweir 264*cdf0e10cSrcweir // copy "fix" props 265*cdf0e10cSrcweir //todo: os: this ugly thing should be replaced 266*cdf0e10cSrcweir const SfxItemPropertyMapEntry* pFixProp = lcl_GetDocInfoPropertyMap(); 267*cdf0e10cSrcweir 268*cdf0e10cSrcweir while(pFixProp && pFixProp->pName) 269*cdf0e10cSrcweir { 270*cdf0e10cSrcweir ::com::sun::star::beans::Property aProp; 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir aProp.Name = ::rtl::OUString::createFromAscii(pFixProp->pName); 273*cdf0e10cSrcweir aProp.Handle = pFixProp->nWID; 274*cdf0e10cSrcweir aProp.Type = *(pFixProp->pType); 275*cdf0e10cSrcweir aProp.Attributes = (sal_Int16)(pFixProp->nFlags); 276*cdf0e10cSrcweir 277*cdf0e10cSrcweir lProps.push_back(aProp); 278*cdf0e10cSrcweir ++pFixProp; 279*cdf0e10cSrcweir } 280*cdf0e10cSrcweir 281*cdf0e10cSrcweir // copy "dynamic" props 282*cdf0e10cSrcweir 283*cdf0e10cSrcweir // NB: this is really ugly: 284*cdf0e10cSrcweir // The returned properties must _not_ include the 4 user-defined fields! 285*cdf0e10cSrcweir // These are _not_ properties of the XDocumentInfo interface. 286*cdf0e10cSrcweir // Some things rely on this, e.g. Copy would break otherwise. 287*cdf0e10cSrcweir // This will have interesting consequences if someone expects to insert 288*cdf0e10cSrcweir // a property with the same name as an user-defined key, but nobody 289*cdf0e10cSrcweir // sane does that. 290*cdf0e10cSrcweir uno::Sequence<beans::Property> udProps = 291*cdf0e10cSrcweir _xUDProps->getPropertySetInfo()->getProperties(); 292*cdf0e10cSrcweir for (sal_Int32 i = 0; i < udProps.getLength(); ++i) { 293*cdf0e10cSrcweir if (std::find(_pUserKeys, _pUserKeys+FOUR, udProps[i].Name) 294*cdf0e10cSrcweir == _pUserKeys+FOUR) { 295*cdf0e10cSrcweir // #i100027#: handles from udProps are not valid here 296*cdf0e10cSrcweir udProps[i].Handle = -1; 297*cdf0e10cSrcweir lProps.push_back(udProps[i]); 298*cdf0e10cSrcweir } 299*cdf0e10cSrcweir } 300*cdf0e10cSrcweir 301*cdf0e10cSrcweir return lProps.getAsConstList(); 302*cdf0e10cSrcweir } 303*cdf0e10cSrcweir 304*cdf0e10cSrcweir //----------------------------------------------------------------------------- 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir ::com::sun::star::beans::Property SAL_CALL MixedPropertySetInfo::getPropertyByName( 307*cdf0e10cSrcweir const ::rtl::OUString& sName ) 308*cdf0e10cSrcweir throw(::com::sun::star::beans::UnknownPropertyException, 309*cdf0e10cSrcweir ::com::sun::star::uno::RuntimeException ) 310*cdf0e10cSrcweir { 311*cdf0e10cSrcweir ::com::sun::star::beans::Property aProp; 312*cdf0e10cSrcweir 313*cdf0e10cSrcweir // search it as "fix" prop 314*cdf0e10cSrcweir if( _aPropertyMap.hasPropertyByName( sName ) ) 315*cdf0e10cSrcweir return _aPropertyMap.getPropertyByName( sName ); 316*cdf0e10cSrcweir else 317*cdf0e10cSrcweir // search it as "dynamic" prop 318*cdf0e10cSrcweir return _xUDProps->getPropertySetInfo()->getPropertyByName(sName); 319*cdf0e10cSrcweir } 320*cdf0e10cSrcweir 321*cdf0e10cSrcweir //----------------------------------------------------------------------------- 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir ::sal_Bool SAL_CALL MixedPropertySetInfo::hasPropertyByName(const ::rtl::OUString& sName) 324*cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 325*cdf0e10cSrcweir { 326*cdf0e10cSrcweir return _aPropertyMap.hasPropertyByName( sName ) ? // "fix" prop? 327*cdf0e10cSrcweir sal_True : 328*cdf0e10cSrcweir _xUDProps->getPropertySetInfo()->hasPropertyByName(sName); // "dynamic" prop? 329*cdf0e10cSrcweir } 330*cdf0e10cSrcweir 331*cdf0e10cSrcweir //----------------------------------------------------------------------------- 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir struct SfxDocumentInfoObject_Impl 334*cdf0e10cSrcweir { 335*cdf0e10cSrcweir ::osl::Mutex _aMutex; 336*cdf0e10cSrcweir ::cppu::OInterfaceContainerHelper _aDisposeContainer; 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir sal_Bool bDisposed; 339*cdf0e10cSrcweir 340*cdf0e10cSrcweir // this contains the names of the 4 user defined properties 341*cdf0e10cSrcweir // which are accessible via the evil XDocumentInfo interface 342*cdf0e10cSrcweir ::rtl::OUString m_UserDefined[FOUR]; 343*cdf0e10cSrcweir 344*cdf0e10cSrcweir // the actual contents 345*cdf0e10cSrcweir uno::Reference<document::XDocumentProperties> m_xDocProps; 346*cdf0e10cSrcweir SfxItemPropertyMap m_aPropertyMap; 347*cdf0e10cSrcweir 348*cdf0e10cSrcweir SfxDocumentInfoObject_Impl() 349*cdf0e10cSrcweir : _aDisposeContainer( _aMutex ) 350*cdf0e10cSrcweir , bDisposed(sal_False) 351*cdf0e10cSrcweir , m_xDocProps() 352*cdf0e10cSrcweir , m_aPropertyMap( lcl_GetDocInfoPropertyMap() ) 353*cdf0e10cSrcweir { 354*cdf0e10cSrcweir // the number of user fields is not changeable from the outside 355*cdf0e10cSrcweir // we can't set it too high because every name/value pair will be written to the file (even if empty) 356*cdf0e10cSrcweir // currently our dialog has only 4 user keys so 4 is still a reasonable number 357*cdf0e10cSrcweir } 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir /// the initialization function 360*cdf0e10cSrcweir void Reset(uno::Reference<document::XDocumentProperties> xDocProps, ::rtl::OUString* pUserDefined = 0); 361*cdf0e10cSrcweir }; 362*cdf0e10cSrcweir 363*cdf0e10cSrcweir void SfxDocumentInfoObject_Impl::Reset(uno::Reference<document::XDocumentProperties> xDocProps, ::rtl::OUString* pUserDefined) 364*cdf0e10cSrcweir { 365*cdf0e10cSrcweir if (pUserDefined == 0) { 366*cdf0e10cSrcweir // NB: this is an ugly hack; the "Properties" ui dialog displays 367*cdf0e10cSrcweir // exactly 4 user-defined fields and expects these to be available 368*cdf0e10cSrcweir // (should be redesigned), but I do not want to do this in 369*cdf0e10cSrcweir // DocumentProperties; do it here instead 370*cdf0e10cSrcweir uno::Reference<beans::XPropertyAccess> xPropAccess( 371*cdf0e10cSrcweir xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW); 372*cdf0e10cSrcweir uno::Reference<beans::XPropertyContainer> xPropContainer( 373*cdf0e10cSrcweir xPropAccess, uno::UNO_QUERY_THROW); 374*cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > 375*cdf0e10cSrcweir props = xPropAccess->getPropertyValues(); 376*cdf0e10cSrcweir sal_Int32 oldLength = props.getLength(); 377*cdf0e10cSrcweir if (oldLength < FOUR) { 378*cdf0e10cSrcweir std::vector< ::rtl::OUString > names; 379*cdf0e10cSrcweir for (sal_Int32 i = 0; i < oldLength; ++i) { 380*cdf0e10cSrcweir names.push_back(props[i].Name); 381*cdf0e10cSrcweir } 382*cdf0e10cSrcweir const ::rtl::OUString sInfo( 383*cdf0e10cSrcweir String( SfxResId( STR_DOCINFO_INFOFIELD ) )); 384*cdf0e10cSrcweir for (sal_Int32 i = oldLength; i < FOUR; ++i) { 385*cdf0e10cSrcweir ::rtl::OUString sName(sInfo); 386*cdf0e10cSrcweir sal_Int32 idx = sName.indexOfAsciiL("%1", 2); 387*cdf0e10cSrcweir ::rtl::OUString name = (idx > 0) 388*cdf0e10cSrcweir ? sName.replaceAt(idx, 2, ::rtl::OUString::valueOf(i+1)) 389*cdf0e10cSrcweir : sName + ::rtl::OUString::valueOf(i+1); 390*cdf0e10cSrcweir while (std::find(names.begin(), names.end(), name) 391*cdf0e10cSrcweir != names.end()) { 392*cdf0e10cSrcweir name += ::rtl::OUString::createFromAscii("'"); 393*cdf0e10cSrcweir } 394*cdf0e10cSrcweir // FIXME there is a race condition here 395*cdf0e10cSrcweir try { 396*cdf0e10cSrcweir xPropContainer->addProperty(name, 397*cdf0e10cSrcweir beans::PropertyAttribute::REMOVEABLE, 398*cdf0e10cSrcweir uno::makeAny(::rtl::OUString::createFromAscii(""))); 399*cdf0e10cSrcweir } catch (uno::RuntimeException) { 400*cdf0e10cSrcweir throw; 401*cdf0e10cSrcweir } catch (uno::Exception) { 402*cdf0e10cSrcweir // ignore 403*cdf0e10cSrcweir } 404*cdf0e10cSrcweir } 405*cdf0e10cSrcweir } 406*cdf0e10cSrcweir props = xPropAccess->getPropertyValues(); 407*cdf0e10cSrcweir for (sal_Int32 i = 0; i < FOUR; ++i) { 408*cdf0e10cSrcweir m_UserDefined[i] = props[i].Name; 409*cdf0e10cSrcweir } 410*cdf0e10cSrcweir } else { 411*cdf0e10cSrcweir std::copy(pUserDefined, pUserDefined+FOUR, m_UserDefined); 412*cdf0e10cSrcweir } 413*cdf0e10cSrcweir m_xDocProps = xDocProps; 414*cdf0e10cSrcweir } 415*cdf0e10cSrcweir 416*cdf0e10cSrcweir //----------------------------------------------------------------------------- 417*cdf0e10cSrcweir 418*cdf0e10cSrcweir SfxDocumentInfoObject::SfxDocumentInfoObject() 419*cdf0e10cSrcweir : _pImp( new SfxDocumentInfoObject_Impl() ) 420*cdf0e10cSrcweir { 421*cdf0e10cSrcweir } 422*cdf0e10cSrcweir 423*cdf0e10cSrcweir //----------------------------------------------------------------------------- 424*cdf0e10cSrcweir 425*cdf0e10cSrcweir SfxDocumentInfoObject::~SfxDocumentInfoObject() 426*cdf0e10cSrcweir { 427*cdf0e10cSrcweir delete _pImp; 428*cdf0e10cSrcweir } 429*cdf0e10cSrcweir 430*cdf0e10cSrcweir //----------------------------------------------------------------------------- 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir // ::com::sun::star::lang::XInitialization: 433*cdf0e10cSrcweir void SAL_CALL 434*cdf0e10cSrcweir SfxDocumentInfoObject::initialize(const uno::Sequence< uno::Any > & aArguments) 435*cdf0e10cSrcweir throw (uno::RuntimeException, uno::Exception) 436*cdf0e10cSrcweir { 437*cdf0e10cSrcweir if (aArguments.getLength() >= 1) { 438*cdf0e10cSrcweir uno::Any any = aArguments[0]; 439*cdf0e10cSrcweir uno::Reference<document::XDocumentProperties> xDoc; 440*cdf0e10cSrcweir if (!(any >>= xDoc) || !xDoc.is()) throw lang::IllegalArgumentException( 441*cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 442*cdf0e10cSrcweir "SfxDocumentInfoObject::initialize: no XDocumentProperties given"), 443*cdf0e10cSrcweir *this, 0); 444*cdf0e10cSrcweir _pImp->Reset(xDoc); 445*cdf0e10cSrcweir } else { 446*cdf0e10cSrcweir throw lang::IllegalArgumentException( 447*cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 448*cdf0e10cSrcweir "SfxDocumentInfoObject::initialize: no argument given"), 449*cdf0e10cSrcweir *this, 0); 450*cdf0e10cSrcweir } 451*cdf0e10cSrcweir } 452*cdf0e10cSrcweir 453*cdf0e10cSrcweir // ::com::sun::star::util::XCloneable: 454*cdf0e10cSrcweir uno::Reference<util::XCloneable> SAL_CALL 455*cdf0e10cSrcweir SfxDocumentInfoObject::createClone() throw (uno::RuntimeException) 456*cdf0e10cSrcweir { 457*cdf0e10cSrcweir SfxDocumentInfoObject *pNew = new SfxDocumentInfoObject; 458*cdf0e10cSrcweir uno::Reference< util::XCloneable > 459*cdf0e10cSrcweir xCloneable(_pImp->m_xDocProps, uno::UNO_QUERY_THROW); 460*cdf0e10cSrcweir uno::Reference<document::XDocumentProperties> xDocProps( 461*cdf0e10cSrcweir xCloneable->createClone(), uno::UNO_QUERY_THROW); 462*cdf0e10cSrcweir pNew->_pImp->Reset(xDocProps, _pImp->m_UserDefined); 463*cdf0e10cSrcweir return pNew; 464*cdf0e10cSrcweir } 465*cdf0e10cSrcweir 466*cdf0e10cSrcweir // ::com::sun::star::document::XDocumentProperties: 467*cdf0e10cSrcweir uno::Reference< document::XDocumentProperties > SAL_CALL 468*cdf0e10cSrcweir SfxDocumentInfoObject::getDocumentProperties() 469*cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 470*cdf0e10cSrcweir { 471*cdf0e10cSrcweir return _pImp->m_xDocProps; 472*cdf0e10cSrcweir } 473*cdf0e10cSrcweir 474*cdf0e10cSrcweir //----------------------------------------------------------------------------- 475*cdf0e10cSrcweir 476*cdf0e10cSrcweir const SfxDocumentInfoObject& SfxDocumentInfoObject::operator=( const SfxDocumentInfoObject & rOther) 477*cdf0e10cSrcweir { 478*cdf0e10cSrcweir uno::Reference< util::XCloneable > 479*cdf0e10cSrcweir xCloneable(rOther._pImp->m_xDocProps, uno::UNO_QUERY_THROW); 480*cdf0e10cSrcweir uno::Reference<document::XDocumentProperties> xDocProps( 481*cdf0e10cSrcweir xCloneable->createClone(), uno::UNO_QUERY_THROW); 482*cdf0e10cSrcweir _pImp->Reset(xDocProps, rOther._pImp->m_UserDefined); 483*cdf0e10cSrcweir return *this; 484*cdf0e10cSrcweir } 485*cdf0e10cSrcweir 486*cdf0e10cSrcweir //----------------------------------------------------------------------------- 487*cdf0e10cSrcweir 488*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::dispose() throw( ::com::sun::star::uno::RuntimeException ) 489*cdf0e10cSrcweir { 490*cdf0e10cSrcweir ::com::sun::star::lang::EventObject aEvent( (::cppu::OWeakObject *)this ); 491*cdf0e10cSrcweir _pImp->_aDisposeContainer.disposeAndClear( aEvent ); 492*cdf0e10cSrcweir ::osl::MutexGuard aGuard( _pImp->_aMutex ); 493*cdf0e10cSrcweir _pImp->m_xDocProps = 0; 494*cdf0e10cSrcweir // NB: do not call m_xDocProps->dispose(), there could be other refs 495*cdf0e10cSrcweir _pImp->bDisposed = sal_True; 496*cdf0e10cSrcweir } 497*cdf0e10cSrcweir 498*cdf0e10cSrcweir //----------------------------------------------------------------------------- 499*cdf0e10cSrcweir 500*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException ) 501*cdf0e10cSrcweir { 502*cdf0e10cSrcweir _pImp->_aDisposeContainer.addInterface( aListener ); 503*cdf0e10cSrcweir } 504*cdf0e10cSrcweir 505*cdf0e10cSrcweir //----------------------------------------------------------------------------- 506*cdf0e10cSrcweir 507*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException ) 508*cdf0e10cSrcweir { 509*cdf0e10cSrcweir _pImp->_aDisposeContainer.removeInterface( aListener ); 510*cdf0e10cSrcweir } 511*cdf0e10cSrcweir //----------------------------------------------------------------------------- 512*cdf0e10cSrcweir 513*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL SfxDocumentInfoObject::getPropertySetInfo() throw( ::com::sun::star::uno::RuntimeException ) 514*cdf0e10cSrcweir { 515*cdf0e10cSrcweir ::osl::MutexGuard aGuard( _pImp->_aMutex ); 516*cdf0e10cSrcweir 517*cdf0e10cSrcweir uno::Reference<beans::XPropertySet> xPropSet( 518*cdf0e10cSrcweir _pImp->m_xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW); 519*cdf0e10cSrcweir MixedPropertySetInfo* pInfo = new MixedPropertySetInfo( lcl_GetDocInfoPropertyMap(), _pImp->m_UserDefined, xPropSet); 520*cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xInfo( 521*cdf0e10cSrcweir static_cast< beans::XPropertySetInfo* >(pInfo), uno::UNO_QUERY_THROW); 522*cdf0e10cSrcweir return xInfo; 523*cdf0e10cSrcweir } 524*cdf0e10cSrcweir 525*cdf0e10cSrcweir //----------------------------------------------------------------------------- 526*cdf0e10cSrcweir 527*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::setPropertyValue(const ::rtl::OUString& aPropertyName, const uno::Any& aValue) throw ( 528*cdf0e10cSrcweir uno::RuntimeException, beans::UnknownPropertyException, 529*cdf0e10cSrcweir beans::PropertyVetoException, lang::IllegalArgumentException, 530*cdf0e10cSrcweir lang::WrappedTargetException) 531*cdf0e10cSrcweir { 532*cdf0e10cSrcweir const SfxItemPropertySimpleEntry* pEntry = _pImp->m_aPropertyMap.getByName( aPropertyName ); 533*cdf0e10cSrcweir // fix prop! 534*cdf0e10cSrcweir if ( pEntry ) 535*cdf0e10cSrcweir setFastPropertyValue( pEntry->nWID, aValue ); 536*cdf0e10cSrcweir else 537*cdf0e10cSrcweir // dynamic prop! 538*cdf0e10cSrcweir { 539*cdf0e10cSrcweir uno::Reference<beans::XPropertySet> xPropSet( 540*cdf0e10cSrcweir _pImp->m_xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW); 541*cdf0e10cSrcweir return xPropSet->setPropertyValue(aPropertyName, aValue); 542*cdf0e10cSrcweir } 543*cdf0e10cSrcweir } 544*cdf0e10cSrcweir 545*cdf0e10cSrcweir //----------------------------------------------------------------------------- 546*cdf0e10cSrcweir 547*cdf0e10cSrcweir uno::Any SAL_CALL SfxDocumentInfoObject::getPropertyValue(const ::rtl::OUString& aPropertyName) throw( 548*cdf0e10cSrcweir uno::RuntimeException, beans::UnknownPropertyException, 549*cdf0e10cSrcweir lang::WrappedTargetException) 550*cdf0e10cSrcweir { 551*cdf0e10cSrcweir const SfxItemPropertySimpleEntry* pEntry = _pImp->m_aPropertyMap.getByName( aPropertyName ); 552*cdf0e10cSrcweir // fix prop! 553*cdf0e10cSrcweir if ( pEntry ) 554*cdf0e10cSrcweir return getFastPropertyValue( pEntry->nWID ); 555*cdf0e10cSrcweir else 556*cdf0e10cSrcweir // dynamic prop! 557*cdf0e10cSrcweir { 558*cdf0e10cSrcweir uno::Reference<beans::XPropertySet> xPropSet( 559*cdf0e10cSrcweir _pImp->m_xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW); 560*cdf0e10cSrcweir return xPropSet->getPropertyValue(aPropertyName); 561*cdf0e10cSrcweir } 562*cdf0e10cSrcweir } 563*cdf0e10cSrcweir 564*cdf0e10cSrcweir sal_Bool SAL_CALL SfxDocumentInfoObject::isModified() throw(::com::sun::star::uno::RuntimeException) 565*cdf0e10cSrcweir { 566*cdf0e10cSrcweir uno::Reference<util::XModifiable> xModif( 567*cdf0e10cSrcweir _pImp->m_xDocProps, uno::UNO_QUERY_THROW); 568*cdf0e10cSrcweir return xModif->isModified(); 569*cdf0e10cSrcweir } 570*cdf0e10cSrcweir 571*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::setModified( sal_Bool bModified ) 572*cdf0e10cSrcweir throw (::com::sun::star::beans::PropertyVetoException, ::com::sun::star::uno::RuntimeException) 573*cdf0e10cSrcweir { 574*cdf0e10cSrcweir uno::Reference<util::XModifiable> xModif( 575*cdf0e10cSrcweir _pImp->m_xDocProps, uno::UNO_QUERY_THROW); 576*cdf0e10cSrcweir return xModif->setModified(bModified); 577*cdf0e10cSrcweir } 578*cdf0e10cSrcweir 579*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::addModifyListener( const uno::Reference< util::XModifyListener >& xListener) throw( uno::RuntimeException ) 580*cdf0e10cSrcweir { 581*cdf0e10cSrcweir uno::Reference<util::XModifiable> xModif( 582*cdf0e10cSrcweir _pImp->m_xDocProps, uno::UNO_QUERY_THROW); 583*cdf0e10cSrcweir return xModif->addModifyListener(xListener); 584*cdf0e10cSrcweir } 585*cdf0e10cSrcweir 586*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::removeModifyListener( const uno::Reference< util::XModifyListener >& xListener) throw( uno::RuntimeException ) 587*cdf0e10cSrcweir { 588*cdf0e10cSrcweir uno::Reference<util::XModifiable> xModif( 589*cdf0e10cSrcweir _pImp->m_xDocProps, uno::UNO_QUERY_THROW); 590*cdf0e10cSrcweir return xModif->removeModifyListener(xListener); 591*cdf0e10cSrcweir } 592*cdf0e10cSrcweir 593*cdf0e10cSrcweir //----------------------------------------------------------------------------- 594*cdf0e10cSrcweir 595*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::addPropertyChangeListener(const ::rtl::OUString&, const uno::Reference< beans::XPropertyChangeListener > & ) throw( 596*cdf0e10cSrcweir uno::RuntimeException, beans::UnknownPropertyException, 597*cdf0e10cSrcweir lang::WrappedTargetException) 598*cdf0e10cSrcweir {} 599*cdf0e10cSrcweir 600*cdf0e10cSrcweir //----------------------------------------------------------------------------- 601*cdf0e10cSrcweir 602*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::removePropertyChangeListener(const ::rtl::OUString&, const uno::Reference< beans::XPropertyChangeListener > & ) throw( 603*cdf0e10cSrcweir uno::RuntimeException, beans::UnknownPropertyException, 604*cdf0e10cSrcweir lang::WrappedTargetException) 605*cdf0e10cSrcweir {} 606*cdf0e10cSrcweir 607*cdf0e10cSrcweir //----------------------------------------------------------------------------- 608*cdf0e10cSrcweir 609*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::addVetoableChangeListener(const ::rtl::OUString&, const uno::Reference< beans::XVetoableChangeListener > & ) throw( 610*cdf0e10cSrcweir uno::RuntimeException, beans::UnknownPropertyException, 611*cdf0e10cSrcweir lang::WrappedTargetException) 612*cdf0e10cSrcweir {} 613*cdf0e10cSrcweir 614*cdf0e10cSrcweir //----------------------------------------------------------------------------- 615*cdf0e10cSrcweir 616*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::removeVetoableChangeListener(const ::rtl::OUString&, const uno::Reference< beans::XVetoableChangeListener > & ) throw( 617*cdf0e10cSrcweir uno::RuntimeException, beans::UnknownPropertyException, 618*cdf0e10cSrcweir lang::WrappedTargetException) 619*cdf0e10cSrcweir {} 620*cdf0e10cSrcweir 621*cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > SAL_CALL SfxDocumentInfoObject::getPropertyValues( void ) throw( uno::RuntimeException ) 622*cdf0e10cSrcweir { 623*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > xInfo = getPropertySetInfo(); 624*cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > aProps = xInfo->getProperties(); 625*cdf0e10cSrcweir 626*cdf0e10cSrcweir const ::com::sun::star::beans::Property* pProps = aProps.getConstArray(); 627*cdf0e10cSrcweir sal_uInt32 nCount = aProps.getLength(); 628*cdf0e10cSrcweir 629*cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >aSeq( nCount ); 630*cdf0e10cSrcweir ::com::sun::star::beans::PropertyValue* pValues = aSeq.getArray(); 631*cdf0e10cSrcweir 632*cdf0e10cSrcweir for ( sal_uInt32 n = 0; n < nCount; ++n ) 633*cdf0e10cSrcweir { 634*cdf0e10cSrcweir ::com::sun::star::beans::PropertyValue& rCurrValue = pValues[n]; 635*cdf0e10cSrcweir const ::com::sun::star::beans::Property& rCurrProp = pProps[n]; 636*cdf0e10cSrcweir 637*cdf0e10cSrcweir rCurrValue.Name = rCurrProp.Name; 638*cdf0e10cSrcweir rCurrValue.Handle = rCurrProp.Handle; 639*cdf0e10cSrcweir rCurrValue.Value = getPropertyValue( rCurrProp.Name ); 640*cdf0e10cSrcweir } 641*cdf0e10cSrcweir 642*cdf0e10cSrcweir return aSeq; 643*cdf0e10cSrcweir } 644*cdf0e10cSrcweir 645*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::setPropertyValues( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aProps ) 646*cdf0e10cSrcweir throw( ::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException ) 647*cdf0e10cSrcweir { 648*cdf0e10cSrcweir const ::com::sun::star::beans::PropertyValue* pProps = aProps.getConstArray(); 649*cdf0e10cSrcweir sal_uInt32 nCount = aProps.getLength(); 650*cdf0e10cSrcweir 651*cdf0e10cSrcweir for ( sal_uInt32 n = 0; n < nCount; ++n ) 652*cdf0e10cSrcweir { 653*cdf0e10cSrcweir const ::com::sun::star::beans::PropertyValue& rProp = pProps[n]; 654*cdf0e10cSrcweir setPropertyValue( rProp.Name, rProp.Value ); 655*cdf0e10cSrcweir } 656*cdf0e10cSrcweir } 657*cdf0e10cSrcweir 658*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::addProperty(const ::rtl::OUString& sName , 659*cdf0e10cSrcweir sal_Int16 nAttributes , 660*cdf0e10cSrcweir const ::com::sun::star::uno::Any& aDefaultValue) 661*cdf0e10cSrcweir throw(::com::sun::star::beans::PropertyExistException , 662*cdf0e10cSrcweir ::com::sun::star::beans::IllegalTypeException , 663*cdf0e10cSrcweir ::com::sun::star::lang::IllegalArgumentException, 664*cdf0e10cSrcweir ::com::sun::star::uno::RuntimeException ) 665*cdf0e10cSrcweir { 666*cdf0e10cSrcweir // clash with "fix" properties ? 667*cdf0e10cSrcweir sal_Bool bFixProp = _pImp->m_aPropertyMap.getByName( sName ) != 0; 668*cdf0e10cSrcweir if ( bFixProp ) 669*cdf0e10cSrcweir { 670*cdf0e10cSrcweir ::rtl::OUStringBuffer sMsg(256); 671*cdf0e10cSrcweir sMsg.appendAscii("The property \"" ); 672*cdf0e10cSrcweir sMsg.append (sName ); 673*cdf0e10cSrcweir sMsg.appendAscii("\" " ); 674*cdf0e10cSrcweir if ( bFixProp ) 675*cdf0e10cSrcweir sMsg.appendAscii(" already exists as a fix property. Please have a look into the IDL documentation of the DocumentInfo service."); 676*cdf0e10cSrcweir 677*cdf0e10cSrcweir throw ::com::sun::star::beans::PropertyExistException( 678*cdf0e10cSrcweir sMsg.makeStringAndClear(), 679*cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >(this)); 680*cdf0e10cSrcweir } 681*cdf0e10cSrcweir 682*cdf0e10cSrcweir uno::Reference<beans::XPropertyContainer> xPropSet( 683*cdf0e10cSrcweir _pImp->m_xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW); 684*cdf0e10cSrcweir return xPropSet->addProperty(sName, nAttributes, aDefaultValue); 685*cdf0e10cSrcweir } 686*cdf0e10cSrcweir 687*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::removeProperty(const ::rtl::OUString& sName) 688*cdf0e10cSrcweir throw(::com::sun::star::beans::UnknownPropertyException, 689*cdf0e10cSrcweir ::com::sun::star::beans::NotRemoveableException , 690*cdf0e10cSrcweir ::com::sun::star::uno::RuntimeException ) 691*cdf0e10cSrcweir { 692*cdf0e10cSrcweir // clash with "fix" properties ? 693*cdf0e10cSrcweir sal_Bool bFixProp = _pImp->m_aPropertyMap.getByName( sName ) != 0; 694*cdf0e10cSrcweir if ( bFixProp ) 695*cdf0e10cSrcweir { 696*cdf0e10cSrcweir ::rtl::OUStringBuffer sMsg(256); 697*cdf0e10cSrcweir sMsg.appendAscii("The property \"" ); 698*cdf0e10cSrcweir sMsg.append (sName ); 699*cdf0e10cSrcweir sMsg.appendAscii("\" cant be removed. Its a fix property of the DocumentInfo service."); 700*cdf0e10cSrcweir 701*cdf0e10cSrcweir throw ::com::sun::star::beans::NotRemoveableException( 702*cdf0e10cSrcweir sMsg.makeStringAndClear(), 703*cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >(this)); 704*cdf0e10cSrcweir } 705*cdf0e10cSrcweir 706*cdf0e10cSrcweir uno::Reference<beans::XPropertyContainer> xPropSet( 707*cdf0e10cSrcweir _pImp->m_xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW); 708*cdf0e10cSrcweir return xPropSet->removeProperty(sName); 709*cdf0e10cSrcweir } 710*cdf0e10cSrcweir 711*cdf0e10cSrcweir sal_Bool equalsDateTime( const util::DateTime& D1, const util::DateTime& D2 ) 712*cdf0e10cSrcweir { 713*cdf0e10cSrcweir return D1.HundredthSeconds == D2.HundredthSeconds && 714*cdf0e10cSrcweir D1.Seconds == D2.Seconds && 715*cdf0e10cSrcweir D1.Minutes == D2.Minutes && 716*cdf0e10cSrcweir D1.Hours == D2.Hours && 717*cdf0e10cSrcweir D1.Day == D2.Day && 718*cdf0e10cSrcweir D1.Month == D2.Month && 719*cdf0e10cSrcweir D1.Year == D2.Year; 720*cdf0e10cSrcweir } 721*cdf0e10cSrcweir 722*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::setFastPropertyValue(sal_Int32 nHandle, const ::com::sun::star::uno::Any& aValue) throw( 723*cdf0e10cSrcweir uno::RuntimeException, beans::UnknownPropertyException, 724*cdf0e10cSrcweir beans::PropertyVetoException, lang::IllegalArgumentException, 725*cdf0e10cSrcweir lang::WrappedTargetException) 726*cdf0e10cSrcweir { 727*cdf0e10cSrcweir // Attention: Only fix properties should be provided by this method. 728*cdf0e10cSrcweir // Dynamic properties has no handle in real ... because it cant be used inside multithreaded environments :-) 729*cdf0e10cSrcweir 730*cdf0e10cSrcweir ::osl::ClearableMutexGuard aGuard( _pImp->_aMutex ); 731*cdf0e10cSrcweir 732*cdf0e10cSrcweir if ( aValue.getValueType() == ::getCppuType((const ::rtl::OUString*)0) ) 733*cdf0e10cSrcweir { 734*cdf0e10cSrcweir ::rtl::OUString sTemp ; 735*cdf0e10cSrcweir aValue >>= sTemp ; 736*cdf0e10cSrcweir switch ( nHandle ) 737*cdf0e10cSrcweir { 738*cdf0e10cSrcweir case SID_APPLICATION : 739*cdf0e10cSrcweir _pImp->m_xDocProps->setGenerator(sTemp); 740*cdf0e10cSrcweir break; 741*cdf0e10cSrcweir case WID_FROM : 742*cdf0e10cSrcweir { 743*cdf0e10cSrcweir // QUESTION: do we still need this? 744*cdf0e10cSrcweir /* 745*cdf0e10cSrcweir // String aStrVal( sTemp ); 746*cdf0e10cSrcweir if ( aStrVal.Len() > TIMESTAMP_MAXLENGTH ) 747*cdf0e10cSrcweir { 748*cdf0e10cSrcweir SvAddressParser aParser( aStrVal ); 749*cdf0e10cSrcweir if ( aParser.Count() > 0 ) 750*cdf0e10cSrcweir { 751*cdf0e10cSrcweir String aEmail = aParser.GetEmailAddress(0); 752*cdf0e10cSrcweir String aRealname = aParser.GetRealName(0); 753*cdf0e10cSrcweir 754*cdf0e10cSrcweir if ( aRealname.Len() <= TIMESTAMP_MAXLENGTH ) 755*cdf0e10cSrcweir aStrVal = aRealname; 756*cdf0e10cSrcweir else if ( aEmail.Len() <= TIMESTAMP_MAXLENGTH ) 757*cdf0e10cSrcweir aStrVal = aEmail; 758*cdf0e10cSrcweir } 759*cdf0e10cSrcweir } */ 760*cdf0e10cSrcweir 761*cdf0e10cSrcweir if ( _pImp->m_xDocProps->getAuthor() != sTemp ) 762*cdf0e10cSrcweir _pImp->m_xDocProps->setAuthor(sTemp); 763*cdf0e10cSrcweir break; 764*cdf0e10cSrcweir } 765*cdf0e10cSrcweir case MID_DOCINFO_PRINTEDBY: 766*cdf0e10cSrcweir if ( _pImp->m_xDocProps->getPrintedBy() != sTemp ) 767*cdf0e10cSrcweir _pImp->m_xDocProps->setPrintedBy(sTemp); 768*cdf0e10cSrcweir break; 769*cdf0e10cSrcweir case MID_DOCINFO_MODIFICATIONAUTHOR: 770*cdf0e10cSrcweir if ( _pImp->m_xDocProps->getModifiedBy() != sTemp ) 771*cdf0e10cSrcweir _pImp->m_xDocProps->setModifiedBy(sTemp); 772*cdf0e10cSrcweir break; 773*cdf0e10cSrcweir case WID_TITLE : 774*cdf0e10cSrcweir { 775*cdf0e10cSrcweir if ( _pImp->m_xDocProps->getTitle() != sTemp ) 776*cdf0e10cSrcweir _pImp->m_xDocProps->setTitle(sTemp); 777*cdf0e10cSrcweir break; 778*cdf0e10cSrcweir } 779*cdf0e10cSrcweir case MID_DOCINFO_SUBJECT : 780*cdf0e10cSrcweir if ( _pImp->m_xDocProps->getSubject() != sTemp ) 781*cdf0e10cSrcweir _pImp->m_xDocProps->setSubject(sTemp); 782*cdf0e10cSrcweir break; 783*cdf0e10cSrcweir case WID_KEYWORDS : 784*cdf0e10cSrcweir { 785*cdf0e10cSrcweir _pImp->m_xDocProps->setKeywords( 786*cdf0e10cSrcweir ::comphelper::string::convertCommaSeparated(sTemp)); 787*cdf0e10cSrcweir } 788*cdf0e10cSrcweir break; 789*cdf0e10cSrcweir case MID_DOCINFO_TEMPLATE: 790*cdf0e10cSrcweir if ( _pImp->m_xDocProps->getTemplateName() != sTemp ) 791*cdf0e10cSrcweir _pImp->m_xDocProps->setTemplateName(sTemp); 792*cdf0e10cSrcweir break; 793*cdf0e10cSrcweir case SID_TEMPLATE_NAME: 794*cdf0e10cSrcweir if ( _pImp->m_xDocProps->getTemplateURL() != sTemp ) 795*cdf0e10cSrcweir _pImp->m_xDocProps->setTemplateURL(sTemp); 796*cdf0e10cSrcweir break; 797*cdf0e10cSrcweir case MID_DOCINFO_DESCRIPTION: 798*cdf0e10cSrcweir if ( _pImp->m_xDocProps->getDescription() != sTemp ) 799*cdf0e10cSrcweir _pImp->m_xDocProps->setDescription(sTemp); 800*cdf0e10cSrcweir break; 801*cdf0e10cSrcweir case MID_DOCINFO_AUTOLOADURL: 802*cdf0e10cSrcweir if ( _pImp->m_xDocProps->getAutoloadURL() != sTemp ) 803*cdf0e10cSrcweir _pImp->m_xDocProps->setAutoloadURL(sTemp); 804*cdf0e10cSrcweir break; 805*cdf0e10cSrcweir case MID_DOCINFO_DEFAULTTARGET: 806*cdf0e10cSrcweir if ( _pImp->m_xDocProps->getDefaultTarget() != sTemp ) 807*cdf0e10cSrcweir _pImp->m_xDocProps->setDefaultTarget(sTemp); 808*cdf0e10cSrcweir break; 809*cdf0e10cSrcweir // case WID_CONTENT_TYPE : // this is readonly! 810*cdf0e10cSrcweir default: 811*cdf0e10cSrcweir break; 812*cdf0e10cSrcweir } 813*cdf0e10cSrcweir } 814*cdf0e10cSrcweir else if ( aValue.getValueType() == ::getCppuType((const ::com::sun::star::util::DateTime*)0) ) 815*cdf0e10cSrcweir { 816*cdf0e10cSrcweir com::sun::star::util::DateTime aTemp; 817*cdf0e10cSrcweir aValue >>= aTemp ; 818*cdf0e10cSrcweir switch ( nHandle ) 819*cdf0e10cSrcweir { 820*cdf0e10cSrcweir case WID_DATE_CREATED : 821*cdf0e10cSrcweir { 822*cdf0e10cSrcweir if ( !equalsDateTime(_pImp->m_xDocProps->getCreationDate(), aTemp ) ) 823*cdf0e10cSrcweir { 824*cdf0e10cSrcweir _pImp->m_xDocProps->setCreationDate(aTemp); 825*cdf0e10cSrcweir } 826*cdf0e10cSrcweir break; 827*cdf0e10cSrcweir } 828*cdf0e10cSrcweir case WID_DATE_MODIFIED : 829*cdf0e10cSrcweir { 830*cdf0e10cSrcweir if ( !equalsDateTime(_pImp->m_xDocProps->getModificationDate(), aTemp ) ) 831*cdf0e10cSrcweir { 832*cdf0e10cSrcweir _pImp->m_xDocProps->setModificationDate(aTemp); 833*cdf0e10cSrcweir } 834*cdf0e10cSrcweir break; 835*cdf0e10cSrcweir } 836*cdf0e10cSrcweir case MID_DOCINFO_PRINTDATE : 837*cdf0e10cSrcweir { 838*cdf0e10cSrcweir if ( !equalsDateTime(_pImp->m_xDocProps->getPrintDate(), aTemp ) ) 839*cdf0e10cSrcweir { 840*cdf0e10cSrcweir _pImp->m_xDocProps->setPrintDate(aTemp); 841*cdf0e10cSrcweir } 842*cdf0e10cSrcweir break; 843*cdf0e10cSrcweir } 844*cdf0e10cSrcweir case MID_DOCINFO_TEMPLATEDATE : 845*cdf0e10cSrcweir { 846*cdf0e10cSrcweir if ( !equalsDateTime(_pImp->m_xDocProps->getTemplateDate(), aTemp ) ) 847*cdf0e10cSrcweir { 848*cdf0e10cSrcweir _pImp->m_xDocProps->setTemplateDate(aTemp); 849*cdf0e10cSrcweir } 850*cdf0e10cSrcweir break; 851*cdf0e10cSrcweir } 852*cdf0e10cSrcweir default: 853*cdf0e10cSrcweir break; 854*cdf0e10cSrcweir } 855*cdf0e10cSrcweir } 856*cdf0e10cSrcweir 857*cdf0e10cSrcweir else if ( aValue.getValueType() == ::getBooleanCppuType() ) 858*cdf0e10cSrcweir { 859*cdf0e10cSrcweir sal_Bool bBoolVal = false; 860*cdf0e10cSrcweir aValue >>= bBoolVal ; 861*cdf0e10cSrcweir switch ( nHandle ) 862*cdf0e10cSrcweir { 863*cdf0e10cSrcweir case MID_DOCINFO_AUTOLOADENABLED: 864*cdf0e10cSrcweir // NB: this property does not exist any more 865*cdf0e10cSrcweir // it is emulated as enabled iff delay > 0 866*cdf0e10cSrcweir if ( bBoolVal && (0 == _pImp->m_xDocProps->getAutoloadSecs()) ) { 867*cdf0e10cSrcweir _pImp->m_xDocProps->setAutoloadSecs(60); // default 868*cdf0e10cSrcweir } else if ( !bBoolVal && (0 != _pImp->m_xDocProps->getAutoloadSecs()) ) { 869*cdf0e10cSrcweir _pImp->m_xDocProps->setAutoloadSecs(0); 870*cdf0e10cSrcweir _pImp->m_xDocProps->setAutoloadURL(::rtl::OUString::createFromAscii("")); 871*cdf0e10cSrcweir } 872*cdf0e10cSrcweir break; 873*cdf0e10cSrcweir default: 874*cdf0e10cSrcweir break; 875*cdf0e10cSrcweir } 876*cdf0e10cSrcweir } 877*cdf0e10cSrcweir else if ( aValue.getValueType() == ::getCppuType((const sal_Int32*)0) ) 878*cdf0e10cSrcweir { 879*cdf0e10cSrcweir sal_Int32 nIntVal = 0; 880*cdf0e10cSrcweir aValue >>= nIntVal ; 881*cdf0e10cSrcweir switch ( nHandle ) 882*cdf0e10cSrcweir { 883*cdf0e10cSrcweir case MID_DOCINFO_AUTOLOADSECS: 884*cdf0e10cSrcweir if ( nIntVal != _pImp->m_xDocProps->getAutoloadSecs()) 885*cdf0e10cSrcweir _pImp->m_xDocProps->setAutoloadSecs(nIntVal); 886*cdf0e10cSrcweir break; 887*cdf0e10cSrcweir case MID_DOCINFO_EDITTIME: 888*cdf0e10cSrcweir if ( nIntVal != _pImp->m_xDocProps->getEditingDuration()) 889*cdf0e10cSrcweir _pImp->m_xDocProps->setEditingDuration(nIntVal); 890*cdf0e10cSrcweir break; 891*cdf0e10cSrcweir default: 892*cdf0e10cSrcweir break; 893*cdf0e10cSrcweir } 894*cdf0e10cSrcweir } 895*cdf0e10cSrcweir else if ( aValue.getValueType() == ::getCppuType((const sal_Int16*)0) ) 896*cdf0e10cSrcweir { 897*cdf0e10cSrcweir short nIntVal = 0; 898*cdf0e10cSrcweir aValue >>= nIntVal ; 899*cdf0e10cSrcweir switch ( nHandle ) 900*cdf0e10cSrcweir { 901*cdf0e10cSrcweir case MID_DOCINFO_REVISION: 902*cdf0e10cSrcweir if ( nIntVal != _pImp->m_xDocProps->getEditingCycles()) 903*cdf0e10cSrcweir _pImp->m_xDocProps->setEditingCycles(nIntVal); 904*cdf0e10cSrcweir break; 905*cdf0e10cSrcweir default: 906*cdf0e10cSrcweir break; 907*cdf0e10cSrcweir } 908*cdf0e10cSrcweir } 909*cdf0e10cSrcweir else if ( aValue.getValueType() == ::getCppuType((const uno::Sequence< beans::NamedValue >*)0) ) 910*cdf0e10cSrcweir { 911*cdf0e10cSrcweir if ( nHandle == MID_DOCINFO_STATISTIC ) 912*cdf0e10cSrcweir { 913*cdf0e10cSrcweir uno::Sequence < beans::NamedValue > aData; 914*cdf0e10cSrcweir aValue >>= aData; 915*cdf0e10cSrcweir { 916*cdf0e10cSrcweir _pImp->m_xDocProps->setDocumentStatistics(aData); 917*cdf0e10cSrcweir } 918*cdf0e10cSrcweir } 919*cdf0e10cSrcweir } 920*cdf0e10cSrcweir else if ( aValue.getValueType() == ::getCppuType((const lang::Locale*)0) ) 921*cdf0e10cSrcweir { 922*cdf0e10cSrcweir if ( nHandle == MID_DOCINFO_CHARLOCALE ) 923*cdf0e10cSrcweir { 924*cdf0e10cSrcweir lang::Locale aLocale; 925*cdf0e10cSrcweir aValue >>= aLocale; 926*cdf0e10cSrcweir lang::Locale oldLocale = _pImp->m_xDocProps->getLanguage(); 927*cdf0e10cSrcweir if ( aLocale.Language != oldLocale.Language || 928*cdf0e10cSrcweir aLocale.Country != oldLocale.Country || 929*cdf0e10cSrcweir aLocale.Variant != oldLocale.Variant ) 930*cdf0e10cSrcweir { 931*cdf0e10cSrcweir _pImp->m_xDocProps->setLanguage(aLocale); 932*cdf0e10cSrcweir } 933*cdf0e10cSrcweir } 934*cdf0e10cSrcweir } 935*cdf0e10cSrcweir } 936*cdf0e10cSrcweir 937*cdf0e10cSrcweir //----------------------------------------------------------------------------- 938*cdf0e10cSrcweir 939*cdf0e10cSrcweir ::com::sun::star::uno::Any SAL_CALL SfxDocumentInfoObject::getFastPropertyValue(sal_Int32 nHandle) throw( 940*cdf0e10cSrcweir uno::RuntimeException, beans::UnknownPropertyException, 941*cdf0e10cSrcweir lang::WrappedTargetException) 942*cdf0e10cSrcweir { 943*cdf0e10cSrcweir // Attention: Only fix properties should be provided by this method. 944*cdf0e10cSrcweir // Dynamic properties has no handle in real ... because it cant be used inside multithreaded environments :-) 945*cdf0e10cSrcweir 946*cdf0e10cSrcweir ::osl::MutexGuard aGuard( _pImp->_aMutex ); 947*cdf0e10cSrcweir ::com::sun::star::uno::Any aValue; 948*cdf0e10cSrcweir switch ( nHandle ) 949*cdf0e10cSrcweir { 950*cdf0e10cSrcweir case SID_APPLICATION : 951*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getGenerator(); 952*cdf0e10cSrcweir break; 953*cdf0e10cSrcweir case WID_CONTENT_TYPE : 954*cdf0e10cSrcweir // FIXME this is not available anymore 955*cdf0e10cSrcweir aValue <<= ::rtl::OUString(); 956*cdf0e10cSrcweir break; 957*cdf0e10cSrcweir case MID_DOCINFO_REVISION : 958*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getEditingCycles(); 959*cdf0e10cSrcweir break; 960*cdf0e10cSrcweir case MID_DOCINFO_EDITTIME : 961*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getEditingDuration(); 962*cdf0e10cSrcweir break; 963*cdf0e10cSrcweir case WID_FROM : 964*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getAuthor(); 965*cdf0e10cSrcweir break; 966*cdf0e10cSrcweir case WID_DATE_CREATED : 967*cdf0e10cSrcweir if ( IsValidDateTime( _pImp->m_xDocProps->getCreationDate() ) ) 968*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getCreationDate(); 969*cdf0e10cSrcweir break; 970*cdf0e10cSrcweir case WID_TITLE : 971*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getTitle(); 972*cdf0e10cSrcweir break; 973*cdf0e10cSrcweir case MID_DOCINFO_SUBJECT: 974*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getSubject(); 975*cdf0e10cSrcweir break; 976*cdf0e10cSrcweir case MID_DOCINFO_MODIFICATIONAUTHOR: 977*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getModifiedBy(); 978*cdf0e10cSrcweir break; 979*cdf0e10cSrcweir case WID_DATE_MODIFIED : 980*cdf0e10cSrcweir if ( IsValidDateTime( _pImp->m_xDocProps->getModificationDate() ) ) 981*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getModificationDate(); 982*cdf0e10cSrcweir break; 983*cdf0e10cSrcweir case MID_DOCINFO_PRINTEDBY: 984*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getPrintedBy(); 985*cdf0e10cSrcweir break; 986*cdf0e10cSrcweir case MID_DOCINFO_PRINTDATE: 987*cdf0e10cSrcweir if ( IsValidDateTime( _pImp->m_xDocProps->getPrintDate() ) ) 988*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getPrintDate(); 989*cdf0e10cSrcweir break; 990*cdf0e10cSrcweir case WID_KEYWORDS : 991*cdf0e10cSrcweir aValue <<= ::comphelper::string::convertCommaSeparated( 992*cdf0e10cSrcweir _pImp->m_xDocProps->getKeywords()); 993*cdf0e10cSrcweir break; 994*cdf0e10cSrcweir case MID_DOCINFO_DESCRIPTION: 995*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getDescription(); 996*cdf0e10cSrcweir break; 997*cdf0e10cSrcweir case MID_DOCINFO_TEMPLATE: 998*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getTemplateName(); 999*cdf0e10cSrcweir break; 1000*cdf0e10cSrcweir case SID_TEMPLATE_NAME: 1001*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getTemplateURL(); 1002*cdf0e10cSrcweir break; 1003*cdf0e10cSrcweir case MID_DOCINFO_TEMPLATEDATE: 1004*cdf0e10cSrcweir if ( IsValidDateTime( _pImp->m_xDocProps->getTemplateDate() ) ) 1005*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getTemplateDate(); 1006*cdf0e10cSrcweir break; 1007*cdf0e10cSrcweir case MID_DOCINFO_AUTOLOADENABLED: 1008*cdf0e10cSrcweir aValue <<= static_cast<sal_Bool> 1009*cdf0e10cSrcweir ( (_pImp->m_xDocProps->getAutoloadSecs() != 0) 1010*cdf0e10cSrcweir || !(_pImp->m_xDocProps->getAutoloadURL().equalsAscii(""))); 1011*cdf0e10cSrcweir break; 1012*cdf0e10cSrcweir case MID_DOCINFO_AUTOLOADURL: 1013*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getAutoloadURL(); 1014*cdf0e10cSrcweir break; 1015*cdf0e10cSrcweir case MID_DOCINFO_AUTOLOADSECS: 1016*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getAutoloadSecs(); 1017*cdf0e10cSrcweir break; 1018*cdf0e10cSrcweir case MID_DOCINFO_DEFAULTTARGET: 1019*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getDefaultTarget(); 1020*cdf0e10cSrcweir break; 1021*cdf0e10cSrcweir case MID_DOCINFO_STATISTIC: 1022*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getDocumentStatistics(); 1023*cdf0e10cSrcweir break; 1024*cdf0e10cSrcweir case MID_DOCINFO_CHARLOCALE: 1025*cdf0e10cSrcweir aValue <<= _pImp->m_xDocProps->getLanguage(); 1026*cdf0e10cSrcweir break; 1027*cdf0e10cSrcweir default: 1028*cdf0e10cSrcweir aValue <<= ::rtl::OUString(); 1029*cdf0e10cSrcweir break; 1030*cdf0e10cSrcweir } 1031*cdf0e10cSrcweir 1032*cdf0e10cSrcweir return aValue; 1033*cdf0e10cSrcweir } 1034*cdf0e10cSrcweir 1035*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1036*cdf0e10cSrcweir 1037*cdf0e10cSrcweir sal_Int16 SAL_CALL SfxDocumentInfoObject::getUserFieldCount() throw( ::com::sun::star::uno::RuntimeException ) 1038*cdf0e10cSrcweir { 1039*cdf0e10cSrcweir // uno::Reference<beans::XPropertyAccess> xPropSet( 1040*cdf0e10cSrcweir // _pImp->m_xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW); 1041*cdf0e10cSrcweir // return xPropSet->getPropertyValues().getLength(); 1042*cdf0e10cSrcweir return FOUR; 1043*cdf0e10cSrcweir } 1044*cdf0e10cSrcweir 1045*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1046*cdf0e10cSrcweir 1047*cdf0e10cSrcweir ::rtl::OUString SAL_CALL SfxDocumentInfoObject::getUserFieldName(sal_Int16 nIndex) throw( ::com::sun::star::uno::RuntimeException ) 1048*cdf0e10cSrcweir { 1049*cdf0e10cSrcweir ::osl::MutexGuard aGuard( _pImp->_aMutex ); 1050*cdf0e10cSrcweir if (nIndex < FOUR) 1051*cdf0e10cSrcweir return _pImp->m_UserDefined[nIndex]; 1052*cdf0e10cSrcweir else 1053*cdf0e10cSrcweir return ::rtl::OUString(); 1054*cdf0e10cSrcweir } 1055*cdf0e10cSrcweir 1056*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1057*cdf0e10cSrcweir 1058*cdf0e10cSrcweir ::rtl::OUString SAL_CALL SfxDocumentInfoObject::getUserFieldValue(sal_Int16 nIndex) throw( ::com::sun::star::uno::RuntimeException ) 1059*cdf0e10cSrcweir { 1060*cdf0e10cSrcweir ::osl::MutexGuard aGuard( _pImp->_aMutex ); 1061*cdf0e10cSrcweir if (nIndex < FOUR) { 1062*cdf0e10cSrcweir ::rtl::OUString name = _pImp->m_UserDefined[nIndex]; 1063*cdf0e10cSrcweir uno::Reference<beans::XPropertySet> xPropSet( 1064*cdf0e10cSrcweir _pImp->m_xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW); 1065*cdf0e10cSrcweir ::rtl::OUString val; 1066*cdf0e10cSrcweir try { 1067*cdf0e10cSrcweir xPropSet->getPropertyValue(name) >>= val; 1068*cdf0e10cSrcweir return val; 1069*cdf0e10cSrcweir } catch (uno::RuntimeException &) { 1070*cdf0e10cSrcweir throw; 1071*cdf0e10cSrcweir } catch (uno::Exception &) { 1072*cdf0e10cSrcweir return ::rtl::OUString(); // ignore 1073*cdf0e10cSrcweir } 1074*cdf0e10cSrcweir } else 1075*cdf0e10cSrcweir return ::rtl::OUString(); 1076*cdf0e10cSrcweir } 1077*cdf0e10cSrcweir 1078*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1079*cdf0e10cSrcweir 1080*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::setUserFieldName(sal_Int16 nIndex, const ::rtl::OUString& aName ) throw( ::com::sun::star::uno::RuntimeException ) 1081*cdf0e10cSrcweir { 1082*cdf0e10cSrcweir ::osl::ClearableMutexGuard aGuard( _pImp->_aMutex ); 1083*cdf0e10cSrcweir if (nIndex < FOUR) // yes, four! 1084*cdf0e10cSrcweir { 1085*cdf0e10cSrcweir // FIXME this is full of race conditions because the PropertyBag 1086*cdf0e10cSrcweir // can be accessed from clients of the DocumentProperties! 1087*cdf0e10cSrcweir ::rtl::OUString name = _pImp->m_UserDefined[nIndex]; 1088*cdf0e10cSrcweir if (name != aName) { 1089*cdf0e10cSrcweir uno::Reference<beans::XPropertySet> xPropSet( 1090*cdf0e10cSrcweir _pImp->m_xDocProps->getUserDefinedProperties(), 1091*cdf0e10cSrcweir uno::UNO_QUERY_THROW); 1092*cdf0e10cSrcweir uno::Reference<beans::XPropertyContainer> xPropContainer( 1093*cdf0e10cSrcweir _pImp->m_xDocProps->getUserDefinedProperties(), 1094*cdf0e10cSrcweir uno::UNO_QUERY_THROW); 1095*cdf0e10cSrcweir uno::Any value; 1096*cdf0e10cSrcweir try { 1097*cdf0e10cSrcweir value = xPropSet->getPropertyValue(name); 1098*cdf0e10cSrcweir xPropContainer->removeProperty(name); 1099*cdf0e10cSrcweir xPropContainer->addProperty(aName, 1100*cdf0e10cSrcweir beans::PropertyAttribute::REMOVEABLE, value); 1101*cdf0e10cSrcweir _pImp->m_UserDefined[nIndex] = aName; 1102*cdf0e10cSrcweir } catch (beans::UnknownPropertyException) { 1103*cdf0e10cSrcweir try { 1104*cdf0e10cSrcweir xPropContainer->addProperty(aName, 1105*cdf0e10cSrcweir beans::PropertyAttribute::REMOVEABLE, 1106*cdf0e10cSrcweir uno::makeAny(::rtl::OUString::createFromAscii(""))); 1107*cdf0e10cSrcweir _pImp->m_UserDefined[nIndex] = aName; 1108*cdf0e10cSrcweir } catch (beans::PropertyExistException) { 1109*cdf0e10cSrcweir _pImp->m_UserDefined[nIndex] = aName; 1110*cdf0e10cSrcweir // ignore 1111*cdf0e10cSrcweir } 1112*cdf0e10cSrcweir } catch (beans::PropertyExistException) { 1113*cdf0e10cSrcweir try { 1114*cdf0e10cSrcweir xPropContainer->addProperty(name, 1115*cdf0e10cSrcweir beans::PropertyAttribute::REMOVEABLE, value); 1116*cdf0e10cSrcweir } catch (beans::PropertyExistException) { 1117*cdf0e10cSrcweir // bugger... 1118*cdf0e10cSrcweir } 1119*cdf0e10cSrcweir } catch (uno::RuntimeException &) { 1120*cdf0e10cSrcweir throw; 1121*cdf0e10cSrcweir } catch (uno::Exception &) { 1122*cdf0e10cSrcweir // ignore everything else; xPropSet _may_ be corrupted 1123*cdf0e10cSrcweir } 1124*cdf0e10cSrcweir } 1125*cdf0e10cSrcweir } 1126*cdf0e10cSrcweir } 1127*cdf0e10cSrcweir 1128*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1129*cdf0e10cSrcweir 1130*cdf0e10cSrcweir void SAL_CALL SfxDocumentInfoObject::setUserFieldValue( sal_Int16 nIndex, const ::rtl::OUString& aValue ) throw( ::com::sun::star::uno::RuntimeException ) 1131*cdf0e10cSrcweir { 1132*cdf0e10cSrcweir ::osl::ClearableMutexGuard aGuard( _pImp->_aMutex ); 1133*cdf0e10cSrcweir if (nIndex < FOUR) // yes, four! 1134*cdf0e10cSrcweir { 1135*cdf0e10cSrcweir ::rtl::OUString name = _pImp->m_UserDefined[nIndex]; 1136*cdf0e10cSrcweir uno::Reference<beans::XPropertySet> xPropSet( 1137*cdf0e10cSrcweir _pImp->m_xDocProps->getUserDefinedProperties(), 1138*cdf0e10cSrcweir uno::UNO_QUERY_THROW); 1139*cdf0e10cSrcweir uno::Reference<beans::XPropertyContainer> xPropContainer( 1140*cdf0e10cSrcweir _pImp->m_xDocProps->getUserDefinedProperties(), 1141*cdf0e10cSrcweir uno::UNO_QUERY_THROW); 1142*cdf0e10cSrcweir uno::Any aAny; 1143*cdf0e10cSrcweir aAny <<= aValue; 1144*cdf0e10cSrcweir try { 1145*cdf0e10cSrcweir uno::Any value = xPropSet->getPropertyValue(name); 1146*cdf0e10cSrcweir if (value != aAny) { 1147*cdf0e10cSrcweir xPropSet->setPropertyValue(name, aAny); 1148*cdf0e10cSrcweir } 1149*cdf0e10cSrcweir } catch (beans::UnknownPropertyException) { 1150*cdf0e10cSrcweir try { 1151*cdf0e10cSrcweir // someone removed it, add it back again 1152*cdf0e10cSrcweir xPropContainer->addProperty(name, 1153*cdf0e10cSrcweir beans::PropertyAttribute::REMOVEABLE, aAny); 1154*cdf0e10cSrcweir } catch (uno::RuntimeException &) { 1155*cdf0e10cSrcweir throw; 1156*cdf0e10cSrcweir } catch (uno::Exception &) { 1157*cdf0e10cSrcweir // ignore everything else 1158*cdf0e10cSrcweir } 1159*cdf0e10cSrcweir } catch (uno::RuntimeException &) { 1160*cdf0e10cSrcweir throw; 1161*cdf0e10cSrcweir } catch (uno::Exception &) { 1162*cdf0e10cSrcweir // ignore everything else 1163*cdf0e10cSrcweir } 1164*cdf0e10cSrcweir } 1165*cdf0e10cSrcweir } 1166*cdf0e10cSrcweir 1167*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1168*cdf0e10cSrcweir SFX_IMPL_XINTERFACE_2( SfxStandaloneDocumentInfoObject, SfxDocumentInfoObject, ::com::sun::star::lang::XServiceInfo, ::com::sun::star::document::XStandaloneDocumentInfo ) 1169*cdf0e10cSrcweir SFX_IMPL_XTYPEPROVIDER_10( SfxStandaloneDocumentInfoObject, ::com::sun::star::document::XDocumentInfo, ::com::sun::star::lang::XComponent, 1170*cdf0e10cSrcweir ::com::sun::star::beans::XPropertySet, ::com::sun::star::beans::XFastPropertySet, ::com::sun::star::beans::XPropertyAccess, 1171*cdf0e10cSrcweir ::com::sun::star::beans::XPropertyContainer, ::com::sun::star::util::XModifiable, ::com::sun::star::util::XModifyBroadcaster, 1172*cdf0e10cSrcweir ::com::sun::star::document::XStandaloneDocumentInfo, ::com::sun::star::lang::XServiceInfo ) 1173*cdf0e10cSrcweir 1174*cdf0e10cSrcweir SFX_IMPL_XSERVICEINFO( SfxStandaloneDocumentInfoObject, "com.sun.star.document.StandaloneDocumentInfo", "com.sun.star.comp.sfx2.StandaloneDocumentInfo" ) 1175*cdf0e10cSrcweir SFX_IMPL_SINGLEFACTORY( SfxStandaloneDocumentInfoObject ) 1176*cdf0e10cSrcweir 1177*cdf0e10cSrcweir SfxStandaloneDocumentInfoObject::SfxStandaloneDocumentInfoObject( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xFactory ) 1178*cdf0e10cSrcweir : SfxDocumentInfoObject() 1179*cdf0e10cSrcweir , _xFactory( xFactory ) 1180*cdf0e10cSrcweir { 1181*cdf0e10cSrcweir uno::Reference< lang::XInitialization > xDocProps( 1182*cdf0e10cSrcweir _xFactory->createInstance( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1183*cdf0e10cSrcweir "com.sun.star.document.DocumentProperties"))), uno::UNO_QUERY_THROW); 1184*cdf0e10cSrcweir // xDocProps->initialize(uno::Sequence<uno::Any>()); 1185*cdf0e10cSrcweir uno::Any a; 1186*cdf0e10cSrcweir a <<= xDocProps; 1187*cdf0e10cSrcweir uno::Sequence<uno::Any> args(1); 1188*cdf0e10cSrcweir args[0] = a; 1189*cdf0e10cSrcweir initialize(args); 1190*cdf0e10cSrcweir } 1191*cdf0e10cSrcweir 1192*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1193*cdf0e10cSrcweir 1194*cdf0e10cSrcweir SfxStandaloneDocumentInfoObject::~SfxStandaloneDocumentInfoObject() 1195*cdf0e10cSrcweir { 1196*cdf0e10cSrcweir } 1197*cdf0e10cSrcweir 1198*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1199*cdf0e10cSrcweir 1200*cdf0e10cSrcweir uno::Reference< embed::XStorage > GetStorage_Impl( const ::rtl::OUString& rName, sal_Bool bWrite, uno::Reference < lang::XMultiServiceFactory >& xFactory ) 1201*cdf0e10cSrcweir { 1202*cdf0e10cSrcweir // catch unexpected exceptions under solaris 1203*cdf0e10cSrcweir // Client code checks the returned reference but is not interested on error details. 1204*cdf0e10cSrcweir try 1205*cdf0e10cSrcweir { 1206*cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); 1207*cdf0e10cSrcweir return ::comphelper::OStorageHelper::GetStorageFromURL( 1208*cdf0e10cSrcweir rName, 1209*cdf0e10cSrcweir bWrite ? embed::ElementModes::READWRITE : embed::ElementModes::READ, 1210*cdf0e10cSrcweir xFactory ); 1211*cdf0e10cSrcweir } 1212*cdf0e10cSrcweir catch(const uno::Exception&) 1213*cdf0e10cSrcweir {} 1214*cdf0e10cSrcweir 1215*cdf0e10cSrcweir return uno::Reference< embed::XStorage >(); 1216*cdf0e10cSrcweir } 1217*cdf0e10cSrcweir 1218*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1219*cdf0e10cSrcweir 1220*cdf0e10cSrcweir sal_Int16 SAL_CALL SfxStandaloneDocumentInfoObject::getUserFieldCount() throw( ::com::sun::star::uno::RuntimeException ) 1221*cdf0e10cSrcweir { 1222*cdf0e10cSrcweir return SfxDocumentInfoObject::getUserFieldCount(); 1223*cdf0e10cSrcweir } 1224*cdf0e10cSrcweir 1225*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1226*cdf0e10cSrcweir 1227*cdf0e10cSrcweir ::rtl::OUString SAL_CALL SfxStandaloneDocumentInfoObject::getUserFieldName(sal_Int16 nIndex) throw( ::com::sun::star::uno::RuntimeException ) 1228*cdf0e10cSrcweir { 1229*cdf0e10cSrcweir return SfxDocumentInfoObject::getUserFieldName(nIndex); 1230*cdf0e10cSrcweir } 1231*cdf0e10cSrcweir 1232*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1233*cdf0e10cSrcweir 1234*cdf0e10cSrcweir ::rtl::OUString SAL_CALL SfxStandaloneDocumentInfoObject::getUserFieldValue(sal_Int16 nIndex) throw( ::com::sun::star::uno::RuntimeException ) 1235*cdf0e10cSrcweir { 1236*cdf0e10cSrcweir return SfxDocumentInfoObject::getUserFieldValue(nIndex); 1237*cdf0e10cSrcweir } 1238*cdf0e10cSrcweir 1239*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1240*cdf0e10cSrcweir 1241*cdf0e10cSrcweir void SAL_CALL SfxStandaloneDocumentInfoObject::setUserFieldName(sal_Int16 nIndex, const ::rtl::OUString& aName ) throw( ::com::sun::star::uno::RuntimeException ) 1242*cdf0e10cSrcweir { 1243*cdf0e10cSrcweir SfxDocumentInfoObject::setUserFieldName( nIndex, aName ); 1244*cdf0e10cSrcweir } 1245*cdf0e10cSrcweir 1246*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1247*cdf0e10cSrcweir 1248*cdf0e10cSrcweir void SAL_CALL SfxStandaloneDocumentInfoObject::setUserFieldValue( sal_Int16 nIndex, const ::rtl::OUString& aValue ) throw( ::com::sun::star::uno::RuntimeException ) 1249*cdf0e10cSrcweir { 1250*cdf0e10cSrcweir SfxDocumentInfoObject::setUserFieldValue( nIndex, aValue ); 1251*cdf0e10cSrcweir } 1252*cdf0e10cSrcweir 1253*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1254*cdf0e10cSrcweir 1255*cdf0e10cSrcweir void SAL_CALL SfxStandaloneDocumentInfoObject::loadFromURL(const ::rtl::OUString& aURL) 1256*cdf0e10cSrcweir throw( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException ) 1257*cdf0e10cSrcweir { 1258*cdf0e10cSrcweir sal_Bool bOK = sal_False; 1259*cdf0e10cSrcweir 1260*cdf0e10cSrcweir ::osl::ClearableMutexGuard aGuard( _pImp->_aMutex ); 1261*cdf0e10cSrcweir uno::Reference< document::XDocumentProperties > xDocProps( 1262*cdf0e10cSrcweir _xFactory->createInstance( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1263*cdf0e10cSrcweir "com.sun.star.document.DocumentProperties"))), uno::UNO_QUERY_THROW); 1264*cdf0e10cSrcweir // uno::Reference< lang::XInitialization > xInit(xDocProps, uno::UNO_QUERY_THROW); 1265*cdf0e10cSrcweir // xInit->initialize(uno::Sequence<uno::Any>()); 1266*cdf0e10cSrcweir _pImp->Reset(xDocProps); 1267*cdf0e10cSrcweir aGuard.clear(); 1268*cdf0e10cSrcweir 1269*cdf0e10cSrcweir uno::Reference< embed::XStorage > xStorage = GetStorage_Impl( aURL, sal_False, _xFactory ); 1270*cdf0e10cSrcweir if ( xStorage.is() ) 1271*cdf0e10cSrcweir { 1272*cdf0e10cSrcweir try 1273*cdf0e10cSrcweir { 1274*cdf0e10cSrcweir uno::Sequence<beans::PropertyValue> medium(2); 1275*cdf0e10cSrcweir medium[0].Name = ::rtl::OUString::createFromAscii("DocumentBaseURL"); 1276*cdf0e10cSrcweir medium[0].Value <<= aURL; 1277*cdf0e10cSrcweir medium[1].Name = ::rtl::OUString::createFromAscii("URL"); 1278*cdf0e10cSrcweir medium[1].Value <<= aURL; 1279*cdf0e10cSrcweir _pImp->m_xDocProps->loadFromStorage(xStorage, medium); 1280*cdf0e10cSrcweir _pImp->Reset(_pImp->m_xDocProps); 1281*cdf0e10cSrcweir bOK = sal_True; 1282*cdf0e10cSrcweir } 1283*cdf0e10cSrcweir catch( uno::Exception& ) 1284*cdf0e10cSrcweir { 1285*cdf0e10cSrcweir } 1286*cdf0e10cSrcweir } 1287*cdf0e10cSrcweir else 1288*cdf0e10cSrcweir { 1289*cdf0e10cSrcweir uno::Reference < document::XStandaloneDocumentInfo > xBinary( _xFactory->createInstance( 1290*cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.BinaryStandaloneDocumentInfo" ) ) ), uno::UNO_QUERY ); 1291*cdf0e10cSrcweir if ( xBinary.is() ) 1292*cdf0e10cSrcweir { 1293*cdf0e10cSrcweir xBinary->loadFromURL( aURL ); 1294*cdf0e10cSrcweir bOK = sal_True; 1295*cdf0e10cSrcweir uno::Reference < document::XStandaloneDocumentInfo > xTarget( static_cast < document::XStandaloneDocumentInfo*> (this), uno::UNO_QUERY ); 1296*cdf0e10cSrcweir Copy( xBinary, xTarget ); 1297*cdf0e10cSrcweir } 1298*cdf0e10cSrcweir } 1299*cdf0e10cSrcweir 1300*cdf0e10cSrcweir if ( !bOK ) 1301*cdf0e10cSrcweir throw task::ErrorCodeIOException( ::rtl::OUString(), uno::Reference< uno::XInterface >(), ERRCODE_IO_CANTREAD ); 1302*cdf0e10cSrcweir } 1303*cdf0e10cSrcweir 1304*cdf0e10cSrcweir //----------------------------------------------------------------------------- 1305*cdf0e10cSrcweir 1306*cdf0e10cSrcweir void SAL_CALL SfxStandaloneDocumentInfoObject::storeIntoURL(const ::rtl::OUString& aURL) throw( ::com::sun::star::io::IOException ) 1307*cdf0e10cSrcweir { 1308*cdf0e10cSrcweir sal_Bool bOK = sal_False; 1309*cdf0e10cSrcweir uno::Reference< embed::XStorage > xStorage = GetStorage_Impl( aURL, sal_True, _xFactory ); 1310*cdf0e10cSrcweir if ( xStorage.is() ) 1311*cdf0e10cSrcweir { 1312*cdf0e10cSrcweir try 1313*cdf0e10cSrcweir { 1314*cdf0e10cSrcweir uno::Sequence<beans::PropertyValue> medium(2); 1315*cdf0e10cSrcweir medium[0].Name = ::rtl::OUString::createFromAscii("DocumentBaseURL"); 1316*cdf0e10cSrcweir medium[0].Value <<= aURL; 1317*cdf0e10cSrcweir medium[1].Name = ::rtl::OUString::createFromAscii("URL"); 1318*cdf0e10cSrcweir medium[1].Value <<= aURL; 1319*cdf0e10cSrcweir 1320*cdf0e10cSrcweir _pImp->m_xDocProps->storeToStorage(xStorage, medium); 1321*cdf0e10cSrcweir bOK = sal_True; 1322*cdf0e10cSrcweir } 1323*cdf0e10cSrcweir catch( io::IOException & ) 1324*cdf0e10cSrcweir { 1325*cdf0e10cSrcweir throw; 1326*cdf0e10cSrcweir } 1327*cdf0e10cSrcweir catch( uno::RuntimeException& ) 1328*cdf0e10cSrcweir { 1329*cdf0e10cSrcweir throw; 1330*cdf0e10cSrcweir } 1331*cdf0e10cSrcweir catch( uno::Exception& ) 1332*cdf0e10cSrcweir { 1333*cdf0e10cSrcweir } 1334*cdf0e10cSrcweir } 1335*cdf0e10cSrcweir else 1336*cdf0e10cSrcweir { 1337*cdf0e10cSrcweir uno::Reference < document::XStandaloneDocumentInfo > xBinary( _xFactory->createInstance( 1338*cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.BinaryStandaloneDocumentInfo" ) ) ), uno::UNO_QUERY ); 1339*cdf0e10cSrcweir if ( xBinary.is() ) 1340*cdf0e10cSrcweir { 1341*cdf0e10cSrcweir Copy( this, xBinary ); 1342*cdf0e10cSrcweir xBinary->storeIntoURL( aURL ); 1343*cdf0e10cSrcweir bOK = sal_True; 1344*cdf0e10cSrcweir } 1345*cdf0e10cSrcweir } 1346*cdf0e10cSrcweir 1347*cdf0e10cSrcweir if ( !bOK ) 1348*cdf0e10cSrcweir throw task::ErrorCodeIOException( ::rtl::OUString(), uno::Reference< uno::XInterface >(), ERRCODE_IO_CANTWRITE ); 1349*cdf0e10cSrcweir } 1350*cdf0e10cSrcweir 1351