www.pudn.com > agentnet.zip > AgentNetServerDlg.cpp


// AgentNetServerDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "AgentNetServer.h" 
#include "AgentNetServerDlg.h" 
#include "listeningsocket.h" 
#include "clientsocket.h" 
#include "msg.h" 
#include "addnewaccountdlg.h" 
#include "NewsDlg.h" 
#include "setupsqlpage.h" 
#include "setupsheet.h" 
#include "setuptcpippage.h" 
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
 
///////////////////////////////////////////////////////////////////////////// 
// 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() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAgentNetServerDlg dialog 
 
CAgentNetServerDlg::CAgentNetServerDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CAgentNetServerDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CAgentNetServerDlg) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CAgentNetServerDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAgentNetServerDlg) 
	DDX_Control(pDX, IDC_LIST_ALL, m_ListCtrl); 
	DDX_Control(pDX, IDC_TREE_ALL, m_TreeCtrl); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAgentNetServerDlg, CDialog) 
	//{{AFX_MSG_MAP(CAgentNetServerDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_NOTIFY(NM_CLICK, IDC_TREE_ALL, OnClickTreeAll) 
	ON_WM_DESTROY() 
	ON_NOTIFY(NM_RCLICK, IDC_TREE_ALL, OnRclickTreeAll) 
	ON_COMMAND(ID_MENUITEM_EVENT_CLEAR, OnMenuitemEventClear) 
	ON_NOTIFY(NM_RCLICK, IDC_LIST_ALL, OnRclickListAll) 
	ON_COMMAND(IDR_MENU_ADD_NEW_ACCOUNT, OnMenuAddNewAccount) 
	ON_COMMAND(ID_MENUITEM_ACCOUNT_DELETE, OnMenuitemAccountDelete) 
	ON_COMMAND(ID_MENUITEM_ACCOUNT_UPDATE, OnMenuitemAccountUpdate) 
	ON_NOTIFY(NM_DBLCLK, IDC_LIST_ALL, OnDblclkListAll) 
	ON_COMMAND(ID_MENUITEM_ADD_NEW_NEWS, OnMenuitemAddNewNews) 
	ON_COMMAND(ID_MENUITEM_NEWS_DELETE, OnMenuitemNewsDelete) 
	ON_COMMAND(ID_MENUITEM_NEWS_UPDATE, OnMenuitemNewsUpdate) 
	ON_COMMAND(ID_MENUITE_SETUP, OnMenuiteSetup) 
	ON_COMMAND(ID_MENUITEM_START_AGENT_NET, OnMenuitemStartAgentNet) 
	ON_COMMAND(ID_MENUITEM_STOP_AGENT_NET, OnMenuitemStopAgentNet) 
	ON_UPDATE_COMMAND_UI(ID_MENUITEM_START_AGENT_NET, OnUpdateMenuitemStartAgentNet) 
	ON_COMMAND(ID_MENUITEM_ABOUT, OnMenuitemAbout) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAgentNetServerDlg message handlers 
 
BOOL CAgentNetServerDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// 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 
	InitSetup(); 
	m_bCanStart=TRUE; 
 
 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CAgentNetServerDlg::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 CAgentNetServerDlg::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 CAgentNetServerDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CAgentNetServerDlg::OnAccept() 
{ 
	CClientSocket* pClientSocket=new CClientSocket(this); 
	//接受连接请求 
	if (m_pListeningSocket->Accept(*pClientSocket)) 
	{ 
		//对连接套接字初始化 
		pClientSocket->Initialize(); 
 
		//初始化连接结构 
		stuConnection* pstuConnection=new stuConnection; 
		 
		pstuConnection->pClientSocket=pClientSocket; 
		pstuConnection->strUserName=_T("unknown_user_name"); 
 
		//连接结构放入列表 
		m_connectionList.AddTail(pstuConnection); 
	} 
	else 
		delete pClientSocket; 
 
} 
 
void CAgentNetServerDlg::OnReceive(CClientSocket *pClientSocket) 
{ 
	do 
	{ 
		//调用ReadMsg()读取消息 
		CMsg* pMsg=ReadMsg(pClientSocket); 
		 
		CString strCommand; 
		CString strUserName; 
		CString strToUserName; 
		CString strUserPassword; 
		CString strText; 
 
		strCommand=pMsg->m_strCommand; 
		strUserName=pMsg->m_strUser; 
		strToUserName=pMsg->m_strToUser; 
		strUserPassword=pMsg->m_strPassword; 
		strText=pMsg->m_strText; 
 
		if (strCommand=="login_agent_net")  //登陆处理 
		{ 
			ProcessLogin(strUserName,strUserPassword,pClientSocket); 
			break;		 
		} 
 
		if (strCommand=="logout_agent_net") //下线处理 
		{ 
			ProcessLogout(strUserName,pClientSocket); 
			break; 
		} 
		if (strCommand=="send_general_message") //发送消息处理 
		{ 
			ProcessSendGeneralMessage(strUserName,strToUserName,strText); 
			break; 
		} 
		if (strCommand=="ask_server_list_online_buddy") //客户端要求列出在线好友 
		{ 
			ProcessListOnlineBuddy(strUserName,pClientSocket); 
			break; 
		} 
		if (strCommand=="ask_read_news") //客户端要求读新闻 
		{ 
			ProcessSendNews(strUserName,pClientSocket); 
			break; 
		} 
 
	} 
	while (!pClientSocket->m_pArchiveIn->IsBufferEmpty()); 
 
} 
 
