⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 internet.cpp

📁 wince 下socket实现的HTTP类
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			//收到的数据不完整
			//dwResult = INTERNET_DOWNLOAD_FAILED ;	
			fclose(fp);
			DeleteFile(mission.szPathname);
			goto DDERROR;
		}
		fflush(fp);
		fclose(fp);
		free(pUrl);
		m_bDownloading = FALSE ;
		return TRUE;
	}
	catch ( ... )
	{
		goto DDERROR;
	}

DDERROR:
	free(pUrl);
	m_bDownloading = FALSE ;
	return FALSE;

}

//download urgent mission.

BOOL CInternet::DownloadUrgence(HWND hWnd,LPCWSTR pszUrl,LPCWSTR pszPathname, LPCSTR lpszPost,int iPostLength)
{	

	static ITEM_LOAD item;
	memset(&item,0,sizeof(item));

	//Cancel current mission
	CancelCurrentMission() ;


	wstring strfileName = _T("");
	//get local path name.
	WCHAR szPathname[MAX_PATH] = INTERNET_DOWNLOAD_DIRECTORY;
	if (wcslen(pszPathname) != 0)
	{//have file name.
		strfileName = pszPathname;
		wcscat(szPathname,strfileName.c_str()/*GetUniqueFilename(szPathname,pszFilename).c_str()*/);//mod by luis 2008-7-25 11:12
	}else
	{//have no file name.	
		wchar_t* pName = (wchar_t*)pszUrl;
		if (wcsrchr(pName,_T('/')) != NULL)
			pName = wcsrchr(pName,_T('/')) + 1;
		else if (wcsrchr(pName,_T('\\')) != NULL)
			pName = wcsrchr(pName,_T('\\')) + 1;

		strfileName = pName;
		wcscat(szPathname,strfileName.c_str()/*GetUniqueFilename(szPathname,pName).c_str()*/);//mod by luis 2008-7-25 11:12
	}
	
	//added by Ben 2008-09-26
	m_bIsDownloadOK = FALSE;
	//add to download missions.	
	return PushMission(ITEM_LOAD_MISSION(hWnd, pszUrl, szPathname,lpszPost,iPostLength));
}
//close.
BOOL CInternet::Close()
{
	return (Stop() == 0);
}


BOOL CInternet::IsDownloading()
{
	return m_bDownloading;
}

//check disk space - by free space.
//the function execute ClearDownloadDirectory while free space less then 1M 
void CInternet::CheckDiskSpace(int nFreeSize)
{
	//get disk free space.
	ULARGE_INTEGER uAvailable,uTotal,uFree;
	memset(&uAvailable,0,sizeof(uAvailable));
	memset(&uTotal,0,sizeof(uTotal));
	memset(&uFree,0,sizeof(uFree));
	if (!GetDiskFreeSpaceEx(INTERNET_DOWNLOAD_DIRECTORY,&uAvailable,&uTotal,&uFree))
		return ;
		
	//check whether free disk space is under this value
	if (uFree.HighPart != 0 || uFree.LowPart > nFreeSize)
		return ;
	ClearDownloadDirectory();
}
/****************************************************************************************/
/*          
//		修改文件下载代码			                                                    */
//		Modify by Ben Zhan		
// 2009.2.6 fixed bug that post message does not right after cancel event happens
/****************************************************************************************/
void CInternet::DownloadThread(HANDLE hEvent)
{
	static ITEM_LOAD item;
	SocketInit();
	

	int	 nDownloadTimes = 0;
	ITEM_LOAD_MISSION mission;

	while(1)
	{
		//check whether need exit.		
		if (::WaitForSingleObject(hEvent,300) == WAIT_OBJECT_0)
			break;
		
		//get mission.			
		if (GetMission(mission) != 0)
			continue;

		DWORD dwResult = INTERNET_DOWNLOAD_FAILED;  //modified by Ben 2009-02-06
		m_bCancel = FALSE;//add by luis 2008-12-16

		m_bIsDownloadOK = FALSE;

		memset(&item,0,sizeof(item));
		wcscpy(item.szUrl,mission.szUrl);
		wcscpy(item.szPathname,mission.szPathname);

		memset(&m_CurrentDownloadItem,0,sizeof(m_CurrentDownloadItem));
		wcscpy(m_CurrentDownloadItem.szUrl,mission.szUrl);
		wcscpy(m_CurrentDownloadItem.szPathname,mission.szPathname);

		if (DownloadMission(mission))
			::PostMessage(mission.hWnd,WM_INTERNET_DOWNLOAD,INTERNET_DOWNLOAD_FINISHED,(LPARAM)&item);
		else
		{
			if (m_bCancel)
				dwResult = INTERNET_DOWNLOAD_CANCEL;

			::PostMessage(mission.hWnd,WM_INTERNET_DOWNLOAD,dwResult,(LPARAM)&item);
		}
		m_bIsDownloadOK = TRUE;			
	}
	::ExitThread(0);
}

//add to download missions.
int CInternet::AddMission(const ITEM_LOAD_MISSION &mission)
{
	if (!m_lockMissions.Lock(1000))
		return -1;

	m_missions.push_back(mission);

	m_lockMissions.Unlock();

	return 0;
}
//push to download missions.
int CInternet::PushMission(const ITEM_LOAD_MISSION &mission)
{

	if (!m_lockMissions.Lock(1000))
		return -1;
	vector<ITEM_LOAD_MISSION>::iterator it;
	it = m_missions.begin();

	m_missions.insert(it,mission);

	m_lockMissions.Unlock();

	return 0;
}
//delete mission from download missions.
int CInternet::DeleteMission(HWND hWnd,LPCWSTR pszUrl)
{
	if (!m_lockMissions.Lock(1000))
		return -1;
	static ITEM_LOAD item;
	ITEM_LOAD_MISSION mission;

	for (vector<ITEM_LOAD_MISSION>::iterator it = m_missions.begin(); it != m_missions.end(); it++)
	{
			if (it->hWnd == hWnd && wcscmp(it->szUrl,pszUrl) == 0)
			{
				mission=(*it);
				memset(&item,0,sizeof(item));
				wcscpy(item.szUrl,mission.szUrl);
				wcscpy(item.szPathname,mission.szPathname);
				::PostMessage(mission.hWnd,WM_INTERNET_DOWNLOAD,INTERNET_DOWNLOAD_CANCEL,(LPARAM)&item);
				
				m_missions.erase(it);
				m_lockMissions.Unlock();
				return 0;
			}
	}


	m_lockMissions.Unlock();

	return -1;
}

//get download mission.
int CInternet::GetMission(ITEM_LOAD_MISSION &mission)
{
	if (!m_lockMissions.Lock(1000))
		return -1;

	int nRet = -1;
	if (!m_missions.empty())
	{
		mission = *m_missions.begin();
		m_missions.erase(m_missions.begin());

		nRet = 0;
	}

	m_lockMissions.Unlock();

	return nRet;
}
/****************************************************************************************/
/*                                                                                      */
/****************************************************************************************/
//clear all download mission.
void CInternet::ClearAllDownloadMissions()
{
	ITEM_LOAD_MISSION mission;
	if (!m_lockMissions.Lock(1000))
		return ;
	static ITEM_LOAD item;
	for (vector<ITEM_LOAD_MISSION>::iterator it = m_missions.begin(); it != m_missions.end(); it++)
	{		
		memset(&item,0,sizeof(item));
		wcscpy(item.szUrl,mission.szUrl);
		wcscpy(item.szPathname,mission.szPathname);
		mission = *it;
		::PostMessage(mission.hWnd,WM_INTERNET_DOWNLOAD,INTERNET_DOWNLOAD_CANCEL,(LPARAM)&item);
	}
	m_missions.clear();

	m_lockMissions.Unlock();

	return ;
}

BOOL CInternet::IsMissionEmpty()
{
	return m_missions.empty();
}
/****************************************************************************************/
/*                                                                                      */
/****************************************************************************************/
//cancel current mission.
int CInternet::CancelCurrentMission(HWND hWnd,LPCWSTR pszUrl)
{
	m_bCancel = TRUE;
	if(IsDownloading())
	{
		if( hWnd!=NULL && pszUrl!=NULL)
		{
			if(wcscmp(m_CurrentDownloadItem.szUrl,pszUrl))
				return -1;
		}
		//设置取消事件
		SetEvent(m_hCancelEvent);
		//等待下载退出
// 		while( IsDownloading() )
// 			Sleep(500);
// 		//重置事件
// 		ResetEvent(m_hCancelEvent);
		return 0;
	}
	return -1;	
}


/****************************************************************************************/
/*                                                                                      */
/****************************************************************************************/
//the function emptes out disk space for need size 
/*void CInternet::EmptyOutDiskSpace(int nNeedSize)
{
	wstring strDirectory = _T("");
	strDirectory = INTERNET_DOWNLOAD_DIRECTORY;
	strDirectory += _T("\\*.*");

	WIN32_FIND_DATA filedata;
	memset(&filedata,0,sizeof(filedata));
	HANDLE hFinder = FindFirstFile(strDirectory.c_str(),&filedata);	
	if (hFinder == INVALID_HANDLE_VALUE)
		return ;
	
	while(1)
	{	
		if ((filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
		{
			wstring strPathname = INTERNET_DOWNLOAD_DIRECTORY;
			strPathname += filedata.cFileName;
			
			DeleteFile(strPathname.c_str());
		}

		if (!FindNextFile(hFinder,&filedata))
			break;	
	}

	FindClose(hFinder);
}*/
void CInternet::ClearDownloadDirectory()
{
	wstring strDirectory = _T("");
	strDirectory = INTERNET_DOWNLOAD_DIRECTORY;
	strDirectory += _T("\\*.*");

	WIN32_FIND_DATA filedata;
	memset(&filedata,0,sizeof(filedata));
	HANDLE hFinder = FindFirstFile(strDirectory.c_str(),&filedata);	
	if (hFinder == INVALID_HANDLE_VALUE)
		return ;
	
	while(1)
	{	
		if ((filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
		{
			wstring strPathname = INTERNET_DOWNLOAD_DIRECTORY;
			strPathname += filedata.cFileName;
			
			DeleteFile(strPathname.c_str());
		}

		if (!FindNextFile(hFinder,&filedata))
			break;	
	}

	FindClose(hFinder);
}



//get unique file name.
wstring CInternet::GetUniqueFilename(LPCWSTR pszDirectory,LPCWSTR pszFilename)
{
	if (!IsFileExist(pszDirectory,pszFilename))
		return wstring(pszFilename);

	for (int i = 0; i < 100 ; i++)
	{
		WCHAR szTmpFilename[MAX_PATH] = _T("");

		WCHAR* pDot = wcsrchr(pszFilename,_T('.'));
		if (pDot != NULL)
		{
			WCHAR szTmpName[MAX_PATH] = _T("");
			wcsncpy(szTmpName,pszFilename,wcslen(pszFilename) - wcslen(pDot));
			
			swprintf(szTmpFilename,_T("%s-%d%s"),szTmpName,i,pDot);
		}else
			swprintf(szTmpFilename,_T("%s-%d"),pszFilename,i);
		
		if (!IsFileExist(pszDirectory,szTmpFilename))
			return wstring(szTmpFilename);
	}

	return wstring(pszFilename);
}

//whether file is exist.
BOOL CInternet::IsFileExist(LPCWSTR pszDirectory,LPCWSTR pszFilename)
{
	WCHAR szPathname[MAX_PATH] = _T("");
	swprintf(szPathname,_T("%s\\%s"),pszDirectory,pszFilename);

	WIN32_FILE_ATTRIBUTE_DATA attrib;
	memset(&attrib,0,sizeof(attrib));	
	if (!GetFileAttributesEx(szPathname,GetFileExInfoStandard,&attrib))
		return FALSE;

	return ((attrib.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY);
}

//get file size.
int CInternet::GetFileSize(LPCWSTR pszFilename)
{
	WIN32_FILE_ATTRIBUTE_DATA attrib;
	memset(&attrib,0,sizeof(attrib));	
	if (!GetFileAttributesEx(pszFilename,GetFileExInfoStandard,&attrib))
		return 0;

	if ((attrib.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
		return 0;

	return attrib.nFileSizeLow;
}



//end of file.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -