PLCnext API Documentation  20.6.0.30321
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: // setup/dispose operations
24  static void Setup(void);
25  static void SetupSettings(int core);
26  static void SetupTrustStore(const std::vector<String>& trustStorePaths, const String& trustStoreEditPath);
27  static void SetupIdentityStore(const std::vector<String>& identityStorePaths, const String& identityStoreEditPath);
28  static void Dispose(void);
29 
30 public: // static operations
31  static int64 GetTickCount(void);
32  static Endianness GetEndianness(void);
33  static String GetVariable(const char* variableName);
34  template<class T>
35  static bool GetVariableValue(const char* variableName, T& result);
36  static bool GetVariableValue(const char* variableName, String& value);
37  template<class T>
38  static bool GetDefaultVariableValue(const char* variableName, T& result);
39  static bool GetDefaultVariableValue(const char* variableName, String& value);
40  template<class T>
41  static bool AddVariable(const char* variableName, const T& value);
42  static bool AddVariable(const char* variableName, const String& value);
43  template<class T>
44  static bool AddOverriddenVariable(const char* variableName, const T& value);
45  static bool AddOverriddenVariable(const char* variableName, const String& value);
46  static bool SetVariable(const char* variableName, const String& value);
47 
48 private: // static methods
49  static void RegisterEnvironmentVariables(void);
50  static bool RegisterEnvironmentVariable(const String& name, const char* value);
51 
52 
53 private: // nested class EnvData
54  class Data : public AppDomainSingleton<Data>
55  {
56  friend class Environment;
57 
58  public: // typedefs
59  using VariableNames = std::set<String>; // <name>
60  using EnvironmentVariables = std::map<String, String>; // <name, value>
61 
62  public: // Constructors
63  Data(void) = default;
64  ~Data(void) = default;
65 
66  public: // operations
67  bool AddDefaultVariable(const char* variableName, const String& value);
68  bool AddOverriddenVariable(const char* variableName, const String& value);
69  bool SetDefaultVariable(const char* variableName, const String& value);
70  bool SetOverriddenVariable(const char* variableName, const String& value);
71  bool GetCurrentVariableValue(const char* variableName, const char*& pResult)const;
72  bool GetDefaultVariableValue(const char* variableName, const char*& pResult)const;
73  bool GetOverriddenVariableValue(const char* variableName, const char*& pResult)const;
74 
75  private: // methods
76  void GetVariableNames(VariableNames& result);
77 
78  private: // static methods
79  static bool GetVariableValueFrom(const EnvironmentVariables& items, const char* variableName, const char*& pResult);
80 
81  private: //fields
82  EnvironmentVariables environmentVariables;
83  EnvironmentVariables overriddenVariables;
84  };
85 };
86 
88 // inline methods of class Environment
89 inline int64 Environment::GetTickCount()
90 {
91  return duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count();
92 }
93 
94 inline Endianness Environment::GetEndianness(void)
95 {
96  return Endianness::Current;
97 }
98 
99 template<class T>
100 inline bool Environment::GetVariableValue(const char* variableName, T& result)
101 {
102  String value;
103  if (!GetVariableValue(variableName, value))
104  {
105  return false;
106  }
107  // else
108  std::istringstream iss(value.CStr());
109  iss >> boolalpha >> result;
110  return !iss.fail();
111 }
112 
113 inline String Environment::GetVariable(const char* variableName)
114 {
115  String result;
116  if (GetVariableValue(variableName, result))
117  {
118  return result;
119  }
120  // else
121  return String::Empty;
122 }
123 
124 template<class T>
125 inline bool Environment::GetDefaultVariableValue(const char* variableName, T& result)
126 {
127  String value;
128  if (!GetDefaultVariableValue(variableName, value))
129  {
130  return false;
131  }
132  // else
133  std::istringstream iss(value.CStr());
134  iss >> boolalpha >> result;
135  return !iss.fail();
136 }
137 
138 template<class T>
139 inline bool Environment::AddVariable(const char* variableName, const T& value)
140 {
141  std::stringstream ss;
142  ss << boolalpha << value;
143  return Environment::AddVariable(variableName, String(ss.str()));
144 }
145 
146 inline bool Environment::AddVariable(const char* variableName, const String& value)
147 {
148  return Data::GetInstance().AddDefaultVariable(variableName, value);
149 }
150 
151 template<class T>
152 inline bool Environment::AddOverriddenVariable(const char* variableName, const T& value)
153 {
154  std::stringstream ss;
155  ss << boolalpha << value;
156  return Environment::AddOverriddenVariable(variableName, String(ss.str()));
157 }
158 
159 inline bool Environment::AddOverriddenVariable(const char* variableName, const String& value)
160 {
161  return Data::GetInstance().AddOverriddenVariable(variableName, value);
162 }
163 
165 // inline methods of class Environment::Data
166 inline bool Environment::Data::GetCurrentVariableValue(const char* variableName, const char*& pResult)const
167 {
168  // try to get value from overrides
169  if (GetOverriddenVariableValue(variableName, pResult))
170  {
171  return true;
172  }
173  // else try to get default value
174  return GetDefaultVariableValue(variableName, pResult);
175 }
176 
177 inline bool Environment::Data::GetDefaultVariableValue(const char* variableName, const char*& pResult)const
178 {
179  return GetVariableValueFrom(this->environmentVariables, variableName, pResult);
180 }
181 
182 inline bool Environment::Data::GetOverriddenVariableValue(const char* variableName, const char*& pResult)const
183 {
184  return GetVariableValueFrom(this->overriddenVariables, variableName, pResult);
185 }
186 
187 }}} // end of namespace Arp::System::Commons
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