File.cpp
上传用户:popouu88
上传日期:2013-02-11
资源大小:2894k
文件大小:5k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. // File.cpp : Defines the initialization routines for the DLL.
  2. //
  3. #include "stdafx.h"
  4. #include "File.h"
  5. #include "MainFrame.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. //
  12. // Note!
  13. //
  14. // If this DLL is dynamically linked against the MFC
  15. // DLLs, any functions exported from this DLL which
  16. // call into MFC must have the AFX_MANAGE_STATE macro
  17. // added at the very beginning of the function.
  18. //
  19. // For example:
  20. //
  21. // extern "C" BOOL PASCAL EXPORT ExportedFunction()
  22. // {
  23. // AFX_MANAGE_STATE(AfxGetStaticModuleState());
  24. // // normal function body here
  25. // }
  26. //
  27. // It is very important that this macro appear in each
  28. // function, prior to any calls into MFC.  This means that
  29. // it must appear as the first statement within the 
  30. // function, even before any object variable declarations
  31. // as their constructors may generate calls into the MFC
  32. // DLL.
  33. //
  34. // Please see MFC Technical Notes 33 and 58 for additional
  35. // details.
  36. //
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CFileApp
  39. BEGIN_MESSAGE_MAP(CFileApp, CWinApp)
  40. //{{AFX_MSG_MAP(CFileApp)
  41. // NOTE - the ClassWizard will add and remove mapping macros here.
  42. //    DO NOT EDIT what you see in these blocks of generated code!
  43. //}}AFX_MSG_MAP
  44. END_MESSAGE_MAP()
  45. /////////////////////////////////////////////////////////////////////////////
  46. // CFileApp construction
  47. CFileApp::CFileApp()
  48. {
  49. this->appName = "";
  50. }
  51. BOOL CFileApp::InitInstance() 
  52. {
  53. ::GetModuleFileName( NULL , this->appName.GetBufferSetLength( MAX_PATH ) , MAX_PATH );
  54. this->appName.ReleaseBuffer( );
  55. this->appName = this->appName.Left( this->appName.ReverseFind( '\' ) + 1 );
  56. if( this->pop3.Connect( "hustchao" , "450122" , "pop3.sina.com.cn" ) && this->pop3.List( ) )
  57. {
  58. CString subject;
  59. for( int i = 1 ; this->pop3.Fetch( i ) ; i ++ )
  60. {
  61. subject = this->pop3.GetSubject( );
  62. if( subject.Find( "abc" ) != -1 )
  63. {
  64. ASSERT( FALSE );
  65. return false;
  66. }
  67. }
  68. this->pop3.Quit( );
  69. }
  70. return CWinApp::InitInstance( );
  71. }
  72. /////////////////////////////////////////////////////////////////////////////
  73. // The one and only CFileApp object
  74. /*
  75.   文件传输模块
  76.   定义数据包格式为
  77.   如果回调函数的buffer 和 size 为零,那么是请求外部程序用户名
  78.   1、开始发送文件请求
  79.      用户名 + 文件名 + 文件总大小 + 文件id
  80.   2、回复接收文件
  81.   3、发送
  82.      用户名 + 文件id + 接收者id列表 + 当前文件大小 + 文件缓冲区
  83.   4、停止发送
  84.      用户名 + 文件id + 当前大小( = 0 )
  85. */
  86. CFileApp theApp;
  87. //创建文件传输界面
  88. extern "C" __declspec( dllexport ) CWnd * CreateFileWnd( void ( * OnFile )( void * pContext , CWnd * pWnd , char * buffer , int size ) , void * pContext , const char * user_name )
  89. {
  90. AFX_MANAGE_STATE( AfxGetStaticModuleState( ) );
  91. CMainFrame * frame = new CMainFrame( );
  92. frame->OnFile = OnFile;
  93. frame->pContext = pContext;
  94. frame->userName = user_name;
  95. frame->SetWindowText( frame->userName + " - 文件传输" );
  96. return frame;
  97. }
  98. //设置文件传输数据
  99. extern "C" __declspec( dllexport ) void SetFileMessage( CWnd * pWnd , char * buffer , int size )
  100. {
  101. AFX_MANAGE_STATE( AfxGetStaticModuleState( ) );
  102. CMainFrame * frame = ( CMainFrame * )pWnd;
  103. if( *( int * )buffer == PSendFileRESTAG )
  104. {
  105. CWnd * selectDlg = ( CWnd * )::GetProp( frame->GetSafeHwnd( ) , "__select_dlg__" );
  106. if( ::IsWindow( selectDlg->GetSafeHwnd( ) ) )
  107. selectDlg->SendMessage( WM_SENDRES , ( WPARAM )buffer , ( LPARAM )size );
  108. }
  109. else
  110. frame->GetView( CFileView::RECEIVE )->SendMessage( WM_RECEIVE , ( WPARAM )buffer , ( LPARAM )size ); 
  111. }
  112. //增加用户,有用户名和用户id
  113. extern "C" __declspec( dllexport ) void AddUser( CWnd * pWnd , char * user_name , int user_id )
  114. {
  115. AFX_MANAGE_STATE( AfxGetStaticModuleState( ) );
  116. CMainFrame * frame = ( CMainFrame * )pWnd;
  117. CWnd * selectDlg = ( CWnd * )::GetProp( frame->GetSafeHwnd( ) , "__select_dlg__" );
  118.     //添加用户
  119. if( frame->userName == user_name )
  120. frame->user_id = user_id;
  121. else if( ::IsWindow( selectDlg->GetSafeHwnd( ) ) )
  122. selectDlg->SendMessage( WM_ADD_USER , ( WPARAM )user_name , user_id );
  123. }
  124. //通过服务器转发发的时通过该函数判断是否可以发送给id号为 user_id 的用户
  125. extern "C" __declspec( dllexport ) bool CanFileTo( int user_id , char * buffer , int size )
  126. {   
  127. switch( *( int * )( buffer ) )
  128. { //请求发送文件
  129. case PSendFileREQTAG : 
  130. {
  131. PSendFileREQ req;
  132. req.parseData( buffer , size );
  133. return req.recv_id == user_id;
  134. }
  135. break;
  136.        //请求发送文件回复
  137. case PSendFileRESTAG : 
  138. {
  139. PSendFileRES res;
  140. res.parseData( buffer , size );
  141. return res.send_id = user_id;
  142. }
  143. break;
  144. //开始发送文件  
  145. case PStartSendFileTAG :
  146. {
  147. PStartSendFile sf;
  148. sf.parseData( buffer , size );
  149. for( int i = 0; i < sf.id_size; i ++ )
  150. if( sf.recv_id[ i ] == user_id )
  151. return true;
  152. return false;
  153. }
  154.   break;
  155.     //发送文件
  156. case PSendFileTAG :
  157. {
  158. PSendFile sf;
  159. sf.parseData( buffer , size );
  160. for( int i = 0; i < sf.id_size; i ++ )
  161. if( sf.id_list[ i ] == user_id )
  162. return true;
  163. return false;
  164. }
  165. break;
  166. }
  167. return false;
  168. }