亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? internetdownload.cpp

?? 光盤中存放的是書中涉及的所有實例的源代碼和經過編譯后的應用程序。所有程序均經過測試
?? CPP
字號:
#include "stdafx.h"

#include <direct.h>
#include <process.h>
#include <io.h>
#include "InternetDownload.h"


// Filenames to create if a link just uses a directory for a reference -- 
// g_szDefPage is for HTML pages, g_szUnknown is for multimedia files (in which
// case something fatal happened)
const char *g_szDefPage = "index.htm";
const char *g_szUnknown = "unknown.fil";

// The default prefix -- we only support HTTP protocols
static const char *szHttp = "http://";

// Request flags for session initialization:
//	Use existing INET setup, don't redirect to other servers automatically,
//	don't save pages in the browser's cache, always reload a page from the 
//	server (don't use the browser's cached copy)
static DWORD dwHttpRequestFlags =
	   INTERNET_FLAG_EXISTING_CONNECT|
	   INTERNET_FLAG_NO_AUTO_REDIRECT|
       INTERNET_FLAG_DONT_CACHE|
       INTERNET_FLAG_RELOAD; 

// Types of data that we can handle -- we handle it all!
static const TCHAR szHeaders[] = 
		_T("Accept: */* \r");

// Constructor
CInternetDownload::CInternetDownload()
{
	m_hSession = NULL;
	m_nUniqueCount = 0;
}

// Destructor
CInternetDownload::~CInternetDownload()
{
}

// Initialize a new WinInet session
CInternetDownload::RESULTS CInternetDownload::OpenSession(BOOL bUseProxy, CString& strProxyName)
{
	CInternetDownload::RESULTS ret;

	// Open the new session
	m_hSession = ::InternetOpen("SiteSnagger",
					bUseProxy?INTERNET_OPEN_TYPE_PROXY:INTERNET_OPEN_TYPE_PRECONFIG,
					bUseProxy?(LPCTSTR)strProxyName:(LPCTSTR)NULL,
					NULL,0);

	// Did it work??
	if(m_hSession != NULL)
	{
		DWORD dwTimeout = 4000;
		::InternetSetOption(m_hSession,INTERNET_OPTION_CONNECT_TIMEOUT,
									&dwTimeout,sizeof(dwTimeout));
						
		ret = SUCCESS;
	}
	else ret = BAD_URL;

	return(ret);
}

// Close the WinInet session
void CInternetDownload::CloseSession()
{
	::InternetCloseHandle(m_hSession);
}

//////////////////////
// Private operations
//////////////////////

