/************************************************************** * * 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 #include "OOXMLAnalyzeService.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star; namespace writerfilter { namespace ooxmltest { const sal_Char AnalyzeService::SERVICE_NAME[40] = "debugservices.ooxml.AnalyzeService"; const sal_Char AnalyzeService::IMPLEMENTATION_NAME[40] = "debugservices.ooxml.AnalyzeService"; class URLLister { uno::Reference xInputStream; rtl::OUString mString; rtl::OUString mCRLF; rtl::OUString mLF; sal_uInt32 getEOLIndex() { sal_Int32 nIndex = mString.indexOf(mCRLF); if (nIndex == -1) { nIndex = mString.indexOf(mLF); } return nIndex; } public: URLLister(uno::Reference xContext, uno::Reference xFactory, rtl::OUString absFileUrl) { uno::Reference xFileAccess (xFactory->createInstanceWithContext (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ucb.SimpleFileAccess")), xContext), uno::UNO_QUERY_THROW); xInputStream = xFileAccess->openFileRead(absFileUrl) ; mLF = rtl::OUString::createFromAscii("\n"); mCRLF = rtl::OUString::createFromAscii("\r\n"); } rtl::OUString getURL() { rtl::OUString aResult; sal_Int32 nIndex = getEOLIndex(); while (nIndex == -1) { uno::Sequence aSeq; sal_uInt32 nCount = xInputStream->readBytes(aSeq, 1024); if (nCount > 0) { rtl_String * pNew = 0; rtl_string_newFromStr_WithLength (&pNew, reinterpret_cast(&aSeq[0]), nCount); rtl::OString aTmp(pNew); rtl::OUString aTail(rtl::OStringToOUString (aTmp, RTL_TEXTENCODING_ASCII_US)); mString = mString.concat(aTail); } nIndex = getEOLIndex(); if (nCount != 1024) break; } if (nIndex > 0) { aResult = mString.copy(0, nIndex); if (mString.match(mCRLF, nIndex)) mString = mString.copy(nIndex + 2); else mString = mString.copy(nIndex + 1); } return aResult; } }; AnalyzeService::AnalyzeService(const uno::Reference< uno::XComponentContext > &xContext_) : xContext( xContext_ ) { } sal_Int32 SAL_CALL AnalyzeService::run ( const uno::Sequence< rtl::OUString >& aArguments ) throw (uno::RuntimeException) { uno::Sequence aUcbInitSequence(2); aUcbInitSequence[0] <<= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Local")); aUcbInitSequence[1] <<= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Office")); uno::Reference xServiceFactory(xContext->getServiceManager(), uno::UNO_QUERY_THROW); uno::Reference xFactory(xContext->getServiceManager(), uno::UNO_QUERY_THROW ); if (::ucbhelper::ContentBroker::initialize(xServiceFactory, aUcbInitSequence)) { ::comphelper::setProcessServiceFactory(xServiceFactory); rtl::OUString arg=aArguments[0]; rtl_uString *dir=NULL; osl_getProcessWorkingDir(&dir); rtl::OUString absFileUrlUrls; osl_getAbsoluteFileURL(dir, arg.pData, &absFileUrlUrls.pData); URLLister aLister(xContext, xFactory, absFileUrlUrls); fprintf(stdout, "\n"); writerfilter::analyzerIds(); rtl::OUString aURL = aLister.getURL(); while (aURL.getLength() > 0) { uno::Reference xFileAccess (xFactory->createInstanceWithContext (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ucb.SimpleFileAccess")), xContext), uno::UNO_QUERY_THROW ); rtl::OString aStr; aURL.convertToString(&aStr, RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS); fprintf(stdout, "%s\n", aStr.getStr()); fprintf(stderr, "%s\n", aStr.getStr()); fflush(stderr); bool bStatus = true; try { uno::Reference xInputStream = xFileAccess->openFileRead(aURL); if (xInputStream.is()) { ooxml::OOXMLStream::Pointer_t pDocStream = ooxml::OOXMLDocumentFactory::createStream (xContext, xInputStream); if (pDocStream.get() != NULL) { ooxml::OOXMLDocument::Pointer_t pDocument (ooxml::OOXMLDocumentFactory::createDocument (pDocStream)); Stream::Pointer_t pAnalyzer = writerfilter::createAnalyzer(); pDocument->resolve(*pAnalyzer); } else { fprintf(stdout, "file open failed\n"); bStatus = false; } fprintf(stderr, "done\n"); } xInputStream->closeInput(); } catch (...) { fprintf(stdout, "unknown\n"); bStatus = false; } if (bStatus) fprintf(stdout, "ok\n"); else fprintf(stdout, "failed\n"); aURL = aLister.getURL(); fprintf(stdout, "\n"); fflush(stdout); } fprintf(stdout, "\n"); rtl_uString_release(dir); ::ucbhelper::ContentBroker::deinitialize(); } else { fprintf(stdout, "can't initialize UCB"); } return 0; } ::rtl::OUString AnalyzeService_getImplementationName () { return rtl::OUString::createFromAscii ( AnalyzeService::IMPLEMENTATION_NAME ); } sal_Bool SAL_CALL AnalyzeService_supportsService( const ::rtl::OUString& ServiceName ) { return ServiceName.equals( rtl::OUString::createFromAscii( AnalyzeService::SERVICE_NAME ) ); } uno::Sequence< rtl::OUString > SAL_CALL AnalyzeService_getSupportedServiceNames( ) throw (uno::RuntimeException) { uno::Sequence < rtl::OUString > aRet(1); rtl::OUString* pArray = aRet.getArray(); pArray[0] = rtl::OUString::createFromAscii ( AnalyzeService::SERVICE_NAME ); return aRet; } uno::Reference< uno::XInterface > SAL_CALL AnalyzeService_createInstance( const uno::Reference< uno::XComponentContext > & xContext) throw( uno::Exception ) { return (cppu::OWeakObject*) new AnalyzeService( xContext ); } } } /* end namespace writerfilter::doctok */