NetDownMTRDlg.cpp
上传用户:oadesign
上传日期:2013-12-25
资源大小:265k
文件大小:14k
源码类别:

进程与线程

开发平台:

Visual C++

  1. // NetDownMTRDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "NetDownMTR.h"
  5. #include "NetDownMTRDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. virtual BOOL OnInitDialog();
  30. //}}AFX_MSG
  31. DECLARE_MESSAGE_MAP()
  32. };
  33. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  34. {
  35. //{{AFX_DATA_INIT(CAboutDlg)
  36. //}}AFX_DATA_INIT
  37. }
  38. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  39. {
  40. CDialog::DoDataExchange(pDX);
  41. //{{AFX_DATA_MAP(CAboutDlg)
  42. //}}AFX_DATA_MAP
  43. }
  44. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  45. //{{AFX_MSG_MAP(CAboutDlg)
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CNetDownMTRDlg dialog
  50. CNetDownMTRDlg::CNetDownMTRDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CNetDownMTRDlg::IDD, pParent)
  52. , m_pDownloadMTR ( NULL )
  53. , m_bDownloadIsStart ( FALSE )
  54. {
  55. //{{AFX_DATA_INIT(CNetDownMTRDlg)
  56. // NOTE: the ClassWizard will add member initialization here
  57. //}}AFX_DATA_INIT
  58. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  59. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  60. m_Ary_DownloadNotifyPara.SetSize ( 0, 10*sizeof(t_DownloadNotifyPara) );
  61. }
  62. void CNetDownMTRDlg::DoDataExchange(CDataExchange* pDX)
  63. {
  64. CDialog::DoDataExchange(pDX);
  65. //{{AFX_DATA_MAP(CNetDownMTRDlg)
  66. DDX_Control(pDX, IDC_PROGRESS1, m_progress);
  67. //}}AFX_DATA_MAP
  68. }
  69. BEGIN_MESSAGE_MAP(CNetDownMTRDlg, CDialog)
  70. //{{AFX_MSG_MAP(CNetDownMTRDlg)
  71. ON_WM_SYSCOMMAND()
  72. ON_WM_PAINT()
  73. ON_WM_QUERYDRAGICON()
  74. ON_BN_CLICKED(IDC_BUTTON_Browse, OnBUTTONBrowse)
  75. ON_WM_DESTROY()
  76. ON_EN_CHANGE(IDC_EDIT_RemoteFileURL, OnChangeEDITRemoteFileURL)
  77. ON_BN_CLICKED(IDC_BUTTON_Stop, OnBUTTONStop)
  78. ON_MESSAGE(WM_DOWNLOAD_NOTIFY,OnWM_DOWNLOAD_NOTIFY)
  79. ON_BN_CLICKED(IDC_BUTTON_About, OnBUTTONAbout)
  80. //}}AFX_MSG_MAP
  81. END_MESSAGE_MAP()
  82. /////////////////////////////////////////////////////////////////////////////
  83. // CNetDownMTRDlg message handlers
  84. BOOL CNetDownMTRDlg::OnInitDialog()
  85. {
  86. CDialog::OnInitDialog();
  87. // Add "About..." menu item to system menu.
  88. // IDM_ABOUTBOX must be in the system command range.
  89. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  90. ASSERT(IDM_ABOUTBOX < 0xF000);
  91. CMenu* pSysMenu = GetSystemMenu(FALSE);
  92. if (pSysMenu != NULL)
  93. {
  94. CString strAboutMenu;
  95. strAboutMenu.LoadString(IDS_ABOUTBOX);
  96. if (!strAboutMenu.IsEmpty())
  97. {
  98. pSysMenu->AppendMenu(MF_SEPARATOR);
  99. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  100. }
  101. }
  102. // Set the icon for this dialog.  The framework does this automatically
  103. //  when the application's main window is not a dialog
  104. SetIcon(m_hIcon, TRUE); // Set big icon
  105. SetIcon(m_hIcon, FALSE); // Set small icon
  106. SetCtrlValue ();
  107. EnableSomeWindow ();
  108. BOOL success = m_OleTarget.Register(this);
  109.     if(!success )
  110. MessageBox("Ole Register Drop Target Failed");             
  111. m_OleTarget.SetParent(this);
  112. // 总在最前
  113. CRect rect;
  114. GetWindowRect(&rect);
  115. SetWindowPos(&wndTopMost, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOMOVE); 
  116. return TRUE;  // return TRUE  unless you set the focus to a control
  117. }
  118. void CNetDownMTRDlg::OnSysCommand(UINT nID,LPARAM lParam)
  119. {
  120. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  121. {
  122. CAboutDlg dlgAbout;
  123. dlgAbout.DoModal();
  124. }
  125. else
  126. {
  127. CDialog::OnSysCommand(nID, lParam);
  128. }
  129. }
  130. // If you add a minimize button to your dialog, you will need the code below
  131. //  to draw the icon.  For MFC applications using the document/view model,
  132. //  this is automatically done for you by the framework.
  133. void CNetDownMTRDlg::OnPaint() 
  134. {
  135. if (IsIconic())
  136. {
  137. CPaintDC dc(this); // device context for painting
  138. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  139. // Center icon in client rectangle
  140. int cxIcon = GetSystemMetrics(SM_CXICON);
  141. int cyIcon = GetSystemMetrics(SM_CYICON);
  142. CRect rect;
  143. GetClientRect(&rect);
  144. int x = (rect.Width() - cxIcon + 1) / 2;
  145. int y = (rect.Height() - cyIcon + 1) / 2;
  146. // Draw the icon
  147. dc.DrawIcon(x, y, m_hIcon);
  148. }
  149. else
  150. {
  151. CDialog::OnPaint();
  152. }
  153. }
  154. // The system calls this to obtain the cursor to display while the user drags
  155. //  the minimized window.
  156. HCURSOR CNetDownMTRDlg::OnQueryDragIcon()
  157. {
  158. return (HCURSOR) m_hIcon;
  159. }
  160. void Callback_DownloadNotify ( t_DownloadNotifyPara *pDownloadNotifyPara, WPARAM wParam )
  161. {
  162. TRACE ( "%d, %d, 0x%x, %d, 0x%xn", pDownloadNotifyPara->nIndex, pDownloadNotifyPara->nNotityType,
  163. pDownloadNotifyPara->lpNotifyData, pDownloadNotifyPara->pDownloadMTR, wParam );
  164. CNetDownMTRDlg *pNetDownMTRDlg = (CNetDownMTRDlg*)wParam;
  165. ASSERT ( pNetDownMTRDlg );
  166. pNetDownMTRDlg->Add_DownloadNotifyPara ( pDownloadNotifyPara );
  167. pNetDownMTRDlg->PostMessage ( WM_DOWNLOAD_NOTIFY, WPARAM(NULL), LPARAM(NULL) );
  168. }
  169. LRESULT CNetDownMTRDlg::OnWM_DOWNLOAD_NOTIFY(WPARAM wParam, LPARAM lParam)
  170. {
  171. t_Ary_DownloadNotifyPara Ary_DownloadNotifyPara;
  172. Get_Ary_DownloadNotifyPara ( Ary_DownloadNotifyPara );
  173. for ( int i=0; i<Ary_DownloadNotifyPara.GetSize(); i++ )
  174. {
  175. t_DownloadNotifyPara &DownloadNotifyPara = Ary_DownloadNotifyPara.GetAt (i);
  176. Callback_DownloadNotify ( &DownloadNotifyPara );
  177. }
  178. return TRUE;
  179. }
  180. void CNetDownMTRDlg::Callback_DownloadNotify(t_DownloadNotifyPara *pDownloadNotifyPara)
  181. {
  182. ASSERT ( pDownloadNotifyPara );
  183. CString csStatus;
  184. switch ( pDownloadNotifyPara->nNotityType )
  185. {
  186. case NOTIFY_TYPE_GOT_REMOTE_FILENAME:
  187. {
  188. OutStatusString ( pDownloadNotifyPara->nIndex, (LPCTSTR)pDownloadNotifyPara->lpNotifyData );
  189. break;
  190. }
  191. case NOTIFY_TYPE_GOT_REMOTE_FILESIZE:
  192. {
  193. int nFileSize = (int)pDownloadNotifyPara->lpNotifyData;
  194. csStatus.Format ( "File size is : %d bytes", nFileSize );
  195. OutStatusString ( pDownloadNotifyPara->nIndex, csStatus );
  196. ASSERT ( nFileSize == ( (CDownloadMTR*)pDownloadNotifyPara->pDownloadMTR )->Get_FileTotaleSize() );
  197. m_progress.SetRange32 ( 0, nFileSize );
  198. break;
  199. }
  200. case NOTIFY_TYPE_START_DOWNLOAD:
  201. {
  202. OutStatusString ( pDownloadNotifyPara->nIndex, _T("Start download") );
  203. break;
  204. }
  205. case NOTIFY_TYPE_END_DOWNLOAD:
  206. {
  207. m_bDownloadIsStart = FALSE;
  208. EnableSomeWindow ();
  209. OutStatusString ( pDownloadNotifyPara->nIndex, _T("End download") );
  210. ENUM_DOWNLOAD_RESULT eDownloadResult = (ENUM_DOWNLOAD_RESULT)(int)pDownloadNotifyPara->lpNotifyData;
  211. CString csMsg, csElapseTime;
  212. ASSERT ( pDownloadNotifyPara->pDownloadMTR );
  213. csElapseTime.Format ( "%d ms", ( (CDownloadMTR*)pDownloadNotifyPara->pDownloadMTR )->GetDownloadElapsedTime() );
  214. if ( eDownloadResult == ENUM_DOWNLOAD_RESULT_SUCCESS )
  215. {
  216. csMsg = "Download successfully";
  217. }
  218. else if ( eDownloadResult == ENUM_DOWNLOAD_RESULT_FAILED )
  219. {
  220. csMsg = "Download failed";
  221. }
  222. else if ( eDownloadResult == ENUM_DOWNLOAD_RESULT_CANCEL )
  223. {
  224. csMsg = "User cancel download";
  225. }
  226. else
  227. {
  228. ASSERT ( FALSE );
  229. }
  230. csMsg += ", Elapse time : " + csElapseTime;
  231. AfxMessageBox ( csMsg, (eDownloadResult==ENUM_DOWNLOAD_RESULT_SUCCESS)?MB_ICONINFORMATION:MB_ICONWARNING );
  232. break;
  233. }
  234. case NOTIFY_TYPE_WILL_DOWNLOAD_SIZE:
  235. {
  236. csStatus.Format ( "Will download size is : %d bytes", (int)pDownloadNotifyPara->lpNotifyData );
  237. OutStatusString ( pDownloadNotifyPara->nIndex, csStatus );
  238. break;
  239. }
  240. case NOTIFY_TYPE_THREAD_DOWNLOADED_SIZE:
  241. {
  242. csStatus.Format ( "Downloaded size is : %d bytes", (int)pDownloadNotifyPara->lpNotifyData );
  243. OutStatusString ( pDownloadNotifyPara->nIndex, csStatus );
  244. int nFileSize = ( (CDownloadMTR*)pDownloadNotifyPara->pDownloadMTR )->Get_FileTotaleSize();
  245. int nTotalDownloadedSize = ( (CDownloadMTR*)pDownloadNotifyPara->pDownloadMTR )->Get_TotalDownloadedSize ();
  246. if ( nFileSize > 0 && nTotalDownloadedSize > 0 )
  247. {
  248. m_progress.SetPos ( nTotalDownloadedSize );
  249. m_progress.Invalidate ();
  250. }
  251. break;
  252. }
  253. }
  254. }
  255. void CNetDownMTRDlg::OnOK() 
  256. {
  257. CString csRemoteFileURL = GetCtrlValueAndSaveSettingInfo(IDC_EDIT_RemoteFileURL);
  258. if ( csRemoteFileURL.IsEmpty () )
  259. {
  260. Log ( L_WARNING, "Download URL can't be empty" );
  261. GetDlgItem(IDC_EDIT_RemoteFileURL)->SetFocus ();
  262. return;
  263. }
  264. CString csLocalFilePath = GetCtrlValueAndSaveSettingInfo(IDC_EDIT_LocalFilePath);
  265. if ( csLocalFilePath.IsEmpty() )
  266. {
  267. Log ( L_WARNING, "Save path can't be empty" );
  268. GetDlgItem(IDC_EDIT_LocalFilePath)->SetFocus ();
  269. return;
  270. }
  271. CString csFileName = GetCtrlValueAndSaveSettingInfo(IDC_EDIT_FileName);
  272. if ( csFileName.IsEmpty() )
  273. {
  274. Log ( L_WARNING, "Save path can't be empty" );
  275. GetDlgItem(IDC_EDIT_FileName)->SetFocus ();
  276. return;
  277. }
  278. Set_DownloadNotify_Callback ( ::Callback_DownloadNotify, WPARAM(this) );
  279. if ( !CreateInstance_DownloadMTR () )
  280. {
  281. Log ( L_WARNING, "Create download instance failed" );
  282. return;
  283. }
  284. m_bDownloadIsStart = TRUE;
  285. EnableSomeWindow ();
  286. m_progress.SetPos ( 0 );
  287. m_pDownloadMTR->SetThreadCount ( atoi(GetCtrlValueAndSaveSettingInfo(IDC_EDIT_ThreadNumber)) );
  288. m_pDownloadMTR->Download ( csRemoteFileURL, csLocalFilePath, csFileName,
  289. GetCtrlValueAndSaveSettingInfo(IDC_EDIT_UserName),
  290. GetCtrlValueAndSaveSettingInfo(IDC_EDIT_Password) );
  291. }
  292. void CNetDownMTRDlg::OnBUTTONBrowse() 
  293. {
  294. SelectPathByCommonDlg ( this, IDC_EDIT_LocalFilePath );
  295. }
  296. void CNetDownMTRDlg::SetCtrlValue()
  297. {
  298. ReadSettingInfoAndSetCtrlValue ( IDC_EDIT_RemoteFileURL, "" );
  299. ReadSettingInfoAndSetCtrlValue ( IDC_EDIT_LocalFilePath, "" );
  300. ReadSettingInfoAndSetCtrlValue ( IDC_EDIT_FileName, "" );
  301. ReadSettingInfoAndSetCtrlValue ( IDC_EDIT_UserName, "" );
  302. ReadSettingInfoAndSetCtrlValue ( IDC_EDIT_Password, "" );
  303. ReadSettingInfoAndSetCtrlValue ( IDC_EDIT_ThreadNumber, "4" );
  304. }
  305. void CNetDownMTRDlg::GetCtrlValue()
  306. {
  307. GetCtrlValueAndSaveSettingInfo ( IDC_EDIT_RemoteFileURL );
  308. GetCtrlValueAndSaveSettingInfo ( IDC_EDIT_LocalFilePath );
  309. GetCtrlValueAndSaveSettingInfo ( IDC_EDIT_FileName );
  310. GetCtrlValueAndSaveSettingInfo ( IDC_EDIT_UserName );
  311. GetCtrlValueAndSaveSettingInfo ( IDC_EDIT_Password );
  312. GetCtrlValueAndSaveSettingInfo ( IDC_EDIT_ThreadNumber );
  313. }
  314. void CNetDownMTRDlg::ReadSettingInfoAndSetCtrlValue(UINT nCtrlID, LPCTSTR lpszDefaultValue)
  315. {
  316. CString csEntry;
  317. csEntry.Format ( "%d", nCtrlID );
  318. SetDlgItemText ( nCtrlID, AfxGetApp()->GetProfileString ( "Setting", csEntry, lpszDefaultValue ) );
  319. }
  320. CString CNetDownMTRDlg::GetCtrlValueAndSaveSettingInfo(UINT nCtrlID)
  321. {
  322. CString csEntry, csValue;
  323. csEntry.Format ( "%d", nCtrlID );
  324. GetDlgItemText ( nCtrlID, csValue );
  325. csValue.TrimLeft(); csValue.TrimRight ();
  326.  AfxGetApp()->WriteProfileString ( "Setting", csEntry, csValue );
  327.  return csValue;
  328. }
  329. void CNetDownMTRDlg::OnDestroy() 
  330. {
  331. CDialog::OnDestroy();
  332. DeleteInstance_DownloadMTR ();
  333. GetCtrlValue ();
  334. }
  335. void CNetDownMTRDlg::OnChangeEDITRemoteFileURL() 
  336. {
  337. CString csFileURL;
  338. GetDlgItemText ( IDC_EDIT_RemoteFileURL, csFileURL );
  339. csFileURL.TrimLeft(); csFileURL.TrimRight ();
  340. CString csFileNameByURL = CDownloadMTR::GetLocalFileNameByURL ( csFileURL );
  341. SetDlgItemText ( IDC_EDIT_FileName, csFileNameByURL );
  342. }
  343. void CNetDownMTRDlg::OutStatusString(int nIndex, LPCTSTR lpszText)
  344. {
  345. if ( nIndex != -1 && (nIndex < 0 || nIndex > 7) )
  346. return;
  347. nIndex ++;
  348. UINT nID = IDC_STATIC_Status + nIndex;
  349. SetDlgItemText ( nID, GET_SAFE_STRING(lpszText) );
  350. }
  351. CDownloadMTR* CNetDownMTRDlg::CreateInstance_DownloadMTR()
  352. {
  353. DeleteInstance_DownloadMTR ();
  354. m_pDownloadMTR = new CDownloadMTR;
  355. return m_pDownloadMTR;
  356. }
  357. void CNetDownMTRDlg::DeleteInstance_DownloadMTR()
  358. {
  359. if ( m_pDownloadMTR )
  360. delete m_pDownloadMTR;
  361. m_pDownloadMTR = NULL;
  362. }
  363. void CNetDownMTRDlg::OnBUTTONStop() 
  364. {
  365. if ( m_pDownloadMTR )
  366. m_pDownloadMTR->StopDownload ();
  367. }
  368. BOOL CNetDownMTRDlg::Add_DownloadNotifyPara(t_DownloadNotifyPara *pDownloadNotifyPara)
  369. {
  370. if ( !pDownloadNotifyPara ) return FALSE;
  371. t_DownloadNotifyPara DownloadNotifyPara = {0};
  372. memcpy ( &DownloadNotifyPara, pDownloadNotifyPara, sizeof(t_DownloadNotifyPara) );
  373. m_CSFor_Ary_DownloadNotifyPara.Lock ();
  374. BOOL bRet = FALSE;
  375. TRY
  376. {
  377. m_Ary_DownloadNotifyPara.Add ( DownloadNotifyPara );
  378. bRet = TRUE;
  379. }
  380. CATCH ( CMemoryException, e )
  381. {
  382. e->Delete ();
  383. bRet = FALSE;
  384. }
  385. END_CATCH
  386. m_CSFor_Ary_DownloadNotifyPara.Unlock ();
  387. if ( !bRet ) Log ( L_ERROR, "Memory too low" );
  388. return bRet;
  389. }
  390. void CNetDownMTRDlg::Get_Ary_DownloadNotifyPara(t_Ary_DownloadNotifyPara &Ary_DownloadNotifyPara)
  391. {
  392. m_CSFor_Ary_DownloadNotifyPara.Lock ();
  393. Ary_DownloadNotifyPara.Append ( m_Ary_DownloadNotifyPara );
  394. m_Ary_DownloadNotifyPara.RemoveAll ();
  395. m_CSFor_Ary_DownloadNotifyPara.Unlock ();
  396. }
  397. void CNetDownMTRDlg::EnableSomeWindow()
  398. {
  399. GetDlgItem(IDC_EDIT_RemoteFileURL)->EnableWindow ( !m_bDownloadIsStart );
  400. GetDlgItem(IDC_EDIT_LocalFilePath)->EnableWindow ( !m_bDownloadIsStart );
  401. GetDlgItem(IDC_BUTTON_Browse)->EnableWindow ( !m_bDownloadIsStart );
  402. GetDlgItem(IDC_EDIT_FileName)->EnableWindow ( !m_bDownloadIsStart );
  403. GetDlgItem(IDC_EDIT_UserName)->EnableWindow ( !m_bDownloadIsStart );
  404. GetDlgItem(IDC_EDIT_Password)->EnableWindow ( !m_bDownloadIsStart );
  405. GetDlgItem(IDC_EDIT_ThreadNumber)->EnableWindow ( !m_bDownloadIsStart );
  406. GetDlgItem(IDOK)->EnableWindow ( !m_bDownloadIsStart );
  407. GetDlgItem(IDC_BUTTON_Stop)->EnableWindow ( m_bDownloadIsStart );
  408. }
  409. void CNetDownMTRDlg::AddURL ( LPCTSTR lpszURL )
  410. {
  411. SetDlgItemText ( IDC_EDIT_RemoteFileURL, GET_SAFE_STRING(lpszURL) );
  412. }
  413. void CNetDownMTRDlg::OnBUTTONAbout() 
  414. {
  415. CAboutDlg dlgAbout;
  416. dlgAbout.DoModal();
  417. }
  418. BOOL CAboutDlg::OnInitDialog() 
  419. {
  420. CDialog::OnInitDialog();
  421. SetDlgItemText ( IDC_EDIT1, NOTE_DownloadMTR );
  422. return TRUE;  // return TRUE unless you set the focus to a control
  423.               // EXCEPTION: OCX Property Pages should return FALSE
  424. }