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