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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1991,1993 Regents of the University of 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 Computer Systems
  16.  * Engineering Group at Lawrence Berkeley Laboratory.
  17.  * 4. Neither the name of the University nor of the Laboratory 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.  * @(#) $Header: /cvsroot/nsnam/nam-1/node.h,v 1.40 2006/09/28 06:25:03 tom_henderson Exp $ (LBL)
  34.  */
  35. #ifndef nam_node_h
  36. #define nam_node_h
  37. class Queue;
  38. class Edge;
  39. class Agent;
  40. class Route;
  41. class Monitor;
  42. class NetView;
  43. //class PSView;
  44. class EditView;
  45. class Lan;
  46. #include <math.h>
  47. #include <string.h>
  48. #include <tcl.h>
  49. #include <tclcl.h>
  50. #include "animation.h"
  51. struct NodeMark {
  52. NodeMark() { name = NULL; color = 0; next = 0; }
  53. NodeMark(char *str) {
  54. name = new char[strlen(str)+1];
  55. strcpy(name, str);
  56. color = 0;
  57. next = 0;
  58. }
  59. ~NodeMark() { delete []name; }
  60. char *name;
  61. int color;
  62. int shape;
  63. struct NodeMark *next;
  64. };
  65. const float NodeMarkScale = 0.15;
  66. const int NodeMarkCircle = 0;
  67. const int NodeMarkSquare = 4;
  68. const int NodeMarkHexagon = 6;
  69. class MovementElement {
  70. public:
  71. MovementElement(double time, double x, double y);
  72. MovementElement(double time, double x, double y,
  73.                 double x_velocity, double y_velocity, double duration);
  74. ~MovementElement();
  75. bool contains(double time, double duration);  // returns true if time >= time_ 
  76.                                               // and < time_ + duration_
  77. MovementElement * next_;
  78. double time_;
  79. double x_, y_;
  80. double x_velocity_, y_velocity_;
  81. double duration_;
  82. };
  83. // This is a list to keep track of node movements
  84. class MovementList {
  85. public:
  86. MovementList();
  87. ~MovementList();
  88. void clear();
  89. MovementElement * head() {return head_;}
  90. MovementElement * add(double x, double y, double time);
  91. void remove(double time);
  92. void setList(char * list_string);
  93. int getListString(char* buffer, int buffer_size);
  94. bool isMoving(double time);
  95. double lastStopMovement();
  96. void getPositionAt(double time, double & x, double & y);
  97. private:
  98. MovementElement * head_;
  99. int size_;
  100. };
  101. class Node : public Animation, public TclObject {
  102. public:
  103. virtual ~Node();
  104. virtual int classid() const { return ClassNodeID; }
  105. inline const char* name() const { return (label_); }
  106. inline char* ncolor() const { return (ncolor_); }
  107. inline int num() const { return (nn_); }
  108. inline int number() const { return (nn_); }
  109. inline int addr() const { return (addr_); }
  110. inline double size() const { return (size_); }
  111. inline float nsize() const { return (nsize_); }
  112. inline Agent* agents() const { return (agents_); }
  113. virtual void size(double s);
  114. virtual void reset(double);
  115. inline double x() const { return (x_); }
  116. inline double y() const { return (y_); }
  117. virtual double x(Edge *) const { return (x_); }
  118. virtual double y(Edge *) const { return (y_); }
  119. inline double dx() const { return (dx_); }
  120. inline double dy() const { return (dy_); }
  121. void displace(double dx, double dy) {
  122. dx_ = dx; dy_ = dy;
  123. }
  124. virtual void move(EditView *v, float dwx, float dwy);
  125. void updatePositionAt(double time);
  126. virtual float distance(float x, float y) const;
  127. inline double distance(Node &n) const { 
  128. return sqrt((x_-n.x_)*(x_-n.x_) + (y_-n.y_)*(y_-n.y_));
  129. }
  130. inline double angle(Node &n) const {
  131. return atan2(n.y_-y_, n.x_-x_);
  132. }
  133. void setstart(double t) { starttime_ = t;}
  134. void setend(double t) { endtime_ = t;}
  135. void setvelocity(double x, double y) { x_vel_=x; y_vel_=y;}
  136. void placeorig(double x, double y) { xorig_=x; yorig_=y;}
  137. MovementElement * addMovementDestination(double world_x, 
  138.                                          double world_y,
  139.                                          double time);
  140. void removeMovementDestination(double time);
  141. int getMovementTimeList(char * buffer, int buffer_size);
  142. double getMaximumX();
  143. double getMaximumY();
  144. void setaddr(int addr) { addr_ = addr; }
  145. virtual void place(double x, double y);
  146. void label(const char* name, int anchor);
  147. void dlabel(const char* name);
  148. void lcolor(const char* name);
  149. void dcolor(const char* name);
  150. void ncolor(const char* name);
  151. void direction(const char* name);
  152. inline int anchor() const { return (anchor_); }
  153. inline void anchor(int v) { anchor_ = v; }
  154. void add_link(Edge*);
  155. void delete_link(Edge*);
  156. void add_agent(Agent*);
  157. void add_route(Route*);
  158. void delete_route(Route*);
  159. void place_route(Route*);
  160. void place_all_routes();
  161. void clear_routes();
  162. void delete_agent(Agent*);
  163. Route *find_route(Edge *e, int group, int pktsrc, int oif) const;
  164. Agent *find_agent(char *name) const;
  165. Edge *find_edge(int dst) const;
  166. int no_of_routes(Edge *e) const;
  167. virtual int inside(double t, float px, float py) const { 
  168. return Animation::inside(t, px, py);
  169. }
  170. const char* info() const;
  171. const char* property();
  172. const char* getname() const;
  173. void monitor(Monitor *m, double now, char *result, int len);
  174. inline Edge* links() const { return (links_); }
  175. inline int marked() const { return (mark_); }
  176. inline void mark(int v) { mark_ = v; }
  177. inline int mass() const { return mass_; }
  178. inline void mass(int m) {mass_=m;}
  179. virtual char *style() {return 0;}
  180. virtual void update(double now);
  181. void init_color(const char *clr);
  182. void set_down(char *color);
  183. void set_up();
  184. inline int isdown() const { return (state_ == DOWN); }
  185. NodeMark* find_mark(char *name);
  186. int add_mark(char *name, char *color, char *shape);
  187. void delete_mark(char *name);
  188. virtual void arrive_packet(Packet *, Edge *, double) {/*do nothing*/}
  189. virtual void delete_packet(Packet *) {/*do nothing*/}
  190. int save(FILE *file);
  191. int writeNsScript(FILE *file);
  192. int writeNsMovement(FILE *file);
  193. Node* next_;
  194. Queue *queue_;
  195. Queue* queue() { return queue_; }
  196. void add_sess_queue(unsigned int grp, Queue *q);
  197. char * getTclScript();
  198. char * getTclScriptLabel();
  199. void setTclScript(const char * label, const char * script);
  200. int command(int argc, const char * const * argv);
  201. protected:
  202. Node(const char* name, double size);
  203. void update_bb();
  204. void drawlabel(View*) const;
  205. int mass_; //mass used in AutoNetModel
  206. double size_;
  207. float nsize_;
  208. double x_, y_;
  209. double xorig_, yorig_;
  210. double x_vel_,y_vel_;
  211. double starttime_, endtime_;
  212. Edge* links_;
  213. Route* routes_;
  214. Agent* agents_;
  215. int anchor_;
  216. int mark_;
  217. char* label_;
  218. int nn_; // Node id
  219. int addr_; // Node address
  220. int state_;
  221. NodeMark *nm_;
  222. int nMark_;
  223. void draw_mark(View *) const;
  224. char* dlabel_;  // Label to be drawn beneath the node
  225. char* lcolor_;  // Inside label color
  226. char* dcolor_;  // label color
  227. char* ncolor_;  // node color
  228. int direction_;
  229. double dx_, dy_; // displacements used in AutoNetModel
  230. char * tcl_script_label_; // Text for tcl_script info button
  231. char * tcl_script_; // Tcl script to be executed when 
  232.                     // tcl_script info button is pressed
  233. MovementList movement_list;
  234. public:
  235. bool wireless_; // Indicates if this is a wireless node or not;
  236. };
  237. class BoxNode : public Node {
  238. public:
  239. BoxNode(const char* name, double size);
  240. virtual void size(double s);
  241. virtual void draw(View*, double now);
  242. virtual void place(double x, double y);
  243. char *style() {return "box";}
  244. private:
  245. float x0_, y0_;
  246. float x1_, y1_;
  247. };
  248. class CircleNode : public Node {
  249. public:
  250. CircleNode(const char* name, double size);
  251. virtual void size(double s);
  252. virtual void draw(View*, double now);
  253. char *style() {return "circle";}
  254. private:
  255. float radius_;
  256. };
  257. class HexagonNode : public Node {
  258. public:
  259. HexagonNode(const char* name, double size);
  260. virtual void size(double s);
  261. virtual void draw(View*, double now);
  262. virtual void place(double x, double y);
  263. char *style() {return "hexagon";}
  264. private:
  265. float ypoly_[6];
  266. float xpoly_[6];
  267. };
  268. class VirtualNode : public Node {
  269. public:
  270. VirtualNode(const char* name, Lan *lan);
  271. virtual void size(double s);
  272. virtual void draw(View*, double now);
  273. virtual void place(double x, double y);
  274. virtual void arrive_packet(Packet *p, Edge *e, double atime);
  275. virtual void delete_packet(Packet *p);
  276. virtual double x(Edge *e) const;
  277. virtual double y(Edge *e) const;
  278. char *style() {return "virtual";}
  279. private:
  280. Lan *lan_;
  281. };
  282. #endif