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.

574 lines
13 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2002 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // SelNodePage.cpp
  7. //
  8. // Maintained By:
  9. // David Potter (DavidP) 31-JAN-2001
  10. // Geoffrey Pease (GPease) 12-MAY-2000
  11. //
  12. //////////////////////////////////////////////////////////////////////////////
  13. #include "Pch.h"
  14. #include "SelNodePage.h"
  15. #include "WizardUtils.h"
  16. #include "AdvancedDlg.h"
  17. DEFINE_THISCLASS("CSelNodePage");
  18. //////////////////////////////////////////////////////////////////////////////
  19. //++
  20. //
  21. // CSelNodePage::CSelNodePage
  22. //
  23. // Description:
  24. // Constructor.
  25. //
  26. // Arguments:
  27. // pccwIn - CClusCfgWizard
  28. //
  29. // Return Values:
  30. // None.
  31. //
  32. //--
  33. //////////////////////////////////////////////////////////////////////////////
  34. CSelNodePage::CSelNodePage(
  35. CClusCfgWizard * pccwIn
  36. )
  37. : m_hwnd( NULL )
  38. , m_pccw( pccwIn )
  39. {
  40. TraceFunc( "" );
  41. Assert( m_pccw != NULL );
  42. m_pccw->AddRef();
  43. TraceFuncExit();
  44. } //*** CSelNodePage::CSelNodePage
  45. //////////////////////////////////////////////////////////////////////////////
  46. //++
  47. //
  48. // CSelNodePage::~CSelNodePage
  49. //
  50. // Description:
  51. // Destructor.
  52. //
  53. // Arguments:
  54. // None.
  55. //
  56. // Return Values:
  57. // None.
  58. //
  59. //--
  60. //////////////////////////////////////////////////////////////////////////////
  61. CSelNodePage::~CSelNodePage( void )
  62. {
  63. TraceFunc( "" );
  64. if ( m_pccw != NULL )
  65. {
  66. m_pccw->Release();
  67. }
  68. TraceFuncExit();
  69. } //*** CSelNodePage::~CSelNodePage
  70. //////////////////////////////////////////////////////////////////////////////
  71. //++
  72. //
  73. // CSelNodePage::OnInitDialog
  74. //
  75. // Description:
  76. // Handle the WM_INITDIALOG window message.
  77. //
  78. // Arguments:
  79. // hDlgIn
  80. //
  81. // Return Values:
  82. // FALSE - Didn't set the focus.
  83. //
  84. //--
  85. //////////////////////////////////////////////////////////////////////////////
  86. LRESULT
  87. CSelNodePage::OnInitDialog(
  88. HWND hDlgIn
  89. )
  90. {
  91. TraceFunc( "" );
  92. LRESULT lr = FALSE; // Didn't set the focus.
  93. //
  94. // (jfranco, bug #462673) Limit node name length to ADJUSTED_DNS_MAX_NAME_LENGTH.
  95. // According to MSDN, EM_(SET)LIMITTEXT does not return a value, so ignore what SendDlgItemMessage returns
  96. //
  97. SendDlgItemMessage( m_hwnd, IDC_SELNODE_E_COMPUTERNAME, EM_SETLIMITTEXT, ADJUSTED_DNS_MAX_NAME_LENGTH, 0 );
  98. //
  99. // Call the base class function.
  100. // This must be called before any other base class methods are called.
  101. //
  102. CSelNodesPageCommon::OnInitDialog( hDlgIn, m_pccw );
  103. RETURN( lr );
  104. } //*** CSelNodePage::OnInitDialog
  105. //////////////////////////////////////////////////////////////////////////////
  106. //++
  107. //
  108. // CSelNodePage::OnCommand
  109. //
  110. // Description:
  111. //
  112. // Arguments:
  113. // idNotificationIn
  114. // idControlIn
  115. // hwndSenderIn
  116. //
  117. // Return Values:
  118. // TRUE
  119. // FALSE
  120. //
  121. //--
  122. //////////////////////////////////////////////////////////////////////////////
  123. LRESULT
  124. CSelNodePage::OnCommand(
  125. UINT idNotificationIn,
  126. UINT idControlIn,
  127. HWND hwndSenderIn
  128. )
  129. {
  130. TraceFunc( "" );
  131. LRESULT lr = FALSE;
  132. switch ( idControlIn )
  133. {
  134. case IDC_SELNODE_E_COMPUTERNAME:
  135. if ( idNotificationIn == EN_CHANGE )
  136. {
  137. THR( HrUpdateWizardButtons() );
  138. lr = TRUE;
  139. }
  140. break;
  141. case IDC_SELNODE_PB_BROWSE:
  142. if ( idNotificationIn == BN_CLICKED )
  143. {
  144. //
  145. // TODO: 26-JUN-2000 GalenB
  146. //
  147. // Need to set lr properly.
  148. //
  149. THR( HrBrowse( false /* fMultipleNodesIn */ ) );
  150. lr = TRUE;
  151. }
  152. break;
  153. case IDC_SELNODE_PB_ADVANCED:
  154. if ( idNotificationIn == BN_CLICKED )
  155. {
  156. HRESULT hr;
  157. hr = STHR( CAdvancedDlg::S_HrDisplayModalDialog( m_hwnd, m_pccw ) );
  158. if ( hr == S_OK )
  159. {
  160. OnNotifySetActive();
  161. } // if:
  162. lr = TRUE;
  163. } // if:
  164. break;
  165. } // switch: idControlIn
  166. RETURN( lr );
  167. } //*** CSelNodePage::OnCommand
  168. //////////////////////////////////////////////////////////////////////////////
  169. //++
  170. //
  171. // CSelNodePage::HrUpdateWizardButtons
  172. //
  173. // Description:
  174. //
  175. // Arguments:
  176. // None.
  177. //
  178. // Return Values:
  179. // S_OK
  180. //
  181. //--
  182. //////////////////////////////////////////////////////////////////////////////
  183. HRESULT
  184. CSelNodePage::HrUpdateWizardButtons( void )
  185. {
  186. TraceFunc( "" );
  187. HRESULT hr = S_OK;
  188. BSTR bstrComputerName = NULL;
  189. DWORD mEnabledButtons = PSWIZB_BACK;
  190. hr = STHR( HrGetTrimmedText( GetDlgItem( m_hwnd, IDC_SELNODE_E_COMPUTERNAME ), &bstrComputerName ) );
  191. if ( hr == S_OK )
  192. {
  193. mEnabledButtons |= PSWIZB_NEXT;
  194. }
  195. PropSheet_SetWizButtons( GetParent( m_hwnd ), mEnabledButtons );
  196. TraceSysFreeString( bstrComputerName );
  197. HRETURN( hr );
  198. } //*** CSelNodePage::HrUpdateWizardButtons
  199. //////////////////////////////////////////////////////////////////////////////
  200. //++
  201. //
  202. // CSelNodePage::OnNotifySetActive
  203. //
  204. // Description:
  205. //
  206. // Arguments:
  207. // None.
  208. //
  209. // Return Values:
  210. // TRUE
  211. //
  212. //--
  213. //////////////////////////////////////////////////////////////////////////////
  214. LRESULT
  215. CSelNodePage::OnNotifySetActive( void )
  216. {
  217. TraceFunc( "" );
  218. LRESULT lr = TRUE;
  219. STHR( HrUpdateWizardButtons() );
  220. //
  221. // TODO: gpease 23-MAY-2000
  222. // Figure out: If the user clicks back and changes the computer
  223. // name, how do we update the middle tier?
  224. //
  225. RETURN( lr );
  226. } //*** CSelNodePage::OnNotifySetActive
  227. //////////////////////////////////////////////////////////////////////////////
  228. //++
  229. //
  230. // CSelNodePage::OnNotifyQueryCancel
  231. //
  232. // Description:
  233. //
  234. // Arguments:
  235. // None.
  236. //
  237. // Return Values:
  238. // TRUE
  239. //
  240. //--
  241. //////////////////////////////////////////////////////////////////////////////
  242. LRESULT
  243. CSelNodePage::OnNotifyQueryCancel( void )
  244. {
  245. TraceFunc( "" );
  246. LRESULT lr = TRUE;
  247. int iRet;
  248. iRet = MessageBoxFromStrings( m_hwnd,
  249. IDS_QUERY_CANCEL_TITLE,
  250. IDS_QUERY_CANCEL_TEXT,
  251. MB_YESNO
  252. );
  253. if ( iRet == IDNO )
  254. {
  255. SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, -1 );
  256. }
  257. RETURN( lr );
  258. } //*** CSelNodePage::OnNotifyQueryCancel
  259. //////////////////////////////////////////////////////////////////////////////
  260. //++
  261. //
  262. // CSelNodePage::OnNotifyWizNext
  263. //
  264. // Description:
  265. //
  266. // Arguments:
  267. // None.
  268. //
  269. // Return Values:
  270. // TRUE
  271. // Other LRESULT values.
  272. //
  273. //--
  274. //////////////////////////////////////////////////////////////////////////////
  275. LRESULT
  276. CSelNodePage::OnNotifyWizNext( void )
  277. {
  278. TraceFunc( "" );
  279. HRESULT hr = S_OK;
  280. int idcFocus = 0;
  281. BSTR bstrComputerName = NULL;
  282. LRESULT lr = TRUE;
  283. // Get machine name from edit control.
  284. hr = THR( HrGetTrimmedText( GetDlgItem( m_hwnd, IDC_SELNODE_E_COMPUTERNAME ), &bstrComputerName ) );
  285. if ( hr != S_OK )
  286. {
  287. goto Error;
  288. }
  289. // Check the machine name.
  290. hr = THR( HrValidateFQNPrefix( bstrComputerName ) );
  291. if ( FAILED( hr ) )
  292. {
  293. THR( HrShowInvalidLabelPrompt( m_hwnd, bstrComputerName, hr ) );
  294. idcFocus = IDC_SELNODE_E_COMPUTERNAME;
  295. goto Error;
  296. }
  297. //
  298. // Free old list (if any)
  299. //
  300. hr = THR( m_pccw->ClearComputerList() );
  301. if ( FAILED( hr ) )
  302. {
  303. goto Error;
  304. }
  305. // Make this machine the sole entry in the list.
  306. hr = THR( m_pccw->HrAddNode( bstrComputerName, true ) );
  307. if ( FAILED( hr ) )
  308. {
  309. goto Error;
  310. }
  311. goto Cleanup;
  312. Cleanup:
  313. TraceSysFreeString( bstrComputerName );
  314. RETURN( lr );
  315. Error:
  316. if ( idcFocus != 0 )
  317. {
  318. SetFocus( GetDlgItem( m_hwnd, idcFocus ) );
  319. }
  320. // Don't go to the next page.
  321. SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, -1 );
  322. goto Cleanup;
  323. } //*** CSelNodePage::OnNotifyWizNext()
  324. //////////////////////////////////////////////////////////////////////////////
  325. //++
  326. //
  327. // CSelNodePage::OnNotify
  328. //
  329. // Description:
  330. //
  331. // Arguments:
  332. // idCtrlIn
  333. // pnmhdrIn
  334. //
  335. // Return Values:
  336. // TRUE
  337. // Other LRESULT values
  338. //
  339. //--
  340. //////////////////////////////////////////////////////////////////////////////
  341. LRESULT
  342. CSelNodePage::OnNotify(
  343. WPARAM idCtrlIn,
  344. LPNMHDR pnmhdrIn
  345. )
  346. {
  347. TraceFunc( "" );
  348. LRESULT lr = TRUE;
  349. SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, 0 );
  350. switch( pnmhdrIn->code )
  351. {
  352. case PSN_SETACTIVE:
  353. lr = OnNotifySetActive();
  354. break;
  355. case PSN_WIZNEXT:
  356. lr = OnNotifyWizNext();
  357. break;
  358. case PSN_QUERYCANCEL:
  359. lr = OnNotifyQueryCancel();
  360. break;
  361. } // switch: notify code
  362. RETURN( lr );
  363. } //*** CSelNodePage::OnNotify
  364. //////////////////////////////////////////////////////////////////////////////
  365. //++
  366. //
  367. // static
  368. // CSelNodePage::S_DlgProc
  369. //
  370. // Description:
  371. // Dialog proc for this page.
  372. //
  373. // Arguments:
  374. // hDlgIn
  375. // MsgIn
  376. // wParam
  377. // lParam
  378. //
  379. // Return Values:
  380. // FALSE
  381. // Other LRESULT values
  382. //
  383. //--
  384. //////////////////////////////////////////////////////////////////////////////
  385. INT_PTR
  386. CALLBACK
  387. CSelNodePage::S_DlgProc(
  388. HWND hDlgIn,
  389. UINT MsgIn,
  390. WPARAM wParam,
  391. LPARAM lParam
  392. )
  393. {
  394. // Don't do TraceFunc because every mouse movement
  395. // will cause this function to be called.
  396. WndMsg( hDlgIn, MsgIn, wParam, lParam );
  397. LRESULT lr = FALSE;
  398. CSelNodePage * pPage = reinterpret_cast< CSelNodePage * >( GetWindowLongPtr( hDlgIn, GWLP_USERDATA ) );
  399. if ( MsgIn == WM_INITDIALOG )
  400. {
  401. Assert( lParam != NULL );
  402. PROPSHEETPAGE * ppage = reinterpret_cast< PROPSHEETPAGE * >( lParam );
  403. SetWindowLongPtr( hDlgIn, GWLP_USERDATA, (LPARAM) ppage->lParam );
  404. pPage = reinterpret_cast< CSelNodePage * >( ppage->lParam );
  405. pPage->m_hwnd = hDlgIn;
  406. }
  407. if ( pPage != NULL )
  408. {
  409. Assert( hDlgIn == pPage->m_hwnd );
  410. switch( MsgIn )
  411. {
  412. case WM_INITDIALOG:
  413. lr = pPage->OnInitDialog( hDlgIn );
  414. break;
  415. case WM_NOTIFY:
  416. lr = pPage->OnNotify( wParam, reinterpret_cast< LPNMHDR >( lParam ) );
  417. break;
  418. case WM_COMMAND:
  419. lr= pPage->OnCommand( HIWORD( wParam ), LOWORD( wParam ), (HWND) lParam );
  420. break;
  421. // no default clause needed
  422. } // switch: message
  423. } // if: there is a page associated with the window
  424. return lr;
  425. } //*** CSelNodePage::S_DlgProc
  426. //////////////////////////////////////////////////////////////////////////////
  427. //++
  428. //
  429. // CSelNodesPage::OnProcessedNodeWithBadDomain
  430. //
  431. // Description:
  432. //
  433. // Arguments:
  434. // pwcszNodeNameIn
  435. //
  436. // Return Values:
  437. // None.
  438. //
  439. //--
  440. //////////////////////////////////////////////////////////////////////////////
  441. void
  442. CSelNodePage::OnProcessedNodeWithBadDomain( PCWSTR pwcszNodeNameIn )
  443. {
  444. SetDlgItemText( m_hwnd, IDC_SELNODE_E_COMPUTERNAME, pwcszNodeNameIn );
  445. } //*** CSelNodePage::OnProcessedNodeWithBadDomain
  446. //////////////////////////////////////////////////////////////////////////////
  447. //++
  448. //
  449. // CSelNodesPage::OnProcessedValidNode
  450. //
  451. // Description:
  452. //
  453. // Arguments:
  454. // pwcszNodeNameIn
  455. //
  456. // Return Values:
  457. // None.
  458. //
  459. //--
  460. //////////////////////////////////////////////////////////////////////////////
  461. void
  462. CSelNodePage::OnProcessedValidNode( PCWSTR pwcszNodeNameIn )
  463. {
  464. SetDlgItemText( m_hwnd, IDC_SELNODE_E_COMPUTERNAME, pwcszNodeNameIn );
  465. } //*** CSelNodePage::OnProcessedValidNode
  466. //////////////////////////////////////////////////////////////////////////////
  467. //++
  468. //
  469. // CSelNodesPage::HrSetDefaultNode
  470. //
  471. // Description:
  472. //
  473. // Arguments:
  474. // pwcszNodeNameIn
  475. //
  476. // Return Values:
  477. // S_OK.
  478. //
  479. //--
  480. //////////////////////////////////////////////////////////////////////////////
  481. HRESULT
  482. CSelNodePage::HrSetDefaultNode( PCWSTR pwcszNodeNameIn )
  483. {
  484. SetDlgItemText( m_hwnd, IDC_SELNODE_E_COMPUTERNAME, pwcszNodeNameIn );
  485. return S_OK;
  486. } //*** CSelNodePage::HrSetDefaultNode