Windows2000/private/shell/ext/netplwiz/usercom.cpp
2020-09-30 17:12:32 +02:00

403 lines
9.3 KiB
C++

/*
usercom.cpp
User Manager COM interface implementation
History:
09/23/98: dsheldon created
*/
#include "stdafx.h"
#include "resource.h"
#include "usercom.h"
#include <initguid.h>
#include "shlguidp.h"
#include "misc.h"
/*
CUserPropertyPages implementation
IShellExtInit and IShellPropSheetExt implementations
*/
CUserPropertyPages::~CUserPropertyPages()
{
TraceEnter(TRACE_USR_COM, "CUserPropertyPages::~CUserPropertyPages ");
if (m_pUserInfo != NULL)
delete m_pUserInfo;
if (m_pUsernamePage != NULL)
delete m_pUsernamePage;
if (m_pGroupPage != NULL)
delete m_pGroupPage;
TraceLeaveVoid();
}
HRESULT CUserPropertyPages::QueryInterface(REFIID iid, LPVOID* ppvOut)
{
TraceEnter(TRACE_USR_COM, "CUserPropertyPages ::QueryInterface");
*ppvOut = NULL;
HRESULT hr = E_NOINTERFACE;
if ((iid == IID_IUnknown) || (iid == IID_IShellPropSheetExt))
{
*ppvOut = (IShellPropSheetExt*) this;
hr = S_OK;
}
else if (iid == IID_IShellExtInit)
{
*ppvOut = (IShellExtInit*) this;
hr = S_OK;
}
if (SUCCEEDED(hr))
{
((IShellPropSheetExt*) this)->AddRef();
}
TraceLeaveResult(hr);
}
HRESULT CUserPropertyPages::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT lpdobj, HKEY hkeyProgID)
{
TraceEnter(TRACE_USR_COM, "CUserPropertyPages ::Initialize");
// Request the user's SID from the data object
FORMATETC fmt;
fmt.cfFormat = (CLIPFORMAT)RegisterClipboardFormat(CFSTR_USERPROPPAGESSID);
fmt.ptd = NULL;
fmt.dwAspect = DVASPECT_CONTENT;
fmt.lindex = -1;
fmt.tymed = TYMED_HGLOBAL;
STGMEDIUM medium;
HRESULT hr = lpdobj->GetData(&fmt, &medium);
if (SUCCEEDED(hr))
{
// medium.hGlobal is the user's SID; make sure it isn't null and that
// we haven't already set our copy of the SID
if ((medium.hGlobal != NULL) && (m_pUserInfo == NULL))
{
PSID psid = (PSID) GlobalLock(medium.hGlobal);
if (IsValidSid(psid))
{
// Create a user info structure to party on
m_pUserInfo = new CUserInfo;
if (m_pUserInfo)
{
hr = m_pUserInfo->Load(psid, TRUE);
if (SUCCEEDED(hr))
{
// Get the groups
hr = m_GroupList.Initialize();
}
}
else
{
hr = E_OUTOFMEMORY;
}
}
else
{
hr = E_INVALIDARG;
}
GlobalUnlock(medium.hGlobal);
}
else
{
// hGlobal was NULL or prop sheet was already init'ed
hr = E_UNEXPECTED;
}
ReleaseStgMedium(&medium);
}
TraceLeaveResult(hr);
}
HRESULT CUserPropertyPages::AddPages(LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam)
{
TraceEnter(TRACE_USR_COM, "CUserPropertyPages ::AddPages");
HRESULT hr = E_FAIL;
// Settings common to all pages
PROPSHEETPAGE psp = {0};
psp.dwSize = sizeof (psp);
psp.hInstance = g_hInstance;
if (m_pUserInfo->m_userType == CUserInfo::LOCALUSER)
{
// Add the local user prop pages
psp.pszTemplate = MAKEINTRESOURCE(IDD_USR_USERNAME_PROP_PAGE);
m_pUsernamePage = new CUsernamePropertyPage(m_pUserInfo);
if (m_pUsernamePage != NULL)
{
m_pUsernamePage->SetPropSheetPageMembers(&psp);
lpfnAddPage(CreatePropertySheetPage(&psp), lParam);
}
}
psp.pszTemplate = MAKEINTRESOURCE(IDD_USR_CHOOSEGROUP_PROP_PAGE);
m_pGroupPage = new CGroupPropertyPage(m_pUserInfo, &m_GroupList);
if (m_pGroupPage != NULL)
{
m_pGroupPage->SetPropSheetPageMembers(&psp);
lpfnAddPage(CreatePropertySheetPage(&psp), lParam);
}
TraceLeaveResult(hr);
}
HRESULT CUserPropertyPages ::ReplacePage(UINT uPageID, LPFNADDPROPSHEETPAGE lpfnReplaceWith, LPARAM lParam)
{
TraceEnter(TRACE_USR_COM, "CUserPropertyPages ::ReplacePage");
TraceMsg("ERROR: CUserPropertyPages ::ReplacePage called but not implemented");
TraceLeaveResult(E_NOTIMPL);
}
/*
CUserPropertyPagesFactory Implementation
*/
// IUnknown
HRESULT CUserPropertyPagesFactory::QueryInterface(REFIID iid, LPVOID* ppvOut)
{
TraceEnter(TRACE_USR_COM, "CUserPropertyPagesFactory::CreateInstance");
*ppvOut = NULL;
HRESULT hr = E_NOINTERFACE;
if ((iid == IID_IUnknown) || (iid == IID_IClassFactory))
{
*ppvOut = (IClassFactory*) this;
hr = S_OK;
}
if (SUCCEEDED(hr))
{
((IClassFactory*) this)->AddRef();
}
TraceLeaveResult(hr);
}
// IClassFactory Implementation
HRESULT CUserPropertyPagesFactory::CreateInstance(IUnknown* pUnkOuter, REFIID iid, void** ppvObject)
{
TraceEnter(TRACE_USR_COM, "CUserPropertyPagesFactory::CreateInstance");
HRESULT hr = E_FAIL;
// Expect no aggragation
if (pUnkOuter != NULL)
{
hr = E_INVALIDARG;
}
else
{
CUserPropertyPages * pPropSheets = new CUserPropertyPages ;
if (pPropSheets == NULL)
{
hr = E_OUTOFMEMORY;
}
else
{
hr = pPropSheets->QueryInterface(iid, ppvObject);
pPropSheets->Release();
}
}
TraceLeaveResult(hr);
}
HRESULT CUserPropertyPagesFactory::LockServer(BOOL fLock)
{
TraceEnter(TRACE_USR_COM, "CUserPropertyPagesFactory::LockServer");
if (fLock)
InterlockedIncrement((long*) &g_cLocks);
else
InterlockedDecrement((long*) &g_cLocks);
TraceLeaveResult(S_OK);
}
/*
CUserSidDataObject Implementation
The data object passed to extended user property
pages (IShellPropSheetExt handlers)
*/
HRESULT CUserSidDataObject::QueryInterface(REFIID iid, LPVOID* ppvOut)
{
TraceEnter(TRACE_USR_COM, "CUserSidDataObject::QueryInterface");
*ppvOut = NULL;
HRESULT hr = E_NOINTERFACE;
if ((iid == IID_IUnknown) || (iid == IID_IDataObject))
{
*ppvOut = (IDataObject*) this;
hr = S_OK;
}
if (SUCCEEDED(hr))
{
((IDataObject*) this)->AddRef();
}
TraceLeaveResult(hr);
}
HRESULT CUserSidDataObject::GetData(FORMATETC* pFormatEtc, STGMEDIUM* pMedium)
{
TraceEnter(TRACE_USR_COM, "CUserSidDataObject::GetData");
HRESULT hr = QueryGetData(pFormatEtc);
if (SUCCEEDED(hr))
{
pMedium->pUnkForRelease = (IDataObject*) this;
// Since pUnkForRelease is set, addref myself
((IDataObject*) this)->AddRef();
pMedium->tymed = TYMED_HGLOBAL;
pMedium->hGlobal = (HGLOBAL) m_psid;
}
TraceLeaveResult(hr);
}
HRESULT CUserSidDataObject::GetDataHere(FORMATETC* pFormatEtc, STGMEDIUM* pMedium)
{
TraceEnter(TRACE_USR_COM, "CUserSidDataObject::GetDataHere");
TraceLeaveResult(E_NOTIMPL);
}
HRESULT CUserSidDataObject::QueryGetData(FORMATETC* pFormatEtc)
{
TraceEnter(TRACE_USR_COM, "CUserSidDataObject::QueryGetData");
HRESULT hr;
if (pFormatEtc == NULL)
hr = E_INVALIDARG;
else if ((pFormatEtc->cfFormat != RegisterClipboardFormat(CFSTR_USERPROPPAGESSID))
|| (pFormatEtc->ptd != NULL))
hr = DV_E_FORMATETC;
else if (pFormatEtc->lindex != -1)
hr = DV_E_LINDEX;
else if (pFormatEtc->tymed != TYMED_HGLOBAL)
hr = DV_E_TYMED;
else if (pFormatEtc->dwAspect != DVASPECT_CONTENT)
hr = DV_E_DVASPECT;
else
hr = S_OK;
TraceLeaveResult(hr);
}
HRESULT CUserSidDataObject::GetCanonicalFormatEtc(FORMATETC* pFormatetcIn, FORMATETC* pFormatetcOut)
{
TraceEnter(TRACE_USR_COM, "CUserSidDataObject::GetCanonicalFormatEtc");
TraceLeaveResult(E_NOTIMPL);
}
HRESULT CUserSidDataObject::SetData(FORMATETC* pFormatetc, STGMEDIUM* pmedium, BOOL fRelease)
{
TraceEnter(TRACE_USR_COM, "CUserSidDataObject::SetData");
TraceLeaveResult(E_NOTIMPL);
}
HRESULT CUserSidDataObject::EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC ** ppenumFormatetc)
{
TraceEnter(TRACE_USR_COM, "CUserSidDataObject::EnumFormatEtc");
TraceLeaveResult(E_NOTIMPL);
}
HRESULT CUserSidDataObject::DAdvise(FORMATETC* pFormatetc, DWORD advf, IAdviseSink* pAdvSink, DWORD * pdwConnection)
{
TraceEnter(TRACE_USR_COM, "CUserSidDataObject::DAdvise");
TraceLeaveResult(E_NOTIMPL);
}
HRESULT CUserSidDataObject::DUnadvise(DWORD dwConnection)
{
TraceEnter(TRACE_USR_COM, "CUserSidDataObject::DUnadvise");
TraceLeaveResult(E_NOTIMPL);
}
HRESULT CUserSidDataObject::EnumDAdvise(IEnumSTATDATA ** ppenumAdvise)
{
TraceEnter(TRACE_USR_COM, "CUserSidDataObject::EnumDAdvise");
TraceLeaveResult(E_NOTIMPL);
}
HRESULT CUserSidDataObject::SetSid(PSID psid)
{
TraceEnter(TRACE_USR_COM, "CUserSidDataObject::SetSid");
HRESULT hr = E_FAIL;
if (m_psid == NULL)
{
DWORD cbSid = GetLengthSid(psid);
m_psid = (PSID) LocalAlloc(0, cbSid);
if (m_psid != NULL)
{
if (CopySid(cbSid, m_psid, psid))
{
hr = S_OK;
}
}
else
{
hr = E_OUTOFMEMORY;
}
}
TraceLeaveResult(hr);
}
CUserSidDataObject::~CUserSidDataObject()
{
TraceEnter(TRACE_USR_COM, "CUserSidDataObject::~CUserSidDataObject");
if (m_psid != NULL)
{
LocalFree(m_psid);
}
TraceLeaveVoid();
}