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.
 
 
 
 
 
 

478 lines
11 KiB

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
ftp.hxx
Abstract:
Contains client-side FTP handle class
Author:
Richard L Firth (rfirth) 03-Jan-1996
Revision History:
03-Jan-1996 rfirth
Created
--*/
//
// classes
//
/*++
Class Description:
This class defines the FTP_FIND_HANDLE_OBJECT.
Private Member functions:
None.
Public Member functions:
GetHandle : Virtual function that gets the handle value from
the generic object handle.
--*/
//
// Bit masks for dwFtpFindBools...
//
#define FTPFIND_ISHTML 0x00000001 // set if contents are wrapped in HTML
#define FTPFIND_ISEMPTY 0x00000002 // set if FtpFindFirst was already done
class FTP_FIND_HANDLE_OBJECT : public INTERNET_CONNECT_HANDLE_OBJECT {
private:
HINTERNET _FindHandle;
CLOSE_HANDLE_FUNC _wCloseFunction;
DWORD _dwFtpFindBools; // encodes flags
HTML_STATE _HtmlState;
LPSTR _lpszUrl;
LPSTR _lpszDirEntry;
//
// _QueryBuffer - buffer used to query socket data available
//
LPVOID _QueryBuffer;
//
// _QueryBufferLength - length of _QueryBuffer
//
DWORD _QueryBufferLength;
//
// _QueryOffset - offset of next read from _QueryBuffer
//
DWORD _QueryOffset;
//
// _QueryBytesAvailable - number of bytes we think are available for this
// socket in the query buffer
//
DWORD _QueryBytesAvailable;
public:
FTP_FIND_HANDLE_OBJECT(
INTERNET_CONNECT_HANDLE_OBJECT * InternetConnectObj,
LPTSTR SearchString,
LPWIN32_FIND_DATA Buffer,
DWORD_PTR dwContext
);
FTP_FIND_HANDLE_OBJECT(
INTERNET_CONNECT_HANDLE_OBJECT * Parent,
HINTERNET Child,
CLOSE_HANDLE_FUNC wCloseFunc,
DWORD_PTR dwContext
);
virtual ~FTP_FIND_HANDLE_OBJECT(VOID);
virtual HINTERNET GetHandle(VOID);
virtual HINTERNET_HANDLE_TYPE GetHandleType(VOID) {
return (_dwFtpFindBools & FTPFIND_ISHTML)?
TypeFtpFindHandleHtml : TypeFtpFindHandle;
}
virtual VOID SetHtml(VOID) {
_HtmlState = HTML_STATE_START;
_dwFtpFindBools |= FTPFIND_ISHTML;
}
virtual VOID SetHtmlState(HTML_STATE State) {
_HtmlState = State;
}
virtual HTML_STATE GetHtmlState(VOID) {
return _HtmlState;
}
virtual LPSTR GetUrl(VOID) {
return _lpszUrl;
}
virtual VOID SetUrl(LPSTR Url) {
_lpszUrl = Url;
}
virtual VOID SetDirEntry(LPSTR DirEntry) {
_lpszDirEntry = DirEntry;
}
virtual LPSTR GetDirEntry(VOID) {
return _lpszDirEntry;
}
VOID SetFindHandle(HINTERNET hInternet) {
INET_ASSERT(_FindHandle == NULL);
_FindHandle = hInternet;
}
DWORD AllocateQueryBuffer(VOID) {
INET_ASSERT(_QueryBuffer == NULL);
INET_ASSERT(_QueryBufferLength == 0);
INET_ASSERT(_QueryOffset == 0);
INET_ASSERT(_QueryBytesAvailable == 0);
_QueryBuffer = ALLOCATE_MEMORY(LMEM_FIXED,
DEFAULT_HTML_QUERY_BUFFER_LENGTH
);
if (_QueryBuffer != NULL) {
_QueryBufferLength = DEFAULT_HTML_QUERY_BUFFER_LENGTH;
return ERROR_SUCCESS;
}
return ERROR_NOT_ENOUGH_MEMORY;
}
VOID FreeQueryBuffer(VOID) {
if (_QueryBuffer != NULL) {
DEBUG_PRINT(API,
INFO,
("Freeing FTP query buffer %#x\n",
_QueryBuffer
));
FREE_MEMORY((HLOCAL)_QueryBuffer);
_QueryBuffer = NULL;
_QueryBufferLength = 0;
_QueryOffset = 0;
_QueryBytesAvailable = 0;
}
}
BOOL HaveQueryData(VOID) {
return (_QueryBytesAvailable != 0) ? TRUE : FALSE;
}
DWORD CopyQueriedData(LPVOID lpBuffer, DWORD dwBufferLength) {
INET_ASSERT(lpBuffer != NULL);
INET_ASSERT(dwBufferLength != 0);
DWORD len = min(_QueryBytesAvailable, dwBufferLength);
if (len != 0) {
memcpy(lpBuffer,
(LPVOID)((LPBYTE)_QueryBuffer + _QueryOffset),
len
);
DEBUG_PRINT(API,
INFO,
("Copied %d bytes from query buffer @ %#x - %d left\n",
len,
(LPBYTE)_QueryBuffer + _QueryOffset,
_QueryBytesAvailable - len
));
_QueryOffset += len;
_QueryBytesAvailable -= len;
}
return len;
}
DWORD
QueryHtmlDataAvailable(
OUT LPDWORD lpdwNumberOfBytesAvailable
);
BOOL IsEmpty (void) {
return _dwFtpFindBools & FTPFIND_ISEMPTY;
}
void SetIsEmpty (void) {
_dwFtpFindBools |= FTPFIND_ISEMPTY;
}
};
/*++
Class Description:
This class defines the FTP_FILE_HANDLE_OBJECT.
Private Member functions:
None.
Public Member functions:
GetHandle : Virtual function that gets the handle value from the
generic object handle.
--*/
class FTP_FILE_HANDLE_OBJECT : public INTERNET_CONNECT_HANDLE_OBJECT {
private:
HINTERNET _FileHandle;
CLOSE_HANDLE_FUNC _wCloseFunction;
BOOL _IsHtml;
HTML_STATE _HtmlState;
LPSTR _lpszUrl;
LPSTR _lpszDirEntry;
LPSTR _lpszFileName;
public:
//FTP_FILE_HANDLE_OBJECT(
// INTERNET_CONNECT_HANDLE_OBJECT * InternetConnectObj,
// LPTSTR lpszFileName,
// DWORD fdwAccess,
// DWORD dwFlags,
// DWORD dwContext
// );
FTP_FILE_HANDLE_OBJECT(
INTERNET_CONNECT_HANDLE_OBJECT * Parent,
HINTERNET Child,
CLOSE_HANDLE_FUNC wCloseFunc,
DWORD_PTR dwContext
);
virtual ~FTP_FILE_HANDLE_OBJECT(VOID);
virtual HINTERNET GetHandle(VOID);
virtual HINTERNET_HANDLE_TYPE GetHandleType(VOID) {
return _IsHtml ? TypeFtpFileHandleHtml : TypeFtpFileHandle;
}
virtual VOID SetHtml(VOID) {
_HtmlState = HTML_STATE_START;
_IsHtml = TRUE;
}
virtual VOID SetHtmlState(HTML_STATE State) {
_HtmlState = State;
}
virtual HTML_STATE GetHtmlState(VOID) {
return _HtmlState;
}
virtual LPSTR GetUrl(VOID) {
return _lpszUrl;
}
virtual VOID SetUrl(LPSTR Url) {
_lpszUrl = Url;
}
virtual VOID SetDirEntry(LPSTR DirEntry) {
_lpszDirEntry = DirEntry;
}
virtual LPSTR GetDirEntry(VOID) {
return _lpszDirEntry;
}
DWORD SetFileName(LPCSTR lpszFileName) {
_lpszFileName = NewString(lpszFileName);
if ( _lpszFileName == NULL )
{
return ERROR_NOT_ENOUGH_MEMORY;
}
else
{
return ERROR_SUCCESS;
}
}
LPSTR GetFileName(VOID) {
return _lpszFileName;
}
VOID SetFileHandle(HINTERNET hInternet) {
INET_ASSERT(_FileHandle == NULL);
_FileHandle = hInternet;
}
};
#ifdef EXTENDED_ERROR_HTML
/*++
Class Description:
This class defines the FTP_ERROR_HANDLE_OBJECT.
Private Member functions:
None.
Public Member functions:
GetHandle : Virtual function that gets the handle value from the
generic object handle.
--*/
class FTP_ERROR_HANDLE_OBJECT : public INTERNET_CONNECT_HANDLE_OBJECT {
private:
LPSTR m_lpszErrorText;
DWORD m_dwErrorTextLength;
LPVOID m_QueryBuffer;
DWORD m_QueryBufferLength;
DWORD m_QueryOffset;
DWORD m_QueryBytesAvailable;
HTML_STATE m_HtmlState;
public:
FTP_ERROR_HANDLE_OBJECT(
INTERNET_CONNECT_HANDLE_OBJECT * InternetConnectObj
);
virtual ~FTP_ERROR_HANDLE_OBJECT();
virtual HINTERNET_HANDLE_TYPE GetHandleType(VOID) {
return TypeFtpFileHandleHtml;
}
virtual VOID SetHtmlState(HTML_STATE State) {
m_HtmlState = State;
}
virtual HTML_STATE GetHtmlState(VOID) {
return m_HtmlState;
}
DWORD SetErrorText(VOID);
DWORD
GetErrorText(
OUT LPSTR lpszBuffer,
IN DWORD dwBytesToRead,
OUT LPDWORD lpdwNumberOfBytesRead
);
DWORD AllocateQueryBuffer(VOID) {
INET_ASSERT(m_QueryBuffer == NULL);
INET_ASSERT(m_QueryBufferLength == 0);
INET_ASSERT(m_QueryOffset == 0);
INET_ASSERT(m_QueryBytesAvailable == 0);
m_QueryBuffer = ALLOCATE_MEMORY(LMEM_FIXED,
DEFAULT_HTML_QUERY_BUFFER_LENGTH
);
if (m_QueryBuffer != NULL) {
m_QueryBufferLength = DEFAULT_HTML_QUERY_BUFFER_LENGTH;
return ERROR_SUCCESS;
} else {
return ERROR_NOT_ENOUGH_MEMORY;
}
}
VOID FreeQueryBuffer(VOID) {
if (m_QueryBuffer != NULL) {
DEBUG_PRINT(API,
INFO,
("Freeing FTP query buffer %#x\n",
m_QueryBuffer
));
FREE_MEMORY((HLOCAL)m_QueryBuffer);
m_QueryBuffer = NULL;
m_QueryBufferLength = 0;
m_QueryOffset = 0;
m_QueryBytesAvailable = 0;
}
}
BOOL HaveQueryData(VOID) {
return (m_QueryBytesAvailable != 0) ? TRUE : FALSE;
}
DWORD CopyQueriedData(LPVOID lpBuffer, DWORD dwBufferLength) {
INET_ASSERT(lpBuffer != NULL);
INET_ASSERT(dwBufferLength != 0);
DWORD len = min(m_QueryBytesAvailable, dwBufferLength);
if (len != 0) {
memcpy(lpBuffer,
(LPVOID)((LPBYTE)m_QueryBuffer + m_QueryOffset),
len
);
DEBUG_PRINT(API,
INFO,
("Copied %d bytes from query buffer @ %#x - %d left\n",
len,
(LPBYTE)m_QueryBuffer + m_QueryOffset,
m_QueryBytesAvailable - len
));
m_QueryOffset += len;
m_QueryBytesAvailable -= len;
}
return len;
}
DWORD
QueryHtmlDataAvailable(
OUT LPDWORD lpdwNumberOfBytesAvailable
);
};
//
// prototypes
//
DWORD
RMakeFtpErrorObjectHandle(
IN HINTERNET hConnect,
OUT LPHINTERNET lphError
);
#endif