diff options
Diffstat (limited to 'configmgr/workben/local_io/xmlimport.cxx')
-rw-r--r-- | configmgr/workben/local_io/xmlimport.cxx | 472 |
1 files changed, 472 insertions, 0 deletions
diff --git a/configmgr/workben/local_io/xmlimport.cxx b/configmgr/workben/local_io/xmlimport.cxx new file mode 100644 index 000000000000..d910edd22b56 --- /dev/null +++ b/configmgr/workben/local_io/xmlimport.cxx @@ -0,0 +1,472 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: xmlimport.cxx,v $ + * $Revision: 1.7 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_configmgr.hxx" + +#include <memory> +#include <vector> +#include <stack> +#include<osl/file.hxx> + +#include <rtl/ustring.hxx> +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <cppuhelper/implbase1.hxx> +#include <cppuhelper/implbase2.hxx> +#include <cppuhelper/servicefactory.hxx> + +#ifndef _COM_SUN_STAR_LANG_XCOMPONENT_HDL_ +#include <com/sun/star/lang/XComponent.hpp> +#endif +#ifndef _COM_SUN_STAR_IO_XACTIVEDATASOURCE_HDL_ +#include <com/sun/star/io/XActiveDataSource.hpp> +#endif +#ifndef _COM_SUN_STAR_IO_XACTIVEDATASINK_HDL_ +#include <com/sun/star/io/XActiveDataSink.hpp> +#endif +#ifndef _COM_SUN_STAR_IO_XACTIVEDATACONTROL_HDL_ +#include <com/sun/star/io/XActiveDataControl.hpp> +#endif +#ifndef _COM_SUN_STAR_IO_XDATATRANSFEREVENTLISTENER_HDL_ +#include <com/sun/star/io/XDataTransferEventListener.hpp> +#endif +#ifndef _COM_SUN_STAR_IO_XDATAIMPORTER_HDL_ +#include <com/sun/star/io/XDataImporter.hpp> +#endif + +#ifndef _COM_SUN_STAR_IO_XINPUTSTREAM_HDL_ +#include <com/sun/star/io/XInputStream.hpp> +#endif +#include <com/sun/star/xml/sax/XParser.hpp> +#include <com/sun/star/xml/sax/SAXParseException.hpp> +#include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp> + +#include <com/sun/star/xml/sax/InputSource.hpp> +#include <vos/thread.hxx> + +#include <vos/pipe.hxx> +#include <osl/diagnose.h> +#include "oslstream.hxx" +#include <com/sun/star/xml/sax/XAttributeList.hpp> + +#include <com/sun/star/container/XHierarchicalNameAccess.hpp> +#include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/container/XHierarchicalName.hpp> + +#include <com/sun/star/container/XNameReplace.hpp> +#include <com/sun/star/util/XChangesBatch.hpp> +#include <com/sun/star/script/XTypeConverter.hpp> +#include <com/sun/star/container/XNameContainer.hpp> +#include <osl/conditn.hxx> + +#include "xmltreebuilder.hxx" + +#include "dataimport.hxx" + +#include "createpropertyvalue.hxx" +// ----------------------------------------------------------------------------- +// --------------------------------- namespaces --------------------------------- +// ----------------------------------------------------------------------------- +namespace uno = com::sun::star::uno; +namespace lang = com::sun::star::lang; +namespace io = com::sun::star::io; +namespace sax = com::sun::star::xml::sax; +namespace script = com::sun::star::script; + +using ::rtl::OUString; +using ::osl::File; + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::util; + +// ----------------------------------------------------------------------------- +// ---------------------------------- defines ---------------------------------- +// ----------------------------------------------------------------------------- +#ifndef ASCII +#define ASCII(x) OUString::createFromAscii(x) +#endif + + +// ----------------------------------------------------------------------------- +// ---------------------------------- a Class ---------------------------------- +// ----------------------------------------------------------------------------- +// <Name a="xyz" b="bar"> + +//========================================================================== +//= Visitors +//========================================================================== + + +// ----------------------------------------------------------------------------- +class Listener : public ::cppu::WeakImplHelper1<io::XDataTransferEventListener> +{ + osl::Condition m_aCondition; +public: + Listener() + { + m_aCondition.reset(); // will block + } + + virtual void SAL_CALL disposing( const lang::EventObject& Source ) + throw(::com::sun::star::uno::RuntimeException) + { + OSL_ENSURE(0, "disposing"); + m_aCondition.set(); // will not block + } + + virtual void SAL_CALL finished( const io::DataTransferEvent& aEvent ) + throw(uno::RuntimeException) + { + OSL_ENSURE(0, "finished"); + m_aCondition.set(); // will not block + } + + virtual void SAL_CALL cancelled( const io::DataTransferEvent& aEvent ) + throw(uno::RuntimeException) + { + OSL_ENSURE(0, "cancelled"); + m_aCondition.set(); // will not block + } +public: + void wait() + { + m_aCondition.wait(); + } +}; + +class Component: public ::cppu::WeakImplHelper1<lang::XComponent> +{ + virtual void SAL_CALL dispose( ) + throw(uno::RuntimeException) + { + OSL_ENSURE(0, "dispose"); + + } + virtual void SAL_CALL addEventListener( const uno::Reference< lang::XEventListener >& xListener ) + throw(uno::RuntimeException) + { + OSL_ENSURE(0, "addEventListener"); + } + virtual void SAL_CALL removeEventListener( const uno::Reference< lang::XEventListener >& aListener ) + throw(uno::RuntimeException) + { + OSL_ENSURE(0, "removeEventListener"); + } +}; + + + +namespace configmgr +{ + +// ----------------------------------------------------------------------------- +// ------------------------------------ Test ------------------------------------ +// ----------------------------------------------------------------------------- +#define ASCII_STRING(rtlOUString) rtl::OUStringToOString(rtlOUString, RTL_TEXTENCODING_ASCII_US).getStr() + static ::rtl::OUString sRegistry = ::rtl::OUString::createFromAscii("applicat.rdb"); + + void importTest() + { + uno::Reference< lang::XMultiServiceFactory > xMSF; + try + { + xMSF = cppu::createRegistryServiceFactory(sRegistry, ::rtl::OUString()); + } + catch (uno::Exception& e) + { + cout << "could not bootstrap the services from " << ASCII_STRING(sRegistry) << endl ; + cout << " (error message : " << ASCII_STRING(e.Message) << ")" << endl; + } + + if (!xMSF.is()) + { + cerr << "could not create the service factory !" << endl; + return; + } + + OUString aPath = ASCII("l:/SRC601/configmgr/workben/local_io"); + OUString aFilename = ASCII("hierarchy"); + OUString aExtension = ASCII("xml"); + + OUString aFullname = aPath + ASCII("/") + aFilename + ASCII(".") + aExtension; + + // Filename convertieren + OUString aURL; + File aConvert(ASCII("")); + aConvert.normalizePath(aFullname, aURL); + + // File oeffnen + File aFile(aURL); + aFile.open(osl_File_OpenFlag_Read); + + // sal_uInt64 nBytesRead; + // uno::Sequence< sal_Int8 > aBufferSeq(2000); + // sal_Int8 *pBuff = aBufferSeq.getArray(); + // aFile.read(pBuff, 2000, nBytesRead); + // + // aFile.close(); + + uno::Reference<io::XInputStream> xInputStream = new configmgr::OSLInputStreamWrapper(aFile); + + uno::Reference <uno::XInterface> xPump = xMSF->createInstance( L"com.sun.star.io.Pump" ); + OSL_ENSURE(xPump.is(), "there is no pump"); + + uno::Reference<io::XActiveDataSink> xPumpSink(xPump, uno::UNO_QUERY); + xPumpSink->setInputStream(xInputStream); + + uno::Reference<io::XActiveDataSource> xPumpSource(xPump, uno::UNO_QUERY); + + Listener *pListener = new Listener(); + uno::Reference<io::XDataTransferEventListener> rListener = pListener; + uno::Reference<lang::XComponent> rComponent = new Component(); + + // Create a TypeConverter + uno::Reference<script::XTypeConverter> aConverter; + aConverter = aConverter.query(xMSF->createInstance(ASCII( "com.sun.star.script.Converter" )) ); + + Sequence< uno::Any > aArgs(1); // optional arg. + aArgs[0] <<= configmgr::createPropertyValue(ASCII("TypeConverter"), aConverter); + + Reference< XInterface > xDataImport = xMSF->createInstanceWithArguments( + OUString::createFromAscii("com.sun.star.configuration.DataImport"), + aArgs); + + if (xDataImport.is()) + { + uno::Reference<io::XDataImporter> rImporter(xDataImport, UNO_QUERY); + + // Import Data + rImporter->importData(xPumpSource, rComponent, rListener); + + // lets pump + uno::Reference<io::XActiveDataControl> xControl(xPump, uno::UNO_QUERY); + xControl->start(); + + // TEST: + // rImporter->cancel(); + + // pImporter->wait(); + // Wait until the listener send ready + pListener->wait(); + } + return; + } + +// ----------------------------------------------------------------------------- +// -------------------------------- Import Test -------------------------------- +// ----------------------------------------------------------------------------- + + // ----------- TEST ReadAccess ----------- + void showSequence(const Sequence<OUString> &aSeq); + +void hierarchyTest() +{ + + uno::Reference< lang::XMultiServiceFactory > xMSF; + try + { + xMSF = cppu::createRegistryServiceFactory(sRegistry, ::rtl::OUString()); + } + catch (uno::Exception& e) + { + cout << "could not bootstrap the services from " << ASCII_STRING(sRegistry) << endl ; + cout << " (error message : " << ASCII_STRING(e.Message) << ")" << endl; + } + + if (!xMSF.is()) + { + cerr << "could not create the service factory !" << endl; + return; + } + + + Reference< XMultiServiceFactory > xCfgProvider( xMSF->createInstance( + ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider")), + UNO_QUERY); + + if (!xCfgProvider.is()) + { + OSL_ENSURE(0, "No Configuration Provider"); + } + + OUString sPath = ASCII("com.sun.star.ucb.Hierarchy"); + + Sequence< Any > aArgs(1); + aArgs[0] <<= sPath; + + Reference< XInterface > xCfgUpdt = xCfgProvider->createInstanceWithArguments( + OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"), + aArgs); + + Reference< XNameAccess > xNameAccess(xCfgUpdt, UNO_QUERY); + + // which Names are exist? + showSequence(xNameAccess->getElementNames()); + + OUString aNamePath = ASCII("Root"); + if (xNameAccess->hasByName(aNamePath)) + { + Any aAny; + aAny = xNameAccess->getByName(aNamePath); + TypeClass aTypeClass = aAny.getValueTypeClass(); + if (aAny.getValueTypeClass() == TypeClass_INTERFACE) + { + Reference< XInterface > xInterface; + aAny >>= xInterface; + Reference< XNameAccess > xNameAccess2(xInterface, UNO_QUERY); + if (xNameAccess.is()) + { + Sequence<OUString> aSeq = xNameAccess2->getElementNames(); + showSequence(aSeq); + + // insert a new set +/* + Reference<XHierarchicalName> xHierarchical(xNameAccess, UNO_QUERY); + OUString aHierachicalName = xHierarchical->getHierarchicalName(); + + Sequence< Any > aArgs(2); + aArgs[0] <<= aHierachicalName; + sal_Int32 nLevels=1; + aArgs[1] <<= nLevels; + + Reference< XInterface > xCfgNewUpdt = xCfgProvider->createInstanceWithArguments( + OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"), + aArgs); +*/ + Reference< lang::XSingleServiceFactory > xChildFactory(xNameAccess2, UNO_QUERY); + if (xChildFactory.is()) + { + Reference< XInterface > xChild = xChildFactory->createInstance(); + if (xChild.is()) + { + Reference<XNameAccess> xObjectOnTheMedow(xChild, UNO_QUERY); + + + + + // which Names are exist? + showSequence(xObjectOnTheMedow->getElementNames()); + + OUString aChildren = ASCII("Children"); + if (xObjectOnTheMedow->hasByName(aChildren)) + { + Any aAny; + aAny = xObjectOnTheMedow->getByName(aChildren); + TypeClass aTypeClass = aAny.getValueTypeClass(); + if (aAny.getValueTypeClass() == TypeClass_INTERFACE) + { + Reference< XInterface > xInterface; + aAny >>= xInterface; + Reference< XNameAccess > xChildFromOOM(xInterface, UNO_QUERY); + + if (xChildFromOOM.is()) + { + // insert a new Object in the new Object + + Reference< lang::XSingleServiceFactory > xChildFactory(xChildFromOOM, UNO_QUERY); + if (xChildFactory.is()) + { + Reference< XInterface > xChild = xChildFactory->createInstance(); + if (xChild.is()) + { + Reference<XNameContainer> xNameContainer(xChildFromOOM, UNO_QUERY); + if (xNameContainer.is()) + { + xNameContainer->insertByName(ASCII("Test2"), makeAny(xChild)); + } + } + } + } + } + } + + + Reference<XNameContainer> xNameContainer(xNameAccess2, UNO_QUERY); + if (xNameContainer.is()) + { + xNameContainer->insertByName(ASCII("Test"), makeAny(xObjectOnTheMedow)); + } + } + + // commit changes + Reference< XChangesBatch > xChangesBatch(xCfgUpdt, UNO_QUERY); + if (xChangesBatch.is()) + { + xChangesBatch->commitChanges(); + } + } + + Sequence<OUString> aSeq2 = xNameAccess2->getElementNames(); + showSequence(aSeq2); + +/* + OUString *pStr = aSeq.getArray(); + for (int i=0;i<aSeq.getLength();i++) + { + OUString aStr = pStr[i]; + Any aAny; + aAny = xNameAccess->getByName(aStr); + TypeClass aTypeClass = aAny.getValueTypeClass(); + + Reference< XNameReplace > xNameReplace(xNameAccess, UNO_QUERY); + + Any aNewAny; + sal_Bool bValue = false; + aNewAny <<= bValue; + xNameReplace->replaceByName(aStr, aNewAny); + + volatile int dummy = 0; + } +*/ + } + } + volatile int dummy = 0; + } +} + +// ------------------------------ Helperfunctions ------------------------------ + + void showSequence(const Sequence<OUString> &aSeq) + { + OUString aArray; + const OUString *pStr = aSeq.getConstArray(); + for (int i=0;i<aSeq.getLength();i++) + { + OUString aStr = pStr[i]; + aArray += aStr + ASCII(", "); + } + volatile int dummy = 0; + } + +} // namespace configmgr |