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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1997 University of Southern California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *      This product includes software developed by the Information Sciences
  16.  *      Institute of the University of Southern California.
  17.  * 4. Neither the name of the University nor of the Institute may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  */
  34. #ifdef WIN32
  35. #include <windows.h>
  36. #endif
  37. #include "netview.h"
  38. #include "psview.h"
  39. #include "route.h"
  40. #include "feature.h"
  41. #include "agent.h"
  42. #include "edge.h"
  43. #include "node.h"
  44. #include "monitor.h"
  45. #include "paint.h"
  46. Route::Route(Node *n, Edge *e, int group, int pktsrc, int negcache, int oif, 
  47.      double timer, double now) :
  48.   Animation(0, 0),
  49.   next_(0),
  50.   edge_(e),
  51.   node_(n),
  52.   group_(group),
  53.   pktsrc_(pktsrc),
  54.   timeout_(timer),
  55.   timeset_(now),
  56.   anchor_(0),
  57.   mark_(0)
  58. {
  59.   mode_=0;
  60.   if (negcache==1)
  61.     mode_|=NEG_CACHE;
  62.   else
  63.     mode_|=POS_CACHE;
  64.   if (oif==1)
  65.     mode_|=OIF;
  66.   else
  67.     mode_|=IIF;
  68.   /*copy the transform matrix from the edge*/
  69.   angle_ = e->angle();
  70.   matrix_ = e->transform();
  71. }
  72. Route::~Route()
  73. {
  74.   if (monitor_!=NULL) {
  75.     monitor_->delete_monitor_object(this);
  76.   }
  77. }
  78. void Route::update_bb() 
  79. {
  80.   bb_.xmin = x_[0];
  81.   bb_.xmax = x_[0];
  82.   bb_.ymin = y_[0];
  83.   bb_.ymax = y_[0];
  84.   for(int i=1;i<npts_;i++)
  85.     {
  86.       if (bb_.xmin>x_[i]) bb_.xmin=x_[i];
  87.       if (bb_.xmax<x_[i]) bb_.xmax=x_[i];
  88.       if (bb_.ymin>y_[i]) bb_.ymin=y_[i];
  89.       if (bb_.ymax<y_[i]) bb_.ymax=y_[i];
  90.     }
  91. }
  92. // Moved to Animation::inside()
  93. // int Route::inside(double /*now*/, float px, float py) const
  94. // {
  95. //   float minx, maxx, miny, maxy;
  96. //   minx=x_[0];
  97. //   maxx=x_[0];
  98. //   miny=y_[0];
  99. //   maxy=y_[0];
  100. //   for(int i=1;i<npts_;i++)
  101. //     {
  102. //       if (minx>x_[i]) minx=x_[i];
  103. //       if (maxx<x_[i]) maxx=x_[i];
  104. //       if (miny>y_[i]) miny=y_[i];
  105. //       if (maxy<y_[i]) maxy=y_[i];
  106. //     }
  107. //   return ((minx<=px)&&(maxx>=px)&&(miny<=py)&&(maxy>=py));
  108. // }
  109. void Route::place(double x0, double y0)
  110. {
  111. int ctr = node_->no_of_routes(edge_)-1;
  112. place(x0,y0,ctr);
  113. }
  114. void Route::place(double x0, double y0, int ctr)
  115. {
  116.   float tx,ty;
  117.   /*matrix was copied from the edge - don't need to set it up here*/
  118.   //double size=edge_->size();
  119.   double size = node_->size() * 0.2;
  120.   double offset=size*2*(ctr);
  121.   // XXX Make sure we have up-to-date information from the edge
  122.   angle_ = edge_->angle();
  123.   matrix_ = edge_->transform();
  124.   matrix_.imap((float)x0,(float)y0, tx,ty);
  125.   if ((mode_&POS_CACHE)>0)
  126.     {
  127.       if ((mode_&OIF)>0)
  128. {
  129.   matrix_.map((float)tx+offset, (float)(ty+size), x_[0], y_[0]);
  130.   matrix_.map((float)tx+offset, (float)(ty-size), x_[1], y_[1]);
  131.   matrix_.map((float)(tx+offset+size*3), (float)ty, x_[2], y_[2]);
  132. }
  133.       if ((mode_&IIF)>0)
  134. {
  135.   matrix_.map((float)(tx+offset+size*2), (float)(ty+size), 
  136.       x_[0], y_[0]);
  137.   matrix_.map((float)(tx+offset+size*2), (float)(ty-size), 
  138.       x_[1], y_[1]);
  139.   matrix_.map((float)(tx+offset-size), (float)ty, x_[2], y_[2]);
  140. }
  141.       npts_=3;
  142.     }
  143.   else
  144.     {
  145.       matrix_.map((float)(tx+offset), (float)(ty+size), x_[0], y_[0]);
  146.       matrix_.map((float)(tx+offset+size), (float)(ty+size), x_[1], y_[1]);
  147.       matrix_.map((float)(tx+offset+size), (float)(ty-size), x_[2], y_[2]);
  148.       matrix_.map((float)(tx+offset), (float)(ty-size), x_[3], y_[3]);
  149.       npts_=4;
  150.     }
  151.   update_bb(); 
  152. }
  153. int Route::matching_route(Edge *e, int group, int pktsrc, int oif) const
  154. {
  155.   if ((edge_==e)&&(group_==group)&&(pktsrc_==pktsrc))
  156.     {
  157.       if (((oif==1)&&((mode_&OIF)>0)) || ((oif==0)&&((mode_&IIF)>0)))
  158. return 1;
  159.     }
  160.   return 0;
  161. }
  162. const char* Route::info() const
  163. {
  164.         static char text[128];
  165. static char source[64];
  166. if (group_>=0)
  167.   {
  168.     if (pktsrc_<0)
  169.       strcpy(source, "*");
  170.     else
  171.       sprintf(source, "%d", pktsrc_);
  172.       
  173.     sprintf(text, 
  174.     "Multicast Route:nSource:%snGroup:%dnTimeout:%f",
  175.     source, group_, curtimeout_);
  176.     if ((mode_&NEG_CACHE)>0)
  177. strcat(text, "nPrune Entry");
  178.     return (text);
  179.   }
  180. else
  181.   {
  182.     sprintf(text, "Unicast Route:nDestination:%dnTimeout:%f",
  183.     pktsrc_, curtimeout_);
  184.     return (text);
  185.   }
  186. }
  187. const char* Route::getname() const
  188. {
  189.   static char text[128];
  190.   sprintf(text, "r");
  191.   return (text);
  192. }
  193. void Route::monitor(Monitor *m, double /*now*/, char *result, int len) 
  194. {
  195.   monitor_=m;
  196.   strncpy(result, info(), len);
  197. }
  198.  
  199. MonState *Route::monitor_state()
  200. {
  201.   MonState *ms=new MonState;
  202.   ms->type=MON_ROUTE;
  203.   ms->route.src=pktsrc_;
  204.   ms->route.group=group_;
  205.   ms->route.node=node_;
  206.   return ms;
  207. }
  208. void Route::draw(View *nv, double now) {
  209.   nv->fill(x_, y_, npts_, paint_);  
  210.   if (monitor_!=NULL)
  211.     monitor_->draw(nv, (x_[0]+x_[2])/2, (y_[0]+y_[2])/2);
  212. }
  213. //void Route::draw(PSView *nv, double /*now*/) const
  214. /*
  215. {
  216.   nv->fill(x_, y_, npts_, paint_);  
  217. }
  218. */
  219. void Route::update(double now)
  220. {
  221.   curtimeout_=timeout_+timeset_-now;
  222.   if (curtimeout_<0) curtimeout_=0;
  223.   /*XXX could make a zero timeout delete the route*/
  224.   /* but this would make the tracefile unidirectional*/
  225. }
  226. void Route::reset(double /*now*/)
  227. {
  228.   node_->delete_route(this);
  229.   delete this;
  230. }