00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef KILEMETAINFO_H
00023 #define KILEMETAINFO_H
00024
00025
00026
00027 #define m_unit outouftheway_m_unit
00028
00029 #include <qdict.h>
00030 #include <qvariant.h>
00031 #include <qobject.h>
00032 #include <qstring.h>
00033 #include <kurl.h>
00034
00035 #undef m_unit
00036
00037 class QValidator;
00038 class KFilePlugin;
00039 class KFileMetaInfoGroup;
00040
00051 class KFileMimeTypeInfo
00052 {
00053
00054
00055 friend class KFilePlugin;
00056 friend class KFileMetaInfoProvider;
00057
00058 public:
00059 KFileMimeTypeInfo() {}
00060
00065 enum Attributes
00066 {
00067 Addable = 1,
00068 Removable = 2,
00069 Modifiable = 4,
00070 Cumulative = 8,
00073 Cummulative = Cumulative,
00074 Averaged = 16,
00076 MultiLine = 32,
00080 SqueezeText = 64
00084 };
00085
00090 enum Hint {
00091 NoHint = 0,
00092 Name = 1,
00093 Author = 2,
00094 Description = 3,
00095 Width = 4,
00096 Height = 5,
00097 Size = 6,
00098 Bitrate = 7,
00099 Length = 8,
00100 Hidden = 9,
00101 Thumbnail = 10
00102
00103 };
00104
00112 enum Unit {
00113 NoUnit = 0,
00114 Seconds = 1,
00115 MilliSeconds = 2,
00116 BitsPerSecond = 3,
00117 Pixels = 4,
00118 Inches = 5,
00119 Centimeters = 6,
00120 Bytes = 7,
00121 FramesPerSecond = 8,
00122 DotsPerInch = 9,
00123 BitsPerPixel = 10,
00124 Hertz = 11,
00125 KiloBytes = 12,
00126 Millimeters = 13
00127 };
00128
00129
00130 class ItemInfo;
00131
00138 class GroupInfo
00139 {
00140
00141 friend class KFilePlugin;
00142 friend class KFileMimeTypeInfo;
00143 public:
00154 QStringList supportedKeys() const
00155 {
00156 return m_supportedKeys;
00157 }
00158
00165 const QString& name() const
00166 {
00167 return m_name;
00168 }
00169
00177 const QString& translatedName() const
00178 {
00179 return m_translatedName;
00180 }
00181
00189 const ItemInfo * itemInfo( const QString& key ) const;
00190
00196 uint attributes() const
00197 {
00198 return m_attr;
00199 }
00200
00205 bool supportsVariableKeys() const
00206 {
00207 return m_variableItemInfo;
00208 }
00209
00217 const ItemInfo* variableItemInfo( ) const
00218 {
00219 return m_variableItemInfo;
00220 }
00221
00222 private:
00224 GroupInfo( const QString& name, const QString& translatedName);
00225
00227 KFileMimeTypeInfo::ItemInfo* addItemInfo( const QString& key,
00228 const QString& translatedKey,
00229 QVariant::Type type);
00230
00232 void addVariableInfo( QVariant::Type type, uint attr );
00233
00234 QString m_name;
00235 QString m_translatedName;
00236 QStringList m_supportedKeys;
00237 uint m_attr;
00238 ItemInfo* m_variableItemInfo;
00239 QDict<ItemInfo> m_itemDict;
00240
00241 };
00242
00248 class ItemInfo
00249 {
00250 friend class KFilePlugin;
00251 friend class GroupInfo;
00252 public:
00254 ItemInfo() {}
00255
00263 const QString& prefix() const
00264 {
00265 return m_prefix;
00266 }
00267
00274 const QString& suffix() const
00275 {
00276 return m_suffix;
00277 }
00278
00285 QVariant::Type type() const
00286 {
00287 return m_type;
00288 }
00289
00294 const QString& key() const
00295 {
00296 return m_key;
00297 }
00298
00310 QString string( const QVariant& value, bool mangle = true ) const;
00311
00317 bool isVariableItem() const
00318 {
00319
00320 return key().isNull();
00321 }
00322
00329 const QString& translatedKey() const
00330 {
00331 return m_translatedKey;
00332 }
00333
00339 uint attributes() const
00340 {
00341 return m_attr;
00342 }
00343
00349 uint hint() const
00350 {
00351 return m_hint;
00352 }
00353
00359 uint unit() const
00360 {
00361 return m_unit;
00362 }
00363
00364 private:
00366 ItemInfo(const QString& key, const QString& translatedKey,
00367 QVariant::Type type)
00368 : m_key(key), m_translatedKey(translatedKey),
00369 m_type(type),
00370 m_attr(0), m_unit(NoUnit), m_hint(NoHint),
00371 m_prefix(QString::null), m_suffix(QString::null)
00372 {}
00373
00374 QString m_key;
00375 QString m_translatedKey;
00376 QVariant::Type m_type;
00377 uint m_attr;
00378 uint m_unit;
00379 uint m_hint;
00380 QString m_prefix;
00381 QString m_suffix;
00382 };
00383
00384
00385 ~KFileMimeTypeInfo();
00386
00397 QValidator * createValidator(const QString& group, const QString& key,
00398 QObject *parent = 0, const char *name = 0) const;
00399
00406 QStringList supportedGroups() const;
00407
00414 QStringList translatedGroups() const;
00415
00422 QStringList preferredGroups() const
00423 {
00424 return m_preferredGroups;
00425 }
00426
00431 QString mimeType() const {return m_mimeType;}
00432
00440 const GroupInfo * groupInfo( const QString& group ) const;
00441
00442
00443
00444
00445
00452 QStringList supportedKeys() const;
00453
00459 QStringList preferredKeys() const
00460 {
00461 return m_preferredKeys;
00462 }
00463
00464
00465 GroupInfo * addGroupInfo( const QString& name,
00466 const QString& translatedName);
00467
00468 QString m_translatedName;
00469 QStringList m_supportedKeys;
00470 uint m_attr;
00471
00472 QDict<ItemInfo> m_itemDict;
00473
00474
00475 protected:
00477 KFileMimeTypeInfo( const QString& mimeType );
00478
00479 QDict<GroupInfo> m_groups;
00480 QString m_mimeType;
00481 QStringList m_preferredKeys;
00482 QStringList m_preferredGroups;
00483 };
00484
00485
00491 class KFileMetaInfoItem
00492 {
00493 public:
00494 class Data;
00495 typedef KFileMimeTypeInfo::Hint Hint;
00496 typedef KFileMimeTypeInfo::Unit Unit;
00497 typedef KFileMimeTypeInfo::Attributes Attributes;
00498
00504
00505 KFileMetaInfoItem( const KFileMimeTypeInfo::ItemInfo* mti,
00506 const QString& key, const QVariant& value);
00507
00511 KFileMetaInfoItem( const KFileMetaInfoItem & item );
00512
00522 const KFileMetaInfoItem& operator= (const KFileMetaInfoItem & item );
00523
00527 KFileMetaInfoItem();
00528
00529 ~KFileMetaInfoItem();
00530
00535 QString key() const;
00536
00542 QString translatedKey() const;
00543
00548 const QVariant& value() const;
00549
00557 QString string( bool mangle = true ) const;
00558
00564 bool setValue( const QVariant& value );
00565
00570 QVariant::Type type() const;
00571
00580 bool isEditable() const;
00581
00590 bool isRemoved() const;
00591
00600 bool isModified() const;
00601
00608 QString prefix() const;
00609
00616 QString suffix() const;
00617
00622 uint hint() const;
00623
00629 uint unit() const;
00630
00636 uint attributes() const;
00637
00645 bool isValid() const;
00646
00647 friend QDataStream& operator >>(QDataStream& s, KFileMetaInfoItem& );
00648 friend QDataStream& operator >>(QDataStream& s, KFileMetaInfoGroup& );
00649 friend QDataStream& operator <<(QDataStream& s, const KFileMetaInfoItem& );
00650 friend class KFileMetaInfoGroup;
00651
00652 protected:
00653 void setAdded();
00654 void setRemoved();
00655
00656 void ref();
00657 void deref();
00658
00659 Data *d;
00660 };
00661
00667 class KFileMetaInfoGroup
00668 {
00669 friend class KFilePlugin;
00670 friend class KFileMetaInfo;
00671 friend QDataStream& operator >>(QDataStream& s, KFileMetaInfoGroup& );
00672 friend QDataStream& operator <<(QDataStream& s, const KFileMetaInfoGroup& );
00673
00674 public:
00675 class Data;
00681
00682 KFileMetaInfoGroup( const QString& name, const KFileMimeTypeInfo* info );
00683
00687 KFileMetaInfoGroup( const KFileMetaInfoGroup& original );
00688
00698 const KFileMetaInfoGroup& operator= (const KFileMetaInfoGroup& info );
00699
00704 KFileMetaInfoGroup();
00705
00706 ~KFileMetaInfoGroup();
00707
00715 bool isValid() const;
00716
00722 bool isEmpty() const;
00723
00730 bool isModified() const;
00731
00736 KFileMetaInfoItem operator[]( const QString& key ) const
00737 { return item( key ); }
00738
00745 KFileMetaInfoItem item( const QString& key ) const;
00746
00752 KFileMetaInfoItem item( uint hint ) const;
00753
00760 const QVariant value( const QString& key ) const
00761 {
00762 const KFileMetaInfoItem &i = item( key );
00763 return i.value();
00764 }
00765
00776 QStringList supportedKeys() const;
00777
00783 bool supportsVariableKeys() const;
00784
00789 bool contains( const QString& key ) const;
00790
00795 QStringList keys() const;
00796
00801 QStringList preferredKeys() const;
00802
00809
00810
00811
00812
00813
00821 KFileMetaInfoItem addItem( const QString& key );
00822
00831 bool removeItem(const QString& key);
00832
00837 QStringList removedItems();
00838
00843 QString name() const;
00844
00850 QString translatedName() const;
00851
00856 uint attributes() const;
00857
00858 protected:
00859 void setAdded();
00860 KFileMetaInfoItem appendItem( const QString& key, const QVariant& value);
00861
00862 Data* d;
00863 void ref();
00864 void deref();
00865
00866 };
00867
00868
00871
00872
00890 class KFileMetaInfo
00891 {
00892 public:
00893 typedef KFileMimeTypeInfo::Hint Hint;
00894 typedef KFileMimeTypeInfo::Unit Unit;
00895 typedef KFileMimeTypeInfo::Attributes Attributes;
00896 class Data;
00897
00902 enum What
00903 {
00904 Fastest = 0x1,
00907 DontCare = 0x2,
00908
00909 TechnicalInfo = 0x4,
00912 ContentInfo = 0x8,
00914 ExtenedAttr = 0x10,
00916 Thumbnail = 0x20,
00918 Preferred = 0x40,
00919 Everything = 0xffff
00920
00921 };
00922
00943 KFileMetaInfo( const QString& path,
00944 const QString& mimeType = QString::null,
00945 uint what = Fastest);
00946
00954 KFileMetaInfo( const KURL& url,
00955 const QString& mimeType = QString::null,
00956 uint what = Fastest);
00957
00962 KFileMetaInfo();
00963
00970 KFileMetaInfo( const KFileMetaInfo& original);
00971
00972 ~KFileMetaInfo();
00973
00984 const KFileMetaInfo& operator= (const KFileMetaInfo& info );
00985
00986
00991 QStringList groups() const;
00992
00997 QStringList supportedGroups() const;
00998
01003 QStringList preferredGroups() const;
01004
01009 QStringList preferredKeys() const;
01010
01015 QStringList supportedKeys() const;
01016
01021 QStringList editableGroups() const;
01022
01023
01024
01030 KFileMetaInfoItem item(const QString& key) const;
01036 KFileMetaInfoItem item(const KFileMetaInfoItem::Hint hint) const;
01037
01045 KFileMetaInfoItem saveItem( const QString& key,
01046 const QString& preferredGroup = QString::null,
01047 bool createGroup = true );
01048
01054 KFileMetaInfoGroup group(const QString& key) const;
01055
01061 KFileMetaInfoGroup operator[] (const QString& key) const
01062 {
01063 return group(key);
01064 }
01065
01074 bool addGroup( const QString& name );
01075
01084 bool removeGroup( const QString& name );
01085
01090 QStringList removedGroups();
01091
01098 bool applyChanges();
01099
01105 bool contains( const QString& key ) const;
01106
01112 bool containsGroup( const QString& key ) const;
01113
01114
01115
01116
01117
01118
01119 const QVariant value( const QString& key ) const
01120 {
01121 return item(key).value();
01122 }
01123
01124
01130 bool isValid() const;
01131
01137 bool isEmpty() const;
01138
01143 QString mimeType() const;
01144
01149 QString path() const;
01150
01155 KURL url() const;
01156
01157 friend QDataStream& operator >>(QDataStream& s, KFileMetaInfo& );
01158 friend QDataStream& operator <<(QDataStream& s, const KFileMetaInfo& );
01159 friend class KFilePlugin;
01160
01161 protected:
01162 KFileMetaInfoGroup appendGroup(const QString& name);
01163
01168 KFilePlugin * const plugin() const;
01169
01170 void ref();
01171 void deref();
01172
01173 Data* d;
01174
01175 private:
01176 KFileMetaInfoItem findEditableItem( KFileMetaInfoGroup& group,
01177 const QString& key );
01178
01179 void init( const KURL& url,
01180 const QString& mimeType = QString::null,
01181 uint what = Fastest);
01182 };
01183
01186
01187
01205 class KFilePlugin : public QObject
01206 {
01207 Q_OBJECT
01208
01209 public:
01216 KFilePlugin( QObject *parent, const char *name,
01217 const QStringList& args );
01218
01219 virtual ~KFilePlugin();
01220
01229 virtual bool readInfo( KFileMetaInfo& info,
01230 uint what = KFileMetaInfo::Fastest ) = 0;
01231
01238 virtual bool writeInfo( const KFileMetaInfo& info ) const
01239 {
01240 Q_UNUSED(info);
01241 return true;
01242 }
01243
01257 virtual QValidator* createValidator( const QString& mimeType,
01258 const QString& group,
01259 const QString& key,
01260 QObject* parent,
01261 const char* name) const
01262 {
01263 Q_UNUSED(mimeType); Q_UNUSED(group);Q_UNUSED(key);
01264 Q_UNUSED(parent);Q_UNUSED(name);
01265 return 0;
01266 }
01267
01268 protected:
01269
01270 KFileMimeTypeInfo::GroupInfo* addGroupInfo(KFileMimeTypeInfo* info,
01271 const QString& key, const QString& translatedKey) const;
01272 void setAttributes(KFileMimeTypeInfo::GroupInfo* gi, uint attr) const;
01273 void addVariableInfo(KFileMimeTypeInfo::GroupInfo* gi, QVariant::Type type,
01274 uint attr) const;
01275 KFileMimeTypeInfo::ItemInfo* addItemInfo(KFileMimeTypeInfo::GroupInfo* gi,
01276 const QString& key,
01277 const QString& translatedKey,
01278 QVariant::Type type);
01279 void setAttributes(KFileMimeTypeInfo::ItemInfo* item, uint attr);
01280 void setHint(KFileMimeTypeInfo::ItemInfo* item, uint hint);
01281 void setUnit(KFileMimeTypeInfo::ItemInfo* item, uint unit);
01282 void setPrefix(KFileMimeTypeInfo::ItemInfo* item, const QString& prefix);
01283 void setSuffix(KFileMimeTypeInfo::ItemInfo* item, const QString& suffix);
01284 KFileMetaInfoGroup appendGroup(KFileMetaInfo& info, const QString& key);
01285 void appendItem(KFileMetaInfoGroup& group, const QString& key, QVariant value);
01286
01290
01291
01292 KFileMimeTypeInfo * addMimeTypeInfo( const QString& mimeType );
01293
01294 QStringList m_preferredKeys;
01295 QStringList m_preferredGroups;
01296
01297 protected:
01298 virtual void virtual_hook( int id, void* data );
01299 private:
01300 class KFilePluginPrivate;
01301 KFilePluginPrivate *d;
01302 };
01303
01306
01307
01314 class KFileMetaInfoProvider: private QObject
01315 {
01316 friend class KFilePlugin;
01317
01318 Q_OBJECT
01319 public:
01320 virtual ~KFileMetaInfoProvider();
01321
01322 static KFileMetaInfoProvider * self();
01323
01328 KFilePlugin * plugin( const QString& mimeType );
01329
01330 const KFileMimeTypeInfo * mimeTypeInfo( const QString& mimeType );
01331
01332 QStringList preferredKeys( const QString& mimeType ) const;
01333 QStringList preferredGroups( const QString& mimeType ) const;
01334
01336 QStringList supportedMimeTypes() const;
01337
01338 protected:
01339 KFileMetaInfoProvider();
01340
01341 QDict<KFilePlugin> m_plugins;
01342 QDict<KFileMimeTypeInfo> m_mimeTypeDict;
01343
01344 private:
01345 static KFileMetaInfoProvider * s_self;
01346
01347 KFileMimeTypeInfo * addMimeTypeInfo( const QString& mimeType );
01348
01349 class KFileMetaInfoProviderPrivate;
01350 KFileMetaInfoProviderPrivate *d;
01351
01352 };
01353
01354 QDataStream& operator <<(QDataStream& s, const KFileMetaInfoItem& );
01355 QDataStream& operator >>(QDataStream& s, KFileMetaInfoItem& );
01356
01357 QDataStream& operator <<(QDataStream& s, const KFileMetaInfoGroup& );
01358 QDataStream& operator >>(QDataStream& s, KFileMetaInfoGroup& );
01359
01360 QDataStream& operator <<(QDataStream& s, const KFileMetaInfo& );
01361 QDataStream& operator >>(QDataStream& s, KFileMetaInfo& );
01362
01363
01364 #endif // KILEMETAINFO_H