📄 sftupload.cpp
字号:
char poll_string[9 + 1];
FILE *fp;
char filename[12 + 1];
int serial_number;
int count;
int retry;
int ret;
long len;
long timeout = 0L;
long starttime;
char terminal_id[6 + 1];
char buf[64];
int i;
strcpy(terminal_id, UNKNOWN);
strcpy(MachineID,"");
FileCount=FileNames->Count;
TotalFileSize=0;
for( i=0;i<FileCount;i++ )
{
len=fsize( FileNames->Strings[i] );
if( i<0 )
{
strcpy( ErrorString,"打开文件错误" );
ErrorNo=-2;
return;
};
TotalFileSize+=len;
};
strcpy(CurrentFileName,"");
CurrentFileSize=0;
UploadedLen=0;
TotalUploadedLen=0;
Synchronize(ShowProgress);
reconnect:
ret=ComReadString( buf,2000 );
if( ret==-1 )
{
goto reconnect;
};
if( ret==-3 )
{
strcpy( ErrorString,"用户中断" );
ErrorNo=-3;
return;
};
if( ret==0 )
{
if( memcmp(buf,"AA",2)!=0 )
{
goto reconnect;
};
strcpy( MachineID,&buf[2] );
};
ComWriteString("BB",1000);
poll_string[0] = 'P';
strcpy(poll_string + 1, terminal_id);
poll_string[7] = DLE;
poll_string[8] = ENQ;
poll_string[9] = '\0';
starttime = time(NULL);
for (;;)
{
Com->WriteStr(poll_string,strlen(poll_string),-1);
if ((ret = receive_block(SFT_rx_buf, 500)) == ERR_USER_BREAK)
{
transmit_eot();
strcpy( ErrorString,"用户中断" );
ErrorNo=-3;
return;
};
if (ret > 0) break; // Valid string received
if (timeout)
{
if ((time(NULL) - starttime) > timeout)
{
strcpy(ErrorString,"传输超时");
ErrorNo=-4;
return;
};
};
};
if (SFT_rx_buf[1] != RECV_FILE_REQ)
{
transmit_eot();
strcpy(ErrorString,"传输错误");
ErrorNo=-5;
return;
};
serial_number = 0x20;
transmit_ack();
len = 0;
SFT_tx_buf[len++] = (unsigned char)serial_number;
SFT_tx_buf[len++] = TRANSM_REQ;
strcpy((char *)SFT_tx_buf + len, terminal_id);
len += 6;
SFT_tx_buf[len++] = PRIORITY;
SFT_tx_buf[len++] = 0x1; // other files
int_to_asc(SFT_tx_buf + len, FileCount );
len += 2;
long_to_asc(SFT_tx_buf + len, TotalFileSize);
len += 4;
if (transmit_block(SFT_tx_buf,len) == ERR_USER_BREAK)
{
transmit_eot();
strcpy( ErrorString,"用户中断" );
ErrorNo=-3;
return;
};
retry = 0;
for (;;)
{
if ((ret = receive_block(SFT_rx_buf,TIMEOUT)) > 0)break;
switch (ret)
{
case ERR_BCC_FAIL:
case ERR_TIME_OUT: transmit_nak();
retry++;
break;
case ERR_HOST_LOST:
case ERR_NAK_RECV:
if (transmit_block(SFT_tx_buf,len) == ERR_USER_BREAK)
{
transmit_eot();
strcpy( ErrorString,"用户中断" );
ErrorNo=-3;
return;
};
retry++;
break;
case ERR_USER_BREAK: transmit_eot();
strcpy( ErrorString,"用户中断" );
ErrorNo=-3;
return;
case ERR_EOT_HOST: strcpy( ErrorString,"传输错误" );
ErrorNo=-5;
return;
};
if (retry >= RETRIES)
{
strcpy( ErrorString,"传输错误" );
ErrorNo=-5;
return;
};
};
for( i=0;i<FileCount;i++ )
{
if (++serial_number > 0xFF) serial_number = 0x20;
strcpy( CurrentFileName,FileNames->Strings[i].c_str() );
if ((fp = fopen(CurrentFileName, "rb")) == NULL)
{
transmit_eot();
strcpy( ErrorString,"打开文件错误" );
ErrorNo=-2;
return;
};
fseek(fp, 0L, SEEK_END); // calculate filesize
CurrentFileSize = ftell(fp);
fseek(fp, 0L, SEEK_SET);
len = 0;
SFT_tx_buf[len++] = (unsigned char) serial_number;
SFT_tx_buf[len++] = FILE_INFO;
strcpy( filename,ExtractFileName(FileNames->Strings[i]).c_str() );
filename[12]=0;
conv_filename((char *)SFT_tx_buf + len, filename);
len += 11;
long_to_asc(SFT_tx_buf + len, CurrentFileSize);
len += 4;
if (transmit_block(SFT_tx_buf,len) == ERR_USER_BREAK)
{
transmit_eot();
strcpy( ErrorString,"用户中断" );
ErrorNo=-3;
return;
};
retry = 0;
for (;;)
{
if ((ret = receive_block(SFT_rx_buf,TIMEOUT)) > 0) break;
switch (ret)
{
case ERR_BCC_FAIL:
case ERR_TIME_OUT: transmit_nak();
retry++;
break;
case ERR_HOST_LOST:
case ERR_NAK_RECV:
if (transmit_block(SFT_tx_buf,len) == ERR_USER_BREAK)
{
fclose(fp);
transmit_eot();
strcpy( ErrorString,"用户中断" );
ErrorNo=-3;
return;
};
retry++;
break;
case ERR_USER_BREAK: fclose(fp);
transmit_eot();
strcpy( ErrorString,"用户中断" );
ErrorNo=-3;
return;
case ERR_EOT_HOST: fclose(fp);
strcpy( ErrorString,"传输错误" );
ErrorNo=-5;
return;
};
if (retry >= RETRIES)
{
fclose(fp);
strcpy( ErrorString,"传输错误" );
ErrorNo=-5;
return;
};
};
UploadedLen = 0L;
while (UploadedLen < CurrentFileSize )
{
Synchronize(ShowProgress);
if (++serial_number > 0xFF)serial_number = 0x20;
len = 0;
SFT_tx_buf[len++] = (unsigned char) serial_number;
SFT_tx_buf[len++] = TRANSM_DATA;
if (CurrentFileSize - UploadedLen > 2048L)
{
SFT_tx_buf[len++] = NOT_LAST_BLOCK;
count = 2048;
}
else
{
SFT_tx_buf[len++] = LAST_BLOCK;
count = (int) (CurrentFileSize - UploadedLen);
};
if (fread(SFT_tx_buf + len, 1, count, fp) < (unsigned long)count)
{
fclose(fp);
strcpy( ErrorString,"读取文件错误" );
ErrorNo=-6;
return;
};
len += count;
if (transmit_block(SFT_tx_buf,len) == ERR_USER_BREAK)
{
fclose(fp);
transmit_eot();
strcpy( ErrorString,"用户中断" );
ErrorNo=-3;
return;
};
retry = 0;
for (;;)
{
if ((ret = receive_block(SFT_rx_buf,TIMEOUT)) > 0) break;
switch (ret)
{
case ERR_BCC_FAIL:
case ERR_TIME_OUT: transmit_nak();
retry++;
break;
case ERR_HOST_LOST:
case ERR_NAK_RECV:
if(transmit_block(SFT_tx_buf,len) == ERR_USER_BREAK)
{
fclose(fp);
transmit_eot();
strcpy( ErrorString,"用户中断" );
ErrorNo=-3;
return;
};
retry++;
break;
case ERR_USER_BREAK: fclose(fp);
transmit_eot();
strcpy( ErrorString,"用户中断" );
ErrorNo=-3;
return;
case ERR_EOT_HOST: fclose(fp);
strcpy( ErrorString,"传输错误" );
ErrorNo=-5;
return;
};
if (retry >= RETRIES)
{
fclose(fp);
strcpy( ErrorString,"传输错误" );
ErrorNo=-5;
return;
};
};
UploadedLen += count;
TotalUploadedLen+=count;
}
UploadedLen=CurrentFileSize;
Synchronize(ShowProgress);
fclose(fp);
};
transmit_eot();
ErrorNo=0;
strcpy(ErrorString,"上载成功");
TotalUploadedLen=TotalFileSize;
Synchronize(ShowProgress);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -