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