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
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
|