From 3ed4acffca7a4d8bf5a0272fe454f07fb1fc49d6 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Wed, 17 Sep 2008 13:58:48 +0000 Subject: [PATCH] - Check for null in IConnection_Constructor - Implement INetConnectionConnectUi interface - Add a dialog which serves a proxy dialog - Add tray icons for connection which want to displayed in the tray - Start implement network connection status dialog svn path=/trunk/; revision=36284 --- reactos/dll/win32/netshell/connectmanager.c | 25 +- reactos/dll/win32/netshell/lanconnectui.c | 126 ++++++- reactos/dll/win32/netshell/lang/de-DE.rc | 17 +- reactos/dll/win32/netshell/lanstatusui.c | 348 +++++++++++++++++- reactos/dll/win32/netshell/precomp.h | 3 + reactos/dll/win32/netshell/resource.h | 10 +- .../dll/win32/netshell/shfldr_netconnect.c | 102 ++--- 7 files changed, 553 insertions(+), 78 deletions(-) diff --git a/reactos/dll/win32/netshell/connectmanager.c b/reactos/dll/win32/netshell/connectmanager.c index 38f5dea17e6..658f53a9fd6 100644 --- a/reactos/dll/win32/netshell/connectmanager.c +++ b/reactos/dll/win32/netshell/connectmanager.c @@ -301,13 +301,19 @@ HRESULT WINAPI IConnection_Constructor (INetConnection **ppv, PINetConnectionIte CopyMemory(&This->Props, &pItem->Props, sizeof(NETCON_PROPERTIES)); - This->Props.pszwName = CoTaskMemAlloc((wcslen(pItem->Props.pszwName)+1)*sizeof(WCHAR)); - if (This->Props.pszwName) - wcscpy(This->Props.pszwName, pItem->Props.pszwName); + if (pItem->Props.pszwName) + { + This->Props.pszwName = CoTaskMemAlloc((wcslen(pItem->Props.pszwName)+1)*sizeof(WCHAR)); + if (This->Props.pszwName) + wcscpy(This->Props.pszwName, pItem->Props.pszwName); + } - This->Props.pszwDeviceName = CoTaskMemAlloc((wcslen(pItem->Props.pszwDeviceName)+1)*sizeof(WCHAR)); - if (This->Props.pszwDeviceName) - wcscpy(This->Props.pszwDeviceName, pItem->Props.pszwDeviceName); + if (pItem->Props.pszwDeviceName) + { + This->Props.pszwDeviceName = CoTaskMemAlloc((wcslen(pItem->Props.pszwDeviceName)+1)*sizeof(WCHAR)); + if (This->Props.pszwDeviceName) + wcscpy(This->Props.pszwDeviceName, pItem->Props.pszwDeviceName); + } *ppv = (INetConnection *)This; @@ -449,7 +455,7 @@ static const IEnumNetConnectionVtbl vt_EnumNetConnection = IEnumNetConnection_fnClone }; -static + BOOL GetAdapterIndexFromNetCfgInstanceId(PIP_ADAPTER_INFO pAdapterInfo, LPWSTR szNetCfg, PDWORD pIndex) { @@ -474,7 +480,6 @@ GetAdapterIndexFromNetCfgInstanceId(PIP_ADAPTER_INFO pAdapterInfo, LPWSTR szNetC return FALSE; } - static BOOL EnumerateINetConnections(INetConnectionManagerImpl *This) @@ -543,6 +548,7 @@ EnumerateINetConnections(INetConnectionManagerImpl *This) dwIndex = 0; do { + ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA)); DevInfo.cbSize = sizeof(DevInfo); @@ -566,9 +572,10 @@ EnumerateINetConnections(INetConnectionManagerImpl *This) break; } RegCloseKey(hSubKey); + /* get the current adapter index from NetCfgInstanceId */ if (!GetAdapterIndexFromNetCfgInstanceId(pAdapterInfo, szNetCfg, &dwAdapterIndex)) - break; + continue; /* get detailed adapter info */ ZeroMemory(&IfEntry, sizeof(IfEntry)); diff --git a/reactos/dll/win32/netshell/lanconnectui.c b/reactos/dll/win32/netshell/lanconnectui.c index 727d0d87432..674cd4da2d1 100644 --- a/reactos/dll/win32/netshell/lanconnectui.c +++ b/reactos/dll/win32/netshell/lanconnectui.c @@ -24,6 +24,7 @@ typedef struct { INetConnectionPropertyUi2 *lpVtbl; INetLanConnectionUiInfo * lpLanConUiInfoVtbl; + INetConnectionConnectUi * lpNetConnectionConnectUi; INetConnection * pCon; INetCfgLock *NCfgLock; INetCfg * pNCfg; @@ -36,6 +37,12 @@ static LPINetConnectionPropertyUiImpl __inline impl_from_NetLanConnectionUiInfo( return (LPINetConnectionPropertyUiImpl)((char *)iface - FIELD_OFFSET(INetConnectionPropertyUiImpl, lpLanConUiInfoVtbl)); } +static LPINetConnectionPropertyUiImpl __inline impl_from_NetConnectionConnectUi(INetConnectionConnectUi *iface) +{ + return (LPINetConnectionPropertyUiImpl)((char *)iface - FIELD_OFFSET(INetConnectionPropertyUiImpl, lpNetConnectionConnectUi)); +} + + HPROPSHEETPAGE InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle) { @@ -389,7 +396,7 @@ INetConnectionPropertyUi2_fnQueryInterface( REFIID iid, LPVOID * ppvObj) { - //LPOLESTR pStr; + LPOLESTR pStr; INetConnectionPropertyUiImpl * This = (INetConnectionPropertyUiImpl*)iface; *ppvObj = NULL; @@ -407,9 +414,16 @@ INetConnectionPropertyUi2_fnQueryInterface( IUnknown_AddRef(iface); return S_OK; } - //StringFromCLSID(iid, &pStr); - //MessageBoxW(NULL, pStr, L"INetConnectionPropertyUi_fnQueryInterface", MB_OK); - //CoTaskMemFree(pStr); + else if (IsEqualIID(iid, &IID_INetConnectionConnectUi)) + { + *ppvObj = &This->lpNetConnectionConnectUi; + IUnknown_AddRef(iface); + return S_OK; + } + + StringFromCLSID(iid, &pStr); + MessageBoxW(NULL, pStr, L"INetConnectionPropertyUi_fnQueryInterface", MB_OK); + CoTaskMemFree(pStr); return E_NOINTERFACE; } @@ -587,6 +601,109 @@ static const INetLanConnectionUiInfoVtbl vt_NetLanConnectionUiInfo = INetLanConnectionUiInfo_fnRelease, INetLanConnectionUiInfo_fnGetDeviceGuid, }; + +static +HRESULT +STDCALL +INetConnectionConnectUi_fnQueryInterface( + INetConnectionConnectUi * iface, + REFIID iid, + LPVOID * ppvObj) +{ + INetConnectionPropertyUiImpl * This = impl_from_NetConnectionConnectUi(iface); + return INetConnectionPropertyUi_QueryInterface((INetConnectionPropertyUi*)This, iid, ppvObj); +} + +static +ULONG +STDCALL +INetConnectionConnectUi_fnAddRef( + INetConnectionConnectUi * iface) +{ + INetConnectionPropertyUiImpl * This = impl_from_NetConnectionConnectUi(iface); + return INetConnectionPropertyUi_AddRef((INetConnectionPropertyUi*)This); +} + +static +ULONG +STDCALL +INetConnectionConnectUi_fnRelease( + INetConnectionConnectUi * iface) +{ + INetConnectionPropertyUiImpl * This = impl_from_NetConnectionConnectUi(iface); + return INetConnectionPropertyUi_Release((INetConnectionPropertyUi*)This); +} + +static +HRESULT +STDCALL +INetConnectionConnectUi_fnSetConnection( + INetConnectionConnectUi * iface, + INetConnection* pCon) +{ + INetConnectionPropertyUiImpl * This = impl_from_NetConnectionConnectUi(iface); + if (This->pCon) + INetConnection_Release(This->pCon); + + if (!pCon) + return E_POINTER; + + This->pCon = pCon; + INetConnection_AddRef(pCon); + return S_OK; +} + +static +HRESULT +STDCALL +INetConnectionConnectUi_fnConnect( + INetConnectionConnectUi * iface, + HWND hwndParent, + DWORD dwFlags) +{ + INetConnectionPropertyUiImpl * This = impl_from_NetConnectionConnectUi(iface); + + if (!This->pCon) + return E_POINTER; //FIXME + + + if (dwFlags & NCUC_NO_UI) + { + return INetConnection_Connect(This->pCon); + } + + return E_FAIL; +} + +static +HRESULT +STDCALL +INetConnectionConnectUi_fnDisconnect( + INetConnectionConnectUi * iface, + HWND hwndParent, + DWORD dwFlags) +{ + WCHAR szBuffer[100]; + swprintf(szBuffer, L"INetConnectionConnectUi_fnDisconnect flags %x\n", dwFlags); + MessageBoxW(NULL, szBuffer, NULL, MB_OK); + + return S_OK; +} + + +static const INetConnectionConnectUiVtbl vt_NetConnectionConnectUi = +{ + INetConnectionConnectUi_fnQueryInterface, + INetConnectionConnectUi_fnAddRef, + INetConnectionConnectUi_fnRelease, + INetConnectionConnectUi_fnSetConnection, + INetConnectionConnectUi_fnConnect, + INetConnectionConnectUi_fnDisconnect, + +}; + + + HRESULT WINAPI LanConnectUI_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) { INetConnectionPropertyUiImpl * This; @@ -608,6 +725,7 @@ HRESULT WINAPI LanConnectUI_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVO This->pProperties = NULL; This->lpVtbl = (INetConnectionPropertyUi2*)&vt_NetConnectionPropertyUi; This->lpLanConUiInfoVtbl = (INetLanConnectionUiInfo*)&vt_NetLanConnectionUiInfo; + This->lpNetConnectionConnectUi = (INetConnectionConnectUi*)&vt_NetConnectionConnectUi; if (!SUCCEEDED (INetConnectionPropertyUi2_fnQueryInterface ((INetConnectionPropertyUi2*)This, riid, ppv))) { diff --git a/reactos/dll/win32/netshell/lang/de-DE.rc b/reactos/dll/win32/netshell/lang/de-DE.rc index a142113e0ae..5441177fcdf 100644 --- a/reactos/dll/win32/netshell/lang/de-DE.rc +++ b/reactos/dll/win32/netshell/lang/de-DE.rc @@ -19,8 +19,15 @@ BEGIN CHECKBOX "&Benachrichtigen, wenn diese Verbindung eingeschränkte oder\nkeine Konnektivität besitzt", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | WS_TABSTOP END -IDD_NETSTATUS DIALOGEX DISCARDABLE 0, 0, 200,180 -STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION +IDD_STATUS DIALOGEX DISCARDABLE 0, 0, 200, 280 +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Allgemein" +FONT 8, "MS Shell Dlg" +BEGIN +END + +IDD_LAN_NETSTATUS DIALOGEX DISCARDABLE 0, 0, 200, 180 +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Allgemein" FONT 8, "MS Shell Dlg" BEGIN @@ -71,4 +78,10 @@ BEGIN IDS_NET_DELETE "Löschen" IDS_NET_RENAME "Umbenennen" IDS_NET_PROPERTIES "Eigenschaften" + + IDS_FORMAT_BIT "%u Bit/s" + IDS_FORMAT_KBIT "%u KBit/s" + IDS_FORMAT_MBIT "%u MBit/s" + IDS_FORMAT_GBIT "%u GBit/s" + END diff --git a/reactos/dll/win32/netshell/lanstatusui.c b/reactos/dll/win32/netshell/lanstatusui.c index 5b8591cb69f..852c9171ed8 100644 --- a/reactos/dll/win32/netshell/lanstatusui.c +++ b/reactos/dll/win32/netshell/lanstatusui.c @@ -1,35 +1,355 @@ #include - /// CLSID /// HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{7007ACCF-3202-11D1-AAD2-00805FC1270E} // IID B722BCCB-4E68-101B-A2BC-00AA00404770 + +#define WM_SHOWSTATUSDLG (WM_USER+10) typedef struct { IOleCommandTarget * lpVtbl; + INetConnectionManager * lpNetMan; LONG ref; }ILanStatusImpl, *LPILanStatusImpl; +typedef struct +{ + INetConnection *pNet; + HWND hwndDlg; +}LANSTATUSUI_CONTEXT; + +VOID +UpdateLanStatusUIDlg(HWND hwndDlg, MIB_IFROW * IfEntry) +{ + WCHAR szFormat[MAX_PATH] = {0}; + WCHAR szBuffer[MAX_PATH] = {0}; + + if (IfEntry->dwSpeed < 1000) + { + if (LoadStringW(netshell_hInstance, IDS_FORMAT_BIT, szFormat, sizeof(szFormat)/sizeof(WCHAR))) + { + swprintf(szBuffer, szFormat, IfEntry->dwSpeed); + SendDlgItemMessageW(hwndDlg, IDC_SPEED, WM_SETTEXT, 0, (LPARAM)szBuffer); + } + } + else if (IfEntry->dwSpeed < 1000000) + { + if (LoadStringW(netshell_hInstance, IDS_FORMAT_KBIT, szFormat, sizeof(szFormat)/sizeof(WCHAR))) + { + swprintf(szBuffer, szFormat, IfEntry->dwSpeed/1000); + SendDlgItemMessageW(hwndDlg, IDC_SPEED, WM_SETTEXT, 0, (LPARAM)szBuffer); + } + } + else if (IfEntry->dwSpeed < 1000000000) + { + if (LoadStringW(netshell_hInstance, IDS_FORMAT_MBIT, szFormat, sizeof(szFormat)/sizeof(WCHAR))) + { + swprintf(szBuffer, szFormat, IfEntry->dwSpeed/1000000); + SendDlgItemMessageW(hwndDlg, IDC_SPEED, WM_SETTEXT, 0, (LPARAM)szBuffer); + } + } + else + { + if (LoadStringW(netshell_hInstance, IDS_FORMAT_KBIT, szFormat, sizeof(szFormat)/sizeof(WCHAR))) + { + swprintf(szBuffer, szFormat, IfEntry->dwSpeed/1000000000); + SendDlgItemMessageW(hwndDlg, IDC_SPEED, WM_SETTEXT, 0, (LPARAM)szBuffer); + } + } + + if (StrFormatByteSizeW(IfEntry->dwInOctets, szBuffer, sizeof(szFormat)/sizeof(WCHAR))) + { + SendDlgItemMessageW(hwndDlg, IDC_RECEIVED, WM_SETTEXT, 0, (LPARAM)szBuffer); + } + + if (StrFormatByteSizeW(IfEntry->dwOutOctets, szBuffer, sizeof(szFormat)/sizeof(WCHAR))) + { + SendDlgItemMessageW(hwndDlg, IDC_SEND, WM_SETTEXT, 0, (LPARAM)szBuffer); + } + + //FIXME + //set duration + +} + +VOID +InitializeLANStatusUiDlg(HWND hwndDlg, INetConnection * pNet) +{ + WCHAR szBuffer[MAX_PATH] = {0}; + NETCON_PROPERTIES * pProperties = NULL; + MIB_IFROW IfEntry; + DWORD dwSize, dwAdapterIndex, dwResult; + LPOLESTR pStr; + IP_ADAPTER_INFO * pAdapterInfo; + + if (INetConnection_GetProperties(pNet, &pProperties) != NOERROR) + return; + + if (pProperties->Status == NCS_DISCONNECTED) + LoadStringW(netshell_hInstance, IDS_STATUS_UNREACHABLE, szBuffer, MAX_PATH); + else if (pProperties->Status == NCS_MEDIA_DISCONNECTED) + LoadStringW(netshell_hInstance, IDS_STATUS_DISCONNECTED, szBuffer, MAX_PATH); + else if (pProperties->Status == NCS_CONNECTING) + LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTING, szBuffer, MAX_PATH); + else if (pProperties->Status == NCS_CONNECTED) + LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTED, szBuffer, MAX_PATH); + + SendDlgItemMessageW(hwndDlg, IDC_STATUS, WM_SETTEXT, 0, (LPARAM)szBuffer); + + if (FAILED(StringFromCLSID(&pProperties->guidId, &pStr))) + { + NcFreeNetconProperties(pProperties); + return; + } + NcFreeNetconProperties(pProperties); + + /* get the IfTable */ + dwSize = 0; + dwResult = GetAdaptersInfo(NULL, &dwSize); + if (dwResult!= ERROR_BUFFER_OVERFLOW) + { + CoTaskMemFree(pStr); + return; + } + + pAdapterInfo = (PIP_ADAPTER_INFO)CoTaskMemAlloc(dwSize); + if (!pAdapterInfo) + { + CoTaskMemFree(pAdapterInfo); + CoTaskMemFree(pStr); + return; + } + + if (GetAdaptersInfo(pAdapterInfo, &dwSize) != NO_ERROR) + { + CoTaskMemFree(pAdapterInfo); + CoTaskMemFree(pStr); + return; + } + + if (!GetAdapterIndexFromNetCfgInstanceId(pAdapterInfo, pStr, &dwAdapterIndex)) + { + CoTaskMemFree(pAdapterInfo); + CoTaskMemFree(pStr); + return; + } + CoTaskMemFree(pStr); + + /* get detailed adapter info */ + ZeroMemory(&IfEntry, sizeof(IfEntry)); + IfEntry.dwIndex = dwAdapterIndex; + if(GetIfEntry(&IfEntry) != NO_ERROR) + { + CoTaskMemFree(pAdapterInfo); + return; + } + + UpdateLanStatusUIDlg(hwndDlg, &IfEntry); + + CoTaskMemFree(pAdapterInfo); +} INT_PTR CALLBACK -LANStatusUIDlg( +LANStatusUiDlg( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { + PROPSHEETPAGE *page; + LANSTATUSUI_CONTEXT * pContext; + LPPSHNOTIFY lppsn; + switch(uMsg) { case WM_INITDIALOG: + page = (PROPSHEETPAGE*)lParam; + pContext = (LANSTATUSUI_CONTEXT*)page->lParam; + InitializeLANStatusUiDlg(hwndDlg, pContext->pNet); + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext); return TRUE; + case WM_COMMAND: + pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); + if (LOWORD(wParam) == IDC_STATUS_PROPERTIES) + { + //FIXME + // show net connection property dialog + // + if (pContext) + ShowNetConnectionProperties(pContext->pNet, pContext->hwndDlg); + break; + } + else if (LOWORD(wParam) == IDC_ENDISABLE) + { + //FIXME + // disable network adapter + break; + } + case WM_NOTIFY: + lppsn = (LPPSHNOTIFY) lParam; + if (lppsn->hdr.code == PSN_APPLY || lppsn->hdr.code == PSN_RESET) + { + pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); + DestroyWindow(pContext->hwndDlg); + pContext->hwndDlg = NULL; + return PSNRET_NOERROR; + } + break; } return FALSE; } +VOID +ShowStatusPropertyDialog( + LANSTATUSUI_CONTEXT * pContext, + HWND hwndDlg) +{ + HPROPSHEETPAGE hppages[2]; + PROPSHEETHEADERW pinfo; + NETCON_PROPERTIES * pProperties = NULL; + HWND hwnd; + ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW)); + ZeroMemory(hppages, sizeof(hppages)); + pinfo.dwSize = sizeof(PROPSHEETHEADERW); + pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW | PSH_MODELESS; + pinfo.u3.phpage = hppages; + pinfo.hwndParent = hwndDlg; + if (INetConnection_GetProperties(pContext->pNet, &pProperties) == NOERROR) + { + if (pProperties->pszwName) + { + pinfo.pszCaption = pProperties->pszwName; + pinfo.dwFlags |= PSH_PROPTITLE; + } + + if (pProperties->MediaType == NCM_LAN) + { + hppages[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUS), LANStatusUiDlg, (LPARAM)pContext, NULL); + if (hppages[0]) + pinfo.nPages++; + + if (pinfo.nPages) + { + hwnd = (HWND)PropertySheetW(&pinfo); + if (hwnd) + { + pContext->hwndDlg = hwnd; + } + } + } + NcFreeNetconProperties(pProperties); + } +} + +INT_PTR +CALLBACK +LANStatusDlg( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + LANSTATUSUI_CONTEXT * pContext; + + switch(uMsg) + { + case WM_INITDIALOG: + pContext = (LANSTATUSUI_CONTEXT*)CoTaskMemAlloc(sizeof(LANSTATUSUI_CONTEXT)); + if (!pContext) + return FALSE; + pContext->hwndDlg = NULL; + pContext->pNet = (INetConnection*)lParam; + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext); + return TRUE; + case WM_SHOWSTATUSDLG: + if (LOWORD(lParam) == WM_LBUTTONDOWN) + { + pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); + if (!pContext) + break; + + if (pContext->hwndDlg) + { + ShowWindow(pContext->hwndDlg, SW_SHOW); + BringWindowToTop(pContext->hwndDlg); + } + else + { + ShowStatusPropertyDialog(pContext, hwndDlg); + } + break; + } + break; + } + return FALSE; +} +static +HRESULT +InitializeNetConnectTray( + ILanStatusImpl * This) +{ + NOTIFYICONDATAW nid; + HWND hwndDlg; + INetConnectionManager * INetConMan; + IEnumNetConnection * IEnumCon; + INetConnection * INetCon; + NETCON_PROPERTIES* pProps; + HRESULT hr; + ULONG Count; + ULONG Index; + + /* get an instance to of IConnectionManager */ + hr = INetConnectionManager_Constructor(NULL, &IID_INetConnectionManager, (LPVOID*)&INetConMan); + if (FAILED(hr)) + return hr; + + hr = INetConnectionManager_EnumConnections(INetConMan, NCME_DEFAULT, &IEnumCon); + if (FAILED(hr)) + { + INetConnectionManager_Release(INetConMan); + return hr; + } + + Index = 1; + do + { + hr = IEnumNetConnection_Next(IEnumCon, 1, &INetCon, &Count); + if (hr == S_OK) + { + hwndDlg = CreateDialogParamW(netshell_hInstance, MAKEINTRESOURCEW(IDD_STATUS), NULL, LANStatusDlg, (LPARAM)INetCon); + if (hwndDlg) + { + ZeroMemory(&nid, sizeof(nid)); + nid.cbSize = sizeof(nid); + nid.uID = Index++; + nid.uFlags = NIF_ICON | NIF_MESSAGE; + nid.u.uVersion = 3; + nid.uCallbackMessage = WM_SHOWSTATUSDLG; + nid.hWnd = hwndDlg; + nid.hIcon = LoadIcon(netshell_hInstance, MAKEINTRESOURCE(IDI_SHELL_NETWORK_FOLDER)); //FIXME + hr = INetConnection_GetProperties(INetCon, &pProps); + if (SUCCEEDED(hr)) + { + if (!(pProps->dwCharacter & NCCF_SHOW_ICON)) + { + nid.dwState = NIS_HIDDEN; + } + } + if (Shell_NotifyIconW(NIM_ADD, &nid)) + Index++; + } + } + }while(hr == S_OK); + + This->lpNetMan = INetConMan; + IEnumNetConnection_Release(IEnumCon); + return S_OK; +} static HRESULT WINAPI @@ -48,7 +368,7 @@ IOleCommandTarget_fnQueryInterface( IUnknown_AddRef(iface); return S_OK; } - + MessageBoxW(NULL, L"IOleCommandTarget_fnQueryInterface", NULL, MB_OK); return E_NOINTERFACE; } @@ -90,7 +410,8 @@ IOleCommandTarget_fnQueryStatus( OLECMD *prgCmds, OLECMDTEXT *pCmdText) { - MessageBoxW(NULL, L"IOleCommandTarget_fnQueryStatus", NULL, MB_OK); + MessageBoxW(NULL, L"222222222222222222222", L"IOleCommandTarget_fnQueryStatus", MB_OK); + MessageBoxW(NULL, pCmdText->rgwz, L"IOleCommandTarget_fnQueryStatus", MB_OK); return E_NOTIMPL; } @@ -105,24 +426,13 @@ IOleCommandTarget_fnExec( VARIANT *pvaIn, VARIANT *pvaOut) { - NOTIFYICONDATA nid; - HWND hwndDlg; - //ILanStatusImpl * This = (ILanStatusImpl*)iface; + ILanStatusImpl * This = (ILanStatusImpl*)iface; - hwndDlg = CreateDialogW(netshell_hInstance, MAKEINTRESOURCEW(IDD_NETSTATUS), NULL, LANStatusUIDlg); if (pguidCmdGroup) { if (IsEqualIID(pguidCmdGroup, &CGID_ShellServiceObject)) { - nid.cbSize = sizeof(nid); - nid.uID = 100; - nid.uFlags = NIF_ICON; - nid.u.uVersion = NOTIFYICON_VERSION; - nid.hWnd = hwndDlg; - nid.hIcon = LoadIcon(netshell_hInstance, MAKEINTRESOURCE(IDI_SHELL_NETWORK_FOLDER)); - - Shell_NotifyIcon(NIM_ADD, &nid); - return S_OK; + return InitializeNetConnectTray(This); } } return S_OK; @@ -155,13 +465,13 @@ HRESULT WINAPI LanConnectStatusUI_Constructor (IUnknown * pUnkOuter, REFIID riid This->ref = 1; This->lpVtbl = (IOleCommandTarget*)&vt_OleCommandTarget; + This->lpNetMan = NULL; - if (!SUCCEEDED (IOleCommandTarget_fnQueryInterface ((IOleCommandTarget*)This, riid, ppv))) + if (FAILED(IOleCommandTarget_fnQueryInterface ((IOleCommandTarget*)This, riid, ppv))) { IOleCommandTarget_Release((IUnknown*)This); return E_NOINTERFACE; } - IOleCommandTarget_Release((IUnknown*)This); return S_OK; } diff --git a/reactos/dll/win32/netshell/precomp.h b/reactos/dll/win32/netshell/precomp.h index 55eddea1480..1b8d0ff959b 100644 --- a/reactos/dll/win32/netshell/precomp.h +++ b/reactos/dll/win32/netshell/precomp.h @@ -81,6 +81,7 @@ extern const GUID GUID_DEVCLASS_NET; /* shfldr_netconnect.c */ +HRESULT ShowNetConnectionProperties(INetConnection * pNetConnect, HWND hwnd); HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); /* enumlist.c */ @@ -96,8 +97,10 @@ IClassFactory * IClassFactory_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcR /* connectmanager.c */ HRESULT WINAPI INetConnectionManager_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +BOOL GetAdapterIndexFromNetCfgInstanceId(PIP_ADAPTER_INFO pAdapterInfo, LPWSTR szNetCfg, PDWORD pIndex); /* lanconnectui.c */ +HPROPSHEETPAGE InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle); HRESULT WINAPI LanConnectUI_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); /* lanstatusui.c */ diff --git a/reactos/dll/win32/netshell/resource.h b/reactos/dll/win32/netshell/resource.h index bd082bff3d6..3de22dfe6df 100644 --- a/reactos/dll/win32/netshell/resource.h +++ b/reactos/dll/win32/netshell/resource.h @@ -8,7 +8,9 @@ /* dialogs */ #define IDD_NETPROPERTIES 400 -#define IDD_NETSTATUS 401 +#define IDD_LAN_NETSTATUS 401 +#define IDD_STATUS 402 + /* dialog controls */ #define IDC_NETCARDNAME 1000 @@ -55,3 +57,9 @@ #define IDS_NET_DELETE 10105 #define IDS_NET_RENAME 10106 #define IDS_NET_PROPERTIES 10107 + +#define IDS_FORMAT_BIT 10200 +#define IDS_FORMAT_MBIT 10201 +#define IDS_FORMAT_KBIT 10202 +#define IDS_FORMAT_GBIT 10203 + diff --git a/reactos/dll/win32/netshell/shfldr_netconnect.c b/reactos/dll/win32/netshell/shfldr_netconnect.c index 2191019c4f5..5c73fb06ab0 100644 --- a/reactos/dll/win32/netshell/shfldr_netconnect.c +++ b/reactos/dll/win32/netshell/shfldr_netconnect.c @@ -745,76 +745,92 @@ PropSheetExCallback(HPROPSHEETPAGE hPage, LPARAM lParam) pinfo->u3.phpage[pinfo->nPages++] = hPage; return TRUE; } - return FALSE; + return FALSE; } +HRESULT +ShowNetConnectionProperties( + INetConnection * pNetConnect, + HWND hwnd) +{ + HRESULT hr; + CLSID ClassID; + PROPSHEETHEADERW pinfo; + HPROPSHEETPAGE hppages[MAX_PROPERTY_SHEET_PAGE]; + INetConnectionPropertyUi * pNCP; + NETCON_PROPERTIES * pProperties; + + if (INetConnection_GetProperties(pNetConnect, &pProperties) != NOERROR) + return E_FAIL; + + hr = INetConnection_GetUiObjectClassId(pNetConnect, &ClassID); + if (FAILED(hr)) + { + NcFreeNetconProperties(pProperties); + return hr; + } + + hr = CoCreateInstance(&ClassID, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionPropertyUi, (LPVOID)&pNCP); + if (FAILED(hr)) + { + NcFreeNetconProperties(pProperties); + return hr; + } + + hr = INetConnectionPropertyUi_SetConnection(pNCP, pNetConnect); + if (SUCCEEDED(hr)) + { + ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW)); + ZeroMemory(hppages, sizeof(hppages)); + pinfo.dwSize = sizeof(PROPSHEETHEADERW); + pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; + pinfo.u3.phpage = hppages; + pinfo.hwndParent = hwnd; + + pinfo.pszCaption = pProperties->pszwName; + hr = INetConnectionPropertyUi_AddPages(pNCP, hwnd, PropSheetExCallback, (LPARAM)&pinfo); + if (SUCCEEDED(hr)) + { + if(PropertySheetW(&pinfo) < 0) + hr = E_FAIL; + } + } + INetConnectionPropertyUi_Release(pNCP); + NcFreeNetconProperties(pProperties); + return hr; +} + + /************************************************************************** * ISF_NetConnect_IContextMenu_InvokeCommand() */ static HRESULT WINAPI ISF_NetConnect_IContextMenu2_InvokeCommand( - IContextMenu2 *iface, - LPCMINVOKECOMMANDINFO lpcmi) + IContextMenu2 *iface, + LPCMINVOKECOMMANDINFO lpcmi) { IGenericSFImpl * This = impl_from_IContextMenu2(iface); VALUEStruct * val; - NETCON_PROPERTIES * pProperties; HRESULT hr = S_OK; - PROPSHEETHEADERW pinfo; - CLSID ClassID; - HPROPSHEETPAGE hppages[MAX_PROPERTY_SHEET_PAGE]; - INetConnectionPropertyUi * pNCP; + val = _ILGetValueStruct(This->apidl); if (!val) return E_FAIL; - if (INetConnection_GetProperties((INetConnection*)val->pItem, &pProperties) != NOERROR) - return E_FAIL; - if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_STATUS)) { #if 0 if (pProperties->MediaType == NCM_LAN) { hr = ShowLANConnectionStatusDialog(pProperties); - NcFreeNetconProperties(pProperties); } #endif return hr; } else if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_PROPERTIES)) { - hr = INetConnection_GetUiObjectClassId(val->pItem, &ClassID); - if (SUCCEEDED(hr)) - { - /* FIXME perform version checks */ - hr = CoCreateInstance(&ClassID, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionPropertyUi, (LPVOID)&pNCP); - if (SUCCEEDED(hr)) - { - hr = INetConnectionPropertyUi_SetConnection(pNCP, val->pItem); - if (SUCCEEDED(hr)) - { - ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW)); - ZeroMemory(hppages, sizeof(hppages)); - pinfo.dwSize = sizeof(PROPSHEETHEADERW); - pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; - pinfo.u3.phpage = hppages; - pinfo.hwndParent = lpcmi->hwnd; - - pinfo.pszCaption = pProperties->pszwName; - hr = INetConnectionPropertyUi_AddPages(pNCP, lpcmi->hwnd, PropSheetExCallback, (LPARAM)&pinfo); - if (SUCCEEDED(hr)) - { - if(PropertySheetW(&pinfo) < 0) - hr = E_FAIL; - } - } - INetConnectionPropertyUi_Release(pNCP); - } - - } - NcFreeNetconProperties(pProperties); - return hr; + /* FIXME perform version checks */ + return ShowNetConnectionProperties(val->pItem, lpcmi->hwnd); } return S_OK;