// DeviceUpdateDlg.cpp : 实现文件 // #include "stdafx.h" #include "DeviceUpdate.h" #include "DeviceUpdateDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CLNHandler *g_handler; CLNTCPClient *g_tcp_client; BOOL g_bUpdateOk; // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CDeviceUpdateDlg 对话框 CDeviceUpdateDlg::CDeviceUpdateDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CDeviceUpdateDlg::IDD, pParent) , m_strIMEI(_T("")) , m_strType(_T("0001")) , m_filePath(_T("")) , m_strIp(_T("127.0.0.1")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CDeviceUpdateDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDT_TYPE, m_strType); DDX_Text(pDX, IDC_EDT_UPGRADE_FILE, m_filePath); DDX_Text(pDX, IDC_EDT_IP, m_strIp); DDX_Control(pDX, IDC_CMB_ONLINELIST, m_cmbOnlineList); } BEGIN_MESSAGE_MAP(CDeviceUpdateDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BTN_SELECT_FILE, &CDeviceUpdateDlg::OnBnClickedBtnSelectFile) ON_BN_CLICKED(IDC_BTN_UPGRADE, &CDeviceUpdateDlg::OnBnClickedBtnUpgrade) ON_BN_CLICKED(IDC_BTN_CONNECT, &CDeviceUpdateDlg::OnBnClickedBtnConnect) ON_BN_CLICKED(IDC_BTN_GETLIST, &CDeviceUpdateDlg::OnBnClickedBtnGetlist) END_MESSAGE_MAP() // CDeviceUpdateDlg 消息处理程序 BOOL CDeviceUpdateDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 SetWindowText(AfxGetAppName()); m_cmbOnlineList.InsertString(0, m_strIMEI); m_cmbOnlineList.SetCurSel(0); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CDeviceUpdateDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CDeviceUpdateDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(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 { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CDeviceUpdateDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CDeviceUpdateDlg::OnBnClickedBtnSelectFile() { CFileDialog dlg(TRUE); if (IDOK == dlg.DoModal()) { CString strPath = dlg.GetPathName(); SetDlgItemText(IDC_EDT_UPGRADE_FILE, strPath); } else { SetDlgItemText(IDC_EDT_UPGRADE_FILE, ""); } } void CDeviceUpdateDlg::OnBnClickedBtnUpgrade() { UpdateData(TRUE); GetDlgItemTextA(IDC_CMB_ONLINELIST, m_strIMEI); int nPos = m_strIMEI.Find(" "); if (nPos != -1) m_strIMEI = m_strIMEI.Left(nPos); if (m_strIMEI.IsEmpty()) return; if (m_strType.IsEmpty()) return; if (m_filePath.IsEmpty()) return; if (m_strIp.IsEmpty()) return; if (m_strIp.Find('.') == -1) return; if (!g_tcp_client->IsConnected()) { MessageBox("服务器未链接!"); return; } if (m_bUpgrade) { MessageBox("在升级中"); return; } CFile file; if (file.Open(m_filePath, CFile::shareDenyWrite | CFile::modeRead) == FALSE) { MessageBox("文件打开失败"); return; } m_filelen = file.GetLength(); if (m_filelen > 2 * 1024 * 1024) { MessageBox("文件不能大于10M"); file.Close(); m_filelen = 0; return; } m_filedata = new uint8_t[m_filelen + 2]; int len = file.Read(m_filedata, m_filelen); m_filedata[m_filelen] = 0x00; m_filedata[m_filelen + 1] = 0x00; ASSERT(len == m_filelen); file.Close(); if (m_threadUpgrade != nullptr) { m_threadUpgrade->join(); delete m_threadUpgrade; m_threadUpgrade = nullptr; } std::this_thread::sleep_for(chrono::milliseconds(10)); m_threadUpgrade = new std::thread(CDeviceUpdateDlg::ThreadProcUpgrade, (DWORD_PTR)this); if (m_threadUpgrade == nullptr) { MessageBox("NEW 失败"); return; } } void CDeviceUpdateDlg::OnBnClickedBtnConnect() { do { UpdateData(TRUE); if (m_strIp.IsEmpty()) break; if (m_strIp.Find('.') == -1) break; GetDlgItem(IDC_BTN_CONNECT)->EnableWindow(FALSE); if (g_handler == nullptr || g_tcp_client == nullptr) return; if (g_tcp_client->IsConnected()) { MessageBox("后台已链接"); goto l; } g_tcp_client->Close(); if (g_tcp_client->ConnectServer((LPSTR)(LPCSTR)m_strIp, 51609) == false) break; g_tcp_client->WaitForConnect(500); if (!g_tcp_client->IsConnected()) break; GetDlgItem(IDC_BTN_CONNECT)->EnableWindow(TRUE); MessageBox("链接成功!"); return; } while (false); MessageBox("链接失败!"); l: GetDlgItem(IDC_BTN_CONNECT)->EnableWindow(TRUE); } void CDeviceUpdateDlg::ThreadProcUpgrade(DWORD_PTR pThis) { CDeviceUpdateDlg *pDlg = (CDeviceUpdateDlg*)pThis; pDlg->m_bUpgrade = true; g_tcp_client->SetLoginOk(FALSE); do { if (g_tcp_client->IsConnected() == FALSE) { pDlg->MessageBox("链路已断开"); break; } if (g_handler == nullptr) break; if (pDlg->m_strIMEI.IsEmpty()) break; if (g_handler->SendUpgradeFile((char*)(LPCSTR)CStringA(pDlg->m_strIMEI), (char*)(LPCSTR)CStringA(pDlg->m_strType), pDlg->m_filedata, pDlg->m_filelen) == FALSE) { pDlg->MessageBox("发送升级请求失败"); break; } if (g_tcp_client->WaitForLogin(30000) == FALSE) { pDlg->MessageBox("请求升级超时"); break; } if (g_bUpdateOk) { pDlg->MessageBox("请求升级成功"); } else { pDlg->MessageBox("请求升级失败,设备未在线"); } //if (g_handler->SendUpgradeFile((char*)(LPCSTR)CStringA(pDlg->m_strIMEI), (char*)(LPCSTR)CStringA(pDlg->m_strType), // pDlg->m_filedata, pDlg->m_filelen) == FALSE) //{ // pDlg->MessageBox("发送升级文件失败"); // break; //} } while (false); delete[] pDlg->m_filedata; pDlg->m_filedata = nullptr; pDlg->m_filelen = 0; pDlg->m_bUpgrade = false; } void CDeviceUpdateDlg::OnBnClickedBtnGetlist() { if (!g_tcp_client->IsConnected()) { MessageBox("服务器未链接!"); return; } g_handler->SendGetList(); }