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

IP电话/视频会议

开发平台:

Visual C++

  1. // FileView.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "File.h"
  5. #include "FileView.h"
  6. #include "MainFrame.h"
  7. #include "SelectDialog.h"
  8. #include "ReceiveDialog.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. extern CFileApp theApp;
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CFileView
  17. IMPLEMENT_DYNCREATE(CFileView, CFormView)
  18. CFileView::CFileView() : CFormView( CFileView::IDD )
  19. {
  20. //{{AFX_DATA_INIT(CFileView)
  21. //}}AFX_DATA_INIT
  22. this->mode = 0;
  23. this->frame = NULL;
  24. }
  25. CFileView::~CFileView()
  26. {
  27. }
  28. void CFileView::DoDataExchange(CDataExchange* pDX)
  29. {
  30. CFormView::DoDataExchange(pDX);
  31. //{{AFX_DATA_MAP(CFileView)
  32. DDX_Control(pDX, IDC_LIST, m_list);
  33. //}}AFX_DATA_MAP
  34. }
  35. BEGIN_MESSAGE_MAP(CFileView, CFormView)
  36. //{{AFX_MSG_MAP(CFileView)
  37. ON_WM_SIZE()
  38. //}}AFX_MSG_MAP
  39. ON_MESSAGE( WM_RECEIVE , OnReceive )
  40. END_MESSAGE_MAP()
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CFileView diagnostics
  43. void CFileView::OnSize(UINT nType, int cx, int cy) 
  44. {
  45. CFormView::OnSize( nType , cx , cy );
  46. CFormView::ShowScrollBar( SB_BOTH , FALSE );
  47. if( this->m_list )
  48. this->m_list.MoveWindow( 0 , 0 , cx , cy );
  49. }
  50. void CFileView::SetMode( CFrameWnd * mainFrame , int mode )
  51. {
  52. this->frame = ( CMainFrame * )mainFrame;
  53. this->mode = mode;
  54. if( this->mode == SEND )
  55. {
  56. this->m_list.InsertColumn( 0 , "文件名" , LVCFMT_LEFT , this->m_list.GetStringWidth( " 文件名 " ) );
  57. this->m_list.InsertColumn( 1 , "大小" , LVCFMT_RIGHT , this->m_list.GetStringWidth( " 大小 " ) );
  58. this->m_list.InsertColumn( 2 , "已发送" , LVCFMT_RIGHT , this->m_list.GetStringWidth( " 已发送 " ) );
  59. this->m_list.InsertColumn( 3 , "当前状态" , LVCFMT_CENTER , this->m_list.GetStringWidth( " 当前状态 " ) );
  60. }
  61. else if( this->mode == RECEIVE )
  62. {
  63. this->m_list.InsertColumn( 0 , "文件名" , LVCFMT_LEFT , this->m_list.GetStringWidth( " 文件名 " ) );
  64. this->m_list.InsertColumn( 1 , "大小" , LVCFMT_RIGHT , this->m_list.GetStringWidth( " 大小 " ) );
  65. this->m_list.InsertColumn( 2 , "来自用户" , LVCFMT_LEFT , this->m_list.GetStringWidth( " 来自用户 " ) );
  66. this->m_list.InsertColumn( 3 , "已接收" , LVCFMT_RIGHT , this->m_list.GetStringWidth( " 已接收 " ) );
  67. }
  68. this->m_list.SetExtendedStyle( LVS_EX_FULLROWSELECT );
  69. //设定系统图标
  70. SHFILEINFO shFinfo;
  71. HIMAGELIST imglist = ( HIMAGELIST )SHGetFileInfo( "C:\" , 0 , &shFinfo , sizeof( shFinfo ) , SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
  72. this->m_list.SendMessage( LVM_SETIMAGELIST , ( WPARAM )LVSIL_SMALL , ( LPARAM )imglist );
  73. // ScrollBar( this->m_list.GetSafeHwnd( ) );
  74. }
  75. void CFileView::Insert( const char * filename )
  76. {
  77. LVFINDINFO info;
  78. info.flags = LVFI_STRING;
  79. info.psz = filename;
  80. if( this->m_list.FindItem( &info ) != -1 )
  81. {
  82. MessageBox( "文件  " + ( CString )filename + "  已经存在" , "文件传输" , MB_ICONSTOP | MB_OK );
  83. return;
  84. }
  85. CFileStatus status;
  86. if( CFile::GetStatus( filename , status ) && status.m_size )
  87. {
  88. SHFILEINFO shFinfo;
  89. ::SHGetFileInfo( filename , 0 , &shFinfo , sizeof( shFinfo ) , SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
  90. int index = this->m_list.InsertItem( this->m_list.GetItemCount( ), filename , shFinfo.iIcon );
  91. CString s;
  92. s.Format( "%d 个字节" , status.m_size );
  93. this->m_list.SetItemText( index , 1 , s );
  94. this->m_list.SetItemText( index , 2 , "0 个字节" );
  95. this->m_list.SetItemText( index , 3 , "待发送" );
  96. }
  97. }
  98. void CFileView::Delete( void )
  99. {
  100. CString text;
  101. int index;
  102. if( this->mode == SEND )
  103. {
  104. POSITION pos = this->m_list.GetFirstSelectedItemPosition( );
  105. while( pos )
  106. {
  107. index = this->m_list.GetNextSelectedItem( pos );
  108. text = this->m_list.GetItemText( index , 3 );
  109.             //等待发送
  110. if( ! text.CollateNoCase( "待发送" ) )
  111. {
  112. this->m_list.DeleteItem( index );
  113. pos = this->m_list.GetFirstSelectedItemPosition( );
  114. }
  115. else if( MessageBox( "文件 " + this->m_list.GetItemText( index , 0 ) + " 正在发送n是否停止发送并删除?" , "文件传输" , MB_ICONINFORMATION | MB_YESNO ) == IDYES )
  116. {
  117. this->m_list.DeleteItem( index );
  118. pos = this->m_list.GetFirstSelectedItemPosition( );
  119. }
  120. }
  121. }
  122. else
  123. {
  124. POSITION pos = this->m_list.GetFirstSelectedItemPosition( );
  125. while( pos )
  126. {
  127. index = this->m_list.GetNextSelectedItem( pos );
  128. if( ! this->m_list.GetItemData( index ) )
  129. {
  130. this->m_list.DeleteItem( index );
  131. pos = this->m_list.GetFirstSelectedItemPosition( );
  132. }
  133. else
  134. MessageBox( "文件" + this->m_list.GetItemText( index , 0 ) + "还没下载完毕nn不可删除该文件" , "文件传输" , MB_ICONSTOP | MB_OK );
  135. }
  136. }
  137. }
  138. void CFileView::Send( void )
  139. {   //发送
  140. CSelectDialog dlg;
  141. if( dlg.DoModal( ) == IDOK )
  142. {
  143. POSITION pos = this->m_list.GetFirstSelectedItemPosition( );
  144. int index;
  145. CString filename;
  146. PStartSendFile sf;
  147. while( pos )
  148. {
  149. index = this->m_list.GetNextSelectedItem( pos );
  150. filename = this->m_list.GetItemText( index , 0 );
  151. CInfo * info = new CInfo( this , dlg.id_list , dlg.id_size );
  152. if( ! info->File.Open( filename , CFile::modeRead ) )
  153. {
  154. MessageBox( "打开文件" + filename + "失败nn无法发送该文件" , "文件传输" , MB_ICONSTOP | MB_OK );
  155. delete info;
  156. }
  157. else //启动线程发送
  158. {
  159. this->m_list.SetItemData( index , ( int )info );
  160. ::AfxBeginThread( CFileView::OnSend , info );
  161. }
  162. }
  163. }
  164. }
  165. void CFileView::Cancel( void )
  166. {
  167. CString text;
  168. int index;
  169. if( this->mode == SEND )
  170. {
  171. POSITION pos = this->m_list.GetFirstSelectedItemPosition( );
  172. while( pos )
  173. {
  174. index = this->m_list.GetNextSelectedItem( pos );
  175. text = this->m_list.GetItemText( index , 3 );
  176.             //等待发送
  177. if( text.CollateNoCase( "待发送" ) )
  178. {//停止线程
  179. }
  180. }
  181. }
  182. }
  183. UINT CFileView::OnSend( void * pContext )
  184. {
  185. CInfo * info = ( CInfo * )pContext;
  186. PStartSendFile startSendFile;
  187. startSendFile.assembleData( info->pThis->frame->userName , info->File.GetFileName( ) , ( int )info , info->File.GetLength( ) , info->id_list , info->id_size );
  188.     //通知外部开始发送文件
  189. info->pThis->frame->OnFile( info->pThis->frame->pContext , info->pThis->frame , startSendFile.buffer.GetBuffer( ) , startSendFile.buffer.GetSize( ) );
  190. char buffer[ 1000 ];
  191. int size;
  192. PSendFile sf;
  193. LVFINDINFO li;
  194. li.flags = LVFI_STRING | LVFI_PARAM ;
  195. li.psz = info->File.GetFilePath( );
  196. li.lParam = ( int )info;
  197. int sendSize = 0;
  198. int index = 0;
  199. while( ( size = info->File.Read( buffer , 1000 ) ) > 0 )
  200. {   //组合数据包
  201. sf.assembleData( info->pThis->frame->userName , ( int )info , buffer , size , info->id_list , info->id_size );
  202.         //发送文件
  203. info->pThis->frame->OnFile( info->pThis->frame->pContext , info->pThis->frame , sf.buffer.GetBuffer( ) , sf.buffer.GetSize( ) );
  204.  //查找
  205. index  = info->pThis->m_list.FindItem( &li );
  206. sendSize += size;
  207. sprintf( buffer , "%d个字节" , sendSize );
  208. info->pThis->m_list.SetItemText( index , 2 , buffer );
  209. sprintf( buffer , "%d%%" , int ( ( double )sendSize / info->File.GetLength( ) * 100 ) );
  210. info->pThis->m_list.SetItemText( index , 3 , buffer );
  211. }//停止发送
  212. sf.assembleData( info->pThis->frame->userName , ( int )info , 0 , 0 , info->id_list , info->id_size );
  213. info->pThis->frame->OnFile( info->pThis->frame->pContext , info->pThis->frame , sf.buffer.GetBuffer( ) , sf.buffer.GetSize( ) );
  214. //删除列表
  215. info->pThis->m_list.DeleteItem( index );
  216.     //关闭文件
  217. info->File.Close( );
  218. delete info;
  219. return 0;
  220. }
  221. void CFileView::OnReceive( WPARAM wParam , LPARAM lParam )
  222. {
  223. char * buffer = ( char * )wParam;
  224. int size = lParam;
  225. switch( *( int * )buffer ) 
  226. {//发送文件请求
  227. case PSendFileREQTAG :
  228. {
  229. PSendFileREQ req;
  230. req.parseData( buffer , size );
  231. CReceiveDialog dlg( &req );
  232.             //只有都接收或者都不接收    
  233. PSendFileRES res;
  234. res.assembleData( req.user_id , req.recv_id , dlg.DoModal( ) == IDOK );
  235.             //回复信息
  236. this->frame->OnFile( this->frame->pContext , this->frame , res.buffer.GetBuffer( ) , res.buffer.GetSize( ) );
  237. }break;
  238. //开始接收文件
  239. case PStartSendFileTAG :
  240. {
  241. PStartSendFile sf;
  242. sf.parseData( buffer , size );
  243.             //更新文件名
  244. this->UpdateFileName( sf.filename );
  245. CFile * file = new CFile( );
  246. if( ! file->Open( sf.filename , CFile::modeCreate | CFile::modeWrite ) )
  247. {
  248. MessageBox( "创建文件" + sf.filename + "失败" , "文件传输" , MB_ICONSTOP | MB_OK );
  249. delete file;
  250. return;
  251. }
  252. SHFILEINFO shFinfo;
  253.     ::SHGetFileInfo( sf.filename , 0 , &shFinfo , sizeof( shFinfo ) , SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
  254. int index = this->m_list.InsertItem( this->m_list.GetItemCount( ) , sf.filename , shFinfo.iIcon ); 
  255. sf.filename.Format( "%d个字节" , sf.file_size );
  256. this->m_list.SetItemText( index , 1 , sf.filename );
  257. this->m_list.SetItemText( index , 2 , sf.user_name );
  258. this->m_list.SetItemText( index , 3 , "0个字节" );
  259. this->m_list.SetItemData( index , sf.file_id );
  260. sf.filename.Format( "user : %s , file_id : %d" , sf.user_name , sf.file_id );
  261.             //通过发送者的用户名和发送文件的id可以唯一确定本地的文件
  262. ::SetProp( this->m_list.GetSafeHwnd( ) , sf.filename , file );
  263. }break;
  264. //接收文件
  265. case PSendFileTAG :
  266. {
  267. PSendFile sf;
  268. sf.parseData( buffer , size );
  269. CString filename;
  270. filename.Format( "user : %s , file_id : %d" , sf.user_name , sf.file_id );
  271. CFile * file = ( CFile * )::GetProp( this->m_list.GetSafeHwnd( ) , filename );
  272. if( file )
  273. {
  274. LVFINDINFO li;
  275. li.flags = LVFI_STRING | LVFI_PARAM ;
  276. li.psz = file->GetFilePath( );
  277. li.lParam = sf.file_id;
  278. int index = this->m_list.FindItem( &li );
  279. if( index != -1 && sf.fbuffer && sf.fsize )
  280. {
  281. file->Write( sf.fbuffer , sf.fsize );
  282. filename.Format( "%d个字节" , ::atoi( this->m_list.GetItemText( index , 3 ) ) + sf.fsize );
  283. this->m_list.SetItemText( index , 3 , filename );
  284. }
  285. else
  286. {
  287. ::RemoveProp( this->m_list.GetSafeHwnd( ) , filename );
  288. SHFILEINFO shFinfo;
  289.             ::SHGetFileInfo( file->GetFilePath( ) , 0 , &shFinfo , sizeof( shFinfo ) , SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
  290. this->m_list.SetItem( index , 0 , LVIF_IMAGE | LVIF_PARAM , NULL , shFinfo.iIcon , 0 , 0 , 0 );
  291. file->Close( );
  292. delete file;
  293. }
  294. }
  295. }break;
  296. }
  297. }
  298. void CFileView::UpdateFileName( CString & filename )
  299. {
  300. ::CreateDirectory( theApp.appName + "接收的文件" , NULL );
  301. filename = theApp.appName + "接收的文件\" + filename;
  302. CFileFind find;
  303. int i = 0;
  304. CString s , f = filename;
  305. while( find.FindFile( f ) )
  306. {
  307. s.Format( "(%d)" , i ++ );
  308. f = filename;
  309. f.Insert( f.ReverseFind( '.' ) , s );
  310. }
  311. filename = f;
  312. }