Source code of Windows XP (NT5)
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.

312 lines
7.2 KiB

  1. /*++
  2. Copyright (c) 1996 Microsoft Corporation
  3. Module Name:
  4. NWLim.cpp : implementation file
  5. CPropertyPage support for User mgmt wizard
  6. File History:
  7. JonY Apr-96 created
  8. --*/
  9. #include "stdafx.h"
  10. #include "speckle.h"
  11. #include "NWLim.h"
  12. #include "NWWKS.h"
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. class WKSMember
  19. {
  20. public:
  21. CString csWKSAddress;
  22. CString csWKSNode;
  23. };
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CNWLimitLogon dialog
  26. IMPLEMENT_DYNCREATE(CNWLimitLogon, CPropertyPage)
  27. CNWLimitLogon::CNWLimitLogon() : CPropertyPage(CNWLimitLogon::IDD)
  28. {
  29. //{{AFX_DATA_INIT(CNWLimitLogon)
  30. m_nWorkstationRadio = 0;
  31. m_csCaption = _T("");
  32. //}}AFX_DATA_INIT
  33. }
  34. void CNWLimitLogon::DoDataExchange(CDataExchange* pDX)
  35. {
  36. CDialog::DoDataExchange(pDX);
  37. //{{AFX_DATA_MAP(CNWLimitLogon)
  38. DDX_Control(pDX, IDC_NWLOGON_LIST, m_lbWksList);
  39. DDX_Radio(pDX, IDC_WORKSTATION_RADIO, m_nWorkstationRadio);
  40. DDX_Text(pDX, IDC_STATIC1, m_csCaption);
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CNWLimitLogon, CPropertyPage)
  44. //{{AFX_MSG_MAP(CNWLimitLogon)
  45. ON_BN_CLICKED(IDC_ADD_BUTTON, OnAddButton)
  46. ON_BN_CLICKED(IDC_REMOVE_BUTTON, OnRemoveButton)
  47. ON_BN_CLICKED(IDC_WORKSTATION_RADIO, OnWorkstationRadio)
  48. ON_BN_CLICKED(IDC_WORKSTATION_RADIO2, OnWorkstationRadio2)
  49. ON_WM_SHOWWINDOW()
  50. //}}AFX_MSG_MAP
  51. END_MESSAGE_MAP()
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CNWLimitLogon message handlers
  54. LRESULT CNWLimitLogon::OnWizardNext()
  55. {
  56. UpdateData(TRUE);
  57. if ((m_nWorkstationRadio == 1) && (m_lbWksList.GetCount() == 0))
  58. {
  59. AfxMessageBox(IDS_NEEDA_WORKSTATION);
  60. return -1;
  61. }
  62. CSpeckleApp* pApp = (CSpeckleApp*)AfxGetApp();
  63. USHORT sCount = 0;
  64. BOOL bMatch = FALSE;
  65. pApp->m_csAllowedLoginFrom = L"";
  66. while (sCount < m_lbWksList.GetCount())
  67. {
  68. WKSMember* pMem = (WKSMember*)m_lbWksList.GetItemData(sCount);
  69. CString csTemp;
  70. if (pMem->csWKSNode == L"0000000000-1") csTemp.Format(L"%s%s", pMem->csWKSAddress, L"ffffffffffff");
  71. else csTemp.Format(L"%s%s", pMem->csWKSAddress, pMem->csWKSNode);
  72. pApp->m_csAllowedLoginFrom += csTemp;
  73. sCount++;
  74. }
  75. if (m_lbWksList.GetCount() > 0) pApp->m_csAllowedLoginFrom += L"00";
  76. return IDD_FINISH;
  77. }
  78. LRESULT CNWLimitLogon::OnWizardBack()
  79. {
  80. CSpeckleApp* pApp = (CSpeckleApp*)AfxGetApp();
  81. if (pApp->m_bWorkstation) return IDD_LOGONTO_DLG;
  82. else if (pApp->m_bHours) return IDD_HOURS_DLG;
  83. else if (pApp->m_bExpiration) return IDD_ACCOUNT_EXP_DIALOG;
  84. else return IDD_RESTRICTIONS_DIALOG;
  85. }
  86. void CNWLimitLogon::OnAddButton()
  87. {
  88. CAddNWWKS add;
  89. if (add.DoModal() == 1)
  90. {
  91. // check for uniqueness
  92. USHORT sCount = 0;
  93. BOOL bMatch = FALSE;
  94. while (sCount < m_lbWksList.GetCount())
  95. {
  96. WKSMember* pMem = (WKSMember*)m_lbWksList.GetItemData(sCount);
  97. if ((pMem->csWKSAddress == add.m_csNetworkAddress) &&
  98. (pMem->csWKSNode == add.m_csNodeAddress))
  99. {
  100. bMatch = TRUE;
  101. break;
  102. }
  103. sCount++;
  104. }
  105. if (bMatch) return;
  106. WKSMember* member = new WKSMember;
  107. member->csWKSAddress = add.m_csNetworkAddress;
  108. member->csWKSNode = add.m_csNodeAddress;
  109. int nEntry = m_lbWksList.AddString(L" ");
  110. m_lbWksList.SetItemData(nEntry, (DWORD)member);
  111. // enable the remove button since there is something to remove
  112. GetDlgItem(IDC_REMOVE_BUTTON)->EnableWindow(TRUE);
  113. GetDlgItem(IDC_NWLOGON_LIST)->SetFocus();
  114. m_lbWksList.SetCurSel(0);
  115. }
  116. }
  117. void CNWLimitLogon::OnRemoveButton()
  118. {
  119. USHORT sSel = m_lbWksList.GetCurSel();
  120. WKSMember* member = (WKSMember*)m_lbWksList.GetItemData(sSel);
  121. free(member);
  122. m_lbWksList.DeleteString(sSel);
  123. if (m_lbWksList.GetCount() == 0) GetDlgItem(IDC_REMOVE_BUTTON)->EnableWindow(FALSE);
  124. else if (sSel > 0) m_lbWksList.SetCurSel(sSel - 1);
  125. else m_lbWksList.SetCurSel(0);
  126. }
  127. void CNWLimitLogon::OnWorkstationRadio()
  128. {
  129. GetDlgItem(IDC_NWSTATIC1)->EnableWindow(FALSE);
  130. GetDlgItem(IDC_NWSTATIC2)->EnableWindow(FALSE);
  131. GetDlgItem(IDC_NWLOGON_LIST)->EnableWindow(FALSE);
  132. GetDlgItem(IDC_ADD_BUTTON)->EnableWindow(FALSE);
  133. GetDlgItem(IDC_REMOVE_BUTTON)->EnableWindow(FALSE);
  134. }
  135. void CNWLimitLogon::OnWorkstationRadio2()
  136. {
  137. GetDlgItem(IDC_NWSTATIC1)->EnableWindow(TRUE);
  138. GetDlgItem(IDC_NWSTATIC2)->EnableWindow(TRUE);
  139. GetDlgItem(IDC_NWLOGON_LIST)->EnableWindow(TRUE);
  140. GetDlgItem(IDC_ADD_BUTTON)->EnableWindow(TRUE);
  141. }
  142. /////////////////////////////////////////////////////////////////////////////
  143. // CWorkstationList
  144. CWorkstationList::CWorkstationList()
  145. {
  146. }
  147. CWorkstationList::~CWorkstationList()
  148. {
  149. }
  150. BEGIN_MESSAGE_MAP(CWorkstationList, CListBox)
  151. //{{AFX_MSG_MAP(CWorkstationList)
  152. ON_WM_DESTROY()
  153. //}}AFX_MSG_MAP
  154. END_MESSAGE_MAP()
  155. /////////////////////////////////////////////////////////////////////////////
  156. // CWorkstationList message handlers
  157. void CWorkstationList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  158. {
  159. COLORREF crefOldText;
  160. COLORREF crefOldBk;
  161. HBRUSH hBrush;
  162. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  163. switch (lpDrawItemStruct->itemAction)
  164. {
  165. case ODA_SELECT:
  166. case ODA_DRAWENTIRE:
  167. // Is the item selected?
  168. if (lpDrawItemStruct->itemState & ODS_SELECTED)
  169. {
  170. hBrush = CreateSolidBrush( GetSysColor(COLOR_HIGHLIGHT));
  171. crefOldText = pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT) );
  172. crefOldBk = pDC->SetBkColor(GetSysColor(COLOR_HIGHLIGHT) );
  173. }
  174. else
  175. {
  176. hBrush = (HBRUSH)GetStockObject( GetSysColor(COLOR_WINDOW));
  177. crefOldText = pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
  178. crefOldBk = pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
  179. }
  180. // fill in the background
  181. pDC->FillRect(&(lpDrawItemStruct->rcItem), CBrush::FromHandle(hBrush));
  182. // display text
  183. TCHAR* pName = (TCHAR*)malloc(255 * sizeof(TCHAR));
  184. if (pName == NULL)
  185. {
  186. AfxMessageBox(IDS_GENERIC_NO_HEAP, MB_ICONEXCLAMATION);
  187. exit(1);
  188. }
  189. DWORD dwAddr = GetItemData(lpDrawItemStruct->itemID);
  190. WKSMember* member = (WKSMember*)dwAddr;
  191. // format the name + comment
  192. int nTop = (lpDrawItemStruct->rcItem.bottom + lpDrawItemStruct->rcItem.top) / 2;
  193. pDC->TextOut(0,
  194. (nTop - 8),
  195. member->csWKSAddress);
  196. if (member->csWKSNode == L"0000000000-1")
  197. pDC->TextOut(130,
  198. (nTop - 8),
  199. L"All Nodes");
  200. else
  201. pDC->TextOut(130,
  202. (nTop - 8),
  203. member->csWKSNode);
  204. free(pName);
  205. break;
  206. }
  207. pDC->SetBkColor(crefOldBk );
  208. pDC->SetTextColor(crefOldText );
  209. }
  210. int CWorkstationList::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
  211. {
  212. // TODO: Add your code to determine the sorting order of the specified items
  213. // return -1 = item 1 sorts before item 2
  214. // return 0 = item 1 and item 2 sort the same
  215. // return 1 = item 1 sorts after item 2
  216. return 0;
  217. }
  218. void CWorkstationList::OnDestroy()
  219. {
  220. while(GetCount() > 0)
  221. {
  222. WKSMember* member = (WKSMember*)GetItemData(0);
  223. delete member;
  224. DeleteString(0);
  225. }
  226. CListBox::OnDestroy();
  227. }
  228. void CNWLimitLogon::OnShowWindow(BOOL bShow, UINT nStatus)
  229. {
  230. CPropertyPage::OnShowWindow(bShow, nStatus);
  231. if (bShow)
  232. {
  233. CSpeckleApp* pApp = (CSpeckleApp*)AfxGetApp();
  234. CString csTemp;
  235. csTemp.LoadString(IDS_NWLOGON_CAPTION);
  236. CString csTemp2;
  237. csTemp2.Format(csTemp, pApp->m_csUserName);
  238. m_csCaption = csTemp2;
  239. UpdateData(FALSE);
  240. }
  241. }