/*++ 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