#include "mpluginAudio.h"
#include <unistd.h>

using namespace std ;

MonitorAudioPlugIn::MonitorAudioPlugIn()
{
	m_bLockSocketMessages=false;
	for (int i=0; i<MAXAUDIOCLIENTS;i++)
	{
		clearClient(i) ;
	}
}

void MonitorAudioPlugIn::addThreadMessage(SocketThread* pClient, std::string message)
{
	SocketMessage* pMsg=new SocketMessage ;
	pMsg->pThread=pClient ;
	pMsg->message=message ;

	while (m_bLockSocketMessages==true) sleep(3) ;

	m_bLockSocketMessages=true ;
	m_SocketMessages.push_back(pMsg) ;
	m_bLockSocketMessages=false ;
}

void MonitorAudioPlugIn::addThreadMessage(int jobID, std::string message)
{
	if ((jobID<0) || (jobID>=MAXAUDIOCLIENTS))
	{
		ThrowMonitorException ("jobID nicht im erlaubten Bereich: " + convertIntToString(jobID)) ;
	} ;

	addThreadMessage (m_pClient[jobID].pThread,message) ;
}

bool MonitorAudioPlugIn::getThreadMessage(SocketMessage & msg)
{
	bool retVal=false ;

	while (m_bLockSocketMessages) sleep(1) ;

	m_bLockSocketMessages=true ;

	SocketMessage* pMsg ;
	if (m_SocketMessages.size()>0)
	{
		pMsg=m_SocketMessages.back() ;
		m_SocketMessages.pop_back() ;

		msg.pThread=pMsg->pThread ;
		msg.message=pMsg->message ;

		delete pMsg ;
		retVal=true ;
	}
	m_bLockSocketMessages=false ;

	return retVal ;
}

void MonitorAudioPlugIn::broadcastMessage(std::string message)
{
	for (int i=0; i<MAXAUDIOCLIENTS;i++)
	{
		if (m_pClient[i].pThread)
		{
			cout << "sende an : " << i << endl;
			addThreadMessage(m_pClient[i].pThread,message) ;
		}
	}
}

int MonitorAudioPlugIn::addClient(SocketThread *pClient, unsigned long customValue,unsigned long info, std::string infoText)
{
	int i=0 ;
	bool bDuplicate=false;

	while (( m_pClient[i].pThread!=NULL) && (i<MAXAUDIOCLIENTS))
	{
		if (m_pClient[i].pThread==pClient)
		{
			bDuplicate=true ;
			break;
		}
		i++ ;
	}

	if ( (i<MAXAUDIOCLIENTS) && (!bDuplicate) )
	{
		if (pClient)
		{
			m_pClient[i].pThread=pClient ;
			updateClient(i,customValue,0,info,infoText) ;

			cout << "Threadliste: " << i << " hinzugef�gt" << endl ;
		}
	}

	if (i>=MAXAUDIOCLIENTS) i=-1 ;

	return i ;
}

void MonitorAudioPlugIn::updateClient(int jobID, unsigned long customValue,unsigned long customValue2,unsigned long info, std::string infoText, time_t time1,time_t time2)
{
	m_pClient[jobID].customValue=customValue ;
	m_pClient[jobID].customValue2=customValue2 ;
	m_pClient[jobID].info=info ;
	m_pClient[jobID].infoText=infoText;
	m_pClient[jobID].time1=time1 ;
	m_pClient[jobID].time2=time2 ;
}

unsigned long MonitorAudioPlugIn::getCustomValue(int jobID)
{
	return m_pClient[jobID].customValue ;
}

unsigned long MonitorAudioPlugIn::getCustomValue2(int jobID)
{
	return m_pClient[jobID].customValue2 ;
}
SocketThread* MonitorAudioPlugIn::getClient(int jobID)
{
	return m_pClient[jobID].pThread ;
}

unsigned long MonitorAudioPlugIn::getInfo(int jobID)
{
	return m_pClient[jobID].info ;
}

std::string MonitorAudioPlugIn::getInfoText(int jobID)
{
	return m_pClient[jobID].infoText ;
}

time_t MonitorAudioPlugIn::getTime1(int jobID)
{
	return m_pClient[jobID].time1;
}


time_t MonitorAudioPlugIn::getTime2(int jobID)
{
	return m_pClient[jobID].time2;
}

void MonitorAudioPlugIn::clearClient(int jobID)
{
	m_pClient[jobID].pThread=NULL ;
	m_pClient[jobID].info=0 ;
	m_pClient[jobID].infoText="" ;
	m_pClient[jobID].customValue=0 ;
}
int MonitorAudioPlugIn::parseCommand(std::string command)
{
	m_paramCount=0 ;

	for (int i=0;i<9;i++) m_param[i].clear() ;

	int pos ;
	unsigned int start=0 ;
	m_paramCount=0;

	pos=command.find(":",start) ;
	while ((pos>0) && (m_paramCount<9))
	{
		m_param[m_paramCount++]=command.substr(start,pos-start) ;
		cout << "ParamScan:" << m_paramCount-1 << ":" <<  m_param[m_paramCount-1] << endl ;
		start=pos+1 ;
		pos=command.find(":",start) ;
	}

	if (command.size()>start)
	{
		m_param[m_paramCount++]=command.substr(start,command.size()-start) ;
	}

return m_paramCount ;
}





