//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: S A U I . C P P // // Contents: Shared Access connection object UI // // Notes: // // Author: danielwe 16 Oct 1997 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "ncnetcon.h" #include "saui.h" #include "ncreg.h" #include "nsres.h" extern const WCHAR c_szNetCfgHelpFile[]; static const WCHAR c_szShowIcon[] = L"Show Icon"; static const WCHAR c_szSharedAccessClientKeyPath[] = L"System\\CurrentControlSet\\Control\\Network\\SharedAccessConnection"; CSharedAccessPage::CSharedAccessPage( IUnknown* punk, INetCfg* pnc, INetConnection* pconn, BOOLEAN fReadOnly, BOOLEAN fNeedReboot, BOOLEAN fAccessDenied, const DWORD * adwHelpIDs) { m_pconn = pconn; // REVIEW addref? m_pnc = pnc; m_punk = punk; m_fReadOnly = fReadOnly; m_adwHelpIDs = adwHelpIDs; m_fNetcfgInUse = FALSE; m_pNetSharedAccessConnection = NULL; } //+--------------------------------------------------------------------------- // // Member: CSharedAccessPage::~CSharedAccessPage // // Purpose: Destroys the CSharedAccessPage object // // Arguments: // (none) // // Returns: Nothing // // Author: danielwe 25 Feb 1998 // // Notes: // CSharedAccessPage::~CSharedAccessPage() { if (m_pnc) { INetCfgLock * pnclock; if (SUCCEEDED(m_pnc->QueryInterface(IID_INetCfgLock, (LPVOID *)&pnclock))) { (VOID)pnclock->ReleaseWriteLock(); ReleaseObj(pnclock); } } if(NULL != m_pNetSharedAccessConnection) { ReleaseObj(m_pNetSharedAccessConnection); } } //+--------------------------------------------------------------------------- // // Member: CSharedAccessPage::OnInitDialog // // Purpose: Handles the WM_INITDIALOG message // // Arguments: // uMsg [] // wParam [] // lParam [] // bHandled [] // // Returns: TRUE // // Author: danielwe 29 Oct 1997 // // Notes: // LRESULT CSharedAccessPage::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { HRESULT hr; // set the text field NETCON_PROPERTIES* pProperties; hr = m_pconn->GetProperties(&pProperties); if(SUCCEEDED(hr)) { SetDlgItemText(IDC_EDT_Adapter, pProperties->pszwDeviceName); FreeNetconProperties(pProperties); } // set the icon int cx = GetSystemMetrics(SM_CXSMICON); int cy = GetSystemMetrics(SM_CYSMICON); HICON hIcon = (HICON) LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDI_CFI_SAH_LAN), IMAGE_ICON, cx, cy, LR_DEFAULTCOLOR); if(NULL != hIcon) { SendDlgItemMessage(IDI_Device_Icon, STM_SETICON, reinterpret_cast(hIcon), 0); ::ShowWindow(GetDlgItem(IDI_Device_Icon), SW_SHOW); } ASSERT(NULL == m_pNetSharedAccessConnection); // make sure we don't leak a ref hr = HrQIAndSetProxyBlanket(m_pconn, &m_pNetSharedAccessConnection); if (SUCCEEDED(hr)) { SHAREDACCESSCON_INFO ConnectionInfo; hr = m_pNetSharedAccessConnection->GetInfo(SACIF_ICON, &ConnectionInfo); if (SUCCEEDED(hr)) { CheckDlgButton(IDC_CHK_ShowIcon, ConnectionInfo.fShowIcon); } // released in destructor } return TRUE; } //+--------------------------------------------------------------------------- // // Member: CSharedAccessPage::OnContextMenu // // Purpose: When right click a control, bring up help // // Arguments: Standard command parameters // // Returns: Standard return // LRESULT CSharedAccessPage::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { if (m_adwHelpIDs != NULL) { ::WinHelp(m_hWnd, c_szNetCfgHelpFile, HELP_CONTEXTMENU, (ULONG_PTR)m_adwHelpIDs); } return 0; } //+--------------------------------------------------------------------------- // // Member: CSharedAccessPage::OnHelp // // Purpose: When drag context help icon over a control, bring up help // // Arguments: Standard command parameters // // Returns: Standard return // LRESULT CSharedAccessPage::OnHelp( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { LPHELPINFO lphi = reinterpret_cast(lParam); Assert(lphi); if ((m_adwHelpIDs != NULL) && (HELPINFO_WINDOW == lphi->iContextType)) { ::WinHelp(static_cast(lphi->hItemHandle), c_szNetCfgHelpFile, HELP_WM_HELP, (ULONG_PTR)m_adwHelpIDs); } return 0; } //+--------------------------------------------------------------------------- // // Member: CSharedAccessPage::OnDestroy // // Purpose: Called when the dialog page is destroyed // // Arguments: // uMsg [] // wParam [] // lParam [] // bHandled [] // // Returns: // // Author: danielwe 2 Feb 1998 // // Notes: // LRESULT CSharedAccessPage::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { HICON hIcon; hIcon = reinterpret_cast(SendDlgItemMessage(IDI_Device_Icon, STM_GETICON, 0, 0)); if (hIcon) { DestroyIcon(hIcon); } return 0; } //+--------------------------------------------------------------------------- // // Member: CSharedAccessPage::OnApply // // Purpose: Called when the Networking page is applied // // Arguments: // idCtrl [] // pnmh [] // bHandled [] // // Returns: // // Author: danielwe 29 Oct 1997 // // Notes: // LRESULT CSharedAccessPage::OnApply(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) { HRESULT hr = S_OK; if(NULL != m_pNetSharedAccessConnection) { SHAREDACCESSCON_INFO ConnectionInfo = {0}; ConnectionInfo.fShowIcon = IsDlgButtonChecked(IDC_CHK_ShowIcon); hr = m_pNetSharedAccessConnection->SetInfo(SACIF_ICON, &ConnectionInfo); } return 0; } //+--------------------------------------------------------------------------- // // Member: CSharedAccessPage::OnCancel // // Purpose: Called when the Networking page is cancelled. // // Arguments: // idCtrl [] // pnmh [] // bHandled [] // // Returns: // // Author: danielwe 3 Jan 1998 // // Notes: Added the check to see if we are in the middle of // installing components, in which case we can't // uninitialize INetCfg (Raid #258690). // LRESULT CSharedAccessPage::OnCancel(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) { AssertSz(m_pnc, "I need a NetCfg object!"); if (!m_fNetcfgInUse) { (VOID) m_pnc->Uninitialize(); } ::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, m_fNetcfgInUse); return m_fNetcfgInUse; } LRESULT CSharedAccessPage::OnClicked (WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if (wID != IDC_PSB_Settings) return bHandled = FALSE; /* new improved way: get upnp service from INetSharedAccessConnection call hnetcfg's HNetGetSharingServicesPage create the property page */ NETCON_MEDIATYPE MediaType; NETCON_PROPERTIES* pProperties; HRESULT hr = m_pconn->GetProperties(&pProperties); if (SUCCEEDED(hr)) { MediaType = pProperties->MediaType; FreeNetconProperties(pProperties); } else { return bHandled = FALSE; } if ((MediaType != NCM_SHAREDACCESSHOST_LAN) && (MediaType != NCM_SHAREDACCESSHOST_RAS) ) return bHandled = FALSE; BOOL b = FALSE; CComPtr spUPS = NULL; hr = m_pNetSharedAccessConnection->GetService ( MediaType == NCM_SHAREDACCESSHOST_LAN ? SAHOST_SERVICE_WANIPCONNECTION : SAHOST_SERVICE_WANPPPCONNECTION, &spUPS); if (spUPS) { // must run-time load "HNetGetSharingServicesPage", // else netshell.dll and hnetcfg.dll are cross-linked. HINSTANCE hinstDll = LoadLibrary (TEXT("hnetcfg.dll")); if (!hinstDll) hr = HRESULT_FROM_WIN32 (GetLastError()); else { HRESULT (APIENTRY *pfnHNetGetSharingServicesPage)(IUPnPService *, PROPSHEETPAGE *); pfnHNetGetSharingServicesPage = (HRESULT (APIENTRY *)(IUPnPService *, PROPSHEETPAGE *)) GetProcAddress (hinstDll, "HNetGetSharingServicesPage"); if (!pfnHNetGetSharingServicesPage) hr = HRESULT_FROM_WIN32 (GetLastError()); else { PROPSHEETPAGE psp; ZeroMemory (&psp, sizeof(psp)); psp.dwSize = sizeof(psp); psp.lParam = (LPARAM)m_hWnd; // double-secret place to hang owner window (will get wiped) hr = pfnHNetGetSharingServicesPage (spUPS, &psp); if (SUCCEEDED(hr)) { b = TRUE; PROPSHEETHEADER psh; ZeroMemory (&psh, sizeof(psh)); psh.dwSize = PROPSHEETHEADER_V1_SIZE; psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW | PSH_NOCONTEXTHELP; psh.hwndParent = m_hWnd; psh.pszCaption = (LPCTSTR)MAKEINTRESOURCE (IDS_SHAREDACCESSSETTINGS); psh.hInstance = _Module.GetResourceInstance(); psh.nPages = 1; psh.ppsp = &psp; PropertySheet (&psh); } } FreeLibrary (hinstDll); } } return b; }