⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 appserverdlg.cpp

📁 用过恒迅达交换机的人都知道。恒迅达交换机是需要在交换机内部运行中间程序来给脚本提供数据接口并且监控机器运行状态的。本程序即是完成以上功能!用C++开发、调用了数据库(sqlserver2000)存储过
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		}
	}

	return -1;
}

//在列表框中删除指定座席行
BOOL CAppServerDlg::DeleteSeatItem(INT nSeatID)
{
	INT i = FindSeatItem(nSeatID);
	if (i >= 0)
	{
		return (m_lstSeat.DeleteItem(i));
	}

	return FALSE;
}

//在列表框中更新指定座席行
BOOL CAppServerDlg::UpdateSeatItem(SEATSTATE *pSeatState)
{
	if (pSeatState == NULL)
	{
		return FALSE;
	}
	INT i = FindSeatItem(pSeatState->nSeatID);
	if (i == -1)
	{
		i = m_lstSeat.GetItemCount();
		m_lstSeat.InsertItem(i, _T(""));
	}
	switch (pSeatState->nState)
	{
	case SEAT_DISABLE:
		m_lstSeat.DeleteItem(i);
		return TRUE;

	case SEAT_IDLE:
		m_lstSeat.SetItemText(i, 1, _T("空闲"));
		break;
	case SEAT_RING:
		m_lstSeat.SetItemText(i, 1, _T("呼入"));
		break;
	case SEAT_CONNECT:
		m_lstSeat.SetItemText(i, 1, _T("通话"));
		break;
	case SEAT_DIAL:
		m_lstSeat.SetItemText(i, 1, _T("呼出"));
		break;
	case SEAT_OFFHOOK:
		m_lstSeat.SetItemText(i, 1, _T("摘机"));
		break;
	default:
		return FALSE;
	}
	CString str;
	str.Format(_T("%d"), pSeatState->nSeatID);
	m_lstSeat.SetItemText(i, 0, (LPCTSTR)str);
	m_lstSeat.SetItemText(i, 2, (LPCTSTR)(pSeatState->sOperatorID));
	m_lstSeat.SetItemText(i, 3, (LPCTSTR)(pSeatState->sCallerID));
	m_lstSeat.SetItemText(i, 4, (LPCTSTR)(pSeatState->sCalledID));
	m_lstSeat.SetItemData(i, (DWORD)(pSeatState->nSeatID));

	return TRUE;
}

//向所有座席发送座席注销消息
void CAppServerDlg::LogoffAllSeat()
{
	CHAR sBuffer[8];
	HXDMESSAGE *pHXDMessage = (HXDMESSAGE *)sBuffer;
	SEATSTATE *pSeatState;

	pHXDMessage->m_nHeader = HXD_MESSAGE_HEADER;
	pHXDMessage->m_nMessageId = D_MSG_LOGOFF;
	pHXDMessage->m_nLength = 0;
	for (INT i = 0; i < MAX_SEAT_SUPPORTED; i ++)
	{
		if (m_pSeatSocket[i] && m_pSeatSocket[i]->GetConnectState() == TRUE)
		{
			pSeatState = GetSeat(i);
			if (pSeatState && pSeatState->nState != SEAT_DISABLE)
			{
				pSeatState->nState = SEAT_DISABLE;
				UpdateSeatItem(pSeatState);
				pHXDMessage->m_nChannel = pSeatState->nSeatID;
				SendToSeat(pHXDMessage, i);
			}
		}
	}
}

//注销指定座席
void CAppServerDlg::LogoffSeat(SEATSTATE *pSeatState)
{
	CHAR sBuffer[8];
	HXDMESSAGE *pHXDMessage = (HXDMESSAGE *)sBuffer;

	pHXDMessage->m_nHeader = HXD_MESSAGE_HEADER;
	pHXDMessage->m_nMessageId = D_MSG_LOGOFF;
	pHXDMessage->m_nLength = 0;
	pHXDMessage->m_nChannel = pSeatState->nSeatID;
	pSeatState->nState = SEAT_DISABLE;
	UpdateSeatItem(pSeatState);
	if (pSeatState->nSocketID >= 0)
	{
		SendToSeat(pHXDMessage, pSeatState->nSocketID);
	}
	pSeatState->nSeatID = 0;
}

//向HXD服务器发送复位座席消息
void CAppServerDlg::ResetSeat(INT nSeatID)
{
	CHAR sBuffer[8];
	HXDMESSAGE *pHXDMessage = (HXDMESSAGE *)sBuffer;

	pHXDMessage->m_nHeader = HXD_MESSAGE_HEADER;
	pHXDMessage->m_nChannel = nSeatID;
	pHXDMessage->m_nMessageId = U_MSG_CHRESET;
	pHXDMessage->m_nLength = 0;

	SendToHXDServer(pHXDMessage);
}

//
//发送测试呼
//参数:sCallerId —— 主叫号码;sCalledId —— 被叫号码;nChannel —— 通道号
void CAppServerDlg::SendCallOut(LPCTSTR sCallerId, LPCTSTR sCalledId, INT nChannel)
{
	CHAR sBuffer[78];
	::ZeroMemory(sBuffer, 78);
	HXDMESSAGE *pHXDMessage = (HXDMESSAGE *)sBuffer;

	pHXDMessage->m_nHeader = HXD_MESSAGE_HEADER;
	pHXDMessage->m_nChannel = nChannel;
	pHXDMessage->m_nMessageId = U_MSG_AUTODIAL;
	pHXDMessage->m_nLength = 70;
	lstrcpy(pHXDMessage->m_pMessage, sCallerId);
	lstrcpy(&(pHXDMessage->m_pMessage[20]), sCalledId);
	lstrcpy(&(pHXDMessage->m_pMessage[40]), sCalledId);
	*((SHORT *)(&(pHXDMessage->m_pMessage[62]))) = 2;
	*((SHORT *)(&(pHXDMessage->m_pMessage[64]))) = 60;
	*((SHORT *)(&(pHXDMessage->m_pMessage[66]))) = 1;
	*((SHORT *)(&(pHXDMessage->m_pMessage[68]))) = 0x14;

	if (SendToHXDServer(pHXDMessage) == TRUE)
	{
		m_nTestCallSent ++;
	}
	
}

void CAppServerDlg::OnRecvseatCheck() 
{
	// TODO: Add your control notification handler code here
	char chPath[160];
	::GetCurrentDirectory(160, chPath);
	strcat(chPath, _T("\\recvseat.log"));
	if (m_bRecvFromSeat)
	{
		m_RecvSeatFile.Close();
		m_bRecvFromSeat = FALSE;
	}
	else
	{
		m_RecvSeatFile.Open(chPath, CFile::modeCreate | CFile::modeReadWrite | CFile::typeText);
		m_RecvSeatFile.WriteString(_T("包头"));
		m_RecvSeatFile.WriteString(_T("          "));
		m_RecvSeatFile.WriteString(_T("包类型"));
		m_RecvSeatFile.WriteString(_T("          "));
		m_RecvSeatFile.WriteString(_T("通道号"));
		m_RecvSeatFile.WriteString(_T("          "));
		m_RecvSeatFile.WriteString(_T("包长"));
		m_RecvSeatFile.WriteString(_T("\n"));
		m_bRecvFromSeat = TRUE;
	}
	UpdateData(TRUE);
}

void CAppServerDlg::OnSendseatCheck() 
{
	// TODO: Add your control notification handler code here
	char chPath[160];
	::GetCurrentDirectory(160, chPath);
	strcat(chPath, _T("\\sendseat.log"));
	if (m_bSendToSeat)
	{
		m_SendSeatFile.Close();
		m_bSendToSeat = FALSE;
	}
	else
	{
		m_SendSeatFile.Open(chPath, CFile::modeCreate | CFile::modeReadWrite | CFile::typeText);
		m_bSendToSeat = TRUE;
	}
	UpdateData(TRUE);
}

void CAppServerDlg::OnRecvhxdCheck() 
{
	// TODO: Add your control notification handler code here
	char chPath[160];
	CTime NowTime;

	NowTime = CTime::GetCurrentTime();
	::GetCurrentDirectory(160, chPath);
	strcat(chPath, _T("\\") );
	strcat(chPath, NowTime.Format("%H_%M_%s_"));
	strcat(chPath, _T("recvhxd.log"));
	if (m_bRecvFromHXD)
	{
		m_RecvHXDFile.Close();
		m_bRecvFromHXD = FALSE;
	}
	else
	{
		m_RecvHXDFile.Open(chPath, CFile::modeCreate | CFile::modeReadWrite | CFile::typeText);
		m_bRecvFromHXD = TRUE;
	}
	UpdateData(TRUE);
}

void CAppServerDlg::OnSendhxdCheck() 
{
	// TODO: Add your control notification handler code here
	char chPath[160];
	::GetCurrentDirectory(160, chPath);
	strcat(chPath, _T("\\sendhxd.log"));
	if (m_bSendToHXD)
	{
		m_SendHXDFile.Close();
		m_bSendToHXD = FALSE;
	}
	else
	{
		m_SendHXDFile.Open(chPath, CFile::modeCreate | CFile::modeReadWrite | CFile::typeText);
		m_bSendToHXD = TRUE;
	}
	UpdateData(TRUE);
}	

void CAppServerDlg::SetCallOut(BOOL bCallOut)
{
	m_bCallOut = bCallOut;
}

void CAppServerDlg::OnAutoCallout() 
{
	// TODO: Add your control notification handler code here
	if (GetCallOutState() == FALSE)
	{
		SetCallOut(TRUE);
		((CButton *)GetDlgItem(IDC_AUTO_CALLOUT))->SetWindowText(_T("停止自动呼出"));
	}
	else
	{
		SetCallOut(FALSE);
		((CButton *)GetDlgItem(IDC_AUTO_CALLOUT))->SetWindowText(_T("启动自动呼出"));
	}
}

BOOL CAppServerDlg::GetCallOutState()
{
	return m_bCallOut;
}

void CAppServerDlg::OnHandCallout() 
{
	// TODO: Add your control notification handler code here
	if (m_nWaitConnect == -1)
	{
		SendCallOut((LPCTSTR)m_sCallerId, (LPCTSTR)m_sCalledId, -1);
	}	
}

void CAppServerDlg::LogInAllChannel()
{
	USHORT i, j;
	HXDMESSAGE hxdMessage;
	SEATSTATE *pSeatState;

	if ( m_bAutoAnswer )
	{
		for ( j = 0; j < m_sAutoNum; j ++ )
		{
			for ( i = m_AutoArray[j].m_sStartAgentChannel; i <= m_AutoArray[j].m_sEndAgentChannel; i ++ )
			{
				hxdMessage.m_nHeader = HXD_MESSAGE_HEADER;
				hxdMessage.m_nMessageId = U_MSG_LOGON;
				hxdMessage.m_nLength = 22;
				hxdMessage.m_nChannel = i;
				SHORT *pOpType = (SHORT *)hxdMessage.m_pMessage;
				*pOpType ++ = m_AutoArray[j].m_sLoginID[0];
				*pOpType ++ = m_AutoArray[j].m_sLoginID[1];                                                                    
				*pOpType ++ = m_AutoArray[j].m_sLoginID[2];
				*pOpType ++ = m_AutoArray[j].m_sLoginID[3];
				*pOpType ++ = m_AutoArray[j].m_sLoginID[4];
				*pOpType ++ = m_AutoArray[j].m_sLoginID[5];
				hxdMessage.m_pMessage[12] = 0;
				SendToHXDServer(&hxdMessage);

				pSeatState = AddSeat(j);

				if (pSeatState == NULL)
				{
					return ;
				}
				pSeatState->nSeatID = hxdMessage.m_nChannel;
				pSeatState->sOperatorID = (LPCTSTR)(&(hxdMessage.m_pMessage[12]));
				DeleteSeatItem(pSeatState->nSeatID);

	//			lstrcpyn(&hxdMessage.m_pMessage[12], (LPCTSTR)m_sOperatorID, 10);
			}
		}
	}
}

UINT HXDMessageThread( LPVOID pParam )
{
	CAppServerDlg * pDlg;

	pDlg = (CAppServerDlg *)pParam;

	Sleep( 2000 );
	while( 1 )
	{
		pDlg->m_csReceQueue.Lock();
		pDlg->AnalysisHXDServerMessage();	
		pDlg->m_csReceQueue.Unlock();
		Sleep( 100 );
	}
}

