CategoryBarWnd.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:24k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // CategoryBarWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "testbt.h"
  5. #include "CategoryBarWnd.h"
  6. #include "CategoryNewDlg.h"
  7. #include "CategoryPropertyDlg.h"
  8. #include "BTFormat.h"
  9. #include "DlgNewDownload.h"
  10. #include "FileTorrent.h"
  11. #include "FileBase.h"
  12. #include "FilesListCtrl.h"
  13. #include "bdecode.h"
  14. #include "download.h"
  15. #include "DlgFindConditions.h"
  16. #include "SINSTANCE.H"
  17. #include "mainfrm.h"
  18. #ifdef _DEBUG
  19. #define new DEBUG_NEW
  20. #undef THIS_FILE
  21. static char THIS_FILE[] = __FILE__;
  22. #endif
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CCategoryBarWnd
  25. CCategoryBarWnd::CCategoryBarWnd()
  26. {
  27. m_nIDClipFormat = RegisterClipboardFormat(_T("DaoView"));
  28. }
  29. CCategoryBarWnd::~CCategoryBarWnd()
  30. {
  31. }
  32. BEGIN_MESSAGE_MAP(CCategoryBarWnd, CCategoryDownload)
  33. //{{AFX_MSG_MAP(CCategoryBarWnd)
  34. ON_WM_CREATE()
  35. ON_WM_DESTROY()
  36. ON_WM_LBUTTONDOWN()
  37. //}}AFX_MSG_MAP
  38. ON_NOTIFY_REFLECT(NM_RCLICK,OnRightClick)
  39. ON_NOTIFY_REFLECT(TVN_SELCHANGED,OnNodeSelect)
  40. ON_COMMAND_RANGE(ID_MENUITEM_OPEN_CATEGORY, ID_MENUITEM_MOVETO_CATEGORY, OnPopupCommand)
  41. END_MESSAGE_MAP()
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CCategoryBarWnd message handlers
  44. void CCategoryBarWnd::OnFileListViewInitialUpdate() 
  45. {
  46. if (!GetSafeHwnd() || !m_curDownloading)
  47. {
  48. ASSERT(FALSE);
  49. return;
  50. }
  51. m_curDownloading.Select();
  52. }
  53. int CCategoryBarWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  54. {
  55. if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
  56. return -1;
  57. //
  58. // Create BitmapList
  59. //
  60. HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
  61. MAKEINTRESOURCE(IDB_IMAGELIST_CATEGORY),
  62. IMAGE_BITMAP,
  63. 0,0, // cx,cy
  64. LR_CREATEDIBSECTION); // | LR_LOADMAP3DCOLORS );
  65. CBitmap bm;
  66. bm.Attach(hbm);
  67. m_ctlImage.Create(16,15, ILC_COLOR8|ILC_MASK, 4, 4);
  68. m_ctlImage.SetBkColor(::GetSysColor(COLOR_WINDOW)); 
  69. m_ctlImage.Add(&bm, (COLORREF)RGB(255,0,255));
  70. SetImageList(&m_ctlImage);
  71. //
  72. // Create the treeCategory.
  73. //
  74. LoadDBFile();
  75. m_bNoNotifications = true;
  76. GetRootItem().Select();
  77. m_bNoNotifications = false;
  78. //
  79. // Create engine.
  80. //
  81. assert(m_pSetupRegister);
  82. m_DownloadEngine.Create(m_pSetupRegister, this);
  83. //
  84. // Create finder and Registe dragdrop.
  85. //
  86. m_FindFileByConditions.Create(this);
  87. BOOL bRet = m_dropTarget.Register(this);
  88. //
  89. // continue the unclosed.
  90. //
  91. if (m_pSetupRegister->m_bContinueUnCloseDownload)
  92. ContinueTheUncloseds();
  93. return 0;
  94. }
  95. void CCategoryBarWnd::OnDestroy() 
  96. {
  97. m_bNoNotifications = true;
  98. // Quit the instance and release hot key.
  99. AppReleaseInstance();
  100. UnregisterHotKey(AfxGetMainWnd()->GetSafeHwnd(), HOTKEY_ID);
  101. // call base function.
  102. CCategoryDownload::OnDestroy();
  103. }
  104. void CCategoryBarWnd::OnNodeSelect(NMHDR *pNotifyStruct,LRESULT *result)
  105. {
  106. if (result) *result = 0;
  107. if (m_bNoNotifications)
  108. return;
  109. assert(m_pFilesListCtrl);
  110. m_ItemSel = GetSelectedItem();
  111. m_pFilesListCtrl->LoadCatetory(m_ItemSel);
  112. m_FindFileByConditions.SetNewStartLocation(m_ItemSel, 0);
  113. }
  114. void CCategoryBarWnd::OnLButtonDown(UINT nFlags, CPoint point) 
  115. {
  116. /*
  117. UINT nFlags1;
  118. CPoint curPoint;
  119. GetCursorPos(&curPoint);
  120. ScreenToClient(&curPoint);
  121. CTreeCursor ItemSel = HitTest(curPoint, &nFlags1);
  122. if (ItemSel)
  123. ItemSel.Select();
  124. //*/
  125. CCategoryDownload::OnLButtonDown(nFlags, point);
  126. }
  127. void CCategoryBarWnd::OnRightClick(NMHDR *pNotifyStruct,LRESULT *result)
  128. {
  129. UINT nFlags;
  130. CPoint curPoint;
  131. GetCursorPos(&curPoint);
  132. ScreenToClient(&curPoint);
  133. m_ItemSel = HitTest(curPoint, &nFlags);
  134. UINT nImageID = m_ItemSel.GetImageID();
  135. switch (nImageID)
  136. {
  137. case IID_ROOT:
  138. case IID_RECYCLE:
  139. case IID_DOWNLOADING_DIRECTORY:
  140. case IID_DOWNLOADED_DIRECTORY:
  141. case IID_DIRECTORY:
  142. DoPopupMenu(IDR_MENU_CATEGORY);
  143. break;
  144. }
  145. *result = 0;
  146. }
  147. /******************************************************************
  148. context menu command and ui.
  149. ******************************************************************/
  150. void CCategoryBarWnd::DoPopupMenu(UINT nMenuID)
  151. {
  152. CMenu popMenu;
  153. popMenu.LoadMenu(nMenuID);
  154. //
  155. // command ui. 
  156. //
  157. bool bOpenSubCategory = true;
  158. bool bNewSubCategory = true;
  159. bool bMoveTo = true;
  160. bool bDeleted = true;
  161. if (m_ItemSel == m_curRoot || m_ItemSel == m_curDownloading || 
  162. m_ItemSel == m_curDownloaded || m_ItemSel == m_curRecycle)
  163. {
  164. bDeleted = false;
  165. bMoveTo = false;
  166. }
  167. if (m_ItemSel == m_curDownloading || m_ItemSel == m_curRecycle)
  168. bOpenSubCategory = false;
  169. // downloading can't create sub category.
  170. if (m_ItemSel == m_curDownloading)
  171. bNewSubCategory = false;
  172. popMenu.EnableMenuItem(ID_MENUITEM_OPEN_CATEGORY, MF_BYCOMMAND | 
  173. (bOpenSubCategory ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  174. popMenu.EnableMenuItem(ID_MENUITEM_PORPERTY_CATEGORY, MF_BYCOMMAND | 
  175. (bOpenSubCategory ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  176. popMenu.EnableMenuItem(ID_MENUITEM_DEL_CATEGORY, MF_BYCOMMAND | 
  177. (bDeleted ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  178. popMenu.EnableMenuItem(ID_MENUITEM_MOVETO_CATEGORY, MF_BYCOMMAND | 
  179. (bDeleted ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  180. popMenu.EnableMenuItem(ID_MENUITEM_NEW_CATEGORY, MF_BYCOMMAND | 
  181. (bNewSubCategory? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  182. CPoint posMouse;
  183. GetCursorPos(&posMouse);
  184. popMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, posMouse.x,posMouse.y,this);
  185. }
  186. void CCategoryBarWnd::OnUpdateMenuitem(CCmdUI* pCmdUI) 
  187. {
  188. if (!GetSafeHwnd()) return;
  189. //
  190. // command ui. 
  191. //
  192. bool bNewSubCategory = true;
  193. bool bMoveTo = true;
  194. bool bDeleted = true;
  195. if (GetSelectedItem()== m_curRoot || GetSelectedItem() == m_curDownloading || 
  196. GetSelectedItem() == m_curDownloaded || GetSelectedItem() == m_curRecycle)
  197. {
  198. bDeleted = false;
  199. bMoveTo = false;
  200. }
  201. // downloading can't create sub category.
  202. if (GetSelectedItem() == m_curDownloading)
  203. bNewSubCategory = false;
  204. if (!GetSelectedItem())
  205. {
  206. bNewSubCategory = false;
  207. bDeleted = false;
  208. bMoveTo = false;
  209. }
  210. switch (pCmdUI->m_nID)
  211. {
  212. case ID_MENUITEM_FIND_NEXT:
  213.  pCmdUI->Enable(m_FindFileByConditions.CanFindNext());
  214. break;
  215. case ID_MENUITEM_OPEN_CATEGORY:
  216. pCmdUI->Enable(bNewSubCategory);
  217. break;
  218. case ID_MENUITEM_MOVETO_CATEGORY:
  219. pCmdUI->Enable(bMoveTo);
  220. break;
  221. case ID_MENUITEM_NEW_CATEGORY:
  222. pCmdUI->Enable(bNewSubCategory);
  223. break;
  224. case ID_MENUITEM_DEL_CATEGORY:
  225. pCmdUI->Enable(bDeleted);
  226. break;
  227. case ID_MENUITEM_PORPERTY_CATEGORY:
  228. pCmdUI->Enable(bDeleted);
  229. break;
  230. }
  231. }
  232. void CCategoryBarWnd::OnCommandMenuitem(UINT iID) 
  233. {
  234. m_ItemSel = GetSelectedItem();
  235. assert(m_ItemSel);
  236. OnPopupCommand(iID);
  237. }
  238. void CCategoryBarWnd::OnPopupCommand(UINT nMenuID)
  239. {
  240. assert(m_ItemSel);
  241. switch (nMenuID)
  242. {
  243. case ID_MENUITEM_OPEN_CATEGORY:
  244. {
  245. // m_pFilesListCtrl->LoadCatetory(m_ItemSel);
  246. CCategoryDBItem* pItem = (CCategoryDBItem*)m_ItemSel.GetData();
  247. assert(pItem);
  248. HINSTANCE iRet = ShellExecute(NULL, "open" , pItem->m_strDefaultDirectory.data(), 0, 0, SW_SHOW);
  249. if ((UINT)iRet <= HINSTANCE_ERROR)
  250. AfxMessageBox(WSAShowError().data());
  251. }
  252. break;
  253. case ID_MENUITEM_NEW_CATEGORY:
  254. {
  255. assert(m_ItemSel != m_curDownloading);
  256. CCategoryNewDlg dlg(&m_ctlImage, this, true, m_ItemSel);
  257. /*
  258. dlg.m_pctlImage = &m_ctlImage;
  259. dlg.m_ItemSel = m_ItemSel;
  260. dlg.m_pCategoryBarWnd = this;
  261. //*/
  262. if (dlg.DoModal() == IDOK)
  263. {
  264. CTreeCursor curItem(dlg.m_ItemSel, this);
  265. CTreeCursor curNew = curItem.AddTail(dlg.m_strCategoryName, IID_DIRECTORY);
  266. curNew.SetData((long) new CCategoryDBItem(dlg.m_strCategoryDir.GetBuffer(0), m_lDirectoryIDMax++));
  267. curItem.Expand();
  268. }
  269. break;
  270. }
  271. case ID_MENUITEM_PORPERTY_CATEGORY:
  272. {
  273. bool bChangeName = true;
  274. if (m_ItemSel == m_curRoot || m_ItemSel == m_curDownloading || 
  275. m_ItemSel == m_curDownloaded || m_ItemSel == m_curRecycle)
  276. {
  277. bChangeName = false;
  278. }
  279. long lCategories = 0, lTotalFiles = 0;
  280. GetChildCount(m_ItemSel, lCategories, lTotalFiles);
  281. CCategoryPropertyDlg dlg;
  282. dlg.m_bChangeName = bChangeName;
  283. dlg.m_lSubCategory = lCategories;
  284. dlg.m_lTotalFiles = lTotalFiles;
  285. dlg.m_strCategoryName = m_ItemSel.GetText();
  286. CCategoryDBItem* pItem = (CCategoryDBItem*)m_ItemSel.GetData();
  287. dlg.m_strCategoryDir = pItem->m_strDefaultDirectory.data();
  288. if (dlg.DoModal() == IDOK)
  289. {
  290. if (bChangeName)
  291. m_ItemSel.SetText(dlg.m_strCategoryName);
  292. pItem->m_strDefaultDirectory = dlg.m_strCategoryDir;
  293. }
  294. }
  295. break;
  296. case ID_MENUITEM_DEL_CATEGORY:
  297. {
  298. int iRet = AfxMessageBox("删除该类别以及包括的子类别和文件?", MB_OKCANCEL|MB_ICONQUESTION);
  299. if (iRet == IDOK)
  300. {
  301. DeleteAllData(m_ItemSel);
  302. m_ItemSel.Delete();
  303. }
  304. }
  305. break;
  306. case ID_MENUITEM_MOVETO_CATEGORY:
  307. {
  308. CCategoryNewDlg dlg(&m_ctlImage, this, false, m_ItemSel);
  309. /*
  310. dlg.m_pctlImage = &m_ctlImage;
  311. dlg.m_ItemSel = m_ItemSel;
  312. dlg.m_bNewOrMoveto = false;
  313. dlg.m_pCategoryBarWnd = this;
  314. //*/
  315. if (dlg.DoModal() == IDOK)
  316. {
  317. CTreeCursor curMovetoItem(dlg.m_ItemSel, this);
  318. if (!MoveTreeEx(m_ItemSel, curMovetoItem))
  319. AfxMessageBox("Can't move Category");
  320. }
  321. }
  322. break;
  323. }
  324. SetFocus();
  325. }
  326. /**************************************************************
  327.   catogory manipulate helper function.
  328. **************************************************************/
  329. bool CCategoryBarWnd::CreateNewCategory(CTreeCursor curSel, CTreeCursor& curNew)
  330. {
  331. CCategoryNewDlg dlg(&m_ctlImage, this, true, curSel);
  332. if (dlg.DoModal() == IDOK)
  333. {
  334. CTreeCursor curItem(dlg.m_ItemSel, this);
  335. curNew = curItem.AddTail(dlg.m_strCategoryName, CCategoryBarWnd::IID_DIRECTORY);
  336. curNew.SetData((long) new CCategoryDBItem(dlg.m_strCategoryDir.GetBuffer(0), m_lDirectoryIDMax++));
  337. return true;
  338. }
  339. return false;
  340. }
  341. CTreeCursor CCategoryBarWnd::MoveTree(CTreeCursor curSrc, CTreeCursor curTarget)
  342. {
  343. CTreeCursor curTemp = curTarget.AddTail(curSrc.GetText(), curSrc.GetImageID());
  344. curTemp.SetData(curSrc.GetData());
  345. if (curSrc.HasChildren())
  346. {
  347. CTreeCursor curChild = curSrc.GetChild();
  348. while (curChild)
  349. {
  350. MoveTree(curChild, curTemp);
  351. curChild = curChild.GetNext(TVGN_NEXT);
  352. }
  353. }
  354. return curTemp;
  355. }
  356. bool CCategoryBarWnd::MoveTreeEx(CTreeCursor curSrc, CTreeCursor curTarget)
  357. {
  358. if (IsChild(curTarget, curSrc))
  359. return false;
  360. MoveTree(curSrc, curTarget).Select();
  361. curSrc.Delete();
  362. return true;
  363. }
  364. bool CCategoryBarWnd::GetChildCount(CTreeCursor& curSrc, long& lCategoryCount, long& lFilesCount)
  365. {
  366. if (curSrc == m_curDownloading)
  367. return false;
  368. lCategoryCount ++;
  369. CCategoryDBItem* pItem = (CCategoryDBItem*)curSrc.GetData();
  370. lFilesCount += pItem->m_vFileDBItems.size();
  371. if (curSrc.HasChildren())
  372. {
  373. CTreeCursor curChild = curSrc.GetChild();
  374. while (curChild)
  375. {
  376. GetChildCount(curChild, lCategoryCount, lFilesCount);
  377. curChild = curChild.GetNext(TVGN_NEXT);
  378. }
  379. }
  380. return true;
  381. }
  382. bool CCategoryBarWnd::IsChild(CTreeCursor curSrc, CTreeCursor curTarget)
  383. {
  384. if (curTarget == curSrc)
  385. return true;
  386. if (curTarget.HasChildren())
  387. {
  388. CTreeCursor curChild = curTarget.GetChild();
  389. while (curChild)
  390. {
  391. if (IsChild(curSrc, curChild))
  392. return true;
  393. curChild = curChild.GetNext(TVGN_NEXT);
  394. }
  395. }
  396. return false;
  397. }
  398. /************************************************************************
  399.   filedbitem drag and drop.
  400. ************************************************************************/
  401. DROPEFFECT CCategoryBarWnd::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
  402. {
  403. if (pDataObject->IsDataAvailable(m_nIDClipFormat))
  404. return DROPEFFECT_MOVE;
  405. return DROPEFFECT_NONE;
  406. }
  407. DROPEFFECT CCategoryBarWnd::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
  408. {
  409. if (!pDataObject->IsDataAvailable(m_nIDClipFormat))
  410. return DROPEFFECT_NONE;
  411. UINT nFlags;
  412. CPoint curPoint;
  413. GetCursorPos(&curPoint);
  414. ScreenToClient(&curPoint);
  415. CTreeCursor curHit = HitTest(curPoint, &nFlags);
  416. if (!(HTREEITEM)curHit || curHit == m_curDownloading)
  417. return DROPEFFECT_NONE;
  418. return DROPEFFECT_MOVE;
  419. }
  420. BOOL CCategoryBarWnd::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
  421. {
  422. if (!pDataObject->IsDataAvailable(m_nIDClipFormat))
  423. return FALSE;
  424. UINT nFlags;
  425. CPoint curPoint;
  426. GetCursorPos(&curPoint);
  427. ScreenToClient(&curPoint);
  428. CTreeCursor curHit = HitTest(curPoint, &nFlags);
  429. if (!(HTREEITEM)curHit || curHit == m_curDownloading)
  430. return FALSE;
  431. if (m_pFilesListCtrl->m_curCursor == curHit)
  432. return FALSE;
  433. return FileDBItemMovetoArray(m_pFilesListCtrl->m_curCursor, curHit, m_pFilesListCtrl->m_vDragFileDBItems);
  434. /*
  435. //
  436. // if target category is recycle, don't move file. else prompt user.
  437. //
  438. bool bMoveFile = false;
  439. if (curHit == m_curRecycle)
  440. {
  441. vector<CFileDBItem*> vToStopFileDBItems;
  442. for (int i=0; i< m_pFilesListCtrl->m_vDragFileDBItems.size(); i++)
  443. {
  444. CFileDBItem* pFileDBItem = m_pFilesListCtrl->m_vDragFileDBItems[i];
  445. if (pFileDBItem->m_pDownload)
  446. vToStopFileDBItems.push_back(pFileDBItem);
  447. }
  448. if (!vToStopFileDBItems.empty())
  449. {
  450. if (AfxMessageBox("有下载正在进行中, 您是否确定删除?", MB_YESNO) != IDYES)
  451. return FALSE;
  452. }
  453. // if is downloading, popup it from starting engine deque.
  454. StopDBFiles(vToStopFileDBItems);
  455. }
  456. else
  457. {
  458. if (AfxMessageBox("是否移动已下载文件?", MB_YESNO|MB_ICONQUESTION) == IDYES)
  459. bMoveFile = true;
  460. }
  461. bool bMoveCategory = true;
  462. if (m_pFilesListCtrl->m_curCursor == m_curDownloading && curHit != m_curRecycle)
  463. bMoveCategory = false;
  464. assert(m_pFilesListCtrl->m_curCursor);
  465. for (int i=0; i< m_pFilesListCtrl->m_vDragFileDBItems.size(); i++)
  466. {
  467. CFileDBItem* pFileDBItem = m_pFilesListCtrl->m_vDragFileDBItems[i];
  468. FileDBItemMoveto(m_pFilesListCtrl->m_curCursor, curHit, pFileDBItem, bMoveFile, bMoveCategory);
  469. }
  470. return bMoveCategory;
  471. //*/
  472. }
  473. /************************************************************************
  474. OpenTorrentFile()
  475. paramerter :
  476. bOverwrite - if called by makemetafile() then don't alert user, if exist
  477.  only overwrite silently.
  478. ************************************************************************/
  479. void CCategoryBarWnd::OpenTorrentFile(string strTorrentFileName, HTREEITEM hItemSel, string strDirectorySave, bool bOverwrite)
  480. {
  481. assert(!strTorrentFileName.empty());
  482. try
  483. {
  484. string strComment;
  485. int iStartMode = 0; // start immediately.
  486. vector<CSize> vNoNeededFileInxs;
  487. CFileTorrent filetorrent;
  488. if (!filetorrent.OpenFile(strTorrentFileName))
  489. {
  490. CString strBadMsg = filetorrent.GetBadMsg().data();
  491. if (!strBadMsg.IsEmpty())
  492. AfxMessageBox(strBadMsg);
  493. return;
  494. }
  495. filetorrent.QueryDir();
  496. CFileDBItem* pExistFileDBItem = 0;
  497. CTreeCursor curExistFileCategory = findFileExist(GetRootItem(), filetorrent.GetInfohashString(), pExistFileDBItem);
  498. if (curExistFileCategory)
  499. {
  500. assert(pExistFileDBItem);
  501. m_bNoNotifications = true;
  502. curExistFileCategory.Select();
  503. curExistFileCategory.EnsureVisible();
  504. m_pFilesListCtrl->LoadCatetory(curExistFileCategory, pExistFileDBItem);
  505. m_bNoNotifications = false;
  506. bool bContinue = false;
  507. if (bOverwrite)
  508. {
  509. if (AfxMessageBox("该下载已存在,是否覆盖", MB_YESNO) == IDYES)
  510. bContinue = true;
  511. }
  512. else
  513. AfxMessageBox("该下载已存在");
  514. if (!bContinue)
  515. return;
  516. }
  517. if (hItemSel)
  518. {
  519. DWORD dwAttr = GetFileAttributes(strDirectorySave.data());
  520. if (dwAttr ==  0xffffffff)
  521. {
  522. assert(false);
  523. return;
  524. }
  525. }
  526. else
  527. {
  528. CDlgNewDownload dlg(&m_ctlImage, &filetorrent, this, true);
  529. if (dlg.DoModal() != IDOK)
  530. return;
  531. hItemSel = dlg.m_ItemSel;
  532. strDirectorySave = dlg.m_strDirectorySave;
  533. iStartMode = dlg.m_iStartMode;
  534. vNoNeededFileInxs = dlg.m_treeSubFiles.m_vChecks;
  535. strComment = dlg.m_strComment.GetBuffer(0);
  536. }
  537. string strTorrentFileNameNoPath = filetorrent.GetInfohashString();
  538. if (!CopyFileTorrent(strTorrentFileName, strTorrentFileNameNoPath))
  539. {
  540. AfxMessageBox("import torrent to db path error");
  541. return;
  542. }
  543. // if param Overwrite is set, only overwrite torrent file then return so don't add new filedbitem.
  544. if (curExistFileCategory && bOverwrite)
  545. {
  546. if (!pExistFileDBItem)
  547. {
  548. assert(false);
  549. return;
  550. }
  551. pExistFileDBItem->m_fComplete = 1;
  552. pExistFileDBItem->m_strTorrentFileName = strTorrentFileNameNoPath;
  553. pExistFileDBItem->m_strFileName = strDirectorySave;
  554. m_pFilesListCtrl->LoadCatetory(curExistFileCategory, pExistFileDBItem);
  555. return;
  556. }
  557. //
  558. // Create new filedbitem
  559. //
  560. time_t tnow;
  561. time(&tnow);
  562. float fComplete = bOverwrite ? 1 : 0;
  563. CTreeCursor curItem(hItemSel, this);
  564. CCategoryDBItem* pItem = (CCategoryDBItem*)curItem.GetData();
  565. assert(pItem);
  566. CFileDBItem* pNewFileDBItem = new CFileDBItem(
  567. strTorrentFileNameNoPath,
  568. strDirectorySave,
  569. filetorrent.GetFileLength(), fComplete, tnow, 
  570. filetorrent.GetInfohashString(), pItem->m_lDirectoryID, tnow, 
  571. filetorrent.GetPieces().size(), strComment);
  572. pNewFileDBItem->m_vUnneededFileInx = vNoNeededFileInxs;
  573. int iii = pNewFileDBItem->m_vUnneededFileInx.size();
  574. //
  575. // Append the new create filedbitem in downloading category.
  576. //
  577. if (curItem != m_curDownloading)
  578. {
  579. CCategoryDBItem* pDownloadingItem = (CCategoryDBItem*)m_curDownloading.GetData();
  580. pDownloadingItem->m_vFileDBItems.push_back(pNewFileDBItem);
  581. }
  582. // pItem->m_vFileDBItems.push_back(pNewFileDBItem);
  583. //
  584. // if download immediately, start it.
  585. //
  586. if (iStartMode == 0) // start immediately.
  587. Download(m_curDownloading, pNewFileDBItem);
  588. //
  589. // show downloading category.
  590. //
  591. m_bNoNotifications = true;
  592. m_curDownloading.Select();
  593. m_curDownloading.EnsureVisible();
  594. m_pFilesListCtrl->LoadCatetory(m_curDownloading, pNewFileDBItem);
  595. m_bNoNotifications = false;
  596. }
  597. catch (string& e)
  598. {
  599. AfxMessageBox(e.data());
  600. return;
  601. }
  602. }
  603. bool CCategoryBarWnd::CopyFileTorrent(string strTorrentFileName, string& strTorrentFileNameNoPath)
  604. {
  605. // copy file to db directory.
  606. assert(strTorrentFileNameNoPath.size() == 40);
  607. char drive[_MAX_DRIVE];
  608. char dir[_MAX_DIR];
  609. char fname[_MAX_FNAME];
  610. char ext[_MAX_EXT];
  611. _splitpath(strTorrentFileName.data(), drive, dir, fname, ext);
  612. // strTorrentFileNameNoPath = string(fname) + ext;
  613. string strName = fname;
  614. strName = strName.substr(0, MAX_PATH - 100);
  615. strTorrentFileNameNoPath = strName + "(" + strTorrentFileNameNoPath + ").torrent";
  616. if (_access(GetDBSavePath().data(), 0))
  617. {
  618. if (!MakeDirecotry(GetDBSavePath().data()))
  619. {
  620. AfxMessageBox(("create db direcotry (" + GetDBSavePath()+ ")failed").data());
  621. return false;
  622. }
  623. }
  624. string strTargetFileName = formatDir(GetDBSavePath().data()) + strTorrentFileNameNoPath;
  625. if (!CopyFile(strTorrentFileName.data(), strTargetFileName.data(), false))
  626. {
  627. if (_access(strTargetFileName.data(), 0))
  628. {
  629. DWORD dwerr = GetLastError();
  630. return false;
  631. }
  632. }
  633. return true;
  634. }
  635. /************************************************************************
  636.   find files.
  637. ************************************************************************/
  638. void CCategoryBarWnd::OnFindFile() 
  639. {
  640. CDlgFindConditions dlg;
  641. if (dlg.DoModal() == IDOK)
  642. {
  643. if (dlg.m_strFindCondition.IsEmpty())
  644. return ;
  645. findFileByConditions(true, dlg.m_strFindCondition.GetBuffer(0));
  646. }
  647. return ;
  648. }
  649. void CCategoryBarWnd::OnFindNext() 
  650. {
  651. findFileByConditions(false);
  652. }
  653. CTreeCursor CCategoryBarWnd::findFileExist(CTreeCursor& curItem, string strInfohash, CFileDBItem*& pExistFileDBItem)
  654. {
  655. CCategoryDBItem* pItem = (CCategoryDBItem*)curItem.GetData();
  656. assert(pItem && curItem);
  657. for (int i=0; i<pItem->m_vFileDBItems.size(); i++)
  658. {
  659. if (strInfohash == pItem->m_vFileDBItems[i]->m_strHash)
  660. {
  661. // if (IsLinkFileDBItem(curItem, pItem->m_vFileDBItems[i]))
  662. // continue;
  663. pExistFileDBItem = pItem->m_vFileDBItems[i];
  664. return curItem;
  665. }
  666. }
  667. if (curItem.HasChildren())
  668. {
  669. CTreeCursor curChild = curItem.GetChild();
  670. while (curChild)
  671. {
  672. CTreeCursor curRet = findFileExist(curChild, strInfohash, pExistFileDBItem);
  673. if (curRet)
  674. return curRet;
  675. curChild = curChild.GetNext(TVGN_NEXT);
  676. }
  677. }
  678. return CTreeCursor();
  679. }
  680. void CCategoryBarWnd::findFileByConditions(bool bRefind, string strFindContion)
  681. {
  682. int iRet = m_FindFileByConditions.findFileByConditions(bRefind, strFindContion);
  683. if (!iRet)
  684. {
  685. AfxMessageBox("can't find files");
  686. m_pFilesListCtrl->SetFocus();
  687. return;
  688. }
  689. if (!m_FindFileByConditions.m_curLast)
  690. {
  691. assert(false);
  692. return;
  693. }
  694. m_bNoNotifications = true;
  695. m_FindFileByConditions.m_curLast.Select();
  696. m_FindFileByConditions.m_curLast.EnsureVisible();
  697. m_pFilesListCtrl->LoadCatetory(m_FindFileByConditions.m_curLast, m_FindFileByConditions.m_pFileItem);
  698. m_bNoNotifications = false;
  699. if (iRet == 2)
  700. {
  701. AfxMessageBox("can't find files");
  702. m_pFilesListCtrl->SetFocus();
  703. }
  704. }
  705. ///////////////////////////////////////////////////////////////////
  706. //  CFindFileByConditions
  707. CCategoryBarWnd::CFindFileByConditions::CFindFileByConditions()
  708. {
  709. m_pCategoryBarWnd = 0;
  710. m_bStart = false;
  711. m_pFileItem = 0;
  712. }
  713. void CCategoryBarWnd::CFindFileByConditions::Create(CCategoryBarWnd* pCategoryBarWnd)
  714. {
  715. m_pCategoryBarWnd = pCategoryBarWnd;
  716. }
  717. void CCategoryBarWnd::CFindFileByConditions::SetNewStartLocation(CTreeCursor curLocate, CFileDBItem* pFileDBItem)
  718. {
  719. m_curLast = curLocate;
  720. m_pFileItem = pFileDBItem;
  721. }
  722. bool CCategoryBarWnd::CFindFileByConditions::CanFindNext()
  723. {
  724. return !m_strCondition.empty();
  725. }
  726. int CCategoryBarWnd::CFindFileByConditions::findFileByConditions(bool bRefind, string strCondition )
  727. {
  728. if (bRefind)
  729. {
  730. // m_curLast = CTreeCursor();
  731. // m_pFileItem = 0;
  732. CString strUpper = strCondition.data();
  733. strUpper.MakeUpper();
  734. m_strCondition = strUpper;
  735. }
  736. if (m_strCondition.empty())
  737. return false;
  738. m_bStart = bRefind = !m_pFileItem && !m_curLast;
  739. if (!findFileByConditionsrec(m_pCategoryBarWnd->GetRootItem(), m_strCondition))
  740. {
  741. if (bRefind)
  742. return false;
  743. CFileDBItem* pOldItem = m_pFileItem;
  744. CTreeCursor curOld = m_curLast;
  745. if (findFileByConditionsrec(m_pCategoryBarWnd->GetRootItem(), m_strCondition))
  746. {
  747. if (pOldItem == m_pFileItem && curOld == m_curLast)
  748. return 2;
  749. }
  750. else
  751. {
  752. m_curLast = CTreeCursor();
  753. m_pFileItem = 0;
  754. return false;
  755. }
  756. }
  757. return true;
  758. }
  759. CTreeCursor CCategoryBarWnd::CFindFileByConditions::findFileByConditionsrec(CTreeCursor& curItem, string strCondition)
  760. {
  761. CCategoryDBItem* pItem = (CCategoryDBItem*)curItem.GetData();
  762. assert(pItem && curItem);
  763. bool bCategory = m_bStart;
  764. if (!m_bStart)
  765. {
  766. assert(m_curLast);
  767. if (curItem == m_curLast )
  768. {
  769. bCategory = true;
  770. if (!m_pFileItem)
  771. m_bStart = true;
  772. }
  773. }
  774. if (bCategory)
  775. {
  776. for (int i=0; i<pItem->m_vFileDBItems.size(); i++)
  777. {
  778. if (!m_bStart)
  779. {
  780. assert(m_curLast);
  781. assert(curItem == m_curLast);
  782. assert(m_pFileItem);
  783. if (m_pFileItem == pItem->m_vFileDBItems[i])
  784. m_bStart = true;
  785. continue;
  786. }
  787. CFileDBItem* pFileDBItem = pItem->m_vFileDBItems[i];
  788. CString strFileNameUpper = pFileDBItem->m_strFileName.data();
  789. CString strTorrentFileNameUpper = pFileDBItem->m_strTorrentFileName.data();
  790. CString strHashUpper = pFileDBItem->m_strHash.data();
  791. strFileNameUpper.MakeUpper();
  792. strTorrentFileNameUpper.MakeUpper();
  793. strHashUpper.MakeUpper();
  794. if (strFileNameUpper.Find(strCondition.data()) != -1 ||
  795. strTorrentFileNameUpper.Find(strCondition.data()) != -1 ||
  796. strHashUpper.Find(strCondition.data()) != -1 )
  797. {
  798. m_curLast = curItem;
  799. m_pFileItem = pItem->m_vFileDBItems[i];
  800. return curItem;
  801. }
  802. }
  803. }
  804. if (curItem.HasChildren())
  805. {
  806. CTreeCursor curChild = curItem.GetChild();
  807. while (curChild)
  808. {
  809. CTreeCursor curRet = findFileByConditionsrec(curChild, strCondition);
  810. if (curRet)
  811. return curRet;
  812. curChild = curChild.GetNext(TVGN_NEXT);
  813. }
  814. }
  815. return CTreeCursor();
  816. }