//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: C F U T I L S . C P P // // Contents: Various utility functions for the connections folder // // Notes: // // Author: jeffspr 20 Jan 1998 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "foldinc.h" // Standard shell\folder includes #include "nsres.h" // Netshell strings #include "cfutils.h" // Connection folder utility functions #include "wzcdlg.h" VOID MapNCMToResourceId( IN NETCON_MEDIATYPE nct, IN DWORD dwCharacteristics, OUT INT * piStringRes) { Assert(piStringRes); if (dwCharacteristics & NCCF_BRANDED) { *piStringRes = IDS_CONFOLD_OBJECT_TYPE_CONMAN; } else if (dwCharacteristics & NCCF_INCOMING_ONLY) { *piStringRes = IDS_CONFOLD_OBJECT_TYPE_INBOUND; } else { switch(nct) { case NCM_NONE: Assert(dwCharacteristics & NCCF_INCOMING_ONLY); *piStringRes = IDS_CONFOLD_OBJECT_TYPE_INBOUND; break; case NCM_DIRECT: *piStringRes = IDS_CONFOLD_OBJECT_TYPE_DIRECT; break; case NCM_ISDN: *piStringRes = IDS_CONFOLD_OBJECT_TYPE_PHONE; break; case NCM_LAN: if(dwCharacteristics & NCCF_BRIDGED) { *piStringRes = IDS_CONFOLD_OBJECT_TYPE_BRIDGE; } else { *piStringRes = IDS_CONFOLD_OBJECT_TYPE_LAN; } break; case NCM_PHONE: *piStringRes = IDS_CONFOLD_OBJECT_TYPE_PHONE; break; case NCM_TUNNEL: *piStringRes = IDS_CONFOLD_OBJECT_TYPE_TUNNEL; break; case NCM_BRIDGE: *piStringRes = IDS_CONFOLD_OBJECT_TYPE_BRIDGE; break; case NCM_SHAREDACCESSHOST_LAN: case NCM_SHAREDACCESSHOST_RAS: *piStringRes = IDS_CONFOLD_OBJECT_TYPE_SHAREDACCESSHOST; break; case NCM_PPPOE: *piStringRes = IDS_CONFOLD_OBJECT_TYPE_PPPOE; break; default: AssertSz(FALSE, "Marfa -- I can't find my teef! (You may ignore.)"); *piStringRes = IDS_CONFOLD_OBJECT_TYPE_UNKNOWN; break; } } } VOID MapNCSToComplexStatus( IN NETCON_STATUS ncs, IN NETCON_MEDIATYPE ncm, IN NETCON_SUBMEDIATYPE ncsm, IN DWORD dwCharacteristics, OUT LPWSTR pszString, IN DWORD cString, IN GUID gdDevice) { Assert(cString >= CONFOLD_MAX_STATUS_LENGTH); *pszString = L'\0'; PCWSTR szArgs[4] = {L"", L"", L"", L""}; DWORD dwArg = 0; WCHAR szTmpString[MAX_PATH]; INT iStringRes = 0; if ((NCM_NONE == ncm) && (dwCharacteristics & NCCF_INCOMING_ONLY) ) { DWORD dwIncomingCount; HRESULT hr = g_ccl.HasActiveIncomingConnections(&dwIncomingCount); if (SUCCEEDED(hr) && dwIncomingCount) { if (1 == dwIncomingCount) { szArgs[dwArg++] = SzLoadIds(IDS_CONFOLD_STATUS_INCOMING_ONE); } else { if (DwFormatString(SzLoadIds(IDS_CONFOLD_STATUS_INCOMING_MULTI), szTmpString, MAX_PATH, dwIncomingCount)) { szArgs[dwArg++] = szTmpString; } } } else { szArgs[dwArg++] = SzLoadIds(IDS_CONFOLD_STATUS_INCOMING_NONE); } } else { MapNCSToStatusResourceId(ncs, ncm, ncsm, dwCharacteristics, &iStringRes, gdDevice); } if (iStringRes) { szArgs[dwArg++] = SzLoadIds(iStringRes); } if (ncs == NCS_DISCONNECTED || fIsConnectedStatus(ncs)) { if(NCCF_BRIDGED & dwCharacteristics) { szArgs[dwArg++] = SzLoadIds(IDS_CONFOLD_STATUS_BRIDGED); } if(NCCF_SHARED & dwCharacteristics) { szArgs[dwArg++] = SzLoadIds(IDS_CONFOLD_STATUS_SHARED); } if(NCCF_FIREWALLED & dwCharacteristics) { szArgs[dwArg++] = SzLoadIds(IDS_CONFOLD_STATUS_FIREWALLED); } } if(0 == FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, L"%1%2%3%4", 0, 0, pszString, cString, (va_list*) &szArgs)) { *pszString = L'\0'; // on error return empty } if ( (NCS_CREDENTIALS_REQUIRED == ncs) || (NCS_AUTHENTICATING == ncs) ) { BSTR szStatusText = NULL; HRESULT hrT = WZCQueryConnectionStatusText(&gdDevice, ncs, &szStatusText); if (S_OK == hrT) { wcsncpy(pszString, szStatusText, cString); SysFreeString(szStatusText); } } } VOID MapNCSToStatusResourceId( IN NETCON_STATUS ncs, IN NETCON_MEDIATYPE ncm, IN NETCON_SUBMEDIATYPE ncsm, IN DWORD dwCharacteristics, OUT INT * piStringRes, IN GUID gdDevice) { Assert(piStringRes); switch(ncs) { case NCS_DISCONNECTED: if (IsMediaLocalType(ncm) || NCM_SHAREDACCESSHOST_LAN == ncm) { *piStringRes = IDS_CONFOLD_STATUS_DISABLED; } else { *piStringRes = IDS_CONFOLD_STATUS_DISCONNECTED; } break; case NCS_CONNECTING: if (IsMediaLocalType(ncm) || NCM_SHAREDACCESSHOST_LAN == ncm) *piStringRes = IDS_CONFOLD_STATUS_ENABLING; else *piStringRes = IDS_CONFOLD_STATUS_CONNECTING; break; case NCS_CONNECTED: if (IsMediaLocalType(ncm) || NCM_SHAREDACCESSHOST_LAN == ncm) { *piStringRes = IDS_CONFOLD_STATUS_ENABLED; } else { *piStringRes = IDS_CONFOLD_STATUS_CONNECTED; } break; case NCS_DISCONNECTING: if (IsMediaLocalType(ncm) || NCM_SHAREDACCESSHOST_LAN == ncm) *piStringRes = IDS_CONFOLD_STATUS_DISABLING; else *piStringRes = IDS_CONFOLD_STATUS_DISCONNECTING; break; case NCS_HARDWARE_NOT_PRESENT: *piStringRes = IDS_CONFOLD_STATUS_HARDWARE_NOT_PRESENT; break; case NCS_HARDWARE_DISABLED: *piStringRes = IDS_CONFOLD_STATUS_HARDWARE_DISABLED; break; case NCS_HARDWARE_MALFUNCTION: *piStringRes = IDS_CONFOLD_STATUS_HARDWARE_MALFUNCTION; break; case NCS_MEDIA_DISCONNECTED: if ( (ncm == NCM_LAN) && (ncsm == NCSM_WIRELESS) ) { *piStringRes = IDS_CONFOLD_STATUS_WIRELESS_DISCONNECTED; } else { *piStringRes = IDS_CONFOLD_STATUS_MEDIA_DISCONNECTED; } break; case NCS_INVALID_ADDRESS: *piStringRes = IDS_CONFOLD_STATUS_INVALID_ADDRESS; break; case NCS_AUTHENTICATION_FAILED: *piStringRes = IDS_CONFOLD_STATUS_AUTHENTICATION_FAILED; break; case NCS_AUTHENTICATING: *piStringRes = IDS_CONFOLD_STATUS_AUTHENTICATING; break; case NCS_AUTHENTICATION_SUCCEEDED: *piStringRes = IDS_CONFOLD_STATUS_AUTHENTICATION_SUCCEEDED; break; case NCS_CREDENTIALS_REQUIRED: *piStringRes = IDS_CONFOLD_STATUS_CREDENTIALS_REQUIRED; break; default: AssertSz(FALSE, "Unknown status in MapNCSToStatusResourceId"); *piStringRes = IDS_CONFOLD_STATUS_DISCONNECTED; break; } } DWORD MapRSSIToWirelessSignalStrength(IN int iRSSI) throw() { if (iRSSI < -90) { return 0; } if (iRSSI < -81) { return 1; } if (iRSSI < -71) { return 2; } if (iRSSI < -67) { return 3; } if (iRSSI < -57) { return 4; } return 5; } PCWSTR PszGetRSSIString(IN INT iRSSI) throw() { DWORD wss = MapRSSIToWirelessSignalStrength(iRSSI); Assert(wss <= (IDS_802_11_LEVEL5 - IDS_802_11_LEVEL0) ); return SzLoadIds(IDS_802_11_LEVEL0 + wss); } //+--------------------------------------------------------------------------- // // Function: PszGetOwnerStringFromCharacteristics // // Purpose: Get the owner string from the CONFOLDENTRY. This will // return the string for "System" if the connection is for // all users, and will return the particular user if // appropriate // // Arguments: // pszUserName [in] The name for the currently logged in user // dwCharacteristics [in] The current characteristics of the connection // // Returns: The string for the user name // // Author: jeffspr 20 Jan 1998 // // Notes: // PCWSTR PszGetOwnerStringFromCharacteristics(IN PCWSTR pszUserName, IN DWORD dwCharacteristics) throw() { PCWSTR pszOwner = NULL; BOOL fAllUsers = (dwCharacteristics & NCCF_ALL_USERS) > 0; // If they both have the same user type, then they're equal // if (fAllUsers) { pszOwner = SzLoadIds(IDS_CONFOLD_DETAILS_OWNER_SYSTEM); } else { pszOwner = pszUserName; } return pszOwner; } BOOL IsMediaLocalType(IN NETCON_MEDIATYPE ncm) throw() { return (ncm == NCM_LAN || ncm == NCM_BRIDGE); } BOOL IsMediaRASType(IN NETCON_MEDIATYPE ncm) throw() { return (ncm == NCM_DIRECT || ncm == NCM_ISDN || ncm == NCM_PHONE || ncm == NCM_TUNNEL || ncm == NCM_PPPOE);// REVIEW DIRECT correct? } BOOL IsMediaSharedAccessHostType(IN NETCON_MEDIATYPE ncm) throw() { return (ncm == NCM_SHAREDACCESSHOST_LAN || ncm == NCM_SHAREDACCESSHOST_RAS); } //+--------------------------------------------------------------------------- // // Function Name: ImageList_LoadImageAndMirror // // Purpose: This function creates an image list from the specified bitmap or icon resource. // // Arguments: // hi [in] Handle to the instance of an application or DLL that contains an image. // lpbmp [in] Long pointer to the image to load. // If the uFlags parameter includes LR_LOADFROMFILE, lpbmp is the address // of a null-terminated string that names the file containing the image to load. // // If the hi parameter is non-NULL and LR_LOADFROMFILE is not specified, lpbmp is the // address of a null-terminated string that contains the name of the image resource in the hi module. // // If hi is NULL and LR_LOADFROMFILE is not specified, the low-order word of this // parameter must be the identifier of an OEM image to load. To create this value, use the // MAKEINTRESOURCE macro with one of the OEM image identifiers defined in Winuser.h. // These identifiers have the following prefixes: // OBM_ for OEM bitmaps // OIC_ for OEM icons // // cx [in] Width of each image. The height of each image and the initial number of images are inferred // by the dimensions of the specified resource. // cGrow [in] Number of images by which the image list can grow when the system needs to make room for new // images. This parameter represents the number of new images that the resized image list can contain. // crMask [in] Color used to generate a mask. Each pixel of this color in the specified bitmap or icon is changed to // black, and the corresponding bit in the mask is set to 1. If this parameter is the CLR_NONE value, // no mask is generated. If this parameter is the CLR_DEFAULT value, the color of the pixel at the // upper-left corner of the image is treated as the mask color. // uType [in] Flag that specifies the type of image to load. This parameter can be one of the following values: // IMAGE_BITMAP Loads a bitmap. // IMAGE_ICON Loads an icon. // uFlags [in] Unsupported; set to 0. // // Returns: // The handle to the image list indicates success. NULL indicates failure. // // Author: deonb 8 Feb 2001 // // Notes: // This is an exact duplication of the implementation of shell's ImageList_LoadImage function EXCEPT for the // fact that we set ILC_MIRROR in order to create the second, mirrored image list which will be used // by RTL languages // HIMAGELIST WINAPI ImageList_LoadImageAndMirror( IN HINSTANCE hi, IN LPCTSTR lpbmp, IN int cx, IN int cGrow, IN COLORREF crMask, IN UINT uType, IN UINT uFlags) throw() { HBITMAP hbmImage; HIMAGELIST piml = NULL; BITMAP bm; int cy, cInitial; UINT flags; hbmImage = (HBITMAP)LoadImage(hi, lpbmp, uType, 0, 0, uFlags); if (hbmImage && (sizeof(bm) == GetObject(hbmImage, sizeof(bm), &bm))) { // If cx is not stated assume it is the same as cy. // ASSERT(cx); cy = bm.bmHeight; if (cx == 0) cx = cy; cInitial = bm.bmWidth / cx; flags = 0; if (crMask != CLR_NONE) flags |= ILC_MASK; if (bm.bmBits) flags |= (bm.bmBitsPixel & ILC_COLORMASK); flags |= ILC_MIRROR; piml = ImageList_Create(cx, cy, flags, cInitial, cGrow); if (piml) { int added; if (crMask == CLR_NONE) added = ImageList_Add(piml, hbmImage, NULL); else added = ImageList_AddMasked(piml, hbmImage, crMask); if (added < 0) { ImageList_Destroy(piml); piml = NULL; } } } if (hbmImage) DeleteObject(hbmImage); return reinterpret_cast(piml); }