bool Client::Peek(EventMessage &msg) { message_queue* const mq = (message_queue*)this->privateQueue; // check local deque for message if(!this->storedMessages.empty()) { // get first queued element and pop it msg = this->storedMessages.front(); this->storedMessages.pop_front(); return true; } std::stringbuf msgBuffer; char buff[MAX_MSG_SIZE]; size_t recvd; unsigned int priority; if(mq->try_receive(buff, MAX_MSG_SIZE, recvd, priority)) { msgBuffer.sputn(buff, recvd); msg.deserialize(msgBuffer); return HandleMessage(msg, priority); } else return false; return true; }
bool Client::WaitForEvent(EventMessage &msg, std::string eventType, unsigned int timeout) { namespace pt = boost::posix_time; message_queue* const mq = (message_queue*)this->privateQueue; // initialize timer pt::ptime timeoutInstant; if(timeout != 0) { timeoutInstant = pt::microsec_clock::universal_time() + pt::millisec(timeout); } // check local deque for message if(!this->storedMessages.empty()) { for (unsigned int i=0; i<this->storedMessages.size(); i++) { EventMessage & dequeMsg = this->storedMessages[i]; if( 0 ==dequeMsg.getEventType().compare(eventType) ) { // copy message to the output msg = dequeMsg; // erase message from deque this->storedMessages.erase(this->storedMessages.begin()+i); return true; } } } char buff[MAX_MSG_SIZE]; size_t recvd; unsigned int priority; std::stringbuf msgBuffer; bool gotRequest = false; while(!gotRequest) { // try to get message if(timeout == 0) mq->receive(buff, MAX_MSG_SIZE, recvd, priority); else { if(!mq->timed_receive(buff, MAX_MSG_SIZE, recvd, priority, timeoutInstant)) { // timeout reached return false; } } // transform buffer into message msgBuffer.sputn(buff, recvd); msg.deserialize(msgBuffer); // check if recieved message has correct type if( 0 == msg.getEventType().compare(eventType) ) { gotRequest = true; } else { // store recieved message into local deque this->storedMessages.push_back(msg); } } return true; }