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.

837 lines
24 KiB

  1. // LogAdvPg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "logui.h"
  5. //#include "wrapmb.h"
  6. #include <iiscnfg.h>
  7. //#include <metatool.h>
  8. //#include <shlwapi.h>
  9. #include "shlwapip.h"
  10. #include "tmschema.h"
  11. //#include "uxtheme.h"
  12. #include "uxthemep.h"
  13. #include "LogAdvPg.h"
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. extern HINSTANCE g_hInstance;
  20. #define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
  21. //
  22. // Possible Item States
  23. //
  24. #define TVIS_GCEMPTY 0
  25. #define TVIS_GCNOCHECK 1
  26. #define TVIS_GCCHECK 2
  27. #define TVIS_GCTRINOCHECK 3
  28. #define TVIS_GCTRICHECK 4
  29. #define STATEIMAGEMASKTOINDEX(i) ((i) >> 12)
  30. #define USE_NEW_CHECKBOXES_IN_WINXP
  31. static int CALLBACK LogUICompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  32. {
  33. // lParamSort contains a pointer to the tree control
  34. CLogAdvanced::PCONFIG_INFORMATION pCnfgInfo1 = (CLogAdvanced::PCONFIG_INFORMATION) lParam1;
  35. CLogAdvanced::PCONFIG_INFORMATION pCnfgInfo2 = (CLogAdvanced::PCONFIG_INFORMATION) lParam2;
  36. CTreeCtrl* pTreeCtrl = (CTreeCtrl*) lParamSort;
  37. if (pCnfgInfo1->iOrder < pCnfgInfo2->iOrder)
  38. return(-1);
  39. else if (pCnfgInfo1->iOrder > pCnfgInfo2->iOrder)
  40. return(1);
  41. else
  42. return(0);
  43. }
  44. /////////////////////////////////////////////////////////////////////////////
  45. // CLogAdvanced property page
  46. IMPLEMENT_DYNCREATE(CLogAdvanced, CPropertyPage)
  47. CLogAdvanced::CLogAdvanced() : CPropertyPage(CLogAdvanced::IDD)
  48. {
  49. //{{AFX_DATA_INIT(CLogAdvanced)
  50. // NOTE: the ClassWizard will add member initialization here
  51. //}}AFX_DATA_INIT
  52. m_mapLogUIOrder[1] = 1; // IDS_DATE
  53. m_mapLogUIOrder[2] = 2; // IDS_TIME
  54. m_mapLogUIOrder[3] = 3; // IDS_EXTENDED
  55. m_mapLogUIOrder[4] = 4; // IDS_PROCESS_ACCT
  56. m_mapLogUIOrder[5] = 1; // IDS_CLIENT
  57. m_mapLogUIOrder[6] = 2; // IDS_USER
  58. m_mapLogUIOrder[7] = 3; // IDS_SERVICE_NAME_T
  59. m_mapLogUIOrder[8] = 4; // IDS_SERVER_NAME_T
  60. m_mapLogUIOrder[9] = 5; // IDS_SERVER_IP
  61. m_mapLogUIOrder[10] = 6; // IDS_SERVER_PORT
  62. m_mapLogUIOrder[11] = 7; // IDS_METHOD
  63. m_mapLogUIOrder[12] = 8; // IDS_URI_STEM
  64. m_mapLogUIOrder[13] = 9; // IDS_URI_QUERY
  65. m_mapLogUIOrder[14] = 10; // IDS_PROTOCOL
  66. m_mapLogUIOrder[15] = 12; // IDS_WIN32
  67. m_mapLogUIOrder[16] = 13; // IDS_BYTES_SENT_T
  68. m_mapLogUIOrder[17] = 14; // IDS_BYTES_RECEIVED
  69. m_mapLogUIOrder[18] = 15; // IDS_TIME_TAKEN
  70. m_mapLogUIOrder[19] = 16; // IDS_PROTOCOL_VER
  71. m_mapLogUIOrder[20] = 17; // IDS_HOST
  72. m_mapLogUIOrder[21] = 18; // IDS_USER_AGENT
  73. m_mapLogUIOrder[22] = 19; // IDS_COOKIE_T
  74. m_mapLogUIOrder[23] = 20; // IDS_REFERER
  75. m_mapLogUIOrder[24] = 1; // IDS_PROCESS_EVENT
  76. m_mapLogUIOrder[25] = 2; // IDS_PROCESS_TYPE
  77. m_mapLogUIOrder[26] = 3; // IDS_TOTAL_USER_TIME
  78. m_mapLogUIOrder[27] = 4; // IDS_TOTAL_KERNEL_TIME
  79. m_mapLogUIOrder[28] = 5; // IDS_TOTAL_PAGE_FAULTS
  80. m_mapLogUIOrder[29] = 6; // IDS_TOTAL_PROCESSES
  81. m_mapLogUIOrder[30] = 7; // IDS_ACTIVE_PROCESSES
  82. m_mapLogUIOrder[31] = 8; // IDS_TOTAL_TERM_PROCS
  83. m_mapLogUIOrder[32] = 11; // IDS_PROTOCOL_SUB
  84. m_mapLogUIString[1] = IDS_DATE;
  85. m_mapLogUIString[2] = IDS_TIME;
  86. m_mapLogUIString[3] = IDS_EXTENDED;
  87. m_mapLogUIString[4] = IDS_PROCESS_ACCT;
  88. m_mapLogUIString[5] = IDS_CLIENT;
  89. m_mapLogUIString[6] = IDS_USER;
  90. m_mapLogUIString[7] = IDS_SERVICE_NAME_T;
  91. m_mapLogUIString[8] = IDS_SERVER_NAME_T;
  92. m_mapLogUIString[9] = IDS_SERVER_IP;
  93. m_mapLogUIString[10] = IDS_SERVER_PORT;
  94. m_mapLogUIString[11] = IDS_METHOD;
  95. m_mapLogUIString[12] = IDS_URI_STEM;
  96. m_mapLogUIString[13] = IDS_URI_QUERY;
  97. m_mapLogUIString[14] = IDS_PROTOCOL;
  98. m_mapLogUIString[15] = IDS_WIN32;
  99. m_mapLogUIString[16] = IDS_BYTES_SENT_T;
  100. m_mapLogUIString[17] = IDS_BYTES_RECEIVED;
  101. m_mapLogUIString[18] = IDS_TIME_TAKEN;
  102. m_mapLogUIString[19] = IDS_PROTOCOL_VER;
  103. m_mapLogUIString[20] = IDS_HOST;
  104. m_mapLogUIString[21] = IDS_USER_AGENT;
  105. m_mapLogUIString[22] = IDS_COOKIE_T;
  106. m_mapLogUIString[23] = IDS_REFERER;
  107. m_mapLogUIString[24] = IDS_PROCESS_EVENT;
  108. m_mapLogUIString[25] = IDS_PROCESS_TYPE;
  109. m_mapLogUIString[26] = IDS_TOTAL_USER_TIME;
  110. m_mapLogUIString[27] = IDS_TOTAL_KERNEL_TIME;
  111. m_mapLogUIString[28] = IDS_TOTAL_PAGE_FAULTS;
  112. m_mapLogUIString[29] = IDS_TOTAL_PROCESSES;
  113. m_mapLogUIString[30] = IDS_ACTIVE_PROCESSES;
  114. m_mapLogUIString[31] = IDS_TOTAL_TERM_PROCS;
  115. m_mapLogUIString[32] = IDS_PROTOCOL_SUB;
  116. }
  117. /////////////////////////////////////////////////////////////////////////////
  118. void CLogAdvanced::DoDataExchange(CDataExchange* pDX)
  119. {
  120. CPropertyPage::DoDataExchange(pDX);
  121. //{{AFX_DATA_MAP(CLogAdvanced)
  122. DDX_Control(pDX, IDC_PROP_TREE, m_wndTreeCtrl);
  123. //}}AFX_DATA_MAP
  124. }
  125. /////////////////////////////////////////////////////////////////////////////
  126. BEGIN_MESSAGE_MAP(CLogAdvanced, CPropertyPage)
  127. //{{AFX_MSG_MAP(CLogAdvanced)
  128. ON_NOTIFY(NM_CLICK, IDC_PROP_TREE, OnClickTree)
  129. ON_NOTIFY(TVN_KEYDOWN, IDC_PROP_TREE, OnKeydownTree)
  130. ON_WM_DESTROY()
  131. ON_MESSAGE(WM_THEMECHANGED, OnThemeChanged)
  132. ON_MESSAGE(WM_DISPLAYCHANGE, OnThemeChanged)
  133. ON_MESSAGE(WM_PALETTECHANGED, OnThemeChanged)
  134. ON_MESSAGE(WM_SYSCOLORCHANGE, OnThemeChanged)
  135. //}}AFX_MSG_MAP
  136. ON_COMMAND(ID_HELP_FINDER, DoHelp)
  137. ON_COMMAND(ID_HELP, DoHelp)
  138. ON_COMMAND(ID_CONTEXT_HELP, DoHelp)
  139. ON_COMMAND(ID_DEFAULT_HELP, DoHelp)
  140. END_MESSAGE_MAP()
  141. /////////////////////////////////////////////////////////////////////////////
  142. // CLogAdvanced message handlers
  143. LRESULT CLogAdvanced::OnThemeChanged(WPARAM wParam, LPARAM lParam)
  144. {
  145. HandleThemes();
  146. InvalidateRect(0, TRUE);
  147. return TRUE;
  148. }
  149. HBITMAP CreateDIB(HDC h, int cx, int cy, RGBQUAD** pprgb)
  150. {
  151. BITMAPINFO bi = {0};
  152. bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
  153. bi.bmiHeader.biWidth = cx;
  154. bi.bmiHeader.biHeight = cy;
  155. bi.bmiHeader.biPlanes = 1;
  156. bi.bmiHeader.biBitCount = 32;
  157. bi.bmiHeader.biCompression = BI_RGB;
  158. return CreateDIBSection(h, &bi, DIB_RGB_COLORS, (void**)pprgb, NULL, 0);
  159. }
  160. #define BITMAP_WIDTH 16
  161. #define BITMAP_HEIGHT 16
  162. #define NUM_BITMAPS 5
  163. void CLogAdvanced::HandleThemes(void)
  164. {
  165. UINT flags = ILC_MASK | (IsOS(OS_WHISTLERORGREATER)?ILC_COLOR32:ILC_COLOR);
  166. HBITMAP hBitmap = 0;
  167. #ifndef USE_NEW_CHECKBOXES_IN_WINXP
  168. // Old code before WinXP themes...
  169. HIMAGELIST hImage = ImageList_LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_CHECKBOX), 16, 5, RGB(255,0,0), IMAGE_BITMAP, LR_DEFAULTCOLOR);
  170. #else
  171. // WinXP themes
  172. /*
  173. if(IS_WINDOW_RTL_MIRRORED(m_wndTreeCtrl.m_hWnd))
  174. {
  175. flags |= ILC_MIRROR;
  176. }
  177. */
  178. SHSetWindowBits(m_wndTreeCtrl.m_hWnd, GWL_STYLE, TVS_CHECKBOXES, 0);
  179. HIMAGELIST hImage = ImageList_Create(BITMAP_WIDTH, BITMAP_HEIGHT, flags, NUM_BITMAPS, 5);
  180. if (hImage)
  181. {
  182. HTHEME hTheme = OpenThemeData(NULL, L"Button");
  183. if (hTheme)
  184. {
  185. HDC hdc = CreateCompatibleDC(NULL);
  186. if (hdc)
  187. {
  188. HBITMAP hbmp = CreateDIB(hdc, BITMAP_WIDTH, BITMAP_HEIGHT, NULL);
  189. if (hbmp)
  190. {
  191. RECT rc = {0, 0, BITMAP_WIDTH, BITMAP_HEIGHT};
  192. static const s_rgParts[] = {BP_CHECKBOX,BP_CHECKBOX,BP_CHECKBOX,BP_CHECKBOX,BP_CHECKBOX};
  193. static const s_rgStates[] = {CBS_CHECKEDNORMAL,CBS_UNCHECKEDNORMAL,CBS_CHECKEDNORMAL,CBS_UNCHECKEDDISABLED,CBS_CHECKEDDISABLED};
  194. for (int i = 0; i < ARRAYSIZE(s_rgParts); i++)
  195. {
  196. HBITMAP hOld = (HBITMAP)SelectObject(hdc, hbmp);
  197. SHFillRectClr(hdc, &rc, RGB(0,0,0));
  198. DTBGOPTS dtbg = {sizeof(DTBGOPTS), DTBG_DRAWSOLID, 0,}; // tell drawthemebackground to preserve the alpha channel
  199. DrawThemeBackgroundEx(hTheme, hdc, s_rgParts[i], s_rgStates[i], &rc, &dtbg);
  200. SelectObject(hdc, hOld);
  201. ImageList_Add(hImage, hbmp, NULL);
  202. }
  203. DeleteObject(hbmp);
  204. }
  205. DeleteDC(hdc);
  206. }
  207. CloseThemeData(hTheme);
  208. }
  209. else
  210. {
  211. if (hImage)
  212. {
  213. ImageList_Destroy(hImage);
  214. hImage = NULL;
  215. }
  216. hImage = ImageList_LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_CHECKBOX), 16, 5, RGB(255,0,0), IMAGE_BITMAP, LR_DEFAULTCOLOR);
  217. }
  218. }
  219. #endif
  220. if (hImage != NULL)
  221. {
  222. m_wndTreeCtrl.SetImageList(CImageList::FromHandle(hImage), TVSIL_STATE);
  223. }
  224. return;
  225. }
  226. BOOL CLogAdvanced::OnInitDialog()
  227. {
  228. CPropertyPage::OnInitDialog();
  229. HandleThemes();
  230. CreateTreeFromMB();
  231. ProcessProperties(false);
  232. //
  233. // set up the modified property list array
  234. //
  235. m_fTreeModified = false;
  236. m_cModifiedProperties = 0;
  237. int cProperties = m_wndTreeCtrl.GetCount();
  238. m_pModifiedPropIDs[0] = new DWORD[cProperties];
  239. m_pModifiedPropIDs[1] = new DWORD[cProperties];
  240. SetModified(FALSE);
  241. return TRUE;
  242. }
  243. /////////////////////////////////////////////////////////////////////////////
  244. void CLogAdvanced::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult)
  245. {
  246. DWORD dwpos;
  247. TV_HITTESTINFO tvhti;
  248. HTREEITEM htiItemClicked;
  249. POINT point;
  250. //
  251. // Find out where the cursor was
  252. //
  253. dwpos = GetMessagePos();
  254. point.x = LOWORD(dwpos);
  255. point.y = HIWORD(dwpos);
  256. ::MapWindowPoints(HWND_DESKTOP, m_wndTreeCtrl.m_hWnd, &point, 1);
  257. tvhti.pt = point;
  258. htiItemClicked = m_wndTreeCtrl.HitTest(&tvhti);
  259. //
  260. // If the state image was clicked, lets get the state from the item and toggle it.
  261. //
  262. if (tvhti.flags & TVHT_ONITEMSTATEICON)
  263. {
  264. ProcessClick(htiItemClicked);
  265. }
  266. *pResult = 0;
  267. }
  268. /////////////////////////////////////////////////////////////////////////////
  269. void CLogAdvanced::OnKeydownTree(NMHDR* pNMHDR, LRESULT* pResult)
  270. {
  271. TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
  272. if (VK_SPACE != pTVKeyDown->wVKey)
  273. {
  274. // User didn't press the space key. Continue default action
  275. *pResult = 0;
  276. return;
  277. }
  278. ProcessClick(m_wndTreeCtrl.GetSelectedItem());
  279. //
  280. // Stop any more processing
  281. //
  282. *pResult = 1;
  283. }
  284. /////////////////////////////////////////////////////////////////////////////
  285. void CLogAdvanced::ProcessClick(HTREEITEM htiItemClicked)
  286. {
  287. TV_ITEM tvi;
  288. UINT state;
  289. HTREEITEM htiChild;
  290. PCONFIG_INFORMATION pCnfg;
  291. if (htiItemClicked)
  292. {
  293. //
  294. // Flip the state of the clicked item if the item is enabled
  295. //
  296. tvi.hItem = htiItemClicked;
  297. tvi.mask = TVIF_STATE;
  298. tvi.stateMask = TVIS_STATEIMAGEMASK;
  299. m_wndTreeCtrl.GetItem(&tvi);
  300. state = STATEIMAGEMASKTOINDEX(tvi.state);
  301. pCnfg = (PCONFIG_INFORMATION)(tvi.lParam);
  302. htiChild = m_wndTreeCtrl.GetNextItem(htiItemClicked, TVGN_CHILD);
  303. if ( TVIS_GCNOCHECK == state )
  304. {
  305. tvi.state = INDEXTOSTATEIMAGEMASK (TVIS_GCCHECK) ;
  306. pCnfg->fItemModified = true;
  307. m_wndTreeCtrl.SetItem(&tvi);
  308. m_fTreeModified = true;
  309. SetModified();
  310. // Reset properties for child nodes
  311. if (htiChild)
  312. {
  313. SetSubTreeProperties(NULL, htiChild, TRUE, FALSE);
  314. }
  315. }
  316. else if ( TVIS_GCCHECK == state )
  317. {
  318. tvi.state = INDEXTOSTATEIMAGEMASK (TVIS_GCNOCHECK) ;
  319. pCnfg->fItemModified = true;
  320. m_wndTreeCtrl.SetItem(&tvi);
  321. m_fTreeModified = true;
  322. SetModified();
  323. // Reset properties for child nodes
  324. if (htiChild)
  325. {
  326. SetSubTreeProperties(NULL, htiChild, FALSE, FALSE);
  327. }
  328. }
  329. }
  330. }
  331. /////////////////////////////////////////////////////////////////////////////
  332. void CLogAdvanced::ProcessProperties(bool fSave)
  333. {
  334. HTREEITEM hRoot;
  335. if ( NULL != (hRoot = m_wndTreeCtrl.GetRootItem()))
  336. {
  337. CString csTempPassword;
  338. m_szPassword.CopyTo(csTempPassword);
  339. CComAuthInfo auth(m_szServer, m_szUserName, csTempPassword);
  340. CMetaKey mk(&auth, m_szMeta, METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE);
  341. if (fSave && m_fTreeModified)
  342. {
  343. SaveSubTreeProperties(mk, hRoot);
  344. for (int i = 0; i < m_cModifiedProperties; i++)
  345. {
  346. mk.SetValue(m_pModifiedPropIDs[0][i], m_pModifiedPropIDs[1][i]);
  347. }
  348. m_fTreeModified = false;
  349. }
  350. else
  351. {
  352. SetSubTreeProperties(&mk, hRoot, TRUE, TRUE);
  353. }
  354. }
  355. }
  356. /////////////////////////////////////////////////////////////////////////////
  357. void CLogAdvanced::SetSubTreeProperties(
  358. CMetaKey * mk,
  359. HTREEITEM hTreeRoot,
  360. BOOL fParentState,
  361. BOOL fInitialize
  362. )
  363. {
  364. HTREEITEM hTreeChild, hTreeSibling;
  365. PCONFIG_INFORMATION pCnfg;
  366. UINT iState;
  367. DWORD dwProperty = 0;
  368. if (NULL == hTreeRoot)
  369. {
  370. return;
  371. }
  372. pCnfg = (PCONFIG_INFORMATION)(m_wndTreeCtrl.GetItemData(hTreeRoot));
  373. if (NULL != pCnfg)
  374. {
  375. if (fInitialize)
  376. {
  377. if (pCnfg->dwPropertyID != 0)
  378. {
  379. mk->QueryValue(pCnfg->dwPropertyID, dwProperty);
  380. dwProperty &= pCnfg->dwPropertyMask;
  381. }
  382. }
  383. else
  384. {
  385. //
  386. // we are not initializing, so use the value from the tree
  387. //
  388. iState = STATEIMAGEMASKTOINDEX(m_wndTreeCtrl.GetItemState(hTreeRoot, TVIS_STATEIMAGEMASK));
  389. dwProperty = (TVIS_GCCHECK == iState || TVIS_GCTRICHECK == iState);
  390. }
  391. if (pCnfg->dwPropertyID != 0)
  392. {
  393. //
  394. // Choose the new state depending on parent state
  395. //
  396. if (fParentState)
  397. {
  398. iState = ( 0 == dwProperty) ? INDEXTOSTATEIMAGEMASK(TVIS_GCNOCHECK) :
  399. INDEXTOSTATEIMAGEMASK(TVIS_GCCHECK);
  400. }
  401. else
  402. {
  403. iState = ( 0 == dwProperty) ? INDEXTOSTATEIMAGEMASK(TVIS_GCTRINOCHECK) :
  404. INDEXTOSTATEIMAGEMASK(TVIS_GCTRICHECK);
  405. }
  406. }
  407. else
  408. {
  409. dwProperty = TRUE;
  410. iState = TVIS_GCEMPTY;
  411. }
  412. m_wndTreeCtrl.SetItemState(hTreeRoot, iState, TVIS_STATEIMAGEMASK);
  413. }
  414. else
  415. {
  416. //
  417. // Tree node with no checkbox (hence no config info)
  418. //
  419. dwProperty = TRUE;
  420. m_wndTreeCtrl.SetItemState(hTreeRoot, INDEXTOSTATEIMAGEMASK(TVIS_GCEMPTY), TVIS_STATEIMAGEMASK);
  421. }
  422. //
  423. // Recurse through children and siblings
  424. //
  425. if ( NULL != (hTreeChild = m_wndTreeCtrl.GetNextItem(hTreeRoot, TVGN_CHILD)))
  426. {
  427. SetSubTreeProperties(mk, hTreeChild, dwProperty && fParentState, fInitialize);
  428. }
  429. if ( NULL != (hTreeSibling = m_wndTreeCtrl.GetNextItem(hTreeRoot, TVGN_NEXT)))
  430. {
  431. SetSubTreeProperties(mk, hTreeSibling, fParentState, fInitialize);
  432. }
  433. }
  434. /////////////////////////////////////////////////////////////////////////////
  435. void CLogAdvanced::SaveSubTreeProperties(CMetaKey& mk, HTREEITEM hTreeRoot)
  436. {
  437. HTREEITEM hTreeChild, hTreeSibling;
  438. PCONFIG_INFORMATION pCnfg;
  439. if (NULL != hTreeRoot)
  440. {
  441. pCnfg = (PCONFIG_INFORMATION)(m_wndTreeCtrl.GetItemData(hTreeRoot));
  442. if (NULL != pCnfg && pCnfg->fItemModified)
  443. {
  444. UINT NewState
  445. = STATEIMAGEMASKTOINDEX(m_wndTreeCtrl.GetItemState(hTreeRoot, TVIS_STATEIMAGEMASK));
  446. if (TVIS_GCNOCHECK <= NewState && TVIS_GCTRICHECK >= NewState)
  447. {
  448. if (pCnfg->dwPropertyID != 0)
  449. {
  450. //
  451. // Get the property, reset the bit mask & write it back
  452. //
  453. DWORD dwProperty = 0;
  454. if (!GetModifiedFieldFromArray(pCnfg->dwPropertyID, &dwProperty))
  455. {
  456. mk.QueryValue(pCnfg->dwPropertyID, dwProperty);
  457. }
  458. dwProperty &= ~(pCnfg->dwPropertyMask);
  459. if ((TVIS_GCCHECK == NewState) || (TVIS_GCTRICHECK == NewState))
  460. {
  461. dwProperty |= pCnfg->dwPropertyMask;
  462. }
  463. //mk.SetValue(pCnfg->dwPropertyID, dwProperty);
  464. // mbWrap.SetDword(_T(""), pCnfg->dwPropertyID, IIS_MD_UT_SERVER, dwProperty);
  465. InsertModifiedFieldInArray(pCnfg->dwPropertyID, dwProperty);
  466. }
  467. }
  468. }
  469. //
  470. // Recurse through children and siblings
  471. //
  472. if ( NULL != (hTreeChild = m_wndTreeCtrl.GetNextItem(hTreeRoot, TVGN_CHILD)))
  473. {
  474. SaveSubTreeProperties(mk, hTreeChild);
  475. }
  476. if( NULL != (hTreeSibling = m_wndTreeCtrl.GetNextItem(hTreeRoot, TVGN_NEXT)))
  477. {
  478. SaveSubTreeProperties(mk, hTreeSibling);
  479. }
  480. }
  481. }
  482. /////////////////////////////////////////////////////////////////////////////
  483. void CLogAdvanced::DeleteSubTreeConfig(HTREEITEM hTreeRoot)
  484. {
  485. HTREEITEM hTreeChild, hTreeSibling;
  486. PCONFIG_INFORMATION pCnfg;
  487. if (NULL == hTreeRoot)
  488. {
  489. return;
  490. }
  491. if ( NULL != (hTreeChild = m_wndTreeCtrl.GetNextItem(hTreeRoot, TVGN_CHILD)))
  492. {
  493. DeleteSubTreeConfig(hTreeChild);
  494. }
  495. if ( NULL != (hTreeSibling = m_wndTreeCtrl.GetNextItem(hTreeRoot, TVGN_NEXT)))
  496. {
  497. DeleteSubTreeConfig(hTreeSibling);
  498. }
  499. pCnfg = (PCONFIG_INFORMATION)(m_wndTreeCtrl.GetItemData(hTreeRoot));
  500. if (pCnfg)
  501. {
  502. delete pCnfg;
  503. }
  504. }
  505. /////////////////////////////////////////////////////////////////////////////
  506. void CLogAdvanced::CreateTreeFromMB()
  507. {
  508. TCHAR szLoggingUIPath[] = _T("/LM/Logging/Custom Logging");
  509. CString csTempPassword;
  510. m_szPassword.CopyTo(csTempPassword);
  511. CComAuthInfo auth(m_szServer, m_szUserName, csTempPassword);
  512. CMetaKey mk(&auth, szLoggingUIPath, METADATA_PERMISSION_READ);
  513. if (mk.Succeeded())
  514. {
  515. CreateSubTree(mk, _T(""), NULL);
  516. }
  517. m_wndTreeCtrl.EnsureVisible(m_wndTreeCtrl.GetRootItem());
  518. }
  519. /////////////////////////////////////////////////////////////////////////////
  520. void CLogAdvanced::CreateSubTree(CMetaKey& mk, LPCTSTR szPath, HTREEITEM hTreeRoot)
  521. {
  522. CString child;
  523. TCHAR szDisplayName[256];
  524. TV_ITEM tvi;
  525. TV_INSERTSTRUCT tvins;
  526. HTREEITEM hChild = NULL;
  527. PCONFIG_INFORMATION pCnfgInfo;
  528. // Prepare the item for insertion
  529. tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_STATE;
  530. tvi.state = INDEXTOSTATEIMAGEMASK(TVIS_GCEMPTY) ;
  531. tvi.stateMask = TVIS_STATEIMAGEMASK;
  532. tvins.hParent = hTreeRoot;
  533. tvins.hInsertAfter = TVI_LAST;
  534. int count = 0;
  535. CMetaEnumerator en(FALSE, &mk);
  536. while (SUCCEEDED(en.Next(child, szPath)))
  537. {
  538. DWORD dwPropertyID, dwPropertyMask;
  539. DWORD dwNodeID = 0;
  540. CStringListEx list;
  541. CMetabasePath path(FALSE, szPath, child);
  542. if (SUCCEEDED(en.QueryValue(MD_LOGCUSTOM_SERVICES_STRING, list, NULL, path)))
  543. {
  544. BOOL bFound = FALSE;
  545. POSITION pos = list.GetHeadPosition();
  546. while (pos != NULL)
  547. {
  548. if (list.GetNext(pos).CompareNoCase(m_szServiceName) == 0)
  549. {
  550. bFound = TRUE;
  551. break;
  552. }
  553. }
  554. if (!bFound)
  555. {
  556. continue;
  557. }
  558. }
  559. pCnfgInfo = new CONFIG_INFORMATION;
  560. if (pCnfgInfo == NULL)
  561. {
  562. break;
  563. }
  564. if ( SUCCEEDED(en.QueryValue(MD_LOGCUSTOM_PROPERTY_ID, dwPropertyID, NULL, path))
  565. && SUCCEEDED(en.QueryValue(MD_LOGCUSTOM_PROPERTY_MASK, dwPropertyMask, NULL, path))
  566. )
  567. {
  568. pCnfgInfo->dwPropertyID = dwPropertyID;
  569. pCnfgInfo->dwPropertyMask = dwPropertyMask;
  570. }
  571. else
  572. {
  573. pCnfgInfo->dwPropertyID = 0;
  574. pCnfgInfo->dwPropertyMask = 0;
  575. }
  576. if (FAILED(en.QueryValue(MD_LOGCUSTOM_PROPERTY_NODE_ID, dwNodeID, NULL, path)))
  577. {
  578. dwNodeID = 0;
  579. }
  580. pCnfgInfo->fItemModified = false;
  581. if (dwNodeID)
  582. {
  583. ::LoadString(
  584. (HINSTANCE)GetWindowLongPtr(m_wndTreeCtrl, GWLP_HINSTANCE), m_mapLogUIString[dwNodeID],
  585. szDisplayName, 256);
  586. tvi.pszText = szDisplayName;
  587. pCnfgInfo->iOrder = m_mapLogUIOrder[dwNodeID];
  588. }
  589. else
  590. {
  591. tvi.pszText = StrDup(child);
  592. pCnfgInfo->iOrder = 0;
  593. }
  594. tvi.lParam = (LPARAM)pCnfgInfo;
  595. tvins.item = tvi;
  596. hChild = m_wndTreeCtrl.InsertItem((LPTV_INSERTSTRUCT) &tvins);
  597. //
  598. // Enumerate children
  599. //
  600. CreateSubTree(mk, (LPCTSTR)path, hChild);
  601. count++;
  602. }
  603. if (0 != count)
  604. {
  605. m_wndTreeCtrl.Expand(hTreeRoot, TVE_EXPAND);
  606. }
  607. // Now sort the tree from subtree root down
  608. TVSORTCB tvs;
  609. tvs.hParent = hTreeRoot;
  610. tvs.lpfnCompare = LogUICompareProc;
  611. tvs.lParam = (LPARAM) &m_wndTreeCtrl;
  612. m_wndTreeCtrl.SortChildrenCB(&tvs);
  613. }
  614. /////////////////////////////////////////////////////////////////////////////
  615. bool CLogAdvanced::IsPresentServiceSupported(LPTSTR szSupportedServices)
  616. {
  617. while ( szSupportedServices[0] != 0)
  618. {
  619. if ( 0 == lstrcmpi(m_szServiceName, szSupportedServices) )
  620. {
  621. return true;
  622. }
  623. szSupportedServices += lstrlen(szSupportedServices)+1;
  624. }
  625. return false;
  626. }
  627. /////////////////////////////////////////////////////////////////////////////
  628. BOOL CLogAdvanced::OnApply()
  629. {
  630. ProcessProperties(true);
  631. return CPropertyPage::OnApply();
  632. }
  633. /////////////////////////////////////////////////////////////////////////////
  634. void CLogAdvanced::DoHelp()
  635. {
  636. DebugTraceHelp(HIDD_LOGUI_EXTENDED);
  637. WinHelp( HIDD_LOGUI_EXTENDED );
  638. }
  639. /////////////////////////////////////////////////////////////////////////////
  640. void CLogAdvanced::InsertModifiedFieldInArray(DWORD dwPropID, DWORD dwPropValue)
  641. {
  642. int index;
  643. bool fFound = false;
  644. if (m_pModifiedPropIDs[0])
  645. {
  646. //
  647. // Search if this property ID pre-exists in the array
  648. //
  649. for(index = 0; index < m_cModifiedProperties; index++)
  650. {
  651. if (dwPropID == m_pModifiedPropIDs[0][index])
  652. {
  653. fFound = true;
  654. break;
  655. }
  656. }
  657. if (fFound)
  658. {
  659. m_pModifiedPropIDs[1][index] = dwPropValue;
  660. }
  661. else
  662. {
  663. m_pModifiedPropIDs[0][m_cModifiedProperties] = dwPropID;
  664. m_pModifiedPropIDs[1][m_cModifiedProperties]= dwPropValue;
  665. m_cModifiedProperties++;
  666. }
  667. }
  668. }
  669. /////////////////////////////////////////////////////////////////////////////
  670. bool CLogAdvanced::GetModifiedFieldFromArray(DWORD dwPropID, DWORD * pdwPropValue)
  671. {
  672. int index;
  673. bool fFound = false;
  674. if (m_pModifiedPropIDs[0])
  675. {
  676. //
  677. // Search if this property ID pre-exists in the array
  678. //
  679. for(index = 0; index < m_cModifiedProperties; index++)
  680. {
  681. if (dwPropID == m_pModifiedPropIDs[0][index])
  682. {
  683. fFound = true;
  684. break;
  685. }
  686. }
  687. if (fFound)
  688. {
  689. *pdwPropValue = m_pModifiedPropIDs[1][index];
  690. }
  691. }
  692. return fFound;
  693. }
  694. /////////////////////////////////////////////////////////////////////////////
  695. void CLogAdvanced::OnDestroy()
  696. {
  697. CPropertyPage::OnDestroy();
  698. //
  699. // Delete all the CONFIG_INFORMATION structures
  700. //
  701. CImageList * pImage = m_wndTreeCtrl.SetImageList(CImageList::FromHandle(NULL), TVSIL_STATE);
  702. if (pImage != NULL && pImage->m_hImageList != NULL)
  703. {
  704. ImageList_Destroy(pImage->m_hImageList);
  705. }
  706. DeleteSubTreeConfig(m_wndTreeCtrl.GetRootItem());
  707. delete [] m_pModifiedPropIDs[0];
  708. delete [] m_pModifiedPropIDs[1];
  709. }
  710. /////////////////////////////////////////////////////////////////////////////