00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef lint
00036 static const char rcsid[] =
00037 "@(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/common/message.cc,v 1.13 1998/08/12 23:41:08 gnguyen Exp $ (LBL)";
00038 #endif
00039
00040 #include "agent.h"
00041 #include "random.h"
00042 #include "message.h"
00043
00044 int hdr_msg::offset_;
00045
00046 static class MessageHeaderClass : public PacketHeaderClass {
00047 public:
00048 MessageHeaderClass() : PacketHeaderClass("PacketHeader/Message",
00049 sizeof(hdr_msg)) {
00050 bind_offset(&hdr_msg::offset_);
00051 }
00052 } class_msghdr;
00053
00054 class MessageAgent : public Agent {
00055 public:
00056 MessageAgent();
00057 int command(int argc, const char*const* argv);
00058 void recv(Packet*, Handler*);
00059 };
00060
00061 static class MessageClass : public TclClass {
00062 public:
00063 MessageClass() : TclClass("Agent/Message") {}
00064 TclObject* create(int, const char*const*) {
00065 return (new MessageAgent());
00066 }
00067 } class_message;
00068
00069 MessageAgent::MessageAgent() : Agent(PT_MESSAGE)
00070 {
00071 bind("packetSize_", &size_);
00072 }
00073
00074 void MessageAgent::recv(Packet* pkt, Handler*)
00075 {
00076 hdr_msg* mh = hdr_msg::access(pkt);
00077 char wrk[128];
00078 sprintf(wrk, "%s recv {%s}", name(), mh->msg());
00079
00080 Tcl& tcl = Tcl::instance();
00081 tcl.eval(wrk);
00082
00083 Packet::free(pkt);
00084 }
00085
00086
00087
00088
00089
00090 int MessageAgent::command(int argc, const char*const* argv)
00091 {
00092 Tcl& tcl = Tcl::instance();
00093 if (argc == 3) {
00094 if (strcmp(argv[1], "send") == 0) {
00095 Packet* pkt = allocpkt();
00096 hdr_msg* mh = hdr_msg::access(pkt);
00097 const char* s = argv[2];
00098 int n = strlen(s);
00099 if (n >= mh->maxmsg()) {
00100 tcl.result("message too big");
00101 Packet::free(pkt);
00102 return (TCL_ERROR);
00103 }
00104 strcpy(mh->msg(), s);
00105 send(pkt, 0);
00106 return (TCL_OK);
00107 }
00108 }
00109 return (Agent::command(argc, argv));
00110 }