// OCXUpdate.cpp : implementation file // #include "stdafx.h" #include "udpadmintool.h" #include "OCXUpdate.h" #include "util_local.h" #include "util.hpp" #include /* _beginthread, _endthread */ #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // COCXUpdate dialog COCXUpdate::COCXUpdate(CWnd* pParent /*=NULL*/) : CDialog(COCXUpdate::IDD, pParent) { //{{AFX_DATA_INIT(COCXUpdate) m_edSelectIP = _T(""); //}}AFX_DATA_INIT } void COCXUpdate::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(COCXUpdate) DDX_Control(pDX, IDC_PROGRESS_UP, m_prUp); DDX_Text(pDX, IDC_EDIT_SELECT_IP, m_edSelectIP); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(COCXUpdate, CDialog) //{{AFX_MSG_MAP(COCXUpdate) ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse) ON_BN_CLICKED(IDC_BUTTON_UPDATE, OnButtonUpdate) ON_WM_TIMER() //}}AFX_MSG_MAP // ON_MESSAGE(WM_ADMIN_SEND_FILE, OnAdminSendFile) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // COCXUpdate message handlers BOOL COCXUpdate::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(pMsg->wParam == VK_RETURN) { return TRUE; } return CDialog::PreTranslateMessage(pMsg); } void COCXUpdate::OnButtonBrowse() { // TODO: Add your control notification handler code here char szFilter[30]; sprintf(szFilter, "IMAGE File|*.*||"); CString path; GetDlgItem(IDC_EDIT_BROWSE)->GetWindowText(path); CFileDialog dlgOpen(TRUE, NULL, path, OFN_ALLOWMULTISELECT | OFN_FILEMUSTEXIST, szFilter,this); // Open dialog dlgOpen.m_ofn.lpstrTitle = _T("Select files to burn"); // Select and add files if(IDOK == dlgOpen.DoModal()) { CString dlg_path = dlgOpen.GetPathName(); //m_bFile = true; //sprintf(m_sFilePath, "%s", dlg_path); //path = get_parent(dlg_path); // save registry theApp.set_ocx_path(dlg_path); GetDlgItem(IDC_EDIT_BROWSE)->SetWindowText(dlg_path); UpdateData(TRUE); } } void COCXUpdate::EnableControl(BOOL bEnable) { GetDlgItem(IDC_BUTTON_BROWSE)->EnableWindow(bEnable); GetDlgItem(IDC_BUTTON_UPDATE)->EnableWindow(bEnable); GetDlgItem(IDOK)->EnableWindow(bEnable); } struct __thread_ocx { CString ip; CString file; int flag; int result; }; unsigned int __stdcall ThreadOcx(void* data) { __thread_ocx* tg; int upgrade_flag; tg = (__thread_ocx*)data; tg->result = -9981; // do char file_path[1024]; strcpy(file_path, tg->file); upgrade_flag = UpGrade((char*)((const char*)(tg->ip)), file_path, tg->flag); tg->result = upgrade_flag; return 1; } void COCXUpdate::OnButtonUpdate() { // TODO: Add your control notification handler code here CString path; GetDlgItem(IDC_EDIT_BROWSE)->GetWindowText(path); if(path == "") { AfxMessageBox("Not file select ", MB_ICONEXCLAMATION); return; } EnableControl(FALSE); m_prUp.SetRange(0, 30); m_prUp.SetPos(0); m_prUp.SetShowPercent(false); // thread update __thread_ocx tg; tg.ip = theApp.m_info.sIp; tg.file = path; tg.flag = 0x40; // thread DWORD dwThreadID; HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadOcx, &tg, 0, (unsigned*)&dwThreadID); //start_prog(350); SetTimer(0, 1000, NULL); // loop int result = 0; BOOL bExec = TRUE; while(bExec) { PumpMessages(); DWORD hr = WaitForSingleObject(hThread, 50); switch(hr) { case WAIT_OBJECT_0: // success result = tg.result; if(result < 0) result -= 20; // result°¡ -30 ~ -40¸éÀº Upgrade()ÀÇ filesend()ÂÊ ¿À·ùÀÓ bExec = FALSE; break; case WAIT_TIMEOUT: continue; case WAIT_ABANDONED: case WAIT_FAILED: result = -3; bExec = FALSE; break; } } //end_prog(); KillTimer(0); // update ui if(result >= 0) { // ÇÁ·Î±×·¡½º¹Ù ¿¡¹Ä·¹ÀÌ¼Ç int lo, hi; m_prUp.GetRange(lo, hi); for(int i = m_prUp.GetPos(); i < hi; ++i) { set_progress(i); //m_prUpgrade.SetPos(i); PumpMessages(); Sleep(50); } m_prUp.SetPos(hi); m_prUp.SetWindowText("Success"); m_prUp.RedrawWindow(); PumpMessages(); //AfxMessageBox("OCX Update complete"); AfxMessageBox("Completed to upload ActiveX"); } else { // result°¡ -20º¸´Ù ÀÛÀ¸¸é Upgrade()ÂÊ ¿À·ùÄÚµå´Ù. CString mm; //mm.Format("OCX Update fail [ErrorCode : %d]", result); mm.Format("Failed to upload ActiveX with [Error code : %d]", result); m_prUp.SetWindowText(mm); m_prUp.RedrawWindow(); PumpMessages(); AfxMessageBox(mm); } EnableControl(TRUE); } /* LRESULT COCXUpdate::OnAdminSendFile(WPARAM wp, LPARAM lp) { // int max = int(lp); int pp = int(wp); m_prUp.SetRange(0, max); m_prUp.SetPos(pp); PumpMessages(); return S_OK; } */ BOOL COCXUpdate::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here // ui UpdateData(); m_edSelectIP = theApp.GetSelectDeviceName(); UpdateData(FALSE); m_prUp.SetPos(0); m_prUp.SetShowPercent(false); m_prUp.SetWindowText("Ready..."); // check // m_bFile=FALSE; int i, flag = 0; for(i = 0; i < 50; i++) { if(theApp.m_info.FirmwareVersion[i] == '.') { flag++; if(flag == 2) { char temp[5]; memset(temp, 0x00, sizeof(temp)); memcpy(temp, &theApp.m_info.FirmwareVersion[i+1], 3); if(atoi(temp) < 360) { AfxMessageBox("This firmware does not support \"ActiveX upload\" function."); OnOK(); } break; } } } if(i > 45) { AfxMessageBox("This firmware does not support \"ActiveX upload\" function."); OnOK(); } CString path = theApp.get_ocx_path(); // registry GetDlgItem(IDC_EDIT_BROWSE)->SetWindowText(path); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void COCXUpdate::set_progress(int pos) { m_prUp.SetPos(pos); // persent int low, hi; m_prUp.GetRange(low, hi); CString ss; ss.Format("Completed [%d%%]", int((100.0/hi)*pos)); m_prUp.SetWindowText(ss); m_prUp.RedrawWindow(); } void COCXUpdate::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default // if(nIDEvent == 0) { // ½Ã°£Àº ÅäÅ» 5ºÐÀ¸·Î ÇÏ°í~ // 1~70±îÁö°¡ µü °É¸®°Ô ÇÏ°í // ¸¸¾à 70À» ³Ñ±â¸é À̼ø°£ºÎÅÍ ´À¸®°Ô ÇÏÀÚ(1ÃÊ ´ÜÀ§(3¹è)...) // ¸¸¾à 90À» ³Ñ±â¸é À̼ø°£ºÎÅÍ´Â ´õ ´À¸®°Ô(3ÃÊ ´ÜÀ§(10¹è)...) int pt = m_prUp.GetPos()+1; // ¼Óµµ Á¶Àý int low, hi; m_prUp.GetRange(low, hi); /* int per = (int)((100.0/(hi-low)) * (pt-low)); if(per > 90) { if(m_nTimerGap <= 3000) { modify_prog(3000); } } else if(per > 70) { if(m_nTimerGap <= 1000) { modify_prog(1000); } } */ set_progress(pt); } CDialog::OnTimer(nIDEvent); }