windows-nt/Source/XPSP1/NT/ds/security/services/ca/capesnpn/ctshlext.cpp

256 lines
6 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (C) Microsoft Corporation, 1997 - 1999
Module Name:
DfsShell.cpp
Abstract:
This is the implementation file for Dfs Shell Extension object which implements
IShellIExtInit and IShellPropSheetExt.
Author:
Constancio Fernandes (ferns@qspl.stpp.soft.net) 12-Jan-1998
Environment:
NT only.
*/
#include "stdafx.h"
#include <dsclient.h>
#include "ctshlext.h"
#include "wiz.h"
#include "genpage.h"
#define ByteOffset(base, offset) (((LPBYTE)base)+offset)
/*----------------------------------------------------------------------
IShellExtInit Implementation.
------------------------------------------------------------------------*/
STDMETHODIMP CCertTypeShlExt::Initialize
(
IN LPCITEMIDLIST pidlFolder, // Points to an ITEMIDLIST structure
IN LPDATAOBJECT pDataObj, // Points to an IDataObject interface
IN HKEY hkeyProgID // Registry key for the file object or folder type
)
{
HRESULT hr = 0;
FORMATETC fmte = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
STGMEDIUM medium = { TYMED_NULL };
LPDSOBJECTNAMES pDsObjects;
CString csClass, csPath;
USES_CONVERSION;
LPWSTR wszTypeDN = NULL, wszType = NULL;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// if we have a pDataObj then try and get the first name from it
if ( pDataObj )
{
// get path and class
fmte.cfFormat = (CLIPFORMAT) RegisterClipboardFormat(CFSTR_DSOBJECTNAMES);
if ( SUCCEEDED(pDataObj->GetData(&fmte, &medium)) )
{
pDsObjects = (LPDSOBJECTNAMES)medium.hGlobal;
m_Count = pDsObjects->cItems;
if(m_Count > 0)
{
m_ahCertTemplates = (HCERTTYPE *)LocalAlloc(LMEM_FIXED, sizeof(HCERTTYPE)*m_Count);
if(m_ahCertTemplates == NULL)
{
hr = E_OUTOFMEMORY;
goto error;
}
ZeroMemory(m_ahCertTemplates, sizeof(HCERTTYPE)*m_Count);
for (UINT index = 0; index < m_Count ; index++)
{
LPWSTR wszEnd = NULL;
wszTypeDN = (LPWSTR)ByteOffset(pDsObjects, pDsObjects->aObjects[index].offsetName);
if(wszTypeDN == NULL)
{
continue;
}
wszTypeDN = wcsstr(wszTypeDN, L"CN=");
if(wszTypeDN == NULL)
{
continue;
}
wszTypeDN += 3;
wszType = (LPWSTR)LocalAlloc(LMEM_FIXED, sizeof(WCHAR)*(wcslen(wszTypeDN)+1));
if(wszType == NULL)
{
hr = E_OUTOFMEMORY;
goto error;
}
wcscpy(wszType, wszTypeDN);
wszEnd = wcschr(wszType, L',');
if(wszEnd)
{
*wszEnd = 0;
}
hr = CAFindCertTypeByName(wszType, NULL, CT_ENUM_MACHINE_TYPES |
CT_ENUM_USER_TYPES |
CT_FLAG_NO_CACHE_LOOKUP,
&m_ahCertTemplates[index]);
LocalFree(wszType);
wszType = NULL;
}
}
ReleaseStgMedium(&medium);
}
}
hr = S_OK; // success
error:
return hr;
}
STDMETHODIMP CCertTypeShlExt::AddPages
(
IN LPFNADDPROPSHEETPAGE lpfnAddPage,
IN LPARAM lParam
)
{
PropertyPage* pBasePage;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if(m_ahCertTemplates[0] == NULL)
{
return E_UNEXPECTED;
}
CCertTemplateGeneralPage* pControlPage = new CCertTemplateGeneralPage(m_ahCertTemplates[0]);
if(pControlPage)
{
pBasePage = pControlPage;
HPROPSHEETPAGE hPage = CreatePropertySheetPage(&pBasePage->m_psp);
if (hPage == NULL)
{
delete (pControlPage);
return E_UNEXPECTED;
}
lpfnAddPage(hPage, lParam);
}
return S_OK;
}
STDMETHODIMP CCertTypeShlExt::ReplacePage
(
IN UINT uPageID,
IN LPFNADDPROPSHEETPAGE lpfnReplaceWith,
IN LPARAM lParam
)
{
return E_FAIL;
}
// IContextMenu methods
STDMETHODIMP CCertTypeShlExt::GetCommandString
(
UINT_PTR idCmd,
UINT uFlags,
UINT *pwReserved,
LPSTR pszName,
UINT cchMax
)
{
if((idCmd == m_uiEditId) && (m_uiEditId != 0))
{
if (uFlags == GCS_HELPTEXT)
{
LoadString(AfxGetResourceHandle( ), IDS_EDIT_HINT, (LPTSTR)pszName, cchMax);
return S_OK;
}
}
return E_NOTIMPL;
}
STDMETHODIMP CCertTypeShlExt::InvokeCommand
(
LPCMINVOKECOMMANDINFO lpici
)
{
if (!HIWORD(lpici->lpVerb))
{
UINT idCmd = LOWORD(lpici->lpVerb);
switch(idCmd)
{
case 0: // Edit
InvokeCertTypeWizard(m_ahCertTemplates[0],
lpici->hwnd);
return S_OK;
}
}
return E_NOTIMPL;
}
STDMETHODIMP CCertTypeShlExt::QueryContextMenu
(
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags
)
{
CString szEdit;
MENUITEMINFO mii;
UINT idLastUsedCmd = idCmdFirst;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ZeroMemory(&mii, sizeof(mii));
if(IsCerttypeEditingAllowed())
{
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE | MIIM_ID;
mii.fType = MFT_STRING;
mii.wID = idCmdFirst;
szEdit.LoadString(IDS_EDIT);
mii.dwTypeData = (LPTSTR)(LPCTSTR)szEdit;
mii.cch = szEdit.GetLength();
// Add new menu items to the context menu. //
::InsertMenuItem(hmenu,
indexMenu++,
TRUE,
&mii);
}
return ResultFromScode (MAKE_SCODE (SEVERITY_SUCCESS, 0,
USHORT (idLastUsedCmd + 1)));
}