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() | ... | ... |