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

IP电话/视频会议

开发平台:

Visual C++

  1. // Control.cpp : Defines the class behaviors for the application.
  2. //
  3. #include "stdafx.h"
  4. #include "Control.h"
  5. #include "ControlDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CControlApp
  13. BEGIN_MESSAGE_MAP(CControlApp, CWinApp)
  14. //{{AFX_MSG_MAP(CControlApp)
  15. //}}AFX_MSG
  16. END_MESSAGE_MAP()
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CControlApp construction
  19. CControlApp::CControlApp()
  20. {
  21. this->appIni = "";
  22. this->IP = "";
  23. this->Port = 0;
  24. this->userName = "";
  25. this->password = "";
  26. }
  27. /////////////////////////////////////////////////////////////////////////////
  28. // The one and only CControlApp object
  29. CControlApp theApp;
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CControlApp initialization
  32. BOOL CControlApp::InitInstance()
  33. {   //程序的位置
  34. ::GetModuleFileName( NULL , this->appIni.GetBufferSetLength( MAX_PATH ) , MAX_PATH );
  35. this->appIni.ReleaseBuffer( );
  36. this->appIni = this->appIni.Left( this->appIni.ReverseFind( '\' ) + 1 ) + "control.ini";
  37. //读取服务器IP
  38. ::GetPrivateProfileString( "服务器信息" , "服务器IP" , "" , this->IP.GetBufferSetLength( MAX_PATH ) , MAX_PATH , this->appIni );
  39. this->IP.ReleaseBuffer( );
  40. //读取端口
  41. this->Port = ::GetPrivateProfileInt( "服务器信息" , "服务器端口" , 0 , this->appIni );
  42.     //读取用户名
  43. ::GetPrivateProfileString( "用户信息" , "用户名" , "" , this->userName.GetBufferSetLength( MAX_PATH ) , MAX_PATH , this->appIni );
  44. this->userName.ReleaseBuffer( );
  45.     //读取用户密码
  46. ::GetPrivateProfileString( "用户信息" , "密码" , "" , this->password.GetBufferSetLength( MAX_PATH ) , MAX_PATH , this->appIni );
  47. CControlDlg dlg;
  48. m_pMainWnd = &dlg;
  49. dlg.DoModal( );
  50. theApp.videoTCP.Close( );
  51. theApp.cmdTCP.Close( );
  52. return FALSE;
  53. }
  54. //自动连接
  55. void CControlApp::OnConnect( void * pContext )
  56. {
  57. CControlDlg * pThis = ( CControlDlg * )pContext;
  58. PChannelType cType;
  59. PRegisterRES res;
  60.     //连接服务器
  61. for( ;; )
  62. {
  63. while( ! theApp.cmdTCP.Connect( theApp.IP , theApp.Port ) && ::IsWindow( pThis->GetSafeHwnd( ) ) );
  64. //如果是连接成功退出的
  65. if( theApp.cmdTCP.IsConnected( ) )
  66. { //发送命令通道标志
  67. cType.assembleData( PChannelType::COMMAND , 0 );
  68. if( theApp.cmdTCP.Send( cType.buffer ) )
  69. { //用户注册
  70. PRegisterREQ req;
  71. req.assembleData( ( char * )( const char * )theApp.userName , ( char * )( const char * )theApp.password , PRegisterREQ::MONITOR );
  72. //发送用户注册和接收用户注册回复
  73. struct timeval tm = { 5 , 0 };
  74. if(  theApp.cmdTCP.Send( req.buffer ) && theApp.cmdTCP.Receive( res.buffer , &tm ) && res.parseData( res.buffer ) && ! res.ireturn )
  75. break;
  76. }//循环连接
  77. theApp.cmdTCP.Close( );
  78. }
  79. else //否则是关闭窗口退出的,那么退出连接循环
  80. return;
  81. }//解析命令通道回复信息
  82. if( res.parseData( res.buffer ) && ! res.ireturn )
  83. {   //用户id
  84. theApp.user_id = res.user_id;
  85. //连接视频通道
  86. theApp.videoTCP.Connect( theApp.IP , theApp.Port );
  87. //发送视频类型
  88. cType.assembleData( PChannelType::VIDEO , theApp.user_id );
  89. theApp.videoTCP.Send( cType.buffer );
  90. PVideoData vd;
  91. //发送视频头
  92. vd.assembleData( theApp.user_id , 0 , PVideoData::VIDEO_HEADER , 0 , 0 );
  93. theApp.videoTCP.Send( vd.buffer );
  94. //有可能运行失败
  95. CThread::Run( CControlApp::OnCommand , &theApp );
  96. //有可能运行失败
  97. CThread::Run( CControlApp::OnVideo , &theApp );
  98. }//隐藏自动登陆窗口
  99. pThis->m_astatic.ShowWindow( SW_HIDE );
  100. pThis->m_olist.ShowWindow( SW_SHOW );
  101. pThis->m_viewbtn.ShowWindow( SW_SHOW );
  102. }
  103. //命令通道
  104. void CControlApp::OnCommand( void * pContext )
  105. {   //请求在线用户列表
  106. POnlineUserREQ req;
  107. req.assembleData( );
  108. theApp.cmdTCP.Send( req.buffer );
  109. CBuffer buffer;
  110. //2个数据包之间最大的时间间隔是5分钟
  111. struct timeval tm = { 300 , 0 };
  112.     //接收名命令包
  113. try
  114. {
  115. while( theApp.cmdTCP.Receive( buffer /*, &tm */) )
  116. {
  117. if( ! buffer.GetSize( ) )
  118. break;
  119. switch( *( int * )( buffer.GetBuffer( ) + INT_SIZE ) )
  120. {//要求尽快返回
  121. case POnlineUserRESTAG : theApp.OnlineUser( buffer ); break;
  122. }
  123. }
  124. }
  125. catch( ... )
  126. {
  127. }
  128. //关闭视频信号
  129. theApp.videoTCP.Close( );
  130. //自动登陆
  131. if( ::IsWindow( theApp.m_pMainWnd->GetSafeHwnd( ) ) )
  132. theApp.m_pMainWnd->SendMessage( WM_PACKAGE );
  133. }
  134. //在线用户
  135. void CControlApp::OnlineUser( CBuffer & buffer )
  136. {
  137. if( ! ::IsWindow( this->m_pMainWnd->GetSafeHwnd( ) ) )
  138. return;
  139. POnlineUserRES res;
  140. res.parseData( buffer );
  141. this->m_pMainWnd->SendMessage( WM_PACKAGE , ( WPARAM )&res );
  142. }
  143. //视频接收
  144. void CControlApp::OnVideo( void * pContext )
  145. {
  146. PVideoData vd;
  147. INT_PTR_MAP::iterator itr;
  148. CVideoDlg * dlg = NULL;
  149. PStopVideoREQ stop;
  150. try
  151. {
  152. while( theApp.videoTCP.Receive( vd.buffer ) && vd.parseData( vd.buffer ) )
  153. {   
  154. if( ! vd.buffer.GetSize( ) ) continue;
  155. //找不到显示视频窗口,那么停止发送视频  
  156. if( ( itr = theApp.recv_video_map.find( vd.user_id ) ) == theApp.recv_video_map.end( ) )
  157. {   //停止显示
  158. stop.assembleData( vd.user_id );
  159. theApp.cmdTCP.Send( stop.buffer );
  160. }
  161. else
  162. { //视频窗口
  163. dlg = ( CVideoDlg * )itr->second;
  164. //窗口句柄无效,停止发送视频
  165. if( ! ::IsWindow( dlg->GetSafeHwnd( ) ) )
  166. { //停止显示
  167. stop.assembleData( vd.user_id );
  168. theApp.cmdTCP.Send( stop.buffer );
  169. theApp.recv_video_map.erase( itr );
  170. }
  171. else
  172. {   //视频头
  173. if( vd.type == PVideoData::VIDEO_HEADER )
  174. {   //初始化失败,停止发送视频
  175. if( ! dlg->video.InitDraw( dlg->m_video.GetSafeHwnd( ) , vd.video , vd.size ) )
  176. { //停止显示
  177. stop.assembleData( vd.user_id );
  178. theApp.cmdTCP.Send( stop.buffer );
  179. theApp.recv_video_map.erase( itr );
  180. }
  181. }//视频数据
  182. else if( vd.type == PVideoData::VIDEO_DATA )
  183. dlg->video.Draw( vd.video , vd.size );
  184. }
  185. }
  186. }
  187. }
  188. catch( ... )
  189. {
  190. }
  191. theApp.cmdTCP.Close( );
  192. }