//-----------------------------------------------------------------------------
// project: ZModem
// author: Frank Weiler, Genshagen, Germany
// version: 0.91
// date: October 10, 2000
// email: frank@weilersplace.de
// copyright: This Software is OpenSource.
// file: ZModemCore.cpp
// description: A class that implements a basic ZModem protocol.
// Not all possible features are supported, especially
// no support for buffersizes greater than 1024.
// Sending data is done with 1024 buffersize,
// receiving is event-driven using overlapped I/O.
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "ZModemCore.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//-----------------------------------------------------------------------------
// purpose: construction
// params: howner -> handle of the Owner Window
// hcomm -> handle of the modem ressource, got from TAPI
// hcancelevent -> handle of an event signaling user-break
CZModemCore::CZModemCore(HWND howner,HANDLE hcomm,HANDLE hcancelevent)
//-----------------------------------------------------------------------------
{
m_hOwner = howner;
m_hcomm = hcomm;
m_hCancelEvent = hcancelevent;
m_ZModemComm = new CZModemComm(m_hcomm,m_hCancelEvent);
m_ZModemFile = new CZModemFile(howner);
maxTx = ZMCORE_MAXTX;
}
//-----------------------------------------------------------------------------
// purpose: destruction
CZModemCore::~CZModemCore()
//-----------------------------------------------------------------------------
{
delete m_ZModemComm;
delete m_ZModemFile;
}
//-----------------------------------------------------------------------------
// purpose: sending files
// params: filelist -> Array of filenames (full path) to send
// returns: success
bool CZModemCore::Send(CStringArray* filelist)
//-----------------------------------------------------------------------------
{ //
bool fin=false,quit=false,ok=true;
int tries=0;
//
this->ResetAll();
if(filelist == NULL)
return false;
if(filelist->GetSize() == 0)
return false;
m_Filelist = filelist;
bufTop = mainBuf + (sizeof mainBuf);
m_ZModemComm->ClearInbound();//clear all pending data from modem
sendrz();//send initialization string
while(ALLOK && !fin && (tries < 100))
{
quit=false;
sendZRQINIT();//send ZRQINIT
getZMHeader();
if(ALLOK)
{
switch(headerType)
{
case ZCAN://canceled from other side
{
TRACE("set error %s\n","ZMODEM_GOTZCAN");
SetLastError(ZMODEM_GOTZCAN);
::PostMessage(m_hOwner,WM_USER_ZMODEMERROR,(WPARAM)ZMODEM_GOTZCAN,0L);
quit=true;
fin=true;
break;
}
case ZRINIT:// ok, let's communicate
{
TRACE("ZRINIT erhalten");
//validate CRC-32-property and CANFX-property
static int Rxflags = 0377 & headerData[3];
bcrc32 = (Rxflags & CANFC32) != 0;
bcanfdx = Rxflags & CANFDX;
TRACE("bcanfdx ist %s\n",bcanfdx ? "true" : "false");
TRACE("bcrc32 ist %s\n",bcrc32 ? "true" : "false");
// start sending all files
ok=sendFiles();
fin=true;
break;
}
case ZCHALLENGE:
{
TRACE("got ZCHALLENGE");
sendZACK();
break;
}
default:
{
TRACE("got unexpected header");
tries++;
break;
}
}//switch
}//if(ALLOK)
else
{
DWORD err=GetLastError();
if((err==ZMODEM_TIMEOUT) || (err==ZMODEM_CRCXM) ||
(err==ZMODEM_CRC32) || (err==ZMODEM_BADHEX))
{
::PostMessage(m_hOwner,WM_USER_ZMODEMERROR,(WPARAM)err,0L);
if(tries < 100)
{
SetLastError(0);
tries++;
}
}
}
}//while(...)
// sendig is over, finish session
if(ALLOK)
{
quit=false;
tries=0;
sendZFIN();
while(ALLOK && !quit)
{
getZMHeader();
if(ALLOK && (headerType == ZFIN))
quit=true;//other side has finish accepted
else
{
if(tries < 100)
{
SetLastError(0);
sendZFIN();
tries++;
}
}
}
if(ALLOK)
sendOO();//over and out
}
return(quit && fin && ok);
}
//-----------------------------------------------------------------------------
// purpose: receiving files
// params: filelist -> Array of filenames received
// receivedir -> folder to save the received files
// returns: success
bool CZModemCore::Receive(CStringArray* filelist,CString receivedir)
//-----------------------------------------------------------------------------
{ //
bool fin,quit;
int tries;
//
this->ResetAll();
if(filelist == NULL)
return false;
if(filelist->GetSize() == 0)
return false;
m_Filelist = filelist;
if(!receivedir.IsEmpty())
m_ZModemFile->SetReceivingDir(receivedir);
bufTop = mainBuf + (sizeof mainBuf);
m_ZModemComm->ClearInbound();
skip = false;
fin = false;
while(ALLOK && !fin)
{
sendZRINIT();
quit = false;
tries = 0;
while(ALLOK && !quit)
{
getZMHeader();
if(ALLOK)
{
if(headerType == ZFIN)//other side has finish signaled
{
sendZFIN();//reply
getOO();//try to get over and out signal
quit = true;
fin = true;
}
else if(headerType == ZRQINIT)
{
if(tries < 100)
{
sendZRINIT();
tries++;
}
else
{
TRACE("set error %s\n","ZMODEM_INIT");
SetLastError(ZMODEM_INIT);
}
}
else if(headerType == ZFILE)//file transfer signaled
{
skip = false;
getFILEINFO();//extract the FILEINFO from data block
if(ALLOK)
{
receiveFile();//receive current file
if(ALLOK)
m_Filelist->Add(m_ZModemFile->GetReceivedFileName());
quit = true;
}
else if(GetLastError()==ZMODEM_CRC32)
{
::PostMessage(m_hOwner,WM_USER_ZMODEMERROR,(WPARAM)ZMODEM_CRC32,0L);
if(tries < 100)
{
SetLastError(0);
sendZRINIT();
tries++;
}
}
}
}
else
{
DWORD err=GetLastError();
if((err==ZMODEM_TIMEOUT) || (err==ZMODEM_CRCXM) ||
(err==ZMODEM_CRC32) || (err==ZMODEM_BADHEX))
{
::PostMessage(m_hOwner,WM_USER_ZMODEMERROR,(WPARAM)err,0L);
if(tries < 100)
{
SetLastError(0);
sendZRINIT();
tries++;
}
}
}
}
}
Sleep(4000);//wait 4 seconds tu ensure that the other side really get our ZEOF
return(ALLOK);
}
// Layer 3 ####################################################################
//-----------------------------------------------------------------------------
void CZModemCore::ResetAll()
//-----------------------------------------------------------------------------
{
ch = 0;
gotSpecial =0;
m_bWait = true;
gotHeader =0;
frameType =0;
headerType =0;
memset(headerData,0,4);
moreData=0;
memset(mainBuf,0,sizeof mainBuf);
bufPos = NULL;
bufTop = NULL;
goodOffset=0;
bytes=0;
bcrc32=false,bcanfdx=false;
skip=false;
m_ZModemFile->ResetAll();
m_ZModemComm->ResetAll();
}
//-----------------------------------------------------------------------------
bool CZModemCore::sendFiles()
//-----------------------------------------------------------------------------
{ //
bool gotfile;
int count = 0;
int tries;
bool sent;
bool rw=true;
DWORD offset;
int i=0;
bool fileinfosent=false;
//
int nSize=m_Filelist->GetSize();
while(ALLOK && ( i < nSize))
{
gotfile = m_ZModemFile->Open(m_Filelist->GetAt(i),OPEN_EXISTING);
if(gotfile)
TRACE("SendFiles filename %s",m_Filelist->GetAt(i));
else
break;
goodOffset = 0;
tries = 0;
sent = false;
while(ALLOK && (tries < 10) && !sent)
{
if(!fileinfosent)
{
sendZFILE();
sendFILEINFO();
fileinfosent=true;
}
getZMHeader();
if(A
没有合适的资源?快使用搜索试试~ 我知道了~
zmodemclass的经典源码,原来旧的代码,有很多问题,比如文件名读取错误等,都已经被我修复。
共30个文件
h:10个
cpp:5个
plg:1个
4星 · 超过85%的资源 需积分: 17 46 下载量 96 浏览量
2008-08-30
12:34:47
上传
评论 2
收藏 45KB ZIP 举报
温馨提示
zmodemclass的经典源码,原来旧的代码,有很多问题,比如文件名读取错误等,都已经被我修复。
资源推荐
资源详情
资源评论
收起资源包目录
zmodemclass.zip (30个子文件)
ZModem.ncb 57KB
StdAfx.cpp 210B
ZModem.dsp 5KB
ZModemComm.h 2KB
CRC32.H 8KB
ZModem.bpr 4KB
ZModem.plg 246B
ZModem.~bp 3KB
ZModem.cpp 2KB
ZModem.rc 3KB
ZModem.bpg 817B
ZModem.h 1KB
ZModem.aps 18KB
StdAfx.h 2KB
ZModemFile.cpp 8KB
vctobpr.log 590B
ZModemCore.h 5KB
Resource.h 400B
ZModem.opt 56KB
ZModem.bpf 215B
CRCXM.H 6KB
zmodemexpimp.h 216B
ZModem.~bpr 3KB
res
ZModem.rc2 422B
ZModemCore.cpp 36KB
ZModem.dsw 535B
www.pudn.com.txt 218B
ZModemFile.h 1KB
ZModemComm.cpp 7KB
zmodemdef.h 2KB
共 30 条
- 1
资源评论
- xiebinbnm2015-08-07生成DLL 没有例子 不好操作
- weixin_376683862018-09-18在verysource上可以免费下载,用代码比较工具比较了下,完全相同。缺的是例子,还没玩转。
- hwxjx2018-05-11C源码,要是pyhon源码就更赞了。
liangwu2046
- 粉丝: 7
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功