Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1186 lines
33 KiB

  1. //Copyright (c) 1998 - 1999 Microsoft Corporation
  2. /*++
  3. Module Name:
  4. LtView.cpp
  5. Abstract:
  6. This Module contains the implementation of CLicMgrLeftView class
  7. (The View class used for the Left pane of the splitter)
  8. Author:
  9. Arathi Kundapur (v-akunda) 11-Feb-1998
  10. Revision History:
  11. --*/
  12. #include "stdafx.h"
  13. #include "LicMgr.h"
  14. #include "defines.h"
  15. #include "LSMgrDoc.h"
  16. #include "LtView.h"
  17. #include "TreeNode.h"
  18. #include "LSServer.h"
  19. #include "mainfrm.h"
  20. #ifdef _DEBUG
  21. #define new DEBUG_NEW
  22. #undef THIS_FILE
  23. static char THIS_FILE[] = __FILE__;
  24. #endif
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CLicMgrLeftView
  27. IMPLEMENT_DYNCREATE(CLicMgrLeftView, CTreeView)
  28. BEGIN_MESSAGE_MAP(CLicMgrLeftView, CTreeView)
  29. //{{AFX_MSG_MAP(CLicMgrLeftView)
  30. ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
  31. ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)
  32. ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydown)
  33. ON_NOTIFY_REFLECT(NM_RCLICK , OnRightClick )
  34. ON_NOTIFY_REFLECT(NM_CLICK , OnLeftClick )
  35. ON_WM_DESTROY()
  36. //}}AFX_MSG_MAP
  37. // Standard printing commands
  38. ON_COMMAND(ID_FILE_PRINT, CTreeView::OnFilePrint)
  39. ON_COMMAND(ID_FILE_PRINT_DIRECT, CTreeView::OnFilePrint)
  40. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CTreeView::OnFilePrintPreview)
  41. ON_MESSAGE(WM_ADD_SERVER, OnAddServer)
  42. ON_MESSAGE(WM_DELETE_SERVER, OnDeleteServer)
  43. ON_MESSAGE(WM_UPDATE_SERVER, OnUpdateServer)
  44. ON_MESSAGE(WM_ADD_ALL_SERVERS, OnAddAllServers)
  45. // all server menus
  46. ON_WM_CONTEXTMENU( )
  47. ON_COMMAND( ID_ALLSVR_CONNECT , OnServerConnect )
  48. ON_COMMAND( ID_ALLSVR_REFRESHALL , OnRefreshAllServers )
  49. ON_COMMAND( ID_ALLSVR_HELP , OnGeneralHelp )
  50. // server menuitems
  51. // ON_COMMAND( ID_LPK_CONNECT , OnServerConnect )
  52. ON_COMMAND( ID_LPK_REFRESH , OnRefreshServer )
  53. ON_COMMAND( ID_LPK_REFRESHALL , OnRefreshAllServers )
  54. ON_COMMAND( ID_LPK_DOWNLOADLICENSES , OnDownloadKeepPack )
  55. ON_COMMAND( ID_SVR_ACTIVATESERVER , OnRegisterServer )
  56. ON_COMMAND( ID_LPK_ADVANCED_REPEATLASTDOWNLOAD , OnRepeatLastDownload )
  57. ON_COMMAND( ID_LPK_ADVANCED_REACTIVATESERVER , OnReactivateServer )
  58. ON_COMMAND( ID_LPK_ADVANCED_DEACTIVATESERVER , OnDeactivateServer )
  59. ON_COMMAND( ID_LPK_PROPERTIES , OnServerProperties )
  60. ON_COMMAND( ID_LPK_HELP , OnGeneralHelp )
  61. // license pak items
  62. // ON_COMMAND( ID_LICPAK_CONNECT , OnServerConnect )
  63. ON_COMMAND( ID_LICPAK_REFRESH , OnRefreshServer )
  64. // ON_COMMAND( ID_LICPAK_REFRESHALL , OnRefreshAllServers )
  65. ON_COMMAND( ID_LICPAK_DOWNLOADLICENSES , OnDownloadKeepPack )
  66. ON_COMMAND( ID_LICPAK_REPEATDOWNLOAD , OnRepeatLastDownload )
  67. ON_COMMAND( ID_LICPAK_HELP , OnGeneralHelp )
  68. END_MESSAGE_MAP()
  69. /////////////////////////////////////////////////////////////////////////////
  70. // CLicMgrLeftView construction/destruction
  71. CLicMgrLeftView::CLicMgrLeftView()
  72. {
  73. // TODO: add construction code here
  74. m_ht = ( HTREEITEM )NULL;
  75. }
  76. CLicMgrLeftView::~CLicMgrLeftView()
  77. {
  78. }
  79. BOOL CLicMgrLeftView::PreCreateWindow(CREATESTRUCT& cs)
  80. {
  81. // TODO: Modify the Window class or styles here by modifying
  82. // the CREATESTRUCT cs
  83. return CTreeView::PreCreateWindow(cs);
  84. }
  85. /////////////////////////////////////////////////////////////////////////////
  86. // CLicMgrLeftView drawing
  87. void CLicMgrLeftView::OnDraw(CDC* pDC)
  88. {
  89. CLicMgrDoc* pDoc = GetDocument();
  90. ASSERT_VALID(pDoc);
  91. // TODO: add draw code for native data here
  92. }
  93. void CLicMgrLeftView::OnInitialUpdate()
  94. {
  95. CTreeView::OnInitialUpdate();
  96. GetTreeCtrl().ModifyStyle(0,TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS);
  97. BuildImageList();
  98. // TODO: You may populate your TreeView with items by directly accessing
  99. // its tree control through a call to GetTreeCtrl().
  100. }
  101. /////////////////////////////////////////////////////////////////////////////
  102. // CLicMgrLeftView printing
  103. BOOL CLicMgrLeftView::OnPreparePrinting(CPrintInfo* pInfo)
  104. {
  105. // default preparation
  106. return DoPreparePrinting(pInfo);
  107. }
  108. void CLicMgrLeftView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  109. {
  110. // TODO: add extra initialization before printing
  111. }
  112. void CLicMgrLeftView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  113. {
  114. // TODO: add cleanup after printing
  115. }
  116. /////////////////////////////////////////////////////////////////////////////
  117. // CLicMgrLeftView diagnostics
  118. #ifdef _DEBUG
  119. void CLicMgrLeftView::AssertValid() const
  120. {
  121. CTreeView::AssertValid();
  122. }
  123. void CLicMgrLeftView::Dump(CDumpContext& dc) const
  124. {
  125. CTreeView::Dump(dc);
  126. }
  127. CLicMgrDoc* CLicMgrLeftView::GetDocument() // non-debug version is inline
  128. {
  129. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLicMgrDoc)));
  130. return (CLicMgrDoc*)m_pDocument;
  131. }
  132. #endif //_DEBUG
  133. /////////////////////////////////////////////////////////////////////////////
  134. // CLicMgrLeftView message handlers
  135. HTREEITEM CLicMgrLeftView::AddItemToTree(HTREEITEM hParent, CString Text, HTREEITEM hInsAfter, int iImage, LPARAM lParam)
  136. {
  137. HTREEITEM hItem = NULL;
  138. TV_ITEM tvItem = {0};
  139. TV_INSERTSTRUCT tvInsert;
  140. ASSERT(lParam);
  141. if(NULL == lParam)
  142. return hItem;
  143. tvItem.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
  144. tvItem.pszText = Text.GetBuffer(Text.GetLength());
  145. tvItem.cchTextMax = Text.GetLength();
  146. tvItem.iImage = iImage;
  147. tvItem.iSelectedImage = iImage;
  148. tvItem.lParam = lParam;
  149. tvInsert.item = tvItem;
  150. tvInsert.hInsertAfter = hInsAfter;
  151. tvInsert.hParent = hParent;
  152. hItem = GetTreeCtrl().InsertItem(&tvInsert);
  153. // GetTreeCtrl().Expand(GetTreeCtrl().GetRootItem(), TVE_EXPAND);
  154. return hItem;
  155. }
  156. LRESULT CLicMgrLeftView::OnAddServer(WPARAM wParam, LPARAM lParam)
  157. {
  158. LRESULT lResult = 0;
  159. CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
  160. ASSERT(pDoc);
  161. if(NULL == pDoc)
  162. return lResult;
  163. CLicServer *pServer = (CLicServer*)lParam;
  164. ASSERT(pServer);
  165. if(NULL == pServer)
  166. return lResult;
  167. HTREEITEM hServer = NULL;
  168. HTREEITEM hItem = NULL;
  169. CTreeNode* pNode = NULL;
  170. HTREEITEM hRoot = GetTreeCtrl().GetRootItem();
  171. if(!hRoot)
  172. goto cleanup;
  173. // First make sure the server isn't already in the tree
  174. // Get the first server under the domain
  175. hItem = GetTreeCtrl().GetNextItem(hRoot, TVGN_CHILD);
  176. while(hItem) {
  177. // Get the data attached to the tree item
  178. CTreeNode *node = (CTreeNode*)GetTreeCtrl().GetItemData(hItem);
  179. if(node) {
  180. // Is this the server we want to add
  181. CLicServer *pServer = (CLicServer*)node->GetTreeObject();
  182. if(pServer == (CLicServer*)lParam) return 0;
  183. }
  184. hItem = GetTreeCtrl().GetNextItem(hItem, TVGN_NEXT);
  185. }
  186. // Add the server to the tree
  187. // Create a CTreeNode object with info about this tree node
  188. pNode = new CTreeNode(NODE_SERVER, pServer);
  189. if(pNode)
  190. {
  191. int iImage = 0;
  192. if( pServer->GetServerType() == SERVER_TS5_ENFORCED )
  193. {
  194. DWORD dwStatus = pServer->GetServerRegistrationStatus();
  195. if( dwStatus == LSERVERSTATUS_REGISTER_INTERNET || dwStatus == LSERVERSTATUS_REGISTER_OTHER )
  196. {
  197. iImage = 3;
  198. }
  199. else if( dwStatus == LSERVERSTATUS_WAITFORPIN )
  200. {
  201. iImage = 4;
  202. }
  203. else if( dwStatus == LSERVERSTATUS_UNREGISTER )
  204. {
  205. iImage = 5;
  206. }
  207. else
  208. {
  209. iImage = 6;
  210. }
  211. }
  212. hServer = AddItemToTree(hRoot, pServer->GetDisplayName(), TVI_SORT, iImage , (LPARAM)pNode);
  213. if(!hServer) delete pNode;
  214. // The server wants to know his tree item handle
  215. pServer->SetTreeItem(hServer);
  216. }
  217. cleanup:
  218. return lResult;
  219. } // OnAddServer
  220. LRESULT CLicMgrLeftView::OnAddKeyPack(WPARAM wParam, LPARAM lParam)
  221. {
  222. LRESULT lResult = 0;
  223. CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
  224. ASSERT(pDoc);
  225. if(NULL == pDoc)
  226. return lResult;
  227. CLicServer *pServer = (CLicServer*)wParam;
  228. ASSERT(pServer);
  229. if(NULL == pServer)
  230. return lResult;
  231. CKeyPack *pKeyPack = (CKeyPack*)lParam;
  232. ASSERT(pKeyPack);
  233. if(NULL == pKeyPack)
  234. return lResult;
  235. HTREEITEM hKeyPackItem = NULL;
  236. TV_ITEM Item;
  237. memset((void *)&Item,0,sizeof(Item));
  238. Item.mask = TVIF_HANDLE;
  239. HTREEITEM hServer = pServer->GetTreeItem();
  240. if(NULL == hServer)
  241. return lResult;
  242. Item.hItem = hServer;
  243. if(FALSE == GetTreeCtrl().GetItem(&Item))
  244. return lResult;
  245. if(Item.state & TVIS_EXPANDED)
  246. {
  247. CTreeNode *pNode = new CTreeNode(NODE_KEYPACK, pKeyPack);
  248. if(pNode)
  249. {
  250. hKeyPackItem = AddItemToTree(hServer, (LPCTSTR)pKeyPack->GetDisplayName(), hServer, 2, (LPARAM)pNode);
  251. if(!hKeyPackItem)
  252. delete pNode;
  253. }
  254. pKeyPack->SetTreeItem(hKeyPackItem);
  255. }
  256. return lResult;
  257. } // OnAddKeyPack
  258. LRESULT CLicMgrLeftView::OnAddAllServers(WPARAM wParam, LPARAM lParam)
  259. {
  260. LRESULT lResult = 0;
  261. HTREEITEM hItem = NULL;
  262. CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
  263. ASSERT(pDoc);
  264. if(NULL == pDoc)
  265. return lResult;
  266. CTreeNode* pNode = NULL;
  267. CAllServers *pAllServer = (CAllServers*)lParam;
  268. if(!pAllServer)
  269. goto cleanup ;
  270. hItem = pAllServer->GetTreeItem();
  271. if(NULL != hItem)
  272. goto cleanup;
  273. // Create a CTreeNode object with info about this tree node
  274. pNode = new CTreeNode(NODE_ALL_SERVERS, pAllServer);
  275. if(pNode)
  276. {
  277. HTREEITEM hAllServers = AddItemToTree(NULL, pAllServer->GetName(), TVI_SORT,0 , (LPARAM)pNode);
  278. if(!hAllServers) delete pNode;
  279. // The server wants to know his tree item handle
  280. pAllServer->SetTreeItem(hAllServers);
  281. //Set the Selection to this item
  282. GetTreeCtrl().SelectItem(hAllServers);
  283. }
  284. GetTreeCtrl().Expand(GetTreeCtrl().GetRootItem(), TVE_EXPAND);
  285. cleanup:
  286. return lResult ;
  287. } // OnAddAllServers
  288. void CLicMgrLeftView::AddServerKeyPacks(CLicServer *pServer)
  289. {
  290. CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
  291. ASSERT(pDoc);
  292. if(NULL == pDoc)
  293. return;
  294. POSITION pos;
  295. KeyPackList *pKeyPackList = NULL;
  296. HTREEITEM hLastNode = NULL;
  297. ASSERT(pServer);
  298. if(NULL == pServer)
  299. return;
  300. HTREEITEM hServer = pServer->GetTreeItem();
  301. if(NULL == hServer)
  302. goto cleanup; //Server Not in the Tree.
  303. hLastNode= hServer;
  304. // Get a pointer to the server's list of installed KeyPacks
  305. pKeyPackList = pServer->GetKeyPackList();
  306. // Iterate through the KeyPack list
  307. pos = pKeyPackList->GetHeadPosition();
  308. while(pos)
  309. {
  310. CKeyPack *pKeyPack = (CKeyPack *)pKeyPackList->GetNext(pos);
  311. CTreeNode *pNode = new CTreeNode(NODE_KEYPACK, pKeyPack);
  312. if(pNode)
  313. {
  314. hLastNode = AddItemToTree(hServer, (LPCTSTR)pKeyPack->GetDisplayName(), hLastNode, 2, (LPARAM)pNode);
  315. if(!hLastNode)
  316. delete pNode;
  317. }
  318. pKeyPack->SetTreeItem(hLastNode);
  319. }
  320. cleanup:
  321. return;
  322. } // end AddKeyPacks
  323. void CLicMgrLeftView::BuildImageList()
  324. {
  325. m_ImageList.Create(16, 16, TRUE, 18, 0);
  326. AddIconToImageList(IDI_ALL_SERVERS);
  327. AddIconToImageList(IDI_SERVER);
  328. AddIconToImageList(IDI_KEYPACK);
  329. AddIconToImageList(IDI_SERVERREG );
  330. AddIconToImageList(IDI_SERVERM );
  331. AddIconToImageList(IDI_SERVERX );
  332. AddIconToImageList(IDI_SERVERQ );
  333. GetTreeCtrl().SetImageList(&m_ImageList, TVSIL_NORMAL);
  334. } // end BuildImageList
  335. int CLicMgrLeftView::AddIconToImageList(int iconID)
  336. {
  337. HICON hIcon = ::LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(iconID));
  338. return m_ImageList.Add(hIcon);
  339. }
  340. void CLicMgrLeftView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
  341. {
  342. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  343. // TODO: Add your control notification handler code here
  344. //Check if the node selected is All-Servers,Server or the KeyPack.
  345. //Accordingly change the right pane view.
  346. CTreeCtrl& TreeCtrl = GetTreeCtrl();
  347. HTREEITEM hCurr = TreeCtrl.GetSelectedItem();
  348. if(NULL == hCurr)
  349. {
  350. return;
  351. }
  352. CTreeNode *pNode = (CTreeNode *)GetTreeCtrl().GetItemData(hCurr);
  353. if(NULL == pNode)
  354. {
  355. return;
  356. }
  357. CLicServer *pLicServer = NULL;
  358. CKeyPack * pKeyPack = NULL;
  359. CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
  360. ASSERT(pDoc);
  361. if(NULL == pDoc)
  362. return;
  363. switch(pNode->GetNodeType())
  364. {
  365. case NODE_ALL_SERVERS:
  366. AfxGetMainWnd()->SendMessage(WM_SEL_CHANGE,NODE_ALL_SERVERS,NULL);
  367. break;
  368. case NODE_SERVER:
  369. pLicServer = (CLicServer *)pNode->GetTreeObject();
  370. if(NULL == pLicServer)
  371. break;
  372. if(FALSE == pLicServer->IsExpanded())
  373. {
  374. SetCursor(LoadCursor(NULL,IDC_WAIT));
  375. HRESULT hResult = pDoc->EnumerateKeyPacks(pLicServer,LSKEYPACK_SEARCH_LANGID, TRUE);
  376. if(hResult != S_OK)
  377. {
  378. ((CMainFrame *)AfxGetMainWnd())->EnumFailed(hResult,pLicServer);
  379. if(pLicServer && pLicServer->GetTreeItem())
  380. {
  381. TreeCtrl.SelectItem(TreeCtrl.GetParentItem(pLicServer->GetTreeItem()));
  382. }
  383. break;
  384. }
  385. AddServerKeyPacks(pLicServer);
  386. }
  387. else
  388. {
  389. if(!pLicServer->GetKeyPackList()->IsEmpty())
  390. {
  391. if(!TreeCtrl.ItemHasChildren(hCurr))
  392. AddServerKeyPacks(pLicServer);
  393. }
  394. }
  395. AfxGetMainWnd()->SendMessage(WM_SEL_CHANGE,NODE_SERVER,(LPARAM)pLicServer);
  396. break;
  397. case NODE_KEYPACK:
  398. pKeyPack = (CKeyPack *)pNode->GetTreeObject();
  399. ASSERT(pKeyPack);
  400. if(NULL == pKeyPack)
  401. break;
  402. if(FALSE == pKeyPack->IsExpanded())
  403. {
  404. SetCursor(LoadCursor(NULL,IDC_WAIT));
  405. HRESULT hResult = pDoc->EnumerateLicenses(pKeyPack,LSLICENSE_SEARCH_KEYPACKID, TRUE);
  406. if(hResult != S_OK)
  407. {
  408. ((CMainFrame *)AfxGetMainWnd())->EnumFailed(hResult,pKeyPack->GetServer());
  409. if(pKeyPack && pKeyPack->GetTreeItem())
  410. {
  411. TreeCtrl.SelectItem(TreeCtrl.GetParentItem(pKeyPack->GetTreeItem()));
  412. }
  413. break;
  414. }
  415. }
  416. AfxGetMainWnd()->SendMessage(WM_SEL_CHANGE,NODE_KEYPACK,(LPARAM)pNode->GetTreeObject());
  417. break;
  418. }
  419. *pResult = 0;
  420. }
  421. void CLicMgrLeftView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
  422. {
  423. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  424. // TODO: Add your control notification handler code here
  425. *pResult = 0;
  426. }
  427. void CLicMgrLeftView::OnDestroy()
  428. {
  429. //Get the Root Item
  430. HTREEITEM hRoot = GetTreeCtrl().GetRootItem();
  431. if(!hRoot)
  432. return;
  433. HTREEITEM hServerItem = GetTreeCtrl().GetNextItem(hRoot,TVGN_CHILD);
  434. while(hServerItem)
  435. {
  436. // Get the data attached to the tree item
  437. CTreeNode *pServerNode = (CTreeNode*)GetTreeCtrl().GetItemData(hServerItem);
  438. if(pServerNode)
  439. {
  440. // Is this the server we want to add
  441. HTREEITEM hKeyPackItem = GetTreeCtrl().GetNextItem(hServerItem,TVGN_CHILD);
  442. while(hKeyPackItem)
  443. {
  444. CTreeNode *pKeyPackNode = (CTreeNode*)GetTreeCtrl().GetItemData(hKeyPackItem);
  445. if(pKeyPackNode)
  446. delete pKeyPackNode;
  447. hKeyPackItem = GetTreeCtrl().GetNextItem(hKeyPackItem,TVGN_NEXT);
  448. }
  449. delete pServerNode;
  450. }
  451. hServerItem = GetTreeCtrl().GetNextItem(hServerItem, TVGN_NEXT);
  452. }
  453. CTreeNode * pRootNode = (CTreeNode*)GetTreeCtrl().GetItemData(hRoot);
  454. if(pRootNode)
  455. delete pRootNode;
  456. return;
  457. }
  458. LRESULT CLicMgrLeftView::OnDeleteServer(WPARAM wParam, LPARAM lParam)
  459. {
  460. LRESULT lResult = 0;
  461. CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
  462. ASSERT(pDoc);
  463. if(NULL == pDoc)
  464. return lResult;
  465. CLicServer *pServer = (CLicServer*)lParam;
  466. ASSERT(pServer);
  467. if(NULL == pServer)
  468. return lResult;
  469. HTREEITEM hServer = pServer->GetTreeItem();
  470. DBGMSG( L"CLicMgrLeftView_OnDeleteServer GetTreeItem ret 0x%x\n" , hServer );
  471. if(hServer == NULL)
  472. return lResult;
  473. CTreeNode *pNode = (CTreeNode*)GetTreeCtrl().GetItemData(hServer);
  474. DBGMSG( L"CLicMgrLeftView_OnDeleteServer GetItemData ret 0x%x\n" , pNode );
  475. if(pNode)
  476. delete pNode;
  477. GetTreeCtrl().DeleteItem(hServer);
  478. return lResult;
  479. } // OnDeleteServer
  480. LRESULT CLicMgrLeftView::OnUpdateServer(WPARAM wParam, LPARAM lParam)
  481. {
  482. LRESULT lResult = 0;
  483. CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
  484. ASSERT(pDoc);
  485. if(NULL == pDoc)
  486. return lResult;
  487. BOOL bIsExpanded = FALSE;
  488. BOOL bIsSelected = FALSE;
  489. BOOL bIsChild = FALSE;
  490. HTREEITEM hSelectedItem = NULL;
  491. CKeyPack * pSelectedPack = NULL;
  492. CLicServer *pServer = (CLicServer*)lParam;
  493. ASSERT(pServer);
  494. if(NULL == pServer)
  495. return lResult;
  496. HTREEITEM hServer = pServer->GetTreeItem();
  497. if(hServer == NULL)
  498. return lResult;
  499. // check to see if we need to remove any keypacks
  500. // Get a pointer to the server's list of installed KeyPacks
  501. // Get the data attached to the tree item
  502. CTreeNode *pServerNode = (CTreeNode*)GetTreeCtrl().GetItemData(hServer);
  503. if( pServerNode != NULL )
  504. {
  505. HTREEITEM hKeyPackItem = GetTreeCtrl().GetNextItem(hServer,TVGN_CHILD);
  506. while( hKeyPackItem != NULL )
  507. {
  508. CTreeNode *pKeyPackNode = (CTreeNode*)GetTreeCtrl().GetItemData(hKeyPackItem);
  509. if( pKeyPackNode != NULL )
  510. {
  511. DBGMSG( L"CLicMgrLeftView!OnUpdateServer removing a licpak\n" , 0 );
  512. delete pKeyPackNode;
  513. }
  514. hKeyPackItem = GetTreeCtrl().GetNextItem(hKeyPackItem,TVGN_NEXT);
  515. }
  516. delete pServerNode;
  517. }
  518. TV_ITEM Item;
  519. memset((void *)&Item,0,sizeof(Item));
  520. Item.mask = TVIF_HANDLE | TVIF_STATE;
  521. Item.hItem = hServer;
  522. if(FALSE == GetTreeCtrl().GetItem(&Item))
  523. return lResult;
  524. if(Item.state & TVIS_EXPANDED)
  525. bIsExpanded = TRUE;
  526. if(Item.state & TVIS_SELECTED)
  527. bIsSelected = TRUE;
  528. else
  529. hSelectedItem = GetTreeCtrl().GetSelectedItem();
  530. if(hSelectedItem)
  531. {
  532. if(hServer == GetTreeCtrl().GetParentItem(hSelectedItem))
  533. {
  534. CString ProdDesc = GetTreeCtrl().GetItemText(hSelectedItem);
  535. KeyPackList * pkeyPackList = pServer->GetKeyPackList();
  536. POSITION pos = pkeyPackList->GetHeadPosition();
  537. while(pos)
  538. {
  539. CKeyPack * pKeyPack = (CKeyPack *)pkeyPackList->GetNext(pos);
  540. if(NULL == pKeyPack)
  541. {
  542. continue;
  543. }
  544. LSKeyPack sKeyPack = pKeyPack->GetKeyPackStruct();
  545. if(0 == ProdDesc.CompareNoCase(sKeyPack.szProductDesc))
  546. {
  547. pSelectedPack = pKeyPack;
  548. break;
  549. }
  550. }
  551. bIsChild = TRUE;
  552. }
  553. }
  554. GetTreeCtrl().DeleteItem(hServer);
  555. SendMessage(WM_ADD_SERVER,0,(LPARAM)pServer);
  556. AddServerKeyPacks(pServer);
  557. hServer = pServer->GetTreeItem();
  558. if(bIsExpanded)
  559. GetTreeCtrl().Expand(hServer, TVE_EXPAND);
  560. if(bIsSelected)
  561. GetTreeCtrl().SelectItem(hServer);
  562. else
  563. {
  564. //Not good, find an alternative for this....
  565. if(bIsChild)
  566. {
  567. if(pSelectedPack)
  568. GetTreeCtrl().SelectItem(pSelectedPack->GetTreeItem());
  569. else
  570. {
  571. hSelectedItem = GetTreeCtrl().GetChildItem(hServer);
  572. if(hSelectedItem)
  573. GetTreeCtrl().SelectItem(hSelectedItem);
  574. }
  575. }
  576. }
  577. return lResult;
  578. } // OnUpdateServer
  579. void CLicMgrLeftView::SetSelection(LPARAM lParam,NODETYPE NodeType)
  580. {
  581. if(NULL == lParam)
  582. return;
  583. HTREEITEM hItem = NULL;
  584. if(NODE_ALL_SERVERS == NodeType)
  585. hItem = ((CAllServers *)lParam)->GetTreeItem();
  586. else if(NODE_SERVER == NodeType)
  587. hItem = ((CLicServer *)lParam)->GetTreeItem();
  588. else if(NODE_KEYPACK == NodeType)
  589. hItem = ((CKeyPack *)lParam)->GetTreeItem();
  590. if(hItem)
  591. GetTreeCtrl().SelectItem(hItem);
  592. return;
  593. }
  594. void CLicMgrLeftView::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
  595. {
  596. LV_KEYDOWN* pLVKeyDown = (LV_KEYDOWN*)pNMHDR;
  597. // TODO: Add your control notification handler code here
  598. if(pLVKeyDown->wVKey == VK_TAB)
  599. {
  600. CMainFrame * pMainFrame = ((CMainFrame *)AfxGetMainWnd());
  601. pMainFrame->SelectView(LISTVIEW);
  602. }
  603. *pResult = 0;
  604. }
  605. //-----------------------------------------------------------------------------------------
  606. afx_msg void CLicMgrLeftView::OnLeftClick(NMHDR* pNMHDR, LRESULT* pResult)
  607. {
  608. CPoint pt;
  609. GetCursorPos( &pt );
  610. ScreenToClient( &pt );
  611. DBGMSG( L"LICMGR@CLicMgrLeftView::OnLeftClick\n" , 0 );
  612. HTREEITEM hTreeItem = GetTreeCtrl( ).GetSelectedItem( ); //GetTreeCtrl().HitTest( pt , &flag );
  613. if( hTreeItem != NULL )
  614. {
  615. CTreeNode *pNode = (CTreeNode *)GetTreeCtrl().GetItemData(hTreeItem);
  616. if(NULL == pNode)
  617. {
  618. return;
  619. }
  620. ClientToScreen( &pt );
  621. NODETYPE nt = pNode->GetNodeType();
  622. if(NODE_SERVER == nt )
  623. {
  624. DBGMSG( L"\tServer Node selected\n", 0 );
  625. SetActiveServer( static_cast< CLicServer * >( pNode->GetTreeObject() ) );
  626. }
  627. else if( nt == NODE_KEYPACK )
  628. {
  629. CKeyPack *pKeyPack = static_cast< CKeyPack *>( pNode->GetTreeObject() );
  630. if( pKeyPack != NULL )
  631. {
  632. SetActiveServer( pKeyPack->GetServer( ) );
  633. }
  634. }
  635. else
  636. {
  637. #ifdef DBG
  638. if( NODE_ALL_SERVERS == nt )
  639. {
  640. DBGMSG( L"\tAll servers selected\n" , 0 );
  641. }
  642. #endif
  643. SetActiveServer( NULL );
  644. }
  645. }
  646. else
  647. {
  648. DBGMSG( L"\tTreeview item returned NULL\n" , 0 );
  649. SetActiveServer( NULL );
  650. }
  651. }
  652. //-----------------------------------------------------------------------------------------
  653. afx_msg void CLicMgrLeftView::OnContextMenu( CWnd* pWnd, CPoint pt )
  654. {
  655. CMenu menu;
  656. CMenu *pContextmenu = NULL;
  657. DBGMSG( L"LICMGR@CLicMgrLeftView::OnContextMenu\n" , 0 );
  658. DBGMSG( L"\tpoint x = %d " , pt.x );
  659. DBGMSG( L"y = %d\n" , pt.y );
  660. UINT flag;
  661. HTREEITEM hTreeItem;
  662. CTreeCtrl& treectrl = GetTreeCtrl();
  663. // maybe keyboard selected this item
  664. if(pt.x == -1 && pt.y == -1)
  665. {
  666. hTreeItem = treectrl.GetSelectedItem( );
  667. if( hTreeItem != NULL )
  668. {
  669. RECT rect;
  670. treectrl.GetItemRect( hTreeItem , &rect , FALSE );
  671. pt.x = rect.left + (rect.right - rect.left)/2;
  672. pt.y = rect.top + (rect.bottom - rect.top)/2;
  673. }
  674. }
  675. else
  676. {
  677. // otherwise we're invoked by the mouse
  678. ScreenToClient( &pt );
  679. hTreeItem = treectrl.HitTest( pt , &flag );
  680. }
  681. if( hTreeItem != NULL )
  682. {
  683. CTreeNode *pNode = (CTreeNode *)GetTreeCtrl().GetItemData(hTreeItem);
  684. if(NULL == pNode)
  685. {
  686. return;
  687. }
  688. SetRightClickedItem( hTreeItem );
  689. ClientToScreen( &pt );
  690. // GetTreeCtrl().SelectItem( hTreeItem );
  691. NODETYPE nt = pNode->GetNodeType();
  692. if(NODE_SERVER == nt )
  693. {
  694. DBGMSG( L"\tServer Node selected\n", 0 );
  695. menu.LoadMenu( IDR_MENU_LPK );
  696. pContextmenu = menu.GetSubMenu( 0 );
  697. }
  698. else if( NODE_KEYPACK == nt )
  699. {
  700. DBGMSG( L"\tLicense pack selected\n" , 0 );
  701. menu.LoadMenu( IDR_MENU_LPK );
  702. pContextmenu = menu.GetSubMenu( 1 );
  703. }
  704. else if( NODE_ALL_SERVERS == nt )
  705. {
  706. DBGMSG( L"\tAll servers selected\n" , 0 );
  707. menu.LoadMenu( IDR_MENU_LPK );
  708. pContextmenu = menu.GetSubMenu( 3 );
  709. }
  710. else
  711. {
  712. DBGMSG( L"\tIn left pane no item selected\n" , 0 );
  713. return;
  714. }
  715. UI_initmenu( pContextmenu , nt );
  716. if( pContextmenu != NULL )
  717. {
  718. pContextmenu->TrackPopupMenu( TPM_LEFTALIGN , pt.x , pt.y , this );
  719. }
  720. }
  721. else
  722. {
  723. hTreeItem = GetTreeCtrl( ).GetSelectedItem( );
  724. SetRightClickedItem( hTreeItem );
  725. }
  726. }
  727. //-----------------------------------------------------------------------------------------
  728. afx_msg void CLicMgrLeftView::OnRightClick(NMHDR* pNMHDR, LRESULT* pResult)
  729. {
  730. CPoint pt;
  731. CMenu menu;
  732. CMenu *pContextmenu = NULL;
  733. GetCursorPos( &pt );
  734. OnContextMenu( NULL , pt );
  735. return;
  736. }
  737. //-----------------------------------------------------------------------------------------
  738. void CLicMgrLeftView::UI_initmenu( CMenu *pMenu , NODETYPE nt )
  739. {
  740. CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
  741. if( pMainFrame != NULL )
  742. {
  743. pMainFrame->UI_initmenu( pMenu , nt );
  744. }
  745. }
  746. //-----------------------------------------------------------------------------------------
  747. void CLicMgrLeftView::OnServerConnect( )
  748. {
  749. CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
  750. if( pMainFrame != NULL )
  751. {
  752. pMainFrame->ConnectServer( );
  753. }
  754. }
  755. //-----------------------------------------------------------------------------------------
  756. void CLicMgrLeftView::OnRefreshAllServers( )
  757. {
  758. CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
  759. if( pMainFrame != NULL )
  760. {
  761. pMainFrame->OnRefresh( );
  762. }
  763. }
  764. //-----------------------------------------------------------------------------------------
  765. void CLicMgrLeftView::OnRefreshServer( )
  766. {
  767. CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
  768. CLicServer *pServer = NULL;
  769. if( pMainFrame != NULL )
  770. {
  771. CTreeNode *pNode = (CTreeNode *)GetTreeCtrl().GetItemData( GetRightClickedItem() );
  772. if( pNode == NULL )
  773. {
  774. return;
  775. }
  776. if( pNode->GetNodeType() == NODE_SERVER )
  777. {
  778. pServer = static_cast< CLicServer * >( pNode->GetTreeObject() );
  779. }
  780. else if( pNode->GetNodeType() == NODE_KEYPACK )
  781. {
  782. CKeyPack *pKeyPack = static_cast< CKeyPack *>( pNode->GetTreeObject() );
  783. if( pKeyPack != NULL )
  784. {
  785. pServer = pKeyPack->GetServer( );
  786. }
  787. }
  788. if( pServer != NULL )
  789. {
  790. pMainFrame->RefreshServer( pServer );
  791. }
  792. }
  793. }
  794. //-----------------------------------------------------------------------------------------
  795. void CLicMgrLeftView::OnDownloadKeepPack()
  796. {
  797. BOOL bRefresh = FALSE;
  798. DWORD dwStatus = WizardActionOnServer( WIZACTION_DOWNLOADLKP , &bRefresh );
  799. //This call to RefreshServer causes problems because it tries to use
  800. //a pointer to the selected node on the right side. Of course, the
  801. //focus is on the left so there's nothing selected on the right...
  802. //if( bRefresh )
  803. //{
  804. // need to review this
  805. // OnRefreshServer( );
  806. //}
  807. DBGMSG( L"LICMGR : CLicMgrLeftView::OnDownloadKeepPack StartWizard returned 0x%x\n" , dwStatus );
  808. }
  809. //-----------------------------------------------------------------------------------------
  810. void CLicMgrLeftView::OnRegisterServer()
  811. {
  812. BOOL bRefresh;
  813. DWORD dwStatus = WizardActionOnServer( WIZACTION_REGISTERLS , &bRefresh );
  814. DBGMSG( L"LICMGR : CLicMgrLeftView::OnRegisterServer StartWizard returned 0x%x\n" , dwStatus );
  815. }
  816. //-----------------------------------------------------------------------------------------
  817. void CLicMgrLeftView::OnRepeatLastDownload()
  818. {
  819. BOOL bRefresh;
  820. DWORD dwStatus = WizardActionOnServer( WIZACTION_DOWNLOADLASTLKP , &bRefresh );
  821. DBGMSG( L"LICMGR : CLicMgrLeftView::OnRepeatLastDownload StartWizard returned 0x%x\n" , dwStatus );
  822. }
  823. //-----------------------------------------------------------------------------------------
  824. void CLicMgrLeftView::OnReactivateServer( )
  825. {
  826. BOOL bRefresh;
  827. DWORD dwStatus = WizardActionOnServer( WIZACTION_REREGISTERLS , &bRefresh );
  828. DBGMSG( L"LICMGR : CLicMgrLeftView::OnReactivateServer StartWizard returned 0x%x\n" , dwStatus );
  829. }
  830. //-----------------------------------------------------------------------------------------
  831. void CLicMgrLeftView::OnDeactivateServer( )
  832. {
  833. BOOL bRefresh;
  834. DWORD dwStatus = WizardActionOnServer( WIZACTION_UNREGISTERLS , &bRefresh );
  835. DBGMSG( L"LICMGR : CLicMgrLeftView::OnDeactivateServer StartWizard returned 0x%x\n" , dwStatus );
  836. }
  837. //-----------------------------------------------------------------------------------------
  838. void CLicMgrLeftView::OnServerProperties( )
  839. {
  840. BOOL bRefresh;
  841. DWORD dwStatus = WizardActionOnServer( WIZACTION_SHOWPROPERTIES , &bRefresh );
  842. DBGMSG( L"LICMGR : CLicMgrLeftView::OnServerProperties StartWizard returned 0x%x\n" , dwStatus );
  843. }
  844. //-----------------------------------------------------------------------------------------
  845. void CLicMgrLeftView::OnGeneralHelp( )
  846. {
  847. CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
  848. if( pMainFrame != NULL )
  849. {
  850. pMainFrame->OnHelp( );
  851. }
  852. }
  853. //-----------------------------------------------------------------------------------------
  854. DWORD CLicMgrLeftView::WizardActionOnServer( WIZACTION wa , PBOOL pbRefresh )
  855. {
  856. CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
  857. if( pMainFrame != NULL )
  858. {
  859. return pMainFrame->WizardActionOnServer( wa , pbRefresh , TREEVIEW );
  860. }
  861. return ERROR_INVALID_PARAMETER;
  862. }
  863. //-----------------------------------------------------------------------------------------
  864. void CLicMgrLeftView::SetActiveServer( CLicServer *pServer )
  865. {
  866. CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
  867. #ifdef DBG
  868. if( pServer != NULL )
  869. {
  870. DBGMSG( L"CLicMgrLeftView::SetActiveServer %s\n" , (LPCTSTR)pServer->GetName( ) );
  871. }
  872. #endif
  873. if( pMainFrame != NULL )
  874. {
  875. pMainFrame->SetActiveServer( pServer );
  876. }
  877. }
  878. //-----------------------------------------------------------------------------------------
  879. void CLicMgrLeftView::SetRightClickedItem( HTREEITEM ht )
  880. {
  881. m_ht = ht;
  882. CTreeNode *pNode = (CTreeNode *)GetTreeCtrl().GetItemData(ht);
  883. if(NULL == pNode)
  884. {
  885. SetActiveServer( NULL );
  886. return;
  887. }
  888. NODETYPE nt = pNode->GetNodeType();
  889. if(NODE_SERVER == nt )
  890. {
  891. SetActiveServer( static_cast< CLicServer * >( pNode->GetTreeObject() ) );
  892. }
  893. else if( nt == NODE_KEYPACK )
  894. {
  895. CKeyPack *pKeyPack = static_cast< CKeyPack *>( pNode->GetTreeObject() );
  896. if( pKeyPack != NULL )
  897. {
  898. SetActiveServer( pKeyPack->GetServer( ) );
  899. }
  900. }
  901. else
  902. {
  903. SetActiveServer( NULL );
  904. }
  905. }