summaryrefslogtreecommitdiff
path: root/js/src/Ice/Protocol.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/Ice/Protocol.js')
-rw-r--r--js/src/Ice/Protocol.js316
1 files changed, 316 insertions, 0 deletions
diff --git a/js/src/Ice/Protocol.js b/js/src/Ice/Protocol.js
new file mode 100644
index 00000000000..12d71fdcdae
--- /dev/null
+++ b/js/src/Ice/Protocol.js
@@ -0,0 +1,316 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+(function(global){
+ require("Ice/StringUtil");
+ require("Ice/LocalException");
+ require("Ice/Version");
+ require("Ice/Buffer");
+
+ var Ice = global.Ice || {};
+
+ var StringUtil = Ice.StringUtil;
+
+ var Protocol = {};
+
+ Ice.Encoding_1_0 = new Ice.EncodingVersion(1, 0);
+ Ice.Encoding_1_1 = new Ice.EncodingVersion(1, 1);
+
+ Ice.Protocol_1_0 = new Ice.ProtocolVersion(1, 0);
+
+ //
+ // Size of the Ice protocol header
+ //
+ // Magic number (4 bytes)
+ // Protocol version major (Byte)
+ // Protocol version minor (Byte)
+ // Encoding version major (Byte)
+ // Encoding version minor (Byte)
+ // Message type (Byte)
+ // Compression status (Byte)
+ // Message size (Int)
+ //
+ Protocol.headerSize = 14;
+
+ //
+ // The magic number at the front of each message
+ //
+ //Protocol.magic = [ 0x49, 0x63, 0x65, 0x50 ]; // 'I', 'c', 'e', 'P'
+ Protocol.magic = Ice.Buffer.createNative([ 0x49, 0x63, 0x65, 0x50 ]); // 'I', 'c', 'e', 'P'
+
+ //
+ // The current Ice protocol and encoding version
+ //
+ Protocol.protocolMajor = 1;
+ Protocol.protocolMinor = 0;
+ Protocol.protocolEncodingMajor = 1;
+ Protocol.protocolEncodingMinor = 0;
+
+ Protocol.encodingMajor = 1;
+ Protocol.encodingMinor = 1;
+
+ //
+ // The Ice protocol message types
+ //
+ Protocol.requestMsg = 0;
+ Protocol.requestBatchMsg = 1;
+ Protocol.replyMsg = 2;
+ Protocol.validateConnectionMsg = 3;
+ Protocol.closeConnectionMsg = 4;
+
+ //
+ // Reply status
+ //
+ Protocol.replyOK = 0;
+ Protocol.replyUserException = 1;
+ Protocol.replyObjectNotExist = 2;
+ Protocol.replyFacetNotExist = 3;
+ Protocol.replyOperationNotExist = 4;
+ Protocol.replyUnknownLocalException = 5;
+ Protocol.replyUnknownUserException = 6;
+ Protocol.replyUnknownException = 7;
+
+ Protocol.requestHdr = Ice.Buffer.createNative([
+ Protocol.magic[0],
+ Protocol.magic[1],
+ Protocol.magic[2],
+ Protocol.magic[3],
+ Protocol.protocolMajor,
+ Protocol.protocolMinor,
+ Protocol.protocolEncodingMajor,
+ Protocol.protocolEncodingMinor,
+ Protocol.requestMsg,
+ 0, // Compression status.
+ 0, 0, 0, 0, // Message size (placeholder).
+ 0, 0, 0, 0 // Request ID (placeholder).
+ ]);
+
+ Protocol.requestBatchHdr = Ice.Buffer.createNative([
+ Protocol.magic[0],
+ Protocol.magic[1],
+ Protocol.magic[2],
+ Protocol.magic[3],
+ Protocol.protocolMajor,
+ Protocol.protocolMinor,
+ Protocol.protocolEncodingMajor,
+ Protocol.protocolEncodingMinor,
+ Protocol.requestBatchMsg,
+ 0, // Compression status.
+ 0, 0, 0, 0, // Message size (placeholder).
+ 0, 0, 0, 0 // Number of requests in batch (placeholder).
+ ]);
+
+ Protocol.replyHdr = Ice.Buffer.createNative([
+ Protocol.magic[0],
+ Protocol.magic[1],
+ Protocol.magic[2],
+ Protocol.magic[3],
+ Protocol.protocolMajor,
+ Protocol.protocolMinor,
+ Protocol.protocolEncodingMajor,
+ Protocol.protocolEncodingMinor,
+ Protocol.replyMsg,
+ 0, // Compression status.
+ 0, 0, 0, 0 // Message size (placeholder).
+ ]);
+
+ Protocol.currentProtocol = new Ice.ProtocolVersion(Protocol.protocolMajor, Protocol.protocolMinor);
+ Protocol.currentProtocolEncoding = new Ice.EncodingVersion(Protocol.protocolEncodingMajor,
+ Protocol.protocolEncodingMinor);
+
+ Protocol.currentEncoding = new Ice.EncodingVersion(Protocol.encodingMajor, Protocol.encodingMinor);
+
+ Protocol.checkSupportedProtocol = function(v)
+ {
+ if(v.major !== Protocol.currentProtocol.major || v.minor > Protocol.currentProtocol.minor)
+ {
+ throw new Ice.UnsupportedProtocolException("", v, Protocol.currentProtocol);
+ }
+ };
+
+ Protocol.checkSupportedProtocolEncoding = function(v)
+ {
+ if(v.major !== Protocol.currentProtocolEncoding.major ||
+ v.minor > Protocol.currentProtocolEncoding.minor)
+ {
+ throw new Ice.UnsupportedEncodingException("", v, Protocol.currentProtocolEncoding);
+ }
+ };
+
+ Protocol.checkSupportedEncoding = function(v)
+ {
+ if(v.major !== Protocol.currentEncoding.major || v.minor > Protocol.currentEncoding.minor)
+ {
+ throw new Ice.UnsupportedEncodingException("", v, Protocol.currentEncoding);
+ }
+ };
+
+ //
+ // Either return the given protocol if not compatible, or the greatest
+ // supported protocol otherwise.
+ //
+ Protocol.getCompatibleProtocol = function(v)
+ {
+ if(v.major !== Protocol.currentProtocol.major)
+ {
+ return v; // Unsupported protocol, return as is.
+ }
+ else if(v.minor < Protocol.currentProtocol.minor)
+ {
+ return v; // Supported protocol.
+ }
+ else
+ {
+ //
+ // Unsupported but compatible, use the currently supported
+ // protocol, that's the best we can do.
+ //
+ return Protocol.currentProtocol;
+ }
+ };
+
+ //
+ // Either return the given encoding if not compatible, or the greatest
+ // supported encoding otherwise.
+ //
+ Protocol.getCompatibleEncoding = function(v)
+ {
+ if(v.major !== Protocol.currentEncoding.major)
+ {
+ return v; // Unsupported encoding, return as is.
+ }
+ else if(v.minor < Protocol.currentEncoding.minor)
+ {
+ return v; // Supported encoding.
+ }
+ else
+ {
+ //
+ // Unsupported but compatible, use the currently supported
+ // encoding, that's the best we can do.
+ //
+ return Protocol.currentEncoding;
+ }
+ };
+
+ Protocol.isSupported = function(version, supported)
+ {
+ return version.major === supported.major && version.minor <= supported.minor;
+ };
+
+ /**
+ * Converts a string to a protocol version.
+ *
+ * @param version The string to convert.
+ *
+ * @return The converted protocol version.
+ **/
+ Ice.stringToProtocolVersion = function(version)
+ {
+ return new Ice.ProtocolVersion(stringToMajor(version), stringToMinor(version));
+ };
+
+ /**
+ * Converts a string to an encoding version.
+ *
+ * @param version The string to convert.
+ *
+ * @return The converted object identity.
+ **/
+ Ice.stringToEncodingVersion = function(version)
+ {
+ return new Ice.EncodingVersion(stringToMajor(version), stringToMinor(version));
+ };
+
+ /**
+ * Converts a protocol version to a string.
+ *
+ * @param v The protocol version to convert.
+ *
+ * @return The converted string.
+ **/
+ Ice.protocolVersionToString = function(v)
+ {
+ return majorMinorToString(v.major, v.minor);
+ };
+
+ /**
+ * Converts an encoding version to a string.
+ *
+ * @param v The encoding version to convert.
+ *
+ * @return The converted string.
+ **/
+ Ice.encodingVersionToString = function(v)
+ {
+ return majorMinorToString(v.major, v.minor);
+ };
+
+ Ice.Protocol = Protocol;
+ global.Ice = Ice;
+
+ function stringToMajor(str)
+ {
+ var pos = str.indexOf('.');
+ if(pos === -1)
+ {
+ throw new Ice.VersionParseException("malformed version value `" + str + "'");
+ }
+
+ var majStr = str.substring(0, pos);
+ var majVersion;
+ try
+ {
+ majVersion = StringUtil.toInt(majStr);
+ }
+ catch(ex)
+ {
+ throw new Ice.VersionParseException("invalid version value `" + str + "'");
+ }
+
+ if(majVersion < 1 || majVersion > 255)
+ {
+ throw new Ice.VersionParseException("range error in version `" + str + "'");
+ }
+
+ return majVersion;
+ }
+
+ function stringToMinor(str)
+ {
+ var pos = str.indexOf('.');
+ if(pos === -1)
+ {
+ throw new Ice.VersionParseException("malformed version value `" + str + "'");
+ }
+
+ var minStr = str.substring(pos + 1);
+ var minVersion;
+ try
+ {
+ minVersion = StringUtil.toInt(minStr);
+ }
+ catch(ex)
+ {
+ throw new Ice.VersionParseException("invalid version value `" + str + "'");
+ }
+
+ if(minVersion < 0 || minVersion > 255)
+ {
+ throw new Ice.VersionParseException("range error in version `" + str + "'");
+ }
+
+ return minVersion;
+ }
+
+ function majorMinorToString(major, minor)
+ {
+ return major + "." + minor;
+ }
+}(typeof (global) === "undefined" ? window : global));