Leaked source code of windows server 2003
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.
 
 
 
 
 
 

1892 lines
42 KiB

/* File: D:\WACKER\tdll\xfer_msc.c (Created: 28-Dec-1993)
*
* Copyright 1994 by Hilgraeve Inc. -- Monroe, MI
* All rights reserved
*
* $Revision: 24 $
* $Date: 5/15/02 4:38p $
*/
#include <windows.h>
#pragma hdrstop
#include <term\res.h>
#include "stdtyp.h"
#include "session.h"
#include "mc.h"
#include "tdll.h"
#include "htchar.h"
#include "cloop.h"
#include "tdll\assert.h"
#include "globals.h"
#include "errorbox.h"
#include "file_msc.h"
#include "xfdspdlg.h"
#include "sf.h"
#include "sess_ids.h"
#include "misc.h"
#include "xfer\xfer.h"
#include "xfer\xfer.hh"
#include "xfer_msc.h"
#include "xfer_msc.hh"
#include "xfer\xfer_tsc.h"
void xferCancelAutoStart(HSESSION hSession, long lProtocol);
static void xfrInitDspStruct(HXFER hXfer);
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
*
* X F E R _ M S C . C
*
* This module contains various functions that are used in this dll in order
* to implement transfers. While most of the code exists in the dialog procs
* for the Transfer Send and Transfer Receive dialogs, some is here to make
* things a little bit easier.
*
*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
#define LIST_CHUNK 2
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* CreateXferHdl
*
* DESCRIPTION:
* This function creates an "empty" Xfer handle. It has stuff in it. It
* just didn't come from the user.
*
* PARAMETERS:
* hSession -- the session handle
*
* RETURNS:
* A blinded pointer to the Xfer handle.
*
*/
HXFER CreateXferHdl(const HSESSION hSession)
{
int nRet;
XD_TYPE *pX;
pX = (XD_TYPE *)malloc(sizeof(XD_TYPE));
assert(pX);
if (pX)
{
memset(pX, 0, sizeof(XD_TYPE));
nRet = InitializeXferHdl(hSession, (HXFER)pX);
if (nRet != 0)
{
goto CXHexit;
}
pX->nSendListCount = 0;
pX->acSendNames = NULL;
// Make sure to set the Transfer direction to none. REV: 02/14/2001
pX->nDirection = XFER_NONE;
}
return (HXFER)pX;
CXHexit:
if (pX)
{
if (pX->xfer_params)
{
free(pX->xfer_params);
pX->xfer_params = NULL;
}
if (pX->xfer_old_params)
{
free(pX->xfer_old_params);
pX->xfer_old_params = NULL;
}
free(pX);
pX = NULL;
}
return (HXFER)0;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* InitializeXferHdl
*
* DESCRIPTION:
* This function initializes the Xfer handle to a known state.
*
* PARAMETERS:
* hSession -- the session handle
* hXfer -- the Xfer handle
*
* RETURNS:
* ZERO if everything is OK, otherwise an error code.
*
*/
INT InitializeXferHdl(const HSESSION hSession, HXFER hXfer)
{
XD_TYPE *pX;
pX = (XD_TYPE *)hXfer;
assert(pX);
if (pX == 0)
{
return -2;
}
else
{
int nIdx;
if (pX->xfer_params)
{
free(pX->xfer_params);
pX->xfer_params = NULL;
}
if (pX->xfer_old_params)
{
free(pX->xfer_old_params);
pX->xfer_old_params = NULL;
}
//
// We don't want to clear out the xfer_proto_params
// since they do not change, but since memset is used
// below, we must. REV: 4/10/2002
//
if (pX->xfer_proto_params)
{
/*
* Loop through the protocol specific stuff
*/
for (nIdx = SFID_PROTO_PARAMS_END - SFID_PROTO_PARAMS; nIdx >= 0; nIdx--)
{
if (pX->xfer_proto_params[nIdx])
{
free(pX->xfer_proto_params[nIdx]);
pX->xfer_proto_params[nIdx] = NULL;
}
}
}
if (pX->acSendNames)
{
int nIdx;
/* Clear list */
for (nIdx = pX->nSendListCount - 1; nIdx >= 0; nIdx--)
{
if (pX->acSendNames[nIdx])
{
free(pX->acSendNames[nIdx]);
pX->acSendNames[nIdx] = NULL;
}
pX->nSendListCount = nIdx;
}
free(pX->acSendNames);
pX->acSendNames = NULL;
pX->nSendListCount = 0;
}
if (pX->pXferStuff)
{
free(pX->pXferStuff);
pX->pXferStuff = NULL;
}
//
// TODO:REV 4/10/2002 This should be put into a function to
// initialize the structure instead of just using memset.
//
memset(pX, 0, sizeof(XD_TYPE));
pX->hSession = hSession;
pX->nBps = 0;
pX->nOldBps = pX->nBps;
xfrQueryParameters(sessQueryXferHdl(hSession), &pX->xfer_params);
if (pX->xfer_params == (SZ_TYPE *)0)
return -1;
pX->xfer_old_params = malloc(pX->xfer_params->nSize);
if (pX->xfer_old_params == (SZ_TYPE *)0)
{
free(pX->xfer_params);
pX->xfer_params = (SZ_TYPE *)0;
return -1;
}
MemCopy(pX->xfer_old_params, pX->xfer_params, pX->xfer_params->nSize);
pX->nSendListCount = 0;
pX->acSendNames = NULL;
// Make sure to set the Transfer direction to none. REV: 02/14/2001
pX->nDirection = XFER_NONE;
}
return 0;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* LoadXferHdl
*
* DESCRIPTION:
* This function loads data from the session file into the Xfer handle.
*
* PARAMETERS:
* hSession -- the session handle
*
* RETURNS:
* ZERO if everything is OK, otherwise an error code.
*
*/
INT LoadXferHdl(HXFER hXfer)
{
long lSize;
XD_TYPE *pX;
SZ_TYPE *pZ;
pX = (XD_TYPE *)hXfer;
if (pX)
{
InitializeXferHdl(pX->hSession, hXfer);
/*
* Try and load up the general parameters first
*/
pZ = (SZ_TYPE *)0;
#if FALSE
/* removed as per MRW request */
sfdGetDataBlock(pX->hSession,
SFID_XFER_PARAMS,
(void **)&pZ);
#endif
pZ = NULL;
lSize = 0;
sfGetSessionItem(sessQuerySysFileHdl(pX->hSession),
SFID_XFER_PARAMS,
&lSize,
NULL);
if (lSize > 0)
{
size_t lXfrParamsStructSize = sizeof(XFR_PARAMS);
assert((size_t)lSize == lXfrParamsStructSize);
if ((size_t)lSize < lXfrParamsStructSize)
{
pZ = malloc(lXfrParamsStructSize);
if (pZ)
{
memset(pZ, 0, lXfrParamsStructSize);
}
}
else
{
pZ = malloc(lSize);
}
if (pZ)
{
sfGetSessionItem(sessQuerySysFileHdl(pX->hSession),
SFID_XFER_PARAMS,
&lSize,
pZ);
}
}
if (pZ)
{
if (pX->xfer_params)
{
free(pX->xfer_params);
pX->xfer_params = NULL;
}
pX->xfer_params = pZ;
if (pX->xfer_old_params)
{
free(pX->xfer_old_params);
pX->xfer_old_params = NULL;
}
pX->xfer_old_params = malloc(lSize);
MemCopy(pX->xfer_old_params, pX->xfer_params, lSize);
}
/*
* Try and get the Bps/Cps flag
*/
lSize = sizeof(pX->nBps);
sfGetSessionItem(sessQuerySysFileHdl(pX->hSession),
SFID_XFR_USE_BPS,
&lSize,
&pX->nBps);
pX->nOldBps = pX->nBps;
}
return 0;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* SaveXferHdl
*
* DESCRIPTION:
* This function is called to save all the settings in the Xfer handle out
* to the session file.
*
* PARAMETERS:
* hSession -- the session handle
*
* RETURNS:
* ZERO if everything is OK, otherwise an error code.
*
*/
INT SaveXferHdl(HXFER hXfer)
{
int nSize = 0;
XD_TYPE *pX;
SZ_TYPE *pZ;
pX = (XD_TYPE *)hXfer;
if (pX)
{
/*
* Save the generic transfer stuff
*/
pZ = pX->xfer_params;
if (pZ)
{
nSize = pZ->nSize;
}
#if FALSE
/* removed as per MRW request */
sfdPutDataBlock(pX->hSession,
SFID_XFER_PARAMS,
pX->xfer_params);
#endif
if (memcmp(pX->xfer_old_params, pX->xfer_params, nSize) != 0)
{
sfPutSessionItem(sessQuerySysFileHdl(pX->hSession),
SFID_XFER_PARAMS,
nSize,
pZ);
}
/*
* Save the Bps/Cps flag
*/
if (pX->nBps != pX->nOldBps)
{
sfPutSessionItem(sessQuerySysFileHdl(pX->hSession),
SFID_XFR_USE_BPS,
sizeof(pX->nBps),
&pX->nBps);
pX->nOldBps = pX->nBps;
}
}
return 0;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
*
* DESCRIPTION:
*
* PARAMETERS:
*
* RETURNS:
*
*/
INT DestroyXferHdl(HXFER hXfer)
{
int nIndex;
XD_TYPE *pX = (XD_TYPE *)hXfer;
if (pX)
{
if (pX->xfer_params)
{
free(pX->xfer_params);
pX->xfer_params = NULL;
}
if (pX->xfer_old_params)
{
free(pX->xfer_old_params);
pX->xfer_old_params = NULL;
}
if (pX->xfer_proto_params)
{
/*
* Loop through the protocol specific stuff
*/
for (nIndex = SFID_PROTO_PARAMS_END - SFID_PROTO_PARAMS; nIndex >= 0; nIndex--)
{
if (pX->xfer_proto_params[nIndex])
{
free(pX->xfer_proto_params[nIndex]);
pX->xfer_proto_params[nIndex] = NULL;
}
}
}
/*
* Free up stuff as necessary
*/
if (pX->acSendNames)
{
for (nIndex = pX->nSendListCount - 1; nIndex >= 0; nIndex--)
{
if (pX->acSendNames[nIndex])
{
free(pX->acSendNames[nIndex]);
pX->acSendNames[nIndex] = NULL;
}
pX->nSendListCount = nIndex;
}
free(pX->acSendNames);
pX->acSendNames = NULL;
pX->nSendListCount = 0;
}
if (pX->pXferStuff)
{
free(pX->pXferStuff);
pX->pXferStuff = NULL;
}
free(pX);
pX = NULL;
}
return 0;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrSetDataPointer
*
* DESCRIPTION:
* This function is called from the transfer routines in the transfer dll
* to save the pointer to the parameter block that was passed to them.
*
* PARAMETERS:
* hSession -- the session handle
* pData -- the pointer to be saved
*
* RETURNS:
* Nothing.
*
*/
VOID WINAPI xfrSetDataPointer(HXFER hXfer, VOID *pData)
{
XD_TYPE *pH;
// pH = (XD_TYPE *)sessQueryXferHdl(hSession);
pH = (XD_TYPE *)hXfer;
assert(pH);
if (pH)
{
pH->pXferStuff = pData;
}
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrQueryDataPointer
*
* DESCRIPTION:
* This function is called from the transfer routines in the transfer dll to
* recover the saved data pointer to the parameter block that was passed to
* them.
*
* PARAMETERS:
* hSession -- the session handle
* ppData -- pointer to where to put the pointer
*
* RETURNS:
* Nothing.
*
*/
VOID WINAPI xfrQueryDataPointer(HXFER hXfer, VOID **ppData)
{
XD_TYPE *pH;
// pH = (XD_TYPE *)sessQueryXferHdl(hSession);
pH = (XD_TYPE *)hXfer;
assert(pH);
if (pH)
{
*ppData = pH->pXferStuff;
}
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrQueryParameters
*
* DESCRIPTION:
* This function returns a pointer to the default transfer parameters. It
* gets the pointer to the block from the session handle and passed the
* the pointer to the caller.
*
* PARAMETERS:
* hSession -- the session handle
* ppData -- pointer to where the pointer should be saved
*
* RETURNS:
* ZERO if everything is OK, otherwise an error code
*
*/
INT WINAPI xfrQueryParameters(HXFER hXfer, VOID **ppData)
{
INT nRet = 0;
XD_TYPE *pH = (XD_TYPE *)hXfer;
XFR_PARAMS *pX = NULL;
if (ppData == NULL)
{
assert(FALSE);
nRet = XFR_BAD_PARAMETER;
}
else if (pH && pH->xfer_params)
{
pX = (XFR_PARAMS *)pH->xfer_params;
}
else
{
/* Build a default one */
pX = (XFR_PARAMS *)malloc(sizeof(XFR_PARAMS));
assert(pX);
if (pX == (XFR_PARAMS *)0)
{
assert(FALSE);
nRet = XFR_NO_MEMORY;
}
else
{
pX->nSize = sizeof(XFR_PARAMS);
/* Initialize the defaults */
#if defined(INCL_ZMODEM_CRASH_RECOVERY)
pX->nRecProtocol = XF_ZMODEM_CR;
pX->fSavePartial = TRUE;
#else // defined(INCL_ZMODEM_CRASH_RECOVERY)
pX->nRecProtocol = XF_ZMODEM;
pX->fSavePartial = FALSE;
#endif // defined(INCL_ZMODEM_CRASH_RECOVERY)
pX->fUseFilenames = TRUE;
pX->fUseDateTime = TRUE;
pX->fUseDirectory = FALSE;
pX->nRecOverwrite = XFR_RO_REN_SEQ;
pX->nSndProtocol = XF_ZMODEM_CR;
pX->fChkSubdirs = FALSE;
pX->fIncPaths = FALSE;
}
}
if (nRet == 0)
{
if (hXfer != NULL && pX != NULL)
{
xfrSetParameters(hXfer, (VOID *)pX);
}
if (*ppData != pX)
{
if (*ppData)
{
free(*ppData);
*ppData = NULL;
}
*ppData = (VOID *)pX;
}
}
return nRet;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrSetParameters
*
* DESCRIPTION:
* This function is called to change the default transfer parameters. If
* the parameter block returned is different from the default block, the
* settings are copied. If the block is the same, then they don't need to
* be. Please note that the previous function is exported and can be called
* to get the parameters, but this function is not exported and cannot be
* accessed externally.
*
* PARAMETERS:
* hSession -- the session handle
* pData -- pointer to the new parameter block
*
* RETURNS:
* Nothing.
*
*/
void xfrSetParameters(HXFER hXfer, VOID *pData)
{
XD_TYPE *pX;
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
if (pX)
{
/* TODO: check that we really need to change it */
if (pX->xfer_params)
{
if (pX->xfer_params != (SZ_TYPE *)pData)
{
free(pX->xfer_params);
pX->xfer_params = NULL;
}
}
pX->xfer_params = (SZ_TYPE *)pData;
}
return;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
*
* DESCRIPTION:
*
* PARAMETERS:
*
* RETURNS:
*
*/
int WINAPI xfrQueryProtoParams(HXFER hXfer, int nId, VOID **ppData)
{
int nRet = 0;
int nLimit = SFID_PROTO_PARAMS_END - SFID_PROTO_PARAMS;
XD_TYPE *pX = NULL;
if ((nId < 0) || (nId > nLimit))
{
nRet = XFR_BAD_PARAMETER;
}
else
{
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
assert(pX);
if (pX)
{
*ppData = (VOID *)pX->xfer_proto_params[nId];
}
}
return nRet;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
*
* DESCRIPTION:
*
* PARAMETERS:
*
* RETURNS:
*
*/
void WINAPI xfrSetProtoParams(HXFER hXfer, int nId, VOID *pData)
{
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrSendAddToList
*
* DESCRIPTION:
* This function is called to add a file to the list of files that are being
* ququed up to send to whatever system we are connected to.
*
* PARAMETERS:
* hSession -- the session handle
* pszFile -- the file name, see note below
*
* NOTE:
* If the second parameter, "pszFile" is NULL, this function acts as a
* empty or clear list function.
*
* RETURNS:
* ZERO if everything is OK, otherwise an error code.
*
*/
int xfrSendAddToList(HXFER hXfer, LPCTSTR pszFile)
{
int nRet = 0;
XD_TYPE *pX;
LPTSTR pszName;
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
assert(pX);
if (pX)
{
if (pszFile == NULL)
{
int nIdx;
assert(FALSE);
/* Clear list */
for (nIdx = pX->nSendListCount - 1; nIdx >=0; nIdx--)
{
if (pX->acSendNames[nIdx])
{
free(pX->acSendNames[nIdx]);
pX->acSendNames[nIdx] = NULL;
}
pX->nSendListCount = nIdx;
}
free(pX->acSendNames);
pX->acSendNames = NULL;
pX->nSendListCount = 0;
}
else
{
/* Do we have enough space on the list ? */
if (pX->nSendListCount == 0)
{
/* Allocate the initial chunk */
if (pX->acSendNames)
{
int nIdx;
assert(FALSE);
//
// Make sure to clear out all the names in the list.
//
for (nIdx = pX->nSendListCount; nIdx >= 0; nIdx--)
{
if (pX->acSendNames[nIdx])
{
free(pX->acSendNames[nIdx]);
pX->acSendNames[nIdx] = NULL;
}
}
free(pX->acSendNames);
pX->acSendNames = NULL;
}
pX->acSendNames = malloc(sizeof(TCHAR *) * LIST_CHUNK);
if (pX->acSendNames == NULL)
{
nRet = XFR_NO_MEMORY;
goto SATLexit;
}
}
else if (((pX->nSendListCount + 1) % LIST_CHUNK) == 0)
{
/* Need a bigger chunk */
TCHAR **pTempacSendNames = NULL;
pTempacSendNames =
(TCHAR**)realloc(pX->acSendNames,
(unsigned int)sizeof(TCHAR *) * (unsigned int)((pX->nSendListCount + 1 + LIST_CHUNK)));
if (pTempacSendNames == NULL)
{
nRet = XFR_NO_MEMORY;
goto SATLexit;
}
else
{
pX->acSendNames = pTempacSendNames;
}
}
pX->acSendNames[pX->nSendListCount] = NULL;
pX->nSendListCount++;
/* Add item to list */
pszName = malloc(StrCharGetByteCount(pszFile) + 1);
if (pszName == NULL)
{
nRet = XFR_NO_MEMORY;
goto SATLexit;
}
StrCharCopy(pszName, pszFile);
pX->acSendNames[pX->nSendListCount - 1] = pszName;
}
}
SATLexit:
return nRet;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrSendListSend
*
* DESCRIPTION:
* This function is called to send the files that were previously placed on
* the send list. The list is cleared after the operation.
*
* PARAMETERS:
* hSession -- the session handle
*
* RETURNS:
* ZERO if everything is OK, otherwise an error code.
*
*/
int xfrSendListSend(HXFER hXfer)
{
HSESSION hSession;
int nRet = 0;
int nIdx;
long lSize;
long lTmp;
LPTSTR pszName;
XD_TYPE *pX;
XFR_SEND *pSend;
HCLOOP hCL;
HWND toolbar;
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
assert(pX);
if (pX != NULL)
{
hSession = pX->hSession;
assert(hSession);
if (hSession == NULL)
{
return XFR_BAD_PARAMETER;
}
//
// Return an error if a file transfer is currently
// in progress. REV: 08/06/2001.
//
if (pX->nDirection != XFER_NONE)
{
nRet = XFR_IN_PROGRESS;
return nRet;
}
//
// Return an error if not currently connected due to a
// loss of carrier. REV: 9/7/2001
//
if (pX->nCarrierLost == TRUE)
{
nRet = XFR_NO_CARRIER;
return nRet;
}
pSend = malloc(sizeof(XFR_SEND));
assert(pSend);
if (pSend == NULL)
{
nRet = XFR_NO_MEMORY;
goto SLSexit;
}
memset(pSend, 0, sizeof(XFR_SEND));
/*
* Fill in the single stuff
*/
pSend->pParams = (XFR_PARAMS *)pX->xfer_params;
pSend->nProtocol = pSend->pParams->nSndProtocol;
pSend->pProParams = (VOID *)pX->xfer_proto_params[pSend->nProtocol];
pSend->nCount = pX->nSendListCount;
pSend->nIndex = 0;
/* TODO: initialize stuff like the templates and status/event bases */
/*
* Do the file specific stuff
*/
pSend->pList = malloc(sizeof(XFR_LIST) * pSend->nCount);
assert(pSend->pList);
if (pSend->pList == NULL)
{
nRet = XFR_NO_MEMORY;
goto SLSexit;
}
for (lSize = 0, nIdx = 0; nIdx < pSend->nCount; nIdx += 1)
{
pszName = pX->acSendNames[nIdx];
lTmp = 0;
GetFileSizeFromName(pszName, &lTmp);
pSend->pList[nIdx].lSize = lTmp;
lSize += lTmp;
pSend->pList[nIdx].pszName = pszName;
}
/* These no longer belong to this side */
//
// The filename buffers have been moved to the list,
// so the SendNames structure is no longer pointing to
// memory that is to be freed by pX. REV: 4/16/2002
//
for (nIdx = pX->nSendListCount - 1; nIdx >=0; nIdx--)
{
if (pX->acSendNames[nIdx])
{
pX->acSendNames[nIdx] = NULL;
}
pX->nSendListCount--;
}
free(pX->acSendNames);
pX->acSendNames = NULL;
pX->nSendListCount = 0;
pX->nDirection = XFER_SEND;
pSend->lSize = lSize;
xfrInitDspStruct(hXfer);
switch (pSend->nProtocol)
{
#if FALSE
case XF_HYPERP:
pX->nLgSingleTemplate = IDD_XFERHPRSNDSTANDARDSINGLE;
pX->nLgMultiTemplate = IDD_XFERHPRSNDSTANDARDDOUBLE;
pX->nStatusBase = IDS_TM_SS_ZERO;
pX->nEventBase = IDS_TM_SE_ZERO;
break;
#endif
case XF_KERMIT:
pX->nLgSingleTemplate = IDD_XFERKRMSNDSTANDARDSINGLE;
pX->nLgMultiTemplate = IDD_XFERKRMSNDSTANDARDDOUBLE;
pX->nStatusBase = pX->nEventBase = IDS_TM_K_ZERO;
break;
case XF_CSB:
default:
assert(FALSE);
case XF_ZMODEM:
case XF_ZMODEM_CR:
pX->nLgSingleTemplate = IDD_XFERZMDMSNDSTANDARDSINGLE;
pX->nLgMultiTemplate = IDD_XFERZMDMSNDSTANDARDDOUBLE;
pX->nStatusBase = IDS_TM_SZ_ZERO;
pX->nEventBase = IDS_TM_SZ_ZERO;
break;
case XF_XMODEM:
case XF_XMODEM_1K:
pX->nLgSingleTemplate = IDD_XFERXMDMSNDSTANDARDDISPLAY;
pX->nLgMultiTemplate = pX->nLgSingleTemplate;
pX->nStatusBase = pX->nEventBase = IDS_TM_RX_ZERO;
break;
case XF_YMODEM:
case XF_YMODEM_G:
pX->nLgSingleTemplate = IDD_XFERYMDMSNDSTANDARDSINGLE;
pX->nLgMultiTemplate = IDD_XFERYMDMSNDSTANDARDDOUBLE;
pX->nStatusBase = pX->nEventBase = IDS_TM_RX_ZERO;
break;
}
toolbar = sessQueryHwndToolbar( hSession );
ToolbarEnableButton( toolbar, IDM_ACTIONS_SEND, FALSE );
ToolbarEnableButton( toolbar, IDM_ACTIONS_RCV, FALSE );
pX->pXferStuff = (VOID *)pSend;
pX->nExpanded = FALSE;
pX->hwndXfrDisplay = DoModelessDialog(glblQueryDllHinst(),
MAKEINTRESOURCE(pX->nLgSingleTemplate),
sessQueryHwnd(hSession),
XfrDisplayDlg,
(LPARAM)hSession);
/*
* Now get it going
*/
hCL = sessQueryCLoopHdl(hSession);
if (hCL)
{
// DbgOutStr("Tell CLoop TRANSFER_READY\r\n", 0,0,0,0,0);
CLoopControl(hCL, CLOOP_SET, CLOOP_TRANSFER_READY);
}
}
SLSexit:
if (nRet != 0)
{
/* Clean up before we leave */
if (pSend != NULL)
{
for (nIdx = pSend->nCount - 1; nIdx >= 0; nIdx--)
{
if (pSend->pList[nIdx].pszName)
{
free(pSend->pList[nIdx].pszName);
pSend->pList[nIdx].pszName = NULL;
}
}
free(pSend->pList);
pSend->pList = NULL;
free(pSend);
pSend = NULL;
}
}
return nRet;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrRecvStart
*
* DESCRIPTION:
* This function is called when we think we have everything that we need
* in order to start a Transfer Receive operation.
*
* PARAMETERS:
* hSession -- the session handle
* pszDir -- a string with a directory in it
* pszName -- a string with a file name in it (maybe)
*
* RETURNS:
* ZERO if everything is OK, otherwise an error code.
*
*/
int xfrRecvStart(HXFER hXfer, LPCTSTR pszDir, LPCTSTR pszName)
{
HSESSION hSession;
int nRet = 0;
XD_TYPE *pX;
XFR_RECEIVE *pRec;
HCLOOP hCL;
HWND toolbar;
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
assert(pX);
if (pX)
{
hSession = pX->hSession;
assert(hSession);
if (hSession == NULL)
{
return XFR_BAD_PARAMETER;
}
//
// Return an error if a file transfer is currently
// in progress. REV: 08/06/2001.
//
if (pX->nDirection != XFER_NONE)
{
nRet = XFR_IN_PROGRESS;
return nRet;
}
//
// Return an error if not currently connected due to a
// loss of carrier. REV: 9/7/2001
//
if (pX->nCarrierLost == TRUE)
{
nRet = XFR_NO_CARRIER;
return nRet;
}
pRec = (XFR_RECEIVE *)malloc(sizeof(XFR_RECEIVE));
assert(pRec);
if (pRec == (XFR_RECEIVE *)0)
{
nRet = XFR_NO_MEMORY;
goto RSexit;
}
memset(pRec, 0, sizeof(XFR_RECEIVE));
pRec->pParams = (XFR_PARAMS *)pX->xfer_params;
pRec->nProtocol = pRec->pParams->nRecProtocol;
pRec->pProParams = (VOID *)pX->xfer_proto_params[pRec->nProtocol];
pRec->pszDir = malloc(StrCharGetByteCount(pszDir) + 1);
if (pRec->pszDir == (LPTSTR)0)
{
nRet = XFR_NO_MEMORY;
goto RSexit;
}
StrCharCopy(pRec->pszDir, pszDir);
pRec->pszName = malloc(StrCharGetByteCount(pszName) + 1);
if (pRec->pszName == (LPTSTR)0)
{
nRet = XFR_NO_MEMORY;
goto RSexit;
}
StrCharCopy(pRec->pszName, pszName);
xfrInitDspStruct(hXfer);
switch (pRec->nProtocol)
{
#if FALSE
case XF_HYPERP:
pX->nLgSingleTemplate = IDD_XFERHPRRECSTANDARDSINGLE;
pX->nLgMultiTemplate = IDD_XFERHPRRECSTANDARDDOUBLE;
pX->nStatusBase = IDS_TM_RS_ZERO;
pX->nEventBase = IDS_TM_RE_ZERO;
break;
#endif
case XF_KERMIT:
pX->nLgSingleTemplate = IDD_XFERKRMRECSTANDARDDISPLAY;
pX->nLgMultiTemplate = pX->nLgSingleTemplate;
pX->nStatusBase = pX->nEventBase = IDS_TM_K_ZERO;
break;
case XF_CSB:
default:
assert(FALSE);
case XF_ZMODEM:
case XF_ZMODEM_CR:
pX->nLgSingleTemplate = IDD_XFERZMDMRECSTANDARDSINGLE;
pX->nLgMultiTemplate = IDD_XFERZMDMRECSTANDARDDOUBLE;
pX->nStatusBase = IDS_TM_SZ_ZERO;
pX->nEventBase = IDS_TM_SZ_ZERO;
break;
case XF_XMODEM:
case XF_XMODEM_1K:
pX->nLgSingleTemplate = IDD_XFERXMDMRECSTANDARDDISPLAY;
pX->nLgMultiTemplate = pX->nLgSingleTemplate;
pX->nStatusBase = pX->nEventBase = IDS_TM_RX_ZERO;
break;
case XF_YMODEM:
case XF_YMODEM_G:
pX->nLgSingleTemplate = IDD_XFERYMDMRECSTANDARDDISPLAY;
pX->nLgMultiTemplate = pX->nLgSingleTemplate;
pX->nStatusBase = pX->nEventBase = IDS_TM_RX_ZERO;
break;
}
toolbar = sessQueryHwndToolbar( hSession );
ToolbarEnableButton( toolbar, IDM_ACTIONS_SEND, FALSE );
ToolbarEnableButton( toolbar, IDM_ACTIONS_RCV, FALSE );
pX->nDirection = XFER_RECV;
pX->pXferStuff = (VOID *)pRec;
pX->nExpanded = FALSE;
pX->hwndXfrDisplay = DoModelessDialog(glblQueryDllHinst(),
MAKEINTRESOURCE(pX->nLgSingleTemplate),
sessQueryHwnd(hSession),
XfrDisplayDlg,
(LPARAM)hSession);
hCL = sessQueryCLoopHdl(hSession);
if (hCL)
{
CLoopControl(hCL, CLOOP_SET, CLOOP_TRANSFER_READY);
}
}
RSexit:
if (nRet != 0)
{
/*
* If we failed, clean up the mess.
*/
if (pRec != (XFR_RECEIVE *)0)
{
if (pRec->pszDir != (LPTSTR)0)
{
free(pRec->pszDir);
pRec->pszDir = NULL;
}
if (pRec->pszName != (LPTSTR)0)
{
free(pRec->pszName);
pRec->pszName = NULL;
}
free(pRec);
pRec = NULL;
}
}
return nRet;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrGetEventBase
*
* DESCRIPTION:
* This function is called by the transfer display. It is used to get the
* starting number (of the the resource strings) of a list of events that
* can be displayed for some of the transfer protocols.
*
* PARAMETERS:
* hSession -- the session handle
*
* RETURNS:
* A resource ID that should be passed on to LoadString.
*
*/
int xfrGetEventBase(HXFER hXfer)
{
XD_TYPE *pX;
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
assert(pX);
if (pX)
{
return pX->nEventBase;
}
return 0;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrGetStatusBase
*
* DESCRIPTION:
* This function is called bye the transfer display. It is used to get the
* starting number (of the resource strings) of a list of status messages that
* can be displayed for some of the transfer protocols.
*
* PARAMETERS:
* hSession -- the session handle
*
* RETURNS:
* A resource ID that should be passed on to LoadString.
*
*/
int xfrGetStatusBase(HXFER hXfer)
{
XD_TYPE *pX;
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
assert(pX);
if (pX)
{
return pX->nStatusBase;
}
return 0;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrGetXferDspBps
*
* DESCRIPTION:
* This function is called to get the current value of the BPS/CPS flag.
*
* PARAMETERS:
* hSession -- the session handle
*
* RETURNS:
* The current value of the BPS flag.
*
*/
int xfrGetXferDspBps(HXFER hXfer)
{
XD_TYPE *pX;
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
assert(pX);
if (pX)
{
return pX->nBps;
}
return 0;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrSetXferDspBps
*
* DESCRIPTION:
* This function is called to set the BPS/CPS flag in the tranfer handle.
*
* PARAMETERS:
* hSession -- the session handle
* nBps -- the new BPS flag
*
* RETURNS:
* The old value of the BPS flag.
*
*/
int xfrSetXferDspBps(HXFER hXfer, int nBps)
{
return 0;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrInitDspStruct
*
* DESCRIPTION:
* This function is called before a transfer is started to make sure that
* the display variables in the transfer structure are all set to a known
* initial value.
*
* PARAMETERS:
* hSession -- the session handle
*
* RETURNS:
* Nothing.
*/
static void xfrInitDspStruct(HXFER hXfer)
{
XD_TYPE *pX;
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
assert(pX);
if (pX)
{
pX->nClose = 0;
pX->nCloseStatus = 0;
pX->bChecktype = 0;
pX->bErrorCnt = 0;
pX->bPcktErrCnt = 0;
pX->bLastErrtype = 0;
pX->bTotalSoFar = 0;
pX->bFileSize = 0;
pX->bFileSoFar = 0;
pX->bPacketNumber = 0;
pX->bTotalCnt = 0;
pX->bTotalSize = 0;
pX->bFileCnt = 0;
pX->bEvent = 0;
pX->bStatus = 0;
pX->bElapsedTime = 0;
pX->bRemainingTime = 0;
pX->bThroughput = 0;
pX->bProtocol = 0;
pX->bMessage = 0;
pX->bOurName = 0;
pX->bTheirName = 0;
pX->wChecktype = 0;
pX->wErrorCnt = 0;
pX->wPcktErrCnt = 0;
pX->wLastErrtype = 0;
pX->lTotalSize = 0L;
pX->lTotalSoFar = 0L;
pX->lFileSize = 0L;
pX->lFileSoFar = 0L;
pX->lPacketNumber = 0L;
pX->wTotalCnt = 0;
pX->wFileCnt = 0;
pX->wEvent = 0;
pX->wStatus = 0;
pX->lElapsedTime = 0L;
pX->lRemainingTime = 0L;
pX->lThroughput = 0L;
pX->uProtocol = 0;
TCHAR_Fill(pX->acMessage, TEXT('\0'),
sizeof(pX->acMessage) / sizeof(TCHAR));
TCHAR_Fill(pX->acOurName, TEXT('\0'),
sizeof(pX->acOurName) / sizeof(TCHAR));
TCHAR_Fill(pX->acTheirName, TEXT('\0'),
sizeof(pX->acTheirName) / sizeof(TCHAR));
}
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrCleanUpReceive
*
* DESCRIPTION:
* This function is called from xfrDoTransfer after a transfer in order to
* clean up the stuff that was allocated in order to do the transfer.
*
* PARAMETERS:
*
* RETURNS:
* Nothing.
*/
void xfrCleanUpReceive(HSESSION hSession)
{
XD_TYPE *pX;
XFR_RECEIVE *pR;
HWND toolbar;
pX = (XD_TYPE *)sessQueryXferHdl(hSession);
assert(pX);
if (pX)
{
pR = (XFR_RECEIVE *)pX->pXferStuff;
assert(pR);
if (pR)
{
if (pR->pszDir != NULL)
{
free(pR->pszDir);
pR->pszDir = NULL;
}
if (pR->pszName != NULL)
{
free(pR->pszName);
pR->pszName = NULL;
}
free(pR);
pR = NULL;
}
pX->pXferStuff = (void *)0;
pX->nExpanded = FALSE;
// Make sure to reset the Transfer direction. REV: 02/14/2001
pX->nDirection = XFER_NONE;
toolbar = sessQueryHwndToolbar( hSession );
ToolbarEnableButton( toolbar, IDM_ACTIONS_SEND, TRUE );
ToolbarEnableButton( toolbar, IDM_ACTIONS_RCV, TRUE );
}
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrCleanUpSend
*
* DESCRIPTION:
* This function is called from xfrDoTransfer after a transfer in order to
* clean up the stuff that was allocated in order to do the transfer.
*
* PARAMETERS:
*
* RETURNS:
* Nothing.
*/
void xfrCleanUpSend(HSESSION hSession)
{
XD_TYPE *pX;
XFR_SEND *pS;
HWND toolbar;
/* TODO: finish this thing up */
pX = (XD_TYPE *)sessQueryXferHdl(hSession);
assert(pX);
if (pX)
{
pS = (XFR_SEND *)pX->pXferStuff;
assert(pS);
if (pS)
{
int n;
if (pS->pList)
{
for (n = pS->nCount - 1; n >= 0; n--)
{
if (pS->pList[n].pszName)
{
free(pS->pList[n].pszName);
pS->pList[n].pszName = NULL;
}
}
free(pS->pList);
pS->pList = NULL;
}
free(pS);
pS = NULL;
}
pX->pXferStuff = (void *)0;
pX->nExpanded = FALSE;
// Make sure to reset the Transfer direction. REV: 02/14/2001
pX->nDirection = XFER_NONE;
toolbar = sessQueryHwndToolbar( hSession );
ToolbarEnableButton( toolbar, IDM_ACTIONS_SEND, TRUE );
ToolbarEnableButton( toolbar, IDM_ACTIONS_RCV, TRUE );
}
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrDoTransfer
*
* DESCRIPTION:
* Yes, folks, this is the one you have been waiting for. It runs in the
* CLOOP thread. It calls the XFER DLL (if there is one). It slices. It
* dices. It actually does the transfer.
*
* PARAMETERS:
* hSession -- the font of all knowledge
*
* RETURNS:
* Nothing. What can be said after a transfer is done?
*
*/
void xfrDoTransfer(HXFER hXfer)
{
XD_TYPE *pX;
HSESSION hSession = (HSESSION)0;
int nRet = 0;
int nTitle;
TCHAR acTitle[64];
TCHAR acMessage[255];
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
if (pX)
{
hSession = pX->hSession;
switch (pX->nDirection)
{
case XFER_SEND:
nTitle = IDS_XD_SEND;
nRet = xfrSend(hSession, (XFR_SEND *)pX->pXferStuff);
xfrCleanUpSend(hSession);
break;
case XFER_RECV:
nTitle = IDS_XD_RECEIVE;
nRet = xfrReceive(hSession, (XFR_RECEIVE *)pX->pXferStuff);
xfrCleanUpReceive(hSession);
break;
default:
assert(FALSE);
break;
}
}
if (sessQuerySound(hSession))
{
mscMessageBeep(MB_OK);
}
switch (nRet)
{
case TSC_OK:
case TSC_COMPLETE:
case TSC_CANT_START:
break;
default:
LoadString(glblQueryDllHinst(),
nTitle,
acTitle,
sizeof(acTitle) / sizeof(TCHAR));
LoadString(glblQueryDllHinst(),
nRet + IDS_TM_XFER_ZERO,
acMessage,
sizeof(acMessage) / sizeof(TCHAR));
if (StrCharGetStrLength(acMessage) > 0)
{
TimedMessageBox(sessQueryHwnd(hSession),
acMessage,
acTitle,
MB_OK | MB_ICONINFORMATION,
sessQueryTimeout(hSession));
}
break;
}
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrSetPercentDone
*
* DESCRIPTION:
* This function is called to set the percent done value for a transfer.
* This value is only of real use when the program is shown as an icon.
*
* PARAMETERS:
* hSession -- the session handle
* nPerCent -- the percent done (0 to 100)
*
* RETURNS:
* Nothing.
*
*/
void xfrSetPercentDone(HXFER hXfer, int nPerCent)
{
XD_TYPE *pX;
HWND hwnd;
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
assert(pX);
if (pX)
{
// DbgOutStr("Set percent %d", nPerCent, 0,0,0,0);
pX->nPerCent = nPerCent;
hwnd = sessQueryHwnd(pX->hSession);
if (IsIconic(hwnd))
{
// DbgOutStr(" !!!", 0,0,0,0,0);
InvalidateRect(hwnd, 0, TRUE);
}
// DbgOutStr("\r\n", 0,0,0,0,0);
}
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrGetPercentDone
*
* DESCRIPTION:
* This function is called to get the stored percentage value for a transfer.
* This is usually done only to display the value as an icon.
*
* PARAMETERS:
* hSession -- the session handle
*
* RETURNS:
* The percentage (0 to 100).
*
*/
int xfrGetPercentDone(HXFER hXfer)
{
XD_TYPE *pX;
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
if (pX)
{
return pX->nPerCent;
}
return 0;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrGetDisplayWindow
*
* DESCRIPTION:
* Returns the window handle of the transfer display window, if any.
*
* PARAMETERS:
* hSession -- the session handle
*
* RETURNS:
* A window handle (HWND) or NULL.
*
*/
HWND xfrGetDisplayWindow(HXFER hXfer)
{
HWND hRet;
XD_TYPE *pX;
hRet = (HWND)0;
// pX = (XD_TYPE *)sessQueryXferHdl(hSession);
pX = (XD_TYPE *)hXfer;
if (pX)
{
hRet = pX->hwndXfrDisplay; /* handle of the display window */
}
return hRet;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xfrDoAutostart
*
* DESCRIPTION:
* This function is called whenever the session proc gets an XFER_REQ event.
* This usually indicates that somebody wants to do a ZMODEM receive. In
* UPPER WACKER other protocols will be added, notably CSB and HyperP.
*
* PARAMETERS:
* hSession -- the session handle
* lProtocol -- which protocol is requested
*
* RETURNS:
* Nothing.
*
*/
void xfrDoAutostart(HXFER hXfer, long lProtocol)
{
XD_TYPE *pX;
HSESSION hSession;
pX = (XD_TYPE *)hXfer;
assert(pX);
if (pX == NULL)
{
return;
}
hSession = pX->hSession;
assert(hSession);
if (hSession == NULL)
{
return;
}
switch (lProtocol)
{
case XF_ZMODEM:
case XF_ZMODEM_CR:
{
int nXferRecvReturn;
int nOldProtocol;
LPCTSTR pszDir;
XFR_PARAMS *pP;
XFR_Z_PARAMS *pZ;
pP = (XFR_PARAMS *)0;
xfrQueryParameters(hXfer, (VOID **)&pP);
assert(pP);
#if defined(INCL_ZMODEM_CRASH_RECOVERY)
//
// For Zmodem autostarts, check to see if the receiver's
// protocol is set for plain Zmodem. Otherwise use
// crash recovery.
//
if (pP->nRecProtocol == XF_ZMODEM)
{
lProtocol = XF_ZMODEM;
}
else
{
lProtocol = XF_ZMODEM_CR;
}
#endif // defined(INCL_ZMODEM_CRASH_RECOVERY)
pZ = (XFR_Z_PARAMS *)0;
xfrQueryProtoParams(hXfer,
(int)lProtocol,
(void **)&pZ);
if (pZ)
{
//
// See if autostart is OK.
//
if (!pZ->nAutostartOK)
{
xferCancelAutoStart(hSession, lProtocol);
break; /* Not allowed ! */
}
}
//
// See if we should allow host initiated file transfers.
//
if (!sessQueryAllowHostXfers(hSession))
{
xferCancelAutoStart(hSession, lProtocol);
break; /* Not allowed ! */
}
nOldProtocol = pP->nRecProtocol;
pP->nRecProtocol = (int)lProtocol;
/* Try and start up the transfer */
pszDir = filesQueryRecvDirectory(sessQueryFilesDirsHdl(hSession));
nXferRecvReturn = xfrRecvStart(hXfer, pszDir, "");
//
// 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));
//
// TODO:REV 08/06/2001 We should send a ZModem cancel
// back to let the other side know we are not able to
// recieve the file at this point.
//
// Actually a ZCOMPL is the correct responce when we
// are not to receive an autostart delivery, but that
// may cause an existing ZModem file transfer to be
// replied to as complete, so we won't do this until
// we figure out what to do in this case. REV: 4/25/2002
//
// xferCancelAutoStart(hSession, lProtocol);
}
/* Restore what we changed up above */
pP->nRecProtocol = nOldProtocol;
}
break;
default:
assert(FALSE);
break;
}
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* FUNCTION:
* xferCancelAutoStart
*
* DESCRIPTION:
* This function is called whenever the session proc gets an autostart
* file transfer event.
*
* PARAMETERS:
* hSession -- the session handle
* lProtocol -- which protocol is requested
*
* RETURNS:
* Nothing.
*
*/
void xferCancelAutoStart(HSESSION hSession, long lProtocol)
{
#if defined(TODO)
//
// Send a ZCOMPL header here to let other end know we
// we can't accept an autostart delivery. REV: 4/25/2002
//
zmdm_rcv(hSession, lProtocol, TRUE, FALSE);
hXfer->nUserCancel = XFER_NO_AUTOSTART;
hXfer->
xfrDoTransfer(hXfer);
zshhdr(pZ, ZCOMPL, pZ->Txhdr);
#endif // defined(TODO)
return;
}