File indexing completed on 2024-05-12 15:55:36
0001 /* SPDX-FileCopyrightText: 2003-2010 Jesper K. Pedersen <blackie@kde.org> 0002 0003 SPDX-License-Identifier: GPL-2.0-or-later 0004 */ 0005 #ifndef DATABASEELEMENT_H 0006 #define DATABASEELEMENT_H 0007 0008 #include <QString> 0009 #include <QVariant> 0010 0011 namespace Exiv2 0012 { 0013 class ExifData; 0014 } 0015 0016 namespace Exif 0017 { 0018 0019 class DatabaseElement 0020 { 0021 public: 0022 virtual ~DatabaseElement() { } 0023 virtual QString columnName() const = 0; 0024 /** 0025 * @brief createString 0026 * Create a string containing the field name and field data type. 0027 * E.g.: "Exif_Photo_FNumber_denominator int", "Exif_Photo_FNumber_nominator int" 0028 * @return a string suitable for usage in a create table query 0029 */ 0030 virtual QString createString() const = 0; 0031 /** 0032 * @brief queryString 0033 * @return a placeholder string ("?") for the column. 0034 */ 0035 virtual QString queryString() const = 0; 0036 /** 0037 * @brief exifAsValue interprets the ExifData value and creates a QVariant suitable for QSqlQuery::bindValue. 0038 * @param data 0039 * @return The converted value, or an empty QVariant if the necessary data is not available. 0040 */ 0041 virtual QVariant valueFromExif(Exiv2::ExifData &data) const = 0; 0042 /** 0043 * @brief value 0044 * @see Database::readFields 0045 * @return The bound value, or an empty QVariant if setValue was never called. 0046 */ 0047 QVariant value() const; 0048 void setValue(QVariant val); 0049 0050 protected: 0051 DatabaseElement(); 0052 0053 private: 0054 QVariant m_value; 0055 }; 0056 0057 class StringExifElement : public DatabaseElement 0058 { 0059 public: 0060 explicit StringExifElement(const char *tag); 0061 QString columnName() const override; 0062 QString createString() const override; 0063 QString queryString() const override; 0064 QVariant valueFromExif(Exiv2::ExifData &data) const override; 0065 0066 private: 0067 const char *m_tag; 0068 }; 0069 0070 class IntExifElement : public DatabaseElement 0071 { 0072 public: 0073 explicit IntExifElement(const char *tag); 0074 QString columnName() const override; 0075 QString createString() const override; 0076 QString queryString() const override; 0077 QVariant valueFromExif(Exiv2::ExifData &data) const override; 0078 0079 private: 0080 const char *m_tag; 0081 }; 0082 0083 /** 0084 * @brief The RationalExifElement class 0085 * This has support for the exif rational type. 0086 * 0087 * Currently, only simple (one component) rationals and 0088 * the 3-component rationals used for GPS data (hour-minute-second) 0089 * are supported. 0090 */ 0091 class RationalExifElement : public DatabaseElement 0092 { 0093 public: 0094 explicit RationalExifElement(const char *tag); 0095 QString columnName() const override; 0096 QString createString() const override; 0097 QString queryString() const override; 0098 QVariant valueFromExif(Exiv2::ExifData &data) const override; 0099 0100 private: 0101 const char *m_tag; 0102 }; 0103 0104 /** 0105 * @brief The LensExifElement class 0106 * This class provides a wrapper around the Exif.Photo.LensModel exif tag. 0107 * Besides this tag, there are several other legacy exif tags with similar information. 0108 * This class transparently falls back to a legacy tag when the LensModel is not available. 0109 */ 0110 class LensExifElement : public DatabaseElement 0111 { 0112 public: 0113 explicit LensExifElement(); 0114 QString columnName() const override; 0115 QString createString() const override; 0116 QString queryString() const override; 0117 QVariant valueFromExif(Exiv2::ExifData &data) const override; 0118 0119 private: 0120 const char *m_tag; 0121 }; 0122 0123 } 0124 0125 #endif /* DATABASEELEMENT_H */ 0126 0127 // vi:expandtab:tabstop=4 shiftwidth=4: