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