diff --git a/src/syncterm/term.c b/src/syncterm/term.c index fc3beb27c5c786ef14e75c0cd0194c306f265cd5..255a8952fbdd9e71925cc59caa2799453ec067f7 100644 --- a/src/syncterm/term.c +++ b/src/syncterm/term.c @@ -25,7 +25,6 @@ struct terminal term; static char winbuf[(TRANSFER_WIN_WIDTH + 2) * (TRANSFER_WIN_HEIGHT + 1) * 2]; /* Save buffer for transfer window */ static struct text_info trans_ti; static struct text_info log_ti; -static char curr_trans_fname[MAX_PATH+1]; #if defined(__BORLANDC__) #pragma argsused @@ -179,9 +178,6 @@ void dump(BYTE* buf, int len) /* Zmodem Stuff */ static int log_level = LOG_INFO; -static ulong total_files; -static ulong total_bytes; -static ulong current_file; static void zmodem_check_abort(zmodem_t* zm) { @@ -220,11 +216,17 @@ static int lputs(void* cbdata, int level, const char* str) textbackground(BLUE); switch(level) { case LOG_DEBUG: + textcolor(LIGHTCYAN); + SAFEPRINTF(msg,"%s\r\n",str); + break; case LOG_INFO: - case LOG_NOTICE: textcolor(WHITE); SAFEPRINTF(msg,"%s\r\n",str); break; + case LOG_NOTICE: + textcolor(YELLOW); + SAFEPRINTF(msg,"%s\r\n",str); + break; case LOG_WARNING: textcolor(LIGHTMAGENTA); SAFEPRINTF(msg,"Warning: %s\r\n",str); @@ -254,8 +256,7 @@ static int lprintf(int level, const char *fmt, ...) #if defined(__BORLANDC__) #pragma argsused #endif -void zmodem_progress(void* cbdata, ulong start_pos, ulong current_pos - ,ulong fsize, time_t start) +void zmodem_progress(void* cbdata, ulong start_pos, ulong current_pos) { char orig[128]; unsigned cps; @@ -264,8 +265,9 @@ void zmodem_progress(void* cbdata, ulong start_pos, ulong current_pos time_t now; static time_t last_progress; int old_hold; + zmodem_t* zm=(zmodem_t*)cbdata; - zmodem_check_abort((zmodem_t*)cbdata); + zmodem_check_abort(zm); old_hold = hold_update; hold_update = TRUE; @@ -276,29 +278,30 @@ void zmodem_progress(void* cbdata, ulong start_pos, ulong current_pos gotoxy(1,1); textattr(LIGHTCYAN | (BLUE<<4)); now=time(NULL); - if(now-last_progress>0 || current_pos >= fsize) { - t=now-start; + if(now-last_progress>0 || current_pos >= zm->current_file_size) { + t=now-zm->transfer_start; if(t<=0) t=1; if(start_pos>current_pos) start_pos=0; if((cps=(current_pos-start_pos)/t)==0) cps=1; /* cps so far */ - l=fsize/cps; /* total transfer est time */ + l=zm->current_file_size/cps; /* total transfer est time */ l-=t; /* now, it's est time left */ if(l<0) l=0; cprintf("File (%u of %u): %-.*s" - ,current_file, total_files, TRANSFER_WIN_WIDTH - 20, curr_trans_fname); + ,zm->current_file_num, zm->total_files, TRANSFER_WIN_WIDTH - 20, zm->current_file_name); clreol(); cputs("\r\n"); if(start_pos) sprintf(orig,"From: %lu ", start_pos); else orig[0]=0; - cprintf("%sKByte: %lu/%lu", orig, current_pos/1024, fsize/1024); + cprintf("%sByte: %lu of %lu (%lu KB)" + ,orig, current_pos, zm->current_file_size, zm->current_file_size/1024); clreol(); cputs("\r\n"); - cprintf("Time: %lu:%02lu/%lu:%02lu CPS: %u" + cprintf("Time: %lu:%02lu ETA: %lu:%02lu CPS: %u" ,t/60L ,t%60L ,l/60L @@ -307,8 +310,9 @@ void zmodem_progress(void* cbdata, ulong start_pos, ulong current_pos ); clreol(); cputs("\r\n"); - cprintf("%*s%3d%%\r\n", TRANSFER_WIN_WIDTH/2-2, "", (long)(((float)current_pos/(float)fsize)*100.0)); - l = 60*((float)current_pos/(float)fsize); + cprintf("%*s%3d%%\r\n", TRANSFER_WIN_WIDTH/2-2, "" + ,(long)(((float)current_pos/(float)zm->current_file_size)*100.0)); + l = 60*((float)current_pos/(float)zm->current_file_size); cprintf("[%*.*s%*s]", l, l, "\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1" "\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1" @@ -479,26 +483,10 @@ void erase_recv_window(void) { void zmodem_receive(void) { - char fpath[MAX_PATH+1]; - char* fname; - char str[MAX_PATH*2]; - FILE* fp; - long l; - BOOL skip; - ulong b; - ulong crc; - ulong rcrc; - ulong bytes; - ulong kbytes; - ulong start_bytes; - time_t start_time; - time_t ftime; - time_t t; - unsigned cps; - unsigned timeout; - unsigned errors=0; zmodem_t zm; char* download_dir="."; + int files_received; + ulong bytes_received; bufbot=buftop=0; /* purge our receive buffer */ draw_recv_window(); @@ -508,111 +496,10 @@ void zmodem_receive(void) ,lputs, zmodem_progress ,send_byte,recv_byte,is_connected,data_waiting); -// zm.no_streaming=TRUE; - current_file=1; - while(zmodem_recv_init(&zm - ,fpath,sizeof(fpath) - ,&bytes - ,&ftime - ,NULL - ,NULL - ,&total_files - ,&total_bytes)==ZFILE) { - lprintf(LOG_DEBUG,"fpath=%s",fpath); - fname=getfname(fpath); - SAFECOPY(curr_trans_fname, fpath); - lprintf(LOG_DEBUG,"fname=%s",fname); - kbytes=bytes/1024; - if(kbytes<1) kbytes=0; - lprintf(LOG_INFO,"Downloading %s (%lu KBytes) via Zmodem", fname, kbytes); - - do { /* try */ - skip=TRUE; - //sprintf(fpath,"./%s",fname); - strcpy(fpath,fname); - lprintf(LOG_DEBUG,"fpath=%s",fpath); - if(fexist(fpath)) { - lprintf(LOG_WARNING,"%s already exists",fpath); - l=flength(fpath); - if(l>=(long)bytes) { - lprintf(LOG_WARNING,"Local file size (%lu bytes) >= remote file size (%ld)" - ,l, bytes); - break; - } - if((fp=fopen(fpath,"rb"))==NULL) { - lprintf(LOG_ERR,"Error %d opening %s",errno,fpath); - break; - } - crc=fcrc32(fp,l); - fclose(fp); - if(!zmodem_get_crc(&zm,l,&rcrc)) { - lprintf(LOG_ERR,"Failed to get CRC of remote file: %s", fpath); - break; - } - if(crc!=rcrc) { - lprintf(LOG_WARNING,"Remote file has different CRC value"); - lprintf(LOG_DEBUG,"Remote CRC: %08lx vs Local CRC: %08lx)", rcrc, crc); - break; - } - lprintf(LOG_INFO,"Resuming download of %s",fpath); - } - - if((fp=fopen(fpath,"ab"))==NULL) { - lprintf(LOG_ERR,"Error %d opening/creating/appending %s",errno,fpath); - break; - } - start_bytes=filelength(fileno(fp)); - start_time=time(NULL); - - skip=FALSE; - errors=zmodem_recv_file_data(&zm,fp,flength(fpath),bytes, /* start time */0); + files_received=zmodem_recv_files(&zm,download_dir,&bytes_received); - for(;errors<=zm.max_errors && !zm.cancelled; errors++) { - if(zmodem_recv_header_and_check(&zm)) - break; - } - fclose(fp); - l=flength(fpath); - if(errors && l==0) { /* aborted/failed download */ - if(remove(fpath)) /* don't save 0-byte file */ - lprintf(LOG_ERR,"Error %d removing %s",errno,fpath); - else - lprintf(LOG_INFO,"Deleted 0-byte file %s",fpath); - } - else { - if(l!=(long)bytes) { - lprintf(LOG_WARNING,"Incomplete download (%ld bytes received, expected %lu)" - ,l,bytes); - } else { - if((t=time(NULL)-start_time)<=0) - t=1; - b=l-start_bytes; - if((cps=b/t)==0) - cps=1; - lprintf(LOG_INFO,"Received %lu bytes successfully (%u CPS)",b,cps); - } - if(ftime) - setfdate(fpath,ftime); - } - - } while(0); - /* finally */ - - if(skip) { - lprintf(LOG_WARNING,"Skipping file"); - zmodem_send_zskip(&zm); - } - current_file++; - } - if(zm.local_abort) - zmodem_abort_receive(&zm); - - /* wait for "over-and-out" */ - timeout=zm.recv_timeout; - zm.recv_timeout=2; - if(zmodem_rx(&zm)=='O') - zmodem_rx(&zm); - zm.recv_timeout=timeout; + if(files_received>1) + lprintf(LOG_INFO,"Received %u files (%lu bytes) successfully", files_received, bytes_received); lprintf(LOG_NOTICE,"Hit any key to continue..."); getch();