diff --git a/.gitignore b/.gitignore index 5291a38..fab7372 100644 --- a/.gitignore +++ b/.gitignore @@ -1,43 +1,73 @@ -# C++ objects and libs -*.slo -*.lo -*.o -*.a -*.la -*.lai -*.so -*.dll -*.dylib +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- -# Qt-es -object_script.*.Release -object_script.*.Debug -*_plugin_import.cpp +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc /.qmake.cache /.qmake.stash -*.pro.user -*.pro.user.* -*.qbs.user -*.qbs.user.* -*.moc -moc_*.cpp -moc_*.h -qrc_*.cpp -ui_*.h -*.qmlc -*.jsc -Makefile* -*build-* -# Qt unit tests -target_wrapper.* +# qtcreator generated files +*.pro.user* -# QtCreator -*.autosave +# xemacs temporary files +*.flc -# QtCreator Qml -*.qmlproject.user -*.qmlproject.user.* +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe -# QtCreator CMake -CMakeLists.txt.user* diff --git a/DbMsgLib.pro b/DbMsgLib.pro new file mode 100644 index 0000000..61fcf67 --- /dev/null +++ b/DbMsgLib.pro @@ -0,0 +1,8 @@ +TEMPLATE = subdirs + +SUBDIRS += messagingclient \ + messagingcorelib \ + messagingserver + +messagingclient.depends += messagingcorelib +messagingserver.depends += messagingcorelib diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..470a030 --- /dev/null +++ b/main.cpp @@ -0,0 +1,8 @@ +#include + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); + + return a.exec(); +} diff --git a/messagingclient/main.cpp b/messagingclient/main.cpp new file mode 100644 index 0000000..a2cdc1d --- /dev/null +++ b/messagingclient/main.cpp @@ -0,0 +1,24 @@ +#include +#include + +#include "mymessage.h" + +int main(int argc, char **argv) +{ + QCoreApplication app(argc, argv); + + MyMessage message("Daniel", QDate(1996, 11, 12), QDateTime::currentDateTime(), 21, 80); + message.debug(); + + qDebug() << "changing name..."; + + message.setName("Peter"); + message.debug(); + + qDebug() << "clearing touched..."; + + message.setTouched(false); + message.debug(); + + return app.exec(); +} diff --git a/messagingclient/messagingclient.pro b/messagingclient/messagingclient.pro new file mode 100644 index 0000000..67f339a --- /dev/null +++ b/messagingclient/messagingclient.pro @@ -0,0 +1,24 @@ +QT += core network + +TARGET = messagingclient +TEMPLATE = app + +CONFIG -= app_bundle + +PROJECT_ROOT = .. + +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin + +DBLIBS += core + +SOURCES += main.cpp + +HEADERS += + +FORMS += + +RESOURCES += + +TRANSLATIONS += + +include($${PROJECT_ROOT}/project.pri) diff --git a/messagingcorelib/messagingcorelib.pro b/messagingcorelib/messagingcorelib.pro new file mode 100644 index 0000000..50ff422 --- /dev/null +++ b/messagingcorelib/messagingcorelib.pro @@ -0,0 +1,23 @@ +QT += core network +QT -= gui widgets + +TARGET = messagingcorelib +TEMPLATE = lib + +PROJECT_ROOT = .. + +DEFINES += MESSAGINGCORELIB_LIBRARY + +SOURCES += \ + mymessage.cpp + +HEADERS += messagingcorelib_global.h \ + mymessage.h + +FORMS += + +RESOURCES += + +TRANSLATIONS += + +include($${PROJECT_ROOT}/project.pri) diff --git a/messagingcorelib/messagingcorelib_global.h b/messagingcorelib/messagingcorelib_global.h new file mode 100644 index 0000000..8f0421f --- /dev/null +++ b/messagingcorelib/messagingcorelib_global.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +#if defined(MESSAGINGCORELIB_LIBRARY) +# define MESSAGINGCORELIBSHARED_EXPORT Q_DECL_EXPORT +#else +# define MESSAGINGCORELIBSHARED_EXPORT Q_DECL_IMPORT +#endif diff --git a/messagingcorelib/mymessage.cpp b/messagingcorelib/mymessage.cpp new file mode 100644 index 0000000..e62be2f --- /dev/null +++ b/messagingcorelib/mymessage.cpp @@ -0,0 +1,9 @@ +#include "mymessage.h" + +const QMap MyMessage::m_fields { + { "name", &MyMessage::nameFieldBase }, + { "birthday", &MyMessage::birthdayFieldBase }, + { "sendTimestamp", &MyMessage::sendTimestampFieldBase }, + { "age", &MyMessage::ageFieldBase }, + { "weight", &MyMessage::weightFieldBase } +}; diff --git a/messagingcorelib/mymessage.h b/messagingcorelib/mymessage.h new file mode 100644 index 0000000..c3e393c --- /dev/null +++ b/messagingcorelib/mymessage.h @@ -0,0 +1,149 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include + +class DbMsgFieldBase +{ +public: + DbMsgFieldBase() : m_touched(false) {} + + bool touched() const { return m_touched; } + void setTouched(bool touched) { m_touched = touched; } + + virtual QVariant getVariant() const = 0; + +private: + bool m_touched; +}; + +template +class DbMsgField : public DbMsgFieldBase +{ +public: + DbMsgField() : DbMsgFieldBase(), m_hasValue(false) {} + DbMsgField(const T &value) : DbMsgFieldBase(), m_value(value), m_hasValue(true) {} + + T &getValue() { return m_value; } + const T &getValue() const { return m_value; } + void setValue(const T &value) { m_hasValue = true; m_value = value; setTouched(true); } + + bool hasValue() const { return m_hasValue; } + + QVariant getVariant() const { return getValue(); } + +private: + T m_value; + bool m_hasValue; +}; + +class DbMsgBase +{ +public: + DbMsgBase() {} + + bool touched() const + { + const auto fields = getFields(); + return std::any_of(fields.cbegin(), fields.cend(), [](const DbMsgFieldBase *field) { return field->touched(); }); + } + + void setTouched(bool touched) + { + for(DbMsgFieldBase *field : getFields()) + field->setTouched(touched); + } + + void debug() const + { + const auto fields = getFields(); + for(auto iter = fields.cbegin(); iter != fields.cend(); iter++) + qDebug() << iter.key() << iter.value()->getVariant() << iter.value()->touched(); + } + +protected: + virtual QMap getFields() = 0; + virtual QMap getFields() const = 0; +}; + +class MyMessage : public DbMsgBase +{ +public: + MyMessage() : DbMsgBase() {} + + MyMessage(const QString &name, const QDate &birthday, const QDateTime &sendTimestamp, int age, double weight) : + DbMsgBase(), + m_name(name), m_birthday(birthday), m_sendTimestamp(sendTimestamp), m_age(age), m_weight(weight) + {} + + QString getName() const { return m_name.getValue(); } + void setName(const QString &name) { m_name.setValue(name); } + DbMsgField &nameField() { return m_name; } + const DbMsgField &nameField() const { return m_name; } + DbMsgFieldBase &nameFieldBase() { return m_name; } + const DbMsgFieldBase &nameFieldBase() const { return m_name; } + + QDate getBirthday() const { return m_birthday.getValue(); } + void setBirthday(const QDate &birthday) { m_birthday.setValue(birthday); } + DbMsgField &birthdayField() { return m_birthday; } + const DbMsgField &birthdayField() const { return m_birthday; } + DbMsgFieldBase &birthdayFieldBase() { return m_birthday; } + const DbMsgFieldBase &birthdayFieldBase() const { return m_birthday; } + + QDateTime getSendTimestamp() const { return m_sendTimestamp.getValue(); } + void setSendTimestamp(const QDateTime &sendTimestamp) { m_sendTimestamp.setValue(sendTimestamp); } + DbMsgField &sendTimestampField() { return m_sendTimestamp; } + const DbMsgField &sendTimestampField() const { return m_sendTimestamp; } + DbMsgFieldBase &sendTimestampFieldBase() { return m_sendTimestamp; } + const DbMsgFieldBase &sendTimestampFieldBase() const { return m_sendTimestamp; } + + int getAge() const { return m_age.getValue(); } + void setAge(const int &age) { m_age.setValue(age); } + DbMsgField &ageField() { return m_age; } + const DbMsgField &ageField() const { return m_age; } + DbMsgFieldBase &ageFieldBase() { return m_age; } + const DbMsgFieldBase &ageFieldBase() const { return m_age; } + + double getWeight() const { return m_weight.getValue(); } + void setWeight(const double &weight) { m_weight.setValue(weight); } + DbMsgField &weightField() { return m_weight; } + const DbMsgField &weightField() const { return m_weight; } + DbMsgFieldBase &weightFieldBase() { return m_weight; } + const DbMsgFieldBase &weightFieldBase() const { return m_weight; } + +protected: + QMap getFields() override + { + QMap fields; + + for(auto iter = m_fields.cbegin(); iter != m_fields.cend(); iter++) + fields.insert(iter.key(), &(this->*iter.value())()); + + return fields; + } + + QMap getFields() const override + { + QMap fields; + + for(auto iter = m_fields.cbegin(); iter != m_fields.cend(); iter++) + fields.insert(iter.key(), &(const_cast(this)->*iter.value())()); + + return fields; + } + +private: + typedef DbMsgFieldBase &(MyMessage::*FieldGetterMethod)(); + static const QMap m_fields; + + DbMsgField m_name; + DbMsgField m_birthday; + DbMsgField m_sendTimestamp; + DbMsgField m_age; + DbMsgField m_weight; +}; diff --git a/messagingserver/main.cpp b/messagingserver/main.cpp new file mode 100644 index 0000000..1a46e00 --- /dev/null +++ b/messagingserver/main.cpp @@ -0,0 +1,11 @@ +#include +#include + +int main(int argc, char **argv) +{ + QCoreApplication app(argc, argv); + + qDebug() << "hello from server"; + + return 0; +} diff --git a/messagingserver/messagingserver.pro b/messagingserver/messagingserver.pro new file mode 100644 index 0000000..5cc5584 --- /dev/null +++ b/messagingserver/messagingserver.pro @@ -0,0 +1,24 @@ +QT += core network + +TARGET = messagingserver +TEMPLATE = app + +CONFIG -= app_bundle + +PROJECT_ROOT = .. + +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin + +DBLIBS += core + +SOURCES += main.cpp + +HEADERS += + +FORMS += + +RESOURCES += + +TRANSLATIONS += + +include($${PROJECT_ROOT}/project.pri) diff --git a/project.pri b/project.pri new file mode 100644 index 0000000..aa366cf --- /dev/null +++ b/project.pri @@ -0,0 +1,34 @@ +CONFIG += c++14 + +DEFINES += QT_DEPRECATED_WARNINGS \ + QT_DISABLE_DEPRECATED_BEFORE=0x060000 \ + QT_MESSAGELOGCONTEXT + +equals(TEMPLATE, "lib") { + win32: DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin + else: DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/lib +} + +!isEmpty(DBLIBS) { + win32: LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin + else: LIBS += -Wl,-rpath=\\\$$ORIGIN/../lib -L$${OUT_PWD}/$${PROJECT_ROOT}/lib +} + +contains(DBLIBS, core) { + LIBS += -lmessagingcorelib + + INCLUDEPATH += $$PWD/messagingcorelib + DEPENDPATH += $$PWD/messagingcorelib +} + +isEmpty(QMAKE_LRELEASE) { + win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe + else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease +} + +lrelease.input = TRANSLATIONS +lrelease.output = $${OUT_PWD}/$${PROJECT_ROOT}/bin/translations/${QMAKE_FILE_BASE}.qm +lrelease.commands = $${QMAKE_LRELEASE} ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT} +lrelease.CONFIG += no_link +QMAKE_EXTRA_COMPILERS += lrelease +PRE_TARGETDEPS += compiler_lrelease_make_all