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