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