home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MYWIVE.ZIP / SRSEND.C < prev    next >
C/C++ Source or Header  |  1993-05-06  |  6KB  |  287 lines

  1. #include "vars.h"
  2. #pragma hdrstop
  3. #include <math.h>
  4.  
  5. void send_block(char *b, int type, int ucrc, char bn)
  6. {
  7.   int maxb,i;
  8.   char ch;
  9.  
  10.   checkhangup();
  11.   switch(type) {
  12.     case 5:
  13.       maxb=128;
  14.       outcomch(1);
  15.       break;
  16.     case 4:
  17.       outcomch(0x81);
  18.       outcomch(bn);
  19.       outcomch(bn ^ 0xff);
  20.       break;
  21.     case 3:
  22.       outcomch(24);
  23.       break;
  24.     case 2:
  25.       outcomch(4);
  26.       break;
  27.     case 1:
  28.       maxb=1024;
  29.       outcomch(2);
  30.       break;
  31.     case 0:
  32.       maxb=128;
  33.       outcomch(1);
  34.   }
  35.   if ((type>1) && (type<5))
  36.     return;
  37.   outcomch(bn);
  38.   outcomch(bn ^ 0xff);
  39.   crc=0;
  40.   checksum=0;
  41.   for (i=0; i<maxb; i++) {
  42.     ch=b[i];
  43.     outcomch(ch);
  44.     calc_CRC(ch);
  45.   }
  46.   if (ucrc) {
  47.      outcomch(crc >> 8);
  48.      outcomch(crc & 0x00ff);
  49.   } else {
  50.     outcomch(checksum);
  51.   }
  52.   dump();
  53. }
  54.  
  55. char send_b(int f, long pos, int type, char bn, int *ucrc, char *fn, int *terr, int *abort)
  56. {
  57.   char b[1025],ch,x[20],x1[20];
  58.   int i,i1,nb,done,nerr;
  59.   struct ftime ff;
  60.   struct date d;
  61.   struct time t;
  62.  
  63.   nb=0;
  64.   if (type==0)
  65.     nb=128;
  66.   if (type==1)
  67.     nb=1024;
  68.   if (nb) {
  69.     lseek(f,pos,SEEK_SET);
  70.     i=read(f,(void *)b,nb);
  71.     for (i1=i; i1<nb; i1++)
  72.       b[i1]=0;
  73.   } else
  74.     if (type==5) {
  75.       for (i1=0; i1<128; i1++)
  76.         b[i1]=0;
  77.       nb=128;
  78.       strcpy(b,stripfn(fn));
  79.       ltoa(pos,x,10);
  80.       strcat(x," ");
  81.       getftime(f,&ff);
  82.       t.ti_min=ff.ft_min;
  83.       t.ti_hour=ff.ft_hour;
  84.       t.ti_hund=0;
  85.       t.ti_sec=ff.ft_tsec*2;
  86.       d.da_year=1980+ff.ft_year;
  87.       d.da_day=ff.ft_day;
  88.       d.da_mon=ff.ft_month;
  89.       ltoa(dostounix(&d,&t)-timezone,x1,8);
  90.       strcat(x,x1);
  91.       strcpy(&(b[strlen(b)+1]),x);
  92.       b[127]=(unsigned char) (((int) (pos+127)/128) >> 8);
  93.       b[126]=(unsigned char) (((int) (pos+127)/128) & 0x00ff);
  94.     }
  95.   done=0;
  96.   nerr=0;
  97.   do {
  98.     send_block(b,type,*ucrc,bn);
  99.     ch=gettimeout(5.0,abort);
  100.     if ((ch=='C') && (pos==0))
  101.       *ucrc=1;
  102.     if ((ch==6) || (ch==24))
  103.       done=1;
  104.     else {
  105.       ++nerr;
  106.       ++(*terr);
  107.       if (nerr>=9)
  108.         done=1;
  109.       itoa(nerr,x,10);
  110.       movecsr(69,4);
  111.       outs(x);
  112.       itoa(*terr,x,10);
  113.       movecsr(69,5);
  114.       outs(x);
  115.     }
  116.   } while ((!done) && (!hangup) && (!*abort));
  117.   if (ch==6)
  118.     return(6);
  119.   if (ch==24)
  120.     return(24);
  121.   return(21);
  122. }
  123.  
  124. int okstart(int *ucrc, int *abort)
  125. {
  126.   char ch;
  127.   double d;
  128.   int ok,done;
  129.  
  130.   d=timer();
  131.   ok=0;
  132.   done=0;
  133.   while ((fabs(timer()-d)<90.0) && (!done) && (!hangup) && (!*abort)) {
  134.     ch=gettimeout(91.0-d,abort);
  135.     if (ch=='C') {
  136.       *ucrc=1;
  137.       ok=1;
  138.       done=1;
  139.     }
  140.     if (ch==21) {
  141.       *ucrc=0;
  142.       ok=1;
  143.       done=1;
  144.     }
  145.     if (ch==24) {
  146.       ok=0;
  147.       done=1;
  148.     }
  149.   }
  150.   return(ok);
  151. }
  152.  
  153. void xymodem_send(char *fn, int *sent, double *percent, char ft, int ucrc, int ym, int ymb)
  154. {
  155.   char bn,ch,s[81],s1[10];
  156.   int f,i,i1,abort,terr,xx1,yy1;
  157.   long cp,len;
  158.   double tpb;
  159.  
  160.   cp=0L;
  161.   bn=1;
  162.   abort=0;
  163.   terr=0;
  164.   f=open(fn,O_RDONLY | O_BINARY);
  165.   if (f<0) {
  166.     if (!ymb) {
  167.       nl();
  168.       pl("File not found.");
  169.       nl();
  170.     }
  171.     *sent=0;
  172.     *percent=0.0;
  173.     return;
  174.   }
  175.   len=filelength(f);
  176.   if (!len)
  177.     len=1;
  178.   tpb=(12.656) / ((double) (modem_speed));
  179.   if (!ymb) {
  180.     nl();
  181.     pl("> Beginning file transmission, ^X to abort.");
  182.   }
  183.   xx1=wherex();
  184.   yy1=wherey();
  185.   movecsr(52,0);
  186.   outs("│ Filename :               ");
  187.   movecsr(52,1);
  188.   outs("│ Xfer Time:               ");
  189.   movecsr(52,2);
  190.   outs("│ File Size:               ");
  191.   movecsr(52,3);
  192.   outs("│ Cur Block: 1 - 1k        ");
  193.   movecsr(52,4);
  194.   outs("│ Consec Errors: 0         ");
  195.   movecsr(52,5);
  196.   outs("│ Total Errors : 0         ");
  197.   movecsr(52,6);
  198.   outs("└──────────────────────────");
  199.   movecsr(65,0);
  200.   outs(stripfn(fn));
  201.   sprintf(s,"%ld - %ldk",
  202.     (len+127)/128,
  203.     (len+1023)/1024);
  204.   movecsr(65,2);
  205.   outs(s);
  206.   if (!okstart(&ucrc,&abort))
  207.     abort=1;
  208.   if ((ft) && (!abort) && (!hangup)) {
  209.     ch=send_b(f, len, 4, ft, &ucrc,fn,&terr,&abort);
  210.     if (ch==24)
  211.       abort=1;
  212.     if (ch==21) {
  213.       send_b(f,0L,3,0,&ucrc,fn,&terr,&abort);
  214.       abort=1;
  215.     }
  216.   }
  217.   if ((ym) && (!abort) && (!hangup)) {
  218.     ch=send_b(f, len, 5, 0, &ucrc,fn,&terr,&abort);
  219.     if (ch==24)
  220.       abort=1;
  221.     if (ch==21) {
  222.       send_b(f,0L,3,0,&ucrc,fn,&terr,&abort);
  223.       abort=1;
  224.     }
  225.   }
  226.   while ((!hangup) && (!abort) && (cp<len)) {
  227.     if (ym)
  228.       i=1;
  229.     else
  230.       i=0;
  231.     if ((len-cp)<768L)
  232.       i=0;
  233.     sprintf(s,"%ld - %ldk",
  234.       cp/128+1,
  235.       cp/1024+1);
  236.     movecsr(65,3);
  237.     outs(s);
  238.     movecsr(65,1);
  239.     outs(ctim(((double)(len-cp))*tpb));
  240.     movecsr(69,4);
  241.     outs("0");
  242.     ch=send_b(f,cp,i,bn,&ucrc,fn,&terr,&abort);
  243.     if (ch==24)
  244.       abort=1;
  245.     else
  246.       if (ch==21) {
  247.         wait1(18);
  248.         dump();
  249.         send_b(f,0L,3,0,&ucrc,fn,&terr,&abort);
  250.         abort=1;
  251.       } else {
  252.         ++bn;
  253.         if (i)
  254.           cp+=1024;
  255.         else
  256.           cp+=128;
  257.       }
  258.   }
  259.   if ((!hangup) && (!abort))
  260.     send_b(f,0L,2,0,&ucrc,fn,&terr,&abort);
  261.   if (!abort) {
  262.     *sent=1;
  263.     *percent=1.0;
  264.   } else {
  265.     *sent=0;
  266.     if (i)
  267.       cp+=1024;
  268.     else
  269.       cp+=128;
  270.     if (cp>=len)
  271.       *percent=1.0;
  272.     else {
  273.       if (i)
  274.         cp-=1024;
  275.       else
  276.         cp-=128;
  277.       *percent=((double)(cp))/((double)(len));
  278.     }
  279.   }
  280.   close(f);
  281.   movecsr(xx1,yy1);
  282.   if ((*sent) && (!ymb)) {
  283.     pl("> File transmission complete.");
  284.     nl();
  285.   }
  286. }
  287.