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: