// This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #ifndef __AFXINET_H_ #define __AFXINET_H_ #ifndef __AFX_H__ #include #endif #ifndef _WININET_ #include #endif #ifndef _AFXDLL #pragma comment(lib, "wininet.lib") #endif ///////////////////////////////////////////////////////////////////////////// // classes that are declared in this file class CInternetSession; // from CObject class CGopherLocator; // from CObject class CInternetFile; // from CStdioFile (FILETXT.CPP) class CHttpFile; class CGopherFile; class CInternetConnection; class CFtpConnection; class CGopherConnection; class CHttpConnection; class CFtpFileFind; // from CFileFind (FILEFIND.CPP) class CGopherFileFind; class CInternetException; ///////////////////////////////////////////////////////////////////////////// #undef AFX_DATA #define AFX_DATA AFX_CORE_DATA ///////////////////////////////////////////////////////////////////////////// // Global Functions BOOL AFXAPI AfxParseURL(LPCTSTR pstrURL, DWORD& dwServiceType, CString& strServer, CString& strObject, INTERNET_PORT& nPort); BOOL AFXAPI AfxParseURLEx(LPCTSTR pstrURL, DWORD& dwServiceType, CString& strServer, CString& strObject, INTERNET_PORT& nPort, CString& strUsername, CString& strPassword, DWORD dwFlags = 0); DWORD AFXAPI AfxGetInternetHandleType(HINTERNET hQuery); // see CInternetException at the bottom of this file void AFXAPI AfxThrowInternetException(DWORD dwContext, DWORD dwError = 0); // these are defined by WININET.H #define AFX_INET_SERVICE_FTP INTERNET_SERVICE_FTP #define AFX_INET_SERVICE_HTTP INTERNET_SERVICE_HTTP #define AFX_INET_SERVICE_GOPHER INTERNET_SERVICE_GOPHER // these are types that MFC parsing functions understand #define AFX_INET_SERVICE_UNK 0x1000 #define AFX_INET_SERVICE_FILE (AFX_INET_SERVICE_UNK+1) #define AFX_INET_SERVICE_MAILTO (AFX_INET_SERVICE_UNK+2) #define AFX_INET_SERVICE_MID (AFX_INET_SERVICE_UNK+3) #define AFX_INET_SERVICE_CID (AFX_INET_SERVICE_UNK+4) #define AFX_INET_SERVICE_NEWS (AFX_INET_SERVICE_UNK+5) #define AFX_INET_SERVICE_NNTP (AFX_INET_SERVICE_UNK+6) #define AFX_INET_SERVICE_PROSPERO (AFX_INET_SERVICE_UNK+7) #define AFX_INET_SERVICE_TELNET (AFX_INET_SERVICE_UNK+8) #define AFX_INET_SERVICE_WAIS (AFX_INET_SERVICE_UNK+9) #define AFX_INET_SERVICE_AFS (AFX_INET_SERVICE_UNK+10) #define AFX_INET_SERVICE_HTTPS (AFX_INET_SERVICE_UNK+11) ///////////////////////////////////////////////////////////////////////////// // classes that are declared in this file class CInternetSession : public CObject { public: CInternetSession(LPCTSTR pstrAgent = NULL, DWORD dwContext = 1, DWORD dwAccessType = PRE_CONFIG_INTERNET_ACCESS, LPCTSTR pstrProxyName = NULL, LPCTSTR pstrProxyBypass = NULL, DWORD dwFlags = 0); BOOL QueryOption(DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufLen) const; BOOL QueryOption(DWORD dwOption, DWORD& dwValue) const; BOOL QueryOption(DWORD dwOption, CString& refString) const; BOOL SetOption(DWORD dwOption, LPVOID lpBuffer, DWORD dwBufferLength, DWORD dwFlags = 0); BOOL SetOption(DWORD dwOption, DWORD dwValue, DWORD dwFlags = 0); CStdioFile* OpenURL(LPCTSTR pstrURL, DWORD dwContext = 1, DWORD dwFlags = INTERNET_FLAG_TRANSFER_ASCII, LPCTSTR pstrHeaders = NULL, DWORD dwHeadersLength = 0); CFtpConnection* GetFtpConnection(LPCTSTR pstrServer, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, BOOL bPassive = FALSE); CHttpConnection* GetHttpConnection(LPCTSTR pstrServer, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL); CHttpConnection* GetHttpConnection(LPCTSTR pstrServer, DWORD dwFlags, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL); CGopherConnection* GetGopherConnection(LPCTSTR pstrServer, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER); BOOL EnableStatusCallback(BOOL bEnable = TRUE); DWORD ServiceTypeFromHandle(HINTERNET hQuery); // operations DWORD GetContext() const; operator HINTERNET() const; virtual void Close(); // cookies static BOOL SetCookie(LPCSTR pstrUrl, LPCTSTR pstrCookieName, LPCTSTR pstrCookieData); static BOOL GetCookie(LPCSTR pstrUrl, LPCTSTR pstrCookieName, LPTSTR pstrCookieData, DWORD dwBufLen); static DWORD GetCookieLength(LPCSTR pstrUrl, LPCTSTR pstrCookieName); static BOOL GetCookie(LPCSTR pstrUrl, LPCTSTR pstrCookieName, CString& strCookieData); // overridables virtual void OnStatusCallback(DWORD dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength); // implementation DECLARE_DYNAMIC(CInternetSession) ~CInternetSession(); protected: DWORD m_dwContext; HINTERNET m_hSession; INTERNET_STATUS_CALLBACK m_pOldCallback; BOOL m_bCallbackEnabled; public: #ifdef _DEBUG virtual void Dump(CDumpContext& dc) const; #endif }; //////////////////////////////////////////////////////////////////////////// // Internet File Access Wrapper class CInternetFile : public CStdioFile { // Constructors protected: CInternetFile(HINTERNET hFile, LPCTSTR pstrFileName, CInternetConnection* pConnection, BOOL bReadMode); CInternetFile(HINTERNET hFile, HINTERNET hSession, LPCTSTR pstrFileName, LPCTSTR pstrServer, DWORD dwContext, BOOL bReadMode); // Attributes protected: HINTERNET m_hFile; public: operator HINTERNET() const; DWORD GetContext() const; // Operations BOOL SetWriteBufferSize(UINT nWriteSize); BOOL SetReadBufferSize(UINT nReadSize); BOOL QueryOption(DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufLen) const; BOOL QueryOption(DWORD dwOption, DWORD& dwValue) const; BOOL QueryOption(DWORD dwOption, CString& refString) const; BOOL SetOption(DWORD dwOption, LPVOID lpBuffer, DWORD dwBufferLength, DWORD dwFlags = 0); BOOL SetOption(DWORD dwOption, DWORD dwValue, DWORD dwFlags = 0); // Overridables virtual LONG Seek(LONG lOffset, UINT nFrom); virtual UINT Read(void* lpBuf, UINT nCount); virtual void Write(const void* lpBuf, UINT nCount); virtual void Abort(); virtual void Flush(); virtual void Close(); virtual DWORD GetLength() const; virtual BOOL ReadString(CString& rString); virtual LPTSTR ReadString(LPTSTR pstr, UINT nMax); virtual void WriteString(LPCTSTR pstr); // Not supported by CInternetFile void LockRange(DWORD dwPos, DWORD dwCount); void UnlockRange(DWORD dwPos, DWORD dwCount); CFile* Duplicate() const; virtual void SetLength(DWORD dwNewLen); // Implementation public: virtual ~CInternetFile(); protected: BOOL m_bReadMode; DWORD m_dwContext; HINTERNET m_hConnection; CString m_strServerName; UINT m_nWriteBufferSize; UINT m_nWriteBufferPos; LPBYTE m_pbWriteBuffer; UINT m_nReadBufferSize; UINT m_nReadBufferPos; LPBYTE m_pbReadBuffer; UINT m_nReadBufferBytes; #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif friend class CInternetSession; friend class CFtpConnection; friend class CHttpConnection; friend class CGopherConnection; DECLARE_DYNAMIC(CInternetFile) }; class CHttpFile : public CInternetFile { // Constructors protected: CHttpFile(HINTERNET hFile, HINTERNET hSession, LPCTSTR pstrObject, LPCTSTR pstrServer, LPCTSTR pstrVerb, DWORD dwContext); CHttpFile(HINTERNET hFile, LPCTSTR pstrVerb, LPCTSTR pstrObject, CHttpConnection* pConnection); // Operations public: BOOL AddRequestHeaders(LPCTSTR pstrHeaders, DWORD dwFlags = HTTP_ADDREQ_FLAG_ADD_IF_NEW, int dwHeadersLen = -1); BOOL AddRequestHeaders(CString& str, DWORD dwFlags = HTTP_ADDREQ_FLAG_ADD_IF_NEW); BOOL SendRequest(LPCTSTR pstrHeaders = NULL, DWORD dwHeadersLen = 0, LPVOID lpOptional = NULL, DWORD dwOptionalLen = 0); BOOL SendRequest(CString& strHeaders, LPVOID lpOptional = NULL, DWORD dwOptionalLen = 0); BOOL SendRequestEx(DWORD dwTotalLen, DWORD dwFlags = HSR_INITIATE, DWORD dwContext = 1); BOOL SendRequestEx(LPINTERNET_BUFFERS lpBuffIn, LPINTERNET_BUFFERS lpBuffOut, DWORD dwFlags = HSR_INITIATE, DWORD dwContext = 1); BOOL EndRequest(DWORD dwFlags = 0, LPINTERNET_BUFFERS lpBuffIn = NULL, DWORD dwContext = 1); BOOL QueryInfo(DWORD dwInfoLevel, LPVOID lpvBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex = NULL) const; BOOL QueryInfo(DWORD dwInfoLevel, CString& str, LPDWORD dwIndex = NULL) const; BOOL QueryInfo(DWORD dwInfoLevel, SYSTEMTIME* pSysTime, LPDWORD dwIndex = NULL) const; BOOL QueryInfo(DWORD dwInfoLevel, DWORD& dwResult, LPDWORD dwIndex = NULL) const; BOOL QueryInfoStatusCode(DWORD& dwStatusCode) const; DWORD ErrorDlg(CWnd* pParent = NULL, DWORD dwError = ERROR_INTERNET_INCORRECT_PASSWORD, DWORD dwFlags = FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, LPVOID* lppvData = NULL); // Attributes public: CString GetVerb() const; CString GetObject() const; virtual CString GetFileURL() const; virtual void Close(); // Implementation public: virtual ~CHttpFile(); protected: CString m_strObject; CString m_strVerb; #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif friend class CHttpConnection; friend class CInternetSession; DECLARE_DYNAMIC(CHttpFile) }; // class CGopherFile is declared after CGopherLocator, below //////////////////////////////////////////////////////////////////////////// // Connection types class CInternetConnection : public CObject { public: CInternetConnection(CInternetSession* pSession, LPCTSTR pstrServer, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, DWORD dwContext = 1); // Operations operator HINTERNET() const; DWORD GetContext() const; CInternetSession* GetSession() const; CString GetServerName() const; BOOL QueryOption(DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufLen) const; BOOL QueryOption(DWORD dwOption, DWORD& dwValue) const; BOOL QueryOption(DWORD dwOption, CString& refString) const; BOOL SetOption(DWORD dwOption, LPVOID lpBuffer, DWORD dwBufferLength, DWORD dwFlags = 0); BOOL SetOption(DWORD dwOption, DWORD dwValue, DWORD dwFlags = 0); // Implementation protected: HINTERNET m_hConnection; DWORD m_dwContext; CInternetSession* m_pSession; virtual void Close(); CString m_strServerName; INTERNET_PORT m_nPort; public: ~CInternetConnection(); DECLARE_DYNAMIC(CInternetConnection) #ifdef _DEBUG virtual void Dump(CDumpContext& dc) const; void AssertValid() const; #endif }; class CFtpConnection : public CInternetConnection { public: CFtpConnection(CInternetSession* pSession, HINTERNET hConnected, LPCTSTR pstrServer, DWORD dwContext); CFtpConnection(CInternetSession* pSession, LPCTSTR pstrServer, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL, DWORD dwContext = 0, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, BOOL bPassive = FALSE); BOOL SetCurrentDirectory(LPCTSTR pstrDirName); BOOL GetCurrentDirectory(CString& strDirName) const; BOOL GetCurrentDirectory(LPTSTR pstrDirName, LPDWORD lpdwLen) const; BOOL GetCurrentDirectoryAsURL(LPTSTR pstrName, LPDWORD lpdwLen) const; BOOL GetCurrentDirectoryAsURL(CString& strDirName) const; BOOL RemoveDirectory(LPCTSTR pstrDirName); BOOL CreateDirectory(LPCTSTR pstrDirName); BOOL Rename(LPCTSTR pstrExisting, LPCTSTR pstrNew); BOOL Remove(LPCTSTR pstrFileName); BOOL PutFile(LPCTSTR pstrLocalFile, LPCTSTR pstrRemoteFile, DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD dwContext = 1); BOOL GetFile(LPCTSTR pstrRemoteFile, LPCTSTR pstrLocalFile, BOOL bFailIfExists = TRUE, DWORD dwAttributes = FILE_ATTRIBUTE_NORMAL, DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD dwContext = 1); CInternetFile* OpenFile(LPCTSTR pstrFileName, DWORD dwAccess = GENERIC_READ, DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD dwContext = 1); virtual void Close(); // implementation ~CFtpConnection(); protected: CString m_strServerName; public: #ifdef _DEBUG virtual void Dump(CDumpContext& dc) const; virtual void AssertValid() const; #endif DECLARE_DYNAMIC(CFtpConnection) }; class CHttpConnection : public CInternetConnection { public: enum { _HTTP_VERB_MIN = 0, HTTP_VERB_POST = 0, HTTP_VERB_GET = 1, HTTP_VERB_HEAD = 2, HTTP_VERB_PUT = 3, HTTP_VERB_LINK = 4, HTTP_VERB_DELETE = 5, HTTP_VERB_UNLINK = 6, _HTTP_VERB_MAX = 6, }; public: CHttpConnection(CInternetSession* pSession, HINTERNET hConnected, LPCTSTR pstrServer, DWORD dwContext); CHttpConnection(CInternetSession* pSession, LPCTSTR pstrServer, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL, DWORD dwContext = 1); CHttpConnection(CInternetSession* pSession, LPCTSTR pstrServer, DWORD dwFlags, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL, DWORD dwContext = 1); CHttpFile* OpenRequest(LPCTSTR pstrVerb, LPCTSTR pstrObjectName, LPCTSTR pstrReferer = NULL,DWORD dwContext = 1, LPCTSTR* ppstrAcceptTypes = NULL, LPCTSTR pstrVersion = NULL, DWORD dwFlags = INTERNET_FLAG_EXISTING_CONNECT); CHttpFile* OpenRequest(int nVerb, LPCTSTR pstrObjectName, LPCTSTR pstrReferer = NULL, DWORD dwContext = 1, LPCTSTR* ppstrAcceptTypes = NULL, LPCTSTR pstrVersion = NULL, DWORD dwFlags = INTERNET_FLAG_EXISTING_CONNECT); // implementation ~CHttpConnection(); virtual void Close(); protected: CString m_strServerName; static const LPCTSTR szHtmlVerbs[]; public: #ifdef _DEBUG virtual void Dump(CDumpContext& dc) const; virtual void AssertValid() const; #endif friend class CInternetSession; // just to access szHtmlVerbs DECLARE_DYNAMIC(CHttpConnection) }; class CGopherConnection : public CInternetConnection { public: CGopherConnection(CInternetSession* pSession, HINTERNET hConnected, LPCTSTR pstrServer, DWORD dwContext); CGopherConnection(CInternetSession* pSession, LPCTSTR pstrServer, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL, DWORD dwContext = 0, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER); CGopherFile* OpenFile(CGopherLocator& refLocator, DWORD dwFlags = 0, LPCTSTR pstrView = NULL, DWORD dwContext = 1); CGopherLocator CreateLocator(LPCTSTR pstrDisplayString, LPCTSTR pstrSelectorString, DWORD dwGopherType); BOOL CGopherConnection::GetAttribute(CGopherLocator& refLocator, CString strRequestedAttributes, CString& strResult); static CGopherLocator CreateLocator(LPCTSTR pstrLocator); static CGopherLocator CreateLocator(LPCTSTR pstrServerName, LPCTSTR pstrDisplayString, LPCTSTR pstrSelectorString, DWORD dwGopherType, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER); // implementation ~CGopherConnection(); virtual void Close(); public: #ifdef _DEBUG virtual void Dump(CDumpContext& dc) const; virtual void AssertValid() const; #endif DECLARE_DYNAMIC(CGopherConnection) }; ///////////////////////////////////////////////////////////////////////////// // CFtpFileFind class CFtpFileFind : public CFileFind { public: CFtpFileFind(CFtpConnection* pConnection, DWORD dwContext = 1); virtual ~CFtpFileFind(); virtual BOOL FindFile(LPCTSTR pstrName = NULL, DWORD dwFlags = INTERNET_FLAG_RELOAD); virtual BOOL FindNextFile(); CString GetFileURL() const; // implementation protected: virtual void CloseContext(); CFtpConnection* m_pConnection; DWORD m_dwContext; public: #ifdef _DEBUG virtual void Dump(CDumpContext& dc) const; virtual void AssertValid() const; #endif DECLARE_DYNAMIC(CFtpFileFind) }; ///////////////////////////////////////////////////////////////////////////// // CGopherLocator class CGopherLocator : public CObject { public: ~CGopherLocator(); operator LPCTSTR() const; CGopherLocator(const CGopherLocator& ref); BOOL GetLocatorType(DWORD& dwRef) const; private: // this only created by CGopherConnection::CreateLocator or by serialization CGopherLocator(LPCTSTR pstrLocator, DWORD dwLocLen); CString m_Locator; // _not_ a zero-terminated string! DWORD m_dwBufferLength; friend class CGopherConnection; friend class CGopherFile; }; ///////////////////////////////////////////////////////////////////////////// // CGopherFile class CGopherFile : public CInternetFile { // Constructors protected: CGopherFile(HINTERNET hFile, CGopherLocator& refLocator, CGopherConnection* pConnection); CGopherFile(HINTERNET hFile, HINTERNET hSession, LPCTSTR pstrLocator, DWORD dwLocLen, DWORD dwContext); // Operations public: virtual void Close(); virtual void Write(const void* lpBuf, UINT nCount); void WriteString(LPCTSTR pstr); // Implementation protected: CGopherLocator m_Locator; public: virtual ~CGopherFile(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif friend class CInternetSession; friend class CGopherConnection; DECLARE_DYNAMIC(CGopherFile) }; ///////////////////////////////////////////////////////////////////////////// // CGopherFileFind class CGopherFileFind : public CFileFind { public: CGopherFileFind(CGopherConnection* pConnection, DWORD dwContext = 1); virtual ~CGopherFileFind(); virtual BOOL FindFile(CGopherLocator& refLocator, LPCTSTR pstrString, DWORD dwFlags = INTERNET_FLAG_RELOAD); virtual BOOL FindFile(LPCTSTR pstrString, DWORD dwFlags = INTERNET_FLAG_RELOAD); virtual BOOL FindNextFile(); virtual BOOL IsDots() const; virtual BOOL GetLastWriteTime(FILETIME* pTimeStamp) const; virtual BOOL GetLastAccessTime(FILETIME* pTimeStamp) const; virtual BOOL GetCreationTime(FILETIME* pTimeStamp) const; virtual BOOL GetLastWriteTime(CTime& refTime) const; virtual BOOL GetLastAccessTime(CTime& refTime) const; virtual BOOL GetCreationTime(CTime& refTime) const; CGopherLocator GetLocator() const; CString GetScreenName() const; virtual DWORD GetLength() const; #if defined(_X86_) || defined(_ALPHA_) virtual __int64 GetLength64() const; #endif protected: virtual void CloseContext(); CGopherConnection* m_pConnection; DWORD m_dwContext; // implementation public: // Unsupported APIs CString GetFileName() const; CString GetFilePath() const; CString GetFileTitle() const; CString GetFileURL() const; CString GetRoot() const; #ifdef _DEBUG virtual void Dump(CDumpContext& dc) const; virtual void AssertValid() const; #endif DECLARE_DYNAMIC(CGopherFileFind) }; /////////////////////////////////////////////////////////////////////// // CInternetException class CInternetException : public CException { public: // Constructor CInternetException(DWORD dwError); // Attributes DWORD m_dwError; DWORD m_dwContext; // Implementation public: ~CInternetException(); #ifdef _DEBUG virtual void Dump(CDumpContext& dc) const; #endif virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError, PUINT pnHelpContext = NULL); DECLARE_DYNAMIC(CInternetException) }; ///////////////////////////////////////////////////////////////////////////// // Inline function declarations #ifdef _AFX_ENABLE_INLINES #define _AFXINET_INLINE AFX_INLINE #include #endif #undef AFX_DATA #define AFX_DATA #ifdef _AFX_MINREBUILD #pragma component(minrebuild, on) #endif #ifndef _AFX_FULLTYPEINFO #pragma component(mintypeinfo, off) #endif #endif // __AFXINET_H__