📄 chatdoc.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
// chatdoc.cpp : implementation of the CChatDoc class
//
// This is a part of the Microsoft Foundation Classes C++ library.
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "chatter.h"
#include "chatsock.h"
#include "chatdoc.h"
#include "chatvw.h"
#include "setupdlg.h"
#include "msg.h"
#ifdef _WIN32
#ifndef _UNICODE
#include <strstrea.h>
#endif
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CChatDoc
IMPLEMENT_DYNCREATE(CChatDoc, CDocument)
BEGIN_MESSAGE_MAP(CChatDoc, CDocument)
//{{AFX_MSG_MAP(CChatDoc)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChatDoc construction/destruction
CChatDoc::CChatDoc()
{
m_bAutoChat = FALSE;
m_pSocket = NULL;
m_pFile = NULL;
m_pArchiveIn = NULL;
m_pArchiveOut = NULL;
}
CChatDoc::~CChatDoc()
{
}
BOOL CChatDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
#ifdef _WIN32
#ifndef _UNICODE
if (AfxGetApp()->m_lpCmdLine[0] != '\0')
{
TCHAR strHandle[128];
TCHAR strServer[128];
int nChannel;
istrstream(AfxGetApp()->m_lpCmdLine) >> strHandle >> strServer >> nChannel;
return ConnectSocket(strHandle, strServer, nChannel);
}
else
#endif
#endif
{
CSetupDlg Dialog;
Dialog.m_strHandle=m_strHandle;
Dialog.m_strServer=_T("");
Dialog.m_nChannel=0;
while(TRUE)
{
if (IDOK != Dialog.DoModal())
return FALSE;
if (ConnectSocket(Dialog.m_strHandle, Dialog.m_strServer, Dialog.m_nChannel))
return TRUE;
CString str;
str.LoadString(IDS_CHANGEADDRESS);
if (AfxMessageBox((LPCTSTR)str,MB_YESNO) == IDNO)
return FALSE;
}
}
}
void CChatDoc::DeleteContents()
{
m_bAutoChat = FALSE;
if ((m_pSocket != NULL) && (m_pFile != NULL) && (m_pArchiveOut != NULL))
{
CMsg msg;
CString strTemp;
if (strTemp.LoadString(IDS_DISCONNECT))
{
msg.m_bClose = TRUE;
msg.m_strText = m_strHandle + strTemp;
msg.Serialize(*m_pArchiveOut);
m_pArchiveOut->Flush();
}
}
delete m_pArchiveOut;
m_pArchiveOut = NULL;
delete m_pArchiveIn;
m_pArchiveIn = NULL;
delete m_pFile;
m_pFile = NULL;
if (m_pSocket != NULL)
{
BYTE Buffer[50];
m_pSocket->ShutDown();
while(m_pSocket->Receive(Buffer,50) > 0);
}
delete m_pSocket;
m_pSocket = NULL;
for(POSITION pos=GetFirstViewPosition();pos!=NULL;)
{
CView* pView = GetNextView(pos);
if (pView->IsKindOf(RUNTIME_CLASS(CChatView)))
{
CChatView* pChatView = (CChatView*)pView;
pChatView->GetEditCtrl().SetWindowText(_T(""));
}
}
CDocument::DeleteContents();
}
/////////////////////////////////////////////////////////////////////////////
// CChatDoc Operations
BOOL CChatDoc::ConnectSocket(LPCTSTR lpszHandle, LPCTSTR lpszAddress, UINT nPort)
{
m_strHandle = lpszHandle;
m_pSocket = new CChatSocket(this, CCeSocket::FOR_DATA);
if (!m_pSocket->Create())
{
delete m_pSocket;
m_pSocket = NULL;
CString str;
str.LoadString(IDS_CREATEFAILED);
AfxMessageBox((LPCTSTR)str);
return FALSE;
}
while (!m_pSocket->Connect(lpszAddress, nPort + 700))
{
CString str;
str.LoadString(IDS_RETRYCONNECT);
if (AfxMessageBox((LPCTSTR)str,MB_YESNO) == IDNO)
{
delete m_pSocket;
m_pSocket = NULL;
return FALSE;
}
}
m_pFile = new CSocketFile(m_pSocket);
m_pArchiveIn = new CArchive(m_pFile,CArchive::load);
m_pArchiveOut = new CArchive(m_pFile,CArchive::store);
CString strTemp;
if (strTemp.LoadString(IDS_CONNECT))
SendMsg(strTemp
);
return TRUE;
}
void CChatDoc::ProcessPendingRead()
{
do
{
ReceiveMsg();
if (m_pSocket == NULL)
return;
}
while(!m_pArchiveIn->IsBufferEmpty());
}
void CChatDoc::SendMsg(CString& strText)
{
if (m_pArchiveOut != NULL)
{
CMsg msg;
msg.m_strText = m_strHandle + _T(": ") + strText;
TRY
{
msg.Serialize(*m_pArchiveOut);
m_pArchiveOut->Flush();
}
CATCH(CFileException, e)
{
m_bAutoChat = FALSE;
m_pArchiveOut->Abort();
delete m_pArchiveOut;
m_pArchiveOut = NULL;
CString strTemp;
if (strTemp.LoadString(IDS_SERVERRESET))
DisplayMsg(strTemp);
}
END_CATCH
}
}
void CChatDoc::ReceiveMsg()
{
CMsg msg;
TRY
{
msg.Serialize(*m_pArchiveIn);
while(!msg.m_msgList.IsEmpty())
{
CString temp = msg.m_msgList.RemoveHead();
DisplayMsg(temp);
}
}
CATCH(CFileException, e)
{
m_bAutoChat = FALSE;
msg.m_bClose = TRUE;
m_pArchiveOut->Abort();
CString strTemp;
if (strTemp.LoadString(IDS_SERVERRESET))
DisplayMsg(strTemp);
if (strTemp.LoadString(IDS_CONNECTIONCLOSED))
DisplayMsg(strTemp);
}
END_CATCH
if (msg.m_bClose)
{
delete m_pArchiveIn;
m_pArchiveIn = NULL;
delete m_pArchiveOut;
m_pArchiveOut = NULL;
delete m_pFile;
m_pFile = NULL;
delete m_pSocket;
m_pSocket = NULL;
}
}
void CChatDoc::DisplayMsg(LPCTSTR lpszText)
{
for(POSITION pos=GetFirstViewPosition();pos!=NULL;)
{
CView* pView = GetNextView(pos);
CChatView* pChatView = DYNAMIC_DOWNCAST(CChatView, pView);
if (pChatView != NULL)
pChatView->Message(lpszText);
}
}
/////////////////////////////////////////////////////////////////////////////
// CChatDoc serialization
void CChatDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
for(POSITION pos=GetFirstViewPosition();pos!=NULL;)
{
CView* pView = GetNextView(pos);
CChatView* pChatView = DYNAMIC_DOWNCAST(CChatView, pView);
if (pChatView != NULL)
pChatView->SerializeRaw(ar);
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CChatDoc diagnostics
#ifdef _DEBUG
void CChatDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CChatDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CChatDoc commands
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -