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.
621 lines
15 KiB
621 lines
15 KiB
/* File: C:\WACKER\TDLL\send_dlg.c (Created: 22-Dec-1993)
|
|
* created from:
|
|
* File: C:\WACKER\TDLL\genrcdlg.c (Created: 16-Ded-1993)
|
|
* created from:
|
|
* File: C:\HA5G\ha5g\genrcdlg.c (Created: 12-Sep-1990)
|
|
*
|
|
* Copyright 1990,1994 by Hilgraeve Inc. -- Monroe, MI
|
|
* All rights reserved
|
|
*
|
|
* $Revision: 18 $
|
|
* $Date: 7/08/02 6:46p $
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#pragma hdrstop
|
|
|
|
#include <time.h>
|
|
#include "stdtyp.h"
|
|
#include "mc.h"
|
|
#include "tdll.h"
|
|
#include "misc.h"
|
|
#include <tdll\assert.h>
|
|
#include <term\res.h>
|
|
#include "session.h"
|
|
#include "file_msc.h"
|
|
#include "load_res.h"
|
|
#include "open_msc.h"
|
|
#include "errorbox.h"
|
|
#include "globals.h"
|
|
#include "cnct.h"
|
|
#include "htchar.h"
|
|
|
|
#include "xfer_msc.h"
|
|
#include "xfer_msc.hh"
|
|
#include <xfer\xfer.h>
|
|
|
|
#include "hlptable.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;
|
|
TCHAR acDirectory[FNAME_LEN];
|
|
};
|
|
|
|
typedef struct stSaveDlgStuff SDS;
|
|
|
|
#define IDC_TF_FILENAME 100
|
|
#define FNAME_EDIT 101
|
|
#define BROWSE_BTN 102
|
|
#define IDC_TF_PROTOCOL 103
|
|
#define PROTO_COMBO 104
|
|
#define IDC_PB_CLOSE 105
|
|
#define FOLDER_LABEL 106
|
|
#define FOLDER_NAME 107
|
|
#define IDC_PB_SEND 108
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION: TransferSendDlg
|
|
*
|
|
* DESCRIPTION: Dialog manager stub
|
|
*
|
|
* ARGUMENTS: Standard Windows dialog manager
|
|
*
|
|
* RETURNS: Standard Windows dialog manager
|
|
*
|
|
*/
|
|
INT_PTR CALLBACK TransferSendDlg(HWND hDlg, UINT wMsg, WPARAM wPar, LPARAM lPar)
|
|
{
|
|
INT nReturn = TRUE;
|
|
HWND hwndChild;
|
|
INT nId;
|
|
INT nNtfy;
|
|
SDS *pS;
|
|
int nIndex;
|
|
int nState;
|
|
int nProto;
|
|
int nChars = 0;
|
|
int nXferSendReturn = 0;
|
|
TCHAR acBuffer[FNAME_LEN];
|
|
TCHAR acTitle[64];
|
|
TCHAR acList[64];
|
|
LPTSTR pszStr;
|
|
LPTSTR *pszArray;
|
|
LPTSTR pszRet;
|
|
HCURSOR hCursor;
|
|
XFR_PARAMS *pP;
|
|
XFR_PROTOCOL *pX;
|
|
HSESSION hSession;
|
|
HXFER hXfer = NULL;
|
|
XD_TYPE *pT = NULL;
|
|
|
|
static DWORD aHlpTable[] = {FNAME_EDIT, IDH_TERM_SEND_FILENAME,
|
|
IDC_TF_FILENAME, IDH_TERM_SEND_FILENAME,
|
|
BROWSE_BTN, IDH_BROWSE,
|
|
IDC_TF_PROTOCOL, IDH_TERM_SEND_PROTOCOL,
|
|
PROTO_COMBO, IDH_TERM_SEND_PROTOCOL,
|
|
IDC_PB_SEND, IDH_TERM_SEND_SEND,
|
|
IDC_PB_CLOSE, IDH_OK,
|
|
IDOK, IDH_OK,
|
|
IDCANCEL, IDH_CANCEL,
|
|
0, 0};
|
|
|
|
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
TCHAR achDirectory[MAX_PATH];
|
|
DWORD dwStyle = SS_WORDELLIPSIS;
|
|
|
|
hSession = (HSESSION)lPar;
|
|
|
|
pS = (SDS *)malloc(sizeof(SDS));
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pS);
|
|
|
|
if (pS == (SDS *)0)
|
|
{
|
|
/* TODO: decide if we need to display an error here */
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
}
|
|
|
|
SendMessage(GetDlgItem(hDlg, FNAME_EDIT),
|
|
EM_SETLIMITTEXT,
|
|
FNAME_LEN, 0);
|
|
|
|
pS->hSession = hSession;
|
|
mscCenterWindowOnWindow(hDlg, GetParent(hDlg));
|
|
|
|
pP = (XFR_PARAMS *)0;
|
|
xfrQueryParameters(sessQueryXferHdl(hSession), (VOID **)&pP);
|
|
assert(pP);
|
|
|
|
/*
|
|
* Load selections into the PROTOCOL COMBO box
|
|
*/
|
|
|
|
nState = pP->nSndProtocol;
|
|
|
|
nProto = 0;
|
|
|
|
mscResetComboBox(GetDlgItem(hDlg, PROTO_COMBO));
|
|
|
|
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, PROTO_COMBO),
|
|
CB_ADDSTRING,
|
|
0,
|
|
(LPARAM)&pX[nIndex].acName[0]);
|
|
}
|
|
|
|
SendMessage(GetDlgItem(hDlg, PROTO_COMBO),
|
|
CB_SELECTSTRING,
|
|
0,
|
|
(LPARAM) &pX[nProto].acName[0]);
|
|
|
|
free(pX);
|
|
pX = NULL;
|
|
}
|
|
|
|
PostMessage(hDlg, WM_COMMAND,
|
|
PROTO_COMBO,
|
|
MAKELONG(GetDlgItem(hDlg, PROTO_COMBO),CBN_SELCHANGE));
|
|
|
|
StrCharCopyN(pS->acDirectory,
|
|
filesQuerySendDirectory(sessQueryFilesDirsHdl(hSession)), FNAME_LEN);
|
|
|
|
// The send button should always be disabled when we start. It
|
|
// will be enabled when the user types in a file name. - cab:12/06/96
|
|
//
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PB_SEND), FALSE);
|
|
|
|
// Initialize the folder name field.
|
|
//
|
|
if (GetWindowsMajorVersion() > 4)
|
|
{
|
|
dwStyle = SS_PATHELLIPSIS;
|
|
}
|
|
|
|
TCHAR_Fill(achDirectory, TEXT('\0'), MAX_PATH);
|
|
|
|
StrCharCopyN(achDirectory, pS->acDirectory, MAX_PATH);
|
|
|
|
mscModifyToFit(GetDlgItem(hDlg, FOLDER_NAME), achDirectory, dwStyle);
|
|
|
|
SetDlgItemText(hDlg, FOLDER_NAME, achDirectory);
|
|
|
|
/* Set the focus to the file name */
|
|
SetFocus(GetDlgItem(hDlg, FNAME_EDIT));
|
|
nReturn = FALSE;
|
|
}
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
mscResetComboBox(GetDlgItem(hDlg, PROTO_COMBO));
|
|
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_SEND:
|
|
case IDOK:
|
|
pS = (SDS *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
assert(pS);
|
|
if (pS == NULL)
|
|
{
|
|
break;
|
|
}
|
|
|
|
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)
|
|
{
|
|
nXferSendReturn = XFR_IN_PROGRESS;
|
|
}
|
|
else if(cnctQueryStatus(sessQueryCnctHdl(hSession))
|
|
!= CNCT_STATUS_TRUE && nId == IDC_PB_SEND)
|
|
{
|
|
//
|
|
// We are currently not connected (loss of carrier),
|
|
// so disable the Recieve button. REV: 9/7/2001
|
|
//
|
|
nXferSendReturn = XFR_NO_CARRIER;
|
|
mscMessageBeep(MB_ICONHAND);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PB_SEND), FALSE);
|
|
}
|
|
else
|
|
{
|
|
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);
|
|
|
|
if (pX != (XFR_PROTOCOL *)0)
|
|
{
|
|
GetDlgItemText(hDlg, PROTO_COMBO, acBuffer, FNAME_LEN);
|
|
|
|
for (nIndex = 0; pX[nIndex].nProtocol != 0; nIndex += 1)
|
|
{
|
|
if (StrCharCmp(acBuffer, pX[nIndex].acName) == 0)
|
|
{
|
|
pP->nSndProtocol = pX[nIndex].nProtocol;
|
|
break;
|
|
}
|
|
}
|
|
free(pX);
|
|
pX = NULL;
|
|
}
|
|
|
|
GetDlgItemText(hDlg, FNAME_EDIT, acBuffer, FNAME_LEN);
|
|
|
|
fileFinalizeName(
|
|
acBuffer,
|
|
pS->acDirectory,
|
|
acBuffer,
|
|
FNAME_LEN);
|
|
|
|
/* Split the name and the directory */
|
|
pszStr = StrCharFindLast(acBuffer, TEXT('\\'));
|
|
if (pszStr)
|
|
{
|
|
*pszStr++ = TEXT('\0');
|
|
}
|
|
|
|
if (nId == IDC_PB_SEND)
|
|
{
|
|
int nIdx = 0;
|
|
|
|
hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
|
|
|
|
nIndex = 0;
|
|
pszArray = NULL;
|
|
|
|
fileBuildFileList((void **)&pszArray,
|
|
&nIndex,
|
|
pszStr,
|
|
FALSE,
|
|
acBuffer);
|
|
|
|
nIdx = nIndex;
|
|
|
|
if (nIndex == 0)
|
|
{
|
|
if (sessQuerySound(hSession))
|
|
{
|
|
mscMessageBeep(MB_ICONHAND);
|
|
}
|
|
|
|
LoadString(glblQueryDllHinst(),
|
|
IDS_ER_XFER_NO_FILE,
|
|
acBuffer,
|
|
FNAME_LEN);
|
|
|
|
TimedMessageBox(hDlg,
|
|
acBuffer,
|
|
NULL,
|
|
MB_OK | MB_ICONEXCLAMATION,
|
|
sessQueryTimeout(hSession)
|
|
);
|
|
|
|
if (pszArray)
|
|
{
|
|
free(pszArray);
|
|
pszArray = NULL;
|
|
}
|
|
break;
|
|
}
|
|
|
|
while (nIndex-- > 0)
|
|
{
|
|
nXferSendReturn = xfrSendAddToList(hXfer, pszArray[nIndex]);
|
|
free(pszArray[nIndex]);
|
|
pszArray[nIndex] = NULL;
|
|
|
|
if (nXferSendReturn == XFR_NO_MEMORY)
|
|
{
|
|
//
|
|
// Make sure to free the rest of the file
|
|
// list when a memory error is returned
|
|
// from xfrSendAddToList(). REV: 2/4/2002
|
|
//
|
|
while (--nIndex >= 0)
|
|
{
|
|
if (pszArray[nIndex])
|
|
{
|
|
free(pszArray[nIndex]);
|
|
pszArray[nIndex] = NULL;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (pszArray)
|
|
{
|
|
while (--nIdx >= 0)
|
|
{
|
|
if (pszArray[nIdx])
|
|
{
|
|
free(pszArray[nIdx]);
|
|
pszArray[nIdx] = NULL;
|
|
}
|
|
}
|
|
|
|
free(pszArray);
|
|
pszArray = NULL;
|
|
}
|
|
|
|
if (nXferSendReturn == XFR_NO_MEMORY)
|
|
{
|
|
//
|
|
// There was a memory error, so free the
|
|
// file list and exit here.
|
|
//
|
|
XD_TYPE *pXD_Type;
|
|
|
|
// pXD_Type = (XD_TYPE *)sessQueryXferHdl(hSession);
|
|
pXD_Type = (XD_TYPE *)hXfer;
|
|
|
|
if (pXD_Type != (XD_TYPE *)0)
|
|
{
|
|
/* Clear list */
|
|
for (nIndex = pXD_Type->nSendListCount - 1; nIndex >=0; nIndex--)
|
|
{
|
|
if (pXD_Type->acSendNames[nIndex])
|
|
{
|
|
free(pXD_Type->acSendNames[nIndex]);
|
|
pXD_Type->acSendNames[nIndex] = NULL;
|
|
}
|
|
pXD_Type->nSendListCount = nIndex;
|
|
}
|
|
|
|
free(pXD_Type->acSendNames);
|
|
pXD_Type->acSendNames = NULL;
|
|
pXD_Type->nSendListCount = 0;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
SetCursor(hCursor);
|
|
|
|
nXferSendReturn = xfrSendListSend(hXfer);
|
|
}
|
|
}
|
|
|
|
//
|
|
// 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 (nXferSendReturn == XFR_IN_PROGRESS)
|
|
{
|
|
TCHAR acMessage[256];
|
|
|
|
if (sessQuerySound(hSession))
|
|
{
|
|
mscMessageBeep(MB_ICONHAND);
|
|
}
|
|
|
|
LoadString(glblQueryDllHinst(),
|
|
IDS_ER_XFER_SEND_IN_PROCESS,
|
|
acMessage,
|
|
sizeof(acMessage) / sizeof(TCHAR));
|
|
|
|
TimedMessageBox(sessQueryHwnd(hSession),
|
|
acMessage,
|
|
NULL,
|
|
MB_OK | MB_ICONEXCLAMATION,
|
|
sessQueryTimeout(hSession));
|
|
}
|
|
else if(nXferSendReturn == XFR_NO_CARRIER)
|
|
{
|
|
//
|
|
// We are currently not connected (loss of carrier),
|
|
// so disable the Send button.
|
|
//
|
|
mscMessageBeep(MB_ICONHAND);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PB_SEND), FALSE);
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
* Do whatever saving is necessary
|
|
*/
|
|
xfrSetParameters(hXfer, (VOID *)pP);
|
|
|
|
if (mscIsDirectory(acBuffer))
|
|
{
|
|
filesSetSendDirectory(sessQueryFilesDirsHdl(hSession),
|
|
acBuffer);
|
|
}
|
|
|
|
/* Free the storeage */
|
|
EndDialog(hDlg, TRUE);
|
|
}
|
|
|
|
break;
|
|
|
|
case XFER_CNCT:
|
|
if(nXferSendReturn == XFR_NO_CARRIER)
|
|
{
|
|
//
|
|
// We are currently not connected (loss of carrier),
|
|
// so disable the Send button.
|
|
//
|
|
mscMessageBeep(MB_ICONHAND);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PB_SEND), FALSE);
|
|
}
|
|
else
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PB_SEND), TRUE);
|
|
}
|
|
break;
|
|
|
|
case FNAME_EDIT:
|
|
// This dialog would crash if the user pressed 'Send' and no
|
|
// filename was specified. Ideally, the 'Send' button should
|
|
// be disabled until we have a filename. - cab:12/06/96
|
|
//
|
|
if ( nNtfy == EN_UPDATE )
|
|
{
|
|
pS = (SDS *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
hSession = pS->hSession;
|
|
|
|
// Are we connected? If not, leave the send button disabled.
|
|
//
|
|
if ( cnctQueryStatus(sessQueryCnctHdl(hSession))
|
|
== CNCT_STATUS_TRUE )
|
|
{
|
|
// Get the number of characters in the edit box.
|
|
//
|
|
nChars = (int)SendMessage(GetDlgItem(hDlg, FNAME_EDIT),
|
|
EM_LINELENGTH, 0, 0);
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PB_SEND), nChars != 0);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
|
|
case BROWSE_BTN:
|
|
pS = (SDS *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
LoadString(glblQueryDllHinst(),
|
|
IDS_SND_DLG_FILE,
|
|
acTitle,
|
|
sizeof(acTitle) / sizeof(TCHAR));
|
|
|
|
resLoadFileMask(glblQueryDllHinst(),
|
|
IDS_CMM_ALL_FILES1,
|
|
1,
|
|
acList,
|
|
sizeof(acList) / sizeof(TCHAR));
|
|
|
|
pszRet = gnrcFindFileDialog(hDlg,
|
|
acTitle,
|
|
pS->acDirectory,
|
|
acList);
|
|
|
|
if (pszRet != NULL)
|
|
{
|
|
DWORD dwStyle = SS_WORDELLIPSIS;
|
|
TCHAR achDirectory[MAX_PATH];
|
|
|
|
TCHAR_Fill(achDirectory, TEXT('\0'), MAX_PATH);
|
|
|
|
SetDlgItemText(hDlg, FNAME_EDIT, pszRet);
|
|
|
|
mscStripName(pszRet);
|
|
|
|
pszStr = StrCharLast(pszRet);
|
|
|
|
// Remove the trailing backslash from the name
|
|
// returned from mscStripName. Leave it on
|
|
// in the case of a root directory specification.
|
|
//
|
|
if (pszStr > pszRet + (3 * sizeof(TCHAR)) )
|
|
{
|
|
if (pszStr && ( *pszStr == TEXT('\\') || *pszStr == TEXT('/')))
|
|
*pszStr = TEXT('\0');
|
|
}
|
|
|
|
if (GetWindowsMajorVersion() > 4)
|
|
{
|
|
dwStyle = SS_PATHELLIPSIS;
|
|
}
|
|
|
|
mscModifyToFit(GetDlgItem(hDlg, FOLDER_NAME), pszRet, dwStyle);
|
|
SetDlgItemText(hDlg, FOLDER_NAME, pszRet);
|
|
|
|
free(pszRet);
|
|
pszRet = NULL;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
nReturn = FALSE;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
nReturn = FALSE;
|
|
break;
|
|
}
|
|
|
|
return nReturn;
|
|
}
|