void CAgentNetServerDlg::InitTree() 
{ 
 
	CAgentNetServerApp *pApp=(CAgentNetServerApp *)AfxGetApp();//取得控制程序 
    m_ImageList.Create(16,16,ILC_COLOR,0,1);     //建立16*16图像控制 
	m_ImageList.SetBkColor(RGB(255,255,255)); 
     
	m_ImageList.Add(pApp->LoadIcon(IDI_ICON_TREE_ROOT)); //增加选中状态图像(根) 
	m_ImageList.Add(pApp->LoadIcon(IDI_ICON_TREE_EVENT)); //事件察看器 
	m_ImageList.Add(pApp->LoadIcon(IDI_ICON_TREE_ACCOUNT)); //账号管理 
	m_ImageList.Add(pApp->LoadIcon(IDI_ICON_TREE_NEWS)); //新闻管理 
 
	//树控件 
    m_TreeCtrl.SetImageList(&m_ImageList,TVSIL_NORMAL);  //设置图像控制列表 
 
	m_TreeCtrl.DeleteAllItems(); 
	HTREEITEM hRoot = m_TreeCtrl.InsertItem("AgentNetServer", 0, 0, TVI_ROOT, TVI_LAST); 
	m_TreeCtrl.InsertItem("事件察看器", 1, 1, hRoot, TVI_LAST); 
	m_TreeCtrl.InsertItem("账号管理", 2, 2, hRoot, TVI_LAST); 
	m_TreeCtrl.InsertItem("新闻管理", 3, 3, hRoot, TVI_LAST); 
 
	m_TreeCtrl.Expand(hRoot, TVE_EXPAND); 
 
} 
 
void CAgentNetServerDlg::OnClickTreeAll(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
 
	//删除原表头 
	m_ListCtrl.DeleteAllItems(); 
	while(m_ListCtrl.DeleteColumn(0)); 
 
 
    CString strSelectedItem; 
	strSelectedItem=m_TreeCtrl.GetItemText(m_TreeCtrl.GetSelectedItem( )); 
	if (strSelectedItem=="事件察看器") 
	{ 
		ShowEvent(); 
	} 
	if (strSelectedItem=="账号管理") 
	{ 
		ShowAccount(); 
	} 
	if (strSelectedItem=="新闻管理") 
	{ 
		ShowAllNews(); 
	} 
/* 
	else 
	{ 
		m_stuBool.isEventViewerMake=FALSE; 
	} 
*/ 
 	*pResult = 0; 
} 
 
 
void CAgentNetServerDlg::InitStrBool() 
{ 
	m_stuBool.isEventViewerMake=FALSE; 
 
} 
 
BOOL CAgentNetServerDlg::InitSocket() 
{ 
	m_pListeningSocket= new CListeningSocket(this); 
 
	//获得本机ip address 
 
      WORD wVersionRequested; 
      WSADATA wsaData; 
      char name[255]; 
      CString strServerIP; 
      PHOSTENT hostinfo; 
      wVersionRequested = MAKEWORD( 2, 0 ); 
 
      if ( WSAStartup( wVersionRequested, &wsaData ) == 0 ) 
      { 
 
            if( gethostname ( name, sizeof(name)) == 0) 
            { 
                  if((hostinfo = gethostbyname(name)) != NULL) 
                  { 
                        strServerIP = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list); 
                  } 
            } 
             
            WSACleanup( ); 
      }  
	   
	  m_stuSetup.strIpAddress=strServerIP; 
 
 
	if (!m_pListeningSocket->Create(SERVER_TCP_PORT,SOCK_STREAM,strServerIP)) 
	{ 
		AfxMessageBox("建立server socket 时出错!"); 
		return FALSE; 
	} 
	if (!m_pListeningSocket->Listen()) 
	{ 
		AfxMessageBox("侦听失败!"); 
		return FALSE; 
	} 
	return TRUE; 
 
} 
 
void CAgentNetServerDlg::AddEvent(CString strType, CString strEvent) 
{ 
	//显示所有事件 
	char cmdText[511]; 
	sprintf(cmdText,"AgentNet..AddEvent '%s','%s'",strType,strEvent); 
 
	_RecordsetPtr MySet; 
 
	MySet = ExecuteStoredProc(_bstr_t(cmdText)); 
    
} 
 
BOOL CAgentNetServerDlg::InitConnectSqlServer() 
{ 
	//初始化com 
	::CoInitialize(NULL); 
 
	//sql connection 指针 
	HRESULT hr; 
	hr=m_pSqlCon.CreateInstance("ADODB.Connection"); 
	if (FAILED(hr)) 
	{ 
		AfxMessageBox("CreateInstance('ADODB.Connection')时出错!"); 
		return FALSE; 
	} 
 
	char cmdText[100]; 
	sprintf(cmdText,"Data Source=%s;Provider=SQLOLEDB.1",m_stuSetup.strSqlServerName); 
 
	_bstr_t bstrAccountName=m_stuSetup.strSqlServerAccountName.AllocSysString(); 
	_bstr_t bstrAccountPassword=m_stuSetup.strSqlServerAccountPassword.AllocSysString(); 
 
	try 
	{ 
		hr=m_pSqlCon->Open(cmdText,bstrAccountName,bstrAccountPassword,0); 
	} 
	catch(...) 
	{ 
		AfxMessageBox("启动时出错!请确认 SQL SERVER 正常,并且 SQL 设置正确!"); 
		return FALSE; 
	} 
 
	return TRUE; 
} 
 
void CAgentNetServerDlg::OnDestroy()  
{ 
	CDialog::OnDestroy(); 
	// TODO: Add your message handler code here 
	//关闭COM 
	::CoUninitialize(); 
	 
} 
 
