FilelistSend.cpp
上传用户:maryhy001
上传日期:2007-05-02
资源大小:2317k
文件大小:13k
源码类别:

网格计算

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "trfAgent.h"
  3. #include "FilelistSend.h"
  4. #include "variantex.h"
  5. //文件接收和发送列表的列头数
  6. static const int G_FILELISTVIEW_COL_COUNTS = 4;
  7. IMPLEMENT_DYNCREATE(CFileListSend, CListView)
  8. CFileListSend::CFileListSend()
  9. {
  10. this->m_bSendingBusy = FALSE;
  11. this->m_sortedBy = FILE_NAME;
  12. this->m_bCanSort = TRUE;
  13. }
  14. CFileListSend::~CFileListSend(){}
  15. BEGIN_MESSAGE_MAP(CFileListSend, CListView)
  16. //{{AFX_MSG_MAP(CFileListSend)
  17. ON_WM_CREATE()
  18. ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
  19. ON_WM_KEYDOWN()
  20. ON_WM_DESTROY()
  21. ON_WM_SETCURSOR()
  22. //}}AFX_MSG_MAP
  23. END_MESSAGE_MAP()
  24. void CFileListSend::OnDraw(CDC* pDC)
  25. {
  26. CDocument* pDoc = GetDocument();
  27. }
  28. #ifdef _DEBUG
  29. void CFileListSend::AssertValid() const
  30. {
  31. CListView::AssertValid();
  32. }
  33. void CFileListSend::Dump(CDumpContext& dc) const
  34. {
  35. CListView::Dump(dc);
  36. }
  37. #endif //_DEBUG
  38. void CFileListSend::AddFile(const char *lpszFilename, const int index)
  39. {
  40. ASSERT(NULL != lpszFilename);
  41. if(!FileExists(lpszFilename)) return ;
  42. CListCtrl &pListCtrl = this->GetListCtrl();
  43. //连续获取所有选择的文件信息
  44. CString strItem;
  45. CString *plpsz = new CString[G_FILELISTVIEW_COL_COUNTS];
  46. //打开该文件
  47. CFile file(lpszFilename, CFile::modeRead);
  48. //文件名
  49. int nLastIndex = (index == -1) ? pListCtrl.GetItemCount() : index;
  50. pListCtrl.InsertItem(nLastIndex, file.GetFileName(), 7);
  51. plpsz[0].Format("%s", file.GetFileName());
  52. //文件大小
  53. strItem.Empty();
  54. strItem.Format("%d", file.GetLength());
  55. pListCtrl.SetItemText(nLastIndex, 1, strItem);
  56. plpsz[1].Format("%s", strItem.GetBuffer(0));
  57. //文件所在目录
  58. strItem.Empty();
  59. strItem = file.GetFilePath();
  60. strItem = strItem.Left(strItem.ReverseFind('\'));
  61. pListCtrl.SetItemText(nLastIndex, 2, strItem);
  62. plpsz[2].Format("%s", strItem.GetBuffer(0));
  63. //发送文件时间
  64. strItem.Empty();
  65. pListCtrl.SetItemText(nLastIndex, 3, strItem.GetBuffer(0));
  66. plpsz[3].Format("%s", strItem.GetBuffer(0));
  67. pListCtrl.SetItemData(nLastIndex, (DWORD)plpsz);
  68. //关闭文件
  69. file.Close();
  70. }
  71. void CFileListSend::AddFiles(void)
  72. {
  73. LPCTSTR lpszDefExt = _T(""),
  74. lpszFilter = _T("Word文档(*.doc)|*.doc|文本文档(*.txt)|*.txt|执行代码(*.exe;*.dll;*.ocx)|*.exe;*.dll;*.ocx|压缩文件(*.zip;*.rar)|*.zip;*.rar|All Files(*.*)|*.*||");
  75. CFileDialog dlg(TRUE, "*.*", NULL, 
  76. OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_FILEMUSTEXIST |
  77. OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_LONGNAMES | OFN_ENABLESIZING, 
  78. lpszFilter);
  79. TCHAR *tcharFile = new TCHAR[32767];
  80. ZeroMemory(tcharFile, 32767);  
  81. dlg.m_ofn.lpstrFile   = tcharFile;
  82. dlg.m_ofn.nMaxFile    = 32767;
  83. dlg.m_ofn.nFileOffset = 0;
  84. if( dlg.DoModal() == IDOK){
  85. CListCtrl &pListCtrl = this->GetListCtrl();
  86. //连续获取所有选择的文件信息
  87. CString strItem("");
  88. POSITION pos = dlg.GetStartPosition();
  89. for(; pos ; )
  90. {
  91. strItem = dlg.GetNextPathName(pos);
  92. this->AddFile(strItem.GetBuffer(0));
  93. }
  94. }
  95. delete []tcharFile;
  96. }
  97. void CFileListSend::DelFiles(void)
  98. {
  99. int index = 0;
  100. CListCtrl &pListCtrl = this->GetListCtrl();
  101. if(0 == pListCtrl.GetSelectedCount()) return ;
  102. POSITION pos = pListCtrl.GetFirstSelectedItemPosition();
  103. while(pos)
  104. {
  105. index = pListCtrl.GetNextSelectedItem(pos);
  106. CString *p = reinterpret_cast<CString*>(pListCtrl.GetItemData(index));
  107. if(NULL != p) delete []p;
  108. pListCtrl.DeleteItem(index);
  109. pos = pListCtrl.GetFirstSelectedItemPosition();
  110. }
  111. }
  112. void CFileListSend::DeleteFile(const int index)
  113. {
  114. if(index > -1 && index < this->GetListCtrl().GetItemCount())
  115. {
  116. CString *p = reinterpret_cast<CString*>(this->GetListCtrl().GetItemData(index));
  117. if(NULL != p) delete []p;
  118. this->GetListCtrl().DeleteItem(index);
  119. }
  120. }
  121. void CFileListSend::SelectAllItems(void)
  122. {
  123. int index = 0;
  124. CListCtrl &pListCtrl = this->GetListCtrl();
  125. for(index = 0; index < pListCtrl.GetItemCount(); ++index)
  126. {
  127. ListView_SetItemState (this->GetSafeHwnd(),
  128. index,
  129. LVIS_FOCUSED | LVIS_SELECTED,
  130. 0x000F); 
  131. }
  132. }
  133. void CFileListSend::SelectOneItem(const int index)
  134. {
  135. CListCtrl &pListCtrl = this->GetListCtrl();
  136. if(index < 0 || index > pListCtrl.GetItemCount() - 1) return ;
  137. ListView_SetItemState (this->GetSafeHwnd(),
  138. index,
  139. LVIS_FOCUSED | LVIS_SELECTED,
  140. 0x000F);
  141. }
  142. void CFileListSend::EnableSort(const BOOL bCanSort)
  143. {
  144. this->m_bCanSort = bCanSort;
  145. }
  146. int CFileListSend::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  147. {
  148. lpCreateStruct->style |= (LVS_REPORT | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS);
  149. if (CListView::OnCreate(lpCreateStruct) == -1)
  150. return -1;
  151. //初始化ListView的显示风格
  152. this->GetListCtrl().SetExtendedStyle(LVS_EX_FULLROWSELECT);
  153. //设置EDIT的字体
  154. this->SetFont(CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT)));
  155. //设置ImageList
  156. if(!m_imgView.Create(IDB_OUTPUTSPACE, 16, 3, RGB (255, 0, 0)))
  157. {
  158. TRACE0("Failed to create the m_imgViewn");
  159. return -1;
  160. }
  161. this->GetListCtrl().SetImageList(&m_imgView, LVSIL_SMALL);
  162. //初始化ListView的列头
  163. CString strColCap = _T("");
  164. //列头的宽度和风格
  165. static const struct
  166. {
  167. UINT nColHdrId;
  168. int  nFormat;
  169. int  nWidth;
  170. }colData[] = {
  171. {IDS_LIST_FILENAME, LVCFMT_LEFT, 120},
  172. {IDS_LIST_FILESIZE, LVCFMT_RIGHT, 100},
  173. {IDS_LIST_SRCDIR, LVCFMT_LEFT, 200},
  174. {IDS_LIST_SNDTIME, LVCFMT_LEFT, 100}
  175. };
  176. for(int i = 0; i < G_FILELISTVIEW_COL_COUNTS; ++i){
  177. VERIFY(strColCap.LoadString(colData[i].nColHdrId));
  178. this->GetListCtrl().InsertColumn(i, LPCTSTR(strColCap), colData[i].nFormat, colData[i].nWidth);
  179. }
  180. //初始化时以文件名来对列表数据进行排序
  181.     this->GetListCtrl().SortItems(LVCompareProc, static_cast<DWORD>(this->m_sortedBy));
  182. return 0;
  183. }
  184. void CFileListSend::OnInitialUpdate() 
  185. {
  186. CListView::OnInitialUpdate();
  187. VERIFY(m_DropTarget.Register(this));
  188. }
  189. int CALLBACK CFileListSend::LVCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  190. {
  191. bool    bComplementResult = false;
  192. int     result = 0;
  193. //如果是要求反向排序
  194. if (lParamSort < 0)
  195. {
  196. //那么下次应该正向排序(前提:用户对同一列点击两次)
  197. lParamSort = -lParamSort;
  198. bComplementResult = true;
  199. }
  200. else{
  201. bComplementResult = false;
  202. }
  203. SORT_BY sortedBy = static_cast<SORT_BY>(lParamSort);
  204. //获取当前需要排序的两个SubItem的Text串
  205. CString *plpsz1 = reinterpret_cast<CString *>(lParam1);
  206. CString *plpsz2 = reinterpret_cast<CString *>(lParam2);
  207. ASSERT(NULL != plpsz1);
  208. ASSERT(NULL != plpsz2);
  209. CString psz1 = plpsz1[sortedBy - 1],
  210. psz2 = plpsz2[sortedBy - 1];
  211. //FILE_NAME = 1, FILE_SIZE, FILE_SRCDIR, FILE_SNDTIME
  212. switch (sortedBy)
  213. {
  214. case FILE_NAME:
  215. case FILE_SRCDIR:
  216. case FILE_SNDTIME:
  217. {
  218. result = psz1.CompareNoCase(psz2);
  219. break;
  220. }
  221. case FILE_SIZE:
  222. {
  223. int nSize1, nSize2;
  224. nSize1 = atoi(psz1.GetBuffer(0));
  225. nSize2 = atoi(psz2.GetBuffer(0));
  226. result = nSize1 - nSize2;
  227. break;
  228. }
  229. default:
  230. ASSERT(false);
  231. break;
  232. }
  233. if (bComplementResult) result = -result;
  234. return result;
  235. }
  236. void CFileListSend::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
  237. {
  238. LPNMLISTVIEW pNMListView = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
  239. *pResult = 0;
  240. //@1---if current state is in sending state then disable sort function.
  241. if(!this->m_bCanSort) return;
  242. //@2---sorting action
  243. SORT_BY sortBy = FILE_NAME;
  244. switch (pNMListView->iSubItem)
  245. {
  246. case 0:
  247. sortBy = FILE_NAME;
  248. break;
  249. case 1:
  250. sortBy = FILE_SIZE;
  251. break;
  252. case 2:
  253. sortBy = FILE_SRCDIR;
  254. break;
  255. case 3:
  256. sortBy = FILE_SNDTIME;
  257. break;
  258. default: ASSERT(false);
  259. /**/
  260. }
  261. if (m_sortedBy == sortBy)
  262. m_sortedBy= static_cast<SORT_BY>(-sortBy);
  263. else
  264. m_sortedBy = sortBy;
  265. //开始对列表进行排序
  266. this->GetListCtrl().SortItems(LVCompareProc, static_cast<DWORD>(this->m_sortedBy));
  267. }
  268. void CFileListSend::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  269. {
  270. #define CTRLED 0x8000 
  271. switch(nChar) {
  272. case 'A':
  273. {
  274. SHORT ks = GetKeyState(VK_CONTROL);
  275. if(ks & CTRLED)
  276. {
  277. this->SelectAllItems();
  278. }
  279. }
  280. break;
  281. case VK_DELETE:
  282. {
  283. this->DelFiles();
  284. }
  285. break;
  286. }
  287. CListView::OnKeyDown(nChar, nRepCnt, nFlags);
  288. }
  289. void CFileListSend::OnDestroy() 
  290. {
  291. this->SelectAllItems();
  292. this->DelFiles();
  293. CListView::OnDestroy();
  294. }
  295. BOOL CFileListSend::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  296. {
  297. return CListView::OnSetCursor(pWnd, nHitTest, message);
  298. }
  299. //get current max trans.db table's max id.
  300. int CFileListSend::GetMaxTransID(void)
  301. {
  302. CGuiRecordSet rs;
  303. CVariantEx varex;
  304. char sql[MAX_SQL_SIZE];
  305. try
  306. {
  307. _snprintf(sql, MAX_SQL_SIZE-1, SQL::CLIENT_TRANS_COUNT);
  308. if(rs.Open(theApp.m_oAppInstance.m_adoconn.GetConecction(), sql))
  309. {
  310. rs.GetCollect("RECCNTS", varex.get_variant_t());
  311. int maxid = 1, counts = varex.AsInteger();
  312. rs.Close();
  313. if(counts > 0)
  314. {
  315. _snprintf(sql, MAX_SQL_SIZE-1, SQL::CLIENT_TRANS_MAXID);
  316. if(rs.Open(theApp.m_oAppInstance.m_adoconn.GetConecction(), sql))
  317. {
  318. rs.GetCollect("MAXID", varex.get_variant_t());
  319. maxid = varex.AsInteger();
  320. rs.Close();
  321. }
  322. }
  323. return maxid;
  324. }
  325. return 0;
  326. }
  327. catch (...) 
  328. {
  329. return 0;
  330. }
  331. }
  332. BOOL CFileListSend::AddSendRecord(const int nitem, const char *tohost, const BOOL bsuccessful)
  333. {
  334. CGuiRecordSet rs;
  335. char sql[MAX_SQL_SIZE];
  336. try
  337. {
  338. int maxid = this->GetMaxTransID();
  339. if(0 == maxid) return FALSE;
  340. int transtype = SQL::TRANSTYP_SNDER | (bsuccessful ? SQL::TRANSTYP_SNDOK : 0x0);
  341. CString stranstime = this->GetListCtrl().GetItemText(nitem, 3).GetBuffer(0);
  342. CString sfilename;
  343. sfilename.Format("%s\%s", 
  344. this->GetListCtrl().GetItemText(nitem, 2).GetBuffer(0),
  345. this->GetListCtrl().GetItemText(nitem, 0).GetBuffer(0));
  346. _snprintf(sql, MAX_SQL_SIZE-1, SQL::CLIENT_TRANS_ADDLOG, 
  347. maxid, sfilename.GetBuffer(0), "---", tohost, stranstime.GetBuffer(0), transtype);
  348. return rs.Open(theApp.m_oAppInstance.m_adoconn.GetConecction(), sql);
  349. }
  350. catch (...) 
  351. {
  352. return FALSE;
  353. }
  354. }
  355. //////////////////////////////////////////////////////////////////////////
  356. /*
  357.  * support drag-drop operation from shell system.
  358.  */
  359. BOOL CFileListSend::FileNamesToList(HDROP hDrop)
  360. {
  361. UINT cFiles = ::DragQueryFile(hDrop, (UINT)-1, NULL, 0);
  362. if(cFiles <= 0)
  363. {
  364. return FALSE;
  365. }
  366. char szFile[MAX_PATH];
  367. for( UINT count = 0; count < cFiles; count++ )
  368. {
  369. ::DragQueryFile(hDrop, count, szFile, sizeof(szFile));
  370. this->AddFile(szFile);
  371. }
  372. return TRUE;
  373. }
  374. BOOL CFileListSend::DataObjectToList(COleDataObject* const pDataObject)
  375. {
  376. if(pDataObject->IsDataAvailable(CF_HDROP))
  377. {
  378. STGMEDIUM StgMed;
  379. FORMATETC fmte = 
  380. {
  381. CF_HDROP,
  382. (DVTARGETDEVICE FAR *)NULL,
  383. DVASPECT_CONTENT, -1,
  384. TYMED_HGLOBAL 
  385. };
  386. if( pDataObject->GetData( CF_HDROP, &StgMed, &fmte ) )
  387. {
  388. if(!this->FileNamesToList((HDROP)StgMed.hGlobal))
  389. {
  390. return FALSE;
  391. }
  392. if (StgMed.pUnkForRelease)
  393. {
  394. StgMed.pUnkForRelease->Release();
  395. }
  396. else
  397. {
  398. ::GlobalFree(StgMed.hGlobal);
  399. }
  400. return TRUE;
  401. }
  402. }
  403. return FALSE;
  404. }
  405. DROPEFFECT CFileListSend::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
  406. {
  407. if( ! pDataObject->IsDataAvailable( CF_HDROP ) ){
  408. return DROPEFFECT_NONE;
  409. }
  410. DROPEFFECT de = DROPEFFECT_COPY;
  411. /*
  412. if ( dwKeyState & MK_CONTROL ){
  413. de = DROPEFFECT_COPY;
  414. }
  415. else{
  416. de = DROPEFFECT_MOVE;
  417. }
  418. */
  419. return de; 
  420. }
  421. BOOL CFileListSend::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
  422. {
  423. return this->DataObjectToList(pDataObject);
  424. }
  425. //determine the specialed file whether is or not a file that on ftp-server host.
  426. BOOL CFileListSend::IsFtpFile(const int index)
  427. {
  428. CListCtrl &pListCtrl = this->GetListCtrl();
  429. if(index > -1 && index < pListCtrl.GetItemCount())
  430. {
  431. TCHAR chFirst = pListCtrl.GetItemText(index, 2).GetAt(0);
  432. return (chFirst == '/');
  433. }
  434. return FALSE;
  435. }
  436. //insert someone ftp file into sending listview.
  437. void CFileListSend::AddFtpFileIntoSendList(LPCSTR lpszFtpFileDir, LPCSTR lpszFtpFileName, DWORD dwFtpFilesize)
  438. {
  439. CListCtrl &pListCtrl = this->GetListCtrl();
  440. CString *plpsz = new CString[G_FILELISTVIEW_COL_COUNTS];
  441. //文件名
  442. int nLastIndex = pListCtrl.GetItemCount();
  443. pListCtrl.InsertItem(nLastIndex, lpszFtpFileName, 21);
  444. plpsz[0].Format("%s", lpszFtpFileName);
  445. //文件大小
  446. CString strItem;
  447. strItem.Format("%d", dwFtpFilesize);
  448. pListCtrl.SetItemText(nLastIndex, 1, strItem);
  449. plpsz[1].Format("%s", strItem);
  450. //文件所在目录
  451. pListCtrl.SetItemText(nLastIndex, 2, lpszFtpFileDir);
  452. plpsz[2].Format("%s", lpszFtpFileDir);
  453. //发送文件时间
  454. pListCtrl.SetItemText(nLastIndex, 3, "");
  455. plpsz[3].Format("%s", "");
  456. pListCtrl.SetItemData(nLastIndex, (DWORD)plpsz);
  457. }
  458. //remove all ftp file from sending listview.
  459. void CFileListSend::RemoveAllFtpFiles(void)
  460. {
  461. CListCtrl &pListCtrl = this->GetListCtrl();
  462. for(int i = pListCtrl.GetItemCount() - 1; i > -1; --i)
  463. {
  464. TCHAR chFirst = pListCtrl.GetItemText(i, 2).GetAt(0);
  465. if(chFirst == '/')
  466. {
  467. CString *plpsz = (CString*)pListCtrl.GetItemData(i);
  468. if(NULL != plpsz) delete []plpsz;
  469. pListCtrl.DeleteItem(i);
  470. }
  471. }
  472. }