PLCnext API Documentation 23.6.0.37
Environment.hpp
1
2//
3// Copyright PHOENIX CONTACT Electronics GmbH
4//
6#pragma once
8#include "Arp/System/Core/AppDomainSingleton.hxx"
9#include "Arp/System/Core/Endianness.hpp"
10#include <chrono>
11#include <sstream>
12#include <vector>
13#include <set>
14#include <map>
15
16namespace Arp { namespace System { namespace Commons
17{
18
20{
21public: // Properties
22 static const char* ArpBinaryDirVariableName;
23
24public: // setup/dispose operations
25 static void Setup(void);
26 static void SetupSettings(int core);
27 static void SetupSecuritySettings(const String& securitySettingsPath);
28 static void SetupTrustStore(const std::vector<String>& trustStorePaths, const String& trustStoreEditPath);
29 static void SetupIdentityStore(const std::vector<String>& identityStorePaths, const String& identityStoreEditPath);
30 static void Dispose(void);
31
32public: // static operations
33 static int64 GetTickCount(void);
34 static Endianness GetEndianness(void);
35 static String GetVariable(const char* variableName);
36 template<class T>
37 static bool GetVariableValue(const char* variableName, T& result);
38 static bool GetVariableValue(const char* variableName, String& value);
39 template<class T>
40 static bool GetDefaultVariableValue(const char* variableName, T& result);
41 static bool GetDefaultVariableValue(const char* variableName, String& value);
42 template<class T>
43 static bool AddVariable(const char* variableName, const T& value);
44 static bool AddVariable(const char* variableName, const String& value);
45 template<class T>
46 static bool AddOverriddenVariable(const char* variableName, const T& value);
47 static bool AddOverriddenVariable(const char* variableName, const String& value);
48 static bool SetVariable(const char* variableName, const String& value);
49 static void LogVariables(void);
50 static void RegisterEnvironmentVariables(void);
51
52private: // static methods
53 static bool RegisterEnvironmentVariable(const String& name, const char* value);
54
55private: // nested class EnvData
56 class Data : public AppDomainSingleton<Data>
57 {
58 friend class Environment;
59
60 public: // typedefs
61 using VariableNames = std::set<String>; // <name>
62 using EnvironmentVariables = std::map<String, String>; // <name, value>
63
64 public: // Constructors
65 Data(void) = default;
66 ~Data(void) = default;
67
68 public: // operations
69 bool AddDefaultVariable(const char* variableName, const String& value);
70 bool AddOverriddenVariable(const char* variableName, const String& value);
71 bool SetDefaultVariable(const char* variableName, const String& value);
72 bool SetOverriddenVariable(const char* variableName, const String& value);
73 bool GetCurrentVariableValue(const char* variableName, const char*& pResult)const;
74 bool GetDefaultVariableValue(const char* variableName, const char*& pResult)const;
75 bool GetOverriddenVariableValue(const char* variableName, const char*& pResult)const;
76
77 private: // methods
78 void GetVariableNames(VariableNames& result);
79 void LogVariables(void);
80
81 private: // static methods
82 static bool GetVariableValueFrom(const EnvironmentVariables& items, const char* variableName, const char*& pResult);
83
84 private: //fields
85 EnvironmentVariables environmentVariables;
86 EnvironmentVariables overriddenVariables;
87 };
88};
89
91// inline methods of class Environment
92inline int64 Environment::GetTickCount()
93{
94 return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
95}
96
97inline Endianness Environment::GetEndianness(void)
98{
100}
101
102template<>
103inline bool Environment::GetVariableValue<String>(const char* variableName, String& result)
104{
105 return GetVariableValue(variableName, result);
106}
107
108template<class T>
109inline bool Environment::GetVariableValue(const char* variableName, T& result)
110{
111 String value;
112 if (!GetVariableValue(variableName, value))
113 {
114 return false;
115 }
116 // else
117 std::istringstream iss(value.CStr());
118 iss >> std::boolalpha >> result;
119 return !iss.fail();
120}
121
122inline String Environment::GetVariable(const char* variableName)
123{
124 String result;
125 if (GetVariableValue(variableName, result))
126 {
127 return result;
128 }
129 // else
130 return String::Empty;
131}
132
133template<>
134inline bool Environment::GetDefaultVariableValue<String>(const char* variableName, String& result)
135{
136 return GetDefaultVariableValue(variableName, result);
137}
138
139template<class T>
140inline bool Environment::GetDefaultVariableValue(const char* variableName, T& result)
141{
142 String value;
143 if (!GetDefaultVariableValue(variableName, value))
144 {
145 return false;
146 }
147 // else
148 std::istringstream iss(value.CStr());
149 iss >> std::boolalpha >> result;
150 return !iss.fail();
151}
152
153template<class T>
154inline bool Environment::AddVariable(const char* variableName, const T& value)
155{
156 std::stringstream ss;
157 ss << std::boolalpha << value;
158 return Environment::AddVariable(variableName, String(ss.str()));
159}
160
161inline bool Environment::AddVariable(const char* variableName, const String& value)
162{
163 return Data::GetInstance().AddDefaultVariable(variableName, value);
164}
165
166template<class T>
167inline bool Environment::AddOverriddenVariable(const char* variableName, const T& value)
168{
169 std::stringstream ss;
170 ss << std::boolalpha << value;
171 return Environment::AddOverriddenVariable(variableName, String(ss.str()));
172}
173
174inline bool Environment::AddOverriddenVariable(const char* variableName, const String& value)
175{
176 return Data::GetInstance().AddOverriddenVariable(variableName, value);
177}
178
180// inline methods of class Environment::Data
181inline bool Environment::Data::GetCurrentVariableValue(const char* variableName, const char*& pResult)const
182{
183 // try to get value from overrides
184 if (GetOverriddenVariableValue(variableName, pResult))
185 {
186 return true;
187 }
188 // else try to get default value
189 return GetDefaultVariableValue(variableName, pResult);
190}
191
192inline bool Environment::Data::GetDefaultVariableValue(const char* variableName, const char*& pResult)const
193{
194 return GetVariableValueFrom(this->environmentVariables, variableName, pResult);
195}
196
197inline bool Environment::Data::GetOverriddenVariableValue(const char* variableName, const char*& pResult)const
198{
199 return GetVariableValueFrom(this->overriddenVariables, variableName, pResult);
200}
201
202}}} // end of namespace Arp::System::Commons
This class implements the singleton pattern for singletons with process wide scope.
Definition: AppDomainSingleton.hxx:25
Definition: Environment.hpp:20
static const SelfType Empty
An emtpy static string instance.
Definition: BasicString.hxx:224
Arp::BasicString< char8 > String
The Arp String class.
Definition: TypeSystem.h:27
std::int64_t int64
The Arp integer type of 8 byte size.
Definition: PrimitiveTypes.hpp:42
@ System
System components used by the System, Device, Plc or Io domains.
Root namespace for the PLCnext API
Endianness
This enum defines the endinannes of the target architecture.
Definition: Endianness.hpp:13
@ Current
Determines the current endianness.