📄 internet.cpp
字号:
{
//收到的数据不完整
//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 + -