📄 filetransmit.cpp
字号:
// FileTransmit.cpp: implementation of the CFileTransmit class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "VideoComm.h"
#include <stdlib.h>
#include "callbackfunc.h"
#include "FileTransmit.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CRITICAL_SECTION CFileTransmit::m_csRawFileDataLock;
UINT SendFileThreadProc(LPVOID pParam)
{
((CFileTransmit*)pParam)->StartSendFile();
((CFileTransmit*)pParam)->m_pSendFileThread = NULL;
((CFileTransmit*)pParam)->m_byMeAction = MEDONOTHINGABOUTFILE;
return 0;
}
UINT ReceiveFileThreadProc(LPVOID pParam)
{
((CFileTransmit*)pParam)->StartReceiveFile();
((CFileTransmit*)pParam)->m_pReceiveFileThread = NULL;
((CFileTransmit*)pParam)->m_byMeAction = MEDONOTHINGABOUTFILE;
return 0;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFileTransmit::CFileTransmit(DWORD dwUserData, pFileTransmitCallbackFunc pCallbackFunc)
{
m_pCallbackFunc = pCallbackFunc;
m_byMeAction = MEDONOTHINGABOUTFILE;
m_pSendFileThread = NULL;
m_pReceiveFileThread = NULL;
m_lpUserData = dwUserData;
m_DataFromChannel.SetSize(MAXFILERECEIVEPACKETLENGTH, MAXFILERECEIVEPACKETLENGTH);
::InitializeCriticalSection(&CFileTransmit::m_csRawFileDataLock);
}
CFileTransmit::~CFileTransmit()
{
::DeleteCriticalSection(&CFileTransmit::m_csRawFileDataLock);
End();
m_pSendFileThread = NULL;
m_pReceiveFileThread = NULL;
}
int CFileTransmit::ReadRawData(BYTE *pContent, int nLength)
{
int nTemp;
int nArrayLength = 0;
int nReadLength = 0;
::EnterCriticalSection(&CFileTransmit::m_csRawFileDataLock);
nArrayLength = m_DataFromChannel.GetSize();
nReadLength = __min(nArrayLength, nLength);
if(nReadLength)//m_nDataFromChannelLength)//Have new data recevied
{
::CopyMemory(pContent, m_DataFromChannel.GetData(), nReadLength);//m_nDataFromChannelLength);
nTemp = nReadLength;//m_nDataFromChannelLength;
m_DataFromChannel.RemoveAt(0, nReadLength);
//m_nDataFromChannelLength = 0;
}
else
nTemp = 0;
::LeaveCriticalSection(&CFileTransmit::m_csRawFileDataLock);
return nTemp;
}
int CFileTransmit::ReceiveDataFromChannel(BYTE *pContent, int nLength)
{
//Only one thread can access this array and length, so it is thread safe
::EnterCriticalSection(&CFileTransmit::m_csRawFileDataLock);
//ASSERT((m_nDataFromChannelLength + nLength) < MAXFILETRANSMITPACKETLENGTH);
//::CopyMemory(m_DataFromChannel + m_nDataFromChannelLength, pContent, nLength);
//m_nDataFromChannelLength += nLength;
for(int i=0; i<nLength; i++)
m_DataFromChannel.Add(pContent[i]);
::LeaveCriticalSection(&CFileTransmit::m_csRawFileDataLock);
return nLength;
}
void CFileTransmit::StartSendFile()
{
CString strFileName;
CFileDialog* pFileDialog = new CFileDialog(TRUE);
m_byMeAction = MESENDFILE;
pFileDialog->DoModal();
strFileName = pFileDialog->GetPathName();
delete pFileDialog;
//start send file
SendFile(strFileName.GetBuffer(10), NULL);
//end
m_byMeAction = MEDONOTHINGABOUTFILE;
//Go here, this thread end normal, so change button text
ChangeButtonText(IDC_FILETRANSMIT, "文件传输", (LPVOID)m_lpUserData);
//::SetEvent((CVideoCommDlg*)m_lpUserData->m_hFinishFileTransmit);
}
void CFileTransmit::StartReceiveFile()
{
m_byMeAction = MERECEIVEFILE;
//start receive file
ReceiveFile(NULL);
//end
m_byMeAction = MEDONOTHINGABOUTFILE;
}
BYTE CFileTransmit::MeAction()
{
return m_byMeAction;
}
void CFileTransmit::StartSendFileThread()
{
if(m_pSendFileThread == NULL)
{
m_pSendFileThread = ::AfxBeginThread(SendFileThreadProc, this);
m_pSendFileThread->SetThreadPriority(THREAD_PRIORITY_NORMAL);
}
}
void CFileTransmit::StartReceiveFileThread()
{
if(m_pSendFileThread == NULL)
{
m_pReceiveFileThread = ::AfxBeginThread(ReceiveFileThreadProc, this);
m_pReceiveFileThread->SetThreadPriority(THREAD_PRIORITY_NORMAL);
}
}
void CFileTransmit::tx_raw(int c)
{
static int nTxCharCount = 0;
static BYTE pSaveTxChar[MAXFILETRANSMITPACKETLENGTH];
Czmodem::tx_raw(c);
//if( c != XON)//Control char
//{
pSaveTxChar[nTxCharCount] = (BYTE)c;
nTxCharCount ++;
//}
if((nTxCharCount > 0) && ((nTxCharCount >= MAXFILETRANSMITPACKETLENGTH) || (c == XON)))
{
//send this data
(*m_pCallbackFunc)(pSaveTxChar, nTxCharCount, m_lpUserData);
nTxCharCount = 0;
}
}
BOOL CFileTransmit::End()
{
DWORD dwExitCode = 0;
DWORD dwResult = 0;
if(m_pSendFileThread)
{
dwResult = ::GetExitCodeThread(m_pSendFileThread->m_hThread, &dwExitCode);
if(dwResult == STILL_ACTIVE)
::TerminateThread(m_pSendFileThread->m_hThread, 6);
m_pSendFileThread = NULL;
m_byMeAction = MEDONOTHINGABOUTFILE;
}
if(m_pReceiveFileThread)
{
dwResult = ::GetExitCodeThread(m_pReceiveFileThread->m_hThread, &dwExitCode);
if(dwResult == STILL_ACTIVE)
::TerminateThread(m_pReceiveFileThread->m_hThread, 6);
m_pReceiveFileThread = NULL;
m_byMeAction = MEDONOTHINGABOUTFILE;
}
m_DataFromChannel.RemoveAt(0, m_DataFromChannel.GetSize());
return TRUE;
}
DWORD CFileTransmit::GetReceiveFileThreadExitCode()
{
DWORD dwResult;
if(m_pReceiveFileThread)
::GetExitCodeThread(m_pReceiveFileThread->m_hThread, &dwResult);
else
dwResult = 0;
return dwResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -