diff options
Diffstat (limited to 'js/src/Ice/TraceUtil.js')
-rw-r--r-- | js/src/Ice/TraceUtil.js | 474 |
1 files changed, 474 insertions, 0 deletions
diff --git a/js/src/Ice/TraceUtil.js b/js/src/Ice/TraceUtil.js new file mode 100644 index 00000000000..2e119ca6dcf --- /dev/null +++ b/js/src/Ice/TraceUtil.js @@ -0,0 +1,474 @@ +// ********************************************************************** +// +// 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/Debug"); + require("Ice/HashMap"); + require("Ice/Protocol"); + require("Ice/StringUtil"); + require("Ice/Current"); + require("Ice/Identity"); + + var Ice = global.Ice || {}; + + // + // Local aliases. + // + var Debug = Ice.Debug; + var HashMap = Ice.HashMap; + var Protocol = Ice.Protocol; + var StringUtil = Ice.StringUtil; + var OperationMode = Ice.OperationMode; + var Identity = Ice.Identity; + + var TraceUtil = {}; + + TraceUtil.traceSend = function(stream, logger, traceLevels) + { + if(traceLevels.protocol >= 1) + { + var p = stream.pos; + stream.pos = 0; + + var s = []; + var type = printMessage(s, stream); + + logger.trace(traceLevels.protocolCat, "sending " + getMessageTypeAsString(type) + " " + s.join("")); + + stream.pos = p; + } + }; + + TraceUtil.traceRecv = function(stream, logger, traceLevels) + { + if(traceLevels.protocol >= 1) + { + var p = stream.pos; + stream.pos = 0; + + var s = []; + var type = printMessage(s, stream); + + logger.trace(traceLevels.protocolCat, "received " + getMessageTypeAsString(type) + " " + s.join("")); + + stream.pos = p; + } + }; + + TraceUtil.trace = function(heading, stream, logger, traceLevels) + { + if(traceLevels.protocol >= 1) + { + var p = stream.pos; + stream.pos = 0; + + var s = []; + s.push(heading); + printMessage(s, stream); + + logger.trace(traceLevels.protocolCat, s.join("")); + stream.pos = p; + } + }; + + var slicingIds = new HashMap(); + + function traceSlicing(kind, typeId, slicingCat, logger) + { + if(!slicingIds.has(typeId)) + { + var s = "unknown " + kind + " type `" + typeId + "'"; + logger.trace(slicingCat, s); + slicingIds.set(typeId, 1); + } + } + + TraceUtil.dumpStream = function(stream) + { + var pos = stream.pos; + stream.pos = 0; + + var data = stream.readBlob(stream.size()); + TraceUtil.dumpOctets(data); + + stream.pos = pos; + }; + + TraceUtil.dumpOctets = function(data) + { + var inc = 8; + var buf = []; + + for(var i = 0; i < data.length; i += inc) + { + var j; + for(j = i; j - i < inc; j++) + { + if(j < data.length) + { + var n = data[j]; + if(n < 0) + { + n += 256; + } + var s; + if(n < 10) + { + s = " " + n; + } + else if(n < 100) + { + s = " " + n; + } + else + { + s = "" + n; + } + buf.push(s + " "); + } + else + { + buf.push(" "); + } + } + + buf.push('"'); + + for(j = i; j < data.length && j - i < inc; j++) + { + if(data[j] >= 32 && data[j] < 127) + { + buf.push(String.fromCharCode(data[j])); + } + else + { + buf.push('.'); + } + } + + buf.push("\"\n"); + } + + console.log(buf.join("")); + }; + + Ice.TraceUtil = TraceUtil; + global.Ice = Ice; + + function printIdentityFacetOperation(s, stream) + { + var identity = new Identity(); + identity.__read(stream); + s.push("\nidentity = " + stream.instance.identityToString(identity)); + + var facet = Ice.StringSeqHelper.read(stream); + s.push("\nfacet = "); + if(facet.length > 0) + { + s.push(StringUtil.escapeString(facet[0], "")); + } + + var operation = stream.readString(); + s.push("\noperation = " + operation); + } + + function printRequest(s, stream) + { + var requestId = stream.readInt(); + s.push("\nrequest id = " + requestId); + if(requestId === 0) + { + s.push(" (oneway)"); + } + + printRequestHeader(s, stream); + } + + function printBatchRequest(s, stream) + { + var batchRequestNum = stream.readInt(); + s.push("\nnumber of requests = " + batchRequestNum); + + for(var i = 0; i < batchRequestNum; ++i) + { + s.push("\nrequest #" + i + ':'); + printRequestHeader(s, stream); + } + } + + function printReply(s, stream) + { + var requestId = stream.readInt(); + s.push("\nrequest id = " + requestId); + + var replyStatus = stream.readByte(); + s.push("\nreply status = " + replyStatus + ' '); + + switch(replyStatus) + { + case Protocol.replyOK: + { + s.push("(ok)"); + break; + } + + case Protocol.replyUserException: + { + s.push("(user exception)"); + break; + } + + case Protocol.replyObjectNotExist: + case Protocol.replyFacetNotExist: + case Protocol.replyOperationNotExist: + { + switch(replyStatus) + { + case Protocol.replyObjectNotExist: + { + s.push("(object not exist)"); + break; + } + + case Protocol.replyFacetNotExist: + { + s.push("(facet not exist)"); + break; + } + + case Protocol.replyOperationNotExist: + { + s.push("(operation not exist)"); + break; + } + + default: + { + Debug.assert(false); + break; + } + } + + printIdentityFacetOperation(s, stream); + break; + } + + case Protocol.replyUnknownException: + case Protocol.replyUnknownLocalException: + case Protocol.replyUnknownUserException: + { + switch(replyStatus) + { + case Protocol.replyUnknownException: + { + s.push("(unknown exception)"); + break; + } + + case Protocol.replyUnknownLocalException: + { + s.push("(unknown local exception)"); + break; + } + + case Protocol.replyUnknownUserException: + { + s.push("(unknown user exception)"); + break; + } + + default: + { + Debug.assert(false); + break; + } + } + + var unknown = stream.readString(); + s.push("\nunknown = " + unknown); + break; + } + + default: + { + s.push("(unknown)"); + break; + } + } + } + + function printRequestHeader(s, stream) + { + printIdentityFacetOperation(s, stream); + + var mode = stream.readByte(); + s.push("\nmode = " + mode + ' '); + switch(OperationMode.valueOf(mode)) + { + case OperationMode.Normal: + { + s.push("(normal)"); + break; + } + + case OperationMode.Nonmutating: + { + s.push("(nonmutating)"); + break; + } + + case OperationMode.Idempotent: + { + s.push("(idempotent)"); + break; + } + + default: + { + s.push("(unknown)"); + break; + } + } + + var sz = stream.readSize(); + s.push("\ncontext = "); + while(sz-- > 0) + { + var key = stream.readString(); + var value = stream.readString(); + s.push(key + '/'+ value); + if(sz > 0) + { + s.push(", "); + } + } + + var ver = stream.skipEncaps(); + if(!ver.equals(Protocol.Encoding_1_0)) + { + s.push("\nencoding = "); + s.push(Ice.encodingVersionToString(ver)); + } + } + + function printHeader(s, stream) + { + stream.readByte(); // Don't bother printing the magic number + stream.readByte(); + stream.readByte(); + stream.readByte(); + + // var pMajor = stream.readByte(); + // var pMinor = stream.readByte(); + // s.push("\nprotocol version = " + pMajor + "." + pMinor); + stream.readByte(); // major + stream.readByte(); // minor + + // var eMajor = stream.readByte(); + // var eMinor = stream.readByte(); + // s.push("\nencoding version = " + eMajor + "." + eMinor); + stream.readByte(); // major + stream.readByte(); // minor + + var type = stream.readByte(); + + s.push("\nmessage type = " + type + " (" + getMessageTypeAsString(type) + ')'); + var compress = stream.readByte(); + s.push("\ncompression status = " + compress + ' '); + switch(compress) + { + case 0: + { + s.push("(not compressed; do not compress response, if any)"); + break; + } + + case 1: + { + s.push("(not compressed; compress response, if any)"); + break; + } + + case 2: + { + s.push("(compressed; compress response, if any)"); + break; + } + + default: + { + s.push("(unknown)"); + break; + } + } + + var size = stream.readInt(); + s.push("\nmessage size = " + size); + return type; + } + + function printMessage(s, stream) + { + var type = printHeader(s, stream); + + switch(type) + { + case Protocol.closeConnectionMsg: + case Protocol.validateConnectionMsg: + { + // We're done. + break; + } + + case Protocol.requestMsg: + { + printRequest(s, stream); + break; + } + + case Protocol.requestBatchMsg: + { + printBatchRequest(s, stream); + break; + } + + case Protocol.replyMsg: + { + printReply(s, stream); + break; + } + + default: + { + break; + } + } + + return type; + } + + function getMessageTypeAsString(type) + { + switch(type) + { + case Protocol.requestMsg: + return "request"; + case Protocol.requestBatchMsg: + return "batch request"; + case Protocol.replyMsg: + return "reply"; + case Protocol.closeConnectionMsg: + return "close connection"; + case Protocol.validateConnectionMsg: + return "validate connection"; + default: + return "unknown"; + } + } +}(typeof (global) === "undefined" ? window : global)); |