/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "cppuhelper/bootstrap.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star; using namespace ::com::sun::star::sheet; using ::com::sun::star::beans::Property; using ::com::sun::star::beans::PropertyValue; using ::com::sun::star::beans::XPropertySet; using ::com::sun::star::beans::XPropertySetInfo; using ::com::sun::star::container::XNameContainer; using ::com::sun::star::lang::XComponent; using ::com::sun::star::lang::XMultiComponentFactory; using ::com::sun::star::frame::XComponentLoader; using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::Sequence; using ::com::sun::star::uno::UNO_QUERY; using ::com::sun::star::uno::UNO_QUERY_THROW; using ::com::sun::star::uno::XComponentContext; using ::com::sun::star::uno::XInterface; using ::com::sun::star::ucb::XSimpleFileAccess; using ::com::sun::star::document::XTypeDetection; using ::rtl::OUString; using ::std::auto_ptr; const OUString EXTN = rtl::OUString::createFromAscii(".xls"); OUString convertToURL( const OUString& rPath ) { rtl::OUString aURL; INetURLObject aObj; aObj.SetURL( rPath ); bool bIsURL = aObj.GetProtocol() != INET_PROT_NOT_VALID; if ( bIsURL ) aURL = rPath; else { osl::FileBase::getFileURLFromSystemPath( rPath, aURL ); if ( aURL.equals( rPath ) ) throw uno::RuntimeException( rtl::OUString::createFromAscii( "could'nt convert " ).concat( rPath ).concat( rtl::OUString::createFromAscii( " to a URL, is it a fully qualified path name? " ) ), Reference< uno::XInterface >() ); } return aURL; } OUString ascii(const sal_Char* cstr) { return OUString::createFromAscii(cstr); } const sal_Char* getStr(const OUString& ou) { return OUStringToOString(ou, RTL_TEXTENCODING_UTF8).getStr(); } int usage( const char* pName ) { std::cerr << "usage: " << pName << " " << std::endl; return 1; } class TestVBA { private: Reference< XComponentContext > mxContext; Reference< XMultiComponentFactory > mxMCF; Reference< XComponentLoader > mxCompLoader; Reference< XSimpleFileAccess > mxSFA; rtl::OUString msOutDirPath; protected: public: TestVBA( const Reference< XComponentContext >& _xContext, const Reference< XMultiComponentFactory >& _xMCF, const Reference< XComponentLoader >& _xCompLoader, const rtl::OUString& _outDirPath ) : mxContext( _xContext ), mxMCF( _xMCF ), mxCompLoader( _xCompLoader ), msOutDirPath( convertToURL( _outDirPath ) ) { mxSFA.set( mxMCF->createInstanceWithContext( rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), mxContext), uno::UNO_QUERY_THROW ); } rtl::OUString getLogLocation() throw ( beans::UnknownPropertyException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::Exception ) { rtl::OUString sLogLocation; Reference< XPropertySet > pathSettings( mxMCF->createInstanceWithContext( rtl::OUString::createFromAscii( "com.sun.star.comp.framework.PathSettings" ), mxContext), uno::UNO_QUERY_THROW ); pathSettings->getPropertyValue( rtl::OUString::createFromAscii( "Work" ) ) >>= sLogLocation; sLogLocation = sLogLocation.concat( rtl::OUString::createFromAscii( "/" ) ).concat( rtl::OUString::createFromAscii( "HelperAPI-test.log" ) ); return sLogLocation; } rtl::OUString getLogLocationWithName( OUString fileName ) throw ( beans::UnknownPropertyException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::Exception ) { printf("%s\n", getenv("HOME") ); printf("file name %s\n", rtl::OUStringToOString( fileName, RTL_TEXTENCODING_UTF8 ).getStr() ); //rtl::OUString sLogLocation( rtl::OUString::createFromAscii( getenv("HOME") ) ); rtl::OUString sLogLocation; Reference< XPropertySet > pathSettings( mxMCF->createInstanceWithContext( rtl::OUString::createFromAscii( "com.sun.star.comp.framework.PathSettings" ), mxContext), uno::UNO_QUERY_THROW ); pathSettings->getPropertyValue( rtl::OUString::createFromAscii( "Work" ) ) >>= sLogLocation; sLogLocation = sLogLocation.concat( rtl::OUString::createFromAscii( "/" ) ).concat( fileName.copy ( 0, fileName.lastIndexOf( EXTN ) ) + rtl::OUString::createFromAscii( ".log" ) ); return sLogLocation; } void init() { // blow away previous logs? } void proccessDocument( const rtl::OUString& sUrl ) { if ( !mxSFA->isFolder( sUrl ) && sUrl.endsWithIgnoreAsciiCaseAsciiL( ".xls", 4 ) ) { try { OSL_TRACE( "processing %s", rtl::OUStringToOString( sUrl, RTL_TEXTENCODING_UTF8 ).getStr() ); printf( "processing %s\n", rtl::OUStringToOString( sUrl, RTL_TEXTENCODING_UTF8 ).getStr() ); // Loading the wanted document Sequence< PropertyValue > propertyValues(1); propertyValues[0].Name = rtl::OUString::createFromAscii( "Hidden" ); propertyValues[0].Value <<= sal_False; rtl::OUString sfileUrl = convertToURL( sUrl ); printf( "try to get xDoc %s\n", rtl::OUStringToOString( sfileUrl, RTL_TEXTENCODING_UTF8 ).getStr() ); Reference< uno::XInterface > xDoc = mxCompLoader->loadComponentFromURL( sfileUrl, rtl::OUString::createFromAscii( "_blank" ), 0, propertyValues); printf( "got xDoc\n" ); OUString logFileURL = convertToURL( getLogLocation() ); try { Reference< script::provider::XScriptProviderSupplier > xSupplier( xDoc, uno::UNO_QUERY_THROW ) ; if ( mxSFA->exists( logFileURL ) ) mxSFA->kill( logFileURL ); printf("try to get the ScriptProvider\n"); Reference< script::provider::XScriptProvider > xProv = xSupplier->getScriptProvider(); printf("get the ScriptProvider\n"); printf("try to get the Script\n"); Reference< script::provider::XScript > xScript; try { xScript = xProv->getScript( rtl::OUString::createFromAscii( "vnd.sun.star.script:Standard.TestMacros.Main?language=Basic&location=document" )); } catch ( uno::Exception& e ) { try { xScript = xProv->getScript( rtl::OUString::createFromAscii( "vnd.sun.star.script:Standard.testMacro.Main?language=Basic&location=document" )); } catch ( uno::Exception& e2 ) { xScript = xProv->getScript( rtl::OUString::createFromAscii( "vnd.sun.star.script:Standard.testMain.Main?language=Basic&location=document" )); } } OSL_TRACE("Got script for doc %s", rtl::OUStringToOString( sUrl, RTL_TEXTENCODING_UTF8 ).getStr() ); printf("get the Script\n"); Sequence< uno::Any > aArgs; Sequence< sal_Int16 > aOutArgsIndex; Sequence< uno::Any > aOutArgs; xScript->invoke(aArgs, aOutArgsIndex, aOutArgs); OUString fileName = sUrl.copy ( sUrl.lastIndexOf( '/' ) ); OUString newLocation = msOutDirPath + fileName.copy ( 0, fileName.lastIndexOf( EXTN ) ) + rtl::OUString::createFromAscii( ".log" ); try { printf("move log file\n"); mxSFA->move( logFileURL, newLocation ); OSL_TRACE("new logfile location is %s ", rtl::OUStringToOString( newLocation, RTL_TEXTENCODING_UTF8 ).getStr() ); printf("moved to new location\n"); } catch ( uno::Exception& e ) { logFileURL = convertToURL( getLogLocationWithName( fileName ) ); printf("move log file from %s\n", rtl::OUStringToOString( logFileURL, RTL_TEXTENCODING_UTF8 ).getStr() ); mxSFA->move( logFileURL, newLocation ); OSL_TRACE("new logfile location is %s ", rtl::OUStringToOString( newLocation, RTL_TEXTENCODING_UTF8 ).getStr() ); printf("moved to new location\n"); } } catch ( uno::Exception& e ) { std::cerr << "Caught exception " << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() << std::endl; } // interface is supported, otherwise use XComponent.dispose Reference< util::XCloseable > xCloseable ( xDoc, uno::UNO_QUERY ); if ( xCloseable.is() ) { printf("try to close\n"); // will close application. and only run a test case for 3.0 // maybe it is a bug. yes, it is a bug // if only one frame and model, click a button which related will colse. // will make a crash. It related with window listener. // so, for run all test cases, it should not close the document at this moment. xCloseable->close(sal_False); printf("closed\n"); } else { printf("try to dispose\n"); Reference< XComponent > xComp( xDoc, uno::UNO_QUERY_THROW ); // same as close. xComp->dispose(); printf("disposed\n"); } } catch( uno::Exception& e ) { std::cerr << "Caught exception " << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() << std::endl; } } printf("complete processing %s\n", rtl::OUStringToOString( sUrl, RTL_TEXTENCODING_UTF8 ).getStr() ); } void traverse( const rtl::OUString& sFileDirectory ) { rtl::OUString sFileDirectoryURL = convertToURL( sFileDirectory ); if ( !mxSFA->isFolder( sFileDirectoryURL) ) { throw lang::IllegalArgumentException( rtl::OUString::createFromAscii( "not a directory: ").concat( sFileDirectoryURL ), Reference(), 1 ); } // Getting all files and directories in the current directory Sequence entries = mxSFA->getFolderContents( sFileDirectoryURL, sal_False ); // Iterating for each file and directory printf( "Entries %d\n", (int)entries.getLength() ); for ( sal_Int32 i = 0; i < entries.getLength(); ++i ) { proccessDocument( entries[ i ] ); } } }; void tryDispose( Reference< uno::XInterface > xIF, const char* sComp ) { Reference< lang::XComponent > xComponent( xIF, uno::UNO_QUERY ); if ( xComponent.is() ) { try { xComponent->dispose(); } catch( uno::Exception& e ) { std::cerr << "tryDispose caught exception " < 2 ) ) return usage( argc[0] ); try { OSL_TRACE("Attempting to bootstrap normal"); Reference xCC = ::cppu::bootstrap(); Reference xFactory = xCC->getServiceManager(); OSL_TRACE("got servicemanager"); std::cout << "got servicemanager" << std::endl; Reference desktop = xFactory->createInstanceWithContext( ascii("com.sun.star.frame.Desktop"), xCC); OSL_TRACE("got desktop"); std::cout << "got desktop" << std::endl; Reference xLoader(desktop, UNO_QUERY_THROW); TestVBA* dTest = new TestVBA( xCC, xFactory, xLoader, ascii( argc[ 2 ] ) ); if ( argv == 4 ) { std::cout << "before process" << std::endl; dTest->proccessDocument( ascii( argc[ 3 ] ) ); std::cout << "after process" << std::endl; } else { dTest->traverse( ascii( argc[ 1 ] ) ); } delete dTest; // tryDispose( xLoader, "desktop" ); // tryDispose( xCC, "remote context" ); } catch( uno::Exception& e ) { std::cerr << "Caught Exception " << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() << std::endl; } }