PLCnext API Documentation  22.9.0.33
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 namespace Arp { namespace System { namespace Commons
17 {
18 
20 {
21 public: // Properties
22  static const char* ArpBinaryDirVariableName;
23 
24 public: // setup/dispose operations
25  static void Setup(void);
26  static void SetupSettings(int core);
27  static void SetupTrustStore(const std::vector<String>& trustStorePaths, const String& trustStoreEditPath);
28  static void SetupIdentityStore(const std::vector<String>& identityStorePaths, const String& identityStoreEditPath);
29  static void Dispose(void);
30 
31 public: // static operations
32  static int64 GetTickCount(void);
33  static Endianness GetEndianness(void);
34  static String GetVariable(const char* variableName);
35  template<class T>
36  static bool GetVariableValue(const char* variableName, T& result);
37  static bool GetVariableValue(const char* variableName, String& value);
38  template<class T>
39  static bool GetDefaultVariableValue(const char* variableName, T& result);
40  static bool GetDefaultVariableValue(const char* variableName, String& value);
41  template<class T>
42  static bool AddVariable(const char* variableName, const T& value);
43  static bool AddVariable(const char* variableName, const String& value);
44  template<class T>
45  static bool AddOverriddenVariable(const char* variableName, const T& value);
46  static bool AddOverriddenVariable(const char* variableName, const String& value);
47  static bool SetVariable(const char* variableName, const String& value);
48  static void LogVariables(void);
49  static void RegisterEnvironmentVariables(void);
50 
51 private: // static methods
52  static bool RegisterEnvironmentVariable(const String& name, const char* value);
53 
54 
55 private: // 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
92 inline int64 Environment::GetTickCount()
93 {
94  return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
95 }
96 
97 inline Endianness Environment::GetEndianness(void)
98 {
99  return Endianness::Current;
100 }
101 
102 template<>
103 inline bool Environment::GetVariableValue<String>(const char* variableName, String& result)
104 {
105  return GetVariableValue(variableName, result);
106 }
107 
108 template<class T>
109 inline 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 
122 inline 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 
133 template<>
134 inline bool Environment::GetDefaultVariableValue<String>(const char* variableName, String& result)
135 {
136  return GetDefaultVariableValue(variableName, result);
137 }
138 
139 template<class T>
140 inline 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 
153 template<class T>
154 inline 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 
161 inline bool Environment::AddVariable(const char* variableName, const String& value)
162 {
163  return Data::GetInstance().AddDefaultVariable(variableName, value);
164 }
165 
166 template<class T>
167 inline 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 
174 inline 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
181 inline 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 
192 inline bool Environment::Data::GetDefaultVariableValue(const char* variableName, const char*& pResult)const
193 {
194  return GetVariableValueFrom(this->environmentVariables, variableName, pResult);
195 }
196 
197 inline 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:214
std::int64_t int64
The Arp integer type of 8 byte size.
Definition: PrimitiveTypes.hpp:41
Arp::BasicString< char8 > String
The Arp String class.
Definition: TypeSystem.h:27
@ 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.