diff options
author | Maxim Monastirsky <momonasmon@gmail.com> | 2014-03-01 20:03:41 +0200 |
---|---|---|
committer | Kohei Yoshida <libreoffice@kohei.us> | 2014-03-01 14:45:45 -0600 |
commit | d5890e87ab5e298e9a74ed0d552b01a98e59b1fa (patch) | |
tree | a512dcbedfa05b2258da876941ab8727dda2705a /filter | |
parent | Adapt rtl_uriConvertRelToAbs to RFC 3986 (diff) | |
download | core-d5890e87ab5e298e9a74ed0d552b01a98e59b1fa.tar.gz core-d5890e87ab5e298e9a74ed0d552b01a98e59b1fa.zip |
Merge HTML detection to text detection service
Setting the filter name explicitly is not really required,
because TypeDetection::impl_checkResultsAndAddBestFilter
is able to select the correct filter anyway. But it seems that
other detection services also do it, so I followed that way.
Change-Id: I6e73fa79c6867d82f98d63e8d2b7865446f088ef
Reviewed-on: https://gerrit.libreoffice.org/8213
Reviewed-by: Kohei Yoshida <libreoffice@kohei.us>
Tested-by: Kohei Yoshida <libreoffice@kohei.us>
Diffstat (limited to 'filter')
-rw-r--r-- | filter/Library_htmlfd.mk | 36 | ||||
-rw-r--r-- | filter/Library_textfd.mk | 5 | ||||
-rw-r--r-- | filter/Module_filter.mk | 1 | ||||
-rw-r--r-- | filter/source/config/fragments/types/generic_HTML.xcu | 2 | ||||
-rw-r--r-- | filter/source/htmlfilterdetect/fdcomp.cxx | 36 | ||||
-rw-r--r-- | filter/source/htmlfilterdetect/filterdetect.cxx | 232 | ||||
-rw-r--r-- | filter/source/htmlfilterdetect/filterdetect.hxx | 64 | ||||
-rw-r--r-- | filter/source/htmlfilterdetect/htmlfd.component | 15 | ||||
-rw-r--r-- | filter/source/textfilterdetect/filterdetect.cxx | 178 |
9 files changed, 127 insertions, 442 deletions
diff --git a/filter/Library_htmlfd.mk b/filter/Library_htmlfd.mk deleted file mode 100644 index cfb708b4fcc3..000000000000 --- a/filter/Library_htmlfd.mk +++ /dev/null @@ -1,36 +0,0 @@ -# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- -#************************************************************************* -# -# This file is part of the LibreOffice project. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -#************************************************************************* - -$(eval $(call gb_Library_Library,htmlfd)) - -$(eval $(call gb_Library_set_componentfile,htmlfd,filter/source/htmlfilterdetect/htmlfd)) - -$(eval $(call gb_Library_use_external,htmlfd,boost_headers)) - -$(eval $(call gb_Library_use_sdk_api,htmlfd)) - -$(eval $(call gb_Library_use_libraries,htmlfd,\ - ucbhelper \ - cppuhelper \ - cppu \ - sal \ - tl \ - utl \ - svt \ - $(gb_UWINAPI) \ -)) - -$(eval $(call gb_Library_add_exception_objects,htmlfd,\ - filter/source/htmlfilterdetect/fdcomp \ - filter/source/htmlfilterdetect/filterdetect \ -)) - -# vim: set noet sw=4 ts=4: diff --git a/filter/Library_textfd.mk b/filter/Library_textfd.mk index ac1cda3a1fcf..ef470b7e9d51 100644 --- a/filter/Library_textfd.mk +++ b/filter/Library_textfd.mk @@ -13,14 +13,19 @@ $(eval $(call gb_Library_Library,textfd)) $(eval $(call gb_Library_set_componentfile,textfd,filter/source/textfilterdetect/textfd)) +$(eval $(call gb_Library_use_external,textfd,boost_headers)) + $(eval $(call gb_Library_use_sdk_api,textfd)) $(eval $(call gb_Library_use_libraries,textfd,\ + comphelper \ ucbhelper \ cppuhelper \ cppu \ sal \ tl \ + utl \ + svt \ $(gb_UWINAPI) \ )) diff --git a/filter/Module_filter.mk b/filter/Module_filter.mk index 58307b42a7e9..403184a93feb 100644 --- a/filter/Module_filter.mk +++ b/filter/Module_filter.mk @@ -34,7 +34,6 @@ $(eval $(call gb_Module_add_targets,filter,\ Library_exp) \ Library_filterconfig \ Library_flash \ - Library_htmlfd \ Library_icd \ Library_icg \ Library_idx \ diff --git a/filter/source/config/fragments/types/generic_HTML.xcu b/filter/source/config/fragments/types/generic_HTML.xcu index 58ffedc85f1e..b00b048d3842 100644 --- a/filter/source/config/fragments/types/generic_HTML.xcu +++ b/filter/source/config/fragments/types/generic_HTML.xcu @@ -16,7 +16,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . --> <node oor:name="generic_HTML" oor:op="replace" > - <prop oor:name="DetectService"><value>com.sun.star.comp.filters.HtmlFilterDetect</value></prop> + <prop oor:name="DetectService"><value>com.sun.star.comp.filters.PlainTextFilterDetect</value></prop> <prop oor:name="URLPattern"><value>private:factory/swriter/web*</value></prop> <prop oor:name="Extensions"><value>html htm</value></prop> <prop oor:name="MediaType"><value>text/html</value></prop> diff --git a/filter/source/htmlfilterdetect/fdcomp.cxx b/filter/source/htmlfilterdetect/fdcomp.cxx deleted file mode 100644 index 40360e923c33..000000000000 --- a/filter/source/htmlfilterdetect/fdcomp.cxx +++ /dev/null @@ -1,36 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#include <sal/config.h> - -#include <cppuhelper/factory.hxx> -#include <cppuhelper/implementationentry.hxx> -#include <sal/types.h> - -#include "filterdetect.hxx" - -namespace { - -static cppu::ImplementationEntry const services[] = { - { &HtmlFilterDetect_createInstance, &HtmlFilterDetect_getImplementationName, - &HtmlFilterDetect_getSupportedServiceNames, - &cppu::createSingleComponentFactory, 0, 0 }, - { 0, 0, 0, 0, 0, 0 } -}; - -} - -extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL htmlfd_component_getFactory( - char const * pImplName, void * pServiceManager, void * pRegistryKey) -{ - return cppu::component_getFactoryHelper( - pImplName, pServiceManager, pRegistryKey, services); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/filter/source/htmlfilterdetect/filterdetect.cxx b/filter/source/htmlfilterdetect/filterdetect.cxx deleted file mode 100644 index 5b617c47bf4f..000000000000 --- a/filter/source/htmlfilterdetect/filterdetect.cxx +++ /dev/null @@ -1,232 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#include "filterdetect.hxx" - -#include <svtools/htmltokn.h> -#include <tools/urlobj.hxx> -#include <ucbhelper/content.hxx> -#include <unotools/mediadescriptor.hxx> -#include <unotools/ucbstreamhelper.hxx> - -#include <com/sun/star/io/XInputStream.hpp> -#include <cppuhelper/supportsservice.hxx> - -#include <boost/scoped_ptr.hpp> - -using com::sun::star::io::XInputStream; -using com::sun::star::uno::Sequence; -using com::sun::star::uno::Reference; -using com::sun::star::uno::Any; -using com::sun::star::uno::XComponentContext; -using com::sun::star::uno::XInterface; -using com::sun::star::uno::Exception; -using com::sun::star::uno::RuntimeException; -using com::sun::star::ucb::XCommandEnvironment; - -using namespace com::sun::star; -using namespace com::sun::star::beans; - -namespace { - -enum DetectPhase { - BeforeTag, - TagOpened, - InTagName -}; - -bool isHTMLStream(const OString& aStreamHeader) -{ - const char* pHeader = aStreamHeader.getStr(); - const int nLength = aStreamHeader.getLength(); - int nStartOfTagIndex = 0; - int i = 0; - - DetectPhase dp = BeforeTag; - - for ( i = 0; i < nLength; ++i, ++pHeader ) - { - char c = *pHeader; - if ( c == ' ' || c == '\n' || c == '\t' || c == '\r' || c == '\f' ) - { - if ( dp == TagOpened ) - return false; // Invalid: Should start with a tag name - else if ( dp == InTagName ) - break; // End of tag name reached - } - else if ( c == '<' ) - { - if ( dp == BeforeTag ) - dp = TagOpened; - else - return false; // Invalid: Nested '<' - } - else if ( c == '>' ) - { - if ( dp == InTagName ) - break; // End of tag name reached - else - return false; // Invalid: Empty tag or before '<' - } - else if ( c == '!' ) - { - if ( dp == TagOpened ) - return true; // "<!" - DOCTYPE or comments block - else - return false; // Invalid: '!' before '<' or inside tag name - } - else - { - if ( dp == BeforeTag ) - return false; // Invalid: Should start with a tag - else if ( dp == TagOpened ) - { - nStartOfTagIndex = i; - dp = InTagName; - } - } - } - - // The string following '<' has to be a known HTML token. - if ( GetHTMLToken( OStringToOUString( aStreamHeader.copy( nStartOfTagIndex, i - nStartOfTagIndex ), - RTL_TEXTENCODING_ASCII_US ) ) != 0 ) - return true; - - return false; -} - -} - -OUString SAL_CALL HtmlFilterDetect::detect(Sequence<PropertyValue>& lDescriptor) - throw (RuntimeException, std::exception) -{ - OUString sUrl; - OUString sDocService; - OString resultString; - Reference<XInputStream> xInStream; - - const PropertyValue *pValue = lDescriptor.getConstArray(); - sal_Int32 nLength = lDescriptor.getLength(); - sal_Int32 location = nLength; - - for ( sal_Int32 i = 0; i < nLength; ++i ) - { - if ( pValue[i].Name == utl::MediaDescriptor::PROP_URL() ) - pValue[i].Value >>= sUrl; - else if ( pValue[i].Name == utl::MediaDescriptor::PROP_INPUTSTREAM() ) - pValue[i].Value >>= xInStream; - else if ( pValue[i].Name == utl::MediaDescriptor::PROP_DOCUMENTSERVICE() ) - { - location = i; - pValue[i].Value >>= sDocService; - } - } - - try - { - if ( !xInStream.is() ) - { - ucbhelper::Content aContent( sUrl, Reference<XCommandEnvironment>(), mxCtx ); - xInStream = aContent.openStream(); - if ( !xInStream.is() ) - return OUString(); - } - - boost::scoped_ptr<SvStream> pInStream( utl::UcbStreamHelper::CreateStream( xInStream ) ); - if ( !pInStream || pInStream->GetError() ) - return OUString(); - - pInStream->StartReadingUnicodeText( RTL_TEXTENCODING_DONTKNOW ); - sal_Size nUniPos = pInStream->Tell(); - - const sal_uInt16 nSize = 4096; - - if ( nUniPos == 3 || nUniPos == 0 ) // UTF-8 or non-Unicode - resultString = read_uInt8s_ToOString( *pInStream, nSize ); - else // UTF-16 - resultString = OUStringToOString( read_uInt16s_ToOUString( *pInStream, nSize ), RTL_TEXTENCODING_ASCII_US ); - - if ( isHTMLStream( resultString.toAsciiLowerCase() ) ) - { - // Some Apps/Web services use ".xls" extension to indicate that - // the given file should be opened by a spreadsheet software - if ( sDocService.isEmpty() ) - { - INetURLObject aParser( sUrl ); - OUString aExt = aParser.getExtension( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET ); - aExt = aExt.toAsciiLowerCase(); - - if ( aExt == "xls" ) - { - if ( location == lDescriptor.getLength() ) - { - lDescriptor.realloc( location + 1 ); - lDescriptor[location].Name = utl::MediaDescriptor::PROP_DOCUMENTSERVICE(); - } - lDescriptor[location].Value <<= OUString( "com.sun.star.sheet.SpreadsheetDocument" ); - } - } - return OUString( "generic_HTML" ); - } - } - catch (const Exception &) - { - OSL_FAIL( "An Exception occurred while opening File stream" ); - } - - return OUString(); // Failed -} - -// XInitialization - -void SAL_CALL HtmlFilterDetect::initialize(const Sequence<Any>& /*aArguments*/) - throw (Exception, RuntimeException, std::exception) -{ -} - -OUString HtmlFilterDetect_getImplementationName() -{ - return OUString( "com.sun.star.comp.filters.HtmlFilterDetect" ); -} - -Sequence<OUString> HtmlFilterDetect_getSupportedServiceNames() -{ - Sequence<OUString> aRet(2); - OUString* pArray = aRet.getArray(); - pArray[0] = "com.sun.star.document.ExtendedTypeDetection"; - pArray[1] = "com.sun.star.comp.filters.HtmlFilterDetect"; - return aRet; -} - -Reference<XInterface> HtmlFilterDetect_createInstance(const Reference<XComponentContext>& rCtx) -{ - return (cppu::OWeakObject*) new HtmlFilterDetect( rCtx ); -} - -// XServiceInfo - -OUString SAL_CALL HtmlFilterDetect::getImplementationName() - throw (RuntimeException, std::exception) -{ - return HtmlFilterDetect_getImplementationName(); -} - -sal_Bool SAL_CALL HtmlFilterDetect::supportsService(const OUString& rServiceName) - throw (RuntimeException, std::exception) -{ - return cppu::supportsService( this, rServiceName ); -} - -Sequence<OUString> SAL_CALL HtmlFilterDetect::getSupportedServiceNames() - throw (RuntimeException, std::exception) -{ - return HtmlFilterDetect_getSupportedServiceNames(); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/filter/source/htmlfilterdetect/filterdetect.hxx b/filter/source/htmlfilterdetect/filterdetect.hxx deleted file mode 100644 index f8327af28f4e..000000000000 --- a/filter/source/htmlfilterdetect/filterdetect.hxx +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifndef INCLUDED_FILTER_SOURCE_HTMLFILTERDETECT_FILTERDETECT_HXX -#define INCLUDED_FILTER_SOURCE_HTMLFILTERDETECT_FILTERDETECT_HXX - -#include <com/sun/star/document/XExtendedFilterDetection.hpp> -#include <com/sun/star/lang/XInitialization.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/uno/XComponentContext.hpp> - -#include <cppuhelper/implbase3.hxx> - -class HtmlFilterDetect : public cppu::WeakImplHelper3< - com::sun::star::document::XExtendedFilterDetection, - com::sun::star::lang::XInitialization, - com::sun::star::lang::XServiceInfo> -{ - com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> mxCtx; - -public: - - HtmlFilterDetect(const com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext>& xCtx) : - mxCtx(xCtx) {} - virtual ~HtmlFilterDetect() {} - - // XExtendedFilterDetection - - virtual OUString SAL_CALL detect(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& lDescriptor) - throw (com::sun::star::uno::RuntimeException, std::exception); - - // XInitialization - - virtual void SAL_CALL initialize(const ::com::sun::star::uno::Sequence<com::sun::star::uno::Any>& aArguments) - throw (com::sun::star::uno::Exception, com::sun::star::uno::RuntimeException, std::exception); - - // XServiceInfo - - virtual OUString SAL_CALL getImplementationName() - throw (com::sun::star::uno::RuntimeException, std::exception); - - virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) - throw (com::sun::star::uno::RuntimeException, std::exception); - - virtual com::sun::star::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() - throw (com::sun::star::uno::RuntimeException, std::exception); -}; - -OUString HtmlFilterDetect_getImplementationName(); - -com::sun::star::uno::Sequence<OUString> HtmlFilterDetect_getSupportedServiceNames(); - -com::sun::star::uno::Reference<com::sun::star::uno::XInterface> -HtmlFilterDetect_createInstance(const com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext>& rCtx); - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/filter/source/htmlfilterdetect/htmlfd.component b/filter/source/htmlfilterdetect/htmlfd.component deleted file mode 100644 index 32c41b8bef26..000000000000 --- a/filter/source/htmlfilterdetect/htmlfd.component +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - --> - -<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@" - prefix="htmlfd" xmlns="http://openoffice.org/2010/uno-components"> - <implementation name="com.sun.star.comp.filters.HtmlFilterDetect"> - <service name="com.sun.star.document.ExtendedTypeDetection"/> - </implementation> -</component> diff --git a/filter/source/textfilterdetect/filterdetect.cxx b/filter/source/textfilterdetect/filterdetect.cxx index aea331f9140a..ffad7faa0282 100644 --- a/filter/source/textfilterdetect/filterdetect.cxx +++ b/filter/source/textfilterdetect/filterdetect.cxx @@ -9,32 +9,107 @@ #include "filterdetect.hxx" -#include "tools/urlobj.hxx" -#include "ucbhelper/content.hxx" +#include <svtools/htmltokn.h> +#include <tools/urlobj.hxx> +#include <ucbhelper/content.hxx> +#include <unotools/mediadescriptor.hxx> +#include <unotools/ucbstreamhelper.hxx> #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/io/XInputStream.hpp> #include <cppuhelper/supportsservice.hxx> +#include <boost/scoped_ptr.hpp> #define WRITER_TEXT_FILTER "Text" #define CALC_TEXT_FILTER "Text - txt - csv (StarCalc)" +#define WEB_HTML_FILTER "HTML" +#define WRITER_HTML_FILTER "HTML (StarWriter)" +#define CALC_HTML_FILTER "calc_HTML_WebQuery" + +#define WRITER_DOCSERVICE "com.sun.star.text.TextDocument" +#define CALC_DOCSERVICE "com.sun.star.sheet.SpreadsheetDocument" + using namespace ::com::sun::star; +using utl::MediaDescriptor; namespace { -template<typename T> -void setPropValue(uno::Sequence<beans::PropertyValue>& rProps, sal_Int32 nPos, const char* pName, const T& rValue) +bool IsHTMLStream( const uno::Reference<io::XInputStream>& xInStream ) { - if (nPos >= 0) - rProps[nPos].Value <<= rValue; - else + boost::scoped_ptr<SvStream> pInStream( utl::UcbStreamHelper::CreateStream( xInStream ) ); + if ( !pInStream || pInStream->GetError() ) + // No stream + return false; + + // Read the stream header + pInStream->StartReadingUnicodeText( RTL_TEXTENCODING_DONTKNOW ); + const sal_Size nUniPos = pInStream->Tell(); + const sal_uInt16 nSize = 4096; + + OString sHeader; + if ( nUniPos == 3 || nUniPos == 0 ) // UTF-8 or non-Unicode + sHeader = read_uInt8s_ToOString( *pInStream, nSize ); + else // UTF-16 (nUniPos = 2) + sHeader = OUStringToOString( read_uInt16s_ToOUString( *pInStream, nSize ), RTL_TEXTENCODING_ASCII_US ); + + // Now check whether the stream begins with a known HTML tag. + enum DetectPhase { BeforeTag, TagOpened, InTagName }; + DetectPhase dp = BeforeTag; + + const char* pHeader = sHeader.getStr(); + const int nLength = sHeader.getLength(); + int i = 0, nStartOfTagIndex = 0; + + for ( i = 0; i < nLength; ++i, ++pHeader ) { - sal_Int32 n = rProps.getLength(); - rProps.realloc(n+1); - rProps[n].Name = OUString::createFromAscii(pName); - rProps[n].Value <<= rValue; + char c = *pHeader; + if ( c == ' ' || c == '\n' || c == '\t' || c == '\r' || c == '\f' ) + { + if ( dp == TagOpened ) + return false; // Invalid: Should start with a tag name + else if ( dp == InTagName ) + break; // End of tag name reached + } + else if ( c == '<' ) + { + if ( dp == BeforeTag ) + dp = TagOpened; + else + return false; // Invalid: Nested '<' + } + else if ( c == '>' ) + { + if ( dp == InTagName ) + break; // End of tag name reached + else + return false; // Invalid: Empty tag or before '<' + } + else if ( c == '!' ) + { + if ( dp == TagOpened ) + return true; // "<!" - DOCTYPE or comments block + else + return false; // Invalid: '!' before '<' or inside tag name + } + else + { + if ( dp == BeforeTag ) + return false; // Invalid: Should start with a tag + else if ( dp == TagOpened ) + { + nStartOfTagIndex = i; + dp = InTagName; + } + } } + + // The string following '<' has to be a known HTML token. + OString aToken = sHeader.copy( nStartOfTagIndex, i - nStartOfTagIndex ); + if ( GetHTMLToken( OStringToOUString( aToken.toAsciiLowerCase(), RTL_TEXTENCODING_ASCII_US ) ) != 0 ) + return true; + + return false; } } @@ -46,65 +121,54 @@ PlainTextFilterDetect::~PlainTextFilterDetect() {} OUString SAL_CALL PlainTextFilterDetect::detect(uno::Sequence<beans::PropertyValue>& lDescriptor) throw (uno::RuntimeException, std::exception) { - OUString aType; - OUString aDocService; - OUString aExt; - OUString aUrl; + MediaDescriptor aMediaDesc(lDescriptor); - sal_Int32 nFilter = -1; + OUString aType = aMediaDesc.getUnpackedValueOrDefault(MediaDescriptor::PROP_TYPENAME(), OUString() ); + OUString aDocService = aMediaDesc.getUnpackedValueOrDefault(MediaDescriptor::PROP_DOCUMENTSERVICE(), OUString() ); + OUString aUrl = aMediaDesc.getUnpackedValueOrDefault(MediaDescriptor::PROP_URL(), OUString() ); - for (sal_Int32 i = 0, n = lDescriptor.getLength(); i < n; ++i) - { - if (lDescriptor[i].Name == "TypeName") - lDescriptor[i].Value >>= aType; - else if (lDescriptor[i].Name == "FilterName") - nFilter = i; - else if (lDescriptor[i].Name == "DocumentService") - lDescriptor[i].Value >>= aDocService; - else if (lDescriptor[i].Name == "URL") - { - lDescriptor[i].Value >>= aUrl; + // Get the file name extension. + INetURLObject aParser(aUrl); + OUString aExt = aParser.getExtension(INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET); + aExt = aExt.toAsciiLowerCase(); - // Get the file name extension. - INetURLObject aParser(aUrl); - aExt = aParser.getExtension( - INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET); - aExt = aExt.toAsciiLowerCase(); - } - } - - if (aType == "generic_Text") + if (aType == "generic_HTML") { - // Generic text type. + uno::Reference<io::XInputStream> xInStream(aMediaDesc[MediaDescriptor::PROP_INPUTSTREAM()], uno::UNO_QUERY); + if (!xInStream.is() || !IsHTMLStream(xInStream)) + return OUString(); // Decide which filter to use based on the document service first, // then on extension if that's not available. - if (aDocService == "com.sun.star.sheet.SpreadsheetDocument") - // Open it in Calc. - setPropValue(lDescriptor, nFilter, "FilterName", OUString(CALC_TEXT_FILTER)); - else if (aDocService == "com.sun.star.text.TextDocument") - // Open it in Writer. - setPropValue(lDescriptor, nFilter, "FilterName", OUString(WRITER_TEXT_FILTER)); - else if (aExt == "csv") - setPropValue(lDescriptor, nFilter, "FilterName", OUString(CALC_TEXT_FILTER)); - else if (aExt == "tsv") - setPropValue(lDescriptor, nFilter, "FilterName", OUString(CALC_TEXT_FILTER)); - else if (aExt == "tab") - setPropValue(lDescriptor, nFilter, "FilterName", OUString(CALC_TEXT_FILTER)); + if (aDocService == CALC_DOCSERVICE) + aMediaDesc[MediaDescriptor::PROP_FILTERNAME()] <<= OUString(CALC_HTML_FILTER); + else if (aDocService == WRITER_DOCSERVICE) + aMediaDesc[MediaDescriptor::PROP_FILTERNAME()] <<= OUString(WRITER_HTML_FILTER); else if (aExt == "xls") - setPropValue(lDescriptor, nFilter, "FilterName", OUString(CALC_TEXT_FILTER)); - else if (aExt == "txt") - setPropValue(lDescriptor, nFilter, "FilterName", OUString(WRITER_TEXT_FILTER)); + aMediaDesc[MediaDescriptor::PROP_FILTERNAME()] <<= OUString(CALC_HTML_FILTER); else - // No clue. Open it in Writer by default. - setPropValue(lDescriptor, nFilter, "FilterName", OUString(WRITER_TEXT_FILTER)); + aMediaDesc[MediaDescriptor::PROP_FILTERNAME()] <<= OUString(WEB_HTML_FILTER); + } - return aType; + else if (aType == "generic_Text") + { + if (aDocService == CALC_DOCSERVICE) + aMediaDesc[MediaDescriptor::PROP_FILTERNAME()] <<= OUString(CALC_TEXT_FILTER); + else if (aDocService == WRITER_DOCSERVICE) + aMediaDesc[MediaDescriptor::PROP_FILTERNAME()] <<= OUString(WRITER_TEXT_FILTER); + else if (aExt == "csv" || aExt == "tsv" || aExt == "tab" || aExt == "xls") + aMediaDesc[MediaDescriptor::PROP_FILTERNAME()] <<= OUString(CALC_TEXT_FILTER); + else + aMediaDesc[MediaDescriptor::PROP_FILTERNAME()] <<= OUString(WRITER_TEXT_FILTER); } - // failed! - return OUString(); + else + // Nothing to detect. + return OUString(); + + aMediaDesc >> lDescriptor; + return aType; } // XInitialization |