00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 #include "binary_serialization.h" 00012 00013 #include <opc/ua/protocol/attribute_ids.h> 00014 #include <opc/ua/protocol/expanded_object_ids.h> 00015 #include <opc/ua/protocol/binary/stream.h> 00016 #include <opc/ua/protocol/types.h> 00017 #include <opc/ua/protocol/node_management.h> 00018 #include <opc/ua/protocol/string_utils.h> 00019 00020 #include <algorithm> 00021 #include <memory> 00022 #include <string> 00023 #include <iostream> 00024 00025 namespace OpcUa 00026 { 00027 00028 00029 NodeAttributes::NodeAttributes(const ObjectAttributes& attr) 00030 { 00031 Header.TypeId = ExpandedObjectId::ObjectAttribute; 00032 Header.Encoding = static_cast<ExtensionObjectEncoding>(Header.Encoding | ExtensionObjectEncoding::HAS_BINARY_BODY); 00033 00034 std::bitset<32> specattr; 00035 specattr.set(SpecifiedAttributesEncoding::DisplayName); 00036 specattr.set(SpecifiedAttributesEncoding::Description); 00037 specattr.set(SpecifiedAttributesEncoding::EventNotifier); 00038 specattr.set(SpecifiedAttributesEncoding::WriteMask); 00039 specattr.set(SpecifiedAttributesEncoding::UserWriteMask); 00040 SpecifiedAttributes = (uint32_t) specattr.to_ulong(); 00041 00042 Attributes[AttributeId::DisplayName] = attr.DisplayName; 00043 Attributes[AttributeId::Description] = attr.Description; 00044 Attributes[AttributeId::EventNotifier] = attr.EventNotifier; 00045 Attributes[AttributeId::WriteMask] = attr.WriteMask; 00046 Attributes[AttributeId::UserWriteMask] = attr.UserWriteMask; 00047 } 00048 00049 NodeAttributes::NodeAttributes(const VariableAttributes& attr) 00050 { 00051 Header.TypeId = ExpandedObjectId::VariableAttribute; 00052 Header.Encoding = static_cast<ExtensionObjectEncoding>(Header.Encoding | ExtensionObjectEncoding::HAS_BINARY_BODY); 00053 00054 std::bitset<32> specattr; 00055 specattr.set(SpecifiedAttributesEncoding::DisplayName); 00056 specattr.set(SpecifiedAttributesEncoding::Description); 00057 specattr.set(SpecifiedAttributesEncoding::Value); 00058 specattr.set(SpecifiedAttributesEncoding::DataType); 00059 specattr.set(SpecifiedAttributesEncoding::ValueRank); 00060 specattr.set(SpecifiedAttributesEncoding::ArrayDimensions); 00061 specattr.set(SpecifiedAttributesEncoding::AccessLevel); 00062 specattr.set(SpecifiedAttributesEncoding::UserAccessLevel); 00063 specattr.set(SpecifiedAttributesEncoding::MinimumSamplingInterval); 00064 specattr.set(SpecifiedAttributesEncoding::Historizing); 00065 specattr.set(SpecifiedAttributesEncoding::WriteMask); 00066 specattr.set(SpecifiedAttributesEncoding::UserWriteMask); 00067 SpecifiedAttributes = (uint32_t) specattr.to_ulong(); 00068 00069 Attributes[AttributeId::DisplayName] = attr.DisplayName; 00070 Attributes[AttributeId::Description] = attr.Description; 00071 Attributes[AttributeId::Value] = attr.Value; 00072 Attributes[AttributeId::DataType] = attr.Type; 00073 Attributes[AttributeId::ValueRank] = attr.Rank; 00074 Attributes[AttributeId::ArrayDimensions] = attr.Dimensions; 00075 Attributes[AttributeId::AccessLevel] = static_cast<uint8_t>(attr.AccessLevel); 00076 Attributes[AttributeId::UserAccessLevel] = static_cast<uint8_t>(attr.UserAccessLevel); 00077 Attributes[AttributeId::MinimumSamplingInterval] = attr.MinimumSamplingInterval; 00078 Attributes[AttributeId::Historizing] = attr.Historizing; 00079 Attributes[AttributeId::WriteMask] = attr.WriteMask; 00080 Attributes[AttributeId::UserWriteMask] = attr.UserWriteMask; 00081 } 00082 00083 NodeAttributes::NodeAttributes(const MethodAttributes& attr) 00084 { 00085 Header.TypeId = ExpandedObjectId::MethodAttribute; 00086 Header.Encoding = static_cast<ExtensionObjectEncoding>(Header.Encoding | ExtensionObjectEncoding::HAS_BINARY_BODY); 00087 00088 std::bitset<32> specattr; 00089 specattr.set(SpecifiedAttributesEncoding::DisplayName); 00090 specattr.set(SpecifiedAttributesEncoding::Description); 00091 specattr.set(SpecifiedAttributesEncoding::Executable); 00092 specattr.set(SpecifiedAttributesEncoding::UserExecutable); 00093 specattr.set(SpecifiedAttributesEncoding::WriteMask); 00094 specattr.set(SpecifiedAttributesEncoding::UserWriteMask); 00095 SpecifiedAttributes = (uint32_t) specattr.to_ulong(); 00096 00097 Attributes[AttributeId::DisplayName] = attr.DisplayName; 00098 Attributes[AttributeId::Description] = attr.Description; 00099 Attributes[AttributeId::Executable] = attr.Executable; 00100 Attributes[AttributeId::UserExecutable] = attr.UserExecutable; 00101 Attributes[AttributeId::WriteMask] = attr.WriteMask; 00102 Attributes[AttributeId::UserWriteMask] = attr.UserWriteMask; 00103 } 00104 NodeAttributes::NodeAttributes(const ObjectTypeAttributes& attr) 00105 { 00106 Header.TypeId = ExpandedObjectId::ObjectTypeAttribute; 00107 Header.Encoding = static_cast<ExtensionObjectEncoding>(Header.Encoding | ExtensionObjectEncoding::HAS_BINARY_BODY); 00108 00109 std::bitset<32> specattr; 00110 specattr.set(SpecifiedAttributesEncoding::DisplayName); 00111 specattr.set(SpecifiedAttributesEncoding::Description); 00112 specattr.set(SpecifiedAttributesEncoding::IsAbstract); 00113 specattr.set(SpecifiedAttributesEncoding::WriteMask); 00114 specattr.set(SpecifiedAttributesEncoding::UserWriteMask); 00115 SpecifiedAttributes = (uint32_t) specattr.to_ulong(); 00116 00117 Attributes[AttributeId::DisplayName] = attr.DisplayName; 00118 Attributes[AttributeId::Description] = attr.Description; 00119 Attributes[AttributeId::IsAbstract] = attr.IsAbstract; 00120 Attributes[AttributeId::WriteMask] = attr.WriteMask; 00121 Attributes[AttributeId::UserWriteMask] = attr.UserWriteMask; 00122 } 00123 00124 NodeAttributes::NodeAttributes(const VariableTypeAttributes& attr) 00125 { 00126 Header.TypeId = ExpandedObjectId::VariableTypeAttribute; 00127 Header.Encoding = static_cast<ExtensionObjectEncoding>(Header.Encoding | ExtensionObjectEncoding::HAS_BINARY_BODY); 00128 00129 std::bitset<32> specattr; 00130 specattr.set(SpecifiedAttributesEncoding::DisplayName); 00131 specattr.set(SpecifiedAttributesEncoding::Description); 00132 specattr.set(SpecifiedAttributesEncoding::Value); 00133 specattr.set(SpecifiedAttributesEncoding::DataType); 00134 specattr.set(SpecifiedAttributesEncoding::ValueRank); 00135 specattr.set(SpecifiedAttributesEncoding::ArrayDimensions); 00136 specattr.set(SpecifiedAttributesEncoding::IsAbstract); 00137 specattr.set(SpecifiedAttributesEncoding::WriteMask); 00138 specattr.set(SpecifiedAttributesEncoding::UserWriteMask); 00139 SpecifiedAttributes = (uint32_t) specattr.to_ulong(); 00140 00141 Attributes[AttributeId::DisplayName] = attr.DisplayName; 00142 Attributes[AttributeId::Description] = attr.Description; 00143 Attributes[AttributeId::Value] = attr.Value; 00144 Attributes[AttributeId::DataType] = attr.Type; 00145 Attributes[AttributeId::ValueRank] = attr.Rank; 00146 Attributes[AttributeId::IsAbstract] = attr.IsAbstract; 00147 Attributes[AttributeId::ArrayDimensions] = attr.Dimensions; 00148 Attributes[AttributeId::WriteMask] = attr.WriteMask; 00149 Attributes[AttributeId::UserWriteMask] = attr.UserWriteMask; 00150 } 00151 00152 NodeAttributes::NodeAttributes(const ReferenceTypeAttributes& attr) 00153 { 00154 Header.TypeId = ExpandedObjectId::ReferenceTypeAttribute; 00155 Header.Encoding = static_cast<ExtensionObjectEncoding>(Header.Encoding | ExtensionObjectEncoding::HAS_BINARY_BODY); 00156 00157 std::bitset<32> specattr; 00158 specattr.set(SpecifiedAttributesEncoding::DisplayName); 00159 specattr.set(SpecifiedAttributesEncoding::Description); 00160 specattr.set(SpecifiedAttributesEncoding::IsAbstract); 00161 specattr.set(SpecifiedAttributesEncoding::Symmetric); 00162 specattr.set(SpecifiedAttributesEncoding::WriteMask); 00163 specattr.set(SpecifiedAttributesEncoding::UserWriteMask); 00164 if (!attr.IsAbstract) 00165 specattr.set(SpecifiedAttributesEncoding::InverseName); 00166 SpecifiedAttributes = (uint32_t) specattr.to_ulong(); 00167 00168 Attributes[AttributeId::DisplayName] = attr.DisplayName; 00169 Attributes[AttributeId::Description] = attr.Description; 00170 Attributes[AttributeId::IsAbstract] = attr.IsAbstract; 00171 Attributes[AttributeId::Symmetric] = attr.Symmetric; 00172 Attributes[AttributeId::WriteMask] = attr.WriteMask; 00173 Attributes[AttributeId::UserWriteMask] = attr.UserWriteMask; 00174 if (!attr.IsAbstract) 00175 Attributes[AttributeId::InverseName] = attr.InverseName; 00176 } 00177 00178 NodeAttributes::NodeAttributes(const DataTypeAttributes& attr) 00179 { 00180 Header.TypeId = ExpandedObjectId::DataTypeAttribute; 00181 Header.Encoding = static_cast<ExtensionObjectEncoding>(Header.Encoding | ExtensionObjectEncoding::HAS_BINARY_BODY); 00182 00183 std::bitset<32> specattr; 00184 specattr.set(SpecifiedAttributesEncoding::DisplayName); 00185 specattr.set(SpecifiedAttributesEncoding::Description); 00186 specattr.set(SpecifiedAttributesEncoding::IsAbstract); 00187 specattr.set(SpecifiedAttributesEncoding::WriteMask); 00188 specattr.set(SpecifiedAttributesEncoding::UserWriteMask); 00189 SpecifiedAttributes = (uint32_t) specattr.to_ulong(); 00190 00191 Attributes[AttributeId::DisplayName] = attr.DisplayName; 00192 Attributes[AttributeId::Description] = attr.Description; 00193 Attributes[AttributeId::IsAbstract] = attr.IsAbstract; 00194 Attributes[AttributeId::WriteMask] = attr.WriteMask; 00195 Attributes[AttributeId::UserWriteMask] = attr.UserWriteMask; 00196 } 00197 00198 NodeAttributes::NodeAttributes(const ViewAttributes& attr) 00199 { 00200 Header.TypeId = ExpandedObjectId::ViewAttribute; 00201 Header.Encoding = static_cast<ExtensionObjectEncoding>(Header.Encoding | ExtensionObjectEncoding::HAS_BINARY_BODY); 00202 00203 std::bitset<32> specattr; 00204 specattr.set(SpecifiedAttributesEncoding::DisplayName); 00205 specattr.set(SpecifiedAttributesEncoding::Description); 00206 specattr.set(SpecifiedAttributesEncoding::ContainsNoLoops); 00207 specattr.set(SpecifiedAttributesEncoding::WriteMask); 00208 specattr.set(SpecifiedAttributesEncoding::UserWriteMask); 00209 SpecifiedAttributes = (uint32_t) specattr.to_ulong(); 00210 00211 Attributes[AttributeId::DisplayName] = attr.DisplayName; 00212 Attributes[AttributeId::Description] = attr.Description; 00213 Attributes[AttributeId::ContainsNoLoops] = attr.ContainsNoLoops; 00214 Attributes[AttributeId::WriteMask] = attr.WriteMask; 00215 Attributes[AttributeId::UserWriteMask] = attr.UserWriteMask; 00216 } 00217 00218 00219 00220 AddNodesRequest::AddNodesRequest() 00221 : TypeId(ADD_NODES_REQUEST) 00222 { 00223 } 00224 00225 AddNodesResponse::AddNodesResponse() 00226 : TypeId(ADD_NODES_RESPONSE) 00227 { 00228 } 00229 00230 AddReferencesRequest::AddReferencesRequest() 00231 : TypeId(ADD_REFERENCES_REQUEST) 00232 { 00233 } 00234 00235 AddReferencesResponse::AddReferencesResponse() 00236 : TypeId(ADD_REFERENCES_RESPONSE) 00237 { 00238 } 00239 00240 namespace Binary 00241 { 00242 00243 // 00244 //AddNodeRequest 00245 // 00246 /* 00247 template<> 00248 std::size_t RawSize<ObjectAttributes>(const ObjectAttributes& val) 00249 { 00250 return RawSize(val.SpecifiedAttributes) + 00251 RawSize(val.DisplayName) + 00252 RawSize(val.Description) + 00253 RawSize(val.EventNotifier) + 00254 RawSize(val.WriteMask) + 00255 RawSize(val.UserWriteMask) 00256 ; 00257 } 00258 00259 template<> 00260 void DataSerializer::Serialize<ObjectAttributes>(const ObjectAttributes& val) 00261 { 00262 *this << val.SpecifiedAttributes; 00263 *this << val.DisplayName; 00264 *this << val.Description; 00265 *this << val.EventNotifier; 00266 *this << val.WriteMask; 00267 *this << val.UserWriteMask; 00268 } 00269 00270 template<> 00271 void DataDeserializer::Deserialize<ObjectAttributes>(ObjectAttributes& val) 00272 { 00273 *this >> val.SpecifiedAttributes; 00274 *this >> val.DisplayName; 00275 *this >> val.Description; 00276 *this >> val.EventNotifier; 00277 *this >> val.WriteMask; 00278 *this >> val.UserWriteMask; 00279 } 00280 00281 template<> 00282 std::size_t RawSize<VariableAttributes>(const VariableAttributes& val) 00283 { 00284 return RawSize(val.SpecifiedAttributes) + 00285 RawSize(val.DisplayName) + 00286 RawSize(val.Description) + 00287 RawSize(val.Value) + 00288 RawSize(val.Type) + 00289 RawSize(val.Rank) + 00290 RawSizeContainer(val.Dimensions) + 00291 RawSize((uint8_t)val.AccessLevel) + 00292 RawSize((uint8_t)val.UserAccessLevel) + 00293 RawSize(val.MinimumSamplingInterval) + 00294 RawSize(val.Historizing) + 00295 RawSize(val.WriteMask) + 00296 RawSize(val.UserWriteMask) 00297 ; 00298 } 00299 00300 template<> 00301 void DataSerializer::Serialize<VariableAttributes>(const VariableAttributes& val) 00302 { 00303 *this << val.SpecifiedAttributes; 00304 *this << val.DisplayName; 00305 *this << val.Description; 00306 *this << val.Value; 00307 *this << val.Type; 00308 *this << val.Rank; 00309 *this << val.Dimensions; 00310 *this << (uint8_t)val.AccessLevel; // TODO 00311 *this << (uint8_t)val.UserAccessLevel; //TODO 00312 *this << val.MinimumSamplingInterval; 00313 *this << val.Historizing; 00314 *this << val.WriteMask; 00315 *this << val.UserWriteMask; 00316 } 00317 00318 template<> 00319 void DataDeserializer::Deserialize<VariableAttributes>(VariableAttributes& val) 00320 { 00321 *this >> val.SpecifiedAttributes; 00322 *this >> val.DisplayName; 00323 *this >> val.Description; 00324 *this >> val.Value; 00325 *this >> val.Type; 00326 *this >> val.Rank; 00327 *this >> val.Dimensions; 00328 uint8_t tmp = 0; 00329 *this >> tmp; val.AccessLevel = static_cast<VariableAccessLevel>(tmp); 00330 *this >> tmp; val.UserAccessLevel = static_cast<VariableAccessLevel>(tmp); 00331 *this >> val.MinimumSamplingInterval; 00332 *this >> val.Historizing; 00333 *this >> val.WriteMask; 00334 *this >> val.UserWriteMask; 00335 } 00336 00337 00338 template<> 00339 std::size_t RawSize<MethodAttributes>(const MethodAttributes& val) 00340 { 00341 return RawSize(val.SpecifiedAttributes) + 00342 RawSize(val.DisplayName) + 00343 RawSize(val.Description) + 00344 RawSize(val.Executable) + 00345 RawSize(val.UserExecutable) + 00346 RawSize(val.WriteMask) + 00347 RawSize(val.UserWriteMask) 00348 ; 00349 } 00350 00351 template<> 00352 void DataSerializer::Serialize<MethodAttributes>(const MethodAttributes& val) 00353 { 00354 *this << val.SpecifiedAttributes; 00355 *this << val.DisplayName; 00356 *this << val.Description; 00357 *this << val.Executable; 00358 *this << val.UserExecutable; 00359 *this << val.WriteMask; 00360 *this << val.UserWriteMask; 00361 } 00362 00363 template<> 00364 void DataDeserializer::Deserialize<MethodAttributes>(MethodAttributes& val) 00365 { 00366 *this >> val.SpecifiedAttributes; 00367 *this >> val.DisplayName; 00368 *this >> val.Description; 00369 *this >> val.Executable; 00370 *this >> val.UserExecutable; 00371 *this >> val.WriteMask; 00372 *this >> val.UserWriteMask; 00373 } 00374 00375 template<> 00376 std::size_t RawSize<ObjectTypeAttributes>(const ObjectTypeAttributes& val) 00377 { 00378 return RawSize(val.SpecifiedAttributes) + 00379 RawSize(val.DisplayName) + 00380 RawSize(val.Description) + 00381 RawSize(val.IsAbstract) + 00382 RawSize(val.WriteMask) + 00383 RawSize(val.UserWriteMask) 00384 ; 00385 } 00386 00387 template<> 00388 void DataSerializer::Serialize<ObjectTypeAttributes>(const ObjectTypeAttributes& val) 00389 { 00390 *this << val.SpecifiedAttributes; 00391 *this << val.DisplayName; 00392 *this << val.Description; 00393 *this << val.IsAbstract; 00394 *this << val.WriteMask; 00395 *this << val.UserWriteMask; 00396 } 00397 00398 template<> 00399 void DataDeserializer::Deserialize<ObjectTypeAttributes>(ObjectTypeAttributes& val) 00400 { 00401 *this >> val.SpecifiedAttributes; 00402 *this >> val.DisplayName; 00403 *this >> val.Description; 00404 *this >> val.IsAbstract; 00405 *this >> val.WriteMask; 00406 *this >> val.UserWriteMask; 00407 } 00408 00409 00410 template<> 00411 std::size_t RawSize<VariableTypeAttributes>(const VariableTypeAttributes& val) 00412 { 00413 return RawSize(val.SpecifiedAttributes) + 00414 RawSize(val.DisplayName) + 00415 RawSize(val.Description) + 00416 RawSize(val.Value) + 00417 RawSize(val.Type) + 00418 RawSize(val.Rank) + 00419 RawSizeContainer(val.Dimensions) + 00420 RawSize(val.IsAbstract) + 00421 RawSize(val.WriteMask) + 00422 RawSize(val.UserWriteMask) 00423 ; 00424 } 00425 00426 template<> 00427 void DataSerializer::Serialize<VariableTypeAttributes>(const VariableTypeAttributes& val) 00428 { 00429 *this << val.SpecifiedAttributes; 00430 *this << val.DisplayName; 00431 *this << val.Description; 00432 *this << val.Value; 00433 *this << val.Type; 00434 *this << val.Rank; 00435 *this << val.Dimensions; 00436 *this << val.IsAbstract; 00437 *this << val.WriteMask; 00438 *this << val.UserWriteMask; 00439 } 00440 00441 template<> 00442 void DataDeserializer::Deserialize<VariableTypeAttributes>(VariableTypeAttributes& val) 00443 { 00444 *this >> val.SpecifiedAttributes; 00445 *this >> val.DisplayName; 00446 *this >> val.Description; 00447 *this >> val.Value; 00448 *this >> val.Type; 00449 *this >> val.Rank; 00450 *this >> val.Dimensions; 00451 *this >> val.IsAbstract; 00452 *this >> val.WriteMask; 00453 *this >> val.UserWriteMask; 00454 } 00455 00456 00457 template<> 00458 std::size_t RawSize<ReferenceTypeAttributes>(const ReferenceTypeAttributes& val) 00459 { 00460 return RawSize(val.SpecifiedAttributes) + 00461 RawSize(val.DisplayName) + 00462 RawSize(val.Description) + 00463 RawSize(val.IsAbstract) + 00464 RawSize(val.Symmetric) + 00465 RawSize(val.InverseName) + 00466 RawSize(val.WriteMask) + 00467 RawSize(val.UserWriteMask) 00468 ; 00469 } 00470 00471 template<> 00472 void DataSerializer::Serialize<ReferenceTypeAttributes>(const ReferenceTypeAttributes& val) 00473 { 00474 *this << val.SpecifiedAttributes; 00475 *this << val.DisplayName; 00476 *this << val.Description; 00477 *this << val.IsAbstract; 00478 *this << val.Symmetric; 00479 *this << val.InverseName; 00480 *this << val.WriteMask; 00481 *this << val.UserWriteMask; 00482 } 00483 00484 template<> 00485 void DataDeserializer::Deserialize<ReferenceTypeAttributes>(ReferenceTypeAttributes& val) 00486 { 00487 *this >> val.SpecifiedAttributes; 00488 *this >> val.DisplayName; 00489 *this >> val.Description; 00490 *this >> val.IsAbstract; 00491 *this >> val.Symmetric; 00492 *this >> val.InverseName; 00493 *this >> val.WriteMask; 00494 *this >> val.UserWriteMask; 00495 } 00496 00497 00498 template<> 00499 std::size_t RawSize<DataTypeAttributes>(const DataTypeAttributes& val) 00500 { 00501 return RawSize(val.SpecifiedAttributes) + 00502 RawSize(val.DisplayName) + 00503 RawSize(val.Description) + 00504 RawSize(val.IsAbstract) + 00505 RawSize(val.WriteMask) + 00506 RawSize(val.UserWriteMask) 00507 ; 00508 } 00509 00510 template<> 00511 void DataSerializer::Serialize<DataTypeAttributes>(const DataTypeAttributes& val) 00512 { 00513 *this << val.SpecifiedAttributes; 00514 *this << val.DisplayName; 00515 *this << val.Description; 00516 *this << val.IsAbstract; 00517 *this << val.WriteMask; 00518 *this << val.UserWriteMask; 00519 } 00520 00521 template<> 00522 void DataDeserializer::Deserialize<DataTypeAttributes>(DataTypeAttributes& val) 00523 { 00524 *this >> val.SpecifiedAttributes; 00525 *this >> val.DisplayName; 00526 *this >> val.Description; 00527 *this >> val.IsAbstract; 00528 *this >> val.WriteMask; 00529 *this >> val.UserWriteMask; 00530 } 00531 00532 template<> 00533 std::size_t RawSize<ViewAttributes>(const ViewAttributes& val) 00534 { 00535 return RawSize(val.SpecifiedAttributes) + 00536 RawSize(val.DisplayName) + 00537 RawSize(val.Description) + 00538 RawSize(val.ContainsNoLoops) + 00539 RawSize(val.WriteMask) + 00540 RawSize(val.UserWriteMask) 00541 ; 00542 } 00543 00544 template<> 00545 void DataSerializer::Serialize<ViewAttributes>(const ViewAttributes& val) 00546 { 00547 *this << val.SpecifiedAttributes; 00548 *this << val.DisplayName; 00549 *this << val.Description; 00550 *this << val.ContainsNoLoops; 00551 *this << val.WriteMask; 00552 *this << val.UserWriteMask; 00553 } 00554 00555 // TODO Seems doesn't required because there is serialization of NodeAttributes 00556 // TODO Exact attributes have to be initialized from node attributes which will serialize. 00557 template<> 00558 void DataDeserializer::Deserialize<ViewAttributes>(ViewAttributes& val) 00559 { 00560 *this >> val.SpecifiedAttributes; 00561 *this >> val.DisplayName; 00562 *this >> val.Description; 00563 *this >> val.ContainsNoLoops; 00564 *this >> val.WriteMask; 00565 *this >> val.UserWriteMask; 00566 } 00567 */ 00568 00569 00570 std::size_t RawSizeBodyNodeAttributes(const NodeAttributes& val) 00571 { 00572 size_t total = 0; 00573 total += RawSize(val.SpecifiedAttributes); 00574 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::DisplayName)) 00575 { 00576 total += RawSize(val.Attributes.find(AttributeId::DisplayName)->second.As<LocalizedText>()); //We assume the attr exists!!! 00577 } 00578 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Description)) 00579 { 00580 total += RawSize(val.Attributes.find(AttributeId::Description)->second.As<LocalizedText>()); 00581 } 00582 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::EventNotifier)) 00583 { 00584 total += 1;//RawSize(val.Attributes.find(AttributeId::EventNotifier)->second.Value.U); 00585 } 00586 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Value)) 00587 { 00588 total += RawSize(val.Attributes.find(AttributeId::Value)->second); 00589 } 00590 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::DataType)) 00591 { 00592 total += RawSize(val.Attributes.find(AttributeId::DataType)->second.As<NodeId>()); 00593 } 00594 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::ValueRank)) 00595 { 00596 total += 4; 00597 } 00598 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::ArrayDimensions)) 00599 { 00600 total += RawSizeContainer(val.Attributes.find(AttributeId::ArrayDimensions)->second.As<std::vector<uint32_t>>()); 00601 } 00602 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::AccessLevel)) 00603 { 00604 total += 1; 00605 } 00606 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::UserAccessLevel)) 00607 { 00608 total += 1; 00609 } 00610 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::MinimumSamplingInterval)) 00611 { 00612 total += sizeof(double); 00613 } 00614 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Historizing)) 00615 { 00616 total += sizeof(bool); 00617 } 00618 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Executable)) 00619 { 00620 } 00621 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::UserExecutable)) 00622 { 00623 } 00624 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::IsAbstract)) 00625 { 00626 } 00627 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Symmetric)) 00628 { 00629 } 00630 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::InverseName)) 00631 { 00632 } 00633 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::ContainsNoLoops)) 00634 { 00635 } 00636 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::WriteMask)) 00637 { 00638 total += 4; 00639 } 00640 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::UserWriteMask)) 00641 { 00642 total += 4; 00643 } 00644 00645 return total; 00646 00647 } 00648 00649 00650 template<> 00651 std::size_t RawSize<NodeAttributes>(const NodeAttributes& val) 00652 { 00653 size_t total = 0; 00654 total += RawSize(val.Header); 00655 total += 4 ; //uint32_t size body 00656 total += RawSizeBodyNodeAttributes(val) ; 00657 return total; 00658 } 00659 00660 00661 00662 template<> 00663 void DataSerializer::Serialize<NodeAttributes>(const NodeAttributes& val) 00664 { 00665 *this << val.Header; 00666 *this << (int32_t) RawSizeBodyNodeAttributes(val); //debug 00667 *this << val.SpecifiedAttributes; 00668 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::DisplayName)) 00669 { 00670 *this << val.Attributes.find(AttributeId::DisplayName)->second.As<LocalizedText>(); 00671 } 00672 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Description)) 00673 { 00674 *this << val.Attributes.find(AttributeId::Description)->second.As<LocalizedText>(); 00675 } 00676 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::WriteMask)) 00677 { 00678 *this << val.Attributes.find(AttributeId::WriteMask)->second.As<uint32_t>(); 00679 } 00680 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::UserWriteMask)) 00681 { 00682 *this << val.Attributes.find(AttributeId::UserWriteMask)->second.As<uint32_t>(); 00683 } 00684 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::EventNotifier)) 00685 { 00686 *this << (uint8_t) val.Attributes.find(AttributeId::EventNotifier)->second.As<uint8_t>(); 00687 } 00688 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Value)) 00689 { 00690 *this << val.Attributes.find(AttributeId::Value)->second; 00691 } 00692 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::DataType)) 00693 { 00694 *this << val.Attributes.find(AttributeId::DataType)->second.As<NodeId>(); 00695 } 00696 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::ValueRank)) 00697 { 00698 *this << val.Attributes.find(AttributeId::ValueRank)->second.As<int32_t>(); 00699 } 00700 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::ArrayDimensions)) 00701 { 00702 *this << val.Attributes.find(AttributeId::ArrayDimensions)->second.As<std::vector<uint32_t>>(); 00703 } 00704 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::AccessLevel)) 00705 { 00706 *this << val.Attributes.find(AttributeId::AccessLevel)->second.As<uint8_t>(); 00707 } 00708 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::UserAccessLevel)) 00709 { 00710 *this << val.Attributes.find(AttributeId::UserAccessLevel)->second.As<uint8_t>(); 00711 } 00712 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::MinimumSamplingInterval)) 00713 { 00714 *this << val.Attributes.find(AttributeId::MinimumSamplingInterval)->second.As<double>(); 00715 } 00716 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Historizing)) 00717 { 00718 *this << val.Attributes.find(AttributeId::Historizing)->second.As<bool>(); 00719 } 00720 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Executable)) 00721 { 00722 *this << val.Attributes.find(AttributeId::Executable)->second.As<bool>(); 00723 } 00724 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::UserExecutable)) 00725 { 00726 *this << val.Attributes.find(AttributeId::UserExecutable)->second.As<bool>(); 00727 } 00728 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::IsAbstract)) 00729 { 00730 *this << val.Attributes.find(AttributeId::IsAbstract)->second.As<bool>(); 00731 } 00732 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Symmetric)) 00733 { 00734 *this << val.Attributes.find(AttributeId::Symmetric)->second.As<bool>(); 00735 } 00736 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::InverseName)) 00737 { 00738 *this << val.Attributes.find(AttributeId::InverseName)->second.As<LocalizedText>(); 00739 } 00740 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::ContainsNoLoops)) 00741 { 00742 *this << val.Attributes.find(AttributeId::ContainsNoLoops)->second.As<bool>(); 00743 } 00744 00745 } 00746 00747 template<> 00748 void DataDeserializer::Deserialize<NodeAttributes>(NodeAttributes& val) 00749 { 00750 *this >> val.Header; 00751 int32_t size; 00752 *this >> size ; // not used yet 00753 *this >> val.SpecifiedAttributes; 00754 00755 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::DisplayName)) 00756 { 00757 LocalizedText tmp; 00758 *this >> tmp; 00759 val.Attributes[AttributeId::DisplayName] = tmp; 00760 } 00761 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Description)) 00762 { 00763 LocalizedText tmp; 00764 *this >> tmp; 00765 val.Attributes[AttributeId::Description] = tmp; 00766 } 00767 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::WriteMask)) 00768 { 00769 uint32_t tmp; 00770 *this >> tmp; 00771 val.Attributes[AttributeId::WriteMask] = tmp; 00772 } 00773 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::UserWriteMask)) 00774 { 00775 uint32_t tmp; 00776 *this >> tmp; 00777 val.Attributes[AttributeId::UserWriteMask] = tmp; 00778 } 00779 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::EventNotifier)) 00780 { 00781 uint8_t tmp; 00782 *this >> tmp; 00783 val.Attributes[AttributeId::EventNotifier] = tmp; 00784 } 00785 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Value)) 00786 { 00787 Variant tmp; 00788 *this >> tmp; 00789 val.Attributes[AttributeId::Value] = tmp; 00790 } 00791 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::DataType)) 00792 { 00793 NodeId tmp; 00794 *this >> tmp; 00795 val.Attributes[AttributeId::DataType] = tmp; 00796 } 00797 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::ValueRank)) 00798 { 00799 int32_t tmp; 00800 *this >> tmp; 00801 val.Attributes[AttributeId::ValueRank] = tmp; 00802 } 00803 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::ArrayDimensions)) 00804 { 00805 std::vector<uint32_t> tmp; 00806 *this >> tmp; 00807 val.Attributes[AttributeId::ArrayDimensions] = tmp; 00808 } 00809 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::AccessLevel)) 00810 { 00811 uint8_t tmp; 00812 *this >> tmp; 00813 val.Attributes[AttributeId::AccessLevel] = tmp; 00814 } 00815 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::UserAccessLevel)) 00816 { 00817 uint8_t tmp; 00818 *this >> tmp; 00819 val.Attributes[AttributeId::UserAccessLevel] = tmp; 00820 } 00821 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::MinimumSamplingInterval)) 00822 { 00823 Duration tmp; 00824 *this >> tmp; 00825 val.Attributes[AttributeId::MinimumSamplingInterval] = tmp; 00826 } 00827 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Historizing)) 00828 { 00829 bool tmp; 00830 *this >> tmp; 00831 val.Attributes[AttributeId::Historizing] = tmp; 00832 } 00833 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Executable)) 00834 { 00835 } 00836 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::UserExecutable)) 00837 { 00838 } 00839 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::IsAbstract)) 00840 { 00841 } 00842 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::Symmetric)) 00843 { 00844 } 00845 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::InverseName)) 00846 { 00847 } 00848 if (std::bitset<32>(val.SpecifiedAttributes).test(SpecifiedAttributesEncoding::ContainsNoLoops)) 00849 { 00850 } 00851 00852 } 00853 00854 template<> 00855 std::size_t RawSize<AddNodesItem>(const AddNodesItem& resp) 00856 { 00857 return RawSize(resp.ParentNodeId) + 00858 RawSize(resp.ReferenceTypeId) + 00859 RawSize(resp.RequestedNewNodeId) + 00860 RawSize(resp.BrowseName) + 00861 RawSize(resp.Class) + 00862 RawSize(resp.Attributes) + 00863 RawSize(resp.TypeDefinition); 00864 } 00865 00866 template<> 00867 void DataSerializer::Serialize<AddNodesItem>(const AddNodesItem& resp) 00868 { 00869 *this << resp.ParentNodeId; 00870 *this << resp.ReferenceTypeId; 00871 *this << resp.RequestedNewNodeId; 00872 *this << resp.BrowseName; 00873 *this << resp.Class; 00874 *this << resp.Attributes; 00875 *this << resp.TypeDefinition; 00876 } 00877 00878 template<> 00879 void DataDeserializer::Deserialize<AddNodesItem>(AddNodesItem& resp) 00880 { 00881 *this >> resp.ParentNodeId; 00882 *this >> resp.ReferenceTypeId; 00883 *this >> resp.RequestedNewNodeId; 00884 *this >> resp.BrowseName; 00885 *this >> resp.Class; 00886 *this >> resp.Attributes; 00887 *this >> resp.TypeDefinition; 00888 } 00889 00890 template<> 00891 std::size_t RawSize(const std::vector<AddNodesItem>& ack) 00892 { 00893 return RawSizeContainer(ack); 00894 } 00895 00896 00897 template<> 00898 void DataDeserializer::Deserialize<std::vector<AddNodesItem>>(std::vector<AddNodesItem>& ack) 00899 { 00900 DeserializeContainer(*this, ack); 00901 } 00902 00903 template<> 00904 void DataSerializer::Serialize<std::vector<AddNodesItem>>(const std::vector<AddNodesItem>& ack) 00905 { 00906 SerializeContainer(*this, ack); 00907 } 00908 00909 template<> 00910 std::size_t RawSize<AddNodesParameters>(const AddNodesParameters& val) 00911 { 00912 return RawSize(val.NodesToAdd); 00913 } 00914 00915 template<> 00916 void DataSerializer::Serialize<AddNodesParameters>(const AddNodesParameters& val) 00917 { 00918 *this << val.NodesToAdd; 00919 } 00920 00921 template<> 00922 void DataDeserializer::Deserialize<AddNodesParameters>(AddNodesParameters& resp) 00923 { 00924 *this >> resp.NodesToAdd; 00925 } 00926 00927 00928 00929 template<> 00930 std::size_t RawSize<AddNodesRequest>(const AddNodesRequest& resp) 00931 { 00932 return RawSize(resp.TypeId) + RawSize(resp.Header) + RawSize(resp.Parameters); 00933 } 00934 00935 template<> 00936 void DataSerializer::Serialize<AddNodesRequest>(const AddNodesRequest& resp) 00937 { 00938 *this << resp.TypeId; 00939 *this << resp.Header; 00940 *this << resp.Parameters; 00941 } 00942 00943 template<> 00944 void DataDeserializer::Deserialize<AddNodesRequest>(AddNodesRequest& resp) 00945 { 00946 *this >> resp.TypeId; 00947 *this >> resp.Header; 00948 *this >> resp.Parameters; 00949 } 00950 00951 template<> 00952 std::size_t RawSize<AddNodesResult>(const AddNodesResult& resp) 00953 { 00954 return RawSize(resp.Status) + RawSize(resp.AddedNodeId); 00955 } 00956 00957 template<> 00958 void DataSerializer::Serialize<AddNodesResult>(const AddNodesResult& resp) 00959 { 00960 *this << resp.Status; 00961 *this << resp.AddedNodeId; 00962 } 00963 00964 template<> 00965 void DataDeserializer::Deserialize<AddNodesResult>(AddNodesResult& resp) 00966 { 00967 *this >> resp.Status; 00968 *this >> resp.AddedNodeId; 00969 } 00970 00971 00972 template<> 00973 void DataDeserializer::Deserialize<std::vector<AddNodesResult>>(std::vector<AddNodesResult>& ack) 00974 { 00975 DeserializeContainer(*this, ack); 00976 } 00977 00978 template<> 00979 void DataSerializer::Serialize<std::vector<AddNodesResult>>(const std::vector<AddNodesResult>& ack) 00980 { 00981 SerializeContainer(*this, ack); 00982 } 00983 00984 00985 00986 00987 00988 00989 template<> 00990 std::size_t RawSize<AddNodesResponse>(const AddNodesResponse& resp) 00991 { 00992 return RawSize(resp.TypeId) + RawSize(resp.Header) + RawSizeContainer(resp.results) + RawSize(resp.Diagnostics); 00993 } 00994 00995 template<> 00996 void DataSerializer::Serialize<AddNodesResponse>(const AddNodesResponse& resp) 00997 { 00998 *this << resp.TypeId; 00999 *this << resp.Header; 01000 *this << resp.results; 01001 *this << resp.Diagnostics; 01002 } 01003 01004 template<> 01005 void DataDeserializer::Deserialize<AddNodesResponse>(AddNodesResponse& resp) 01006 { 01007 *this >> resp.TypeId; 01008 *this >> resp.Header; 01009 *this >> resp.results; 01010 *this >> resp.Diagnostics; 01011 } 01012 01013 01014 // 01015 // AddReferences 01016 // 01017 01018 01019 01020 01021 template<> 01022 std::size_t RawSize<AddReferencesResponse>(const AddReferencesResponse& resp) 01023 { 01024 return RawSize(resp.TypeId) + RawSize(resp.Header) + RawSizeContainer(resp.Results) + RawSize(resp.Diagnostics); 01025 } 01026 01027 template<> 01028 void DataSerializer::Serialize<AddReferencesResponse>(const AddReferencesResponse& resp) 01029 { 01030 *this << resp.TypeId; 01031 *this << resp.Header; 01032 *this << resp.Results; 01033 *this << resp.Diagnostics; 01034 } 01035 01036 template<> 01037 void DataDeserializer::Deserialize<AddReferencesResponse>(AddReferencesResponse& resp) 01038 { 01039 *this >> resp.TypeId; 01040 *this >> resp.Header; 01041 *this >> resp.Results; 01042 *this >> resp.Diagnostics; 01043 } 01044 01045 template<> 01046 std::size_t RawSize<AddReferencesItem>(const AddReferencesItem& val) 01047 { 01048 return RawSize(val.SourceNodeId) + 01049 RawSize(val.ReferenceTypeId) + 01050 RawSize(val.IsForward) + 01051 RawSize(val.TargetServerUri) + 01052 RawSize(val.TargetNodeId) + 01053 RawSize(val.TargetNodeClass) 01054 ; 01055 } 01056 01057 template<> 01058 void DataSerializer::Serialize<AddReferencesItem>(const AddReferencesItem& val) 01059 { 01060 *this << val.SourceNodeId; 01061 *this << val.ReferenceTypeId; 01062 *this << val.IsForward; 01063 *this << val.TargetServerUri; 01064 *this << val.TargetNodeId; 01065 *this << val.TargetNodeClass; 01066 } 01067 01068 template<> 01069 void DataDeserializer::Deserialize<AddReferencesItem>(AddReferencesItem& val) 01070 { 01071 *this >> val.SourceNodeId; 01072 *this >> val.ReferenceTypeId; 01073 *this >> val.IsForward; 01074 *this >> val.TargetServerUri; 01075 *this >> val.TargetNodeId; 01076 *this >> val.TargetNodeClass; 01077 } 01078 01079 template<> 01080 std::size_t RawSize(const std::vector<AddReferencesItem>& ack) 01081 { 01082 return RawSizeContainer(ack); 01083 } 01084 01085 01086 01087 template<> 01088 void DataDeserializer::Deserialize<std::vector<AddReferencesItem>>(std::vector<AddReferencesItem>& ack) 01089 { 01090 DeserializeContainer(*this, ack); 01091 } 01092 01093 template<> 01094 void DataSerializer::Serialize<std::vector<AddReferencesItem>>(const std::vector<AddReferencesItem>& ack) 01095 { 01096 SerializeContainer(*this, ack); 01097 } 01098 01099 01100 template<> 01101 std::size_t RawSize<AddReferencesParameters>(const AddReferencesParameters& val) 01102 { 01103 return RawSizeContainer(val.ReferencesToAdd); 01104 } 01105 01106 template<> 01107 void DataSerializer::Serialize<AddReferencesParameters>(const AddReferencesParameters& val) 01108 { 01109 *this << val.ReferencesToAdd; 01110 } 01111 01112 template<> 01113 void DataDeserializer::Deserialize<AddReferencesParameters>(AddReferencesParameters& val) 01114 { 01115 *this >> val.ReferencesToAdd; 01116 } 01117 01118 01119 01120 01121 template<> 01122 std::size_t RawSize<AddReferencesRequest>(const AddReferencesRequest& val) 01123 { 01124 return RawSize(val.TypeId) + RawSize(val.Header) + 01125 RawSize(val.Parameters) 01126 ; 01127 } 01128 01129 template<> 01130 void DataSerializer::Serialize<AddReferencesRequest>(const AddReferencesRequest& val) 01131 { 01132 *this << val.TypeId; 01133 *this << val.Header; 01134 *this << val.Parameters; 01135 } 01136 01137 template<> 01138 void DataDeserializer::Deserialize<AddReferencesRequest>(AddReferencesRequest& val) 01139 { 01140 *this >> val.TypeId; 01141 *this >> val.Header; 01142 *this >> val.Parameters; 01143 } 01144 01145 01146 01147 01148 } // namespace Binary 01149 01150 const char* GetObjectIdName(const NodeId& id) 01151 { 01152 if ( id == ObjectId::FolderType ) 01153 { 01154 return Names::FolderType; 01155 } 01156 else if ( id == ObjectId::BaseVariableType ) 01157 { 01158 return Names::BaseVariableType; 01159 } 01160 else if ( id == ObjectId::BaseDataVariableType ) 01161 { 01162 return Names::BaseDataVariableType; 01163 } 01164 else if ( id == ObjectId::PropertyType ) 01165 { 01166 return Names::PropertyType; 01167 } 01168 else if ( id == ObjectId::BaseObjectType ) 01169 { 01170 return Names::BaseObjectType; 01171 } 01172 else if (id == ObjectId::ModellingRule_Mandatory) 01173 { 01174 return Names::ModellingRule_Mandatory; 01175 } 01176 else if ( id == ObjectId::ServerType ) 01177 { 01178 return Names::ServerType; 01179 } 01180 return "NoNameFound"; 01181 } 01182 01183 }