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();
}