/*++ 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 #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))); }