summaryrefslogtreecommitdiffstats
path: root/tdeio/tdeio/tdefilemetainfo.h
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-01-27 01:04:16 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-01-27 01:04:16 -0600
commit5159cd2beb2e87806a5b54e9991b7895285c9d3e (patch)
tree9b70e8be47a390f8f4d56ead812ab0c9dad88709 /tdeio/tdeio/tdefilemetainfo.h
parentc17cb900dcf52b8bd6dc300d4f103392900ec2b4 (diff)
downloadtdelibs-5159cd2beb2e87806a5b54e9991b7895285c9d3e.tar.gz
tdelibs-5159cd2beb2e87806a5b54e9991b7895285c9d3e.zip
Rename a number of libraries and executables to avoid conflicts with KDE4
Diffstat (limited to 'tdeio/tdeio/tdefilemetainfo.h')
-rw-r--r--tdeio/tdeio/tdefilemetainfo.h1738
1 files changed, 1738 insertions, 0 deletions
diff --git a/tdeio/tdeio/tdefilemetainfo.h b/tdeio/tdeio/tdefilemetainfo.h
new file mode 100644
index 000000000..8cc3fdbdf
--- /dev/null
+++ b/tdeio/tdeio/tdefilemetainfo.h
@@ -0,0 +1,1738 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (C) 2001-2002 Rolf Magnus <ramagnus@kde.org>
+ * Copyright (C) 2001-2002 Carsten Pfeiffer <pfeiffer@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 as published by the Free Software Foundation version 2.0.
+ *
+ * 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 KILEMETAINFO_H
+#define KILEMETAINFO_H
+
+/* Hack for HPUX: Namespace pollution
+ m_unit is a define in <sys/sysmacros.h> */
+#define m_unit outouftheway_m_unit
+
+#include <tqdict.h>
+#include <tqvariant.h>
+#include <tqobject.h>
+#include <tqstring.h>
+#include <kurl.h>
+
+#undef m_unit
+
+class TQValidator;
+class KFilePlugin;
+class KFileMetaInfoGroup;
+
+/**
+ * @brief Represents the capabilities of a KFilePlugin for a given mimetype
+ *
+ * This class provides information about the capabilities that a
+ * KFilePlugin for a given mimetype has. It includes a list of metainfo
+ * groups and items together with their type, a prefix, suffix and some other
+ * information about how to use, display or edit the items.
+ *
+ * @author Rolf Magnus
+ * @author Carsten Pfeiffer
+ */
+class TDEIO_EXPORT KFileMimeTypeInfo
+{
+ // the plugin needs to be a friend because it puts the data into the object,
+ // and it should be the only one allowed to do this.
+ friend class KFilePlugin;
+ friend class KFileMetaInfoProvider;
+
+public:
+ KFileMimeTypeInfo() {}
+
+ /**
+ * This enum is used to specify some attributes that an item can have,
+ * which fit neither in the Hint nor in the Unit enum.
+ */
+ enum Attributes
+ {
+ Addable = 1, ///< The item or group can be added by a user
+ Removable = 2, ///< It can be removed
+ Modifiable = 4, ///< The value can be edited (no meaning for a group)
+ Cumulative = 8, /**< If an application wants to display information
+ for more than one file, it may add up the values
+ for this item (e.g. play time of an mp3 file) */
+ Cummulative = Cumulative, ///< @deprecated Use Cumulative instead
+ Averaged = 16, /**< Similar to Cumulative, but the average should
+ be calculated instead of the sum */
+ MultiLine = 32, /**< This attribute says that a string item is likely
+ to be more than one line long, so for editing, a
+ widget capable for multline text should be used
+ @since 3.1 */
+ SqueezeText = 64 /**< If the text for this item is very long, it
+ should be squeezed to the size of the widget
+ where it's displayed
+ @since 3.1 */
+ };
+
+ /**
+ * This enum is mainly for items that have a special meaning for some
+ * applications.
+ */
+ enum Hint {
+ NoHint = 0, ///< No hint
+ Name = 1, ///< The name or title of the document
+ Author = 2, ///< The one who created the contents of it
+ Description = 3, ///< Description Some information about the document
+ Width = 4, ///< The width in pixels
+ Height = 5, ///< The height in pixels
+ Size = 6, ///< The size in pixels (width and height)
+ Bitrate = 7, ///< For media files
+ Length = 8, ///< The length of the file, also for media files
+ Hidden = 9, ///< The item is usually not shown to the user
+ Thumbnail = 10 ///< The item is a thumbnail picture of the file
+
+ };
+
+ /**
+ * This enum exists so that you can specify units for items, which you
+ * can usually use for integer items, so an application knows how to
+ * display it (e.g. a time in seconds in a hh:mm:ss form). You can either
+ * use one of those units, or if you don't find one that fits, you can
+ * add it yourself using a prefix and/or suffix.
+ */
+ enum Unit {
+ NoUnit = 0, ///< None of the listed units
+ Seconds = 1, ///< The item represents a time in seconds
+ MilliSeconds = 2, ///< The item represents a time in milliseconds
+ BitsPerSecond = 3, ///< A bit rate
+ Pixels = 4, ///< For image dimensions and similar
+ Inches = 5, ///< Sizes
+ Centimeters = 6, ///< Sizes
+ Bytes = 7, ///< Some data/file size in bytes
+ FramesPerSecond = 8, ///< A frame rate @since 3.1
+ DotsPerInch = 9, ///< Resolution in DPI @since 3.1
+ BitsPerPixel = 10, ///< A bit depth @since 3.1
+ Hertz = 11, ///< Sample rates and similar @since 3.1
+ KiloBytes = 12, ///< Some data/file size in kilobytes @since 3.1
+ Millimeters = 13 ///< Sizes @since 3.3
+ };
+
+
+ class ItemInfo;
+
+ /**
+ * @brief Information about a meta information group
+ *
+ * This is the class for one group of items of a KFileMimeTypeInfo.
+ * It contains, among other things, the information about the group's name
+ * and a list of supported items.
+ */
+ class TDEIO_EXPORT GroupInfo
+ {
+
+ friend class KFilePlugin;
+ friend class KFileMimeTypeInfo;
+ public:
+ /**
+ * Use this method to get a list of keys in the specified group that
+ * the plugin knows about. No variable keys.
+ * For a group that doesn't support variable keys, all keys that this
+ * group may have are returned. For a group that does support them, the
+ * non-variable ones are returned. See KFileMetaInfo about variable
+ * keys
+ *
+ * @return the list of keys supported for this mimetype
+ **/
+ TQStringList supportedKeys() const
+ {
+ return m_supportedKeys;
+ }
+
+ /**
+ * Use this method to get the name of the group. This string doesn't
+ * depend on the user's locale settings
+ *
+ * @return the group name
+ */
+ const TQString& name() const
+ {
+ return m_name;
+ }
+
+ /**
+ * Use this method to get the string to display to the user as group
+ * name. This may be different to name() and it returns the
+ * name in the user's language
+ *
+ * @return the translated group name
+ */
+ const TQString& translatedName() const
+ {
+ return m_translatedName;
+ }
+
+ /**
+ * A group object can contain several item objects (of which you can
+ * get the names with supportedKeys() . With this method, you can
+ * get one of those item objects. See ItemInfo
+ *
+ * @return a pointer to the item info. Don't delete this object!
+ */
+ const ItemInfo * itemInfo( const TQString& key ) const;
+
+ /**
+ * Get the attributes of this group (see Attributes)
+ *
+ * @return the attributes
+ */
+ uint attributes() const
+ {
+ return m_attr;
+ }
+
+ /**
+ * @return true if this group supports adding or removing arbitrary
+ * keys, false if not.
+ **/
+ bool supportsVariableKeys() const
+ {
+ return m_variableItemInfo;
+ }
+
+ /**
+ * If the group supports variable keys, you can query their item
+ * info with this method. The main reason for this is that you can
+ * get the type and attributes of variable keys.
+ *
+ * @return a pointer to the item info. Don't delete this object!
+ **/
+ const ItemInfo* variableItemInfo( ) const
+ {
+ return m_variableItemInfo;
+ }
+
+ /** @internal */
+ ~GroupInfo();
+ private:
+ /** @internal */
+ GroupInfo( const TQString& name, const TQString& translatedName);
+
+ /** @internal */
+ KFileMimeTypeInfo::ItemInfo* addItemInfo( const TQString& key,
+ const TQString& translatedKey,
+ TQVariant::Type type);
+
+ /** @internal */
+ void addVariableInfo( TQVariant::Type type, uint attr );
+
+ TQString m_name;
+ TQString m_translatedName;
+ TQStringList m_supportedKeys;
+ uint m_attr;
+ ItemInfo* m_variableItemInfo;
+ TQDict<ItemInfo> m_itemDict;
+
+ };
+
+ /**
+ * This is the class for one item of a KFileMimeTypeInfo.
+ * It contains every information about a KFileMetaInfoItem that this
+ * item has in common for each file of a specific mimetype.
+ **/
+ class TDEIO_EXPORT ItemInfo
+ {
+ friend class KFilePlugin;
+ friend class GroupInfo;
+ public:
+ /** @internal */
+ ItemInfo() {} // ### should be private?
+
+ /**
+ *
+ * This method returns a translated prefix to be displayed before the
+ * value. Think e.g. of the $ in $30
+ *
+ * @return the prefix
+ */
+ const TQString& prefix() const
+ {
+ return m_prefix;
+ }
+
+ /**
+ * This method returns a translated suffix to be displayed after the
+ * value. Think of the kbps in 128kbps
+ *
+ * @return the prefix
+ */
+ const TQString& suffix() const
+ {
+ return m_suffix;
+ }
+
+ /**
+ * The items for a file are stored as a TQVariant and this method
+ * can be used to get the data type of this item.
+ *
+ * @return the TQVariant type
+ */
+ TQVariant::Type type() const
+ {
+ return m_type;
+ }
+
+ /**
+ * Returns the name of the item.
+ * @return the name of the item
+ */
+ const TQString& key() const
+ {
+ return m_key;
+ }
+
+ /**
+ * Returns a string for the specified @p value, if possible. If not,
+ * TQString::null is returned. This can be used by programs if they want
+ * to display a sum or an average of some item for a list of files.
+ *
+ * @param value the value to convert
+ * @param mangle if true, the string will already contain prefix and
+ * suffix
+ * @return the converted string, or TQString::null if not possible
+ * @since 3.1
+ */
+ TQString string( const TQVariant& value, bool mangle = true ) const;
+
+ /**
+ * Is this item the variable item?
+ *
+ * @return true if it is, false if not
+ */
+ bool isVariableItem() const
+ {
+ // every valid item is supposed to have a non-null key
+ return key().isNull();
+ }
+
+ /**
+ * Returns a translation of the key for displaying to the user. If the
+ * plugin provides translation to the key, it's also in the user's
+ * language.
+ * @return the translated key
+ */
+ const TQString& translatedKey() const
+ {
+ return m_translatedKey;
+ }
+
+ /**
+ * Return the attributes of the item. See
+ * KFileMimeTypeInfo::Attributes.
+ * @return the attributes
+ */
+ uint attributes() const
+ {
+ return m_attr;
+ }
+
+ /**
+ * Return the hints for the item. See
+ * KFileMimeTypeInfo::Hint
+ * @return the hint
+ */
+ uint hint() const
+ {
+ return m_hint;
+ }
+
+ /**
+ * Return the unit of the item. See
+ * KFileMimeTypeInfo::Unit
+ * @return the unit
+ */
+ uint unit() const
+ {
+ return m_unit;
+ }
+
+ private:
+ /** @internal */
+ ItemInfo(const TQString& key, const TQString& translatedKey,
+ TQVariant::Type type)
+ : m_key(key), m_translatedKey(translatedKey),
+ m_type(type),
+ m_attr(0), m_unit(NoUnit), m_hint(NoHint),
+ m_prefix(TQString::null), m_suffix(TQString::null)
+ {}
+
+ TQString m_key;
+ TQString m_translatedKey;
+ TQVariant::Type m_type;
+ uint m_attr;
+ uint m_unit;
+ uint m_hint;
+ TQString m_prefix;
+ TQString m_suffix;
+ };
+
+ // ### could it be made private? Would this be BC?
+ ~KFileMimeTypeInfo();
+
+ /**
+ * Creates a validator for this item. Make sure to supply a proper
+ * @p parent argument or delete the validator yourself.
+ *
+ * @param group the group of the item
+ * @param key the key of the item
+ * @param parent the parent of the TQObject, or 0 for a parent-less object
+ * @param name the name of the TQObject, can be 0
+ * @return the validator. You are responsible for deleting it. 0 if
+ * creation failed
+ */
+ TQValidator * createValidator(const TQString& group, const TQString& key,
+ TQObject *parent = 0, const char *name = 0) const;
+
+ /**
+ * Returns the list of all groups that the plugin for this mimetype
+ * supports.
+ *
+ * @return the list of groups
+ */
+ TQStringList supportedGroups() const;
+
+ /**
+ * Same as the above function, but returns the strings to display to the
+ * user.
+ *
+ * @return the list of groups
+ */
+ TQStringList translatedGroups() const;
+
+ /**
+ * This returns the list of groups in the preferred order that's specified
+ * in the .desktop file.
+ *
+ * @return the list of groups
+ */
+ TQStringList preferredGroups() const
+ {
+ return m_preferredGroups;
+ }
+
+ /**
+ * Returns the mimetype to which this info belongs.
+ *
+ * @return the mimetype of this info
+ */
+ TQString mimeType() const {return m_mimeType;}
+
+ /**
+ * Get the group info for a specific group.
+ *
+ * @param group the group whose group info should be retrieved
+ * @return a pointer to the info. 0 if it does not
+ * exist. Don't delete this object!
+ */
+ const GroupInfo * groupInfo( const TQString& group ) const;
+
+ // always returning stringlists which the user has to iterate and use them
+ // to look up the real items sounds strange to me. I think we should add
+ // our own iterators some time (somewhere in the future ;)
+
+ /**
+ * Return a list of all supported keys without looking for a specific
+ * group
+ *
+ * @return the list of keys
+ */
+ TQStringList supportedKeys() const;
+
+ /**
+ * Return a list of all supported keys in preference order
+ *
+ * @return the list of keys
+ */
+ TQStringList preferredKeys() const
+ {
+ return m_preferredKeys;
+ }
+
+ // ### shouldn't this be private? BC?
+ GroupInfo * addGroupInfo( const TQString& name,
+ const TQString& translatedName);
+
+ TQString m_translatedName;
+ TQStringList m_supportedKeys;
+ uint m_attr;
+ // bool m_supportsVariableKeys : 1;
+ TQDict<ItemInfo> m_itemDict;
+
+// ### this should be made private instead, but this would be BIC
+protected:
+ /** @internal */
+ KFileMimeTypeInfo( const TQString& mimeType );
+
+ TQDict<GroupInfo> m_groups;
+ TQString m_mimeType;
+ TQStringList m_preferredKeys; // same as KFileMetaInfoProvider::preferredKeys()
+ TQStringList m_preferredGroups; // same as KFileMetaInfoProvider::preferredKeys()
+};
+
+
+/**
+ * @brief A meta information item about a file
+ *
+ * This is one item of the meta information about a file (see
+ * KFileMetaInfo).
+ */
+class TDEIO_EXPORT KFileMetaInfoItem
+{
+public:
+ class Data;
+ typedef KFileMimeTypeInfo::Hint Hint;
+ typedef KFileMimeTypeInfo::Unit Unit;
+ typedef KFileMimeTypeInfo::Attributes Attributes;
+
+ /**
+ * @internal
+ * You usually don't need to use this constructor yourself. Let
+ * KFileMetaInfo do it for you.
+ **/
+ // ### hmm, then it should be private
+ KFileMetaInfoItem( const KFileMimeTypeInfo::ItemInfo* mti,
+ const TQString& key, const TQVariant& value);
+
+ /**
+ * Copy constructor
+ **/
+ KFileMetaInfoItem( const KFileMetaInfoItem & item );
+
+ /**
+ * The assignment operator, so you can do:
+ * @code
+ * KFileMetaInfoItem item = info.item("Title");
+ * @endcode
+ *
+ * This will create a shared copy of the object. The actual data
+ * is automatically deleted if all copies go out of scope
+ **/
+ const KFileMetaInfoItem& operator= (const KFileMetaInfoItem & item );
+
+ /**
+ * Default constructor. This creates an "invalid" item
+ */
+ KFileMetaInfoItem();
+
+ ~KFileMetaInfoItem();
+
+ /**
+ * Returns the key of the item.
+ *
+ * @return the key of this item
+ */
+ TQString key() const;
+
+ /**
+ * Returns a translation of the key for displaying to the user. If the
+ * plugin provides translation to the key, it's also in the user's language
+ *
+ * @return the translated key
+ */
+ TQString translatedKey() const;
+
+ /**
+ * Returns the value of the item.
+ *
+ * @return the value of the item.
+ */
+ const TQVariant& value() const;
+
+ /**
+ * Returns a string containing the value, if possible. If not,
+ * TQString::null is returned.
+ *
+ * @param mangle if true, the string will already contain prefix and
+ * suffix
+ * @return the value string, or TQString::null if not possible
+ */
+ TQString string( bool mangle = true ) const;
+
+ /**
+ * Changes the value of the item.
+ *
+ * @param value the new value
+ * @return true if successful, false otherwise
+ */
+ bool setValue( const TQVariant& value );
+
+ /**
+ * Return the type of the item.
+ *
+ * @return the type of the item
+ */
+ TQVariant::Type type() const;
+
+ /**
+ * You can query if the application can edit the item and write it back to
+ * the file with this method.
+ *
+ * @note This doesn't ensure that you have write access to the file and
+ * that enough space is available.
+ *
+ * @return true if the item's value can be changed, false if not
+ */
+ bool isEditable() const;
+
+ /**
+ * If you remove an item, it is only marked for removal for the file. On
+ * the next KFileMetaInfo::applyChanges() , it will be removed from
+ * the file. With this method, you can ask if the item is marked for
+ * removal.
+ *
+ * @return true if the item was removed, false if not
+ */
+ bool isRemoved() const;
+
+ /**
+ * If you change an item, it is marked as "dirty". On the next
+ * KFileMetaInfo::applyChanges() , the change will be written to the
+ * file. With this method, you can ask if this item is dirty.
+ *
+ * @return true if the item contains changes that have not yet been written
+ * back into the file. Removing or adding an item counts as such a change
+ */
+ bool isModified() const;
+
+ /**
+ * This method returns a translated prefix to be displayed before the
+ * value. Think e.g. of the $ in $30
+ *
+ * @return the prefix
+ */
+ TQString prefix() const;
+
+ /**
+ * This method returns a translated suffix to be displayed after the
+ * value. Think of the kbps in 128kbps
+ *
+ * @return the suffix
+ */
+ TQString suffix() const;
+
+ /**
+ * Returns the hint for this item. See KFileMimeTypeInfo::Hint.
+ *
+ * @return the hint
+ **/
+ uint hint() const;
+
+ /**
+ * Returns the unit for this item. See KFileMimeTypeInfo::Unit.
+ *
+ * @return the unit
+ * @since 3.2
+ **/
+ uint unit() const;
+
+ /**
+ * Returns the attributes for this item. See
+ * KFileMimeTypeInfo::Attributes.
+ *
+ * @return the attributes
+ **/
+ uint attributes() const;
+
+ /**
+ * Return true if the item is valid, i.e. if it contains data, false
+ * if it's invalid (created with the default constructor and not been
+ * assigned anything), or if KFileMetaInfoGroup::item() didn't find
+ * your requested item).
+ *
+ * @return true if valid, false if invalid
+ */
+ bool isValid() const;
+
+ TDEIO_EXPORT friend TQDataStream& operator >>(TQDataStream& s, KFileMetaInfoItem& );
+ TDEIO_EXPORT friend TQDataStream& operator >>(TQDataStream& s, KFileMetaInfoGroup& );
+ TDEIO_EXPORT friend TQDataStream& operator <<(TQDataStream& s, const KFileMetaInfoItem& );
+ friend class KFileMetaInfoGroup;
+
+protected:
+ void setAdded();
+ void setRemoved();
+
+ void ref();
+ void deref();
+
+ Data *d;
+};
+
+/**
+ * @brief A group of meta information items about a file
+ *
+ * This is one group of meta information items about a file (see
+ * KFileMetaInfo).
+ */
+class TDEIO_EXPORT KFileMetaInfoGroup
+{
+ friend class KFilePlugin;
+ friend class KFileMetaInfo;
+ TDEIO_EXPORT friend TQDataStream& operator >>(TQDataStream& s, KFileMetaInfoGroup& );
+ TDEIO_EXPORT friend TQDataStream& operator <<(TQDataStream& s, const KFileMetaInfoGroup& );
+
+public:
+ class Data;
+ /**
+ * @internal
+ * You usually don't need to use this constructor yourself. Let
+ * KFileMetaInfo do it for you.
+ **/
+ // ### hmm, then it should be private
+ KFileMetaInfoGroup( const TQString& name, const KFileMimeTypeInfo* info );
+
+ /**
+ * Copy constructor
+ **/
+ KFileMetaInfoGroup( const KFileMetaInfoGroup& original );
+
+ /**
+ * The assignment operator, so you can do:
+ * @code
+ * KFileMetaInfoGroup group = info.group("Technical");
+ * @endcode
+ *
+ * This will create a shared copy of the object. The actual data
+ * is automatically deleted if all copies go out of scope
+ **/
+ const KFileMetaInfoGroup& operator= (const KFileMetaInfoGroup& info );
+
+ /**
+ * Default constructor. This creates an "invalid" item
+ *
+ * @since 3.1
+ */
+ KFileMetaInfoGroup();
+
+ ~KFileMetaInfoGroup();
+
+ /**
+ * Returns true if the item is valid, i.e. if it contains data, false
+ * if it's invalid (created with the default constructor and not been
+ * assigned anything), or if KFileMetaInfoGroup::item() didn't find
+ * your requested item).
+ *
+ * @return true if valid, false if invalid
+ */
+ bool isValid() const;
+
+ /**
+ * Returns false if the object contains data, true if it's empty. An
+ * empty group is a group with no items (amazing, isn't it?).
+ *
+ * @return true if empty, false otherwise
+ */
+ bool isEmpty() const;
+
+ /**
+ * Returns true if an item as added or removed from the group.
+ *
+ * @return true if an item was added or removed from the group, otherwise
+ * false.
+ *
+ * @since 3.1
+ */
+ bool isModified() const;
+
+ /**
+ * Operator for convenience. It does the same as item(),
+ * but you cannot specify a group to search in
+ */
+ KFileMetaInfoItem operator[]( const TQString& key ) const
+ { return item( key ); }
+
+ /**
+ * This method searches for the specified item.
+ *
+ * @param key the key of the item to search
+ * @return the specified item if found, an invalid item, if not
+ **/
+ KFileMetaInfoItem item( const TQString& key ) const;
+
+ /**
+ * Returns the item with the given @p hint.
+ *
+ * @param hint the hint of the item
+ * @return the item with the specified @p hint
+ **/
+ KFileMetaInfoItem item( uint hint ) const;
+
+ /**
+ * Convenience function. Returns the value of the specified key.
+ * It does the same as item(key).value().
+ *
+ * @param key the key of the item to search
+ * @return the value with the given key
+ */
+ const TQVariant value( const TQString& key ) const
+ {
+ const KFileMetaInfoItem &i = item( key );
+ return i.value();
+ }
+
+ /**
+ * Use this method to get a list of keys in the specified group that
+ * the plugin knows about. No variable keys.
+ * For a group that doesn't support variable keys, all keys that this
+ * group may have are returned. For a group that does support them, the
+ * non-variable ones are returned. See KFileMetaInfo about variable
+ * keys
+ *
+ * @return the list of keys supported for this mimetype
+ **/
+ TQStringList supportedKeys() const;
+
+ /**
+ * Returns true if this group supports adding or removing arbitrary
+ * keys, false if not.
+ *
+ * @return true is variable keys are supported, false otherwise
+ **/
+ bool supportsVariableKeys() const;
+
+ /**
+ * Checks whether an item with the given @p key exists.
+ *
+ * @return true if an item for this @p key exists.
+ */
+ bool contains( const TQString& key ) const;
+
+ /**
+ * Returns a list of all keys.
+ *
+ * @return a list of all keys in the order they were inserted.
+ **/
+ TQStringList keys() const;
+
+ /**
+ * Returns a list of all keys in preference order.
+ *
+ * @return a list of all keys in preference order.
+ **/
+ TQStringList preferredKeys() const;
+
+ /**
+ * @return the list of possible types that the value for the specified key
+ * can be. You can use this to determine the possible types for new
+ * keys before you add them.
+ *
+ **/
+ // ### do we really want to support that?
+ // let's not waste time on thinking about it. Let's just kick it for now
+ // and add it in 4.0 if needed ;)
+// const TQMemArray<TQVariant::Type>& types( const TQString& key ) const;
+
+ /**
+ * Add an item to the info. This is only possible if the specified @p key
+ * is in the supportedKeys list and not yet defined or if
+ * the group supports variable keys.
+ *
+ * @param key the key of the item
+ * @return the KFileMetaInfoItem for the given @p key
+ **/
+ KFileMetaInfoItem addItem( const TQString& key );
+
+ /**
+ * Remove this item from the meta info of the file. You cannot query
+ * KFileMetaInfo for a removed object, but you can query for a list of
+ * removed items with removedItems() if you need to.
+ * If you re-add it, its value will be cleared.
+ *
+ * @param key the key of the removed item
+ * @return true if successful, false otherwise
+ */
+ bool removeItem(const TQString& key);
+
+ /**
+ * Returns a list of all removed items.
+ *
+ * @return a list of all removed items
+ */
+ TQStringList removedItems();
+
+ /**
+ * The name of this group.
+ *
+ * @return the name of this group
+ */
+ TQString name() const;
+
+ /**
+ * The translated name of this group.
+ *
+ * @return the translated name of this group
+ *
+ * @since 3.2
+ */
+ TQString translatedName() const;
+
+ /**
+ * Returns the attributes of this item.
+ *
+ * @return the attributes
+ */
+ uint attributes() const;
+
+protected:
+ void setAdded();
+ KFileMetaInfoItem appendItem( const TQString& key, const TQVariant& value);
+
+ Data* d;
+ void ref();
+ void deref();
+
+};
+
+
+///////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////
+
+
+/**
+ * @brief Meta Information about a file
+ *
+ * This is the class for objects that hold meta information about a file.
+ * The information is kept in form of a system of key/value pairs. See also
+ * KFileMetaInfoItem.
+ * This information is retrieved from the file through a plugin system, and
+ * this class is the main interface to it.
+ * If you want to write your own plugin, have a look at KFilePlugin.
+ * There are basically two different kinds of meta information: Fixed ones
+ * that the plugin knows about (e.g. an mp3 id3v1 tag has a well defined
+ * fixed list of fields), and variable keys that exist in mimetypes that
+ * support their own key/value system (comments in png files are of this type).
+ * Almost every file has fixed keys, but some also have variable keys.
+ *
+ * The groups and the What enum are not yet supported, but already added to
+ * the interface so that adding support doesn't break compatibility.
+ */
+class TDEIO_EXPORT KFileMetaInfo
+{
+public:
+ typedef KFileMimeTypeInfo::Hint Hint;
+ typedef KFileMimeTypeInfo::Unit Unit;
+ typedef KFileMimeTypeInfo::Attributes Attributes;
+ class Data;
+
+ /**
+ * This is used to specify what a KFileMetaInfo object should read, so
+ * you can specify if you want to read "expensive" items or not.
+ */
+ enum What
+ {
+ Fastest = 0x1, /**< do the fastest possible read and omit all items
+ that might need a significantly longer time
+ than the others */
+ DontCare = 0x2, ///< let the plugin decide what to read
+
+ TechnicalInfo = 0x4, /**< extract technical details about the file, like
+ e.g. play time, resolution or a compressioni
+ type */
+ ContentInfo = 0x8, /**< read information about the content of the file,
+ like comments or id3 tags */
+ ExtenedAttr = 0x10, /**< read filesystem based extended attributes if
+ they are supported for the filesystem */
+ Thumbnail = 0x20, /**< only read the file's thumbnail, if it contains
+ one */
+ Preferred = 0x40, ///< get at least the preferred items
+ Everything = 0xffff ///< read everything, even if it might take a while
+
+ };
+
+ /**
+ * The constructor.
+ *
+ * creating a KFileMetaInfo item through this will autoload the plugin
+ * belonging to the mimetype and try to get meta information about
+ * the specified file.
+ *
+ * If no info is available, you'll get an empty (not invalid) object.
+ * You can test for it with the isEmpty() method.
+ *
+ * @param path The file name. This must be the path to a local file.
+ * @param mimeType The name of the file's mimetype. If ommited, the
+ * mimetype is autodetected
+ * @param what one or more of the What enum values. It gives some
+ * hint to the plugin what information is desired. The plugin
+ * may still return more items.
+ *
+ * @note This version will @b only work for @b local (file:/) files.
+ *
+ **/
+ KFileMetaInfo( const TQString& path,
+ const TQString& mimeType = TQString::null,
+ uint what = Fastest);
+
+ /**
+ * Another constructor
+ *
+ * Similar to the above, but takes a URL so that meta-data may be retrieved
+ * over other protocols (ftp, etc.)
+ *
+ **/
+ KFileMetaInfo( const KURL& url,
+ const TQString& mimeType = TQString::null,
+ uint what = Fastest);
+
+ /**
+ * Default constructor. This will create an invalid object (see
+ * isValid().
+ **/
+ KFileMetaInfo();
+
+ /**
+ * Copy constructor. This creates a copy of the original object, but
+ * that copy will point to the same data, so if you change the original,
+ * the copy will be changed, too. After all, they are referring to the same
+ * file.
+ **/
+ KFileMetaInfo( const KFileMetaInfo& original);
+
+ ~KFileMetaInfo();
+
+ /**
+ * The assignment operator, so you can do e.g.:
+ * @code
+ * KFileMetaInfo info;
+ * if (something) info = KFileMetaInfo("/the/file");
+ * @endcode
+ *
+ * This will create a shared copy of the object. The actual data
+ * is automatically deleted if all copies go out of scope.
+ **/
+ const KFileMetaInfo& operator= (const KFileMetaInfo& info );
+
+
+ /**
+ * Returns a list of all groups.
+ *
+ * @return the keys of the groups that the file has.
+ */
+ TQStringList groups() const;
+
+ /**
+ * Returns a list of all supported groups.
+ *
+ * @return the supported keys of the groups that the file has.
+ */
+ TQStringList supportedGroups() const;
+
+ /**
+ * Returns a list of the preferred groups.
+ *
+ * @return the keys of the preferred groups that the file has.
+ */
+ TQStringList preferredGroups() const;
+
+ /**
+ * Returns a list of all preferred keys.
+ *
+ * @return a list of all preferred keys.
+ */
+ TQStringList preferredKeys() const;
+
+ /**
+ * Returns a list of supported keys.
+ *
+ * @return a list of supported keys
+ */
+ TQStringList supportedKeys() const;
+
+ /**
+ * Returns the list of groups that you can add or remove from the file.
+ *
+ * @return the groups can be added or removed
+ */
+ TQStringList editableGroups() const;
+
+ // I'd like to keep those for lookup without group, at least the hint
+ // version
+ /**
+ * Returns the KFileMetaInfoItem with the given @p key.
+ *
+ * @param key the key of the item
+ * @return the item. Invalid if there is no item with the given @p key.
+ */
+ KFileMetaInfoItem item(const TQString& key) const;
+ /**
+ * Returns the KFileMetaInfoItem with the given @p hint.
+ *
+ * @param hint the hint of the item
+ * @return the item. Invalid if there is no item with the given @p hint.
+ */
+ KFileMetaInfoItem item(const KFileMetaInfoItem::Hint hint) const;
+
+ /**
+ * Saves the item with the given @p key.
+ *
+ * @param key the key of the item
+ * @param preferredGroup the preferred group, or TQString::null
+ * @param createGroup true to create the group if necessary
+ * @return the saved item
+ */
+ KFileMetaInfoItem saveItem( const TQString& key,
+ const TQString& preferredGroup = TQString::null,
+ bool createGroup = true );
+
+ /**
+ * Returns the KFileMetaInfoGroup with the given @p key.
+ *
+ * @param key the key of the item
+ * @return the group. Invalid if there is no group with the given @p key.
+ */
+ KFileMetaInfoGroup group(const TQString& key) const;
+
+ /**
+ * Returns the KFileMetaInfoGroup with the given @p key.
+ *
+ * @param key the key of the item
+ * @return the group. Invalid if there is no group with the given @p key.
+ */
+ KFileMetaInfoGroup operator[] (const TQString& key) const
+ {
+ return group(key);
+ }
+
+ /**
+ * Try to add the specified group. This will only succeed if it is
+ * in the list of editableGroups().
+ *
+ * @note that all non-variable items that belong to this group are
+ * automatically added as empty item.
+ *
+ * @param name the name of the group to add
+ * @return true if successful, false if not
+ */
+ bool addGroup( const TQString& name );
+
+ /**
+ * Remove the specified group. This will only succeed if it is
+ * in the list of editableGroups(). Beware that this also
+ * removes all the items in that group, so always ask the user
+ * before removing it!
+ *
+ * @param name the name of the group to remove
+ * @return true if successful, false if not
+ */
+ bool removeGroup( const TQString& name );
+
+ /**
+ * Returns a list of removed groups.
+ *
+ * @return a list of removed groups.
+ */
+ TQStringList removedGroups();
+
+ /**
+ * This method writes all pending changes of the meta info back to the file.
+ * If any items are marked as removed, they are really removed from the
+ * list. The info object as well as all items are updated.
+ *
+ * @return true if successful, false if not
+ */
+ bool applyChanges();
+
+ /**
+ * This method writes all pending changes of the meta info to the file @p path.
+ * If any items are marked as removed, they are really removed from the
+ * list. The info object as well as all items are updated.
+ *
+ * @return true if successful, false if not
+ */
+ bool applyChanges(const TQString& path);
+
+ /**
+ * Checks whether an item with the given @p key exists.
+ *
+ * @param key the key to check
+ * @return whether an item for this @p key exists.
+ */
+ bool contains( const TQString& key ) const;
+
+ /**
+ * Checks whether a group with the given @p key exists.
+ *
+ * @param key the key to check
+ * @return whether a group with this name exists.
+ */
+ bool containsGroup( const TQString& key ) const;
+
+ /**
+ * Returns the value with the given @p key.
+ *
+ * @param key the key to retrieve
+ * @return the value. Invalid if it does not exist
+ */
+ const TQVariant value( const TQString& key ) const
+ {
+ return item(key).value();
+ }
+
+
+ /**
+ * Returns true if the item is valid, i.e. if actually represents the info
+ * about a file, false if the object is uninitialized.
+ *
+ * @return true if valid, false otherwise
+ */
+ bool isValid() const;
+
+ /**
+ * Returns false if the object contains data, true if it's empty. You'll
+ * get an empty object if no plugin for the file could be found.
+ *
+ * @return true if empty, false otherwise
+ */
+ bool isEmpty() const;
+
+ /**
+ * Returns the mime type of file.
+ *
+ * @return the file's mime type
+ */
+ TQString mimeType() const;
+
+ /**
+ * Returns the path of file - or TQString::null if file is non-local
+ *
+ * @return the file's path - or TQString::null if file is non-local
+ */
+ TQString path() const;
+
+ /**
+ * Returns the url of file
+ *
+ * @return the file's url
+ */
+ KURL url() const;
+
+ TDEIO_EXPORT friend TQDataStream& operator >>(TQDataStream& s, KFileMetaInfo& );
+ TDEIO_EXPORT friend TQDataStream& operator <<(TQDataStream& s, const KFileMetaInfo& );
+ friend class KFilePlugin;
+
+protected:
+ KFileMetaInfoGroup appendGroup(const TQString& name);
+
+ /**
+ * @return a pointer to the plugin that belogs to this object's mimetype.
+ * It will be auto-loaded if it's currently not loaded
+ **/
+ KFilePlugin * plugin() const;
+
+ void ref();
+ void deref();
+
+ Data* d;
+
+private:
+ KFileMetaInfoItem findEditableItem( KFileMetaInfoGroup& group,
+ const TQString& key );
+
+ void init( const KURL& url,
+ const TQString& mimeType = TQString::null,
+ uint what = Fastest);
+};
+
+///////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////
+
+
+/**
+ * @brief Base class for a meta information plugin
+ *
+ * Meta information plugins are used to extract useful information from files
+ * of a given type. These plugins are used in Konqueror's file properties
+ * dialog, for example.
+ *
+ * If you want to write your own plugin, you need to derive from this class.
+ *
+ * In the constructor of your class, you need to call addMimeTypeInfo() to tell
+ * the KFile framework which mimetype(s) your plugin supports. For each
+ * mimetype, use the addGroupInfo() and addItemInfo() methods to declare the
+ * meta information items the plugin calculates and to group them accordingly.
+ * For groups, use setAttributes() to customize your group (see
+ * KFileMimeTypeInfo::Attributes). For items, use setAttributes() to define the
+ * behaviour of the item; use setHint() to define the meaning of the item; use
+ * setUnit() to define the Unit, such as KFileMimeTypeInfo::Seconds or
+ * KFileMimeTypeInfo::KiloBytes. In short, the constructor defines the data
+ * structure of the meta information supported by your plugin.
+ *
+ * Example:
+ * @code
+ * FooPlugin::FooPlugin(TQObject *parent, const char *name,
+ * const TQStringList &args)
+ * : KFilePlugin(parent, name, args)
+ * {
+ * KFileMimeTypeInfo* info = addMimeTypeInfo( "application/x-foo" );
+ *
+ * // our new group
+ * KFileMimeTypeInfo::GroupInfo* group = 0L;
+ * group = addGroupInfo(info, "FooInfo", i18n("Foo Information"));
+ *
+ * KFileMimeTypeInfo::ItemInfo* item;
+ *
+ * // our new items in the group
+ * item = addItemInfo(group, "Items", i18n("Items"), TQVariant::Int);
+ * item = addItemInfo(group, "Size", i18n("Size"), TQVariant::Int);
+ * setUnit(item, KFileMimeTypeInfo::KiloBytes);
+ *
+ * // strings are possible, too:
+ * //addItemInfo(group, "Document Type", i18n("Document type"), TQVariant::String);
+ * }
+ * @endcode
+ *
+ * Some meta information items are likely to be available in several different
+ * file formats, such as @c "Author", @c "Title" (for documents), and
+ * @c "Length" (for multimedia files). Be sure to use the naming scheme from
+ * existing plugins for your meta information items if possible. If, for
+ * example, the meta information of a group of files is shown in a table view,
+ * this will allow two files to share the same column (say "Length") even if
+ * they are of a different file type.
+ *
+ * You must overwrite the readInfo() method. In this method you need to extract
+ * the meta information of the given file. You can use a third-party library to
+ * achieve this task. This might be the best way for binary files, since a
+ * change in the file format is likely to be supported by subsequent releases
+ * of that library. Alternatively, for text-based file formats, you can use
+ * TQTextStream to parse the file. For simple file formats, TQRegExp can be of
+ * great help, too.
+ *
+ * After you extracted the relevant information, use appendGroup() and
+ * appendItem() to fill the meta information data structure (as defined in the
+ * constructor) with values. Note that you can leave out groups or items
+ * which are not appropriate for a particular file.
+ *
+ * Example:
+ * @code
+ * bool FooPlugin::readInfo( KFileMetaInfo& info, uint what)
+ * {
+ * int numItems = 0;
+ * int size = 0;
+ *
+ * // do your calculations here, e.g. using a third-party
+ * // library or by writing an own parser using e.g. QTextStream
+ *
+ * // calculate numItems and size ...
+ *
+ * // note: use the same key strings as in the constructor
+ * KFileMetaInfoGroup group = appendGroup(info, "FooInfo");
+ *
+ * appendItem(group, "Items", numItems);
+ * appendItem(group, "Size", size);
+ *
+ * return true;
+ * }
+ * @endcode
+ *
+ * If you want to define mutable meta information items, you need to overwrite
+ * the writeInfo() method. In this method, you can use third-party library
+ * (appropriate mostly for binary files, see above) or TQTextStream to write the
+ * information back to the file. If you use TQTextStream, be sure to write all
+ * file contents back.
+ *
+ * For some items, it might be that not all possible values are allowed. You
+ * can overwrite the createValidator() method to define constraints for a meta
+ * information item. For example, the @c "Year" field for an MP3 file could
+ * reject values outside the range 1500 - 2050 (at least for now). The
+ * validator is used to check values before the writeInfo() method is called so
+ * that writeInfo() is only provided correct values.
+ *
+ * In your plugin, you need to create a factory for the KFilePlugin
+ *
+ * Example:
+ * @code
+ * typedef KGenericFactory<FooPlugin> FooFactory;
+ * K_EXPORT_COMPONENT_FACTORY(tdefile_foo, FooFactory("tdefile_foo"));
+ * @endcode
+ *
+ * To make your plugin available within KDE, you also need to provide a
+ * @c .desktop file which describes your plugin. The required fields in the
+ * file are:
+ *
+ * - @c Type: must be @c "Service"
+ * - @c Name: the name of the plugin
+ * - @c ServiceTypes: must contain @c "KFilePlugin"
+ * - @c X-TDE-Library: the name of the library containing the KFile plugin
+ * - @c MimeType: the mimetype(s) which are supported by the plugin
+ * - @c PreferredGroups: a comma-separated list of the most important groups.
+ * This list defines the order in which the meta information groups should be
+ * displayed
+ * - @c PreferredItems: a comma-separated list of the most important items.
+ * This list defines the order in which the meta information items should be
+ * displayed
+ *
+ * Example:
+ * @code
+ * [Desktop Entry]
+ * Encoding=UTF-8
+ * Type=Service
+ * Name=Foo Info
+ * ServiceTypes=KFilePlugin
+ * X-TDE-Library=tdefile_foo
+ * MimeType=application/x-foo
+ * PreferredGroups=FooInfo
+ * PreferredItems=Items,Size
+ * @endcode
+ **/
+class TDEIO_EXPORT KFilePlugin : public TQObject
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Creates a new KFilePlugin instance. You need to implement a constructor
+ * with the same argument list as this is required by KGenericFactory
+ *
+ * @param parent the parent of the TQObject, can be @c 0
+ * @param name the name of the TQObject, can be @c 0
+ * @param args currently ignored
+ *
+ * @see addMimeTypeInfo()
+ * @see addGroupInfo()
+ * @see addItemInfo()
+ * @see TQObject()
+ **/
+ KFilePlugin( TQObject *parent, const char *name,
+ const TQStringList& args );
+
+ /**
+ * Destructor
+ */
+ virtual ~KFilePlugin();
+
+ /**
+ * Read the info from the file in this method and insert it into the
+ * provided KFileMetaInfo object. You can get the path to the file with
+ * KFileMetaInfo::path(). Use appendGroup() and appendItem() to fill
+ * @p info with the extracted values
+ *
+ * @param info the information will be written here
+ * @param what defines what to read, see KFileMetaInfo::What
+ * @return @c true if successful, @c false if it failed
+ *
+ * @see writeInfo()
+ **/
+ virtual bool readInfo( KFileMetaInfo& info,
+ uint what = KFileMetaInfo::Fastest ) = 0;
+
+ /**
+ * Similar to the readInfo() but for writing the info back to the file.
+ * If you don't have any writable keys, don't implement this method
+ *
+ * @param info the information that will be written
+ * @return @c true if successful, @c false if it failed
+ **/
+ virtual bool writeInfo( const KFileMetaInfo& info ) const
+ {
+ Q_UNUSED(info);
+ return true;
+ }
+
+ /**
+ * This method should create an appropriate validator for the specified
+ * item if it's editable or return a null pointer if not. If you don't have
+ * any editable items, you don't need to implement this method.
+ *
+ * If you you don't need any validation, e.g. you accept any input, you can
+ * simply return @c 0L, or not reimplement this method at all.
+ *
+ * @param mimeType the mime type
+ * @param group the group name of the validator item
+ * @param key the key name of the validator item
+ * @param parent the TQObject parent, can be @c 0
+ * @param name the name of the TQObject, can be @c 0
+ **/
+ virtual TQValidator* createValidator( const TQString& mimeType,
+ const TQString& group,
+ const TQString& key,
+ TQObject* parent,
+ const char* name) const
+ {
+ Q_UNUSED(mimeType); Q_UNUSED(group);Q_UNUSED(key);
+ Q_UNUSED(parent);Q_UNUSED(name);
+ return 0;
+ }
+
+protected:
+
+ /**
+ * Call this from within your constructor to tell the KFile framework what
+ * mimetypes your plugin supports.
+ *
+ * @param mimeType a string containing the mimetype, e.g. @c "text/html"
+ * @return a KFileMimeTypeInfo object, to be used with addGroupInfo()
+ **/
+ KFileMimeTypeInfo * addMimeTypeInfo( const TQString& mimeType );
+ // ### do we need this, if it only calls the provider?
+ // IMHO the Plugin shouldn't call its provider.
+ // DF: yes we need this. A plugin can create more than one mimetypeinfo.
+ // What sucks though, is to let plugins do that in their ctor.
+ // Would be much simpler to have a virtual init method for that,
+ // so that the provider can set up stuff with the plugin pointer first!
+
+ /**
+ * Creates a meta information group for KFileMimeTypeInfo object returned
+ * by addMimeTypeInfo().
+ *
+ * @param info the object returned by addMimeTypeInfo()
+ * @param key a unique string identifiing this group. For simplicity it is
+ * recommended to use the same string as for the translatedKey
+ * parameter
+ * @param translatedKey the translated version of the key string for
+ * displaying in user interfaces. Use i18n() to translate the string
+ * @return a GroupInfo object. Pass this object to addItemInfo to add meta
+ * information attributed to this group.
+ *
+ * @see setAttributes()
+ * @see addItemInfo()
+ **/
+ KFileMimeTypeInfo::GroupInfo* addGroupInfo(KFileMimeTypeInfo* info,
+ const TQString& key, const TQString& translatedKey) const;
+
+ /**
+ * Sets attributes of the GroupInfo object returned by addGroupInfo().
+ *
+ * @param gi the object returned by addGroupInfo()
+ * @param attr the attributes for this group; these are values of type
+ * KFileMimeTypeInfo::Attributes, or'ed together
+ **/
+ void setAttributes(KFileMimeTypeInfo::GroupInfo* gi, uint attr) const;
+
+ void addVariableInfo(KFileMimeTypeInfo::GroupInfo* gi, TQVariant::Type type,
+ uint attr) const;
+
+ /**
+ * Adds a meta information item to a GroupInfo object as returned by
+ * addGroupInfo().
+ *
+ * @param gi the GroupInfo object to add a new item to
+ * @param key a unique string to identify this item. For simplicity it is
+ * recommended to use the same string as for the translatedKey
+ * parameter
+ * @param translatedKey the translated version of the key string for
+ * displaying in user interfaces. Use i18n() to translate the string
+ * @param type the type of the meta information item, e.g. TQVariant::Int
+ * or TQVariant::String.
+ * @return an ItemInfo object. Pass this object to setAttributes()
+ **/
+ KFileMimeTypeInfo::ItemInfo* addItemInfo(KFileMimeTypeInfo::GroupInfo* gi,
+ const TQString& key,
+ const TQString& translatedKey,
+ TQVariant::Type type);
+
+ /**
+ * Sets some attributes for a meta information item. The attributes
+ * describe if the item is mutable, how it should be computed for a list of
+ * files, and how it should be displayed
+ *
+ * @param item the ItemInfo object as returned by addItemInfo()
+ * @param attr the attributes for this item; these are values of type
+ * KFileMimeTypeInfo::Attributes, or'ed together
+ **/
+ void setAttributes(KFileMimeTypeInfo::ItemInfo* item, uint attr);
+
+ /**
+ * Defines the meaning of the meta information item. Some applications make
+ * use of this information, so be sure to check KFileMimeTypeInfo::Hint to
+ * see if an item's meaning is in the list.
+ *
+ * @param item the ItemInfo object as returned by addItemInfo()
+ * @param hint the item's meaning. See KFileMimeTypeInfo::Hint for a list
+ * of available meanings
+ **/
+ void setHint(KFileMimeTypeInfo::ItemInfo* item, uint hint);
+
+ /**
+ * Sets the unit used in the meta information item. This unit is used to
+ * format the value and to make large values human-readable. For example,
+ * if the item's unit is KFileMimeTypeInfo::Seconds and the value is 276,
+ * it will be displayed as 4:36.
+ *
+ * @param item the ItemInfo object as returned by addItemInfo()
+ * @param unit the item's unit. See KFileMimeTypeInfo::Unit for a list of
+ * available units
+ **/
+ void setUnit(KFileMimeTypeInfo::ItemInfo* item, uint unit);
+
+ /**
+ * Sets a prefix string which is displayed before the item's value. Use
+ * this string if no predefined unit fits the item's unit. Be sure to
+ * translate the string with i18n()
+ *
+ * @param item the ItemInfo object as returned by addItemInfo()
+ * @param prefix the prefix string to display
+ **/
+ void setPrefix(KFileMimeTypeInfo::ItemInfo* item, const TQString& prefix);
+
+ /**
+ * Sets a suffix string which is displayed before the item's value. Use
+ * this string if no predefined unit fits the item's unit. Be sure to
+ * translate the string with i18n()
+ *
+ * @param item the ItemInfo object as returned by addItemInfo()
+ * @param suffix the suffix string to display
+ **/
+ void setSuffix(KFileMimeTypeInfo::ItemInfo* item, const TQString& suffix);
+
+ /**
+ * Call this method from within readInfo() to indicate that you wish to
+ * fill meta information items of the group identified by @p key with
+ * values.
+ *
+ * @param info the KFileMetaInfo object. Use the parameter of the
+ * readInfo() method
+ * @param key the key string to identify the group. Use the string that you
+ * defined in your class' constructor
+ * @return a KFileMetaInfoGroup object, to be used in appendItem()
+ **/
+ KFileMetaInfoGroup appendGroup(KFileMetaInfo& info, const TQString& key);
+
+ /**
+ * Call this method from within readInfo() to fill the meta information item
+ * identified by @p key with a @p value
+ *
+ * @param group the KFileMetaInfoGroup object, as returned by appendGroup()
+ * @param key the key string to identify the item.
+ * @param value the value of the meta information item
+ **/
+ void appendItem(KFileMetaInfoGroup& group, const TQString& key, TQVariant value);
+
+ TQStringList m_preferredKeys;
+ TQStringList m_preferredGroups;
+
+protected:
+ /**
+ * Helper method to allow binary compatible extensions when needing
+ * "new virtual methods"
+ *
+ * @param id the identifier of the new "virtual" method
+ * @param data any parameter data the new "virtual" method needs
+ */
+ virtual void virtual_hook( int id, void* data );
+private:
+ class KFilePluginPrivate;
+ KFilePluginPrivate *d;
+};
+
+///////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////
+
+
+/**
+ * @internal
+ * Synchronous access to metadata of a local file. Usually, you don't want
+ * to use this class for getting metainfo from a file. Use KFileMetaInfo
+ * directly. However, if you want to find out if a specific mimetype is
+ * supported and which groups and items are provided for it, you can ask
+ * the KFileMetainfoProvider for it.
+ **/
+class TDEIO_EXPORT KFileMetaInfoProvider: private QObject
+{
+ friend class KFilePlugin;
+
+ Q_OBJECT
+public:
+ virtual ~KFileMetaInfoProvider();
+
+ static KFileMetaInfoProvider * self();
+
+ /**
+ * @return a pointer to the plugin that belongs to the specified mimetype,
+ * which means also load the plugin if it's not in memory
+ */
+ KFilePlugin * plugin( const TQString& mimeType ); // KDE4: merge with method below
+
+ /**
+ * @return a pointer to the plugin that belongs to the specified mimetype,
+ * for the given protocol.
+ * This loads the plugin if it's not in memory yet.
+ */
+ KFilePlugin * plugin( const TQString& mimeType, const TQString& protocol );
+
+ const KFileMimeTypeInfo * mimeTypeInfo( const TQString& mimeType ); // KDE4: merge with below
+ const KFileMimeTypeInfo * mimeTypeInfo( const TQString& mimeType, const TQString& protocol );
+
+ TQStringList preferredKeys( const TQString& mimeType ) const;
+ TQStringList preferredGroups( const TQString& mimeType ) const;
+
+ /// @since 3.1
+ TQStringList supportedMimeTypes() const;
+
+protected: // ## should be private, right?
+ KFileMetaInfoProvider();
+
+private:
+
+ // Data structure:
+ // Mimetype or Protocol -> { Plugin and MimeTypeInfo }
+ // The {} struct is CachedPluginInfo
+ struct CachedPluginInfo
+ {
+ CachedPluginInfo() : plugin( 0 ), mimeTypeInfo( 0 ), ownsPlugin( false ) {}
+ CachedPluginInfo( KFilePlugin* p, KFileMimeTypeInfo* i, bool owns )
+ : plugin( p ), mimeTypeInfo( i ), ownsPlugin( owns ) {}
+ // auto-delete behavior
+ ~CachedPluginInfo() {
+ if ( ownsPlugin ) delete plugin;
+ delete mimeTypeInfo;
+ }
+
+ // If plugin and mimeTypeInfo are 0, means that no plugin is available.
+ KFilePlugin* plugin;
+ KFileMimeTypeInfo* mimeTypeInfo;
+ // The problem here is that plugin can be shared in multiple instances,
+ // so the memory management isn't easy. KDE4 solution: use KSharedPtr?
+ // For now we flag one copy of the KFilePlugin pointer as being "owned".
+ bool ownsPlugin;
+ };
+
+ // The key is either a mimetype or a protocol. Those things don't look the same
+ // so there's no need for two QDicts.
+ TQDict<CachedPluginInfo> m_plugins;
+
+ // This data is aggregated during the creation of a plugin,
+ // before being moved to the appropriate CachedPluginInfo(s)
+ // At any other time than during the loading of a plugin, this dict is EMPTY.
+ // Same key as in m_plugins: mimetype or protocol
+ TQDict<KFileMimeTypeInfo> m_pendingMimetypeInfos;
+
+private:
+ static KFileMetaInfoProvider * s_self;
+
+ KFilePlugin* loadPlugin( const TQString& mimeType, const TQString& protocol );
+ KFilePlugin* loadAndRegisterPlugin( const TQString& mimeType, const TQString& protocol );
+ KFileMimeTypeInfo * addMimeTypeInfo( const TQString& mimeType );
+
+ class KFileMetaInfoProviderPrivate;
+ KFileMetaInfoProviderPrivate *d;
+
+};
+
+TDEIO_EXPORT TQDataStream& operator <<(TQDataStream& s, const KFileMetaInfoItem& );
+TDEIO_EXPORT TQDataStream& operator >>(TQDataStream& s, KFileMetaInfoItem& );
+
+TDEIO_EXPORT TQDataStream& operator <<(TQDataStream& s, const KFileMetaInfoGroup& );
+TDEIO_EXPORT TQDataStream& operator >>(TQDataStream& s, KFileMetaInfoGroup& );
+
+TDEIO_EXPORT TQDataStream& operator <<(TQDataStream& s, const KFileMetaInfo& );
+TDEIO_EXPORT TQDataStream& operator >>(TQDataStream& s, KFileMetaInfo& );
+
+
+#endif // KILEMETAINFO_H