Ice 3.7 C++11 API Reference
Loading...
Searching...
No Matches
Protocol.h
Go to the documentation of this file.
1//
2// Copyright (c) ZeroC, Inc. All rights reserved.
3//
4
5#ifndef ICE_PROTOCOL_H
6#define ICE_PROTOCOL_H
7
8#include <Ice/Config.h>
9#include <Ice/Version.h>
10
11namespace IceInternal
12{
13
14//
15// Size of the Ice protocol header
16//
17// Magic number (4 Bytes)
18// Protocol version major (Byte)
19// Protocol version minor (Byte)
20// Encoding version major (Byte)
21// Encoding version minor (Byte)
22// Message type (Byte)
23// Compression status (Byte)
24// Message size (Int)
25//
26const ::Ice::Int headerSize = 14;
27
28//
29// The magic number at the front of each message
30//
31extern const ::Ice::Byte magic[4];
32
33//
34// The current Ice protocol, protocol encoding and encoding version
35//
36const ::Ice::Byte protocolMajor = 1;
37const ::Ice::Byte protocolMinor = 0;
38const ::Ice::Byte protocolEncodingMajor = 1;
39const ::Ice::Byte protocolEncodingMinor = 0;
40
41const ::Ice::Byte encodingMajor = 1;
42const ::Ice::Byte encodingMinor = 1;
43
44//
45// The Ice protocol message types
46//
47const ::Ice::Byte requestMsg = 0;
48const ::Ice::Byte requestBatchMsg = 1;
49const ::Ice::Byte replyMsg = 2;
50const ::Ice::Byte validateConnectionMsg = 3;
51const ::Ice::Byte closeConnectionMsg = 4;
52
53//
54// The request header, batch request header and reply header.
55//
56extern const ::Ice::Byte requestHdr[headerSize + sizeof(Ice::Int)];
57extern const ::Ice::Byte requestBatchHdr[headerSize + sizeof(Ice::Int)];
58extern const ::Ice::Byte replyHdr[headerSize];
59
60//
61// IPv4/IPv6 support enumeration.
62//
63enum ProtocolSupport
64{
65 EnableIPv4,
66 EnableIPv6,
67 EnableBoth
68};
69
70ICE_API void stringToMajorMinor(const ::std::string&, Ice::Byte&, Ice::Byte&);
71
72template<typename T> std::string
73versionToString(const T& v)
74{
75 std::ostringstream os;
76 os << v;
77 return os.str();
78}
79
80template<typename T> T
81stringToVersion(const ::std::string& str)
82{
83 T v;
84 stringToMajorMinor(str, v.major, v.minor);
85 return v;
86}
87
88template<typename T> bool
89isSupported(const T& version, const T& supported)
90{
91 return version.major == supported.major && version.minor <= supported.minor;
92}
93
94ICE_API void throwUnsupportedProtocolException(const char*, int, const Ice::ProtocolVersion&,
95 const Ice::ProtocolVersion&);
96ICE_API void throwUnsupportedEncodingException(const char*, int, const Ice::EncodingVersion&,
97 const Ice::EncodingVersion&);
98
99const ::Ice::Byte OPTIONAL_END_MARKER = 0xFF;
100
101const ::Ice::Byte FLAG_HAS_TYPE_ID_STRING = (1<<0);
102const ::Ice::Byte FLAG_HAS_TYPE_ID_INDEX = (1<<1);
103const ::Ice::Byte FLAG_HAS_TYPE_ID_COMPACT = (1<<0) | (1<<1);
104const ::Ice::Byte FLAG_HAS_OPTIONAL_MEMBERS = (1<<2);
105const ::Ice::Byte FLAG_HAS_INDIRECTION_TABLE = (1<<3);
106const ::Ice::Byte FLAG_HAS_SLICE_SIZE = (1<<4);
107const ::Ice::Byte FLAG_IS_LAST_SLICE = (1<<5);
108
109}
110
111namespace Ice
112{
113
116
119
122
125
128
131
137inline ::std::string
139{
140 return IceInternal::versionToString<ProtocolVersion>(v);
141}
142
149inline ::Ice::ProtocolVersion
150stringToProtocolVersion(const ::std::string& v)
151{
152 return IceInternal::stringToVersion<ProtocolVersion>(v);
153}
154
160inline ::std::string
162{
163 return IceInternal::versionToString<EncodingVersion>(v);
164}
165
172inline ::Ice::EncodingVersion
173stringToEncodingVersion(const ::std::string& v)
174{
175 return IceInternal::stringToVersion<EncodingVersion>(v);
176}
177
178inline std::ostream&
179operator<<(std::ostream& out, const ProtocolVersion& version)
180{
181 return out << static_cast<int>(version.major) << "." << static_cast<int>(version.minor);
182}
183
184inline std::ostream&
185operator<<(std::ostream& out, const EncodingVersion& version)
186{
187 return out << static_cast<int>(version.major) << "." << static_cast<int>(version.minor);
188}
189
190}
191
192namespace IceInternal
193{
194
195inline void
196checkSupportedProtocol(const Ice::ProtocolVersion& v)
197{
198 if(!isSupported(v, Ice::currentProtocol))
199 {
200 throwUnsupportedProtocolException(__FILE__, __LINE__, v, Ice::currentProtocol);
201 }
202}
203
204inline void
205checkSupportedProtocolEncoding(const Ice::EncodingVersion& v)
206{
207 if(!isSupported(v, Ice::currentProtocolEncoding))
208 {
209 throwUnsupportedEncodingException(__FILE__, __LINE__, v, Ice::currentProtocolEncoding);
210 }
211}
212
213inline void
214checkSupportedEncoding(const Ice::EncodingVersion& v)
215{
216 if(!isSupported(v, Ice::currentEncoding))
217 {
218 throwUnsupportedEncodingException(__FILE__, __LINE__, v, Ice::currentEncoding);
219 }
220}
221
222//
223// Either return the given protocol if not compatible, or the greatest
224// supported protocol otherwise.
225//
226inline const Ice::ProtocolVersion
227getCompatibleProtocol(const Ice::ProtocolVersion& v)
228{
230 {
231 return v; // Unsupported protocol, return as is.
232 }
233 else if(v.minor < Ice::currentProtocol.minor)
234 {
235 return v; // Supported protocol.
236 }
237 else
238 {
239 //
240 // Unsupported but compatible, use the currently supported
241 // protocol, that's the best we can do.
242 //
244 }
245}
246
247//
248// Either return the given encoding if not compatible, or the greatest
249// supported encoding otherwise.
250//
251inline const Ice::EncodingVersion&
252getCompatibleEncoding(const Ice::EncodingVersion& v)
253{
255 {
256 return v; // Unsupported encoding, return as is.
257 }
258 else if(v.minor < Ice::currentEncoding.minor)
259 {
260 return v; // Supported encoding.
261 }
262 else
263 {
264 //
265 // Unsupported but compatible, use the currently supported
266 // encoding, that's the best we can do.
267 //
269 }
270}
271
272}
273
274#endif
#define ICE_API
Definition Config.h:197
Definition BuiltinSequences.h:56
const ProtocolVersion Protocol_1_0
Identifies protocol version 1.0.
int Int
The mapping for the Slice int type.
Definition Config.h:54
const EncodingVersion currentEncoding
Identifies the latest encoding version.
const EncodingVersion Encoding_1_0
Identifies encoding version 1.0.
const EncodingVersion Encoding_1_1
Identifies encoding version 1.1.
const EncodingVersion currentProtocolEncoding
Identifies the latest protocol encoding version.
inline ::std::string encodingVersionToString(const Ice::EncodingVersion &v)
Converts an encoding version into a string.
Definition Protocol.h:161
inline ::std::string protocolVersionToString(const Ice::ProtocolVersion &v)
Converts a protocol version into a string.
Definition Protocol.h:138
inline ::Ice::ProtocolVersion stringToProtocolVersion(const ::std::string &v)
Converts a string into a protocol version.
Definition Protocol.h:150
inline ::Ice::EncodingVersion stringToEncodingVersion(const ::std::string &v)
Converts a string into an encoding version.
Definition Protocol.h:173
unsigned char Byte
The mapping for the Slice byte type.
Definition Config.h:50
const ProtocolVersion currentProtocol
Identifies the latest protocol version.
std::ostream & operator<<(std::ostream &out, const ProtocolVersion &version)
Definition Protocol.h:179
A version structure for the encoding version.
Definition Version.h:82
::Ice::Byte minor
Definition Version.h:84
::Ice::Byte major
Definition Version.h:83
A version structure for the protocol version.
Definition Version.h:63
::Ice::Byte major
Definition Version.h:64
::Ice::Byte minor
Definition Version.h:65