ICE 3.4.2
[php5-ice-freebsdport.git] / cs / src / Ice / TraceUtil.cs
blob7db3c63887efa26a9c92dc2deae912f97a4a79dd
1 // **********************************************************************
2 //
3 // Copyright (c) 2003-2011 ZeroC, Inc. All rights reserved.
4 //
5 // This copy of Ice is licensed to you under the terms described in the
6 // ICE_LICENSE file included in this distribution.
7 //
8 // **********************************************************************
10 namespace IceInternal
13 using System.Collections.Generic;
14 using System.Diagnostics;
15 using System.Globalization;
17 sealed class TraceUtil
19 internal static void traceSend(BasicStream str, Ice.Logger logger, TraceLevels tl)
21 if(tl.protocol >= 1)
23 int p = str.pos();
24 str.pos(0);
26 using(System.IO.StringWriter s = new System.IO.StringWriter(CultureInfo.CurrentCulture))
28 byte type = printMessage(s, str);
30 logger.trace(tl.protocolCat, "sending " + getMessageTypeAsString(type) + " " + s.ToString());
32 str.pos(p);
36 internal static void traceRecv(BasicStream str, Ice.Logger logger, TraceLevels tl)
38 if(tl.protocol >= 1)
40 int p = str.pos();
41 str.pos(0);
43 using(System.IO.StringWriter s = new System.IO.StringWriter(CultureInfo.CurrentCulture))
45 byte type = printMessage(s, str);
47 logger.trace(tl.protocolCat, "received " + getMessageTypeAsString(type) + " " + s.ToString());
49 str.pos(p);
53 internal static void trace(string heading, BasicStream str, Ice.Logger logger, TraceLevels tl)
55 if(tl.protocol >= 1)
57 int p = str.pos();
58 str.pos(0);
60 using(System.IO.StringWriter s = new System.IO.StringWriter(CultureInfo.CurrentCulture))
62 s.Write(heading);
63 printMessage(s, str);
65 logger.trace(tl.protocolCat, s.ToString());
67 str.pos(p);
71 private static HashSet<string> slicingIds = new HashSet<string>();
73 internal static void traceSlicing(string kind, string typeId, string slicingCat, Ice.Logger logger)
75 lock(typeof(IceInternal.TraceUtil))
77 if(slicingIds.Add(typeId))
79 using(System.IO.StringWriter s = new System.IO.StringWriter(CultureInfo.CurrentCulture))
81 s.Write("unknown " + kind + " type `" + typeId + "'");
82 logger.trace(slicingCat, s.ToString());
88 public static void dumpStream(BasicStream stream)
90 int pos = stream.pos();
91 stream.pos(0);
93 byte[] data = new byte[stream.size()];
94 stream.readBlob(data);
95 dumpOctets(data);
97 stream.pos(pos);
100 public static void dumpOctets(byte[] data)
102 const int inc = 8;
104 for(int i = 0; i < data.Length; i += inc)
106 for(int j = i; j - i < inc; j++)
108 if(j < data.Length)
110 int n = (int)data[j];
111 if(n < 0)
113 n += 256;
115 string s;
116 if(n < 10)
118 s = " " + n;
120 else if(n < 100)
122 s = " " + n;
124 else
126 s = "" + n;
128 System.Console.Out.Write(s + " ");
130 else
132 System.Console.Out.Write(" ");
136 System.Console.Out.Write('"');
138 for(int j = i; j < data.Length && j - i < inc; j++)
140 // TODO: this needs fixing
141 if(data[j] >= (byte)32 && data[j] < (byte)127)
143 System.Console.Out.Write((char) data[j]);
145 else
147 System.Console.Out.Write('.');
151 System.Console.Out.WriteLine('"');
155 private static void printIdentityFacetOperation(System.IO.StringWriter s, BasicStream str)
159 Ice.Identity identity = new Ice.Identity();
160 identity.read__(str);
161 s.Write("\nidentity = " + str.instance().identityToString(identity));
163 string[] facet = str.readStringSeq();
164 s.Write("\nfacet = ");
165 if(facet.Length > 0)
167 s.Write(IceUtilInternal.StringUtil.escapeString(facet[0], ""));
170 string operation = str.readString();
171 s.Write("\noperation = " + operation);
173 catch(System.IO.IOException)
175 Debug.Assert(false);
179 private static void printRequest(System.IO.StringWriter s, BasicStream str)
181 int requestId = str.readInt();
182 s.Write("\nrequest id = " + requestId);
183 if(requestId == 0)
185 s.Write(" (oneway)");
188 printRequestHeader(s, str);
191 private static void printBatchRequest(System.IO.StringWriter s, BasicStream str)
193 int batchRequestNum = str.readInt();
194 s.Write("\nnumber of requests = " + batchRequestNum);
196 for(int i = 0; i < batchRequestNum; ++i)
198 s.Write("\nrequest #" + i + ':');
199 printRequestHeader(s, str);
200 str.skipEncaps();
204 private static void printReply(System.IO.StringWriter s, BasicStream str)
206 int requestId = str.readInt();
207 s.Write("\nrequest id = " + requestId);
209 byte replyStatus = str.readByte();
210 s.Write("\nreply status = " + (int)replyStatus + ' ');
212 switch(replyStatus)
214 case ReplyStatus.replyOK:
216 s.Write("(ok)");
217 break;
220 case ReplyStatus.replyUserException:
222 s.Write("(user exception)");
223 break;
226 case ReplyStatus.replyObjectNotExist:
227 case ReplyStatus.replyFacetNotExist:
228 case ReplyStatus.replyOperationNotExist:
230 switch(replyStatus)
232 case ReplyStatus.replyObjectNotExist:
234 s.Write("(object not exist)");
235 break;
238 case ReplyStatus.replyFacetNotExist:
240 s.Write("(facet not exist)");
241 break;
244 case ReplyStatus.replyOperationNotExist:
246 s.Write("(operation not exist)");
247 break;
250 default:
252 Debug.Assert(false);
253 break;
257 printIdentityFacetOperation(s, str);
258 break;
261 case ReplyStatus.replyUnknownException:
262 case ReplyStatus.replyUnknownLocalException:
263 case ReplyStatus.replyUnknownUserException:
265 switch(replyStatus)
267 case ReplyStatus.replyUnknownException:
269 s.Write("(unknown exception)");
270 break;
273 case ReplyStatus.replyUnknownLocalException:
275 s.Write("(unknown local exception)");
276 break;
279 case ReplyStatus.replyUnknownUserException:
281 s.Write("(unknown user exception)");
282 break;
285 default:
287 Debug.Assert(false);
288 break;
292 string unknown = str.readString();
293 s.Write("\nunknown = " + unknown);
294 break;
297 default:
299 s.Write("(unknown)");
300 break;
305 private static void printRequestHeader(System.IO.StringWriter s, BasicStream str)
307 printIdentityFacetOperation(s, str);
311 byte mode = str.readByte();
312 s.Write("\nmode = " + (int)mode + ' ');
313 switch((Ice.OperationMode)mode)
315 case Ice.OperationMode.Normal:
317 s.Write("(normal)");
318 break;
321 case Ice.OperationMode.Nonmutating:
323 s.Write("(nonmutating)");
324 break;
327 case Ice.OperationMode.Idempotent:
329 s.Write("(idempotent)");
330 break;
333 default:
335 s.Write("(unknown)");
336 break;
340 int sz = str.readSize();
341 s.Write("\ncontext = ");
342 while(sz-- > 0)
344 string key = str.readString();
345 string val = str.readString();
346 s.Write(key + '/' + val);
347 if(sz > 0)
349 s.Write(", ");
353 catch(System.IO.IOException)
355 Debug.Assert(false);
359 private static byte printHeader(System.IO.StringWriter s, BasicStream str)
363 str.readByte(); // Don't bother printing the magic number
364 str.readByte();
365 str.readByte();
366 str.readByte();
368 /* byte pMajor = */ str.readByte();
369 /* byte pMinor = */ str.readByte();
370 //s.Write("\nprotocol version = " + (int)pMajor + "." + (int)pMinor);
372 /* byte eMajor = */ str.readByte();
373 /* byte eMinor = */ str.readByte();
374 //s.Write("\nencoding version = " + (int)eMajor + "." + (int)eMinor);
376 byte type = str.readByte();
377 s.Write("\nmessage type = " + (int)type + " (" + getMessageTypeAsString(type) + ')');
379 byte compress = str.readByte();
380 s.Write("\ncompression status = " + (int)compress + ' ');
381 switch(compress)
383 case (byte)0:
385 s.Write("(not compressed; do not compress response, if any)");
386 break;
389 case (byte)1:
391 s.Write("(not compressed; compress response, if any)");
392 break;
395 case (byte)2:
397 s.Write("(compressed; compress response, if any)");
398 break;
401 default:
403 s.Write("(unknown)");
404 break;
408 int size = str.readInt();
409 s.Write("\nmessage size = " + size);
410 return type;
412 catch(System.IO.IOException)
414 Debug.Assert(false);
415 return 0;
419 private static byte printMessage(System.IO.StringWriter s, BasicStream str)
421 byte type = printHeader(s, str);
423 switch(type)
425 case Protocol.closeConnectionMsg:
426 case Protocol.validateConnectionMsg:
428 // We're done.
429 break;
432 case Protocol.requestMsg:
434 printRequest(s, str);
435 break;
438 case Protocol.requestBatchMsg:
440 printBatchRequest(s, str);
441 break;
444 case Protocol.replyMsg:
446 printReply(s, str);
447 break;
450 default:
452 s.Write("(unknown)");
453 break;
457 return type;
460 internal static void traceHeader(string heading, BasicStream str, Ice.Logger logger, TraceLevels tl)
462 if(tl.protocol >= 1)
464 int p = str.pos();
465 str.pos(0);
467 using(System.IO.StringWriter s = new System.IO.StringWriter(CultureInfo.CurrentCulture))
469 s.Write(heading);
470 printHeader(s, str);
472 logger.trace(tl.protocolCat, s.ToString());
474 str.pos(p);
478 private static string getMessageTypeAsString(byte type)
480 switch(type)
482 case Protocol.requestMsg:
483 return "request";
484 case Protocol.requestBatchMsg:
485 return "batch request";
486 case Protocol.replyMsg:
487 return "reply";
488 case Protocol.closeConnectionMsg:
489 return "close connection";
490 case Protocol.validateConnectionMsg:
491 return "validate connection";
492 default:
493 return "unknown";