- 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
This commit is contained in:
Johannes Anderwald 2008-09-17 13:58:48 +00:00
parent 84df91a549
commit 3ed4acffca
7 changed files with 553 additions and 78 deletions

View file

@ -301,13 +301,19 @@ HRESULT WINAPI IConnection_Constructor (INetConnection **ppv, PINetConnectionIte
CopyMemory(&This->Props, &pItem->Props, sizeof(NETCON_PROPERTIES)); CopyMemory(&This->Props, &pItem->Props, sizeof(NETCON_PROPERTIES));
This->Props.pszwName = CoTaskMemAlloc((wcslen(pItem->Props.pszwName)+1)*sizeof(WCHAR)); if (pItem->Props.pszwName)
if (This->Props.pszwName) {
wcscpy(This->Props.pszwName, 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 (pItem->Props.pszwDeviceName)
if (This->Props.pszwDeviceName) {
wcscpy(This->Props.pszwDeviceName, 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; *ppv = (INetConnection *)This;
@ -449,7 +455,7 @@ static const IEnumNetConnectionVtbl vt_EnumNetConnection =
IEnumNetConnection_fnClone IEnumNetConnection_fnClone
}; };
static
BOOL BOOL
GetAdapterIndexFromNetCfgInstanceId(PIP_ADAPTER_INFO pAdapterInfo, LPWSTR szNetCfg, PDWORD pIndex) GetAdapterIndexFromNetCfgInstanceId(PIP_ADAPTER_INFO pAdapterInfo, LPWSTR szNetCfg, PDWORD pIndex)
{ {
@ -474,7 +480,6 @@ GetAdapterIndexFromNetCfgInstanceId(PIP_ADAPTER_INFO pAdapterInfo, LPWSTR szNetC
return FALSE; return FALSE;
} }
static static
BOOL BOOL
EnumerateINetConnections(INetConnectionManagerImpl *This) EnumerateINetConnections(INetConnectionManagerImpl *This)
@ -543,6 +548,7 @@ EnumerateINetConnections(INetConnectionManagerImpl *This)
dwIndex = 0; dwIndex = 0;
do do
{ {
ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA)); ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA));
DevInfo.cbSize = sizeof(DevInfo); DevInfo.cbSize = sizeof(DevInfo);
@ -566,9 +572,10 @@ EnumerateINetConnections(INetConnectionManagerImpl *This)
break; break;
} }
RegCloseKey(hSubKey); RegCloseKey(hSubKey);
/* get the current adapter index from NetCfgInstanceId */ /* get the current adapter index from NetCfgInstanceId */
if (!GetAdapterIndexFromNetCfgInstanceId(pAdapterInfo, szNetCfg, &dwAdapterIndex)) if (!GetAdapterIndexFromNetCfgInstanceId(pAdapterInfo, szNetCfg, &dwAdapterIndex))
break; continue;
/* get detailed adapter info */ /* get detailed adapter info */
ZeroMemory(&IfEntry, sizeof(IfEntry)); ZeroMemory(&IfEntry, sizeof(IfEntry));

View file

