/************************************************************** * * 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 #include #include #include //#ifndef _SFXDOCFILE_HXX //todo: remove sfx2! //#include //#endif #include using namespace ::rtl; using namespace ::cppu; using namespace ::com::sun::star; /*-- 22.02.2007 12:17:53--------------------------------------------------- -----------------------------------------------------------------------*/ WriterFilterDetection::WriterFilterDetection( const uno::Reference< uno::XComponentContext >& rxContext) : m_xContext( rxContext ) { } /*-- 22.02.2007 12:17:53--------------------------------------------------- -----------------------------------------------------------------------*/ WriterFilterDetection::~WriterFilterDetection() { } /*-- 22.02.2007 12:11:38--------------------------------------------------- -----------------------------------------------------------------------*/ OUString WriterFilterDetection_getImplementationName () throw (uno::RuntimeException) { return OUString ( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.comp.Writer.WriterFilterDetector" ) ); } #define SERVICE_NAME1 "com.sun.star.document.ExtendedTypeDetection" /*-- 22.02.2007 12:11:38--------------------------------------------------- -----------------------------------------------------------------------*/ OUString WriterFilterDetection::detect( uno::Sequence< beans::PropertyValue >& rDescriptor ) throw( uno::RuntimeException ) { OUString sTypeName; bool bWord = false; sal_Int32 nPropertyCount = rDescriptor.getLength(); const beans::PropertyValue* pValues = rDescriptor.getConstArray(); rtl::OUString sURL; uno::Reference < io::XStream > xStream; uno::Reference < io::XInputStream > xInputStream; for( sal_Int32 nProperty = 0; nProperty < nPropertyCount; ++nProperty ) { if( pValues[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("TypeName")) ) rDescriptor[nProperty].Value >>= sTypeName; else if( pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM ( "URL" )) ) pValues[nProperty].Value >>= sURL; else if( pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM ( "Stream" )) ) pValues[nProperty].Value >>= xStream; else if( pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM ( "InputStream" )) ) pValues[nProperty].Value >>= xInputStream; } bool bBinary = sTypeName.equalsAsciiL ( RTL_CONSTASCII_STRINGPARAM ( "writer_MS_Word_97" )) || sTypeName.equalsAsciiL ( RTL_CONSTASCII_STRINGPARAM ( "writer_MS_Word_97_Vorlage" )); try { if(bBinary) { SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( xInputStream ); if ( pStream && SotStorage::IsStorageFile(pStream) ) { SotStorageRef xStg = new SotStorage( pStream, sal_False ); bool bTable2 = xStg->IsContained( rtl::OUString::createFromAscii("1Table" )); SotStorageStreamRef xRef = xStg->OpenSotStream(rtl::OUString::createFromAscii("WordDocument"), STREAM_STD_READ | STREAM_NOCREATE ); if(bTable2 && xStg.Is()) { xRef->Seek(2); sal_Int16 nWord; *xRef >> nWord; //version detection bWord = nWord >= 0x6a && nWord <= 0xc1; } } } else { uno::Reference< embed::XStorage > xDocStorage; if( sURL.equalsAscii( "private:stream" ) ) xDocStorage = comphelper::OStorageHelper::GetStorageFromInputStream( xInputStream ); else xDocStorage = comphelper::OStorageHelper::GetStorageFromURL( sURL, embed::ElementModes::READ ); if( xDocStorage.is() ) { uno::Sequence< ::rtl::OUString > aNames = xDocStorage->getElementNames(); const ::rtl::OUString* pNames = aNames.getConstArray(); for(sal_Int32 nName = 0; nName < aNames.getLength(); ++nName) { if(pNames[nName].equalsAsciiL(RTL_CONSTASCII_STRINGPARAM ( "word" ))) { bWord = true; if( !sTypeName.getLength() ) sTypeName = ::rtl::OUString( RTL_CONSTASCII_STRINGPARAM( "writer_MS_Word_2007" ), RTL_TEXTENCODING_ASCII_US); break; } } } } } catch(const uno::Exception&) { OSL_ASSERT("exception while opening storage"); } if( !bWord ) sTypeName = ::rtl::OUString(); return sTypeName; } /*-- 22.02.2007 12:11:38--------------------------------------------------- -----------------------------------------------------------------------*/ sal_Bool WriterFilterDetection_supportsService( const OUString& ServiceName ) throw (uno::RuntimeException) { return (ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME1 ) ) ); } /*-- 22.02.2007 12:11:38--------------------------------------------------- -----------------------------------------------------------------------*/ uno::Sequence< OUString > WriterFilterDetection_getSupportedServiceNames( ) throw (uno::RuntimeException) { uno::Sequence < OUString > aRet(1); OUString* pArray = aRet.getArray(); pArray[0] = OUString ( RTL_CONSTASCII_USTRINGPARAM ( SERVICE_NAME1 ) ); return aRet; } #undef SERVICE_NAME1 /*-- 22.02.2007 12:11:38--------------------------------------------------- -----------------------------------------------------------------------*/ uno::Reference< uno::XInterface > WriterFilterDetection_createInstance( const uno::Reference< uno::XComponentContext >& xContext) throw( uno::Exception ) { return (cppu::OWeakObject*) new WriterFilterDetection( xContext ); } /*-- 22.02.2007 12:11:38--------------------------------------------------- -----------------------------------------------------------------------*/ OUString WriterFilterDetection::getImplementationName( ) throw (uno::RuntimeException) { return WriterFilterDetection_getImplementationName(); } /*-- 22.02.2007 12:11:38--------------------------------------------------- -----------------------------------------------------------------------*/ sal_Bool WriterFilterDetection::supportsService( const OUString& rServiceName ) throw (uno::RuntimeException) { return WriterFilterDetection_supportsService( rServiceName ); } /*-- 22.02.2007 12:11:38--------------------------------------------------- -----------------------------------------------------------------------*/ uno::Sequence< OUString > WriterFilterDetection::getSupportedServiceNames( ) throw (uno::RuntimeException) { return WriterFilterDetection_getSupportedServiceNames(); }