xref: /AOO41X/main/sfx2/source/doc/objuno.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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