CMsg* CAgentNetServerDlg::ReadMsg(CClientSocket *pClientSocket) 
{ 
	static CMsg msg; 
	TRY 
	{ 
		//读取消息 
		pClientSocket->ReceiveMessage(&msg); 
	} 
	CATCH(CFileException,e) 
	{ 
		//错误处理 
		CString strTemp; 
		//写错误事件 
		strTemp="读取信息错误!"; 
		pClientSocket->Abort(); 
	} 
	END_CATCH 
 
	return &msg; 
 
} 
 
void CAgentNetServerDlg::DeleteSocket(CClientSocket* pClientSocket) 
{ 
	pClientSocket->Close(); 
	POSITION pos,temp; 
 
	for (pos=m_connectionList.GetHeadPosition();pos!=NULL;) 
	{ 
		//对于已经关闭的客户机 
		//在消息列表中将已经建立的连接删除 
		temp=pos; 
		stuConnection* pTempStuConnection=(stuConnection*)m_connectionList.GetNext(pos); 
		//匹配成功 
		if (pTempStuConnection->pClientSocket ==pClientSocket) 
		{ 
			m_connectionList.RemoveAt(temp); 
			break; 
		} 
	} 
	delete pClientSocket; 
} 
 
void CAgentNetServerDlg::SendMsg(CClientSocket *pSocket, CMsg *pMsg) 
{ 
	TRY 
	{ 
		//发送消息 
		pSocket->SendMessage(pMsg); 
	} 
	CATCH(CFileException,e) 
	{ 
		//错误处理 
		pSocket->Abort(); 
		CString strTemp; 
		strTemp="发送信息错误!"; 
		AfxMessageBox(strTemp); 
		//DisplayMsg(strTemp); 
	} 
	END_CATCH 
 
} 
 
void CAgentNetServerDlg::ProcessLogin(CString strUserName,CString strUserPassword,CClientSocket* pClientSocket) 
{ 
	//如果客户机要求登陆 
	//客户认证 
	BOOL isUser; 
	isUser=FALSE; 
	isUser=TestIsUser(strUserName,strUserPassword); 
			 
	if (isUser) 
	{ 
		//发消息认证通过 
		CMsg pSendMsg; 
		pSendMsg.m_strCommand="login_pass"; 
		pSendMsg.m_strUser=SERVER_AGENT_NAME; 
		SendMsg(pClientSocket,&pSendMsg); 
		 
		//修改连接结构 
		POSITION pos,temp; 
		 
		for (pos=m_connectionList.GetHeadPosition();pos!=NULL;) 
		{ 
			temp=pos; 
			stuConnection* pTempStuConnection=(stuConnection*)m_connectionList.GetNext(pos); 
			//匹配成功 
			if (pTempStuConnection->pClientSocket ==pClientSocket && pTempStuConnection->strUserName=="unknown_user_name") 
			{ 
				//修改相关user_name 
				pTempStuConnection->strUserName=strUserName; 
				break; 
			} 
		} 
 
		//写登陆事件 
		AddEvent("登陆",strUserName+"登陆网络!"); 
	} 
	else 
	{ 
		//发消息认证失败 
		CMsg pSendMsg; 
		pSendMsg.m_strCommand="login_failed"; 
		pSendMsg.m_strUser=SERVER_AGENT_NAME; 
		pSendMsg.m_strText="wrong_account"; 
		SendMsg(pClientSocket,&pSendMsg); 
		DeleteSocket(pClientSocket); 
	} 
 
} 
 
void CAgentNetServerDlg::ProcessLogout(CString strUserName,CClientSocket* pClientSocket) 
{ 
	//如果客户机关闭 
 
	//发消息给在线得人strUserName已下线 
	CMsg* pMsg=new CMsg; 
	pMsg->m_strCommand="buddy_logout"; 
	pMsg->m_strUser=SERVER_AGENT_NAME; 
		 
	POSITION pos,temp; 
		 
	for (pos=m_connectionList.GetHeadPosition();pos!=NULL;) 
	{ 
		temp=pos; 
		stuConnection* pTempStuConnection=(stuConnection*)m_connectionList.GetNext(pos); 
		//匹配成功 
		if (pTempStuConnection->pClientSocket !=pClientSocket && pTempStuConnection->strUserName!=strUserName) 
		{ 
			pMsg->m_strToUser=pTempStuConnection->strUserName; 
			pMsg->m_strText=strUserName; 
			SendMsg(pTempStuConnection->pClientSocket,pMsg); 
		} 
	} 
 
	//调用函数CloseSocket()将该与该客户机的连接从连接列表中删除 
	DeleteSocket(pClientSocket); 
	//写事件 
	//AfxMessageBox(strUserName+"退出网络"); 
	AddEvent("退出",strUserName+"退出网络"); 
 
} 
 
void CAgentNetServerDlg::ProcessSendGeneralMessage(CString strUserName, CString strToUserName, CString strText) 
{ 
	//处理发送一般信息 
	POSITION pos,temp; 
    CClientSocket* pToUserClientSocket; 
	BOOL bFound=FALSE; 
 
	//找到对方socket 
	for (pos=m_connectionList.GetHeadPosition();pos!=NULL;) 
	{ 
		//对于已经关闭的客户机 
		temp=pos; 
		stuConnection* pTempStuConnection=(stuConnection*)m_connectionList.GetNext(pos); 
		//匹配成功 
		if (pTempStuConnection->strUserName ==strToUserName) 
		{ 
			pToUserClientSocket=pTempStuConnection->pClientSocket;			 
			bFound=TRUE; 
			break; 
		} 
	} 
	if (!bFound) 
	{ 
		//处理出错事件 
		//写出错事件 
		return; 
	} 
 
	CMsg* pMsg=new CMsg; 
	 
	pMsg->m_strUser=strUserName; 
	pMsg->m_strToUser=strToUserName; 
	pMsg->m_strCommand="receive_general_message"; 
	pMsg->m_strText=strText; 
 
    //发送 
	SendMsg(pToUserClientSocket,pMsg); 
 
} 
 
