nodeid.cpp
Go to the documentation of this file.
1 
11 #include "binary_serialization.h"
12 
14 #include <opc/ua/protocol/nodeid.h>
15 
16 #include <algorithm>
17 #include <stdexcept>
18 #include <iostream>
19 
20 namespace OpcUa
21 {
22 
23 
24 NodeId::NodeId(uint32_t integerId, uint16_t index)
25 {
27  NumericData.Identifier = integerId;
29 }
30 
31 NodeId::NodeId(std::string stringId, uint16_t index)
32 {
34  StringData.Identifier = stringId;
35  StringData.NamespaceIndex = index;
36 }
37 
38 bool NodeId::IsInteger() const
39 {
40  const NodeIdEncoding enc = GetEncodingValue();
41  return enc == EV_TWO_BYTE || enc == EV_FOUR_BYTE || enc == EV_NUMERIC;
42 }
43 
44 bool NodeId::IsString() const
45 {
46  const NodeIdEncoding enc = GetEncodingValue();
47  return enc == EV_STRING;
48 }
49 
50 bool NodeId::IsBinary() const
51 {
52  const NodeIdEncoding enc = GetEncodingValue();
53  return enc == EV_BYTE_STRING;
54 }
55 
56 bool NodeId::IsGuid() const
57 {
58  const NodeIdEncoding enc = GetEncodingValue();
59  return enc == EV_GUId;
60 }
61 
63 {
64  if (IsString())
65  {
66  return StringData.Identifier;
67  }
68 
69  throw std::logic_error("Node id is not in String format.");
70 }
71 
72 std::vector<uint8_t> NodeId::GetBinaryIdentifier() const
73 {
74  if (IsBinary())
75  {
76  return BinaryData.Identifier;
77  }
78 
79  throw std::logic_error("Node id is not in String format.");
80 }
81 
83 {
84  if (IsGuid())
85  {
86  return GuidData.Identifier;
87  }
88 
89  throw std::logic_error("Node id is not in String format.");
90 }
91 
93 {
94  switch (GetEncodingValue())
95  {
96  case EV_TWO_BYTE:
97  {
98  return TwoByteData.Identifier;
99  }
100 
101  case EV_FOUR_BYTE:
102  {
103  return FourByteData.Identifier;
104  }
105 
106  case EV_NUMERIC:
107  {
108  return NumericData.Identifier;
109  }
110 
111  default:
112  {
113  throw std::logic_error("Cannot get integer identifier from NodeId - it is not in numeric format.");
114  }
115  }
116 }
117 
119 {
120  switch (GetEncodingValue())
121  {
122  case EV_FOUR_BYTE:
124 
125  case EV_NUMERIC:
127 
128  case EV_STRING:
129  return StringData.NamespaceIndex;
130 
131  case EV_GUId:
132  return GuidData.NamespaceIndex;
133 
134  case EV_BYTE_STRING:
135  return BinaryData.NamespaceIndex;
136 
137  default:
138  return 0;
139  }
140 }
141 
142 void NodeId::SetNamespaceIndex(uint32_t ns)
143 {
144  switch (GetEncodingValue())
145  {
146  case EV_FOUR_BYTE:
148  return;
149 
150  case EV_NUMERIC:
152  return;
153 
154  case EV_STRING:
156  return;
157 
158  case EV_GUId:
160  return;
161 
162  case EV_BYTE_STRING:
164  return;
165 
166  default:
167  return;
168  }
169 }
170 
173  , ServerIndex(0)
174 {
175 }
176 
177 void NodeId::CopyNodeId(const NodeId & node)
178 {
179  Encoding = node.Encoding;
180  const NodeIdEncoding enc = node.GetEncodingValue();
181 
182  switch (enc)
183  {
184  case EV_TWO_BYTE:
185  {
187  break;
188  }
189 
190  case EV_FOUR_BYTE:
191  {
194  break;
195  }
196 
197  case EV_NUMERIC:
198  {
201  break;
202  }
203 
204  case EV_STRING:
205  {
208  break;
209  }
210 
211  case EV_GUId:
212  {
215  break;
216  }
217 
218  case EV_BYTE_STRING:
219  {
222  break;
223  }
224 
225  default:
226  {
227  throw std::logic_error("Invalid Node Id encoding value.");
228  }
229  }
230 
231  if (node.HasServerIndex())
232  {
233  ServerIndex = node.ServerIndex;
234  }
235 
236  if (node.HasNamespaceURI())
237  {
238  NamespaceURI = node.NamespaceURI;
239  }
240 
241 }
242 
243 NodeId::NodeId(const NodeId & node)
244 {
245  CopyNodeId(node);
246 }
247 
249 {
250  CopyNodeId(node);
251 }
252 
253 NodeId::operator ExpandedNodeId()
254 {
255  ExpandedNodeId node;
256  node.CopyNodeId(*this);
257 
258  return node;
259 }
260 
262 {
263  CopyNodeId(node);
264  return *this;
265 }
266 
268 {
269  CopyNodeId(node);
270  return *this;
271 }
272 
275  , ServerIndex(0)
276 {
277  FourByteData.Identifier = messageId;
278 }
279 
282  , ServerIndex(0)
283 {
284  NumericData.Identifier = static_cast<uint32_t>(referenceId);
285 }
286 
289  , ServerIndex(0)
290 {
291  NumericData.Identifier = static_cast<uint32_t>(objectId);
292 }
293 
296  , ServerIndex(0)
297 {
298  FourByteData.Identifier = static_cast<uint32_t>(objectId);
299 }
300 
302 {
303  return static_cast<MessageId>(id.GetIntegerIdentifier());
304 }
305 
306 
307 bool NodeId::operator== (const NodeId & node) const
308 {
309  if (GetNamespaceIndex() != node.GetNamespaceIndex())
310  {
311  return false;
312  }
313 
314  if (IsInteger() && node.IsInteger())
315  {
316  return GetIntegerIdentifier() == node.GetIntegerIdentifier();
317  }
318 
319  if (IsString() && node.IsString())
320  {
321  return GetStringIdentifier() == node.GetStringIdentifier();
322  }
323 
324  if (IsBinary() && node.IsBinary())
325  {
326  return GetBinaryIdentifier() == node.GetBinaryIdentifier();
327  }
328 
329  if (IsGuid() && node.IsGuid())
330  {
331  return GetGuidIdentifier() == node.GetGuidIdentifier();
332  }
333 
334  return false;
335 }
336 
337 bool NodeId::operator < (const NodeId & node) const
338 {
339  if (GetNamespaceIndex() != node.GetNamespaceIndex())
340  {
341  return GetNamespaceIndex() < node.GetNamespaceIndex();
342  }
343 
344  if (IsInteger() && node.IsInteger())
345  {
346  return GetIntegerIdentifier() < node.GetIntegerIdentifier();
347  }
348 
349  if (IsString() && node.IsString())
350  {
351  return GetStringIdentifier() < node.GetStringIdentifier();
352  }
353 
354  if (IsBinary() && node.IsBinary())
355  {
356  const std::vector<uint8_t> & l = GetBinaryIdentifier();
357  const std::vector<uint8_t> & r = node.GetBinaryIdentifier();
358  return std::lexicographical_compare(l.cbegin(), l.cend(), r.cbegin(), r.cend());
359  }
360 
361  if (IsGuid() && node.IsGuid())
362  {
363  return GetGuidIdentifier() < node.GetGuidIdentifier();
364  }
365 
366  return Encoding < node.Encoding; //FIXME Can we get there? and should we?
367 
368 }
369 
371 {
372  return static_cast<NodeIdEncoding>(Encoding & EV_VALUE_MASK);
373 }
374 
375 bool NodeId::IsNull() const
376 {
377  switch (GetEncodingValue())
378  {
379  case EV_TWO_BYTE:
380  break;
381 
382  case EV_FOUR_BYTE:
383  if (FourByteData.NamespaceIndex != 0)
384  { return false; }
385 
386  break;
387 
388  case EV_NUMERIC:
389  if (NumericData.NamespaceIndex != 0)
390  { return false; }
391 
392  break;
393 
394  case EV_STRING:
395  if (StringData.NamespaceIndex != 0)
396  { return false; }
397 
398  break;
399 
400  case EV_GUId:
401  if (GuidData.NamespaceIndex != 0)
402  { return false; }
403 
404  break;
405 
406  case EV_BYTE_STRING:
407  if (BinaryData.NamespaceIndex != 0)
408  { return false; }
409 
410  break;
411 
412  default:
413  {
414  throw std::logic_error("Invalid Node Id encoding value.");
415  }
416  }
417 
418  return HasNullIdentifier();
419 }
420 
422 {
423  switch (GetEncodingValue())
424  {
425  case EV_TWO_BYTE:
426  if (TwoByteData.Identifier != 0)
427  { return false; }
428 
429  break;
430 
431  case EV_FOUR_BYTE:
432  if (FourByteData.Identifier != 0)
433  { return false; }
434 
435  break;
436 
437  case EV_NUMERIC:
438  if (NumericData.Identifier != 0)
439  { return false; }
440 
441  break;
442 
443  case EV_STRING:
444  if (! StringData.Identifier.empty())
445  { return false; }
446 
447  break;
448 
449  case EV_GUId:
450  if (!(GuidData.Identifier == Guid()))
451  { return false; }
452 
453  break;
454 
455  case EV_BYTE_STRING:
456  if (! BinaryData.Identifier.empty())
457  { return false; }
458 
459  break;
460 
461  default:
462  {
463  throw std::logic_error("Invalid Node Id encoding value.");
464  }
465  }
466 
467  return true;
468 }
469 
471 {
472  return (Encoding & EV_NAMESPACE_URI_FLAG) != 0;
473 }
474 
476 {
477  return (Encoding & EV_Server_INDEX_FLAG) != 0;
478 }
479 
481 {
483  NamespaceURI = uri;
484 }
485 
486 void NodeId::SetServerIndex(uint32_t index)
487 {
489  ServerIndex = index;
490 }
491 
492 bool NodeId::operator!= (const NodeId & node) const
493 {
494  return !(*this == node);
495 }
496 
497 bool NodeId::operator!= (MessageId messageId) const
498 {
499  return !(*this == messageId);
500 }
501 
502 bool NodeId::operator!= (ReferenceId referenceId) const
503 {
504  return !(*this == referenceId);
505 }
506 
507 bool NodeId::operator!= (ObjectId objectId) const
508 {
509  return !(*this == objectId);
510 }
511 
513 {
514  return !(*this == objectId);
515 }
516 
517 
518 
519 bool NodeId::operator== (MessageId messageId) const
520 {
521  return *this == NodeId(messageId);
522 }
523 
524 bool NodeId::operator== (ReferenceId referenceId) const
525 {
526  return *this == NodeId(referenceId);
527 }
528 
529 bool NodeId::operator== (ObjectId messageId) const
530 {
531  return *this == NodeId(messageId);
532 }
533 
535 {
536  return *this == NodeId(messageId);
537 }
538 
539 
542 {
544  ServerIndex = 0;
545 }
546 
547 ExpandedNodeId::ExpandedNodeId(uint32_t integerId, uint16_t index)
548 {
550  NumericData.Identifier = integerId;
551  NumericData.NamespaceIndex = index;
552 }
553 
555 {
557  StringData.Identifier = stringId;
558  StringData.NamespaceIndex = index;
559 }
560 
562 {
563  CopyNodeId(node);
564 }
565 
567 {
568  CopyNodeId(node);
569 }
570 
571 
573 {
575  ServerIndex = 0;
576  FourByteData.Identifier = messageId;
577 }
578 
580 {
582  ServerIndex = 0;
583  NumericData.Identifier = static_cast<uint32_t>(referenceId);
584 }
585 
587 {
589  ServerIndex = 0;
590  NumericData.Identifier = static_cast<uint32_t>(objectId);
591 }
592 
594 {
596  ServerIndex = 0;
597  FourByteData.Identifier = static_cast<uint32_t>(objectId);
598 }
599 
600 
601 namespace Binary
602 {
603 template<>
605 {
606  return 1;
607 }
608 
609 template<>
610 void DataSerializer::Serialize<NodeIdEncoding>(const NodeIdEncoding & value)
611 {
612  *this << static_cast<uint8_t>(value);
613 }
614 
615 template<>
616 void DataDeserializer::Deserialize<NodeIdEncoding>(NodeIdEncoding & value)
617 {
618  uint8_t tmp = 0;
619  *this >> tmp;
620  value = static_cast<NodeIdEncoding>(tmp);
621 }
622 
623 template<>
624 std::size_t RawSize<NodeId>(const NodeId & id)
625 {
626  std::size_t size = 0;
627 
628  switch (id.GetEncodingValue())
629  {
630  case EV_TWO_BYTE:
631  {
632  size = 2;
633  break;
634  }
635 
636  case EV_FOUR_BYTE:
637  {
638  size = 4;
639  break;
640  }
641 
642  case EV_NUMERIC:
643  {
644  const std::size_t sizeofEncoding = 1;
645  const std::size_t sizeofNamespace = 2;
646  const std::size_t sizeofIdentifier = 4;
647  size = sizeofEncoding + sizeofNamespace + sizeofIdentifier;
648  break;
649  }
650 
651  case EV_STRING:
652  {
653  const std::size_t sizeofEncoding = 1;
654  const std::size_t sizeofSize = 4;
655  const std::size_t sizeofNamespace = 2;
656  size = sizeofEncoding + sizeofNamespace + sizeofSize + id.StringData.Identifier.size();
657  break;
658  }
659 
660  case EV_BYTE_STRING:
661  {
662  const std::size_t sizeofEncoding = 1;
663  const std::size_t sizeofSize = 4;
664  const std::size_t sizeofNamespace = 2;
665  size = sizeofEncoding + sizeofNamespace + sizeofSize + id.BinaryData.Identifier.size();
666  break;
667  }
668 
669  case EV_GUId:
670  {
671  const std::size_t sizeofEncoding = 1;
672  const std::size_t sizeofNamespace = 2;
673  const std::size_t sizeofGuid = 16;
674  size = sizeofEncoding + sizeofNamespace + sizeofGuid;
675  break;
676  }
677 
678  default:
679  throw std::logic_error("Unable serialize NodeId. Unknown encoding type.");
680  };
681 
682  return size;
683 }
684 
685 template<>
686 void DataSerializer::Serialize<OpcUa::NodeId>(const OpcUa::NodeId & id)
687 {
688  //unset server and namespace flags in encoding, they should only be used in ExpandedNode Id
689  uint8_t nodeid_encoding = id.Encoding;
690  nodeid_encoding &= ~EV_Server_INDEX_FLAG;
691  nodeid_encoding &= ~EV_NAMESPACE_URI_FLAG;
692 
693  *this << nodeid_encoding;
694 
695  switch (id.GetEncodingValue())
696  {
697  case EV_TWO_BYTE:
698  {
699  *this << id.TwoByteData.Identifier;
700  break;
701  }
702 
703  case EV_FOUR_BYTE:
704  {
705  *this << id.FourByteData.NamespaceIndex;
706  *this << id.FourByteData.Identifier;
707  break;
708  }
709 
710  case EV_NUMERIC:
711  {
712  *this << id.NumericData.NamespaceIndex;
713  *this << id.NumericData.Identifier;
714  break;
715  }
716 
717  case EV_STRING:
718  {
719  *this << id.StringData.NamespaceIndex;
720  *this << id.StringData.Identifier;
721  break;
722  }
723 
724  case EV_BYTE_STRING:
725  {
726  *this << id.BinaryData.NamespaceIndex;
727  *this << id.BinaryData.Identifier;
728  break;
729  }
730 
731  case EV_GUId:
732  {
733  *this << id.GuidData.NamespaceIndex;
734  *this << id.GuidData.Identifier;
735  break;
736  }
737 
738  default:
739  throw std::logic_error("Unable serialize NodeId. Unknown encoding type.");
740  };
741 
742 }
743 
744 template<>
745 void DataDeserializer::Deserialize<OpcUa::NodeId>(OpcUa::NodeId & id)
746 {
747  *this >> id.Encoding;
748 
749  switch (id.GetEncodingValue())
750  {
751  case EV_TWO_BYTE:
752  {
753  *this >> id.TwoByteData.Identifier;
754  break;
755  }
756 
757  case EV_FOUR_BYTE:
758  {
759  *this >> id.FourByteData.NamespaceIndex;
760  *this >> id.FourByteData.Identifier;
761  break;
762  }
763 
764  case EV_NUMERIC:
765  {
766  *this >> id.NumericData.NamespaceIndex;
767  *this >> id.NumericData.Identifier;
768  break;
769  }
770 
771  case EV_STRING:
772  {
773  *this >> id.StringData.NamespaceIndex;
774  *this >> id.StringData.Identifier;
775  break;
776  }
777 
778  case EV_BYTE_STRING:
779  {
780  *this >> id.BinaryData.NamespaceIndex;
781  *this >> id.BinaryData.Identifier;
782  break;
783  }
784 
785  case EV_GUId:
786  {
787  *this >> id.GuidData.NamespaceIndex;
788  *this >> id.GuidData.Identifier;
789  break;
790  }
791 
792  default:
793  {
794  throw std::logic_error("Unable to deserialize NodeId. Unknown encoding type received.");
795  }
796  };
797 
798  if (id.HasNamespaceURI())
799  {
800  *this >> id.NamespaceURI;
801  }
802 
803  if (id.HasServerIndex())
804  {
805  *this >> id.ServerIndex;
806  }
807 }
808 
809 template<>
811 {
812  std::size_t size = RawSize((NodeId)id);
813 
814  if (id.HasNamespaceURI())
815  {
816  const std::size_t sizeofSize = 4;
817  size += sizeofSize + id.NamespaceURI.size();
818  }
819 
820  if (id.HasServerIndex())
821  {
822  const std::size_t sizeofServerIndex = 4;
823  size += sizeofServerIndex;
824  }
825 
826  return size;
827 }
828 
829 template<>
830 void DataSerializer::Serialize<OpcUa::ExpandedNodeId>(const OpcUa::ExpandedNodeId & id)
831 {
832  *this << id.Encoding;
833 
834  switch (id.GetEncodingValue())
835  {
836  case EV_TWO_BYTE:
837  {
838  *this << id.TwoByteData.Identifier;
839  break;
840  }
841 
842  case EV_FOUR_BYTE:
843  {
844  *this << id.FourByteData.NamespaceIndex;
845  *this << id.FourByteData.Identifier;
846  break;
847  }
848 
849  case EV_NUMERIC:
850  {
851  *this << id.NumericData.NamespaceIndex;
852  *this << id.NumericData.Identifier;
853  break;
854  }
855 
856  case EV_STRING:
857  {
858  *this << id.StringData.NamespaceIndex;
859  *this << id.StringData.Identifier;
860  break;
861  }
862 
863  case EV_BYTE_STRING:
864  {
865  *this << id.BinaryData.NamespaceIndex;
866  *this << id.BinaryData.Identifier;
867  break;
868  }
869 
870  case EV_GUId:
871  {
872  *this << id.GuidData.NamespaceIndex;
873  *this << id.GuidData.Identifier;
874  break;
875  }
876 
877  default:
878  throw std::logic_error("Unable serialize ExpandedNodeId. Unknown encoding type.");
879  };
880 
881  if (id.HasNamespaceURI())
882  {
883  *this << id.NamespaceURI;
884  }
885 
886  if (id.HasServerIndex())
887  {
888  *this << id.ServerIndex;
889  }
890 }
891 
892 template<>
893 void DataDeserializer::Deserialize<OpcUa::ExpandedNodeId>(OpcUa::ExpandedNodeId & id)
894 {
895  *this >> *(NodeId *) &id;
896 }
897 
898 
899 } // namespace Binary
900 } // namespace OpcUa
901 
bool HasNullIdentifier() const
Definition: nodeid.cpp:421
struct OpcUa::NodeId::NumericDataType NumericData
bool operator==(const NodeId &node) const
Definition: nodeid.cpp:307
uint32_t GetNamespaceIndex() const
Definition: nodeid.cpp:118
bool IsInteger() const
Definition: nodeid.cpp:38
bool IsGuid() const
Definition: nodeid.cpp:56
std::size_t RawSize< NodeIdEncoding >(const NodeIdEncoding &)
Definition: nodeid.cpp:604
std::size_t RawSize< NodeId >(const NodeId &id)
Definition: nodeid.cpp:624
bool operator<(const NodeId &node) const
Definition: nodeid.cpp:337
std::size_t RawSize< ExpandedNodeId >(const ExpandedNodeId &id)
Definition: nodeid.cpp:810
bool IsBinary() const
Definition: nodeid.cpp:50
Guid GetGuidIdentifier() const
Definition: nodeid.cpp:82
bool HasNamespaceURI() const
Definition: nodeid.cpp:470
struct OpcUa::NodeId::GuidDataType GuidData
std::vector< uint8_t > GetBinaryIdentifier() const
Definition: nodeid.cpp:72
struct OpcUa::NodeId::TwoByteDataType TwoByteData
bool IsNull() const
Definition: nodeid.cpp:375
void SetNamespaceURI(const std::string &uri)
Definition: nodeid.cpp:480
uint32_t GetIntegerIdentifier() const
Definition: nodeid.cpp:92
void SetNamespaceIndex(uint32_t ns)
Definition: nodeid.cpp:142
ObjectId
Definition: object_ids.h:12
void SetServerIndex(uint32_t index)
Definition: nodeid.cpp:486
struct OpcUa::NodeId::BinaryDataType BinaryData
struct OpcUa::NodeId::FourByteDataType FourByteData
OPC UA Address space part. GNU LGPL.
ExpandedNodeId()
ExpandednNdeId.
Definition: nodeid.cpp:541
const char * Binary(const char *input, short n)
std::vector< uint8_t > Identifier
Definition: nodeid.h:101
void CopyNodeId(const NodeId &node)
Definition: nodeid.cpp:177
string uri
Definition: client.py:31
bool HasServerIndex() const
Definition: nodeid.cpp:475
NodeId & operator=(const NodeId &node)
Definition: nodeid.cpp:261
struct OpcUa::NodeId::StringDataType StringData
NodeIdEncoding
Definition: nodeid.h:27
uint32_t ServerIndex
Definition: nodeid.h:48
bool IsString() const
Definition: nodeid.cpp:44
NodeIdEncoding Encoding
Definition: nodeid.h:46
bool operator!=(const NodeId &node) const
Definition: nodeid.cpp:492
std::string GetStringIdentifier() const
Definition: nodeid.cpp:62
std::string NamespaceURI
Definition: nodeid.h:47
NodeIdEncoding GetEncodingValue() const
Definition: nodeid.cpp:370
MessageId GetMessageId(const NodeId &id)
Definition: nodeid.cpp:301
std::size_t RawSize(const T &obj)


ros_opcua_impl_freeopcua
Author(s): Denis Štogl
autogenerated on Tue Jan 19 2021 03:12:07