/* Copyright (C) Magna Carta Software, Inc. 1990, 1991. All Rights Reserved. C TELECOMM TOOLKIT v1.0 ASCII.C -- ROUTINES TO HANDLE ASCII FILE TRANSMISSION. Notes: */ #define CCT_DEVELOPMENT #include #if defined(__TURBOC__) #include #endif #include /* ASCII_SEND -- Send a file using ASCII. Return value: 1 -- Normal return; NO_FILE -- no files queued to send; EOF -- unable to read file; NO_RAM -- insufficient memory for file transfer buffer (less than MIN_BUFFER_SIZE) USER_CANCELLED -- Abort from keyboard; */ short ascii_send_(COMM_PORT *p, XFER *x, unsigned buflen, short (CDECL_ *progress)(struct comm_port *, short, DWORD)) { unsigned long i; short ch; WORD save_kbd_clear; short ret = 0; p->x = x; x->maxlen = x->len = buflen; if (x->ibdelay == 0) x->ibdelay = 10000; /* initialize interbyte delay */ x->p_user = (short (CDECL_ *)(struct comm_port *, short, DWORD)) progress; /* enable progress reports */ x->error = a_xfer_errors; /* enable error recording */ save_kbd_clear = kbd_clear; kbd_clear = TRUE; ret = fmakebuf_(x, buflen); /* load file for send */ if (ret >= 0) { if (x->p_user != NULL) (*x->p_user)(p, FILE_SOURCE, (long) x->origin); c_fpeekc_(x); /* prime the file transmit buffer */ ret = FALSE; if ((p->intr & 2) && x->origin == RAM) c_putn(p, x->len, x->buf); else for (i=0; ret == 0;i++) { if ((ch = c_fgetc_(x)) != EOF) { ret = c_putc(p, ch); if (!ret) { /* REPORT PROGRESS */ if (!(i % 256)) { if (x->p_user != NULL) (*x->p_user)(p, XFER_POSITION, i); } } if (is_key(p->abort_key)) ret = USER_CANCELLED; } else break; } /* REPORT END OF TRANSMISSION */ if (x->p_user != NULL) (*x->p_user)(p, ret, 0L); /* TRANSFER COMPLETED -- CLEAN UP */ cct_file_close_(x->fh); /* close the file/stream */ ffreebuf_(x); funqueue(x, x->fspec); /* if TX in progress, return 1 */ if (p->f_txbusy) ret = 1; } cct_xfer_status = ret; kbd_clear = save_kbd_clear; return (ret); } /* RX_ASCII_ -- This is the ASCII receive routine. If a byte is not received successfully, "file_error" is made non-zero and the file transfer aborted. Return value: 0 -- success; */ short rx_ascii_(COMM_PORT *p) { XFER *x = (XFER *) p->x; short ret = FALSE, ch; unsigned long i; short (CDECL_ *p_user)(struct comm_port *, short, unsigned long) = x->p_user; if (x->poll == 0) x->poll = 30000; x->protocol = ASCII; if (!ret) { x->fh = cct_file_open_(ftempname, O_CREAT|O_RDWR|O_BINARY); if (x->fh) { /* WAIT FOR THE FIRST BYTE */ ch = c_waitc(p, (short) EOF, x->poll); if (ch == EOF) { if (x->error != NULL) x->error[RX_TIMEOUT - XERROR_OFFSET]++; if (p_user != NULL) (*p_user)(p, NO_TX_START, 0L); ret = NO_TX_START; } else if (ch == USER_CANCELLED) { if (p_user != NULL) (*p_user)(p, USER_CANCELLED, 0L); ret = USER_CANCELLED; } else { c_fputc_(p, ch); /* THE REMAINDER OF THE DATA */ for (i = 1;!ret; i++) { if (is_key(p->abort_key)) { if (p_user != NULL) (*p_user)(p, USER_CANCELLED, 0L); ret = c_fwrite_(p, x); ret = USER_CANCELLED; break; } else { ch = c_getc(p); if (ch == EOF) { x->error[RX_TIMEOUT - XERROR_OFFSET]++; if (p_user != NULL ) (*p_user)(p, XFER_POSITION, i); ret = c_fwrite_(p, x); break; } else { c_fputc_(p, ch); if (!(i % 256) && p_user != NULL ) (*p_user)(p, XFER_POSITION, i); } } } } cct_file_close_(x->fh); } else ret = NO_FILE; } return (ret); }