www.pudn.com > G729_Talk.rar > Interface.cpp


// Interface.cpp: implementation of the CInterface class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Interface.h" 
#include "head.h" 
#include "MyWaveIn.h"	// Added by ClassView 
#include "WaveOut.h"	// Added by ClassView 
#include "ListenSocket.h"	// Added by ClassView 
#include "SendClient.h" 
#include "UdpSocket.h" 
#include "RecSocket.h" 
#include  
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
CWaveOut *g_pOut; 
CCriticalSection g_soLock; 
 
CInterface::CInterface(): 
	m_bIni (FALSE) 
{	 
	m_bWork = FALSE; 
	m_pUdp = new CUdpSocket(); 
	m_pRec = new CRecSocket(); 
 
	g_pOut = new CWaveOut(); 
	m_pIn = new CMyWaveIn(m_pUdp); 
	m_sopListen = new CListenSocket(this,m_pIn,m_pUdp); 
	m_sopSend = new CSendClient(m_pIn,this); 
} 
 
CInterface::~CInterface() 
{ 
	if (m_bIni) 
	{ 
		m_sopListen->Close (); 
	} 
	if (m_bWork) 
	{ 
		End(); 
	} 
	m_pIn->StopRec (); 
	m_pUdp->CloseSocket (); 
 
	m_pRec->CloseSocket (); 
	g_pOut->StopPlay (); 
 
	delete m_sopSend; 
	delete m_sopListen; 
	delete m_pIn; 
	delete g_pOut; 
	delete m_pUdp; 
	delete m_pRec; 
} 
 
BOOL CInterface::Start(CString ip) 
{ 
	char name[128]; 
	int iLen = 128; 
	int i = 0; 
	CString loip; 
 
	BOOL bRe; 
	bRe = FALSE; 
 
	if (m_bWork) 
	{ 
		TRACE("The talk has worked.\n"); 
		goto Exit; 
	} 
	m_sIp = ip; 
 
	if (SOCKET_ERROR  == gethostname(name,iLen)) 
	{ 
		TRACE("I can't get the name.\n"); 
		goto Exit; 
	} 
	struct hostent *phost; 
	phost = gethostbyname (name); 
	if (phost == NULL) 
	{ 
		TRACE("gethostbyname error .\n"); 
		goto Exit; 
	} 
 
	i = 0; 
	while (phost->h_addr_list[i]) 
	{ 
		loip = inet_ntoa (*(struct in_addr *)phost->h_addr_list[i++]); 
		if (loip == ip) 
			goto Exit; 
	} 
 
	if (!m_sopSend->Create ()) 
	{ 
		goto Exit; 
	} 
 
	m_sopSend->Connect (ip,TALK_COM_PORT); 
	if (GetLastError() != WSAEWOULDBLOCK) 
	{ 
		goto Exit1; 
	} 
	m_pUdp->SetIp (ip); 
 
	bRe = TRUE; 
	m_bWork = TRUE; 
	goto Exit; 
Exit1: 
	m_sopSend->Close (); 
Exit: 
	return bRe; 
} 
 
BOOL CInterface::End() 
{ 
	if (!m_bWork) 
	{ 
		TRACE("The talk hasn't worked.\n"); 
		return FALSE; 
	} 
	 
	m_pIn->EnableSend (FALSE); 
	m_sopSend->Close (); 
	m_sopSend->m_bConnect = FALSE; 
	m_sopListen->CloseClient (); 
	m_bWork = FALSE; 
	return TRUE; 
} 
 
BOOL CInterface::Ini() 
{ 
	if (m_bIni) 
	{ 
		TRACE("You have ini the talk model.\n"); 
		return FALSE; 
	} 
 
	if (!m_sopListen->Create (TALK_COM_PORT)) 
	{ 
		goto Exit; 
	} 
	m_sopListen->Listen (); 
 
	if (!m_pRec->Ini ()) 
	{ 
		goto Exit1; 
	} 
	if (!m_pUdp->Ini ()) 
	{ 
		goto Exit2; 
	} 
 
	if (!g_pOut->StartPlay ()) 
	{ 
		goto Exit3; 
	}; 
	if (!m_pIn->StartRec ()) 
	{ 
		goto Exit4; 
	}; 
 
	m_bIni = TRUE; 
	goto Exit; 
Exit4: 
	g_pOut->StopPlay (); 
Exit3: 
	m_pUdp->CloseSocket (); 
Exit2: 
	m_pRec->CloseSocket (); 
Exit1: 
	m_sopListen->Close (); 
Exit: 
	return m_bIni; 
} 
 
BOOL CInterface::IsConnect(CString ip) 
{ 
	if (IDYES ==  MessageBox(NULL,"talk?","talk",MB_YESNO)) 
	{ 
		return TRUE; 
	} 
	else 
	{ 
		return FALSE; 
	} 
} 
 
void CInterface::TalkStart(CString ip) 
{ 
	CString temp; 
	temp.Format ("Talk now ,Ip: %s.",ip); 
	AfxMessageBox(temp); 
} 
 
void CInterface::TalkBeClose() 
{ 
	AfxMessageBox("Talk be close."); 
} 
 
void CInterface::BeClose() 
{ 
	g_soLock.Lock (); 
	if (m_bWork) 
	{ 
		m_pIn->EnableSend (FALSE); 
		m_sopSend->Close (); 
		m_sopSend->m_bConnect = FALSE; 
		m_sopListen->CloseClient (); 
		m_bWork = FALSE; 
		 
		TalkBeClose(); 
	} 
	g_soLock.Unlock (); 
} 
 
void CInterface::ConnectResult(int nErrorCode) 
{ 
	if (nErrorCode != 0) 
	{ 
		m_bWork = FALSE; 
		TalkOnConnect (FALSE); 
		return ; 
	} 
	TalkOnConnect (TRUE); 
	 
	char buffer[32]; 
	memset(buffer,0,32); 
	struct TalkFrame *frame; 
	frame = (struct TalkFrame *)buffer; 
	sprintf(frame->cFlag,"TalkFrame"); 
	 
	frame->iLen = 0; 
	frame->iCom = TC_NORMAL_TALK; 
	m_sopSend->Send (buffer,sizeof(struct TalkFrame)); 
} 
 
void CInterface::TalkOnConnect(BOOL bRe) 
{ 
	CString t; 
	t.Format ("connect %d",bRe); 
	AfxMessageBox(t); 
}