Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "IPAddress.h"
00019 #include "RTPApplication.h"
00020 #include "RTPInterfacePacket.h"
00021
00022 Define_Module(RTPApplication)
00023
00024
00025 void RTPApplication::initialize()
00026 {
00027
00028
00029
00030
00031 _commonName = par("commonName");
00032
00033
00034 _profileName = par("profileName");
00035
00036
00037 _bandwidth = par("bandwidth");
00038
00039
00040 _destinationAddress = IPAddress(par("destinationAddress").stringValue());
00041
00042
00043
00044 _port = (int)par("portNumber").longValue();
00045
00046
00047
00048 _fileName = par("fileName");
00049
00050
00051 _payloadType = par("payloadType");
00052
00053 _sessionEnterDelay = par("sessionEnterDelay");
00054 _transmissionStartDelay = par("transmissionStartDelay");
00055 _transmissionStopDelay = par("transmissionStopDelay");
00056 _sessionLeaveDelay = par("sessionLeaveDelay");
00057
00058 ev<< "commonName" << _commonName <<endl;
00059 ev<< "profileName" << _profileName <<endl;
00060 ev<< "bandwidth" << _bandwidth <<endl;
00061 ev<< "destinationAddress" << _destinationAddress <<endl;
00062 ev<< "portNumber" << _port <<endl;
00063 ev<< "fileName" << _fileName <<endl;
00064 ev<< "payloadType" << _payloadType <<endl;
00065 }
00066
00067
00068 void RTPApplication::activity()
00069 {
00070
00071
00072 bool sessionEntered = false;
00073 bool transmissionStarted = false;
00074 bool transmissionFinished = false;
00075 bool sessionLeft = false;
00076
00077 cMessage *msg1 = new cMessage("enterSession");
00078 scheduleAt(simTime() + _sessionEnterDelay, msg1);
00079
00080 uint32 ssrc = 0;
00081
00082 while (!sessionLeft) {
00083
00084 cMessage *msgIn = receive();
00085 if (msgIn->isSelfMessage()) {
00086 if (!opp_strcmp(msgIn->getName(), "enterSession")) {
00087 ev << "enterSession"<<endl;
00088
00089 RTPInterfacePacket *rifpOut1 = new RTPInterfacePacket("enterSession()");
00090 rifpOut1->enterSession(opp_strdup(_commonName), opp_strdup(_profileName), _bandwidth, _destinationAddress, _port);
00091
00092 send(rifpOut1, "rtpOut");
00093 }
00094 else if (!opp_strcmp(msgIn->getName(), "startTransmission")) {
00095 ev << "startTransmission"<<endl;
00096 RTPSenderControlMessage *rscm = new RTPSenderControlMessage();
00097 rscm->setCommand("PLAY");
00098 RTPInterfacePacket *rifpOut = new RTPInterfacePacket("senderModuleControl(PLAY)");
00099 rifpOut->senderModuleControl(ssrc, rscm);
00100 send(rifpOut, "rtpOut");
00101 transmissionStarted = true;
00102
00103 cMessage *msg4 = new cMessage("stopTransmission");
00104 scheduleAt(simTime() + _transmissionStopDelay, msg4);
00105 }
00106 else if (!opp_strcmp(msgIn->getName(), "stopTransmission")) {
00107 ev << "stopTransmission"<<endl;
00108 RTPSenderControlMessage *rscm = new RTPSenderControlMessage();
00109 rscm->setCommand("STOP");
00110 RTPInterfacePacket *rifpOut = new RTPInterfacePacket("senderModuleControl(STOP)");
00111 rifpOut->senderModuleControl(ssrc, rscm);
00112 send(rifpOut, "rtpOut");
00113 }
00114 else if (!opp_strcmp(msgIn->getName(), "leaveSession")) {
00115 ev<< "leaveSession"<<endl;
00116 RTPInterfacePacket *rifpOut = new RTPInterfacePacket("leaveSession()");
00117 rifpOut->leaveSession();
00118 send(rifpOut, "rtpOut");
00119 }
00120 }
00121 else {
00122 RTPInterfacePacket *rifpIn = check_and_cast<RTPInterfacePacket *>(msgIn);
00123
00124 if (rifpIn->getType() == RTPInterfacePacket::RTP_IFP_SESSION_ENTERED) {
00125 ev << "Session Entered"<<endl;
00126 ssrc = rifpIn->getSSRC();
00127 sessionEntered = true;
00128 if (opp_strcmp(_fileName, "")) {
00129 RTPInterfacePacket *rifpOut = new RTPInterfacePacket("createSenderModule()");
00130 rifpOut->createSenderModule(ssrc, _payloadType, opp_strdup(_fileName));
00131 ev << "CreateSenderModule"<<endl;
00132 send(rifpOut, "rtpOut");
00133 }
00134 else {
00135 cMessage *msg2 = new cMessage("leaveSession");
00136 ev << "Receiver Module : leaveSession"<<endl;
00137 scheduleAt(simTime() + _sessionLeaveDelay, msg2);
00138 }
00139 }
00140 else if (rifpIn->getType() == RTPInterfacePacket::RTP_IFP_SENDER_MODULE_CREATED) {
00141 cMessage *msg3 = new cMessage("startTransmission");
00142 ev << "Sender Module Created"<<endl;
00143 scheduleAt(simTime() + _transmissionStartDelay, msg3);
00144 }
00145 else if (rifpIn->getType() == RTPInterfacePacket::RTP_IFP_SENDER_STATUS) {
00146 RTPSenderStatusMessage *rsim = (RTPSenderStatusMessage *)(rifpIn->decapsulate());
00147 if (!opp_strcmp(rsim->getStatus(), "PLAYING")) {
00148 ev << "PLAYING"<<endl;
00149 }
00150 else if (!opp_strcmp(rsim->getStatus(), "FINISHED")) {
00151 transmissionFinished = true;
00152 ev << "FINISHED"<<endl;
00153 cMessage *msg5 = new cMessage("leaveSession");
00154 scheduleAt(simTime() + _sessionLeaveDelay, msg5);
00155 }
00156 else if (!opp_strcmp(rsim->getStatus(), "STOPPED")) {
00157 transmissionFinished = true;
00158 ev << "FINISHED"<<endl;
00159 cMessage *msg6 = new cMessage("leaveSession");
00160 scheduleAt(simTime() + _sessionLeaveDelay, msg6);
00161 }
00162 else {
00163 delete rifpIn;
00164 }
00165 cancelAndDelete(rsim);
00166 }
00167 else if (rifpIn->getType() == RTPInterfacePacket::RTP_IFP_SESSION_LEFT) {
00168 sessionLeft = true;
00169 }
00170 }
00171 delete msgIn;
00172
00173 }
00174 }