MainFrm.cpp
上传用户:hysujiao87
上传日期:2007-12-02
资源大小:156k
文件大小:6k
源码类别:

ICQ/即时通讯

开发平台:

C/C++

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3. #include "stdafx.h"
  4. #include "QQServer.h"
  5. #include "MainFrm.h"
  6. #include "QQServerDoc.h"
  7. #include "QQServerView.h"
  8. #include "UserListDlg.h"
  9. #include <shlwapi.h>
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. CEvent g_eventTimer;
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CMainFrame
  18. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  19. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  20. //{{AFX_MSG_MAP(CMainFrame)
  21. ON_WM_CREATE()
  22. ON_COMMAND(ID_NET_START, OnNetStart)
  23. ON_UPDATE_COMMAND_UI(ID_NET_START, OnUpdateNetStart)
  24. ON_COMMAND(ID_NET_FINISH, OnNetFinish)
  25. ON_UPDATE_COMMAND_UI(ID_NET_FINISH, OnUpdateNetFinish)
  26. ON_WM_CLOSE()
  27. ON_WM_TIMER()
  28. ON_MESSAGE(WM_SERVICE_NOTIFY, OnServiceNotify)
  29. //}}AFX_MSG_MAP
  30. ON_COMMAND(ID_VIEW_USER, OnViewUser)
  31. ON_WM_DESTROY()
  32. END_MESSAGE_MAP()
  33. static UINT indicators[] =
  34. {
  35. ID_SEPARATOR,           // status line indicator
  36. ID_MOUSE_POSITION,
  37. ID_INDICATOR_NUM,
  38. ID_INDICATOR_SCRL,
  39. };
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CMainFrame construction/destruction
  42. CMainFrame::CMainFrame()
  43. {
  44. // TODO: add member initialization code here
  45. }
  46. CMainFrame::~CMainFrame()
  47. {
  48. }
  49. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  50. {
  51. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  52. return -1;
  53. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_FLOATING, CRect(0, 0, 0, 0)) ||
  54. !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  55. {
  56. TRACE0("Failed to create toolbarn");
  57. return -1;      // fail to create
  58. }
  59. if (!m_wndStatusBar.Create(this, WS_CHILD | WS_VISIBLE |
  60. CBRS_BOTTOM) ||
  61. !m_wndStatusBar.SetIndicators(indicators,
  62.   sizeof(indicators)/sizeof(UINT)))
  63. {
  64. TRACE0("Failed to create status barn");
  65. return -1;      // fail to create
  66. }
  67. // TODO: Delete these three lines if you don't want the toolbar to
  68. //  be dockable
  69. return 0;
  70. }
  71. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  72. {
  73. if( !CFrameWnd::PreCreateWindow(cs) )
  74. return FALSE;
  75. // TODO: Modify the Window class or styles here by modifying
  76. //  the CREATESTRUCT cs
  77. return TRUE;
  78. }
  79. /////////////////////////////////////////////////////////////////////////////
  80. // CMainFrame diagnostics
  81. #ifdef _DEBUG
  82. void CMainFrame::AssertValid() const
  83. {
  84. CFrameWnd::AssertValid();
  85. }
  86. void CMainFrame::Dump(CDumpContext& dc) const
  87. {
  88. CFrameWnd::Dump(dc);
  89. }
  90. #endif //_DEBUG
  91. /////////////////////////////////////////////////////////////////////////////
  92. // CMainFrame message handlers
  93. void CMainFrame::OnNetStart() 
  94. {
  95. // TODO: Add your command handler code here
  96. GetActiveDocument()->DeleteContents();
  97. try{
  98. CFile loadFile(getDataPath(), CFile::modeRead | CFile::typeBinary);
  99. CArchive ar(&loadFile, CArchive::load);
  100. GetActiveDocument()->Serialize(ar);
  101. ar.Close();
  102. loadFile.Close();
  103. }
  104. catch(CArchiveException *ae)
  105. {
  106. ae->ReportError();
  107. ae->Delete();
  108. return ;
  109. }
  110. catch(CFileException *fe)
  111. {
  112. if (fe->m_cause != CFileException::fileNotFound)
  113. {
  114. fe->ReportError();
  115. fe->Delete();
  116. return ;
  117. }
  118. fe->Delete();
  119. }
  120. CQQServerDoc *doc = (CQQServerDoc*)GetActiveDocument();
  121. _service.startListen(&doc->_userList);
  122. SetTimer(100, 500, NULL);
  123. showMessage("QQ server is running.");
  124. }
  125. void CMainFrame::showMessage(LPCTSTR msg)
  126. {
  127. CQQServerView *view = (CQQServerView*)GetActiveView();
  128. view->showMessage(msg);
  129. }
  130. void CMainFrame::OnUpdateNetStart(CCmdUI* pCmdUI) 
  131. {
  132. // TODO: Add your command update UI handler code here
  133. if (_service.isListening() == FALSE)
  134. pCmdUI->Enable(TRUE);
  135. else
  136. pCmdUI->Enable(FALSE);
  137. }
  138. void CMainFrame::OnNetFinish() 
  139. {
  140. // TODO: Add your command handler code here
  141. if (_service.isListening() == FALSE)
  142. return ;
  143. KillTimer(100);
  144. _service.stopListen();
  145. CQQServerDoc* pDoc = (CQQServerDoc*)GetActiveDocument();
  146. for(INT_PTR i = 0; i < pDoc->_userList.getCount(); i++)
  147. {
  148. CUserData* userData = pDoc->_userList.getUserByIndex(i);
  149. userData->_online = FALSE;
  150. }
  151. try{
  152. CFile saveFile(getDataPath(), CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
  153. CArchive ar(&saveFile, CArchive::store);
  154. GetActiveDocument()->Serialize(ar);
  155. ar.Close();
  156. saveFile.Close();
  157. }
  158. catch(CArchiveException *ae)
  159. {
  160. ae->ReportError();
  161. ae->Delete();
  162. }
  163. catch(CFileException *fe)
  164. {
  165. fe->ReportError();
  166. fe->Delete();
  167. }
  168. showMessage("QQ server is finished.");
  169. }
  170. void CMainFrame::OnUpdateNetFinish(CCmdUI* pCmdUI) 
  171. {
  172. // TODO: Add your command update UI handler code here
  173. if( _service.isListening() != TRUE)
  174. pCmdUI->Enable(FALSE);
  175. else
  176. pCmdUI->Enable(TRUE);
  177. }
  178. CString CMainFrame::getDataPath()
  179. {
  180. TCHAR savePath[_MAX_PATH + 5];
  181. ::GetModuleFileName(AfxGetInstanceHandle(), savePath, _MAX_PATH + 5);
  182. ::PathRemoveFileSpec(savePath);
  183. _tcscat(savePath, _T("\userdata.dat"));
  184. return CString(savePath);
  185. }
  186. void CMainFrame::OnClose() 
  187. {
  188. // TODO: Add your message handler code here and/or call default
  189. CFrameWnd::OnClose();
  190. }
  191. void CMainFrame::OnTimer(UINT nIDEvent) 
  192. {
  193. // TODO: Add your message handler code here and/or call default
  194. switch(nIDEvent)
  195. {
  196. case 100:
  197. {
  198. CQQServerDoc* pDoc = (CQQServerDoc*)GetActiveDocument();
  199. for(INT_PTR i = 0; i < pDoc->_userList.getCount(); i++)
  200. {
  201. CUserData *userData = pDoc->_userList.getUserByIndex(i);
  202. _ASSERTE(userData != NULL);
  203. if (userData == NULL)
  204. return ;
  205. if (userData->_online == TRUE)
  206. {
  207. if( (GetTickCount() - userData->_lastReport) >= 10000 )
  208. {
  209. userData->_online = FALSE;
  210. userData->_lastReport = 0;
  211. ::ZeroMemory(&userData->_sockAddr, sizeof(sockaddr_in));
  212. }
  213. }
  214. }
  215. break;
  216. }
  217. }
  218. CFrameWnd::OnTimer(nIDEvent);
  219. }
  220. LRESULT CMainFrame::OnServiceNotify(WPARAM wParam, LPARAM lParam)
  221. {
  222. TCHAR *message = (TCHAR*)wParam;
  223. _ASSERTE(message != NULL);
  224. if (message == NULL)
  225. return 1;
  226. showMessage(message);
  227. delete[] message;
  228. return 0;
  229. }
  230. void CMainFrame::OnViewUser()
  231. {
  232. // TODO: Add your command handler code here
  233. CUserListDlg dlg;
  234. CQQServerDoc *doc = (CQQServerDoc*)GetActiveDocument();
  235. dlg.setUserList(&doc->_userList);
  236. dlg.DoModal();
  237. }
  238. void CMainFrame::OnDestroy()
  239. {
  240. CFrameWnd::OnDestroy();
  241. // TODO: Add your message handler code here
  242. OnNetFinish();
  243. }