// Gets the specified file from the web server
CInternetDownload::RESULTS CInternetDownload::DoGet(CString& strURL, BYTE **pbyBuffer, int& nLen, 
											BOOL bIsTextPage)
{
	CInternetDownload::RESULTS nRetCode = UNKNOWN_ERROR;
	CString strTempURL = strURL;
	HINTERNET hConnect = NULL;
	HINTERNET hURL = NULL;
   
    try
	{
		// Initalize returned data count
		nLen = 0;
		
		// Make sure that we have the proper protocol prefix
		strTempURL.MakeLower();
		if(strTempURL.Find(szHttp) < 0)
		{
			strTempURL = szHttp+strURL;
			strURL = szHttp+strURL;
		}
		else strTempURL = strURL;

		// Make sure this URL looks valid
		CString strServer,strObject,strUser,strPassword;
		INTERNET_PORT nPort;
		DWORD dwServiceType;

		// Bail if it doesn't look okay
		strTempURL.SpanExcluding("#");
		if(!AfxParseURLEx(strTempURL,dwServiceType,strServer,strObject,nPort,
						strUser,strPassword,ICU_NO_ENCODE))
			return(CInternetDownload::BAD_URL);

		// Establish a server connection
		hConnect = ::InternetConnect(m_hSession,strServer,
                                          INTERNET_INVALID_PORT_NUMBER,
                                          "",
                                          "",
                                          INTERNET_SERVICE_HTTP,
                                          0,
                                          0) ;

		// Open an HTTP protocol session
		strObject = strObject.SpanExcluding("#");
		const char *szTempX[2] = {szHeaders,NULL};
		hURL = ::HttpOpenRequest(hConnect,"GET",strObject,
									HTTP_VERSION,NULL,
                                    szTempX,dwHttpRequestFlags,0) ;

		// Send the "get" request
 		::HttpSendRequest(hURL,NULL,0,0,0);

		// If it failed, then get out now
	    if(hURL == NULL) 
			return(CInternetDownload::BAD_URL);

		// Check the return code
		DWORD dwRet, dwLen;
		char szTemp[500];
		dwLen = sizeof(szTemp);
		::HttpQueryInfo(hURL,HTTP_QUERY_STATUS_CODE,szTemp,&dwLen,NULL);
		dwRet = (DWORD) atoi(szTemp);
		dwLen = sizeof(szTemp);
		
		m_dwRet = dwRet;

		// Was this page redirected?
		if(dwRet == HTTP_STATUS_MOVED || dwRet == HTTP_STATUS_REDIRECT ||
			       dwRet == HTTP_STATUS_REDIRECT_METHOD)
		{                  
			// Yep...get the new base location
			CString strNewLocation;
			::HttpQueryInfo(hURL,HTTP_QUERY_LOCATION,NULL,&dwLen,0);
			::HttpQueryInfo(hURL,HTTP_QUERY_LOCATION,
						strNewLocation.GetBufferSetLength(dwLen), 
						&dwLen,0);
			strNewLocation.ReleaseBuffer(dwLen);

			// Make sure that the new address contains a server name too
			CString strNewServer;
			AfxParseURLEx(strNewLocation,dwServiceType,strNewServer,strObject,nPort,
							strUser,strPassword,ICU_NO_ENCODE);

			// Is the server name missing for some reason??
			if(strNewServer.IsEmpty())
			{
				// Yes, add it back in
				CString strTempLocation = strServer;
				if(strNewLocation.Left(1) != "/")
					strTempLocation += "/";
				strTempLocation += strNewLocation;
				strNewLocation = strTempLocation;
			}

			// Save the new location
			strURL = strNewLocation;

			::InternetCloseHandle(hURL);
			::InternetCloseHandle(hConnect);
			return(LOCATION_MOVED);
		}
		else if(dwRet == HTTP_STATUS_REQUEST_TIMEOUT || 
					dwRet == HTTP_STATUS_GATEWAY_TIMEOUT ||
					dwRet == HTTP_STATUS_NOT_FOUND)
		{
			Sleep(500L);
			::InternetCloseHandle(hURL);
			::InternetCloseHandle(hConnect);
			return(TIMEOUT);
		}
		else if(dwRet == HTTP_STATUS_OK)
		{
			// Get the data for the file
			BYTE *pbyTempBuffer = *pbyBuffer;
			DWORD dwTotalBytes = 0;
			DWORD dwBytesRead;
			BOOL bOkay = TRUE;

			// Find out how much data we have
			dwLen = sizeof(szTemp);
			::HttpQueryInfo(hURL,HTTP_QUERY_CONTENT_LENGTH,szTemp,&dwLen,NULL);
			dwLen = (DWORD) atol(szTemp);

			// Just make sure we didn't get a stupid length value back
			if(dwLen <= 0) 
				dwLen = 10000;

			// Keep reading data until we've gotten it all
			while(bOkay)
			{
				// Read the data
				bOkay = ::InternetReadFile(hURL,pbyTempBuffer,dwLen,&dwBytesRead);

				// Add to the counts
				if(bOkay && dwBytesRead > 0 && dwTotalBytes < MAX_INET_BUFFER-1)
				{
					dwTotalBytes += dwBytesRead;
					pbyTempBuffer += dwBytesRead;
				}
				else break;
			}

			// NULL terminate the buffer
			pbyTempBuffer[0] = '\0';
			nLen = dwTotalBytes;

			// Close the file
			::InternetCloseHandle(hURL);
			::InternetCloseHandle(hConnect);

			return(SUCCESS);
		}
	}
	catch(...)
	{
		// Fatal error, just get out
		if(hURL) 
			::InternetCloseHandle(hURL);

		if(hConnect)
			::InternetCloseHandle(hConnect);

		return(UNKNOWN_ERROR);
	}
	return (UNKNOWN_ERROR);
}

// Saves the page in memory to the specified file
CInternetDownload::RESULTS CInternetDownload::SaveFile(CString& strFileName, LPCTSTR lpszDirectory,
								BYTE *pbyBuffer, int nLen)
{
	CFile fileOut;
	CFileException ex;
	CString strTempName = lpszDirectory+strFileName;
	strTempName = strTempName.SpanExcluding("#");

	// Open the local file for create 
	if(fileOut.Open(strTempName,CFile::modeCreate|CFile::modeWrite,&ex))
	{
		// Write the data
		fileOut.Write(pbyBuffer,nLen);

		// Close the file
		fileOut.Close();
	}
	else return(BAD_FILENAME);

	return(SUCCESS);
}

