Switch to side-by-side view

--- a/src/DAF/AE/AEPing.cc
+++ b/src/DAF/AE/AEPing.cc
@@ -29,6 +29,7 @@
 const char* PAR_DSTAPINSTANCE   = "dstApInstance";
 const char* PAR_DSTAENAME       = "dstAeName";
 const char* PAR_DSTAEINSTANCE   = "dstAeInstance";
+const char* VAL_MODULEPATH      = "getFullPath()";
 
 AEPing::AEPing() {
 }
@@ -46,7 +47,7 @@
 void AEPing::preparePing() {
     //Schedule Data transfer
     for (int i = 0; i < rate && pingAt + i < stopAt; i++) {
-        std::stringstream ss;
+        std::ostringstream ss;
         ss << MSG_PING << i;
         cMessage* m2 = new cMessage(ss.str().c_str());
         scheduleAt(pingAt + i, m2);
@@ -82,16 +83,6 @@
     dstAeName     = this->par(PAR_DSTAENAME).stringValue();
     dstAeInstance = this->par(PAR_DSTAEINSTANCE).stringValue();
 
-    //Flow
-    APNamingInfo src = this->getApni();
-    APNamingInfo dst = APNamingInfo( APN(this->dstApName), this->dstApInstance,
-                                     this->dstAeName, this->dstAeInstance);
-    Flow fl = Flow(src, dst);
-    fl.setQosParameters(this->getQoSRequirements());
-
-    //Insert it to the Flows ADT
-    insertFlow(fl);
-
     //Schedule AllocateRequest
     if (startAt > 0)
         prepareAllocateRequest();
@@ -102,27 +93,46 @@
     if (stopAt > 0)
         prepareDeallocateRequest();
 
+    myPath = this->getFullPath();
+
     //Watchers
     WATCH_LIST(flows);
 }
 
 void AEPing::handleSelfMessage(cMessage *msg) {
     //EV << flows.back().info() << endl;
-    if ( !strcmp(msg->getName(), "StartCommunication") ) {
-        //signalizeAllocateRequest(&flows.back());
+    if ( !strcmp(msg->getName(), TIM_START) ) {
         //FIXME: Vesely - last flow in a list?!
-        Irm->receiveAllocationRequest(&flows.back());
+
+        //Flow
+        APNamingInfo src = this->getApni();
+        APNamingInfo dst = APNamingInfo( APN(this->dstApName), this->dstApInstance,
+                                         this->dstAeName, this->dstAeInstance);
+
+        Flow fl = Flow(src, dst);
+        fl.setQosParameters(this->getQoSRequirements());
+
+        //Insert it to the Flows ADT
+        insertFlow(fl);
+
+        sendAllocationRequest(&flows.back());
     }
-    else if ( !strcmp(msg->getName(), "StopCommunication") )
-        //signalizeDeallocateRequest(&flows.back());
-        //Irm->receiveDeallocationRequest(&flows.back());
-        EV << "StopCommunication";
-    else if ( strstr(msg->getName(), "PING") ) {
-        //TODO: Vesely - Send M_READ
-        std::stringstream ss;
-        ss << "M_READ(" << msg->getName() << ")";
-        cMessage* ping = new cMessage(ss.str().c_str());
-        send(ping , "dataIo$o", 0);
+    else if ( !strcmp(msg->getName(), TIM_STOP) ) {
+        //FIXME: Vesely - last flow in a list?!
+        sendDeallocationRequest(&flows.back());
+    }
+    else if ( strstr(msg->getName(), MSG_PING) ) {
+        //Create PING messsage
+        CDAP_M_Read* ping = new CDAP_M_Read(VAL_MODULEPATH);
+        object_t obj;
+        obj.objectName = VAL_MODULEPATH;
+        obj.objectClass = "string";
+        obj.objectInstance = -1;
+        obj.objectVal = (cObject*)(&myPath);
+        ping->setObject(obj);
+
+        //Send message
+        sendData(&flows.back(), ping);
     }
     else
         EV << this->getFullPath() << " received unknown self-message " << msg->getName();
@@ -134,3 +144,46 @@
     if ( msg->isSelfMessage() )
             this->handleSelfMessage(msg);
 }
+
+void AEPing::processMRead(CDAPMessage* msg) {
+    CDAP_M_Read* msg1 = check_and_cast<CDAP_M_Read*>(msg);
+
+    EV << "Received M_Read";
+    object_t object = msg1->getObject();
+    EV << " with object '" << object.objectClass << "'" << endl;
+
+    if ( strstr(object.objectName.c_str(), VAL_MODULEPATH) ) {
+        std::string* source = (std::string*)(object.objectVal);
+        std::ostringstream os;
+        os << "Ping requested by " <<  *source << endl;
+        bubble(os.str().c_str());
+        EV << os.str().c_str();
+
+        //Create PING response
+        CDAP_M_Read_R* pong = new CDAP_M_Read_R(VAL_MODULEPATH);
+        object_t obj;
+        obj.objectName = VAL_MODULEPATH;
+        obj.objectClass = "string";
+        obj.objectInstance = -1;
+        obj.objectVal = (cObject*)(&myPath);
+        pong->setObject(obj);
+
+        sendData(&flows.back(), pong);
+    }
+}
+
+void AEPing::processMReadR(CDAPMessage* msg) {
+    CDAP_M_Read_R* msg1 = check_and_cast<CDAP_M_Read_R*>(msg);
+
+    EV << "Received M_Read_R";
+    object_t object = msg1->getObject();
+    EV << " with object '" << object.objectClass << "'" << endl;
+
+    if ( strstr(object.objectName.c_str(), VAL_MODULEPATH) ) {
+        std::string* source = (std::string*)(object.objectVal);
+        std::ostringstream os;
+        os << "Ping replied by " <<  *source << endl;
+        bubble(os.str().c_str());
+        EV << os.str().c_str();
+    }
+}