You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
664 lines
16 KiB
664 lines
16 KiB
/* File: C:\WACKER\TDLL\recv_dlg.c (Created: 27-Dec-1993)
|
|
*
|
|
* Copyright 1990,1994 by Hilgraeve Inc. -- Monroe, MI
|
|
* All rights reserved
|
|
*
|
|
* $Revision: 16 $
|
|
* $Date: 4/17/02 5:16p $
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#pragma hdrstop
|
|
|
|
#include <time.h>
|
|
#include "stdtyp.h"
|
|
#include "mc.h"
|
|
#include "hlptable.h"
|
|
|
|
#include "tdll.h"
|
|
#include "misc.h"
|
|
#include <tdll\assert.h>
|
|
#include <term\res.h>
|
|
#include "session.h"
|
|
#include "globals.h"
|
|
#include "file_msc.h"
|
|
#include "load_res.h"
|
|
#include "open_msc.h"
|
|
#include "errorbox.h"
|
|
#include "cnct.h"
|
|
#include "htchar.h"
|
|
#include "errorbox.h"
|
|
|
|
#include "xfer_msc.h"
|
|
#include "xfer_msc.hh"
|
|
#include <xfer\xfer.h>
|
|
|
|
#if !defined(DlgParseCmd)
|
|
#define DlgParseCmd(i,n,c,w,l) i=LOWORD(w);n=HIWORD(w);c=(HWND)l;
|
|
#endif
|
|
|
|
struct stSaveDlgStuff
|
|
{
|
|
/*
|
|
* Put in whatever else you might need to access later
|
|
*/
|
|
HSESSION hSession;
|
|
};
|
|
|
|
typedef struct stSaveDlgStuff SDS;
|
|
|
|
#define IDC_TF_FILENAME 100
|
|
#define IDC_EB_DIR 101
|
|
#define IDC_PB_BROWSE 102
|
|
#define IDC_TF_PROTOCOL 103
|
|
#define IDC_CB_PROTOCOL 104
|
|
#define IDC_PB_CLOSE 105
|
|
#define IDC_PB_RECEIVE 106
|
|
|
|
INT_PTR CALLBACK TransferReceiveFilenameDlg(HWND hDlg,
|
|
UINT wMsg,
|
|
WPARAM wPar,
|
|
LPARAM lPar);
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION: TransferReceiveDlg
|
|
*
|
|
* DESCRIPTION: Dialog manager stub
|
|
*
|
|
* ARGUMENTS: Standard Windows dialog manager
|
|
*
|
|
* RETURNS: Standard Windows dialog manager
|
|
*
|
|
*/
|
|
INT_PTR CALLBACK TransferReceiveDlg(HWND hDlg, UINT wMsg, WPARAM wPar, LPARAM lPar)
|
|
{
|
|
HWND hwndChild;
|
|
INT nId;
|
|
INT nNtfy;
|
|
SDS *pS;
|
|
int nProto;
|
|
int nIndex;
|
|
int nState;
|
|
int nProtocol;
|
|
int nXferRecvReturn = 0;
|
|
TCHAR acBuffer[FNAME_LEN];
|
|
TCHAR acName[FNAME_LEN];
|
|
LPCTSTR pszDir;
|
|
LPTSTR pszPtr;
|
|
LPTSTR pszStr;
|
|
XFR_PARAMS *pP;
|
|
XFR_PROTOCOL *pX;
|
|
HSESSION hSession;
|
|
HXFER hXfer = NULL;
|
|
XD_TYPE *pT = NULL;
|
|
|
|
static DWORD aHlpTable[] = {IDC_EB_DIR, IDH_TERM_RECEIVE_DIRECTORY,
|
|
IDC_TF_FILENAME, IDH_TERM_RECEIVE_DIRECTORY,
|
|
IDC_PB_BROWSE, IDH_BROWSE,
|
|
IDC_TF_PROTOCOL, IDH_TERM_RECEIVE_PROTOCOL,
|
|
IDC_CB_PROTOCOL, IDH_TERM_RECEIVE_PROTOCOL,
|
|
IDC_PB_RECEIVE, IDH_TERM_RECEIVE_RECEIVE,
|
|
IDC_PB_CLOSE, IDH_CLOSE_DIALOG,
|
|
IDCANCEL, IDH_CANCEL,
|
|
IDOK, IDH_OK,
|
|
0, 0};
|
|
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
pS = (SDS *)malloc(sizeof(SDS));
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pS);
|
|
|
|
if (pS == 0)
|
|
{
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
}
|
|
|
|
SendMessage(GetDlgItem(hDlg, IDC_EB_DIR),
|
|
EM_SETLIMITTEXT,
|
|
FNAME_LEN, 0);
|
|
|
|
hSession = (HSESSION)lPar;
|
|
pS->hSession = hSession;
|
|
|
|
mscCenterWindowOnWindow(hDlg, GetParent(hDlg));
|
|
|
|
pP = (XFR_PARAMS *)0;
|
|
xfrQueryParameters(sessQueryXferHdl(hSession), (VOID **)&pP);
|
|
assert(pP);
|
|
|
|
nState = pP->nRecProtocol;
|
|
|
|
/*
|
|
* Load selections into the PROTOCOL COMBO box
|
|
*/
|
|
nProto = 0;
|
|
|
|
mscResetComboBox(GetDlgItem(hDlg, IDC_CB_PROTOCOL));
|
|
|
|
pX = (XFR_PROTOCOL *)0;
|
|
xfrGetProtocols(hSession, &pX);
|
|
assert(pX);
|
|
|
|
if (pX != (XFR_PROTOCOL *)0)
|
|
{
|
|
for (nIndex = 0; pX[nIndex].nProtocol != 0; nIndex += 1)
|
|
{
|
|
if (nState == pX[nIndex].nProtocol)
|
|
nProto = nIndex;
|
|
|
|
//jmh 02-13-96 Use CB_ADDSTRING to sort entries as
|
|
// they are added. CB_INSERTSTRING doesn't do this,
|
|
// even if the combo-box has the CBS_SORT style.
|
|
SendMessage(GetDlgItem(hDlg, IDC_CB_PROTOCOL),
|
|
CB_ADDSTRING,
|
|
0, //(UINT) -1
|
|
(LPARAM)&pX[nIndex].acName[0]);
|
|
}
|
|
|
|
SendMessage(GetDlgItem(hDlg, IDC_CB_PROTOCOL),
|
|
CB_SELECTSTRING,
|
|
0,
|
|
(LPARAM) &pX[nProto].acName[0]);
|
|
|
|
free(pX);
|
|
pX = NULL;
|
|
}
|
|
|
|
PostMessage(hDlg, WM_COMMAND,
|
|
IDC_CB_PROTOCOL,
|
|
MAKELONG(GetDlgItem(hDlg, IDC_CB_PROTOCOL),CBN_SELCHANGE));
|
|
/*
|
|
* Set the current directory
|
|
*/
|
|
pszDir = filesQueryRecvDirectory(sessQueryFilesDirsHdl(hSession));
|
|
SetDlgItemText(hDlg, IDC_EB_DIR, pszDir);
|
|
|
|
// Check if we're connected. If not, disable Send button.
|
|
//
|
|
if (cnctQueryStatus(sessQueryCnctHdl(hSession)) != CNCT_STATUS_TRUE)
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PB_RECEIVE), FALSE);
|
|
|
|
/*
|
|
* Set the focus on this control
|
|
*/
|
|
SetFocus(GetDlgItem(hDlg, IDC_EB_DIR));
|
|
return 0;
|
|
|
|
case WM_DESTROY:
|
|
mscResetComboBox(GetDlgItem(hDlg, IDC_CB_PROTOCOL));
|
|
pS = (SDS *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
if (pS)
|
|
{
|
|
free(pS);
|
|
pS = NULL;
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
doContextHelp(aHlpTable, wPar, lPar, TRUE, TRUE);
|
|
break;
|
|
|
|
case WM_HELP:
|
|
doContextHelp(aHlpTable, wPar, lPar, FALSE, FALSE);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
/*
|
|
* Did we plan to put a macro in here to do the parsing ?
|
|
*/
|
|
DlgParseCmd(nId, nNtfy, hwndChild, wPar, lPar);
|
|
|
|
switch (nId)
|
|
{
|
|
case IDC_PB_RECEIVE:
|
|
case IDC_PB_CLOSE:
|
|
pS = (SDS *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
hSession = pS->hSession;
|
|
assert(hSession);
|
|
|
|
if (hSession == NULL)
|
|
{
|
|
break;
|
|
}
|
|
|
|
hXfer = sessQueryXferHdl(hSession);
|
|
assert(hXfer);
|
|
|
|
if (hXfer == NULL)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
// See if a file transfer is currently in progress.
|
|
//
|
|
pT = (XD_TYPE *)hXfer;
|
|
assert(pT);
|
|
|
|
if (pT == (XD_TYPE *)0)
|
|
{
|
|
break;
|
|
}
|
|
else if (pT->nDirection != XFER_NONE)
|
|
{
|
|
nXferRecvReturn = XFR_IN_PROGRESS;
|
|
}
|
|
else if(cnctQueryStatus(sessQueryCnctHdl(hSession))
|
|
!= CNCT_STATUS_TRUE && nId == IDC_PB_RECEIVE)
|
|
{
|
|
//
|
|
// We are currently not connected (loss of carrier),
|
|
// so disable the Recieve button. REV: 9/7/2001
|
|
//
|
|
nXferRecvReturn = XFR_NO_CARRIER;
|
|
mscMessageBeep(MB_ICONHAND);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PB_RECEIVE), FALSE);
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
* Do whatever saving is necessary
|
|
*/
|
|
pP = (XFR_PARAMS *)0;
|
|
xfrQueryParameters(hXfer, (VOID **)&pP);
|
|
assert(pP);
|
|
|
|
/*
|
|
* Save selection from the PROTOCOL COMBO box
|
|
*/
|
|
pX = (XFR_PROTOCOL *)0;
|
|
xfrGetProtocols(hSession, &pX);
|
|
assert(pX);
|
|
|
|
nProtocol = 0;
|
|
|
|
if (pX != (XFR_PROTOCOL *)0)
|
|
{
|
|
GetDlgItemText(hDlg,
|
|
IDC_CB_PROTOCOL,
|
|
acBuffer,
|
|
(sizeof(acBuffer) / sizeof(TCHAR)));
|
|
for (nIndex = 0; pX[nIndex].nProtocol != 0; nIndex += 1)
|
|
{
|
|
if (StrCharCmp(acBuffer, pX[nIndex].acName) == 0)
|
|
{
|
|
nProtocol = pX[nIndex].nProtocol;
|
|
break;
|
|
}
|
|
}
|
|
free(pX);
|
|
pX = NULL;
|
|
}
|
|
|
|
/*
|
|
* Save the current directory
|
|
*/
|
|
GetDlgItemText(hDlg, IDC_EB_DIR,
|
|
acBuffer,
|
|
sizeof(acBuffer) / sizeof(TCHAR));
|
|
|
|
// xfer_makepaths checks for the validity of the path and
|
|
// prompts to create it if not there.
|
|
//
|
|
if (xfer_makepaths(hSession, acBuffer) != 0)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (nId == IDC_PB_RECEIVE)
|
|
{
|
|
acName[0] = TEXT('\0');
|
|
|
|
switch (nProtocol)
|
|
{
|
|
case XF_XMODEM:
|
|
case XF_XMODEM_1K:
|
|
pszPtr = (LPTSTR)DoDialog(glblQueryDllHinst(),
|
|
MAKEINTRESOURCE(IDD_RECEIVEFILENAME),
|
|
hDlg,
|
|
TransferReceiveFilenameDlg,
|
|
(LPARAM)hSession);
|
|
|
|
if (pszPtr == NULL)
|
|
{
|
|
//
|
|
// Don't close the recieve dialog here, so state we
|
|
// have handled the message. REV: 3/27/2002
|
|
//
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// If we want to allow the user to fully path the Xmodem
|
|
// filename, we will have to split the directory and filename
|
|
// apart here and set asBuffer with the receive directory.
|
|
// We will also have to make sure we call xfer_makepaths()
|
|
// so that we are in the directory is correct for the file
|
|
// transfer. REV: 3/27/2002
|
|
//
|
|
|
|
StrCharCopyN(acName, pszPtr, FNAME_LEN);
|
|
free(pszPtr);
|
|
pszPtr = NULL;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Save anything that needs to be saved
|
|
*/
|
|
pP->nRecProtocol = nProtocol;
|
|
xfrSetParameters(hXfer, (VOID *)pP);
|
|
filesSetRecvDirectory(sessQueryFilesDirsHdl(hSession), acBuffer);
|
|
|
|
if (nId == IDC_PB_RECEIVE)
|
|
{
|
|
/*
|
|
* The directory to use should be in "acBuffer", and the
|
|
* file name (if any) should be in acName.
|
|
*/
|
|
nXferRecvReturn = xfrRecvStart(hXfer, acBuffer, acName);
|
|
//break; // If the dlg isn't closed here, keyboard msgs
|
|
// intended for the rcv progress dlg are
|
|
// intercepted by this dlg. rde 31 Oct 01
|
|
}
|
|
}
|
|
|
|
//
|
|
// Don't save the settings if a file transfer is in
|
|
// progress otherwise the current file transfer could
|
|
// get corrupted. REV: 08/06/2001.
|
|
//
|
|
if (nXferRecvReturn == XFR_IN_PROGRESS)
|
|
{
|
|
TCHAR acMessage[256];
|
|
|
|
if (sessQuerySound(hSession))
|
|
{
|
|
mscMessageBeep(MB_ICONHAND);
|
|
}
|
|
|
|
LoadString(glblQueryDllHinst(),
|
|
IDS_ER_XFER_RECV_IN_PROCESS,
|
|
acMessage,
|
|
sizeof(acMessage) / sizeof(TCHAR));
|
|
|
|
TimedMessageBox(sessQueryHwnd(hSession),
|
|
acMessage,
|
|
NULL,
|
|
MB_OK | MB_ICONEXCLAMATION,
|
|
sessQueryTimeout(hSession));
|
|
}
|
|
else if(nXferRecvReturn == XFR_NO_CARRIER)
|
|
{
|
|
//
|
|
// We are currently not connected (loss of carrier),
|
|
// so disable the Recieve button. REV: 9/7/2001
|
|
//
|
|
mscMessageBeep(MB_ICONHAND);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PB_RECEIVE), FALSE);
|
|
}
|
|
else
|
|
{
|
|
EndDialog(hDlg, TRUE);
|
|
}
|
|
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
|
|
case IDC_PB_BROWSE:
|
|
pS = (SDS *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
if (pS)
|
|
{
|
|
GetDlgItemText(hDlg,
|
|
IDC_EB_DIR,
|
|
acBuffer,
|
|
sizeof(acBuffer) / sizeof(TCHAR));
|
|
|
|
pszStr = gnrcFindDirectoryDialog(hDlg, pS->hSession, acBuffer);
|
|
if (pszStr)
|
|
{
|
|
SetDlgItemText(hDlg, IDC_EB_DIR, pszStr);
|
|
free(pszStr);
|
|
pszStr = NULL;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* FUNCTION:
|
|
* TransferReceiveFilenameDlg
|
|
*
|
|
* DESCRIPTION:
|
|
* This function is called to prompt the user to enter a filename. This is
|
|
* necessary for some protocols like XMODEM, which does not send a filename,
|
|
* and for other protocols when the user has not checked the option to use
|
|
* the received file name.
|
|
*
|
|
* PARAMETERS:
|
|
* Standard dialog box parameters.
|
|
*
|
|
* RETURNS:
|
|
* Indirectly, a pointer to a string (that must be freed by the caller) that
|
|
* contains the name, or a NULL if the user canceled.
|
|
*
|
|
*/
|
|
|
|
#define FOLDER 101
|
|
#define DIR_TEXT 102
|
|
#define FNAME_LABEL 103
|
|
#define FNAME_EDIT 104
|
|
|
|
#define FILL_TEXT 105
|
|
|
|
INT_PTR CALLBACK TransferReceiveFilenameDlg(HWND hDlg,
|
|
UINT wMsg,
|
|
WPARAM wPar,
|
|
LPARAM lPar)
|
|
{
|
|
HWND hwndChild;
|
|
INT nId;
|
|
INT nNtfy;
|
|
SDS *pS;
|
|
HWND hwndParent;
|
|
TCHAR acDir[FNAME_LEN];
|
|
TCHAR acBuffer[FNAME_LEN];
|
|
|
|
|
|
static DWORD aHlpTable[] = {FOLDER, IDH_TERM_RECEIVE_DIRECTORY,
|
|
FNAME_LABEL, IDH_TERM_RECEIVE_PROTOCOL,
|
|
FNAME_EDIT, IDH_TERM_RECEIVE_PROTOCOL,
|
|
IDCANCEL, IDH_CANCEL,
|
|
IDOK, IDH_OK,
|
|
0, 0};
|
|
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
pS = (SDS *)malloc(sizeof(SDS));
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pS);
|
|
|
|
if (pS == (SDS *)0)
|
|
{
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
}
|
|
|
|
mscCenterWindowOnWindow(hDlg, GetParent(hDlg));
|
|
|
|
SendMessage(GetDlgItem(hDlg, FNAME_EDIT),
|
|
EM_SETLIMITTEXT,
|
|
FNAME_LEN, 0);
|
|
|
|
hwndParent = GetParent(hDlg);
|
|
if (IsWindow(hwndParent))
|
|
{
|
|
acDir[0] = TEXT('\0');
|
|
GetDlgItemText(hwndParent,
|
|
IDC_EB_DIR,
|
|
acDir,
|
|
sizeof(acDir) / sizeof(TCHAR));
|
|
if (StrCharGetStrLength(acDir) > 0)
|
|
{
|
|
SetDlgItemText(hDlg,
|
|
DIR_TEXT,
|
|
acDir);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
pS = (SDS *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
if (pS)
|
|
{
|
|
free(pS);
|
|
pS = NULL;
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
doContextHelp(aHlpTable, wPar, lPar, TRUE, TRUE);
|
|
break;
|
|
|
|
case WM_HELP:
|
|
doContextHelp(aHlpTable, wPar, lPar, FALSE, FALSE);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
/*
|
|
* Did we plan to put a macro in here to do the parsing ?
|
|
*/
|
|
DlgParseCmd(nId, nNtfy, hwndChild, wPar, lPar);
|
|
|
|
switch (nId)
|
|
{
|
|
case IDOK:
|
|
pS = (SDS *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
/*
|
|
* Do whatever saving is necessary
|
|
*/
|
|
acBuffer[0] = TEXT('\0');
|
|
GetDlgItemText(hDlg, FNAME_EDIT,
|
|
acBuffer,
|
|
sizeof(acBuffer) / sizeof(TCHAR));
|
|
|
|
if (StrCharGetStrLength(acBuffer) == 0)
|
|
{
|
|
TCHAR ach[256];
|
|
|
|
LoadString(glblQueryDllHinst(), IDS_GNRL_NEED_FNAME, ach,
|
|
sizeof(ach)/sizeof(TCHAR));
|
|
|
|
TimedMessageBox(hDlg, ach, NULL, MB_OK | MB_ICONHAND, 0);
|
|
}
|
|
else
|
|
{
|
|
LPTSTR pszStr = NULL;
|
|
TCHAR invalid_chars[MAX_PATH];
|
|
LPTSTR lpFilePart = NULL;
|
|
int numchar = GetFullPathName(acBuffer, 0, pszStr, &lpFilePart);
|
|
UINT ErrorId = 0;
|
|
|
|
LoadString(glblQueryDllHinst(), IDS_GNRL_INVALID_FILE_CHARS,
|
|
invalid_chars, MAX_PATH);
|
|
|
|
if (numchar == 0)
|
|
{
|
|
ErrorId = IDS_GNRL_NEED_FNAME;
|
|
}
|
|
else if ((pszStr = (LPTSTR)malloc(numchar * sizeof(TCHAR))) == NULL)
|
|
{
|
|
ErrorId = IDS_TM_XFER_TWELVE;
|
|
}
|
|
else if (GetFullPathName(acBuffer, numchar, pszStr, &lpFilePart) == 0)
|
|
{
|
|
ErrorId = IDS_GNRL_NEED_FNAME;
|
|
}
|
|
else if (lpFilePart == NULL ||
|
|
StrCharPBrk(lpFilePart, invalid_chars) != NULL ||
|
|
StrCharPBrk(acBuffer, invalid_chars) != NULL)
|
|
{
|
|
ErrorId = IDS_GNRL_INVALID_FNAME_CHARS;
|
|
}
|
|
|
|
if (ErrorId == 0)
|
|
{
|
|
StrCharCopyN(pszStr, lpFilePart, numchar);
|
|
EndDialog(hDlg, (INT_PTR)pszStr);
|
|
}
|
|
else
|
|
{
|
|
TCHAR ach[256];
|
|
TCHAR ach2[256];
|
|
|
|
if (LoadString(glblQueryDllHinst(), ErrorId, ach, 256) == 0)
|
|
{
|
|
TCHAR_Fill(ach, TEXT('\0'), 256);
|
|
}
|
|
|
|
if (ErrorId == IDS_GNRL_INVALID_FNAME_CHARS)
|
|
{
|
|
if (LoadString(glblQueryDllHinst(), ErrorId, ach2, 256))
|
|
{
|
|
wsprintf(ach, ach2, invalid_chars);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LoadString(glblQueryDllHinst(), ErrorId, ach, 256);
|
|
}
|
|
|
|
TimedMessageBox(hDlg, ach, NULL, MB_OK | MB_ICONSTOP,
|
|
sessQueryTimeout(pS->hSession));
|
|
|
|
if (pszStr)
|
|
{
|
|
free(pszStr);
|
|
pszStr = NULL;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
pS = (SDS *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|