838 lines
26 KiB
C++
838 lines
26 KiB
C++
//+----------------------------------------------------------------------------
|
|
//
|
|
// Windows NT Directory Service Property Pages
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 2001
|
|
//
|
|
// File: shlprop.cxx
|
|
//
|
|
// Contents: Tables for table-driven Shell DS property pages
|
|
//
|
|
// History: 14-July-97 Jimharr created from dsprop.cxx by ericb
|
|
//
|
|
// Note: Attribute LDAP display names, types, upper ranges, and so
|
|
// forth, have been manually copied from schema.ini. Thus,
|
|
// consistency is going to be difficult to maintain. If you know
|
|
// of schema.ini changes that affect any of the attributes in
|
|
// this file, then please make any necessary corrections here.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "pch.h"
|
|
#include "proppage.h"
|
|
#include "user.h"
|
|
#include "group.h"
|
|
#include "computer.h"
|
|
#include "pages.hm" // HIDC_*
|
|
#include <ntdsadef.h>
|
|
|
|
#include "dsprop.cxx"
|
|
|
|
HRESULT
|
|
ROList(CDsPropPageBase * pPage, PATTR_MAP pAttrMap, PADS_ATTR_INFO pAttrInfo,
|
|
LPARAM lParam, PATTR_DATA pAttrData, DLG_OP DlgOp);
|
|
|
|
#define NT_GROUP_PAGE
|
|
|
|
#ifdef NT_GROUP_PAGE
|
|
HRESULT
|
|
BmpPictureCtrl(CDsPropPageBase * pPage, PATTR_MAP pAttrMap,
|
|
PADS_ATTR_INFO pAttrInfo, LPARAM lParam, PATTR_DATA pAttrData,
|
|
DLG_OP DlgOp);
|
|
|
|
INT_PTR CALLBACK
|
|
PictureDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Class: CBmpPicCtrl
|
|
//
|
|
// Purpose: Picture control sub-class window proc for displaying bitmaps.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
class CBmpPicCtrl
|
|
{
|
|
public:
|
|
#ifdef _DEBUG
|
|
char szClass[32];
|
|
#endif
|
|
|
|
CBmpPicCtrl(HWND hCtrl, PBYTE pb);
|
|
~CBmpPicCtrl(void);
|
|
|
|
//
|
|
// Static WndProc to be passed as subclass address.
|
|
//
|
|
static LRESULT CALLBACK StaticCtrlProc(HWND hWnd, UINT uMsg,
|
|
WPARAM wParam, LPARAM lParam);
|
|
//
|
|
// Member functions, called by WndProc
|
|
//
|
|
LRESULT OnPaint(void);
|
|
|
|
HRESULT CreateBmpPalette(void);
|
|
//
|
|
// Data members
|
|
//
|
|
|
|
protected:
|
|
HWND m_hCtrl;
|
|
HWND m_hDlg;
|
|
WNDPROC m_pOldProc;
|
|
PBYTE m_pbBmp;
|
|
HPALETTE m_hPal;
|
|
};
|
|
|
|
#endif // NT_GROUP_PAGE
|
|
|
|
//+----------------------------------------------------------------------------
|
|
// User Object.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//
|
|
// General page, first name
|
|
//
|
|
ATTR_MAP USGFirstName = {IDC_SH_FIRST_NAME_EDIT, FALSE, FALSE, 64,
|
|
{L"givenName", ADS_ATTR_UPDATE,
|
|
ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL};
|
|
//
|
|
// General page, last name
|
|
//
|
|
ATTR_MAP USGLastName = {IDC_SH_LAST_NAME_EDIT, FALSE, FALSE, 64,
|
|
{L"sn", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING,
|
|
NULL, 0}, NULL, NULL};
|
|
//
|
|
// General page, friendly name
|
|
//
|
|
ATTR_MAP USGFriendlyName = {IDC_SH_DISPLAY_NAME_EDIT, FALSE, FALSE,
|
|
ATTR_LEN_UNLIMITED, {L"displayName",
|
|
ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING,
|
|
NULL, 0}, NULL, NULL};
|
|
//
|
|
// General page, phone number
|
|
//
|
|
ATTR_MAP USGPhone = {IDC_PHONE_EDIT, FALSE, FALSE, 32,
|
|
{L"telephoneNumber", ADS_ATTR_UPDATE,
|
|
ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL};
|
|
//
|
|
// General page, email
|
|
//
|
|
ATTR_MAP USGEMail = {IDC_EMAIL_EDIT, FALSE, FALSE, 256,
|
|
{L"mail", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING,
|
|
NULL, 0}, NULL, NULL};
|
|
//
|
|
// General page, URL
|
|
//
|
|
ATTR_MAP USGURL = {IDC_URL_EDIT, FALSE, FALSE, 2048,
|
|
{L"wWWHomePage", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL,
|
|
0}, NULL, NULL};
|
|
//
|
|
// The list of attributes on the User General page.
|
|
//
|
|
PATTR_MAP rgpUSGAttrMap[] = {{&GenIcon}, {&AttrName}, {&USGFirstName},
|
|
{&USGLastName}, {&USGFriendlyName},
|
|
{&USGPhone}, {&USGEMail}, {&USGURL}};
|
|
//--------------------------------------------------------
|
|
// Business page, title
|
|
//
|
|
ATTR_MAP USBTitle = {IDC_TITLE, FALSE, FALSE, ATTR_LEN_UNLIMITED,
|
|
{L"title", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING,
|
|
NULL, 0}, NULL, NULL};
|
|
//
|
|
// Business page, Company
|
|
//
|
|
ATTR_MAP USBCo = {IDC_COMPANY, FALSE, FALSE, 64,
|
|
{L"company", ADS_ATTR_UPDATE,
|
|
ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL};
|
|
//
|
|
// Business page, Department
|
|
//
|
|
ATTR_MAP USBDept = {IDC_DEPARTMENT, FALSE, FALSE, 64,
|
|
{L"department", ADS_ATTR_UPDATE,
|
|
ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL};
|
|
//
|
|
// Business page, office
|
|
//
|
|
ATTR_MAP USBOffice = {IDC_OFFICE, FALSE, FALSE, 128,
|
|
{L"physicalDeliveryOfficeName", ADS_ATTR_UPDATE,
|
|
ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL};
|
|
//
|
|
// Business page, Manager
|
|
//
|
|
ATTR_MAP USBMgr = {IDC_MANAGER, TRUE, FALSE, ATTR_LEN_UNLIMITED,
|
|
{L"manager", ADS_ATTR_UPDATE,
|
|
ADSTYPE_DN_STRING, NULL, 0}, ManagerEdit, NULL};
|
|
//
|
|
// Business page, direct reports
|
|
//
|
|
ATTR_MAP USBReports = {IDC_REPORTS_LIST, TRUE, TRUE, 0,
|
|
{L"directReports", ADS_ATTR_UPDATE,
|
|
ADSTYPE_DN_STRING, NULL, 0}, DirectReportsList, NULL};
|
|
//
|
|
// The list of attributes on the User Business page.
|
|
//
|
|
PATTR_MAP rgpUSBAttrMap[] = {{&USBTitle}, {&USBCo}, {&USBDept}, {&USBOffice},
|
|
{&USBMgr}, {&USBReports}};
|
|
|
|
//
|
|
// The User General page description.
|
|
//
|
|
DSPAGE ShellUserGeneral = {IDS_TITLE_GENERAL, IDD_SHELL_USER_GEN, 0, 0, NULL,
|
|
CreateTableDrivenPage,
|
|
sizeof(rgpUSGAttrMap)/sizeof(PATTR_MAP), rgpUSGAttrMap};
|
|
|
|
//
|
|
// The User Business page description.
|
|
//
|
|
DSPAGE ShellUserBusiness = {IDS_TITLE_BUSINESS, IDD_SHELL_BUSINESS, 0, 0, NULL,
|
|
CreateTableDrivenPage,
|
|
sizeof(rgpUSBAttrMap)/sizeof(PATTR_MAP), rgpUSBAttrMap};
|
|
|
|
#ifdef NT_GROUP_PAGE
|
|
//----------------------------------------------
|
|
// Special User page, Home phone primary/other
|
|
//
|
|
ATTR_MAP USpecHomePhone = {IDC_HOMEPHONE_EDIT, FALSE, FALSE, 64,
|
|
{L"homePhone", ADS_ATTR_UPDATE,
|
|
ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL};
|
|
|
|
ATTR_MAP USpecHomeOther = {IDC_OTHER_HOME_BTN, FALSE, TRUE, 64,
|
|
{L"otherHomePhone", ADS_ATTR_UPDATE,
|
|
ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, OtherValuesBtn, NULL};
|
|
//
|
|
// Special page, Pager
|
|
//
|
|
ATTR_MAP USpecPager = {IDC_PAGER_EDIT, FALSE, FALSE, 64,
|
|
{L"pager", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING,
|
|
NULL, 0}, NULL, NULL};
|
|
|
|
ATTR_MAP USpecOtherPager = {IDC_OTHER_PAGER_BTN, FALSE, TRUE, 64,
|
|
{L"otherPager", ADS_ATTR_UPDATE,
|
|
ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, OtherValuesBtn, NULL};
|
|
//
|
|
// Special page, Mobile
|
|
//
|
|
ATTR_MAP USpecMobile = {IDC_MOBILE_EDIT, FALSE, FALSE, 64,
|
|
{L"mobile", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING,
|
|
NULL, 0}, NULL, NULL};
|
|
|
|
ATTR_MAP USpecOtherMobile = {IDC_OTHER_MOBLE_BTN, FALSE, TRUE, 64,
|
|
{L"otherMobile", ADS_ATTR_UPDATE,
|
|
ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, OtherValuesBtn, NULL};
|
|
//
|
|
// Special page, user's home page
|
|
//
|
|
ATTR_MAP USpecURL = {IDC_HOME_PAGE_EDIT, FALSE, FALSE, 2048,
|
|
{L"wWWHomePage", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING,
|
|
NULL, 0}, NULL, NULL};
|
|
//
|
|
// Special page, other home pages
|
|
//
|
|
ATTR_MAP USpecOtherURL = {IDC_OTHER_URL_BTN, FALSE, TRUE, 2048,
|
|
{L"url", ADS_ATTR_UPDATE,
|
|
ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, OtherValuesBtn, NULL};
|
|
//
|
|
// Special page, Address
|
|
//
|
|
ATTR_MAP USpecAddress = {IDC_ADDRESS_EDIT, FALSE, FALSE, 1024,
|
|
{L"homePostalAddress", ADS_ATTR_UPDATE,
|
|
ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL};
|
|
//
|
|
// Special page, Picture
|
|
//
|
|
ATTR_MAP USpecPicture = {IDC_PICTURE_BMP, TRUE, FALSE, 0,
|
|
{L"thumbnailPhoto", ADS_ATTR_UPDATE,
|
|
ADSTYPE_OCTET_STRING, NULL, 0}, BmpPictureCtrl, NULL};
|
|
|
|
//
|
|
// The list of attributes on the User Special page.
|
|
//
|
|
PATTR_MAP rgpUSpecAttrMap[] = {{&USpecHomePhone}, {&USpecHomeOther}, {&USpecPager},
|
|
{&USpecOtherPager}, {&USpecMobile}, {&USpecOtherMobile},
|
|
{&USpecURL}, {&USpecOtherURL}, {&USpecAddress},
|
|
{&USpecPicture}};
|
|
//
|
|
// The Special page description.
|
|
//
|
|
DSPAGE NTGroup = {IDS_NT_GRP_TITLE, IDD_NT_GROUP, 0, 0, NULL,
|
|
CreateTableDrivenPage,
|
|
sizeof(rgpUSpecAttrMap)/sizeof(PATTR_MAP),
|
|
rgpUSpecAttrMap};
|
|
|
|
//----------------------------------------------
|
|
// The list of Special pages.
|
|
//
|
|
PDSPAGE rgShellUSpecPages[] = {{&NTGroup}};
|
|
|
|
//
|
|
// The User Special class description.
|
|
//
|
|
DSCLASSPAGES ShellUSpecCls = {&CLSID_SpecialUserInfo, TEXT("User Special Info"),
|
|
sizeof(rgShellUSpecPages)/sizeof(PDSPAGE),
|
|
rgShellUSpecPages};
|
|
#endif // NT_GROUP_PAGE
|
|
|
|
//----------------------------------------------
|
|
// The list of User pages.
|
|
//
|
|
PDSPAGE rgShellUserPages[] = {{&ShellUserGeneral}, {&UserAddress}, {&ShellUserBusiness}};
|
|
|
|
//
|
|
// The User class description.
|
|
//
|
|
DSCLASSPAGES ShellUserCls = {&CLSID_DsShellUserPropPages, TEXT("User"),
|
|
sizeof(rgShellUserPages)/sizeof(PDSPAGE),
|
|
rgShellUserPages};
|
|
|
|
|
|
//-------------------------------------------------------
|
|
// Contact object
|
|
//-------------------------------------------------------
|
|
//
|
|
// The list of Contact pages.
|
|
//
|
|
PDSPAGE rgShellContactPages[] = {{&ShellUserGeneral}, {&ShellUserBusiness}};
|
|
//
|
|
// The Contact class description.
|
|
//
|
|
DSCLASSPAGES ShellContactCls = {&CLSID_DsShellContactPropPages, TEXT("Contact"),
|
|
sizeof(rgShellContactPages)/sizeof(PDSPAGE),
|
|
rgShellContactPages};
|
|
|
|
//-------------------------------------------------------
|
|
// Volume object
|
|
//-------------------------------------------------------
|
|
|
|
//
|
|
// Volume page, path
|
|
//
|
|
ATTR_MAP VSPath = {IDC_PATH, FALSE, FALSE,
|
|
ATTR_LEN_UNLIMITED, {L"uNCName",
|
|
ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING,
|
|
NULL, 0}, NULL, NULL};
|
|
ATTR_MAP VolKey = {IDC_KEYWORDS_LIST, TRUE, TRUE, 0,
|
|
{L"keywords", ADS_ATTR_UPDATE,
|
|
ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, ROList, NULL};
|
|
|
|
//
|
|
// The list of attributes on the Volume General page.
|
|
//
|
|
PATTR_MAP rgpVSAttrMap[] = {{&GenIcon}, {&AttrName}, {&Description}, {&VSPath}, {&VolKey}};
|
|
|
|
//
|
|
// The Volume General page description.
|
|
//
|
|
DSPAGE ShellVolumeGeneral = {IDS_TITLE_GENERAL, IDD_SHELL_VOLUME_GEN, 0, 0, NULL,
|
|
CreateTableDrivenPage,
|
|
sizeof(rgpVSAttrMap)/sizeof(PATTR_MAP),
|
|
rgpVSAttrMap};
|
|
|
|
//----------------------------------------------
|
|
// The list of Volume pages.
|
|
//
|
|
PDSPAGE rgShellVolumePages[] = {{&ShellVolumeGeneral}};
|
|
|
|
//
|
|
// The Volume class description.
|
|
//
|
|
DSCLASSPAGES ShellVolumeCls = {&CLSID_DsShellVolumePropPages, TEXT("Volume"),
|
|
sizeof(rgShellVolumePages)/sizeof(PDSPAGE),
|
|
rgShellVolumePages};
|
|
|
|
//
|
|
//-----------------------------------------------
|
|
// computer object
|
|
//----------------------------------------------
|
|
//
|
|
// Computer General page, Network Address.
|
|
//
|
|
//ATTR_MAP CSComputerNetAddr = {IDC_NET_ADDR_EDIT, FALSE, FALSE, 256,
|
|
// {L"networkAddress", ADS_ATTR_UPDATE,
|
|
// ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL};
|
|
//
|
|
// Computer General page, Role.
|
|
//
|
|
ATTR_MAP CSComputerRoleAttr = {IDC_ROLE, TRUE, FALSE, 260,
|
|
{g_wzUserAccountControl, ADS_ATTR_UPDATE,
|
|
ADSTYPE_INTEGER, NULL, 0}, ShComputerRole, NULL};
|
|
|
|
//
|
|
// The list of attributes on the Computer General page.
|
|
//
|
|
PATTR_MAP rgpCSAttrMap[] = {{&GenIcon}, {&AttrName},
|
|
{&Description}, // {&CSComputerNetAddr},
|
|
{&CSComputerRoleAttr}};
|
|
//
|
|
// The Computer General page description.
|
|
//
|
|
DSPAGE ShellComputerGeneral = {IDS_TITLE_GENERAL, IDD_SHELL_COMPUTER_GEN, 0, 0, NULL,
|
|
CreateTableDrivenPage,
|
|
sizeof(rgpCSAttrMap)/sizeof(PATTR_MAP),
|
|
rgpCSAttrMap};
|
|
//----------------------------------------------
|
|
// The list of Computer pages.
|
|
//
|
|
PDSPAGE rgShellComputerPages[] = {{&ShellComputerGeneral}};
|
|
|
|
//
|
|
// The Computer class description.
|
|
//
|
|
DSCLASSPAGES ShellComputerCls = {&CLSID_DsShellComputerPropPages, TEXT("Computer"),
|
|
sizeof(rgShellComputerPages)/sizeof(PDSPAGE),
|
|
rgShellComputerPages};
|
|
|
|
//----------------------------------------------
|
|
// Domain object
|
|
//----------------------------------------------
|
|
|
|
//
|
|
// The list of attributes on the General page.
|
|
//
|
|
PATTR_MAP rgpDSAttrMap[] = {{&GenIcon}, {&AttrName},
|
|
{&Description}};
|
|
//
|
|
// The Computer General page description.
|
|
//
|
|
DSPAGE ShellDomainGeneral = {IDS_TITLE_GENERAL, IDD_SHELL_DOMAIN_GEN, 0, 0, NULL,
|
|
CreateTableDrivenPage,
|
|
sizeof(rgpDSAttrMap)/sizeof(PATTR_MAP),
|
|
rgpDSAttrMap};
|
|
//----------------------------------------------
|
|
// The list of Domain pages.
|
|
//
|
|
PDSPAGE rgShellDomainPages[] = {{&ShellDomainGeneral}};
|
|
|
|
//
|
|
// The Domain class description.
|
|
//
|
|
DSCLASSPAGES ShellDomainCls = {&CLSID_DsShellDomainPropPages, TEXT("Domain"),
|
|
sizeof(rgShellDomainPages)/sizeof(PDSPAGE),
|
|
rgShellDomainPages};
|
|
|
|
//----------------------------------------------
|
|
// OU object
|
|
//----------------------------------------------
|
|
|
|
//
|
|
// The list of attributes on the OU General page.
|
|
//
|
|
PATTR_MAP rgpOSAttrMap[] = {{&GenIcon}, {&AttrName},
|
|
{&Description}};
|
|
//
|
|
// The OU General page description.
|
|
//
|
|
DSPAGE ShellOUGeneral = {IDS_TITLE_GENERAL, IDD_SHELL_DOMAIN_GEN, 0, 0, NULL,
|
|
CreateTableDrivenPage,
|
|
sizeof(rgpOSAttrMap)/sizeof(PATTR_MAP),
|
|
rgpOSAttrMap};
|
|
//----------------------------------------------
|
|
// The list of OU pages.
|
|
//
|
|
PDSPAGE rgShellOUPages[] = {{&ShellOUGeneral}};
|
|
|
|
//
|
|
// The OU class description.
|
|
//
|
|
DSCLASSPAGES ShellOUCls = {&CLSID_DsShellOUPropPages, TEXT("OU"),
|
|
sizeof(rgShellOUPages)/sizeof(PDSPAGE),
|
|
rgShellOUPages};
|
|
|
|
//----------------------------------------------
|
|
// Group object
|
|
//----------------------------------------------
|
|
|
|
//
|
|
// The Group General page description.
|
|
//
|
|
DSPAGE ShellGroupGeneral = {IDS_TITLE_GENERAL, IDD_SHELL_GROUP_GEN, 0, 0, NULL,
|
|
CreateGrpShlGenPage, 0, NULL};
|
|
|
|
//----------------------------------------------
|
|
// The list of Group pages.
|
|
//
|
|
PDSPAGE rgShellGroupPages[] = {{&ShellGroupGeneral}};
|
|
|
|
//
|
|
// The Group class description.
|
|
//
|
|
DSCLASSPAGES ShellGroupCls = {&CLSID_DsShellGroupPropPages, TEXT("Group"),
|
|
sizeof(rgShellGroupPages)/sizeof(PDSPAGE),
|
|
rgShellGroupPages};
|
|
|
|
#ifdef NT_GROUP_PAGE
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: BmpPictureCtrl
|
|
//
|
|
// Synopsis: Fetches the bitmap from the user object Picture attribute
|
|
// and draws it on the page.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
HRESULT
|
|
BmpPictureCtrl(CDsPropPageBase * pPage, PATTR_MAP pAttrMap,
|
|
PADS_ATTR_INFO pAttrInfo, LPARAM, PATTR_DATA pAttrData,
|
|
DLG_OP DlgOp)
|
|
{
|
|
HWND hPicCtrl;
|
|
PBYTE pb;
|
|
CBmpPicCtrl * pPicCtrlObj;
|
|
|
|
switch (DlgOp)
|
|
{
|
|
case fInit:
|
|
pAttrData->pVoid = NULL;
|
|
|
|
if (pAttrInfo == NULL)
|
|
{
|
|
return S_OK;
|
|
}
|
|
hPicCtrl = GetDlgItem(pPage->GetHWnd(), pAttrMap->nCtrlID);
|
|
|
|
dspAssert(pAttrInfo->pADsValues != NULL);
|
|
dspAssert(pAttrInfo->dwADsType == ADSTYPE_OCTET_STRING);
|
|
dspAssert(pAttrInfo->dwNumValues == 1);
|
|
dspAssert(pAttrInfo->pADsValues->dwType == ADSTYPE_OCTET_STRING);
|
|
|
|
dspAssert(pAttrInfo->pADsValues->OctetString.dwLength > 0);
|
|
dspAssert(pAttrInfo->pADsValues->OctetString.lpValue != NULL);
|
|
|
|
//
|
|
// Enforce the maximum size.
|
|
//
|
|
pb = pAttrInfo->pADsValues->OctetString.lpValue;
|
|
|
|
PBITMAPINFO pBmpInfo;
|
|
|
|
pBmpInfo = (PBITMAPINFO)((PBYTE)pb + sizeof(BITMAPFILEHEADER));
|
|
|
|
dspDebugOut((DEB_ITRACE, "Bitmap size: (%d, %d)\n",
|
|
pBmpInfo->bmiHeader.biWidth, pBmpInfo->bmiHeader.biHeight));
|
|
#define MAX_PIC_SIZE 100
|
|
if ((pBmpInfo->bmiHeader.biWidth > MAX_PIC_SIZE) ||
|
|
(pBmpInfo->bmiHeader.biHeight > MAX_PIC_SIZE))
|
|
{
|
|
LONG_PTR lStyle = GetWindowLongPtr(hPicCtrl, GWL_STYLE);
|
|
lStyle &= ~(SS_BITMAP);
|
|
lStyle |= SS_LEFT;
|
|
SetWindowLongPtr(hPicCtrl, GWL_STYLE, lStyle);
|
|
TCHAR szMsg[200];
|
|
wsprintf(szMsg, TEXT("Bitmap is too large (%d, %d)!"),
|
|
pBmpInfo->bmiHeader.biWidth, pBmpInfo->bmiHeader.biHeight);
|
|
SetWindowText(hPicCtrl, szMsg);
|
|
dspDebugOut((DEB_ITRACE, "Bitmap too large! (%d, %d) max allowed.\n",
|
|
MAX_PIC_SIZE, MAX_PIC_SIZE));
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// Save the bitmap.
|
|
//
|
|
pb = (PBYTE)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,
|
|
pAttrInfo->pADsValues->OctetString.dwLength);
|
|
|
|
CHECK_NULL_REPORT(pb, pPage->GetHWnd(), return E_OUTOFMEMORY);
|
|
|
|
memcpy(pb, pAttrInfo->pADsValues->OctetString.lpValue,
|
|
pAttrInfo->pADsValues->OctetString.dwLength);
|
|
//
|
|
// Subclass the picture "static" control.
|
|
//
|
|
pPicCtrlObj = new CBmpPicCtrl(hPicCtrl, pb);
|
|
|
|
CHECK_NULL_REPORT(pPicCtrlObj, pPage->GetHWnd(), return E_OUTOFMEMORY);
|
|
|
|
pAttrData->pVoid = reinterpret_cast<LPARAM>(pPicCtrlObj);
|
|
|
|
break;
|
|
|
|
case fOnDestroy:
|
|
pPicCtrlObj = reinterpret_cast<CBmpPicCtrl*>(pAttrData->pVoid);
|
|
DO_DEL(pPicCtrlObj);
|
|
break;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Class: CBmpPicCtrl
|
|
//
|
|
// Synopsis: Icon control window subclass object, so we can paint a class-
|
|
// specific icon.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
CBmpPicCtrl::CBmpPicCtrl(HWND hCtrl, PBYTE pb) :
|
|
m_hCtrl(hCtrl),
|
|
m_pbBmp(pb),
|
|
m_pOldProc(NULL),
|
|
m_hPal(NULL)
|
|
{
|
|
#ifdef _DEBUG
|
|
strcpy(szClass, "CBmpPicCtrl");
|
|
#endif
|
|
SetWindowLongPtr(hCtrl, GWLP_USERDATA, (LONG_PTR)this);
|
|
m_pOldProc = (WNDPROC)SetWindowLongPtr(hCtrl, GWLP_WNDPROC, (LONG_PTR)StaticCtrlProc);
|
|
m_hDlg = GetParent(hCtrl);
|
|
}
|
|
|
|
CBmpPicCtrl::~CBmpPicCtrl(void)
|
|
{
|
|
SetWindowLongPtr(m_hCtrl, GWLP_WNDPROC, (LONG_PTR)m_pOldProc);
|
|
if (m_pbBmp)
|
|
{
|
|
GlobalFree(m_pbBmp);
|
|
}
|
|
if (m_hPal)
|
|
{
|
|
DeleteObject(m_hPal);
|
|
}
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Method: CBmpPicCtrl::StaticCtrlProc
|
|
//
|
|
// Synopsis: control sub-proc
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
LRESULT CALLBACK
|
|
CBmpPicCtrl::StaticCtrlProc(HWND hCtrl, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
HRESULT hr;
|
|
HDC hDC;
|
|
HPALETTE hOldPal;
|
|
UINT iChanged = 0;
|
|
CBmpPicCtrl * pCCtrl = (CBmpPicCtrl*)GetWindowLongPtr(hCtrl, GWLP_USERDATA);
|
|
|
|
dspAssert(pCCtrl != NULL);
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_PALETTECHANGED:
|
|
if ((HWND)wParam == hCtrl)
|
|
{
|
|
break;
|
|
}
|
|
// Fall through:
|
|
case WM_QUERYNEWPALETTE:
|
|
dspDebugOut((DEB_ITRACE, "Got palette message.\n"));
|
|
if (pCCtrl->m_hPal == NULL)
|
|
{
|
|
hr = pCCtrl->CreateBmpPalette();
|
|
|
|
CHECK_HRESULT(hr, return FALSE);
|
|
}
|
|
hDC = GetDC(hCtrl);
|
|
if (hDC != NULL)
|
|
{
|
|
hOldPal = SelectPalette(hDC, pCCtrl->m_hPal, FALSE);
|
|
iChanged = RealizePalette(hDC);
|
|
SelectPalette(hDC, hOldPal, TRUE);
|
|
RealizePalette(hDC);
|
|
ReleaseDC(hCtrl, hDC);
|
|
if (iChanged > 0 && iChanged != GDI_ERROR)
|
|
{
|
|
InvalidateRect(hCtrl, NULL, TRUE);
|
|
}
|
|
}
|
|
return(iChanged);
|
|
|
|
case WM_PAINT:
|
|
if (!pCCtrl->OnPaint())
|
|
{
|
|
return FALSE;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return CallWindowProc(pCCtrl->m_pOldProc, hCtrl, uMsg, wParam, lParam);
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Method: CBmpPicCtrl::OnPaint
|
|
//
|
|
// Synopsis: Paint the DS specified icon.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
LRESULT
|
|
CBmpPicCtrl::OnPaint(void)
|
|
{
|
|
TRACE(CBmpPicCtrl,OnPaint);
|
|
HRESULT hr = S_OK;
|
|
HDC hDC = NULL;
|
|
PAINTSTRUCT ps;
|
|
HPALETTE hOldPal = NULL;
|
|
|
|
if (m_hPal == NULL)
|
|
{
|
|
hr = CreateBmpPalette();
|
|
CHECK_HRESULT(hr, return FALSE);
|
|
}
|
|
|
|
hDC = BeginPaint(m_hCtrl, &ps);
|
|
|
|
CHECK_NULL_REPORT(hDC, m_hDlg, return FALSE);
|
|
|
|
if (m_hPal)
|
|
{
|
|
hOldPal = SelectPalette(hDC, m_hPal, FALSE);
|
|
RealizePalette(hDC);
|
|
}
|
|
|
|
dspAssert(m_pbBmp != NULL);
|
|
|
|
PBITMAPFILEHEADER pBmpFileHdr = (PBITMAPFILEHEADER)m_pbBmp;
|
|
|
|
// Advance past the BITMAPFILEHEADER struct.
|
|
//
|
|
PBITMAPINFO pBmpInfo = (PBITMAPINFO)(m_pbBmp + sizeof(BITMAPFILEHEADER));
|
|
|
|
if (SetDIBitsToDevice(hDC,
|
|
0, 0,
|
|
pBmpInfo->bmiHeader.biWidth,
|
|
pBmpInfo->bmiHeader.biHeight,
|
|
0, 0, 0,
|
|
pBmpInfo->bmiHeader.biHeight,
|
|
m_pbBmp + pBmpFileHdr->bfOffBits,
|
|
pBmpInfo,
|
|
DIB_RGB_COLORS) == 0)
|
|
{
|
|
REPORT_ERROR(GetLastError(), m_hDlg);
|
|
}
|
|
|
|
if (m_hPal)
|
|
{
|
|
SelectPalette(hDC, hOldPal, TRUE);
|
|
}
|
|
EndPaint(m_hCtrl, &ps);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: CreateBmpPalette
|
|
//
|
|
// Synopsis: Creates the palette for the bitmap.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
HRESULT
|
|
CBmpPicCtrl::CreateBmpPalette(void)
|
|
{
|
|
TRACE(CBmpPicCtrl,CreateBmpPalette);
|
|
PBITMAPINFO pBmpInfo;
|
|
|
|
pBmpInfo = (PBITMAPINFO)(m_pbBmp + sizeof(BITMAPFILEHEADER));
|
|
|
|
WORD nColors, cClrBits = pBmpInfo->bmiHeader.biBitCount;
|
|
|
|
if (cClrBits == 1)
|
|
cClrBits = 1;
|
|
else if (cClrBits <= 4)
|
|
cClrBits = 4;
|
|
else if (cClrBits <= 8)
|
|
cClrBits = 8;
|
|
else if (cClrBits <= 16)
|
|
cClrBits = 16;
|
|
else if (cClrBits <= 24)
|
|
cClrBits = 24;
|
|
else
|
|
cClrBits = 32;
|
|
|
|
if (cClrBits >= 24)
|
|
{
|
|
// True color BMPs don't need explicit palettes.
|
|
//
|
|
return S_OK;
|
|
}
|
|
|
|
nColors = static_cast<WORD>(1 << cClrBits);
|
|
|
|
dspDebugOut((DEB_ITRACE, "Bitmap has %d colors.\n", nColors));
|
|
|
|
PLOGPALETTE plp = (PLOGPALETTE)LocalAlloc(GMEM_FIXED | GMEM_ZEROINIT,
|
|
sizeof(LOGPALETTE) +
|
|
sizeof (PALETTEENTRY) * nColors);
|
|
|
|
CHECK_NULL_REPORT(plp, m_hDlg, return E_OUTOFMEMORY);
|
|
|
|
plp->palVersion = 0x300;
|
|
plp->palNumEntries = nColors;
|
|
|
|
for (WORD i = 0; i < nColors; i++)
|
|
{
|
|
plp->palPalEntry[i].peBlue = pBmpInfo->bmiColors[i].rgbBlue;
|
|
plp->palPalEntry[i].peGreen = pBmpInfo->bmiColors[i].rgbGreen;
|
|
plp->palPalEntry[i].peRed = pBmpInfo->bmiColors[i].rgbRed;
|
|
plp->palPalEntry[i].peFlags = 0; //PC_NOCOLLAPSE;
|
|
}
|
|
|
|
m_hPal = CreatePalette(plp);
|
|
|
|
if (m_hPal == NULL)
|
|
{
|
|
REPORT_ERROR(GetLastError(), m_hDlg);
|
|
return HRESULT_FROM_WIN32(GetLastError());
|
|
}
|
|
|
|
LocalFree(plp);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
#endif // NT_GROUP_PAGE
|
|
|
|
HRESULT
|
|
ROList(CDsPropPageBase * pPage, PATTR_MAP pAttrMap, PADS_ATTR_INFO pAttrInfo,
|
|
LPARAM, PATTR_DATA, DLG_OP DlgOp)
|
|
{
|
|
|
|
if (DlgOp != fInit)
|
|
{
|
|
return S_OK;
|
|
}
|
|
if (pAttrInfo == NULL)
|
|
{
|
|
return S_OK;
|
|
}
|
|
dspAssert(pAttrInfo->pADsValues != NULL);
|
|
|
|
for (DWORD i = 0; i < pAttrInfo->dwNumValues; i++)
|
|
{
|
|
SendDlgItemMessage(pPage->GetHWnd(), pAttrMap->nCtrlID, LB_ADDSTRING, 0,
|
|
(LPARAM)pAttrInfo->pADsValues[i].CaseIgnoreString);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
// The list of classes.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
PDSCLASSPAGES rgClsPages[] = {
|
|
&ShellComputerCls,
|
|
&ShellVolumeCls,
|
|
&ShellUserCls,
|
|
&ShellContactCls,
|
|
&ShellDomainCls,
|
|
&ShellGroupCls,
|
|
&ShellOUCls,
|
|
&ShellUSpecCls
|
|
};
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
// The global struct containing the list of classes.
|
|
//-----------------------------------------------------------------------------
|
|
RGDSPPCLASSES g_DsPPClasses = {sizeof(rgClsPages)/sizeof(PDSCLASSPAGES),
|
|
rgClsPages};
|
|
|