pvAccessCPP 7.1.8
Loading...
Searching...
No Matches
configuration.h
1
7#ifndef CONFIGURATION_H
8#define CONFIGURATION_H
9
10#include <string.h>
11#include <iostream>
12#include <sstream>
13#include <fstream>
14#include <map>
15#include <set>
16
17#ifdef epicsExportSharedSymbols
18# define configurationEpicsExportSharedSymbols
19# undef epicsExportSharedSymbols
20#endif
21
22#include <pv/pvType.h>
23#include <pv/noDefaultMethods.h>
24#include <pv/lock.h>
25#include <pv/sharedPtr.h>
26
27#include <envDefs.h>
28#ifdef configurationEpicsExportSharedSymbols
29# define epicsExportSharedSymbols
30# undef configurationEpicsExportSharedSymbols
31#endif
32
33#include <shareLib.h>
34
35union osiSockAddr; // defined in osiSock;
36
37namespace epics {
38namespace pvAccess {
39
40class ConfigurationStack;
41
45class epicsShareClass Configuration
46{
47 EPICS_NOT_COPYABLE(Configuration)
48public:
49 POINTER_DEFINITIONS(Configuration);
50
51 Configuration() {}
52 virtual ~Configuration() =0;
62 bool getPropertyAsBoolean(const std::string &name, const bool defaultValue) const;
72 epics::pvData::int32 getPropertyAsInteger(const std::string &name, const epics::pvData::int32 defaultValue) const;
82 float getPropertyAsFloat(const std::string &name, const float defaultValue) const;
92 double getPropertyAsDouble(const std::string &name, const double defaultValue) const;
102 std::string getPropertyAsString(const std::string &name, const std::string &defaultValue) const;
113 bool getPropertyAsAddress(const std::string& name, osiSockAddr* addr) const;
114
115 bool hasProperty(const std::string &name) const;
116
121 keys_t keys() const
122 {
123 keys_t ret;
124 addKeys(ret);
125 return ret;
126 }
127
128protected:
129 friend class ConfigurationStack;
130 virtual bool tryGetPropertyAsString(const std::string& name, std::string* val) const = 0;
131 virtual void addKeys(keys_t&) const {}
132};
133
135class epicsShareClass ConfigurationMap: public Configuration
136{
137 EPICS_NOT_COPYABLE(ConfigurationMap)
138public:
140 properties_t properties;
142 ConfigurationMap(const properties_t& p) :properties(p) {}
143 virtual ~ConfigurationMap() {}
144private:
145 virtual bool tryGetPropertyAsString(const std::string& name, std::string* val) const;
146 virtual void addKeys(keys_t&) const;
147};
148
150class epicsShareClass ConfigurationEnviron: public Configuration
151{
152 EPICS_NOT_COPYABLE(ConfigurationEnviron)
153public:
155 virtual ~ConfigurationEnviron() {}
156private:
157 virtual bool tryGetPropertyAsString(const std::string& name, std::string* val) const;
158};
159
161
164class epicsShareClass ConfigurationStack : public Configuration
165{
166 EPICS_NOT_COPYABLE(ConfigurationStack)
168 confs_t confs;
169 virtual bool tryGetPropertyAsString(const std::string& name, std::string* val) const;
170 virtual void addKeys(keys_t&) const;
171public:
173 virtual ~ConfigurationStack() {}
174 inline void push_back(const confs_t::value_type& conf) {
175 confs.push_back(conf);
176 }
177 inline confs_t::value_type pop_back() {
178 if(confs.empty())
179 throw std::runtime_error("Stack empty");
180 confs_t::value_type ret(confs.back());
181 confs.pop_back();
182 return ret;
183 }
184 inline size_t size() const {
185 return confs.size();
186 }
187};
188
189struct epicsShareClass ConfigurationBuilder
190{
191 ConfigurationBuilder();
192 ConfigurationBuilder& push_env();
193 ConfigurationBuilder& push_map();
194 ConfigurationBuilder& push_config(const Configuration::shared_pointer&);
195 template<typename V>
196 ConfigurationBuilder& add(const std::string& name, const V& val)
197 {
198 std::ostringstream strm;
199 strm<<val;
200 return _add(name, strm.str());
201 }
202 Configuration::shared_pointer build();
203private:
204 ConfigurationBuilder& _add(const std::string& name, const std::string& val);
205 ConfigurationMap::properties_t mymap;
206 std::tr1::shared_ptr<ConfigurationStack> stack;
207 friend ConfigurationBuilder& operator<<(ConfigurationBuilder&, const std::string& s);
208};
209
213class epicsShareClass ConfigurationProvider
214{
215 EPICS_NOT_COPYABLE(ConfigurationProvider)
216public:
217 POINTER_DEFINITIONS(ConfigurationProvider);
219 virtual ~ConfigurationProvider() {}
227 virtual Configuration::shared_pointer getConfiguration(const std::string &name) = 0;
234 virtual void registerConfiguration(const std::string &name, Configuration::shared_pointer const & configuration) = 0;
235};
236
237class ConfigurationProviderImpl: public ConfigurationProvider
238{
239 EPICS_NOT_COPYABLE(ConfigurationProviderImpl)
240public:
241 ConfigurationProviderImpl() {}
245 virtual ~ConfigurationProviderImpl() {}
246 Configuration::shared_pointer getConfiguration(const std::string &name);
247 void registerConfiguration(const std::string &name, Configuration::shared_pointer const & configuration);
248private:
249 epics::pvData::Mutex _mutex;
251};
252
256class epicsShareClass ConfigurationFactory
257{
258 EPICS_NOT_COPYABLE(ConfigurationFactory)
259public:
260 POINTER_DEFINITIONS(ConfigurationFactory);
261
270 static ConfigurationProvider::shared_pointer getProvider();
271 static void registerConfiguration(const std::string &name, Configuration::shared_pointer const & configuration)
272 {
273 getProvider()->registerConfiguration(name, configuration);
274 }
275 static Configuration::shared_pointer getConfiguration(const std::string& name)
276 {
277 return getProvider()->getConfiguration(name);
278 }
279
280private:
281 ConfigurationFactory() {};
282};
283
284}
285}
286
287#endif /* CONFIGURATION_H */
valarray< size_t > size() const
basic_ostream< _CharT, _Traits > & operator<<(basic_ostream< _CharT, _Traits > &__os, const basic_string< _CharT, _Traits, _Alloc > &__str)
constexpr void push_back(const value_type &__x)
constexpr void pop_back() noexcept
constexpr const_reference back() const noexcept
constexpr bool empty() const noexcept
constexpr size_type size() const noexcept
Lookup configuration strings from the process environment.
static ConfigurationProvider::shared_pointer getProvider()
Lazily creates configuration provider.
epics::pvData::int32 getPropertyAsInteger(const std::string &name, const epics::pvData::int32 defaultValue) const
Get the environment variable specified by name or return default value if it does not exist.
bool getPropertyAsAddress(const std::string &name, osiSockAddr *addr) const
Fetch and parse as a socket address and port number (address family set accordingly).
keys_t keys() const
Return a (partial) list of available key names.
double getPropertyAsDouble(const std::string &name, const double defaultValue) const
Get the environment variable specified by name or return default value if it does not exist.
float getPropertyAsFloat(const std::string &name, const float defaultValue) const
Get the environment variable specified by name or return default value if it does not exist.
std::string getPropertyAsString(const std::string &name, const std::string &defaultValue) const
Get the environment variable specified by name or return default value if it does not exist.
bool getPropertyAsBoolean(const std::string &name, const bool defaultValue) const
Get the environment variable specified by name or return default value if it does not exist.
Lookup configuration strings from an in memory store.
virtual void registerConfiguration(const std::string &name, Configuration::shared_pointer const &configuration)=0
Register configuration.
virtual Configuration::shared_pointer getConfiguration(const std::string &name)=0
Return configuration specified by name.
Lookup configuration strings from a heap of sub-Configurations.
Copyright - See the COPYRIGHT that is included with this distribution.