/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1999 **/ /**********************************************************************/ /* AddRes.cpp Dialog to add a reservation FILE HISTORY: */ #include "stdafx.h" #include "scope.h" #include "addres.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define RADIO_CLIENT_TYPE_BOTH 0 #define RADIO_CLIENT_TYPE_DHCP 1 #define RADIO_CLIENT_TYPE_BOOTP 2 ///////////////////////////////////////////////////////////////////////////// // CAddReservation dialog CAddReservation::CAddReservation(ITFSNode * pScopeNode, LARGE_INTEGER liVersion, CWnd* pParent /*=NULL*/) : CBaseDialog(CAddReservation::IDD, pParent) { //{{AFX_DATA_INIT(CAddReservation) m_nClientType = -1; //}}AFX_DATA_INIT m_spScopeNode.Set(pScopeNode); m_pScopeObject = GETHANDLER(CDhcpScope, pScopeNode); m_bChange = FALSE; // We are creating new clients, not changing m_liVersion = liVersion; // the default client type is BOTH m_nClientType = RADIO_CLIENT_TYPE_BOTH; } void CAddReservation::DoDataExchange(CDataExchange* pDX) { CBaseDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAddReservation) DDX_Control(pDX, IDC_STATIC_CLIENT_TYPE, m_staticClientType); DDX_Control(pDX, IDC_EDIT_CLIENT_UID, m_editClientUID); DDX_Control(pDX, IDC_EDIT_CLIENT_NAME, m_editClientName); DDX_Control(pDX, IDC_EDIT_CLIENT_COMMENT, m_editClientComment); DDX_Radio(pDX, IDC_RADIO_TYPE_BOTH, m_nClientType); //}}AFX_DATA_MAP DDX_Control(pDX, IDC_IPADDR_RESERVATION_IP, m_ipaAddress); } BEGIN_MESSAGE_MAP(CAddReservation, CBaseDialog) //{{AFX_MSG_MAP(CAddReservation) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAddReservation message handlers BOOL CAddReservation::OnInitDialog() { CBaseDialog::OnInitDialog(); m_editClientName.LimitText( STRING_LENGTH_MAX ) ; m_editClientComment.LimitText( STRING_LENGTH_MAX ) ; FillInSubnetId(); if (m_liVersion.QuadPart < DHCP_SP2_VERSION) { m_staticClientType.ShowWindow(SW_HIDE); GetDlgItem(IDC_RADIO_TYPE_DHCP)->ShowWindow(SW_HIDE); GetDlgItem(IDC_RADIO_TYPE_BOOTP)->ShowWindow(SW_HIDE); GetDlgItem(IDC_RADIO_TYPE_BOTH)->ShowWindow(SW_HIDE); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CAddReservation::OnOK() { DWORD err = 0; CDhcpClient dhcpClient; UpdateData(); if ( m_bChange ) { err = UpdateClient(&dhcpClient); } else { err = CreateClient(&dhcpClient); } if ( err == ERROR_SUCCESS ) { // // the dialog only gets dismissed if we're editing an // existing client (because we may want to add more than // one client) // if (m_bChange) { CBaseDialog::OnOK(); } else { // // Get ready for the next client to be added. // m_editClientUID.SetWindowText(_T("")); m_editClientName.SetWindowText(_T("")); m_editClientComment.SetWindowText(_T("")); FillInSubnetId(); // // And continue on... // } } else { // don't put up another error box for this case, // we already asked the user if (err != IDS_UID_MAY_BE_WRONG) { ::DhcpMessageBox(err); } return; } //CBaseDialog::OnOK(); } // // For new clients, fill in what we can on the ip address control (i.e. // the subnet id portion // void CAddReservation::FillInSubnetId() { DWORD dwIp = m_pScopeObject->GetAddress() & m_pScopeObject->QuerySubnetMask(); m_ipaAddress.ClearAddress(); int i = 0; while (i < sizeof(dwIp)) { if (!dwIp) { break; } m_ipaAddress.SetField(i, TRUE, HIBYTE(HIWORD(dwIp))); dwIp <<= 8; ++i; } if (i < sizeof(dwIp)) { m_ipaAddress.SetFocusField(i); } } // // Construct the client structure from the dialog's edit controls. // LONG CAddReservation::BuildClient ( CDhcpClient * pClient ) { DWORD err = 0; CString str; DATE_TIME dt; DHCP_IP_ADDRESS dhipa; CByteArray cabUid; int i; BOOL fValidUID = TRUE; CATCH_MEM_EXCEPTION { do { dt.dwLowDateTime = DHCP_DATE_TIME_ZERO_LOW; dt.dwHighDateTime = DHCP_DATE_TIME_ZERO_HIGH; pClient->SetExpiryDateTime( dt ); m_ipaAddress.GetAddress( &dhipa ); if ( dhipa == 0 ) { err = IDS_ERR_INVALID_CLIENT_IPADDR ; m_ipaAddress.SetFocusField(-1); break ; } m_editClientUID.GetWindowText(str); if (str.IsEmpty()) { err = IDS_ERR_INVALID_UID ; m_editClientUID.SetSel(0,-1); m_editClientUID.SetFocus(); break ; } // // Since the rest of the Windows UI displays MAC addresses as // 00-00-00-00-00-00, we must strip out the dashes before // processing the mac address // int nLength = str.GetLength(); LPTSTR pstrSource = str.GetBuffer(nLength); LPTSTR pstrDest = pstrSource; LPTSTR pstrEnd = pstrSource + nLength; while (pstrSource < pstrEnd) { if (*pstrSource != '-') { *pstrDest = *pstrSource; pstrDest = _tcsinc(pstrDest); } pstrSource = _tcsinc(pstrSource); } *pstrDest = '\0'; str.ReleaseBuffer(); // // Client UIDs should be 48 bits (6 bytes or 12 hex characters) // if (str.GetLength() != 6 * 2) fValidUID = FALSE; for (i = 0; i < str.GetLength(); i++) { if (!wcschr(rgchHex, str[i])) fValidUID = FALSE; } if (!::UtilCvtHexString(str, cabUid) && fValidUID) { err = IDS_ERR_INVALID_UID ; m_editClientUID.SetSel(0,-1); m_editClientUID.SetFocus(); break ; } // UIDs must be <= 255 bytes if (cabUid.GetSize() > 255) { err = IDS_UID_TOO_LONG; break; } if (!fValidUID) { if (IDYES != AfxMessageBox(IDS_UID_MAY_BE_WRONG, MB_ICONQUESTION | MB_YESNO)) { m_editClientUID.SetSel(0,-1); m_editClientUID.SetFocus(); err = IDS_UID_MAY_BE_WRONG; break; } } pClient->SetHardwareAddress( cabUid ) ; m_editClientName.GetWindowText( str ) ; if ( str.GetLength() == 0 ) { err = IDS_ERR_INVALID_CLIENT_NAME ; m_editClientName.SetFocus(); break ; } // // Convert client name to oem // pClient->SetName( str ) ; m_editClientComment.GetWindowText( str ) ; pClient->SetComment( str ) ; // // Can't change IP address in change mode // ASSERT ( !m_bChange || dhipa == pClient->QueryIpAddress() ) ; pClient->SetIpAddress( dhipa ) ; // // Set the client type // if (m_liVersion.QuadPart >= DHCP_SP2_VERSION) { switch (m_nClientType) { case RADIO_CLIENT_TYPE_DHCP: pClient->SetClientType(CLIENT_TYPE_DHCP); break; case RADIO_CLIENT_TYPE_BOOTP: pClient->SetClientType(CLIENT_TYPE_BOOTP); break; case RADIO_CLIENT_TYPE_BOTH: pClient->SetClientType(CLIENT_TYPE_BOTH); break; default: Assert(FALSE); // should never get here break; } } } while ( FALSE ) ; } END_MEM_EXCEPTION( err ) ; return err ; } // // Creates a new reservation for this scope // LONG CAddReservation::CreateClient ( CDhcpClient * pClient ) { LONG err = BuildClient(pClient); if ( err == 0 ) { BEGIN_WAIT_CURSOR; err = m_pScopeObject->CreateReservation(pClient); END_WAIT_CURSOR; } return err ; } LONG CAddReservation::UpdateClient ( CDhcpClient * pClient ) { LONG err = BuildClient(pClient) ; if ( err == 0 ) { err = m_pScopeObject->SetClientInfo(pClient); } return err ; }