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

P2P编程

开发平台:

Visual C++

  1. // testBTDoc.cpp : implementation of the CTestBTDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "testBT.h"
  5. #include "testBTDoc.h"
  6. #include "TestBTView.h"
  7. #include "MainFrm.h"
  8. #include "MakeMetaFile.h"
  9. #include "DlgMakeMetafile.h"
  10. #include "Storage.h"
  11. #include "StorageWrapper.h"
  12.  
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CTestBTDoc
  20. IMPLEMENT_DYNCREATE(CTestBTDoc, CDocument)
  21. BEGIN_MESSAGE_MAP(CTestBTDoc, CDocument)
  22. //{{AFX_MSG_MAP(CTestBTDoc)
  23. ON_COMMAND(ID_MENUITEM_MAKE_METAFILE, OnMenuitemMakeMetafile)
  24. //}}AFX_MSG_MAP
  25. ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  26. ON_COMMAND(ID_MENUITEM_FIND_FILE, OnMenuitemFindFile)
  27. ON_COMMAND(ID_MENUITEM_FIND_NEXT, OnMenuitemFindNext)
  28. ON_COMMAND(ID_MENUITEM_SELECT_ALL, OnMenuitemSelectAll)
  29. ON_COMMAND(ID_FILE_NEW_DATABASE, OnFileNewDatabase)
  30. ON_COMMAND(ID_FILE_SAVE_AS_DATABASE, OnFileSaveAsDatabase)
  31. ON_COMMAND(ID_MENUITEM_OPEN_DATABASE, OnMenuitemOpenDatabase)
  32. ON_COMMAND(ID_FILE_SAVE_DATABASE, OnFileSaveDatabase)
  33. ON_UPDATE_COMMAND_UI_RANGE(ID_MENUITEM_STOP, ID_MENUITEM_OPEN_DOWNLOADED_DIRECTORY, OnUpdateMenuitem)
  34. ON_COMMAND_RANGE(ID_MENUITEM_STOP, ID_MENUITEM_OPEN_DOWNLOADED_DIRECTORY, OnCommandMenuitem)
  35. END_MESSAGE_MAP()
  36. //ON_UPDATE_COMMAND_UI(ID_MENUITEM_DOWNLOAD, OnUpdateMenuitem)
  37. // ON_COMMAND(ID_MENUITEM_DOWNLOAD, OnCommandMenuitem)
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CTestBTDoc construction/destruction
  40. /*
  41. class temp
  42. {
  43. public :
  44. temp& operator = (const temp& other)
  45. {
  46. memcpy(szBuf, other.szBuf, 20);
  47. return *this;
  48. }
  49. bool operator == (const temp& other)  const
  50. {
  51. return memcmp(szBuf, other.szBuf, 20) == 0;
  52. return true;
  53. }
  54. bool operator < (const temp& other)  const
  55. {
  56. return memcmp(szBuf, other.szBuf, 20) < 0;
  57. }
  58. char szBuf[20];
  59. };
  60. //*/
  61. // #include "Sha.h"
  62. CTestBTDoc::CTestBTDoc()
  63. {
  64. m_iOpendFileCount = 0;
  65. /*
  66. char szText[11] = "abcdefghij";
  67. unsigned char shaPart[20] = {0};
  68. CSHA sha;
  69. sha.start();
  70. sha.update((unsigned char*)szText, 5);
  71. // sha.finish(shaPart);
  72. sha.update((unsigned char*)szText + 5, 5);
  73. sha.finish(shaPart);
  74. TRACE("rn{");
  75. for (int i=0; i<20; i++)
  76. {
  77. TRACE("%d, ", shaPart[i]);
  78. }
  79. TRACE("}rn");
  80. CSHA sha2;
  81. sha2.start();
  82. sha2.update((unsigned char*)szText, 10);
  83. sha2.finish(shaPart);
  84. TRACE("rn{");
  85. for (i=0; i<20; i++)
  86. {
  87. TRACE("%d, ", shaPart[i]);
  88. }
  89. TRACE("}rn");
  90. //*/
  91. /*
  92. temp t;
  93. memset(t.szBuf, 0, 20);
  94. vector<temp> pvPieces;
  95. for (int i=0; i<10; i++)
  96. pvPieces.push_back(t);
  97. assert(find(pvPieces.begin(), pvPieces.end(), t) != pvPieces.end());
  98. map<temp, long> mPieces;
  99. assert(mPieces.find(t) == mPieces.end());
  100. mPieces[t] = 100;
  101. assert(mPieces.begin() != mPieces.end());
  102. long l = mPieces.size();
  103. long zz = mPieces[t];
  104. zz = (*mPieces.begin()).second;
  105. temp tx = (*mPieces.begin()).first;
  106. assert(mPieces.find(t) != mPieces.end());
  107. //*/
  108. // pvPieces.push_back(szBuf);
  109. /*
  110. try
  111. {
  112. CFileTorrent fileTorrernt;
  113. if (!fileTorrernt.OpenFile("F:\Documents and Settings\道理\桌面\IEButton.torrent", "d:\za"))
  114. {
  115. assert(false);
  116. return ;
  117. }
  118. vector<CFileInfo>& vFiles = fileTorrernt.GetFileInfo();
  119. CStorageEx storage;
  120. storage.Create(0, vFiles, 0, 10, true, 0);
  121. CVal* pInfo = fileTorrernt.GetInfo();
  122. vector<char*>& vPieces = fileTorrernt.GetPieces();
  123. CStorageWrapperEx storageWrapper;
  124. storageWrapper.Create(0, 0, 0, &storage, vPieces, true, pow(2, 14), (*pInfo)["piece length"]->lVal);
  125. /*
  126. bool bpre = storage.was_preallocated(10, 1000000);
  127. long lTotal = storage.GetTotalLength();
  128. for (int i=0; i<100; i++)
  129. {
  130. storage.write("asdfdsafda", i*10, 10);
  131. }
  132. storage.SetReadOnly();
  133. storage.write("asdfdsafda", 1023667, 10);
  134. char szText[20] = {0};
  135. storage.read(szText, 1023667, 10);
  136. storage.top_off();
  137. storage.Close();
  138. //*/
  139. /*
  140. }
  141. catch (string e)
  142. {
  143. AfxMessageBox(e.data());
  144. }
  145. //*/
  146. m_bInitiated = false;
  147. }
  148. CTestBTDoc::~CTestBTDoc()
  149. {
  150. }
  151. BOOL CTestBTDoc::OnNewDocument()
  152. {
  153. if (!CDocument::OnNewDocument())
  154. return FALSE;
  155. CWnd* pwnd = AfxGetMainWnd();
  156. POSITION pos = GetFirstViewPosition();
  157. CView* pFirstView = GetNextView( pos );
  158. if (!m_bInitiated)
  159. {
  160. SetTitle(GetCategoryBarWnd().GetDatabaseName().data());
  161. m_bInitiated = true;
  162. }
  163. return TRUE;
  164. }
  165. CFilesListCtrl& CTestBTDoc::GetFileListCtrl() const
  166. {
  167. POSITION Pos = GetFirstViewPosition();
  168. assert(Pos);
  169. CTestBTView* pView = (CTestBTView*)GetNextView(Pos);
  170. return pView->m_FilesList;
  171. }
  172. CCategoryBarWnd& CTestBTDoc::GetCategoryBarWnd() const 
  173. {
  174. assert(((CTestBTApp*)AfxGetApp())->m_pMainFrame);
  175. CFrameWnd* pFrame = ((CTestBTApp*)AfxGetApp())->m_pMainFrame;
  176. return ((CMainFrame*)pFrame)->m_CategoryBar.m_CategoryBarWnd;
  177. return ((CMainFrame*)AfxGetMainWnd())->m_CategoryBar.m_CategoryBarWnd;
  178. }
  179. /////////////////////////////////////////////////////////////////////////////
  180. // CTestBTDoc serialization
  181. void CTestBTDoc::Serialize(CArchive& ar)
  182. {
  183. if (ar.IsStoring())
  184. {
  185. // TODO: add storing code here
  186. }
  187. else
  188. {
  189. // TODO: add loading code here
  190. }
  191. }
  192. /////////////////////////////////////////////////////////////////////////////
  193. // CTestBTDoc diagnostics
  194. #ifdef _DEBUG
  195. void CTestBTDoc::AssertValid() const
  196. {
  197. CDocument::AssertValid();
  198. }
  199. void CTestBTDoc::Dump(CDumpContext& dc) const
  200. {
  201. CDocument::Dump(dc);
  202. }
  203. #endif //_DEBUG
  204. /////////////////////////////////////////////////////////////////////////////
  205. // CTestBTDoc commands
  206. void CTestBTDoc::MakeTorrent(CString strFilePath)
  207. {
  208. CDlgMakeMetafile dlg(this);
  209. dlg.m_strFilePath = strFilePath;
  210. dlg.DoModal();
  211. }
  212. BOOL CTestBTDoc::OnOpenDocument(LPCTSTR lpszPathName) 
  213. {
  214. DWORD dwAttr = GetFileAttributes(lpszPathName);
  215. if (dwAttr ==  0xffffffff)
  216. {
  217. AfxMessageBox(CString ("文件(") + lpszPathName + ") 不存在");
  218. return FALSE;
  219. }
  220. bool bOpenDB = false;
  221. bool bOpenTorrent = false;
  222. if (dwAttr & FILE_ATTRIBUTE_DIRECTORY)
  223. {
  224. bOpenTorrent = false;
  225. bOpenDB = false;
  226. }
  227. else
  228. {
  229. char drive[_MAX_DRIVE];
  230. char dir[_MAX_DIR];
  231. char fname[_MAX_FNAME];
  232. char ext[_MAX_EXT];
  233. _splitpath(lpszPathName, drive, dir, fname, ext);
  234. CString strTorrentExt(".torrent");
  235. CString strDBExt(".bt");
  236. if (strlen(ext))
  237. {
  238. if (!strTorrentExt.CompareNoCase(ext))
  239. {
  240. bOpenTorrent = true;
  241. }
  242. else if (!strDBExt.CompareNoCase(ext))
  243. {
  244. bOpenDB = true;
  245. }
  246. }
  247. }
  248. if (bOpenTorrent)
  249. {
  250. GetCategoryBarWnd().OpenTorrentFile(lpszPathName);
  251. if (((CMainFrame*)AfxGetMainWnd())->m_setupRegister.m_bSaveDBAuto && 
  252. ++m_iOpendFileCount >= ((CMainFrame*)AfxGetMainWnd())->m_setupRegister.m_lSaveDBIntval) 
  253. {
  254. if (!GetCategoryBarWnd().IsModifyed())
  255. {
  256. m_iOpendFileCount = 0;
  257. GetCategoryBarWnd().Save();
  258. }
  259. }
  260. }
  261. else if (bOpenDB)
  262. {
  263. if (!GetCategoryBarWnd().OpenDBFile(lpszPathName))
  264. return false;
  265. SetTitle(GetCategoryBarWnd().GetDatabaseName().data());
  266. return TRUE;
  267. // AfxGetApp()->AddToRecentFileList(lpszPathName);
  268. }
  269. else
  270. {
  271. CDlgMakeMetafile dlg(this);
  272. dlg.m_strFilePath = lpszPathName;
  273. dlg.DoModal();
  274. }
  275. // if (!CDocument::OnOpenDocument(lpszPathName))
  276. // return FALSE;
  277. // return TRUE;
  278. return FALSE;
  279. }
  280. //////////////////////////////////////////////////////////////////////
  281. // find files
  282. void CTestBTDoc::OnMenuitemFindFile() 
  283. {
  284. DbgGuiLeak m_dbgGui;
  285. GetCategoryBarWnd().OnFindFile();
  286. }
  287. void CTestBTDoc::OnMenuitemFindNext() 
  288. {
  289. GetCategoryBarWnd().OnFindNext();
  290. }
  291. void CTestBTDoc::OnMenuitemSelectAll() 
  292. {
  293. GetFileListCtrl().SelectAllItems();
  294. }
  295. ////////////////////////////////////////////////////////////////////////////////
  296. // database.
  297. bool CTestBTDoc::PromptToSaveDatabase(bool bExit)
  298. {
  299. if (GetCategoryBarWnd().IsModifyed())
  300. {
  301. int iRet = AfxMessageBox("是否保存变化到无标题?"/*Save changes to Untitled?"//*/, MB_YESNOCANCEL);
  302. if (iRet == IDCANCEL)
  303. return false;
  304. else if (iRet == IDNO)
  305. {
  306. return true;
  307. }
  308. else if (iRet == IDYES)
  309. {
  310. if (!SaveAsDatabase())
  311. return false;
  312. return true;
  313. }
  314. }
  315. else
  316. {
  317. if (bExit)
  318. GetCategoryBarWnd().StopAllCompleteds();
  319. GetCategoryBarWnd().Save();
  320. }
  321. return true;
  322. }
  323. void CTestBTDoc::OnFileNewDatabase() 
  324. {
  325. if (GetCategoryBarWnd().IsDownloading())
  326. {
  327. if (AfxMessageBox("有任务正在进行中, 继续关闭吗?", MB_YESNO | MB_DEFBUTTON2) == IDNO)
  328. return ;
  329. }
  330. if (!PromptToSaveDatabase())
  331. return;
  332. GetCategoryBarWnd().NewDatabase();
  333. GetCategoryBarWnd().GetRootItem().Select();
  334. SetTitle(GetCategoryBarWnd().GetDatabaseName().data());
  335. }
  336. void CTestBTDoc::OnMenuitemOpenDatabase() 
  337. {
  338. if (GetCategoryBarWnd().IsDownloading())
  339. {
  340. if (AfxMessageBox("有任务正在进行中, 继续关闭吗?", MB_YESNO|MB_DEFBUTTON2) == IDNO)
  341. return ;
  342. }
  343. if (!PromptToSaveDatabase())
  344. return;
  345.  
  346. int structsize = 76;
  347. DWORD dwVersion,dwWindowsMajorVersion,dwWindowsMinorVersion;
  348. dwVersion = GetVersion();
  349. dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
  350. dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
  351. if (dwVersion < 0x80000000)
  352. structsize =88;
  353. CFileDialog fileDialog(TRUE, 0, 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Database (*.bt)|*.bt|All Files (*.*)|*.*|");
  354. fileDialog.m_ofn.lStructSize = structsize; 
  355. int iRet = fileDialog.DoModal();
  356. if (iRet != IDOK) return ;
  357. CString strFileName = fileDialog.GetPathName();
  358. if (!GetCategoryBarWnd().OpenDBFile(strFileName.GetBuffer(0)))
  359. return;
  360. SetTitle(GetCategoryBarWnd().GetDatabaseName().data());
  361. AfxGetApp()->AddToRecentFileList(strFileName);
  362. }
  363. void CTestBTDoc::OnFileSaveDatabase() 
  364. {
  365. if (GetCategoryBarWnd().IsModifyed())
  366. OnFileSaveAsDatabase();
  367. else
  368. GetCategoryBarWnd().Save();
  369. SetTitle(GetCategoryBarWnd().GetDatabaseName().data());
  370. }
  371. void CTestBTDoc::OnFileSaveAsDatabase() 
  372. {
  373. SaveAsDatabase();
  374. }
  375. bool CTestBTDoc::SaveAsDatabase(bool bExit) 
  376. {
  377. CString strDataBaseFullPath = GetCategoryBarWnd().GetDatabaseFullPath().data();
  378. int structsize = 76;
  379. DWORD dwVersion,dwWindowsMajorVersion,dwWindowsMinorVersion;
  380. dwVersion = GetVersion();
  381. dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
  382. dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
  383. if (dwVersion < 0x80000000)
  384. structsize =88;
  385. CFileDialog fileDialog(FALSE, 0, strDataBaseFullPath, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Database (*.bt)|*.bt|");
  386. // if (!strDataBaseFullPath.IsEmpty())
  387. // fileDialog.m_ofn.lpstrFile = (char*)(LPCTSTR)strDataBaseFullPath;
  388. fileDialog.m_ofn.lStructSize = structsize; 
  389. int iRet = fileDialog.DoModal();
  390. if (iRet != IDOK)
  391. return false;
  392. if (bExit)
  393. GetCategoryBarWnd().StopAllCompleteds();
  394. CString strFileName = fileDialog.GetPathName();
  395. GetCategoryBarWnd().SaveAs(strFileName.GetBuffer(0));
  396. SetTitle(GetCategoryBarWnd().GetDatabaseName().data());
  397. AfxGetApp()->AddToRecentFileList(strFileName);
  398. return true;
  399. }
  400. BOOL CTestBTDoc::CanCloseFrame(CFrameWnd* pFrame) 
  401. {
  402. if (GetCategoryBarWnd().IsMovingFiles())
  403. {
  404. AfxMessageBox("正在移动文件, 不能关闭系统");
  405. return FALSE;
  406. }
  407. if (GetCategoryBarWnd().IsDownloading())
  408. {
  409. if (AfxMessageBox("有任务正在进行中, 继续关闭吗?", MB_YESNO|MB_DEFBUTTON2) == IDNO)
  410. return FALSE;
  411. }
  412. if (!PromptToSaveDatabase(true))
  413. return FALSE;
  414. if (pFrame && pFrame->IsWindowVisible())
  415. pFrame->SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
  416. return CDocument::CanCloseFrame(pFrame);
  417. }
  418. /////////////////////////////////////////////////////////////
  419. // handle menu and toolbar message.
  420. void CTestBTDoc::OnUpdateMenuitem(CCmdUI* pCmdUI) 
  421. {
  422. switch (pCmdUI->m_nID)
  423. {
  424. case ID_MENUITEM_DOWNLOAD:
  425. case ID_MENUITEM_PAUSE:
  426. case ID_MENUITEM_STOP:
  427. case ID_MENUITEM_DEL:
  428. case ID_MENUITEM_FILE_PROPERTY:
  429. case ID_MENUITEM_OPEN_DOWNLOADED_FILE:
  430. case ID_MENUITEM_OPEN_DOWNLOADED_DIRECTORY:
  431. case ID_MENUITEM_MOVETO:
  432. case ID_MENUITEM_RUN_PARAMETERS:
  433. case ID_MENUITEM_COPY_TORRENT_FILE_PATH:
  434. {
  435. GetFileListCtrl().OnUpdateMenuitem(pCmdUI);
  436. return;
  437. }
  438. break;
  439. case ID_MENUITEM_FIND_NEXT:
  440. case ID_MENUITEM_OPEN_CATEGORY:
  441. case ID_MENUITEM_MOVETO_CATEGORY:
  442. case ID_MENUITEM_NEW_CATEGORY:
  443. case ID_MENUITEM_DEL_CATEGORY:
  444. case ID_MENUITEM_PORPERTY_CATEGORY:
  445. GetCategoryBarWnd().OnUpdateMenuitem(pCmdUI);
  446. return;
  447. break;
  448. }
  449. pCmdUI->ContinueRouting();
  450. }
  451. void CTestBTDoc::OnCommandMenuitem(UINT iID) 
  452. {
  453. switch (iID)
  454. {
  455. case ID_MENUITEM_DOWNLOAD:
  456. case ID_MENUITEM_PAUSE:
  457. case ID_MENUITEM_STOP:
  458. case ID_MENUITEM_DEL:
  459. case ID_MENUITEM_FILE_PROPERTY:
  460. case ID_MENUITEM_OPEN_DOWNLOADED_FILE:
  461. case ID_MENUITEM_OPEN_DOWNLOADED_DIRECTORY:
  462. case ID_MENUITEM_MOVETO:
  463. case ID_MENUITEM_RUN_PARAMETERS:
  464. case ID_MENUITEM_COPY_TORRENT_FILE_PATH:
  465. GetFileListCtrl().OnCommandMenuitem(iID);
  466. break;
  467. // case ID_MENUITEM_FIND_NEXT:
  468. case ID_MENUITEM_OPEN_CATEGORY:
  469. case ID_MENUITEM_MOVETO_CATEGORY:
  470. case ID_MENUITEM_NEW_CATEGORY:
  471. case ID_MENUITEM_DEL_CATEGORY:
  472. case ID_MENUITEM_PORPERTY_CATEGORY:
  473. GetCategoryBarWnd().OnCommandMenuitem(iID);
  474. break;
  475. }
  476. }
  477. void CTestBTDoc::OnMenuitemMakeMetafile() 
  478. {
  479. CDlgMakeMetafile dlg(this);
  480. dlg.DoModal();
  481. }
  482. void CTestBTDoc::OnFileOpen() 
  483. {
  484. int structsize = 76;
  485. DWORD dwVersion,dwWindowsMajorVersion,dwWindowsMinorVersion;
  486. dwVersion = GetVersion();
  487. dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
  488. dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
  489. if (dwVersion < 0x80000000)
  490. structsize =88;
  491. CFileDialog fileDialog(TRUE, 0, 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Torrent File (*.torrent)|*.torrent|All Files (*.*)|*.*|");
  492. fileDialog.m_ofn.lStructSize = structsize; 
  493. int iRet = fileDialog.DoModal();
  494. if (iRet != IDOK) return ;
  495. CString strFileName = fileDialog.GetPathName();
  496. OnOpenDocument(strFileName);
  497. }