home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
pub
/
win100
/
winkpd.c
< prev
next >
Wrap
C/C++ Source or Header
|
2020-01-01
|
14KB
|
560 lines
/*
* Windows Kermit
*
* Written by William S. Hall
* 3665 Benton Street, #66
* Santa Clara, CA 95051
*
* protocol dialog box support
*/
#define NOKANJI
#define NOATOM
#define NOMINMAX
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include "winasc.h"
#include "winkpr.h"
#include "winkpf.h"
#define MAXPATHLEN 128
static char *defstring = "*.*";
/* local functions */
static void NEAR PathSelect(HWND hDlg, LONG lParam);
static void NEAR ListBoxInit(HWND hDlg);
static int NEAR CheckSelect(HWND hDlg);
static void NEAR ListBoxOK(HWND hDlg, LONG lParam);
static char* NEAR getnamestr(char *str, int len);
static void NEAR GetSendFileList(HWND hDlg, LONG lParam);
static void NEAR SaveMiscParams(HWND hDlg);
static void NEAR krmRemoteCommandInit(HWND hDlg, WORD idd_string1,
WORD idd_string2, WORD idd_limit1, WORD idd_limit2, BOOL enable);
static void NEAR krmActivateOK(HWND hDlg, WORD id, LONG lParam);
static BOOL NEAR krmOneParamRemoteCmd(HWND hDlg, WORD id, char cmd);
/* send file dialog box */
BOOL FAR PASCAL SendFileDlgProc(hDlg, message, wParam, lParam)
HWND hDlg;
unsigned message;
WORD wParam;
LONG lParam;
{
switch (message) {
case WM_INITDIALOG:
ListBoxInit(hDlg);
break;
case WM_COMMAND:
switch (wParam) {
case IDOK:
ListBoxOK(hDlg, lParam);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
case IDD_SEND:
GetSendFileList(hDlg, lParam);
break;
case IDD_PATHSELECT:
PathSelect(hDlg, lParam);
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
/* support modules for send file dlg */
static char* NEAR getnamestr(char *str, int len)
{
char *tmp;
tmp = str + len;
while ((*tmp != ':') && (*tmp != '\\') && (tmp > str))
tmp--;
if (*tmp != ':' && *tmp != '\\')
return(tmp);
else
return(tmp + 1);
}
static void NEAR PathSelect(HWND hDlg, LONG lParam)
{
char buf[MAXPATHLEN];
char str[MAXPATHLEN];
int len;
if (HIWORD(lParam) == LBN_SELCHANGE) {
len = GetDlgItemText(hDlg, IDD_EDITSELECT,(LPSTR)str,80);
DlgDirSelect(hDlg, (LPSTR)buf, IDD_PATHSELECT);
if (strchr(str,'*') || strchr(str,'?'))
strcat(buf,getnamestr(str,len));
else
strcat(buf, defstring);
SetDlgItemText(hDlg, IDD_EDITSELECT, (LPSTR)buf);
}
else if (HIWORD(lParam) == LBN_DBLCLK) {
GetDlgItemText(hDlg, IDD_EDITSELECT,(LPSTR)buf,80);
DlgDirList(hDlg, (LPSTR)buf, IDD_LISTSELECT,IDD_PATHDISPLAY, 0);
DlgDirList(hDlg, (LPSTR)buf, IDD_PATHSELECT,IDD_PATHDISPLAY, 0xC010);
SetDlgItemText(hDlg, IDD_EDITSELECT, (LPSTR)buf);
}
}
static void NEAR ListBoxInit(HWND hDlg)
{
char buf[10];
strcpy(buf, defstring);
DlgDirList(hDlg, (LPSTR)buf, IDD_LISTSELECT,IDD_PATHDISPLAY, 0);
DlgDirList(hDlg, (LPSTR)buf, IDD_PATHSELECT,IDD_PATHDISPLAY, 0xC010);
SetDlgItemText(hDlg, IDD_EDITSELECT, (LPSTR)buf);
SendDlgItemMessage(hDlg, IDD_EDITSELECT,EM_LIMITTEXT,128,0L);
}
static int NEAR CheckSelect(HWND hDlg)
{
int num, i;
int count = 0;
num = (int)SendDlgItemMessage(hDlg, IDD_LISTSELECT,LB_GETCOUNT,0,0L);
for (i = 0; i < num; i++)
if (SendDlgItemMessage(hDlg,IDD_LISTSELECT,LB_GETSEL,(WORD)i,0L))
count += 1;
return count;
}
static void NEAR GetSendFileList(HWND hDlg, LONG lParam)
{
char buf[MAXPATHLEN];
int count, i, num;
count = CheckSelect(hDlg);
if (count > 0) {
Kermit.hfilelist = LocalAlloc(LPTR, count * 13);
if (Kermit.hfilelist != NULL) {
Kermit.pfilelist = LocalLock(Kermit.hfilelist);
num = (int)SendDlgItemMessage(hDlg, IDD_LISTSELECT,
LB_GETCOUNT,0,0L);
for (i = 0; i < num; i++) {
if (SendDlgItemMessage(hDlg,IDD_LISTSELECT,LB_GETSEL,(WORD)i,0L)) {
SendDlgItemMessage(hDlg, IDD_LISTSELECT,LB_GETTEXT,
(WORD)i, (LONG)(LPSTR)buf);
strcat(Kermit.pfilelist, buf);
strcat(Kermit.pfilelist, " ");
}
}
}
else
count = 0;
}
if (count == 0) {
/* no files selected or local alloc error */
}
EndDialog(hDlg,count);
}
static void NEAR ListBoxOK(HWND hDlg, LONG lParam)
{
char buf[MAXPATHLEN];
int validsspec, count;
OFSTRUCT myoff;
HANDLE hFile;
char oldpath[MAXPATHLEN];
char *ptr;
/* if nothing in the edit box */
if (GetDlgItemText(hDlg, IDD_EDITSELECT,(LPSTR)buf,sizeof(buf)) == 0)
/* remove highlighting from file list box */
SendDlgItemMessage(hDlg,IDD_LISTSELECT,LB_SETSEL,FALSE,(LONG)(-1));
else {
/* otherwise, save the path */
GetDlgItemText(hDlg, IDD_PATHDISPLAY,(LPSTR)oldpath,128);
/* see if valid search spec */
SendDlgItemMessage(hDlg, IDD_LISTSELECT, WM_SETREDRAW, FALSE, 0L);
SendDlgItemMessage(hDlg, IDD_PATHSELECT, WM_SETREDRAW, FALSE, 0L);
validsspec = DlgDirList(hDlg,(LPSTR)buf,IDD_LISTSELECT,IDD_PATHDISPLAY,0);
SendDlgItemMessage(hDlg, IDD_LISTSELECT, WM_SETREDRAW, TRUE, 0L);
SendDlgItemMessage(hDlg, IDD_PATHSELECT, WM_SETREDRAW, TRUE, 0L);
/* if valid, get the new path */
if (validsspec) {
/* buf modified, so update it */
SetDlgItemText(hDlg, IDD_EDITSELECT, (LPSTR)buf);
GetDlgItemText(hDlg, IDD_PATHDISPLAY, (LPSTR)buf,128);
/* if the same as before */
if (strcmp(oldpath, buf) == 0)
/* select the whole list box */
SendDlgItemMessage(hDlg,IDD_LISTSELECT,
LB_SETSEL,TRUE,(LONG)(-1));
else {
/* update the directory change box */
SendDlgItemMessage(hDlg,IDD_LISTSELECT,
LB_SETSEL,FALSE,(LONG)(-1));
DlgDirList(hDlg,(LPSTR)buf,IDD_PATHSELECT,
IDD_PATHDISPLAY, 0xC010);
}
/* not a valid search spec */
} else {
/* clear box */
SendDlgItemMessage(hDlg, IDD_LISTSELECT, LB_RESETCONTENT,0,0L);
/* see if it exists */
hFile = OpenFile((LPSTR)buf, (OFSTRUCT FAR *)&myoff, OF_EXIST);
if (hFile != -1) {
/* get the file name and add it to list box */
ptr = strrchr(myoff.szPathName,'\\') + 1;
SendDlgItemMessage(hDlg, IDD_LISTSELECT,LB_ADDSTRING,0,
(LONG)(LPSTR)ptr);
/* get the pathname */
strcpy(buf, myoff.szPathName);
count = strlen(buf) - strlen(ptr);
buf[count] = NUL;
/* select it */
SendDlgItemMessage(hDlg,IDD_LISTSELECT,LB_SETSEL,TRUE,-1L);
/* update the path select box */
SetDlgItemText(hDlg, IDD_EDITSELECT, (LPSTR)ptr);
DlgDirList(hDlg, (LPSTR)buf, IDD_PATHSELECT,IDD_PATHDISPLAY, 0xC010);
}
}
}
SendDlgItemMessage(hDlg, IDD_EDITSELECT, EM_SETSEL, 0, MAKELONG(0,32767));
}
/* set protocol parameters */
BOOL FAR PASCAL SetMiscParams(HWND hDlg,
unsigned message,WORD wParam,LONG lParam)
{
int i, *ptr;
switch (message) {
case WM_INITDIALOG:
ptr = &Kermit.timer;
for (i = IDD_TIMER; i <= IDD_KRM_BELL; i++)
CheckDlgButton(hDlg,i, *ptr++);
CheckDlgButton(hDlg, IDD_KRM_SAVE,FALSE);
break;
case WM_COMMAND:
switch(wParam) {
case IDOK:
ptr = &Kermit.timer;
for (i = IDD_TIMER; i <= IDD_KRM_BELL; i++)
*ptr++ = IsDlgButtonChecked(hDlg,i);
if (IsDlgButtonChecked(hDlg,IDD_KRM_SAVE))
SaveMiscParams(hDlg);
EndDialog(hDlg, TRUE);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
case IDD_TIMER:
case IDD_FILEWARN:
case IDD_FILEDISCARD:
case IDD_KRM_BELL:
case IDD_KRM_SAVE:
if (IsDlgButtonChecked(hDlg, wParam))
CheckDlgButton(hDlg,wParam,FALSE);
else
CheckDlgButton(hDlg,wParam,TRUE);
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
/* support for set misc dlg */
static void NEAR SaveMiscParams(HWND hDlg)
{
int i, *ptr;
char szAppStr[30];
char szKeyStr[30];
char szValStr[20];
HANDLE hInstance;
hInstance = (HANDLE)GetWindowWord(hDlg, GWW_HINSTANCE);
LoadString(hInstance,IDS_KRM_KERMIT, (LPSTR)szAppStr, sizeof(szAppStr));
ptr = &Kermit.timer;
for (i = 0; i < 4; i++) {
LoadString(hInstance,IDS_KRM_TIMER+i,(LPSTR)szKeyStr, sizeof(szKeyStr));
itoa(*ptr++, szValStr, sizeof(szValStr));
WriteProfileString((LPSTR)szAppStr,(LPSTR)szKeyStr,(LPSTR)szValStr);
}
BroadcastWinIniChange();
}
/* generic one-edit box dialog box */
BOOL FAR PASCAL GetFileList(HWND hDlg,unsigned message,WORD wParam,LONG lParam)
{
int count;
switch (message) {
case WM_INITDIALOG:
krmRemoteCommandInit(hDlg,Kermit.ids_title,0,IDD_GETNAME,0,
Kermit.nullstrOK);
break;
case WM_COMMAND:
switch(wParam) {
case IDOK:
count = (int)SendDlgItemMessage(hDlg,IDD_GETNAME,
WM_GETTEXTLENGTH,0,0L);
Kermit.hfilelist = LocalAlloc(LPTR, count+1);
if (Kermit.hfilelist != NULL) {
Kermit.pfilelist = LocalLock(Kermit.hfilelist);
count = GetDlgItemText(hDlg,IDD_GETNAME,
(LPSTR)Kermit.pfilelist,count + 1);
if (Kermit.remotecmd == 'R')
AnsiUpper((LPSTR)Kermit.pfilelist);
}
else
count = 0;
EndDialog(hDlg, count);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
case IDD_GETNAME:
if (!Kermit.nullstrOK)
krmActivateOK(hDlg, wParam, lParam);
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
/* chdir, or two-edit box dialog box */
BOOL FAR PASCAL krmRemoteChdir(HWND hDlg,
unsigned message,WORD wParam,LONG lParam)
{
int count, count1;
static HBRUSH hbr = 0;
switch (message) {
case WM_CTLCOLOR:
if (LOWORD(lParam) == GetDlgItem(hDlg,IDD_GETTEXT2)) {
SetBkColor(wParam, GetSysColor(COLOR_WINDOWTEXT));
SetTextColor(wParam, GetSysColor(COLOR_WINDOWTEXT));
if (hbr)
return (int)hbr;
else
return((int)GetStockObject(WHITE_BRUSH));
}
return FALSE;
case WM_INITDIALOG:
krmRemoteCommandInit(hDlg,IDS_KRM_CWD,IDS_KRM_PASSWORD,
IDD_GETTEXT1,IDD_GETTEXT2,TRUE);
hbr = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
break;
case WM_COMMAND:
switch(wParam) {
case IDOK:
count = (int)SendDlgItemMessage(hDlg,IDD_GETTEXT1,
WM_GETTEXTLENGTH,0,0L);
count1 = (int)SendDlgItemMessage(hDlg,IDD_GETTEXT2,
WM_GETTEXTLENGTH,0,0L);
Kermit.hRemoteCommand = LocalAlloc(LPTR,count + count1 + 4);
if (Kermit.hRemoteCommand != NULL) {
Kermit.pRemoteCommand = LocalLock(Kermit.hRemoteCommand);
*Kermit.pRemoteCommand = 'C';
*(Kermit.pRemoteCommand+1) = (BYTE)tochar(count);
if (count) {
GetDlgItemText(hDlg,IDD_GETTEXT1,
(LPSTR)(Kermit.pRemoteCommand+2), count+1);
if (count1) {
*(Kermit.pRemoteCommand + count + 2) =
(BYTE)tochar(count1);
GetDlgItemText(hDlg,IDD_GETTEXT2,
(LPSTR)(Kermit.pRemoteCommand+count+3),
count1 + 1);
}
}
EndDialog(hDlg, TRUE);
}
else
EndDialog(hDlg, FALSE);
if (hbr)
DeleteObject(hbr);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
if (hbr)
DeleteObject(hbr);
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
/* show transfer data */
BOOL FAR PASCAL krmXferDlgBox(HWND hDlg,
unsigned message,WORD wParam,LONG lParam)
{
char buf[40];
HANDLE hInst;
switch (message) {
case WM_INITDIALOG:
if (krmState == IDM_KRM_SEND) {
hInst = (HANDLE)GetWindowWord(hDlg, GWW_HINSTANCE);
LoadString(hInst,IDS_KRM_SENDING, (LPSTR)buf, sizeof(buf));
SetDlgItemText(hDlg, IDD_OPERATION, (LPSTR)buf);
}
break;
default:
return FALSE;
}
return TRUE;
}
/* another 1-edit box dialog box */
BOOL FAR PASCAL krmRemoteCmdDlgBox(HWND hDlg,
unsigned message,WORD wParam,LONG lParam)
{
switch (message) {
case WM_INITDIALOG:
krmRemoteCommandInit(hDlg,Kermit.ids_title,
0,IDD_GETNAME,0,Kermit.nullstrOK);
break;
case WM_COMMAND:
switch(wParam) {
case IDOK:
EndDialog(hDlg,krmOneParamRemoteCmd(hDlg,
IDD_GETNAME,Kermit.remotecmd));
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
case IDD_GETNAME:
if (!Kermit.nullstrOK)
krmActivateOK(hDlg, wParam, lParam);
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
/* support functions */
static void NEAR krmRemoteCommandInit(HWND hDlg, WORD idd_string1,
WORD idd_string2, WORD idd_limit1, WORD idd_limit2, BOOL enable)
{
char buf[80];
HANDLE hInst;
hInst = (HANDLE)GetWindowWord(hDlg, GWW_HINSTANCE);
if (idd_string1) {
LoadString(hInst,idd_string1, (LPSTR)buf, sizeof(buf));
SetDlgItemText(hDlg, IDD_STATICTEXT1, (LPSTR)buf);
}
if (idd_string2) {
LoadString(hInst,idd_string2, (LPSTR)buf, sizeof(buf));
SetDlgItemText(hDlg, IDD_STATICTEXT2, (LPSTR)buf);
}
if (idd_limit1)
SendDlgItemMessage(hDlg,idd_limit1,EM_LIMITTEXT,KRM_MAXPACKETSIZE,0L);
if (idd_limit2)
SendDlgItemMessage(hDlg,idd_limit2,EM_LIMITTEXT,KRM_MAXPACKETSIZE,0L);
EnableWindow(GetDlgItem(hDlg, IDOK), enable);
}
static void NEAR krmActivateOK(HWND hDlg, WORD id, LONG lParam)
{
int count;
if (HIWORD(lParam) == EN_CHANGE) {
count = (int)SendDlgItemMessage(hDlg,id, WM_GETTEXTLENGTH,0,0L);
EnableWindow(GetDlgItem(hDlg, IDOK), count);
}
}
static BOOL NEAR krmOneParamRemoteCmd(HWND hDlg, WORD id, char cmd)
{
int count;
count = (int)SendDlgItemMessage(hDlg,id,WM_GETTEXTLENGTH,0,0L);
Kermit.hRemoteCommand = LocalAlloc(LPTR,count + 3);
if (Kermit.hRemoteCommand != NULL) {
Kermit.pRemoteCommand = LocalLock(Kermit.hRemoteCommand);
*Kermit.pRemoteCommand = cmd;
*(Kermit.pRemoteCommand+1) = (BYTE)tochar(count);
if (count)
GetDlgItemText(hDlg,id,(LPSTR)(Kermit.pRemoteCommand+2), count+1);
return TRUE;
}
else
return FALSE;
}