#ifndef _ANYCON_HXX #define _ANYCON_HXX class CStream; class CAnyConnection { public: CAnyConnection ( BOOL bSecure, INTERNET_PORT nServerPort, BOOL bIgnoreSecurityDlg, DWORD dwAuthMethod); virtual ~CAnyConnection (); virtual HINTERNET OpenSession (); virtual BOOL CloseSession (); virtual HINTERNET Connect( LPTSTR lpszServerName); virtual BOOL Disconnect (); virtual HINTERNET OpenRequest ( LPTSTR lpszUrl); virtual BOOL CloseRequest (HINTERNET hReq); virtual BOOL SendRequest( HINTERNET hReq, LPCTSTR lpszHdr, DWORD cbData, LPBYTE pidi); virtual BOOL SendRequest( HINTERNET hReq, LPCTSTR lpszHdr, CStream *pStream); virtual BOOL ReadFile ( HINTERNET hReq, LPVOID lpvBuffer, DWORD cbBuffer, LPDWORD lpcbRd); BOOL IsValid () {return m_bValid;} BOOL SetPassword ( HINTERNET hReq, LPTSTR lpszUserName, LPTSTR lpszPassword); BOOL GetAuthSchem ( HINTERNET hReq, LPSTR lpszScheme, DWORD dwSize); void SetShowSecurityDlg ( BOOL bShowSecDlg); inline DWORD GetAuthMethod (VOID) const { return m_dwAuthMethod; } protected: #ifndef WINNT32 // This needs only to work on Win9X, we can use sync calls in NT /******************************************************************************************** ** Class - CAnyConnection::CAsyncContext ** Description - This class provides an abstract way for the asynchronous callback between ** the WinInet API and the Http connection to be expressed ********************************************************************************************/ class CAsyncContext { public: CAsyncContext(void); // Allocate the event and clear the return status inline BOOL bValid(void); // Return true if there is a failure BOOL TimeoutWait( IN OUT BOOL & bSuccess); // Wait for a particular timeout, we use the // passed in BOOL to see if the call was asynchronous ~CAsyncContext(); // Close the handle if it exists static void CALLBACK InternetCallback( // This callback is used to send an event back to IN HINTERNET hInternet, // the calling thread, this prevents the calling IN DWORD_PTR dwContext, // thread from blocking indefinitely, it will IN DWORD dwInternetStatus, // simply time out IN LPVOID lpvStatusInformation, IN DWORD dwStatusInformationLength); private: DWORD m_dwRet; // This is the return value for non-handle calls DWORD m_dwError; // This is the last error code that was given to // the function HANDLE m_hEvent; // This is the event used for the synchronisation }; #endif // #ifndef WINNT32 #ifndef WINNT32 // These are meaningless in sync code static BOOL AsynchronousWait( IN HINTERNET hInternet, IN OUT BOOL & bSuccess); // Wait for an asyncronous operation where we // only know the internet handle and want a BOOL static CAsyncContext *GetAsyncContext( IN HINTERNET hInternet); // Get the context associated with this handle #endif // #ifndef WINNT32 LPTSTR m_lpszPassword; LPTSTR m_lpszUserName; BOOL m_bValid; BOOL m_bSecure; HINTERNET m_hSession; HINTERNET m_hConnect; INTERNET_PORT m_nServerPort; BOOL m_bIgnoreSecurityDlg; private: DWORD m_dwAccessFlag; BOOL m_bShowSecDlg; DWORD m_dwAuthMethod; static const DWORD gm_dwConnectTimeout; // The connection timeout static const DWORD gm_dwSendTimeout; // The send timeout static const DWORD gm_dwReceiveTimeout; // The receive timeout static const DWORD gm_dwSendSize; // The size of the blocks we send to the server }; //////////////////////////////////////////////////////////////////////////////////////////////// // INLINE METHODS //////////////////////////////////////////////////////////////////////////////////////////////// #ifndef WINNT32 inline BOOL CAnyConnection::CAsyncContext::bValid(void) { return m_hEvent != INVALID_HANDLE_VALUE; } #endif // #ifndef WINNT32 //////////////////////////////////////////////////////////////////////////////////////////////// // MACROS FOR SYNCHRONOUS CODE /////////////////////////////////////////////////////////////////////////////////////////////// #ifdef WINNT32 #define WIN9X_OP_ASYNC(OpX) #define WIN9X_NEW_ASYNC(NewX) #define WIN9X_GET_ASYNC(GetX, HandleX) #define WIN9X_IF_ASYNC(ExprX) #define WIN9X_BREAK_ASYNC(RetX) #define WIN9X_ELSE_ASYNC(ExprX) #define WIN9X_WAIT_ASYNC(HandleX, BoolX) (BoolX) #define WIN9X_TIMEOUT_ASYNC(ContextX, BoolX) (BoolX) #define WIN9X_CONTEXT_ASYNC(acX) 0 #else // #ifndef WINNT32 #define WIN9X_OP_ASYNC(OpX) \ OpX #define WIN9X_NEW_ASYNC(NewX) \ CAsyncContext *(NewX) = new CAsyncContext #define WIN9X_GET_ASYNC(GetX, HandleX) \ CAsyncContext *(GetX) = GetAsyncContext(HandleX) #define WIN9X_IF_ASYNC(ExprX) \ if (ExprX) #define WIN9X_BREAK_ASYNC(RetX) \ break; bRet = (RetX) #define WIN9X_ELSE_ASYNC(ExprX) \ else (ExprX) #define WIN9X_WAIT_ASYNC(HandleX, BoolX) \ (AsynchronousWait( HandleX, BoolX)) #define WIN9X_TIMEOUT_ASYNC(ContextX, BoolX) \ (ContextX)->TimeoutWait(BoolX) #define WIN9X_CONTEXT_ASYNC(acX) \ ((DWORD_PTR)acX) #endif // #ifdef WINNT32 #endif