1*d119d52dSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*d119d52dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*d119d52dSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*d119d52dSAndrew Rist * distributed with this work for additional information 6*d119d52dSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*d119d52dSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*d119d52dSAndrew Rist * "License"); you may not use this file except in compliance 9*d119d52dSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*d119d52dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*d119d52dSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*d119d52dSAndrew Rist * software distributed under the License is distributed on an 15*d119d52dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*d119d52dSAndrew Rist * KIND, either express or implied. See the License for the 17*d119d52dSAndrew Rist * specific language governing permissions and limitations 18*d119d52dSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*d119d52dSAndrew Rist *************************************************************/ 21*d119d52dSAndrew Rist 22*d119d52dSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #include "precompiled_sfx2.hxx" 25cdf0e10cSrcweir 26cdf0e10cSrcweir #include "sal/config.h" 27cdf0e10cSrcweir #include "cppuhelper/factory.hxx" 28cdf0e10cSrcweir #include "cppuhelper/implementationentry.hxx" 29cdf0e10cSrcweir #include "cppuhelper/compbase6.hxx" 30cdf0e10cSrcweir #include "com/sun/star/lang/XServiceInfo.hpp" 31cdf0e10cSrcweir #include "com/sun/star/document/XDocumentProperties.hpp" 32cdf0e10cSrcweir #include "com/sun/star/lang/XInitialization.hpp" 33cdf0e10cSrcweir #include "com/sun/star/util/XCloneable.hpp" 34cdf0e10cSrcweir #include "com/sun/star/util/XModifiable.hpp" 35cdf0e10cSrcweir #include "com/sun/star/xml/sax/XSAXSerializable.hpp" 36cdf0e10cSrcweir 37cdf0e10cSrcweir #include "com/sun/star/lang/WrappedTargetRuntimeException.hpp" 38cdf0e10cSrcweir #include "com/sun/star/lang/EventObject.hpp" 39cdf0e10cSrcweir #include "com/sun/star/beans/XPropertySet.hpp" 40cdf0e10cSrcweir #include "com/sun/star/beans/XPropertySetInfo.hpp" 41cdf0e10cSrcweir #include "com/sun/star/beans/PropertyAttribute.hpp" 42cdf0e10cSrcweir #include "com/sun/star/task/ErrorCodeIOException.hpp" 43cdf0e10cSrcweir #include "com/sun/star/embed/XStorage.hpp" 44cdf0e10cSrcweir #include "com/sun/star/embed/XTransactedObject.hpp" 45cdf0e10cSrcweir #include "com/sun/star/embed/ElementModes.hpp" 46cdf0e10cSrcweir #include "com/sun/star/io/XActiveDataControl.hpp" 47cdf0e10cSrcweir #include "com/sun/star/io/XActiveDataSource.hpp" 48cdf0e10cSrcweir #include "com/sun/star/io/XStream.hpp" 49cdf0e10cSrcweir #include "com/sun/star/document/XImporter.hpp" 50cdf0e10cSrcweir #include "com/sun/star/document/XExporter.hpp" 51cdf0e10cSrcweir #include "com/sun/star/document/XFilter.hpp" 52cdf0e10cSrcweir #include "com/sun/star/xml/sax/XParser.hpp" 53cdf0e10cSrcweir #include "com/sun/star/xml/dom/XDocument.hpp" 54cdf0e10cSrcweir #include "com/sun/star/xml/dom/XElement.hpp" 55cdf0e10cSrcweir #include "com/sun/star/xml/dom/XDocumentBuilder.hpp" 56cdf0e10cSrcweir #include "com/sun/star/xml/dom/XSAXDocumentBuilder.hpp" 57cdf0e10cSrcweir #include "com/sun/star/xml/dom/NodeType.hpp" 58cdf0e10cSrcweir #include "com/sun/star/xml/xpath/XXPathAPI.hpp" 59cdf0e10cSrcweir #include "com/sun/star/util/Date.hpp" 60cdf0e10cSrcweir #include "com/sun/star/util/Time.hpp" 61cdf0e10cSrcweir #include "com/sun/star/util/Duration.hpp" 62cdf0e10cSrcweir 63cdf0e10cSrcweir #include "SfxDocumentMetaData.hxx" 64cdf0e10cSrcweir #include "rtl/ustrbuf.hxx" 65cdf0e10cSrcweir #include "tools/debug.hxx" 66cdf0e10cSrcweir #include "tools/string.hxx" // for DBG 67cdf0e10cSrcweir #include "tools/datetime.hxx" 68cdf0e10cSrcweir #include "tools/urlobj.hxx" 69cdf0e10cSrcweir #include "osl/mutex.hxx" 70cdf0e10cSrcweir #include "cppuhelper/basemutex.hxx" 71cdf0e10cSrcweir #include "cppuhelper/interfacecontainer.hxx" 72cdf0e10cSrcweir #include "comphelper/storagehelper.hxx" 73cdf0e10cSrcweir #include "comphelper/mediadescriptor.hxx" 74cdf0e10cSrcweir #include "comphelper/sequenceasvector.hxx" 75cdf0e10cSrcweir #include "comphelper/stlunosequence.hxx" 76cdf0e10cSrcweir #include "sot/storage.hxx" 77cdf0e10cSrcweir #include "sfx2/docfile.hxx" 78cdf0e10cSrcweir #include "sax/tools/converter.hxx" 79cdf0e10cSrcweir 80cdf0e10cSrcweir #include <utility> 81cdf0e10cSrcweir #include <vector> 82cdf0e10cSrcweir #include <map> 83cdf0e10cSrcweir #include <cstring> 84cdf0e10cSrcweir #include <limits> 85cdf0e10cSrcweir 86cdf0e10cSrcweir /** 87cdf0e10cSrcweir * This file contains the implementation of the service 88cdf0e10cSrcweir * com.sun.star.document.DocumentProperties. 89cdf0e10cSrcweir * This service enables access to the meta-data stored in documents. 90cdf0e10cSrcweir * Currently, this service only handles documents in ODF format. 91cdf0e10cSrcweir * 92cdf0e10cSrcweir * The implementation uses an XML DOM to store the properties. 93cdf0e10cSrcweir * This approach was taken because it allows for preserving arbitrary XML data 94cdf0e10cSrcweir * in loaded documents, which will be stored unmodified when saving the 95cdf0e10cSrcweir * document again. 96cdf0e10cSrcweir * 97cdf0e10cSrcweir * Upon access, some properties are directly read from and updated in the DOM. 98cdf0e10cSrcweir * Exception: it seems impossible to get notified upon addition of a property 99cdf0e10cSrcweir * to a com.sun.star.beans.PropertyBag, which is used for storing user-defined 100cdf0e10cSrcweir * properties; because of this, user-defined properties are updated in the 101cdf0e10cSrcweir * XML DOM only when storing the document. 102cdf0e10cSrcweir * Exception 2: when setting certain properties which correspond to attributes 103cdf0e10cSrcweir * in the XML DOM, we want to remove the corresponding XML element. Detecting 104cdf0e10cSrcweir * this condition can get messy, so we store all such properties as members, 105cdf0e10cSrcweir * and update the DOM tree only when storing the document (in 106cdf0e10cSrcweir * <method>updateUserDefinedAndAttributes</method>). 107cdf0e10cSrcweir * 108cdf0e10cSrcweir * @author mst 109cdf0e10cSrcweir */ 110cdf0e10cSrcweir 111cdf0e10cSrcweir /// anonymous implementation namespace 112cdf0e10cSrcweir namespace { 113cdf0e10cSrcweir 114cdf0e10cSrcweir namespace css = ::com::sun::star; 115cdf0e10cSrcweir 116cdf0e10cSrcweir 117cdf0e10cSrcweir /// a list of attribute-lists, where attribute means name and content 118cdf0e10cSrcweir typedef std::vector<std::vector<std::pair<const char*, ::rtl::OUString> > > 119cdf0e10cSrcweir AttrVector; 120cdf0e10cSrcweir 121cdf0e10cSrcweir typedef ::cppu::WeakComponentImplHelper6< 122cdf0e10cSrcweir css::lang::XServiceInfo, 123cdf0e10cSrcweir css::document::XDocumentProperties, 124cdf0e10cSrcweir css::lang::XInitialization, 125cdf0e10cSrcweir css::util::XCloneable, 126cdf0e10cSrcweir css::util::XModifiable, 127cdf0e10cSrcweir css::xml::sax::XSAXSerializable> 128cdf0e10cSrcweir SfxDocumentMetaData_Base; 129cdf0e10cSrcweir 130cdf0e10cSrcweir class SfxDocumentMetaData: 131cdf0e10cSrcweir private ::cppu::BaseMutex, 132cdf0e10cSrcweir public SfxDocumentMetaData_Base 133cdf0e10cSrcweir { 134cdf0e10cSrcweir public: 135cdf0e10cSrcweir explicit SfxDocumentMetaData( 136cdf0e10cSrcweir css::uno::Reference< css::uno::XComponentContext > const & context); 137cdf0e10cSrcweir 138cdf0e10cSrcweir // ::com::sun::star::lang::XServiceInfo: 139cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getImplementationName() 140cdf0e10cSrcweir throw (css::uno::RuntimeException); 141cdf0e10cSrcweir virtual ::sal_Bool SAL_CALL supportsService( 142cdf0e10cSrcweir const ::rtl::OUString & ServiceName) throw (css::uno::RuntimeException); 143cdf0e10cSrcweir virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL 144cdf0e10cSrcweir getSupportedServiceNames() throw (css::uno::RuntimeException); 145cdf0e10cSrcweir 146cdf0e10cSrcweir // ::com::sun::star::lang::XComponent: 147cdf0e10cSrcweir virtual void SAL_CALL dispose() throw (css::uno::RuntimeException); 148cdf0e10cSrcweir 149cdf0e10cSrcweir // ::com::sun::star::document::XDocumentProperties: 150cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getAuthor() 151cdf0e10cSrcweir throw (css::uno::RuntimeException); 152cdf0e10cSrcweir virtual void SAL_CALL setAuthor(const ::rtl::OUString & the_value) 153cdf0e10cSrcweir throw (css::uno::RuntimeException); 154cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getGenerator() 155cdf0e10cSrcweir throw (css::uno::RuntimeException); 156cdf0e10cSrcweir virtual void SAL_CALL setGenerator(const ::rtl::OUString & the_value) 157cdf0e10cSrcweir throw (css::uno::RuntimeException); 158cdf0e10cSrcweir virtual css::util::DateTime SAL_CALL getCreationDate() 159cdf0e10cSrcweir throw (css::uno::RuntimeException); 160cdf0e10cSrcweir virtual void SAL_CALL setCreationDate(const css::util::DateTime & the_value) 161cdf0e10cSrcweir throw (css::uno::RuntimeException); 162cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getTitle() 163cdf0e10cSrcweir throw (css::uno::RuntimeException); 164cdf0e10cSrcweir virtual void SAL_CALL setTitle(const ::rtl::OUString & the_value) 165cdf0e10cSrcweir throw (css::uno::RuntimeException); 166cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getSubject() 167cdf0e10cSrcweir throw (css::uno::RuntimeException); 168cdf0e10cSrcweir virtual void SAL_CALL setSubject(const ::rtl::OUString & the_value) 169cdf0e10cSrcweir throw (css::uno::RuntimeException); 170cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getDescription() 171cdf0e10cSrcweir throw (css::uno::RuntimeException); 172cdf0e10cSrcweir virtual void SAL_CALL setDescription(const ::rtl::OUString & the_value) 173cdf0e10cSrcweir throw (css::uno::RuntimeException); 174cdf0e10cSrcweir virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL getKeywords() 175cdf0e10cSrcweir throw (css::uno::RuntimeException); 176cdf0e10cSrcweir virtual void SAL_CALL setKeywords( 177cdf0e10cSrcweir const css::uno::Sequence< ::rtl::OUString > & the_value) 178cdf0e10cSrcweir throw (css::uno::RuntimeException); 179cdf0e10cSrcweir virtual css::lang::Locale SAL_CALL getLanguage() 180cdf0e10cSrcweir throw (css::uno::RuntimeException); 181cdf0e10cSrcweir virtual void SAL_CALL setLanguage(const css::lang::Locale & the_value) 182cdf0e10cSrcweir throw (css::uno::RuntimeException); 183cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getModifiedBy() 184cdf0e10cSrcweir throw (css::uno::RuntimeException); 185cdf0e10cSrcweir virtual void SAL_CALL setModifiedBy(const ::rtl::OUString & the_value) 186cdf0e10cSrcweir throw (css::uno::RuntimeException); 187cdf0e10cSrcweir virtual css::util::DateTime SAL_CALL getModificationDate() 188cdf0e10cSrcweir throw (css::uno::RuntimeException); 189cdf0e10cSrcweir virtual void SAL_CALL setModificationDate( 190cdf0e10cSrcweir const css::util::DateTime & the_value) 191cdf0e10cSrcweir throw (css::uno::RuntimeException); 192cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getPrintedBy() 193cdf0e10cSrcweir throw (css::uno::RuntimeException); 194cdf0e10cSrcweir virtual void SAL_CALL setPrintedBy(const ::rtl::OUString & the_value) 195cdf0e10cSrcweir throw (css::uno::RuntimeException); 196cdf0e10cSrcweir virtual css::util::DateTime SAL_CALL getPrintDate() 197cdf0e10cSrcweir throw (css::uno::RuntimeException); 198cdf0e10cSrcweir virtual void SAL_CALL setPrintDate(const css::util::DateTime & the_value) 199cdf0e10cSrcweir throw (css::uno::RuntimeException); 200cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getTemplateName() 201cdf0e10cSrcweir throw (css::uno::RuntimeException); 202cdf0e10cSrcweir virtual void SAL_CALL setTemplateName(const ::rtl::OUString & the_value) 203cdf0e10cSrcweir throw (css::uno::RuntimeException); 204cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getTemplateURL() 205cdf0e10cSrcweir throw (css::uno::RuntimeException); 206cdf0e10cSrcweir virtual void SAL_CALL setTemplateURL(const ::rtl::OUString & the_value) 207cdf0e10cSrcweir throw (css::uno::RuntimeException); 208cdf0e10cSrcweir virtual css::util::DateTime SAL_CALL getTemplateDate() 209cdf0e10cSrcweir throw (css::uno::RuntimeException); 210cdf0e10cSrcweir virtual void SAL_CALL setTemplateDate(const css::util::DateTime & the_value) 211cdf0e10cSrcweir throw (css::uno::RuntimeException); 212cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getAutoloadURL() 213cdf0e10cSrcweir throw (css::uno::RuntimeException); 214cdf0e10cSrcweir virtual void SAL_CALL setAutoloadURL(const ::rtl::OUString & the_value) 215cdf0e10cSrcweir throw (css::uno::RuntimeException); 216cdf0e10cSrcweir virtual ::sal_Int32 SAL_CALL getAutoloadSecs() 217cdf0e10cSrcweir throw (css::uno::RuntimeException); 218cdf0e10cSrcweir virtual void SAL_CALL setAutoloadSecs(::sal_Int32 the_value) 219cdf0e10cSrcweir throw (css::uno::RuntimeException, css::lang::IllegalArgumentException); 220cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL getDefaultTarget() 221cdf0e10cSrcweir throw (css::uno::RuntimeException); 222cdf0e10cSrcweir virtual void SAL_CALL setDefaultTarget(const ::rtl::OUString & the_value) 223cdf0e10cSrcweir throw (css::uno::RuntimeException); 224cdf0e10cSrcweir virtual css::uno::Sequence< css::beans::NamedValue > SAL_CALL 225cdf0e10cSrcweir getDocumentStatistics() throw (css::uno::RuntimeException); 226cdf0e10cSrcweir virtual void SAL_CALL setDocumentStatistics( 227cdf0e10cSrcweir const css::uno::Sequence< css::beans::NamedValue > & the_value) 228cdf0e10cSrcweir throw (css::uno::RuntimeException); 229cdf0e10cSrcweir virtual ::sal_Int16 SAL_CALL getEditingCycles() 230cdf0e10cSrcweir throw (css::uno::RuntimeException); 231cdf0e10cSrcweir virtual void SAL_CALL setEditingCycles(::sal_Int16 the_value) 232cdf0e10cSrcweir throw (css::uno::RuntimeException, css::lang::IllegalArgumentException); 233cdf0e10cSrcweir virtual ::sal_Int32 SAL_CALL getEditingDuration() 234cdf0e10cSrcweir throw (css::uno::RuntimeException); 235cdf0e10cSrcweir virtual void SAL_CALL setEditingDuration(::sal_Int32 the_value) 236cdf0e10cSrcweir throw (css::uno::RuntimeException, css::lang::IllegalArgumentException); 237cdf0e10cSrcweir virtual void SAL_CALL resetUserData(const ::rtl::OUString & the_value) 238cdf0e10cSrcweir throw (css::uno::RuntimeException); 239cdf0e10cSrcweir virtual css::uno::Reference< css::beans::XPropertyContainer > SAL_CALL 240cdf0e10cSrcweir getUserDefinedProperties() throw (css::uno::RuntimeException); 241cdf0e10cSrcweir virtual void SAL_CALL loadFromStorage( 242cdf0e10cSrcweir const css::uno::Reference< css::embed::XStorage > & Storage, 243cdf0e10cSrcweir const css::uno::Sequence< css::beans::PropertyValue > & Medium) 244cdf0e10cSrcweir throw (css::uno::RuntimeException, css::lang::IllegalArgumentException, 245cdf0e10cSrcweir css::io::WrongFormatException, 246cdf0e10cSrcweir css::lang::WrappedTargetException, css::io::IOException); 247cdf0e10cSrcweir virtual void SAL_CALL loadFromMedium(const ::rtl::OUString & URL, 248cdf0e10cSrcweir const css::uno::Sequence< css::beans::PropertyValue > & Medium) 249cdf0e10cSrcweir throw (css::uno::RuntimeException, 250cdf0e10cSrcweir css::io::WrongFormatException, 251cdf0e10cSrcweir css::lang::WrappedTargetException, css::io::IOException); 252cdf0e10cSrcweir virtual void SAL_CALL storeToStorage( 253cdf0e10cSrcweir const css::uno::Reference< css::embed::XStorage > & Storage, 254cdf0e10cSrcweir const css::uno::Sequence< css::beans::PropertyValue > & Medium) 255cdf0e10cSrcweir throw (css::uno::RuntimeException, css::lang::IllegalArgumentException, 256cdf0e10cSrcweir css::lang::WrappedTargetException, css::io::IOException); 257cdf0e10cSrcweir virtual void SAL_CALL storeToMedium(const ::rtl::OUString & URL, 258cdf0e10cSrcweir const css::uno::Sequence< css::beans::PropertyValue > & Medium) 259cdf0e10cSrcweir throw (css::uno::RuntimeException, 260cdf0e10cSrcweir css::lang::WrappedTargetException, css::io::IOException); 261cdf0e10cSrcweir 262cdf0e10cSrcweir // ::com::sun::star::lang::XInitialization: 263cdf0e10cSrcweir virtual void SAL_CALL initialize( 264cdf0e10cSrcweir const css::uno::Sequence< css::uno::Any > & aArguments) 265cdf0e10cSrcweir throw (css::uno::RuntimeException, css::uno::Exception); 266cdf0e10cSrcweir 267cdf0e10cSrcweir // ::com::sun::star::util::XCloneable: 268cdf0e10cSrcweir virtual css::uno::Reference<css::util::XCloneable> SAL_CALL createClone() 269cdf0e10cSrcweir throw (css::uno::RuntimeException); 270cdf0e10cSrcweir 271cdf0e10cSrcweir // ::com::sun::star::util::XModifiable: 272cdf0e10cSrcweir virtual ::sal_Bool SAL_CALL isModified( ) 273cdf0e10cSrcweir throw (css::uno::RuntimeException); 274cdf0e10cSrcweir virtual void SAL_CALL setModified( ::sal_Bool bModified ) 275cdf0e10cSrcweir throw (css::beans::PropertyVetoException, css::uno::RuntimeException); 276cdf0e10cSrcweir 277cdf0e10cSrcweir // ::com::sun::star::util::XModifyBroadcaster: 278cdf0e10cSrcweir virtual void SAL_CALL addModifyListener( 279cdf0e10cSrcweir const css::uno::Reference< css::util::XModifyListener > & xListener) 280cdf0e10cSrcweir throw (css::uno::RuntimeException); 281cdf0e10cSrcweir virtual void SAL_CALL removeModifyListener( 282cdf0e10cSrcweir const css::uno::Reference< css::util::XModifyListener > & xListener) 283cdf0e10cSrcweir throw (css::uno::RuntimeException); 284cdf0e10cSrcweir 285cdf0e10cSrcweir // ::com::sun::star::xml::sax::XSAXSerializable 286cdf0e10cSrcweir virtual void SAL_CALL serialize( 287cdf0e10cSrcweir const css::uno::Reference<css::xml::sax::XDocumentHandler>& i_xHandler, 288cdf0e10cSrcweir const css::uno::Sequence< css::beans::StringPair >& i_rNamespaces) 289cdf0e10cSrcweir throw (css::uno::RuntimeException, css::xml::sax::SAXException); 290cdf0e10cSrcweir 291cdf0e10cSrcweir private: 292cdf0e10cSrcweir SfxDocumentMetaData(SfxDocumentMetaData &); // not defined 293cdf0e10cSrcweir SfxDocumentMetaData& operator =(SfxDocumentMetaData &); // not defined 294cdf0e10cSrcweir 295cdf0e10cSrcweir virtual ~SfxDocumentMetaData() {} 296cdf0e10cSrcweir 297cdf0e10cSrcweir const css::uno::Reference< css::uno::XComponentContext > m_xContext; 298cdf0e10cSrcweir 299cdf0e10cSrcweir /// for notification 300cdf0e10cSrcweir ::cppu::OInterfaceContainerHelper m_NotifyListeners; 301cdf0e10cSrcweir /// flag: false means not initialized yet, or disposed 302cdf0e10cSrcweir bool m_isInitialized; 303cdf0e10cSrcweir /// flag 304cdf0e10cSrcweir bool m_isModified; 305cdf0e10cSrcweir /// meta-data DOM tree 306cdf0e10cSrcweir css::uno::Reference< css::xml::dom::XDocument > m_xDoc; 307cdf0e10cSrcweir /// meta-data super node in the meta-data DOM tree 308cdf0e10cSrcweir css::uno::Reference< css::xml::dom::XNode> m_xParent; 309cdf0e10cSrcweir /// standard meta data (single occurrence) 310cdf0e10cSrcweir std::map< ::rtl::OUString, css::uno::Reference<css::xml::dom::XNode> > 311cdf0e10cSrcweir m_meta; 312cdf0e10cSrcweir /// standard meta data (multiple occurrences) 313cdf0e10cSrcweir std::map< ::rtl::OUString, 314cdf0e10cSrcweir std::vector<css::uno::Reference<css::xml::dom::XNode> > > m_metaList; 315cdf0e10cSrcweir /// user-defined meta data (meta:user-defined) @ATTENTION may be null! 316cdf0e10cSrcweir css::uno::Reference<css::beans::XPropertyContainer> m_xUserDefined; 317cdf0e10cSrcweir // now for some meta-data attributes; these are not updated directly in the 318cdf0e10cSrcweir // DOM because updates (detecting "empty" elements) would be quite messy 319cdf0e10cSrcweir ::rtl::OUString m_TemplateName; 320cdf0e10cSrcweir ::rtl::OUString m_TemplateURL; 321cdf0e10cSrcweir css::util::DateTime m_TemplateDate; 322cdf0e10cSrcweir ::rtl::OUString m_AutoloadURL; 323cdf0e10cSrcweir sal_Int32 m_AutoloadSecs; 324cdf0e10cSrcweir ::rtl::OUString m_DefaultTarget; 325cdf0e10cSrcweir 326cdf0e10cSrcweir /// check if we are initialized properly 327cdf0e10cSrcweir void SAL_CALL checkInit() const; 328cdf0e10cSrcweir // throw (css::uno::RuntimeException); 329cdf0e10cSrcweir /// initialize state from given DOM tree 330cdf0e10cSrcweir void SAL_CALL init(css::uno::Reference<css::xml::dom::XDocument> i_xDom); 331cdf0e10cSrcweir // throw (css::uno::RuntimeException, css::io::WrongFormatException, 332cdf0e10cSrcweir // css::uno::Exception); 333cdf0e10cSrcweir /// update element in DOM tree 334cdf0e10cSrcweir void SAL_CALL updateElement(const char *i_name, 335cdf0e10cSrcweir std::vector<std::pair<const char *, ::rtl::OUString> >* i_pAttrs = 0); 336cdf0e10cSrcweir /// update user-defined meta data and attributes in DOM tree 337cdf0e10cSrcweir void SAL_CALL updateUserDefinedAndAttributes(); 338cdf0e10cSrcweir /// create empty DOM tree (XDocument) 339cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XDocument> SAL_CALL createDOM() const; 340cdf0e10cSrcweir /// extract base URL (necessary for converting relative links) 341cdf0e10cSrcweir css::uno::Reference<css::beans::XPropertySet> SAL_CALL getURLProperties( 342cdf0e10cSrcweir const css::uno::Sequence<css::beans::PropertyValue> & i_rMedium) const; 343cdf0e10cSrcweir // throw (css::uno::RuntimeException); 344cdf0e10cSrcweir /// get text of standard meta data element 345cdf0e10cSrcweir ::rtl::OUString SAL_CALL getMetaText(const char* i_name) const; 346cdf0e10cSrcweir // throw (css::uno::RuntimeException); 347cdf0e10cSrcweir /// set text of standard meta data element iff not equal to existing text 348cdf0e10cSrcweir bool SAL_CALL setMetaText(const char* i_name, 349cdf0e10cSrcweir const ::rtl::OUString & i_rValue); 350cdf0e10cSrcweir // throw (css::uno::RuntimeException); 351cdf0e10cSrcweir /// set text of standard meta data element iff not equal to existing text 352cdf0e10cSrcweir void SAL_CALL setMetaTextAndNotify(const char* i_name, 353cdf0e10cSrcweir const ::rtl::OUString & i_rValue); 354cdf0e10cSrcweir // throw (css::uno::RuntimeException); 355cdf0e10cSrcweir /// get text of standard meta data element's attribute 356cdf0e10cSrcweir ::rtl::OUString SAL_CALL getMetaAttr(const char* i_name, 357cdf0e10cSrcweir const char* i_attr) const; 358cdf0e10cSrcweir // throw (css::uno::RuntimeException); 359cdf0e10cSrcweir /// get text of a list of standard meta data elements (multiple occ.) 360cdf0e10cSrcweir css::uno::Sequence< ::rtl::OUString > SAL_CALL getMetaList( 361cdf0e10cSrcweir const char* i_name) const; 362cdf0e10cSrcweir // throw (css::uno::RuntimeException); 363cdf0e10cSrcweir /// set text of a list of standard meta data elements (multiple occ.) 364cdf0e10cSrcweir bool SAL_CALL setMetaList(const char* i_name, 365cdf0e10cSrcweir const css::uno::Sequence< ::rtl::OUString > & i_rValue, 366cdf0e10cSrcweir AttrVector const* = 0); 367cdf0e10cSrcweir // throw (css::uno::RuntimeException); 368cdf0e10cSrcweir void createUserDefined(); 369cdf0e10cSrcweir }; 370cdf0e10cSrcweir 371cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////// 372cdf0e10cSrcweir 373cdf0e10cSrcweir bool operator== (const css::util::DateTime &i_rLeft, 374cdf0e10cSrcweir const css::util::DateTime &i_rRight) 375cdf0e10cSrcweir { 376cdf0e10cSrcweir return i_rLeft.Year == i_rRight.Year 377cdf0e10cSrcweir && i_rLeft.Month == i_rRight.Month 378cdf0e10cSrcweir && i_rLeft.Day == i_rRight.Day 379cdf0e10cSrcweir && i_rLeft.Hours == i_rRight.Hours 380cdf0e10cSrcweir && i_rLeft.Minutes == i_rRight.Minutes 381cdf0e10cSrcweir && i_rLeft.Seconds == i_rRight.Seconds 382cdf0e10cSrcweir && i_rLeft.HundredthSeconds == i_rRight.HundredthSeconds; 383cdf0e10cSrcweir } 384cdf0e10cSrcweir 385cdf0e10cSrcweir // NB: keep these two arrays in sync! 386cdf0e10cSrcweir const char* s_stdStatAttrs[] = { 387cdf0e10cSrcweir "meta:page-count", 388cdf0e10cSrcweir "meta:table-count", 389cdf0e10cSrcweir "meta:draw-count", 390cdf0e10cSrcweir "meta:image-count", 391cdf0e10cSrcweir "meta:object-count", 392cdf0e10cSrcweir "meta:ole-object-count", 393cdf0e10cSrcweir "meta:paragraph-count", 394cdf0e10cSrcweir "meta:word-count", 395cdf0e10cSrcweir "meta:character-count", 396cdf0e10cSrcweir "meta:row-count", 397cdf0e10cSrcweir "meta:frame-count", 398cdf0e10cSrcweir "meta:sentence-count", 399cdf0e10cSrcweir "meta:syllable-count", 400cdf0e10cSrcweir "meta:non-whitespace-character-count", 401cdf0e10cSrcweir "meta:cell-count", 402cdf0e10cSrcweir 0 403cdf0e10cSrcweir }; 404cdf0e10cSrcweir 405cdf0e10cSrcweir // NB: keep these two arrays in sync! 406cdf0e10cSrcweir const char* s_stdStats[] = { 407cdf0e10cSrcweir "PageCount", 408cdf0e10cSrcweir "TableCount", 409cdf0e10cSrcweir "DrawCount", 410cdf0e10cSrcweir "ImageCount", 411cdf0e10cSrcweir "ObjectCount", 412cdf0e10cSrcweir "OLEObjectCount", 413cdf0e10cSrcweir "ParagraphCount", 414cdf0e10cSrcweir "WordCount", 415cdf0e10cSrcweir "CharacterCount", 416cdf0e10cSrcweir "RowCount", 417cdf0e10cSrcweir "FrameCount", 418cdf0e10cSrcweir "SentenceCount", 419cdf0e10cSrcweir "SyllableCount", 420cdf0e10cSrcweir "NonWhitespaceCharacterCount", 421cdf0e10cSrcweir "CellCount", 422cdf0e10cSrcweir 0 423cdf0e10cSrcweir }; 424cdf0e10cSrcweir 425cdf0e10cSrcweir const char* s_stdMeta[] = { 426cdf0e10cSrcweir "meta:generator", // string 427cdf0e10cSrcweir "dc:title", // string 428cdf0e10cSrcweir "dc:description", // string 429cdf0e10cSrcweir "dc:subject", // string 430cdf0e10cSrcweir "meta:initial-creator", // string 431cdf0e10cSrcweir "dc:creator", // string 432cdf0e10cSrcweir "meta:printed-by", // string 433cdf0e10cSrcweir "meta:creation-date", // dateTime 434cdf0e10cSrcweir "dc:date", // dateTime 435cdf0e10cSrcweir "meta:print-date", // dateTime 436cdf0e10cSrcweir "meta:template", // XLink 437cdf0e10cSrcweir "meta:auto-reload", // ... 438cdf0e10cSrcweir "meta:hyperlink-behaviour", // ... 439cdf0e10cSrcweir "dc:language", // language 440cdf0e10cSrcweir "meta:editing-cycles", // nonNegativeInteger 441cdf0e10cSrcweir "meta:editing-duration", // duration 442cdf0e10cSrcweir "meta:document-statistic", // ... // note: statistic is singular, no s! 443cdf0e10cSrcweir 0 444cdf0e10cSrcweir }; 445cdf0e10cSrcweir 446cdf0e10cSrcweir const char* s_stdMetaList[] = { 447cdf0e10cSrcweir "meta:keyword", // string* 448cdf0e10cSrcweir "meta:user-defined", // ...* 449cdf0e10cSrcweir 0 450cdf0e10cSrcweir }; 451cdf0e10cSrcweir 452cdf0e10cSrcweir const char* s_nsXLink = "http://www.w3.org/1999/xlink"; 453cdf0e10cSrcweir const char* s_nsDC = "http://purl.org/dc/elements/1.1/"; 454cdf0e10cSrcweir const char* s_nsODF = "urn:oasis:names:tc:opendocument:xmlns:office:1.0"; 455cdf0e10cSrcweir const char* s_nsODFMeta = "urn:oasis:names:tc:opendocument:xmlns:meta:1.0"; 456cdf0e10cSrcweir // const char* s_nsOOo = "http://openoffice.org/2004/office"; // not used (yet?) 457cdf0e10cSrcweir 458cdf0e10cSrcweir const char* s_metaXml = "meta.xml"; 459cdf0e10cSrcweir 460cdf0e10cSrcweir 461cdf0e10cSrcweir bool isValidDate(const css::util::Date & i_rDate) 462cdf0e10cSrcweir { 463cdf0e10cSrcweir return i_rDate.Month > 0; 464cdf0e10cSrcweir } 465cdf0e10cSrcweir 466cdf0e10cSrcweir bool isValidDateTime(const css::util::DateTime & i_rDateTime) 467cdf0e10cSrcweir { 468cdf0e10cSrcweir return i_rDateTime.Month > 0; 469cdf0e10cSrcweir } 470cdf0e10cSrcweir 471cdf0e10cSrcweir std::pair< ::rtl::OUString, ::rtl::OUString > SAL_CALL 472cdf0e10cSrcweir getQualifier(const char* i_name) { 473cdf0e10cSrcweir ::rtl::OUString nm = ::rtl::OUString::createFromAscii(i_name); 474cdf0e10cSrcweir sal_Int32 ix = nm.indexOf(static_cast<sal_Unicode> (':')); 475cdf0e10cSrcweir if (ix == -1) { 476cdf0e10cSrcweir return std::make_pair(::rtl::OUString(), nm); 477cdf0e10cSrcweir } else { 478cdf0e10cSrcweir return std::make_pair(nm.copy(0,ix), nm.copy(ix+1)); 479cdf0e10cSrcweir } 480cdf0e10cSrcweir } 481cdf0e10cSrcweir 482cdf0e10cSrcweir // get namespace for standard qualified names 483cdf0e10cSrcweir // NB: only call this with statically known strings! 484cdf0e10cSrcweir ::rtl::OUString SAL_CALL getNameSpace(const char* i_qname) throw () 485cdf0e10cSrcweir { 486cdf0e10cSrcweir DBG_ASSERT(i_qname, "SfxDocumentMetaData: getNameSpace: argument is null"); 487cdf0e10cSrcweir const char * ns = ""; 488cdf0e10cSrcweir ::rtl::OUString n = getQualifier(i_qname).first; 489cdf0e10cSrcweir if (n.equalsAscii("xlink" )) ns = s_nsXLink; 490cdf0e10cSrcweir if (n.equalsAscii("dc" )) ns = s_nsDC; 491cdf0e10cSrcweir if (n.equalsAscii("office")) ns = s_nsODF; 492cdf0e10cSrcweir if (n.equalsAscii("meta" )) ns = s_nsODFMeta; 493cdf0e10cSrcweir DBG_ASSERT(*ns, "SfxDocumentMetaData: unknown namespace prefix"); 494cdf0e10cSrcweir return ::rtl::OUString::createFromAscii(ns); 495cdf0e10cSrcweir } 496cdf0e10cSrcweir 497cdf0e10cSrcweir bool SAL_CALL 498cdf0e10cSrcweir textToDateOrDateTime(css::util::Date & io_rd, css::util::DateTime & io_rdt, 499cdf0e10cSrcweir bool & o_rIsDateTime, ::rtl::OUString i_text) throw () 500cdf0e10cSrcweir { 501cdf0e10cSrcweir if (::sax::Converter::convertDateOrDateTime( 502cdf0e10cSrcweir io_rd, io_rdt, o_rIsDateTime, i_text)) { 503cdf0e10cSrcweir return true; 504cdf0e10cSrcweir } else { 505cdf0e10cSrcweir DBG_WARNING1("SfxDocumentMetaData: invalid date: %s", 506cdf0e10cSrcweir OUStringToOString(i_text, RTL_TEXTENCODING_UTF8).getStr()); 507cdf0e10cSrcweir return false; 508cdf0e10cSrcweir } 509cdf0e10cSrcweir } 510cdf0e10cSrcweir 511cdf0e10cSrcweir // convert string to date/time 512cdf0e10cSrcweir bool SAL_CALL 513cdf0e10cSrcweir textToDateTime(css::util::DateTime & io_rdt, ::rtl::OUString i_text) throw () 514cdf0e10cSrcweir { 515cdf0e10cSrcweir if (::sax::Converter::convertDateTime(io_rdt, i_text)) { 516cdf0e10cSrcweir return true; 517cdf0e10cSrcweir } else { 518cdf0e10cSrcweir DBG_WARNING1("SfxDocumentMetaData: invalid date: %s", 519cdf0e10cSrcweir OUStringToOString(i_text, RTL_TEXTENCODING_UTF8).getStr()); 520cdf0e10cSrcweir return false; 521cdf0e10cSrcweir } 522cdf0e10cSrcweir } 523cdf0e10cSrcweir 524cdf0e10cSrcweir // convert string to date/time with default return value 525cdf0e10cSrcweir css::util::DateTime SAL_CALL 526cdf0e10cSrcweir textToDateTimeDefault(::rtl::OUString i_text) throw () 527cdf0e10cSrcweir { 528cdf0e10cSrcweir css::util::DateTime dt; 529cdf0e10cSrcweir static_cast<void> (textToDateTime(dt, i_text)); 530cdf0e10cSrcweir // on conversion error: return default value (unchanged) 531cdf0e10cSrcweir return dt; 532cdf0e10cSrcweir } 533cdf0e10cSrcweir 534cdf0e10cSrcweir // convert date to string 535cdf0e10cSrcweir ::rtl::OUString SAL_CALL 536cdf0e10cSrcweir dateToText(css::util::Date const& i_rd) throw () 537cdf0e10cSrcweir { 538cdf0e10cSrcweir if (isValidDate(i_rd)) { 539cdf0e10cSrcweir ::rtl::OUStringBuffer buf; 540cdf0e10cSrcweir ::sax::Converter::convertDate(buf, i_rd); 541cdf0e10cSrcweir return buf.makeStringAndClear(); 542cdf0e10cSrcweir } else { 543cdf0e10cSrcweir return ::rtl::OUString(); 544cdf0e10cSrcweir } 545cdf0e10cSrcweir } 546cdf0e10cSrcweir 547cdf0e10cSrcweir 548cdf0e10cSrcweir // convert date/time to string 549cdf0e10cSrcweir ::rtl::OUString SAL_CALL 550cdf0e10cSrcweir dateTimeToText(css::util::DateTime const& i_rdt) throw () 551cdf0e10cSrcweir { 552cdf0e10cSrcweir if (isValidDateTime(i_rdt)) { 553cdf0e10cSrcweir ::rtl::OUStringBuffer buf; 554cdf0e10cSrcweir ::sax::Converter::convertDateTime(buf, i_rdt, true); 555cdf0e10cSrcweir return buf.makeStringAndClear(); 556cdf0e10cSrcweir } else { 557cdf0e10cSrcweir return ::rtl::OUString(); 558cdf0e10cSrcweir } 559cdf0e10cSrcweir } 560cdf0e10cSrcweir 561cdf0e10cSrcweir // convert string to duration 562cdf0e10cSrcweir bool 563cdf0e10cSrcweir textToDuration(css::util::Duration& io_rDur, ::rtl::OUString const& i_rText) 564cdf0e10cSrcweir throw () 565cdf0e10cSrcweir { 566cdf0e10cSrcweir if (::sax::Converter::convertDuration(io_rDur, i_rText)) { 567cdf0e10cSrcweir return true; 568cdf0e10cSrcweir } else { 569cdf0e10cSrcweir DBG_WARNING1("SfxDocumentMetaData: invalid duration: %s", 570cdf0e10cSrcweir OUStringToOString(i_rText, RTL_TEXTENCODING_UTF8).getStr()); 571cdf0e10cSrcweir return false; 572cdf0e10cSrcweir } 573cdf0e10cSrcweir } 574cdf0e10cSrcweir 575cdf0e10cSrcweir sal_Int32 textToDuration(::rtl::OUString const& i_rText) throw () 576cdf0e10cSrcweir { 577cdf0e10cSrcweir css::util::Duration d; 578cdf0e10cSrcweir if (textToDuration(d, i_rText)) { 579cdf0e10cSrcweir // #i107372#: approximate years/months 580cdf0e10cSrcweir const sal_Int32 days( (d.Years * 365) + (d.Months * 30) + d.Days ); 581cdf0e10cSrcweir return (days * (24*3600)) 582cdf0e10cSrcweir + (d.Hours * 3600) + (d.Minutes * 60) + d.Seconds; 583cdf0e10cSrcweir } else { 584cdf0e10cSrcweir return 0; // default 585cdf0e10cSrcweir } 586cdf0e10cSrcweir } 587cdf0e10cSrcweir 588cdf0e10cSrcweir // convert duration to string 589cdf0e10cSrcweir ::rtl::OUString durationToText(css::util::Duration const& i_rDur) throw () 590cdf0e10cSrcweir { 591cdf0e10cSrcweir ::rtl::OUStringBuffer buf; 592cdf0e10cSrcweir ::sax::Converter::convertDuration(buf, i_rDur); 593cdf0e10cSrcweir return buf.makeStringAndClear(); 594cdf0e10cSrcweir } 595cdf0e10cSrcweir 596cdf0e10cSrcweir // convert duration to string 597cdf0e10cSrcweir ::rtl::OUString SAL_CALL durationToText(sal_Int32 i_value) throw () 598cdf0e10cSrcweir { 599cdf0e10cSrcweir css::util::Duration ud; 600cdf0e10cSrcweir ud.Days = static_cast<sal_Int16>(i_value / (24 * 3600)); 601cdf0e10cSrcweir ud.Hours = static_cast<sal_Int16>((i_value % (24 * 3600)) / 3600); 602cdf0e10cSrcweir ud.Minutes = static_cast<sal_Int16>((i_value % 3600) / 60); 603cdf0e10cSrcweir ud.Seconds = static_cast<sal_Int16>(i_value % 60); 604cdf0e10cSrcweir ud.MilliSeconds = 0; 605cdf0e10cSrcweir return durationToText(ud); 606cdf0e10cSrcweir } 607cdf0e10cSrcweir 608cdf0e10cSrcweir // extract base URL (necessary for converting relative links) 609cdf0e10cSrcweir css::uno::Reference< css::beans::XPropertySet > SAL_CALL 610cdf0e10cSrcweir SfxDocumentMetaData::getURLProperties( 611cdf0e10cSrcweir const css::uno::Sequence< css::beans::PropertyValue > & i_rMedium) const 612cdf0e10cSrcweir { 613cdf0e10cSrcweir css::uno::Reference<css::lang::XMultiComponentFactory> xMsf ( 614cdf0e10cSrcweir m_xContext->getServiceManager()); 615cdf0e10cSrcweir css::uno::Reference< css::beans::XPropertyContainer> xPropArg( 616cdf0e10cSrcweir xMsf->createInstanceWithContext(::rtl::OUString::createFromAscii( 617cdf0e10cSrcweir "com.sun.star.beans.PropertyBag"), m_xContext), 618cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 619cdf0e10cSrcweir try { 620cdf0e10cSrcweir ::rtl::OUString dburl = 621cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DocumentBaseURL")); 622cdf0e10cSrcweir ::rtl::OUString hdn = 623cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HierarchicalDocumentName")); 624cdf0e10cSrcweir for (sal_Int32 i = 0; i < i_rMedium.getLength(); ++i) { 625cdf0e10cSrcweir if (i_rMedium[i].Name.equals(dburl)) { 626cdf0e10cSrcweir xPropArg->addProperty( 627cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BaseURI")), 628cdf0e10cSrcweir css::beans::PropertyAttribute::MAYBEVOID, 629cdf0e10cSrcweir i_rMedium[i].Value); 630cdf0e10cSrcweir } else if (i_rMedium[i].Name.equals(hdn)) { 631cdf0e10cSrcweir xPropArg->addProperty( 632cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StreamRelPath")), 633cdf0e10cSrcweir css::beans::PropertyAttribute::MAYBEVOID, 634cdf0e10cSrcweir i_rMedium[i].Value); 635cdf0e10cSrcweir } 636cdf0e10cSrcweir } 637cdf0e10cSrcweir xPropArg->addProperty(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StreamName")), 638cdf0e10cSrcweir css::beans::PropertyAttribute::MAYBEVOID, 639cdf0e10cSrcweir css::uno::makeAny(::rtl::OUString::createFromAscii(s_metaXml))); 640cdf0e10cSrcweir } catch (css::uno::Exception &) { 641cdf0e10cSrcweir // ignore 642cdf0e10cSrcweir } 643cdf0e10cSrcweir return css::uno::Reference< css::beans::XPropertySet>(xPropArg, 644cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 645cdf0e10cSrcweir } 646cdf0e10cSrcweir 647cdf0e10cSrcweir // return the text of the (hopefully unique, i.e., normalize first!) text 648cdf0e10cSrcweir // node _below_ the given node 649cdf0e10cSrcweir ::rtl::OUString SAL_CALL 650cdf0e10cSrcweir getNodeText(css::uno::Reference<css::xml::dom::XNode> i_xNode) 651cdf0e10cSrcweir throw (css::uno::RuntimeException) 652cdf0e10cSrcweir { 653cdf0e10cSrcweir if (!i_xNode.is()) throw css::uno::RuntimeException( 654cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 655cdf0e10cSrcweir "SfxDocumentMetaData::getNodeText: argument is null"), i_xNode); 656cdf0e10cSrcweir for (css::uno::Reference<css::xml::dom::XNode> c = i_xNode->getFirstChild(); 657cdf0e10cSrcweir c.is(); 658cdf0e10cSrcweir c = c->getNextSibling()) { 659cdf0e10cSrcweir if (c->getNodeType() == css::xml::dom::NodeType_TEXT_NODE) { 660cdf0e10cSrcweir try { 661cdf0e10cSrcweir return c->getNodeValue(); 662cdf0e10cSrcweir } catch (css::xml::dom::DOMException &) { // too big? 663cdf0e10cSrcweir return ::rtl::OUString(); 664cdf0e10cSrcweir } 665cdf0e10cSrcweir } 666cdf0e10cSrcweir } 667cdf0e10cSrcweir return ::rtl::OUString(); 668cdf0e10cSrcweir } 669cdf0e10cSrcweir 670cdf0e10cSrcweir ::rtl::OUString SAL_CALL 671cdf0e10cSrcweir SfxDocumentMetaData::getMetaText(const char* i_name) const 672cdf0e10cSrcweir // throw (css::uno::RuntimeException) 673cdf0e10cSrcweir { 674cdf0e10cSrcweir checkInit(); 675cdf0e10cSrcweir 676cdf0e10cSrcweir const ::rtl::OUString name( ::rtl::OUString::createFromAscii(i_name) ); 677cdf0e10cSrcweir DBG_ASSERT(m_meta.find(name) != m_meta.end(), 678cdf0e10cSrcweir "SfxDocumentMetaData::getMetaText: not found"); 679cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xNode = m_meta.find(name)->second; 680cdf0e10cSrcweir return (xNode.is()) ? getNodeText(xNode) : ::rtl::OUString(); 681cdf0e10cSrcweir } 682cdf0e10cSrcweir 683cdf0e10cSrcweir bool SAL_CALL 684cdf0e10cSrcweir SfxDocumentMetaData::setMetaText(const char* i_name, 685cdf0e10cSrcweir const ::rtl::OUString & i_rValue) 686cdf0e10cSrcweir // throw (css::uno::RuntimeException) 687cdf0e10cSrcweir { 688cdf0e10cSrcweir checkInit(); 689cdf0e10cSrcweir 690cdf0e10cSrcweir const ::rtl::OUString name( ::rtl::OUString::createFromAscii(i_name) ); 691cdf0e10cSrcweir DBG_ASSERT(m_meta.find(name) != m_meta.end(), 692cdf0e10cSrcweir "SfxDocumentMetaData::setMetaText: not found"); 693cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xNode = m_meta.find(name)->second; 694cdf0e10cSrcweir 695cdf0e10cSrcweir try { 696cdf0e10cSrcweir if (i_rValue.equalsAscii("")) { 697cdf0e10cSrcweir if (xNode.is()) { // delete 698cdf0e10cSrcweir m_xParent->removeChild(xNode); 699cdf0e10cSrcweir xNode.clear(); 700cdf0e10cSrcweir m_meta[name] = xNode; 701cdf0e10cSrcweir return true; 702cdf0e10cSrcweir } else { 703cdf0e10cSrcweir return false; 704cdf0e10cSrcweir } 705cdf0e10cSrcweir } else { 706cdf0e10cSrcweir if (xNode.is()) { // update 707cdf0e10cSrcweir for (css::uno::Reference<css::xml::dom::XNode> c = 708cdf0e10cSrcweir xNode->getFirstChild(); 709cdf0e10cSrcweir c.is(); 710cdf0e10cSrcweir c = c->getNextSibling()) { 711cdf0e10cSrcweir if (c->getNodeType() == css::xml::dom::NodeType_TEXT_NODE) { 712cdf0e10cSrcweir if (!c->getNodeValue().equals(i_rValue)) { 713cdf0e10cSrcweir c->setNodeValue(i_rValue); 714cdf0e10cSrcweir return true; 715cdf0e10cSrcweir } else { 716cdf0e10cSrcweir return false; 717cdf0e10cSrcweir } 718cdf0e10cSrcweir } 719cdf0e10cSrcweir } 720cdf0e10cSrcweir } else { // insert 721cdf0e10cSrcweir xNode.set(m_xDoc->createElementNS(getNameSpace(i_name), name), 722cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 723cdf0e10cSrcweir m_xParent->appendChild(xNode); 724cdf0e10cSrcweir m_meta[name] = xNode; 725cdf0e10cSrcweir } 726cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xTextNode( 727cdf0e10cSrcweir m_xDoc->createTextNode(i_rValue), css::uno::UNO_QUERY_THROW); 728cdf0e10cSrcweir xNode->appendChild(xTextNode); 729cdf0e10cSrcweir return true; 730cdf0e10cSrcweir } 731cdf0e10cSrcweir } catch (css::xml::dom::DOMException & e) { 732cdf0e10cSrcweir css::uno::Any a(e); 733cdf0e10cSrcweir throw css::lang::WrappedTargetRuntimeException( 734cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 735cdf0e10cSrcweir "SfxDocumentMetaData::setMetaText: DOM exception"), 736cdf0e10cSrcweir css::uno::Reference<css::uno::XInterface>(*this), a); 737cdf0e10cSrcweir } 738cdf0e10cSrcweir } 739cdf0e10cSrcweir 740cdf0e10cSrcweir void SAL_CALL 741cdf0e10cSrcweir SfxDocumentMetaData::setMetaTextAndNotify(const char* i_name, 742cdf0e10cSrcweir const ::rtl::OUString & i_rValue) 743cdf0e10cSrcweir // throw (css::uno::RuntimeException) 744cdf0e10cSrcweir { 745cdf0e10cSrcweir ::osl::ClearableMutexGuard g(m_aMutex); 746cdf0e10cSrcweir if (setMetaText(i_name, i_rValue)) { 747cdf0e10cSrcweir g.clear(); 748cdf0e10cSrcweir setModified(true); 749cdf0e10cSrcweir } 750cdf0e10cSrcweir } 751cdf0e10cSrcweir 752cdf0e10cSrcweir ::rtl::OUString SAL_CALL 753cdf0e10cSrcweir SfxDocumentMetaData::getMetaAttr(const char* i_name, const char* i_attr) const 754cdf0e10cSrcweir // throw (css::uno::RuntimeException) 755cdf0e10cSrcweir { 756cdf0e10cSrcweir // checkInit(); 757cdf0e10cSrcweir ::rtl::OUString name = ::rtl::OUString::createFromAscii(i_name); 758cdf0e10cSrcweir DBG_ASSERT(m_meta.find(name) != m_meta.end(), 759cdf0e10cSrcweir "SfxDocumentMetaData::getMetaAttr: not found"); 760cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xNode = m_meta.find(name)->second; 761cdf0e10cSrcweir if (xNode.is()) { 762cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XElement> xElem(xNode, 763cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 764cdf0e10cSrcweir return xElem->getAttributeNS(getNameSpace(i_attr), 765cdf0e10cSrcweir getQualifier(i_attr).second); 766cdf0e10cSrcweir } else { 767cdf0e10cSrcweir return ::rtl::OUString(); 768cdf0e10cSrcweir } 769cdf0e10cSrcweir } 770cdf0e10cSrcweir 771cdf0e10cSrcweir css::uno::Sequence< ::rtl::OUString> SAL_CALL 772cdf0e10cSrcweir SfxDocumentMetaData::getMetaList(const char* i_name) const 773cdf0e10cSrcweir // throw (css::uno::RuntimeException) 774cdf0e10cSrcweir { 775cdf0e10cSrcweir checkInit(); 776cdf0e10cSrcweir ::rtl::OUString name = ::rtl::OUString::createFromAscii(i_name); 777cdf0e10cSrcweir DBG_ASSERT(m_metaList.find(name) != m_metaList.end(), 778cdf0e10cSrcweir "SfxDocumentMetaData::getMetaList: not found"); 779cdf0e10cSrcweir std::vector<css::uno::Reference<css::xml::dom::XNode> > const & vec = 780cdf0e10cSrcweir m_metaList.find(name)->second; 781cdf0e10cSrcweir css::uno::Sequence< ::rtl::OUString> ret(vec.size()); 782cdf0e10cSrcweir for (size_t i = 0; i < vec.size(); ++i) { 783cdf0e10cSrcweir ret[i] = getNodeText(vec.at(i)); 784cdf0e10cSrcweir } 785cdf0e10cSrcweir return ret; 786cdf0e10cSrcweir } 787cdf0e10cSrcweir 788cdf0e10cSrcweir bool SAL_CALL 789cdf0e10cSrcweir SfxDocumentMetaData::setMetaList(const char* i_name, 790cdf0e10cSrcweir const css::uno::Sequence< ::rtl::OUString> & i_rValue, 791cdf0e10cSrcweir AttrVector const* i_pAttrs) 792cdf0e10cSrcweir // throw (css::uno::RuntimeException) 793cdf0e10cSrcweir { 794cdf0e10cSrcweir checkInit(); 795cdf0e10cSrcweir DBG_ASSERT((i_pAttrs == 0) || 796cdf0e10cSrcweir (static_cast<size_t>(i_rValue.getLength()) == i_pAttrs->size()), 797cdf0e10cSrcweir "SfxDocumentMetaData::setMetaList: invalid args"); 798cdf0e10cSrcweir 799cdf0e10cSrcweir try { 800cdf0e10cSrcweir ::rtl::OUString name = ::rtl::OUString::createFromAscii(i_name); 801cdf0e10cSrcweir DBG_ASSERT(m_metaList.find(name) != m_metaList.end(), 802cdf0e10cSrcweir "SfxDocumentMetaData::setMetaList: not found"); 803cdf0e10cSrcweir std::vector<css::uno::Reference<css::xml::dom::XNode> > & vec = 804cdf0e10cSrcweir m_metaList[name]; 805cdf0e10cSrcweir 806cdf0e10cSrcweir // if nothing changed, do nothing 807cdf0e10cSrcweir // alas, this does not check for permutations, or attributes... 808cdf0e10cSrcweir if ((0 == i_pAttrs)) { 809cdf0e10cSrcweir if (static_cast<size_t>(i_rValue.getLength()) == vec.size()) { 810cdf0e10cSrcweir bool isEqual(true); 811cdf0e10cSrcweir for (sal_Int32 i = 0; i < i_rValue.getLength(); ++i) { 812cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xNode(vec.at(i)); 813cdf0e10cSrcweir if (xNode.is()) { 814cdf0e10cSrcweir ::rtl::OUString val = getNodeText(xNode); 815cdf0e10cSrcweir if (!val.equals(i_rValue[i])) { 816cdf0e10cSrcweir isEqual = false; 817cdf0e10cSrcweir break; 818cdf0e10cSrcweir } 819cdf0e10cSrcweir } 820cdf0e10cSrcweir } 821cdf0e10cSrcweir if (isEqual) return false; 822cdf0e10cSrcweir } 823cdf0e10cSrcweir } 824cdf0e10cSrcweir 825cdf0e10cSrcweir // remove old meta data nodes 826cdf0e10cSrcweir { 827cdf0e10cSrcweir std::vector<css::uno::Reference<css::xml::dom::XNode> > 828cdf0e10cSrcweir ::reverse_iterator it(vec.rbegin()); 829cdf0e10cSrcweir try { 830cdf0e10cSrcweir for ( ;it != vec.rend(); ++it) 831cdf0e10cSrcweir { 832cdf0e10cSrcweir m_xParent->removeChild(*it); 833cdf0e10cSrcweir } 834cdf0e10cSrcweir } 835cdf0e10cSrcweir catch (...) 836cdf0e10cSrcweir { 837cdf0e10cSrcweir // Clean up already removed nodes 838cdf0e10cSrcweir vec.erase(it.base(), vec.end()); 839cdf0e10cSrcweir throw; 840cdf0e10cSrcweir } 841cdf0e10cSrcweir vec.clear(); 842cdf0e10cSrcweir } 843cdf0e10cSrcweir 844cdf0e10cSrcweir // insert new meta data nodes into DOM tree 845cdf0e10cSrcweir for (sal_Int32 i = 0; i < i_rValue.getLength(); ++i) { 846cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XElement> xElem( 847cdf0e10cSrcweir m_xDoc->createElementNS(getNameSpace(i_name), name), 848cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 849cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xNode(xElem, 850cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 851cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xTextNode( 852cdf0e10cSrcweir m_xDoc->createTextNode(i_rValue[i]), css::uno::UNO_QUERY_THROW); 853cdf0e10cSrcweir // set attributes 854cdf0e10cSrcweir if (i_pAttrs != 0) { 855cdf0e10cSrcweir for (std::vector<std::pair<const char*, ::rtl::OUString> > 856cdf0e10cSrcweir ::const_iterator it = (*i_pAttrs)[i].begin(); 857cdf0e10cSrcweir it != (*i_pAttrs)[i].end(); ++it) { 858cdf0e10cSrcweir xElem->setAttributeNS(getNameSpace(it->first), 859cdf0e10cSrcweir ::rtl::OUString::createFromAscii(it->first), 860cdf0e10cSrcweir it->second); 861cdf0e10cSrcweir } 862cdf0e10cSrcweir } 863cdf0e10cSrcweir xNode->appendChild(xTextNode); 864cdf0e10cSrcweir m_xParent->appendChild(xNode); 865cdf0e10cSrcweir vec.push_back(xNode); 866cdf0e10cSrcweir } 867cdf0e10cSrcweir 868cdf0e10cSrcweir return true; 869cdf0e10cSrcweir } catch (css::xml::dom::DOMException & e) { 870cdf0e10cSrcweir css::uno::Any a(e); 871cdf0e10cSrcweir throw css::lang::WrappedTargetRuntimeException( 872cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 873cdf0e10cSrcweir "SfxDocumentMetaData::setMetaList: DOM exception"), 874cdf0e10cSrcweir css::uno::Reference<css::uno::XInterface>(*this), a); 875cdf0e10cSrcweir } 876cdf0e10cSrcweir } 877cdf0e10cSrcweir 878cdf0e10cSrcweir // convert property list to string list and attribute list 879cdf0e10cSrcweir std::pair<css::uno::Sequence< ::rtl::OUString>, AttrVector> SAL_CALL 880cdf0e10cSrcweir propsToStrings(css::uno::Reference<css::beans::XPropertySet> const & i_xPropSet) 881cdf0e10cSrcweir { 882cdf0e10cSrcweir ::comphelper::SequenceAsVector< ::rtl::OUString > values; 883cdf0e10cSrcweir AttrVector attrs; 884cdf0e10cSrcweir 885cdf0e10cSrcweir css::uno::Reference<css::beans::XPropertySetInfo> xSetInfo 886cdf0e10cSrcweir = i_xPropSet->getPropertySetInfo(); 887cdf0e10cSrcweir css::uno::Sequence<css::beans::Property> props = xSetInfo->getProperties(); 888cdf0e10cSrcweir 889cdf0e10cSrcweir for (sal_Int32 i = 0; i < props.getLength(); ++i) { 890cdf0e10cSrcweir if (props[i].Attributes & css::beans::PropertyAttribute::TRANSIENT) { 891cdf0e10cSrcweir continue; 892cdf0e10cSrcweir } 893cdf0e10cSrcweir const ::rtl::OUString name = props[i].Name; 894cdf0e10cSrcweir css::uno::Any any; 895cdf0e10cSrcweir try { 896cdf0e10cSrcweir any = i_xPropSet->getPropertyValue(name); 897cdf0e10cSrcweir } catch (css::uno::Exception &) { 898cdf0e10cSrcweir // ignore 899cdf0e10cSrcweir } 900cdf0e10cSrcweir const css::uno::Type & type = any.getValueType(); 901cdf0e10cSrcweir std::vector<std::pair<const char*, ::rtl::OUString> > as; 902cdf0e10cSrcweir as.push_back(std::make_pair(static_cast<const char*>("meta:name"), 903cdf0e10cSrcweir name)); 904cdf0e10cSrcweir const char* vt = "meta:value-type"; 905cdf0e10cSrcweir 906cdf0e10cSrcweir // convert according to type 907cdf0e10cSrcweir if (type == ::cppu::UnoType<bool>::get()) { 908cdf0e10cSrcweir bool b = false; 909cdf0e10cSrcweir any >>= b; 910cdf0e10cSrcweir ::rtl::OUStringBuffer buf; 911cdf0e10cSrcweir ::sax::Converter::convertBool(buf, b); 912cdf0e10cSrcweir values.push_back(buf.makeStringAndClear()); 913cdf0e10cSrcweir as.push_back(std::make_pair(vt, 914cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("boolean")))); 915cdf0e10cSrcweir } else if (type == ::cppu::UnoType< ::rtl::OUString>::get()) { 916cdf0e10cSrcweir ::rtl::OUString s; 917cdf0e10cSrcweir any >>= s; 918cdf0e10cSrcweir values.push_back(s); 919cdf0e10cSrcweir // #i90847# OOo 2.x does stupid things if value-type="string"; 920cdf0e10cSrcweir // fortunately string is default anyway, so we can just omit it 921cdf0e10cSrcweir // #i107502#: however, OOo 2.x only reads 4 user-defined without @value-type 922cdf0e10cSrcweir // => best backward compatibility: first 4 without @value-type, rest with 923cdf0e10cSrcweir if (4 <= i) 924cdf0e10cSrcweir { 925cdf0e10cSrcweir as.push_back(std::make_pair(vt, 926cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("string")))); 927cdf0e10cSrcweir } 928cdf0e10cSrcweir } else if (type == ::cppu::UnoType<css::util::DateTime>::get()) { 929cdf0e10cSrcweir css::util::DateTime dt; 930cdf0e10cSrcweir any >>= dt; 931cdf0e10cSrcweir values.push_back(dateTimeToText(dt)); 932cdf0e10cSrcweir as.push_back(std::make_pair(vt, 933cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("date")))); 934cdf0e10cSrcweir } else if (type == ::cppu::UnoType<css::util::Date>::get()) { 935cdf0e10cSrcweir css::util::Date d; 936cdf0e10cSrcweir any >>= d; 937cdf0e10cSrcweir values.push_back(dateToText(d)); 938cdf0e10cSrcweir as.push_back(std::make_pair(vt, 939cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("date")))); 940cdf0e10cSrcweir } else if (type == ::cppu::UnoType<css::util::Time>::get()) { 941cdf0e10cSrcweir // #i97029#: replaced by Duration 942cdf0e10cSrcweir // Time is supported for backward compatibility with OOo 3.x, x<=2 943cdf0e10cSrcweir css::util::Time ut; 944cdf0e10cSrcweir any >>= ut; 945cdf0e10cSrcweir css::util::Duration ud; 946cdf0e10cSrcweir ud.Hours = ut.Hours; 947cdf0e10cSrcweir ud.Minutes = ut.Minutes; 948cdf0e10cSrcweir ud.Seconds = ut.Seconds; 949cdf0e10cSrcweir ud.MilliSeconds = 10 * ut.HundredthSeconds; 950cdf0e10cSrcweir values.push_back(durationToText(ud)); 951cdf0e10cSrcweir as.push_back(std::make_pair(vt, 952cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("time")))); 953cdf0e10cSrcweir } else if (type == ::cppu::UnoType<css::util::Duration>::get()) { 954cdf0e10cSrcweir css::util::Duration ud; 955cdf0e10cSrcweir any >>= ud; 956cdf0e10cSrcweir values.push_back(durationToText(ud)); 957cdf0e10cSrcweir as.push_back(std::make_pair(vt, 958cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("time")))); 959cdf0e10cSrcweir } else if (::cppu::UnoType<double>::get().isAssignableFrom(type)) { 960cdf0e10cSrcweir // support not just double, but anything that can be converted 961cdf0e10cSrcweir double d = 0; 962cdf0e10cSrcweir any >>= d; 963cdf0e10cSrcweir ::rtl::OUStringBuffer buf; 964cdf0e10cSrcweir ::sax::Converter::convertDouble(buf, d); 965cdf0e10cSrcweir values.push_back(buf.makeStringAndClear()); 966cdf0e10cSrcweir as.push_back(std::make_pair(vt, 967cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("float")))); 968cdf0e10cSrcweir } else { 969cdf0e10cSrcweir DBG_WARNING1("SfxDocumentMetaData: unsupported property type: %s", 970cdf0e10cSrcweir OUStringToOString(any.getValueTypeName(), 971cdf0e10cSrcweir RTL_TEXTENCODING_UTF8).getStr()); 972cdf0e10cSrcweir continue; 973cdf0e10cSrcweir } 974cdf0e10cSrcweir attrs.push_back(as); 975cdf0e10cSrcweir } 976cdf0e10cSrcweir 977cdf0e10cSrcweir return std::make_pair(values.getAsConstList(), attrs); 978cdf0e10cSrcweir } 979cdf0e10cSrcweir 980cdf0e10cSrcweir // remove the given element from the DOM, and iff i_pAttrs != 0 insert new one 981cdf0e10cSrcweir void SAL_CALL 982cdf0e10cSrcweir SfxDocumentMetaData::updateElement(const char *i_name, 983cdf0e10cSrcweir std::vector<std::pair<const char *, ::rtl::OUString> >* i_pAttrs) 984cdf0e10cSrcweir { 985cdf0e10cSrcweir ::rtl::OUString name = ::rtl::OUString::createFromAscii(i_name); 986cdf0e10cSrcweir try { 987cdf0e10cSrcweir // remove old element 988cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xNode = 989cdf0e10cSrcweir m_meta.find(name)->second; 990cdf0e10cSrcweir if (xNode.is()) { 991cdf0e10cSrcweir m_xParent->removeChild(xNode); 992cdf0e10cSrcweir xNode.clear(); 993cdf0e10cSrcweir } 994cdf0e10cSrcweir // add new element 995cdf0e10cSrcweir if (0 != i_pAttrs) { 996cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XElement> xElem( 997cdf0e10cSrcweir m_xDoc->createElementNS(getNameSpace(i_name), name), 998cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 999cdf0e10cSrcweir xNode.set(xElem, css::uno::UNO_QUERY_THROW); 1000cdf0e10cSrcweir // set attributes 1001cdf0e10cSrcweir for (std::vector<std::pair<const char *, ::rtl::OUString> > 1002cdf0e10cSrcweir ::const_iterator it = i_pAttrs->begin(); 1003cdf0e10cSrcweir it != i_pAttrs->end(); ++it) { 1004cdf0e10cSrcweir xElem->setAttributeNS(getNameSpace(it->first), 1005cdf0e10cSrcweir ::rtl::OUString::createFromAscii(it->first), it->second); 1006cdf0e10cSrcweir } 1007cdf0e10cSrcweir m_xParent->appendChild(xNode); 1008cdf0e10cSrcweir } 1009cdf0e10cSrcweir m_meta[name] = xNode; 1010cdf0e10cSrcweir } catch (css::xml::dom::DOMException & e) { 1011cdf0e10cSrcweir css::uno::Any a(e); 1012cdf0e10cSrcweir throw css::lang::WrappedTargetRuntimeException( 1013cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 1014cdf0e10cSrcweir "SfxDocumentMetaData::updateElement: DOM exception"), 1015cdf0e10cSrcweir css::uno::Reference<css::uno::XInterface>(*this), a); 1016cdf0e10cSrcweir } 1017cdf0e10cSrcweir } 1018cdf0e10cSrcweir 1019cdf0e10cSrcweir // update user-defined meta data in DOM tree 1020cdf0e10cSrcweir void SAL_CALL SfxDocumentMetaData::updateUserDefinedAndAttributes() 1021cdf0e10cSrcweir { 1022cdf0e10cSrcweir createUserDefined(); 1023cdf0e10cSrcweir const css::uno::Reference<css::beans::XPropertySet> xPSet(m_xUserDefined, 1024cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 1025cdf0e10cSrcweir const std::pair<css::uno::Sequence< ::rtl::OUString>, AttrVector> 1026cdf0e10cSrcweir udStringsAttrs( propsToStrings(xPSet) ); 1027cdf0e10cSrcweir (void) setMetaList("meta:user-defined", udStringsAttrs.first, 1028cdf0e10cSrcweir &udStringsAttrs.second); 1029cdf0e10cSrcweir 1030cdf0e10cSrcweir // update elements with attributes 1031cdf0e10cSrcweir std::vector<std::pair<const char *, ::rtl::OUString> > attributes; 1032cdf0e10cSrcweir if (!m_TemplateName.equalsAscii("") || !m_TemplateURL.equalsAscii("") 1033cdf0e10cSrcweir || isValidDateTime(m_TemplateDate)) { 1034cdf0e10cSrcweir attributes.push_back(std::make_pair( 1035cdf0e10cSrcweir static_cast<const char*>("xlink:type"), 1036cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("simple")))); 1037cdf0e10cSrcweir attributes.push_back(std::make_pair( 1038cdf0e10cSrcweir static_cast<const char*>("xlink:actuate"), 1039cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("onRequest")))); 1040cdf0e10cSrcweir attributes.push_back(std::make_pair( 1041cdf0e10cSrcweir static_cast<const char*>("xlink:title"), m_TemplateName)); 1042cdf0e10cSrcweir attributes.push_back(std::make_pair( 1043cdf0e10cSrcweir static_cast<const char*>("xlink:href" ), m_TemplateURL )); 1044cdf0e10cSrcweir if (isValidDateTime(m_TemplateDate)) { 1045cdf0e10cSrcweir attributes.push_back(std::make_pair( 1046cdf0e10cSrcweir static_cast<const char*>("meta:date" ), 1047cdf0e10cSrcweir dateTimeToText(m_TemplateDate))); 1048cdf0e10cSrcweir } 1049cdf0e10cSrcweir updateElement("meta:template", &attributes); 1050cdf0e10cSrcweir } else { 1051cdf0e10cSrcweir updateElement("meta:template"); 1052cdf0e10cSrcweir } 1053cdf0e10cSrcweir attributes.clear(); 1054cdf0e10cSrcweir 1055cdf0e10cSrcweir if (!m_AutoloadURL.equalsAscii("") || (0 != m_AutoloadSecs)) { 1056cdf0e10cSrcweir attributes.push_back(std::make_pair( 1057cdf0e10cSrcweir static_cast<const char*>("xlink:href" ), m_AutoloadURL )); 1058cdf0e10cSrcweir attributes.push_back(std::make_pair( 1059cdf0e10cSrcweir static_cast<const char*>("meta:delay" ), 1060cdf0e10cSrcweir durationToText(m_AutoloadSecs))); 1061cdf0e10cSrcweir updateElement("meta:auto-reload", &attributes); 1062cdf0e10cSrcweir } else { 1063cdf0e10cSrcweir updateElement("meta:auto-reload"); 1064cdf0e10cSrcweir } 1065cdf0e10cSrcweir attributes.clear(); 1066cdf0e10cSrcweir 1067cdf0e10cSrcweir if (!m_DefaultTarget.equalsAscii("")) { 1068cdf0e10cSrcweir attributes.push_back(std::make_pair( 1069cdf0e10cSrcweir static_cast<const char*>("office:target-frame-name"), 1070cdf0e10cSrcweir m_DefaultTarget)); 1071cdf0e10cSrcweir // xlink:show: _blank -> new, any other value -> replace 1072cdf0e10cSrcweir const sal_Char* show = m_DefaultTarget.equalsAscii("_blank") 1073cdf0e10cSrcweir ? "new" : "replace"; 1074cdf0e10cSrcweir attributes.push_back(std::make_pair( 1075cdf0e10cSrcweir static_cast<const char*>("xlink:show"), 1076cdf0e10cSrcweir ::rtl::OUString::createFromAscii(show))); 1077cdf0e10cSrcweir updateElement("meta:hyperlink-behaviour", &attributes); 1078cdf0e10cSrcweir } else { 1079cdf0e10cSrcweir updateElement("meta:hyperlink-behaviour"); 1080cdf0e10cSrcweir } 1081cdf0e10cSrcweir attributes.clear(); 1082cdf0e10cSrcweir } 1083cdf0e10cSrcweir 1084cdf0e10cSrcweir // create empty DOM tree (XDocument) 1085cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XDocument> SAL_CALL 1086cdf0e10cSrcweir SfxDocumentMetaData::createDOM() const // throw (css::uno::RuntimeException) 1087cdf0e10cSrcweir { 1088cdf0e10cSrcweir css::uno::Reference<css::lang::XMultiComponentFactory> xMsf ( 1089cdf0e10cSrcweir m_xContext->getServiceManager()); 1090cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XDocumentBuilder> xBuilder( 1091cdf0e10cSrcweir xMsf->createInstanceWithContext(::rtl::OUString::createFromAscii( 1092cdf0e10cSrcweir "com.sun.star.xml.dom.DocumentBuilder"), m_xContext), 1093cdf0e10cSrcweir css::uno::UNO_QUERY_THROW ); 1094cdf0e10cSrcweir if (!xBuilder.is()) throw css::uno::RuntimeException( 1095cdf0e10cSrcweir ::rtl::OUString::createFromAscii("SfxDocumentMetaData::createDOM: " 1096cdf0e10cSrcweir "cannot create DocumentBuilder service"), 1097cdf0e10cSrcweir *const_cast<SfxDocumentMetaData*>(this)); 1098cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XDocument> xDoc = 1099cdf0e10cSrcweir xBuilder->newDocument(); 1100cdf0e10cSrcweir if (!xDoc.is()) throw css::uno::RuntimeException( 1101cdf0e10cSrcweir ::rtl::OUString::createFromAscii("SfxDocumentMetaData::createDOM: " 1102cdf0e10cSrcweir "cannot create new document"), 1103cdf0e10cSrcweir *const_cast<SfxDocumentMetaData*>(this)); 1104cdf0e10cSrcweir return xDoc; 1105cdf0e10cSrcweir } 1106cdf0e10cSrcweir 1107cdf0e10cSrcweir void SAL_CALL 1108cdf0e10cSrcweir SfxDocumentMetaData::checkInit() const // throw (css::uno::RuntimeException) 1109cdf0e10cSrcweir { 1110cdf0e10cSrcweir if (!m_isInitialized) { 1111cdf0e10cSrcweir throw css::uno::RuntimeException(::rtl::OUString::createFromAscii( 1112cdf0e10cSrcweir "SfxDocumentMetaData::checkInit: not initialized"), 1113cdf0e10cSrcweir *const_cast<SfxDocumentMetaData*>(this)); 1114cdf0e10cSrcweir } 1115cdf0e10cSrcweir DBG_ASSERT((m_xDoc.is() && m_xParent.is() ), 1116cdf0e10cSrcweir "SfxDocumentMetaData::checkInit: reference is null"); 1117cdf0e10cSrcweir } 1118cdf0e10cSrcweir 1119cdf0e10cSrcweir // initialize state from DOM tree 1120cdf0e10cSrcweir void SAL_CALL SfxDocumentMetaData::init( 1121cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XDocument> i_xDoc) 1122cdf0e10cSrcweir // throw (css::uno::RuntimeException, css::io::WrongFormatException, 1123cdf0e10cSrcweir // css::uno::Exception) 1124cdf0e10cSrcweir { 1125cdf0e10cSrcweir if (!i_xDoc.is()) throw css::uno::RuntimeException( 1126cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 1127cdf0e10cSrcweir "SfxDocumentMetaData::init: no DOM tree given"), *this); 1128cdf0e10cSrcweir 1129cdf0e10cSrcweir css::uno::Reference<css::lang::XMultiComponentFactory> xMsf ( 1130cdf0e10cSrcweir m_xContext->getServiceManager()); 1131cdf0e10cSrcweir css::uno::Reference<css::xml::xpath::XXPathAPI> xPath( 1132cdf0e10cSrcweir xMsf->createInstanceWithContext(::rtl::OUString::createFromAscii( 1133cdf0e10cSrcweir "com.sun.star.xml.xpath.XPathAPI"), m_xContext), 1134cdf0e10cSrcweir css::uno::UNO_QUERY_THROW ); 1135cdf0e10cSrcweir if (!xPath.is()) throw css::uno::RuntimeException( 1136cdf0e10cSrcweir ::rtl::OUString::createFromAscii("SfxDocumentMetaData::init:" 1137cdf0e10cSrcweir " cannot create XPathAPI service"), *this); 1138cdf0e10cSrcweir 1139cdf0e10cSrcweir m_isInitialized = false; 1140cdf0e10cSrcweir m_xDoc = i_xDoc; 1141cdf0e10cSrcweir 1142cdf0e10cSrcweir // select nodes for standard meta data stuff 1143cdf0e10cSrcweir xPath->registerNS(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("xlink")), 1144cdf0e10cSrcweir ::rtl::OUString::createFromAscii(s_nsXLink)); 1145cdf0e10cSrcweir xPath->registerNS(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("dc")), 1146cdf0e10cSrcweir ::rtl::OUString::createFromAscii(s_nsDC)); 1147cdf0e10cSrcweir xPath->registerNS(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("office")), 1148cdf0e10cSrcweir ::rtl::OUString::createFromAscii(s_nsODF)); 1149cdf0e10cSrcweir xPath->registerNS(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("meta")), 1150cdf0e10cSrcweir ::rtl::OUString::createFromAscii(s_nsODFMeta)); 1151cdf0e10cSrcweir // NB: we do not handle the single-XML-file ODF variant, which would 1152cdf0e10cSrcweir // have the root element office:document. 1153cdf0e10cSrcweir // The root of such documents must be converted in the importer! 1154cdf0e10cSrcweir ::rtl::OUString prefix = ::rtl::OUString::createFromAscii( 1155cdf0e10cSrcweir "/child::office:document-meta/child::office:meta"); 1156cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xDocNode( 1157cdf0e10cSrcweir m_xDoc, css::uno::UNO_QUERY_THROW); 1158cdf0e10cSrcweir m_xParent.clear(); 1159cdf0e10cSrcweir try { 1160cdf0e10cSrcweir m_xParent = xPath->selectSingleNode(xDocNode, prefix); 1161cdf0e10cSrcweir } catch (com::sun::star::uno::Exception &) { 1162cdf0e10cSrcweir // DBG_WARNING("SfxDocumentMetaData::init: " 1163cdf0e10cSrcweir // "caught RuntimeException from libxml!"); 1164cdf0e10cSrcweir } 1165cdf0e10cSrcweir 1166cdf0e10cSrcweir if (!m_xParent.is()) { 1167cdf0e10cSrcweir // all this create/append stuff may throw DOMException 1168cdf0e10cSrcweir try { 1169cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XElement> xRElem; 1170cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xNode( 1171cdf0e10cSrcweir i_xDoc->getFirstChild()); 1172cdf0e10cSrcweir while (xNode.is()) { 1173cdf0e10cSrcweir if (css::xml::dom::NodeType_ELEMENT_NODE ==xNode->getNodeType()) 1174cdf0e10cSrcweir { 1175cdf0e10cSrcweir if (xNode->getNamespaceURI().equalsAscii(s_nsODF) && 1176cdf0e10cSrcweir xNode->getLocalName().equalsAscii("document-meta")) 1177cdf0e10cSrcweir { 1178cdf0e10cSrcweir xRElem.set(xNode, css::uno::UNO_QUERY_THROW); 1179cdf0e10cSrcweir break; 1180cdf0e10cSrcweir } 1181cdf0e10cSrcweir else 1182cdf0e10cSrcweir { 1183cdf0e10cSrcweir OSL_TRACE("SfxDocumentMetaData::init(): " 1184cdf0e10cSrcweir "deleting unexpected root element: %s", 1185cdf0e10cSrcweir ::rtl::OUStringToOString(xNode->getLocalName(), 1186cdf0e10cSrcweir RTL_TEXTENCODING_UTF8).getStr()); 1187cdf0e10cSrcweir i_xDoc->removeChild(xNode); 1188cdf0e10cSrcweir xNode = i_xDoc->getFirstChild(); // start over 1189cdf0e10cSrcweir } 1190cdf0e10cSrcweir } else { 1191cdf0e10cSrcweir xNode = xNode->getNextSibling(); 1192cdf0e10cSrcweir } 1193cdf0e10cSrcweir } 1194cdf0e10cSrcweir if (!xRElem.is()) { 1195cdf0e10cSrcweir xRElem = i_xDoc->createElementNS( 1196cdf0e10cSrcweir ::rtl::OUString::createFromAscii(s_nsODF), 1197cdf0e10cSrcweir ::rtl::OUString::createFromAscii("office:document-meta")); 1198cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xRNode(xRElem, 1199cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 1200cdf0e10cSrcweir i_xDoc->appendChild(xRNode); 1201cdf0e10cSrcweir } 1202cdf0e10cSrcweir xRElem->setAttributeNS(::rtl::OUString::createFromAscii(s_nsODF), 1203cdf0e10cSrcweir ::rtl::OUString::createFromAscii("office:version"), 1204cdf0e10cSrcweir ::rtl::OUString::createFromAscii("1.0")); 1205cdf0e10cSrcweir // does not exist, otherwise m_xParent would not be null 1206cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xParent ( 1207cdf0e10cSrcweir i_xDoc->createElementNS( 1208cdf0e10cSrcweir ::rtl::OUString::createFromAscii(s_nsODF), 1209cdf0e10cSrcweir ::rtl::OUString::createFromAscii("office:meta")), 1210cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 1211cdf0e10cSrcweir xRElem->appendChild(xParent); 1212cdf0e10cSrcweir m_xParent = xParent; 1213cdf0e10cSrcweir } catch (css::xml::dom::DOMException & e) { 1214cdf0e10cSrcweir css::uno::Any a(e); 1215cdf0e10cSrcweir throw css::lang::WrappedTargetRuntimeException( 1216cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 1217cdf0e10cSrcweir "SfxDocumentMetaData::init: DOM exception"), 1218cdf0e10cSrcweir css::uno::Reference<css::uno::XInterface>(*this), a); 1219cdf0e10cSrcweir } 1220cdf0e10cSrcweir } 1221cdf0e10cSrcweir 1222cdf0e10cSrcweir 1223cdf0e10cSrcweir // select nodes for elements of which we only handle one occurrence 1224cdf0e10cSrcweir for (const char **pName = s_stdMeta; *pName != 0; ++pName) { 1225cdf0e10cSrcweir ::rtl::OUString name = ::rtl::OUString::createFromAscii(*pName); 1226cdf0e10cSrcweir // NB: If a document contains more than one occurrence of a 1227cdf0e10cSrcweir // meta-data element, we arbitrarily pick one of them here. 1228cdf0e10cSrcweir // We do not remove the others, i.e., when we write the 1229cdf0e10cSrcweir // document, it will contain the duplicates unchanged. 1230cdf0e10cSrcweir // The ODF spec says that handling multiple occurrences is 1231cdf0e10cSrcweir // application-specific. 1232cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xNode = 1233cdf0e10cSrcweir xPath->selectSingleNode(m_xParent, 1234cdf0e10cSrcweir ::rtl::OUString::createFromAscii("child::") + name); 1235cdf0e10cSrcweir // Do not create an empty element if it is missing; 1236cdf0e10cSrcweir // for certain elements, such as dateTime, this would be invalid 1237cdf0e10cSrcweir m_meta[name] = xNode; 1238cdf0e10cSrcweir } 1239cdf0e10cSrcweir 1240cdf0e10cSrcweir // select nodes for elements of which we handle all occurrences 1241cdf0e10cSrcweir for (const char **pName = s_stdMetaList; *pName != 0; ++pName) { 1242cdf0e10cSrcweir ::rtl::OUString name = ::rtl::OUString::createFromAscii(*pName); 1243cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNodeList> nodes = 1244cdf0e10cSrcweir xPath->selectNodeList(m_xParent, 1245cdf0e10cSrcweir ::rtl::OUString::createFromAscii("child::") + name); 1246cdf0e10cSrcweir std::vector<css::uno::Reference<css::xml::dom::XNode> > v; 1247cdf0e10cSrcweir for (sal_Int32 i = 0; i < nodes->getLength(); ++i) { 1248cdf0e10cSrcweir v.push_back(nodes->item(i)); 1249cdf0e10cSrcweir } 1250cdf0e10cSrcweir m_metaList[name] = v; 1251cdf0e10cSrcweir } 1252cdf0e10cSrcweir 1253cdf0e10cSrcweir // initialize members corresponding to attributes from DOM nodes 1254cdf0e10cSrcweir m_TemplateName = getMetaAttr("meta:template", "xlink:title"); 1255cdf0e10cSrcweir m_TemplateURL = getMetaAttr("meta:template", "xlink:href"); 1256cdf0e10cSrcweir m_TemplateDate = 1257cdf0e10cSrcweir textToDateTimeDefault(getMetaAttr("meta:template", "meta:date")); 1258cdf0e10cSrcweir m_AutoloadURL = getMetaAttr("meta:auto-reload", "xlink:href"); 1259cdf0e10cSrcweir m_AutoloadSecs = 1260cdf0e10cSrcweir textToDuration(getMetaAttr("meta:auto-reload", "meta:delay")); 1261cdf0e10cSrcweir m_DefaultTarget = 1262cdf0e10cSrcweir getMetaAttr("meta:hyperlink-behaviour", "office:target-frame-name"); 1263cdf0e10cSrcweir 1264cdf0e10cSrcweir 1265cdf0e10cSrcweir std::vector<css::uno::Reference<css::xml::dom::XNode> > & vec = 1266cdf0e10cSrcweir m_metaList[::rtl::OUString::createFromAscii("meta:user-defined")]; 1267cdf0e10cSrcweir m_xUserDefined.clear(); // #i105826#: reset (may be re-initialization) 1268cdf0e10cSrcweir if ( !vec.empty() ) 1269cdf0e10cSrcweir { 1270cdf0e10cSrcweir createUserDefined(); 1271cdf0e10cSrcweir } 1272cdf0e10cSrcweir 1273cdf0e10cSrcweir // user-defined meta data: initialize PropertySet from DOM nodes 1274cdf0e10cSrcweir for (std::vector<css::uno::Reference<css::xml::dom::XNode> >::iterator 1275cdf0e10cSrcweir it = vec.begin(); it != vec.end(); ++it) { 1276cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XElement> xElem(*it, 1277cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 1278cdf0e10cSrcweir css::uno::Any any; 1279cdf0e10cSrcweir ::rtl::OUString name = xElem->getAttributeNS( 1280cdf0e10cSrcweir ::rtl::OUString::createFromAscii(s_nsODFMeta), 1281cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("name"))); 1282cdf0e10cSrcweir ::rtl::OUString type = xElem->getAttributeNS( 1283cdf0e10cSrcweir ::rtl::OUString::createFromAscii(s_nsODFMeta), 1284cdf0e10cSrcweir ::rtl::OUString::createFromAscii("value-type")); 1285cdf0e10cSrcweir ::rtl::OUString text = getNodeText(*it); 1286cdf0e10cSrcweir if (type.equalsAscii("float")) { 1287cdf0e10cSrcweir double d; 1288cdf0e10cSrcweir if (::sax::Converter::convertDouble(d, text)) { 1289cdf0e10cSrcweir any <<= d; 1290cdf0e10cSrcweir } else { 1291cdf0e10cSrcweir DBG_WARNING1("SfxDocumentMetaData: invalid float: %s", 1292cdf0e10cSrcweir OUStringToOString(text, RTL_TEXTENCODING_UTF8).getStr()); 1293cdf0e10cSrcweir continue; 1294cdf0e10cSrcweir } 1295cdf0e10cSrcweir } else if (type.equalsAscii("date")) { 1296cdf0e10cSrcweir bool isDateTime; 1297cdf0e10cSrcweir css::util::Date d; 1298cdf0e10cSrcweir css::util::DateTime dt; 1299cdf0e10cSrcweir if (textToDateOrDateTime(d, dt, isDateTime, text)) { 1300cdf0e10cSrcweir if (isDateTime) { 1301cdf0e10cSrcweir any <<= dt; 1302cdf0e10cSrcweir } else { 1303cdf0e10cSrcweir any <<= d; 1304cdf0e10cSrcweir } 1305cdf0e10cSrcweir } else { 1306cdf0e10cSrcweir DBG_WARNING1("SfxDocumentMetaData: invalid date: %s", 1307cdf0e10cSrcweir OUStringToOString(text, RTL_TEXTENCODING_UTF8).getStr()); 1308cdf0e10cSrcweir continue; 1309cdf0e10cSrcweir } 1310cdf0e10cSrcweir } else if (type.equalsAscii("time")) { 1311cdf0e10cSrcweir css::util::Duration ud; 1312cdf0e10cSrcweir if (textToDuration(ud, text)) { 1313cdf0e10cSrcweir any <<= ud; 1314cdf0e10cSrcweir } else { 1315cdf0e10cSrcweir DBG_WARNING1("SfxDocumentMetaData: invalid time: %s", 1316cdf0e10cSrcweir OUStringToOString(text, RTL_TEXTENCODING_UTF8).getStr()); 1317cdf0e10cSrcweir continue; 1318cdf0e10cSrcweir } 1319cdf0e10cSrcweir } else if (type.equalsAscii("boolean")) { 1320cdf0e10cSrcweir bool b; 1321cdf0e10cSrcweir if (::sax::Converter::convertBool(b, text)) { 1322cdf0e10cSrcweir any <<= b; 1323cdf0e10cSrcweir } else { 1324cdf0e10cSrcweir DBG_WARNING1("SfxDocumentMetaData: invalid boolean: %s", 1325cdf0e10cSrcweir OUStringToOString(text, RTL_TEXTENCODING_UTF8).getStr()); 1326cdf0e10cSrcweir continue; 1327cdf0e10cSrcweir } 1328cdf0e10cSrcweir } else if (type.equalsAscii("string") || true) { // default 1329cdf0e10cSrcweir any <<= text; 1330cdf0e10cSrcweir } 1331cdf0e10cSrcweir try { 1332cdf0e10cSrcweir m_xUserDefined->addProperty(name, 1333cdf0e10cSrcweir css::beans::PropertyAttribute::REMOVEABLE, any); 1334cdf0e10cSrcweir } catch (css::beans::PropertyExistException &) { 1335cdf0e10cSrcweir DBG_WARNING1("SfxDocumentMetaData: duplicate: %s", 1336cdf0e10cSrcweir OUStringToOString(name, RTL_TEXTENCODING_UTF8).getStr()); 1337cdf0e10cSrcweir // ignore; duplicate 1338cdf0e10cSrcweir } catch (css::beans::IllegalTypeException &) { 1339cdf0e10cSrcweir DBG_ERROR1("SfxDocumentMetaData: illegal type: %s", 1340cdf0e10cSrcweir OUStringToOString(name, RTL_TEXTENCODING_UTF8).getStr()); 1341cdf0e10cSrcweir } catch (css::lang::IllegalArgumentException &) { 1342cdf0e10cSrcweir DBG_ERROR1("SfxDocumentMetaData: illegal arg: %s", 1343cdf0e10cSrcweir OUStringToOString(name, RTL_TEXTENCODING_UTF8).getStr()); 1344cdf0e10cSrcweir } 1345cdf0e10cSrcweir } 1346cdf0e10cSrcweir 1347cdf0e10cSrcweir m_isModified = false; 1348cdf0e10cSrcweir m_isInitialized = true; 1349cdf0e10cSrcweir } 1350cdf0e10cSrcweir 1351cdf0e10cSrcweir 1352cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////// 1353cdf0e10cSrcweir 1354cdf0e10cSrcweir SfxDocumentMetaData::SfxDocumentMetaData( 1355cdf0e10cSrcweir css::uno::Reference< css::uno::XComponentContext > const & context) 1356cdf0e10cSrcweir : BaseMutex() 1357cdf0e10cSrcweir , SfxDocumentMetaData_Base(m_aMutex) 1358cdf0e10cSrcweir , m_xContext(context) 1359cdf0e10cSrcweir , m_NotifyListeners(m_aMutex) 1360cdf0e10cSrcweir , m_isInitialized(false) 1361cdf0e10cSrcweir , m_isModified(false) 1362cdf0e10cSrcweir , m_AutoloadSecs(0) 1363cdf0e10cSrcweir { 1364cdf0e10cSrcweir DBG_ASSERT(context.is(), "SfxDocumentMetaData: context is null"); 1365cdf0e10cSrcweir DBG_ASSERT(context->getServiceManager().is(), 1366cdf0e10cSrcweir "SfxDocumentMetaData: context has no service manager"); 1367cdf0e10cSrcweir init(createDOM()); 1368cdf0e10cSrcweir } 1369cdf0e10cSrcweir 1370cdf0e10cSrcweir // com.sun.star.uno.XServiceInfo: 1371cdf0e10cSrcweir ::rtl::OUString SAL_CALL 1372cdf0e10cSrcweir SfxDocumentMetaData::getImplementationName() throw (css::uno::RuntimeException) 1373cdf0e10cSrcweir { 1374cdf0e10cSrcweir return comp_SfxDocumentMetaData::_getImplementationName(); 1375cdf0e10cSrcweir } 1376cdf0e10cSrcweir 1377cdf0e10cSrcweir ::sal_Bool SAL_CALL 1378cdf0e10cSrcweir SfxDocumentMetaData::supportsService(::rtl::OUString const & serviceName) 1379cdf0e10cSrcweir throw (css::uno::RuntimeException) 1380cdf0e10cSrcweir { 1381cdf0e10cSrcweir css::uno::Sequence< ::rtl::OUString > serviceNames = 1382cdf0e10cSrcweir comp_SfxDocumentMetaData::_getSupportedServiceNames(); 1383cdf0e10cSrcweir for (::sal_Int32 i = 0; i < serviceNames.getLength(); ++i) { 1384cdf0e10cSrcweir if (serviceNames[i] == serviceName) 1385cdf0e10cSrcweir return sal_True; 1386cdf0e10cSrcweir } 1387cdf0e10cSrcweir return sal_False; 1388cdf0e10cSrcweir } 1389cdf0e10cSrcweir 1390cdf0e10cSrcweir css::uno::Sequence< ::rtl::OUString > SAL_CALL 1391cdf0e10cSrcweir SfxDocumentMetaData::getSupportedServiceNames() 1392cdf0e10cSrcweir throw (css::uno::RuntimeException) 1393cdf0e10cSrcweir { 1394cdf0e10cSrcweir return comp_SfxDocumentMetaData::_getSupportedServiceNames(); 1395cdf0e10cSrcweir } 1396cdf0e10cSrcweir 1397cdf0e10cSrcweir 1398cdf0e10cSrcweir // ::com::sun::star::lang::XComponent: 1399cdf0e10cSrcweir void SAL_CALL SfxDocumentMetaData::dispose() throw (css::uno::RuntimeException) 1400cdf0e10cSrcweir { 1401cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1402cdf0e10cSrcweir if (!m_isInitialized) { 1403cdf0e10cSrcweir return; 1404cdf0e10cSrcweir } 1405cdf0e10cSrcweir WeakComponentImplHelperBase::dispose(); // superclass 1406cdf0e10cSrcweir m_NotifyListeners.disposeAndClear(css::lang::EventObject( 1407cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >(this))); 1408cdf0e10cSrcweir m_isInitialized = false; 1409cdf0e10cSrcweir m_meta.clear(); 1410cdf0e10cSrcweir m_metaList.clear(); 1411cdf0e10cSrcweir m_xParent.clear(); 1412cdf0e10cSrcweir m_xDoc.clear(); 1413cdf0e10cSrcweir m_xUserDefined.clear(); 1414cdf0e10cSrcweir } 1415cdf0e10cSrcweir 1416cdf0e10cSrcweir 1417cdf0e10cSrcweir // ::com::sun::star::document::XDocumentProperties: 1418cdf0e10cSrcweir ::rtl::OUString SAL_CALL 1419cdf0e10cSrcweir SfxDocumentMetaData::getAuthor() throw (css::uno::RuntimeException) 1420cdf0e10cSrcweir { 1421cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1422cdf0e10cSrcweir return getMetaText("meta:initial-creator"); 1423cdf0e10cSrcweir } 1424cdf0e10cSrcweir 1425cdf0e10cSrcweir void SAL_CALL SfxDocumentMetaData::setAuthor(const ::rtl::OUString & the_value) 1426cdf0e10cSrcweir throw (css::uno::RuntimeException) 1427cdf0e10cSrcweir { 1428cdf0e10cSrcweir setMetaTextAndNotify("meta:initial-creator", the_value); 1429cdf0e10cSrcweir } 1430cdf0e10cSrcweir 1431cdf0e10cSrcweir 1432cdf0e10cSrcweir ::rtl::OUString SAL_CALL 1433cdf0e10cSrcweir SfxDocumentMetaData::getGenerator() throw (css::uno::RuntimeException) 1434cdf0e10cSrcweir { 1435cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1436cdf0e10cSrcweir return getMetaText("meta:generator"); 1437cdf0e10cSrcweir } 1438cdf0e10cSrcweir 1439cdf0e10cSrcweir void SAL_CALL 1440cdf0e10cSrcweir SfxDocumentMetaData::setGenerator(const ::rtl::OUString & the_value) 1441cdf0e10cSrcweir throw (css::uno::RuntimeException) 1442cdf0e10cSrcweir { 1443cdf0e10cSrcweir setMetaTextAndNotify("meta:generator", the_value); 1444cdf0e10cSrcweir } 1445cdf0e10cSrcweir 1446cdf0e10cSrcweir css::util::DateTime SAL_CALL 1447cdf0e10cSrcweir SfxDocumentMetaData::getCreationDate() throw (css::uno::RuntimeException) 1448cdf0e10cSrcweir { 1449cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1450cdf0e10cSrcweir return textToDateTimeDefault(getMetaText("meta:creation-date")); 1451cdf0e10cSrcweir } 1452cdf0e10cSrcweir 1453cdf0e10cSrcweir void SAL_CALL 1454cdf0e10cSrcweir SfxDocumentMetaData::setCreationDate(const css::util::DateTime & the_value) 1455cdf0e10cSrcweir throw (css::uno::RuntimeException) 1456cdf0e10cSrcweir { 1457cdf0e10cSrcweir setMetaTextAndNotify("meta:creation-date", dateTimeToText(the_value)); 1458cdf0e10cSrcweir } 1459cdf0e10cSrcweir 1460cdf0e10cSrcweir ::rtl::OUString SAL_CALL 1461cdf0e10cSrcweir SfxDocumentMetaData::getTitle() throw (css::uno::RuntimeException) 1462cdf0e10cSrcweir { 1463cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1464cdf0e10cSrcweir return getMetaText("dc:title"); 1465cdf0e10cSrcweir } 1466cdf0e10cSrcweir 1467cdf0e10cSrcweir void SAL_CALL SfxDocumentMetaData::setTitle(const ::rtl::OUString & the_value) 1468cdf0e10cSrcweir throw (css::uno::RuntimeException) 1469cdf0e10cSrcweir { 1470cdf0e10cSrcweir setMetaTextAndNotify("dc:title", the_value); 1471cdf0e10cSrcweir } 1472cdf0e10cSrcweir 1473cdf0e10cSrcweir ::rtl::OUString SAL_CALL 1474cdf0e10cSrcweir SfxDocumentMetaData::getSubject() throw (css::uno::RuntimeException) 1475cdf0e10cSrcweir { 1476cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1477cdf0e10cSrcweir return getMetaText("dc:subject"); 1478cdf0e10cSrcweir } 1479cdf0e10cSrcweir 1480cdf0e10cSrcweir void SAL_CALL 1481cdf0e10cSrcweir SfxDocumentMetaData::setSubject(const ::rtl::OUString & the_value) 1482cdf0e10cSrcweir throw (css::uno::RuntimeException) 1483cdf0e10cSrcweir { 1484cdf0e10cSrcweir setMetaTextAndNotify("dc:subject", the_value); 1485cdf0e10cSrcweir } 1486cdf0e10cSrcweir 1487cdf0e10cSrcweir ::rtl::OUString SAL_CALL 1488cdf0e10cSrcweir SfxDocumentMetaData::getDescription() throw (css::uno::RuntimeException) 1489cdf0e10cSrcweir { 1490cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1491cdf0e10cSrcweir return getMetaText("dc:description"); 1492cdf0e10cSrcweir } 1493cdf0e10cSrcweir 1494cdf0e10cSrcweir void SAL_CALL 1495cdf0e10cSrcweir SfxDocumentMetaData::setDescription(const ::rtl::OUString & the_value) 1496cdf0e10cSrcweir throw (css::uno::RuntimeException) 1497cdf0e10cSrcweir { 1498cdf0e10cSrcweir setMetaTextAndNotify("dc:description", the_value); 1499cdf0e10cSrcweir } 1500cdf0e10cSrcweir 1501cdf0e10cSrcweir css::uno::Sequence< ::rtl::OUString > 1502cdf0e10cSrcweir SAL_CALL SfxDocumentMetaData::getKeywords() throw (css::uno::RuntimeException) 1503cdf0e10cSrcweir { 1504cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1505cdf0e10cSrcweir return getMetaList("meta:keyword"); 1506cdf0e10cSrcweir } 1507cdf0e10cSrcweir 1508cdf0e10cSrcweir void SAL_CALL 1509cdf0e10cSrcweir SfxDocumentMetaData::setKeywords( 1510cdf0e10cSrcweir const css::uno::Sequence< ::rtl::OUString > & the_value) 1511cdf0e10cSrcweir throw (css::uno::RuntimeException) 1512cdf0e10cSrcweir { 1513cdf0e10cSrcweir ::osl::ClearableMutexGuard g(m_aMutex); 1514cdf0e10cSrcweir if (setMetaList("meta:keyword", the_value)) { 1515cdf0e10cSrcweir g.clear(); 1516cdf0e10cSrcweir setModified(true); 1517cdf0e10cSrcweir } 1518cdf0e10cSrcweir } 1519cdf0e10cSrcweir 1520cdf0e10cSrcweir css::lang::Locale SAL_CALL 1521cdf0e10cSrcweir SfxDocumentMetaData::getLanguage() throw (css::uno::RuntimeException) 1522cdf0e10cSrcweir { 1523cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1524cdf0e10cSrcweir css::lang::Locale loc; 1525cdf0e10cSrcweir ::rtl::OUString text = getMetaText("dc:language"); 1526cdf0e10cSrcweir sal_Int32 ix = text.indexOf(static_cast<sal_Unicode> ('-')); 1527cdf0e10cSrcweir if (ix == -1) { 1528cdf0e10cSrcweir loc.Language = text; 1529cdf0e10cSrcweir } else { 1530cdf0e10cSrcweir loc.Language = text.copy(0, ix); 1531cdf0e10cSrcweir loc.Country = text.copy(ix+1); 1532cdf0e10cSrcweir } 1533cdf0e10cSrcweir return loc; 1534cdf0e10cSrcweir } 1535cdf0e10cSrcweir 1536cdf0e10cSrcweir void SAL_CALL 1537cdf0e10cSrcweir SfxDocumentMetaData::setLanguage(const css::lang::Locale & the_value) 1538cdf0e10cSrcweir throw (css::uno::RuntimeException) 1539cdf0e10cSrcweir { 1540cdf0e10cSrcweir ::rtl::OUString text = the_value.Language; 1541cdf0e10cSrcweir if (the_value.Country.getLength() > 0) { 1542cdf0e10cSrcweir text += ::rtl::OUString::createFromAscii("-").concat(the_value.Country); 1543cdf0e10cSrcweir } 1544cdf0e10cSrcweir setMetaTextAndNotify("dc:language", text); 1545cdf0e10cSrcweir } 1546cdf0e10cSrcweir 1547cdf0e10cSrcweir ::rtl::OUString SAL_CALL 1548cdf0e10cSrcweir SfxDocumentMetaData::getModifiedBy() throw (css::uno::RuntimeException) 1549cdf0e10cSrcweir { 1550cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1551cdf0e10cSrcweir return getMetaText("dc:creator"); 1552cdf0e10cSrcweir } 1553cdf0e10cSrcweir 1554cdf0e10cSrcweir void SAL_CALL 1555cdf0e10cSrcweir SfxDocumentMetaData::setModifiedBy(const ::rtl::OUString & the_value) 1556cdf0e10cSrcweir throw (css::uno::RuntimeException) 1557cdf0e10cSrcweir { 1558cdf0e10cSrcweir setMetaTextAndNotify("dc:creator", the_value); 1559cdf0e10cSrcweir } 1560cdf0e10cSrcweir 1561cdf0e10cSrcweir css::util::DateTime SAL_CALL 1562cdf0e10cSrcweir SfxDocumentMetaData::getModificationDate() throw (css::uno::RuntimeException) 1563cdf0e10cSrcweir { 1564cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1565cdf0e10cSrcweir return textToDateTimeDefault(getMetaText("dc:date")); 1566cdf0e10cSrcweir } 1567cdf0e10cSrcweir 1568cdf0e10cSrcweir void SAL_CALL 1569cdf0e10cSrcweir SfxDocumentMetaData::setModificationDate(const css::util::DateTime & the_value) 1570cdf0e10cSrcweir throw (css::uno::RuntimeException) 1571cdf0e10cSrcweir { 1572cdf0e10cSrcweir setMetaTextAndNotify("dc:date", dateTimeToText(the_value)); 1573cdf0e10cSrcweir } 1574cdf0e10cSrcweir 1575cdf0e10cSrcweir ::rtl::OUString SAL_CALL 1576cdf0e10cSrcweir SfxDocumentMetaData::getPrintedBy() throw (css::uno::RuntimeException) 1577cdf0e10cSrcweir { 1578cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1579cdf0e10cSrcweir return getMetaText("meta:printed-by"); 1580cdf0e10cSrcweir } 1581cdf0e10cSrcweir 1582cdf0e10cSrcweir void SAL_CALL 1583cdf0e10cSrcweir SfxDocumentMetaData::setPrintedBy(const ::rtl::OUString & the_value) 1584cdf0e10cSrcweir throw (css::uno::RuntimeException) 1585cdf0e10cSrcweir { 1586cdf0e10cSrcweir setMetaTextAndNotify("meta:printed-by", the_value); 1587cdf0e10cSrcweir } 1588cdf0e10cSrcweir 1589cdf0e10cSrcweir css::util::DateTime SAL_CALL 1590cdf0e10cSrcweir SfxDocumentMetaData::getPrintDate() throw (css::uno::RuntimeException) 1591cdf0e10cSrcweir { 1592cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1593cdf0e10cSrcweir return textToDateTimeDefault(getMetaText("meta:print-date")); 1594cdf0e10cSrcweir } 1595cdf0e10cSrcweir 1596cdf0e10cSrcweir void SAL_CALL 1597cdf0e10cSrcweir SfxDocumentMetaData::setPrintDate(const css::util::DateTime & the_value) 1598cdf0e10cSrcweir throw (css::uno::RuntimeException) 1599cdf0e10cSrcweir { 1600cdf0e10cSrcweir setMetaTextAndNotify("meta:print-date", dateTimeToText(the_value)); 1601cdf0e10cSrcweir } 1602cdf0e10cSrcweir 1603cdf0e10cSrcweir ::rtl::OUString SAL_CALL 1604cdf0e10cSrcweir SfxDocumentMetaData::getTemplateName() throw (css::uno::RuntimeException) 1605cdf0e10cSrcweir { 1606cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1607cdf0e10cSrcweir checkInit(); 1608cdf0e10cSrcweir return m_TemplateName; 1609cdf0e10cSrcweir } 1610cdf0e10cSrcweir 1611cdf0e10cSrcweir void SAL_CALL 1612cdf0e10cSrcweir SfxDocumentMetaData::setTemplateName(const ::rtl::OUString & the_value) 1613cdf0e10cSrcweir throw (css::uno::RuntimeException) 1614cdf0e10cSrcweir { 1615cdf0e10cSrcweir ::osl::ClearableMutexGuard g(m_aMutex); 1616cdf0e10cSrcweir checkInit(); 1617cdf0e10cSrcweir if (m_TemplateName != the_value) { 1618cdf0e10cSrcweir m_TemplateName = the_value; 1619cdf0e10cSrcweir g.clear(); 1620cdf0e10cSrcweir setModified(true); 1621cdf0e10cSrcweir } 1622cdf0e10cSrcweir } 1623cdf0e10cSrcweir 1624cdf0e10cSrcweir ::rtl::OUString SAL_CALL 1625cdf0e10cSrcweir SfxDocumentMetaData::getTemplateURL() throw (css::uno::RuntimeException) 1626cdf0e10cSrcweir { 1627cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1628cdf0e10cSrcweir checkInit(); 1629cdf0e10cSrcweir return m_TemplateURL; 1630cdf0e10cSrcweir } 1631cdf0e10cSrcweir 1632cdf0e10cSrcweir void SAL_CALL 1633cdf0e10cSrcweir SfxDocumentMetaData::setTemplateURL(const ::rtl::OUString & the_value) 1634cdf0e10cSrcweir throw (css::uno::RuntimeException) 1635cdf0e10cSrcweir { 1636cdf0e10cSrcweir ::osl::ClearableMutexGuard g(m_aMutex); 1637cdf0e10cSrcweir checkInit(); 1638cdf0e10cSrcweir if (m_TemplateURL != the_value) { 1639cdf0e10cSrcweir m_TemplateURL = the_value; 1640cdf0e10cSrcweir g.clear(); 1641cdf0e10cSrcweir setModified(true); 1642cdf0e10cSrcweir } 1643cdf0e10cSrcweir } 1644cdf0e10cSrcweir 1645cdf0e10cSrcweir css::util::DateTime SAL_CALL 1646cdf0e10cSrcweir SfxDocumentMetaData::getTemplateDate() throw (css::uno::RuntimeException) 1647cdf0e10cSrcweir { 1648cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1649cdf0e10cSrcweir checkInit(); 1650cdf0e10cSrcweir return m_TemplateDate; 1651cdf0e10cSrcweir } 1652cdf0e10cSrcweir 1653cdf0e10cSrcweir void SAL_CALL 1654cdf0e10cSrcweir SfxDocumentMetaData::setTemplateDate(const css::util::DateTime & the_value) 1655cdf0e10cSrcweir throw (css::uno::RuntimeException) 1656cdf0e10cSrcweir { 1657cdf0e10cSrcweir ::osl::ClearableMutexGuard g(m_aMutex); 1658cdf0e10cSrcweir checkInit(); 1659cdf0e10cSrcweir if (!(m_TemplateDate == the_value)) { 1660cdf0e10cSrcweir m_TemplateDate = the_value; 1661cdf0e10cSrcweir g.clear(); 1662cdf0e10cSrcweir setModified(true); 1663cdf0e10cSrcweir } 1664cdf0e10cSrcweir } 1665cdf0e10cSrcweir 1666cdf0e10cSrcweir ::rtl::OUString SAL_CALL 1667cdf0e10cSrcweir SfxDocumentMetaData::getAutoloadURL() throw (css::uno::RuntimeException) 1668cdf0e10cSrcweir { 1669cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1670cdf0e10cSrcweir checkInit(); 1671cdf0e10cSrcweir return m_AutoloadURL; 1672cdf0e10cSrcweir } 1673cdf0e10cSrcweir 1674cdf0e10cSrcweir void SAL_CALL 1675cdf0e10cSrcweir SfxDocumentMetaData::setAutoloadURL(const ::rtl::OUString & the_value) 1676cdf0e10cSrcweir throw (css::uno::RuntimeException) 1677cdf0e10cSrcweir { 1678cdf0e10cSrcweir ::osl::ClearableMutexGuard g(m_aMutex); 1679cdf0e10cSrcweir checkInit(); 1680cdf0e10cSrcweir if (m_AutoloadURL != the_value) { 1681cdf0e10cSrcweir m_AutoloadURL = the_value; 1682cdf0e10cSrcweir g.clear(); 1683cdf0e10cSrcweir setModified(true); 1684cdf0e10cSrcweir } 1685cdf0e10cSrcweir } 1686cdf0e10cSrcweir 1687cdf0e10cSrcweir ::sal_Int32 SAL_CALL 1688cdf0e10cSrcweir SfxDocumentMetaData::getAutoloadSecs() throw (css::uno::RuntimeException) 1689cdf0e10cSrcweir { 1690cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1691cdf0e10cSrcweir checkInit(); 1692cdf0e10cSrcweir return m_AutoloadSecs; 1693cdf0e10cSrcweir } 1694cdf0e10cSrcweir 1695cdf0e10cSrcweir void SAL_CALL 1696cdf0e10cSrcweir SfxDocumentMetaData::setAutoloadSecs(::sal_Int32 the_value) 1697cdf0e10cSrcweir throw (css::uno::RuntimeException, css::lang::IllegalArgumentException) 1698cdf0e10cSrcweir { 1699cdf0e10cSrcweir if (the_value < 0) throw css::lang::IllegalArgumentException( 1700cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 1701cdf0e10cSrcweir "SfxDocumentMetaData::setAutoloadSecs: argument is negative"), 1702cdf0e10cSrcweir *this, 0); 1703cdf0e10cSrcweir ::osl::ClearableMutexGuard g(m_aMutex); 1704cdf0e10cSrcweir checkInit(); 1705cdf0e10cSrcweir if (m_AutoloadSecs != the_value) { 1706cdf0e10cSrcweir m_AutoloadSecs = the_value; 1707cdf0e10cSrcweir g.clear(); 1708cdf0e10cSrcweir setModified(true); 1709cdf0e10cSrcweir } 1710cdf0e10cSrcweir } 1711cdf0e10cSrcweir 1712cdf0e10cSrcweir ::rtl::OUString SAL_CALL 1713cdf0e10cSrcweir SfxDocumentMetaData::getDefaultTarget() throw (css::uno::RuntimeException) 1714cdf0e10cSrcweir { 1715cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1716cdf0e10cSrcweir checkInit(); 1717cdf0e10cSrcweir return m_DefaultTarget; 1718cdf0e10cSrcweir } 1719cdf0e10cSrcweir 1720cdf0e10cSrcweir void SAL_CALL 1721cdf0e10cSrcweir SfxDocumentMetaData::setDefaultTarget(const ::rtl::OUString & the_value) 1722cdf0e10cSrcweir throw (css::uno::RuntimeException) 1723cdf0e10cSrcweir { 1724cdf0e10cSrcweir ::osl::ClearableMutexGuard g(m_aMutex); 1725cdf0e10cSrcweir checkInit(); 1726cdf0e10cSrcweir if (m_DefaultTarget != the_value) { 1727cdf0e10cSrcweir m_DefaultTarget = the_value; 1728cdf0e10cSrcweir g.clear(); 1729cdf0e10cSrcweir setModified(true); 1730cdf0e10cSrcweir } 1731cdf0e10cSrcweir } 1732cdf0e10cSrcweir 1733cdf0e10cSrcweir css::uno::Sequence< css::beans::NamedValue > SAL_CALL 1734cdf0e10cSrcweir SfxDocumentMetaData::getDocumentStatistics() throw (css::uno::RuntimeException) 1735cdf0e10cSrcweir { 1736cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1737cdf0e10cSrcweir checkInit(); 1738cdf0e10cSrcweir ::comphelper::SequenceAsVector<css::beans::NamedValue> stats; 1739cdf0e10cSrcweir for (size_t i = 0; s_stdStats[i] != 0; ++i) { 1740cdf0e10cSrcweir const char * aName = s_stdStatAttrs[i]; 1741cdf0e10cSrcweir ::rtl::OUString text = getMetaAttr("meta:document-statistic", aName); 1742cdf0e10cSrcweir if (text.equalsAscii("")) continue; 1743cdf0e10cSrcweir css::beans::NamedValue stat; 1744cdf0e10cSrcweir stat.Name = ::rtl::OUString::createFromAscii(s_stdStats[i]); 1745cdf0e10cSrcweir sal_Int32 val; 1746cdf0e10cSrcweir css::uno::Any any; 1747cdf0e10cSrcweir if (!::sax::Converter::convertNumber(val, text, 0, 1748cdf0e10cSrcweir std::numeric_limits<sal_Int32>::max()) || (val < 0)) { 1749cdf0e10cSrcweir val = 0; 1750cdf0e10cSrcweir DBG_WARNING1("SfxDocumentMetaData: invalid number: %s", 1751cdf0e10cSrcweir OUStringToOString(text, RTL_TEXTENCODING_UTF8).getStr()); 1752cdf0e10cSrcweir } 1753cdf0e10cSrcweir any <<= val; 1754cdf0e10cSrcweir stat.Value = any; 1755cdf0e10cSrcweir stats.push_back(stat); 1756cdf0e10cSrcweir } 1757cdf0e10cSrcweir 1758cdf0e10cSrcweir return stats.getAsConstList(); 1759cdf0e10cSrcweir } 1760cdf0e10cSrcweir 1761cdf0e10cSrcweir void SAL_CALL 1762cdf0e10cSrcweir SfxDocumentMetaData::setDocumentStatistics( 1763cdf0e10cSrcweir const css::uno::Sequence< css::beans::NamedValue > & the_value) 1764cdf0e10cSrcweir throw (css::uno::RuntimeException) 1765cdf0e10cSrcweir { 1766cdf0e10cSrcweir ::osl::ClearableMutexGuard g(m_aMutex); 1767cdf0e10cSrcweir checkInit(); 1768cdf0e10cSrcweir std::vector<std::pair<const char *, ::rtl::OUString> > attributes; 1769cdf0e10cSrcweir for (sal_Int32 i = 0; i < the_value.getLength(); ++i) { 1770cdf0e10cSrcweir const ::rtl::OUString name = the_value[i].Name; 1771cdf0e10cSrcweir // inefficently search for matching attribute 1772cdf0e10cSrcweir for (size_t j = 0; s_stdStats[j] != 0; ++j) { 1773cdf0e10cSrcweir if (name.equalsAscii(s_stdStats[j])) { 1774cdf0e10cSrcweir const css::uno::Any any = the_value[i].Value; 1775cdf0e10cSrcweir sal_Int32 val = 0; 1776cdf0e10cSrcweir if (any >>= val) { 1777cdf0e10cSrcweir ::rtl::OUStringBuffer buf; 1778cdf0e10cSrcweir ::sax::Converter::convertNumber(buf, val); 1779cdf0e10cSrcweir attributes.push_back(std::make_pair(s_stdStatAttrs[j], 1780cdf0e10cSrcweir buf.makeStringAndClear())); 1781cdf0e10cSrcweir } else { 1782cdf0e10cSrcweir DBG_WARNING1("SfxDocumentMetaData: invalid statistic: %s", 1783cdf0e10cSrcweir OUStringToOString(name, RTL_TEXTENCODING_UTF8) 1784cdf0e10cSrcweir .getStr()); 1785cdf0e10cSrcweir } 1786cdf0e10cSrcweir break; 1787cdf0e10cSrcweir } 1788cdf0e10cSrcweir } 1789cdf0e10cSrcweir } 1790cdf0e10cSrcweir updateElement("meta:document-statistic", &attributes); 1791cdf0e10cSrcweir g.clear(); 1792cdf0e10cSrcweir setModified(true); 1793cdf0e10cSrcweir } 1794cdf0e10cSrcweir 1795cdf0e10cSrcweir ::sal_Int16 SAL_CALL 1796cdf0e10cSrcweir SfxDocumentMetaData::getEditingCycles() throw (css::uno::RuntimeException) 1797cdf0e10cSrcweir { 1798cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1799cdf0e10cSrcweir ::rtl::OUString text = getMetaText("meta:editing-cycles"); 1800cdf0e10cSrcweir sal_Int32 ret; 1801cdf0e10cSrcweir if (::sax::Converter::convertNumber(ret, text, 1802cdf0e10cSrcweir 0, std::numeric_limits<sal_Int16>::max())) { 1803cdf0e10cSrcweir return static_cast<sal_Int16>(ret); 1804cdf0e10cSrcweir } else { 1805cdf0e10cSrcweir return 0; 1806cdf0e10cSrcweir } 1807cdf0e10cSrcweir } 1808cdf0e10cSrcweir 1809cdf0e10cSrcweir void SAL_CALL 1810cdf0e10cSrcweir SfxDocumentMetaData::setEditingCycles(::sal_Int16 the_value) 1811cdf0e10cSrcweir throw (css::uno::RuntimeException, css::lang::IllegalArgumentException) 1812cdf0e10cSrcweir { 1813cdf0e10cSrcweir if (the_value < 0) throw css::lang::IllegalArgumentException( 1814cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 1815cdf0e10cSrcweir "SfxDocumentMetaData::setEditingCycles: argument is negative"), 1816cdf0e10cSrcweir *this, 0); 1817cdf0e10cSrcweir ::rtl::OUStringBuffer buf; 1818cdf0e10cSrcweir ::sax::Converter::convertNumber(buf, the_value); 1819cdf0e10cSrcweir setMetaTextAndNotify("meta:editing-cycles", buf.makeStringAndClear()); 1820cdf0e10cSrcweir } 1821cdf0e10cSrcweir 1822cdf0e10cSrcweir ::sal_Int32 SAL_CALL 1823cdf0e10cSrcweir SfxDocumentMetaData::getEditingDuration() throw (css::uno::RuntimeException) 1824cdf0e10cSrcweir { 1825cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1826cdf0e10cSrcweir return textToDuration(getMetaText("meta:editing-duration")); 1827cdf0e10cSrcweir } 1828cdf0e10cSrcweir 1829cdf0e10cSrcweir void SAL_CALL 1830cdf0e10cSrcweir SfxDocumentMetaData::setEditingDuration(::sal_Int32 the_value) 1831cdf0e10cSrcweir throw (css::uno::RuntimeException, css::lang::IllegalArgumentException) 1832cdf0e10cSrcweir { 1833cdf0e10cSrcweir if (the_value < 0) throw css::lang::IllegalArgumentException( 1834cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 1835cdf0e10cSrcweir "SfxDocumentMetaData::setEditingDuration: argument is negative"), 1836cdf0e10cSrcweir *this, 0); 1837cdf0e10cSrcweir setMetaTextAndNotify("meta:editing-duration", durationToText(the_value)); 1838cdf0e10cSrcweir } 1839cdf0e10cSrcweir 1840cdf0e10cSrcweir void SAL_CALL 1841cdf0e10cSrcweir SfxDocumentMetaData::resetUserData(const ::rtl::OUString & the_value) 1842cdf0e10cSrcweir throw (css::uno::RuntimeException) 1843cdf0e10cSrcweir { 1844cdf0e10cSrcweir ::osl::ClearableMutexGuard g(m_aMutex); 1845cdf0e10cSrcweir 1846cdf0e10cSrcweir bool bModified( false ); 1847cdf0e10cSrcweir bModified |= setMetaText("meta:initial-creator", the_value); 1848cdf0e10cSrcweir ::DateTime now = DateTime(); 1849cdf0e10cSrcweir css::util::DateTime uDT(now.Get100Sec(), now.GetSec(), now.GetMin(), 1850cdf0e10cSrcweir now.GetHour(), now.GetDay(), now.GetMonth(), now.GetYear()); 1851cdf0e10cSrcweir bModified |= setMetaText("meta:creation-date", dateTimeToText(uDT)); 1852cdf0e10cSrcweir bModified |= setMetaText("dc:creator", ::rtl::OUString()); 1853cdf0e10cSrcweir bModified |= setMetaText("meta:printed-by", ::rtl::OUString()); 1854cdf0e10cSrcweir bModified |= setMetaText("dc:date", dateTimeToText(css::util::DateTime())); 1855cdf0e10cSrcweir bModified |= setMetaText("meta:print-date", 1856cdf0e10cSrcweir dateTimeToText(css::util::DateTime())); 1857cdf0e10cSrcweir bModified |= setMetaText("meta:editing-duration", durationToText(0)); 1858cdf0e10cSrcweir bModified |= setMetaText("meta:editing-cycles", 1859cdf0e10cSrcweir ::rtl::OUString::createFromAscii("1")); 1860cdf0e10cSrcweir 1861cdf0e10cSrcweir if (bModified) { 1862cdf0e10cSrcweir g.clear(); 1863cdf0e10cSrcweir setModified(true); 1864cdf0e10cSrcweir } 1865cdf0e10cSrcweir } 1866cdf0e10cSrcweir 1867cdf0e10cSrcweir 1868cdf0e10cSrcweir css::uno::Reference< css::beans::XPropertyContainer > SAL_CALL 1869cdf0e10cSrcweir SfxDocumentMetaData::getUserDefinedProperties() 1870cdf0e10cSrcweir throw (css::uno::RuntimeException) 1871cdf0e10cSrcweir { 1872cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1873cdf0e10cSrcweir checkInit(); 1874cdf0e10cSrcweir createUserDefined(); 1875cdf0e10cSrcweir return m_xUserDefined; 1876cdf0e10cSrcweir } 1877cdf0e10cSrcweir 1878cdf0e10cSrcweir 1879cdf0e10cSrcweir void SAL_CALL 1880cdf0e10cSrcweir SfxDocumentMetaData::loadFromStorage( 1881cdf0e10cSrcweir const css::uno::Reference< css::embed::XStorage > & xStorage, 1882cdf0e10cSrcweir const css::uno::Sequence< css::beans::PropertyValue > & Medium) 1883cdf0e10cSrcweir throw (css::uno::RuntimeException, css::lang::IllegalArgumentException, 1884cdf0e10cSrcweir css::io::WrongFormatException, 1885cdf0e10cSrcweir css::lang::WrappedTargetException, css::io::IOException) 1886cdf0e10cSrcweir { 1887cdf0e10cSrcweir if (!xStorage.is()) throw css::lang::IllegalArgumentException( 1888cdf0e10cSrcweir ::rtl::OUString::createFromAscii("SfxDocumentMetaData::loadFromStorage:" 1889cdf0e10cSrcweir " argument is null"), *this, 0); 1890cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1891cdf0e10cSrcweir 1892cdf0e10cSrcweir // open meta data file 1893cdf0e10cSrcweir css::uno::Reference<css::io::XStream> xStream( 1894cdf0e10cSrcweir xStorage->openStreamElement( 1895cdf0e10cSrcweir ::rtl::OUString::createFromAscii(s_metaXml), 1896cdf0e10cSrcweir css::embed::ElementModes::READ) ); 1897cdf0e10cSrcweir if (!xStream.is()) throw css::uno::RuntimeException(); 1898cdf0e10cSrcweir css::uno::Reference<css::io::XInputStream> xInStream = 1899cdf0e10cSrcweir xStream->getInputStream(); 1900cdf0e10cSrcweir if (!xInStream.is()) throw css::uno::RuntimeException(); 1901cdf0e10cSrcweir 1902cdf0e10cSrcweir // create DOM parser service 1903cdf0e10cSrcweir css::uno::Reference<css::lang::XMultiComponentFactory> xMsf ( 1904cdf0e10cSrcweir m_xContext->getServiceManager()); 1905cdf0e10cSrcweir css::uno::Reference<css::xml::sax::XParser> xParser ( 1906cdf0e10cSrcweir xMsf->createInstanceWithContext(::rtl::OUString::createFromAscii( 1907cdf0e10cSrcweir "com.sun.star.xml.sax.Parser"), m_xContext), 1908cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 1909cdf0e10cSrcweir if (!xParser.is()) throw css::uno::RuntimeException( 1910cdf0e10cSrcweir ::rtl::OUString::createFromAscii("SfxDocumentMetaData::loadFromStorage:" 1911cdf0e10cSrcweir " cannot create Parser service"), *this); 1912cdf0e10cSrcweir css::xml::sax::InputSource input; 1913cdf0e10cSrcweir input.aInputStream = xInStream; 1914cdf0e10cSrcweir 1915cdf0e10cSrcweir sal_uInt64 version = SotStorage::GetVersion( xStorage ); 1916cdf0e10cSrcweir // Oasis is also the default (0) 1917cdf0e10cSrcweir sal_Bool bOasis = ( version > SOFFICE_FILEFORMAT_60 || version == 0 ); 1918cdf0e10cSrcweir const sal_Char *pServiceName = bOasis 1919cdf0e10cSrcweir ? "com.sun.star.document.XMLOasisMetaImporter" 1920cdf0e10cSrcweir : "com.sun.star.document.XMLMetaImporter"; 1921cdf0e10cSrcweir 1922cdf0e10cSrcweir // set base URL 1923cdf0e10cSrcweir css::uno::Reference<css::beans::XPropertySet> xPropArg = 1924cdf0e10cSrcweir getURLProperties(Medium); 1925cdf0e10cSrcweir try { 1926cdf0e10cSrcweir xPropArg->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BaseURI"))) 1927cdf0e10cSrcweir >>= input.sSystemId; 1928cdf0e10cSrcweir input.sSystemId += ::rtl::OUString::createFromAscii("/").concat( 1929cdf0e10cSrcweir ::rtl::OUString::createFromAscii(s_metaXml)); 1930cdf0e10cSrcweir } catch (css::uno::Exception &) { 1931cdf0e10cSrcweir input.sSystemId = ::rtl::OUString::createFromAscii(s_metaXml); 1932cdf0e10cSrcweir } 1933cdf0e10cSrcweir css::uno::Sequence< css::uno::Any > args(1); 1934cdf0e10cSrcweir args[0] <<= xPropArg; 1935cdf0e10cSrcweir 1936cdf0e10cSrcweir css::uno::Reference<css::xml::sax::XDocumentHandler> xDocHandler ( 1937cdf0e10cSrcweir xMsf->createInstanceWithArgumentsAndContext( 1938cdf0e10cSrcweir ::rtl::OUString::createFromAscii(pServiceName), args, m_xContext), 1939cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 1940cdf0e10cSrcweir if (!xDocHandler.is()) throw css::uno::RuntimeException( 1941cdf0e10cSrcweir ::rtl::OUString::createFromAscii("SfxDocumentMetaData::loadFromStorage:" 1942cdf0e10cSrcweir " cannot create XMLOasisMetaImporter service"), *this); 1943cdf0e10cSrcweir css::uno::Reference<css::document::XImporter> xImp (xDocHandler, 1944cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 1945cdf0e10cSrcweir xImp->setTargetDocument(css::uno::Reference<css::lang::XComponent>(this)); 1946cdf0e10cSrcweir xParser->setDocumentHandler(xDocHandler); 1947cdf0e10cSrcweir try { 1948cdf0e10cSrcweir xParser->parseStream(input); 1949cdf0e10cSrcweir } catch (css::xml::sax::SAXException &) { 1950cdf0e10cSrcweir throw css::io::WrongFormatException(::rtl::OUString::createFromAscii( 1951cdf0e10cSrcweir "SfxDocumentMetaData::loadFromStorage:" 1952cdf0e10cSrcweir " XML parsing exception"), *this); 1953cdf0e10cSrcweir } 1954cdf0e10cSrcweir // NB: the implementation of XMLOasisMetaImporter calls initialize 1955cdf0e10cSrcweir // init(xDocBuilder->getDocument()); 1956cdf0e10cSrcweir checkInit(); 1957cdf0e10cSrcweir } 1958cdf0e10cSrcweir 1959cdf0e10cSrcweir void SAL_CALL 1960cdf0e10cSrcweir SfxDocumentMetaData::storeToStorage( 1961cdf0e10cSrcweir const css::uno::Reference< css::embed::XStorage > & xStorage, 1962cdf0e10cSrcweir const css::uno::Sequence< css::beans::PropertyValue > & Medium) 1963cdf0e10cSrcweir throw (css::uno::RuntimeException, css::lang::IllegalArgumentException, 1964cdf0e10cSrcweir css::lang::WrappedTargetException, css::io::IOException) 1965cdf0e10cSrcweir { 1966cdf0e10cSrcweir if (!xStorage.is()) throw css::lang::IllegalArgumentException( 1967cdf0e10cSrcweir ::rtl::OUString::createFromAscii("SfxDocumentMetaData::storeToStorage:" 1968cdf0e10cSrcweir " argument is null"), *this, 0); 1969cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 1970cdf0e10cSrcweir checkInit(); 1971cdf0e10cSrcweir 1972cdf0e10cSrcweir // update user-defined meta data in DOM tree 1973cdf0e10cSrcweir // updateUserDefinedAndAttributes(); // this will be done in serialize! 1974cdf0e10cSrcweir 1975cdf0e10cSrcweir // write into storage 1976cdf0e10cSrcweir css::uno::Reference<css::io::XStream> xStream = 1977cdf0e10cSrcweir xStorage->openStreamElement(::rtl::OUString::createFromAscii(s_metaXml), 1978cdf0e10cSrcweir css::embed::ElementModes::WRITE 1979cdf0e10cSrcweir | css::embed::ElementModes::TRUNCATE); 1980cdf0e10cSrcweir if (!xStream.is()) throw css::uno::RuntimeException(); 1981cdf0e10cSrcweir css::uno::Reference< css::beans::XPropertySet > xStreamProps(xStream, 1982cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 1983cdf0e10cSrcweir xStreamProps->setPropertyValue( 1984cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MediaType")), 1985cdf0e10cSrcweir css::uno::makeAny(::rtl::OUString::createFromAscii("text/xml"))); 1986cdf0e10cSrcweir xStreamProps->setPropertyValue( 1987cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Compressed")), 1988cdf0e10cSrcweir css::uno::makeAny(static_cast<sal_Bool> (sal_False))); 1989cdf0e10cSrcweir xStreamProps->setPropertyValue( 1990cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UseCommonStoragePasswordEncryption")), 1991cdf0e10cSrcweir css::uno::makeAny(static_cast<sal_Bool> (sal_False))); 1992cdf0e10cSrcweir css::uno::Reference<css::io::XOutputStream> xOutStream = 1993cdf0e10cSrcweir xStream->getOutputStream(); 1994cdf0e10cSrcweir if (!xOutStream.is()) throw css::uno::RuntimeException(); 1995cdf0e10cSrcweir css::uno::Reference<css::lang::XMultiComponentFactory> xMsf ( 1996cdf0e10cSrcweir m_xContext->getServiceManager()); 1997cdf0e10cSrcweir css::uno::Reference<css::io::XActiveDataSource> xSaxWriter( 1998cdf0e10cSrcweir xMsf->createInstanceWithContext(::rtl::OUString::createFromAscii( 1999cdf0e10cSrcweir "com.sun.star.xml.sax.Writer"), m_xContext), 2000cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 2001cdf0e10cSrcweir xSaxWriter->setOutputStream(xOutStream); 2002cdf0e10cSrcweir css::uno::Reference<css::xml::sax::XDocumentHandler> xDocHandler ( 2003cdf0e10cSrcweir xSaxWriter, css::uno::UNO_QUERY_THROW); 2004cdf0e10cSrcweir 2005cdf0e10cSrcweir const sal_uInt64 version = SotStorage::GetVersion( xStorage ); 2006cdf0e10cSrcweir // Oasis is also the default (0) 2007cdf0e10cSrcweir const sal_Bool bOasis = ( version > SOFFICE_FILEFORMAT_60 || version == 0 ); 2008cdf0e10cSrcweir const sal_Char *pServiceName = bOasis 2009cdf0e10cSrcweir ? "com.sun.star.document.XMLOasisMetaExporter" 2010cdf0e10cSrcweir : "com.sun.star.document.XMLMetaExporter"; 2011cdf0e10cSrcweir 2012cdf0e10cSrcweir // set base URL 2013cdf0e10cSrcweir css::uno::Reference<css::beans::XPropertySet> xPropArg = 2014cdf0e10cSrcweir getURLProperties(Medium); 2015cdf0e10cSrcweir css::uno::Sequence< css::uno::Any > args(2); 2016cdf0e10cSrcweir args[0] <<= xDocHandler; 2017cdf0e10cSrcweir args[1] <<= xPropArg; 2018cdf0e10cSrcweir 2019cdf0e10cSrcweir css::uno::Reference<css::document::XExporter> xExp( 2020cdf0e10cSrcweir xMsf->createInstanceWithArgumentsAndContext( 2021cdf0e10cSrcweir ::rtl::OUString::createFromAscii(pServiceName), args, m_xContext), 2022cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 2023cdf0e10cSrcweir xExp->setSourceDocument(css::uno::Reference<css::lang::XComponent>(this)); 2024cdf0e10cSrcweir css::uno::Reference<css::document::XFilter> xFilter(xExp, 2025cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 2026cdf0e10cSrcweir if (xFilter->filter(css::uno::Sequence< css::beans::PropertyValue >())) { 2027cdf0e10cSrcweir css::uno::Reference<css::embed::XTransactedObject> xTransaction( 2028cdf0e10cSrcweir xStorage, css::uno::UNO_QUERY); 2029cdf0e10cSrcweir if (xTransaction.is()) { 2030cdf0e10cSrcweir xTransaction->commit(); 2031cdf0e10cSrcweir } 2032cdf0e10cSrcweir } else { 2033cdf0e10cSrcweir throw css::io::IOException(::rtl::OUString::createFromAscii( 2034cdf0e10cSrcweir "SfxDocumentMetaData::storeToStorage: cannot filter"), *this); 2035cdf0e10cSrcweir } 2036cdf0e10cSrcweir } 2037cdf0e10cSrcweir 2038cdf0e10cSrcweir void SAL_CALL 2039cdf0e10cSrcweir SfxDocumentMetaData::loadFromMedium(const ::rtl::OUString & URL, 2040cdf0e10cSrcweir const css::uno::Sequence< css::beans::PropertyValue > & Medium) 2041cdf0e10cSrcweir throw (css::uno::RuntimeException, css::io::WrongFormatException, 2042cdf0e10cSrcweir css::lang::WrappedTargetException, css::io::IOException) 2043cdf0e10cSrcweir { 2044cdf0e10cSrcweir css::uno::Reference<css::io::XInputStream> xIn; 2045cdf0e10cSrcweir ::comphelper::MediaDescriptor md(Medium); 2046cdf0e10cSrcweir // if we have an URL parameter, it replaces the one in the media descriptor 2047cdf0e10cSrcweir if (!URL.equalsAscii("")) { 2048cdf0e10cSrcweir md[ ::comphelper::MediaDescriptor::PROP_URL() ] <<= URL; 2049cdf0e10cSrcweir } 2050cdf0e10cSrcweir if (sal_True == md.addInputStream()) { 2051cdf0e10cSrcweir md[ ::comphelper::MediaDescriptor::PROP_INPUTSTREAM() ] >>= xIn; 2052cdf0e10cSrcweir } 2053cdf0e10cSrcweir css::uno::Reference<css::embed::XStorage> xStorage; 2054cdf0e10cSrcweir css::uno::Reference<css::lang::XMultiServiceFactory> xMsf ( 2055cdf0e10cSrcweir m_xContext->getServiceManager(), css::uno::UNO_QUERY_THROW); 2056cdf0e10cSrcweir try { 2057cdf0e10cSrcweir if (xIn.is()) { 2058cdf0e10cSrcweir xStorage = ::comphelper::OStorageHelper::GetStorageFromInputStream( 2059cdf0e10cSrcweir xIn, xMsf); 2060cdf0e10cSrcweir } else { // fallback to url parameter 2061cdf0e10cSrcweir xStorage = ::comphelper::OStorageHelper::GetStorageFromURL( 2062cdf0e10cSrcweir URL, css::embed::ElementModes::READ, xMsf); 2063cdf0e10cSrcweir } 2064cdf0e10cSrcweir } catch (css::uno::RuntimeException &) { 2065cdf0e10cSrcweir throw; 2066cdf0e10cSrcweir } catch (css::io::IOException &) { 2067cdf0e10cSrcweir throw; 2068cdf0e10cSrcweir } catch (css::uno::Exception & e) { 2069cdf0e10cSrcweir throw css::lang::WrappedTargetException( 2070cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 2071cdf0e10cSrcweir "SfxDocumentMetaData::loadFromMedium: exception"), 2072cdf0e10cSrcweir css::uno::Reference<css::uno::XInterface>(*this), 2073cdf0e10cSrcweir css::uno::makeAny(e)); 2074cdf0e10cSrcweir } 2075cdf0e10cSrcweir if (!xStorage.is()) { 2076cdf0e10cSrcweir throw css::uno::RuntimeException(::rtl::OUString::createFromAscii( 2077cdf0e10cSrcweir "SfxDocumentMetaData::loadFromMedium: cannot get Storage"), 2078cdf0e10cSrcweir *this); 2079cdf0e10cSrcweir } 2080cdf0e10cSrcweir loadFromStorage(xStorage, md.getAsConstPropertyValueList()); 2081cdf0e10cSrcweir } 2082cdf0e10cSrcweir 2083cdf0e10cSrcweir void SAL_CALL 2084cdf0e10cSrcweir SfxDocumentMetaData::storeToMedium(const ::rtl::OUString & URL, 2085cdf0e10cSrcweir const css::uno::Sequence< css::beans::PropertyValue > & Medium) 2086cdf0e10cSrcweir throw (css::uno::RuntimeException, 2087cdf0e10cSrcweir css::lang::WrappedTargetException, css::io::IOException) 2088cdf0e10cSrcweir { 2089cdf0e10cSrcweir ::comphelper::MediaDescriptor md(Medium); 2090cdf0e10cSrcweir if (!URL.equalsAscii("")) { 2091cdf0e10cSrcweir md[ ::comphelper::MediaDescriptor::PROP_URL() ] <<= URL; 2092cdf0e10cSrcweir } 2093cdf0e10cSrcweir SfxMedium aMedium(md.getAsConstPropertyValueList()); 2094cdf0e10cSrcweir css::uno::Reference<css::embed::XStorage> xStorage 2095cdf0e10cSrcweir = aMedium.GetOutputStorage(); 2096cdf0e10cSrcweir 2097cdf0e10cSrcweir 2098cdf0e10cSrcweir if (!xStorage.is()) { 2099cdf0e10cSrcweir throw css::uno::RuntimeException(::rtl::OUString::createFromAscii( 2100cdf0e10cSrcweir "SfxDocumentMetaData::storeToMedium: cannot get Storage"), 2101cdf0e10cSrcweir *this); 2102cdf0e10cSrcweir } 2103cdf0e10cSrcweir // set MIME type of the storage 2104cdf0e10cSrcweir ::comphelper::MediaDescriptor::const_iterator iter 2105cdf0e10cSrcweir = md.find(::comphelper::MediaDescriptor::PROP_MEDIATYPE()); 2106cdf0e10cSrcweir if (iter != md.end()) { 2107cdf0e10cSrcweir css::uno::Reference< css::beans::XPropertySet > xProps(xStorage, 2108cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 2109cdf0e10cSrcweir xProps->setPropertyValue( 2110cdf0e10cSrcweir ::comphelper::MediaDescriptor::PROP_MEDIATYPE(), 2111cdf0e10cSrcweir iter->second); 2112cdf0e10cSrcweir } 2113cdf0e10cSrcweir storeToStorage(xStorage, md.getAsConstPropertyValueList()); 2114cdf0e10cSrcweir 2115cdf0e10cSrcweir 2116cdf0e10cSrcweir const sal_Bool bOk = aMedium.Commit(); 2117cdf0e10cSrcweir aMedium.Close(); 2118cdf0e10cSrcweir if ( !bOk ) { 2119cdf0e10cSrcweir sal_uInt32 nError = aMedium.GetError(); 2120cdf0e10cSrcweir if ( nError == ERRCODE_NONE ) { 2121cdf0e10cSrcweir nError = ERRCODE_IO_GENERAL; 2122cdf0e10cSrcweir } 2123cdf0e10cSrcweir 2124cdf0e10cSrcweir throw css::task::ErrorCodeIOException( ::rtl::OUString(), 2125cdf0e10cSrcweir css::uno::Reference< css::uno::XInterface >(), nError); 2126cdf0e10cSrcweir 2127cdf0e10cSrcweir } 2128cdf0e10cSrcweir } 2129cdf0e10cSrcweir 2130cdf0e10cSrcweir // ::com::sun::star::lang::XInitialization: 2131cdf0e10cSrcweir void SAL_CALL 2132cdf0e10cSrcweir SfxDocumentMetaData::initialize( 2133cdf0e10cSrcweir const css::uno::Sequence< ::com::sun::star::uno::Any > & aArguments) 2134cdf0e10cSrcweir throw (css::uno::RuntimeException, css::uno::Exception) 2135cdf0e10cSrcweir { 2136cdf0e10cSrcweir // possible arguments: 2137cdf0e10cSrcweir // - no argument: default initialization (empty DOM) 2138cdf0e10cSrcweir // - 1 argument, XDocument: initialize with given DOM and empty base URL 2139cdf0e10cSrcweir // NB: links in document must be absolute 2140cdf0e10cSrcweir 2141cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 2142cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XDocument> xDoc; 2143cdf0e10cSrcweir 2144cdf0e10cSrcweir for (sal_Int32 i = 0; i < aArguments.getLength(); ++i) { 2145cdf0e10cSrcweir const css::uno::Any any = aArguments[i]; 2146cdf0e10cSrcweir if (any >>= xDoc) { 2147cdf0e10cSrcweir if (!xDoc.is()) { 2148cdf0e10cSrcweir throw css::lang::IllegalArgumentException( 2149cdf0e10cSrcweir ::rtl::OUString::createFromAscii("SfxDocumentMetaData::" 2150cdf0e10cSrcweir "initialize: argument is null"), 2151cdf0e10cSrcweir *this, static_cast<sal_Int16>(i)); 2152cdf0e10cSrcweir } 2153cdf0e10cSrcweir } else { 2154cdf0e10cSrcweir throw css::lang::IllegalArgumentException( 2155cdf0e10cSrcweir ::rtl::OUString::createFromAscii("SfxDocumentMetaData::" 2156cdf0e10cSrcweir "initialize: argument must be XDocument"), 2157cdf0e10cSrcweir *this, static_cast<sal_Int16>(i)); 2158cdf0e10cSrcweir } 2159cdf0e10cSrcweir } 2160cdf0e10cSrcweir 2161cdf0e10cSrcweir if (!xDoc.is()) { 2162cdf0e10cSrcweir // For a new document, we create a new DOM tree here. 2163cdf0e10cSrcweir xDoc = createDOM(); 2164cdf0e10cSrcweir } 2165cdf0e10cSrcweir 2166cdf0e10cSrcweir init(xDoc); 2167cdf0e10cSrcweir } 2168cdf0e10cSrcweir 2169cdf0e10cSrcweir // ::com::sun::star::util::XCloneable: 2170cdf0e10cSrcweir css::uno::Reference<css::util::XCloneable> SAL_CALL 2171cdf0e10cSrcweir SfxDocumentMetaData::createClone() 2172cdf0e10cSrcweir throw (css::uno::RuntimeException) 2173cdf0e10cSrcweir { 2174cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 2175cdf0e10cSrcweir checkInit(); 2176cdf0e10cSrcweir 2177cdf0e10cSrcweir SfxDocumentMetaData *pNew = new SfxDocumentMetaData(m_xContext); 2178cdf0e10cSrcweir 2179cdf0e10cSrcweir // NB: do not copy the modification listeners, only DOM 2180cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XDocument> xDoc = createDOM(); 2181cdf0e10cSrcweir try { 2182cdf0e10cSrcweir updateUserDefinedAndAttributes(); 2183cdf0e10cSrcweir // deep copy of root node 2184cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xRoot( 2185cdf0e10cSrcweir m_xDoc->getDocumentElement(), css::uno::UNO_QUERY_THROW); 2186cdf0e10cSrcweir css::uno::Reference<css::xml::dom::XNode> xRootNew( 2187cdf0e10cSrcweir xDoc->importNode(xRoot, true)); 2188cdf0e10cSrcweir xDoc->appendChild(xRootNew); 2189cdf0e10cSrcweir pNew->init(xDoc); 2190cdf0e10cSrcweir } catch (css::uno::RuntimeException &) { 2191cdf0e10cSrcweir throw; 2192cdf0e10cSrcweir } catch (css::uno::Exception & e) { 2193cdf0e10cSrcweir css::uno::Any a(e); 2194cdf0e10cSrcweir throw css::lang::WrappedTargetRuntimeException( 2195cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 2196cdf0e10cSrcweir "SfxDocumentMetaData::createClone: exception"), 2197cdf0e10cSrcweir css::uno::Reference<css::uno::XInterface>(*this), a); 2198cdf0e10cSrcweir } 2199cdf0e10cSrcweir // return static_cast< ::cppu::OWeakObject * > (pNew); 2200cdf0e10cSrcweir return css::uno::Reference<css::util::XCloneable> (pNew); 2201cdf0e10cSrcweir } 2202cdf0e10cSrcweir 2203cdf0e10cSrcweir // ::com::sun::star::util::XModifiable: 2204cdf0e10cSrcweir ::sal_Bool SAL_CALL SfxDocumentMetaData::isModified( ) 2205cdf0e10cSrcweir throw (css::uno::RuntimeException) 2206cdf0e10cSrcweir { 2207cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 2208cdf0e10cSrcweir checkInit(); 2209cdf0e10cSrcweir css::uno::Reference<css::util::XModifiable> xMB(m_xUserDefined, 2210cdf0e10cSrcweir css::uno::UNO_QUERY); 2211cdf0e10cSrcweir return m_isModified || (xMB.is() ? xMB->isModified() : sal_False); 2212cdf0e10cSrcweir } 2213cdf0e10cSrcweir 2214cdf0e10cSrcweir void SAL_CALL SfxDocumentMetaData::setModified( ::sal_Bool bModified ) 2215cdf0e10cSrcweir throw (css::beans::PropertyVetoException, css::uno::RuntimeException) 2216cdf0e10cSrcweir { 2217cdf0e10cSrcweir css::uno::Reference<css::util::XModifiable> xMB; 2218cdf0e10cSrcweir { // do not lock mutex while notifying (#i93514#) to prevent deadlock 2219cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 2220cdf0e10cSrcweir checkInit(); 2221cdf0e10cSrcweir m_isModified = bModified; 2222cdf0e10cSrcweir if ( !bModified && m_xUserDefined.is() ) 2223cdf0e10cSrcweir { 2224cdf0e10cSrcweir xMB.set(m_xUserDefined, css::uno::UNO_QUERY); 2225cdf0e10cSrcweir DBG_ASSERT(xMB.is(), 2226cdf0e10cSrcweir "SfxDocumentMetaData::setModified: PropertyBag not Modifiable?"); 2227cdf0e10cSrcweir } 2228cdf0e10cSrcweir } 2229cdf0e10cSrcweir if (bModified) { 2230cdf0e10cSrcweir try { 2231cdf0e10cSrcweir css::uno::Reference<css::uno::XInterface> xThis(*this); 2232cdf0e10cSrcweir css::lang::EventObject event(xThis); 2233cdf0e10cSrcweir m_NotifyListeners.notifyEach(&css::util::XModifyListener::modified, 2234cdf0e10cSrcweir event); 2235cdf0e10cSrcweir } catch (css::uno::RuntimeException &) { 2236cdf0e10cSrcweir throw; 2237cdf0e10cSrcweir } catch (css::uno::Exception & e) { 2238cdf0e10cSrcweir // ignore 2239cdf0e10cSrcweir DBG_WARNING1("SfxDocumentMetaData::setModified: exception:\n%s", 2240cdf0e10cSrcweir OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr()); 2241cdf0e10cSrcweir (void) e; 2242cdf0e10cSrcweir } 2243cdf0e10cSrcweir } else { 2244cdf0e10cSrcweir if (xMB.is()) { 2245cdf0e10cSrcweir xMB->setModified(false); 2246cdf0e10cSrcweir } 2247cdf0e10cSrcweir } 2248cdf0e10cSrcweir } 2249cdf0e10cSrcweir 2250cdf0e10cSrcweir // ::com::sun::star::util::XModifyBroadcaster: 2251cdf0e10cSrcweir void SAL_CALL SfxDocumentMetaData::addModifyListener( 2252cdf0e10cSrcweir const css::uno::Reference< css::util::XModifyListener > & xListener) 2253cdf0e10cSrcweir throw (css::uno::RuntimeException) 2254cdf0e10cSrcweir { 2255cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 2256cdf0e10cSrcweir checkInit(); 2257cdf0e10cSrcweir m_NotifyListeners.addInterface(xListener); 2258cdf0e10cSrcweir css::uno::Reference<css::util::XModifyBroadcaster> xMB(m_xUserDefined, 2259cdf0e10cSrcweir css::uno::UNO_QUERY); 2260cdf0e10cSrcweir if (xMB.is()) { 2261cdf0e10cSrcweir xMB->addModifyListener(xListener); 2262cdf0e10cSrcweir } 2263cdf0e10cSrcweir } 2264cdf0e10cSrcweir 2265cdf0e10cSrcweir void SAL_CALL SfxDocumentMetaData::removeModifyListener( 2266cdf0e10cSrcweir const css::uno::Reference< css::util::XModifyListener > & xListener) 2267cdf0e10cSrcweir throw (css::uno::RuntimeException) 2268cdf0e10cSrcweir { 2269cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 2270cdf0e10cSrcweir checkInit(); 2271cdf0e10cSrcweir m_NotifyListeners.removeInterface(xListener); 2272cdf0e10cSrcweir css::uno::Reference<css::util::XModifyBroadcaster> xMB(m_xUserDefined, 2273cdf0e10cSrcweir css::uno::UNO_QUERY); 2274cdf0e10cSrcweir if (xMB.is()) { 2275cdf0e10cSrcweir xMB->removeModifyListener(xListener); 2276cdf0e10cSrcweir } 2277cdf0e10cSrcweir } 2278cdf0e10cSrcweir 2279cdf0e10cSrcweir // ::com::sun::star::xml::sax::XSAXSerializable 2280cdf0e10cSrcweir void SAL_CALL SfxDocumentMetaData::serialize( 2281cdf0e10cSrcweir const css::uno::Reference<css::xml::sax::XDocumentHandler>& i_xHandler, 2282cdf0e10cSrcweir const css::uno::Sequence< css::beans::StringPair >& i_rNamespaces) 2283cdf0e10cSrcweir throw (css::uno::RuntimeException, css::xml::sax::SAXException) 2284cdf0e10cSrcweir { 2285cdf0e10cSrcweir ::osl::MutexGuard g(m_aMutex); 2286cdf0e10cSrcweir checkInit(); 2287cdf0e10cSrcweir updateUserDefinedAndAttributes(); 2288cdf0e10cSrcweir css::uno::Reference<css::xml::sax::XSAXSerializable> xSAXable(m_xDoc, 2289cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 2290cdf0e10cSrcweir xSAXable->serialize(i_xHandler, i_rNamespaces); 2291cdf0e10cSrcweir } 2292cdf0e10cSrcweir 2293cdf0e10cSrcweir void SfxDocumentMetaData::createUserDefined() 2294cdf0e10cSrcweir { 2295cdf0e10cSrcweir // user-defined meta data: create PropertyBag which only accepts property 2296cdf0e10cSrcweir // values of allowed types 2297cdf0e10cSrcweir if ( !m_xUserDefined.is() ) 2298cdf0e10cSrcweir { 2299cdf0e10cSrcweir css::uno::Sequence<css::uno::Type> types(11); 2300cdf0e10cSrcweir types[0] = ::cppu::UnoType<bool>::get(); 2301cdf0e10cSrcweir types[1] = ::cppu::UnoType< ::rtl::OUString>::get(); 2302cdf0e10cSrcweir types[2] = ::cppu::UnoType<css::util::DateTime>::get(); 2303cdf0e10cSrcweir types[3] = ::cppu::UnoType<css::util::Date>::get(); 2304cdf0e10cSrcweir types[4] = ::cppu::UnoType<css::util::Duration>::get(); 2305cdf0e10cSrcweir types[5] = ::cppu::UnoType<float>::get(); 2306cdf0e10cSrcweir types[6] = ::cppu::UnoType<double>::get(); 2307cdf0e10cSrcweir types[7] = ::cppu::UnoType<sal_Int16>::get(); 2308cdf0e10cSrcweir types[8] = ::cppu::UnoType<sal_Int32>::get(); 2309cdf0e10cSrcweir types[9] = ::cppu::UnoType<sal_Int64>::get(); 2310cdf0e10cSrcweir // Time is supported for backward compatibility with OOo 3.x, x<=2 2311cdf0e10cSrcweir types[10] = ::cppu::UnoType<css::util::Time>::get(); 2312cdf0e10cSrcweir css::uno::Sequence<css::uno::Any> args(2); 2313cdf0e10cSrcweir args[0] <<= css::beans::NamedValue( 2314cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AllowedTypes")), 2315cdf0e10cSrcweir css::uno::makeAny(types)); 2316cdf0e10cSrcweir // #i94175#: ODF allows empty user-defined property names! 2317cdf0e10cSrcweir args[1] <<= css::beans::NamedValue( ::rtl::OUString( 2318cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM("AllowEmptyPropertyName")), 2319cdf0e10cSrcweir css::uno::makeAny(sal_True)); 2320cdf0e10cSrcweir 2321cdf0e10cSrcweir const css::uno::Reference<css::lang::XMultiComponentFactory> xMsf( 2322cdf0e10cSrcweir m_xContext->getServiceManager()); 2323cdf0e10cSrcweir m_xUserDefined.set( 2324cdf0e10cSrcweir xMsf->createInstanceWithContext( 2325cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 2326cdf0e10cSrcweir "com.sun.star.beans.PropertyBag")), m_xContext), 2327cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 2328cdf0e10cSrcweir const css::uno::Reference<css::lang::XInitialization> xInit( 2329cdf0e10cSrcweir m_xUserDefined, css::uno::UNO_QUERY); 2330cdf0e10cSrcweir if (xInit.is()) { 2331cdf0e10cSrcweir xInit->initialize(args); 2332cdf0e10cSrcweir } 2333cdf0e10cSrcweir 2334cdf0e10cSrcweir const css::uno::Reference<css::util::XModifyBroadcaster> xMB( 2335cdf0e10cSrcweir m_xUserDefined, css::uno::UNO_QUERY); 2336cdf0e10cSrcweir if (xMB.is()) 2337cdf0e10cSrcweir { 2338cdf0e10cSrcweir const css::uno::Sequence<css::uno::Reference<css::uno::XInterface> > 2339cdf0e10cSrcweir listeners(m_NotifyListeners.getElements()); 2340cdf0e10cSrcweir for (css::uno::Reference< css::uno::XInterface > const * iter = 2341cdf0e10cSrcweir ::comphelper::stl_begin(listeners); 2342cdf0e10cSrcweir iter != ::comphelper::stl_end(listeners); ++iter) { 2343cdf0e10cSrcweir xMB->addModifyListener( 2344cdf0e10cSrcweir css::uno::Reference< css::util::XModifyListener >(*iter, 2345cdf0e10cSrcweir css::uno::UNO_QUERY)); 2346cdf0e10cSrcweir } 2347cdf0e10cSrcweir } 2348cdf0e10cSrcweir } 2349cdf0e10cSrcweir } 2350cdf0e10cSrcweir 2351cdf0e10cSrcweir } // closing anonymous implementation namespace 2352cdf0e10cSrcweir 2353cdf0e10cSrcweir 2354cdf0e10cSrcweir // component helper namespace 2355cdf0e10cSrcweir namespace comp_SfxDocumentMetaData { 2356cdf0e10cSrcweir 2357cdf0e10cSrcweir ::rtl::OUString SAL_CALL _getImplementationName() { 2358cdf0e10cSrcweir return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 2359cdf0e10cSrcweir "SfxDocumentMetaData")); 2360cdf0e10cSrcweir } 2361cdf0e10cSrcweir 2362cdf0e10cSrcweir css::uno::Sequence< ::rtl::OUString > SAL_CALL _getSupportedServiceNames() 2363cdf0e10cSrcweir { 2364cdf0e10cSrcweir css::uno::Sequence< ::rtl::OUString > s(1); 2365cdf0e10cSrcweir s[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 2366cdf0e10cSrcweir "com.sun.star.document.DocumentProperties")); 2367cdf0e10cSrcweir return s; 2368cdf0e10cSrcweir } 2369cdf0e10cSrcweir 2370cdf0e10cSrcweir css::uno::Reference< css::uno::XInterface > SAL_CALL _create( 2371cdf0e10cSrcweir const css::uno::Reference< css::uno::XComponentContext > & context) 2372cdf0e10cSrcweir SAL_THROW((css::uno::Exception)) 2373cdf0e10cSrcweir { 2374cdf0e10cSrcweir return static_cast< ::cppu::OWeakObject * > 2375cdf0e10cSrcweir (new SfxDocumentMetaData(context)); 2376cdf0e10cSrcweir } 2377cdf0e10cSrcweir 2378cdf0e10cSrcweir } // closing component helper namespace 2379cdf0e10cSrcweir 2380cdf0e10cSrcweir static ::cppu::ImplementationEntry const entries[] = { 2381cdf0e10cSrcweir { &comp_SfxDocumentMetaData::_create, 2382cdf0e10cSrcweir &comp_SfxDocumentMetaData::_getImplementationName, 2383cdf0e10cSrcweir &comp_SfxDocumentMetaData::_getSupportedServiceNames, 2384cdf0e10cSrcweir &::cppu::createSingleComponentFactory, 0, 0 }, 2385cdf0e10cSrcweir { 0, 0, 0, 0, 0, 0 } 2386cdf0e10cSrcweir }; 2387cdf0e10cSrcweir 2388cdf0e10cSrcweir #if 0 2389cdf0e10cSrcweir extern "C" void SAL_CALL component_getImplementationEnvironment( 2390cdf0e10cSrcweir const char ** envTypeName, uno_Environment **) 2391cdf0e10cSrcweir { 2392cdf0e10cSrcweir *envTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; 2393cdf0e10cSrcweir } 2394cdf0e10cSrcweir 2395cdf0e10cSrcweir extern "C" void * SAL_CALL component_getFactory( 2396cdf0e10cSrcweir const char * implName, void * serviceManager, void * registryKey) 2397cdf0e10cSrcweir { 2398cdf0e10cSrcweir return ::cppu::component_getFactoryHelper( 2399cdf0e10cSrcweir implName, serviceManager, registryKey, entries); 2400cdf0e10cSrcweir } 2401cdf0e10cSrcweir #endif 2402cdf0e10cSrcweir 2403