@ -24,6 +24,7 @@ typedef struct
{ {
INetConnectionPropertyUi2 *lpVtbl; INetConnectionPropertyUi2 *lpVtbl;
INetLanConnectionUiInfo * lpLanConUiInfoVtbl; INetLanConnectionUiInfo * lpLanConUiInfoVtbl;
INetConnectionConnectUi * lpNetConnectionConnectUi;
INetConnection * pCon; INetConnection * pCon;
INetCfgLock *NCfgLock; INetCfgLock *NCfgLock;
INetCfg * pNCfg; INetCfg * pNCfg;
@ -36,6 +37,12 @@ static LPINetConnectionPropertyUiImpl __inline impl_from_NetLanConnectionUiInfo(
return (LPINetConnectionPropertyUiImpl)((char *)iface - FIELD_OFFSET(INetConnectionPropertyUiImpl, lpLanConUiInfoVtbl)); 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 HPROPSHEETPAGE
InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle) InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle)
{ {
@ -389,7 +396,7 @@ INetConnectionPropertyUi2_fnQueryInterface(
REFIID iid, REFIID iid,
LPVOID * ppvObj) LPVOID * ppvObj)
{ {
//LPOLESTR pStr; LPOLESTR pStr;
INetConnectionPropertyUiImpl * This = (INetConnectionPropertyUiImpl*)iface; INetConnectionPropertyUiImpl * This = (INetConnectionPropertyUiImpl*)iface;
*ppvObj = NULL; *ppvObj = NULL;
@ -407,9 +414,16 @@ INetConnectionPropertyUi2_fnQueryInterface(
IUnknown_AddRef(iface); IUnknown_AddRef(iface);
return S_OK; return S_OK;
} }
//StringFromCLSID(iid, &pStr); else if (IsEqualIID(iid, &IID_INetConnectionConnectUi))
//MessageBoxW(NULL, pStr, L"INetConnectionPropertyUi_fnQueryInterface", MB_OK); {
//CoTaskMemFree(pStr); *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; return E_NOINTERFACE;
} }
@ -587,6 +601,109 @@ static const INetLanConnectionUiInfoVtbl vt_NetLanConnectionUiInfo =
INetLanConnectionUiInfo_fnRelease, INetLanConnectionUiInfo_fnRelease,
INetLanConnectionUiInfo_fnGetDeviceGuid, 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) HRESULT WINAPI LanConnectUI_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv)
{ {
INetConnectionPropertyUiImpl * This; INetConnectionPropertyUiImpl * This;
@ -608,6 +725,7 @@ HRESULT WINAPI LanConnectUI_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVO
This->pProperties = NULL; This->pProperties = NULL;
This->lpVtbl = (INetConnectionPropertyUi2*)&vt_NetConnectionPropertyUi; This->lpVtbl = (INetConnectionPropertyUi2*)&vt_NetConnectionPropertyUi;
This->lpLanConUiInfoVtbl = (INetLanConnectionUiInfo*)&vt_NetLanConnectionUiInfo; This->lpLanConUiInfoVtbl = (INetLanConnectionUiInfo*)&vt_NetLanConnectionUiInfo;
This->lpNetConnectionConnectUi = (INetConnectionConnectUi*)&vt_NetConnectionConnectUi;
if (!SUCCEEDED (INetConnectionPropertyUi2_fnQueryInterface ((INetConnectionPropertyUi2*)This, riid, ppv))) if (!SUCCEEDED (INetConnectionPropertyUi2_fnQueryInterface ((INetConnectionPropertyUi2*)This, riid, ppv)))
{ {

View file

@ -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 CHECKBOX "&Benachrichtigen, wenn diese Verbindung eingeschränkte oder\nkeine Konnektivität besitzt", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | WS_TABSTOP
END END
IDD_NETSTATUS DIALOGEX DISCARDABLE 0, 0, 200,180 IDD_STATUS DIALOGEX DISCARDABLE 0, 0, 200, 280
STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION 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" CAPTION "Allgemein"
FONT 8, "MS Shell Dlg" FONT 8, "MS Shell Dlg"
BEGIN BEGIN
@ -71,4 +78,10 @@ BEGIN
IDS_NET_DELETE "Löschen" IDS_NET_DELETE "Löschen"
IDS_NET_RENAME "Umbenennen" IDS_NET_RENAME "Umbenennen"
IDS_NET_PROPERTIES "Eigenschaften" 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 END

View file

@ -1,35 +1,355 @@
#include <precomp.h> #include <precomp.h>
/// CLSID /// CLSID
/// HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{7007ACCF-3202-11D1-AAD2-00805FC1270E} /// HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{7007ACCF-3202-11D1-AAD2-00805FC1270E}
// IID B722BCCB-4E68-101B-A2BC-00AA00404770 // IID B722BCCB-4E68-101B-A2BC-00AA00404770
#define WM_SHOWSTATUSDLG (WM_USER+10)
typedef struct typedef struct
{ {
IOleCommandTarget * lpVtbl; IOleCommandTarget * lpVtbl;
INetConnectionManager * lpNetMan;
LONG ref; LONG ref;
}ILanStatusImpl, *LPILanStatusImpl; }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 INT_PTR
CALLBACK CALLBACK
LANStatusUIDlg( LANStatusUiDlg(
HWND hwndDlg, HWND hwndDlg,
UINT uMsg, UINT uMsg,
WPARAM wParam, WPARAM wParam,
LPARAM lParam LPARAM lParam
) )
{ {
PROPSHEETPAGE *page;
LANSTATUSUI_CONTEXT * pContext;
LPPSHNOTIFY lppsn;
switch(uMsg) switch(uMsg)
{ {
case WM_INITDIALOG: case WM_INITDIALOG:
page = (PROPSHEETPAGE*)lParam;
pContext = (LANSTATUSUI_CONTEXT*)page->lParam;
InitializeLANStatusUiDlg(hwndDlg, pContext->pNet);
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext);
return TRUE; 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; 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 static
HRESULT HRESULT
WINAPI WINAPI
@ -48,7 +368,7 @@ IOleCommandTarget_fnQueryInterface(
IUnknown_AddRef(iface); IUnknown_AddRef(iface);
return S_OK; return S_OK;
} }
MessageBoxW(NULL, L"IOleCommandTarget_fnQueryInterface", NULL, MB_OK);
return E_NOINTERFACE; return E_NOINTERFACE;
} }
@ -90,7 +410,8 @@ IOleCommandTarget_fnQueryStatus(
OLECMD *prgCmds, OLECMD *prgCmds,
OLECMDTEXT *pCmdText) 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; return E_NOTIMPL;
} }
@ -105,24 +426,13 @@ IOleCommandTarget_fnExec(
VARIANT *pvaIn, VARIANT *pvaIn,
VARIANT *pvaOut) VARIANT *pvaOut)
{ {
NOTIFYICONDATA nid; ILanStatusImpl * This = (ILanStatusImpl*)iface;
HWND hwndDlg;
//ILanStatusImpl * This = (ILanStatusImpl*)iface;
hwndDlg = CreateDialogW(netshell_hInstance, MAKEINTRESOURCEW(IDD_NETSTATUS), NULL, LANStatusUIDlg);
if (pguidCmdGroup) if (pguidCmdGroup)
{ {
if (IsEqualIID(pguidCmdGroup, &CGID_ShellServiceObject)) if (IsEqualIID(pguidCmdGroup, &CGID_ShellServiceObject))
{ {
nid.cbSize = sizeof(nid); return InitializeNetConnectTray(This);
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 S_OK; return S_OK;
@ -155,13 +465,13 @@ HRESULT WINAPI LanConnectStatusUI_Constructor (IUnknown * pUnkOuter, REFIID riid
This->ref = 1; This->ref = 1;
This->lpVtbl = (IOleCommandTarget*)&vt_OleCommandTarget; 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); IOleCommandTarget_Release((IUnknown*)This);
return E_NOINTERFACE; return E_NOINTERFACE;
} }
IOleCommandTarget_Release((IUnknown*)This); IOleCommandTarget_Release((IUnknown*)This);
return S_OK; return S_OK;
} }

View file

@ -81,6 +81,7 @@ extern const GUID GUID_DEVCLASS_NET;
/* shfldr_netconnect.c */ /* shfldr_netconnect.c */
HRESULT ShowNetConnectionProperties(INetConnection * pNetConnect, HWND hwnd);
HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
/* enumlist.c */ /* enumlist.c */
@ -96,8 +97,10 @@ IClassFactory * IClassFactory_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcR
/* connectmanager.c */ /* connectmanager.c */
HRESULT WINAPI INetConnectionManager_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI INetConnectionManager_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
BOOL GetAdapterIndexFromNetCfgInstanceId(PIP_ADAPTER_INFO pAdapterInfo, LPWSTR szNetCfg, PDWORD pIndex);
/* lanconnectui.c */ /* lanconnectui.c */
HPROPSHEETPAGE InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle);
HRESULT WINAPI LanConnectUI_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI LanConnectUI_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
/* lanstatusui.c */ /* lanstatusui.c */

View file

@ -8,7 +8,9 @@
/* dialogs */ /* dialogs */
#define IDD_NETPROPERTIES 400 #define IDD_NETPROPERTIES 400
#define IDD_NETSTATUS 401 #define IDD_LAN_NETSTATUS 401
#define IDD_STATUS 402
/* dialog controls */ /* dialog controls */
#define IDC_NETCARDNAME 1000 #define IDC_NETCARDNAME 1000
@ -55,3 +57,9 @@
#define IDS_NET_DELETE 10105 #define IDS_NET_DELETE 10105
#define IDS_NET_RENAME 10106 #define IDS_NET_RENAME 10106
#define IDS_NET_PROPERTIES 10107 #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

View file

@ -745,76 +745,92 @@ PropSheetExCallback(HPROPSHEETPAGE hPage, LPARAM lParam)
pinfo->u3.phpage[pinfo->nPages++] = hPage; pinfo->u3.phpage[pinfo->nPages++] = hPage;
return TRUE; 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() * ISF_NetConnect_IContextMenu_InvokeCommand()
*/ */
static HRESULT WINAPI ISF_NetConnect_IContextMenu2_InvokeCommand( static HRESULT WINAPI ISF_NetConnect_IContextMenu2_InvokeCommand(
IContextMenu2 *iface, IContextMenu2 *iface,
LPCMINVOKECOMMANDINFO lpcmi) LPCMINVOKECOMMANDINFO lpcmi)
{ {
IGenericSFImpl * This = impl_from_IContextMenu2(iface); IGenericSFImpl * This = impl_from_IContextMenu2(iface);
VALUEStruct * val; VALUEStruct * val;
NETCON_PROPERTIES * pProperties;
HRESULT hr = S_OK; HRESULT hr = S_OK;
PROPSHEETHEADERW pinfo;
CLSID ClassID;
HPROPSHEETPAGE hppages[MAX_PROPERTY_SHEET_PAGE];
INetConnectionPropertyUi * pNCP;
val = _ILGetValueStruct(This->apidl); val = _ILGetValueStruct(This->apidl);
if (!val) if (!val)
return E_FAIL; return E_FAIL;
if (INetConnection_GetProperties((INetConnection*)val->pItem, &pProperties) != NOERROR)
return E_FAIL;
if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_STATUS)) if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_STATUS))
{ {
#if 0 #if 0
if (pProperties->MediaType == NCM_LAN) if (pProperties->MediaType == NCM_LAN)
{ {
hr = ShowLANConnectionStatusDialog(pProperties); hr = ShowLANConnectionStatusDialog(pProperties);
NcFreeNetconProperties(pProperties);
} }
#endif #endif
return hr; return hr;
} }
else if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_PROPERTIES)) else if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_PROPERTIES))
{ {
hr = INetConnection_GetUiObjectClassId(val->pItem, &ClassID); /* FIXME perform version checks */
if (SUCCEEDED(hr)) return ShowNetConnectionProperties(val->pItem, lpcmi->hwnd);
{
/* 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;
} }
return S_OK; return S_OK;