summaryrefslogtreecommitdiffstats
path: root/tdeio/tdeio/kmimetype.h
diff options
context:
space:
mode:
Diffstat (limited to 'tdeio/tdeio/kmimetype.h')
-rw-r--r--tdeio/tdeio/kmimetype.h641
1 files changed, 641 insertions, 0 deletions
diff --git a/tdeio/tdeio/kmimetype.h b/tdeio/tdeio/kmimetype.h
new file mode 100644
index 000000000..19a846b46
--- /dev/null
+++ b/tdeio/tdeio/kmimetype.h
@@ -0,0 +1,641 @@
+/* This file is part of the KDE libraries
+ * Copyright (C) 1999 Waldo Bastian <bastian@kde.org>
+ * David Faure <faure@kde.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation;
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef __kmimetype_h__
+#define __kmimetype_h__
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <tqstringlist.h>
+#include <tqvaluelist.h>
+#include <tqpixmap.h>
+
+#include <kicontheme.h>
+#include <kurl.h>
+#include <tdesycocatype.h>
+#include <kservicetype.h>
+
+class KSimpleConfig;
+/**
+ * Represent a mime type, like "text/plain", and the data that is associated
+ * with it.
+ *
+ * The starting point you need is often the static methods.
+ *
+ * KMimeType inherits KServiceType because "text/plain" can be used to find
+ * services (apps and components) "which can open text/plain".
+ *
+ * @see KServiceType
+ */
+class TDEIO_EXPORT KMimeType : public KServiceType
+{
+ K_SYCOCATYPE( KST_KMimeType, KServiceType )
+
+public:
+ typedef KSharedPtr<KMimeType> Ptr;
+ typedef TQValueList<Ptr> List;
+public:
+ /**
+ * Constructor.
+ *
+ * You may pass in arguments to create a mimetype with
+ * specific properties.
+ *
+ * @param _fullpath the path to the configuration file (.desktop)
+ * @param _type the mime type itself
+ * @param _icon the name of the icon that represens the mime type
+ * @param _comment a comment describing the mime type
+ * @param _patterns a list of file globs that describes the names (or
+ * extensions) of the files with this mime type
+ */
+ KMimeType( const TQString & _fullpath, const TQString& _type, const TQString& _icon,
+ const TQString& _comment, const TQStringList& _patterns );
+
+ /**
+ * Construct a mimetype and take all information from a config file.
+ * @param _fullpath the path to the configuration file (.desktop)
+ */
+ KMimeType( const TQString & _fullpath );
+
+ /**
+ * Construct a mimetype and take all information from a desktop file.
+ * @param config the desktop configuration file that describes the mime type
+ */
+ KMimeType( KDesktopFile *config );
+
+ /**
+ * @internal Construct a service from a stream.
+ *
+ * The stream must already be positionned at the correct offset
+ */
+ KMimeType( TQDataStream& _str, int offset );
+
+ virtual ~KMimeType();
+
+ /**
+ * Return the filename of the icon associated with the mimetype.
+ *
+ * The arguments are unused, but provided so that KMimeType-derived classes
+ * can use them (e.g. KFolderType uses the URL to return one out of 2 icons)
+ *
+ * @return The path to the icon associated with this MIME type.
+ */
+ virtual TQString icon( const TQString& , bool ) const { return m_strIcon; }
+
+ /**
+ * Return the filename of the icon associated with the mimetype.
+ *
+ * The arguments are unused, but provided so that KMimeType-derived classes
+ * can use them (e.g. KFolderType uses the URL to return one out of 2 icons)
+ *
+ * @return The path to the icon associated with this MIME type.
+ */
+ virtual TQString icon( const KURL& , bool ) const { return m_strIcon; }
+
+ /**
+ * Use this function only if you don't have a special URL
+ * for which you search a pixmap.
+ *
+ * This function is useful to find
+ * out, which icon is usually chosen for a certain mime type. Since
+ * no URL is passed, it is impossible to obey icon hints in desktop
+ * entries for example.
+ * @param group The icon group where the icon is going to be used.
+ * @param force_size Override globallly configured icon size.
+ * Use 0 for the default size
+ * @param state The icon state, one of: @p KIcon::DefaultState,
+ * @p KIcon::ActiveState or @p KIcon::DisabledState.
+ * @param path Output parameter to get the full path. Seldom needed.
+ * Ignored if 0
+ * @return the pixmap of the mime type, can be a default icon if not found
+ */
+ virtual TQPixmap pixmap( KIcon::Group group, int force_size = 0, int state = 0,
+ TQString * path = 0L ) const;
+
+ /**
+ * Find the pixmap for a given file of this mimetype.
+ *
+ * Convenience method that uses icon(), but also locates and
+ * load the pixmap.
+ *
+ * @param _url URL for the file.
+ * @param _group The icon group where the icon is going to be used.
+ * @param _force_size Override globallly configured icon size.
+ * Use 0 for the default size
+ * @param _state The icon state, one of: KIcon::DefaultState,
+ * KIcon::ActiveState or KIcon::DisabledState.
+ * @param _path Output parameter to get the full path. Seldom needed.
+ * Ignored if 0
+ * @return the pixmap of the URL, can be a default icon if not found
+ */
+ virtual TQPixmap pixmap( const KURL& _url, KIcon::Group _group, int _force_size = 0,
+ int _state = 0, TQString * _path = 0L ) const;
+
+ /**
+ * Convenience method to find the pixmap for a URL.
+ *
+ * Call this one when you don't know the mimetype.
+ *
+ * @param _url URL for the file.
+ * @param _mode the mode of the file. The mode may modify the icon
+ * with overlays that show special properties of the
+ * icon. Use 0 for default
+ * @param _group The icon group where the icon is going to be used.
+ * @param _force_size Override globally configured icon size.
+ * Use 0 for the default size
+ * @param _state The icon state, one of: KIcon::DefaultState,
+ * KIcon::ActiveState or KIcon::DisabledState.
+ * @param _path Output parameter to get the full path. Seldom needed.
+ * Ignored if 0
+ * @return the pixmap of the URL, can be a default icon if not found
+ */
+ static TQPixmap pixmapForURL( const KURL & _url, mode_t _mode = 0, KIcon::Group _group = KIcon::Desktop,
+ int _force_size = 0, int _state = 0, TQString * _path = 0L );
+
+
+ /**
+ * The same functionality as pixmapForURL(), but this method returns the name
+ * of the icon to load. You'll have to use KIconLoader to load the pixmap for it.
+ * The advantage of this method is that you can store the result, and then use it
+ * later on for any kind of size.
+ * @param _url URL for the file
+ * @param _mode the mode of the file. The mode may modify the icon
+ * with overlays that show special properties of the
+ * icon. Use 0 for default
+ * @return the name of the icon. The name of a default icon if there is no icon
+ * for the mime type
+ */
+ static TQString iconForURL( const KURL & _url, mode_t _mode = 0 );
+
+ /**
+ * Return the "favicon" (see http://www.favicon.com) for the given @p url,
+ * if available. Does NOT attempt to download the favicon, it only returns
+ * one that is already available.
+ *
+ * If unavailable, returns TQString::null.
+ * @param url the URL of the favicon
+ * @return the name of the favicon, or TQString::null
+ */
+ static TQString favIconForURL( const KURL& url );
+
+ /**
+ * Returns the descriptive comment associated with the MIME type.
+ * @return the descriptive comment associated with the MIME type
+ */
+ TQString comment() const { return m_strComment; }
+
+ /**
+ * Returns the descriptive comment associated with the MIME type.
+ * The arguments are unused, but provided so that KMimeType derived classes
+ * can use them.
+ *
+ * @return The descriptive comment associated with the MIME type, if any.
+ */
+ virtual TQString comment( const TQString&, bool ) const { return m_strComment; }
+
+ /**
+ * Returns the descriptive comment associated with the MIME type.
+ * The arguments are unused, but provided so that KMimeType derived classes
+ * can use them.
+ *
+ * @return The descriptive comment associated with the MIME type, if any.
+ */
+ virtual TQString comment( const KURL&, bool ) const { return m_strComment; }
+
+ /**
+ * Retrieve the list of patterns associated with the MIME Type.
+ * @return a list of file globs that describe the file names
+ * (or, usually, the extensions) of files with this mime type
+ */
+ const TQStringList& patterns() const { return m_lstPatterns; }
+
+ /**
+ * Load the mimetype from a stream.
+ * @param qs the stream to load from
+ */
+ virtual void load( TQDataStream &qs );
+
+ /**
+ * Save the mimetype to a stream.
+ * @param qs the stream to save to
+ */
+ virtual void save( TQDataStream &qs );
+
+ /**
+ * Returns the property with the given @p _name.
+ * @param _name the name of the property
+ * @return the value of the property
+ * @see propertyNames()
+ */
+ virtual TQVariant property( const TQString& _name ) const;
+
+ /**
+ * Retrieves a list of all properties associated with this
+ * KMimeType.
+ * @return a list of all property names
+ * @see property()
+ */
+ virtual TQStringList propertyNames() const;
+
+ /**
+ * Retrieve a pointer to the mime type @p _name or a pointer to the default
+ * mime type "application/octet-stream".
+ *
+ * 0L is @em never returned.
+ *
+ * @em Very @em important: Don't store the result in a KMimeType* !
+ *
+ * @param _name the name of the mime type
+ * @return the pointer to the KMimeType with the given @p _name, or
+ * a pointer to the application/octet-stream KMimeType if
+ * not found
+ * @see KServiceType::serviceType
+ */
+ static Ptr mimeType( const TQString& _name );
+
+ /**
+ * Finds a KMimeType with the given @p _url.
+ * This function looks at mode_t first.
+ * If that does not help it
+ * looks at the extension. This is fine for FTP, FILE, TAR and
+ * friends, but is not for HTTP ( cgi scripts! ). You should use
+ * KRun instead, but this function returns immediately while
+ * KRun is async. If no extension matches, then
+ * the file will be examined if the URL a local file or
+ * "application/octet-stream" is returned otherwise.
+ *
+ * @param _url Is the right most URL with a filesystem protocol. It
+ * is up to you to find out about that if you have a nested
+ * URL. For example
+ * "http://localhost/mist.gz#gzip:/decompress" would have to
+ * pass the "http://..." URL part, while
+ * "file:/tmp/x.tar#tar:/src/test.gz#gzip:/decompress" would
+ * have to pass the "tar:/..." part of the URL, since gzip is
+ * a filter protocol and not a filesystem protocol.
+ * @param _mode the mode of the file (used, for example, to identify
+ * executables)
+ * @param _is_local_file true if the file is local
+ * @param _fast_mode If set to true no disk access is allowed to
+ * find out the mimetype. The result may be suboptimal, but
+ * it is @em fast.
+ * @return A pointer to the matching mimetype. 0L is never returned.
+ * @em Very @em Important: Don't store the result in a KMimeType* !
+ */
+ static Ptr findByURL( const KURL& _url, mode_t _mode = 0,
+ bool _is_local_file = false, bool _fast_mode = false );
+
+ static Ptr findByURL( const KURL& _url, mode_t _mode,
+ bool _is_local_file, bool _fast_mode,
+ bool *accurate);
+ /**
+ * Finds a KMimeType with the given @p _url.
+ * This function looks at mode_t first.
+ * If that does not help it
+ * looks at the extension. This is fine for FTP, FILE, TAR and
+ * friends, but is not for HTTP ( cgi scripts! ). You should use
+ * KRun instead, but this function returns immediately while
+ * KRun is async. If no extension matches, then
+ * the file will be examined if the URL a local file or
+ * "application/octet-stream" is returned otherwise.
+ *
+ * Equivalent to
+ * \code
+ * KURL u;
+ * u.setPath(path);
+ * return findByURL( u, mode, true, fast_mode );
+ * \endcode
+ *
+ * @param path the path to the file
+ * @param mode the mode of the file (used, for example, to identify
+ * executables)
+ * @param fast_mode If set to true no disk access is allowed to
+ * find out the mimetype. The result may be suboptimal, but
+ * it is @em fast.
+ * @return A pointer to the matching mimetype. 0L is never returned.
+ */
+ static Ptr findByPath( const TQString& path, mode_t mode = 0, bool fast_mode = false );
+
+ /**
+ * Tries to find out the MIME type of a data chunk by looking for
+ * certain magic numbers and characteristic strings in it.
+ *
+ * @param data the data to examine
+ * @param accuracy If not a null pointer, *accuracy is set to the
+ * accuracy of the match (which is in the range 0..100)
+ * @return a pointer to the KMimeType. application/octet-stream's KMimeType of the
+ * type can not be found this way.
+ */
+ static Ptr findByContent( const TQByteArray &data, int *accuracy=0 );
+
+ /**
+ * Tries to find out the MIME type of a file by looking for
+ * certain magic numbers and characteristic strings in it.
+ * This function is similar to the previous one. Note that the
+ * file name is not used for determining the file type, it is just
+ * used for loading the file's contents.
+ *
+ * @param fileName the path to the file
+ * @param accuracy If not a null pointer, *accuracy is set to the
+ * accuracy of the match (which is in the range 0..100)
+ * @return a pointer to the KMimeType. application/octet-stream's KMimeType of the
+ * type can not be found this way.
+ */
+ static Ptr findByFileContent( const TQString &fileName, int *accuracy=0 );
+
+ struct Format{
+ bool text : 1;
+ enum { NoCompression=0, GZipCompression } compression : 4;
+ unsigned dummy : 27;
+ };
+
+ /**
+ * Returns whether a file has an internal format that is human readable,
+ * or that would be human readable after decompression.
+ * @since 3.2
+ */
+ static Format findFormatByFileContent( const TQString &fileName );
+
+ /**
+ * Get all the mimetypes.
+ *
+ * Useful for showing the list of
+ * available mimetypes.
+ * More memory consuming than the ones above, don't use unless
+ * really necessary.
+ * @return the list of all existing KMimeTypes
+ */
+ static List allMimeTypes();
+
+ /**
+ * Returns the name of the default mimetype.
+ * Always application/octet-stream, but this method exists
+ * for performance purposes.
+ * @return the name of the default mime type, always
+ * "application/octet-stream"
+ */
+ static const TQString & defaultMimeType();
+
+ /**
+ * Returns the default mimetype.
+ * Always application/octet-stream.
+ * This can be used to check the result of mimeType(name).
+ * @return the "application/octet-stream" mimetype pointer.
+ * @since 3.2
+ */
+ static KMimeType::Ptr defaultMimeTypePtr();
+
+ /**
+ * If this mimetype inherits from ("is also") another mimetype,
+ * return the name of the parent.
+ *
+ * For instance a text/x-log is a special kind of text/plain,
+ * so the definition of text/x-log can say "X-TDE-IsAlso=text/plain".
+ * Or an smb-workgroup is a special kind of inode/directory, etc.
+ * This mechanism can also be used to rename mimetypes and preserve compat.
+ *
+ * Note that this notion doesn't map to the servicetype inheritance mechanism,
+ * since an application that handles the specific type doesn't necessarily handle
+ * the base type. The opposite is true though.
+ *
+ * @return the parent mime type, or TQString::null if not set
+ * @since 3.2
+ */
+ TQString parentMimeType() const;
+
+ /**
+ * Do not use name()=="somename" anymore, to check for a given mimetype.
+ * For mimetype inheritance to work, use is("somename") instead.
+ * Warning, do not use inherits(), that's the servicetype inheritance concept!
+ * @since 3.2
+ */
+ bool is( const TQString& mimeTypeName ) const;
+
+ /**
+ * @internal
+ * Determines the mimetype of file based on it's name and returns the
+ * matching pattern if any.
+ */
+ static KMimeType::Ptr diagnoseFileName(const TQString &file, TQString &pattern);
+
+protected:
+ void loadInternal( TQDataStream& );
+ void init( KDesktopFile * );
+
+ /**
+ * Signal a missing mime type.
+ * @param _type the missinf mime type
+ */
+ static void errorMissingMimeType( const TQString& _type );
+
+ /**
+ * This function makes sure that the default mime type exists.
+ */
+ static void buildDefaultType();
+
+ /**
+ * This function makes sure that vital mime types are installed.
+ */
+ static void checkEssentialMimeTypes();
+ /**
+ * true if check for vital mime types has been done.
+ */
+ static bool s_bChecked;
+
+ TQStringList m_lstPatterns;
+
+ static Ptr s_pDefaultType;
+
+protected:
+ friend class KServiceTypeFactory;
+ int patternsAccuracy() const;
+
+protected:
+ virtual void virtual_hook( int id, void* data );
+};
+
+/**
+ * Folder mime type. Handles locked folders, for instance.
+ * @short Mimetype for a folder (inode/directory)
+ */
+class TDEIO_EXPORT KFolderType : public KMimeType
+{
+ K_SYCOCATYPE( KST_KFolderType, KMimeType )
+
+public:
+// KFolderType( const TQString & _fullpath, const TQString& _type, const TQString& _icon, const TQString& _comment,
+// const TQStringList& _patterns );
+// KFolderType( const TQString & _fullpath ) : KMimeType( _fullpath ) { }
+ /**
+ * Construct a folder mimetype and take all information from a desktop file.
+ * @param config the desktop configuration file that describes the mime type
+ */
+ KFolderType( KDesktopFile *config) : KMimeType( config ) { }
+ /** \internal */
+ KFolderType( TQDataStream& _str, int offset ) : KMimeType( _str, offset ) { }
+
+ virtual TQString icon( const TQString& _url, bool _is_local ) const;
+ virtual TQString icon( const KURL& _url, bool _is_local ) const;
+ virtual TQString comment( const TQString& _url, bool _is_local ) const;
+ virtual TQString comment( const KURL& _url, bool _is_local ) const;
+protected:
+ virtual void virtual_hook( int id, void* data );
+};
+
+/**
+ * Mime type for desktop files.
+ * Handles mount/umount icon, and user-defined properties.
+ * @short Mimetype for a .desktop file
+ */
+class TDEIO_EXPORT KDEDesktopMimeType : public KMimeType
+{
+ K_SYCOCATYPE( KST_KDEDesktopMimeType, KMimeType )
+
+public:
+ enum ServiceType { ST_MOUNT, ST_UNMOUNT, /* ST_PROPERTIES, */ ST_USER_DEFINED };
+
+ /**
+ * Structure representing a service, in the list of services
+ * returned by builtinServices and userDefinedServices
+ */
+ struct Service
+ {
+ Service() { m_display = true; }
+ bool isEmpty() const { return m_strName.isEmpty(); }
+ TQString m_strName;
+ TQString m_strIcon;
+ TQString m_strExec;
+ ServiceType m_type;
+ bool m_display;
+ };
+ // KDEDesktopMimeType( const TQString & _fullpath, const TQString& _type, const TQString& _icon,
+ // const TQString& _comment, const TQStringList& _patterns );
+ // KDEDesktopMimeType( const TQString & _fullpath ) : KMimeType( _fullpath ) { }
+ /**
+ * Construct a desktop mimetype and take all information from a desktop file.
+ * @param config the desktop configuration file that describes the mime type
+ */
+ KDEDesktopMimeType( KDesktopFile *config) : KMimeType( config ) { }
+ /** \internal */
+ KDEDesktopMimeType( TQDataStream& _str, int offset ) : KMimeType( _str, offset ) { }
+
+ virtual TQString icon( const TQString& _url, bool _is_local ) const;
+ virtual TQString icon( const KURL& _url, bool _is_local ) const;
+ virtual TQPixmap pixmap( const KURL& _url, KIcon::Group _group, int _force_size = 0,
+ int _state = 0, TQString * _path = 0L ) const;
+ virtual TQString comment( const TQString& _url, bool _is_local ) const;
+ virtual TQString comment( const KURL& _url, bool _is_local ) const;
+
+ /**
+ * Returns a list of services for the given .desktop file that are handled
+ * by kio itself. Namely mount/unmount for FSDevice files.
+ * @return the list of services
+ */
+ static TQValueList<Service> builtinServices( const KURL& _url );
+ /**
+ * Returns a list of services defined by the user as possible actions
+ * on the given .desktop file. May include empty actions which represent where
+ * visual separators should appear in user-visible representations of those actions,
+ * such as separators in a menu.
+ * @param path the path to the desktop file describing the services
+ * @param bLocalFiles true if those services are to be applied to local files only
+ * (if false, services that don't have %u or %U in the Exec line won't be taken into account).
+ * @return the list of user deviced actions
+ */
+ static TQValueList<Service> userDefinedServices( const TQString& path, bool bLocalFiles );
+
+ /**
+ * Overload of userDefinedServices for speed purposes: it takes a TDEConfig* so that
+ * the caller can check things in the file without having it parsed twice.
+ * @since 3.4
+ */
+ static TQValueList<Service> userDefinedServices( const TQString& path, TDEConfig& config, bool bLocalFiles );
+
+ /**
+ * Overload of userDefinedServices but also allows you to pass a list of urls for this file.
+ * This allows for the menu to be changed depending on the exact files via
+ * the X-TDE-GetActionMenu extension.
+ * @since 3.5
+ */
+ static TQValueList<Service> userDefinedServices( const TQString& path, TDEConfig& config, bool bLocalFiles, const KURL::List & file_list);
+
+ /**
+ * @param path is the path of the desktop entry.
+ * @param service the service to execute
+ * @deprecated, see the other executeService
+ */
+ static void executeService( const TQString& path, KDEDesktopMimeType::Service& service ) KDE_DEPRECATED;
+
+ /**
+ * Execute @p service on the list of @p urls.
+ * @param urls the list of urls
+ * @param service the service to execute
+ */
+ static void executeService( const KURL::List& urls, KDEDesktopMimeType::Service& service );
+
+ /**
+ * Invokes the default action for the desktop entry. If the desktop
+ * entry is not local, then only false is returned. Otherwise we
+ * would create a security problem. Only types Link and Mimetype
+ * could be followed.
+ *
+ * @param _url the url to run
+ * @param _is_local true if the URL is local, false otherwise
+ * @return true on success and false on failure.
+ * @see KRun::runURL
+ */
+ static pid_t run( const KURL& _url, bool _is_local );
+
+protected:
+ virtual TQPixmap pixmap( KIcon::Group group, int force_size = 0, int state = 0,
+ TQString * path = 0L ) const
+ { return KMimeType::pixmap( group, force_size, state, path ); }
+
+ static pid_t runFSDevice( const KURL& _url, const KSimpleConfig &cfg );
+ static pid_t runApplication( const KURL& _url, const TQString & _serviceFile );
+ static pid_t runLink( const KURL& _url, const KSimpleConfig &cfg );
+ static pid_t runMimeType( const KURL& _url, const KSimpleConfig &cfg );
+protected:
+ virtual void virtual_hook( int id, void* data );
+};
+
+/**
+ * The mime type for executable files.
+ * @short MimeType for any executable, like /bin/ls
+ */
+class TDEIO_EXPORT KExecMimeType : public KMimeType
+{
+ K_SYCOCATYPE( KST_KExecMimeType, KMimeType )
+
+public:
+ // KExecMimeType( const TQString & _fullpath, const TQString& _type, const TQString& _icon,
+ // const TQString& _comment, const TQStringList& _patterns );
+ // KExecMimeType( const TQString & _fullpath ) : KMimeType( _fullpath ) { }
+ /**
+ * Construct a executable mimetype and take all information from a desktop file.
+ * @param config the desktop configuration file that describes the mime type
+ */
+ KExecMimeType( KDesktopFile *config) : KMimeType( config ) { }
+ /** \internal */
+ KExecMimeType( TQDataStream& _str, int offset ) : KMimeType( _str, offset ) { }
+protected:
+ virtual void virtual_hook( int id, void* data );
+};
+
+#endif