/////////////////////
// Public operations
/////////////////////

// Retrieves a page from the web server by calling DoGet().  Also handles
// redirection to other servers as well as retries.
CInternetDownload::RESULTS CInternetDownload::GetPage(CString& strURL, BYTE **pbyBuffer, int& nLen,
									BOOL bRedirectOkay)
{
	int nRetries = 2;
	CInternetDownload::RESULTS ret;

	do 
	{
		// Get the page
		ret = DoGet(strURL,pbyBuffer,nLen,TRUE);
	}
	while(nRetries-- && ((ret == LOCATION_MOVED && bRedirectOkay) || 
							ret == TIMEOUT));

	return(ret);
}

// Retrieves a file from the web server by calling DoGet().  Handles
// redirection to other web servers as well as retries.
CInternetDownload::RESULTS CInternetDownload::GetFile(CString& strURL, BYTE **pbyBuffer, int& nLen)
{
	int nRetries = 2;
	CInternetDownload::RESULTS ret;

	do 
	{
		// Get the file
		ret = DoGet(strURL,pbyBuffer,nLen,FALSE);
	}
	while(nRetries-- && (ret == LOCATION_MOVED || ret == TIMEOUT));

	return(ret);
}

// Reset the "tie breaker" filename counter used by GenerateUniqueFileName().
void CInternetDownload::ResetUniqueCount()
{
	m_nUniqueCount = 0;
}

// Generates a unique filename for the specified file by searching through
// the specified list of downloaded files and looking for a match.  If one
// is found a unque name is generated by taking the old name and appending
// "__x" to the main part of the filename (where x is m_nUniqueCount).
void CInternetDownload::GenerateUniqueFileName(CString& strName, CString& strFileName, 
						MAP_FILES_ARRAY &arrNameMap, BOOL bIsText)
{
	BOOL bFound = FALSE;
	MAP_FILES entry;
	CString strTempName = strName;
	strTempName.MakeLower();
	CString strTempFileName;

	// Split apart the URL
	CString strServer,strObject,strUser,strPassword;
	INTERNET_PORT nPort;
	DWORD dwServiceType;
	AfxParseURLEx(strName,dwServiceType,strServer,strObject,nPort,strUser,
							strPassword,ICU_NO_ENCODE);

	// Get a valid filename
	strFileName = SplitFileName(strObject,CInternetDownload::FNAME|CInternetDownload::EXT);

	// Is there a filename at all??
	if(strFileName.IsEmpty())
	{
		// No, use a default HTML name or a fatal error name
		if(bIsText)
			strFileName = g_szDefPage;
		else strFileName = g_szUnknown;
	}
	else
	{
		// HTML file??
		if(bIsText)
		{
			// Yes, always make sure it ends in .htm, this assures that things
			// such as Active Server Pages (.asp) are loaded correctly.
			CString strExt = SplitFileName(strFileName,CInternetDownload::EXT);
			strExt.MakeLower();

			if(strExt.Find("#") < 0 && strExt != ".htm" && strExt != ".html")
			{
				strFileName += ".htm";
			}
		}
	}

	// Get the new filename
	strTempFileName = strFileName;
	strTempFileName.MakeLower();
	strTempName.MakeLower();

	MAP_FILES *pEntry;
	CString strPage;

	POSITION pos = arrNameMap.GetStartPosition();

	// Name already there???
	for(int nEntryNum = 0; nEntryNum < arrNameMap.GetCount(); nEntryNum++)
	{
		arrNameMap.GetNextAssoc(pos,strPage,(CObject *&) pEntry);
		if(pos == NULL || pEntry == NULL) break;

		// This page is already in the collection, don't create a name for it
		if(strPage == strTempName)
		{
			strName = strPage;
			strFileName = pEntry->strFileName;
			return;
		}

		// Found a duplicate output filename -- generate a unique one now
		if(pEntry->strFileName == strTempFileName)
		{
			// Get out of the loop now so we don't increment the entry number
			bFound = TRUE;
			break;
		}
	}

	// If we found a duplicate, then make sure we create a unique filename using
	// the m_nUniqueCount.
	if(bFound)
	{
		CString strTemp;
		CString strNewFileName;

		// Find the extension
		int nIndex = strFileName.Find(".");
		if(nIndex >= 0)
			strNewFileName = strFileName.Left(nIndex);
		else strNewFileName = strFileName;

		// Append the tie breaker to the main part of the name
		strTemp.Format("__%d",++m_nUniqueCount);
		strNewFileName += strTemp;
		if(nIndex >= 0)
			strNewFileName += strFileName.Mid(nIndex);

		// Save the new name
		strFileName = strNewFileName;
	}
}

// Parses a filename into the specified parts and returns a CString that
// consists of the specified parts.
CString CInternetDownload::SplitFileName(LPCTSTR lpszPath, int nSplit)
{
	CString strResult;

	char szPath[800],szDrive[800],szFileName[800],szExt[800];
	_splitpath(lpszPath,szDrive,szPath,szFileName,szExt);

	if(nSplit & CInternetDownload::DRIVE)
		strResult += szDrive;
	if(nSplit & CInternetDownload::PATH)
		strResult += szPath;
	if(nSplit & CInternetDownload::FNAME)
		strResult += szFileName;
	if(nSplit & CInternetDownload::EXT)
		strResult += szExt;

	return(strResult);
}

CString CInternetDownload::GetErrorText()
{
	CString strError;

	switch(m_dwRet)
	{
		case HTTP_STATUS_MOVED:
		case HTTP_STATUS_REDIRECT:
		case HTTP_STATUS_REDIRECT_METHOD:
			strError = "Redirected, but not found";
			break;

		case HTTP_STATUS_REQUEST_TIMEOUT:
		case HTTP_STATUS_GATEWAY_TIMEOUT:
			strError = "Timed out on request";
			break;

		case HTTP_STATUS_NOT_FOUND:
		case HTTP_STATUS_BAD_REQUEST:
		case HTTP_STATUS_GONE:
			strError = "Page or file not found";
			break;
	
		case HTTP_STATUS_DENIED:
		case HTTP_STATUS_PAYMENT_REQ:
		case HTTP_STATUS_FORBIDDEN:
			strError = "Access denied";
			break;

		case HTTP_STATUS_PROXY_AUTH_REQ:
			strError = "Proxy authentication required";
			break;

		default:
			strError.Format("WinInet error %d",m_dwRet);
			break;
	}

	return(strError);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区二区免费在线观看视频| 欧美韩日一区二区三区四区| 国产成人a级片| 一区二区三区在线观看国产| 日韩一区二区三区电影| proumb性欧美在线观看| 麻豆精品在线看| 亚洲精品久久久久久国产精华液| 精品国产免费一区二区三区四区| 在线观看日韩精品| 国产成人综合自拍| 另类成人小视频在线| 亚洲一区二区三区爽爽爽爽爽 | 91网址在线看| 六月丁香婷婷久久| 亚洲成人av中文| 亚洲欧美电影一区二区| 欧美激情中文字幕| 精品少妇一区二区三区日产乱码 | 欧美一a一片一级一片| 国产精品一二一区| 免费成人av在线播放| 亚洲成人激情自拍| 亚洲精品成人天堂一二三| 国产欧美日韩精品在线| 精品久久五月天| 日韩精品在线看片z| 欧美精品色一区二区三区| 色婷婷综合久久久久中文| caoporm超碰国产精品| 成人午夜av影视| 成人妖精视频yjsp地址| 国产精品99久久久久| 国产主播一区二区三区| 经典三级视频一区| 另类小说视频一区二区| 蜜臀av一区二区在线免费观看| 三级一区在线视频先锋 | 亚洲 欧美综合在线网络| 一区二区欧美在线观看| 一区二区三区精品在线| 一区二区三区在线视频观看58 | 亚洲一级二级三级| 亚洲女与黑人做爰| 亚洲欧美日韩成人高清在线一区| 亚洲欧洲美洲综合色网| 亚洲三级免费观看| 亚洲男同性视频| 一区二区三区欧美激情| 午夜精品在线看| 蜜臀va亚洲va欧美va天堂| 久久99精品国产麻豆婷婷洗澡| 韩国精品久久久| 成人小视频在线观看| av不卡在线观看| 色94色欧美sute亚洲线路一ni| 在线日韩国产精品| 69堂成人精品免费视频| 精品久久久久久久久久久久包黑料| 欧美tickling挠脚心丨vk| 久久九九久久九九| 亚洲欧美日韩中文播放| 性做久久久久久| 久久不见久久见中文字幕免费| 国内精品久久久久影院薰衣草 | 欧美精品久久一区二区三区| 欧美一区二区三区免费大片| 久久综合狠狠综合久久激情| 中文字幕一区日韩精品欧美| 亚洲一区二区视频| 老司机精品视频一区二区三区| 国产精品中文有码| 97久久精品人人做人人爽50路| 欧美视频一区二区三区在线观看| 日韩一区二区在线看片| 久久先锋影音av鲁色资源| 国产日韩精品一区二区浪潮av | 激情五月婷婷综合网| 成人免费视频网站在线观看| 在线区一区二视频| 精品国产91久久久久久久妲己 | 亚洲视频一二区| 午夜精品久久久久久久久久久| 精品亚洲porn| 99久久精品国产导航| 欧日韩精品视频| 久久亚洲精精品中文字幕早川悠里 | 久久综合狠狠综合久久激情| 亚洲色大成网站www久久九九| 麻豆精品视频在线观看免费 | 欧美性色黄大片| 久久日韩精品一区二区五区| 亚洲综合免费观看高清完整版在线| 精品亚洲国产成人av制服丝袜| 色天天综合久久久久综合片| 精品国产百合女同互慰| 亚洲国产精品久久人人爱| 国产.欧美.日韩| 欧美日韩不卡一区二区| 国产精品天干天干在线综合| 男人的天堂久久精品| 色欧美乱欧美15图片| 国产日韩视频一区二区三区| 日本aⅴ免费视频一区二区三区| 97精品久久久午夜一区二区三区| 精品国产自在久精品国产| 亚洲午夜一区二区| 91在线精品一区二区三区| 欧美精品一区二区久久久| 午夜精品免费在线| 欧美亚洲综合网| 自拍偷拍亚洲综合| 国产成人精品影视| 精品久久一区二区| 日本成人在线电影网| 欧美午夜精品一区| 亚洲蜜桃精久久久久久久| 高清日韩电视剧大全免费| 久久综合久久鬼色中文字| 日本aⅴ免费视频一区二区三区| 日本精品视频一区二区| 中文字幕亚洲区| 成人精品小蝌蚪| 国产日韩三级在线| 国产精品一区在线| 久久日韩粉嫩一区二区三区| 黄色日韩网站视频| 日韩午夜激情免费电影| 日本欧洲一区二区| 日韩一区二区三区四区| 日本成人在线不卡视频| 欧美精品国产精品| 日韩精品久久理论片| 91精品国产综合久久久久久久久久 | 亚洲人午夜精品天堂一二香蕉| 国产一区二区三区精品视频| 亚洲精品在线一区二区| 久久99精品一区二区三区| 日韩欧美国产不卡| 美腿丝袜亚洲三区| 日韩亚洲国产中文字幕欧美| 蜜臀av一级做a爰片久久| 51久久夜色精品国产麻豆| 视频在线观看一区| 欧美一区二区国产| 激情六月婷婷综合| 国产视频一区二区在线| 大胆亚洲人体视频| 亚洲欧美日韩国产综合在线 | 欧美三级日韩三级| 图片区小说区国产精品视频| 欧美一区二区三区啪啪| 久久99精品国产91久久来源| 久久女同性恋中文字幕| 国产黑丝在线一区二区三区| 国产精品青草久久| 色狠狠色狠狠综合| 日韩中文字幕亚洲一区二区va在线| 337p亚洲精品色噜噜噜| 麻豆高清免费国产一区| 久久嫩草精品久久久精品| 成人一区二区三区在线观看 | 高清在线观看日韩| 亚洲精品日韩专区silk| 欧美久久一区二区| 国产真实乱偷精品视频免| 国产精品成人一区二区三区夜夜夜| 一本色道久久综合亚洲aⅴ蜜桃 | av一本久道久久综合久久鬼色| 亚洲伦理在线免费看| 欧美一区二区三级| 国产福利一区二区三区在线视频| 亚洲色图视频网站| 欧美一区二区视频网站| 懂色av一区二区夜夜嗨| 亚洲国产精品久久人人爱| 久久午夜色播影院免费高清| 91麻豆福利精品推荐| 美女在线观看视频一区二区| 国产精品久久综合| 欧美一区日韩一区| 成人av免费观看| 日韩黄色在线观看| 国产精品午夜久久| 欧美一区二区三区在线看| 成+人+亚洲+综合天堂| 日韩一区精品视频| 亚洲欧洲日产国产综合网| 欧美一二区视频| 在线一区二区三区| 国产大陆a不卡| 日韩高清国产一区在线| 亚洲欧洲99久久| 久久综合丝袜日本网| 欧美性生活一区| 成人免费毛片片v| 久久精品噜噜噜成人88aⅴ| 亚洲精品乱码久久久久久黑人| 国产亚洲女人久久久久毛片| 欧美日本一区二区三区四区|