📄 appserverdlg.cpp
字号:
// AppServerDlg.cpp : implementation file
//
#include "stdafx.h"
#include "AppServer.h"
#include "ListenSocket.h"
#include "SeatSocket.h"
#include "HXDSocket.h"
#include "AppServerDlg.h"
#include "funsocket.h"
#include "ListenFunSocket.h"
#include "math.h"
#include "adpcmdll.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define WM_NOTIFYICON WM_USER+150 //自定义消息的ID
CString strChatRoom[]={"","音乐工厂","激情城市"};
CString strDesc[]={"","彩话","聊天"};
UINT HXDMessageThread( LPVOID pParam );
template <> void AFXAPI DestructElements<WAITTABLE *> (WAITTABLE ** ppWaitTable, int nCount)
{
for (; nCount --; ppWaitTable ++)
{
delete (*ppWaitTable);
}
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAppServerDlg dialog
CAppServerDlg::CAppServerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAppServerDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CAppServerDlg)
m_sSeatReceive = _T("0");
m_sSeatSend = _T("0");
m_sServerReceive = _T("0");
m_sServerSend = _T("0");
m_bRecvFromSeat = FALSE;
m_bSendToHXD = FALSE;
m_bSendToSeat = FALSE;
m_bRecvFromHXD = FALSE;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_nSeatReceive = 0;
m_nSeatSend = 0;
m_nServerReceive = 0;
m_nServerSend = 0;
m_bCallOut = FALSE;
m_bSpecChan = 1;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pHXDSocket = NULL;
m_nHXDServerInReadPtr = 0;
m_nHXDServerInWritePtr = 0;
m_pListenSocket = NULL;
for (INT i = 0; i < MAX_SEAT_SUPPORTED; i ++)
{
::ZeroMemory(&m_SeatState[i], 20);
m_SeatState[i].nSocketID = -1;
m_SeatState[i].sCalledID.Empty();
m_SeatState[i].sCallerID.Empty();
m_SeatState[i].sOperatorID.Empty();
m_pSeatSocket[i] = NULL;
m_nSeatInReadPtr[i] = 0;
m_nSeatInWritePtr[i] = 0;
m_sSeatInBuffer[i] = NULL;
}
m_nSeatCount = 0;
m_nWaitConnect = -1;
m_nTestCallSent = 0;
m_nTestCallDialed = 0;
m_nTestCallCanceled = 0;
m_pTray=NULL;
}
void CAppServerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAppServerDlg)
DDX_Control(pDX, IDC_LIST4, m_list4);
DDX_Control(pDX, IDC_LIST2, m_list2);
DDX_Control(pDX, IDC_LIST3, m_list3);
DDX_Control(pDX, IDC_SEATLIST, m_lstSeat);
DDX_Text(pDX, IDC_SEATRCV, m_sSeatReceive);
DDX_Text(pDX, IDC_SEATSND, m_sSeatSend);
DDX_Text(pDX, IDC_SERVERRCV, m_sServerReceive);
DDX_Text(pDX, IDC_SERVERSND, m_sServerSend);
DDX_Check(pDX, IDC_RECVSEAT_CHECK, m_bRecvFromSeat);
DDX_Check(pDX, IDC_SENDHXD_CHECK, m_bSendToHXD);
DDX_Check(pDX, IDC_SENDSEAT_CHECK, m_bSendToSeat);
DDX_Check(pDX, IDC_RECVHXD_CHECK, m_bRecvFromHXD);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAppServerDlg, CDialog)
//{{AFX_MSG_MAP(CAppServerDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CONNECT, OnConnect)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_RECVSEAT_CHECK, OnRecvseatCheck)
ON_BN_CLICKED(IDC_SENDSEAT_CHECK, OnSendseatCheck)
ON_BN_CLICKED(IDC_RECVHXD_CHECK, OnRecvhxdCheck)
ON_BN_CLICKED(IDC_SENDHXD_CHECK, OnSendhxdCheck)
ON_BN_CLICKED(IDC_AUTO_CALLOUT, OnAutoCallout)
ON_BN_CLICKED(IDC_HAND_CALLOUT, OnHandCallout)
ON_WM_SIZE()
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_CLEARLIST, OnClearlist)
ON_BN_CLICKED(IDC_READPARAM, OnReadparam)
ON_BN_CLICKED(IDC_TEST, OnTest)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_CLOSESOCKET, OnCloseSocket)
ON_MESSAGE( WM_RECEIVEMESSAGE, AnalysisMessage)
ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)
ON_NOTIFY(FTN_TABCHANGED, IDC_FOLDERTAB, OnChangedTab)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAppServerDlg message handlers
BOOL CAppServerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CString AutoString;
//CHAR chAutoBuff[10];
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_hIconConnect = AfxGetApp()->LoadIcon(IDI_CONNECT);
m_hIconLose = AfxGetApp()->LoadIcon(IDI_LOSE);
m_lstSeat.InsertColumn(0, "座席", LVCFMT_CENTER, 50);//, 0);
m_lstSeat.InsertColumn(1, "状态", LVCFMT_CENTER, 40);//, 1);
m_lstSeat.InsertColumn(2, "工号", LVCFMT_CENTER, 60);//, 2);
m_lstSeat.InsertColumn(3, "主叫号码", LVCFMT_CENTER, 140);//, 3);
m_lstSeat.InsertColumn(4, "被叫号码", LVCFMT_CENTER, 140);//, 4);
m_pListenSocket = new CListenSocket(this);
if (m_pListenSocket == NULL)
{
AfxMessageBox(_T("分配内存出错!"));
EndDialog(1);
return FALSE;
}
if (ConnectToHXDServer() == FALSE)
{
m_nWaitConnect = WAIT_CONNECT_SECONDS;
//EndDialog(2);
//return FALSE;
}
/*
if (m_pListenSocket->Create((theApp.m_nAppPort), SOCK_STREAM, FD_ACCEPT, (LPCTSTR)theApp.m_sAppIpAddress) == FALSE)
{
INT nError = m_pListenSocket->GetLastError();
CString sErrorMessage;
sErrorMessage.Format(_T("Create(ListenSocket)错误! 错误号:%d!"), nError);
AfxMessageBox((LPCTSTR)sErrorMessage);
EndDialog(3);
return FALSE;
}
if (m_pListenSocket->Listen() == FALSE)
{
INT nError = m_pListenSocket->GetLastError();
CString sErrorMessage;
sErrorMessage.Format(_T("Listen(ListenSocket)错误! 错误号:%d!"), nError);
AfxMessageBox((LPCTSTR)sErrorMessage);
EndDialog(4);
return FALSE;
}
*/
InitFunSocket();
SetTimer(IDT_SECOND, 500, NULL);
SetTimer(IDT_CENTISECOND, 10, NULL);
//TraySetIcon(IDR_MAINFRAME);
//TraySetToolTip("业务服务器");
//TraySetMenu(IDR_MENU1);
m_wndFolderTab.CreateFromStatic(IDC_FOLDERTAB, this);
m_wndFolderTab.Load(IDR_FOLDERTABS); // Load strings
iPosition=0;
CRect rectw;
m_lstSeat.GetWindowRect (&rectw);
ScreenToClient(&rectw);
m_list2.MoveWindow(&rectw);
m_list3.MoveWindow(&rectw);
m_list4.MoveWindow(&rectw);
m_list2.ShowWindow(SW_HIDE);
m_list3.ShowWindow(SW_HIDE);
m_list4.ShowWindow(SW_HIDE);
m_HeaderCtrl.SetTitleText("应用业务服务器");
m_HeaderCtrl.SetDescText("版权所有:北京仁和昌盛公司 ver1.01");
m_HeaderCtrl.intBit=IDB_TITLE;
m_HeaderCtrl.m_nIconWidth=90;
//m_HeaderCtrl.SetIconHandle(AfxGetApp()->LoadIcon(IDI_ICON1));
// m_HeaderCtrl.SetIconHandle(::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_TOOLBOX)));
m_HeaderCtrl.Init(this);
m_HeaderCtrl.MoveCtrls(this);
br.CreateSolidBrush (RGB(235,235,235));
// 将图标放入系统托盘
m_pTray = new CTrayNot (this,WM_NOTIFYICON,
NULL,theApp.m_pIconList);
m_pTray->SetState(IDR_MAINFRAME);
m_bHidden = TRUE;
SetWindowText("应用业务服务器");
InitDatabase();
CAppServerApp* pApp=(CAppServerApp*)AfxGetApp();
pApp->iBegin=1;
// AfxBeginThread( HXDMessageThread, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL );
SetTimer(500,500,NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
void CAppServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CAppServerDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CAppServerDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CAppServerDlg::OnOK()
{
// TODO: Add extra validation here
}
void CAppServerDlg::OnCancel()
{
// TODO: Add extra cleanup here
if (AfxMessageBox(_T("确定要退出吗?"), MB_YESNO) == IDYES)
{
// 将图标从系统托盘中删除
//退出前注销所有座席
LogoffAllSeat();
Sleep(1000);
KillTimer(IDT_SECOND);
KillTimer(IDT_CENTISECOND);
if (m_pHXDSocket)
{
m_pHXDSocket->Close();
delete m_pHXDSocket;
}
if (m_pListenSocket)
{
m_pListenSocket->Close();
delete m_pListenSocket;
}
for (INT i = 0; i < MAX_SEAT_SUPPORTED; i ++)
{
if (m_pSeatSocket[i])
{
m_pSeatSocket[i]->Close();
delete m_pSeatSocket[i];
delete m_sSeatInBuffer[i];
}
}
CDialog::OnCancel();
}
}
void CAppServerDlg::WinHelp(DWORD dwData, UINT nCmd)
{
// TODO: Add your specialized code here and/or call the base class
}
//连接到HXD服务器的处理函数
void CAppServerDlg::OnConnectToHXDServer(CHXDSocket *pSocket)
{
m_nWaitConnect = -1;
((CStatic *)GetDlgItem(IDC_CONNECTSTATE))->SetIcon(m_hIconConnect);
//((CButton *)GetDlgItem(IDC_CONNECT))->SetWindowText(_T("0秒后重新连接HXD服务器"));
HXDMESSAGE hxdMessage;
hxdMessage.m_nHeader = HXD_MESSAGE_HEADER;
hxdMessage.m_nMessageId = U_MSG_ALLASLRESET;
hxdMessage.m_nChannel = -1;
hxdMessage.m_nLength = 0;
//向HXD服务器发送命令将所有座席注销,通道复位
SendToHXDServer(&hxdMessage);
//CString str;
//str.Format ("-->");
LogInAllChannel();
//向HXD服务器发送命令登录所有的座席
}
//座席通信接收处理函数
void CAppServerDlg::OnReceiveFromSeat(CSeatSocket *pSocket)
{
INT nCount;
INT nID = pSocket->GetSocketID();
while (nCount = pSocket->Receive(&m_sSeatInBuffer[nID][m_nSeatInWritePtr[nID]], MAX_MESSAGE_SIZE))
{
if (nCount == SOCKET_ERROR)
{
nCount = pSocket->GetLastError();
return;
}
// 记录收发包日志
if (m_bRecvFromSeat)
{
m_RecvSeatFile.Write(&m_sSeatInBuffer[nID][m_nSeatInWritePtr[nID]], nCount);
m_RecvSeatFile.Write("\n\r",2);
}
//接收数据后,判断是否超出缓冲的门限,如果是,将超出的部分
//移动到缓冲的头部
m_nSeatInWritePtr[nID] += nCount;
if (m_nSeatInWritePtr[nID] >= MAX_INBUFFER_CACHE)
{
m_nSeatInWritePtr[nID] -= MAX_INBUFFER_CACHE;
::CopyMemory(m_sSeatInBuffer[nID], &m_sSeatInBuffer[nID][MAX_INBUFFER_CACHE], m_nSeatInWritePtr[nID]);
}
if (nCount < MAX_MESSAGE_SIZE)
{
break;
}
}
//对缓冲的数据进行解析,并且处理
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -