📄 mainfrm.cpp
字号:
proxy->ProxyAddr = Proxyaddr;
proxy->port = port;
Delete_Proxy_Record(proxy);
delete proxy;
proxy = NULL;
m_ie_state = false;
}
}
//**********************************************************************************
//** 函数名称: CMainFrame::SetHttpProxy
//** 输 入: CString ip; UINT port
//** 输 出: BOOL
//** 功能描述: 设置IE代理
//** 作 者: shuyi
//** 创建日期: 2007-7-12
//**************修改记录************************************************************
//** 修 改 者: shuyi
//** 修改日期: 2007-7-12
//** 修改描述:
//** 版 本: V1.0
//**********************************************************************************
BOOL CMainFrame::SetHttpProxy(CString ip, UINT port)
{
CString l_just;
l_just.Format("http=%s:%d", ip.LockBuffer(), port);
//下面的代码将注册表项HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ProxyServer
//的内容取出来
HKEY hKeyIn = HKEY_CURRENT_USER, hKeyOut;
if( ERROR_SUCCESS != RegOpenKeyEx(hKeyIn, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", 0, KEY_CREATE_LINK | KEY_WRITE | KEY_READ | KEY_NOTIFY, &hKeyOut))
{
return FALSE;
}
ULONG regsize = 0;
if(ERROR_SUCCESS != RegQueryValueEx(hKeyOut, "ProxyServer", NULL, NULL, NULL,®size))
{
return FALSE;
}
LPBYTE pValue = new BYTE[regsize];
memset(pValue, 0x00, regsize);
if(ERROR_SUCCESS != RegQueryValueEx(hKeyOut, "ProxyServer", NULL, NULL, pValue, ®size))
{
return FALSE;
}
CString oldproxy((char *)pValue);
delete [] pValue;
pValue = NULL;
//从注册表中读出来的数据格式为:http=111.111.111.111:80;ftp=222.222.222.222:21;......,
//如果你只想改变http的代理的话, 就只要把其中的111.111.111.111:80换成你想要的代理就行了,
//类似的你可以改变其他的代理.
//下面的代码就替换http代理成为参数所指定的代理.
int pos = 0;
//如果没有字符串中没有找到"http="说明用户没有设置http代理,这时候直接加在最前面.
if(-1 == (pos = oldproxy.Find("http=")))
{
pos = 0;
}
int pos1 = 0;
if(-1 == (pos1 = oldproxy.Find(";", pos)))
{
pos1 = oldproxy.GetLength();
}
oldproxy.Delete(pos, pos1 - pos);
oldproxy.Insert(pos, l_just);
if(ERROR_SUCCESS != RegSetValueEx(hKeyOut, "ProxyServer", 0, REG_SZ, (const unsigned char *)oldproxy.LockBuffer(), oldproxy.GetLength() + 1))
{
return FALSE;
}
RegCloseKey(hKeyOut);
//使设置生效
if(!InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0))
{
return FALSE;
}
return TRUE;
}
void CMainFrame::GetHttpProxy(CString& IP_Proxy,int& port)
{
unsigned long nSize = 4096;
//char szBuf[4096] = {0};
INTERNET_PROXY_INFO* pInfo = new INTERNET_PROXY_INFO;
//INTERNET_PROXY_INFO* pInfo = (INTERNET_PROXY_INFO*)szBuf;
if(!InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pInfo, &nSize))
{
return; //查询IE的代理失败!
}
CString strTmp (pInfo->lpszProxy);
//判断是否是http代理
if(strTmp.Find("http")==-1)
{
return;
}
else
{
if (strTmp.IsEmpty()) return;//无代理设置信息
int nStart=0,nPos;
nPos = strTmp.Find("=");
strTmp = strTmp.Mid(nPos+1,strTmp.GetLength()-nPos);
//http=172.17.0.2:8080
int pos = strTmp.Find(":");
IP_Proxy = strTmp.Left(pos);
CString ss = strTmp.Mid(pos+1,strTmp.GetLength()-pos);
port = (int)atof(ss.GetBuffer(1));
}
}
//**********************************************************************************
//** 函数名称: CMainFrame::OnMenuSetProxy
//** 输 入:
//** 输 出:
//** 功能描述: 设置代理
//** 作 者: shuyi
//** 创建日期: 2007-7-10
//**************修改记录************************************************************
//** 修 改 者: shuyi
//** 修改日期: 2007-7-10
//** 修改描述:
//** 版 本: V1.0
//**********************************************************************************
void CMainFrame::OnMenuSetProxy()
{
CSetProxyDlg Dlg;
Dlg.DoModal();
}
void CMainFrame::OnUpdateMenuIdPorxy(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ie_state);
}
//**********************************************************************************
//** 函数名称: CMainFrame::DeleteProxy
//** 输 入: CString ProxyName
//** 输 出:
//** 功能描述: 删除一个代理
//** 作 者: shuyi
//** 创建日期: 2007-7-10
//**************修改记录************************************************************
//** 修 改 者: shuyi
//** 修改日期: 2007-7-10
//** 修改描述:
//** 版 本: V1.0
//**********************************************************************************
void CMainFrame::DeleteProxy(CString ProxyName)
{
//删除数据库里的纪录
//Delete_Proxy_Record();
LPProxyInfo proxy = NULL;
int size = m_proxy_list.size();
vector<LPProxyInfo>::iterator it = m_proxy_list.begin();
for(;it!=m_proxy_list.end();it++)
{
proxy = *it;
if(proxy->Name==ProxyName)
{
m_proxy_list.erase(it);
break;
}
}
}
//获得配置文件路局
void CMainFrame::GetConfigPath()
{
CString m_sBinPath = _T("");
TCHAR szFullPath[MAX_PATH];
TCHAR szDir[MAX_PATH];
TCHAR szDrive[MAX_PATH];
GetModuleFileName(NULL,szFullPath,MAX_PATH);
_splitpath(szFullPath,szDrive,szDir,NULL,NULL);
m_sBinPath.Format(_T("%s%s"),szDrive,szDir);
m_config_path = m_sBinPath + "config.ini";
}
//读配置文件
void CMainFrame::ReadConfig()
{
//获得数据库
TCHAR pathbuf[_MAX_PATH];
ZeroMemory(pathbuf, _MAX_PATH);
//DB数据原
::GetPrivateProfileString("DBINFO","DBCon","",pathbuf,255,m_config_path);
CDataBase::Instance()->m_Connstring = pathbuf;
}
//获得代理信息
bool CMainFrame::GetProxyInfo()
{
CString strConnect =CDataBase::Instance()->m_Connstring;
//连接数据库
if(!CDataBase::Instance()->Opendb(strConnect))
{
AfxMessageBox("连接数据库失败");
return false;
}
//获得代理信息
CString SQL = "SELECT * FROM Proxytable";
LPProxyInfo proxy = NULL;
CADORecordset* pRs = new CADORecordset(&(CDataBase::Instance()->m_DBConn));
if(!pRs->Open((LPCTSTR)SQL))
return false;
if(!pRs->IsEof())
{
pRs->MoveFirst();
while(!pRs->IsEof())
{
proxy = new ProxyInfo;
pRs->GetFieldValue("name",proxy->Name);
pRs->GetFieldValue("address",proxy->ProxyAddr);
pRs->GetFieldValue("port",proxy->port);
pRs->GetFieldValue("type",proxy->type);
pRs->GetFieldValue("default",proxy->Default);
if(proxy->Default)//设置默认代理
{
m_default_proxy = proxy;
//判断是否为IE代理
if(proxy->Name.Find("IE")!=-1)
m_ie_state = true; //更新菜单
}
m_proxy_list.push_back(proxy);
pRs->MoveNext();
}//while
}
return true;
}
bool CMainFrame::WriteProxyInfo(LPProxyInfo proxy)
{
ASSERT(proxy!=NULL);
//判断纪录是否存在
if(!Is_Exist_record(proxy))
return true;
CString strConnect =CDataBase::Instance()->m_Connstring;
//连接数据库
if(!CDataBase::Instance()->Opendb(strConnect))
{
AfxMessageBox("连接数据库失败");
return false;
}
//获得代理信息
CString SQL = "SELECT * FROM Proxytable";
CADORecordset* pRs = new CADORecordset(&(CDataBase::Instance()->m_DBConn));
if(!pRs->Open((LPCTSTR)SQL))
return false;
pRs->AddNew(); //添加一条空纪录
pRs->SetFieldValue("name",proxy->Name);
pRs->SetFieldValue("address",proxy->ProxyAddr);
pRs->SetFieldValue("port",proxy->port);
pRs->SetFieldValue("type",proxy->type);
pRs->SetFieldValue("default",proxy->Default);
pRs->Update();
pRs->Close();
//CDataBase::Instance()->m_DBConn.Close();//关闭连接
m_proxy_list.push_back(proxy);
return true;
}
//判断代理纪录是否存在
bool CMainFrame::Is_Exist_record(LPProxyInfo proxy)
{
ASSERT(proxy!=NULL);
CString strConnect =CDataBase::Instance()->m_Connstring;
//连接数据库
if(!CDataBase::Instance()->Opendb(strConnect))
{
AfxMessageBox("连接数据库失败");
return false;
}
//获得代理信息
CString SQL;
SQL.Format("SELECT * FROM Proxytable WHERE address=\"%s\" AND port=%d",
proxy->ProxyAddr,proxy->port);
CADORecordset* pRs = new CADORecordset(&(CDataBase::Instance()->m_DBConn));
if(!pRs->Open((LPCTSTR)SQL))
return false;
if(pRs->IsEof())
return true;
return false;
}
//重数据库中删除一个代理信息
bool CMainFrame::Delete_Proxy_Record(const LPProxyInfo proxy)
{
ASSERT(proxy!=NULL);
CString strConnect =CDataBase::Instance()->m_Connstring;
//连接数据库
if(!CDataBase::Instance()->Opendb(strConnect))
{
AfxMessageBox("连接数据库失败");
return false;
}
CString SQL;
SQL.Format("DELETE FROM Proxytable WHERE address=\"%s\" AND port=%d",
proxy->ProxyAddr,proxy->port);
//先重队列中删除
DeleteProxy(proxy->Name);
return CDataBase::Instance()->m_DBConn.Execute(SQL);
}
//更新下载信息
void CMainFrame::OnTimer(UINT nIDEvent)
{
DOWNINFOMAP::iterator it = m_down_info_list.begin();
LPDownLoadIndo load = NULL;
for(;it!=m_down_info_list.end();it++)
{
load = *it;
Updata_Down_list(load);
}
}
//更新下载列表框
void CMainFrame::Updata_Down_list(const LPDownLoadIndo pinfo)
{
int id = pinfo->PID;
CString downloadtime = pinfo->downloadtime;
CString finish=pinfo->finish;
CString resettime= pinfo->resettime;
CString speed= pinfo->speed;
CalculateTime(id);//更新下载时间
WriteDownLoadLog(pinfo->PID,2,pinfo->progress);
//WriteDownLoadLog(pinfo->PID,5,resettime);
//WriteDownLoadLog(pinfo->PID,6,speed);
}
//获得一个下载信息结构
LPDownLoadIndo CMainFrame::GetDownLoadInfo(int PID)
{
DOWNINFOMAP::iterator it = m_down_info_list.begin();
LPDownLoadIndo load = NULL;
for(;it!=m_down_info_list.end();it++)
{
load = *it;
if(load->PID==PID)
break;
}
return load;
}
//计算下载时间
void CMainFrame::CalculateTime(int PID)
{
LPDownLoadIndo load = GetDownLoadInfo(PID);
load->m_usetime.nSS=load->m_usetime.nSS+1;
if(load->m_usetime.nSS>=59)
{
load->m_usetime.nSS=0;
load->m_usetime.nMM+=1;
if(load->m_usetime.nMM>=59)
{
load->m_usetime.nMM=0;
load->m_usetime.nHH+=1;
}
}
//格式化
char sz[9];
CString ssz;
FormatTime(load->m_usetime.nHH,load->m_usetime.nMM,load->m_usetime.nSS,sz); //排列计时器格式
ssz = sz;
WriteDownLoadLog(PID,4,ssz);
//更新到下载列表控件
}
//更新下在进度
void CMainFrame::Calculateprogress(int PID,int CID,long recvsize)
{
//获得PID对应的下载信息
LPDownLoadIndo load = GetDownLoadInfo(PID);
double progress;
CString pr;
long finish=0;
CString fin;
//已经下载字节数
load->size[CID]=recvsize;
for(int i=0;i<load->size.size();i++)
{
finish+=load->size.at(i);
}
//progress = finish*100/load->filesize;
progress = finish;
pr.Format("%.2f",progress);
load->progress = pr + "%";
}
void CMainFrame::OnUpdataProgress(WPARAM wParam,LPARAM lParam)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -