#include "lowreceiver.h" #include "messagecell_cb.h" void LowReceiver::manage_cbcast(Message * mesg) { static std::list fifo_get; static std::list fifo_send; std::list::iterator iter; printf("LowReceiver::manage_cbcast -- init\n"); // identifiant = horloge + id_site_emeteur bool iAmTheEmitter = false; bool firstSeenMessage = true; if (mesg->getStamp().getIndex() == _group.getIndex()){ iAmTheEmitter = true; } if (iAmTheEmitter){ printf("LowReceiver::manage_cbcast - Received my own message \n"); //on faire la gestion du cbcast/send ici, c'est plus simple que //de partager une variable+mutex avec le sender //FIXME: chercher si l'on a déja recu ce message MessageCellCb * cell = NULL; for (iter = fifo_send.begin(); iter != fifo_send.end(); iter++){ //on fait pointer cell sur la cellule si égale a l'id du message //courant MessageCellCb * cur = *iter; if (cur->message == mesg){ printf("LowReceiver::manage_cbcast -- message seen\n"); firstSeenMessage = false; cell = cur; break; } } if (firstSeenMessage){ //sinon on le crée printf("LowReceiver::manage_cbcast -- message is first\n"); cell = new MessageCellCb(); cell->message = new Message(*mesg); //et on l'ajoute au fifo fifo_send.push_back(cell); } //FIXME: comparer le timestamp max a ceux que l'on recoit cell->count += 1; if (cell->count == _group.getCount()){ // broadcaster le nouveau timestamp du message // // le message a broadcaster est exactement le message max // reçu... mais bon... on le reconstruit quand m^eme // IMPROVE TimeStamp st = cell->message->getStamp(); Message * nMsg = new Message(Protocol::TYPE_ABCAST, st, cell->maximum->getRaw(), cell->maximum->getRawSize()); _group.broadcast(*nMsg); } } else { printf("LowReceiver::manage_cbcast - Received a message from a friend\n"); for (iter = fifo_get.begin(); iter != fifo_get.end(); iter++){ MessageCellCb * cur = *iter; if (cur->message == mesg) { printf("LowReceiver::manage_cbcast -- message seen\n"); firstSeenMessage = false; break; } } if (firstSeenMessage){ printf("LowReceiver::manage_cbcast -- message is first\n"); // si le message est vu pour la premiere fois: // - on l'ajoute dans la liste d'attente MessageCellCb * cell = new MessageCellCb(); cell->message = new Message(*mesg); cell->type = MessageCellCb::TYPE_TEMPORARY; // - on retourne une estampille(reception) a l'emeteur } else { // sinon // - l'estampille du message est mise a jour TimeStamp * stamp = new TimeStamp (Protocol::TYPE_ABCAST, mesg->getData(), mesg->getDataSize()); // - le message est marqué comme final // - on défile les estampille finale la } } }