ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

lanstatusui.cpp
Go to the documentation of this file.
00001 #include <precomp.h>
00002 
00003 WINE_DEFAULT_DEBUG_CHANNEL (shell);
00004 
00007 // IID B722BCCB-4E68-101B-A2BC-00AA00404770
00008 
00009 #define WM_SHOWSTATUSDLG    (WM_USER+10)
00010 
00011 typedef struct tagNotificationItem
00012 {
00013     struct tagNotificationItem *pNext;
00014     CLSID guidItem;
00015     UINT uID;
00016     HWND hwndDlg;
00017     INetConnection *pNet;
00018 } NOTIFICATION_ITEM;
00019 
00020 typedef struct
00021 {
00022     INetConnection *pNet;
00023     HWND hwndStatusDlg;         /* LanStatusDlg window */
00024     HWND hwndDlg;               /* status dialog window */
00025     DWORD dwAdapterIndex;
00026     UINT_PTR nIDEvent;
00027     UINT DHCPEnabled;
00028     DWORD dwInOctets;
00029     DWORD dwOutOctets;
00030     DWORD IpAddress;
00031     DWORD SubnetMask;
00032     DWORD Gateway;
00033     UINT uID;
00034     UINT Status;
00035 } LANSTATUSUI_CONTEXT;
00036 
00037 class CLanStatus:
00038     public IOleCommandTarget
00039 {
00040     public:
00041         CLanStatus();
00042 
00043         // IUnknown
00044         virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut);
00045         virtual ULONG WINAPI AddRef();
00046         virtual ULONG WINAPI Release();
00047         
00048         // IOleCommandTarget
00049         virtual HRESULT WINAPI QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText);
00050         virtual HRESULT WINAPI Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
00051     
00052     private:
00053         HRESULT InitializeNetTaskbarNotifications();
00054         HRESULT ShowStatusDialogByCLSID(const GUID *pguidCmdGroup);
00055         
00056         INetConnectionManager *lpNetMan;
00057         LONG ref;
00058         NOTIFICATION_ITEM *pHead;
00059 };
00060 
00061 CLanStatus::CLanStatus()
00062 {
00063     ref = 0;
00064     lpNetMan = NULL;
00065     pHead = NULL;
00066 }
00067 
00068 VOID
00069 UpdateLanStatusUiDlg(
00070     HWND hwndDlg,
00071     MIB_IFROW *IfEntry,
00072     LANSTATUSUI_CONTEXT *pContext)
00073 {
00074     WCHAR szFormat[MAX_PATH] = {0};
00075     WCHAR szBuffer[MAX_PATH] = {0};
00076     SYSTEMTIME TimeConnected;
00077     DWORD DurationSeconds;
00078     WCHAR Buffer[100];
00079     WCHAR DayBuffer[30];
00080     WCHAR LocBuffer[50];
00081 
00082 #if 0
00083     ULONGLONG Ticks;
00084 #else
00085     DWORD Ticks;
00086 #endif
00087 
00088     if (IfEntry->dwSpeed < 1000)
00089     {
00090         if (LoadStringW(netshell_hInstance, IDS_FORMAT_BIT, szFormat, sizeof(szFormat)/sizeof(WCHAR)))
00091         {
00092             swprintf(szBuffer, szFormat, IfEntry->dwSpeed);
00093             SendDlgItemMessageW(hwndDlg, IDC_SPEED, WM_SETTEXT, 0, (LPARAM)szBuffer);
00094         }
00095     }
00096     else if (IfEntry->dwSpeed < 1000000)
00097     {
00098         if (LoadStringW(netshell_hInstance, IDS_FORMAT_KBIT, szFormat, sizeof(szFormat)/sizeof(WCHAR)))
00099         {
00100             swprintf(szBuffer, szFormat, IfEntry->dwSpeed/1000);
00101             SendDlgItemMessageW(hwndDlg, IDC_SPEED, WM_SETTEXT, 0, (LPARAM)szBuffer);
00102         }
00103     }
00104     else if (IfEntry->dwSpeed < 1000000000)
00105     {
00106         if (LoadStringW(netshell_hInstance, IDS_FORMAT_MBIT, szFormat, sizeof(szFormat)/sizeof(WCHAR)))
00107         {
00108             swprintf(szBuffer, szFormat, IfEntry->dwSpeed/1000000);
00109             SendDlgItemMessageW(hwndDlg, IDC_SPEED, WM_SETTEXT, 0, (LPARAM)szBuffer);
00110         }
00111     }
00112     else
00113     {
00114         if (LoadStringW(netshell_hInstance, IDS_FORMAT_GBIT, szFormat, sizeof(szFormat)/sizeof(WCHAR)))
00115         {
00116             swprintf(szBuffer, szFormat, IfEntry->dwSpeed/1000000000);
00117             SendDlgItemMessageW(hwndDlg, IDC_SPEED, WM_SETTEXT, 0, (LPARAM)szBuffer);
00118         }
00119     }
00120 
00121     if (StrFormatByteSizeW(IfEntry->dwInOctets, szBuffer, sizeof(szFormat)/sizeof(WCHAR)))
00122     {
00123         SendDlgItemMessageW(hwndDlg, IDC_RECEIVED, WM_SETTEXT, 0, (LPARAM)szBuffer);
00124     }
00125 
00126     if (StrFormatByteSizeW(IfEntry->dwOutOctets, szBuffer, sizeof(szFormat)/sizeof(WCHAR)))
00127     {
00128         SendDlgItemMessageW(hwndDlg, IDC_SEND, WM_SETTEXT, 0, (LPARAM)szBuffer);
00129     }
00130 
00131 #if 0
00132     Ticks = GetTickCount64();
00133 #else
00134     Ticks = GetTickCount();
00135 #endif
00136 
00137     DurationSeconds = Ticks / 1000;
00138     TimeConnected.wSecond = (DurationSeconds % 60);
00139     TimeConnected.wMinute = (DurationSeconds / 60) % 60;
00140     TimeConnected.wHour = (DurationSeconds / (60 * 60)) % 24;
00141     TimeConnected.wDay = DurationSeconds / (60 * 60 * 24);
00142 
00143     if (!GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &TimeConnected, L"HH':'mm':'ss", LocBuffer, sizeof(LocBuffer) / sizeof(LocBuffer[0])))
00144         return;
00145 
00146     if (!TimeConnected.wDay)
00147     {
00148         SendDlgItemMessageW(hwndDlg, IDC_DURATION, WM_SETTEXT, 0, (LPARAM)LocBuffer);
00149     }
00150     else
00151     {
00152         if (TimeConnected.wDay == 1)
00153         {
00154             if (!LoadStringW(netshell_hInstance, IDS_DURATION_DAY, DayBuffer, sizeof(DayBuffer) / sizeof(DayBuffer[0])))
00155                 DayBuffer[0] = L'\0';
00156         }
00157         else
00158         {
00159             if (!LoadStringW(netshell_hInstance, IDS_DURATION_DAYS, DayBuffer, sizeof(DayBuffer) / sizeof(DayBuffer[0])))
00160                 DayBuffer[0] = L'\0';
00161         }
00162         swprintf(Buffer, DayBuffer, TimeConnected.wDay, LocBuffer);
00163         SendDlgItemMessageW(hwndDlg, IDC_DURATION, WM_SETTEXT, 0, (LPARAM)Buffer);
00164     }
00165 
00166 }
00167 
00168 VOID
00169 UpdateLanStatus(HWND hwndDlg,  LANSTATUSUI_CONTEXT * pContext)
00170 {
00171     MIB_IFROW IfEntry;
00172     HICON hIcon, hOldIcon = NULL;
00173     NOTIFYICONDATAW nid;
00174     NETCON_PROPERTIES * pProperties = NULL;
00175 
00176     ZeroMemory(&IfEntry, sizeof(IfEntry));
00177     IfEntry.dwIndex = pContext->dwAdapterIndex;
00178     if(GetIfEntry(&IfEntry) != NO_ERROR)
00179     {
00180         return;
00181     }
00182 
00183     hIcon = NULL;
00184     if (IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_CONNECTED || IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_OPERATIONAL)
00185     {
00186         if (pContext->dwInOctets == IfEntry.dwInOctets && pContext->dwOutOctets == IfEntry.dwOutOctets && pContext->Status  != 0)
00187         {
00188             hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
00189             pContext->Status = 0;
00190         }
00191         else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->dwOutOctets != IfEntry.dwOutOctets && pContext->Status  != 1)
00192         {
00193             hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANSREC), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
00194             pContext->Status = 1;
00195         }
00196         else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->Status  != 2)
00197         {
00198             hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_REC), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
00199             pContext->Status = 2; 
00200         }
00201         else if (pContext->dwOutOctets != IfEntry.dwOutOctets && pContext->Status  != 3)
00202         {
00203             hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANS), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
00204             pContext->Status = 3;
00205         }
00206     }
00207     else if (IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_UNREACHABLE || IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_DISCONNECTED)
00208     {
00209         if (pContext->Status != 4)
00210         {
00211             hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
00212             pContext->Status = 4;
00213         }
00214     }
00215     else if (IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_NON_OPERATIONAL)
00216     {
00217         if (pContext->Status != 5)
00218         {
00219             hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
00220             pContext->Status = 5;
00221         }
00222     }
00223 
00224     if (hwndDlg && hIcon)
00225     {
00226         hOldIcon = (HICON)SendDlgItemMessageW(hwndDlg, IDC_NETSTAT, STM_SETICON, (WPARAM)hIcon, 0);
00227         if (hOldIcon)
00228             DestroyIcon(hOldIcon);
00229     }
00230 
00231     ZeroMemory(&nid, sizeof(nid));
00232     nid.cbSize = sizeof(nid);
00233     nid.uID = pContext->uID;
00234     nid.hWnd = pContext->hwndStatusDlg;
00235     nid.uVersion = 3;
00236 
00237     if (pContext->pNet->GetProperties(&pProperties) == S_OK)
00238     {
00239         if (pProperties->dwCharacter & NCCF_SHOW_ICON)
00240         {
00241             if (hwndDlg)
00242                 nid.hIcon = (HICON)CopyImage(hIcon, IMAGE_ICON, 16, 16, 0);
00243             else
00244                 nid.hIcon = hIcon;
00245 
00246             if (nid.hIcon)
00247                 nid.uFlags |= NIF_ICON;
00248 
00249             nid.uFlags |= NIF_STATE;
00250             nid.dwState = 0;
00251             nid.dwStateMask = NIS_HIDDEN;
00252 
00253             if (pProperties->pszwName)
00254             {
00255                 if (wcslen(pProperties->pszwName) * sizeof(WCHAR) < sizeof(nid.szTip))
00256                 {
00257                     nid.uFlags |= NIF_TIP;
00258                     wcscpy(nid.szTip, pProperties->pszwName);
00259                 }
00260                 else
00261                 {
00262                     CopyMemory(nid.szTip, pProperties->pszwName, sizeof(nid.szTip) - sizeof(WCHAR));
00263                     nid.szTip[(sizeof(nid.szTip)/sizeof(WCHAR))-1] = L'\0';
00264                     nid.uFlags |= NIF_TIP;
00265                 }
00266             }
00267         }
00268         else
00269         {
00270             nid.uFlags |= NIF_STATE;
00271             nid.dwState = NIS_HIDDEN;
00272             nid.dwStateMask = NIS_HIDDEN;
00273 
00274         }
00275         NcFreeNetconProperties(pProperties);
00276     }
00277 
00278     Shell_NotifyIconW(NIM_MODIFY, &nid);
00279 
00280     if (nid.uFlags & NIF_ICON)
00281         DestroyIcon(nid.hIcon);
00282 
00283     pContext->dwInOctets = IfEntry.dwInOctets;
00284     pContext->dwOutOctets = IfEntry.dwOutOctets;
00285 
00286     if (hwndDlg)
00287         UpdateLanStatusUiDlg(hwndDlg, &IfEntry, pContext);
00288 }
00289 
00290 
00291 VOID
00292 InitializeLANStatusUiDlg(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext)
00293 {
00294     WCHAR szBuffer[MAX_PATH] = {0};
00295     NETCON_PROPERTIES * pProperties;
00296 
00297     if (pContext->pNet->GetProperties(&pProperties) != S_OK)
00298         return;
00299 
00300     if (pProperties->Status == NCS_DISCONNECTED)
00301         LoadStringW(netshell_hInstance, IDS_STATUS_UNREACHABLE, szBuffer, MAX_PATH);
00302     else if (pProperties->Status == NCS_MEDIA_DISCONNECTED)
00303         LoadStringW(netshell_hInstance, IDS_STATUS_DISCONNECTED, szBuffer, MAX_PATH);
00304     else if (pProperties->Status == NCS_CONNECTING)
00305         LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTING, szBuffer, MAX_PATH);
00306     else if (pProperties->Status == NCS_CONNECTED)
00307          LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTED, szBuffer, MAX_PATH);
00308 
00309     SendDlgItemMessageW(hwndDlg, IDC_STATUS, WM_SETTEXT, 0, (LPARAM)szBuffer);
00310 
00311     pContext->dwInOctets = 0;
00312     pContext->dwOutOctets = 0;
00313 
00314     /* update adapter info */
00315     pContext->Status = -1;
00316     UpdateLanStatus(hwndDlg, pContext);
00317     NcFreeNetconProperties(pProperties);
00318 }
00319 
00320 static
00321 VOID
00322 InsertColumnToListView(
00323     HWND hDlgCtrl,
00324     UINT ResId,
00325     UINT SubItem,
00326     UINT Size)
00327 {
00328     WCHAR szBuffer[200];
00329     LVCOLUMNW lc;
00330 
00331     if (!LoadStringW(netshell_hInstance, ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
00332         return;
00333 
00334     memset(&lc, 0, sizeof(LV_COLUMN) );
00335     lc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT;
00336     lc.iSubItem   = SubItem;
00337     lc.fmt = LVCFMT_FIXED_WIDTH;
00338     lc.cx         = Size;
00339     lc.cchTextMax = wcslen(szBuffer);
00340     lc.pszText    = szBuffer;
00341 
00342     (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, SubItem, (LPARAM)&lc);
00343 }
00344 
00345 static
00346 VOID
00347 AddIPAddressToListView(
00348     HWND hDlgCtrl, 
00349     PIP_ADDR_STRING pAddr,
00350     INT Index)
00351 {
00352     LVITEMW li;
00353     PIP_ADDR_STRING pCur;
00354     WCHAR szBuffer[100];
00355     UINT SubIndex;
00356 
00357     ZeroMemory(&li, sizeof(LVITEMW));
00358     li.mask = LVIF_TEXT;
00359     li.iItem = Index;
00360     pCur = pAddr;
00361     SubIndex = 0;
00362 
00363     do
00364     {
00365         if (SubIndex)
00366         {
00367             ZeroMemory(&li, sizeof(LVITEMW));
00368             li.mask = LVIF_TEXT;
00369             li.iItem = Index;
00370             li.iSubItem = 0;
00371             li.pszText = (LPWSTR)L"";
00372             li.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li);
00373         }
00374 
00375         if (MultiByteToWideChar(CP_ACP, 0, pCur->IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
00376         {
00377             li.pszText = szBuffer;
00378             li.iSubItem = 1;
00379             li.iItem = Index++;
00380             SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
00381         }
00382         SubIndex++;
00383         pCur = pCur->Next;
00384     }while(pCur && pCur->IpAddress.String[0]);
00385 }
00386 
00387 static
00388 INT
00389 InsertItemToListView(
00390     HWND hDlgCtrl,
00391     UINT ResId)
00392 {
00393     LVITEMW li;
00394     WCHAR szBuffer[100];
00395 
00396     ZeroMemory(&li, sizeof(LVITEMW));
00397     li.mask = LVIF_TEXT;
00398     li.iItem = ListView_GetItemCount(hDlgCtrl);
00399     if (LoadStringW(netshell_hInstance, ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
00400     {
00401         li.pszText = szBuffer;
00402         return (INT)SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li);
00403     }
00404     return -1;
00405 }
00406 
00407 
00408 INT_PTR
00409 CALLBACK
00410 LANStatusUiDetailsDlg(
00411     HWND hwndDlg,
00412     UINT uMsg,
00413     WPARAM wParam,
00414     LPARAM lParam
00415 )
00416 {
00417     LANSTATUSUI_CONTEXT * pContext;
00418     LVITEMW li;
00419     WCHAR szBuffer[100];
00420     PIP_ADAPTER_INFO pAdapterInfo, pCurAdapter;
00421     PIP_PER_ADAPTER_INFO pPerAdapter;
00422     DWORD dwSize;
00423     HWND hDlgCtrl;
00424 
00425     switch(uMsg)
00426     {
00427         case WM_INITDIALOG:
00428             pContext = (LANSTATUSUI_CONTEXT*)lParam;
00429 
00430             hDlgCtrl = GetDlgItem(hwndDlg, IDC_DETAILS);
00431             InsertColumnToListView(hDlgCtrl, IDS_PROPERTY, 0, 80);
00432             InsertColumnToListView(hDlgCtrl, IDS_VALUE, 1, 80);
00433 
00434             dwSize = 0;
00435             pCurAdapter = NULL;
00436             pAdapterInfo = NULL;
00437             if (GetAdaptersInfo(NULL, &dwSize) == ERROR_BUFFER_OVERFLOW)
00438             {
00439                 pAdapterInfo = (PIP_ADAPTER_INFO)CoTaskMemAlloc(dwSize);
00440                 if (pAdapterInfo)
00441                 {
00442                     if (GetAdaptersInfo(pAdapterInfo, &dwSize) == NO_ERROR)
00443                     {
00444                         pCurAdapter = pAdapterInfo;
00445                         while(pCurAdapter && pCurAdapter->Index != pContext->dwAdapterIndex)
00446                             pCurAdapter = pCurAdapter->Next;
00447 
00448                         if(pCurAdapter->Index != pContext->dwAdapterIndex)
00449                             pCurAdapter = NULL;
00450                     }
00451                 }
00452             }
00453 
00454             ZeroMemory(&li, sizeof(LVITEMW));
00455             li.mask = LVIF_TEXT;
00456             li.iSubItem = 1;
00457             li.pszText = szBuffer;
00458 
00459             if (pCurAdapter)
00460             {
00461                 li.iItem = InsertItemToListView(hDlgCtrl, IDS_PHYSICAL_ADDRESS);
00462                 if (li.iItem >= 0)
00463                 {
00464                     swprintf(szBuffer, L"%02x-%02x-%02x-%02x-%02x-%02x",pCurAdapter->Address[0], pCurAdapter->Address[1],
00465                              pCurAdapter->Address[2], pCurAdapter->Address[3], pCurAdapter->Address[4], pCurAdapter->Address[5]);
00466                     SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
00467                 }
00468                 li.iItem = InsertItemToListView(hDlgCtrl, IDS_IP_ADDRESS);
00469                 if (li.iItem >= 0)
00470                     if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->IpAddressList.IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
00471                         SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
00472 
00473                 li.iItem = InsertItemToListView(hDlgCtrl, IDS_SUBNET_MASK);
00474                 if (li.iItem >= 0)
00475                     if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->IpAddressList.IpMask.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
00476                         SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
00477 
00478                 li.iItem = InsertItemToListView(hDlgCtrl, IDS_DEF_GATEWAY);
00479                 if (li.iItem >= 0 && pCurAdapter->GatewayList.IpAddress.String[0] != '0')
00480                 {
00481                     if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->GatewayList.IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
00482                         SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
00483                 }
00484 #if 0
00485                 li.iItem = InsertItemToListView(hDlgCtrl, IDS_LEASE_OBTAINED);
00486                 li.iItem = InsertItemToListView(hDlgCtrl, IDS_LEASE_EXPIRES);
00487 #endif
00488             }
00489 
00490             dwSize = 0;
00491             if (GetPerAdapterInfo(pContext->dwAdapterIndex, NULL, &dwSize) == ERROR_BUFFER_OVERFLOW)
00492             {
00493                 pPerAdapter = (PIP_PER_ADAPTER_INFO)CoTaskMemAlloc(dwSize);
00494                 if (pPerAdapter)
00495                 {
00496                     if (GetPerAdapterInfo(pContext->dwAdapterIndex, pPerAdapter, &dwSize) == ERROR_SUCCESS)
00497                     {
00498                         li.iItem = InsertItemToListView(hDlgCtrl, IDS_DNS_SERVERS);
00499                         if (li.iItem >= 0)
00500                             AddIPAddressToListView(hDlgCtrl, &pPerAdapter->DnsServerList, li.iItem);
00501                     }
00502                     CoTaskMemFree(pPerAdapter);
00503                 }
00504             }
00505 #if 0
00506             if (pCurAdapter)
00507             {
00508                 li.iItem = InsertItemToListView(hDlgCtrl, IDS_WINS_SERVERS);
00509                 AddIPAddressToListView(hDlgCtrl, &pCurAdapter->PrimaryWinsServer, li.iItem);
00510                 AddIPAddressToListView(hDlgCtrl, &pCurAdapter->SecondaryWinsServer, li.iItem+1);
00511             }
00512 #endif
00513             CoTaskMemFree(pAdapterInfo);
00514             break;
00515         case WM_COMMAND:
00516             if (LOWORD(wParam) == IDC_CLOSE)
00517             {
00518                 EndDialog(hwndDlg, FALSE);
00519                 break;
00520             }
00521     }
00522     return FALSE;
00523 }
00524 
00525 INT_PTR
00526 CALLBACK
00527 LANStatusUiAdvancedDlg(
00528     HWND hwndDlg,
00529     UINT uMsg,
00530     WPARAM wParam,
00531     LPARAM lParam
00532 )
00533 {
00534     WCHAR szBuffer[100] = {0};
00535     PROPSHEETPAGE *page;
00536     LANSTATUSUI_CONTEXT * pContext;
00537     DWORD dwIpAddr;
00538 
00539 
00540     switch(uMsg)
00541     {
00542         case WM_INITDIALOG:
00543             page = (PROPSHEETPAGE*)lParam;
00544             pContext = (LANSTATUSUI_CONTEXT*)page->lParam;
00545             SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext);
00546             if (pContext->DHCPEnabled)
00547                 LoadStringW(netshell_hInstance, IDS_ASSIGNED_DHCP, szBuffer, sizeof(szBuffer)/sizeof(WCHAR));
00548             else
00549                 LoadStringW(netshell_hInstance, IDS_ASSIGNED_MANUAL, szBuffer, sizeof(szBuffer)/sizeof(WCHAR));
00550 
00551             szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
00552             SendDlgItemMessageW(hwndDlg, IDC_DETAILSTYPE, WM_SETTEXT, 0, (LPARAM)szBuffer);
00553 
00554 
00555             dwIpAddr = ntohl(pContext->IpAddress);
00556             swprintf(szBuffer, L"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr),
00557                      THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
00558             SendDlgItemMessageW(hwndDlg, IDC_DETAILSIP, WM_SETTEXT, 0, (LPARAM)szBuffer);
00559 
00560             dwIpAddr = ntohl(pContext->SubnetMask);
00561             swprintf(szBuffer, L"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr),
00562                      THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
00563             SendDlgItemMessageW(hwndDlg, IDC_DETAILSSUBNET, WM_SETTEXT, 0, (LPARAM)szBuffer);
00564 
00565             dwIpAddr = ntohl(pContext->Gateway);
00566             if (dwIpAddr)
00567             {
00568                 swprintf(szBuffer, L"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr),
00569                          THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
00570                 SendDlgItemMessageW(hwndDlg, IDC_DETAILSGATEWAY, WM_SETTEXT, 0, (LPARAM)szBuffer);
00571             }
00572             return TRUE;
00573         case WM_COMMAND:
00574             if (LOWORD(wParam) == IDC_DETAILS)
00575             {
00576                 pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER);
00577                 if (pContext)
00578                 {
00579                     DialogBoxParamW(netshell_hInstance, MAKEINTRESOURCEW(IDD_LAN_NETSTATUSDETAILS), GetParent(hwndDlg),
00580                                     LANStatusUiDetailsDlg, (LPARAM)pContext);
00581                 }
00582             }
00583             break;
00584         default:
00585             break;
00586     }
00587     return FALSE;
00588 }
00589 
00590 BOOL
00591 FindNetworkAdapter(HDEVINFO hInfo, SP_DEVINFO_DATA *pDevInfo, LPWSTR pGuid)
00592 {
00593     DWORD dwIndex, dwSize;
00594     HKEY hSubKey;
00595     WCHAR szNetCfg[50];
00596     WCHAR szDetail[200] = L"SYSTEM\\CurrentControlSet\\Control\\Class\\";
00597 
00598     dwIndex = 0;
00599     do
00600     {
00601 
00602         ZeroMemory(pDevInfo, sizeof(SP_DEVINFO_DATA));
00603         pDevInfo->cbSize = sizeof(SP_DEVINFO_DATA);
00604 
00605         /* get device info */
00606         if (!SetupDiEnumDeviceInfo(hInfo, dwIndex++, pDevInfo))
00607             break;
00608 
00609         /* get device software registry path */
00610         if (!SetupDiGetDeviceRegistryPropertyW(hInfo, pDevInfo, SPDRP_DRIVER, NULL, (LPBYTE)&szDetail[39], sizeof(szDetail)/sizeof(WCHAR) - 40, &dwSize))
00611             break;
00612 
00613         /* open device registry key */
00614         if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szDetail, 0, KEY_READ, &hSubKey) != ERROR_SUCCESS)
00615             break;
00616 
00617         /* query NetCfgInstanceId for current device */
00618         dwSize = sizeof(szNetCfg);
00619         if (RegQueryValueExW(hSubKey, L"NetCfgInstanceId", NULL, NULL, (LPBYTE)szNetCfg, &dwSize) != ERROR_SUCCESS)
00620         {
00621             RegCloseKey(hSubKey);
00622             break;
00623         }
00624         RegCloseKey(hSubKey);
00625         if (!_wcsicmp(pGuid, szNetCfg))
00626         {
00627             return TRUE;
00628         }
00629     }
00630     while(TRUE);
00631 
00632     return FALSE;
00633 }
00634 
00635 VOID
00636 DisableNetworkAdapter(INetConnection * pNet, LANSTATUSUI_CONTEXT * pContext, HWND hwndDlg)
00637 {
00638     HKEY hKey;
00639     NETCON_PROPERTIES * pProperties;
00640     LPOLESTR pDisplayName;
00641     WCHAR szPath[200];
00642     DWORD dwSize, dwType;
00643     LPWSTR pPnp;
00644     HDEVINFO hInfo;
00645     SP_DEVINFO_DATA DevInfo;
00646     SP_PROPCHANGE_PARAMS PropChangeParams;
00647     BOOL bClose = FALSE;
00648     NOTIFYICONDATAW nid;
00649 
00650     if (FAILED(pNet->GetProperties(&pProperties)))
00651         return;
00652 
00653 
00654     hInfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT );
00655     if (!hInfo)
00656     {
00657         NcFreeNetconProperties(pProperties);
00658         return;
00659     }
00660 
00661     if (FAILED(StringFromCLSID((CLSID)pProperties->guidId, &pDisplayName)))
00662     {
00663         NcFreeNetconProperties(pProperties);
00664         SetupDiDestroyDeviceInfoList(hInfo);
00665         return;
00666     }
00667     NcFreeNetconProperties(pProperties);
00668 
00669     if (FindNetworkAdapter(hInfo, &DevInfo, pDisplayName))
00670     {
00671         PropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
00672         PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; //;
00673         PropChangeParams.StateChange = DICS_DISABLE;
00674         PropChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC;
00675         PropChangeParams.HwProfile = 0;
00676 
00677         if (SetupDiSetClassInstallParams(hInfo, &DevInfo, &PropChangeParams.ClassInstallHeader, sizeof(SP_PROPCHANGE_PARAMS)))
00678         {
00679             if (SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hInfo, &DevInfo))
00680                 bClose = TRUE;
00681         }
00682     }
00683     SetupDiDestroyDeviceInfoList(hInfo);
00684 
00685     swprintf(szPath, L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pDisplayName);
00686     CoTaskMemFree(pDisplayName);
00687 
00688     if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szPath, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
00689         return;
00690 
00691     dwSize = 0;
00692     if (RegQueryValueExW(hKey, L"PnpInstanceID", NULL, &dwType, NULL, &dwSize) != ERROR_SUCCESS || dwType != REG_SZ)
00693     {
00694         RegCloseKey(hKey);
00695         return;
00696     }
00697 
00698     pPnp = (LPWSTR)CoTaskMemAlloc(dwSize);
00699     if (!pPnp)
00700     {
00701         RegCloseKey(hKey);
00702         return;
00703     }
00704 
00705     if (RegQueryValueExW(hKey, L"PnpInstanceID", NULL, &dwType, (LPBYTE)pPnp, &dwSize) != ERROR_SUCCESS)
00706     {
00707         CoTaskMemFree(pPnp);
00708         RegCloseKey(hKey);
00709         return;
00710     }
00711     RegCloseKey(hKey);
00712 
00713     swprintf(szPath, L"System\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Enum\\%s", pPnp);
00714     CoTaskMemFree(pPnp);
00715 
00716     if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, szPath, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS)
00717         return;
00718 
00719     dwSize = 1; /* enable = 0, disable = 1 */
00720     RegSetValueExW(hKey, L"CSConfigFlags", 0, REG_DWORD, (LPBYTE)&dwSize, sizeof(DWORD));
00721     RegCloseKey(hKey);
00722 
00723     if (!bClose)
00724        return;
00725 
00726     PropSheet_PressButton(GetParent(hwndDlg), PSBTN_CANCEL);
00727     ZeroMemory(&nid, sizeof(nid));
00728     nid.cbSize = sizeof(nid);
00729     nid.uID = pContext->uID;
00730     nid.hWnd = pContext->hwndDlg;
00731     nid.uFlags = NIF_STATE;
00732     nid.dwState = NIS_HIDDEN;
00733     nid.dwStateMask = NIS_HIDDEN;
00734 
00735     Shell_NotifyIconW(NIM_MODIFY, &nid);
00736 }
00737 
00738 
00739 INT_PTR
00740 CALLBACK
00741 LANStatusUiDlg(
00742     HWND hwndDlg,
00743     UINT uMsg,
00744     WPARAM wParam,
00745     LPARAM lParam)
00746 {
00747     PROPSHEETPAGE *page;
00748     LANSTATUSUI_CONTEXT * pContext;
00749     LPPSHNOTIFY lppsn;
00750 
00751     switch(uMsg)
00752     {
00753         case WM_INITDIALOG:
00754             page = (PROPSHEETPAGE*)lParam;
00755             pContext = (LANSTATUSUI_CONTEXT*)page->lParam;
00756             pContext->hwndDlg = hwndDlg;
00757             InitializeLANStatusUiDlg(hwndDlg, pContext);
00758             SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext);
00759             return TRUE;
00760         case WM_COMMAND:
00761             pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER);
00762             if (LOWORD(wParam) == IDC_STATUS_PROPERTIES)
00763             {
00764                 if (pContext)
00765                 {
00766                     ShowNetConnectionProperties(pContext->pNet, GetParent(pContext->hwndDlg)); 
00767                     BringWindowToTop(GetParent(pContext->hwndDlg));
00768                 }
00769                 break;
00770             }
00771             else if (LOWORD(wParam) == IDC_ENDISABLE)
00772             {
00773                 DisableNetworkAdapter(pContext->pNet, pContext, hwndDlg);
00774                 break;
00775             }
00776         case WM_NOTIFY:
00777             lppsn = (LPPSHNOTIFY) lParam;
00778             if (lppsn->hdr.code == PSN_APPLY || lppsn->hdr.code == PSN_RESET)
00779             {
00780                 pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER);
00781                 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
00782                 pContext->hwndDlg = NULL;
00783                 return TRUE;
00784             }
00785             break;
00786     }
00787     return FALSE;
00788 }
00789 
00790 VOID
00791 InitializePropertyDialog(
00792     LANSTATUSUI_CONTEXT * pContext,
00793     NETCON_PROPERTIES * pProperties)
00794 {
00795     DWORD dwSize, dwAdapterIndex, dwResult;
00796     LPOLESTR pStr;
00797     IP_ADAPTER_INFO *pAdapterInfo, *pCurAdapter;
00798 
00799     if (FAILED(StringFromCLSID((CLSID)pProperties->guidId, &pStr)))
00800     {
00801         return;
00802     }
00803 
00804     /* get the IfTable */
00805     dwSize = 0;
00806     dwResult = GetAdaptersInfo(NULL, &dwSize); 
00807     if (dwResult!= ERROR_BUFFER_OVERFLOW)
00808     {
00809         CoTaskMemFree(pStr);
00810         return;
00811     }
00812 
00813     pAdapterInfo = (PIP_ADAPTER_INFO)CoTaskMemAlloc(dwSize);
00814     if (!pAdapterInfo)
00815     {
00816         CoTaskMemFree(pAdapterInfo);
00817         CoTaskMemFree(pStr);
00818         return;
00819     }
00820 
00821     if (GetAdaptersInfo(pAdapterInfo, &dwSize) != NO_ERROR)
00822     {
00823         CoTaskMemFree(pAdapterInfo);
00824         CoTaskMemFree(pStr);
00825         return;
00826     }
00827 
00828     if (!GetAdapterIndexFromNetCfgInstanceId(pAdapterInfo, pStr, &dwAdapterIndex))
00829     {
00830         CoTaskMemFree(pAdapterInfo);
00831         CoTaskMemFree(pStr);
00832         return;
00833     }
00834 
00835     pCurAdapter = pAdapterInfo;
00836     while(pCurAdapter->Index != dwAdapterIndex)
00837         pCurAdapter = pCurAdapter->Next;
00838 
00839 
00840     pContext->IpAddress = inet_addr(pCurAdapter->IpAddressList.IpAddress.String);
00841     pContext->SubnetMask = inet_addr(pCurAdapter->IpAddressList.IpMask.String);
00842     pContext->Gateway = inet_addr(pCurAdapter->GatewayList.IpAddress.String);
00843     pContext->DHCPEnabled = pCurAdapter->DhcpEnabled;
00844     CoTaskMemFree(pStr);
00845     CoTaskMemFree(pAdapterInfo);
00846     pContext->dwAdapterIndex = dwAdapterIndex;
00847 }
00848 
00849 VOID
00850 ShowStatusPropertyDialog(
00851     LANSTATUSUI_CONTEXT *pContext,
00852     HWND hwndDlg)
00853 {
00854     HPROPSHEETPAGE hppages[2];
00855     PROPSHEETHEADERW pinfo;
00856     NETCON_PROPERTIES * pProperties = NULL;
00857 
00858     ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW));
00859     ZeroMemory(hppages, sizeof(hppages));
00860     pinfo.dwSize = sizeof(PROPSHEETHEADERW);
00861     pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW;
00862     pinfo.phpage = hppages;
00863     pinfo.hwndParent = hwndDlg;
00864 
00865     if (pContext->pNet->GetProperties(&pProperties) == S_OK)
00866     {
00867         if (pProperties->pszwName)
00868         {
00869             pinfo.pszCaption = pProperties->pszwName;
00870             pinfo.dwFlags |= PSH_PROPTITLE;
00871         }
00872         InitializePropertyDialog(pContext, pProperties);
00873         if (pProperties->MediaType == NCM_LAN && pProperties->Status == NCS_CONNECTED)
00874         {
00875             hppages[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUS), LANStatusUiDlg, (LPARAM)pContext, NULL);
00876             if (hppages[0])
00877                pinfo.nPages++;
00878 
00879             hppages[pinfo.nPages] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUSADVANCED), LANStatusUiAdvancedDlg, (LPARAM)pContext, NULL);
00880             if (hppages[pinfo.nPages])
00881                pinfo.nPages++;
00882 
00883             if (pinfo.nPages)
00884             {
00885                 PropertySheetW(&pinfo);
00886             }
00887         }
00888         else if (pProperties->Status == NCS_MEDIA_DISCONNECTED || pProperties->Status == NCS_DISCONNECTED ||
00889                  pProperties->Status == NCS_HARDWARE_DISABLED)
00890         {
00891             ShowNetConnectionProperties(pContext->pNet, pContext->hwndDlg);
00892         }
00893 
00894         NcFreeNetconProperties(pProperties);
00895     }
00896 }
00897 
00898 INT_PTR
00899 CALLBACK
00900 LANStatusDlg(
00901     HWND hwndDlg,
00902     UINT uMsg,
00903     WPARAM wParam,
00904     LPARAM lParam)
00905 {
00906     LANSTATUSUI_CONTEXT * pContext;
00907 
00908     switch(uMsg)
00909     {
00910         case WM_INITDIALOG:
00911             pContext = (LANSTATUSUI_CONTEXT *)lParam;
00912             SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam);
00913             pContext->nIDEvent = SetTimer(hwndDlg, 0xFABC, 1000, NULL);
00914             return TRUE;
00915         case WM_TIMER:
00916             pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER);
00917             if (wParam == (WPARAM)pContext->nIDEvent)
00918             {
00919                 UpdateLanStatus(pContext->hwndDlg, pContext);
00920             }
00921             break;
00922         case WM_SHOWSTATUSDLG:
00923             if (LOWORD(lParam) == WM_LBUTTONDOWN)
00924             {
00925                 pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER);
00926                 if (!pContext)
00927                     break;
00928 
00929                 if (pContext->hwndDlg)
00930                 {
00931                     ShowWindow(GetParent(pContext->hwndDlg), SW_SHOW);
00932                     BringWindowToTop(GetParent(pContext->hwndDlg));
00933                 }
00934                 else
00935                 {
00936                     ShowStatusPropertyDialog(pContext, hwndDlg);
00937                 }
00938                 break;
00939             }
00940             break;
00941     }
00942     return FALSE;
00943 }
00944  
00945 HRESULT
00946 CLanStatus::InitializeNetTaskbarNotifications()
00947 {
00948     NOTIFYICONDATAW nid;
00949     HWND hwndDlg;
00950     INetConnectionManager *pNetConMan;
00951     IEnumNetConnection *pEnumCon;
00952     INetConnection *pNetCon;
00953     NETCON_PROPERTIES* pProps;
00954     HRESULT hr;
00955     ULONG Count;
00956     ULONG Index;
00957     NOTIFICATION_ITEM * pItem, *pLast = NULL;
00958     LANSTATUSUI_CONTEXT * pContext;
00959 
00960     TRACE("InitializeNetTaskbarNotifications\n");
00961 
00962     if (pHead)
00963     {
00964        pItem = pHead;
00965        while(pItem)
00966        {
00967            hr = pItem->pNet->GetProperties(&pProps);
00968            if (SUCCEEDED(hr))
00969            {
00970                 ZeroMemory(&nid, sizeof(nid));
00971                 nid.cbSize = sizeof(nid);
00972                 nid.uID = pItem->uID;
00973                 nid.hWnd = pItem->hwndDlg;
00974                 nid.uFlags = NIF_STATE;
00975                 if (pProps->dwCharacter & NCCF_SHOW_ICON)
00976                     nid.dwState = 0;
00977                 else
00978                     nid.dwState = NIS_HIDDEN;
00979 
00980                 nid.dwStateMask = NIS_HIDDEN;
00981                 Shell_NotifyIconW(NIM_MODIFY, &nid);
00982                 NcFreeNetconProperties(pProps);
00983            }
00984            pItem = pItem->pNext;
00985        }
00986        return S_OK;
00987     }
00988     /* get an instance to of IConnectionManager */
00989 
00990     //hr = CoCreateInstance(&CLSID_ConnectionManager, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionManager, (LPVOID*)&pNetConMan);
00991 
00992     hr = INetConnectionManager_Constructor(NULL, IID_INetConnectionManager, (LPVOID*)&pNetConMan);
00993     if (FAILED(hr))
00994     {
00995         ERR("INetConnectionManager_Constructor failed\n");
00996         return hr;
00997     }
00998 
00999     hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon);
01000     if (FAILED(hr))
01001     {
01002         ERR("EnumConnections failed\n");
01003         pNetConMan->Release();
01004         return hr;
01005     }
01006 
01007     Index = 1;
01008     do
01009     {
01010         hr = pEnumCon->Next(1, &pNetCon, &Count);
01011         if (hr == S_OK)
01012         {
01013             TRACE("new connection\n");
01014             pItem = (NOTIFICATION_ITEM*)CoTaskMemAlloc(sizeof(NOTIFICATION_ITEM));
01015             if (!pItem)
01016                 break;
01017 
01018             pContext = (LANSTATUSUI_CONTEXT*)CoTaskMemAlloc(sizeof(LANSTATUSUI_CONTEXT));
01019             if (!pContext)
01020             {
01021                 CoTaskMemFree(pItem);
01022                 break;
01023             }
01024 
01025             ZeroMemory(pContext, sizeof(LANSTATUSUI_CONTEXT));
01026             pContext->uID = Index;
01027             pContext->pNet = pNetCon;
01028             pItem->uID = Index;
01029             pItem->pNext = NULL;
01030             pItem->pNet = pNetCon;
01031             hwndDlg = CreateDialogParamW(netshell_hInstance, MAKEINTRESOURCEW(IDD_STATUS), NULL, LANStatusDlg, (LPARAM)pContext);
01032             if (hwndDlg)
01033             {
01034                 ZeroMemory(&nid, sizeof(nid));
01035                 nid.cbSize = sizeof(nid);
01036                 nid.uID = Index++;
01037                 nid.uFlags = NIF_MESSAGE;
01038                 nid.uVersion = 3;
01039                 nid.uCallbackMessage = WM_SHOWSTATUSDLG;
01040                 nid.hWnd = hwndDlg;
01041 
01042                 hr = pNetCon->GetProperties(&pProps);
01043                 if (SUCCEEDED(hr))
01044                 {
01045                     CopyMemory(&pItem->guidItem, &pProps->guidId, sizeof(GUID));
01046                     if (!(pProps->dwCharacter & NCCF_SHOW_ICON))
01047                     {
01048                         nid.dwState = NIS_HIDDEN;
01049                         nid.dwStateMask = NIS_HIDDEN;
01050                         nid.uFlags |= NIF_STATE;
01051                     }
01052                     if (pProps->Status == NCS_MEDIA_DISCONNECTED || pProps->Status == NCS_DISCONNECTED || pProps->Status == NCS_HARDWARE_DISABLED)
01053                         nid.hIcon = LoadIcon(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF));
01054                     else if (pProps->Status == NCS_CONNECTED)
01055                         nid.hIcon = LoadIcon(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE));
01056 
01057                     if (nid.hIcon)
01058                         nid.uFlags |= NIF_ICON;
01059 
01060                     wcscpy(nid.szTip, pProps->pszwName);
01061                     nid.uFlags |= NIF_TIP;
01062                 }
01063                 pContext->hwndStatusDlg = hwndDlg;
01064                 pItem->hwndDlg = hwndDlg;
01065 
01066                 if (Shell_NotifyIconW(NIM_ADD, &nid))
01067                 {
01068                     if (pLast)
01069                         pLast->pNext = pItem;
01070                     else
01071                         pHead = pItem;
01072 
01073                     pLast = pItem;
01074                     Index++;
01075                 }
01076                 else
01077                 {
01078                     ERR("Shell_NotifyIconW failed\n");
01079                     CoTaskMemFree(pItem);
01080                 }
01081 
01082                 if (nid.uFlags & NIF_ICON)
01083                     DestroyIcon(nid.hIcon);
01084             } else
01085                 ERR("CreateDialogParamW failed\n");
01086         }
01087     } while(hr == S_OK);
01088 
01089     lpNetMan = pNetConMan;
01090     pEnumCon->Release();
01091     return S_OK;
01092 }
01093 
01094 HRESULT
01095 CLanStatus::ShowStatusDialogByCLSID(const GUID *pguidCmdGroup)
01096 {
01097     NOTIFICATION_ITEM *pItem;
01098 
01099     pItem = pHead;
01100     while(pItem)
01101     {
01102         if (IsEqualGUID(pItem->guidItem, *pguidCmdGroup))
01103         {
01104             SendMessageW(pItem->hwndDlg, WM_SHOWSTATUSDLG, 0, WM_LBUTTONDOWN);
01105             return S_OK;
01106         }
01107         pItem = pItem->pNext;
01108     }
01109 
01110     ERR("not found\n");
01111     return E_FAIL;
01112 }
01113 
01114 HRESULT
01115 WINAPI
01116 CLanStatus::QueryInterface(
01117     REFIID iid,
01118     LPVOID *ppvObj)
01119 {
01120     *ppvObj = NULL;
01121 
01122     if (IsEqualIID(iid, IID_IUnknown) ||
01123         IsEqualIID(iid, IID_IOleCommandTarget))
01124     {
01125         *ppvObj = this;
01126         AddRef();
01127         return S_OK;
01128     }
01129     MessageBoxW(NULL, L"IOleCommandTarget_fnQueryInterface", NULL, MB_OK);
01130     return E_NOINTERFACE;
01131 }
01132 
01133 ULONG
01134 WINAPI
01135 CLanStatus::AddRef()
01136 {
01137     ULONG refCount = InterlockedIncrement(&ref);
01138 
01139     return refCount;
01140 }
01141 
01142 ULONG
01143 WINAPI
01144 CLanStatus::Release()
01145 {
01146 #if 0 // WTF?!
01147     ULONG refCount = InterlockedDecrement(&ref);
01148 
01149     if (!refCount) 
01150         delete this;
01151 
01152     return refCount;
01153 #else
01154     return 1;
01155 #endif
01156 }
01157 
01158 HRESULT
01159 WINAPI
01160 CLanStatus::QueryStatus(
01161     const GUID *pguidCmdGroup,
01162     ULONG cCmds,
01163     OLECMD *prgCmds,
01164     OLECMDTEXT *pCmdText)
01165 {
01166     MessageBoxW(NULL, pCmdText->rgwz, L"IOleCommandTarget_fnQueryStatus", MB_OK);
01167     return E_NOTIMPL;
01168 }
01169 
01170 HRESULT
01171 WINAPI
01172 CLanStatus::Exec(
01173     const GUID *pguidCmdGroup,
01174     DWORD nCmdID,
01175     DWORD nCmdexecopt,
01176     VARIANT *pvaIn,
01177     VARIANT *pvaOut)
01178 {
01179     if (pguidCmdGroup)
01180     {
01181         if (IsEqualGUID(*pguidCmdGroup, CGID_ShellServiceObject))
01182         {
01183             return InitializeNetTaskbarNotifications();
01184         }
01185         else
01186         {
01187             /* invoke status dialog */
01188             return ShowStatusDialogByCLSID(pguidCmdGroup);
01189         }
01190     }
01191     return S_OK;
01192 }
01193 
01194 HRESULT WINAPI LanConnectStatusUI_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv)
01195 {
01196     TRACE("LanConnectStatusUI_Constructor\n");
01197 
01198     if (!ppv)
01199         return E_POINTER;
01200 
01201     if (pUnkOuter)
01202         return CLASS_E_NOAGGREGATION;
01203 
01204     CLanStatus *pLanStatus = new CLanStatus;
01205     if (!pLanStatus)
01206         return E_OUTOFMEMORY;
01207 
01208     pLanStatus->AddRef();
01209     static volatile CLanStatus *pCachedLanStatus = NULL;
01210     if (InterlockedCompareExchangePointer((void **)&pCachedLanStatus, pLanStatus, NULL) != NULL)
01211         pLanStatus->Release();
01212 
01213     return ((CLanStatus*)pCachedLanStatus)->QueryInterface(riid, ppv);
01214 }
01215 

Generated on Mon May 28 2012 04:25:04 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.