basetrace.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8 -*- */
  2. /*
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  *  This product includes software developed by the MASH Research
  17.  *  Group at the University of California Berkeley.
  18.  * 4. Neither the name of the University nor of the Research Group may be
  19.  *    used to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  * 
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  */
  35. #include "basetrace.h"
  36. #include "tcp.h"
  37. class BaseTraceClass : public TclClass {
  38. public:
  39.        BaseTraceClass() : TclClass("BaseTrace") { }
  40.        TclObject* create(int argc, const char*const* argv) {
  41.   return (new BaseTrace());
  42.        }
  43. } basetrace_class;
  44. class EventTraceClass : public TclClass {
  45. public:
  46. EventTraceClass() : TclClass("BaseTrace/Event") { }
  47. TclObject* create(int argc, const char*const* argv) {
  48. return (new EventTrace());
  49. }
  50. } eventtrace_class;
  51. BaseTrace::BaseTrace() 
  52.   : channel_(0), namChan_(0), tagged_(0) 
  53. {
  54.   wrk_ = new char[1026];
  55.   nwrk_ = new char[256];
  56. }
  57. BaseTrace::~BaseTrace()
  58. {
  59.   delete wrk_;
  60.   delete nwrk_;
  61. }
  62. void BaseTrace::dump()
  63. {
  64. int n = strlen(wrk_);
  65. if ((n > 0) && (channel_ != 0)) {
  66. /*
  67.  * tack on a newline (temporarily) instead
  68.  * of doing two writes
  69.  */
  70. wrk_[n] = 'n';
  71. wrk_[n + 1] = 0;
  72.  /* -NEW- */
  73. //printf("%s",wrk_);
  74. (void)Tcl_Write(channel_, wrk_, n + 1);
  75.  /* END -NEW- */
  76. //Tcl_Flush(channel_);
  77. wrk_[n] = 0;
  78. }
  79. //  if (callback_) {
  80. //   Tcl& tcl = Tcl::instance();
  81. //   tcl.evalf("%s handle { %s }", name(), wrk_);
  82. //   }
  83. }
  84. void BaseTrace::namdump()
  85. {
  86. int n = 0;
  87. /* Otherwise nwrk_ isn't initialized */
  88. if (namChan_ != 0)
  89. n = strlen(nwrk_);
  90. if ((n > 0) && (namChan_ != 0)) {
  91. /*
  92.  * tack on a newline (temporarily) instead
  93.  * of doing two writes
  94.  */
  95. nwrk_[n] = 'n';
  96. nwrk_[n + 1] = 0;
  97. (void)Tcl_Write(namChan_, nwrk_, n + 1);
  98. //Tcl_Flush(channel_);
  99. nwrk_[n] = 0;
  100. }
  101. }
  102. /*
  103.  * $trace detach
  104.  * $trace flush
  105.  * $trace attach $fileID
  106.  */
  107. int BaseTrace::command(int argc, const char*const* argv)
  108. {
  109. Tcl& tcl = Tcl::instance();
  110. if (argc == 2) {
  111. if (strcmp(argv[1], "detach") == 0) {
  112. channel_ = 0;
  113. namChan_ = 0;
  114. return (TCL_OK);
  115. }
  116. if (strcmp(argv[1], "flush") == 0) {
  117. if (channel_ != 0) 
  118. Tcl_Flush(channel_);
  119. if (namChan_ != 0)
  120. Tcl_Flush(namChan_);
  121. return (TCL_OK);
  122. }
  123. if (strcmp(argv[1], "tagged") == 0) {
  124. tcl.resultf("%d", tagged());
  125.                         return (TCL_OK);
  126. }
  127. } else if (argc == 3) {
  128. if (strcmp(argv[1], "attach") == 0) {
  129. int mode;
  130. const char* id = argv[2];
  131. channel_ = Tcl_GetChannel(tcl.interp(), (char*)id,
  132.   &mode);
  133. if (channel_ == 0) {
  134. tcl.resultf("trace: can't attach %s for writing", id);
  135. return (TCL_ERROR);
  136. }
  137. return (TCL_OK);
  138. }
  139. if (strcmp(argv[1], "namattach") == 0) {
  140. int mode;
  141. const char* id = argv[2];
  142. namChan_ = Tcl_GetChannel(tcl.interp(), (char*)id,
  143.   &mode);
  144. if (namChan_ == 0) {
  145. tcl.resultf("trace: can't attach %s for writing", id);
  146. return (TCL_ERROR);
  147. }
  148. return (TCL_OK);
  149. }
  150. if (strcmp(argv[1], "tagged") == 0) {
  151. int tag;
  152. if (Tcl_GetBoolean(tcl.interp(),
  153.    (char*)argv[2], &tag) == TCL_OK) {
  154. tagged(tag);
  155. return (TCL_OK);
  156. } else return (TCL_ERROR);
  157. }
  158. }
  159. return (TclObject::command(argc, argv));
  160. }
  161. /* The eventtrace format is tentative for now; will be extended in future to include data like window size, rtt, segsize, segperack etc */
  162. void EventTrace::trace()
  163. {
  164.   dump();
  165.   namdump();
  166. }