File indexing completed on 2024-06-09 05:01:52

0001 /*
0002     SPDX-FileCopyrightText: 2014-2015 Christian Dávid <christian-david@web.de>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #ifndef PAYEEIDENTIFIER_H
0007 #define PAYEEIDENTIFIER_H
0008 
0009 #define KMM_STRINGIFY(x) #x
0010 #define KMM_TOSTRING(x) KMM_STRINGIFY(x)
0011 
0012 #include <stdexcept>
0013 
0014 #include <QMetaType>
0015 #include <QString>
0016 #include <qglobal.h>
0017 
0018 /** @todo fix include path after upgrade to cmake 3 */
0019 #include "payeeidentifier/kmm_payeeidentifier_export.h"
0020 
0021 #define PAYEEIDENTIFIERBADCASTEXCEPTION payeeIdentifier::badCast("Casted payeeIdentifier with wrong type " __FILE__ ":" KMM_TOSTRING(__LINE__))
0022 #define PAYEEIDENTIFIEREMPTYEXCEPTION payeeIdentifier::empty("Requested payeeIdentifierData of empty payeeIdentifier " __FILE__ ":" KMM_TOSTRING(__LINE__))
0023 
0024 // Q_DECLARE_METATYPE requires this include
0025 
0026 class QDomDocument;
0027 class QDomElement;
0028 class payeeIdentifierData;
0029 class KMM_PAYEEIDENTIFIER_EXPORT payeeIdentifier
0030 {
0031 public:
0032     typedef unsigned int id_t;
0033 
0034     explicit payeeIdentifier();
0035     explicit payeeIdentifier(payeeIdentifierData *const data);
0036     explicit payeeIdentifier(const id_t& id, payeeIdentifierData *const data);
0037     explicit payeeIdentifier(const QString& id, payeeIdentifierData *const data);
0038     explicit payeeIdentifier(const id_t& id, const payeeIdentifier& other);
0039 
0040     payeeIdentifier(const payeeIdentifier& other);
0041     ~payeeIdentifier();
0042     payeeIdentifier& operator=(const payeeIdentifier& other);
0043     bool operator==(const payeeIdentifier& other) const;
0044 
0045     /** @brief Check if any data is associated */
0046     bool isNull() const {
0047         return (m_payeeIdentifier == 0);
0048     }
0049 
0050     /**
0051      * @brief create xml to save this payeeIdentifier
0052      *
0053      * It creates a new element below parent which is used to store all data.
0054      *
0055      * The counter part to load a payee identifier again is payeeIdentifierLoader::createPayeeIdentifierFromXML().
0056      */
0057     // void writeXML(QDomDocument &document, QDomElement &parent, const QString& elementName = QLatin1String("payeeIdentifier")) const;
0058 
0059     /**
0060      * @throws payeeIdentifier::empty
0061      */
0062     payeeIdentifierData* operator->();
0063 
0064     /** @copydoc operator->() */
0065     const payeeIdentifierData* operator->() const;
0066 
0067     /** @copydoc operator->() */
0068     payeeIdentifierData* data();
0069 
0070     /** @copydoc operator->() */
0071     const payeeIdentifierData* data() const;
0072 
0073     template< class T >
0074     T* data();
0075 
0076     template< class T >
0077     const T* data() const;
0078 
0079     bool isValid() const;
0080 
0081 
0082     id_t id() const {
0083         return m_id;
0084     }
0085 
0086     QString idString() const;
0087 
0088     void clearId() {
0089         m_id = 0;
0090     }
0091 
0092     /**
0093      * @brief Get payeeIdentifier Iid which identifiers the type
0094      *
0095      * @return An payeeIdentifier id or QString() if no data is associated
0096      */
0097     QString iid() const;
0098 
0099     /**
0100      * @brief Thrown if a cast of a payeeIdentifier fails
0101      *
0102      * This is inspired by std::bad_cast
0103      */
0104 #if defined(Q_OS_WIN)
0105     class badCast final : public std::runtime_error
0106 
0107 #else
0108     class KMM_PAYEEIDENTIFIER_EXPORT badCast final : public std::runtime_error
0109 
0110 #endif
0111     {
0112     public:
0113         explicit badCast(const char *exceptionMessage) : std::runtime_error(exceptionMessage) {}
0114     };
0115 
0116     /**
0117      * @brief Thrown if one tried to access the data of a null payeeIdentifier
0118      */
0119 #if defined(Q_OS_WIN)
0120     class empty final : public std::runtime_error
0121 
0122 #else
0123     class KMM_PAYEEIDENTIFIER_EXPORT empty final : public std::runtime_error
0124 
0125 #endif
0126     {
0127     public:
0128         explicit empty(const char *exceptionMessage) : std::runtime_error(exceptionMessage) {}
0129     };
0130 
0131 private:
0132     /**
0133      * The id is only used in MyMoneyPayeeIdentifierContainer at the moment.
0134      */
0135     id_t m_id;
0136 
0137     // Must access the id, but the id should not be used outside of that class at the moment
0138     friend class MyMoneyPayeeIdentifierContainer;
0139     friend class payeeIdentifierLoader;
0140 
0141     payeeIdentifierData* m_payeeIdentifier;
0142 };
0143 
0144 template<class T>
0145 T* payeeIdentifier::data()
0146 {
0147     T *const ident = dynamic_cast<T*>(operator->());
0148     if (ident == 0)
0149         throw PAYEEIDENTIFIERBADCASTEXCEPTION;
0150     return ident;
0151 }
0152 
0153 template<class T>
0154 const T* payeeIdentifier::data() const
0155 {
0156     const T *const ident = dynamic_cast<const T*>(operator->());
0157     if (ident == 0)
0158         throw PAYEEIDENTIFIERBADCASTEXCEPTION;
0159     return ident;
0160 }
0161 
0162 Q_DECLARE_METATYPE(payeeIdentifier)
0163 
0164 #endif // PAYEEIDENTIFIER_H