MainFrm.cpp
上传用户:st5609838
上传日期:2013-03-29
资源大小:66k
文件大小:20k
源码类别:

搜索引擎

开发平台:

Visual C++

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3. /****************************************************************
  4. Pre-emptive Multithreading Web Spider
  5. Copyright (c) 1998 by Sim Ayers.
  6. **************************************************************/
  7. #include "stdafx.h"
  8. #include "Spider.h"
  9. #include "ThreadParams.h"
  10. #include "Thread.h"
  11. #include "MainFrm.h"
  12. #include "SpiderDoc.h"
  13. #include "SpiderView.h"
  14. #include "SpiderList.h"
  15. #include "utily.h"
  16. #include "UrlDlg.h"
  17. #ifdef _DEBUG
  18. #define new DEBUG_NEW
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22. HANDLE hConnection;
  23. long lThreadCount = 0;
  24. long lURLCount = 0;
  25. int  nCurrentlThreadCount = 0;
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CMainFrame
  28. IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
  29. BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
  30. //{{AFX_MSG_MAP(CMainFrame)
  31. ON_WM_CREATE()
  32. ON_COMMAND(ID_WINDOWS_CLOSEALL, OnWindowsCloseall)
  33. ON_WM_CLOSE()
  34. ON_COMMAND(ID_TOOLS_GETURL, OnToolsGetURL)
  35. ON_COMMAND(ID_TOOLS_KILLTHREAD, OnToolsKillthread)
  36. ON_WM_DESTROY()
  37. ON_COMMAND(ID_TOOL_BROKENURLS, OnToolCheckURLs)
  38. ON_COMMAND(ID_TOOLS_GETHEADER, OnToolsGetServerHeader)
  39. ON_COMMAND(ID_TOOLS_LIST, OnToolsViewURLList)
  40. ON_COMMAND(ID_TOOLS_NOT_FOUND, OnToolsURLsNotFound)
  41. ON_COMMAND(ID_TOOLS_STOP, OnToolsThreadsStop)
  42. ON_COMMAND(ID_WINDOWS_CLOSEALL, OnWindowsCloseall)
  43. ON_UPDATE_COMMAND_UI(ID_TOOLS_KILLTHREAD, OnUpdateToolsKillthread)
  44. ON_UPDATE_COMMAND_UI(ID_TOOLS_STOP, OnUpdateToolsThreadsStop)
  45. //}}AFX_MSG_MAP
  46. ON_MESSAGE(WM_USER_THREAD_FILE,OnDocNew)
  47. ON_MESSAGE(WM_USER_THREAD_PRINT,OnDocUpdate)
  48. ON_MESSAGE(WM_USER_THREAD_DONE,OnThreadDone)
  49. ON_MESSAGE(WM_USER_THREAD_STATUS,OnThreadStatus)
  50. ON_MESSAGE(WM_USER_THREAD_GETSTATUS,OnNewThread)
  51. ON_MESSAGE(WM_USER_THREAD_GETNEWFILE,OnGetNewFiles)
  52. ON_MESSAGE(WM_USER_SERVER_STATUS,OnServerStatus)
  53. ON_MESSAGE(WM_USER_URL_STATUS,OnURLStatus)
  54. END_MESSAGE_MAP()
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CMainFrame construction/destruction
  57. CMainFrame::CMainFrame()
  58. {
  59.     m_lCurThreads = 0;
  60. m_lMaxThreads = MAXIMUM_WAIT_OBJECTS;  //64
  61. hConnection = CreateSemaphore( NULL,m_lCurThreads,m_lMaxThreads,NULL);
  62. InitializeCriticalSection(&m_CritSect);
  63. }
  64. CMainFrame::~CMainFrame()
  65. {
  66. int nRemoveEntry = 0;
  67. while (g_nEntries > 0)
  68. {
  69. delete g_entry[nRemoveEntry];
  70. g_nEntries--;
  71. nRemoveEntry++;
  72. }
  73. g_nEntries = 0;
  74. g_entry.RemoveAll();
  75. CloseHandle(hConnection);
  76. DeleteCriticalSection(&m_CritSect);
  77. }
  78. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  79. {
  80. if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
  81. return -1;
  82. if (!m_wndToolBar.Create(this) ||
  83. !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  84. {
  85. TRACE0("Failed to create toolbarn");
  86. return -1;      // fail to create
  87. }
  88.     static UINT nIndicators[] = {
  89.         ID_SEPARATOR,
  90.         ID_SEPARATOR,
  91.     };
  92.     if (!m_wndStatusBar.Create (this))
  93.         return -1;
  94.     m_wndStatusBar.SetIndicators (nIndicators, 4);
  95.     TEXTMETRIC tm;
  96.     CClientDC dc (this);
  97.     CFont* pFont = m_wndStatusBar.GetFont ();
  98.     CFont* pOldFont = dc.SelectObject (pFont);
  99.     dc.GetTextMetrics (&tm);
  100.     dc.SelectObject (pOldFont);
  101.     int cxWidth;
  102.     UINT nID, nStyle;
  103.     m_wndStatusBar.GetPaneInfo (1, nID, nStyle, cxWidth);
  104.     m_wndStatusBar.SetPaneInfo (1, nID, nStyle, tm.tmAveCharWidth * 40);
  105.     m_wndStatusBar.SetPaneInfo (2, nID, nStyle, tm.tmAveCharWidth * 12);
  106.     m_wndStatusBar.SetPaneInfo (3, nID, nStyle, tm.tmAveCharWidth * 12);
  107. // TODO: Remove this if you don't want tool tips or a resizeable toolbar
  108. m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
  109. CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
  110. // TODO: Delete these three lines if you don't want the toolbar to
  111. //  be dockable
  112. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  113. EnableDocking(CBRS_ALIGN_ANY);
  114. DockControlBar(&m_wndToolBar);
  115. DockControlBar(&m_wndToolBar);
  116. return 0;
  117. }
  118. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  119. {
  120. // TODO: Modify the Window class or styles here by modifying
  121. //  the CREATESTRUCT cs
  122. return CMDIFrameWnd::PreCreateWindow(cs);
  123. }
  124. /////////////////////////////////////////////////////////////////////////////
  125. // CMainFrame diagnostics
  126. #ifdef _DEBUG
  127. void CMainFrame::AssertValid() const
  128. {
  129. CMDIFrameWnd::AssertValid();
  130. }
  131. void CMainFrame::Dump(CDumpContext& dc) const
  132. {
  133. CMDIFrameWnd::Dump(dc);
  134. }
  135. #endif //_DEBUG
  136. /////////////////////////////////////////////////////////////////////////////
  137. // CMainFrame message handlers
  138. void CMainFrame::OnWindowsCloseall() 
  139. {
  140.     CWnd *activeWnd;
  141.     // Send a Close command to every open document
  142.     while ( (activeWnd = MDIGetActive()) != 0) {
  143.         // has the document been modified?
  144.         CDocument *activeDoc = ((CFrameWnd *) activeWnd)->GetActiveDocument();
  145.      activeDoc->SetModifiedFlag(FALSE);
  146.         activeWnd->SendMessage(WM_COMMAND, ID_FILE_CLOSE);
  147.     }
  148. }
  149. LRESULT CMainFrame::OnDocNew(WPARAM wParam,LPARAM lParam) 
  150. {
  151. EnterCriticalSection(&m_CritSect);
  152. ThreadParams *lpThreadParams = NULL;
  153. lpThreadParams = (ThreadParams*)lParam;
  154. if(lpThreadParams != NULL)
  155. {
  156. lpThreadParams = (ThreadParams*)lParam;
  157. CSpiderApp *pApp = (CSpiderApp*) AfxGetApp();
  158. CString lpFileName = lpThreadParams->m_pszURL;
  159. CString urlPage= "Error in file tranfer";
  160. if(!lpThreadParams->m_Contents.IsEmpty())
  161. urlPage = lpThreadParams->m_Contents;
  162. pApp->ShowURL(lpFileName,urlPage); 
  163. }
  164. LeaveCriticalSection(&m_CritSect);
  165. return 0;
  166. }
  167. LRESULT CMainFrame::OnThreadDone(WPARAM wParam,LPARAM lParam) 
  168. {
  169. EnterCriticalSection(&m_CritSect);
  170. CString string;
  171. ThreadParams *lpThreadParams = NULL;
  172. lpThreadParams = (ThreadParams*)lParam;
  173. POSITION pos= NULL;
  174. ::InterlockedDecrement(&lThreadCount);
  175. if(lThreadCount < 0) lThreadCount = 0;
  176. if(lThreadCount == 0)
  177. {
  178. string = "Ready!";
  179. m_wndStatusBar.SetPaneText (0, (LPCTSTR) string, TRUE);
  180. string = "Connection Closed";
  181. m_wndStatusBar.SetPaneText (1, (LPCTSTR) string, TRUE);
  182. }
  183. int nThreadsLeft = m_threadList.GetCount();
  184. if(lpThreadParams != NULL )
  185. {
  186. for(int i=0; i<nThreadsLeft; i++)
  187. {
  188. if((pos = m_threadList.FindIndex(i))!= NULL )
  189. {
  190. CSpiderThread* pThread = m_threadList.GetAt(pos);
  191. if(pThread != NULL)
  192. {
  193. if(lpThreadParams->m_threadID==pThread->m_nThreadID)
  194. {
  195. //A thread object is deleted when the last handle to the thread 
  196. //is closed. 
  197. m_threadList.RemoveAt(pos);
  198.  delete  lpThreadParams;
  199.   if(lThreadCount < MAXIMUM_WAIT_OBJECTS) 
  200. ReleaseSemaphore(hConnection,1,NULL);
  201. string.Format ("Threads:%d",lThreadCount );
  202. m_wndStatusBar.SetPaneText (2, (LPCSTR) string, TRUE);
  203. break;
  204. }
  205. }
  206. }
  207. }
  208. }
  209. LeaveCriticalSection(&m_CritSect);
  210. return 0;
  211. }
  212. LRESULT CMainFrame::OnDocUpdate(WPARAM wParam,LPARAM lParam) 
  213. {
  214. EnterCriticalSection(&m_CritSect);
  215. ThreadParams *lpThreadParams = NULL;
  216. lpThreadParams = (ThreadParams*)lParam;
  217. CString string = "";
  218. if(lpThreadParams != NULL)
  219. {
  220. if(!lpThreadParams->m_string.IsEmpty())
  221. string.Format("%s",(LPCTSTR)lpThreadParams->m_string);
  222. LPCSTR lpstring = string;
  223. if(lpThreadParams->m_hwndNotifyView != NULL)
  224. ::SendMessage(lpThreadParams->m_hwndNotifyView,WM_USER_CHECK_DONE, 0, (LPARAM)lpstring);
  225. else
  226. {
  227. CSpiderView* pActiveView = NULL;
  228. pActiveView = CSpiderView::GetView();
  229. if(pActiveView)
  230. pActiveView->UpdateString(string);
  231. }
  232. }
  233. LeaveCriticalSection(&m_CritSect);
  234. return 0;
  235. }
  236. LRESULT CMainFrame::OnThreadStatus(WPARAM wParam,LPARAM lParam) 
  237. {
  238. EnterCriticalSection(&m_CritSect);
  239. LPCSTR prtline;;
  240. prtline = (LPCSTR)lParam;
  241.     CString string;
  242.     string.Format ("%s",prtline );
  243.     m_wndStatusBar.SetPaneText (0, (LPCSTR) string, TRUE);
  244. LeaveCriticalSection(&m_CritSect);
  245. return 0;
  246. }
  247. LRESULT CMainFrame::OnURLStatus(WPARAM wParam,LPARAM lParam) 
  248. {
  249. EnterCriticalSection(&m_CritSect);
  250. long nCount = lParam;
  251.     CString string;
  252.     string.Format ("URLs:%d",nCount );
  253.     m_wndStatusBar.SetPaneText (3, (LPCSTR) string, TRUE);
  254. LeaveCriticalSection(&m_CritSect);
  255. return 0;
  256. }
  257. LRESULT CMainFrame::OnServerStatus(WPARAM wParam,LPARAM lParam) 
  258. {
  259. EnterCriticalSection(&m_CritSect);
  260. LPCSTR prtline;;
  261. prtline = (LPCSTR)lParam;
  262.     CString string;
  263.     string.Format ("%s",prtline );
  264.     m_wndStatusBar.SetPaneText (1, (LPCSTR) string, TRUE);
  265. LeaveCriticalSection(&m_CritSect);
  266. return 0;
  267. }
  268. LRESULT CMainFrame::OnNewThread(WPARAM wParam,LPARAM lParam) 
  269. {
  270. EnterCriticalSection(&m_CritSect);
  271. ThreadParams *lpThreadParams = NULL;
  272. lpThreadParams = (ThreadParams*)lParam;
  273. UINT ntype = (UINT)wParam;
  274. CString pszURL = "";
  275. CString string;
  276. URLStatus lpEntry;
  277. if(lpThreadParams != NULL)
  278. {
  279. if(!lpThreadParams->m_checkURLName.IsEmpty()) pszURL.Format("%s",(LPCTSTR)lpThreadParams->m_checkURLName);
  280. BOOL Result= GetURL(pszURL,lpThreadParams->m_hwndNotifyView,(int) ntype,lpThreadParams->m_RootLinks);// HTTP_CHECK_URL);
  281.    if(!Result)
  282.    {
  283.    string.Format("Error in creating NEW thread ");
  284. AfxMessageBox(string, MB_OK);
  285.    }
  286. }
  287. LeaveCriticalSection(&m_CritSect);
  288. return 0;
  289. }
  290. LRESULT CMainFrame::OnGetNewFiles(WPARAM wParam,LPARAM lParam) 
  291. {
  292. EnterCriticalSection(&m_CritSect);
  293. LPCSTR prtline;;
  294. UINT type = (UINT)wParam;
  295. prtline = (LPCSTR)lParam;
  296. CString pszURL;
  297. pszURL.Format("%s",(LPCTSTR)prtline);
  298. BOOL Result= GetURL(pszURL,NULL,(int)type);
  299.    if(!Result)
  300.    {
  301.    CString str;
  302. str.Format("Error in creating NEW thread ");
  303. AfxMessageBox(str, MB_OK);
  304.    }
  305. LeaveCriticalSection(&m_CritSect);
  306. return 0;
  307. }
  308. void CMainFrame::OnClose() 
  309. {
  310. CMDIFrameWnd::OnClose();
  311. }
  312. /******************************************
  313. Create the Thread and process the desired URL action 
  314. *******************************************/
  315. BOOL CMainFrame::GetURL(LPCTSTR lpFileName, HWND lphwndNotifyView,
  316. int lptype,BOOL lpRoot)
  317. {
  318. if(lpFileName == NULL) return FALSE;
  319. if(lptype< HTTP_GET_FILE || lptype > HTTP_GET_ENTRY) lptype = 0;
  320.     ThreadParams* pThreadParams = new ThreadParams;
  321. if(!pThreadParams) return FALSE;
  322. pThreadParams->m_pszURL.Format("%s",lpFileName);
  323. pThreadParams->m_type = lptype;
  324. pThreadParams->m_Status = 0;
  325. pThreadParams->m_RootLinks = lpRoot;
  326. pThreadParams->m_hwndNotifyProgress = 
  327. AfxGetMainWnd()->m_hWnd;
  328. if(lphwndNotifyView != NULL)
  329.   pThreadParams->m_hwndNotifyView = lphwndNotifyView;
  330. else
  331.   pThreadParams->m_hwndNotifyView = NULL;
  332. CSpiderThread* pThread;
  333. pThread = NULL;
  334. pThread = new CSpiderThread(CSpiderThread::ThreadFunc,pThreadParams); // create a new CSpiderThread object
  335. if (pThread == NULL)
  336. {
  337. AfxMessageBox("Cannot Start New Thread");
  338. delete pThreadParams;
  339. return FALSE;
  340. }    
  341. if (!pThread->CreateThread())   //  Starts execution of a CWinThread object
  342. {
  343. AfxMessageBox("Cannot Start New Thread");
  344. delete pThread;
  345. pThread = NULL;
  346. delete pThreadParams;
  347. return FALSE;
  348. }    
  349. pThreadParams->m_threadID = pThread->m_nThreadID;
  350. // since everything is successful, add the thread to our list
  351. m_threadList.AddTail(pThread);
  352. CString string;
  353. ::InterlockedIncrement(&lThreadCount);
  354. string.Format ("Threads:%d",lThreadCount);
  355. m_wndStatusBar.SetPaneText (2, (LPCTSTR) string, TRUE);
  356. return TRUE;
  357. }
  358. void CMainFrame::OnDestroy() 
  359. {
  360. OnToolsKillthread();
  361. CMDIFrameWnd::OnDestroy();
  362. }
  363. void CMainFrame::GetConnected()
  364. {
  365. DWORD 
  366. dwConnectionTypes = INTERNET_CONNECTION_LAN |
  367.                           INTERNET_CONNECTION_MODEM |
  368.                           INTERNET_CONNECTION_PROXY;
  369.  if (!InternetGetConnectedState(&dwConnectionTypes, 0))
  370.  {
  371.      InternetAutodial(INTERNET_AUTODIAL_FORCE_UNATTENDED,
  372.                     0);
  373.  } 
  374. }
  375. /*************************************
  376. *     Get a File from a URL Location
  377. **************************************/
  378. void CMainFrame::OnToolsGetURL()  
  379. {
  380. CUrlDlg  dlg;
  381. CString str;
  382. CSpiderApp *pApp = (CSpiderApp*) AfxGetApp();
  383. char* pFileName = "Urls.log";
  384. char lpFileName[MAX_PATH];
  385. strcpy(lpFileName,pApp->m_HomeDir);
  386. strcat(lpFileName,"\");
  387. strcat(lpFileName,pFileName);
  388. dlg.LoadFile(lpFileName);
  389. if(dlg.DoModal() != IDOK) return;
  390. dlg.SaveFile(lpFileName);
  391. if(!dlg.m_WebFileName.IsEmpty())
  392. {
  393. BOOL Result= GetURL(dlg.m_WebFileName,NULL,HTTP_GET_FILE,FALSE);
  394.    if(!Result)
  395.    {
  396. str.Format("Error in thread file transfer");
  397. AfxMessageBox(str, MB_OK);
  398.    }
  399. }
  400. }
  401. /*************************************
  402. *  Check Broken URLs in a HTML file on the Web
  403. **************************************/
  404. void CMainFrame::OnToolCheckURLs() 
  405. {
  406. CUrlDlg  dlg;
  407. CSpiderApp *pApp = (CSpiderApp*) AfxGetApp();
  408. HWND hwndNotifyView = NULL;
  409. char* pFileName = "Urls.log";
  410. char lpFileName[MAX_PATH];
  411. strcpy(lpFileName,pApp->m_HomeDir);
  412. strcat(lpFileName,"\");
  413. strcat(lpFileName,pFileName);
  414. dlg.LoadFile(lpFileName);
  415. if(dlg.DoModal() != IDOK) return;
  416. dlg.SaveFile(lpFileName);
  417. CString str ="";
  418. if(!dlg.m_WebFileName.IsEmpty())
  419. {
  420. if(RobotCheck(dlg.m_WebFileName))
  421. {
  422. AfxMessageBox("Robot exclusion text file found.nGoing to bail out, before we get caught.");
  423. return;
  424. }
  425. CSpiderApp *pApp = (CSpiderApp*) AfxGetApp();
  426. pApp->ShowURL(dlg.m_WebFileName,str); 
  427. CMDIChildWnd * pChild =
  428.         ((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->MDIGetActive();
  429.  
  430. ::SendMessage(pChild->m_hWnd,WM_USER_LIST, 1, 0);
  431. CSpiderList* pActiveView = NULL;
  432. pActiveView = CSpiderList::GetView();
  433. if(pActiveView)
  434. hwndNotifyView = pActiveView->m_hWnd;
  435. BOOL Result= GetURL(dlg.m_WebFileName,hwndNotifyView,HTTP_CHECK_URL_ROOT,dlg.m_root);
  436.    if(!Result)
  437.    {
  438. str.Format("Error in thread ");
  439. AfxMessageBox(str, MB_OK);
  440. return;
  441.    }
  442. }
  443. lURLCount = 0;
  444. str ="URLs:0";
  445. m_wndStatusBar.SetPaneText (3, (LPCTSTR) str, TRUE);
  446. }
  447. /******************************************
  448. Get a Server Response Header for a given URL
  449. *******************************************/
  450. void CMainFrame::OnToolsGetServerHeader() 
  451. {
  452. CUrlDlg  dlg;
  453. CSpiderApp *pApp = (CSpiderApp*) AfxGetApp();
  454. char* pFileName = "Urls.log";
  455. char lpFileName[MAX_PATH];
  456. strcpy(lpFileName,pApp->m_HomeDir);
  457. strcat(lpFileName,"\");
  458. strcat(lpFileName,pFileName);
  459. dlg.LoadFile(lpFileName);
  460. if(dlg.DoModal() != IDOK) return;
  461. dlg.SaveFile(lpFileName);
  462. CString str ="";
  463. if(!dlg.m_WebFileName.IsEmpty())
  464. {
  465. CSpiderApp *pApp = (CSpiderApp*) AfxGetApp();
  466. pApp->ShowURL(dlg.m_WebFileName,str); 
  467. BOOL Result= GetURL(dlg.m_WebFileName,NULL,HTTP_GET_HEADER,FALSE);
  468.    if(!Result)
  469.    {
  470. str.Format("Error in thread ");
  471. AfxMessageBox(str, MB_OK);
  472. return;
  473.    }
  474. }
  475. }
  476. /******************************************
  477. View the list of URLS that did NOT checked out OK
  478. *******************************************/
  479. void CMainFrame::OnToolsURLsNotFound() 
  480. {
  481. if(g_nEntries == 0)
  482. {
  483. AfxMessageBox("No URL's checked yet!");
  484. return;
  485. }
  486. CString string="";
  487. CSpiderApp *pApp = (CSpiderApp*) AfxGetApp();
  488. pApp->ShowURL("Not_Found",string); 
  489. CSpiderDoc *PDoc = NULL;
  490. PDoc =CSpiderDoc::GetDoc();
  491. for (UINT i = 0; i < g_nEntries; i ++)
  492. {
  493. if(g_entry[i]->m_Status != 200)
  494. {
  495. string.Format("%d...%s...%s",i+1,g_entry[i]->m_URL,g_entry[i]->m_StatusString);
  496. if (PDoc)
  497. PDoc->CheckURLUpdate(string); 
  498. }
  499. }
  500. }
  501. /******************************************
  502. View the list of all URLS that were checked
  503. *******************************************/
  504. void CMainFrame::OnToolsViewURLList() 
  505. {
  506. if(g_nEntries == 0)
  507. {
  508. AfxMessageBox("No URL's checked yet!");
  509. return;
  510. }
  511. CString string="";
  512. CSpiderApp *pApp = (CSpiderApp*) AfxGetApp();
  513. pApp->ShowURL("URL_LIST",string); 
  514. CSpiderDoc *PDoc = NULL;
  515. PDoc =CSpiderDoc::GetDoc();
  516. for (UINT i = 0; i < g_nEntries; i ++)
  517. {
  518. string.Format("%d...%s...%s",i+1,g_entry[i]->m_URL,g_entry[i]->m_StatusString);
  519. if (PDoc)
  520. PDoc->CheckURLUpdate(string); 
  521. }
  522. }
  523. /***********************************
  524. * Let All the threads  stop,  without crashing the program
  525. ************************************/
  526. void CMainFrame::OnToolsThreadsStop() 
  527. {
  528. int nCount = 0;
  529. POSITION pos= NULL;
  530. int nThreadsLeft = m_threadList.GetCount();
  531. for(int i=0; i<nThreadsLeft; i++)
  532. {
  533. if((pos = m_threadList.FindIndex(i))!= NULL )
  534. {
  535. CSpiderThread* pThread = m_threadList.GetAt(pos);
  536. if(pThread->m_hThread != NULL)
  537. {
  538. nCount++;
  539. pThread->KillThread();
  540. }
  541. }
  542. }
  543. CString string;
  544. string.Format ("Threads:%d",nCount);
  545. m_wndStatusBar.SetPaneText (2, (LPCTSTR) string, TRUE);
  546. if(nCount > 0)
  547. {
  548. string.Format ("Number of Threads %d nStill Active ",nCount );
  549. AfxMessageBox(string);
  550. }
  551. }
  552. void CMainFrame::OnUpdateToolsThreadsStop(CCmdUI* pCmdUI) 
  553. {
  554. pCmdUI->Enable(lThreadCount!=0);
  555. }
  556. /***********************************
  557. * Kill off All threads, might lock the program up at times
  558. ************************************/
  559. void CMainFrame::OnToolsKillthread() 
  560. {
  561. int nCount,tCount,i;
  562. int nThreadsLeft;
  563. POSITION pos= NULL;
  564. DWORD dwStatus;
  565. nCount = 0,tCount=0;
  566. nThreadsLeft = m_threadList.GetCount();
  567. for(i=0; i<nThreadsLeft; i++)
  568. {
  569. if((pos = m_threadList.FindIndex(i))!= NULL )
  570. {
  571. CSpiderThread* pThread = m_threadList.GetAt(pos);
  572. if(pThread->m_hThread != NULL)
  573. pThread->KillThread();
  574. }
  575. }
  576. Sleep(200);
  577. nThreadsLeft = m_threadList.GetCount();
  578. for(i=0; i<nThreadsLeft; i++)
  579. {
  580. if((pos = m_threadList.FindIndex(i))!= NULL )
  581. {
  582. CSpiderThread* pThread = m_threadList.GetAt(pos);
  583. if(pThread->m_hThread != NULL)
  584. {
  585. tCount++;
  586. pThread->KillThread();
  587. ::GetExitCodeThread(pThread->m_hThread, &dwStatus);
  588. if (dwStatus == STILL_ACTIVE)
  589. nCount++;
  590. else 
  591. m_threadList.RemoveAt(pos);
  592. }
  593. }
  594. }
  595. CString string;
  596. string.Format ("Threads:%d",nCount);
  597. m_wndStatusBar.SetPaneText (2, (LPCTSTR) string, TRUE);
  598. if(nCount > 0)
  599. {
  600. string.Format ("Number of Threads %d nStill Active %d",tCount,nCount );
  601. AfxMessageBox(string);
  602. }
  603. }
  604. void CMainFrame::OnUpdateToolsKillthread(CCmdUI* pCmdUI) 
  605. {
  606. int nThreadsLeft = m_threadList.GetCount();
  607. pCmdUI->Enable(nThreadsLeft != 0);
  608. }
  609. /***************************
  610. * for robot exclusion
  611. * will return true if the server has a robots.txt file.
  612. **************************/
  613. BOOL CMainFrame::RobotCheck(LPCTSTR pszURL)
  614. {
  615. DWORD dwRet = 0;
  616. BOOL bRet = FALSE;
  617. CString strServerName;
  618. CString strObject;
  619. DWORD   dwServiceType;
  620. INTERNET_PORT  nPort;
  621. CMyInternetSession* pSession = NULL;
  622. CHttpConnection* pServer = NULL;
  623. CHttpFile* pFile = NULL;
  624. try
  625. {
  626. AfxParseURL(pszURL,dwServiceType,strServerName,strObject,nPort);
  627. pSession = new CMyInternetSession("Robot",1);
  628. pSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,30000);
  629. /* The delay value in milliseconds to wait between connection retries.*/
  630. pSession->SetOption(INTERNET_OPTION_CONNECT_BACKOFF,1000);
  631. /* The retry count to use for Internet connection requests. If a connection 
  632. attempt still fails after the specified number of tries, the request is canceled.
  633. The default is five. */
  634. pSession->SetOption(INTERNET_OPTION_CONNECT_RETRIES,2);
  635.     pSession->EnableStatusCallback(TRUE);
  636. pSession->m_pMainWnd =  AfxGetMainWnd()->m_hWnd;
  637. pSession->m_strHttpSite.Format("%s",pszURL);
  638. pServer = pSession->GetHttpConnection(strServerName,nPort);
  639. pFile = pServer->OpenRequest(_T("GET"),"/robots.txt");
  640. pFile->SendRequest();
  641. if(pFile != NULL)
  642. pFile->QueryInfoStatusCode(dwRet);
  643. if(dwRet== 200)
  644. bRet = TRUE;
  645. if(pFile != NULL)
  646. { pFile->Close();
  647. delete pFile;
  648. pFile= NULL;
  649. }
  650. if (pServer!= NULL)
  651. {
  652. pServer->Close();
  653. delete pServer;
  654. pServer = NULL;
  655. }
  656. if (pSession != NULL)
  657. {
  658. pSession->Close();
  659. delete pSession;
  660. pSession = NULL;
  661. }
  662. }
  663. catch (CInternetException* pEx)
  664. {
  665. // catch errors from WinINet
  666. //pEx->ReportError();
  667. pEx->Delete();
  668. bRet = FALSE;
  669. }
  670. return bRet;
  671. }