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