normativeTypesCPP 6.0.2
nturi.cpp
Go to the documentation of this file.
1/* nturi.cpp */
2/*
3 * Copyright information and license terms for this software can be
4 * found in the file LICENSE that is included with the distribution
5 */
6
7#include <algorithm>
8#include "validator.h"
9
10#define epicsExportSharedSymbols
11#include <pv/nturi.h>
12#include <pv/ntutils.h>
13
14using namespace std;
15using namespace epics::pvData;
16
17namespace epics { namespace nt {
18
19static NTFieldPtr ntField = NTField::get();
20
21namespace detail {
22
23
24NTURIBuilder::shared_pointer NTURIBuilder::addQueryString(std::string const & name)
25{
26 if (std::find(queryFieldNames.begin(), queryFieldNames.end(), name) != queryFieldNames.end())
27 throw std::runtime_error("duplicate query field name");
28
29 queryFieldNames.push_back(name);
30 queryTypes.push_back(pvString);
31
32 return shared_from_this();
33}
34
35NTURIBuilder::shared_pointer NTURIBuilder::addQueryDouble(std::string const & name)
36{
37 if (std::find(queryFieldNames.begin(), queryFieldNames.end(), name) != queryFieldNames.end())
38 throw std::runtime_error("duplicate query field name");
39
40 queryFieldNames.push_back(name);
41 queryTypes.push_back(pvDouble);
42
43 return shared_from_this();
44}
45
46NTURIBuilder::shared_pointer NTURIBuilder::addQueryInt(std::string const & name)
47{
48 if (std::find(queryFieldNames.begin(), queryFieldNames.end(), name) != queryFieldNames.end())
49 throw std::runtime_error("duplicate query field name");
50
51 queryFieldNames.push_back(name);
52 queryTypes.push_back(pvInt);
53
54 return shared_from_this();
55}
56
58{
59 FieldBuilderPtr builder = getFieldCreate()->
60 createFieldBuilder()->
61 setId(NTURI::URI)->
62 add("scheme", pvString);
63
64 if (authority)
65 builder->add("authority", pvString);
66
67 builder->add("path", pvString);
68
69 if (!queryFieldNames.empty())
70 {
71 FieldBuilderPtr nestedBuilder = builder->
72 addNestedStructure("query");
73
74 vector<string>::size_type len = queryFieldNames.size();
75 for (vector<string>::size_type i = 0; i < len; i++)
76 nestedBuilder->add(queryFieldNames[i], queryTypes[i]);
77
78 builder = nestedBuilder->endNested();
79 }
80
81 size_t extraCount = extraFieldNames.size();
82 for (size_t i = 0; i< extraCount; i++)
83 builder->add(extraFieldNames[i], extraFields[i]);
84
85 StructureConstPtr s = builder->createStructure();
86
87 reset();
88 return s;
89}
90
91NTURIBuilder::shared_pointer NTURIBuilder::addAuthority()
92{
93 authority = true;
94 return shared_from_this();
95}
96
98{
99 return getPVDataCreate()->createPVStructure(createStructure());
100}
101
106
107NTURIBuilder::NTURIBuilder()
108{
109 reset();
110}
111
112void NTURIBuilder::reset()
113{
114 queryFieldNames.clear();
115 queryTypes.clear();
116 authority = false;
117}
118
119NTURIBuilder::shared_pointer NTURIBuilder::add(string const & name, FieldConstPtr const & field)
120{
121 extraFields.push_back(field);
122 extraFieldNames.push_back(name);
123 return shared_from_this();
124}
125
126}
127
128const std::string NTURI::URI("epics:nt/NTURI:1.0");
129
130NTURI::shared_pointer NTURI::wrap(PVStructurePtr const & pvStructure)
131{
132 if(!isCompatible(pvStructure)) return shared_pointer();
133 return wrapUnsafe(pvStructure);
134}
135
136NTURI::shared_pointer NTURI::wrapUnsafe(PVStructurePtr const & pvStructure)
137{
138 return shared_pointer(new NTURI(pvStructure));
139}
140
141bool NTURI::is_a(StructureConstPtr const & structure)
142{
143 return NTUtils::is_a(structure->getID(), URI);
144}
145
146bool NTURI::is_a(PVStructurePtr const & pvStructure)
147{
148 return is_a(pvStructure->getStructure());
149}
150
151bool NTURI::isCompatible(StructureConstPtr const & structure)
152{
153 if (!structure)
154 return false;
155
156 Result result(structure);
157
158 result
159 .is<Structure>()
160 .has<Scalar>("scheme")
161 .has<Scalar>("path")
162 .maybeHas<Scalar>("authority")
163 .maybeHas<Structure>("query");
164
165 StructureConstPtr query(structure->getField<Structure>("query"));
166 if (query) {
167 Result r(query);
168 StringArray const & names(query->getFieldNames());
169 StringArray::const_iterator it;
170
171 for (it = names.begin(); it != names.end(); ++it)
172 r.has<ScalarArray>(*it);
173
174 result |= r;
175 }
176
177 return result.valid();
178}
179
180
181bool NTURI::isCompatible(PVStructurePtr const & pvStructure)
182{
183 if(!pvStructure) return false;
184
185 return isCompatible(pvStructure->getStructure());
186}
187
189{
190 return true;
191}
192
197
198
199PVStructurePtr NTURI::getPVStructure() const
200{
201 return pvNTURI;
202}
203
204
205PVStringPtr NTURI::getScheme() const
206{
207 return pvNTURI->getSubField<PVString>("scheme");
208}
209
210PVStringPtr NTURI::getAuthority() const
211{
212 return pvNTURI->getSubField<PVString>("authority");
213}
214
215PVStringPtr NTURI::getPath() const
216{
217 return pvNTURI->getSubField<PVString>("path");
218}
219
220PVStructurePtr NTURI::getQuery() const
221{
222 return pvNTURI->getSubField<PVStructure>("query");
223}
224
225StringArray const & NTURI::getQueryNames() const
226{
227 return pvNTURI->getSubField<PVStructure>("query")->getStructure()->getFieldNames();
228}
229
230PVFieldPtr NTURI::getQueryField(std::string const & name) const
231{
232 return pvNTURI->getSubField("query." + name);
233}
234
235NTURI::NTURI(PVStructurePtr const & pvStructure) :
236 pvNTURI(pvStructure)
237{}
238
239
240}}
static NTFieldPtr get()
Definition ntfield.cpp:18
Convenience Class for NTURI.
Definition nturi.h:137
static bool isCompatible(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVStringPtr getPath() const
Definition nturi.cpp:215
epics::pvData::PVStringPtr getAuthority() const
Definition nturi.cpp:210
static const std::string URI
Definition nturi.h:141
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const &pvStructure)
Definition nturi.cpp:136
static bool is_a(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVFieldPtr getQueryField(std::string const &name) const
Definition nturi.cpp:230
static NTURIBuilderPtr createBuilder()
Definition nturi.cpp:193
epics::pvData::PVStringPtr getScheme() const
Definition nturi.cpp:205
static shared_pointer wrap(epics::pvData::PVStructurePtr const &pvStructure)
Definition nturi.cpp:130
epics::pvData::PVStructurePtr getQuery() const
Definition nturi.cpp:220
epics::pvData::PVStructurePtr getPVStructure() const
Definition nturi.cpp:199
epics::pvData::StringArray const & getQueryNames() const
Definition nturi.cpp:225
static bool is_a(const std::string &u1, const std::string &u2)
Definition ntutils.cpp:14
Interface for in-line creating of NTURI.
Definition nturi.h:42
epics::pvData::PVStructurePtr createPVStructure()
Definition nturi.cpp:97
shared_pointer addQueryInt(std::string const &name)
Definition nturi.cpp:46
shared_pointer addAuthority()
Definition nturi.cpp:91
shared_pointer add(std::string const &name, epics::pvData::FieldConstPtr const &field)
Definition nturi.cpp:119
friend class ::epics::nt::NTURI
Definition nturi.h:122
shared_pointer addQueryString(std::string const &name)
Definition nturi.cpp:24
shared_pointer addQueryDouble(std::string const &name)
Definition nturi.cpp:35
epics::pvData::StructureConstPtr createStructure()
Definition nturi.cpp:57
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition ntfield.h:36
std::tr1::shared_ptr< detail::NTURIBuilder > NTURIBuilderPtr
Definition nturi.h:127
std::tr1::shared_ptr< NTURI > NTURIPtr
Definition nturi.h:29