home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / macutils.lzh / MACUTILS / COMM / xm_from.c < prev    next >
C/C++ Source or Header  |  1995-09-18  |  3KB  |  165 lines

  1. #include "comm.h"
  2. #ifdef XM
  3. #include <stdio.h>
  4. #include "../fileio/machdr.h"
  5. #include "../fileio/wrfile.h"
  6. #include "../util/masks.h"
  7. #include "globals.h"
  8. #include "protocol.h"
  9.  
  10. extern int tgetc();
  11. extern int tgetrec();
  12. extern void tputc();
  13.  
  14. static void receive_part();
  15. static int receive_sync();
  16. static int receive_rec();
  17.  
  18. char info[INFOBYTES];
  19.  
  20. void xm_from()
  21. {
  22. unsigned long data_size, rsrc_size;
  23. char text[64];
  24.  
  25.     if(receive_sync() == ACK) {
  26.     receive_part(info, DATABYTES, 1);
  27.     transname(info + I_NAMEOFF + 1, text, info[I_NAMEOFF]);
  28.     define_name(text);
  29.     data_size = get4(info + I_DLENOFF);
  30.     rsrc_size = get4(info + I_RLENOFF);
  31.     start_info(info, rsrc_size, data_size);
  32.     start_data();
  33.     receive_part(out_buffer, data_size, 1);
  34.     start_rsrc();
  35.     receive_part(out_buffer, rsrc_size, 0);
  36.     end_file();
  37.     }
  38. }
  39.  
  40. static void receive_part(info, size, more)
  41. char *info;
  42. int size, more;
  43. {
  44. int recno = 1, i, status, naks = 0;
  45.  
  46.     status = 0;
  47.     while(status != EOT) {
  48.     status = receive_rec(info, DATABYTES, recno);
  49.     switch(status) {
  50.     case EOT:
  51.         if(!pre_beta) {
  52.         tputc(ACK);
  53.         }
  54.         if(more) {
  55.         tputc(NAK);
  56.         }
  57.         size = 0;
  58.         break;
  59.     case ACK:
  60.         tputc(ACK);
  61.         naks = 0;
  62.         size -= DATABYTES;
  63.         info += DATABYTES;
  64.         recno = (recno + 1) & MAXRECNO;
  65.         break;
  66.     case DUP:
  67.         tputc(ACK);
  68.         naks = 0;
  69.         break;
  70.     case NAK:
  71.         if(naks++ < RETRIES) {
  72.         tputc(NAK);
  73.         break;
  74.         }
  75.     case CAN:
  76.         tputc(CAN);
  77.         cleanup(-1);
  78.     }
  79.     }
  80. }
  81.  
  82. static int receive_sync()
  83. {
  84. int c;
  85.  
  86.     for(;;) {
  87.     c = tgetc(60);
  88.     switch(c) {
  89.     case ESC:
  90.         break;
  91.     case CAN:
  92.         cleanup();
  93.         break;
  94.     case EOT:
  95.     case TMO:
  96.         return c;
  97.     default:
  98.         continue;
  99.     }
  100.     c = tgetc(1);
  101.     if(c == 'a') {
  102.         break;;
  103.     }
  104.     }
  105.     tputc(ACK);
  106.     return ACK;
  107. }
  108.  
  109. static int receive_rec(buf, bufsize, recno)
  110. char *buf;
  111. int bufsize, recno;
  112. {
  113. int i, cksum, c, rec, recbar;
  114. char *bp;
  115.  
  116.     c = tgetc(SOHTIMO);
  117.     switch(c) {
  118.     case EOT:
  119.     case CAN:
  120.     return c;
  121.     case SOH:
  122.     break;
  123.     case TMO:
  124.     default:
  125.     return NAK;
  126.     }
  127.     rec = tgetc(CHRTIMO);
  128.     if(rec == TMO) {
  129.     return NAK;
  130.     }
  131.     recbar = tgetc(CHRTIMO);
  132.     if(recbar == TMO) {
  133.     return NAK;
  134.     }
  135.     if(rec + recbar != MAXRECNO) {
  136.     return NAK;
  137.     }
  138.     if(tgetrec(buf, bufsize, LINTIMO) == TMO) {
  139.     return NAK;
  140.     }
  141.     bp = buf;
  142.     cksum = 0;
  143.     for(i = 0; i < bufsize; i++) {
  144.     cksum += *bp++ & BYTEMASK;
  145.     }
  146.     c = tgetc(CHRTIMO);
  147.     if(c == TMO) {
  148.     return NAK;
  149.     }
  150.     if(c != (cksum & BYTEMASK)) {
  151.     return NAK;
  152.     }
  153.     if(rec == recno - 1) {
  154.     return DUP;
  155.     }
  156.     if(rec != recno) {
  157.     return CAN;
  158.     }
  159.     return ACK;
  160. }
  161.  
  162. #else /* XM */
  163. int xm_from; /* Keep lint and some compilers happy */
  164. #endif /* XM */
  165.