📄 inet.cpp
字号:
CString strObject;
INTERNET_PORT nPort;
CStdioFile* pReturn;
BOOL bParsed = AfxParseURL(pstrURL, dwServiceType, strServer, strObject, nPort);
// if it turns out to be a file...
if (bParsed && dwServiceType == AFX_INET_SERVICE_FILE)
{
int nMode = CFile::modeRead | CFile::shareCompat;
if (dwFlags & INTERNET_FLAG_TRANSFER_BINARY)
nMode |= CFile::typeBinary;
else
nMode |= CFile::typeText;
pReturn = new CStdioFile(strObject, nMode);
}
else
{
HINTERNET hOpener;
hOpener = InternetOpenUrl(m_hSession, pstrURL, pstrHeaders,
dwHeadersLength, dwFlags, dwContext);
if (hOpener == NULL)
AfxThrowInternetException(m_dwContext);
if (!bParsed)
dwServiceType = AfxGetInternetHandleType(hOpener);
switch (dwServiceType)
{
case INTERNET_HANDLE_TYPE_GOPHER_FILE:
case AFX_INET_SERVICE_GOPHER:
//WINBUG: WININET supplies no way to
// convert from a URL to a Gopher locator
pReturn = new CGopherFile(hOpener, m_hSession, _T(""),
0, dwContext);
_afxSessionMap.SetAt(hOpener, this);
break;
case INTERNET_HANDLE_TYPE_FTP_FILE:
case AFX_INET_SERVICE_FTP:
pReturn = new CInternetFile(hOpener, m_hSession, strObject,
strServer, dwContext, TRUE);
_afxSessionMap.SetAt(hOpener, this);
break;
case INTERNET_HANDLE_TYPE_HTTP_REQUEST:
case AFX_INET_SERVICE_HTTP:
case AFX_INET_SERVICE_HTTPS:
pReturn = new CHttpFile(hOpener, m_hSession, strObject, strServer,
CHttpConnection::szHtmlVerbs[CHttpConnection::HTTP_VERB_GET],
dwContext);
_afxSessionMap.SetAt(hOpener, this);
break;
default:
TRACE1("Error: Unidentified service type: %8.8X\n", dwServiceType);
pReturn = NULL;
}
}
return pReturn;
}
BOOL CInternetSession::SetOption(DWORD dwOption, LPVOID lpBuffer,
DWORD dwBufferLength, DWORD dwFlags /* = 0 */)
{
ASSERT(AfxIsValidAddress(lpBuffer, dwBufferLength, FALSE));
ASSERT(dwOption >= INTERNET_FIRST_OPTION &&
dwOption <= INTERNET_LAST_OPTION);
ASSERT(dwBufferLength != 0);
ASSERT((dwFlags & INTERNET_FLAG_ASYNC) == 0);
// bogus flag?
ASSERT(dwFlags == 0 || ((dwFlags & ISO_VALID_FLAGS) == dwFlags));
return InternetSetOptionEx(m_hSession, dwOption,
lpBuffer, dwBufferLength, dwFlags);
}
BOOL CInternetSession::QueryOption(DWORD dwOption, LPVOID lpBuffer,
LPDWORD lpdwBufferLength) const
{
ASSERT(dwOption >= INTERNET_FIRST_OPTION &&
dwOption <= INTERNET_LAST_OPTION);
ASSERT_POINTER(lpdwBufferLength, DWORD);
ASSERT(AfxIsValidAddress(lpBuffer, *lpdwBufferLength));
ASSERT(*lpdwBufferLength != 0);
return InternetQueryOption(m_hSession, dwOption,
lpBuffer, lpdwBufferLength);
}
BOOL CInternetSession::QueryOption(DWORD dwOption, DWORD& dwValue) const
{
DWORD dwLen = sizeof(DWORD);
return InternetQueryOption(m_hSession, dwOption,
&dwValue, &dwLen);
}
BOOL CInternetSession::QueryOption(DWORD dwOption, CString& refString) const
{
ASSERT(dwOption >= INTERNET_FIRST_OPTION &&
dwOption <= INTERNET_LAST_OPTION);
return _AfxQueryCStringInternetOption(m_hSession, dwOption, refString);
}
void CInternetSession::OnStatusCallback(DWORD dwContext,
DWORD dwInternetStatus, LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength)
{
ASSERT(m_bCallbackEnabled != NULL);
if (m_pOldCallback != NULL)
{
(*m_pOldCallback)(m_hSession, dwContext, dwInternetStatus,
lpvStatusInformation, dwStatusInformationLength);
}
}
BOOL CInternetSession::EnableStatusCallback(BOOL bEnable /* = TRUE */)
{
ASSERT(!bEnable || m_hSession != NULL);
if (m_hSession == NULL)
return FALSE;
BOOL bResult = TRUE;
if (bEnable)
{
ASSERT(!m_bCallbackEnabled);
if (!m_bCallbackEnabled)
{
INTERNET_STATUS_CALLBACK pRet =
InternetSetStatusCallback(m_hSession, AfxInternetStatusCallback);
if (pRet != INTERNET_INVALID_STATUS_CALLBACK)
{
m_pOldCallback = pRet;
m_bCallbackEnabled = TRUE;
}
else
AfxThrowInternetException(m_dwContext);
}
}
else
{
ASSERT(m_bCallbackEnabled);
if (m_bCallbackEnabled)
{
InternetSetStatusCallback(m_hSession, NULL);
m_bCallbackEnabled = FALSE;
}
}
return bResult;
}
BOOL CInternetSession::SetCookie(LPCSTR pstrUrl, LPCTSTR pstrCookieName, LPCTSTR pstrCookieData)
{
ASSERT(AfxIsValidString(pstrUrl));
ASSERT(AfxIsValidString(pstrCookieName));
return InternetSetCookie(pstrUrl, pstrCookieName, pstrCookieData);
}
BOOL CInternetSession::GetCookie(LPCSTR pstrUrl, LPCTSTR pstrCookieName, LPTSTR pstrCookieData, DWORD dwBufLen)
{
ASSERT(AfxIsValidString(pstrUrl));
ASSERT(AfxIsValidString(pstrCookieName));
ASSERT(pstrCookieData != NULL);
return InternetGetCookie(pstrUrl, pstrCookieName, pstrCookieData, &dwBufLen);
}
DWORD CInternetSession::GetCookieLength(LPCSTR pstrUrl, LPCTSTR pstrCookieName)
{
ASSERT(AfxIsValidString(pstrUrl));
ASSERT(AfxIsValidString(pstrCookieName));
DWORD dwRet;
if (!InternetGetCookie(pstrUrl, pstrCookieName, NULL, &dwRet))
dwRet = 0;
return dwRet;
}
BOOL CInternetSession::GetCookie(LPCSTR pstrUrl, LPCTSTR pstrCookieName, CString& strCookieData)
{
ASSERT(AfxIsValidString(pstrUrl));
ASSERT(AfxIsValidString(pstrCookieName));
DWORD dwLen = GetCookieLength(pstrUrl, pstrCookieName);
LPTSTR pstrTarget = strCookieData.GetBuffer(dwLen+1);
BOOL bRetVal = InternetGetCookie(pstrUrl, pstrCookieName, pstrTarget, &dwLen);
strCookieData.ReleaseBuffer(dwLen);
if (!bRetVal)
strCookieData.Empty();
return bRetVal;
}
#ifdef _DEBUG
void CInternetSession::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
dc << "m_hSession = " << m_hSession;
dc << "\nm_dwContext = " << m_dwContext;
}
#endif
/////////////////////////////////////////////////////////////////////////////
// Internet Files
CInternetFile::CInternetFile(HINTERNET hFile, HINTERNET /* hSession */,
LPCTSTR pstrFileName, LPCTSTR pstrServer, DWORD dwContext, BOOL bReadMode)
: m_dwContext(dwContext)
{
// caller must set _afxSessionMap()!
ASSERT(AfxIsValidString(pstrServer));
ASSERT(AfxIsValidString(pstrFileName));
ASSERT(hFile != NULL);
m_strFileName = pstrFileName;
m_strServerName = pstrServer;
m_hFile = hFile;
m_bReadMode = bReadMode;
m_pbReadBuffer = NULL;
m_pbWriteBuffer = NULL;
m_nReadBufferSize = 0;
m_nReadBufferPos = 0;
m_nWriteBufferSize = 0;
m_nWriteBufferPos = 0;
m_nReadBufferBytes = 0;
}
CInternetFile::CInternetFile(HINTERNET hFile,
LPCTSTR pstrFileName, CInternetConnection* pConnection, BOOL bReadMode)
{
ASSERT(AfxIsValidString(pstrFileName));
ASSERT(pConnection != NULL);
ASSERT_VALID(pConnection);
ASSERT(hFile != NULL);
_afxSessionMap.SetAt(hFile, pConnection->GetSession());
m_strFileName = pstrFileName;
m_dwContext = pConnection->GetContext();
m_strServerName = pConnection->GetServerName();
m_hFile = hFile;
m_bReadMode = bReadMode;
m_pbReadBuffer = NULL;
m_pbWriteBuffer = NULL;
m_nReadBufferSize = 0;
m_nReadBufferPos = 0;
m_nWriteBufferSize = 0;
m_nWriteBufferPos = 0;
m_nReadBufferBytes = 0;
}
BOOL CInternetFile::QueryOption(DWORD dwOption, LPVOID lpBuffer,
LPDWORD lpdwBufferLength) const
{
ASSERT(dwOption >= INTERNET_FIRST_OPTION &&
dwOption <= INTERNET_LAST_OPTION);
ASSERT_POINTER(lpdwBufferLength, DWORD);
ASSERT(AfxIsValidAddress(lpBuffer, *lpdwBufferLength));
ASSERT(*lpdwBufferLength != 0);
ASSERT(m_hFile != NULL);
return InternetQueryOption(m_hFile, dwOption,
lpBuffer, lpdwBufferLength);
}
BOOL CInternetFile::QueryOption(DWORD dwOption, DWORD& dwValue) const
{
ASSERT(m_hFile != NULL);
DWORD dwLen = sizeof(DWORD);
return InternetQueryOption(m_hFile, dwOption,
&dwValue, &dwLen);
}
BOOL CInternetFile::QueryOption(DWORD dwOption, CString& refString) const
{
ASSERT(dwOption >= INTERNET_FIRST_OPTION &&
dwOption <= INTERNET_LAST_OPTION);
ASSERT(m_hFile != NULL);
return _AfxQueryCStringInternetOption(m_hFile, dwOption, refString);
}
BOOL CInternetFile::SetOption(DWORD dwOption, LPVOID lpBuffer,
DWORD dwBufferLength, DWORD dwFlags /* = 0 */)
{
ASSERT(dwOption >= INTERNET_FIRST_OPTION &&
dwOption <= INTERNET_LAST_OPTION);
ASSERT(AfxIsValidAddress(lpBuffer, dwBufferLength, FALSE));
ASSERT(dwBufferLength != 0);
ASSERT((dwFlags & INTERNET_FLAG_ASYNC) == 0);
// bogus flag?
ASSERT(dwFlags == 0 || ((dwFlags & ISO_VALID_FLAGS) == dwFlags));
return InternetSetOptionEx(m_hFile, dwOption,
lpBuffer, dwBufferLength, dwFlags);
}
BOOL CInternetFile::SetReadBufferSize(UINT nReadSize)
{
ASSERT_VALID(this);
BOOL bRet = TRUE;
if (nReadSize != -1 && nReadSize != m_nReadBufferSize)
{
if (m_nReadBufferPos > nReadSize)
bRet = FALSE;
else
{
if (nReadSize == 0)
{
delete [] m_pbReadBuffer;
m_pbReadBuffer = NULL;
}
else if (m_pbReadBuffer == NULL)
{
m_pbReadBuffer = new BYTE[nReadSize];
m_nReadBufferPos = nReadSize;
}
else
{
DWORD dwMoved = m_nReadBufferSize - m_nReadBufferPos;
LPBYTE pbTemp = m_pbReadBuffer;
m_pbReadBuffer = new BYTE[nReadSize];
if (dwMoved > 0)
{
memcpy(m_pbReadBuffer, pbTemp + m_nReadBufferPos, dwMoved);
m_nReadBufferPos = 0;
m_nReadBufferBytes = dwMoved;
}
else
{
m_nReadBufferBytes = 0;
m_nReadBufferPos = nReadSize;
}
delete [] pbTemp;
}
m_nReadBufferSize = nReadSize;
}
}
return bRet;
}
BOOL CInternetFile::SetWriteBufferSize(UINT nWriteSize)
{
ASSERT_VALID(this);
BOOL bRet = TRUE;
if (nWriteSize != m_nWriteBufferSize)
{
if (m_nWriteBufferPos > nWriteSize)
Flush();
if (nWriteSize == 0)
{
delete [] m_pbWriteBuffer;
m_pbWriteBuffer = NULL;
}
else if (m_pbWriteBuffer == NULL)
{
m_pbWriteBuffer = new BYTE[nWriteSize];
m_nWriteBufferPos = 0;
}
else
{
LPBYTE pbTemp = m_pbWriteBuffer;
m_pbWriteBuffer = new BYTE[nWriteSize];
memcpy(m_pbWriteBuffer, pbTemp, m_nWriteBufferPos);
delete [] pbTemp;
}
m_nWriteBufferSize = nWriteSize;
}
return bRet;
}
LONG CInternetFile::Seek(LONG lOffset, UINT nFrom)
{
ASSERT_VALID(this);
ASSERT(m_hFile != NULL);
ASSERT(m_bReadMode);
ASSERT(m_pbReadBuffer == NULL);
// can't do this on a file for writing
// can't do this on a file that's got a buffer
if (!m_bReadMode || m_pbReadBuffer != NULL)
AfxThrowInternetException(m_dwContext, ERROR_INVALID_HANDLE);
switch (nFrom)
{
case begin:
nFrom = FILE_BEGIN;
break;
case current:
nFrom = FILE_CURRENT;
break;
case end:
nFrom = FILE_END;
break;
default:
ASSERT(FALSE); // got a bogus nFrom value
AfxThrowInternetException(m_dwContext, ERROR_INVALID_PARAMETER);
break;
}
LONG lRet;
lRet = InternetSetFilePointer(m_hFile, lOffset, NULL, nFrom, m_dwContext);
if (lRet == -1)
AfxThrowInternetException(m_dwContext);
return lRet;
}
CInternetFile::~CInternetFile()
{
if (m_hFile != NULL)
{
#ifdef _DEBUG
USES_CONVERSION;
LPCTSTR pszName = A2CT(GetRuntimeClass()->m_lpszClassName);
TRACE2("Warning: destroying an open %s with handle %8.8X\n",
pszName, m_hFile);
#endif
Close();
}
if (m_pbReadBuffer != NULL)
delete m_pbReadBuffer;
if (m_pbWriteBuffer != NULL)
delete m_pbWriteBuffer;
}
void CInternetFile::Abort()
{
ASSERT_VALID(this);
if (m_hFile != NULL)
Close();
m_strFileName.Empty();
}
void CInternetFile::Flush()
{
if (m_pbWriteBuffer != NULL && m_nWriteBufferPos > 0)
{
DWORD dwBytes;
if (!InternetWriteFile(m_hFile, m_pbWriteBuffer,
m_nWriteBufferPos, &dwBytes))
AfxThrowInternetException(m_dwContext);
if (dwBytes != m_nWriteBufferPos)
AfxThrowInternetException(m_dwContext);
m_nWriteBufferPos = 0;
}
}
void CInternetFile::Close()
{
if (m_hFile != NULL)
{
Flush();
InternetCloseHandle(m_hFile);
_afxSessionMap.RemoveKey(m_hFile);
m_hFile = NULL;
if (m_pbWriteBuffer != NULL)
{
delete [] m_pbWriteBuffer;
m_pbWriteBuffer = NULL;
}
if (m_pbReadBuffer != NULL)
{
delete [] m_pbReadBuffer;
m_pbReadBuffer = NULL;
}
}
}
UINT CInternetFile::Read(LPVOID lpBuf, UINT nCount)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -