|
|
/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
gopher.cxx
Abstract:
Contains methods for GOPHER_FIND_HANDLE_OBJECT and GOPHER_FILE_HANDLE_OBJECT classes
Contents: RMakeGfrFindObjectHandle RMakeGfrFileObjectHandle RMakeGfrFixedObjectHandle
Author:
Madan Appiah (madana) 16-Nov-1994
Environment:
User Mode - Win32
Revision History:
Sophia Chung (sophiac) 14-Feb-1995 (added FTP and Archie class impl.) (code adopted from madana)
--*/
#include <wininetp.h>
//
// functions
//
DWORD RMakeGfrFindObjectHandle( IN HINTERNET ParentHandle, IN OUT HINTERNET * ChildHandle, IN CLOSE_HANDLE_FUNC wCloseFunc, IN DWORD_PTR dwContext )
/*++
Routine Description:
Routine Description:
C-callable wrapper for creating a GOPHER_FIND_HANDLE_OBJECT
Arguments:
ParentHandle - mapped address of parent (connect) handle
ChildHandle - IN: protocol-specific handle value associated with object OUT: mapped address of GOPHER_FIND_HANDLE_OBJECT
wCloseFunc - address of protocol-specific function to be called when object is closed
dwContext - app-supplied context value
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_NOT_ENOUGH_MEMORY
--*/
{ DWORD error; GOPHER_FIND_HANDLE_OBJECT * hFind;
hFind = new GOPHER_FIND_HANDLE_OBJECT( (INTERNET_CONNECT_HANDLE_OBJECT *)ParentHandle, *ChildHandle, wCloseFunc, dwContext );
if (hFind != NULL) { error = hFind->GetStatus(); if (error == ERROR_SUCCESS) {
//
// inform the app of the new handle
//
error = InternetIndicateStatusNewHandle((LPVOID)hFind);
//
// ERROR_INTERNET_OPERATION_CANCELLED is the only error that we are
// expecting here. If we get this error then the app has cancelled
// the operation. Either way, the handle we just generated will be
// already deleted
//
if (error != ERROR_SUCCESS) {
INET_ASSERT(error == ERROR_INTERNET_OPERATION_CANCELLED);
hFind = NULL; } } else { delete hFind; hFind = NULL; } } else { error = ERROR_NOT_ENOUGH_MEMORY; }
*ChildHandle = (HINTERNET)hFind;
return error; }
DWORD RMakeGfrFixedObjectHandle( IN HINTERNET ParentHandle, IN OUT HINTERNET * ChildHandle, IN DWORD dwFixedType )
/*++
Routine Description:
Routine Description:
C-callable wrapper for creating a GOPHER_FIND_HANDLE_OBJECT
Arguments:
ParentHandle - mapped address of parent (connect) handle
ChildHandle - IN: protocol-specific handle value associated with object OUT: mapped address of GOPHER_FIND_HANDLE_OBJECT
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_NOT_ENOUGH_MEMORY
--*/
{ DWORD error; GOPHER_FIND_HANDLE_OBJECT * hFind;
hFind = new GOPHER_FIND_HANDLE_OBJECT( (INTERNET_CONNECT_HANDLE_OBJECT *)ParentHandle, *ChildHandle, dwFixedType );
if (!hFind) { error = ERROR_NOT_ENOUGH_MEMORY; } else { error = hFind->GetStatus(); if (error != ERROR_SUCCESS) { delete hFind; hFind = NULL; } }
*ChildHandle = (HINTERNET)hFind; return error; }
DWORD RMakeGfrFileObjectHandle( IN HINTERNET ParentHandle, IN OUT HINTERNET * ChildHandle, IN CLOSE_HANDLE_FUNC wCloseFunc, IN DWORD_PTR dwContext )
/*++
Routine Description:
C-callable wrapper for creating a GOPHER_FILE_HANDLE_OBJECT
Arguments:
ParentHandle - mapped address of parent (connect) handle
ChildHandle - IN: protocol-specific handle value associated with object OUT: mapped address of GOPHER_FILE_HANDLE_OBJECT
wCloseFunc - address of protocol-specific function to be called when object is closed
dwContext - app-supplied context value
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_NOT_ENOUGH_MEMORY
--*/
{ DWORD error; GOPHER_FILE_HANDLE_OBJECT * hFile;
hFile = new GOPHER_FILE_HANDLE_OBJECT( (INTERNET_CONNECT_HANDLE_OBJECT *)ParentHandle, *ChildHandle, wCloseFunc, dwContext );
if (hFile != NULL) { error = hFile->GetStatus(); if (error == ERROR_SUCCESS) {
//
// inform the app of the new handle
//
error = InternetIndicateStatusNewHandle((LPVOID)hFile);
//
// ERROR_INTERNET_OPERATION_CANCELLED is the only error that we are
// expecting here. If we get this error then the app has cancelled
// the operation. Either way, the handle we just generated will be
// already deleted
//
if (error != ERROR_SUCCESS) {
INET_ASSERT(error == ERROR_INTERNET_OPERATION_CANCELLED);
hFile = NULL; } } else { delete hFile; hFile = NULL; } } else { error = ERROR_NOT_ENOUGH_MEMORY; }
*ChildHandle = (HINTERNET)hFile;
return error; }
//
// GOPHER_FIND_HANDLE_OBJECT class implementation
//
GOPHER_FIND_HANDLE_OBJECT::GOPHER_FIND_HANDLE_OBJECT( INTERNET_CONNECT_HANDLE_OBJECT *Parent, HINTERNET Child, CLOSE_HANDLE_FUNC wCloseFunc, DWORD_PTR dwContext ) : INTERNET_CONNECT_HANDLE_OBJECT(Parent) { _FindHandle = Child; _wCloseFunction = wCloseFunc; _IsHtml = FALSE; _dwFixedType = 0; _lpszUrl = NULL; _lpszDirEntry = NULL; _QueryBuffer = NULL; _QueryBufferLength = 0; _QueryOffset = 0; _QueryBytesAvailable = 0; _Context = dwContext; SetObjectType(TypeGopherFindHandle); }
//
// Constructor for poser find handle to return html form...
//
GOPHER_FIND_HANDLE_OBJECT::GOPHER_FIND_HANDLE_OBJECT( INTERNET_CONNECT_HANDLE_OBJECT *Parent, HINTERNET Child, DWORD dwFixedType ) : INTERNET_CONNECT_HANDLE_OBJECT (Parent) { _FindHandle = Child; _wCloseFunction = NULL; _IsHtml = FALSE; // must set FALSE so RSetHtmlHandleType can set TRUE!
_dwFixedType = dwFixedType; _lpszUrl = NULL; _lpszDirEntry = NULL; _QueryBuffer = NULL; _QueryBufferLength = 0; _QueryOffset = 0; _QueryBytesAvailable = 0; _Context = 0; SetObjectType(TypeGopherFindHandle); }
GOPHER_FIND_HANDLE_OBJECT::~GOPHER_FIND_HANDLE_OBJECT( VOID ) { //
// close local handle with appropriate function.
//
if (_FindHandle != NULL) { _Status = _wCloseFunction(_FindHandle); } else { _Status = ERROR_SUCCESS; }
//
// clear out any strings we allocated
//
if (_lpszUrl != NULL) { DEL_STRING(_lpszUrl); } if (_lpszDirEntry != NULL) { DEL_STRING(_lpszDirEntry); }
//
// and the query buffer
//
FreeQueryBuffer(); }
HINTERNET GOPHER_FIND_HANDLE_OBJECT::GetHandle( VOID ) { return _FindHandle; }
DWORD GOPHER_FIND_HANDLE_OBJECT::QueryHtmlDataAvailable( OUT LPDWORD lpdwNumberOfBytesAvailable ) { DWORD error;
if (_QueryBuffer != NULL) { error = ERROR_SUCCESS; } else { error = AllocateQueryBuffer(); }
INET_ASSERT(_QueryBytesAvailable == 0);
if (error == ERROR_SUCCESS) {
DWORD nRead;
_QueryOffset = 0; if (ReadHtmlUrlData((HINTERNET)this, _QueryBuffer, _QueryBufferLength, lpdwNumberOfBytesAvailable )) { _QueryBytesAvailable = *lpdwNumberOfBytesAvailable; //SetAvailableDataLength(_QueryBytesAvailable);
if (_QueryBytesAvailable == 0) { SetEndOfFile(); } } else { error = GetLastError(); } } return error; }
//
// GOPHER_FILE_HANDLE_OBJECT class implementation
//
GOPHER_FILE_HANDLE_OBJECT::GOPHER_FILE_HANDLE_OBJECT( INTERNET_CONNECT_HANDLE_OBJECT *Parent, HINTERNET Child, CLOSE_HANDLE_FUNC wCloseFunc, DWORD_PTR dwContext ) : INTERNET_CONNECT_HANDLE_OBJECT(Parent) { _FileHandle = Child; _wCloseFunction = wCloseFunc; _IsHtml = FALSE; _lpszUrl = NULL; _lpszDirEntry = NULL; _Context = dwContext; SetObjectType(TypeGopherFileHandle); }
GOPHER_FILE_HANDLE_OBJECT::~GOPHER_FILE_HANDLE_OBJECT( VOID ) { //
// close local handle with appropriate function.
//
if (_FileHandle != NULL) { _Status = _wCloseFunction(_FileHandle); } else { _Status = ERROR_SUCCESS; }
//
// clear out any strings we allocated
//
if (_lpszUrl != NULL) { DEL_STRING(_lpszUrl); } if (_lpszDirEntry != NULL) { DEL_STRING(_lpszDirEntry); } }
HINTERNET GOPHER_FILE_HANDLE_OBJECT::GetHandle( VOID ) { return _FileHandle; }
|