1*cdf0e10cSrcweir #include "cppuhelper/bootstrap.hxx" 2*cdf0e10cSrcweir 3*cdf0e10cSrcweir #include <com/sun/star/beans/Property.hpp> 4*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 5*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySetInfo.hpp> 6*cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp> 7*cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp> 8*cdf0e10cSrcweir #include <com/sun/star/frame/XComponentLoader.hpp> 9*cdf0e10cSrcweir #include <com/sun/star/lang/XMultiComponentFactory.hpp> 10*cdf0e10cSrcweir #include <com/sun/star/sheet/XSpreadsheet.hpp> 11*cdf0e10cSrcweir #include <com/sun/star/sheet/XSpreadsheetDocument.hpp> 12*cdf0e10cSrcweir #include <com/sun/star/util/XCloseable.hpp> 13*cdf0e10cSrcweir #include <com/sun/star/uno/XComponentContext.hpp> 14*cdf0e10cSrcweir #include <com/sun/star/ucb/XSimpleFileAccess.hpp> 15*cdf0e10cSrcweir #include <com/sun/star/script/provider/XScriptProviderSupplier.hpp> 16*cdf0e10cSrcweir #include <com/sun/star/document/XTypeDetection.hpp> 17*cdf0e10cSrcweir 18*cdf0e10cSrcweir #include <tools/urlobj.hxx> 19*cdf0e10cSrcweir #include <osl/file.hxx> 20*cdf0e10cSrcweir 21*cdf0e10cSrcweir #include <memory> 22*cdf0e10cSrcweir #include <iostream> 23*cdf0e10cSrcweir 24*cdf0e10cSrcweir using namespace ::com::sun::star; 25*cdf0e10cSrcweir using namespace ::com::sun::star::sheet; 26*cdf0e10cSrcweir 27*cdf0e10cSrcweir using ::com::sun::star::beans::Property; 28*cdf0e10cSrcweir using ::com::sun::star::beans::PropertyValue; 29*cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySet; 30*cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySetInfo; 31*cdf0e10cSrcweir using ::com::sun::star::container::XNameContainer; 32*cdf0e10cSrcweir using ::com::sun::star::lang::XComponent; 33*cdf0e10cSrcweir using ::com::sun::star::lang::XMultiComponentFactory; 34*cdf0e10cSrcweir using ::com::sun::star::frame::XComponentLoader; 35*cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 36*cdf0e10cSrcweir using ::com::sun::star::uno::Sequence; 37*cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY; 38*cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY_THROW; 39*cdf0e10cSrcweir using ::com::sun::star::uno::XComponentContext; 40*cdf0e10cSrcweir using ::com::sun::star::uno::XInterface; 41*cdf0e10cSrcweir using ::com::sun::star::ucb::XSimpleFileAccess; 42*cdf0e10cSrcweir using ::com::sun::star::document::XTypeDetection; 43*cdf0e10cSrcweir using ::rtl::OUString; 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir using ::std::auto_ptr; 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir const OUString EXTN = rtl::OUString::createFromAscii(".xls"); 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir OUString convertToURL( const OUString& rPath ) 50*cdf0e10cSrcweir { 51*cdf0e10cSrcweir rtl::OUString aURL; 52*cdf0e10cSrcweir INetURLObject aObj; 53*cdf0e10cSrcweir aObj.SetURL( rPath ); 54*cdf0e10cSrcweir bool bIsURL = aObj.GetProtocol() != INET_PROT_NOT_VALID; 55*cdf0e10cSrcweir if ( bIsURL ) 56*cdf0e10cSrcweir aURL = rPath; 57*cdf0e10cSrcweir else 58*cdf0e10cSrcweir { 59*cdf0e10cSrcweir osl::FileBase::getFileURLFromSystemPath( rPath, aURL ); 60*cdf0e10cSrcweir if ( aURL.equals( rPath ) ) 61*cdf0e10cSrcweir 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 >() ); 62*cdf0e10cSrcweir } 63*cdf0e10cSrcweir return aURL; 64*cdf0e10cSrcweir } 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir OUString ascii(const sal_Char* cstr) 67*cdf0e10cSrcweir { 68*cdf0e10cSrcweir return OUString::createFromAscii(cstr); 69*cdf0e10cSrcweir } 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir const sal_Char* getStr(const OUString& ou) 72*cdf0e10cSrcweir { 73*cdf0e10cSrcweir return OUStringToOString(ou, RTL_TEXTENCODING_UTF8).getStr(); 74*cdf0e10cSrcweir } 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir int usage( const char* pName ) 78*cdf0e10cSrcweir { 79*cdf0e10cSrcweir std::cerr << "usage: " << pName << "<path to testdocument dir> <output_directory>" << std::endl; 80*cdf0e10cSrcweir return 1; 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir } 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir class TestVBA 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir private: 87*cdf0e10cSrcweir Reference< XComponentContext > mxContext; 88*cdf0e10cSrcweir Reference< XMultiComponentFactory > mxMCF; 89*cdf0e10cSrcweir Reference< XComponentLoader > mxCompLoader; 90*cdf0e10cSrcweir Reference< XSimpleFileAccess > mxSFA; 91*cdf0e10cSrcweir rtl::OUString msOutDirPath; 92*cdf0e10cSrcweir protected: 93*cdf0e10cSrcweir public: 94*cdf0e10cSrcweir TestVBA( const Reference< XComponentContext >& _xContext, 95*cdf0e10cSrcweir const Reference< XMultiComponentFactory >& _xMCF, 96*cdf0e10cSrcweir const Reference< XComponentLoader >& _xCompLoader, 97*cdf0e10cSrcweir const rtl::OUString& _outDirPath ) : mxContext( _xContext ), mxMCF( _xMCF ), 98*cdf0e10cSrcweir mxCompLoader( _xCompLoader ), msOutDirPath( convertToURL( _outDirPath ) ) 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir mxSFA.set( mxMCF->createInstanceWithContext( rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), mxContext), uno::UNO_QUERY_THROW ); 101*cdf0e10cSrcweir } 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir rtl::OUString getLogLocation() throw ( beans::UnknownPropertyException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::Exception ) 104*cdf0e10cSrcweir { 105*cdf0e10cSrcweir rtl::OUString sLogLocation; 106*cdf0e10cSrcweir Reference< XPropertySet > pathSettings( mxMCF->createInstanceWithContext( rtl::OUString::createFromAscii( "com.sun.star.comp.framework.PathSettings" ), mxContext), uno::UNO_QUERY_THROW ); 107*cdf0e10cSrcweir pathSettings->getPropertyValue( rtl::OUString::createFromAscii( "Work" ) ) >>= sLogLocation; 108*cdf0e10cSrcweir sLogLocation = sLogLocation.concat( rtl::OUString::createFromAscii( "/" ) ).concat( rtl::OUString::createFromAscii( "HelperAPI-test.log" ) ); 109*cdf0e10cSrcweir return sLogLocation; 110*cdf0e10cSrcweir } 111*cdf0e10cSrcweir rtl::OUString getLogLocationWithName( OUString fileName ) throw ( beans::UnknownPropertyException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::Exception ) 112*cdf0e10cSrcweir { 113*cdf0e10cSrcweir printf("%s\n", getenv("HOME") ); 114*cdf0e10cSrcweir printf("file name %s\n", rtl::OUStringToOString( fileName, RTL_TEXTENCODING_UTF8 ).getStr() ); 115*cdf0e10cSrcweir //rtl::OUString sLogLocation( rtl::OUString::createFromAscii( getenv("HOME") ) ); 116*cdf0e10cSrcweir rtl::OUString sLogLocation; 117*cdf0e10cSrcweir Reference< XPropertySet > pathSettings( mxMCF->createInstanceWithContext( rtl::OUString::createFromAscii( "com.sun.star.comp.framework.PathSettings" ), mxContext), uno::UNO_QUERY_THROW ); 118*cdf0e10cSrcweir pathSettings->getPropertyValue( rtl::OUString::createFromAscii( "Work" ) ) >>= sLogLocation; 119*cdf0e10cSrcweir sLogLocation = sLogLocation.concat( rtl::OUString::createFromAscii( "/" ) ).concat( fileName.copy ( 0, fileName.lastIndexOf( EXTN ) ) + rtl::OUString::createFromAscii( ".log" ) ); 120*cdf0e10cSrcweir return sLogLocation; 121*cdf0e10cSrcweir } 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir void init() 124*cdf0e10cSrcweir { 125*cdf0e10cSrcweir // blow away previous logs? 126*cdf0e10cSrcweir } 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir void proccessDocument( const rtl::OUString& sUrl ) 129*cdf0e10cSrcweir { 130*cdf0e10cSrcweir if ( !mxSFA->isFolder( sUrl ) && sUrl.endsWithIgnoreAsciiCaseAsciiL( ".xls", 4 ) ) 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir { 133*cdf0e10cSrcweir try 134*cdf0e10cSrcweir { 135*cdf0e10cSrcweir OSL_TRACE( "processing %s", rtl::OUStringToOString( sUrl, RTL_TEXTENCODING_UTF8 ).getStr() ); 136*cdf0e10cSrcweir printf( "processing %s\n", rtl::OUStringToOString( sUrl, RTL_TEXTENCODING_UTF8 ).getStr() ); 137*cdf0e10cSrcweir // Loading the wanted document 138*cdf0e10cSrcweir Sequence< PropertyValue > propertyValues(1); 139*cdf0e10cSrcweir propertyValues[0].Name = rtl::OUString::createFromAscii( "Hidden" ); 140*cdf0e10cSrcweir propertyValues[0].Value <<= sal_False; 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir rtl::OUString sfileUrl = convertToURL( sUrl ); 143*cdf0e10cSrcweir printf( "try to get xDoc %s\n", rtl::OUStringToOString( sfileUrl, RTL_TEXTENCODING_UTF8 ).getStr() ); 144*cdf0e10cSrcweir Reference< uno::XInterface > xDoc = 145*cdf0e10cSrcweir mxCompLoader->loadComponentFromURL( sfileUrl, rtl::OUString::createFromAscii( "_blank" ), 0, propertyValues); 146*cdf0e10cSrcweir printf( "got xDoc\n" ); 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir OUString logFileURL = convertToURL( getLogLocation() ); 149*cdf0e10cSrcweir try 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir Reference< script::provider::XScriptProviderSupplier > xSupplier( xDoc, uno::UNO_QUERY_THROW ) ; 152*cdf0e10cSrcweir if ( mxSFA->exists( logFileURL ) ) 153*cdf0e10cSrcweir mxSFA->kill( logFileURL ); 154*cdf0e10cSrcweir 155*cdf0e10cSrcweir printf("try to get the ScriptProvider\n"); 156*cdf0e10cSrcweir Reference< script::provider::XScriptProvider > xProv = xSupplier->getScriptProvider(); 157*cdf0e10cSrcweir printf("get the ScriptProvider\n"); 158*cdf0e10cSrcweir printf("try to get the Script\n"); 159*cdf0e10cSrcweir Reference< script::provider::XScript > xScript; 160*cdf0e10cSrcweir try 161*cdf0e10cSrcweir { 162*cdf0e10cSrcweir xScript = xProv->getScript( rtl::OUString::createFromAscii( "vnd.sun.star.script:Standard.TestMacros.Main?language=Basic&location=document" )); 163*cdf0e10cSrcweir } catch ( uno::Exception& e ) 164*cdf0e10cSrcweir { 165*cdf0e10cSrcweir try 166*cdf0e10cSrcweir { 167*cdf0e10cSrcweir xScript = xProv->getScript( rtl::OUString::createFromAscii( "vnd.sun.star.script:Standard.testMacro.Main?language=Basic&location=document" )); 168*cdf0e10cSrcweir } catch ( uno::Exception& e2 ) 169*cdf0e10cSrcweir { 170*cdf0e10cSrcweir xScript = xProv->getScript( rtl::OUString::createFromAscii( "vnd.sun.star.script:Standard.testMain.Main?language=Basic&location=document" )); 171*cdf0e10cSrcweir } 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir OSL_TRACE("Got script for doc %s", rtl::OUStringToOString( sUrl, RTL_TEXTENCODING_UTF8 ).getStr() ); 174*cdf0e10cSrcweir printf("get the Script\n"); 175*cdf0e10cSrcweir Sequence< uno::Any > aArgs; 176*cdf0e10cSrcweir Sequence< sal_Int16 > aOutArgsIndex; 177*cdf0e10cSrcweir Sequence< uno::Any > aOutArgs; 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir xScript->invoke(aArgs, aOutArgsIndex, aOutArgs); 180*cdf0e10cSrcweir 181*cdf0e10cSrcweir OUString fileName = sUrl.copy ( sUrl.lastIndexOf( '/' ) ); 182*cdf0e10cSrcweir OUString newLocation = msOutDirPath + fileName.copy ( 0, fileName.lastIndexOf( EXTN ) ) + rtl::OUString::createFromAscii( ".log" ); 183*cdf0e10cSrcweir try 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir printf("move log file\n"); 186*cdf0e10cSrcweir mxSFA->move( logFileURL, newLocation ); 187*cdf0e10cSrcweir OSL_TRACE("new logfile location is %s ", rtl::OUStringToOString( newLocation, RTL_TEXTENCODING_UTF8 ).getStr() ); 188*cdf0e10cSrcweir printf("moved to new location\n"); 189*cdf0e10cSrcweir } 190*cdf0e10cSrcweir catch ( uno::Exception& e ) 191*cdf0e10cSrcweir { 192*cdf0e10cSrcweir logFileURL = convertToURL( getLogLocationWithName( fileName ) ); 193*cdf0e10cSrcweir printf("move log file from %s\n", rtl::OUStringToOString( logFileURL, RTL_TEXTENCODING_UTF8 ).getStr() ); 194*cdf0e10cSrcweir mxSFA->move( logFileURL, newLocation ); 195*cdf0e10cSrcweir OSL_TRACE("new logfile location is %s ", rtl::OUStringToOString( newLocation, RTL_TEXTENCODING_UTF8 ).getStr() ); 196*cdf0e10cSrcweir printf("moved to new location\n"); 197*cdf0e10cSrcweir } 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir } 200*cdf0e10cSrcweir catch ( uno::Exception& e ) 201*cdf0e10cSrcweir { 202*cdf0e10cSrcweir std::cerr << "Caught exception " << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() << std::endl; 203*cdf0e10cSrcweir } 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir // interface is supported, otherwise use XComponent.dispose 206*cdf0e10cSrcweir Reference< util::XCloseable > xCloseable ( xDoc, uno::UNO_QUERY ); 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir if ( xCloseable.is() ) 209*cdf0e10cSrcweir { 210*cdf0e10cSrcweir printf("try to close\n"); 211*cdf0e10cSrcweir // will close application. and only run a test case for 3.0 212*cdf0e10cSrcweir // maybe it is a bug. yes, it is a bug 213*cdf0e10cSrcweir // if only one frame and model, click a button which related will colse. 214*cdf0e10cSrcweir // will make a crash. It related with window listener. 215*cdf0e10cSrcweir // so, for run all test cases, it should not close the document at this moment. 216*cdf0e10cSrcweir xCloseable->close(sal_False); 217*cdf0e10cSrcweir printf("closed\n"); 218*cdf0e10cSrcweir } 219*cdf0e10cSrcweir else 220*cdf0e10cSrcweir { 221*cdf0e10cSrcweir printf("try to dispose\n"); 222*cdf0e10cSrcweir Reference< XComponent > xComp( xDoc, uno::UNO_QUERY_THROW ); 223*cdf0e10cSrcweir // same as close. 224*cdf0e10cSrcweir xComp->dispose(); 225*cdf0e10cSrcweir printf("disposed\n"); 226*cdf0e10cSrcweir } 227*cdf0e10cSrcweir } 228*cdf0e10cSrcweir catch( uno::Exception& e ) 229*cdf0e10cSrcweir { 230*cdf0e10cSrcweir std::cerr << "Caught exception " << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() << std::endl; 231*cdf0e10cSrcweir } 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir } 234*cdf0e10cSrcweir printf("complete processing %s\n", rtl::OUStringToOString( sUrl, RTL_TEXTENCODING_UTF8 ).getStr() ); 235*cdf0e10cSrcweir } 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir void traverse( const rtl::OUString& sFileDirectory ) 238*cdf0e10cSrcweir { 239*cdf0e10cSrcweir rtl::OUString sFileDirectoryURL = convertToURL( sFileDirectory ); 240*cdf0e10cSrcweir if ( !mxSFA->isFolder( sFileDirectoryURL) ) 241*cdf0e10cSrcweir { 242*cdf0e10cSrcweir throw lang::IllegalArgumentException( rtl::OUString::createFromAscii( "not a directory: ").concat( sFileDirectoryURL ), Reference<uno::XInterface>(), 1 ); 243*cdf0e10cSrcweir } 244*cdf0e10cSrcweir // Getting all files and directories in the current directory 245*cdf0e10cSrcweir Sequence<OUString> entries = mxSFA->getFolderContents( sFileDirectoryURL, sal_False ); 246*cdf0e10cSrcweir 247*cdf0e10cSrcweir // Iterating for each file and directory 248*cdf0e10cSrcweir printf( "Entries %d\n", (int)entries.getLength() ); 249*cdf0e10cSrcweir for ( sal_Int32 i = 0; i < entries.getLength(); ++i ) 250*cdf0e10cSrcweir { 251*cdf0e10cSrcweir proccessDocument( entries[ i ] ); 252*cdf0e10cSrcweir } 253*cdf0e10cSrcweir } 254*cdf0e10cSrcweir }; 255*cdf0e10cSrcweir 256*cdf0e10cSrcweir void tryDispose( Reference< uno::XInterface > xIF, const char* sComp ) 257*cdf0e10cSrcweir { 258*cdf0e10cSrcweir Reference< lang::XComponent > xComponent( xIF, uno::UNO_QUERY ); 259*cdf0e10cSrcweir if ( xComponent.is() ) 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir try 262*cdf0e10cSrcweir { 263*cdf0e10cSrcweir xComponent->dispose(); 264*cdf0e10cSrcweir } 265*cdf0e10cSrcweir catch( uno::Exception& e ) 266*cdf0e10cSrcweir { 267*cdf0e10cSrcweir std::cerr << "tryDispose caught exception " <<rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() << " while disposing " << sComp << std::endl; 268*cdf0e10cSrcweir } 269*cdf0e10cSrcweir } 270*cdf0e10cSrcweir } 271*cdf0e10cSrcweir int main( int argv, char** argc ) 272*cdf0e10cSrcweir { 273*cdf0e10cSrcweir if ( !( argv > 2 ) ) 274*cdf0e10cSrcweir return usage( argc[0] ); 275*cdf0e10cSrcweir try 276*cdf0e10cSrcweir { 277*cdf0e10cSrcweir 278*cdf0e10cSrcweir OSL_TRACE("Attempting to bootstrap normal"); 279*cdf0e10cSrcweir Reference<XComponentContext> xCC = ::cppu::bootstrap(); 280*cdf0e10cSrcweir Reference<XMultiComponentFactory> xFactory = xCC->getServiceManager(); 281*cdf0e10cSrcweir OSL_TRACE("got servicemanager"); 282*cdf0e10cSrcweir std::cout << "got servicemanager" << std::endl; 283*cdf0e10cSrcweir Reference<XInterface> desktop = xFactory->createInstanceWithContext( 284*cdf0e10cSrcweir ascii("com.sun.star.frame.Desktop"), xCC); 285*cdf0e10cSrcweir OSL_TRACE("got desktop"); 286*cdf0e10cSrcweir std::cout << "got desktop" << std::endl; 287*cdf0e10cSrcweir Reference<frame::XComponentLoader> xLoader(desktop, UNO_QUERY_THROW); 288*cdf0e10cSrcweir TestVBA* dTest = new TestVBA( xCC, xFactory, xLoader, ascii( argc[ 2 ] ) ); 289*cdf0e10cSrcweir if ( argv == 4 ) 290*cdf0e10cSrcweir { 291*cdf0e10cSrcweir std::cout << "before process" << std::endl; 292*cdf0e10cSrcweir dTest->proccessDocument( ascii( argc[ 3 ] ) ); 293*cdf0e10cSrcweir std::cout << "after process" << std::endl; 294*cdf0e10cSrcweir } 295*cdf0e10cSrcweir else 296*cdf0e10cSrcweir { 297*cdf0e10cSrcweir dTest->traverse( ascii( argc[ 1 ] ) ); 298*cdf0e10cSrcweir } 299*cdf0e10cSrcweir delete dTest; 300*cdf0e10cSrcweir // tryDispose( xLoader, "desktop" ); 301*cdf0e10cSrcweir // tryDispose( xCC, "remote context" ); 302*cdf0e10cSrcweir 303*cdf0e10cSrcweir } 304*cdf0e10cSrcweir catch( uno::Exception& e ) 305*cdf0e10cSrcweir { 306*cdf0e10cSrcweir std::cerr << "Caught Exception " << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() << std::endl; 307*cdf0e10cSrcweir } 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir } 310