www.gusucode.com > FreeEIM_VC++企业即时通讯软件源代码源码程序 > FreeEIM_VC++企业即时通讯软件源代码源码程序\code\em\EM_FileSendingDlg.cpp

    // FileSendingDlg.cpp : implementation file
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "../EM_MsgDlg.h"
#include "stdemdef.h"
#include "EM_FileSendingDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// FileSendingDlg dialog

//DWORD FileSendingDlg::m_dwTimer[5] = {11,22,33,44,55};

EM_FileSendingDlg::EM_FileSendingDlg(CWnd* pParent /*=NULL*/)
	: CDialog(EM_FileSendingDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(FileSendingDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_dwCurrent = -1;
	m_dwX = m_dwY = -1;
	m_dwFileLength = 0;
	m_dwSendLength = 0;
	m_bRunning = TRUE;
	m_fDuration = 0.00;
	m_bSendingDlg = TRUE;
}

void EM_FileSendingDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(FileSendingDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	DDX_Control(pDX, IDC_PROGRESS, m_percent);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(EM_FileSendingDlg, CDialog)
	//{{AFX_MSG_MAP(FileSendingDlg)
	ON_WM_TIMER()
	ON_MESSAGE(WM_FILERECEIVINGCOMPLETE, FileReceivingComplete)
	ON_MESSAGE(WM_FILESENDINGCOMPLETE, FileSendingComplete)
//	ON_MESSAGE(WM_FILESENDINGFAILED, FileSendingFailed)
	ON_WM_CTLCOLOR()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// FileSendingDlg message handlers

void EM_FileSendingDlg::OnTimer(UINT nIDEvent)
{
	// TODO: Add your message handler code here and/or call default
	if (11 == nIDEvent)
	if ((m_dwSendLength !=0) && (m_dwFileLength != 0))
	{
		float ddd = float(m_dwSendLength / m_dwFileLength);
		float aa = float(m_dwSendLength);
		float bb = float(m_dwFileLength);
		//ddd = (70000 / 17918205);
		//ddd = 3/4*100;
		ddd = aa /bb * 100;
		//ddd = 0.222;
		m_percent.SetPos((int)ddd);
		CString str;
		float filelen = float(m_dwFileLength);
		filelen /= 1024;
		filelen /= 1024;
		float sentlen = float(m_dwSendLength);
		sentlen /= 1024;
		sentlen /= 1024;
		str.Format(_T("%.2fMB/%.2fMB"), sentlen, filelen);
	//	str.Format(_T("%.2fMB/%.2fMB-%d"), sentlen, filelen, m_dwCurrent);
		GetDlgItem(IDC_STATIC_PROMPT)->SetWindowText(str);
		str.Format(_T("%.1f%%"), ddd);
		GetDlgItem(IDC_STATIC_PERCENT)->SetWindowText(str);
		if (m_dwSendLength == m_dwFileLength)
		{
			KillTimer(nIDEvent);
			m_percent.ShowWindow(SW_HIDE);
			GetDlgItem(IDC_STATIC_PERCENT)->ShowWindow(SW_HIDE);
			GetDlgItem(IDCANCEL)->ShowWindow(SW_HIDE);
			GetDlgItem(IDC_STATIC_COMPLETED)->ShowWindow(SW_SHOW);
		}
	}
	if (22 == nIDEvent)
	{
		GetParent()->PostMessage(WM_UPDATEDLG, (WPARAM)m_dwCurrent, (LPARAM)m_bSendingDlg);
		KillTimer(nIDEvent);
	}
	CDialog::OnTimer(nIDEvent);
}

DWORD EM_FileSendingDlg::FileSendingProc(LPVOID lParam)
{
	BOOL bRet;
	CFile file;
	EM_FileSendingDlg *d = (EM_FileSendingDlg*)lParam;
    SOCKET        sClient;
	SOCKADDR_IN server;
	int total = 0;
	byte buf[FILE_BUFFER_LENGTH];

	clock_t start, finish;
	/* 测量一个事件持续的时间*/
	int readlen;
	int ret;

	sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == sClient)
	{
		AfxMessageBox("socket() failed.");
		return 1;
	}
	server.sin_family = AF_INET;
	server.sin_port = htons(5150);
	server.sin_addr.s_addr = inet_addr(d->m_szUserIP);
	if (SOCKET_ERROR == connect(sClient, (PSOCKADDR)&server, sizeof(server)))
	{
		AfxMessageBox("connect() failed.");
		return 1;
	}

	bRet = file.Open(d->m_szFileName, CFile::modeRead|CFile::shareDenyNone, NULL);
	if (! bRet)
	{
		AfxMessageBox("File opening error.");
		return 1;
	}
	d->m_dwFileLength = file.GetLength();
//	::MessageBox(NULL,(char*)d->m_fileInfo.FileName(),0,0);
	ret = send(sClient, (char*)&(d->m_fileInfo), sizeof(EM_FILEINFO), 0);
	if (SOCKET_ERROR == ret)
	{
		file.Close();
		AfxMessageBox("Data sending failed.");
		return FALSE;
	}

	start = clock();

	readlen=file.Read(buf, FILE_BUFFER_LENGTH);
	while(readlen > 0)
	{
		if (! d->m_bRunning)
			break;
		ret = send(sClient, (char*)buf, readlen, 0);
		if (SOCKET_ERROR == ret)
		{
		//	AfxMessageBox("Data sending failed.");
		//	d->PostMessage(WM_FILESENDINGFAILED);
			break;
		}
		d->m_dwSendLength += readlen;
		readlen = file.Read(buf, FILE_BUFFER_LENGTH);
	}
	shutdown(sClient, SD_SEND);
	closesocket(sClient);
	file.Close();

	finish = clock();
	double f1, f2;
	f1 = (double)finish;
	f2 = (double)start;
	d->m_fDuration = (f1-f2) / CLOCKS_PER_SEC;
	Sleep(88);
	d->SendMessage(WM_FILESENDINGCOMPLETE);

	// 等待它处理一些其他事
	return 1;
}

DWORD EM_FileSendingDlg::FileReceivingProc(LPVOID lParam)
{
	EM_FileSendingDlg *pDlg = (EM_FileSendingDlg *)lParam;
	byte buf[FILE_BUFFER_LENGTH];
	static int random_value = 0;
	SOCKET sock = pDlg->Sock;
	BOOL exitLoop = FALSE;
	int ret;
	int total = 0;
	CFile file;
//	char random_file_name[64];
	clock_t start, finish;

	EM_FILEINFO finfo;
	ret = recv(sock, (char*)&finfo, sizeof(EM_FILEINFO), 0);
	memcpy((char*)&(pDlg->m_fileInfo), (char*)&finfo, sizeof(EM_FILEINFO));
	pDlg->m_dwFileLength = finfo.dwSize;
	strcpy(pDlg->m_szFileExt, finfo.FileExt());
	strcpy(pDlg->m_szFileName, finfo.FileFullName());
	strcpy(pDlg->m_szFileTitle, finfo.FileName());
	pDlg->GetDlgItem(IDC_STATIC_FILE_NAME)->SetWindowText(pDlg->m_szFileTitle);
	SHFILEINFO shfi;
	SHGetFileInfo(pDlg->m_szFileTitle,FILE_ATTRIBUTE_NORMAL,&shfi,
		sizeof(shfi),SHGFI_ICON|SHGFI_USEFILEATTRIBUTES);
	if (NULL != shfi.hIcon)
	{
		pDlg->GetDlgItem(IDC_STATIC_ICON)->SendMessage(STM_SETIMAGE, IMAGE_ICON, (LPARAM)shfi.hIcon);
	}
//	sprintf(random_file_name, "e:\\testfile%d.zip", random_value++);
//	MessageBox(0,"The saving file name is %s.\n", 0,0);
	BOOL bRet = file.Open(pDlg->m_szFileName, CFile::modeWrite|CFile::modeCreate|CFile::modeNoTruncate, NULL);
	if (! bRet)
	{
		::MessageBox(0,"EMFileClient::RecvFile [file.opne] failed.",0,0);
	//	file.Close();
		closesocket(sock);
		pDlg->PostMessage(WM_FILERECEIVINGCOMPLETE);
		exitLoop = TRUE;
		return -1;
	}

/*	CString str;
	str.Format("%d\n", finfo.dwSendFileIndex);
	::MessageBox(0,str,0,0);*/

	start = clock();
	while (! exitLoop)
	{
		if (! pDlg->m_bRunning)
			break;
		ret = recv(sock, (char*)&buf, FILE_BUFFER_LENGTH, 0);
		if (0 == ret) // Graceful close
		{
		//	::MessageBox(0,"Client disconnected.\n",0,0);
			break;
		}

		else if (SOCKET_ERROR == ret)
		{
			::MessageBox(0,"recv() failed:%d\n",0,0);
			break;
		}
		else
		{
			pDlg->m_dwSendLength += ret;
			file.Write(buf, ret);
		}
	}
	shutdown(sock, SD_BOTH);
	closesocket(sock);
	file.Close();

	finish = clock();

	double f1, f2;
	f1 = (double)finish;
	f2 = (double)start;

	pDlg->m_fDuration = (f1-f2) / CLOCKS_PER_SEC;
	Sleep(88);
	pDlg->SendMessage(WM_FILERECEIVINGCOMPLETE);

	// 等待它处理一些其他事
	return 1;
}

void EM_FileSendingDlg::DoInitialize(DWORD dwIndex, CRect rt, DWORD dwY)
{
	GetDlgItem(IDC_STATIC_COMPLETED)->ShowWindow(SW_HIDE);
	m_dwX = rt.right-186;
	m_dwY = dwY;
	MoveWindow(m_dwX, m_dwY, 179, FILE_SENDING_DLG_LEN);
	ShowWindow(SW_SHOW);
	m_dwCurrent = dwIndex;
}

void EM_FileSendingDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	m_bRunning = FALSE;
	KillTimer(11);
//	FileReceivingComplete();
//	GetDlgItem(IDC_STATIC_PERCENT)->ShowWindow(SW_HIDE);
//	GetDlgItem(IDC_STATIC_COMPLETED)->SetWindowText(_T("传输被终止!"));
//	GetDlgItem(IDCANCEL)->ShowWindow(SW_HIDE);
//	m_percent.ShowWindow(SW_HIDE);
//	GetDlgItem(IDC_STATIC_COMPLETED)->ShowWindow(SW_SHOW);
//	GetDlgItem(IDC_STATIC_PROMPT)->ShowWindow(SW_HIDE);
//	SetTimer(22, 1888, NULL);
}
// 文件接收完成
void EM_FileSendingDlg::FileReceivingComplete(WPARAM wParam, LPARAM lParam)
{
	int i = m_fileInfo.dwRecvFileIndex;
	EM_MsgDlg *pDlg = (EM_MsgDlg*)GetParent();

	if (m_dwFileLength != m_dwSendLength)
	{
		GetDlgItem(IDC_STATIC_PERCENT)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_STATIC_COMPLETED)->SetWindowText(_T("接受失败!"));
		GetDlgItem(IDC_STATIC_COMPLETED)->ShowWindow(SW_SHOW);
		m_percent.ShowWindow(SW_HIDE);
		GetDlgItem(IDCANCEL)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_STATIC_PROMPT)->ShowWindow(SW_HIDE);

		pDlg->File_RecvFailed(i);
	}
	else
	{
		char buf[128];
		sprintf(buf, "使用时间:%.2f 秒", m_fDuration);
		GetDlgItem(IDC_STATIC_PROMPT)->SetWindowText(buf);
		pDlg->File_RecvComplete(i);
	}
	SetTimer(22, 3200, NULL);
}

// 文件发送完成
void EM_FileSendingDlg::FileSendingComplete(WPARAM wParam, LPARAM lParam)
{
	EM_MsgDlg *pDlg = (EM_MsgDlg*)GetParent();
	int i = m_fileInfo.dwSendFileIndex;

	if (m_dwFileLength != m_dwSendLength)
	{
		GetDlgItem(IDC_STATIC_PERCENT)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_STATIC_COMPLETED)->SetWindowText(_T("发送失败!"));
		GetDlgItem(IDC_STATIC_COMPLETED)->ShowWindow(SW_SHOW);
		m_percent.ShowWindow(SW_HIDE);
		GetDlgItem(IDCANCEL)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_STATIC_PROMPT)->ShowWindow(SW_HIDE);
		pDlg->File_SendFailed(i);
	}
	else
	{
		char buf[128];
		sprintf(buf, "使用时间:%.2f 秒", m_fDuration);
		GetDlgItem(IDC_STATIC_PROMPT)->SetWindowText(buf);
		pDlg->File_SendComplete(i);
	}
	SetTimer(22, 3888, NULL);
}
/*
void EM_FileSendingDlg::FileSendingFailed(WPARAM wParam, LPARAM lParam)
{
	if (m_dwFileLength != m_dwSendLength)
	{
		GetDlgItem(IDC_STATIC_PERCENT)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_STATIC_COMPLETED)->SetWindowText(_T("发送失败!"));
		GetDlgItem(IDC_STATIC_COMPLETED)->ShowWindow(SW_SHOW);
		m_percent.ShowWindow(SW_HIDE);
		GetDlgItem(IDCANCEL)->ShowWindow(SW_HIDE);
	}
	SetTimer(22, 1888, NULL);
}*/