void CAgentNetServerDlg::ProcessListOnlineBuddy(CString strUserName,CClientSocket* pClientSocket) 
{ 
    //列出strUserName的在线好友 
	//发不是请求的strUserName的用户名 
	POSITION pos,temp; 
	for (pos=m_connectionList.GetHeadPosition();pos!=NULL;) 
	{ 
		//对于已经关闭的客户机 
		temp=pos; 
		stuConnection* pTempStuConnection=(stuConnection*)m_connectionList.GetNext(pos); 
		//匹配成功 
		if ((pTempStuConnection->strUserName !=strUserName) && (pTempStuConnection->strUserName!="unknown_user_name")) 
		{ 
			CMsg* pMsg=new CMsg; 
			pMsg->m_strUser=SERVER_AGENT_NAME; 
			pMsg->m_strToUser=strUserName; 
			pMsg->m_strCommand="reply_server_list_online_buddy"; 
			pMsg->m_strText=pTempStuConnection->strUserName; 
 
			//发送 
			SendMsg(pClientSocket,pMsg); 
		} 
	} 
	 
} 
 
void CAgentNetServerDlg::ShowEvent() 
{ 
	//显示所有事件 
	//record set 指针 
	char cmdText[511]; 
	sprintf(cmdText,"AgentNet..ShowEvent"); 
 
	_RecordsetPtr MySet; 
 
	MySet = ExecuteStoredProc(_bstr_t(cmdText));	 
 
	while(!MySet->EndOfFile) 
	{ 
		m_ListCtrl.DeleteAllItems(); 
		while(m_ListCtrl.DeleteColumn(0)); 
 
		//建立事件察看器表头 
 
		m_ListCtrl.InsertColumn(0,"类型",LVCFMT_CENTER,50,0);   
		//时间 
		m_ListCtrl.InsertColumn(1,"时间",LVCFMT_CENTER,120,1); 
		//事件 
		m_ListCtrl.InsertColumn(2,"事件",LVCFMT_CENTER,200,1); 
 
		int i=0; 
		_variant_t vType; 
		_variant_t vTime; 
		_variant_t vEvent; 
 
		while(!MySet->EndOfFile) 
		{ 
			vType=MySet->GetCollect(L"类型"); 
			m_ListCtrl.InsertItem(i,_bstr_t(vType),1); 
 
			vTime=MySet->GetCollect(L"时间"); 
			m_ListCtrl.SetItem(i,1,LVIF_TEXT,_bstr_t(vTime),0,0,0,0); 
				 
			vEvent=MySet->GetCollect(L"事件"); 
			m_ListCtrl.SetItem(i,2,LVIF_TEXT,_bstr_t(vEvent),0,0,0,0); 
 
			i++; 
			MySet->MoveNext(); 
		} 
	} 
	 
 
} 
 
_RecordsetPtr CAgentNetServerDlg::ExecuteStoredProc(_bstr_t storedProc) 
{ 
	//显示所有事件 
	//record set 指针 
	_variant_t vRecordsAffected(0L); 
 
	_RecordsetPtr MySet; 
 
 //   MySet.CreateInstance(__uuidof(Recordset)); 
	 
	try 
	{ 
		BeginWaitCursor(); 
		MySet = m_pSqlCon->Execute( 
			storedProc, &vRecordsAffected, adOptionUnspecified); 
		EndWaitCursor(); 
	} 
	catch(_com_error &e) 
	{ 
		AfxMessageBox(e.ErrorMessage()); 
	} 
	return MySet; 
 
} 
 
void CAgentNetServerDlg::OnRclickTreeAll(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	CPoint point; 
	point = (CPoint) GetMessagePos(); 
 
	ScreenToClient(&point); 
	UINT uFlags; 
	HTREEITEM htItem; 
	CMenu menu; 
	CMenu *pPopup; 
 
	htItem = m_TreeCtrl.GetSelectedItem( ); 
	if( htItem == NULL ) 
		return; 
 
    CString strSelectedItem; 
	strSelectedItem=m_TreeCtrl.GetItemText(htItem); 
 
	BOOL bMenuMake=FALSE; 
    if (strSelectedItem=="事件察看器") 
	{ 
		if (!menu.LoadMenu(IDR_MENU_EVENT)) 
			AfxMessageBox("menu error!"); 
		pPopup = menu.GetSubMenu(0); 
		bMenuMake=TRUE; 
	} 
    if (strSelectedItem=="账号管理") 
	{ 
		if (!menu.LoadMenu(IDR_MENU_ACCOUNT_ADD)) 
			AfxMessageBox("menu error!"); 
		pPopup = menu.GetSubMenu(0); 
		bMenuMake=TRUE; 
	} 
    if (strSelectedItem=="新闻管理") 
	{ 
		if (!menu.LoadMenu(IDR_MENU_NEWS_ADD)) 
			AfxMessageBox("menu error!"); 
		pPopup = menu.GetSubMenu(0); 
		bMenuMake=TRUE; 
	} 
 
 
	if (bMenuMake==FALSE) 
		return; 
 
	ClientToScreen(&point); 
	pPopup->TrackPopupMenu(TPM_LEFTALIGN,point.x, point.y, this); 
 
	 
	*pResult = 0; 
} 
 
void CAgentNetServerDlg::OnMenuitemEventClear()  
{ 
	// TODO: Add your command handler code here 
	//清空事件 
	char cmdText[511]; 
	sprintf(cmdText,"AgentNet..ClearEvent"); 
 
	ExecuteStoredProc(_bstr_t(cmdText)); 
	ShowEvent(); 
 
} 
 
void CAgentNetServerDlg::ShowAccount() 
{ 
	char cmdText[511]; 
	sprintf(cmdText,"AgentNet..ShowAccount"); 
 
	_RecordsetPtr MySet; 
 
	MySet = ExecuteStoredProc(_bstr_t(cmdText));	 
 
	while(!MySet->EndOfFile) 
	{ 
		m_ListCtrl.DeleteAllItems(); 
		while(m_ListCtrl.DeleteColumn(0)); 
 
		//建立账号管理表头 
 
		m_ListCtrl.InsertColumn(0,"用户名",LVCFMT_CENTER,100,0);   
		//时间 
		m_ListCtrl.InsertColumn(1,"密码",LVCFMT_CENTER,120,1); 
		//事件 
		m_ListCtrl.InsertColumn(2,"权限",LVCFMT_CENTER,100,1); 
 
		int i=0; 
		_variant_t vYhm; 
		_variant_t vMm; 
		_variant_t vQx; 
 
		while(!MySet->EndOfFile) 
		{ 
			vYhm=MySet->GetCollect(L"用户名"); 
			m_ListCtrl.InsertItem(i,_bstr_t(vYhm)); 
 
			vMm=MySet->GetCollect(L"密码"); 
			m_ListCtrl.SetItem(i,1,LVIF_TEXT,_bstr_t(vMm),0,0,0,0); 
				 
			vQx=MySet->GetCollect(L"权限"); 
			m_ListCtrl.SetItem(i,2,LVIF_TEXT,_bstr_t(vQx),0,0,0,0); 
 
			i++; 
			MySet->MoveNext(); 
		} 
	} 
 
} 
 
void CAgentNetServerDlg::OnRclickListAll(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	//弹出右键菜单 
	CPoint point; 
	point = (CPoint) GetMessagePos(); 
 
	ScreenToClient(&point); 
	UINT uFlags; 
	HTREEITEM htItem; 
	CMenu menu; 
	CMenu *pPopup; 
 
	htItem = m_TreeCtrl.GetSelectedItem( ); 
	if( htItem == NULL ) 
		return; 
 
    CString strSelectedItem; 
	strSelectedItem=m_TreeCtrl.GetItemText(htItem); 
 
	BOOL bMenuMake=FALSE; 
    if (strSelectedItem=="事件察看器") 
	{ 
		/* 
		if (!menu.LoadMenu(IDR_MENU_EVENT)) 
			AfxMessageBox("menu error!"); 
		pPopup = menu.GetSubMenu(0); 
		bMenuMake=TRUE; 
		*/ 
	} 
    if (strSelectedItem=="账号管理") 
	{ 
		if (!menu.LoadMenu(IDR_MENU_ACCOUNT_MODIFY)) 
			AfxMessageBox("menu error!"); 
		pPopup = menu.GetSubMenu(0); 
		bMenuMake=TRUE; 
	} 
	if (strSelectedItem=="新闻管理") 
	{ 
		if (!menu.LoadMenu(IDR_MENU_NEWS_MODIFY)) 
			AfxMessageBox("menu error!"); 
		pPopup = menu.GetSubMenu(0); 
		bMenuMake=TRUE; 
	} 
 
	if (bMenuMake==FALSE) 
		return; 
 
	ClientToScreen(&point); 
	pPopup->TrackPopupMenu(TPM_LEFTALIGN,point.x, point.y, this); 
 
 
	*pResult = 0; 
} 
 
void CAgentNetServerDlg::OnMenuAddNewAccount()  
{ 
	// TODO: Add your command handler code here 
	//AfxMessageBox("in"); 
 
	//列账号权限 
	char cmdText[511]; 
	sprintf(cmdText,"AgentNet..ListZhqx"); 
 
	_RecordsetPtr MySet; 
 
	MySet = ExecuteStoredProc(_bstr_t(cmdText)); 
 
	CAddNewAccountDlg dlg; 
	dlg.m_bModify=FALSE; 
	dlg.m_MySet=MySet; 
	if (dlg.DoModal()==IDCANCEL) 
		return; 
 
	//增加账号 
	sprintf(cmdText,"AgentNet..AddNewAccount '%s','%s','%s'",dlg.m_strYhm,dlg.m_strMm,dlg.m_strQx); 
	MySet = ExecuteStoredProc(_bstr_t(cmdText)); 
 
	while(!MySet->EndOfFile) 
	{ 
    	_variant_t vResult; 
		_variant_t vTest; 
 
		while(!MySet->EndOfFile) 
		{ 
			vResult=MySet->GetCollect(L"结果"); 
 
    		vTest.SetString("已有此账号"); 
			if (vResult==vTest) 
			{ 
				AfxMessageBox("已有此账号!"); 
				return; 
			}    		 
			vTest.SetString("成功"); 
			if (vResult==vTest) 
			{ 
				AfxMessageBox("成功增加新账号 "+dlg.m_strYhm+" !"); 
				ShowAccount(); 
 
				return; 
			}    		 
			MySet->MoveNext(); 
		} 
	} 
 
 
} 
 
