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;
00152 const std::size_t sizeofChunk = 1;
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;
00161 const std::size_t sizeofChunk = 1;
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
00377
00378
00379
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