Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272/* * PROJECT: ReactOS Shell * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) * PURPOSE: CLanStatus: Lan connection status dialog * COPYRIGHT: Copyright 2008 Johannes Anderwald (johannes.anderwald@reactos.org) */
#include "precomp.h"
#include <winsock.h>
#define NETTIMERID 0xFABC
CLanStatus::CLanStatus() : m_lpNetMan(NULL), m_pHead(NULL){}
VOIDUpdateLanStatusUiDlg( HWND hwndDlg, MIB_IFROW *IfEntry, LANSTATUSUI_CONTEXT *pContext){ WCHAR szFormat[MAX_PATH] = {0}; WCHAR szBuffer[MAX_PATH] = {0}; SYSTEMTIME TimeConnected; DWORD DurationSeconds; WCHAR Buffer[100]; WCHAR DayBuffer[30]; WCHAR LocBuffer[50];
#if 0 ULONGLONG Ticks;#else DWORD Ticks;#endif
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_GBIT, 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); }
#if 0 Ticks = GetTickCount64();#else Ticks = GetTickCount();#endif
DurationSeconds = Ticks / 1000; TimeConnected.wSecond = (DurationSeconds % 60); TimeConnected.wMinute = (DurationSeconds / 60) % 60; TimeConnected.wHour = (DurationSeconds / (60 * 60)) % 24; TimeConnected.wDay = DurationSeconds / (60 * 60 * 24);
if (!GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &TimeConnected, L"HH':'mm':'ss", LocBuffer, sizeof(LocBuffer) / sizeof(LocBuffer[0]))) return;
if (!TimeConnected.wDay) { SendDlgItemMessageW(hwndDlg, IDC_DURATION, WM_SETTEXT, 0, (LPARAM)LocBuffer); } else { if (TimeConnected.wDay == 1) { if (!LoadStringW(netshell_hInstance, IDS_DURATION_DAY, DayBuffer, sizeof(DayBuffer) / sizeof(DayBuffer[0]))) DayBuffer[0] = L'\0'; } else { if (!LoadStringW(netshell_hInstance, IDS_DURATION_DAYS, DayBuffer, sizeof(DayBuffer) / sizeof(DayBuffer[0]))) DayBuffer[0] = L'\0'; } swprintf(Buffer, DayBuffer, TimeConnected.wDay, LocBuffer); SendDlgItemMessageW(hwndDlg, IDC_DURATION, WM_SETTEXT, 0, (LPARAM)Buffer); }
}
VOIDUpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext){ MIB_IFROW IfEntry; HICON hIcon, hOldIcon = NULL; NOTIFYICONDATAW nid; NETCON_PROPERTIES * pProperties = NULL;
ZeroMemory(&IfEntry, sizeof(IfEntry)); IfEntry.dwIndex = pContext->dwAdapterIndex; if (GetIfEntry(&IfEntry) != NO_ERROR) { return; }
if (pContext->Status == (UINT)-1) { /* * On first execution, pContext->dw[In|Out]Octets will be zero while * the interface info is already refreshed with non-null data, so a * gap is normal and does not correspond to an effective TX or RX packet. */ pContext->dwInOctets = IfEntry.dwInOctets; pContext->dwOutOctets = IfEntry.dwOutOctets; }
hIcon = NULL; if (IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_CONNECTED || IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_OPERATIONAL) { if (pContext->dwInOctets == IfEntry.dwInOctets && pContext->dwOutOctets == IfEntry.dwOutOctets && pContext->Status != 0) { hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE), IMAGE_ICON, 32, 32, LR_SHARED); pContext->Status = 0; } else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->dwOutOctets != IfEntry.dwOutOctets && pContext->Status != 1) { hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANSREC), IMAGE_ICON, 32, 32, LR_SHARED); pContext->Status = 1; } else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->Status != 2) { hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_REC), IMAGE_ICON, 32, 32, LR_SHARED); pContext->Status = 2; } else if (pContext->dwOutOctets != IfEntry.dwOutOctets && pContext->Status != 3) { hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANS), IMAGE_ICON, 32, 32, LR_SHARED); pContext->Status = 3; } } else if (IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_UNREACHABLE || IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_DISCONNECTED) { if (pContext->Status != 4) { hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_SHARED); pContext->Status = 4; } } else if (IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_NON_OPERATIONAL) { if (pContext->Status != 5) { hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_SHARED); pContext->Status = 5; } }
if (hwndDlg && hIcon) { hOldIcon = (HICON)SendDlgItemMessageW(hwndDlg, IDC_NETSTAT, STM_SETICON, (WPARAM)hIcon, 0); if (hOldIcon) DestroyIcon(hOldIcon); }
ZeroMemory(&nid, sizeof(nid)); nid.cbSize = sizeof(nid); nid.uID = pContext->uID; nid.hWnd = pContext->hwndStatusDlg; nid.uVersion = NOTIFYICON_VERSION;
if (pContext->pNet->GetProperties(&pProperties) == S_OK) { if (pProperties->dwCharacter & NCCF_SHOW_ICON) { if (hwndDlg) nid.hIcon = (HICON)CopyImage(hIcon, IMAGE_ICON, 16, 16, LR_COPYFROMRESOURCE); else nid.hIcon = hIcon;
if (nid.hIcon) nid.uFlags |= NIF_ICON;
nid.uFlags |= NIF_STATE; nid.dwState = 0; nid.dwStateMask = NIS_HIDDEN;
if (pProperties->pszwName) { if (wcslen(pProperties->pszwName) * sizeof(WCHAR) < sizeof(nid.szTip)) { nid.uFlags |= NIF_TIP; wcscpy(nid.szTip, pProperties->pszwName); } else { CopyMemory(nid.szTip, pProperties->pszwName, sizeof(nid.szTip) - sizeof(WCHAR)); nid.szTip[(sizeof(nid.szTip)/sizeof(WCHAR))-1] = L'\0'; nid.uFlags |= NIF_TIP; } } } else { nid.uFlags |= NIF_STATE; nid.dwState = NIS_HIDDEN; nid.dwStateMask = NIS_HIDDEN;
} NcFreeNetconProperties(pProperties); }
Shell_NotifyIconW(NIM_MODIFY, &nid);
if (nid.uFlags & NIF_ICON) DestroyIcon(nid.hIcon);
pContext->dwInOctets = IfEntry.dwInOctets; pContext->dwOutOctets = IfEntry.dwOutOctets;
if (hwndDlg) UpdateLanStatusUiDlg(hwndDlg, &IfEntry, pContext);}
VOIDInitializeLANStatusUiDlg(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext){ WCHAR szBuffer[MAX_PATH] = {0}; NETCON_PROPERTIES * pProperties;
if (pContext->pNet->GetProperties(&pProperties) != S_OK) 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);
pContext->dwInOctets = 0; pContext->dwOutOctets = 0;
/* update adapter info */ pContext->Status = -1; UpdateLanStatus(hwndDlg, pContext); NcFreeNetconProperties(pProperties);}
staticVOIDInsertColumnToListView( HWND hDlgCtrl, UINT ResId, UINT SubItem, UINT Size){ WCHAR szBuffer[200]; LVCOLUMNW lc;
if (!LoadStringW(netshell_hInstance, ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) return;
memset(&lc, 0, sizeof(LV_COLUMN) ); lc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT; lc.iSubItem = SubItem; lc.fmt = LVCFMT_FIXED_WIDTH; lc.cx = Size; lc.cchTextMax = wcslen(szBuffer); lc.pszText = szBuffer;
(void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, SubItem, (LPARAM)&lc);}
staticVOIDAddIPAddressToListView( HWND hDlgCtrl, PIP_ADDR_STRING pAddr, INT Index){ LVITEMW li; PIP_ADDR_STRING pCur; WCHAR szBuffer[100]; UINT SubIndex;
ZeroMemory(&li, sizeof(LVITEMW)); li.mask = LVIF_TEXT; li.iItem = Index; pCur = pAddr; SubIndex = 0;
do { if (SubIndex) { ZeroMemory(&li, sizeof(LVITEMW)); li.mask = LVIF_TEXT; li.iItem = Index; li.iSubItem = 0; li.pszText = (LPWSTR)L""; li.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li); }
if (MultiByteToWideChar(CP_ACP, 0, pCur->IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) { li.pszText = szBuffer; li.iSubItem = 1; li.iItem = Index++; SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); } SubIndex++; pCur = pCur->Next; } while (pCur && pCur->IpAddress.String[0]);}
staticINTInsertItemToListView( HWND hDlgCtrl, UINT ResId){ LVITEMW li; WCHAR szBuffer[100];
ZeroMemory(&li, sizeof(LVITEMW)); li.mask = LVIF_TEXT; li.iItem = ListView_GetItemCount(hDlgCtrl); if (LoadStringW(netshell_hInstance, ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) { li.pszText = szBuffer; return (INT)SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li); } return -1;}
staticBOOLtmToStr( IN struct tm *pTM, OUT LPWSTR szBuffer, IN UINT nBufferSize){ SYSTEMTIME st; CString strBufferDate; CString strBufferTime; UINT nCharDate, nCharTime; BOOL bResult = FALSE;
st.wYear = pTM->tm_year + 1900; st.wMonth = pTM->tm_mon + 1; st.wDay = pTM->tm_mday; st.wHour = pTM->tm_hour; st.wMinute = pTM->tm_min; st.wSecond = pTM->tm_sec;
/* Check required size before cpy/cat */ nCharDate = GetDateFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, NULL, 0) + 1; nCharTime = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, NULL, 0) + 1;
if (GetDateFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, strBufferDate.GetBuffer(nCharDate), nCharDate) && GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, strBufferTime.GetBuffer(nCharTime), nCharTime)) { StringCbCopy(szBuffer, nBufferSize, strBufferDate); StringCbCat(szBuffer, nBufferSize, L" "); StringCbCat(szBuffer, nBufferSize, strBufferTime); bResult = TRUE; } strBufferDate.ReleaseBuffer(); strBufferTime.ReleaseBuffer();
return bResult;}
INT_PTRCALLBACKLANStatusUiDetailsDlg( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ LANSTATUSUI_CONTEXT * pContext; LVITEMW li; WCHAR szBuffer[100]; PIP_ADAPTER_INFO pAdapterInfo, pCurAdapter; PIP_PER_ADAPTER_INFO pPerAdapter; DWORD dwSize; HWND hDlgCtrl; RECT rect;
switch (uMsg) { case WM_INITDIALOG: pContext = (LANSTATUSUI_CONTEXT*)lParam;
hDlgCtrl = GetDlgItem(hwndDlg, IDC_DETAILS);
/* get client rect */ GetClientRect(hDlgCtrl, &rect);
/* calculate column width */ dwSize = rect.right / 2;
InsertColumnToListView(hDlgCtrl, IDS_PROPERTY, 0, dwSize); InsertColumnToListView(hDlgCtrl, IDS_VALUE, 1, dwSize);
dwSize = 0; pCurAdapter = NULL; pAdapterInfo = NULL; if (GetAdaptersInfo(NULL, &dwSize) == ERROR_BUFFER_OVERFLOW) { pAdapterInfo = static_cast<PIP_ADAPTER_INFO>(CoTaskMemAlloc(dwSize)); if (pAdapterInfo) { if (GetAdaptersInfo(pAdapterInfo, &dwSize) == NO_ERROR) { pCurAdapter = pAdapterInfo; while (pCurAdapter && pCurAdapter->Index != pContext->dwAdapterIndex) pCurAdapter = pCurAdapter->Next;
if (pCurAdapter->Index != pContext->dwAdapterIndex) pCurAdapter = NULL; } } }
ZeroMemory(&li, sizeof(LVITEMW)); li.mask = LVIF_TEXT; li.iSubItem = 1; li.pszText = szBuffer;
if (pCurAdapter) { li.iItem = InsertItemToListView(hDlgCtrl, IDS_PHYSICAL_ADDRESS); if (li.iItem >= 0) { swprintf(szBuffer, L"%02x-%02x-%02x-%02x-%02x-%02x",pCurAdapter->Address[0], pCurAdapter->Address[1], pCurAdapter->Address[2], pCurAdapter->Address[3], pCurAdapter->Address[4], pCurAdapter->Address[5]); SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); } li.iItem = InsertItemToListView(hDlgCtrl, IDS_IP_ADDRESS); if (li.iItem >= 0) if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->IpAddressList.IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
li.iItem = InsertItemToListView(hDlgCtrl, IDS_SUBNET_MASK); if (li.iItem >= 0) if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->IpAddressList.IpMask.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
li.iItem = InsertItemToListView(hDlgCtrl, IDS_DEF_GATEWAY); if (li.iItem >= 0 && pCurAdapter->GatewayList.IpAddress.String[0] != '0') { if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->GatewayList.IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); }
li.iItem = InsertItemToListView(hDlgCtrl, IDS_DHCP_SERVER); if (li.iItem >= 0 && pCurAdapter->DhcpServer.IpAddress.String[0] != '0') { if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->DhcpServer.IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); }
li.iItem = InsertItemToListView(hDlgCtrl, IDS_LEASE_OBTAINED); if (li.iItem >= 0 && pCurAdapter->LeaseObtained != NULL) { struct tm *leaseOptained;
leaseOptained = localtime(&pCurAdapter->LeaseObtained);
if (tmToStr(leaseOptained, szBuffer, _countof(szBuffer))) SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); }
li.iItem = InsertItemToListView(hDlgCtrl, IDS_LEASE_EXPIRES); if (li.iItem >= 0 && pCurAdapter->LeaseExpires != NULL) { struct tm *leaseExpire;
leaseExpire = localtime(&pCurAdapter->LeaseExpires);
if (tmToStr(leaseExpire, szBuffer, _countof(szBuffer))) SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); } }
dwSize = 0; li.iItem = InsertItemToListView(hDlgCtrl, IDS_DNS_SERVERS); if (GetPerAdapterInfo(pContext->dwAdapterIndex, NULL, &dwSize) == ERROR_BUFFER_OVERFLOW) { pPerAdapter = static_cast<PIP_PER_ADAPTER_INFO>(CoTaskMemAlloc(dwSize)); if (pPerAdapter) { if (GetPerAdapterInfo(pContext->dwAdapterIndex, pPerAdapter, &dwSize) == ERROR_SUCCESS) { if (li.iItem >= 0) AddIPAddressToListView(hDlgCtrl, &pPerAdapter->DnsServerList, li.iItem); } CoTaskMemFree(pPerAdapter); } }
if (pCurAdapter) { li.iItem = InsertItemToListView(hDlgCtrl, IDS_WINS_SERVERS); if (pCurAdapter->HaveWins) { AddIPAddressToListView(hDlgCtrl, &pCurAdapter->PrimaryWinsServer, li.iItem); AddIPAddressToListView(hDlgCtrl, &pCurAdapter->SecondaryWinsServer, li.iItem+1); } }
CoTaskMemFree(pAdapterInfo); break;
case WM_COMMAND: if (LOWORD(wParam) == IDC_CLOSE) { EndDialog(hwndDlg, FALSE); break; } }
return FALSE;}
INT_PTRCALLBACKLANStatusUiAdvancedDlg( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ WCHAR szBuffer[100] = {0}; PROPSHEETPAGE *page; LANSTATUSUI_CONTEXT * pContext; DWORD dwIpAddr;
switch (uMsg) { case WM_INITDIALOG: page = (PROPSHEETPAGE*)lParam; pContext = (LANSTATUSUI_CONTEXT*)page->lParam; SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext); if (pContext->DHCPEnabled) LoadStringW(netshell_hInstance, IDS_ASSIGNED_DHCP, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)); else LoadStringW(netshell_hInstance, IDS_ASSIGNED_MANUAL, szBuffer, sizeof(szBuffer)/sizeof(WCHAR));
szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; SendDlgItemMessageW(hwndDlg, IDC_DETAILSTYPE, WM_SETTEXT, 0, (LPARAM)szBuffer);
dwIpAddr = ntohl(pContext->IpAddress); swprintf(szBuffer, L"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); SendDlgItemMessageW(hwndDlg, IDC_DETAILSIP, WM_SETTEXT, 0, (LPARAM)szBuffer);
dwIpAddr = ntohl(pContext->SubnetMask); swprintf(szBuffer, L"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); SendDlgItemMessageW(hwndDlg, IDC_DETAILSSUBNET, WM_SETTEXT, 0, (LPARAM)szBuffer);
dwIpAddr = ntohl(pContext->Gateway); if (dwIpAddr) { swprintf(szBuffer, L"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); SendDlgItemMessageW(hwndDlg, IDC_DETAILSGATEWAY, WM_SETTEXT, 0, (LPARAM)szBuffer); } return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDC_DETAILS) { pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); if (pContext) { DialogBoxParamW(netshell_hInstance, MAKEINTRESOURCEW(IDD_LAN_NETSTATUSDETAILS), GetParent(hwndDlg), LANStatusUiDetailsDlg, (LPARAM)pContext); } } break; default: break; } return FALSE;}
VOIDDisableNetworkAdapter(INetConnection * pNet, LANSTATUSUI_CONTEXT * pContext, HWND hwndDlg){ HRESULT hr = pNet->Disconnect(); if (FAILED_UNEXPECTEDLY(hr)) return;
NOTIFYICONDATAW nid;
PropSheet_PressButton(GetParent(hwndDlg), PSBTN_CANCEL); ZeroMemory(&nid, sizeof(nid)); nid.cbSize = sizeof(nid); nid.uID = pContext->uID; nid.hWnd = pContext->hwndDlg; nid.uFlags = NIF_STATE; nid.dwState = NIS_HIDDEN; nid.dwStateMask = NIS_HIDDEN;
Shell_NotifyIconW(NIM_MODIFY, &nid);}
INT_PTRCALLBACKLANStatusUiDlg( 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; pContext->hwndDlg = hwndDlg; InitializeLANStatusUiDlg(hwndDlg, pContext); 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) { if (pContext) { ShowNetConnectionProperties(pContext->pNet, GetParent(pContext->hwndDlg)); BringWindowToTop(GetParent(pContext->hwndDlg)); } break; } else if (LOWORD(wParam) == IDC_ENDISABLE) { DisableNetworkAdapter(pContext->pNet, pContext, hwndDlg); 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); SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, PSNRET_NOERROR); pContext->hwndDlg = NULL; return TRUE; } break; } return FALSE;}
VOIDInitializePropertyDialog( LANSTATUSUI_CONTEXT * pContext, NETCON_PROPERTIES * pProperties){ DWORD dwSize, dwAdapterIndex, dwResult; LPOLESTR pStr; IP_ADAPTER_INFO *pAdapterInfo, *pCurAdapter;
if (FAILED(StringFromCLSID((CLSID)pProperties->guidId, &pStr))) { return; }
/* get the IfTable */ dwSize = 0; dwResult = GetAdaptersInfo(NULL, &dwSize); if (dwResult!= ERROR_BUFFER_OVERFLOW) { CoTaskMemFree(pStr); return; }
pAdapterInfo = static_cast<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; }
pCurAdapter = pAdapterInfo; while (pCurAdapter->Index != dwAdapterIndex) pCurAdapter = pCurAdapter->Next;
pContext->IpAddress = inet_addr(pCurAdapter->IpAddressList.IpAddress.String); pContext->SubnetMask = inet_addr(pCurAdapter->IpAddressList.IpMask.String); pContext->Gateway = inet_addr(pCurAdapter->GatewayList.IpAddress.String); pContext->DHCPEnabled = pCurAdapter->DhcpEnabled; CoTaskMemFree(pStr); CoTaskMemFree(pAdapterInfo); pContext->dwAdapterIndex = dwAdapterIndex;}
static int CALLBACKPropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam){ // NOTE: This callback is needed to set large icon correctly. HICON hIcon; switch (uMsg) { case PSCB_INITIALIZED: { hIcon = LoadIconW(netshell_hInstance, MAKEINTRESOURCEW(IDI_NET_IDLE)); SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); break; } } return 0;}
VOIDShowStatusPropertyDialog( LANSTATUSUI_CONTEXT *pContext, HWND hwndDlg){ HPROPSHEETPAGE hppages[2]; PROPSHEETHEADERW pinfo; NETCON_PROPERTIES * pProperties = NULL;
ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW)); ZeroMemory(hppages, sizeof(hppages)); pinfo.dwSize = sizeof(PROPSHEETHEADERW); pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW | PSH_USEICONID | PSH_USECALLBACK; pinfo.phpage = hppages; pinfo.hwndParent = hwndDlg; pinfo.hInstance = netshell_hInstance; pinfo.pszIcon = MAKEINTRESOURCEW(IDI_NET_IDLE); pinfo.pfnCallback = PropSheetProc;
if (pContext->pNet->GetProperties(&pProperties) == S_OK) { if (pProperties->pszwName) { pinfo.pszCaption = pProperties->pszwName; pinfo.dwFlags |= PSH_PROPTITLE; } InitializePropertyDialog(pContext, pProperties); if (pProperties->MediaType == NCM_LAN && pProperties->Status == NCS_CONNECTED) { hppages[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUS), LANStatusUiDlg, (LPARAM)pContext, NULL); if (hppages[0]) pinfo.nPages++;
hppages[pinfo.nPages] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUSADVANCED), LANStatusUiAdvancedDlg, (LPARAM)pContext, NULL); if (hppages[pinfo.nPages]) pinfo.nPages++;
if (pinfo.nPages) { PropertySheetW(&pinfo); } } else if (pProperties->Status == NCS_MEDIA_DISCONNECTED || pProperties->Status == NCS_DISCONNECTED || pProperties->Status == NCS_HARDWARE_DISABLED) { ShowNetConnectionProperties(pContext->pNet, pContext->hwndDlg); }
NcFreeNetconProperties(pProperties); }}
VOID ShowNetworkIconContextMenu( _In_ HWND hwndOwner, _In_ LANSTATUSUI_CONTEXT *pContext){ if (!pContext || !pContext->pNet) return;
HMENU hMenu = CreatePopupMenu(); if (!hMenu) return;
POINT pt; GetCursorPos(&pt);
SetForegroundWindow(hwndOwner);
// The context menu items, set to their default values. struct { UINT uID; UINT uFlags; UINT_PTR uIDNewItem; } MenuItems[] = { {IDS_NET_ACTIVATE, MF_GRAYED, IDM_NETICON_ENABLE}, {IDS_NET_STATUS, MF_GRAYED, IDM_NETICON_STATUS}, {IDS_NET_REPAIR, MF_GRAYED, IDM_NETICON_REPAIR}, {UINT_MAX, 0, 0}, // Separator {IDS_NET_OPEN_CONNECTIONS, MF_ENABLED, IDM_NETICON_OPEN_CONNECTIONS}, {IDS_NET_PROPERTIES, MF_ENABLED | MFS_DEFAULT, IDM_NETICON_PROPERTIES}, };
NETCON_PROPERTIES *pProps = NULL; HRESULT hr = pContext->pNet->GetProperties(&pProps); if (SUCCEEDED(hr) && pProps) { if (pProps->Status == NCS_HARDWARE_DISABLED || pProps->Status == NCS_MEDIA_DISCONNECTED || pProps->Status == NCS_DISCONNECTED) { MenuItems[0].uID = IDS_NET_ACTIVATE; MenuItems[0].uFlags = MF_ENABLED | MFS_DEFAULT; MenuItems[0].uIDNewItem = IDM_NETICON_ENABLE; MenuItems[5].uFlags = MF_ENABLED; } else { MenuItems[0].uID = IDS_NET_DEACTIVATE; MenuItems[0].uFlags = MF_ENABLED; MenuItems[0].uIDNewItem = IDM_NETICON_DISABLE; }
if (pProps->Status == NCS_CONNECTED) { MenuItems[1].uFlags = MF_ENABLED; MenuItems[2].uFlags = MF_ENABLED; } else if (pProps->Status == NCS_CONNECTING) { MenuItems[1].uFlags = MF_ENABLED; MenuItems[2].uFlags = MF_GRAYED; } else { MenuItems[1].uFlags = MF_GRAYED; MenuItems[2].uFlags = MF_GRAYED; }
NcFreeNetconProperties(pProps); pProps = NULL; } else { MenuItems[0].uFlags = MF_GRAYED; MenuItems[1].uFlags = MF_GRAYED; MenuItems[2].uFlags = MF_GRAYED; MenuItems[5].uFlags = MF_GRAYED; }
// Set the "Properties" item as default, if the Network "Enable/Disable" item isn't. if (!(MenuItems[0].uFlags & MFS_DEFAULT)) MenuItems[5].uFlags |= MFS_DEFAULT;
WCHAR szMenuItem[128];
for (USHORT i = 0; i < _countof(MenuItems); ++i) { if (MenuItems[i].uID != UINT_MAX) { if (LoadStringW(netshell_hInstance, MenuItems[i].uID, szMenuItem, _countof(szMenuItem))) AppendMenuW(hMenu, MF_STRING | MenuItems[i].uFlags, MenuItems[i].uIDNewItem, szMenuItem); } else { AppendMenuW(hMenu, MF_SEPARATOR, 0, NULL); } }
TrackPopupMenuEx(hMenu, TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, hwndOwner, NULL);
PostMessage(hwndOwner, WM_NULL, 0, 0);
DestroyMenu(hMenu);}
HRESULT RepairConnection(INetConnection *pNet, HWND hwndOwner){ SHELL_ErrorBox(hwndOwner, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));
return E_NOTIMPL;}
INT_PTRCALLBACKLANStatusDlg( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ LANSTATUSUI_CONTEXT * pContext;
switch (uMsg) { case WM_INITDIALOG: pContext = (LANSTATUSUI_CONTEXT *)lParam; SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam); pContext->hwndStatusDlg = hwndDlg; pContext->nIDEvent = SetTimer(hwndDlg, NETTIMERID, 1000, NULL); return TRUE;
case WM_DESTROY: pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); if (pContext && pContext->nIDEvent) { KillTimer(hwndDlg, pContext->nIDEvent); pContext->nIDEvent = 0; } SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)NULL); break;
case WM_TIMER: pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); if (wParam == (WPARAM)pContext->nIDEvent) { UpdateLanStatus(pContext->hwndDlg, pContext); } break;
case WM_SHOWSTATUSDLG: pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); if (!pContext) break;
switch (LOWORD(lParam)) { case WM_LBUTTONUP: if (pContext->hwndDlg) { HWND hwndSheet = GetParent(pContext->hwndDlg); if (hwndSheet) { ShowWindow(hwndSheet, SW_RESTORE); SetForegroundWindow(hwndSheet); BringWindowToTop(hwndSheet); } } else { ShowStatusPropertyDialog(pContext, hwndDlg); } break;
if (pContext->hwndDlg) { ShowWindow(GetParent(pContext->hwndDlg), SW_SHOW); BringWindowToTop(GetParent(pContext->hwndDlg)); } else { ShowStatusPropertyDialog(pContext, hwndDlg); } break;
case WM_RBUTTONUP: case WM_CONTEXTMENU: ShowNetworkIconContextMenu(hwndDlg, pContext); break; } break;
case WM_COMMAND: { pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); if (!pContext || !pContext->pNet) break;
switch (LOWORD(wParam)) { case IDM_NETICON_ENABLE: pContext->pNet->Connect(); UpdateLanStatus(NULL, pContext); break;
case IDM_NETICON_DISABLE: pContext->pNet->Disconnect(); UpdateLanStatus(NULL, pContext); break;
case IDM_NETICON_STATUS: if (pContext->hwndDlg) { HWND hwndSheet = GetParent(pContext->hwndDlg); if (hwndSheet) { ShowWindow(hwndSheet, SW_RESTORE); SetForegroundWindow(hwndSheet); BringWindowToTop(hwndSheet); } } else { ShowStatusPropertyDialog(pContext, hwndDlg); } break;
case IDM_NETICON_REPAIR: RepairConnection(pContext->pNet, hwndDlg); break;
case IDM_NETICON_PROPERTIES: ShowNetConnectionProperties(pContext->pNet, hwndDlg); break;
case IDM_NETICON_OPEN_CONNECTIONS: ShellExecuteW(hwndDlg, NULL, L"control", L"netconnections", NULL, SW_SHOWNORMAL); break; } break; } } return FALSE;}
HRESULTCLanStatus::InitializeNetTaskbarNotifications(){ NOTIFYICONDATAW nid; HWND hwndDlg; CComPtr<INetConnectionManager> pNetConMan; CComPtr<IEnumNetConnection> pEnumCon; CComPtr<INetConnection> pNetCon; NETCON_PROPERTIES* pProps; HRESULT hr; ULONG Count; ULONG Index; NOTIFICATION_ITEM * pItem, *pLast = NULL; LANSTATUSUI_CONTEXT * pContext;
TRACE("InitializeNetTaskbarNotifications\n");
if (m_pHead) { pItem = m_pHead; while (pItem) { hr = pItem->pNet->GetProperties(&pProps); if (SUCCEEDED(hr)) { ZeroMemory(&nid, sizeof(nid)); nid.cbSize = sizeof(nid); nid.uID = pItem->uID; nid.hWnd = pItem->hwndDlg; nid.uFlags = NIF_STATE; if (pProps->dwCharacter & NCCF_SHOW_ICON) nid.dwState = 0; else nid.dwState = NIS_HIDDEN;
nid.dwStateMask = NIS_HIDDEN; Shell_NotifyIconW(NIM_MODIFY, &nid); NcFreeNetconProperties(pProps); } pItem = pItem->pNext; } return S_OK; } /* get an instance to of IConnectionManager */ hr = CNetConnectionManager_CreateInstance(IID_PPV_ARG(INetConnectionManager, &pNetConMan)); if (FAILED_UNEXPECTEDLY(hr)) return hr;
hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon); if (FAILED_UNEXPECTEDLY(hr)) return hr;
Index = 1; while (TRUE) { pNetCon.Release(); hr = pEnumCon->Next(1, &pNetCon, &Count); if (hr != S_OK) break;
TRACE("new connection\n"); pItem = static_cast<NOTIFICATION_ITEM*>(CoTaskMemAlloc(sizeof(NOTIFICATION_ITEM))); if (!pItem) break;
pContext = static_cast<LANSTATUSUI_CONTEXT*>(CoTaskMemAlloc(sizeof(LANSTATUSUI_CONTEXT))); if (!pContext) { CoTaskMemFree(pItem); break; }
ZeroMemory(pContext, sizeof(LANSTATUSUI_CONTEXT)); pContext->uID = Index; pContext->pNet = pNetCon; pContext->Status = -1; pContext->dwAdapterIndex = Index; pItem->uID = Index; pItem->pNext = NULL; pItem->pNet = pNetCon; pItem->pNet->AddRef(); hwndDlg = CreateDialogParamW(netshell_hInstance, MAKEINTRESOURCEW(IDD_STATUS), NULL, LANStatusDlg, (LPARAM)pContext); if (!hwndDlg) { ERR("CreateDialogParamW failed\n"); continue; }
ZeroMemory(&nid, sizeof(nid)); nid.cbSize = sizeof(nid); nid.uID = Index++; nid.uFlags = NIF_MESSAGE; nid.uVersion = NOTIFYICON_VERSION; nid.uCallbackMessage = WM_SHOWSTATUSDLG; nid.hWnd = hwndDlg;
hr = pNetCon->GetProperties(&pProps); if (SUCCEEDED(hr)) { CopyMemory(&pItem->guidItem, &pProps->guidId, sizeof(GUID)); if (!(pProps->dwCharacter & NCCF_SHOW_ICON)) { nid.dwState = NIS_HIDDEN; nid.dwStateMask = NIS_HIDDEN; nid.uFlags |= NIF_STATE; } if (pProps->Status == NCS_MEDIA_DISCONNECTED || pProps->Status == NCS_DISCONNECTED || pProps->Status == NCS_HARDWARE_DISABLED) nid.hIcon = LoadIcon(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF)); else if (pProps->Status == NCS_CONNECTED) nid.hIcon = LoadIcon(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE));
if (nid.hIcon) nid.uFlags |= NIF_ICON;
wcscpy(nid.szTip, pProps->pszwName); nid.uFlags |= NIF_TIP; } pContext->hwndStatusDlg = hwndDlg; pItem->hwndDlg = hwndDlg;
if (Shell_NotifyIconW(NIM_ADD, &nid)) { if (pLast) pLast->pNext = pItem; else m_pHead = pItem;
pLast = pItem; Index++; } else { ERR("Shell_NotifyIconW failed\n"); CoTaskMemFree(pItem); }
if (nid.uFlags & NIF_ICON) DestroyIcon(nid.hIcon); }
m_lpNetMan = pNetConMan; return S_OK;}
HRESULTCLanStatus::ShowStatusDialogByCLSID(const GUID *pguidCmdGroup){ NOTIFICATION_ITEM *pItem;
pItem = m_pHead; while (pItem) { if (IsEqualGUID(pItem->guidItem, *pguidCmdGroup)) { SendMessageW(pItem->hwndDlg, WM_SHOWSTATUSDLG, 0, WM_LBUTTONUP); return S_OK; } pItem = pItem->pNext; }
ERR("not found\n"); return E_FAIL;}
HRESULTWINAPICLanStatus::QueryStatus( const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText){ MessageBoxW(NULL, pCmdText->rgwz, L"IOleCommandTarget_fnQueryStatus", MB_OK); return E_NOTIMPL;}
HRESULTWINAPICLanStatus::Exec( const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut){ if (pguidCmdGroup) { if (IsEqualGUID(*pguidCmdGroup, CGID_ShellServiceObject)) { return InitializeNetTaskbarNotifications(); } else { /* invoke status dialog */ return ShowStatusDialogByCLSID(pguidCmdGroup); } } return S_OK;}