summaryrefslogtreecommitdiff
path: root/filter/source/config/cache/typedetection.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'filter/source/config/cache/typedetection.hxx')
-rw-r--r--filter/source/config/cache/typedetection.hxx462
1 files changed, 462 insertions, 0 deletions
diff --git a/filter/source/config/cache/typedetection.hxx b/filter/source/config/cache/typedetection.hxx
new file mode 100644
index 000000000000..381f3cf4802a
--- /dev/null
+++ b/filter/source/config/cache/typedetection.hxx
@@ -0,0 +1,462 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: typedetection.hxx,v $
+ * $Revision: 1.9 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef __FILTER_CONFIG_TYPEDETECTION_HXX_
+#define __FILTER_CONFIG_TYPEDETECTION_HXX_
+
+//_______________________________________________
+// includes
+
+#include "basecontainer.hxx"
+#include <com/sun/star/document/XTypeDetection.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <comphelper/mediadescriptor.hxx>
+#include <cppuhelper/implbase1.hxx>
+
+//_______________________________________________
+// namespace
+
+namespace filter{
+ namespace config{
+
+namespace css = ::com::sun::star;
+
+//_______________________________________________
+// definitions
+
+//_______________________________________________
+
+/** @short implements the service <type scope="com.sun.star.document">TypeDetection</type>.
+ */
+class TypeDetection : public ::cppu::ImplInheritanceHelper1< BaseContainer ,
+ css::document::XTypeDetection >
+{
+ //-------------------------------------------
+ // native interface
+
+ public:
+
+ //---------------------------------------
+ // ctor/dtor
+
+ /** @short standard ctor to connect this interface wrapper to
+ the global filter cache instance ...
+
+ @param xSMGR
+ reference to the uno service manager, which created this service instance.
+ */
+ TypeDetection(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR);
+
+ //---------------------------------------
+
+ /** @short standard dtor.
+ */
+ virtual ~TypeDetection();
+
+ //-------------------------------------------
+ // private helper
+
+ private:
+
+ //---------------------------------------
+ /** TODO document me */
+ sal_Bool impl_getPreselectionForType(const ::rtl::OUString& sPreSelType,
+ const css::util::URL& aParsedURL ,
+ FlatDetection& rFlatTypes );
+
+ //---------------------------------------
+ /** TODO document me */
+ sal_Bool impl_getPreselectionForFilter(const ::rtl::OUString& sPreSelFilter,
+ const css::util::URL& aParsedURL ,
+ FlatDetection& rFlatTypes );
+
+ //---------------------------------------
+ /** TODO document me */
+ sal_Bool impl_getPreselectionForDocumentService(const ::rtl::OUString& sPreSelDocumentService,
+ const css::util::URL& aParsedURL ,
+ FlatDetection& rFlatTypes );
+
+ //---------------------------------------
+
+ /** @short check if a filter or a type was preselected inside the given
+ MediaDescriptor and validate this information.
+
+ @descr Only in case the preselected filter exists and its type registration
+ seems to be usefully, it would be used realy as valid type detection
+ result. This method doesnt make any deep detection here. It checks only
+ if the preselection match to the URL by an URLPattern.
+ This information has to be added to the given rFlatTypes list too.
+ The outside code can use it to supress a deep detection then in general.
+ Because pattern are defined as non detectable at all!
+
+ @param pDescriptor
+ provides any easy-to-use stl interface to the MediaDescriptor.
+ Note : Its content will be adapted to returned result of this method.
+ Means: The type/filter entries of it will be actualized or removed.
+
+ @param rFlatTypes
+ the preselected type (or the registered type of a preselected filter)
+ will be added here as first(!) element. Further we have to provide the
+ information, if this type match to the given URL by its URLPattern
+ registration.
+ */
+ void impl_getPreselection(const css::util::URL& aParsedURL ,
+ ::comphelper::MediaDescriptor& rDescriptor,
+ FlatDetection& rFlatTypes );
+
+ //---------------------------------------
+
+ /** @short make a combined flat/deep type detection
+
+ @descr It steps over all flat detected types (given by the parameter lFlatTypes),
+ try it and search for most suitable one.
+ The specified MediaDescriptor will be patched, so it contain
+ the right values everytime. Using of any deep detection service
+ can be enabled/disabled. And last but not least: If the results
+ wont be realy clear (because a flat detected type has no deep
+ detection service), a "sugested" type name will be returned as "rLastChance".
+ It can be used after e.g. all well known deep detection services
+ was used without getting any result. Then this "last-chance-type"
+ should be returned. Of course using of it can fail too ... but its a try :-)
+
+ As an optimization - this method collects the names of all used deep
+ detection services. This information can be usefull inside the may be
+ afterwards called method "impl_detectTypeDeepOnly()"!
+
+ @param rDescriptor
+ provides any easy-to-use stl interface to the MediaDescriptor.
+ Note : Its content will be adapted to returned result of this method.
+ Means: The type/filter entries of it will be actualized or removed from it.
+
+ @param lFlatTypes
+ a list of all flat detected types, which should be checked here.
+ No other types are allowed here!
+
+ @param rLastChance
+ the internal name of a "suggested type" ... (see before)
+ Note: it will be reseted to an empty string everytimes. So
+ a set value of "rLastChance" can be detected outside very easy.
+
+ @param rUsedDetectors
+ used as [out] parameter. It contains a list of names of all deep
+ detection services, which was used inside this method.
+ Such detectors can be ignored later if "impl_detectTypeDeepOnly()"
+ is called.
+
+ @param bAllowDeep
+ enable/disable using of a might existing deep detection service.
+
+ @return The internal name of a detected type.
+ An empty value if detection failed. .... but see rLastChance
+ for additional returns!
+ */
+ ::rtl::OUString impl_detectTypeFlatAndDeep( ::comphelper::MediaDescriptor& rDescriptor ,
+ const FlatDetection& lFlatTypes ,
+ sal_Bool bAllowDeep ,
+ OUStringList& rUsedDetectors,
+ ::rtl::OUString& rLastChance );
+
+ //---------------------------------------
+
+ /** @short make a deep type detection only
+
+ @descr It steps over all well known deep detection services
+ and check her results. The first positive result will be
+ used for return. Its more a "try and error" algorithm then
+ a real type detection and will be used if a flat detection
+ cant work realy ... e.g. if the extension of an URL is
+ missing or wrong.
+
+ @param rDescriptor
+ provides any easy-to-use stl interface to the MediaDescriptor.
+ Note : Its content will be adapted to returned result of this method.
+ Means: The type/filter entries of it will be actualized or removed from it.
+
+ @param rUsedDetectors
+ It contains a list of names of all deep detection services,
+ which was already used inside the method "impl_detectTypeFlatAndDeep()"!
+ Such detectors must be ignored here!
+
+ @return The internal name of a detected type.
+ An empty value if detection failed.
+ */
+ ::rtl::OUString impl_detectTypeDeepOnly( ::comphelper::MediaDescriptor& rDescriptor ,
+ const OUStringList& rUsedDetectors);
+
+ //---------------------------------------
+
+ /** @short seek a might existing stream to position 0.
+
+ @descr This is an optinal action to be more robust
+ in case any detect service doesnt make this seek ...
+ Normaly it's part of any called detect service or filter ...
+ but sometimes it's not done there.
+
+ @param rDescriptor
+ a stl representation of the MediaDescriptor as in/out parameter.
+ */
+ void impl_seekStreamToZero(comphelper::MediaDescriptor& rDescriptor);
+
+ //---------------------------------------
+
+ /** @short make deep type detection for a specified
+ detect service (threadsafe!).
+
+ @descr It creates the right uno service, prepare the
+ needed MediaDescriptor, call ths right interfaces,
+ and return the results.
+
+ @attention The results (means type and corresponding filter)
+ are already part of the in/out parameter pDescriptor.
+ (in case they was valid).
+
+ @param sDetectService
+ uno service name of the detect service.
+
+ @param rDescriptor
+ a stl representation of the MediaDescriptor as in/out parameter.
+ */
+ ::rtl::OUString impl_askDetectService(const ::rtl::OUString& sDetectService,
+ ::comphelper::MediaDescriptor& rDescriptor );
+
+ //---------------------------------------
+
+ /** @short try to find an interaction handler and
+ ask him to select a possible filter for
+ this unknown format.
+
+ @descr If the user select a filter, it will be used as return value
+ without further checking against the given file content!
+
+ @param rDescriptor
+ a stl representation of the MediaDescriptor as in/out parameter.
+
+ @return [string]
+ a valid type name or an empty string if user canceled interaction.
+ */
+ ::rtl::OUString impl_askUserForTypeAndFilterIfAllowed(::comphelper::MediaDescriptor& rDescriptor);
+
+ //---------------------------------------
+
+ /** @short check if an input stream is already part of the
+ given MediaDesciptor and creates a new one if neccessary.
+
+ @attention This method does further something special!
+ <ul>
+ <li>
+ If the given URL seem to be a streamable content, but creation of the stream
+ failed (might by an IOException), this method throws an exception.
+ (May be an existing interaction handler must be called here too ...)
+ The whole detection must be interrupted then and the interface method queryTypeByDescriptor()
+ must return an empty type name value.
+
+ That prevent us against multiple handling of the same error more then ones
+ (e.g. if we ask all detect services as fallback ...).
+ </li>
+ <li>
+ In case the stream already exists inside the descriptor this method does nothing.
+ </li>
+ <li>
+ In case the stream does not exists but can be created successfully, the stream will
+ be added to the descriptor.
+ </li>
+ </ul>
+
+ @param rDescriptor
+ provides any easy-to-use stl interface to the MediaDescriptor.
+ Note : Its content will be adapted to returned result of this method.
+ Means: The stream will be added to it.
+
+ @throw Any suitable exception if stream should be opened but operation was not sucessfull.
+ Note: If an interactionHandler is part of the given descriptor too, it was already used.
+ Means: let the exception pass trough the top most interface method!
+ */
+ void impl_openStream(::comphelper::MediaDescriptor& rDescriptor)
+ throw (css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short validate the specified type and its relation ships
+ and set all needed informations related to this type
+ in the specified descriptor.
+
+ @descr Related informations are: - corresponding filter
+ - media type
+ - ...
+
+ @param rDescriptor
+ provides access to the outside MediaDescriptor.
+
+ @param sType
+ the name of the type, which should be set on the descriptor.
+ Can be empty to remove any related value from the descriptor!
+
+ @return TRUE the specified type and its registrations was valid(!) and
+ could be set on the descriptor.
+ */
+ sal_Bool impl_validateAndSetTypeOnDescriptor( ::comphelper::MediaDescriptor& rDescriptor,
+ const ::rtl::OUString& sType );
+
+ //---------------------------------------
+
+ /** @short validate the specified filter and its relation ships
+ and set all needed informations related to this filter
+ in the specified descriptor.
+
+ @descr Related informations are: - corresponding type
+ - ...
+
+ @param rDescriptor
+ provides access to the outside MediaDescriptor.
+
+ @param sFilter
+ the name of the filter, which should be set on the descriptor.
+ Can be empty to remove any related value from the descriptor!
+
+ @return TRUE the specified type and its registrations was valid(!) and
+ could be set on the descriptor.
+ */
+ sal_Bool impl_validateAndSetFilterOnDescriptor( ::comphelper::MediaDescriptor& rDescriptor,
+ const ::rtl::OUString& sFilter );
+
+ //---------------------------------------
+
+ /** @short remove anythimng related to a TYPE/FILTER entry from the
+ specified MediaDescriptor.
+
+ @descr This method works together with impl_validateAndSetTypeOnDescriptor()/
+ impl_validateAndSetFilterOnDescriptor(). All informations, which can be
+ set by these two operations must be "removeable" by this method.
+
+ @param rDescriptor
+ reference to the MediaDescriptor (represented by an easy-to-use
+ stl interface!), which should be patched.
+ */
+ void impl_removeTypeFilterFromDescriptor(::comphelper::MediaDescriptor& rDescriptor);
+
+ //---------------------------------------
+
+ /** @short search the best suitable filter for the given type
+ and add it into the media descriptor.
+
+ @descr Normaly this is a type detection only ...
+ but for some special features we must overwrite our detection
+ because a file must be loaded into a special (means preselected)
+ application.
+
+ E.g. CSV/TXT format are sometimes ugly to handle .-)
+
+ Note: If the descriptor already include a filter
+ (may be selected by a FilterSelect interaction or preselected
+ by the user itself) ... we dont change that here !
+
+ @param rDescriptor
+ reference to the MediaDescriptor (represented by an easy-to-use
+ stl interface!), which should be patched.
+
+ @param sType
+ the internal type name, where we search a filter for.
+ Used as IN/OUT parameter so we can overrule the detection result for
+ types too !
+
+ @note #i60158#
+ sometimes our text ascii and our csv filter cant work together.
+ Then we overwrite our detection hardly.
+ sType param is used as out parameter then too ... and
+ rDescriptor will be changed by selecting another filter.
+ (see code)
+ */
+ void impl_checkResultsAndAddBestFilter(::comphelper::MediaDescriptor& rDescriptor,
+ ::rtl::OUString& sType );
+
+ //-------------------------------------------
+ // uno interface
+
+ public:
+
+ //---------------------------------------
+ // XTypeDetection
+
+ virtual ::rtl::OUString SAL_CALL queryTypeByURL(const ::rtl::OUString& sURL)
+ throw (css::uno::RuntimeException);
+
+ virtual ::rtl::OUString SAL_CALL queryTypeByDescriptor(css::uno::Sequence< css::beans::PropertyValue >& lDescriptor,
+ sal_Bool bAllowDeep )
+ throw (css::uno::RuntimeException);
+
+ //-------------------------------------------
+ // static uno helper!
+
+ public:
+
+ //---------------------------------------
+
+ /** @short return the uno implementation name of this class.
+
+ @descr Because this information is used at several places
+ (and mostly an object instance of this class is not possible)
+ its implemented as a static function!
+
+ @return The fix uno implementation name of this class.
+ */
+ static ::rtl::OUString impl_getImplementationName();
+
+ //---------------------------------------
+
+ /** @short return the list of supported uno services of this class.
+
+ @descr Because this information is used at several places
+ (and mostly an object instance of this class is not possible)
+ its implemented as a static function!
+
+ @return The fix list of uno services supported by this class.
+ */
+ static css::uno::Sequence< ::rtl::OUString > impl_getSupportedServiceNames();
+
+ //---------------------------------------
+
+ /** @short return a new intsnace of this class.
+
+ @descr This method is used by the uno service manager, to create
+ a new instance of this service if needed.
+
+ @param xSMGR
+ reference to the uno service manager, which require
+ this new instance. It should be passed to the new object
+ so it can be used internaly to create own needed uno resources.
+
+ @return The new instance of this service as an uno reference.
+ */
+ static css::uno::Reference< css::uno::XInterface > impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR);
+};
+
+ } // namespace config
+} // namespace filter
+
+#endif // __FILTER_CONFIG_TYPEDETECTION_HXX_