/* 
*	File: nikonServerMessageQueue.cpp
*	Author: Eric Martin
*	
*	Copyright: 2013 MBARI 
*	
*	Contains two similar classes that manage queues of struct's
*	meant for interthread interactions of control messages
*	and for image names.
*	
*/

#include "nikonServerMessageQueue.h"


nikonServerMessageQueue::nikonServerMessageQueue(void):ulQueueMaxSize(100)
{
	
}


nikonServerMessageQueue::~nikonServerMessageQueue(void)
{
	recvQ.empty();
	sendQ.empty();
}

bool nikonServerMessageQueue::retrieveRecvPacket(char * destbuff, int  &destlen, int &destid){

	//test if the q is empty
	if (recvQ.empty()) return false;
	
	//get the packet
	nikonPacket npLatest = recvQ.front();
	memcpy(destbuff,npLatest.msgbuf,npLatest.msglen);
	destlen = npLatest.msglen;

	//all done, pop off the front
	recvQ.pop();
	return true;
}
bool nikonServerMessageQueue::retrieveSendPacket(char * destbuff, int &destlen, int &destid){

	//test if the q is empty
	if (sendQ.empty()) return false;
	
	//get the packet
	nikonPacket npLatest = sendQ.front();
	memcpy(destbuff,npLatest.msgbuf,npLatest.msglen);
	destlen = npLatest.msglen;


	//all done, pop off the front
	sendQ.pop();
	return true;
}
bool nikonServerMessageQueue::enqueueRecvPacket(char * srcbuff, int srclen, int srcid) {
	
	if (recvQ.size() >= ulQueueMaxSize) return false; // queue is full, cannot accept more messages.
	nikonPacket npLatest;
	memcpy(npLatest.msgbuf,srcbuff,srclen);
	npLatest.msglen = srclen;
	recvQ.push(npLatest);
	return true;
}

bool nikonServerMessageQueue::enqueueSendPacket(char * srcbuff, int srclen, int srcid) {
	
	if (sendQ.size() >= ulQueueMaxSize) return false; // queue is full, cannot accept more messages.
	
	nikonPacket npLatest;
	memcpy(npLatest.msgbuf,srcbuff,srclen);
	npLatest.msglen = srclen;
	sendQ.push(npLatest);
	return true;
}

/*
*	Start of string queue
*/
stringQueue::stringQueue(void)
{
	
}

stringQueue::~stringQueue(void)
{
	stringQ.empty();
}

bool stringQueue::retrieveString(char * destbuff, int  &destlen,char * destExifDTOrig, char * destExifDTOrigSS){

	//test if the q is empty
	if (stringQ.empty()) return false;
	
	//get the packet
	sString sLatest = stringQ.front();
	memcpy(destbuff,sLatest.buff,sLatest.msglen);
	destlen = sLatest.msglen;
	memcpy(destExifDTOrig,sLatest.exifDTOrig,19);
	memcpy(destExifDTOrigSS,sLatest.exifDTOrigSS,3);
	
	//all done, pop off the front
	stringQ.pop();
	return true;
}

bool stringQueue::enqueueString(char * srcbuff, int srclen, char * srcExifDTOrig, char * srcExifDTOrigSS) {
	
	if (stringQ.size() >= iMaxQueueSize) return false; // queue is full, cannot accept more messages.
	sString sLatest;
	
	memcpy(sLatest.buff,srcbuff,srclen);
	sLatest.msglen = srclen;
	memcpy(sLatest.exifDTOrig,srcExifDTOrig,19);
	memcpy(sLatest.exifDTOrigSS,srcExifDTOrigSS,4);
	stringQ.push(sLatest);
	return true;
}



