www.pudn.com > fanccMSNr.src.rar > ChatFrame.cpp
// ChatFrame.cpp
//
#include "stdafx.h"
#include "DumbMessenger.h"
#include "ChatFrame.h"
#include "messenger/InvitationMessage.hpp"
// CChatFrame
IMPLEMENT_DYNCREATE(CChatFrame, CFrameWnd)
CChatFrame::CChatFrame()
{
model=NULL;
sendView=NULL;
chatView=NULL;
}
CChatFrame::~CChatFrame()
{
if(model!=NULL) {
model->removeChatterListener(*this);
model->fileTransferModel.removeFileTransferListener(*this);
theApp.model.removeChatterModel(*model);
}
}
void CChatFrame::setChatterModel(ChatterModel &model) {
this->model=&model;
sendView->setFrame(*this);
model.addChatterListener(*this);
model.fileTransferModel.addFileTransferListener(*this);
model.fileTransferModel.transferNotificationInterval=20;
}
BEGIN_MESSAGE_MAP(CChatFrame, CFrameWnd)
ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
ON_COMMAND(ID_FILE_TRANSFER, OnFileTransfer)
END_MESSAGE_MAP()
void CChatFrame::chatterUpdate(const ChatterModel &model, ChatterListener::Event event) {
}
void CChatFrame::writeMessage(const CString &message) {
CEdit &edit=chatView->GetEditCtrl();
int nText = chatView->GetWindowTextLength();
edit.SetSel(nText, nText);
edit.ReplaceSel(message);
}
void CChatFrame::writeStatus(const CString &text) {
FileTransferModel::Status status=model->fileTransferModel.getStatus();
if(status!=FileTransferModel::RECEIVING || status!=FileTransferModel::SENDING) {
CStatusBarCtrl &statusBarCtrl=statusBar.GetStatusBarCtrl();
statusBarCtrl.SetText(text, 0, 0);
}
}
void CChatFrame::writeProgress(const FileTransferModel &model) {
size_t length=model.getLength();
size_t nTransferred=model.getNTransferred();
int ratio=int((nTransferred*100)/(length));
CString text;
text.Format("文件传输: 大小 %dbytes已传输大小 %dbytes(%d%%) 速率", length, nTransferred, ratio);
CStatusBarCtrl &statusBarCtrl=statusBar.GetStatusBarCtrl();
statusBarCtrl.SetText(text, 0, 0);
}
void CChatFrame::typing(const string &user) {
CString text;
text.Format("%s用户正在输入.", user.data());
writeStatus(text);
}
void CChatFrame::messageArrived(const ChatMessage &message) {
CString text;
text.Format("%s用户消息:\r\n %s\r\n", message.screenName.data(), message.message.data());
writeMessage(text);
CString statusText("正在交谈: ");
CTime time=CTime::GetCurrentTime();
statusText+=time.Format("%c");
writeStatus(statusText);
this->SetWindowText(message.screenName.data());
}
void CChatFrame::fileTransferInvited(const string &filename, size_t size, const string &cookie) {
TRACE("invitation message arrived\nfilename==%s, size==%d, cookie==%s\n", filename.data(), size, cookie.data());
CString message;
message.Format("%s用户 \"%s\"文件名.\n大小 %dbyte 是否接收?",
model->getCompanion().screenName.data(), filename.data(), (int)size);
if(AfxMessageBox(message, MB_YESNO) == IDYES) {
model->acceptFileTransfer(cookie, filename);
} else {
model->rejectFileTransfer(cookie);
}
}
void CChatFrame::fileTransferRejected(const string &cookie) {
writeMessage(_T("拒绝文件传输.\r\n"));
}
void CChatFrame::fileTransferUpdate(FileTransferModel &model, FileTransferListener::Event event) {
switch(event) {
case RECEIVING_STARTED:
case SENDING_STARTED:
writeMessage(_T("正在传输文件.\r\n"));
break;
case PACKET_RECEIVED:
case PACKET_SEND:
writeProgress(model);
break;
case RECEIVING_ENDED:
case SENDING_ENDED:
writeMessage(_T("文件传输完成.\r\n"));
writeStatus("");
break;
case RECEIVEING_CANCELED:
writeMessage(_T("取消了文件传输.\r\n"));
writeStatus("");
break;
case ABORT_BY_PEER:
writeMessage(_T("对方放弃了文件传输.\r\n"));
writeStatus("");
break;
}
}
// CChatFrame
void CChatFrame::OnFileClose()
{
DestroyWindow();
}
BOOL CChatFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if (!statusBar.Create(this))
{
TRACE0("创建状态栏失败.\n");
return -1;
}
if (m_wndSplitter.CreateStatic(this,2,1))
{
CRect rect;
GetClientRect(&rect);
CSize size = rect.Size();
size.cy-=150;
if (m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CChatView),size,pContext))
{
if (m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CSendView),CSize(0,0),pContext))
{
sendView=(CSendView*)m_wndSplitter.GetPane(1, 0);
chatView=(CChatView*)m_wndSplitter.GetPane(0, 0);
SetActiveView(sendView);
return TRUE;
}
}
}
return FALSE;
}
void CChatFrame::OnFileTransfer()
{
CFileDialog fileDialog(true, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, NULL, NULL);
INT_PTR nResult = fileDialog.DoModal();
if(nResult==IDCANCEL) {
return;
}
CString &filename=fileDialog.GetFileName();
CString text;
const string &companion=model->getCompanion().screenName;
text.Format("%s用户 \"%s\"传输文件.\r\n", companion.data(), filename);
writeMessage(text);
// try {
model->inviteFileTransfer((LPCSTR)filename);
// } catch(exception e) {
//TODO: handle this exception!!!!
// }
}