void CAgentNetServerDlg::OnMenuitemAccountDelete()  
{ 
	// TODO: Add your command handler code here 
	int i,iState; 
	int nItemSelected=m_ListCtrl.GetSelectedCount();//所选表项数 
	if(nItemSelected<1)  
		return; 
 
	int nItemCount=m_ListCtrl.GetItemCount();//表项总数 
	 
	for(i=nItemCount-1;i>=0;i--) 
	{ 
		iState=m_ListCtrl.GetItemState(i,LVIS_SELECTED); 
		if(iState!=0)  
		{ 
			if (AfxMessageBox("确认删除账号: "+m_ListCtrl.GetItemText(i,0)+ "?",MB_OKCANCEL)==IDCANCEL) 
				continue; 
 
			char cmdText[511]; 
			sprintf(cmdText,"AgentNet..DeleteAccount '%s'",m_ListCtrl.GetItemText(i,0)); 
			 
			ExecuteStoredProc(_bstr_t(cmdText));	 
 
			m_ListCtrl.DeleteItem(i); 
		} 
	} 
	ShowAccount(); 
 
	 
} 
 
void CAgentNetServerDlg::InitList() 
{ 
	m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle()|LVS_EX_FULLROWSELECT ); 
} 
 
void CAgentNetServerDlg::OnMenuitemAccountUpdate()  
{ 
	// TODO: Add your command handler code here 
	int i,iState; 
	int nItemSelected=m_ListCtrl.GetSelectedCount();//所选表项数 
    if(nItemSelected<1)  
		return; 
 
	if(nItemSelected>1)  
	{ 
		AfxMessageBox("一次只可以修改一个账号"); 
		return; 
	} 
 
	 
	//列账号权限 
	char cmdText[511]; 
	sprintf(cmdText,"AgentNet..ListZhqx"); 
 
	_RecordsetPtr MySet; 
 
	MySet = ExecuteStoredProc(_bstr_t(cmdText)); 
 
 
	CAddNewAccountDlg dlg; 
	dlg.m_MySet=MySet; 
 
	//取原账号信息 
	CString strYyhm; 
 
	int nItemCount=m_ListCtrl.GetItemCount();//表项总数 
	 
	for(i=nItemCount-1;i>=0;i--) 
	{ 
		iState=m_ListCtrl.GetItemState(i,LVIS_SELECTED); 
		if(iState!=0)  
		{ 
			dlg.m_bModify=TRUE; 
			strYyhm=m_ListCtrl.GetItemText(i,0); 
			dlg.m_strYhm=strYyhm; 
			dlg.m_strMm=m_ListCtrl.GetItemText(i,1); 
			dlg.m_strQx=m_ListCtrl.GetItemText(i,2); 
		} 
	} 
 
	if (dlg.DoModal()==IDCANCEL) 
		return; 
 
	sprintf(cmdText,"AgentNet..UpdateAccount '%s','%s','%s','%s'",strYyhm,dlg.m_strYhm,dlg.m_strMm,dlg.m_strQx); 
 
	ExecuteStoredProc(_bstr_t(cmdText)); 
	ShowAccount(); 
	 
} 
 
BOOL CAgentNetServerDlg::TestIsUser(CString strUserName, CString strUserPassword) 
{ 
	char cmdText[511]; 
	sprintf(cmdText,"AgentNet..TestIsUser '%s','%s'",strUserName,strUserPassword); 
 
	_RecordsetPtr MySet; 
 
	MySet = ExecuteStoredProc(_bstr_t(cmdText));	 
 
	while(!MySet->EndOfFile) 
	{ 
		_variant_t vResult; 
		_variant_t vTest; 
 
		while(!MySet->EndOfFile) 
		{ 
			vResult=MySet->GetCollect(L"结果"); 
 
 
    		vTest.SetString("不是用户"); 
			if (vResult==vTest) 
			{ 
				return FALSE; 
			}    		 
			vTest.SetString("是用户"); 
			if (vResult==vTest) 
			{ 
				return TRUE; 
			}    		 
			 
			MySet->MoveNext(); 
		} 
	} 
	return FALSE; 
} 
 
void CAgentNetServerDlg::OnDblclkListAll(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	HTREEITEM htItem; 
	 
	htItem = m_TreeCtrl.GetSelectedItem( ); 
	if( htItem == NULL ) 
		return; 
 
    CString strSelectedItem; 
	strSelectedItem=m_TreeCtrl.GetItemText(htItem); 
 
	BOOL bMenuMake=FALSE; 
    if (strSelectedItem=="事件察看器") 
	{ 
		/* 
		if (!menu.LoadMenu(IDR_MENU_EVENT)) 
			AfxMessageBox("menu error!"); 
		pPopup = menu.GetSubMenu(0); 
		bMenuMake=TRUE; 
		*/ 
	} 
    if (strSelectedItem=="账号管理") 
	{ 
		OnMenuitemAccountUpdate(); 
	} 
    if (strSelectedItem=="新闻管理") 
	{ 
		OnMenuitemNewsUpdate(); 
	} 
 
	 
	*pResult = 0; 
} 
 
void CAgentNetServerDlg::ShowAllNews() 
{ 
	char cmdText[511]; 
	sprintf(cmdText,"AgentNet..ShowXw '','show all'"); 
 
	_RecordsetPtr MySet; 
 
	MySet = ExecuteStoredProc(_bstr_t(cmdText));	 
 
	while(!MySet->EndOfFile) 
	{ 
		m_ListCtrl.DeleteAllItems(); 
		while(m_ListCtrl.DeleteColumn(0)); 
 
		//建立新闻管理表头 
 
		m_ListCtrl.InsertColumn(0,"新闻 id 号",LVCFMT_CENTER,80,0);   
		//类型 
		m_ListCtrl.InsertColumn(1,"类型",LVCFMT_CENTER,50,1); 
		//时间 
		m_ListCtrl.InsertColumn(2,"时间",LVCFMT_CENTER,130,1); 
		//标题 
		m_ListCtrl.InsertColumn(3,"标题",LVCFMT_CENTER,100,1); 
		//内容 
		m_ListCtrl.InsertColumn(4,"内容",LVCFMT_CENTER,200,1); 
 
		int i=0; 
		_variant_t vXwid; 
		_variant_t vLx; 
		_variant_t vSj; 
		_variant_t vBt; 
		_variant_t vNr; 
 
		while(!MySet->EndOfFile) 
		{ 
			vXwid=MySet->GetCollect(L"id"); 
			m_ListCtrl.InsertItem(i,_bstr_t(vXwid)); 
 
			vLx=MySet->GetCollect(L"类型"); 
			m_ListCtrl.SetItem(i,1,LVIF_TEXT,_bstr_t(vLx),0,0,0,0); 
				 
			vSj=MySet->GetCollect(L"时间"); 
			m_ListCtrl.SetItem(i,2,LVIF_TEXT,_bstr_t(vSj),0,0,0,0); 
 
			vBt=MySet->GetCollect(L"标题"); 
			m_ListCtrl.SetItem(i,3,LVIF_TEXT,_bstr_t(vBt),0,0,0,0); 
 
			vNr=MySet->GetCollect(L"内容"); 
			m_ListCtrl.SetItem(i,4,LVIF_TEXT,_bstr_t(vNr),0,0,0,0); 
 
			i++; 
			MySet->MoveNext(); 
		} 
	} 
 
 
} 
 
void CAgentNetServerDlg::OnMenuitemAddNewNews()  
{ 
	// TODO: Add your command handler code here 
 
	char cmdText[511]; 
	sprintf(cmdText,"AgentNet..ListXwlx"); 
 
	_RecordsetPtr MySet; 
 
	MySet = ExecuteStoredProc(_bstr_t(cmdText)); 
 
	CNewsDlg dlg; 
 
	dlg.m_bModify=FALSE; 
	dlg.m_MySet=MySet; 
	if (dlg.DoModal()==IDCANCEL) 
		return; 
 
	//增加账号 
	sprintf(cmdText,"AgentNet..AddXw '%s','%s','%s'",dlg.m_strXwlx,dlg.m_strXwbt,dlg.m_strXwnr); 
	ExecuteStoredProc(_bstr_t(cmdText)); 
	ShowAllNews(); 
 
} 
 
void CAgentNetServerDlg::OnMenuitemNewsDelete()  
{ 
	// TODO: Add your command handler code here 
	// TODO: Add your command handler code here 
	int i,iState; 
	int nItemSelected=m_ListCtrl.GetSelectedCount();//所选表项数 
	if(nItemSelected<1)  
		return; 
 
	int nItemCount=m_ListCtrl.GetItemCount();//表项总数 
	 
	for(i=nItemCount-1;i>=0;i--) 
	{ 
		iState=m_ListCtrl.GetItemState(i,LVIS_SELECTED); 
		if(iState!=0)  
		{ 
			char cmdText[511]; 
			sprintf(cmdText,"AgentNet..DeleteXw '%s'",m_ListCtrl.GetItemText(i,3)); 
			 
			ExecuteStoredProc(_bstr_t(cmdText));	 
 
			m_ListCtrl.DeleteItem(i); 
		} 
	} 
	ShowAllNews(); 
 
 
} 
 
void CAgentNetServerDlg::OnMenuitemNewsUpdate()  
{ 
	// TODO: Add your command handler code here 
	int i,iState; 
	int nItemSelected=m_ListCtrl.GetSelectedCount();//所选表项数 
    if(nItemSelected<1)  
		return; 
 
	if(nItemSelected>1)  
	{ 
		AfxMessageBox("一次只可以修改一个新闻"); 
		return; 
	} 
 
	 
	//列账号权限 
	char cmdText[511]; 
	sprintf(cmdText,"AgentNet..ListXwlx"); 
 
	_RecordsetPtr MySet; 
 
	MySet = ExecuteStoredProc(_bstr_t(cmdText)); 
 
	CNewsDlg dlg; 
	dlg.m_MySet=MySet; 
 
	//取原新闻信息 
	CString iXwid; 
	int nItemCount=m_ListCtrl.GetItemCount();//表项总数 
	 
	for(i=nItemCount-1;i>=0;i--) 
	{ 
		iState=m_ListCtrl.GetItemState(i,LVIS_SELECTED); 
		if(iState!=0)  
		{ 
			dlg.m_bModify=TRUE; 
			iXwid=m_ListCtrl.GetItemText(i,0); 
			dlg.m_strXwlx=m_ListCtrl.GetItemText(i,1); 
			dlg.m_strXwbt=m_ListCtrl.GetItemText(i,3); 
			dlg.m_strXwnr=m_ListCtrl.GetItemText(i,4); 
		} 
	} 
 
	if (dlg.DoModal()==IDCANCEL) 
		return; 
 
	sprintf(cmdText,"AgentNet..UpdateXw %s,'%s','%s','%s'",iXwid,dlg.m_strXwlx,dlg.m_strXwbt,dlg.m_strXwnr); 
 
	ExecuteStoredProc(_bstr_t(cmdText)); 
 
	ShowAllNews(); 
	 
} 
void CAgentNetServerDlg::ProcessSendNews(CString strUserName,CClientSocket* pClientSocket) 
{ 
	//从sql读新闻 
	char cmdText[511]; 
	sprintf(cmdText,"AgentNet..ShowXw '','show all'"); 
 
	_RecordsetPtr MySet; 
 
	MySet = ExecuteStoredProc(_bstr_t(cmdText));	 
 
	while(!MySet->EndOfFile) 
	{ 
		int i=0; 
		_variant_t vLx; 
//		_variant_t vSj; 
		_variant_t vBt; 
		_variant_t vNr; 
 
		while(!MySet->EndOfFile) 
		{ 
 
			CString str ; 
 
			vLx=MySet->GetCollect(L"类型"); 
 
//			vSj=MySet->GetCollect(L"时间"); 
//			m_ListCtrl.SetItem(i,2,LVIF_TEXT,_bstr_t(vSj),0,0,0,0); 
 
			vBt=MySet->GetCollect(L"标题"); 
 
			vNr=MySet->GetCollect(L"内容"); 
 
			str=(LPCTSTR)_bstr_t(vLx); 
 
			str+=(LPCTSTR)_bstr_t(vBt); 
			str+="。"; 
			str+=(LPCTSTR)_bstr_t(vNr); 
 
			//---------------------------------------------- 
			//发新闻给strUserName 
			POSITION pos,temp; 
			for (pos=m_connectionList.GetHeadPosition();pos!=NULL;) 
			{ 
				//对于已经关闭的客户机 
				temp=pos; 
				stuConnection* pTempStuConnection=(stuConnection*)m_connectionList.GetNext(pos); 
				//匹配成功 
				if (pTempStuConnection->strUserName ==strUserName) 
				{ 
					CMsg* pMsg=new CMsg; 
					pMsg->m_strUser=SERVER_AGENT_NAME; 
					pMsg->m_strToUser=strUserName; 
					pMsg->m_strCommand="request_read_news"; 
					pMsg->m_strText=str; 
					//发送 
					SendMsg(pClientSocket,pMsg); 
				} 
	 
			} 
	 
			MySet->MoveNext(); 
		} 
	} 
 
 
 
 
} 
 
 
void CAgentNetServerDlg::OnMenuiteSetup()  
{ 
	// TODO: Add your command handler code here 
	//设置 
 
	CSetupSheet MainSheet("设置"); 
 
	CSetupSqlPage SqlPage; 
	CSetupTcpIpPage TcpIpPage; 
 
	SqlPage.m_strSqlServerName=m_stuSetup.strSqlServerName; 
	SqlPage.m_strSqlAccount=m_stuSetup.strSqlServerAccountName; 
	SqlPage.m_strSqlPassword=m_stuSetup.strSqlServerAccountPassword; 
 
	TcpIpPage.m_strIpAddress=m_stuSetup.strIpAddress; 
 
	MainSheet.AddPage(&SqlPage); 
	MainSheet.AddPage(&TcpIpPage); 
 
	if (MainSheet.DoModal()==IDCANCEL) 
		return; 
 
	//写注册表 
	CWinApp* pApp = AfxGetApp(); 
    CString strSqlSection  = "SqlSetting"; 
	CString strTcpIpSection  = "TcpIpSetting"; 
 
	pApp->WriteProfileString(strSqlSection,"SqlServerName",SqlPage.m_strSqlServerName); 
	pApp->WriteProfileString(strSqlSection,"SqlAccountName",SqlPage.m_strSqlAccount); 
	pApp->WriteProfileString(strSqlSection,"SqlAccountPassword",SqlPage.m_strSqlPassword); 
 
	pApp->WriteProfileString(strTcpIpSection,"IpAddress",TcpIpPage.m_strIpAddress); 
 
 
	AfxMessageBox("新设置要重新开启服务器才能生效!"); 
} 
 
void CAgentNetServerDlg::OnMenuitemStartAgentNet()  
{ 
	// TODO: Add your command handler code here 
	 
	if (!InitConnectSqlServer()) 
		return; 
	InitSocket(); 
	InitTree(); 
	InitList(); 
	InitStrBool(); 
 
	m_bCanStart=FALSE; 
 
} 
 
void CAgentNetServerDlg::OnMenuitemStopAgentNet()  
{ 
	// TODO: Add your command handler code here 
	CDialog::OnOK(); 
	 
} 
 
void CAgentNetServerDlg::InitSetup() 
{ 
 
	//读注册表 
	CWinApp* pApp = AfxGetApp(); 
    CString strSqlSection  = "SqlSetting"; 
	CString strTcpIpSection  = "TcpIpSetting"; 
 
 
    m_stuSetup.strSqlServerName = pApp->GetProfileString(strSqlSection,"SqlServerName"); 
 
    m_stuSetup.strSqlServerAccountName = pApp->GetProfileString(strSqlSection,"SqlAccountName"); 
 
    m_stuSetup.strSqlServerAccountPassword  = pApp->GetProfileString(strSqlSection,"SqlAccountPassword"); 
 
	m_stuSetup.strIpAddress = pApp->GetProfileString(strTcpIpSection,"IpAddress"); 
 
} 
 
 
void CAgentNetServerDlg::OnUpdateMenuitemStartAgentNet(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	if (m_bCanStart==FALSE) 
	{ 
		pCmdUI->Enable(FALSE); 
		pCmdUI->SetCheck(1); 
	} 
 
} 
 
void CAgentNetServerDlg::OnMenuitemAbout()  
{ 
	// TODO: Add your command handler code here 
	CAboutDlg dlg; 
	dlg.DoModal(); 
	 
}