XML Reader and Writer
From Apache OpenOffice Wiki
Tasks
- Study the other reader/writers in framework/inc/xml / framework/source/xml
- Write the code
- Test it
MenuBar Reader/Writer
Because of similarities between a context menu and a menu bar (they both are implemented as VCL Menus), the context menu reader/writer will be based on the menu bar reader/writer:
- framework/inc/xml/menuconfiguration.hxx
- framework/source/xml/menuconfiguration.cxx
- framework/inc/xml/menudocumenthandler.hxx
- framework/source/xml/menudocumenthandler.cxx
Test
Created a small application to test the new functionality. Test is located on framework/workben/xml
/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * 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_framework.hxx" #include <sal/main.h> #include <sal/config.h> #include <osl/file.hxx> #include <osl/process.h> #include <rtl/ustring.hxx> #include <cppuhelper/bootstrap.hxx> #include <vcl/svapp.hxx> #include <uielement/rootitemcontainer.hxx> #include <xml/contextmenuconfiguration.hxx> #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/lang/XComponent.hpp> #include <com/sun/star/ucb/XSimpleFileAccess.hpp> #include <vector> // ----------------------------------------------------------------------- using namespace rtl; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; namespace css = ::com::sun::star; // ----------------------------------------------------------------------- const OUString ConvertToURL(const OUString& aFileName) { OUString uFileNameUrl; // If aFileName is *only* a file name... // This assumes the file is in the working directory (== with our executable) if ( aFileName.indexOf('.') == 0 || aFileName.indexOf( SAL_PATHDELIMITER ) < 0 ) { // Get the working directory of the current process as a file URL. OUString uWorkingDirURL; if ( osl_getProcessWorkingDir( &uWorkingDirURL.pData ) != osl_Process_E_None ) { OSL_ASSERT(sal_False); } // Convert the path relative to the working directory // into an full qualified file URL. if ( osl::FileBase::getAbsoluteFileURL( uWorkingDirURL, aFileName, uFileNameUrl) != osl::FileBase::E_None ) { OSL_ASSERT(sal_False); } } // If the file name is a system path... else { // Convert the system dependend path into a file URL if ( osl::FileBase::getFileURLFromSystemPath(aFileName, uFileNameUrl) != osl::FileBase::E_None ) { OSL_ASSERT(sal_False); } } return uFileNameUrl; } // ----------------------------------------------------------------------- sal_Bool TestContextMenuReaderWriter(const Reference<XComponentContext>& rContext, const OUString sIn, const OUString sOut ) { sal_Bool bOk = sal_False; try { Reference < css::ucb::XSimpleFileAccess > xSFA( rContext->getServiceManager()->createInstanceWithContext( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ucb.SimpleFileAccess" ) ), rContext ), UNO_QUERY_THROW ); OUString sInURL = ConvertToURL(sIn); OUString sOutURL = ConvertToURL(sOut); Reference<css::io::XInputStream> xInput = xSFA->openFileRead(sInURL); Reference<css::io::XOutputStream> xOutput = xSFA->openFileWrite(sOutURL); Reference<css::container::XIndexContainer> xItemContainer( static_cast<cppu::OWeakObject*>(new framework::RootItemContainer()), UNO_QUERY ); bOk = framework::ContextMenuConfiguration::LoadContextMenu( Reference<XMultiServiceFactory>(rContext->getServiceManager(),UNO_QUERY), xInput, xItemContainer ); if (bOk && xItemContainer->hasElements() ) { fprintf(stdout,"Could read XML file\n"); bOk = framework::ContextMenuConfiguration::StoreContextMenu( Reference<XMultiServiceFactory>(rContext->getServiceManager(), UNO_QUERY), xOutput, Reference<css::container::XIndexAccess>(xItemContainer, UNO_QUERY) ); if (bOk) fprintf(stdout,"Could write XML file\n"); } xInput->closeInput(); xOutput->closeOutput(); } catch (...) { bOk = sal_False; } return bOk; } // ----------------------------------------------------------------------- bool GetCommandOption( const ::std::vector< OUString >& rArgs, const OUString& rSwitch, OUString& rParam ) { bool bRet = false; OUString aSwitch( OUString::createFromAscii( "-" )); aSwitch += rSwitch; for ( int i = 0, nCount = rArgs.size(); ( i < nCount ) && !bRet; i++ ) { for ( int n = 0; ( n < 2 ) && !bRet; n++ ) { if ( aSwitch.equalsIgnoreAsciiCase( rArgs[ i ] )) { bRet = true; if ( i < ( nCount - 1 ) ) rParam = rArgs[ i + 1 ]; else rParam = OUString(); } } } return bRet; } // ----------------------------------------------------------------------- void ShowUsage() { fprintf( stderr, "Usage: contextmenu -i input_file -o output_file\n" ); fprintf( stderr, "Options:" ); fprintf( stderr, " -i name of XML file that should be processed\n" ); fprintf( stderr, " -o name of file, XML output should be written to\n" ); fprintf( stderr, "Examples:\n" ); fprintf( stderr, " contextmenu -i contextmenu.xml -o contextmenu-out.xml\n" ); } // ----------------------------------------------------------------------- // Forward declaration void Main(com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > xContext); // ----------------------------------------------------------------------- SAL_IMPLEMENT_MAIN() { Reference< XMultiServiceFactory > xMS; Reference< XComponentContext > xComponentContext = ::cppu::bootstrap(); xMS = Reference< XMultiServiceFactory >( xComponentContext->getServiceManager() , UNO_QUERY ); InitVCL( xMS ); ::Main(xComponentContext); DeInitVCL(); return 0; } void Main(Reference< XComponentContext > rContext) { ::std::vector< OUString > aArgs; sal_uInt32 nCmds = osl_getCommandArgCount(); if ( nCmds == 4 ) { for ( sal_uInt32 i = 0; i < nCmds; i++ ) { OUString aArg; osl_getCommandArg( i, &aArg.pData ); aArgs.push_back( aArg ); } OUString aInput; OUString aOutput; GetCommandOption( aArgs, OUString::createFromAscii( "i" ), aInput ); GetCommandOption( aArgs, OUString::createFromAscii( "o" ), aOutput ); if ( aInput.getLength() > 0 && aOutput.getLength() > 0 ) { TestContextMenuReaderWriter(rContext, aInput, aOutput); } else { ShowUsage(); exit( -1 ); } } else { ShowUsage(); exit( -1 ); } }