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