Windows2000/private/inet/wininet/ftp/session.h
2020-09-30 17:12:32 +02:00

335 lines
5.7 KiB
C

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
session.h
Abstract:
Structures, prototypes for session.c
Author:
Heath Hunnicutt (t-hheath) 21-Jun-1994
Revision History:
21-Jun-1994 t-heathh
Created
*/
#if defined(__cplusplus)
extern "C" {
#endif
// manifests
#define FTP_SESSION_SIGNATURE 0x53707446 // "FtpS" (when viewed via db/dc)
// macros
#if INET_DEBUG
#define SetSessionSignature(lpSessionInfo) \
(lpSessionInfo)->Signature = FTP_SESSION_SIGNATURE
#else
#define SetSessionSignature(lpSessionInfo)
#endif
#define SetSessionLastResponseCode(pSession, prc) \
CopyMemory(&((pSession)->rcResponseOpenFile), (prc), sizeof(FTP_RESPONSE_CODE))
#define GetSessionLastResponseCode(pSession, prc) \
CopyMemory((prc), &((pSession)->rcResponseOpenFile), sizeof(FTP_RESPONSE_CODE))
#define IsPassiveModeSession(lpSessionInfo) \
(((lpSessionInfo)->Flags & FFTP_PASSIVE_MODE) ? TRUE : FALSE)
// types
typedef enum {
FTP_SERVER_TYPE_UNKNOWN = 0,
FTP_SERVER_TYPE_NT = 1,
FTP_SERVER_TYPE_UNIX = 2
} FTP_SERVER_TYPE;
// FTP_SESSION_INFO - describes an FTP server and our connection to it
typedef struct {
// List - SESSION_INFOs are maintained on double-linked list
LIST_ENTRY List;
// Host - name of the server we are connected to. We only need this for
// diagnositic purposes - e.g. knowing which server to talk to to
// reproduce a problem
LPSTR Host;
// Port - the port at which the FTP server listens
INTERNET_PORT Port;
// socketListener - listening socket
ICSocket *socketListener;
// socketControl - control connection socket
ICSocket *socketControl;
// socketData - data connection socket
ICSocket *socketData;
// ServerType - type of FTP server, e.g. NT or *nix
FTP_SERVER_TYPE ServerType;
// Handle - internally identifies this FTP session
HANDLE Handle;
// Flags - bitmask of various flags - see below
DWORD Flags;
// ReferenceCount - keeps object alive whilst we are not holding
// CriticalSection
LONG ReferenceCount;
// dwTransferAccess - Indicates, for an ongoing transfer, whether the
// transfer was begun with GENERIC_READ or GENERIC_WRITE access.
// {dwTransferAccess} = {GENERIC_READ, GENERIC_WRITE}
DWORD dwTransferAccess;
// rcResponseOpenFile - The response code sent back when a data connection
// was opened, either by FtpOpenFile or FtpCommand.
// Used by FtpCloseFile to determine whether the completion
// code was already received.
FTP_RESPONSE_CODE rcResponseOpenFile;
// FindFileList - A linked-list of WIN32_FIND_DATA structures, formed by a
// call to FtpFindFirstFile, used by FtpFindNextFile and
// FtpFindClose.
LIST_ENTRY FindFileList;
// CriticalSection - Synchronize access to this structure's contents
CRITICAL_SECTION CriticalSection;
// dwFileSizeLow - Size of the file found on the FTP server, should be gotten
// from response data on openning a data connection
DWORD dwFileSizeLow;
DWORD dwFileSizeHigh;
#if INET_DEBUG
// Signature - to help us know this is what its supposed to be in debug build
DWORD Signature;
#endif
} FTP_SESSION_INFO, *LPFTP_SESSION_INFO;
// Flags defines
// FFTP_PASSIVE_MODE - set if the session uses passive mode data connections
#define FFTP_PASSIVE_MODE 0x00000001
// FFTP_ABORT_TRANSFER - set if we have not completed a file transfer on this
// (data) connection, and therefore need to send an ABOR command when we close
// the connection
#define FFTP_ABORT_TRANSFER 0x00000002
// FFTP_FIND_ACTIVE - set when a directory listing is active on this session
#define FFTP_FIND_ACTIVE 0x00000004
// FFTP_IN_DESTRUCTOR - set when this session is being terminated
#define FFTP_IN_DESTRUCTOR 0x00000008
// FFTP_EOF - set when we have reached the end of a (receive) data connection
#define FFTP_EOF 0x00000010
// FFTP_FILE_ACTIVE - set when a file is open on this session
#define FFTP_FILE_ACTIVE 0x00000020
// FFTP_KNOWN_FILE_SIZE - set when we know the size of the file we're downloading
#define FFTP_KNOWN_FILE_SIZE 0x00000040
// prototypes
VOID
CleanupFtpSessions(
VOID
);
VOID
TerminateFtpSession(
IN LPFTP_SESSION_INFO SessionInfo
);
VOID
DereferenceFtpSession(
IN LPFTP_SESSION_INFO SessionInfo
);
DWORD
CreateFtpSession(
IN LPSTR lpszHost,
IN INTERNET_PORT Port,
IN DWORD dwFlags,
OUT LPFTP_SESSION_INFO* lpSessionInfo
);
BOOL
FindFtpSession(
IN HANDLE Handle,
OUT LPFTP_SESSION_INFO* lpSessionInfo
);
#if INET_DEBUG
VOID
FtpSessionInitialize(
VOID
);
VOID
FtpSessionTerminate(
VOID
);
VOID
AcquireFtpSessionList(
VOID
);
VOID
ReleaseFtpSessionList(
VOID
);
VOID
AcquireFtpSessionLock(
IN LPFTP_SESSION_INFO SessionInfo
);
VOID
ReleaseFtpSessionLock(
IN LPFTP_SESSION_INFO SessionInfo
);
#else
// one-line functions replaced by macros in retail version
extern SERIALIZED_LIST FtpSessionList;
#define FtpSessionInitialize() \
InitializeSerializedList(&FtpSessionList)
#define FtpSessionTerminate() \
TerminateSerializedList(&FtpSessionList)
#define AcquireFtpSessionList() \
LockSerializedList(&FtpSessionList)
#define ReleaseFtpSessionList() \
UnlockSerializedList(&FtpSessionList)
#define AcquireFtpSessionLock(lpSessionInfo) \
EnterCriticalSection(&lpSessionInfo->CriticalSection)
#define ReleaseFtpSessionLock(lpSessionInfo) \
LeaveCriticalSection(&lpSessionInfo->CriticalSection)
#endif // INET_DEBUG
#if defined(__cplusplus)
}
#endif