00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CMESSAGE_H
00020 #define __CMESSAGE_H
00021
00022 #include <time.h>
00023 #include "cobject.h"
00024 #include "carray.h"
00025 #include "cpar.h"
00026 #include "csimul.h"
00027
00028
00029 class cPar;
00030 class cGate;
00031 class cChannel;
00032 class cModule;
00033 class cSimpleModule;
00034 class cCompoundModule;
00035 class cSimulation;
00036 class cMessageHeap;
00037
00038
00047 enum eMessageKind
00048 {
00049 MK_STARTER = -1,
00050 MK_TIMEOUT = -2,
00051 MK_PACKET = -3,
00052 MK_INFO = -4
00053 };
00054
00055
00056
00084 class SIM_API cMessage : public cObject
00085 {
00086 friend class cMessageHeap;
00087
00088 private:
00089 int msgkind;
00090 int prior;
00091 long len;
00092 bool error;
00093 simtime_t tstamp;
00094 cArray *parlistp;
00095 cMessage *encapmsg;
00096 void *contextptr;
00097
00098 int frommod,fromgate;
00099 int tomod,togate;
00100 simtime_t created;
00101 simtime_t sent,delivd;
00102
00103 int heapindex;
00104 unsigned long insertordr;
00105
00106
00107
00108 void _createparlist();
00109
00110
00111 static unsigned long total_msgs;
00112 static unsigned long live_msgs;
00113
00114 public:
00117
00121 cMessage(const cMessage& msg);
00122
00126 explicit cMessage(const char *name=NULL, int k=0, long len=1, int pri=0, bool err=false);
00127
00131 virtual ~cMessage();
00132
00137 cMessage& operator=(const cMessage& msg);
00139
00142
00147 virtual cObject *dup() const {return new cMessage(*this);}
00148
00153 virtual void info(char *buf);
00154
00159 virtual void forEach( ForeachFunc do_fn );
00160
00165 virtual void writeContents(ostream& os);
00166
00172 virtual int netPack();
00173
00179 virtual int netUnpack();
00181
00184
00189 void setKind(int k) {msgkind=k;}
00190
00196 void setPriority(int p) {prior=p;}
00197
00203 void setLength(long l);
00204
00212 void addLength(long delta);
00213
00217 void setBitError(bool err) {error=err;}
00218
00222 void setTimestamp() {tstamp=simulation.simTime();}
00223
00227 void setTimestamp(simtime_t t) {tstamp=t;}
00228
00232 void setContextPointer(void *p) {contextptr=p;}
00233
00237 int kind() const {return msgkind;}
00238
00242 int priority() const {return prior;}
00243
00247 long length() const {return len;}
00248
00252 bool hasBitError() const {return error;}
00253
00257 simtime_t timestamp() const {return tstamp;}
00258
00262 unsigned long insertOrder() const {return insertordr;}
00263
00267 void *contextPointer() const {return contextptr;}
00269
00272
00286 cArray& parList()
00287 {if (!parlistp) _createparlist(); return *parlistp;}
00288
00299 cPar& addPar(const char *s) {cPar *p=new cPar(s);parList().add(p);return *p;}
00300
00310 cPar& addPar(cPar *p) {parList().add(p); return *p;}
00311
00315 cPar& addPar(cPar& p) {parList().add(&p); return p;}
00316
00328 cPar& par(int n);
00329
00342 cPar& par(const char *s);
00343
00354 int findPar(const char *s) const;
00355
00366 bool hasPar(const char *s) const {return findPar(s)>=0;}
00367
00377 cObject *addObject(cObject *p) {parList().add(p); return p;}
00378
00389 cObject *getObject(const char *s) {return parList().get(s);}
00390
00400 bool hasObject(const char *s) {return !parlistp ? false : parlistp->find(s)>=0;}
00401
00412 cObject *removeObject(const char *s) {return parList().remove(s);}
00413
00424 cObject *removeObject(cObject *p) {return parList().remove(p);}
00426
00429
00434 void encapsulate(cMessage *msg);
00435
00441 cMessage *decapsulate();
00442
00446 cMessage *encapsulatedMsg() const {return encapmsg;}
00448
00451
00455 bool isSelfMessage() const {return togate==-1;}
00456
00460 bool isScheduled() const {return heapindex!=-1;}
00461
00467 cGate *senderGate() const;
00468
00474 cGate *arrivalGate() const;
00475
00480 int senderModuleId() const {return frommod;}
00481
00486 int senderGateId() const {return fromgate;}
00487
00492 int arrivalModuleId() const {return tomod;}
00493
00498 int arrivalGateId() const {return togate;}
00499
00503 simtime_t creationTime() const {return created;}
00504
00509 simtime_t sendingTime() const {return sent;}
00510
00515 simtime_t arrivalTime() const {return delivd;}
00516
00520 bool arrivedOn(int g) const {return g==togate;}
00521
00526 bool arrivedOn(const char *s, int g=0);
00528
00531
00537 virtual void setSentFrom(cModule *module, int gate, simtime_t t);
00538
00544 virtual void setArrival(cModule *module, int gate);
00545
00551 virtual void setArrival(cModule *module, int gate, simtime_t t);
00552
00557 virtual void setArrivalTime(simtime_t t);
00559
00562
00569 virtual const char *displayString() const;
00570
00575 static int cmpbydelivtime(cObject *one, cObject *other);
00576
00582 static int cmpbypriority(cObject *one, cObject *other);
00583
00588 static unsigned long totalMessageCount() {return total_msgs;}
00589
00595 static unsigned long liveMessageCount() {return live_msgs;}
00596
00600 static void resetMessageCounters() {total_msgs=live_msgs=0L;}
00602 };
00603
00604 #endif
00605
00606