I3Composite.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00023 #include "I3BaseApp.h"
00024
00025 using namespace std;
00026
00027 struct I3CompositeMessage : public cPacket {
00028 string sentence;
00029
00030 I3CompositeMessage *dup() const {
00031 return new I3CompositeMessage(*this);
00032 }
00033 };
00034
00043 class I3Composite : public I3BaseApp
00044 {
00045 private:
00046 static int index;
00047 public:
00048 int myIndex;
00049 cMessage *sendPacketTimer;
00050
00051 void initializeApp(int stage);
00052 void initializeI3();
00053 void deliver(I3Trigger &trigger, I3IdentifierStack &stack, cPacket *msg);
00054 void handleTimerEvent(cMessage *msg);
00055 void createMessage();
00056 };
00057
00058 int I3Composite::index = 0;
00059
00060 void I3Composite::initializeApp(int stage)
00061 {
00062 myIndex = index++;
00063
00064 }
00065
00066 void I3Composite::initializeI3()
00067 {
00068 if (myIndex == 0) {
00069 sendPacketTimer = new cMessage("packet timer");
00070 scheduleAt(simTime() + 50, sendPacketTimer);
00071 }
00072
00073 ostringstream os;
00074 os << "Composite " << myIndex;
00075
00076 I3Identifier identifier(os.str());
00077 insertTrigger(identifier);
00078 }
00079
00080 void I3Composite::createMessage() {
00081 I3CompositeMessage *cmsg = new I3CompositeMessage();
00082
00083 cmsg->sentence = "";
00084
00085 I3Identifier id0("Composite 0"),
00086 id1("Composite 1"),
00087 id2("Composite 2"),
00088 id3("Composite 3"),
00089 id4("Composite 4");
00090
00091 I3IdentifierStack stack;
00092 stack.push(id0);
00093 stack.push(id4);
00094 stack.push(id3);
00095 stack.push(id2);
00096 stack.push(id1);
00097
00098 sendPacket(stack, cmsg);
00099 }
00100
00101 void I3Composite::handleTimerEvent(cMessage *msg)
00102 {
00103 if (myIndex == 0) {
00104 getParentModule()->bubble("Starting chain!");
00105 createMessage();
00106 }
00107 delete msg;
00108 }
00109
00110 void I3Composite::deliver(I3Trigger &trigger, I3IdentifierStack &stack, cPacket *msg)
00111 {
00112 I3CompositeMessage *cmsg = check_and_cast<I3CompositeMessage*>(msg);
00113
00114 switch (myIndex) {
00115 case 0:
00116 {
00117 string final = "Final sentence: " + cmsg->sentence;
00118 getParentModule()->bubble(final.c_str());
00119 delete msg;
00120 createMessage();
00121 return;
00122 }
00123 case 1:
00124 getParentModule()->bubble("Adding 'He pounds'");
00125 cmsg->sentence += "He pounds ";
00126 break;
00127 case 2:
00128 getParentModule()->bubble("Adding 'his fists'");
00129 cmsg->sentence += "his fists ";
00130 break;
00131 case 3:
00132 getParentModule()->bubble("Adding 'against'");
00133 cmsg->sentence += "against ";
00134 break;
00135 case 4:
00136 getParentModule()->bubble("Adding 'the posts'");
00137 cmsg->sentence += "the posts ";
00138 break;
00139 default:
00140 delete msg;
00141 return;
00142 }
00143 sendPacket(stack, cmsg);
00144 }
00145
00146
00147 Define_Module(I3Composite);
00148
00149