SetupTree.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:14k
源码类别:

CA认证

开发平台:

Visual C++

  1. // SetupTree.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "....minica.h"
  5. #include "SetupTree.h"
  6. #include "....CertDbPage.h"
  7. #include "....MiniMainDlg.h"
  8. #define SPACE 80
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CSetupTree
  16. CSetupTree::CSetupTree()
  17. {
  18. m_pEdit = NULL;
  19. m_pButton = NULL;
  20. m_hControlItem = NULL;
  21. m_CdbPath = ((CMiniCaApp *)AfxGetApp())->GetAppPath() + "\CertDB.CDB";
  22. }
  23. CSetupTree::~CSetupTree()
  24. {
  25. m_HtreeList.RemoveAll();
  26. }
  27. BEGIN_MESSAGE_MAP(CSetupTree, CTreeCtrl)
  28. //{{AFX_MSG_MAP(CSetupTree)
  29. ON_WM_VSCROLL()
  30. ON_WM_HSCROLL()
  31. ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
  32. ON_BN_CLICKED(TREE_OPTIONS_BUTTON_ID, OnOptionsButtonId)
  33. ON_WM_DESTROY()
  34. ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
  35. //}}AFX_MSG_MAP
  36. END_MESSAGE_MAP()
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CSetupTree message handlers
  39. void CSetupTree::ExpandParent(HTREEITEM item,UINT nCode )////展开,收缩
  40. {
  41. SetRedraw(FALSE);
  42. if(item)
  43. Expand( item, nCode );
  44. else
  45. return;
  46. HTREEITEM hParentItem = GetParentItem( item );
  47. if(hParentItem)//是否有父
  48. {
  49. Expand( hParentItem, nCode );
  50. ExpandParent(hParentItem, nCode);
  51. }
  52. else
  53. return;
  54. // EnsureVisible( GetSelectedItem());
  55. SetRedraw();
  56. }
  57. void CSetupTree::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  58. {
  59. // TODO: Add your message handler code here and/or call default
  60. UpdateTreeControlTextFromChildControl();
  61. CTreeCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
  62. }
  63. void CSetupTree::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  64. {
  65. // TODO: Add your message handler code here and/or call default
  66. UpdateTreeControlTextFromChildControl();
  67. CTreeCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
  68. }
  69. void CSetupTree::OnClick(NMHDR* pNMHDR, LRESULT* pResult) 
  70. {
  71. // TODO: Add your control notification handler code here
  72. CPoint point;
  73. GetCursorPos(&point); // 当前鼠标坐标
  74. CPoint PointInTree = point;
  75. ScreenToClient( &PointInTree);
  76. HTREEITEM hPItem;
  77. UINT nFlag;
  78. HTREEITEM hItem = HitTest( PointInTree, &nFlag);
  79. if(hItem == NULL)
  80. {
  81. UpdateTreeControlTextFromChildControl();
  82. return;
  83. }
  84. if (nFlag&TVHT_ONITEMICON) //点种图标,则选择或不选
  85. {
  86. int nImage,nSelectedImage,nState;
  87. GetItemImage(hItem,nImage,nSelectedImage);
  88. if(nImage <3)
  89. {
  90. nState = !nImage;
  91. SetItemImage(hItem,nState,nState);
  92. TravelChild(hItem, nState);
  93. hPItem = GetParentItem(hItem);
  94. if(hPItem!=NULL)
  95. TravelSiblingAndParent(hItem,nState);
  96. }
  97. }
  98. else if(nFlag&TVHT_ONITEMLABEL) //点种标签,增加证书,密码
  99. {
  100. if ((nFlag & TVHT_ONITEM) && GetItemData(hItem) && m_hControlItem == NULL)
  101. {
  102. CreateNewChildControl(hItem);
  103. }
  104. }
  105. else
  106. {
  107. UpdateTreeControlTextFromChildControl();
  108. }
  109. *pResult = 0;
  110. }
  111. void CSetupTree::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
  112. {
  113. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  114. // TODO: Add your control notification handler code here
  115. if (m_hControlItem)
  116. {
  117. UpdateTreeControlTextFromChildControl();
  118. }
  119. // //Create the new combo if need be
  120. if(pNMTreeView->itemOld.hItem)
  121. CreateNewChildControl(pNMTreeView->itemNew.hItem);
  122. *pResult = 0;
  123. }
  124. void CSetupTree::TravelChild(HTREEITEM hItem, int nState)
  125. {
  126. HTREEITEM hChildItem,hBrotherItem;
  127. DWORD dData = GetItemData(hItem);
  128. if(dData>=10)
  129. return;
  130. //查找子节点,没有就结束
  131. hChildItem = GetChildItem(hItem);
  132. if(hChildItem!=NULL)
  133. {
  134. //设置子节点的状态与当前节点的状态一致
  135. int temp;
  136. GetItemImage( hChildItem,temp ,temp );
  137. if(temp<3)
  138. SetItemImage( hChildItem,nState ,nState );
  139. //再递归处理子节点的子节点和兄弟节点
  140. TravelChild(hChildItem, nState);
  141. //处理子节点的兄弟节点和其子节点
  142. hBrotherItem = GetNextSiblingItem(hChildItem);
  143. while (hBrotherItem)
  144. {
  145. //设置子节点的兄弟节点状态与当前节点的状态一致
  146. SetItemImage( hBrotherItem,nState ,nState );
  147. //再递归处理子节点的兄弟节点的子节点和兄弟节点
  148. TravelChild(hBrotherItem, nState);
  149. hBrotherItem = GetNextSiblingItem(hBrotherItem);
  150. }
  151. }
  152. }
  153. void CSetupTree::TravelSiblingAndParent(HTREEITEM hItem, int nState)
  154. {
  155. HTREEITEM hNextSiblingItem,hPrevSiblingItem,hParentItem;
  156. //查找父节点,没有就结束
  157. hParentItem = GetParentItem(hItem);
  158. if(hParentItem==NULL)
  159. return;
  160. int nImage,nSelectedImage;
  161. BOOL bParent = TRUE;//需要继续比较
  162. //查找当前节点下面的兄弟节点的图像,如果nState!=nImage,则父节点为灰色
  163. hNextSiblingItem = GetNextSiblingItem(hItem);
  164. while(hNextSiblingItem!=NULL)
  165. {
  166. GetItemImage(hNextSiblingItem,nImage,nSelectedImage);
  167. if(nImage!=nState)
  168. {
  169. bParent = FALSE;//此次比较已经确认父为灰色
  170. break;
  171. }
  172. else 
  173. hNextSiblingItem = GetNextSiblingItem(hNextSiblingItem);
  174. }
  175. if(bParent)//继续比较兄弟节点
  176. {
  177. //查找当前节点上面的兄弟节点的状态
  178. hPrevSiblingItem = GetPrevSiblingItem(hItem);
  179. while(hPrevSiblingItem!=NULL)
  180. {
  181. GetItemImage(hPrevSiblingItem,nImage,nSelectedImage);
  182. if(nImage!=nState) 
  183. {
  184. bParent = FALSE;//此次比较已经确认父为灰色
  185. break;
  186. }
  187. else hPrevSiblingItem = GetPrevSiblingItem(hPrevSiblingItem);
  188. }
  189. }
  190. if(!bParent)//设置父节点为灰色,上一级为灰
  191. {
  192. SetItemImage(hParentItem, 2, 2);
  193. hParentItem = GetParentItem(hItem);
  194. while(hParentItem!=NULL)
  195. {
  196. SetItemImage( hParentItem, 2, 2);
  197. hParentItem = GetParentItem(hParentItem);
  198. }
  199. }
  200. else//设置父节点为当前选中状态
  201. SetItemImage(hParentItem,nState,nState );
  202. //再递归处理父节点的兄弟节点和其父节点
  203. TravelSiblingAndParent(hParentItem,nState);
  204. }
  205. void CSetupTree::OnOptionsButtonId() 
  206. {
  207. // TODO: Add your control notification handler code here
  208. SelectFile();
  209. }
  210. void CSetupTree::SelectFile() 
  211. {
  212. // TODO: Add your control notification handler code here
  213. HTREEITEM hItem = GetSelectedItem ();
  214. UINT m_SelectID = GetItemData(hItem);
  215. CString sFilter,sTitle;//过滤器,标题条
  216. if(m_SelectID<100)
  217. return;
  218. switch(m_SelectID%100)
  219. {
  220. case 0://公钥
  221. sFilter = "公钥证书(*.pem;*.der;*.cer)|*.pem;*.der;*.cer|所有文件(*.*)|*.*||";
  222. sTitle = "公钥证书文件";
  223. break;
  224. case 10://私钥
  225. sFilter = "私钥证书(*.pem;*.der;*.cer)|*.pem;*.der;*.cer|所有文件(*.*)|*.*||";
  226. sTitle = "私钥证书文件";
  227. break;
  228. case 20://pfx
  229. sFilter = "个人信息交换(*.pfx;*.p12)|*.pfx;*.p12|所有文件(*.*)|*.*||";
  230. sTitle = "个人信息交换文件";
  231. break;
  232. default:
  233. return;
  234. }
  235. CFileDialog dlgOpen(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  236. CMiniCaApp::NormalCode(sFilter),NULL);
  237. CString strTitle = CMiniCaApp::NormalCode(sTitle);
  238. dlgOpen.m_ofn.lpstrTitle = strTitle;//标题条
  239. if(dlgOpen.DoModal()==IDOK) 
  240. {
  241. CString sName = dlgOpen.GetPathName();
  242. CString strCause,strPwd;
  243. // CString sName = GetItemText(hItem);
  244. // sName += ": " + dlgOpen.GetPathName();
  245. // DWORD dData = GetItemData(hItem);
  246. // stuCertDB CertDB;
  247. // if(CertDB.LoadFromCert(sName.GetBuffer(0),dData,strPwd.GetBuffer(0),0,strCause))
  248. SetItemText(hItem,sName);
  249. UpdateTreeControlTextFromChildControl();
  250. // int nImage,nSelectedImage,nState;
  251. // HTREEITEM hPItem;
  252. // SetItemImage(hItem,1,1);
  253. // TravelChild(hItem, 1);
  254. // hPItem = GetParentItem(hItem);
  255. // if(hPItem!=NULL)
  256. // TravelSiblingAndParent(hItem,1);
  257. }
  258. }
  259. void CSetupTree::LoadCdb() //加载证书库
  260. {
  261. UpdateTreeControlTextFromChildControl();
  262. CFile file;
  263. if(!file.Open(m_CdbPath,CFile::modeRead))
  264. return;
  265. for(;;)
  266. {
  267. stuCertDB CertDB;
  268. int len = file.Read(&CertDB,sizeof(stuCertDB));
  269. if(len==0)
  270. break;
  271. CString str;
  272. if(CertDB.LoadFromDB(str))
  273. {
  274. //查找链表,增加数据
  275. DWORD dData;
  276. HTREEITEM hTempItem;
  277. for(POSITION pos = m_HtreeList.GetHeadPosition(); pos!=NULL; )
  278. {
  279. hTempItem = (HTREEITEM)m_HtreeList.GetNext(pos);
  280. dData = GetItemData(hTempItem);
  281. if(dData == CertDB._uID)
  282. {
  283. SetItemText(hTempItem, CMiniCaApp::NormalCode(str));
  284. SetItemImage(hTempItem,4,4);
  285. if(dData%100 == 10)//私钥
  286. {
  287. SetItemText(GetNextSiblingItem(hTempItem),"********");
  288. if(strcmp(CertDB._chPWD,"")!=0)//密码有效
  289. {
  290. SetItemImage(GetNextSiblingItem(hTempItem),6,6);
  291. }
  292. else
  293. {
  294. SetItemImage(GetNextSiblingItem(hTempItem),5,5);
  295. }
  296. }
  297. SetItemImage(GetParentItem(hTempItem),CertDB._bUSED,CertDB._bUSED);
  298. TravelSiblingAndParent(GetParentItem(hTempItem),CertDB._bUSED);
  299. //展开有效项目
  300. ExpandParent(GetParentItem(hTempItem),TVE_EXPAND);
  301. break;
  302. }
  303. }
  304. }
  305. }
  306. file.Close();
  307. }
  308. void CSetupTree::Savecdb() //保存证书库
  309. {
  310. // TODO: Add your control notification handler code here
  311. // ResetContent();
  312. //遍历数
  313. UpdateTreeControlTextFromChildControl();
  314. CFile file;
  315. if(!file.Open(m_CdbPath,CFile::modeReadWrite | CFile::modeNoTruncate | CFile::modeCreate))
  316. return;
  317. HTREEITEM hTempItem = NULL;
  318. int nImage,nSelectedImage;
  319. CString strPwd,strName,strCause;
  320. HTREEITEM hPItem;
  321. DWORD dData,len = 0;
  322. for(POSITION pos = m_HtreeList.GetHeadPosition(); pos!=NULL;)
  323. {
  324. stuCertDB CertDB;
  325. hTempItem = (HTREEITEM)m_HtreeList.GetNext(pos);
  326. hPItem = GetParentItem(hTempItem);
  327. dData = GetItemData(hTempItem);
  328. GetItemImage(hPItem,nImage,nSelectedImage);//需要直接父窗口的图像
  329. strName = GetItemText(hTempItem);//得到文件或者证书名成
  330. if(strName == "公钥文件" || strName == "私钥文件")//表示此项没有加载
  331. continue;
  332. switch(dData%100)
  333. {
  334. case 0://公钥
  335. strPwd = "";
  336. break;
  337. case 10://私钥
  338. strPwd = GetItemText(GetNextSiblingItem(hTempItem));
  339. break;
  340. default:
  341. break;
  342. }
  343. if(strName.Find(":\",0) == -1)//已经是证书库中内容,非文件,不包含路径,就是证书名
  344. {
  345. //判断使用情况
  346. file.SeekToBegin();
  347. for(int i = 0;;i++)
  348. {
  349. len = file.Read(&CertDB,sizeof(stuCertDB));
  350. if(len == 0)
  351. break;
  352. if(CertDB._uID == dData)
  353. {
  354. file.Seek(i*sizeof(stuCertDB),CFile::begin);
  355. CertDB._bUSED = nImage;
  356. if(dData%100 == 10)
  357. {
  358. if(strPwd.Find("********") != -1 && strcmp(CertDB._chPWD,"") == 0) //发现********
  359. {
  360. strPwd = "";
  361. }
  362. strcpy(CertDB._chPWD,strPwd.GetBuffer(0));//密码
  363. }
  364. //修改CRC
  365. CertDB.SetCRC();
  366. file.Write(&CertDB,sizeof(CertDB));
  367. break;
  368. }
  369. }
  370. continue;
  371. }
  372. else//文件
  373. {
  374. //新文件
  375. if(CertDB.LoadFromCert(strName.GetBuffer(0),dData,strPwd.GetBuffer(0),
  376. nSelectedImage,strCause))
  377. {
  378. BOOL bAlread = FALSE;
  379. len = 0;
  380. //判断证书库中是否已经存在
  381. file.SeekToBegin();
  382. for(int i = 0;;i++)
  383. {
  384. stuCertDB CertTemp;
  385. len = file.Read(&CertTemp,sizeof(stuCertDB));
  386. if(len == 0)
  387. break;
  388. if(CertTemp._uID == dData)
  389. {
  390. file.Seek(i*sizeof(stuCertDB),CFile::begin);
  391. CertDB._bUSED = nImage;
  392. if(dData%100 == 10)// && strPwd.Find("********")==-1
  393. strcpy(CertDB._chPWD,strPwd.GetBuffer(0));//密码
  394. //修改CRC
  395. CertDB.SetCRC();
  396. file.Write(&CertDB,sizeof(CertDB));
  397. bAlread = TRUE;
  398. break;
  399. }
  400. }
  401. if(!bAlread) //新文件
  402. {
  403. file.SeekToEnd();
  404. file.Write(&CertDB,sizeof(stuCertDB));
  405. }
  406. }
  407. else
  408. {
  409. strName = GetItemText(hPItem);
  410. strName += strCause;
  411. //得到父窗口
  412. CCertDbPage * pSetupPage =  (CCertDbPage *)GetParent();
  413. if(::IsWindow(pSetupPage->m_hWnd))
  414. pSetupPage->AddMsg(strName,M_WARING);
  415. }
  416. }
  417. }
  418. file.Close();
  419. LoadCdb();
  420. }
  421. void CSetupTree::UpdateTreeControlTextFromChildControl()
  422. {
  423. HTREEITEM hItem = m_hControlItem;
  424. if (m_pEdit)
  425. {
  426. CString sText;
  427.     m_pEdit->GetWindowText(sText);
  428. if(hItem)
  429. SetItemText(hItem, sText);
  430. m_pEdit->DestroyWindow();
  431. delete m_pEdit;
  432. m_pEdit = NULL;
  433. }
  434. if (m_pButton)
  435. {
  436. m_pButton->DestroyWindow();
  437. delete m_pButton;
  438. m_pButton = NULL;
  439. }
  440. m_hControlItem = NULL;
  441. }
  442. void CSetupTree::OnDestroy() 
  443. {
  444. CTreeCtrl::OnDestroy();
  445. // TODO: Add your message handler code here
  446. UpdateTreeControlTextFromChildControl();
  447. }
  448. void CSetupTree::CreateNewChildControl(HTREEITEM hItem)
  449. {
  450. UINT m_SelectID = GetItemData(hItem);
  451. // SelectItem(hItem);
  452. CString str;
  453. str.Format("%d",m_SelectID);
  454. // AfxMessageBox(str);
  455. if(m_SelectID >= 100)
  456. {
  457. UINT uTemp = m_SelectID%100;
  458. if((uTemp == 11)||(uTemp == 21))//密码 增加新控件
  459. {
  460. // ModifyStyle(0, GetStyle() | TVS_EDITLABELS);
  461. //work out the rect for the combo box
  462. CString sEditText = GetItemText(hItem);
  463. CFont* pFont = GetFont();
  464. //work out the rect for the combo box
  465. CRect rText;
  466. GetItemRect(hItem, &rText, TRUE);
  467. CRect r;
  468. r.top = rText.top;
  469. r.left = rText.left ;
  470. r.right = r.left + 60; //Ask the edit box for the width to use
  471. r.bottom = rText.bottom + 5;
  472. //Create the new edit box
  473. m_pEdit = new CEdit;
  474. ASSERT(m_pEdit);
  475. m_pEdit->CreateEx(WS_EX_CLIENTEDGE, _T("Edit"), sEditText,
  476. WS_VISIBLE | WS_CHILD | ES_LEFT | ES_AUTOHSCROLL | ES_PASSWORD,
  477. r, this, TREE_OPTIONS_EDITBOX_ID);
  478. m_pEdit->SetLimitText(8);
  479. //set the font the edit box should use based on the font in the tree control
  480. m_pEdit->SetFont(pFont);
  481. m_pEdit->SendMessage(EM_SETSEL, 0, -1);
  482. m_pEdit->SetFocus();
  483. }
  484. else if((uTemp == 0)||(uTemp == 10)||(uTemp == 20)) //文件
  485. {
  486. m_pButton = new CXPStyleButtonST;
  487. ASSERT(m_pButton);
  488. CRect rText;
  489. GetItemRect(hItem, &rText, TRUE);
  490. CRect r;
  491. r.top = rText.top;
  492. r.left = rText.left + SPACE;
  493. r.right = r.left + 16; //Ask the edit box for the width to use
  494. r.bottom = rText.top + 16;
  495. m_pButton->Create("",WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, r, 
  496. this, TREE_OPTIONS_BUTTON_ID);
  497. m_pButton->SetIcon(IDI_ICON_BUTTON);
  498. // m_pButton->OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  499. // m_pButton->SetFlat(FALSE);
  500. }
  501. }
  502. m_hControlItem = hItem;
  503. }