void CAppServerDlg::AnalysisMessage()
{
	while ( AnalysisHXDServerMessage() == TRUE )
	{
		m_nServerReceive ++;
		m_sServerReceive.Format(_T("%d"), m_nServerReceive);
		UpdateData(FALSE);

	}
}

void CAppServerDlg::OnReceiveReq(CFunSocket *pSocket)
{
	int iCount=0;
	int iLen=0;
	int iReqID = pSocket->m_iID;
	iCount = pSocket->Receive( m_HxdRfcBuf[iReqID], MAX_RFCBUFSIZE, 0);
	if(iCount == SOCKET_ERROR)
	{
		int a=pSocket->GetLastError();
		goto PROCERROR;
	}
	if( show_data(iCount, (HXDRFCHD *)m_HxdRfcBuf[iReqID]) )	//分析处理调函请求数据包
	{
		//将处理结果发送到IpswSrvr
		iCount = pSocket->Send(m_HxdRfcBuf[iReqID], ((HXDRFCHD *)m_HxdRfcBuf[iReqID])->lTotalSize, 0);
		if( iCount == SOCKET_ERROR )
		{
			CString str,str1;
			str1=this->GetFormatTime();
			str.Format(_T("%s OnReceiveReq---Send错误! 错误代码:%d"), str1,WSAGetLastError() );
			////m_ListLog.InsertString(0, str); //在LISTBOX中显示信息
			this->AddListMessage(3,str);
			goto PROCERROR;
		}
	}
	else
	{
		goto PROCERROR;
	}
	return ;

PROCERROR:
	OnCloseReqSocket(iReqID);
	return ;
}

void CAppServerDlg::OnCloseReqSocket(int iID)
{
	if(m_pFunSocket[iID] == NULL)
		return;
	m_pFunSocket[iID]->Close();
	delete m_HxdRfcBuf[iID];
	m_HxdRfcBuf[iID] = NULL;
	delete m_pFunSocket[iID];
	m_pFunSocket[iID] = NULL;
	return;

}

BOOL CAppServerDlg::OnAcceptReq(CListenFunSocket *pSocket)
{
	for (INT i = 0; i < MAX_FUNREQ_SUPPORTED; i ++)
	{
		if (m_pFunSocket[i] == NULL)
		{
			break;
		}
	}
	if(i == MAX_FUNREQ_SUPPORTED)
		return FALSE;
	m_pFunSocket[i] = new CFunSocket( this,i );
	if( m_pFunSocket[i] == NULL )
	{
		//内存不足
		return FALSE;
	}
	if( pSocket->Accept(*m_pFunSocket[i]) == FALSE )
	{
		delete m_pFunSocket[i];
		m_pFunSocket[i] = NULL;
		int nError = pSocket->GetLastError();
		CString str;
		str.Format(_T("Accept(FunSocket)错误! 错误代码:%d"), nError);
		/////m_ListLog.InsertString(0,str);
		return FALSE;
	}
	if (m_HxdRfcBuf[i] == NULL)
	{
		m_HxdRfcBuf[i] = new CHAR[2048];
		if (m_HxdRfcBuf[i] == NULL)
		{
			/////m_ListLog.InsertString(0,"分配内存出错!");
			delete m_pFunSocket[i];
			m_pFunSocket[i] = NULL;
			return FALSE;
		}
	}

	m_pFunSocket[i]->AsyncSelect(FD_READ | FD_CLOSE);
	return TRUE;
}

BOOL CAppServerDlg::show_data(int nLen, HXDRFCHD *pData)
{
	int iListMark=3;
	if( pData->hxdID != RFC_HXDID )
		return FALSE;

	if( pData->sStateRet == RFC_DATA )//正常函数据的调
	{
		CHAR buf[2048];

		if( nLen != int(pData->lTotalSize) )
			return FALSE;
		PPARAM pParamList;
		if( strcmp(pData->szFName, "CreatFileName") == 0 )	//比较是否调用的是CreateFileName函数
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -