📄 mychatsvrdoc.cpp
字号:
// MyChatSvrDoc.cpp : implementation of the CMyChatSvrDoc class
//
#include "stdafx.h"
#include "MyChatSvr.h"
#include "MainFrm.h"
#include "OutputView.h"
#include "ChannelDlg.h"
#include "MyChatSvrDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyChatSvrDoc
IMPLEMENT_DYNCREATE(CMyChatSvrDoc, CDocument)
BEGIN_MESSAGE_MAP(CMyChatSvrDoc, CDocument)
//{{AFX_MSG_MAP(CMyChatSvrDoc)
ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyChatSvrDoc construction/destruction
CMyChatSvrDoc::CMyChatSvrDoc()
{
m_strClientClosed.LoadString(IDS_CLIENT_CLOSED);
m_bContentModified = FALSE;
}
CMyChatSvrDoc::~CMyChatSvrDoc()
{
if(m_pListenSocket != NULL)
{
m_pListenSocket->Close();
delete m_pListenSocket;
m_pListenSocket = NULL;
}
POSITION pos;
CClientSocket* pSocket;
for(pos=m_pClientList.GetHeadPosition();pos!=NULL;)
{
pSocket = (CClientSocket *)m_pClientList.GetNext(pos);
delete pSocket;
}
}
BOOL CMyChatSvrDoc::OnNewDocument()
{
/// AfxMessageBox("enter sever->CMyChatSvrDoc::OnNewDocument");
CChannelDlg dlg;
if(dlg.DoModal() == IDOK)
{
m_pListenSocket = new CListeningSocket(this);
m_pListenSocket->Create(dlg.m_nPort+700);
m_pListenSocket->Listen();
}
else
{
AfxMessageBox("error in create chat svr!");
}
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMyChatSvrDoc serialization
void CMyChatSvrDoc::Serialize(CArchive& ar)
{
CMainFrame* pFrm = (CMainFrame*)AfxGetApp()->m_pMainWnd;
COutputView* pView = (COutputView*)pFrm->m_wndSplitter.GetPane(0,0);
CString strMsg;
if (ar.IsStoring())
{
pView->GetWindowText(strMsg);
ar << strMsg;
m_bContentModified = FALSE;
}
else
{
ar >> strMsg;
pView->MsgOut(strMsg);
}
}
/////////////////////////////////////////////////////////////////////////////
// CMyChatSvrDoc diagnostics
#ifdef _DEBUG
void CMyChatSvrDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CMyChatSvrDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMyChatSvrDoc commands
void CMyChatSvrDoc::DeleteContents()
{
CDocument::DeleteContents();
}
void CMyChatSvrDoc::ProcessReceive(CClientSocket* pSocket)
{
CMainFrame* pFrm = (CMainFrame*)AfxGetApp()->m_pMainWnd;
COutputView* pView = (COutputView*)pFrm->m_wndSplitter.GetPane(0,0);
CString strRecv;
strRecv = pSocket->ReadData();
pView->MsgOut(strRecv);
if(strRecv == m_strClientClosed)
{
CloseSocket(pSocket);
delete pSocket;
}
else
{
BroadcastMsg(pSocket,strRecv);
}
}
void CMyChatSvrDoc::ProcessAccept()
{
CClientSocket *pSocket = new CClientSocket(this);
if(m_pListenSocket->Accept(*pSocket))
{
pSocket->Init();
m_pClientList.AddTail((void *) pSocket);
// AfxMessageBox("enter CMyChatSvrDoc::ProcessAccept()");
}
else
{
delete pSocket;
}
}
void CMyChatSvrDoc::CloseSocket(CClientSocket *pSocket)
{
CClientSocket *pSavedSocket;
POSITION pos,posOld;
BOOL bFind;
pSocket->Finish_Comm();
pos = m_pClientList.GetHeadPosition();
bFind = FALSE;
while((pos != NULL) && (bFind == FALSE))
{
posOld = pos;
pSavedSocket = (CClientSocket *)m_pClientList.GetNext(pos);
bFind = (pSocket == pSavedSocket);
}
if(bFind == TRUE)
{
m_pClientList.RemoveAt(posOld);
}
}
void CMyChatSvrDoc::OnCloseDocument()
{
CString strClosed;
strClosed.LoadString(IDS_SERVER_CLOSED);
BroadcastMsg(NULL, strClosed);
CDocument::OnCloseDocument();
}
// the strMsg comes from the *pSocket,broadcasting such message to all the
// client connected to the server
// if the message comes from the server,then set the parameter of pSocket is set to NULL
void CMyChatSvrDoc::BroadcastMsg(CClientSocket* pSocketSource, CString strMsg)
{
POSITION pos;
CClientSocket* pOtherSocket;
for(pos=m_pClientList.GetHeadPosition();pos!=NULL;)
{
pOtherSocket = (CClientSocket *)m_pClientList.GetNext(pos);
if(pOtherSocket != pSocketSource)
{
pOtherSocket->SendData(strMsg);
}
}
}
void CMyChatSvrDoc::OnUpdateFileSave(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bContentModified == TRUE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -