From 9fbf448eeb267f6e4aee2a6ec7f9ed0cb1c4e9b4 Mon Sep 17 00:00:00 2001 From: Filip Bucek Date: Wed, 6 Nov 2019 08:57:42 +0100 Subject: [PATCH] updated documentation --- .vscode/c_cpp_properties.json | 19 ++++++++++ doc/Doxyfile-mcss | 9 +++-- doc/pages/mainpage.md | 2 ++ scripts/doc.sh | 10 +++--- src/core/core.cpp | 19 ++++++++++ src/core/core.h | 36 +++++++++++++++++++ src/core/core.pri | 2 ++ src/core/logger.cpp | 13 ++++--- src/core/logger.h | 65 +++++++++++++++++++++++++++++++---- src/core/requestmanager.cpp | 2 +- src/core/requestmanager.h | 5 +-- src/testapp/main.cpp | 8 +++-- 12 files changed, 160 insertions(+), 30 deletions(-) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 doc/pages/mainpage.md create mode 100644 src/core/core.cpp create mode 100644 src/core/core.h diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..9b6633e --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,19 @@ +{ + "configurations": [ + { + "name": "Mac", + "includePath": [ + "${workspaceFolder}/**", + "${HOME}/Qt/5.12.4/clang_64/lib/QtCore.framework/Headers/5.12.4", + "${HOME}/Qt/5.12.4/clang_64/lib/**" + ], + "defines": [], + "macFrameworkPath": [], + "compilerPath": "", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "clang-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/doc/Doxyfile-mcss b/doc/Doxyfile-mcss index b4b26ce..59eb540 100644 --- a/doc/Doxyfile-mcss +++ b/doc/Doxyfile-mcss @@ -6,9 +6,12 @@ GENERATE_LATEX = NO XML_PROGRAMLISTING = YES # Project settings -PROJECT_NAME = "core-sdk" -INPUT = "../src" -OUTPUT_DIRECTORY = ../../../build/doc/core-sdk +PROJECT_NAME = core-sdk +INPUT = ../src \ + pages +FILE_PATTERNS += *.md +USE_MDFILE_AS_MAINPAGE = pages/mainpage.md +OUTPUT_DIRECTORY = ../build/doc/ FULL_PATH_NAMES = NO # Attributes settings diff --git a/doc/pages/mainpage.md b/doc/pages/mainpage.md new file mode 100644 index 0000000..462079b --- /dev/null +++ b/doc/pages/mainpage.md @@ -0,0 +1,2 @@ +# Core SDK documentation + diff --git a/scripts/doc.sh b/scripts/doc.sh index 5a3baad..c7d6a6f 100755 --- a/scripts/doc.sh +++ b/scripts/doc.sh @@ -11,7 +11,8 @@ DIR_NAME="${CURRENT_DIR##*/}" FAIL=0 SOURCE_DIR=$CURRENT_DIR"/.." -BUILD_DIR=$SOURCE_DIR"/../../build" +BUILD_DIR=$SOURCE_DIR"/build" +DOC_DIR=$BUILD_DIR"/doc" main() { doc "$@" @@ -20,8 +21,7 @@ main() { function doc() { info "Generation documentation" mkdir -p $BUILD_DIR - cd $BUILD_DIR/.. - cd .. + cd $BUILD_DIR if [ ! -d "m.css" ] ; then info "Cloning m.css"; git clone git://github.com/mosra/m.css; fi @@ -31,11 +31,11 @@ function doc() { pip3 install jinja2 Pygments info "Generating doxygen" - if [ "$1" == "clean" ]; then rm -fr $BUILD_DIR/doc/$DIR_NAME; fi + if [ "$1" == "clean" ]; then rm -fr $DOC_DIR; fi ./doxygen.py --debug $SOURCE_DIR/doc/Doxyfile-mcss if [ "$1" == "open" ]; then - open $BUILD_DIR/doc/core-sdk/html/index.html + open $DOC_DIR/html/index.html fi } diff --git a/src/core/core.cpp b/src/core/core.cpp new file mode 100644 index 0000000..2147f82 --- /dev/null +++ b/src/core/core.cpp @@ -0,0 +1,19 @@ +#include "core.h" +#include "logger.h" + +namespace core { + +void installLogger(QtMsgType type, const QMessageLogContext &context, const QString &msg) { + core::Logger::outputMessage(type, context, msg); +} + +void initAppLogger() { + auto res = qInstallMessageHandler(core::Logger::outputMessage); + if (res) + qCInfo(sdkcore) << "user message handler qInstallMessageHandler installed sucessfully"; + else + qCWarning(sdkcore) << "failed to install message handler qInstallMessageHandler"; +} + + +} // namespace core diff --git a/src/core/core.h b/src/core/core.h new file mode 100644 index 0000000..d8bdc17 --- /dev/null +++ b/src/core/core.h @@ -0,0 +1,36 @@ +#pragma once + + +/** @page "Core SDK" +@m_class{m-block m-success} @par How to get the answer +@parblock + It's simple: + + @m_class{m-code-figure} @parblock + @code{.cpp} + // this is the code + printf("The answer to the universe and everything is %d.", 5*9); + @endcode + + @code{.shell-session} + The answer to the universe and everything is 42. + @endcode + @endparblock +@endparblock +*/ + + +// Qt +#include +// c++ +#include + +namespace core { + +/** internal application logger handler */ +void installLogger(QtMsgType type, const QMessageLogContext &context, const QString &msg); + +/** Install logger to application */ +void initAppLogger(); + +} diff --git a/src/core/core.pri b/src/core/core.pri index 3bba75e..ab2f3b6 100644 --- a/src/core/core.pri +++ b/src/core/core.pri @@ -3,6 +3,7 @@ CONFIG += c++14 #SRC_DIR = $$PWD message($$PWD) SOURCES += \ + $$PWD/core.cpp \ $$PWD/databasemanager.cpp \ $$PWD/logger.cpp \ $$PWD/loggermessage.cpp \ @@ -10,6 +11,7 @@ SOURCES += \ $$PWD/request.cpp \ HEADERS += \ + $$PWD/core.h \ $$PWD/databasemanager.h \ $$PWD/logger.h \ $$PWD/loggermessage.h \ diff --git a/src/core/logger.cpp b/src/core/logger.cpp index 7c8df44..e562103 100644 --- a/src/core/logger.cpp +++ b/src/core/logger.cpp @@ -1,7 +1,8 @@ #include "logger.h" #include "loggermessage.h" -#include +#include +#include Q_LOGGING_CATEGORY(sdkcore, "sdk.core"); Q_LOGGING_CATEGORY(sdknetwork, "sdk.network"); @@ -12,10 +13,7 @@ namespace core { Logger* Logger::sConsumer = nullptr; //bool Logger::sShowFunction = false; -/** - * @brief Used to have user specific consumer of logger messages - * @param consumer - inv::Logger - */ + void Logger::setConsumer(Logger *consumer) { sConsumer = consumer; @@ -73,7 +71,7 @@ void Logger::outputMessage(QtMsgType type, const QMessageLogContext &context, co } if (sConsumer) { LoggerMessage logmsg(shortFile,context.line,context.function,textType,context.category,msg, QLatin1String("")); - sConsumer->insertMessage(logmsg); // emiting message + sConsumer->pushMessage(logmsg); // emiting message } // Output message @@ -92,7 +90,8 @@ void Logger::outputMessage(QtMsgType type, const QMessageLogContext &context, co abort(); } -void Logger::insertMessage(const LoggerMessage& logmsg) +/** Passing data to consumer */ +void Logger::pushMessage(const LoggerMessage& logmsg) { emit sConsumer->messageReceived(logmsg); QMutexLocker locker(&sConsumer->mMutex); diff --git a/src/core/logger.h b/src/core/logger.h index bef4614..decb478 100644 --- a/src/core/logger.h +++ b/src/core/logger.h @@ -14,19 +14,70 @@ Q_DECLARE_LOGGING_CATEGORY(sdkcompress) namespace core { -/** @see http://stackoverflow.com/questions/8337300/c11-how-do-i-implement-convenient-logging-without-a-singleton */ +/** + * # Loggger + * + * Class for logging qDebug qWarning qInfo and qCritical messages + * + * + * ## Basic usage + * + * @code + * int main() { + * core::initAppLogger(); // <-- then Logger::outputMessage will handle all messages + * // Log messge Filtering + * QStringList filters; + * filters << "qt.*=false"; + * filters << "sdk.core.*=true"; + * QLoggingCategory::setFilterRules(filters.join(QStringLiteral("\n"))); + * } + * @endcode + * + * @see https://doc.qt.io/qt-5/qdebug.html + * @see https://doc.qt.io/qt-5/qloggingcategory.html + * + */ class Logger : public QObject { Q_OBJECT public: - // Static methods + // User defined consumer ( messages will be sent there using insertMessage ) static Logger* sConsumer; - static void setConsumer(Logger *consumer); - static void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg); -// static void message(const char *file, int line, const char *function, const QString &type, const QString &group, const QString &msg, const QString &detail = QString()); - // Public methods + + /// Default constructor explicit Logger(QObject *parent = nullptr); - void insertMessage(const LoggerMessage& logmsg); + + + /** + * @brief User specific consumer of logger messages + * @param consumer - sublass of core::Loger + * + * @code + * #include "core.h" + * int main() { + * core::initAppLogger(); + * core::Logger logger; + * core::Logger::setConsumer(&logger); + * } + * @endcode + * + */ + static void setConsumer(Logger *consumer); + + + /** Only Message handler for Qt + * + * @code + * #include "core.h" + * int main() { + * core::initAppLogger(); + * } + * @endcode + */ + static void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg); + + /** Pusing messges from installed message handler */ + virtual void pushMessage(const LoggerMessage& logmsg); QList getNewMessages(int currentCount); diff --git a/src/core/requestmanager.cpp b/src/core/requestmanager.cpp index 775b09a..0fde088 100644 --- a/src/core/requestmanager.cpp +++ b/src/core/requestmanager.cpp @@ -26,7 +26,7 @@ RequestManager::RequestManager(QObject *parent) * @brief Soap::downloadRequest * @param soapRequest */ -void RequestManager::downloadRequest(const std::shared_ptr& request) +void RequestManager::processRequest(const std::shared_ptr& request) { QNetworkReply *reply = mNetworkAccessManager.post(request->networkRequest(), request->requestData()); mRequestMap.insert(reply, request); diff --git a/src/core/requestmanager.h b/src/core/requestmanager.h index 0d0add3..ca90368 100644 --- a/src/core/requestmanager.h +++ b/src/core/requestmanager.h @@ -19,9 +19,8 @@ class RequestManager : public QObject public: explicit RequestManager(QObject *parent = nullptr); - void downloadRequest(const std::shared_ptr& request); + void processRequest(const std::shared_ptr& request); - // QByteArray data() const; private: Q_SLOT void sslErrors(const QList &sslErrors); @@ -34,8 +33,6 @@ signals: private: QNetworkAccessManager mNetworkAccessManager; - //QNetworkReply *mCurrentReply = nullptr; -// QByteArray mData; QMap> mRequestMap; }; diff --git a/src/testapp/main.cpp b/src/testapp/main.cpp index a94e5a0..a2af698 100644 --- a/src/testapp/main.cpp +++ b/src/testapp/main.cpp @@ -1,8 +1,13 @@ +#include "core.h" + #include #include + int main(int argc, char *argv[]) { + core::initAppLogger(); + QCoreApplication app(argc, argv); QCoreApplication::setApplicationName("colnod-connector"); QCoreApplication::setApplicationVersion("1.0"); @@ -14,7 +19,4 @@ int main(int argc, char *argv[]) QCommandLineOption dryModeOption("dryMode", "ColnodAPI", "Read-only mode, prints changes which would normally be made"); parser.addOption(dryModeOption); parser.process(app); - - // Synchronizaiton - return QCoreApplication::exec(); }