binary_raw_size.cpp
Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 #include <opc/ua/protocol/binary/stream.h>
00012 #include <opc/ua/protocol/secure_channel.h>
00013 #include <opc/ua/protocol/types.h>
00014 
00015 #include <algorithm>
00016 #include <stdexcept>
00017 
00018 namespace OpcUa
00019 {
00020   namespace Binary
00021   {
00022     template<>
00023     std::size_t RawSize<bool>(const bool&)
00024     {
00025       return 1;
00026     }
00027 
00028     template<>
00029     std::size_t RawSize<uint8_t>(const uint8_t&)
00030     {
00031       return 1;
00032     }
00033 
00034     template<>
00035     std::size_t RawSize<int8_t>(const int8_t&)
00036     {
00037       return 1;
00038     }
00039 
00040     template<>
00041     std::size_t RawSize<uint16_t>(const uint16_t&)
00042     {
00043       return 2;
00044     }
00045 
00046     template<>
00047     std::size_t RawSize<int16_t>(const int16_t&)
00048     {
00049       return 2;
00050     }
00051 
00052     template<>
00053     std::size_t RawSize<uint32_t>(const uint32_t&)
00054     {
00055       return 4;
00056     }
00057 
00058     template<>
00059     std::size_t RawSize<int32_t>(const int32_t&)
00060     {
00061       return 4;
00062     }
00063 
00064 
00065     template<>
00066     std::size_t RawSize<uint64_t>(const uint64_t&)
00067     {
00068       return 8;
00069     }
00070 
00071     template<>
00072     std::size_t RawSize<int64_t>(const int64_t&)
00073     {
00074       return 8;
00075     }
00076 
00077     template<>
00078     std::size_t RawSize<float>(const float&)
00079     {
00080       return 4;
00081     }
00082 
00083     template<>
00084     std::size_t RawSize<double>(const double&)
00085     {
00086       return 8;
00087     }
00088 
00089     template<>
00090     std::size_t RawSize<Guid>(const Guid&)
00091     {
00092       return 16;
00093     }
00094 
00095     template<>
00096     std::size_t RawSize<StatusCode>(const StatusCode&)
00097     {
00098       return 4;
00099     }
00100 
00101     template<>
00102     std::size_t RawSize<std::string>(const std::string& str)
00103     {
00104       const std::size_t headerSize = 4;
00105       return headerSize + str.size();
00106     }
00107 
00108     template<>
00109     std::size_t RawSize<ByteString>(const ByteString& str)
00110     {
00111       const std::size_t headerSize = 4;
00112       return headerSize + str.Data.size();
00113     }
00114 
00115     template<>
00116     std::size_t RawSize<DateTime>(const DateTime& date)
00117     {
00118       return RawSize(date.Value);
00119     }
00120 
00121     template<>
00122     std::size_t RawSize<std::vector<uint8_t>>(const std::vector<uint8_t>& vec)
00123     {
00124       const std::size_t headerSize = 4;
00125       return headerSize + vec.size();
00126     }
00127 
00128     template<>
00129     std::size_t RawSize<std::vector<std::vector<uint8_t>>>(const std::vector<std::vector<uint8_t>>& vec)
00130     {
00131       const std::size_t headerSize = 4;
00132       std::size_t totalSize = headerSize;
00133       std::for_each(vec.begin(), vec.end(), [&] (const std::vector<uint8_t>& v) {totalSize += RawSize(v);});
00134       return totalSize;
00135     }
00136 
00137 
00138     template<>
00139     std::size_t RawSize<std::vector<std::string>>(const std::vector<std::string>& vec)
00140     {
00141       const std::size_t headerSize = 4;
00142       std::size_t totalSize = headerSize;
00143       std::for_each(vec.begin(), vec.end(), [&] (const std::string& str) {totalSize += RawSize(str);});
00144       return totalSize;
00145     }
00146 
00147 
00148     template<>
00149     std::size_t RawSize<Header>(const Header&)
00150     {
00151       const std::size_t sizeofType = 3;  // 'H', 'E', 'L'
00152       const std::size_t sizeofChunk = 1; // 'F'
00153       const std::size_t sizeofSize = 4;
00154       return sizeofType + sizeofChunk + sizeofSize;
00155     }
00156 
00157     template<>
00158     std::size_t RawSize<SecureHeader>(const SecureHeader&)
00159     {
00160       const std::size_t sizeofType = 3;  // 'H', 'E', 'L'
00161       const std::size_t sizeofChunk = 1; // 'F'
00162       const std::size_t sizeofSize = 4;
00163       const std::size_t sizeofChannelId = 4;
00164       return sizeofType + sizeofChunk + sizeofSize + sizeofChannelId;
00165     }
00166 
00167     template<>
00168     std::size_t RawSize<Hello>(const Hello& hello)
00169     {
00170       const std::size_t sizeOfProtocolVersion = 4;
00171       const std::size_t sizeOfReceiveBufferSize = 4;
00172       const std::size_t sizeOfSendBufferSize = 4;
00173       const std::size_t sizeOfMaxMessageSize = 4;
00174       const std::size_t sizeOfMaxChunkCount = 4;
00175 
00176       return sizeOfProtocolVersion +
00177              sizeOfReceiveBufferSize +
00178              sizeOfSendBufferSize +
00179              sizeOfMaxMessageSize +
00180              sizeOfMaxChunkCount +
00181              RawSize(hello.EndpointUrl);
00182     }
00183 
00184     template<>
00185     std::size_t RawSize<Acknowledge>(const Acknowledge&)
00186     {
00187       const std::size_t sizeofProtocolVersion = 4;
00188       const std::size_t sizeofReceiveBufferSize = 4;
00189       const std::size_t sizeofSendBufferSize = 4;
00190       const std::size_t sizeofMaxMessageSize = 4;
00191       const std::size_t sizeofMaxChunkCount = 4;
00192 
00193       return sizeofProtocolVersion + sizeofReceiveBufferSize + sizeofSendBufferSize + sizeofMaxMessageSize + sizeofMaxChunkCount;
00194     }
00195 
00196     template<>
00197     std::size_t RawSize<Error>(const Error& err)
00198     {
00199       const std::size_t sizeofCode = 4;
00200       return sizeofCode + RawSize(err.Reason);
00201     }
00202 
00203     template<>
00204     std::size_t RawSize<AsymmetricAlgorithmHeader>(const AsymmetricAlgorithmHeader& ack)
00205     {
00206       const std::size_t sizeofUri = RawSize(ack.SecurityPolicyUri);
00207       const std::size_t sizeofCertificate = RawSize(ack.SenderCertificate);
00208       const std::size_t sizeofThumbprint = RawSize(ack.ReceiverCertificateThumbPrint);
00209       return sizeofUri + sizeofCertificate +  sizeofThumbprint;
00210     }
00211 
00212     template<>
00213     std::size_t RawSize<SequenceHeader>(const SequenceHeader&)
00214     {
00215       const std::size_t sizeofSequenceNumber = 4;
00216       const std::size_t sizeofRequestId = 4;
00217 
00218       return sizeofSequenceNumber + sizeofRequestId;
00219     }
00220 
00221     template<>
00222     std::size_t RawSize<AdditionalHeader>(const AdditionalHeader& header)
00223     {
00224       const std::size_t sizeofTypeId = RawSize(header.TypeId);
00225       const std::size_t sizeofEncoding = 1;
00226       return sizeofTypeId + sizeofEncoding;
00227     }
00228 
00229     template<>
00230     std::size_t RawSize<RequestHeader>(const RequestHeader& header)
00231     {
00232       const std::size_t sizeofSessionAuthenticationToken = RawSize(header.SessionAuthenticationToken);
00233       const std::size_t sizeofUtcTime = 8;
00234       const std::size_t sizeofRequestHandle = 4;
00235       const std::size_t sizeofReturnDiagnostics = 4;
00236       const std::size_t sizeofAuditEntryId = 4 + header.AuditEntryId.size();
00237       const std::size_t sizeofTimeout = 4;
00238       const std::size_t sizeofAdditional = RawSize(header.Additional);
00239 
00240       return sizeofSessionAuthenticationToken + sizeofUtcTime + sizeofRequestHandle + sizeofReturnDiagnostics + sizeofAuditEntryId + sizeofTimeout + sizeofAdditional;
00241     }
00242 
00243     template<>
00244     std::size_t RawSize<OpenSecureChannelRequest>(const OpenSecureChannelRequest& request)
00245     {
00246       const std::size_t sizeofTypeId = RawSize(request.TypeId);
00247       const std::size_t sizeofHeader = RawSize(request.Header);
00248       const std::size_t sizeofClientProtocolVersion = 4;
00249       const std::size_t sizeofRequestType = 4;
00250       const std::size_t sizeofSecurityMode = 4;
00251       const std::size_t sizeofClientNonce = 4 + request.Parameters.ClientNonce.size();
00252       const std::size_t sizeofRequestLifeTime = 4;
00253 
00254       return sizeofTypeId + sizeofHeader + sizeofClientProtocolVersion + sizeofRequestType + sizeofSecurityMode + sizeofClientNonce + sizeofRequestLifeTime;
00255     };
00256 
00257     template<>
00258     std::size_t RawSize<SymmetricAlgorithmHeader>(const SymmetricAlgorithmHeader& header)
00259     {
00260       const std::size_t sizeofTokenId = 4;
00261       return sizeofTokenId;
00262     }
00263 
00264     template<>
00265     std::size_t RawSize<DiagnosticInfo>(const DiagnosticInfo& info)
00266     {
00267       const std::size_t sizeofEncodingMask = 1;
00268       size_t size = sizeofEncodingMask;
00269 
00270       if (info.EncodingMask & DIM_SYMBOLIC_Id)
00271       {
00272         const std::size_t sizeofSymbolicId = 4;
00273         size += sizeofSymbolicId;
00274       }
00275       if (info.EncodingMask & DIM_NAMESPACE)
00276       {
00277         const std::size_t sizeofNamespace = 4;
00278         size += sizeofNamespace;
00279       }
00280       if (info.EncodingMask & DIM_LOCALIZED_TEXT)
00281       {
00282         const std::size_t sizeofLocalizedText = 4;
00283         size += sizeofLocalizedText;
00284       }
00285       if (info.EncodingMask & DIM_LOCALE)
00286       {
00287         const std::size_t sizeofLocale = 4;
00288         size += sizeofLocale;
00289       }
00290       if (info.EncodingMask & DIM_ADDITIONAL_INFO)
00291       {
00292         const std::size_t sizeofAdditionalInfo = 4 + info.AdditionalInfo.size();
00293         size += sizeofAdditionalInfo;
00294       }
00295       if (info.EncodingMask & DIM_INNER_STATUS_CODE)
00296       {
00297         const std::size_t sizeofInnerStatusCode= 4;
00298         size += sizeofInnerStatusCode;
00299       }
00300       if ((info.EncodingMask & DIM_INNER_DIAGNOSTIC_INFO) && info.InnerDiagnostics)
00301       {
00302         size += RawSize(*info.InnerDiagnostics);
00303       }
00304 
00305       return size;
00306     }
00307 
00308     template<>
00309     std::size_t RawSize<DiagnosticInfoList>(const DiagnosticInfoList& infos)
00310     {
00311       return RawSizeContainer(infos);
00312     }
00313 
00314     template<>
00315     std::size_t RawSize<ResponseHeader>(const ResponseHeader& header)
00316     {
00317       const std::size_t sizeofTimestamp = 8;
00318       const std::size_t sizeofRequestHandle = 4;
00319       const std::size_t sizeofServiceResult = 4;
00320 
00321       std::size_t sizeofDiagnostics = RawSize(header.InnerDiagnostics);
00322       std::size_t sizeofStringTable = 4;
00323       std::for_each(header.StringTable.begin(), header.StringTable.end(), [&] (const std::string& str) {sizeofStringTable += RawSize(str);});
00324 
00325       const std::size_t sizeofAdditional = RawSize(header.Additional);
00326       return sizeofTimestamp + sizeofRequestHandle + sizeofServiceResult + sizeofDiagnostics + sizeofStringTable + sizeofAdditional;
00327     }
00328 
00329     template<>
00330     std::size_t RawSize<SecurityToken>(const SecurityToken&)
00331     {
00332       const std::size_t sizeofSecureChannelId = 4;
00333       const std::size_t sizeofTokenId = 4;
00334       const std::size_t sizeofCreatedAt = 8;
00335       const std::size_t sizeofRevisedLifetime = 4;
00336 
00337       return sizeofSecureChannelId + sizeofTokenId + sizeofCreatedAt + sizeofRevisedLifetime;
00338     };
00339 
00340     template<>
00341     std::size_t RawSize<OpenSecureChannelResponse>(const OpenSecureChannelResponse& response)
00342     {
00343       const std::size_t sizeofTypeId = RawSize(response.TypeId);
00344       const std::size_t sizeofHeader = RawSize(response.Header);
00345       const std::size_t sizeofServerProtocolVersion = 4;
00346       const std::size_t sizeofChannelSecurityToken = RawSize(response.ChannelSecurityToken);
00347       const std::size_t sizeofServerNonce = 4 + response.ServerNonce.size();
00348 
00349       return sizeofTypeId + sizeofHeader + sizeofServerProtocolVersion + sizeofChannelSecurityToken + sizeofServerNonce;
00350     };
00351 
00352     template<>
00353     std::size_t RawSize<CloseSecureChannelRequest>(const CloseSecureChannelRequest& request)
00354     {
00355       const std::size_t sizeofTypeId = RawSize(request.TypeId);
00356       const std::size_t sizeofHeader = RawSize(request.Header);
00357       return sizeofTypeId + sizeofHeader;
00358     }
00359 
00360 
00361     template<>
00362     std::size_t RawSize<LocalizedText>(const LocalizedText& text)
00363     {
00364       std::size_t size = RawSize(text.Encoding);
00365       if (text.Encoding & HAS_LOCALE)
00366       {
00367         size += RawSize(text.Locale);
00368       }
00369       if (text.Encoding & HAS_TEXT)
00370       {
00371         size += RawSize(text.Text);
00372       }
00373       return size;
00374     };
00375 
00376 //     template<>
00377 //     std::size_t RawSize<SignatureData>(const SignatureData& s)
00378 //     {
00379 //       return RawSize(s.Signature) + RawSize(s.Algorithm);
00380 //     };
00381 
00382     template<>
00383     std::size_t RawSize<ExtensionObjectHeader>(const ExtensionObjectHeader& header)
00384     {
00385       const std::size_t sizeofEncoding = 1;
00386       return RawSize(header.TypeId) + sizeofEncoding;
00387     };
00388 
00389     template<>
00390     std::size_t RawSize<QualifiedName>(const QualifiedName& name)
00391     {
00392       return RawSize(name.NamespaceIndex) + RawSize(name.Name);
00393     };
00394     template<>
00395 
00396     std::size_t RawSize<IntegerId>(const IntegerId&)
00397     {
00398       return 4;
00399     };
00400 
00401   }
00402 }
00403 


ros_opcua_impl_freeopcua
Author(s): Denis Štogl
autogenerated on Sat Jun 8 2019 18:24:39