Commit fe885bcf2ae4578d2a4cf97e108dbfcbaea45ccb
0 parents
Initial commit.
Showing
22 changed files
with
1758 additions
and
0 deletions
.gitignore
0 → 100644
CMakeLists.txt
0 → 100644
| 1 | +++ a/CMakeLists.txt | ||
| 1 | +cmake_minimum_required(VERSION 3.0) | ||
| 2 | + | ||
| 3 | +# Check to see where cmake is located. | ||
| 4 | +if( IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cmake ) | ||
| 5 | + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) | ||
| 6 | +elseif( IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../cmake ) | ||
| 7 | + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) | ||
| 8 | +else() | ||
| 9 | + return() | ||
| 10 | +endif() | ||
| 11 | + | ||
| 12 | +# Check to see if there is versioning information available | ||
| 13 | +if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/osdev_versioning/cmake) | ||
| 14 | + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/osdev_versioning/cmake) | ||
| 15 | + include(osdevversion) | ||
| 16 | +endif() | ||
| 17 | + | ||
| 18 | +include(projectheader) | ||
| 19 | +project_header(osdev_global) | ||
| 20 | + | ||
| 21 | +add_subdirectory(src) | ||
| 22 | +add_subdirectory(tests) | ||
| 23 | + | ||
| 24 | +# include(packaging) | ||
| 25 | +# package_component() |
README.md
0 → 100644
| 1 | +++ a/README.md |
src/CMakeLists.txt
0 → 100644
| 1 | +++ a/src/CMakeLists.txt | ||
| 1 | +cmake_minimum_required(VERSION 3.0) | ||
| 2 | +LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../cmake) | ||
| 3 | +include(projectheader) | ||
| 4 | +project_header(global) | ||
| 5 | + | ||
| 6 | +find_package( Qt5Core REQUIRED ) | ||
| 7 | + | ||
| 8 | +include_directories( SYSTEM | ||
| 9 | + ${Qt5Core_INCLUDE_DIRS} | ||
| 10 | + ${Qt5Core_PRIVATE_INCLUDE_DIRS} | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +include(compiler) | ||
| 14 | + | ||
| 15 | +include_directories( | ||
| 16 | + ${CMAKE_CURRENT_SOURCE_DIR}/../pugixml | ||
| 17 | + ${CMAKE_CURRENT_SOURCE_DIR}/../config | ||
| 18 | + ${CMAKE_CURRENT_SOURCE_DIR}/../logutils | ||
| 19 | + ${CMAKE_CURRENT_SOURCE_DIR}/../interfaces | ||
| 20 | +) | ||
| 21 | + | ||
| 22 | +set(SRC_LIST | ||
| 23 | + ${CMAKE_CURRENT_SOURCE_DIR}/argumentparserbase.cpp | ||
| 24 | + ${CMAKE_CURRENT_SOURCE_DIR}/systeminfo.cpp | ||
| 25 | + ${CMAKE_CURRENT_SOURCE_DIR}/plugin.cpp | ||
| 26 | + ${CMAKE_CURRENT_SOURCE_DIR}/pluginmanager.cpp | ||
| 27 | + ${CMAKE_CURRENT_SOURCE_DIR}/conversionutils.cpp | ||
| 28 | + ${CMAKE_CURRENT_SOURCE_DIR}/timeutils.cpp | ||
| 29 | + ${CMAKE_CURRENT_SOURCE_DIR}/threadmon.cpp | ||
| 30 | +) | ||
| 31 | + | ||
| 32 | +include(qtmoc) | ||
| 33 | +create_mocs( SRC_LIST MOC_LIST | ||
| 34 | + ${CMAKE_CURRENT_SOURCE_DIR}/pluginmanager.h | ||
| 35 | +) | ||
| 36 | + | ||
| 37 | +link_directories( | ||
| 38 | + ${CMAKE_BINARY_DIR}/lib | ||
| 39 | +) | ||
| 40 | + | ||
| 41 | +include(library) | ||
| 42 | +add_libraries( | ||
| 43 | + ${Qt5Core_LIBRARIES} | ||
| 44 | + logutils | ||
| 45 | + config | ||
| 46 | + interfaces | ||
| 47 | + pugixml | ||
| 48 | +) | ||
| 49 | + | ||
| 50 | +include(installation) | ||
| 51 | +install_component() |
src/argumentparserbase.cpp
0 → 100644
| 1 | +++ a/src/argumentparserbase.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +// osdev::caelus | ||
| 23 | +#include "argumentparserbase.h" | ||
| 24 | + | ||
| 25 | +using namespace osdev::components; | ||
| 26 | + | ||
| 27 | +ArgumentParserBase::ArgumentParserBase( const QStringList& arguments ) | ||
| 28 | + : m_argument_list( arguments ) | ||
| 29 | +{ | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +ArgumentParserBase::~ArgumentParserBase() = default; | ||
| 33 | + | ||
| 34 | +void ArgumentParserBase::setArgumentList( const QStringList &arg_list ) | ||
| 35 | +{ | ||
| 36 | + m_argument_list = arg_list; | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +QString ArgumentParserBase::getArgumentValue( const QString &argument_switch ) const | ||
| 40 | +{ | ||
| 41 | + QString l_result = QString(); | ||
| 42 | + | ||
| 43 | + if( 1 == m_argument_list.count( argument_switch ) ) | ||
| 44 | + { | ||
| 45 | + l_result = m_argument_list.at( m_argument_list.indexOf( argument_switch ) + 1 ); | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + return l_result; | ||
| 49 | +} |
src/argumentparserbase.h
0 → 100644
| 1 | +++ a/src/argumentparserbase.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_ARGUMENTPARSERBASE_H | ||
| 23 | +#define OSDEV_COMPONENTS_ARGUMENTPARSERBASE_H | ||
| 24 | + | ||
| 25 | +#include <QString> | ||
| 26 | +#include <QStringList> | ||
| 27 | + | ||
| 28 | +namespace osdev { | ||
| 29 | +namespace components { | ||
| 30 | + | ||
| 31 | +class ArgumentParserBase | ||
| 32 | +{ | ||
| 33 | +public: | ||
| 34 | + ArgumentParserBase(const QStringList& arguments = QStringList()); | ||
| 35 | + virtual ~ArgumentParserBase(); | ||
| 36 | + | ||
| 37 | + void setArgumentList(const QStringList& arg_list); | ||
| 38 | + QString getArgumentValue(const QString& argument_switch) const; | ||
| 39 | + | ||
| 40 | +private: | ||
| 41 | + QStringList m_argument_list; | ||
| 42 | +}; | ||
| 43 | + | ||
| 44 | +} /* End namespace components */ | ||
| 45 | +} /* End namespace osdev */ | ||
| 46 | + | ||
| 47 | +#endif /* OSDEV_COMPONENTS_ARGUMENTPARSERBASE_H */ |
src/compat-c++14.h
0 → 100644
| 1 | +++ a/src/compat-c++14.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_COMPATCXX14 | ||
| 23 | +#define OSDEV_COMPONENTS_COMPATCXX14 | ||
| 24 | + | ||
| 25 | +#include <memory> | ||
| 26 | + | ||
| 27 | +// The code below must be skipped if we use a C++ 14 or newer compiler | ||
| 28 | +#if __cplusplus == 201103L | ||
| 29 | + | ||
| 30 | +namespace std | ||
| 31 | +{ | ||
| 32 | + | ||
| 33 | +/// Copied from libstdc++ 4.9.2 bits/unique_ptr.h | ||
| 34 | +template<typename _Tp> | ||
| 35 | +struct _MakeUniq | ||
| 36 | +{ | ||
| 37 | + typedef unique_ptr<_Tp> __single_object; | ||
| 38 | +}; | ||
| 39 | + | ||
| 40 | +template<typename _Tp> | ||
| 41 | +struct _MakeUniq<_Tp[]> | ||
| 42 | +{ | ||
| 43 | + typedef unique_ptr<_Tp> __array; | ||
| 44 | +}; | ||
| 45 | + | ||
| 46 | +template<typename _Tp, size_t _Bound> | ||
| 47 | +struct _MakeUniq<_Tp[_Bound]> | ||
| 48 | +{ | ||
| 49 | + struct __invalid_type { }; | ||
| 50 | +}; | ||
| 51 | + | ||
| 52 | +/// std::make_unique for single objects | ||
| 53 | +template<typename _Tp, typename... _Args> | ||
| 54 | +inline typename _MakeUniq<_Tp>::__single_object make_unique(_Args&&... __args) | ||
| 55 | +{ | ||
| 56 | + return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); | ||
| 57 | +} | ||
| 58 | + | ||
| 59 | +/// std::make_unique for arrays of unknown bound | ||
| 60 | +template<typename _Tp> | ||
| 61 | +inline typename _MakeUniq<_Tp>::__array make_unique(size_t __num) | ||
| 62 | +{ | ||
| 63 | + return unique_ptr<_Tp>(new typename remove_extent<_Tp>::type[__num]()); | ||
| 64 | +} | ||
| 65 | + | ||
| 66 | +/// Disable std::make_unique for arrays of known bound | ||
| 67 | +template<typename _Tp, typename... _Args> | ||
| 68 | +inline typename _MakeUniq<_Tp>::__invalid_type make_unique(_Args&&...) = delete; | ||
| 69 | + | ||
| 70 | +} /* End namespace std */ | ||
| 71 | + | ||
| 72 | +#endif /* End check for c++ 14 */ | ||
| 73 | + | ||
| 74 | +#endif /* OSDEV_COMPONENTS_COMPATCXX14 */ |
src/conversionutils.cpp
0 → 100644
| 1 | +++ a/src/conversionutils.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#include "conversionutils.h" | ||
| 23 | + | ||
| 24 | +using namespace osdev::components; | ||
| 25 | + | ||
| 26 | +namespace | ||
| 27 | +{ | ||
| 28 | + | ||
| 29 | +QHash<QString, QVariant::Type> gQHTypes( | ||
| 30 | + { | ||
| 31 | + { "UNKNOWN", QVariant::Invalid }, | ||
| 32 | + { "BITARRAY", QVariant::BitArray }, | ||
| 33 | + { "BITMAP", QVariant::Bitmap }, | ||
| 34 | + { "BOOL", QVariant::Bool }, | ||
| 35 | + { "BRUSH", QVariant::Brush }, | ||
| 36 | + { "BYTEARRAY", QVariant::ByteArray }, | ||
| 37 | + { "CHAR", QVariant::Char }, | ||
| 38 | + { "COLOR", QVariant::Color }, | ||
| 39 | + { "CURSOR", QVariant::Cursor }, | ||
| 40 | + { "DATE", QVariant::Date }, | ||
| 41 | + { "DATETIME", QVariant::DateTime }, | ||
| 42 | + { "DOUBLE", QVariant::Double }, | ||
| 43 | + { "EASINGCURVE", QVariant::EasingCurve }, | ||
| 44 | + { "UUID", QVariant::Uuid }, | ||
| 45 | + { "MODELINDEX", QVariant::ModelIndex }, | ||
| 46 | + { "FONT", QVariant::Font }, | ||
| 47 | + { "HASH", QVariant::Hash }, | ||
| 48 | + { "ICON", QVariant::Icon }, | ||
| 49 | + { "IMAGE", QVariant::Image }, | ||
| 50 | + { "INT", QVariant::Int }, | ||
| 51 | + { "SMALLINT", QVariant::Int }, | ||
| 52 | + { "KEYSEQUENCE", QVariant::KeySequence }, | ||
| 53 | + { "LINE", QVariant::Line }, | ||
| 54 | + { "LINEF", QVariant::LineF }, | ||
| 55 | + { "LIST", QVariant::List }, | ||
| 56 | + { "LOCALE", QVariant::Locale }, | ||
| 57 | + { "LONGLONG", QVariant::LongLong }, | ||
| 58 | + { "MAP", QVariant::Map }, | ||
| 59 | + { "MATRIX", QVariant::Matrix }, | ||
| 60 | + { "TRANSFORM", QVariant::Transform }, | ||
| 61 | + { "MATRIX4X4", QVariant::Matrix4x4 }, | ||
| 62 | + { "PALETTE", QVariant::Palette }, | ||
| 63 | + { "PEN", QVariant::Pen }, | ||
| 64 | + { "PIXMAP", QVariant::Pixmap }, | ||
| 65 | + { "POINT", QVariant::Point }, | ||
| 66 | + { "POINTF", QVariant::PointF }, | ||
| 67 | + { "POLYGON", QVariant::Polygon }, | ||
| 68 | + { "POLYGONF", QVariant::PolygonF }, | ||
| 69 | + { "QUATERNION", QVariant::Quaternion }, | ||
| 70 | + { "RECT", QVariant::Rect }, | ||
| 71 | + { "RECTF", QVariant::RectF }, | ||
| 72 | + { "REGEXP", QVariant::RegExp }, | ||
| 73 | + { "REGULAREXPRESSION", QVariant::RegularExpression }, | ||
| 74 | + { "REGION", QVariant::Region }, | ||
| 75 | + { "SIZE", QVariant::Size }, | ||
| 76 | + { "SIZEF", QVariant::SizeF }, | ||
| 77 | + { "SIZEPOLICY", QVariant::SizePolicy }, | ||
| 78 | + { "STRING", QVariant::String }, | ||
| 79 | + { "STRINGLIST", QVariant::StringList }, | ||
| 80 | + { "TEXTFORMAT", QVariant::TextFormat }, | ||
| 81 | + { "TEXTLENGTH", QVariant::TextLength }, | ||
| 82 | + { "TIME", QVariant::Time }, | ||
| 83 | + { "UINT", QVariant::UInt }, | ||
| 84 | + { "ULONGLONG", QVariant::ULongLong }, | ||
| 85 | + { "URL", QVariant::Url }, | ||
| 86 | + { "VECTOR2D", QVariant::Vector2D }, | ||
| 87 | + { "VECTOR3D", QVariant::Vector3D }, | ||
| 88 | + { "VECTOR4D", QVariant::Vector4D }, | ||
| 89 | + { "USERTYPE", QVariant::UserType }, | ||
| 90 | + | ||
| 91 | + // PostGreSQL Datatypes, also aliases for historical purposes | ||
| 92 | + | ||
| 93 | + { "BIGINT", QVariant::Int }, | ||
| 94 | + { "INT8", QVariant::Int }, | ||
| 95 | + { "BIGSERIAL", QVariant::Int }, | ||
| 96 | + { "SERIAL8", QVariant::Int }, | ||
| 97 | + { "BIT", QVariant::String }, | ||
| 98 | + { "BIT VARYING", QVariant::String }, | ||
| 99 | + { "VARBIT", QVariant::String }, | ||
| 100 | + { "BOOLEAN", QVariant::Bool }, | ||
| 101 | + { "BYTEA", QVariant::String }, | ||
| 102 | + { "CHARACTER", QVariant::String }, | ||
| 103 | + { "CHAR", QVariant::String }, | ||
| 104 | + { "CHARACTER VARYING", QVariant::String }, | ||
| 105 | + { "CIDR", QVariant::String }, | ||
| 106 | + { "DATE", QVariant::Date }, | ||
| 107 | + { "DOUBLE PRECISION", QVariant::Double }, | ||
| 108 | + { "FLOAT8", QVariant::Double }, | ||
| 109 | + { "INET", QVariant::String }, | ||
| 110 | + { "INTEGER", QVariant::Int }, | ||
| 111 | + { "INT4", QVariant::Int }, | ||
| 112 | + { "JSON", QVariant::String }, | ||
| 113 | + { "MACADDR", QVariant::String }, | ||
| 114 | + { "REAL", QVariant::Double }, | ||
| 115 | + { "FLOAT4", QVariant::Double }, | ||
| 116 | + { "INT2", QVariant::Int }, | ||
| 117 | + { "SMALLSERIAL", QVariant::Int }, | ||
| 118 | + { "SERIAL2", QVariant::Int }, | ||
| 119 | + { "SERIAL", QVariant::Int }, | ||
| 120 | + { "SERIAL4", QVariant::Int }, | ||
| 121 | + { "TEXT", QVariant::String }, | ||
| 122 | + { "TIME", QVariant::Time }, | ||
| 123 | + { "TIMESTAMP", QVariant::DateTime }, | ||
| 124 | + { "TIMESTAMP WITH TIME ZONE", QVariant::DateTime }, | ||
| 125 | + { "TIMESTAMPTZ", QVariant::DateTime }, | ||
| 126 | + { "TSQUERY", QVariant::String }, | ||
| 127 | + { "UUID", QVariant::Uuid }, | ||
| 128 | + { "XML", QVariant::String } | ||
| 129 | + }); | ||
| 130 | + | ||
| 131 | +} // anonymous | ||
| 132 | + | ||
| 133 | +// static | ||
| 134 | +QVariant::Type ConversionUtils::stringToQvarType( const QString& sValueType ) | ||
| 135 | +{ | ||
| 136 | + return gQHTypes.value( sValueType.toUpper() ); | ||
| 137 | +} | ||
| 138 | + | ||
| 139 | +// static | ||
| 140 | +QStringList ConversionUtils::getTypes() | ||
| 141 | +{ | ||
| 142 | + return QStringList( gQHTypes.keys() ); | ||
| 143 | +} | ||
| 144 | + | ||
| 145 | +// static | ||
| 146 | +QVariant ConversionUtils::convertToType( const QVariant &varValue, QVariant::Type varType ) | ||
| 147 | +{ | ||
| 148 | + QVariant varResult = varValue; | ||
| 149 | + | ||
| 150 | + if( varValue.type() == QVariant::Bool && varType == QVariant::String ) | ||
| 151 | + { | ||
| 152 | + if( varValue.toBool() ) | ||
| 153 | + { | ||
| 154 | + varResult = QVariant( QString( "1" ) ); | ||
| 155 | + } | ||
| 156 | + else | ||
| 157 | + { | ||
| 158 | + varResult = QVariant( QString( "0" ) ); | ||
| 159 | + } | ||
| 160 | + } | ||
| 161 | + else if( varValue.type() == QVariant::Bool && varType == QVariant::Int ) | ||
| 162 | + { | ||
| 163 | + if( varValue.toBool() ) | ||
| 164 | + { | ||
| 165 | + varResult = QVariant( 1 ); | ||
| 166 | + } | ||
| 167 | + else | ||
| 168 | + { | ||
| 169 | + varResult = QVariant( 0 ); | ||
| 170 | + } | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + return varResult; | ||
| 174 | +} | ||
| 175 | + | ||
| 176 | +// static | ||
| 177 | +QVariant ConversionUtils::convertToType(const QVariant &varValue, const QString &varType ) | ||
| 178 | +{ | ||
| 179 | + return convertToType( varValue, stringToQvarType( varType ) ); | ||
| 180 | +} |
src/conversionutils.h
0 → 100644
| 1 | +++ a/src/conversionutils.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_CONVERSIONUTILS_H | ||
| 23 | +#define OSDEV_COMPONENTS_CONVERSIONUTILS_H | ||
| 24 | + | ||
| 25 | +#include <QVariant> | ||
| 26 | +#include <QString> | ||
| 27 | +#include <QMetaType> | ||
| 28 | +#include <QHash> | ||
| 29 | + | ||
| 30 | +namespace osdev { | ||
| 31 | +namespace components { | ||
| 32 | + | ||
| 33 | +/*! | ||
| 34 | + * \brief The ConversionUtils class converts an string expression to a QVariant Type. | ||
| 35 | + * The modelmapper is build from a configurationfile and fieldtypes are given in strings | ||
| 36 | + * By mapping those string expressions to the corresponding QVariant Type, we ensure the | ||
| 37 | + * data is handled correctly. | ||
| 38 | + * | ||
| 39 | + * The number of types is *everything* mentioned in to Qt-documentation although | ||
| 40 | + * it is doubtful we'll ever use everything. | ||
| 41 | + * | ||
| 42 | + * Instead of using the nameToType method of QVariant, we did our own translation table, | ||
| 43 | + * making it possible to use Database types or any type whatsoever. | ||
| 44 | + */ | ||
| 45 | + | ||
| 46 | +class ConversionUtils | ||
| 47 | +{ | ||
| 48 | +public: | ||
| 49 | + ConversionUtils() = delete; | ||
| 50 | + | ||
| 51 | + static QVariant::Type stringToQvarType( const QString& sValueType ); | ||
| 52 | + static QStringList getTypes(); | ||
| 53 | + | ||
| 54 | + static QVariant convertToType( const QVariant &varValue, QVariant::Type varType ); | ||
| 55 | + static QVariant convertToType( const QVariant &varValue, const QString& varType ); | ||
| 56 | +}; | ||
| 57 | + | ||
| 58 | +} /* End namespace components */ | ||
| 59 | +} /* End namespace osdev */ | ||
| 60 | + | ||
| 61 | +#endif /* OSDEV_COMPONENTS_CONVERSIONUTILS_H */ |
src/globallibexport.h
0 → 100644
| 1 | +++ a/src/globallibexport.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_GLOBAL_LIBEXPORT_H | ||
| 23 | +#define OSDEV_COMPONENTS_GLOBAL_LIBEXPORT_H | ||
| 24 | + | ||
| 25 | +#ifdef WIN32 | ||
| 26 | + | ||
| 27 | +#ifdef GLOBALLIB | ||
| 28 | +#define GLOBALLIBINTERFACE __declspec(dllexport) | ||
| 29 | +#else | ||
| 30 | +#define GLOBALLIBINTERFACE __declspec(dllimport) | ||
| 31 | +#endif | ||
| 32 | + | ||
| 33 | +#else | ||
| 34 | +#define GLOBALLIBINTERFACE | ||
| 35 | +#endif | ||
| 36 | + | ||
| 37 | + | ||
| 38 | +#endif // OSDEV_COMPONENTS_GLOBAL_LIBEXPORT_H |
src/lockguard.h
0 → 100644
| 1 | +++ a/src/lockguard.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef MLOGIC_COMMON_LOCKGUARD_H | ||
| 23 | +#define MLOGIC_COMMON_LOCKGUARD_H | ||
| 24 | + | ||
| 25 | +// std | ||
| 26 | +#include <mutex> | ||
| 27 | + | ||
| 28 | +// mlogic::common | ||
| 29 | +#include "mlogic/common/utils.h" | ||
| 30 | + | ||
| 31 | +#define MLOGIC_COMMON_LOCKGUARD(mutexVariableName) \ | ||
| 32 | + std::lock_guard<std::mutex> Lock__Guard__##mutexVariableName##__(mutexVariableName); \ | ||
| 33 | + mlogic::common::apply_unused_parameters(Lock__Guard__##mutexVariableName##__); | ||
| 34 | + | ||
| 35 | +#define MLOGIC_COMMON_RECURSIVELOCKGUARD(mutexVariableName) \ | ||
| 36 | + std::lock_guard<std::recursive_mutex> Lock__Guard__##mutexVariableName##__(mutexVariableName); \ | ||
| 37 | + mlogic::common::apply_unused_parameters(Lock__Guard__##mutexVariableName##__); | ||
| 38 | + | ||
| 39 | +#endif // MLOGIC_COMMON_LOCKGUARD_H | ||
| 40 | + |
src/plugin.cpp
0 → 100644
| 1 | +++ a/src/plugin.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#include "plugin.h" | ||
| 23 | + | ||
| 24 | +namespace osdev { | ||
| 25 | +namespace components { | ||
| 26 | + | ||
| 27 | +Plugin::Plugin( const QString& pluginName, const QString& pluginFile, const QString& pluginPath, | ||
| 28 | + const QString& pluginConfig, const QUuid& pluginUuid, | ||
| 29 | + QObject* ptr_plugin ) | ||
| 30 | + : m_pluginName( pluginName ) | ||
| 31 | + , m_pluginFile( pluginFile ) | ||
| 32 | + , m_pluginPath( pluginPath ) | ||
| 33 | + , m_pluginConfigurationFile( pluginConfig ) | ||
| 34 | + , m_pluginUuid( pluginUuid ) | ||
| 35 | + , m_plugin( ptr_plugin ) | ||
| 36 | +{ | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +Plugin::Plugin( const Plugin& other ) | ||
| 40 | + : Plugin(other.name(), other.fileName(), other.path(), other.config(), other.uuid(), other.plugin()) | ||
| 41 | +{ | ||
| 42 | +} | ||
| 43 | + | ||
| 44 | +Plugin& Plugin::operator=( const Plugin& other ) | ||
| 45 | +{ | ||
| 46 | + if(this != &other) { | ||
| 47 | + m_pluginName = other.name(); | ||
| 48 | + m_pluginFile = other.fileName(); | ||
| 49 | + m_pluginPath = other.path(); | ||
| 50 | + m_pluginConfigurationFile = other.config(); | ||
| 51 | + m_pluginUuid = other.uuid(); | ||
| 52 | + m_plugin = other.plugin(); | ||
| 53 | + } | ||
| 54 | + return *this; | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +QString Plugin::asString() | ||
| 58 | +{ | ||
| 59 | + QString PluginData = QString( "[PluginName = %1] [PluginFile = %2] [PluginPath = %3] [PluginConfigFile = %4] [PluginUUId = %5]" ) | ||
| 60 | + .arg( m_pluginName ).arg( m_pluginFile ).arg( m_pluginPath ).arg( m_pluginConfigurationFile ).arg( m_pluginUuid.toString() ); | ||
| 61 | + | ||
| 62 | + return PluginData; | ||
| 63 | +} | ||
| 64 | + | ||
| 65 | +} // End namespace components | ||
| 66 | +} // End namespace osdev | ||
| 67 | + |
src/plugin.h
0 → 100644
| 1 | +++ a/src/plugin.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_PLUGIN_H | ||
| 23 | +#define OSDEV_COMPONENTS_PLUGIN_H | ||
| 24 | + | ||
| 25 | +#include <QString> | ||
| 26 | +#include <QUuid> | ||
| 27 | + | ||
| 28 | +class QObject; | ||
| 29 | + | ||
| 30 | +namespace osdev { | ||
| 31 | +namespace components { | ||
| 32 | + | ||
| 33 | +/*! | ||
| 34 | + * \brief The Plugin class is a structure representing a single plugin. | ||
| 35 | + * It is used internally by the Pluginmanager and holds all information | ||
| 36 | + * needed. | ||
| 37 | + *//* | ||
| 38 | + * _______________________________________ | ||
| 39 | + * / Heuristics are bug ridden by \ | ||
| 40 | + * | definition. If they didn't have bugs, | | ||
| 41 | + * \ then they'd be algorithms. / | ||
| 42 | + * --------------------------------------- | ||
| 43 | + * \ | ||
| 44 | + * \ | ||
| 45 | + * .--. | ||
| 46 | + * |o_o | | ||
| 47 | + * |:_/ | | ||
| 48 | + * // \ \ | ||
| 49 | + * (| | ) | ||
| 50 | + * /'\_ _/`\ | ||
| 51 | + * \___)=(___/ | ||
| 52 | + * | ||
| 53 | + */ | ||
| 54 | + | ||
| 55 | +class Plugin | ||
| 56 | +{ | ||
| 57 | +public: | ||
| 58 | + //! | ||
| 59 | + /** | ||
| 60 | + * @brief Constructor | ||
| 61 | + * @param pluginName Name of the plugin | ||
| 62 | + * @param pluginPath Path to the plugin | ||
| 63 | + * @param pluginConfig Configuration file for the plugin | ||
| 64 | + * @param pluginUuid UUID for the plugin | ||
| 65 | + * @param ptr_plugin Plugin instance | ||
| 66 | + */ | ||
| 67 | + Plugin(const QString& pluginName = QString(), | ||
| 68 | + const QString& pluginFile = QString(), | ||
| 69 | + const QString& pluginPath = QString(), | ||
| 70 | + const QString& pluginConfig = QString(), | ||
| 71 | + const QUuid& pluginUuid = QUuid(), | ||
| 72 | + QObject* ptr_plugin = nullptr ); | ||
| 73 | + | ||
| 74 | + /** | ||
| 75 | + * @brief Copy-constructor | ||
| 76 | + * @param other Plugin to copy from | ||
| 77 | + */ | ||
| 78 | + Plugin(const Plugin& other); | ||
| 79 | + | ||
| 80 | + /** | ||
| 81 | + * @brief Assignment operator | ||
| 82 | + * @param other Plugin to copy from | ||
| 83 | + * @return Reference to this | ||
| 84 | + */ | ||
| 85 | + Plugin& operator=(const Plugin& other); | ||
| 86 | + | ||
| 87 | + /*** Getters and Setters ***/ | ||
| 88 | + //! @returns Name of the plugin ( like : libplugin_myplugin ). | ||
| 89 | + QString name() const { return m_pluginName; } | ||
| 90 | + | ||
| 91 | + //! @returns Path to the plugin. | ||
| 92 | + QString path() const { return m_pluginPath; } | ||
| 93 | + | ||
| 94 | + //! @returns the filename of the plugin. | ||
| 95 | + QString fileName() const { return m_pluginFile; } | ||
| 96 | + | ||
| 97 | + //! @returns Full pathname to the plugin specific configurationfile. | ||
| 98 | + QString config() const { return m_pluginConfigurationFile; } | ||
| 99 | + | ||
| 100 | + //! @returns Unique Identifier of the plugin. | ||
| 101 | + QUuid uuid() const { return m_pluginUuid; } | ||
| 102 | + | ||
| 103 | + //! @returns Pointer to the plugin-instance as a QObject. | ||
| 104 | + QObject* plugin() const { return m_plugin; } | ||
| 105 | + | ||
| 106 | + //! Sets the name of the plugin. Make sure to omit the extension. | ||
| 107 | + //! @param pluginName Name of the plugin | ||
| 108 | + void setName( const QString& pluginName ) { m_pluginName = pluginName; } | ||
| 109 | + | ||
| 110 | + //! Sets the filename of the plugin. Make sure we omit the extension. | ||
| 111 | + //! @param pluginFile Filename of the plugin. | ||
| 112 | + void setFileName( const QString &fileName ) { m_pluginFile = fileName; } | ||
| 113 | + | ||
| 114 | + //! Sets the path to the plugin. | ||
| 115 | + //! @param pluginPath Path to the plugin | ||
| 116 | + //! | ||
| 117 | + //! PluginManager uses only one pluginpath, but it was added for future use. | ||
| 118 | + void setPath( const QString& pluginPath ) { m_pluginPath = pluginPath; } | ||
| 119 | + | ||
| 120 | + //! Sets the full pathname and name of the plugin specific configuration file | ||
| 121 | + //! @param pluginConfig Configuration file for the plugin | ||
| 122 | + void setConfig( const QString& pluginConfig ) { m_pluginConfigurationFile = pluginConfig; } | ||
| 123 | + | ||
| 124 | + /*! Sets the Unique Identifier of the specific plugin. | ||
| 125 | + * | ||
| 126 | + * If the plugin is not yet loaded, its value is | ||
| 127 | + * {00000000-0000-0000-0000-000000000000} ( or isNull is true ). If a plugin | ||
| 128 | + * is loaded, its value is changed with the value read from the pluginID. | ||
| 129 | + * | ||
| 130 | + * @param pluginUuid UUID for the plugin | ||
| 131 | + */ | ||
| 132 | + void setUuid( const QUuid& pluginUuid ) { m_pluginUuid = pluginUuid; } | ||
| 133 | + | ||
| 134 | + //! Sets the pointer to the plugin-instance. | ||
| 135 | + //! @param ptr_plugin Instance pointer | ||
| 136 | + void setPlugin( QObject* ptr_plugin ) { m_plugin = ptr_plugin; } | ||
| 137 | + | ||
| 138 | + QString asString(); | ||
| 139 | + | ||
| 140 | +private: | ||
| 141 | + QString m_pluginName; ///< Name of the plugin | ||
| 142 | + QString m_pluginFile; ///< Filename of the plugin | ||
| 143 | + QString m_pluginPath; ///< Full path to the plugin | ||
| 144 | + QString m_pluginConfigurationFile; ///< Full path to the configuration file | ||
| 145 | + QUuid m_pluginUuid; ///< Plugin UUID | ||
| 146 | + QObject* m_plugin; ///< Plugin implementation | ||
| 147 | +}; | ||
| 148 | + | ||
| 149 | +} // End namespace components | ||
| 150 | +} // End namespace osdev | ||
| 151 | + | ||
| 152 | +#endif // OSDEV_COMPONENTS_PLUGIN_H |
src/pluginmanager.cpp
0 → 100644
| 1 | +++ a/src/pluginmanager.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#include "pluginmanager.h" | ||
| 23 | + | ||
| 24 | +#include <QCoreApplication> | ||
| 25 | +#include <QFileInfo> | ||
| 26 | +#include <memory> | ||
| 27 | + | ||
| 28 | +#include "log.h" | ||
| 29 | +#include "dcxmlconfig.h" | ||
| 30 | +#include "iplugin.h" | ||
| 31 | + | ||
| 32 | +#include <QtDebug> | ||
| 33 | + | ||
| 34 | +namespace osdev { | ||
| 35 | +namespace components { | ||
| 36 | + | ||
| 37 | +using namespace osdev::caelus; | ||
| 38 | + | ||
| 39 | +std::unique_ptr<PluginManager> PluginManager::s_instance( nullptr ); | ||
| 40 | + | ||
| 41 | + | ||
| 42 | +PluginManager& PluginManager::Instance() | ||
| 43 | +{ | ||
| 44 | + if ( nullptr == s_instance ) | ||
| 45 | + { | ||
| 46 | + s_instance = std::unique_ptr<PluginManager>( new PluginManager() ); | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + return *s_instance; | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +bool PluginManager::addLibrary( const QString& pluginName ) | ||
| 53 | +{ | ||
| 54 | + bool bResult = false; | ||
| 55 | + | ||
| 56 | + if( m_pluginHash.contains( pluginName ) ) | ||
| 57 | + { | ||
| 58 | + bResult = false; | ||
| 59 | + } | ||
| 60 | + else | ||
| 61 | + { | ||
| 62 | + Plugin* l_plugin = new Plugin( pluginName ); | ||
| 63 | + if( nullptr != l_plugin ) | ||
| 64 | + { | ||
| 65 | + m_pluginHash.insert( pluginName, l_plugin ); | ||
| 66 | + bResult = true; | ||
| 67 | + | ||
| 68 | + LogInfo( m_className, QString( "Library : %1 was added to the library list." ).arg( pluginName ) ) | ||
| 69 | + } | ||
| 70 | + } | ||
| 71 | + return bResult; | ||
| 72 | +} | ||
| 73 | + | ||
| 74 | +bool PluginManager::loadPlugin(const QString& pluginName) | ||
| 75 | +{ | ||
| 76 | + bool bStatus = false; | ||
| 77 | + | ||
| 78 | + LogInfo( m_className, QString( "Load plugin %1" ).arg( pluginName ) ) | ||
| 79 | + | ||
| 80 | + QPluginLoader loader( pluginName ); | ||
| 81 | + QObject *plugin = loader.instance(); | ||
| 82 | + if ( plugin ) | ||
| 83 | + { | ||
| 84 | + LogInfo( m_className, "plugin was loaded..." ) | ||
| 85 | + IPlugin *iPlugin = qobject_cast<IPlugin*>( plugin ); | ||
| 86 | + if ( iPlugin ) | ||
| 87 | + { | ||
| 88 | + LogInfo( m_className, QString( "%1 implements the IPlugin interface.." ).arg( pluginName ) ) | ||
| 89 | + | ||
| 90 | + // Call initialization function on plugin | ||
| 91 | + iPlugin->initialise(); | ||
| 92 | + | ||
| 93 | + // Get the path of the just loaded plugin | ||
| 94 | + QString pluginPath = QFileInfo(loader.fileName()).path(); | ||
| 95 | + | ||
| 96 | + LogInfo( m_className, QString("Plugin name : %1").arg( iPlugin->getName() ) ) | ||
| 97 | + LogInfo( m_className, QString("Plugin uuid : %1").arg( iPlugin->getId().toString() ) ) | ||
| 98 | + LogInfo( m_className, QString("Plugin description : %1").arg( iPlugin->getDescription() ) ) | ||
| 99 | + LogInfo( m_className, QString("Plugin path : %1").arg( pluginPath ) ) | ||
| 100 | + | ||
| 101 | + // Set the created id to the pluginHash. | ||
| 102 | + Plugin *ptrPlugin = m_pluginHash.value( pluginName, nullptr ); | ||
| 103 | + if ( ptrPlugin ) | ||
| 104 | + { // Retrieve the correct pointer and adjust the values. | ||
| 105 | + ptrPlugin->setName( iPlugin->getName() ); | ||
| 106 | + ptrPlugin->setFileName( pluginName ); | ||
| 107 | + ptrPlugin->setUuid( iPlugin->getId() ); | ||
| 108 | + ptrPlugin->setPath( pluginPath ); | ||
| 109 | + ptrPlugin->setPlugin( plugin ); | ||
| 110 | + } | ||
| 111 | + else | ||
| 112 | + { // The plugin just loaded doesn't exist. Create it and add it to the hash. | ||
| 113 | + ptrPlugin = new Plugin( iPlugin->getName(), pluginName, pluginPath, QString(), iPlugin->getId(), plugin ); | ||
| 114 | + m_pluginHash.insert(iPlugin->getName(), ptrPlugin); | ||
| 115 | + } | ||
| 116 | + // Load successfull | ||
| 117 | + bStatus = true; | ||
| 118 | + | ||
| 119 | + } | ||
| 120 | + else | ||
| 121 | + { | ||
| 122 | + LogError( m_className, QString( "Ignoring plugin %1 because it does not support the IPlugin interface." ).arg( pluginName ) ) | ||
| 123 | + } | ||
| 124 | + } | ||
| 125 | + else | ||
| 126 | + { | ||
| 127 | + LogError( m_className, QString( "Loading of plugin %1 failed....." ).arg( pluginName ) ) | ||
| 128 | + LogError( m_className, QString( "PluginLoader reported : %1" ).arg( loader.errorString() ) ) | ||
| 129 | + LogError( m_className, QString( "LibraryPaths : %1 " ).arg( QCoreApplication::libraryPaths().join( "\n" ) ) ) | ||
| 130 | + } | ||
| 131 | + return bStatus; | ||
| 132 | +} | ||
| 133 | + | ||
| 134 | +bool PluginManager::loadPlugins(const QStringList& pluginNames) | ||
| 135 | +{ | ||
| 136 | + bool bStatus = false; | ||
| 137 | + | ||
| 138 | + LogDebug( m_className, QString("Adding %1 to the Hash.").arg( pluginNames.join(" ") ) ) | ||
| 139 | + buildLibraryList(); | ||
| 140 | + | ||
| 141 | + LogDebug( m_className, QString("Looking for plugins in : %1").arg( QCoreApplication::libraryPaths().join(":") ) ) | ||
| 142 | + for( const QString& pluginName : pluginNames ) | ||
| 143 | + { | ||
| 144 | + bStatus &= loadPlugin( pluginName ); | ||
| 145 | + } | ||
| 146 | + | ||
| 147 | + return bStatus; | ||
| 148 | +} | ||
| 149 | + | ||
| 150 | +bool PluginManager::loadPlugins() | ||
| 151 | +{ | ||
| 152 | + bool bStatus = false; | ||
| 153 | + | ||
| 154 | + auto l_pluginNames = m_pluginHash.keys(); | ||
| 155 | + for( const QString& l_pluginName : l_pluginNames ) | ||
| 156 | + { | ||
| 157 | + bStatus &= loadPlugin( l_pluginName ); | ||
| 158 | + } | ||
| 159 | + | ||
| 160 | + return bStatus; | ||
| 161 | +} | ||
| 162 | + | ||
| 163 | +bool PluginManager::unloadPlugin( const QString& pluginName ) | ||
| 164 | +{ | ||
| 165 | + bool bStatus = false; | ||
| 166 | + | ||
| 167 | + QPluginLoader loader( pluginName ); | ||
| 168 | + if ( loader.unload() ) | ||
| 169 | + { | ||
| 170 | + LogInfo(m_className, QString("Plugin %1 successfully unloaded.").arg(pluginName)) | ||
| 171 | + LogInfo(m_className, QString("Removing Plugin %1 form the hashtable.").arg(pluginName)) | ||
| 172 | + Plugin *ptr_plugin = m_pluginHash.take( pluginName ); | ||
| 173 | + delete ptr_plugin; | ||
| 174 | + bStatus = true; | ||
| 175 | + } | ||
| 176 | + else | ||
| 177 | + { | ||
| 178 | + LogError( m_className, QString("Unloading of plugin %1 failed.").arg(pluginName) ) | ||
| 179 | + LogError( m_className, QString("Last PluginError : %1").arg(loader.errorString() ) ) | ||
| 180 | + } | ||
| 181 | + return bStatus; | ||
| 182 | +} | ||
| 183 | + | ||
| 184 | +void PluginManager::addLibraryPaths(const QStringList& paths) | ||
| 185 | +{ | ||
| 186 | + for( const QString& libPath : paths ) | ||
| 187 | + { | ||
| 188 | + QCoreApplication::addLibraryPath( libPath ); | ||
| 189 | + } | ||
| 190 | +} | ||
| 191 | + | ||
| 192 | +void PluginManager::addLibraryPath(const QString& path) | ||
| 193 | +{ | ||
| 194 | + QCoreApplication::addLibraryPath( path ); | ||
| 195 | +} | ||
| 196 | + | ||
| 197 | +QObject* PluginManager::getPlugin(const QUuid &id) const | ||
| 198 | +{ | ||
| 199 | + QObject *l_plugin = nullptr; | ||
| 200 | + | ||
| 201 | + for(auto it = m_pluginHash.begin(); it != m_pluginHash.end(); ++it) | ||
| 202 | + { | ||
| 203 | + if ( id == it.value()->uuid() ) | ||
| 204 | + { | ||
| 205 | + l_plugin = it.value()->plugin(); | ||
| 206 | + } | ||
| 207 | + } | ||
| 208 | + | ||
| 209 | + return l_plugin; | ||
| 210 | +} | ||
| 211 | + | ||
| 212 | +QList<QObject*> PluginManager::getPlugins(const QString& i_interface) const | ||
| 213 | +{ | ||
| 214 | + QList<QObject*> l_pObjectList; | ||
| 215 | + | ||
| 216 | + for(auto it = m_pluginHash.begin(); it != m_pluginHash.end(); ++it ) | ||
| 217 | + { | ||
| 218 | + QObject *l_plugin = it.value()->plugin(); | ||
| 219 | + if( l_plugin && l_plugin->qt_metacast( i_interface.toUtf8().data() ) ) | ||
| 220 | + { | ||
| 221 | + // We've found a plugin with this interface | ||
| 222 | + l_pObjectList.push_back( l_plugin ); | ||
| 223 | + } | ||
| 224 | + } | ||
| 225 | + | ||
| 226 | + return l_pObjectList; | ||
| 227 | +} | ||
| 228 | + | ||
| 229 | +PluginManager::PluginManager() | ||
| 230 | + : m_pluginHash() | ||
| 231 | + , m_libraryList() | ||
| 232 | + , m_className("PluginManager :: ") | ||
| 233 | +{ | ||
| 234 | + QCoreApplication::addLibraryPath( "." ); | ||
| 235 | +} | ||
| 236 | + | ||
| 237 | +void PluginManager::buildLibraryList() | ||
| 238 | +{ | ||
| 239 | + // Get the config object and get the plugins and librarypaths... | ||
| 240 | + DCXmlConfig& l_config = DCXmlConfig::Instance(); | ||
| 241 | + | ||
| 242 | + // Get all the plugins and create their representing objects.. | ||
| 243 | + QStringList l_plugins = l_config.getPlugins(); | ||
| 244 | + for(const QString& pluginName : l_plugins) | ||
| 245 | + { | ||
| 246 | + Plugin* plugin = new Plugin( pluginName ); | ||
| 247 | + if (nullptr != plugin) | ||
| 248 | + { | ||
| 249 | + m_pluginHash.insert(pluginName, plugin); | ||
| 250 | + qDebug() << m_pluginHash; | ||
| 251 | + } | ||
| 252 | + } | ||
| 253 | +} | ||
| 254 | + | ||
| 255 | +QString PluginManager::getLibrary( const QString& pluginName ) const | ||
| 256 | +{ | ||
| 257 | + /// @TODO this should find the actual file name corresponding to the plugin. QFileInfo should be constructed with the actual filename. | ||
| 258 | + /// We are looking for that name so this is not working as intended. | ||
| 259 | + LogDebug( m_className, QString( "Plugin Name looking for : %1" ).arg( pluginName ) ) | ||
| 260 | + for( const QString& library : m_pluginHash.keys() ) | ||
| 261 | + { | ||
| 262 | + LogDebug( m_className, QString( "Library = %1" ).arg( library ) ) | ||
| 263 | + QFileInfo info( library ); | ||
| 264 | + LogDebug( m_className, QString( "Library base of : %1" ).arg( info.baseName() ) ) | ||
| 265 | + if ( pluginName == info.baseName() ) | ||
| 266 | + { // First found can be returned | ||
| 267 | + return library; | ||
| 268 | + } | ||
| 269 | + } | ||
| 270 | + // Nothing found | ||
| 271 | + return QString(); | ||
| 272 | +} | ||
| 273 | + | ||
| 274 | +bool PluginManager::isLoaded( const QString& pluginName ) const | ||
| 275 | +{ | ||
| 276 | + return m_pluginHash.contains( pluginName ); | ||
| 277 | +} | ||
| 278 | + | ||
| 279 | +QUuid PluginManager::getPluginId( const QString& pluginName ) const | ||
| 280 | +{ | ||
| 281 | + if( isLoaded( pluginName ) ) | ||
| 282 | + { | ||
| 283 | + return m_pluginHash.value( pluginName )->uuid(); | ||
| 284 | + } | ||
| 285 | + return QUuid(); | ||
| 286 | +} | ||
| 287 | + | ||
| 288 | +QUuid PluginManager::getPluginIdByInterfaceId( const QString &interface_id ) | ||
| 289 | +{ | ||
| 290 | + for(auto it = m_pluginHash.begin(); it != m_pluginHash.end(); ++it ) | ||
| 291 | + { | ||
| 292 | + QObject *l_plugin = it.value()->plugin(); | ||
| 293 | + if( l_plugin && l_plugin->qt_metacast( interface_id.toUtf8().data() ) ) | ||
| 294 | + { | ||
| 295 | + // We've found a plugin with this interface | ||
| 296 | + IPlugin *iPlugin = qobject_cast<IPlugin*>( it.value()->plugin() ); | ||
| 297 | + if( iPlugin ) | ||
| 298 | + { | ||
| 299 | + return iPlugin->getId(); | ||
| 300 | + } | ||
| 301 | + else | ||
| 302 | + LogInfo( "[PluginManager::getPluginIdByInterfaceId]", QString( "No plugin found with interface : " + interface_id ) ); | ||
| 303 | + } | ||
| 304 | + } | ||
| 305 | + return QUuid(); | ||
| 306 | +} | ||
| 307 | + | ||
| 308 | +QString PluginManager::getPluginNameByUuid( const QUuid &uuid ) | ||
| 309 | +{ | ||
| 310 | + for( const auto& key : m_pluginHash.keys() ) | ||
| 311 | + { | ||
| 312 | + Plugin *ptr_plugin = m_pluginHash.value( key, nullptr ); | ||
| 313 | + if( nullptr != ptr_plugin ) | ||
| 314 | + { | ||
| 315 | + if( ptr_plugin->uuid() == uuid ) | ||
| 316 | + { | ||
| 317 | + return ptr_plugin->name(); | ||
| 318 | + } | ||
| 319 | + } | ||
| 320 | + } | ||
| 321 | + return QString(); | ||
| 322 | +} | ||
| 323 | + | ||
| 324 | +QUuid PluginManager::getPluginUuidByName( const QString &name ) | ||
| 325 | +{ | ||
| 326 | + for( const auto& key : m_pluginHash.keys() ) | ||
| 327 | + { | ||
| 328 | + Plugin *ptr_plugin = m_pluginHash.value( key, nullptr ); | ||
| 329 | + if( nullptr != ptr_plugin ) | ||
| 330 | + { | ||
| 331 | + if( ptr_plugin->name() == name ) | ||
| 332 | + { | ||
| 333 | + return ptr_plugin->uuid(); | ||
| 334 | + } | ||
| 335 | + } | ||
| 336 | + } | ||
| 337 | + return QUuid(); | ||
| 338 | +} | ||
| 339 | + | ||
| 340 | +void PluginManager::slotConfigChanged( const QString& fileName ) | ||
| 341 | +{ | ||
| 342 | + LogInfo(m_className, | ||
| 343 | + QString( "Configurationfile %1 was changed. Reread the configuration and plugins." ).arg( fileName ) ) | ||
| 344 | +} | ||
| 345 | + | ||
| 346 | +} // End namespace components | ||
| 347 | +} // End namespace osdev |
src/pluginmanager.h
0 → 100644
| 1 | +++ a/src/pluginmanager.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_PLUGINMANAGER_H | ||
| 23 | +#define OSDEV_COMPONENTS_PLUGINMANAGER_H | ||
| 24 | + | ||
| 25 | +#include <QObject> | ||
| 26 | +#include <QUuid> | ||
| 27 | +#include <QHash> | ||
| 28 | +#include <QList> | ||
| 29 | +#include <QStringList> | ||
| 30 | + | ||
| 31 | +#include "plugin.h" | ||
| 32 | + | ||
| 33 | +#include "globallibexport.h" | ||
| 34 | + | ||
| 35 | +#include <memory> | ||
| 36 | + | ||
| 37 | +namespace osdev { | ||
| 38 | +namespace components { | ||
| 39 | + | ||
| 40 | +/** | ||
| 41 | + * \brief This component is responsible for loading plugins. | ||
| 42 | + * | ||
| 43 | + * It also has support for supplying interfaces on the loaded pluins. The plugin | ||
| 44 | + * manager is a singleton component. | ||
| 45 | + *//* | ||
| 46 | + * ________________________________________ | ||
| 47 | + * / One of the signs of Napoleon's \ | ||
| 48 | + * | greatness is the fact that he once had | | ||
| 49 | + * | a publisher shot. | | ||
| 50 | + * | | | ||
| 51 | + * \ -- Siegfried Unseld / | ||
| 52 | + * ---------------------------------------- | ||
| 53 | + * \ | ||
| 54 | + * \ | ||
| 55 | + * .--. | ||
| 56 | + * |o_o | | ||
| 57 | + * |:_/ | | ||
| 58 | + * // \ \ | ||
| 59 | + * (| | ) | ||
| 60 | + * /'\_ _/`\ | ||
| 61 | + * \___)=(___/ | ||
| 62 | + * | ||
| 63 | + */ | ||
| 64 | +class GLOBALLIBINTERFACE PluginManager : public QObject | ||
| 65 | +{ | ||
| 66 | + Q_OBJECT | ||
| 67 | + | ||
| 68 | +public: | ||
| 69 | + //! Constructs the plugin manager | ||
| 70 | + static PluginManager& Instance(); | ||
| 71 | + | ||
| 72 | + /// Deleted copy-constructor | ||
| 73 | + PluginManager( const PluginManager& ) = delete; | ||
| 74 | + /// Deleted assignment operator | ||
| 75 | + PluginManager& operator=(const PluginManager&) = delete; | ||
| 76 | + /// Deleted move-constructor | ||
| 77 | + PluginManager( PluginManager&& ) = delete; | ||
| 78 | + /// Deleted move operator | ||
| 79 | + PluginManager& operator=( PluginManager&& ) = delete; | ||
| 80 | + | ||
| 81 | + //! Adds a plugin not listed in the configuration. | ||
| 82 | + bool addLibrary( const QString& pluginName ); | ||
| 83 | + | ||
| 84 | + //! Load the plugin by its name and location | ||
| 85 | + bool loadPlugin(const QString& pluginName); | ||
| 86 | + | ||
| 87 | + //! Loads a list of plugins. Names are resolved against the paths added with addLibraryPaths(). | ||
| 88 | + bool loadPlugins(const QStringList& pluginNames); | ||
| 89 | + | ||
| 90 | + //! Load all plugins set in the staging table. | ||
| 91 | + bool loadPlugins(); | ||
| 92 | + | ||
| 93 | + //! Unloads a plugin and removes it from the manager | ||
| 94 | + bool unloadPlugin( const QString& pluginName ); | ||
| 95 | + | ||
| 96 | + //! Specify where the plugin manager will look for plugins | ||
| 97 | + void addLibraryPaths(const QStringList& paths); | ||
| 98 | + | ||
| 99 | + //! Specify a single plugin path | ||
| 100 | + void addLibraryPath(const QString& path); | ||
| 101 | + | ||
| 102 | + //! Retrieve a loaded plugin with its object ID. | ||
| 103 | + QObject* getPlugin(const QUuid &id) const; | ||
| 104 | + | ||
| 105 | + //! Retrieve all objects that have the specified interface. | ||
| 106 | + QList<QObject*> getPlugins(const QString& i_interface) const; | ||
| 107 | + | ||
| 108 | + //! Check if a specific plugin was already loaded... | ||
| 109 | + bool isLoaded( const QString& pluginName ) const; | ||
| 110 | + | ||
| 111 | + //! Retrieve the uuid of the given plugin by its filename. | ||
| 112 | + QUuid getPluginId( const QString& pluginName ) const; | ||
| 113 | + | ||
| 114 | + //! Retrieve the uuid of the given plugin by its Interface_id | ||
| 115 | + QUuid getPluginIdByInterfaceId( const QString &interface_id ); | ||
| 116 | + | ||
| 117 | + //! Retrieve the name of the given plugin by its uuid | ||
| 118 | + QString getPluginNameByUuid( const QUuid &uuid ); | ||
| 119 | + | ||
| 120 | + //! Retrieve the plugin_id by its systemname. | ||
| 121 | + QUuid getPluginUuidByName( const QString &name ); | ||
| 122 | + | ||
| 123 | + /** | ||
| 124 | + * @brief Locate the interface with the specified name | ||
| 125 | + * @tparam T Type of interface needed | ||
| 126 | + * @param i_interface Name of the interface | ||
| 127 | + * @return Interface implementation, or nullptr if no valid interface could | ||
| 128 | + * be found | ||
| 129 | + */ | ||
| 130 | + template<class T> | ||
| 131 | + T* queryInterface(const QString& i_interface); | ||
| 132 | + | ||
| 133 | +public slots: | ||
| 134 | + /** | ||
| 135 | + * @brief Slot called when a configuration file changed | ||
| 136 | + * @param fileName Name of the changed file | ||
| 137 | + * @todo Implement me! | ||
| 138 | + */ | ||
| 139 | + void slotConfigChanged( const QString& fileName ); | ||
| 140 | + | ||
| 141 | +private: | ||
| 142 | + | ||
| 143 | + //! Constructs the plugin manager (CTor) | ||
| 144 | + PluginManager(); | ||
| 145 | + | ||
| 146 | + /** | ||
| 147 | + * @brief Get all the plugins and create their representing objects | ||
| 148 | + */ | ||
| 149 | + void buildLibraryList(); | ||
| 150 | + | ||
| 151 | + /** | ||
| 152 | + * @brief Find the library associated with a plugin-name | ||
| 153 | + * @param pluginName Plugin name to look for | ||
| 154 | + * @return Library-name, or an empty string if no library was found | ||
| 155 | + */ | ||
| 156 | + QString getLibrary(const QString& pluginName) const; | ||
| 157 | + | ||
| 158 | + // ------------------------------------------------------ | ||
| 159 | + | ||
| 160 | + //! Contains the only instance of a Pluginmanager | ||
| 161 | + static std::unique_ptr<PluginManager> s_instance; | ||
| 162 | + | ||
| 163 | + //! Hash table of all plugins. Loaded or not... | ||
| 164 | + QHash<QString, Plugin*> m_pluginHash; | ||
| 165 | + | ||
| 166 | + //! List of all possible libraries that may be loaded by the PM.... | ||
| 167 | + QStringList m_libraryList; | ||
| 168 | + | ||
| 169 | + //! Member holding the classname. | ||
| 170 | + QString m_className; | ||
| 171 | +}; | ||
| 172 | + | ||
| 173 | +// ------------------------------------------------------ | ||
| 174 | + | ||
| 175 | +template <class T> | ||
| 176 | +T* PluginManager::queryInterface(const QString& i_interface) | ||
| 177 | +{ | ||
| 178 | + // Hash used to store queried interfaces | ||
| 179 | + static QHash<QString, T*> ifaceCache; | ||
| 180 | + | ||
| 181 | + T* pInterface = nullptr; | ||
| 182 | + | ||
| 183 | + if ( ifaceCache.contains(i_interface) ) | ||
| 184 | + { | ||
| 185 | + pInterface = ifaceCache[i_interface]; | ||
| 186 | + } | ||
| 187 | + else | ||
| 188 | + { | ||
| 189 | + QList<QObject*> pPluginList = PluginManager::Instance().getPlugins( i_interface ); | ||
| 190 | + if ( !pPluginList.isEmpty() ) | ||
| 191 | + { | ||
| 192 | + // Return the first plugin with the wanted interface. | ||
| 193 | + pInterface = qobject_cast<T*>(pPluginList[0]); | ||
| 194 | + /// @todo What if we specify the wrong T for this plugin? | ||
| 195 | + Q_ASSERT(pInterface); | ||
| 196 | + ifaceCache.insert(i_interface, pInterface); | ||
| 197 | + } | ||
| 198 | + } | ||
| 199 | + return pInterface; | ||
| 200 | +} | ||
| 201 | + | ||
| 202 | +} // End namespace components | ||
| 203 | +} // End namespace osdev | ||
| 204 | + | ||
| 205 | +#endif // OSDEV_COMPONENTS_PLUGINMANAGER_H |
src/systeminfo.cpp
0 → 100644
| 1 | +++ a/src/systeminfo.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#include "systeminfo.h" | ||
| 23 | +#include "log.h" | ||
| 24 | + | ||
| 25 | +#include <QDir> | ||
| 26 | + | ||
| 27 | +using namespace osdev::components; | ||
| 28 | + | ||
| 29 | +// The only instance of the singleton system info. | ||
| 30 | +std::unique_ptr<SystemInfo> SystemInfo::s_pInstance(nullptr); | ||
| 31 | + | ||
| 32 | +// The configuration directory. | ||
| 33 | +static const QString qsConfigDir = "config/"; | ||
| 34 | +static const QString qsResourceDir = "resource/"; | ||
| 35 | + | ||
| 36 | +static const QString qsDynaBuilderSystemPluginConfig; | ||
| 37 | +static const QString qsDynaBuilderUiPluginConfig; | ||
| 38 | +static const QString qsDynaBuilderBackendPluginConfig; | ||
| 39 | + | ||
| 40 | + | ||
| 41 | +SystemInfo::SystemInfo() | ||
| 42 | + : m_qsApplicationPath() | ||
| 43 | + , m_qsExecutablePath(QDir::currentPath()) | ||
| 44 | +{ | ||
| 45 | +} | ||
| 46 | + | ||
| 47 | +SystemInfo::~SystemInfo() | ||
| 48 | +{ | ||
| 49 | +} | ||
| 50 | + | ||
| 51 | +SystemInfo& SystemInfo::Instance() | ||
| 52 | +{ | ||
| 53 | + // Is it the first call? | ||
| 54 | + if (nullptr == s_pInstance) | ||
| 55 | + { | ||
| 56 | + // Create sole instance | ||
| 57 | + s_pInstance.reset(new SystemInfo()); | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + // Return the address of sole instance | ||
| 61 | + return *s_pInstance.get(); | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | +void SystemInfo::destroyInstance() | ||
| 65 | +{ | ||
| 66 | + s_pInstance.reset(); | ||
| 67 | +} | ||
| 68 | + | ||
| 69 | +void SystemInfo::setApplicationPath(const QString& qsName) | ||
| 70 | +{ | ||
| 71 | + QDir dir( qsName ); | ||
| 72 | + | ||
| 73 | + m_qsApplicationPath = dir.absolutePath(); | ||
| 74 | + | ||
| 75 | + LogInfo("SystemInfo::setApplicationPath", | ||
| 76 | + "ApplicationPath before :: " + m_qsApplicationPath); | ||
| 77 | + | ||
| 78 | + // Remove appl name. | ||
| 79 | + int lSlashPosition = m_qsApplicationPath.lastIndexOf ( '/' ); | ||
| 80 | + | ||
| 81 | + // And platform path. | ||
| 82 | + // lSlashPosition = m_qsApplicationPath.lastIndexOf ( '/', lSlashPosition - 1); | ||
| 83 | + m_qsApplicationPath = m_qsApplicationPath.left( lSlashPosition + 1 ); | ||
| 84 | + | ||
| 85 | + QString strBin = "bin"; | ||
| 86 | + | ||
| 87 | + m_qsApplicationPath = m_qsApplicationPath.left( m_qsApplicationPath.lastIndexOf( strBin ) ); | ||
| 88 | + | ||
| 89 | + LogInfo("SystemInfo::setApplicationPath", | ||
| 90 | + "ApplicationPath after :: " + m_qsApplicationPath); | ||
| 91 | + | ||
| 92 | + /// @todo The application can be started via the PATH variable. This path | ||
| 93 | + /// should be prepended to the path. | ||
| 94 | +} | ||
| 95 | + | ||
| 96 | +QString SystemInfo::getApplicationPath() const | ||
| 97 | +{ | ||
| 98 | + return m_qsApplicationPath; | ||
| 99 | +} | ||
| 100 | + | ||
| 101 | +QString SystemInfo::getExecutablePath() const | ||
| 102 | +{ | ||
| 103 | + return m_qsExecutablePath; | ||
| 104 | +} | ||
| 105 | + | ||
| 106 | +QString SystemInfo::getResourcePath() const | ||
| 107 | +{ | ||
| 108 | + return getApplicationPath() + qsResourceDir; | ||
| 109 | +} | ||
| 110 | + | ||
| 111 | +QString SystemInfo::getConfigurationPath() const | ||
| 112 | +{ | ||
| 113 | + return getApplicationPath() + qsConfigDir; | ||
| 114 | +} | ||
| 115 | + | ||
| 116 | +QString SystemInfo::getConfigFile(ConfigFile fileType) const | ||
| 117 | +{ | ||
| 118 | + switch(fileType) | ||
| 119 | + { | ||
| 120 | + case ConfigFile::System: | ||
| 121 | + return getApplicationPath() + qsConfigDir + qsDynaBuilderSystemPluginConfig; | ||
| 122 | + case ConfigFile::UI: | ||
| 123 | + return getApplicationPath() + qsConfigDir + qsDynaBuilderUiPluginConfig; | ||
| 124 | + case ConfigFile::Backend: | ||
| 125 | + return getApplicationPath() + qsConfigDir + qsDynaBuilderBackendPluginConfig; | ||
| 126 | + } | ||
| 127 | + Q_ASSERT(0 && "Unknown configuration file type"); | ||
| 128 | + return QString(); | ||
| 129 | +} |
src/systeminfo.h
0 → 100644
| 1 | +++ a/src/systeminfo.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_SYSTEMINFO_H | ||
| 23 | +#define OSDEV_COMPONENTS_SYSTEMINFO_H | ||
| 24 | + | ||
| 25 | +#include "globallibexport.h" | ||
| 26 | + | ||
| 27 | +#include <memory> | ||
| 28 | +#include <QString> | ||
| 29 | + | ||
| 30 | +namespace osdev { | ||
| 31 | +namespace components { | ||
| 32 | + | ||
| 33 | +/** | ||
| 34 | + * @brief Collects information about the current system | ||
| 35 | + * | ||
| 36 | + * Singleton class. | ||
| 37 | + */ | ||
| 38 | +class GLOBALLIBINTERFACE SystemInfo | ||
| 39 | +{ | ||
| 40 | +public: | ||
| 41 | + /// Supported classes of configuration file | ||
| 42 | + enum class ConfigFile { | ||
| 43 | + System, ///< System configuration | ||
| 44 | + UI, ///< UI configuration | ||
| 45 | + Backend ///< Backend configuration | ||
| 46 | + }; | ||
| 47 | + | ||
| 48 | + //! Constructs the systeminfo (Ctor). | ||
| 49 | + //! @return Reference to the SystemInfo instance | ||
| 50 | + static SystemInfo& Instance(); | ||
| 51 | + | ||
| 52 | + /// Deleted copy-constructor | ||
| 53 | + SystemInfo(const SystemInfo&) = delete; | ||
| 54 | + /// Deleted assignment operator | ||
| 55 | + SystemInfo& operator= (const SystemInfo&) = delete; | ||
| 56 | + /// Deleted move-constructor | ||
| 57 | + SystemInfo(SystemInfo&&) = delete; | ||
| 58 | + /// Deleted move operator | ||
| 59 | + SystemInfo& operator=(SystemInfo&&) = delete; | ||
| 60 | + | ||
| 61 | + //! Destructs the config parser (Dtor) | ||
| 62 | + ~SystemInfo(); | ||
| 63 | + | ||
| 64 | + //! Destroy single instance | ||
| 65 | + static void destroyInstance(); | ||
| 66 | + | ||
| 67 | + //! Set the application path. | ||
| 68 | + void setApplicationPath(const QString& qsName); | ||
| 69 | + | ||
| 70 | + //! Returns the application path. | ||
| 71 | + QString getApplicationPath() const; | ||
| 72 | + | ||
| 73 | + //! Returns the location (path to) the executable | ||
| 74 | + QString getExecutablePath() const; | ||
| 75 | + | ||
| 76 | + //! Return xml configuration path. | ||
| 77 | + QString getConfigurationPath() const; | ||
| 78 | + | ||
| 79 | + //! Return resource path. | ||
| 80 | + QString getResourcePath() const; | ||
| 81 | + | ||
| 82 | + //! Returns the path of a config file. | ||
| 83 | + QString getConfigFile( ConfigFile fileType ) const; | ||
| 84 | + | ||
| 85 | +private: | ||
| 86 | + //! Constructs the config parser (Ctor) | ||
| 87 | + SystemInfo(); | ||
| 88 | + | ||
| 89 | +private: | ||
| 90 | + | ||
| 91 | + //! Contains the only instance of a CSystemInfo. | ||
| 92 | + static std::unique_ptr<SystemInfo> s_pInstance; | ||
| 93 | + | ||
| 94 | + //! The name of the configfile. | ||
| 95 | + QString m_qsApplicationPath; | ||
| 96 | + | ||
| 97 | + //! The path with the location of the executable | ||
| 98 | + QString m_qsExecutablePath; | ||
| 99 | +}; | ||
| 100 | + | ||
| 101 | +} // End namespace components | ||
| 102 | +} // End namespace osdev | ||
| 103 | + | ||
| 104 | +#endif /* OSDEV_COMPONENTS_SYSTEMINFO_H */ |
src/threadmon.cpp
0 → 100644
| 1 | +++ a/src/threadmon.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#include "threadmon.h" | ||
| 23 | +#include <QtCore/private/qthread_p.h> | ||
| 24 | + | ||
| 25 | +using namespace osdev::components; | ||
| 26 | + | ||
| 27 | +int ThreadMon::postedEventsCountForThread(QThread* pThread) | ||
| 28 | +{ | ||
| 29 | + /* Check if we have a valid pointer */ | ||
| 30 | + if (nullptr == pThread) | ||
| 31 | + return -1; | ||
| 32 | + | ||
| 33 | + auto threadData = QThreadData::get2(pThread); | ||
| 34 | + if (nullptr == threadData) | ||
| 35 | + return -1; | ||
| 36 | + | ||
| 37 | + QMutexLocker lock(&threadData->postEventList.mutex); | ||
| 38 | + | ||
| 39 | + return (threadData->postEventList.size() - threadData->postEventList.startOffset); | ||
| 40 | +} |
src/threadmon.h
0 → 100644
| 1 | +++ a/src/threadmon.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_THREADMON_H | ||
| 23 | +#define OSDEV_COMPONENTS_THREADMON_H | ||
| 24 | + | ||
| 25 | +#include <QtCore> | ||
| 26 | + | ||
| 27 | +namespace osdev { | ||
| 28 | +namespace components { | ||
| 29 | + | ||
| 30 | +class ThreadMon | ||
| 31 | +{ | ||
| 32 | +public: | ||
| 33 | + /*! | ||
| 34 | + * \brief postedEventsCountForThread will report the number of meesages waiting in the eventloop of the given QThread | ||
| 35 | + * \param pThread - raw-pointer to the thread we want to investigate. | ||
| 36 | + * \return -1 if nothing to report. >= 0 if the thread is valid and the eventQueue was queried. | ||
| 37 | + */ | ||
| 38 | + static int postedEventsCountForThread(QThread* pThread); | ||
| 39 | +}; | ||
| 40 | + | ||
| 41 | +} /* End namespace components */ | ||
| 42 | +} /* End namespace osdev */ | ||
| 43 | + | ||
| 44 | +#endif /* OSDEV_COMPONENTS_THREADMON_H */ |
src/timeutils.cpp
0 → 100644
| 1 | +++ a/src/timeutils.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#include "timeutils.h" | ||
| 23 | + | ||
| 24 | +// std | ||
| 25 | +#include <chrono> | ||
| 26 | + | ||
| 27 | +using namespace osdev::components; | ||
| 28 | + | ||
| 29 | +std::uint64_t TimeUtils::getEpochUSecs() | ||
| 30 | +{ | ||
| 31 | + auto tsUSec = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::system_clock::now() ); | ||
| 32 | + return static_cast<std::uint64_t>(tsUSec.time_since_epoch().count()); | ||
| 33 | +} |
src/timeutils.h
0 → 100644
| 1 | +++ a/src/timeutils.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_TIMEUTILS_H | ||
| 23 | +#define OSDEV_COMPONENTS_TIMEUTILS_H | ||
| 24 | + | ||
| 25 | +#include <QtGlobal> | ||
| 26 | +#include <cstdint> | ||
| 27 | + | ||
| 28 | +namespace osdev { | ||
| 29 | +namespace components { | ||
| 30 | + | ||
| 31 | +class TimeUtils | ||
| 32 | +{ | ||
| 33 | +public: | ||
| 34 | + static std::uint64_t getEpochUSecs(); | ||
| 35 | +}; | ||
| 36 | + | ||
| 37 | +} /* End namespace components */ | ||
| 38 | +} /* End namespace osdev */ | ||
| 39 | + | ||
| 40 | +#endif /* OSDEV_COMPONENTS_TIMEUTILS_H */ |
tests/CMakeLists.txt
0 → 100644
| 1 | +++ a/tests/CMakeLists.txt | ||
| 1 | +cmake_minimum_required(VERSION 3.0) | ||
| 2 | +LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) | ||
| 3 | + | ||
| 4 | +include(projectheader) | ||
| 5 | +project_header(test_logutils) | ||
| 6 | + | ||
| 7 | +include_directories( SYSTEM | ||
| 8 | + ${CMAKE_CURRENT_SOURCE_DIR}/../../src | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +include(compiler) | ||
| 12 | +set(SRC_LIST | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +# add_executable( ${PROJECT_NAME} | ||
| 16 | +# ${SRC_LIST} | ||
| 17 | +# ) | ||
| 18 | + | ||
| 19 | +# target_link_libraries( | ||
| 20 | +# ${PROJECT_NAME} | ||
| 21 | +# ) | ||
| 22 | + | ||
| 23 | +# set_target_properties( ${PROJECT_NAME} PROPERTIES | ||
| 24 | +# RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin | ||
| 25 | +# LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib | ||
| 26 | +# ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/archive | ||
| 27 | +# ) | ||
| 28 | + | ||
| 29 | +# include(installation) | ||
| 30 | +# install_application() |