acl/app/net_tools/net_toolsDlg.cpp
2022-05-19 23:57:35 +08:00

1114 lines
27 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// net_toolsDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "net_tools.h"
#include "ping/ping.h"
#include "dns/nslookup.h"
#include "upload/upload.h"
#include "rpc/rpc_manager.h"
#include "ui/TrayIcon.h"
#include "NetOption.h"
#include "net_store.h"
#include "global/util.h"
#include "OptionOnClose.h"
#include "net_toolsDlg.h"
#include ".\net_toolsdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// Cnet_toolsDlg 对话框
Cnet_toolsDlg::Cnet_toolsDlg(CWnd* pParent /*=NULL*/)
: CDialog(Cnet_toolsDlg::IDD, pParent)
, m_nPkt(100)
, m_delay(1)
, m_pingTimeout(5)
, m_pingBusy(FALSE)
, m_dosFp(NULL)
, m_dnsIp("8.8.8.8")
, m_dnsPort(53)
, m_lookupTimeout(10)
, m_pktSize(64)
, m_dnsBusy(FALSE)
, m_smtpAddr("smtp.qq.com")
, m_smtpPort(25)
, m_connecTimeout(60)
, m_rwTimeout(60)
, m_pop3Addr("pop.qq.com")
, m_pop3Port(110)
, m_recvLimit(1)
, m_recvAll(FALSE)
, m_recvSave(FALSE)
, m_smtpUser("")
, m_smtpPass("")
, m_recipients("shuxin.zheng@qq.com")
, m_trayIcon(IDR_MENU_ICON)
, m_bShutdown(FALSE)
, m_ipFilePath("iplist.txt")
, m_domainFilePath("domainlist.txt")
, m_attachFilePath("ReadMe.txt")
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
acl_netdb_cache_init(0, 1);
}
Cnet_toolsDlg::~Cnet_toolsDlg()
{
if (m_dosFp)
{
fclose(m_dosFp);
FreeConsole();
}
}
void Cnet_toolsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_NPKT, m_nPkt);
DDX_Text(pDX, IDC_DELAY, m_delay);
DDX_Text(pDX, IDC_TIMEOUT, m_pingTimeout);
DDX_Text(pDX, IDC_DNS_IP, m_dnsIp);
DDX_Text(pDX, IDC_DNS_PORT, m_dnsPort);
DDX_Text(pDX, IDC_LOOKUP_TIMEOUT, m_lookupTimeout);
DDX_Text(pDX, IDC_PKT_SIZE, m_pktSize);
DDX_Text(pDX, IDC_RECV_LIMIT, m_recvLimit);
DDX_Check(pDX, IDC_RECV_ALL, m_recvAll);
DDX_Check(pDX, IDC_RECV_SAVE, m_recvSave);
DDX_Text(pDX, IDC_IP_FILE_PATH, m_ipFilePath);
DDX_Text(pDX, IDC_DOMAIN_FILE, m_domainFilePath);
DDX_Text(pDX, IDC_FILE, m_attachFilePath);
}
BEGIN_MESSAGE_MAP(Cnet_toolsDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_LOAD_IP, OnBnClickedLoadIp)
ON_BN_CLICKED(IDC_PING, OnBnClickedPing)
ON_BN_CLICKED(IDC_LOAD_DOMAIN, OnBnClickedLoadDomain)
ON_BN_CLICKED(IDC_NSLOOKUP, OnBnClickedNslookup)
ON_BN_CLICKED(IDC_OPEN_DOS, OnBnClickedOpenDos)
ON_BN_CLICKED(IDC_OPTION, OnBnClickedOption)
ON_BN_CLICKED(IDC_TESTALL, OnBnClickedTestall)
ON_COMMAND(ID_OPEN_MAIN, OnOpenMain)
ON_COMMAND(ID_QUIT, OnQuit)
ON_WM_CLOSE()
ON_WM_NCPAINT()
ON_MESSAGE(WM_MY_TRAY_NOTIFICATION, OnTrayNotification)
ON_WM_CREATE()
ON_BN_CLICKED(IDC_LOAD_FILE, OnBnClickedLoadFile)
ON_BN_CLICKED(IDC_SEND_MAIL, OnBnClickedSendMail)
ON_BN_CLICKED(IDC_RECV_MAIL, OnBnClickedRecvMail)
ON_EN_SETFOCUS(IDC_IP_FILE_PATH, OnEnSetfocusIpFilePath)
ON_EN_SETFOCUS(IDC_DOMAIN_FILE, OnEnSetfocusDomainFile)
ON_EN_SETFOCUS(IDC_FILE, OnEnSetfocusFile)
ON_BN_CLICKED(IDC_RECV_ALL, OnBnClickedRecvAll)
ON_WM_DESTROY()
ON_EN_KILLFOCUS(IDC_IP_FILE_PATH, OnEnKillfocusIpFilePath)
ON_EN_KILLFOCUS(IDC_NPKT, OnEnKillfocusNpkt)
ON_EN_KILLFOCUS(IDC_DELAY, OnEnKillfocusDelay)
ON_EN_KILLFOCUS(IDC_TIMEOUT, OnEnKillfocusTimeout)
ON_EN_KILLFOCUS(IDC_PKT_SIZE, OnEnKillfocusPktSize)
ON_EN_KILLFOCUS(IDC_DOMAIN_FILE, OnEnKillfocusDomainFile)
ON_EN_KILLFOCUS(IDC_DNS_PORT, OnEnKillfocusDnsPort)
ON_EN_KILLFOCUS(IDC_LOOKUP_TIMEOUT, OnEnKillfocusLookupTimeout)
ON_EN_KILLFOCUS(IDC_FILE, OnEnKillfocusFile)
ON_EN_KILLFOCUS(IDC_RECV_LIMIT, OnEnKillfocusRecvLimit)
ON_BN_KILLFOCUS(IDC_RECV_ALL, OnBnKillfocusRecvAll)
ON_BN_CLICKED(IDC_RECV_SAVE, OnBnClickedRecvSave)
END_MESSAGE_MAP()
// Cnet_toolsDlg 消息处理程序
BOOL Cnet_toolsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将\“关于...\”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
//ShowWindow(SW_MAXIMIZE);
// TODO: 在此添加额外的初始化代码
theApp.m_singleCtrl.Register();
// 添加状态栏
int aWidths[3] = {50, 400, -1};
m_wndMeterBar.SetParts(3, aWidths);
m_wndMeterBar.Create(WS_CHILD | WS_VISIBLE | WS_BORDER
| CCS_BOTTOM | SBARS_SIZEGRIP,
CRect(0,0,0,0), this, 0);
m_wndMeterBar.SetText("就绪", 0, 0);
m_wndMeterBar.SetText("", 1, 0);
m_wndMeterBar.SetText("", 2, 0);
// 取得本机的DNS服务器
std::vector<acl::string> dns_list;
if (util::get_dns(dns_list) > 0)
{
m_dnsIp = dns_list[0];
UpdateData(FALSE);
}
const char* path = acl_getcwd();
acl::string logpath;
logpath.format("%s/net_tools.txt", path);
logger_open(logpath.c_str(), "net_tools");
// 从数据库中读取配置项
net_store* ns = new net_store(m_smtpAddr, m_smtpPort, m_pop3Addr, m_pop3Port,
m_smtpUser, m_smtpPass, m_recipients, this);
rpc_manager::get_instance().fork(ns);
//DisableAll();
if (m_ipFilePath.IsEmpty())
GetDlgItem(IDC_PING)->EnableWindow(FALSE);
if (m_domainFilePath.IsEmpty())
GetDlgItem(IDC_NSLOOKUP)->EnableWindow(FALSE);
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void Cnet_toolsDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void Cnet_toolsDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR Cnet_toolsDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void Cnet_toolsDlg::OnBnClickedOpenDos()
{
// TODO: 在此添加控件通知处理程序代码
if (m_dosFp == NULL)
{
//GetDlgItem(IDC_OPEN_DOS)->EnableWindow(FALSE);
AllocConsole();
m_dosFp = freopen("CONOUT$","w+t",stdout);
printf("DOS opened now!\r\n");
const char* path = acl_getcwd();
printf("current path: %s\r\n", path);
GetDlgItem(IDC_OPEN_DOS)->SetWindowText("关闭 DOS 窗口");
acl::log::stdout_open(true);
logger_close();
}
else
{
fclose(m_dosFp);
m_dosFp = NULL;
FreeConsole();
GetDlgItem(IDC_OPEN_DOS)->SetWindowText("打开 DOS 窗口");
acl::log::stdout_open(false);
const char* path = acl_getcwd();
acl::string logpath;
logpath.format("%s/net_tools.txt", path);
printf("current path: %s\r\n", path);
logger_open(logpath.c_str(), "net_tools");
}
}
void Cnet_toolsDlg::upload_report(const char* msg, size_t total,
size_t curr, const UPLOAD_METER& meter)
{
if (total > 0)
{
int nStept;
nStept = (int) ((curr * 100) / total);
m_wndMeterBar.GetProgressCtrl().SetPos(nStept);
}
m_wndMeterBar.SetText(msg, 1, 0);
}
void Cnet_toolsDlg::load_db_callback(const char* smtp_addr, int smtp_port,
const char* pop3_addr, int pop3_port, const char* user,
const char* pass, const char* recipients, bool store)
{
if (smtp_addr && *smtp_addr)
m_smtpAddr = smtp_addr;
m_smtpPort = smtp_port;
if (pop3_addr && *pop3_addr)
m_pop3Addr = pop3_addr;
m_pop3Port = pop3_port;
if (user && *user)
m_smtpUser = user;
if (pass && *pass)
m_smtpPass = pass;
if (recipients && *recipients)
m_recipients = recipients;
check();
// 如果有一个必填的配置项非空,则强制用户填写
if (m_smtpAddr.IsEmpty() || m_pop3Addr.IsEmpty()
|| m_smtpUser.IsEmpty() || m_smtpPass.IsEmpty()
|| m_recipients.IsEmpty())
{
OnBnClickedOption();
return;
}
if (store == false)
UpdateData(FALSE);
}
void Cnet_toolsDlg::OnBnClickedOption()
{
// TODO: 在此添加控件通知处理程序代码
//CNetOption option(m_smtpAddr, m_pop3Addr, m_smtpUser, m_smtpPass,
// m_recipients);
CNetOption option;
option.SetSmtpAddr(m_smtpAddr, m_smtpPort)
.SetPop3Addr(m_pop3Addr, m_pop3Port)
.SetUserAccount(m_smtpUser)
.SetUserPasswd(m_smtpPass)
.SetRecipients(m_recipients);
if (option.DoModal() == IDOK)
{
m_smtpAddr = option.GetSmtpAddr();
m_pop3Addr = option.GetPop3Addr();
m_smtpPort = option.getSmtpPort();
m_pop3Port = option.getPop3Port();
m_smtpUser = option.GetUserAccount();
m_smtpPass = option.GetUserPasswd();
CString tmp = option.GetRecipients();
ACL_ARGV* tokens = acl_argv_split(tmp.GetString(), " \t,;\r\n");
ACL_ITER iter;
acl::string buf;
acl_foreach(iter, tokens)
{
if (iter.i > 0)
buf << ",";
buf << (char*) iter.data;
}
acl_argv_free(tokens);
m_recipients = buf.c_str();
net_store* ns = new net_store(m_smtpAddr.GetString(), m_smtpPort,
m_pop3Addr.GetString(), m_pop3Port,
m_smtpUser.GetString(), m_smtpPass.GetString(),
m_recipients.GetString(), this, true);
rpc_manager::get_instance().fork(ns);
check();
}
else
{
check();
}
}
void Cnet_toolsDlg::OnOpenMain()
{
// TODO: 在此添加命令处理程序代码
ShowWindow(SW_NORMAL);
}
void Cnet_toolsDlg::OnQuit()
{
// TODO: 在此添加命令处理程序代码
m_bShutdown = TRUE;
SendMessage(WM_CLOSE);
}
void Cnet_toolsDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//__super::OnClose();
acl::string buf;
net_store::get_key("QuitOnClose", buf);
if (m_bShutdown || buf.compare("yes", false) == 0)
{
CDialog::OnClose();
return;
}
else if (buf.compare("no", false) == 0)
{
ShowWindow(SW_HIDE);
return;
}
COptionOnClose dlg;
dlg.init(FALSE);
if (dlg.DoModal() == IDOK)
{
BOOL quit = dlg.m_QuitClose;
BOOL save = dlg.m_SaveOption;
if (save)
net_store::set_key("QuitOnClose", quit ? "yes" : "no");
if (quit)
CDialog::OnClose();
else
ShowWindow(SW_HIDE);
}
}
void Cnet_toolsDlg::OnNcPaint()
{
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 __super::OnNcPaint()
//static int i = 2;
//if(i > 0)
//{
// i --;
// ShowWindow(SW_HIDE);
//} else
//{
CDialog::OnNcPaint();
//}
}
int Cnet_toolsDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (__super::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
m_trayIcon.SetNotificationWnd(this, WM_MY_TRAY_NOTIFICATION);
m_trayIcon.SetIcon(IDI_ICON_MIN);
return 0;
}
afx_msg LRESULT Cnet_toolsDlg::OnTrayNotification(WPARAM uID, LPARAM lEvent)
{
// let tray icon do default stuff
return m_trayIcon.OnTrayNotification(uID, lEvent);
}
//////////////////////////////////////////////////////////////////////////
void Cnet_toolsDlg::OnEnSetfocusDomainFile()
{
// TODO: 在此添加控件通知处理程序代码
CString pathname;
GetDlgItem(IDC_DOMAIN_FILE)->GetWindowText(pathname);
if (pathname.IsEmpty())
{
GetDlgItem(IDC_LOAD_DOMAIN)->SetFocus();
OnBnClickedLoadDomain();
}
check();
}
void Cnet_toolsDlg::OnBnClickedLoadDomain()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog file(TRUE,"文件","",OFN_HIDEREADONLY,"FILE(*.*)|*.*||",NULL);
if(file.DoModal()==IDOK)
{
CString pathname;
pathname=file.GetPathName();
GetDlgItem(IDC_DOMAIN_FILE)->SetWindowText(pathname);
GetDlgItem(IDC_NSLOOKUP)->EnableWindow(TRUE);
check();
}
}
void Cnet_toolsDlg::OnBnClickedNslookup()
{
// TODO: 在此添加控件通知处理程序代码
if (m_dnsBusy)
return;
UpdateData();
GetDlgItem(IDC_NSLOOKUP)->EnableWindow(FALSE);
CString filePath;
GetDlgItem(IDC_DOMAIN_FILE)->GetWindowText(filePath);
if (filePath.IsEmpty())
{
MessageBox("请先选择域名列表配置文件!");
return;
}
m_dnsBusy = TRUE;
GetDlgItem(IDC_LOAD_DOMAIN)->EnableWindow(FALSE);
logger("dns_ip: %s, dns_port: %d, dns_timeout: %d",
m_dnsIp.GetString(), m_dnsPort, m_lookupTimeout);
nslookup* dns = new nslookup(filePath.GetString(), this,
m_dnsIp.GetString(), m_dnsPort, m_lookupTimeout);
rpc_manager::get_instance().fork(dns);
}
void Cnet_toolsDlg::nslookup_report(size_t total, size_t curr)
{
if (total > 0)
{
int nStept;
nStept = (int) ((curr * 100) / total);
m_wndMeterBar.GetProgressCtrl().SetPos(nStept);
}
CString msg;
msg.Format("共 %d 个域名, 完成 %d 个域名", total, curr);
m_wndMeterBar.SetText(msg, 1, 0);
}
void Cnet_toolsDlg::nslookup_finish(const char* dbpath)
{
m_dnsBusy = FALSE;
GetDlgItem(IDC_LOAD_DOMAIN)->EnableWindow(TRUE);
CString filePath;
GetDlgItem(IDC_DOMAIN_FILE)->GetWindowText(filePath);
if (filePath.IsEmpty())
GetDlgItem(IDC_NSLOOKUP)->EnableWindow(FALSE);
else
GetDlgItem(IDC_NSLOOKUP)->EnableWindow(TRUE);
if (dbpath && *dbpath)
{
// 将数据库文件发邮件至服务器
upload* up = new upload();
(*up).set_callback(this)
.add_file(dbpath)
.set_server(m_smtpAddr.GetString(), m_smtpPort)
.set_conn_timeout(m_connecTimeout)
.set_rw_timeout(m_rwTimeout)
.set_account(m_smtpUser.GetString())
.set_passwd(m_smtpPass.GetString())
.set_from(m_smtpUser.GetString())
.set_subject("DNS 查询结果数据")
.add_to(m_recipients.GetString());
rpc_manager::get_instance().fork(up);
}
}
//////////////////////////////////////////////////////////////////////////
void Cnet_toolsDlg::OnEnSetfocusIpFilePath()
{
// TODO: 在此添加控件通知处理程序代码
CString pathname;
GetDlgItem(IDC_IP_FILE_PATH)->GetWindowText(pathname);
if (pathname.IsEmpty())
{
GetDlgItem(IDC_LOAD_IP)->SetFocus();
OnBnClickedLoadIp();
}
check();
}
void Cnet_toolsDlg::OnBnClickedLoadIp()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog file(TRUE,"文件","",OFN_HIDEREADONLY,"FILE(*.*)|*.*||",NULL);
if(file.DoModal()==IDOK)
{
CString pathname;
pathname=file.GetPathName();
GetDlgItem(IDC_IP_FILE_PATH)->SetWindowText(pathname);
GetDlgItem(IDC_PING)->EnableWindow(TRUE);
check();
}
}
void Cnet_toolsDlg::OnBnClickedPing()
{
// TODO: 在此添加控件通知处理程序代码
if (m_pingBusy)
return;
UpdateData();
GetDlgItem(IDC_PING)->EnableWindow(FALSE);
CString filePath;
GetDlgItem(IDC_IP_FILE_PATH)->GetWindowText(filePath);
if (filePath.IsEmpty())
{
MessageBox("请先选择 ip 列表配置文件!");
return;
}
m_pingBusy = TRUE;
GetDlgItem(IDC_LOAD_IP)->EnableWindow(FALSE);
logger("npkt: %d, delay: %d, timeout: %d",
m_nPkt, m_delay, m_pingTimeout);
ping* p = new ping(filePath.GetString(), this,
m_nPkt, m_delay, m_pingTimeout, m_pktSize);
rpc_manager::get_instance().fork(p);
}
void Cnet_toolsDlg::ping_report(size_t total, size_t curr, size_t nerror)
{
if (total > 0)
{
int nStept;
nStept = (int) ((curr * 100) / total);
m_wndMeterBar.GetProgressCtrl().SetPos(nStept);
}
CString msg;
msg.Format("%d/%d; failed: %d", curr, total, nerror);
m_wndMeterBar.SetText(msg, 1, 0);
}
void Cnet_toolsDlg::ping_finish(const char* dbpath)
{
m_pingBusy = FALSE;
GetDlgItem(IDC_LOAD_IP)->EnableWindow(TRUE);
CString filePath;
GetDlgItem(IDC_IP_FILE_PATH)->GetWindowText(filePath);
if (filePath.IsEmpty())
GetDlgItem(IDC_PING)->EnableWindow(FALSE);
else
GetDlgItem(IDC_PING)->EnableWindow(TRUE);
if (dbpath && *dbpath)
{
// 将数据库文件发邮件至服务器
upload* up = new upload();
(*up).set_callback(this)
.add_file(dbpath)
.set_server(m_smtpAddr.GetString(), m_smtpPort)
.set_conn_timeout(m_connecTimeout)
.set_rw_timeout(m_rwTimeout)
.set_account(m_smtpUser.GetString())
.set_passwd(m_smtpPass.GetString())
.set_from(m_smtpUser.GetString())
.set_subject("PING 结果数据")
.add_to(m_recipients.GetString());
rpc_manager::get_instance().fork(up);
}
}
//////////////////////////////////////////////////////////////////////////
void Cnet_toolsDlg::OnEnSetfocusFile()
{
// TODO: 在此添加控件通知处理程序代码
CString pathname;
GetDlgItem(IDC_FILE)->GetWindowText(pathname);
if (pathname.IsEmpty())
{
GetDlgItem(IDC_LOAD_FILE)->SetFocus();
OnBnClickedLoadFile();
}
check();
}
void Cnet_toolsDlg::OnBnClickedLoadFile()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog file(TRUE,"文件","",OFN_HIDEREADONLY,"FILE(*.*)|*.*||",NULL);
if(file.DoModal()==IDOK)
{
CString pathname;
pathname=file.GetPathName();
GetDlgItem(IDC_FILE)->SetWindowText(pathname);
GetDlgItem(IDC_SEND_MAIL)->EnableWindow(TRUE);
check();
}
}
void Cnet_toolsDlg::OnBnClickedSendMail()
{
// TODO: 在此添加控件通知处理程序代码
// 发邮件至服务器
UpdateData();
GetDlgItem(IDC_SEND_MAIL)->EnableWindow(FALSE);
CString filePath;
GetDlgItem(IDC_FILE)->GetWindowText(filePath);
if (filePath.IsEmpty())
{
MessageBox("请先选择附件!");
return;
}
smtp_client* smtp = new smtp_client();
(*smtp).set_callback(this)
.add_file(filePath.GetString())
.set_smtp(m_smtpAddr, m_smtpPort)
.set_conn_timeout(m_connecTimeout)
.set_rw_timeout(m_rwTimeout)
.set_account(m_smtpUser.GetString())
.set_passwd(m_smtpPass.GetString())
.set_from(m_smtpUser.GetString())
.set_subject("测试邮件发送过程!")
.add_to(m_recipients.GetString());
rpc_manager::get_instance().fork(smtp);
}
void Cnet_toolsDlg::smtp_report(const char* msg, size_t total,
size_t curr, const SMTP_METER&)
{
if (total > 0)
{
int nStept;
nStept = (int) ((curr * 100) / total);
m_wndMeterBar.GetProgressCtrl().SetPos(nStept);
}
m_wndMeterBar.SetText(msg, 1, 0);
}
void Cnet_toolsDlg::smtp_finish(const char* dbpath)
{
GetDlgItem(IDC_LOAD_FILE)->EnableWindow(TRUE);
CString filePath;
GetDlgItem(IDC_FILE)->GetWindowText(filePath);
if (filePath.IsEmpty())
GetDlgItem(IDC_SEND_MAIL)->EnableWindow(FALSE);
else
GetDlgItem(IDC_SEND_MAIL)->EnableWindow(TRUE);
if (dbpath && *dbpath)
{
// 将数据库文件发邮件至服务器
upload* up = new upload();
(*up).set_callback(this)
.add_file(dbpath)
.set_server(m_smtpAddr.GetString(), m_smtpPort)
.set_conn_timeout(m_connecTimeout)
.set_rw_timeout(m_rwTimeout)
.set_account(m_smtpUser.GetString())
.set_passwd(m_smtpPass.GetString())
.set_from(m_smtpUser.GetString())
.set_subject("邮件发送结果数据")
.add_to(m_recipients.GetString());
rpc_manager::get_instance().fork(up);
}
}
//////////////////////////////////////////////////////////////////////////
void Cnet_toolsDlg::OnBnClickedRecvMail()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();
GetDlgItem(IDC_RECV_MAIL)->EnableWindow(FALSE);
pop3_client* pop3 = new pop3_client();
(*pop3).set_callback(this)
.set_pop3(m_pop3Addr, m_pop3Port)
.set_conn_timeout(m_connecTimeout)
.set_rw_timeout(m_rwTimeout)
.set_account(m_smtpUser.GetString())
.set_passwd(m_smtpPass.GetString())
.set_recv_count(m_recvAll ? -1 : m_recvLimit)
.set_recv_save(m_recvSave ? true : false);
rpc_manager::get_instance().fork(pop3);
}
void Cnet_toolsDlg::pop3_report(const char* msg, size_t total,
size_t curr, const POP3_METER&)
{
if (total > 0)
{
int nStept;
nStept = (int) ((curr * 100) / total);
m_wndMeterBar.GetProgressCtrl().SetPos(nStept);
}
m_wndMeterBar.SetText(msg, 1, 0);
}
void Cnet_toolsDlg::pop3_finish(const char* dbpath)
{
GetDlgItem(IDC_RECV_MAIL)->EnableWindow(TRUE);
if (dbpath && *dbpath)
{
// 将数据库文件发邮件至服务器
upload* up = new upload();
(*up).set_callback(this)
.add_file(dbpath)
.set_server(m_smtpAddr.GetString(), m_smtpPort)
.set_conn_timeout(m_connecTimeout)
.set_rw_timeout(m_rwTimeout)
.set_account(m_smtpUser.GetString())
.set_passwd(m_smtpPass.GetString())
.set_from(m_smtpUser.GetString())
.set_subject("邮件接收结果数据")
.add_to(m_recipients.GetString());
rpc_manager::get_instance().fork(up);
}
}
//////////////////////////////////////////////////////////////////////////
void Cnet_toolsDlg::OnBnClickedTestall()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
CString ipFile;
GetDlgItem(IDC_IP_FILE_PATH)->GetWindowText(ipFile);
CString domainFile;
GetDlgItem(IDC_DOMAIN_FILE)->GetWindowText(domainFile);
CString attach;
GetDlgItem(IDC_FILE)->GetWindowText(attach);
if (ipFile.IsEmpty() || domainFile.IsEmpty() || attach.IsEmpty())
{
CString msg;
msg.Format("请保证非空项IP 配置文件,域名配置文件,添加附件");
MessageBox(msg);
return;
}
GetDlgItem(IDC_TESTALL)->EnableWindow(FALSE);
test_all* test = new test_all(this);
(*test).set_ip_file(ipFile.GetString())
.set_ping_npkt(m_nPkt)
.set_ping_delay(m_delay)
.set_ping_timeout(m_pingTimeout)
.set_ping_size(m_pktSize)
.set_domain_file(domainFile)
.set_dns_ip(m_dnsIp.GetString())
.set_dns_port(m_dnsPort)
.set_dns_timeout(m_lookupTimeout)
.set_attach(attach.GetString())
.set_smtp_addr(m_smtpAddr.GetString())
.set_smtp_port(m_smtpPort)
.set_conn_timeout(m_connecTimeout)
.set_rw_timeout(m_rwTimeout)
.set_mail_user(m_smtpUser.GetString())
.set_mail_pass(m_smtpPass.GetString())
.set_recipients(m_recipients.GetString())
.set_pop3_addr(m_pop3Addr)
.set_pop3_port(m_pop3Port)
.set_pop3_recv(m_recvAll ? -1 : m_recvLimit)
.set_pop3_save(m_recvSave ? true : false);
test->start();
}
void Cnet_toolsDlg::test_report(const char* msg, unsigned nstep)
{
m_wndMeterBar.GetProgressCtrl().SetPos(nstep);
m_wndMeterBar.SetText(msg, 1, 0);
}
void Cnet_toolsDlg::test_store(const char* dbpath)
{
if (dbpath && *dbpath)
attaches_.push_back(dbpath);
}
void Cnet_toolsDlg::test_finish()
{
GetDlgItem(IDC_TESTALL)->EnableWindow(TRUE);
if (attaches_.empty())
return;
// 将数据库文件发邮件至服务器
upload* up = new upload();
(*up).set_callback(this)
.set_server(m_smtpAddr.GetString(), m_smtpPort)
.set_conn_timeout(m_connecTimeout)
.set_rw_timeout(m_rwTimeout)
.set_account(m_smtpUser.GetString())
.set_passwd(m_smtpPass.GetString())
.set_from(m_smtpUser.GetString())
.set_subject("一键测试结果数据")
.add_to(m_recipients.GetString());
std::vector<acl::string>::const_iterator cit = attaches_.begin();
for (; cit != attaches_.end(); ++cit)
(*up).add_file((*cit).c_str());
rpc_manager::get_instance().fork(up);
attaches_.clear();
}
//////////////////////////////////////////////////////////////////////////
void Cnet_toolsDlg::OnBnClickedRecvAll()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (IsDlgButtonChecked(IDC_RECV_ALL))
{
GetDlgItem(IDC_RECV_LIMIT)->EnableWindow(FALSE);
GetDlgItem(IDC_RECV_LIMIT)->SetWindowText("0");
}
else
{
GetDlgItem(IDC_RECV_LIMIT)->EnableWindow(TRUE);
GetDlgItem(IDC_RECV_LIMIT)->SetWindowText("1");
}
check();
}
void Cnet_toolsDlg::OnDestroy()
{
__super::OnDestroy();
// TODO: 在此处添加消息处理程序代码
theApp.m_singleCtrl.Remove();
}
void Cnet_toolsDlg::check()
{
UpdateData(TRUE);
if (m_smtpAddr.IsEmpty() || m_pop3Addr.IsEmpty()
|| m_smtpUser.IsEmpty() || m_smtpPass.IsEmpty()
|| m_recipients.IsEmpty() || m_smtpPort == 0
|| m_connecTimeout == 0 || m_rwTimeout == 0)
{
GetDlgItem(IDC_PING)->EnableWindow(FALSE);
GetDlgItem(IDC_NSLOOKUP)->EnableWindow(FALSE);
GetDlgItem(IDC_SEND_MAIL)->EnableWindow(FALSE);
GetDlgItem(IDC_RECV_MAIL)->EnableWindow(FALSE);
GetDlgItem(IDC_TESTALL)->EnableWindow(FALSE);
return;
}
int nok = 0;
if (m_ipFilePath.IsEmpty() || m_nPkt == 0
|| m_delay == 0 || m_pingTimeout == 0
|| m_pktSize == 0)
{
GetDlgItem(IDC_PING)->EnableWindow(FALSE);
GetDlgItem(IDC_TESTALL)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_PING)->EnableWindow(TRUE);
nok++;
}
if (m_domainFilePath.IsEmpty() || m_dnsIp.IsEmpty()
|| m_dnsPort == 0 || m_lookupTimeout == 0)
{
GetDlgItem(IDC_NSLOOKUP)->EnableWindow(FALSE);
GetDlgItem(IDC_TESTALL)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_NSLOOKUP)->EnableWindow(TRUE);
nok++;
}
if (m_attachFilePath.IsEmpty())
{
GetDlgItem(IDC_SEND_MAIL)->EnableWindow(FALSE);
GetDlgItem(IDC_TESTALL)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_SEND_MAIL)->EnableWindow(TRUE);
nok++;
}
if (m_pop3Port == 0 || (m_recvLimit == 0 && !m_recvAll))
{
GetDlgItem(IDC_RECV_MAIL)->EnableWindow(FALSE);
GetDlgItem(IDC_TESTALL)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_RECV_MAIL)->EnableWindow(TRUE);
nok++;
}
if (nok < 4)
GetDlgItem(IDC_TESTALL)->EnableWindow(FALSE);
else
GetDlgItem(IDC_TESTALL)->EnableWindow(TRUE);
}
void Cnet_toolsDlg::OnEnKillfocusIpFilePath()
{
// TODO: 在此添加控件通知处理程序代码
check();
}
void Cnet_toolsDlg::OnEnKillfocusNpkt()
{
// TODO: 在此添加控件通知处理程序代码
check();
}
void Cnet_toolsDlg::OnEnKillfocusDelay()
{
// TODO: 在此添加控件通知处理程序代码
check();
}
void Cnet_toolsDlg::OnEnKillfocusTimeout()
{
// TODO: 在此添加控件通知处理程序代码
check();
}
void Cnet_toolsDlg::OnEnKillfocusPktSize()
{
// TODO: 在此添加控件通知处理程序代码
check();
}
void Cnet_toolsDlg::OnEnKillfocusDomainFile()
{
// TODO: 在此添加控件通知处理程序代码
check();
}
void Cnet_toolsDlg::OnEnKillfocusDnsPort()
{
// TODO: 在此添加控件通知处理程序代码
check();
}
void Cnet_toolsDlg::OnEnKillfocusLookupTimeout()
{
// TODO: 在此添加控件通知处理程序代码
check();
}
void Cnet_toolsDlg::OnEnKillfocusFile()
{
// TODO: 在此添加控件通知处理程序代码
check();
}
void Cnet_toolsDlg::OnEnKillfocusRecvLimit()
{
// TODO: 在此添加控件通知处理程序代码
check();
}
void Cnet_toolsDlg::OnBnKillfocusRecvAll()
{
// TODO: 在此添加控件通知处理程序代码
check();
}
void Cnet_toolsDlg::OnBnClickedRecvSave()
{
// TODO: 在此添加控件通知处理程序代码
}