YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
NestedContact.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
8
9using namespace yarp::os;
10
11namespace {
12YARP_OS_LOG_COMPONENT(NESTEDCONTACT, "yarp.os.NestedContact" )
13}
14
16{
17public:
18 bool fromString(const std::string& nFullName);
19
20 std::string fullName;
21 std::string nodeName;
22 std::string nestedName;
23 std::string category;
24 std::string wireType;
25
26 void dump()
27 {
28 yCTrace(NESTEDCONTACT, "fullName = %s", fullName.c_str());
29 yCTrace(NESTEDCONTACT, "nodeName = %s", nodeName.c_str());
30 yCTrace(NESTEDCONTACT, "nestedName = %s", nestedName.c_str());
31 yCTrace(NESTEDCONTACT, "category = %s", category.c_str());
32 yCTrace(NESTEDCONTACT, "wireType = %s", wireType.c_str());
33 }
34};
35
37{
39 std::string::size_type idx2 = fullName.find(":/");
40 if (idx2 != std::string::npos) {
41 fullName = fullName.substr(idx2 + 2, fullName.length());
42 }
44 nestedName = "";
45 category = "";
46 std::string::size_type idx = fullName.find('~');
47 if (idx != std::string::npos) {
48 // We have a type name squeezed in here, into what promises
49 // to be a very full port name.
50 wireType = fullName.substr(idx + 1, fullName.length());
51 fullName = fullName.substr(0, idx);
52 }
53 idx = fullName.find('@');
54 if (idx != std::string::npos) {
55 // Great! Looks like we are using a new syntax suggested
56 // by Lorenzo Natale, /topic@/node
57 nestedName = fullName.substr(0, idx);
58 nodeName = fullName.substr(idx + 1, fullName.length());
59 char ch = nestedName[nestedName.length() - 1];
60 if (ch == '-' || ch == '+' || ch == '1') {
61 size_t offset = 1;
62 bool ok = true;
63 if (ch == '1') {
64 ok = false;
65 if (nestedName.length() >= 2) {
66 char ch0 = nestedName[nestedName.length() - 2];
67 if (ch0 == '-' || ch0 == '+') {
68 offset++;
69 category += ch0;
70 ok = true;
71 }
72 }
73 }
74 if (ok) {
75 category += ch;
76 nestedName = nestedName.substr(0, nestedName.length() - offset);
77 }
78 }
79 return true;
80 }
81 idx = fullName.find('=');
82 if (idx != std::string::npos) {
83 nodeName = fullName.substr(0, idx);
84 nestedName = fullName.substr(idx + 1, fullName.length());
85 idx = nestedName.find('/');
86 if (idx != std::string::npos) {
87 if (idx == 0) {
88 return true;
89 }
90 category = nestedName.substr(0, idx);
91 nestedName = nestedName.substr(idx, nestedName.length());
92 return true;
93 }
94 }
95 idx = fullName.find('#');
96 if (idx != std::string::npos) {
97 nodeName = fullName.substr(0, idx);
98 nestedName = fullName.substr(idx + 1, fullName.length());
99 char ch = nodeName[nodeName.length() - 1];
100 if (ch == '-' || ch == '+') {
101 category += ch;
102 nodeName = nodeName.substr(0, nodeName.length() - 1);
103 }
104 return true;
105 }
106 return false;
107}
108
109
111 mPriv(new Private())
112{
113}
114
115NestedContact::NestedContact(const std::string& fullName) :
116 mPriv(new Private())
117{
118 fromString(fullName);
119}
120
122 mPriv(new Private(*(rhs.mPriv)))
123{
124}
125
127 mPriv(rhs.mPriv)
128{
129 rhs.mPriv = nullptr;
130}
131
133{
134 delete mPriv;
135}
136
138{
139 if (&rhs != this) {
140 *mPriv = *(rhs.mPriv);
141 }
142 return *this;
143}
144
146{
147 if (&rhs != this) {
148 std::swap(mPriv, rhs.mPriv);
149 }
150 return *this;
151}
152
153bool NestedContact::fromString(const std::string& fullName)
154{
155 auto ret = mPriv->fromString(fullName);
156 mPriv->dump();
157 return ret;
158
159}
160
161void NestedContact::setTypeName(const std::string& nWireType)
162{
163 mPriv->wireType = nWireType;
164}
165
167{
168 mPriv->category = "+";
169}
170
172{
173 mPriv->category = "-";
174}
175
176std::string NestedContact::getFullName() const
177{
178 return mPriv->fullName;
179}
180
181std::string NestedContact::getNodeName() const
182{
183 return mPriv->nodeName;
184}
185
187{
188 return mPriv->nestedName;
189}
190
191std::string NestedContact::getCategory() const
192{
193 return mPriv->category;
194}
195
196std::string NestedContact::getTypeName() const
197{
198 return mPriv->wireType;
199}
200
202{
203 return (!mPriv->wireType.empty()) ? mPriv->wireType : "*";
204}
205
207{
208 return !mPriv->nestedName.empty();
209}
210
211std::string NestedContact::toString() const
212{
213 return mPriv->nestedName + mPriv->category + "@" + mPriv->nodeName;
214}
bool ret
bool fromString(const std::string &nFullName)
A mini-server for performing network communication in the background.
A placeholder for rich contact information.
std::string getFullName() const
bool fromString(const std::string &nFullName)
std::string getNodeName() const
NestedContact()
Default constructor.
NestedContact & operator=(const NestedContact &rhs)
Copy assignment operator.
std::string toString() const
std::string getNestedName() const
void setTypeName(const std::string &nWireType)
std::string getTypeName() const
std::string getCategory() const
std::string getTypeNameStar() const
#define yCTrace(component,...)
#define YARP_OS_LOG_COMPONENT(name, name_string)
An interface to the operating system, including Port based communication.