void EM_FileSendingDlg::AdjustDlgRect()
{
	m_dwY -= FILE_SENDING_DLG_LEN;
	m_dwCurrent -= 1;
	MoveWindow(m_dwX, m_dwY, 179, FILE_SENDING_DLG_LEN);
}

HBRUSH EM_FileSendingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO: Change any attributes of the DC here
	if(CTLCOLOR_DLG  ==nCtlColor)
        return m_Brush;
	else if(CTLCOLOR_STATIC == nCtlColor)
    {
        pDC->SetBkMode(TRANSPARENT);
		pDC->SetTextColor(m_crStatic);
        return m_Brush;
    }
	// TODO: Return a different brush if the default is not desired
	return hbr;
}

void EM_FileSendingDlg::BeginToReceive(SOCKET &sock)
{
	// 标志成 接收
	m_bSendingDlg = FALSE;

	GetDlgItem(IDC_BUTTON_DENY)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_BUTTON_SAVE_AS)->ShowWindow(SW_HIDE);
	m_Brush.CreateSolidBrush(RGB(236,243,246));
	m_crStatic = RGB(99,97,78);
	Sock = sock;
	HANDLE hThread;
	DWORD dwTID = 0;
	hThread = CreateThread(NULL, 0, FileReceivingProc, (LPVOID)this, 0, &dwTID);
	if (NULL == hThread)
	{
		::MessageBox(0,"CreateThread() failed.",0,0);
		return;
	}
	else
	{
		CloseHandle(hThread);
		SetTimer(11, 1, NULL);
	}
}

