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

P2P编程

开发平台:

Visual C++

  1. // testBT.cpp : Defines the class behaviors for the application.
  2. //
  3. #include "stdafx.h"
  4. #include "testBT.h"
  5. #include "MainFrm.h"
  6. #include "testBTDoc.h"
  7. #include "testBTView.h"
  8. #include "HyperLink.h"
  9. #include "FileAssociation.h"
  10. #include "sinstance.h"
  11. #include "ButtonEx.h"
  12. #include "MenuSpawn.h"
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. /////////////////////////////////////////////////////////////////////////////////////
  19. //
  20. // DbgGuiLeak
  21. //
  22. /////////////////////////////////////////////////////////////////////////////////////
  23. #define GR_GDIOBJECTS     0       /* Count of GDI objects */
  24. #define GR_USEROBJECTS    1       /* Count of USER objects */
  25. HMODULE DbgGuiLeak::m_hUser32 = 0;
  26. DbgGuiLeak::GETGUIRESOURCES_PROC DbgGuiLeak::m_pfnGetGuiResources = 0;
  27. void DbgGuiLeak::Init()
  28. {
  29. return;
  30. #ifdef _DEBUG
  31.    if (m_hUser32 == NULL)
  32.    {
  33.       m_hUser32 = ::LoadLibrary(_T("USER32.DLL"));
  34.       if (m_hUser32 != NULL)
  35.          m_pfnGetGuiResources = (GETGUIRESOURCES_PROC)::GetProcAddress(m_hUser32, _T("GetGuiResources"));
  36.    }
  37.    ASSERT((m_hUser32 != NULL) && (m_pfnGetGuiResources != NULL));
  38.    if ((m_hUser32 == NULL) || (m_pfnGetGuiResources == NULL))
  39.    {
  40.       // AfxMessageBox(IDS_USER_IMPORT, MB_OK | MB_ICONINFORMATION);
  41.    ASSERT(FALSE);
  42.       return;
  43.    }
  44. #endif
  45. }
  46. void DbgGuiLeak::Exit()
  47. {
  48. return;
  49. #ifdef _DEBUG
  50.    if (m_hUser32 != NULL)
  51.       ::FreeLibrary(m_hUser32);
  52. #endif
  53. }
  54. DbgGuiLeak::DbgGuiLeak ()
  55. {
  56. return;
  57. #ifdef _DEBUG
  58. if (m_pfnGetGuiResources)
  59. {
  60. _guiResCount = m_pfnGetGuiResources(::GetCurrentProcess (),
  61. GR_GDIOBJECTS);
  62. }
  63. #endif
  64. }
  65. DbgGuiLeak::~DbgGuiLeak ()
  66. {
  67. return;
  68. #ifdef _DEBUG
  69. if (m_pfnGetGuiResources)
  70. {
  71. int leaks = m_pfnGetGuiResources(::GetCurrentProcess (), GR_GDIOBJECTS) - _guiResCount;
  72. if (leaks != 0)
  73. {
  74. // std::cout << "Gui Resources Leaked: " << leaks << std::endl;
  75. ASSERT(FALSE);
  76. TRACE("Gui Resources Leaked(%d)rn", leaks);
  77. }
  78. }
  79. #endif
  80. }
  81. /////////////////////////////////////////////////////////////////////////////////////
  82. // end DbgGuiLeak
  83. void ShowMessage(CEncryptedConnection* psocket, string strMsg)
  84. {
  85. strMsg += "rn";
  86. // ((CMainFrame*)AfxGetApp()->GetMainWnd())->SendMessage(ID_MENUITEM_TEST, (long)psocket, (long)strMsg.data() );
  87. // CEdit& e = ((CEditView*)((CMainFrame*)AfxGetApp()->GetMainWnd())->GetActiveView())->GetEditCtrl();
  88. // e.ReplaceSel(strMsg.data());
  89. }
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CTestBTApp
  92. BEGIN_MESSAGE_MAP(CTestBTApp, CWinApp)
  93. //{{AFX_MSG_MAP(CTestBTApp)
  94. ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  95. // NOTE - the ClassWizard will add and remove mapping macros here.
  96. //    DO NOT EDIT what you see in these blocks of generated code!
  97. //}}AFX_MSG_MAP
  98. // Standard file based document commands
  99. ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
  100. ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
  101. // Standard print setup command
  102. ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
  103. END_MESSAGE_MAP()
  104. /////////////////////////////////////////////////////////////////////////////
  105. // CTestBTApp construction
  106. CTestBTApp::CTestBTApp()
  107. {
  108. m_pMainFrame = 0;
  109. m_uUserMessage = 0;
  110. DbgGuiLeak::Init();
  111. }
  112. CTestBTApp::~CTestBTApp()
  113. {
  114. DbgGuiLeak::Exit();
  115. }
  116. /////////////////////////////////////////////////////////////////////////////
  117. // The one and only CTestBTApp object
  118. CTestBTApp theApp;
  119. class CMyCommandLineInfo : public CCommandLineInfo
  120. {
  121. public:
  122. CMyCommandLineInfo ()
  123. {
  124. m_bMakeTorrent = false;
  125. }
  126. void ParseParam( LPCTSTR lpszParam, BOOL bFlag, BOOL bLast )
  127. {
  128. if (bFlag && CString(lpszParam) == "t")
  129. {
  130. // AfxMessageBox("make torrent");
  131. m_bMakeTorrent = true;
  132. return;
  133. }
  134. CCommandLineInfo::ParseParam(lpszParam, bFlag, bLast );
  135. }
  136. bool m_bMakeTorrent;
  137.  
  138. };
  139. /////////////////////////////////////////////////////////////////////////////
  140. // CTestBTApp initialization
  141. BOOL CTestBTApp::InitInstance()
  142. {
  143. AfxOleInit();
  144. AfxEnableControlContainer();
  145. CMenuSpawn::OnSystemColorChange();
  146. // Standard initialization
  147. // If you are not using these features and wish to reduce the size
  148. //  of your final executable, you should remove from the following
  149. //  the specific initialization routines you do not need.
  150. #ifdef _AFXDLL
  151. Enable3dControls(); // Call this when using MFC in a shared DLL
  152. #else
  153. Enable3dControlsStatic(); // Call this when linking to MFC statically
  154. #endif
  155. // Change the registry key under which our settings are stored.
  156. // TODO: You should modify this string to be something appropriate
  157. // such as the name of your company or organization.
  158. // SetRegistryKey(_T("Local AppWizard-Generated Applications"));
  159. SetRegistryKey(_T("Shunfa BT"));
  160. LoadStdProfileSettings(16);  // Load standard INI file options (including MRU)
  161. // Register the application's document templates.  Document templates
  162. //  serve as the connection between documents, frame windows and views.
  163. CSingleDocTemplate* pDocTemplate;
  164. pDocTemplate = new CSingleDocTemplate(
  165. IDR_MAINFRAME,
  166. RUNTIME_CLASS(CTestBTDoc),
  167. RUNTIME_CLASS(CMainFrame),       // main SDI frame window
  168. RUNTIME_CLASS(CTestBTView));
  169. AddDocTemplate(pDocTemplate);
  170. // Parse command line for standard shell commands, DDE, file open
  171. // CCommandLineInfo cmdInfo;
  172. CMyCommandLineInfo cmdInfo;
  173. ParseCommandLine(cmdInfo);
  174. // skip opendocument().
  175. bool bOpen = false;
  176. if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen)
  177. {
  178. bOpen = true;
  179. cmdInfo.m_nShellCommand = CCommandLineInfo::FileNew;
  180. }
  181. if (cmdInfo.m_nShellCommand != CCommandLineInfo::FileNew)
  182. return FALSE;
  183. /****************************************************
  184. Check for the previous instance as soon as possible
  185. *****************************************************/
  186. m_uUserMessage = RegisterWindowMessage("TEST_BT_ANOTHER_INSTANCE");
  187. CInstanceChecker instanceChecker(_T("TestBT.Document"));
  188. instanceChecker.ActivateChecker();
  189. if (instanceChecker.PreviousInstanceRunning())
  190. {
  191. HWND hwnd = instanceChecker.ActivatePreviousInstance();
  192. if (hwnd)
  193. {
  194. WriteProfileString("Control","CmdLineFile", cmdInfo.m_strFileName);
  195. WriteProfileInt("Control","switcher", cmdInfo.m_bMakeTorrent);
  196. PostMessage(hwnd, m_uUserMessage, 0, 0);
  197. }
  198. return FALSE;
  199. }
  200. /****************************************************
  201. Active.
  202. *****************************************************/
  203. // Dispatch commands specified on the command line
  204. if (!ProcessShellCommand(cmdInfo))
  205. return FALSE;
  206. if (bOpen )
  207. {
  208. assert(!cmdInfo.m_strFileName.IsEmpty());
  209. if (cmdInfo.m_bMakeTorrent)
  210. MakeTorrent(cmdInfo.m_strFileName);
  211. else
  212. OpenDocumentFile(cmdInfo.m_strFileName);
  213. }
  214. // Association.
  215. EnableShellOpen();
  216. RegisterShellFileTypes();
  217. CFileAssociation fileAssoc("共工BT", ".torrent", "制作文件(*.Torrent) - 共工BT");
  218. if (!fileAssoc.MakeAssocaition(true))
  219. assert(false);
  220. if (!fileAssoc.MakeGenerateTorrentMenu(true))
  221. assert(false);
  222. // The one and only window has been initialized, so show and update it.
  223. m_pMainWnd->ShowWindow(SW_SHOW);
  224. m_pMainWnd->UpdateWindow();
  225. instanceChecker.TrackFirstInstanceRunning();
  226. return TRUE;
  227. }
  228. void CTestBTApp::MakeTorrent(CString strFilePath)
  229. {
  230. assert(!strFilePath.IsEmpty());
  231. DWORD dwAttr = GetFileAttributes(strFilePath);
  232. if (dwAttr ==  0xffffffff)
  233. {
  234. assert(false);
  235. return ;
  236. }
  237. CTestBTDoc* pDocument = (CTestBTDoc*)((CMainFrame*)m_pMainFrame)->GetActiveDocument();
  238. if (!pDocument)
  239. {
  240. assert(false);
  241. return;
  242. }
  243. pDocument->MakeTorrent(strFilePath);
  244. }
  245. /////////////////////////////////////////////////////////////////////////////
  246. // CAboutDlg dialog used for App About
  247. class CAboutDlg : public CDialog
  248. {
  249. public:
  250. CAboutDlg();
  251. // Dialog Data
  252. //{{AFX_DATA(CAboutDlg)
  253. enum { IDD = IDD_ABOUTBOX };
  254. CButtonEx m_btnOK;
  255. CHyperLink m_linkEmail;
  256. //}}AFX_DATA
  257. // ClassWizard generated virtual function overrides
  258. //{{AFX_VIRTUAL(CAboutDlg)
  259. protected:
  260. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  261. //}}AFX_VIRTUAL
  262. // Implementation
  263. protected:
  264. //{{AFX_MSG(CAboutDlg)
  265. virtual BOOL OnInitDialog();
  266. //}}AFX_MSG
  267. DECLARE_MESSAGE_MAP()
  268. private:
  269. CImageList m_ctlImage;
  270. };
  271. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  272. {
  273. //{{AFX_DATA_INIT(CAboutDlg)
  274. //}}AFX_DATA_INIT
  275. }
  276. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  277. {
  278. CDialog::DoDataExchange(pDX);
  279. //{{AFX_DATA_MAP(CAboutDlg)
  280. DDX_Control(pDX, IDOK, m_btnOK);
  281. DDX_Control(pDX, IDC_STATIC_EMAIL, m_linkEmail);
  282. //}}AFX_DATA_MAP
  283. }
  284. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  285. //{{AFX_MSG_MAP(CAboutDlg)
  286. //}}AFX_MSG_MAP
  287. END_MESSAGE_MAP()
  288. // App command to run the dialog
  289. void CTestBTApp::OnAppAbout()
  290. {
  291. DbgGuiLeak m_dbg;
  292. CAboutDlg aboutDlg;
  293. aboutDlg.DoModal();
  294. }
  295. /////////////////////////////////////////////////////////////////////////////
  296. // CTestBTApp message handlers
  297. BOOL CAboutDlg::OnInitDialog() 
  298. {
  299. CDialog::OnInitDialog();
  300. //
  301. // Create BitmapList
  302. //
  303. HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
  304. MAKEINTRESOURCE(IDB_BITMAP_DLG_ICONS),
  305. IMAGE_BITMAP,
  306. 0,0, // cx,cy
  307. LR_CREATEDIBSECTION); // | LR_LOADMAP3DCOLORS );
  308. CBitmap bm;
  309. bm.Attach(hbm);
  310. m_ctlImage.Create(16,15, ILC_COLOR8|ILC_MASK, 3, 4);
  311. m_ctlImage.SetBkColor(RGB(255, 255,255)); 
  312. m_ctlImage.Add(&bm, (COLORREF)RGB(255,0,255));
  313. //
  314. // set ok cancel button image.
  315. //
  316. // m_btnBrowseDir.Create(m_ctlImage.ExtractIcon(2), true, "选择保存路径");
  317. m_btnOK.Create(m_ctlImage.ExtractIcon(0));
  318. m_linkEmail.SetURL("mailto:jingfangjing@163.com");
  319. return TRUE;  // return TRUE unless you set the focus to a control
  320.               // EXCEPTION: OCX Property Pages should return FALSE
  321. }
  322. BOOL CTestBTApp::PreTranslateMessage(MSG* pMsg) 
  323. {
  324. if( pMsg->message == m_uUserMessage )
  325. {
  326. // Retrive command line info
  327. CString file = GetProfileString("Control","CmdLineFile","");
  328. int bMakeTorrent = GetProfileInt("Control","switcher", 0);
  329. if( !file.IsEmpty() )
  330. {
  331. if (!bMakeTorrent)
  332. OpenDocumentFile(file);
  333. else
  334. {
  335. MakeTorrent(file);
  336. }
  337. }
  338. return TRUE; // User message has been handled
  339. }
  340. return CWinApp::PreTranslateMessage(pMsg);
  341. }
  342. CDocument* CTestBTApp::OpenDocumentFile(LPCTSTR lpszFileName) 
  343. {
  344. return CWinApp::OpenDocumentFile(lpszFileName);
  345. }