home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload
/
ShartewareOverload.cdr
/
windows
/
winkerm.zip
/
WINRCV.C
< prev
next >
Wrap
C/C++ Source or Header
|
1986-10-10
|
9KB
|
380 lines
/***************************************************************************
*
* Winrcv
*
* Receive file using Kermit protocol
*
***************************************************************************/
#include <windows.h>
#include "winkrm.h"
/* These are local functions */
int NEAR recsw();
char NEAR rinit();
char NEAR rfile();
char NEAR rdata();
void NEAR bufemp(char*, int);
/***************************************************************************
*
* receive
*
* Prepare to receive a file.
*
* Entry: None
*
* Exit: Files sent by remote Kermit received and saved to disk.
*
***************************************************************************/
receive()
{
RECT rect; /* used to measure location on screen of window */
char RXTitle[20]; /* title to receive popup window */
eol = CR; /* eol for outgoing packet */
quote = MYQUOTE; /* standard quote */
pad = MYPAD; /* no padding */
padchar = MYPCHAR; /* if any, use this */
StateStr[0] = '\0'; /* set up popup window params */
PacketStr[0] = '\0';
filnam1[0] = '\0';
debug = FALSE; /* these should be menu items */
pktdeb = FALSE;
ThisState = RECEIVESTATE;
GetWindowRect(hKermWnd, (LPRECT)&rect); /* get window size */
strcpy(RXTitle, szWinTitle); /* initialize the popup headings */
strcat(RXTitle," Receive");
/* Create a popup window */
hRXWnd = CreateWindow((LPSTR)szAppName,
(LPSTR)RXTitle,
WS_POPUP | WS_CAPTION,
5*CharWidth + rect.left,
4*CharHeight + rect.top,
21*CharWidth,
5*CharHeight - CharHeight/2,
(HWND)hKermWnd,
(HMENU)NULL,
(HANDLE)hInst,
(LPSTR)NULL
);
SetMenu(hRXWnd, (HANDLE)NULL); /* kill off any menus */
ShowWindow(hRXWnd, SHOW_OPENNOACTIVATE); /* show the popup */
UpdateWindow(hRXWnd);
if (pktdeb) { /* debugging stuff */
dpfp = fopen("PACKET.LOG", "wb");
if (dpfp == NULL)
MessageBox(hKermWnd, (LPSTR)"Cannot open packet debug file",
(LPSTR)szWinTitle, MB_OK | MB_ICONEXCLAMATION);
}
if (recsw() == FALSE) /* go do it */
printmsg("Receive failed");
else
printmsg("Receive Done");
if (pktdeb)
fclose(dpfp);
DestroyWindow(hRXWnd); /* get rid of popup */
if (CurrentState == RECEIVESTATE) /* simulate a mouse selection */
SendMessage(hKermWnd, WM_COMMAND, RECEIVESTATE, (LONG)NULL);
}
/***************************************************************************
*
* recsw
*
* Receive state switcher.
*
* Entry: None.
*
* Exit: Succesful transfer or abort.
*
***************************************************************************/
int NEAR recsw()
{
state = 'R';
n = 0;
numtry = 0;
PacketCount = 0;
while (TRUE) {
if (debug)
printf("recsw state %c\n", state);
/* prepare info for the receive popup window and send it out */
StateStr[0] = state;
strcpy(PacketStr, itoa(PacketCount, PacketStr,10));
hRXWndDC = GetDC(hRXWnd);
TextOut(hRXWndDC,9*CharWidth,2,(LPSTR)StateStr,1);
TextOut(hRXWndDC,10*CharWidth,CharHeight+2,(LPSTR)PacketStr,strlen(PacketStr));
ReleaseDC(hRXWnd, hRXWndDC);
PacketCount += 1;
switch (state) {
case 'R':
state = rinit(); /* get init packet */
break;
case 'F':
state = rfile(); /* get file name */
break;
case 'D':
state = rdata(); /* get data */
break;
case 'C':
return (TRUE); /* all done */
case 'A':
return (FALSE); /* abort */
}
}
}
/*
*
* For more detail on the following routines, see the file KERMIT.C
* as published in the Kermit protocol manual from Columbia University.
*
*/
/***************************************************************************
*
* rinit
*
* Receive send init paramters from remote Kermit
*
* Entry: None.
*
* Exit: Next state.
*
***************************************************************************/
char NEAR rinit()
{
int len, num;
if (numtry++ > MAXTRY)
return('A');
switch(rpack(&len, &num, packet)) {
case 'S':
rpar(packet);
spar(packet);
spack('Y', n, 6, packet);
oldtry = numtry;
numtry = 0;
n = (n+1) % 64;
return('F');
case 'E':
prerrpkt(recpkt);
return('A');
case FALSE:
spack('N', n, 0, 0);
return(state);
default:
return('A');
}
}
/***************************************************************************
*
* rfile
*
* Get a file name from remote Kermit.
*
* Entry: None
*
* Exit: Next state.
*
***************************************************************************/
char NEAR rfile()
{
int num, len;
if (numtry++ > MAXTRY)
return('A');
switch(rpack(&len,&num,packet)) {
case 'S':
if (oldtry++ > MAXTRY)
return('A');
if (num == ((n == 0) ? 63:n-1)) {
spar(packet);
spack('Y', num, 6, packet);
numtry = 0;
return(state);
}
else
return('A');
case 'Z':
if (oldtry++ > MAXTRY)
return('A');
if (num == ((n == 0) ? 63:n-1)) {
spack('Y', num, 0,0);
numtry = 0;
return(state);
}
else
return('A');
case 'F':
if (num != n)
return('A');
strncpy(filnam1, packet, NAMESIZE);
hRXWndDC = GetDC(hRXWnd);
TextOut(hRXWndDC,8*CharWidth,2*CharHeight+2,
(LPSTR)" ", 12);
TextOut(hRXWndDC,8*CharWidth,2*CharHeight+2,(LPSTR)filnam1,strlen(filnam1));
ReleaseDC(hRXWnd, hRXWndDC);
if ((fp = fopen(filnam1, "wb")) == NULL) {
MessageBox(hKermWnd, (LPSTR)"Cannot open to receive",
(LPSTR)filnam1, MB_OK | MB_ICONEXCLAMATION);
return('A');
}
else {
/* display the name */
}
spack('Y', n, 0, 0);
oldtry = numtry;
numtry = 0;
n = (n+1)%64;
return ('D');
case 'B':
if (num != n)
return('A');
spack('Y',n,0,0);
return('C');
case 'E':
prerrpkt(recpkt);
return('A');
case FALSE:
spack('N', n, 0, 0);
return(state);
default:
return('A');
}
}
/***************************************************************************
*
* rdata
*
* Receive data from remote Kermit.
*
* Entry: None.
*
* Exit: Next state.
*
***************************************************************************/
char NEAR rdata()
{
int num, len;
if (numtry++ > MAXTRY)
return('A');
switch(rpack(&len,&num,packet)) {
case 'D':
if (num != n) {
if (oldtry++ > MAXTRY)
return('A');
if (num == ((n == 0) ? 63:n-1)) {
spack('Y', num, 6, packet);
numtry = 0;
return(state);
}
else
return('A');
}
bufemp(packet, len);
spack('Y', n, 0 ,0);
oldtry = numtry;
numtry = 0;
n = (n+1) % 64;
return('D');
case 'F':
if (oldtry++ > MAXTRY)
return('A');
if (num == ((n == 0) ? 63:n-1)) {
spack('Y', num, 0, 0);
numtry = 0;
return(state);
}
else
return('A');
case 'Z':
if (num != n)
return('A');
spack('Y', n, 0, 0);
fclose(fp);
n = (n+1)%64;
return('F');
case 'E':
prerrpkt(recpkt);
return('A');
case FALSE:
spack('N', n, 0, 0);
return(state);
default:
return('A');
}
}
/***************************************************************************
*
* bufemp
*
* Empty a data buffer receive from remote Kermit to disk file.
*
* Entry: buffer and its length.
*
* Exit: buffer written to file.
*
* Notes: This routine needs to handle any error conditions returned
* by putc. As it is now, it will continue to write characters
* to a full disk. In addition, it is not suitable for a binary
* file transfer.
*
***************************************************************************/
void NEAR bufemp(buffer, len)
char buffer[];
int len;
{
int i;
char t;
for (i = 0; i < len; i++) {
t = buffer[i];
if (t == MYQUOTE) {
t = buffer[++i];
if ((t & 0177) != MYQUOTE)
t = ctl(t);
}
putc(t, fp);
}
}