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!!!! 
//	} 
}