📄 _sft.cpp
字号:
// *********************************************
void SFT_MakeFileName(char *buf,char *filename)
{
char *p,*p1;
strncpy( buf,filename,32 );
strupr( buf );
if( (p=strrchr(buf,'.'))==NULL )return;
for( p1=p-1;p1>=buf;p1-- )
{
if( *p1 != ' ' )break;
}
strcpy( p1+1,p );
}
void SFT_MakeFileInfo(char *buf,int numfiles,char *filenames[])
{
int i;
buf[0]=0;
for( i=0;i<numfiles;i++ )
{
SFT_MakeFileName(buf+strlen(buf),filenames[i]);
strcat(buf,";");
}
}
int SFT_CheckFileInfo(char *buf,int numfiles,char *filenames[])
{
int i;
char filename[128];
if( numfiles==-1 )return 0;
for( i=0;i<numfiles;i++ )
{
SFT_MakeFileName(filename,filenames[i]);
if( strstr(buf,filename)==NULL )return -1;
}
return 0;
}
// **********************************************
long SFT_GetFileTotalSize(int numfiles,char *filenames[])
{
int i;
long totalsize;
FILE *fp;
totalsize=0;
for( i=0;i<numfiles;i++ )
{
fp = fopen( filenames[i],"rb" );
if( fp==NULL )return -1;
fseek( fp,0,SEEK_END );
totalsize+=ftell(fp);
fclose(fp);
}
return totalsize;
}
long SFT_GetFileSize(char *filename)
{
long size;
FILE *fp;
fp = fopen( filename,"rb" );
if( fp==NULL )return -1;
fseek( fp,0,SEEK_END );
size = ftell(fp);
fclose(fp);
return size;
}
long SFT_GetFileData(char *filename,char *buf,long pos,long len)
{
long r;
r=0;
/* FILE *fp;
fp = fopen( filename,"rb" );
if( fp==NULL )return -1;
fseek(fp,pos,SEEK_SET);
r = fread(buf,1,len,fp);
fclose(fp);
*/ return r;
}
long SFT_ClearFile(char *filename)
{
/* FILE *fp;
remove(filename);
fp = fopen( filename,"w+b" );
if( fp==NULL )return -1;
fclose(fp);
*/ return 0;
}
long SFT_WriteFileData(char *filename,char *buf,long pos,long len)
{
/* long r;
FILE *fp;
fp = fopen( filename,"r+b" );
if( fp==NULL )return -1;
if( fseek(fp,pos,SEEK_SET)!=0 ){ fclose(fp);return -1; };
r = fwrite(buf,1,len,fp);
fclose(fp);
if( r!=len )return -1;
*/
return 0;
}
// **********************************************
int SFT_SendFiles(char *machinename,int numfiles,char *filenames[])
{
U16 serial=0;
int result=SFT_ERROR;
int filecount;
long totalsize=0,totalprogress=0;
char currentfile[64]="";
long currentfilesize=0;
long currentprogress=0;
int i;
char *shortfilenames[128];
FILE *fp;
// port=1;
// SFT_SerialOpen();
fp=NULL;
for( i=0;i<numfiles;i++ )shortfilenames[i]=UploadShortFileNames[i];
filecount = numfiles;
totalsize = SFT_GetFileTotalSize(numfiles,filenames);
if( totalsize==-1 ){ result = SFT_SENDFILEERROR; goto end; };
SFT_SendProgress(filecount,totalsize,totalprogress,currentfile,currentfilesize,currentprogress);
// Send TRANSMIT_REQ
if( (result=SFT_SendPackage(serial++,TRANSMIT_REQ,machinename,strlen(machinename)+1))!=SFT_OK)goto end;
// TRANSMIT_FILE_INFO
*((short int *)SFT_BUF)=numfiles;
*((long *)(SFT_BUF+2))= totalsize;
SFT_MakeFileInfo( &SFT_BUF[6],numfiles,shortfilenames );
if( (result=SFT_SendPackage(serial++,TRANSMIT_FILENAMES,SFT_BUF,6+strlen(SFT_BUF+6)+1))!=SFT_OK)goto end;
// Transmit Files
for( i=0;i<filecount;i++ )
{
long len;
SFT_MakeFileName(currentfile,filenames[i]);
currentprogress=0;
currentfilesize = SFT_GetFileSize(currentfile);
if( currentfilesize==-1 ){ result = SFT_SENDFILEERROR; goto end; };
// Transmit File Info
*((long *)SFT_BUF)=currentfilesize;
strcpy( &SFT_BUF[4],shortfilenames[i] );//currentfile );
// show progress
SFT_SendProgress(filecount,totalsize,totalprogress,currentfile,currentfilesize,currentprogress);
if( (result=SFT_SendPackage(serial++,TRANSMIT_FILEINFO,SFT_BUF,4+strlen(SFT_BUF+4)+1))!=SFT_OK )goto end;
fp = fopen( filenames[i],"rb" );
while(1)
{
// Send File Data
len = currentfilesize-currentprogress;
if( len>PACKAGE_MAX )len=PACKAGE_MAX;
if( fread(SFT_BUF,1,len,fp)!=(unsigned)len )
{ result = SFT_SENDFILEERROR; goto end; };
// if( SFT_GetFileData(currentfile,SFT_BUF,currentprogress,len)!=len )
if( currentprogress+len<currentfilesize )
result=SFT_SendPackage(serial++,TRANSMIT_FILEDATA,SFT_BUF,len);
else
result=SFT_SendPackage(serial++,TRANSMIT_FILEEOF,SFT_BUF,len);
if( result!=SFT_OK )goto end;
currentprogress+=len;
totalprogress+=len;
// show progress
SFT_SendProgress(filecount,totalsize,totalprogress,currentfile,currentfilesize,currentprogress);
if( currentprogress >=currentfilesize ){ fclose(fp);fp=NULL;break; };
}
}
end:
if( fp!=NULL )fclose(fp);
switch( result )
{
case SFT_USERBREAK :SFT_SendPackage(serial,TRANSMIT_USERBREAK,NULL,0);
SFT_Delay(100); SFT_SerialClose(); SFT_SendUserBreak();break;
case SFT_ERROR :SFT_SendPackage(serial,TRANSMIT_ERROR,NULL,0);
SFT_Delay(100); SFT_SerialClose(); SFT_SendError();break;
case SFT_MACHINEDISMATCH :SFT_Delay(100);SFT_SerialClose();SFT_SendMachineDismatch();break;
case SFT_FILEDISMATCH :SFT_Delay(100);SFT_SerialClose();SFT_SendFileDismatch();break;
case SFT_SENDFILEERROR :SFT_SendPackage(serial,TRANSMIT_ERROR,NULL,0);
SFT_Delay(100);SFT_SerialClose();SFT_SendOpenFileError();break;
default :SFT_Delay(100);SFT_SerialClose();
}
SendResult = result;
return result;
}
int SFT_ReceiveFiles(char *machinename,int numfiles,char *filenames[])
{
U16 serial=0;
int result=SFT_ERROR;
unsigned char packagetype;
U16 datalen;
short int filecount;
long totalsize=0,totalprogress=0;
char currentfile[64]="";
long currentfilesize=0;
long currentprogress=0;
int i;
FILE *fp;
// port=2;
// SFT_SerialOpen();
// SFT_SerialWrite('a');
// SFT_SerialWriteUpdate();
fp=NULL;
// Wait TRANSMIT_REQ
if( (result=SFT_WaitPackage(serial++,&packagetype,SFT_BUF,&datalen))!=SFT_OK )goto end;
if( packagetype!=TRANSMIT_REQ ){ result=SFT_ERROR; goto end; };
if( machinename[0]!=0 )
if( strcmp(machinename,SFT_BUF)!=0 ){ result=SFT_MACHINEDISMATCH; goto end; };
strcpy(MachineName,SFT_BUF);
SFT_SerialWrite(SFT_OK);
SFT_SerialWriteUpdate();
// Wait TRANSMIT_FILEINFO
if( (result=SFT_WaitPackage(serial++,&packagetype,SFT_BUF,&datalen))!=SFT_OK )goto end;
if( packagetype!=TRANSMIT_FILENAMES ){ result=SFT_ERROR; goto end; };
filecount=*((short int *)SFT_BUF);
totalsize=*((long *)(SFT_BUF+2));
if( filecount!=numfiles && numfiles!=-1 ){ result=SFT_FILEDISMATCH; goto end; };
if( SFT_CheckFileInfo(SFT_BUF+6,numfiles,filenames)!=0 ){ result=SFT_FILEDISMATCH; goto end; };
SFT_SerialWrite(SFT_OK);
SFT_SerialWriteUpdate();
SFT_ReceiveProgress(filecount,totalsize,totalprogress,currentfile,currentfilesize,currentprogress);
// Receive Files
for( i=0;i<filecount;i++ )
{
long len;
currentprogress=0;
// Transmit File Info
if( (result=SFT_WaitPackage(serial++,&packagetype,SFT_BUF,&datalen))!=SFT_OK )goto end;
if( packagetype!=TRANSMIT_FILEINFO ){ result=SFT_ERROR; goto end; };
currentfilesize = *((long *)SFT_BUF);
strcpy( currentfile,SFT_BUF+4 );
SFT_SerialWrite(SFT_OK);
SFT_SerialWriteUpdate();
strcpy( CurrentFileSaveAs,DownloadPath );
if( CurrentFileSaveAs[strlen(CurrentFileSaveAs)-1]!='\\' )strcat(CurrentFileSaveAs,"\\");
strcat( CurrentFileSaveAs,currentfile );
// show progress
SFT_SendProgress(filecount,totalsize,totalprogress,currentfile,currentfilesize,currentprogress);
fp=fopen( CurrentFileSaveAs,"w+b" );
if( fp==NULL ){ result = SFT_RECEIVEFILEERROR;goto end; };
// if( SFT_ClearFile(currentfile)!=SFT_OK ){ result = SFT_RECEIVEFILEERROR;goto end; };
// Receive File Data
while(1)
{
if( (result=SFT_WaitPackage(serial++,&packagetype,SFT_BUF,&datalen))!=SFT_OK )goto end;
if( packagetype==TRANSMIT_FILEDATA||packagetype==TRANSMIT_FILEEOF )
{
// if( SFT_WriteFileData(currentfile,SFT_BUF,currentprogress,datalen)!=SFT_OK )
if( fwrite(SFT_BUF,1,datalen,fp)!=(unsigned)datalen )
{ result = SFT_RECEIVEFILEERROR;goto end; };
SFT_SerialWrite(SFT_OK);
SFT_SerialWriteUpdate();
currentprogress +=datalen;
totalprogress +=datalen;
// show progress
SFT_SendProgress(filecount,totalsize,totalprogress,currentfile,currentfilesize,currentprogress);
}
else
{
fclose(fp);fp=NULL;
if( packagetype==TRANSMIT_USERBREAK ){ result=SFT_USERBREAK; }
else result = SFT_ERROR;
goto end;
}
if( packagetype==TRANSMIT_FILEEOF ){ fclose(fp);fp=NULL; break; };
}
}
end:
if( fp!=NULL )fclose(fp);
switch( result )
{
case SFT_USERBREAK :SFT_SerialWrite(SFT_USERBREAK);SFT_SerialWriteUpdate();
SFT_Delay(100); SFT_SerialClose(); SFT_ReceiveUserBreak(); break;
case SFT_ERROR :SFT_SerialWrite(SFT_ERROR);SFT_SerialWriteUpdate();
SFT_Delay(100); SFT_SerialClose(); SFT_ReceiveError(); break;
case SFT_MACHINEDISMATCH:SFT_SerialWrite(SFT_MACHINEDISMATCH);SFT_SerialWriteUpdate();
SFT_Delay(100); SFT_SerialClose(); SFT_ReceiveMachineDismatch(); break;
case SFT_FILEDISMATCH:SFT_SerialWrite(SFT_FILEDISMATCH);SFT_SerialWriteUpdate();
SFT_Delay(100); SFT_SerialClose(); SFT_ReceiveFileDismatch(); break;
case SFT_RECEIVEFILEERROR:SFT_SerialWrite(SFT_ERROR);SFT_SerialWriteUpdate();
SFT_Delay(100); SFT_SerialClose(); SFT_ReceiveCreateFileError(); break;
default :SFT_Delay(100); SFT_SerialClose();
}
ReceiveResult = result;
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -