class ICSocket; // // class implementations // /*++ Class Description: This class defines the INTERNET_HANDLE_OBJECT. Private Member functions: None. Public Member functions: --*/ class INTERNET_HANDLE_BASE : public HANDLE_OBJECT { friend class INTERNET_HANDLE_OBJECT; private: // // Passport Auth package's "Session Handle" // PP_CONTEXT _PPContext; // // _IsCopy - TRUE if this is part of a derived object handle (e.g. a // connect handle object) // BUGBUG - post-beta cleanup - combine into bitfield // BOOL _IsCopy; // // _UserAgent - name by why which the application wishes to be known to // HTTP servers. Provides the User-Agent header unless overridden by // specific User-Agent header from app // ICSTRING _UserAgent; // // _ProxyInfo - maintains the proxy server and bypass lists // PROXY_INFO * _ProxyInfo; // // _ProxyInfoResourceLock - must acquire for exclusive access in order to // modify the proxy info // RESOURCE_LOCK _ProxyInfoResourceLock; BOOL AcquireProxyInfo(BOOL bExclusiveMode) { return _ProxyInfoResourceLock.Acquire(bExclusiveMode); } VOID ReleaseProxyInfo(VOID) { _ProxyInfoResourceLock.Release(); } VOID SafeDeleteProxyInfo(VOID) { DEBUG_ENTER((DBG_OBJECTS, None, "SafeDeleteProxyInfo", "" )); if ((_ProxyInfo != NULL) && (_ProxyInfo != PROXY_INFO_DIRECT)) { if (AcquireProxyInfo(TRUE)) { // must check since asking for exclusive access if (!IsProxyGlobal()) { if (_ProxyInfo != NULL) { delete _ProxyInfo; } } _ProxyInfo = NULL; ReleaseProxyInfo(); } } DEBUG_LEAVE(0); } // // _dwInternetOpenFlags - flags from InternetOpen() // // BUGBUG - there should only be ONE flags DWORD for all handles descended // from this one. This is it // Rename to just _Flags, or _OpenFlags // DWORD _dwInternetOpenFlags; // // _WinsockLoaded - TRUE if we managed to successfully load winsock // // // BUGBUG - post-beta cleanup - combine into bitfield // BOOL _WinsockLoaded; // // _pICSocket - pointer to ICSocket for new HTTP async code // ICSocket * _pICSocket; protected: // // _Async - TRUE if the InternetOpen() handle, and all handles descended // from it, support asynchronous I/O // // // BUGBUG - post-beta cleanup - get from flags // BOOL _Async; DWORD _MaxConnectionsPerServer; DWORD _MaxConnectionsPer1_0Server; // // _DataAvailable - the number of bytes that can be read from this handle // (i.e. only protocol handles) immediately. This avoids a read request // being made asynchronously if it can be satisfied immediately // DWORD _DataAvailable; // // _EndOfFile - TRUE when we have received all data for this request. This // is used to avoid the API having to perform an extraneous read (possibly // asynchronously) just to discover that we reached end-of-file already // // // BUGBUG - post-beta cleanup - combine into bitfield // BOOL _EndOfFile; // // _StatusCallback - we now maintain callbacks on a per-handle basis. The // callback address comes from the parent handle or the DLL if this is an // InternetOpen() handle. The status callback can be changed for an // individual handle object using the ExchangeStatusCallback() method // (called from InternetSetStatusCallback()) // // // BUGBUG - this should go in HANDLE_OBJECT // WINHTTP_STATUS_CALLBACK _StatusCallback; BOOL _StatusCallbackType; DWORD _dwStatusCallbackFlags; // Codepage: required for conversion of object from unicode to mbcs in WinHttpOpenRequest. DWORD _dwCodePage; HANDLE _ThreadToken; public: INTERNET_HANDLE_BASE( LPCSTR UserAgent, DWORD AccessMethod, LPSTR ProxyName, LPSTR ProxyBypass, DWORD Flags ); INTERNET_HANDLE_BASE(INTERNET_HANDLE_BASE *INetObj); virtual ~INTERNET_HANDLE_BASE(VOID); // // BUGBUG - rfirth 04/05/96 - remove virtual functions // // For the most part, these functions aren't required to be // virtual. They should just be moved to the relevant handle type // (e.g. FTP_FILE_HANDLE_OBJECT). Even GetHandleType() is overkill. // Replacing with a method that just returns // HANDLE_OBJECT::_ObjectType would be sufficient // virtual HINTERNET_HANDLE_TYPE GetHandleType(VOID) { return TypeInternetHandle; } HANDLE GetThreadToken(void) const { return _ThreadToken; } PP_CONTEXT GetPPContext(void) const { return _PPContext; } void SetPPContext(PP_CONTEXT PPContext) { _PPContext = PPContext; } BOOL IsCopy(VOID) const { return _IsCopy; } VOID GetUserAgent(LPSTR Buffer, LPDWORD BufferLength) { _UserAgent.CopyTo(Buffer, BufferLength); } LPSTR GetUserAgent(VOID) { return _UserAgent.StringAddress(); } LPSTR GetUserAgent(LPDWORD lpdwLength) { *lpdwLength = _UserAgent.StringLength(); return _UserAgent.StringAddress(); } VOID SetUserAgent(LPSTR lpszUserAgent) { INET_ASSERT(lpszUserAgent != NULL); _UserAgent = lpszUserAgent; } BOOL IsProxy(VOID) const { // // we can return this info without acquiring the critical section // return ((_ProxyInfo != NULL) && (_ProxyInfo != PROXY_INFO_DIRECT)) ? _ProxyInfo->IsProxySettingsConfigured() : FALSE; } BOOL IsProxyGlobal(VOID) const { INET_ASSERT(g_pGlobalProxyInfo != NULL); return (_ProxyInfo == g_pGlobalProxyInfo) ? TRUE : FALSE; } PROXY_INFO * GetProxyInfo(VOID) const { return _ProxyInfo; } VOID SetProxyInfo(PROXY_INFO * ProxyInfo) { _ProxyInfo = ProxyInfo; } VOID ResetProxyInfo(VOID) { SetProxyInfo(NULL); } DWORD Refresh(); DWORD SetProxyInfo( IN DWORD dwAccessType, IN LPCSTR lpszProxy OPTIONAL, IN LPCSTR lpszProxyBypass OPTIONAL ); DWORD GetProxyStringInfo( OUT LPVOID lpBuffer, IN OUT LPDWORD lpdwBufferLength ); DWORD GetProxyInfo( IN AUTO_PROXY_ASYNC_MSG **ppQueryForProxyInfo ); BOOL RedoSendRequest( IN OUT LPDWORD lpdwError, IN DWORD dwSecureStatus, IN AUTO_PROXY_ASYNC_MSG *pQueryForProxyInfo, IN CServerInfo *pOriginServer, IN CServerInfo *pProxyServer ); VOID SetContext(DWORD_PTR NewContext) { _Context = NewContext; } BOOL IsAsyncHandle(VOID) { return _Async; } VOID SetAvailableDataLength(DWORD Amount) { INET_ASSERT((int)Amount >= 0); _DataAvailable = Amount; } DWORD AvailableDataLength(VOID) const { INET_ASSERT((int)_DataAvailable >= 0); return _DataAvailable; } BOOL IsDataAvailable(VOID) { INET_ASSERT((int)_DataAvailable >= 0); return (_DataAvailable != 0) ? TRUE : FALSE; } VOID ReduceAvailableDataLength(DWORD Amount) { // // why would Amount be > _DataAvailable? // if (Amount > _DataAvailable) { _DataAvailable = 0; } else { _DataAvailable -= Amount; } INET_ASSERT((int)_DataAvailable >= 0); } VOID IncreaseAvailableDataLength(DWORD Amount) { _DataAvailable += Amount; INET_ASSERT((int)_DataAvailable >= 0); } VOID SetEndOfFile(VOID) { _EndOfFile = TRUE; } VOID ResetEndOfFile(VOID) { _EndOfFile = FALSE; } BOOL IsEndOfFile(VOID) const { return _EndOfFile; } WINHTTP_STATUS_CALLBACK GetStatusCallback(VOID) { return _StatusCallback; } BOOL IsUnicodeStatusCallback() { return _StatusCallbackType; } BOOL IsNotificationEnabled(DWORD dwStatus) { return (_dwStatusCallbackFlags & dwStatus); } VOID ResetStatusCallback(VOID) { _StatusCallback = NULL; _StatusCallbackType = FALSE; _dwStatusCallbackFlags = 0; } //VOID AcquireAsyncSpinLock(VOID); // //VOID ReleaseAsyncSpinLock(VOID); DWORD ExchangeStatusCallback(LPWINHTTP_STATUS_CALLBACK lpStatusCallback, BOOL fType, DWORD dwFlags); //DWORD AddAsyncRequest(BOOL fNoCallbackOK); // //VOID RemoveAsyncRequest(VOID); // //DWORD GetAsyncRequestCount(VOID) { // // // // // it doesn't matter about locking this variable - it can change before // // we have returned it to the caller anyway // // // // return _PendingAsyncRequests; //} // random methods on flags DWORD GetInternetOpenFlags() { return _dwInternetOpenFlags; } VOID SetAbortHandle( IN ICSocket * pSocket ); ICSocket * GetAbortHandle(VOID) const { return _pICSocket; } VOID ResetAbortHandle( VOID ); BOOL IsFromCacheTimeoutSet(VOID) const { return FALSE; } DWORD GetMaxConnectionsPerServer(DWORD dwOption) { INET_ASSERT(dwOption == WINHTTP_OPTION_MAX_CONNS_PER_SERVER || dwOption == WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER); return (dwOption == WINHTTP_OPTION_MAX_CONNS_PER_SERVER) ? _MaxConnectionsPerServer : _MaxConnectionsPer1_0Server; } void SetMaxConnectionsPerServer(DWORD dwOption, DWORD dwMaxConnections) { INET_ASSERT(dwOption == WINHTTP_OPTION_MAX_CONNS_PER_SERVER || dwOption == WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER); if (dwOption == WINHTTP_OPTION_MAX_CONNS_PER_SERVER) _MaxConnectionsPerServer = dwMaxConnections; else _MaxConnectionsPer1_0Server = dwMaxConnections; } DWORD GetCodePage() { return _dwCodePage; } void SetCodePage(DWORD dwCodePage) { _dwCodePage = dwCodePage; } void AbortSocket (void); };