// Copyright (c) 1997-1999 Microsoft Corporation #include "precomp.h" #include "..\Common\ServiceThread.h" #ifdef EXT_DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #include "resource.h" #include "..\common\util.h" #include "NetIDPage.h" #include "NetHelpIDs.h" #include "iddlg.h" #include "NetUtility.h" #include #define MAX_ID_LENGTH 256 //--------------------------------------------------------------------- NetworkIDPage::NetworkIDPage(WbemServiceThread *serviceThread, LONG_PTR lNotifyHandle, bool bDeleteHandle, TCHAR* pTitle) : WBEMPageHelper(serviceThread), CSnapInPropertyPageImpl (pTitle), m_lNotifyHandle(lNotifyHandle), m_bDeleteHandle(bDeleteHandle) // Should be true for only page. { } //------------------------------------------------------------- NetworkIDPage::~NetworkIDPage() { } //------------------------------------------------------------- bool NetworkIDPage::CimomIsReady() { m_hDlg = m_hWnd; bool retval = ServiceIsReady(NO_UI, 0, 0); if(retval) { // This where it should be marshalling into THIS thread. m_WbemServices = m_serviceThread->m_WbemServices; IWbemClassObject *pInst = NULL; if((pInst = FirstInstanceOf("Win32_ComputerSystem")) != NULL) { m_computer = pInst; } if((pInst = FirstInstanceOf((bstr_t)"Win32_OperatingSystem")) != NULL) { m_OS = pInst; } if((pInst = FirstInstanceOf((bstr_t)"Win32_NetworkAdaptorConfiguration")) != NULL) { m_DNS = pInst; } m_state.Init(m_computer, m_OS, m_DNS); } return retval; } //------------------------------------------------------- LRESULT NetworkIDPage::OnChangeBtn(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { /* IDChangesDialog dlg(g_serviceThread, m_state); dlg.DoModal(); if(m_state.MustReboot()) { PropSheet_RebootSystem(GetParent()); } m_state.Refresh(); refresh();*/ return S_OK; } //---------------------------------------------------------- TCHAR szCommentReg[] = TEXT( "System\\ControlSet001\\Services\\LanmanServer\\Parameters" ); void NetworkIDPage::refresh() { DWORD role = (DWORD)m_computer.GetLong("DomainRole"); bool memberOfWorkgroup = ((role == DsRole_RoleStandaloneWorkstation) || (role == DsRole_RoleStandaloneServer)); //If we have the DNSName property, use it, otherwise use the NetBios name like we used to... _bstr_t bstrComputer = m_computer.GetString("DNSHostName"); if (bstrComputer.length() == 0) bstrComputer = m_computer.GetString("Name"); _bstr_t bstrDomain = m_computer.GetString("Domain"); if( !memberOfWorkgroup ) { bstrComputer += _T("."); bstrComputer += bstrDomain; } _tcslwr(bstrComputer); SetDlgItemText(IDC_COMPUTER, bstrComputer); SetDlgItemText(IDC_DOMAIN, bstrDomain); SetDlgItemText(IDC_NETID_COMMENT, m_OS.GetString("Description")); BOOL enable = FALSE; HWND hwnd = ::GetDlgItem(m_hWnd, IDC_NETID_COMMENT); RemoteRegWriteable(szCommentReg, enable); ::EnableWindow(hwnd, enable); ::SendMessage(hwnd, EM_LIMITTEXT, MAX_ID_LENGTH, 0); //#ifdef NO_SYSTEM_CPL_EQUIVALENT_BEHAVIOR TCHAR temp[50] = {0}; ::LoadString(HINST_THISDLL, (memberOfWorkgroup ? IDS_MEMBER_OF_WORKGROUP : IDS_MEMBER_OF_DOMAIN), temp, 50); SetDlgItemText(IDC_MEMBER_OF, temp); //#endif // NO_SYSTEM_CPL_EQUIVALENT_BEHAVIOR //bool show_change = IsCurrentUserAdministrator() // && !m_state.IsMachineDC() // && (m_state.IsNetworkingInstalled() || // m_state.IsMemberOfWorkgroup()); //::EnableWindow(GetDlgItem(IDC_CHANGE), show_change); ::ShowWindow(GetDlgItem(IDC_SAVING_MESSAGE), m_state.NeedsReboot() ? SW_SHOW : SW_HIDE); } //---------------------------------------------------------- LRESULT NetworkIDPage::OnInit(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if(CimomIsReady()) { refresh(); } else { if(m_serviceThread) { m_serviceThread->SendPtr(m_hWnd); } // no connection yet. TCHAR msg[50] = {0}; ::LoadString(HINST_THISDLL, IDS_UNAVAILABLE, msg, 50); SetDlgItemText(IDC_COMPUTER, msg); SetDlgItemText(IDC_DOMAIN, msg); SetDlgItemText(IDC_NETID_COMMENT, msg); HWND hwnd = ::GetDlgItem(m_hWnd, IDC_NETID_COMMENT); ::EnableWindow(hwnd, FALSE); ::SendMessage(hwnd, EM_LIMITTEXT, 48, 0); ::EnableWindow(GetDlgItem(IDC_CHANGE), FALSE); ::ShowWindow(GetDlgItem(IDC_SAVING_MESSAGE), SW_HIDE); } return S_OK; } //---------------------------------------------------------- LRESULT NetworkIDPage::OnConnected(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if(lParam) { IStream *pStream = (IStream *)lParam; IWbemServices *pServices = 0; HRESULT hr = CoGetInterfaceAndReleaseStream(pStream, IID_IWbemServices, (void**)&pServices); if(SUCCEEDED(hr)) { SetWbemService(pServices); pServices->Release(); if(CimomIsReady()) { refresh(); } } } else { ::EnableWindow(GetDlgItem(IDC_NETID_COMMENT), FALSE); } return S_OK; } //-------------------------------------------------------------- LRESULT NetworkIDPage::OnComment(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { // activate Apply for the comment change ::SendMessage(GetParent(), PSM_CHANGED, (WPARAM)m_hWnd, 0L); return S_OK; } //-------------------------------------------------------------- static const DWORD _help_map[] = { IDC_COMPUTER, IDH_IDENT_FULL_NAME, IDC_FULL_NAME, IDH_IDENT_FULL_NAME, IDC_MEMBER_OF, IDH_IDENT_MEMBER_OF, IDC_DOMAIN, IDH_IDENT_MEMBER_OF, IDC_CHANGE, IDH_IDENT_CHANGE_BUTTON, IDC_COMMENT, IDH_COMPUTER_DESCRIPTION, //was IDH_WBEM_NETID_COMPUTER_DESCRIPTION IDC_NETID_COMMENT, IDH_COMPUTER_DESCRIPTION, //was IDH_WBEM_NETID_COMPUTER_DESCRIPTION IDC_NETID_SELECT_ICON, -1, IDC_PARA, IDH_NO_HELP, 0, 0 }; LRESULT NetworkIDPage::OnF1Help(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { ::WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, L"sysdm.hlp", HELP_WM_HELP, (ULONG_PTR)(LPSTR)_help_map); return S_OK; } //-------------------------------------------------------------- LRESULT NetworkIDPage::OnContextHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { ::WinHelp((HWND)wParam, L"sysdm.hlp", HELP_CONTEXTMENU, (ULONG_PTR)(LPSTR)_help_map); return S_OK; } //-------------------------------------------------------------- BOOL NetworkIDPage::OnApply() { WCHAR szMsg[MAX_ID_LENGTH +2] = {0}; HRESULT hr = 0; CWindow msgHWND(GetDlgItem(IDC_NETID_COMMENT)); BOOL modified = (BOOL)msgHWND.SendMessage(EM_GETMODIFY); if((bool)m_WbemServices && modified) { ::GetWindowText(msgHWND, szMsg, ARRAYSIZE(szMsg) -1); //Now create a new Instance and populate only the properties which are modified CWbemClassObject newinst = m_OS.SpawnInstance(); hr = newinst.Put("Description", (bstr_t)szMsg); _bstr_t name; hr = m_OS.Get("Name",name); hr = newinst.Put("Name",name); hr = m_WbemServices.PutInstance(newinst); if(FAILED(hr)) { TCHAR caption[50] = {0}, text[500] = {0}; ::LoadString(HINST_THISDLL, IDS_DISPLAY_NAME, caption, 50); ::LoadString(HINST_THISDLL, IDS_CANT_WRITE_COMMENT, text, 500); ::MessageBox(NULL, text, caption, MB_OK | MB_ICONHAND); } } return TRUE; }