00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "HFEWnd.h"
00009 #include "plugins.h"
00010 #include "inetutil.h"
00011 #include "plugincmds.h"
00012
00013 #ifdef _DEBUG
00014 #define new DEBUG_NEW
00015 #undef THIS_FILE
00016 static char THIS_FILE[] = __FILE__;
00017 #endif
00018
00019 CHFEWnd* _pwndHFE = NULL;
00020
00021 CHFEWnd::CHFEWnd()
00022 {
00023 m_mgr.SetEventsFunc (_EventsFunc, this);
00024 m_wndListLog.m_wndLog.SetEvMgr (&m_evMgr);
00025 }
00026
00027 CHFEWnd::~CHFEWnd()
00028 {
00029 }
00030
00031 BEGIN_MESSAGE_MAP(CHFEWnd, CWnd)
00032
00033 ON_WM_CREATE()
00034 ON_WM_DESTROY()
00035 ON_WM_SIZE()
00036 ON_COMMAND(ID_HFE_REFRESH, OnHfeRefresh)
00037 ON_COMMAND(ID_HFE_SETTINGS, OnHfeSettings)
00038 ON_COMMAND(ID_HFE_STOP, OnHfeStop)
00039 ON_COMMAND(ID_HFE_DOWNLOAD, OnHfeDownload)
00040 ON_COMMAND(ID_HFE_OPENFOLDER, OnHfeOpenfolder)
00041 ON_COMMAND(ID_HFE_PARENTFOLDER, OnHfeParentfolder)
00042 ON_COMMAND(ID_HFE_DISCONNECT, OnHfeDisconnect)
00043 ON_WM_SETFOCUS()
00044
00045
00046 ON_MESSAGE (WM_WGP_SHUTDOWN, OnAppExit)
00047 ON_MESSAGE (WM_WGP_READYTOSHUTDOWN, OnAppQueryExit)
00048 ON_MESSAGE (WM_WGP_UPDATE_MENUMAIN, OnUpdateMenu)
00049 ON_MESSAGE (WM_WGP_UPDATE_MENUVIEW, OnUpdateMenuView)
00050 ON_MESSAGE (WM_WGP_UPDATE_CMDITEM, OnUpdateToolBar)
00051
00052 ON_COMMAND(WGP_MENU_VIEWSMPLITEM_CMDSTART+0, OnShowLog)
00053
00054 ON_COMMAND_RANGE(ID_LISTOFFILES_1, ID_LISTOFFILES_3, OnFilesListShowCol)
00055 ON_COMMAND_RANGE(ID_LOG_1, ID_LOG_3, OnLogShowCol)
00056
00057
00058 END_MESSAGE_MAP()
00059
00060 HWND CHFEWnd::Plugin_CreateMainWindow(HWND hParent)
00061 {
00062 fsnew1 (_pwndHFE, CHFEWnd);
00063
00064 _pwndHFE->Create (CWnd::FromHandle (hParent));
00065
00066 return _pwndHFE->m_hWnd;
00067 }
00068
00069 BOOL CHFEWnd::Create(CWnd *pParent)
00070 {
00071 CRect rc (0, 0, 50, 50);
00072
00073 if (FALSE == CWnd::Create (AfxRegisterWndClass (0, NULL,
00074 NULL, NULL), NULL, WS_CHILD | WS_VISIBLE, rc, pParent, 0x23121))
00075 return FALSE;
00076
00077 return TRUE;
00078 }
00079
00080 int CHFEWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
00081 {
00082 if (CWnd::OnCreate(lpCreateStruct) == -1)
00083 return -1;
00084
00085 if (!m_wndUrl.Create (this))
00086 return -1;
00087
00088 if (!m_wndListLog.Create (this))
00089 return -1;
00090
00091 return 0;
00092 }
00093
00094 void CHFEWnd::OnDestroy()
00095 {
00096 CWnd::OnDestroy();
00097
00098 delete _pwndHFE;
00099 }
00100
00101 LRESULT CHFEWnd::OnAppExit(WPARAM, LPARAM)
00102 {
00103 LOG ("Shutting down Site Explorer..." << nl);
00104
00105 m_mgr.SetEventsFunc (NULL, 0);
00106 m_mgr.Stop (FALSE);
00107
00108 LOG ("waiting filelistmgr..." << nl);
00109
00110 MSG msg;
00111 while (m_mgr.IsRunning ())
00112 {
00113 LOG ("processing messages...");
00114
00115 while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
00116 DispatchMessage (&msg);
00117
00118 LOG ("ok" << nl);
00119
00120 Sleep (10);
00121 }
00122
00123 LOG ("filelistmgr shutted down" << nl);
00124
00125 int cMax = 100;
00126
00127 while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
00128 {
00129 DispatchMessage (&msg);
00130 if (--cMax == 0)
00131 break;
00132 }
00133
00134 LOG ("saving all..." << nl);
00135
00136 SaveAll ();
00137
00138 LOG ("Site Explorer shutted down" << nl);
00139
00140 return 0;
00141 }
00142
00143 LRESULT CHFEWnd::OnAppQueryExit(WPARAM, LPARAM)
00144 {
00145 return 0;
00146 }
00147
00148 void CHFEWnd::OnSize(UINT , int cx, int cy)
00149 {
00150 if (cx && cy)
00151 {
00152 m_wndUrl.MoveWindow (0, 0, cx, 35);
00153 m_wndListLog.MoveWindow (0, 35, cx, cy - 35);
00154 }
00155 }
00156
00157 fsInternetFileListMgr* CHFEWnd::GetMgr()
00158 {
00159 return &m_mgr;
00160 }
00161
00162 void CHFEWnd::_EventsFunc(fsInternetFileListMgr* mgr, fsInternetFileListMgrEvent ev, LPVOID lp)
00163 {
00164 CHFEWnd* pThis = (CHFEWnd*) lp;
00165
00166 fsDescEvent event;
00167 LPCSTR psz = NULL;
00168 CString str;
00169
00170 switch (ev)
00171 {
00172 case FLME_CONNECTING:
00173 event.clrBg = CLR_INQUIRY;
00174 event.clrText = RGB (0, 0, 0);
00175 event.iImage = 0;
00176 psz = LS (L_CONNECTINGTOSERV);
00177 break;
00178
00179 case FLME_TRYINGTOUSESITEMGRLOGIN:
00180 event.clrBg = CLR_INQUIRY;
00181 event.clrText = RGB (0, 0, 0);
00182 event.iImage = 0;
00183 psz = LS (L_TRYINGSITEMGR);
00184 break;
00185
00186 case FLME_CONNECTED:
00187 event.clrBg = CLR_RESPONSE_S;
00188 event.clrText = RGB (0, 0, 0);
00189 event.iImage = 2;
00190 psz = LS (L_CONNSUCC);
00191 break;
00192
00193 case FLME_GETTINGLIST:
00194 event.clrBg = CLR_INQUIRY;
00195 event.clrText = RGB (0, 0, 0);
00196 event.iImage = 0;
00197 psz = LS (L_RETRLIST);
00198 break;
00199
00200 case FLME_DONE:
00201 event.clrBg = CLR_DONE;
00202 event.clrText = RGB (0, 0, 0);
00203 event.iImage = 1;
00204 psz = LS (L_DONE);
00205 break;
00206
00207 case FLME_ERROR:
00208 event.clrBg = CLR_RESPONSE_E;
00209 event.clrText = RGB (0, 0, 0);
00210 event.iImage = 3;
00211 break;
00212
00213 case FLME_PAUSE:
00214 event.clrBg = CLR_RESPONSE_S;
00215 event.clrText = RGB (0, 0, 0);
00216 event.iImage = 2;
00217 str.Format (LS (L_PAUSESECS), _App.RetriesTime () / 1000);
00218 psz = str;
00219 break;
00220
00221 case FLME_STOPPED:
00222 event.clrBg = CLR_RESPONSE_E;
00223 event.clrText = RGB (0, 0, 0);
00224 event.iImage = 3;
00225 psz = LS (L_DLDSTOPPED);
00226 break;
00227
00228 case FLME_CONNECTIONWASLOST_RESTORE:
00229 event.clrBg = CLR_RESPONSE_E;
00230 event.clrText = RGB (0, 0, 0);
00231 event.iImage = 3;
00232 psz = LS (L_CONNLOSTTRYINGTORESTORE);
00233 break;
00234
00235 case FLME_HTTP_LISTREAD:
00236 event.clrBg = CLR_RESPONSE_S;
00237 event.clrText = RGB (0, 0, 0);
00238 event.iImage = 2;
00239 psz = LS (L_SUCCESS);
00240 break;
00241
00242 case FLME_HTTP_STARTBUILDLIST:
00243 event.clrBg = CLR_INQUIRY;
00244 event.clrText = RGB (0, 0, 0);
00245 event.iImage = 0;
00246 psz = LS (L_BUILDINGLIST2);
00247 break;
00248 }
00249
00250 if (ev == FLME_ERROR)
00251 {
00252 char str [1000];
00253 *str = 0;
00254
00255 fsIRToStr (mgr->GetLastError (), str, 1000);
00256
00257 fsnew (event.pszEvent, char, strlen (str) + 1);
00258 strcpy (event.pszEvent, str);
00259 pThis->m_evMgr.add (&event);
00260 pThis->m_wndListLog.m_wndLog.AddRecord (&event);
00261
00262 if (mgr->GetLastError () == IR_EXTERROR)
00263 {
00264
00265 LPCSTR pszExtError = pThis->m_mgr.GetLastErrorDesc ();
00266 LPCSTR pszErr1 = pszExtError;
00267 LPCSTR pszErr2 = pszErr1;
00268
00269 while (pszErr1)
00270 {
00271
00272 pszErr1 = strstr (pszErr1, "\r\n");
00273 if (pszErr1)
00274 {
00275 strncpy (str, pszErr2, pszErr1 - pszErr2);
00276 str [pszErr1 - pszErr2] = 0;
00277 }
00278 else
00279 strcpy (str, pszErr2);
00280
00281 fsnew (event.pszEvent, char, strlen (str) + 1);
00282 strcpy (event.pszEvent, str);
00283 pThis->m_evMgr.add (&event);
00284 pThis->m_wndListLog.m_wndLog.AddRecord (&event);
00285
00286 if (pszErr1)
00287 {
00288 pszErr1 += 2;
00289 pszErr2 = pszErr1;
00290 }
00291 }
00292 }
00293 }
00294 else if (psz)
00295 {
00296 fsnew (event.pszEvent, char, strlen (psz) + 1);
00297 strcpy (event.pszEvent, psz);
00298 pThis->m_evMgr.add (&event);
00299 pThis->m_wndListLog.m_wndLog.AddRecord (&event);
00300 }
00301
00302
00303 if (ev == FLME_DONE || ev == FLME_DONE_FROM_CACHE || ev == FLME_STOPPED || ev == FLME_ERROR)
00304 {
00305
00306 pThis->m_wndListLog.m_wndFileList.UpdateList ();
00307 pThis->m_wndUrl.UpdateUrl ();
00308 }
00309 else
00310 {
00311
00312 }
00313 }
00314
00315 LRESULT CHFEWnd::OnUpdateMenu(WPARAM, LPARAM lp)
00316 {
00317 m_wndListLog.m_wndFileList.UpdateMenu (CMenu::FromHandle (*((HMENU*)lp)));
00318 return 0;
00319 }
00320
00321 void CHFEWnd::OnHfeRefresh()
00322 {
00323 m_wndListLog.m_wndFileList.OnHfeRefresh ();
00324 }
00325
00326 void CHFEWnd::OnHfeSettings()
00327 {
00328 m_wndListLog.m_wndFileList.OnHfeSettings ();
00329 }
00330
00331 void CHFEWnd::OnHfeStop()
00332 {
00333 m_wndListLog.m_wndFileList.OnHfeStop ();
00334 }
00335
00336 void CHFEWnd::OnGo()
00337 {
00338 DWORD dw;
00339 CloseHandle (CreateThread (NULL, 0, _threadGoUrl, this, 0, &dw));
00340 m_wndListLog.m_wndFileList.SetFocus ();
00341 }
00342
00343 DWORD WINAPI CHFEWnd::_threadGoUrl(LPVOID lp)
00344 {
00345 CHFEWnd* pThis = (CHFEWnd*) lp;
00346 LPCSTR pszUrl = pThis->m_wndUrl.GetUrl ();
00347 if (pThis->m_mgr.IsRunning ())
00348 pThis->m_mgr.Stop ();
00349 pThis->m_mgr.GetList (pszUrl, NULL, NULL);
00350 return 0;
00351 }
00352
00353 void CHFEWnd::Plugin_GetToolBarInfo(wgTButtonInfo **ppButtons, int *pcButtons)
00354 {
00355 static wgTButtonInfo btns [] =
00356 {
00357 wgTButtonInfo (ID_HFE_DOWNLOAD, TBSTYLE_BUTTON, ""),
00358 wgTButtonInfo (ID_HFE_STOP, TBSTYLE_BUTTON, ""),
00359 wgTButtonInfo (ID_HFE_REFRESH, TBSTYLE_BUTTON, ""),
00360 };
00361
00362 btns [0].pszToolTip = LS (L_DOWNLOADSELECTED);
00363 btns [1].pszToolTip = LS (L_STOP);
00364 btns [2].pszToolTip = LS (L_REFRESH);
00365
00366 *ppButtons = btns;
00367 *pcButtons = sizeof (btns) / sizeof (wgTButtonInfo);
00368 }
00369
00370 LRESULT CHFEWnd::OnUpdateToolBar(WPARAM wp, LPARAM)
00371 {
00372 return m_wndListLog.m_wndFileList.OnUpdateToolBar (wp);
00373 }
00374
00375 void CHFEWnd::OnHfeDownload()
00376 {
00377 m_wndListLog.m_wndFileList.OnHfeDownload ();
00378 }
00379
00380 void CHFEWnd::OnHfeOpenfolder()
00381 {
00382 m_wndListLog.m_wndFileList.OnHfeOpenfolder ();
00383 }
00384
00385 void CHFEWnd::OnHfeParentfolder()
00386 {
00387 m_wndListLog.m_wndFileList.OnHfeParentfolder ();
00388 }
00389
00390 void CHFEWnd::Plugin_GetMenuImages(fsSetImage **ppImages, int *pcImages)
00391 {
00392 static fsSetImage images [] =
00393 {
00394 fsSetImage (ID_HFE_DOWNLOAD, 0),
00395 fsSetImage (ID_HFE_STOP, 1),
00396 fsSetImage (ID_HFE_REFRESH, 2),
00397 fsSetImage (ID_HFE_SETTINGS, 3),
00398 fsSetImage (ID_HFE_OPENFOLDER, 4),
00399 };
00400
00401 *ppImages = images;
00402 *pcImages = sizeof (images) / sizeof (fsSetImage);
00403 }
00404 void CHFEWnd::OnHfeDisconnect()
00405 {
00406 m_wndListLog.m_wndFileList.OnHfeDisconnect ();
00407 }
00408
00409 void CHFEWnd::Plugin_GetMenuViewItems(wgMenuViewItem **ppItems, int * cItems)
00410 {
00411 static wgMenuViewItem aItems [] = {
00412 wgMenuViewItem ("", &_pwndHFE->m_wndListLog.m_bShowLog),
00413 };
00414
00415 aItems [0].pszName = LS (L_EXPLORERLOG);
00416
00417 *ppItems = aItems;
00418 *cItems = sizeof (aItems) / sizeof (wgMenuViewItem);
00419 }
00420
00421 void CHFEWnd::OnShowLog()
00422 {
00423 m_wndListLog.ShowLog (m_wndListLog.m_bShowLog == FALSE);
00424 }
00425
00426 void CHFEWnd::SaveAll()
00427 {
00428 m_wndListLog.SaveState ();
00429 }
00430
00431 void CHFEWnd::Plugin_GetPluginNames(LPCSTR *ppszLong, LPCSTR *ppszShort)
00432 {
00433 static CString strNameLong, strNameShort;
00434 strNameLong = LSNP (L_HFE);
00435 strNameShort = LSNP (L_EXPLORER);
00436 *ppszLong = strNameLong;
00437 *ppszShort = strNameShort;
00438 }
00439
00440 void CHFEWnd::OnSetFocus(CWnd* pOldWnd)
00441 {
00442 CWnd::OnSetFocus(pOldWnd);
00443 m_wndUrl.m_wndUrl.SetFocus ();
00444 }
00445
00446 void CHFEWnd::Plugin_SetLanguage(wgLanguage, HMENU hMenuMain, HMENU hMenuView)
00447 {
00448 CMenu *menu = CMenu::FromHandle (hMenuMain);
00449 _pwndHFE->m_wndListLog.m_wndFileList.ApplyLanguageToMenu (menu);
00450 _pwndHFE->m_wndListLog.ApplyLanguage ();
00451 _pwndHFE->m_wndUrl.ApplyLanguage ();
00452 _pwndHFE->ApplyLanguageToMenuView (CMenu::FromHandle (hMenuView));
00453 }
00454
00455 void CHFEWnd::ApplyLanguageToMenuView(CMenu *menu)
00456 {
00457 menu->ModifyMenu (0, MF_BYPOSITION | MF_STRING, 0, LS (L_LISTOFFILES));
00458 menu->ModifyMenu (1, MF_BYPOSITION | MF_STRING, 0, LS (L_EXPLORERLOG));
00459
00460 UINT aCmds [] = {ID_LISTOFFILES_1, ID_LISTOFFILES_2, ID_LISTOFFILES_3, ID_LOG_1, ID_LOG_2, ID_LOG_3};
00461 LPCSTR apszCmds [] = {LS (L_FILENAME), LS (L_SIZE), LS (L_DATE), LS (L_TIME),
00462 LS (L_DATE), LS (L_INFORMATION)};
00463
00464 for (int i = 0; i < sizeof (aCmds) / sizeof (UINT); i++)
00465 menu->ModifyMenu (aCmds [i], MF_BYCOMMAND|MF_STRING, aCmds [i], apszCmds [i]);
00466 }
00467
00468 LRESULT CHFEWnd::OnUpdateMenuView(WPARAM, LPARAM lp)
00469 {
00470 HMENU* pMenus = (HMENU*) lp;
00471 UpdateFilesListColMenu (CMenu::FromHandle (pMenus [0]));
00472 UpdateLogColMenu (CMenu::FromHandle (pMenus [1]));
00473 return 0;
00474 }
00475
00476 void CHFEWnd::UpdateFilesListColMenu(CMenu *menu)
00477 {
00478 BOOL bEn = m_wndListLog.m_wndFileList.GetHeaderCtrl ()->GetItemCount () > 1;
00479 for (int i = 0; i < 3; i++)
00480 {
00481 if (m_wndListLog.m_wndFileList.IsColumnShown (i))
00482 {
00483 menu->CheckMenuItem (ID_LISTOFFILES_1+i, MF_CHECKED);
00484 if (bEn == FALSE)
00485 menu->EnableMenuItem (ID_LISTOFFILES_1+i, MF_GRAYED);
00486 }
00487 }
00488 }
00489
00490 void CHFEWnd::UpdateLogColMenu(CMenu *menu)
00491 {
00492 BOOL bEn = m_wndListLog.m_wndLog.GetHeaderCtrl ()->GetItemCount () > 1;
00493 for (int i = 0; i < 3; i++)
00494 {
00495 if (m_wndListLog.m_wndLog.IsColumnShown (i))
00496 {
00497 menu->CheckMenuItem (ID_LOG_1+i, MF_CHECKED);
00498 if (bEn == FALSE)
00499 menu->EnableMenuItem (ID_LOG_1+i, MF_GRAYED);
00500 }
00501 }
00502 }
00503
00504 void CHFEWnd::OnFilesListShowCol(UINT uCmd)
00505 {
00506 int iCol = uCmd - ID_LISTOFFILES_1;
00507 m_wndListLog.m_wndFileList.ChangeColumnVisibility (iCol);
00508 }
00509
00510 void CHFEWnd::OnLogShowCol(UINT uCmd)
00511 {
00512 int iCol = uCmd - ID_LOG_1;
00513 m_wndListLog.m_wndLog.ChangeColumnVisibility (iCol);
00514 }
00515
00516 void CHFEWnd::ClearHistory()
00517 {
00518 m_wndUrl.ClearHistory ();
00519 }
00520
00521 void CHFEWnd::LogFailedMessage(LPCSTR pszMsg)
00522 {
00523 fsDescEvent event;
00524 event.clrBg = CLR_RESPONSE_E;
00525 event.clrText = RGB (0, 0, 0);
00526 event.iImage = 3;
00527 fsnew (event.pszEvent, char, lstrlen (pszMsg) + 1);
00528 lstrcpy (event.pszEvent, pszMsg);
00529 m_evMgr.add (&event);
00530 m_wndListLog.m_wndLog.AddRecord (&event);
00531 }
00532
00533 HMENU CHFEWnd::Plugin_GetMainMenu()
00534 {
00535 return LoadMenu (AfxGetInstanceHandle (), MAKEINTRESOURCE (IDM_HFE));
00536 }
00537
00538 HMENU CHFEWnd::Plugin_GetViewMenu()
00539 {
00540 return LoadMenu (AfxGetInstanceHandle (), MAKEINTRESOURCE (IDM_HFE_VIEW));
00541 }