void EM_FileSendingDlg::BeginToSend(LPEM_FILEINFO fInfo) 
{
//	memcpy(&m_fileInfo, fInfo, sizeof(EM_FILEINFO));
	m_Brush.CreateSolidBrush(RGB(250,250,250));
	m_crStatic = RGB(0,136,228);
	ASSERT(m_dwCurrent != -1);
	strcpy(m_szFileName, fInfo->FileFullName());
	strcpy(m_szFileTitle, fInfo->FileName());
	strcpy(m_szFileExt, fInfo->FileExt());

	//	MessageBox("你所打开的文件是:"+(CString)dlgFileOpen.m_ofn.lpstrFile);
	// Begin Thread
	GetDlgItem(IDC_STATIC_FILE_NAME)->SetWindowText(m_szFileTitle);

	SHFILEINFO shfi;
	SHGetFileInfo(m_szFileName,FILE_ATTRIBUTE_NORMAL,&shfi,
		sizeof(shfi),SHGFI_ICON|SHGFI_USEFILEATTRIBUTES);

	if (NULL != shfi.hIcon)
	{
		GetDlgItem(IDC_STATIC_ICON)->SendMessage(STM_SETIMAGE, IMAGE_ICON, (LPARAM)shfi.hIcon);
	}
	else
	{
		MessageBox("Could not retrieve the file icon.");
	}
	DWORD dwTID = 0;
	HANDLE hThread = CreateThread(NULL, 0, FileSendingProc, this, 0, &dwTID);
	if (NULL == hThread)
	{
		MessageBox("Thread creating error.\r\nFile could not be send.");
	}
	else
	{
		CloseHandle(hThread);
	}
	SetTimer(11, 1, NULL);
/*	else
	MessageBox("打开文件出错!");*/
}