windows-nt/Source/XPSP1/NT/shell/ext/url/intshcut.cpp
2020-09-26 16:20:57 +08:00

344 lines
8.7 KiB
C++

/*
* intshcut.cpp - IUnknown implementation for InternetShortcut class.
*/
/* Headers
**********/
#include "project.hpp"
#pragma hdrstop
#include "assoc.h"
#include "clsfact.h"
/* Global Constants
*******************/
#pragma data_seg(DATA_SEG_READ_ONLY)
PUBLIC_DATA const int g_nDefaultShowCmd = SW_NORMAL;
#pragma data_seg()
/****************************** Public Functions *****************************/
PUBLIC_CODE HRESULT IsProtocolRegistered(PCSTR pcszProtocol)
{
HRESULT hr;
PSTR pszKey;
ASSERT(IS_VALID_STRING_PTR(pcszProtocol, CSTR));
hr = GetProtocolKey(pcszProtocol, EMPTY_STRING, &pszKey);
if (hr == S_OK)
{
hr = (GetRegKeyValue(g_hkeyURLProtocols, pszKey, g_cszURLProtocol, NULL,
NULL, NULL) == ERROR_SUCCESS)
? S_OK
: URL_E_UNREGISTERED_PROTOCOL;
delete pszKey;
pszKey = NULL;
}
if (hr != S_OK) {
TRACE_OUT(("IsProtocolRegistered(): Protocol \"%s\" is not registered.",
pcszProtocol));
}
return(hr);
}
PUBLIC_CODE HRESULT ValidateURL(PCSTR pcszURL)
{
HRESULT hr;
PSTR pszProtocol;
ASSERT(IS_VALID_STRING_PTR(pcszURL, CSTR));
hr = CopyURLProtocol(pcszURL, &pszProtocol);
if (hr == S_OK)
{
hr = IsProtocolRegistered(pszProtocol);
delete pszProtocol;
pszProtocol = NULL;
}
return(hr);
}
PUBLIC_CODE HRESULT ValidateWorkingDirectory(PCSTR pcszWorkingDirectory)
{
ASSERT(IS_VALID_STRING_PTR(pcszWorkingDirectory, CSTR));
return(IsPathDirectory(pcszWorkingDirectory) ? S_OK : E_PATH_NOT_FOUND);
}
#ifdef DEBUG
PUBLIC_CODE BOOL IsValidPCInternetShortcut(PCInternetShortcut pcintshcut)
{
return(IS_VALID_READ_PTR(pcintshcut, CInternetShortcut) &&
FLAGS_ARE_VALID(pcintshcut->m_dwFlags, ALL_INTSHCUT_FLAGS) &&
(! pcintshcut->m_pszFile ||
IS_VALID_STRING_PTR(pcintshcut->m_pszFile, STR)) &&
(! pcintshcut->m_pszURL ||
IS_VALID_STRING_PTR(pcintshcut->m_pszURL, STR)) &&
((! pcintshcut->m_pszIconFile &&
! pcintshcut->m_niIcon) ||
EVAL(IsValidIconIndex(S_OK, pcintshcut->m_pszIconFile, MAX_PATH_LEN, pcintshcut->m_niIcon))) &&
(! pcintshcut->m_pszWorkingDirectory ||
EVAL(IsFullPath(pcintshcut->m_pszWorkingDirectory))) &&
EVAL(IsValidShowCmd(pcintshcut->m_nShowCmd)) &&
EVAL(! pcintshcut->m_pszFolder ||
IsValidPath(pcintshcut->m_pszFolder)) &&
EVAL(! pcintshcut->m_wHotkey ||
IsValidHotkey(pcintshcut->m_wHotkey)) &&
IS_VALID_STRUCT_PTR((PCRefCount)pcintshcut, CRefCount) &&
IS_VALID_INTERFACE_PTR((PCIDataObject)pcintshcut, IDataObject) &&
IS_VALID_INTERFACE_PTR((PCIExtractIcon)pcintshcut, IExtractIcon) &&
IS_VALID_INTERFACE_PTR((PCINewShortcutHook)pcintshcut, INewShortcutHook) &&
IS_VALID_INTERFACE_PTR((PCIPersistFile)pcintshcut, IPersistFile) &&
IS_VALID_INTERFACE_PTR((PCIPersistStream)pcintshcut, IPersistStream) &&
IS_VALID_INTERFACE_PTR((PCIShellExecuteHook)pcintshcut, IShellExecuteHook) &&
IS_VALID_INTERFACE_PTR((PCIShellExtInit)pcintshcut, IShellExtInit) &&
IS_VALID_INTERFACE_PTR((PCIShellLink)pcintshcut, IShellLink) &&
IS_VALID_INTERFACE_PTR((PCIShellPropSheetExt)pcintshcut, IShellPropSheetExt) &&
IS_VALID_INTERFACE_PTR((PCIUniformResourceLocator)pcintshcut, IUniformResourceLocator));
}
#endif
/********************************** Methods **********************************/
#pragma warning(disable:4705) /* "statement has no effect" warning - cl bug, see KB Q98989 */
InternetShortcut::InternetShortcut()
{
DebugEntry(InternetShortcut::InternetShortcut);
// Don't validate this until after construction.
m_dwFlags = 0;
m_pszFile = NULL;
m_pszURL = NULL;
m_pszIconFile = NULL;
m_niIcon = 0;
m_pszWorkingDirectory = NULL;
m_nShowCmd = g_nDefaultShowCmd;
m_pszFolder = NULL;
m_wHotkey = 0;
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
DebugExitVOID(InternetShortcut::InternetShortcut);
return;
}
#pragma warning(default:4705) /* "statement has no effect" warning - cl bug, see KB Q98989 */
InternetShortcut::~InternetShortcut(void)
{
DebugEntry(InternetShortcut::~InternetShortcut);
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
if (m_pszFile)
{
delete m_pszFile;
m_pszFile = NULL;
}
if (m_pszURL)
{
delete m_pszURL;
m_pszURL = NULL;
}
if (m_pszIconFile)
{
delete m_pszIconFile;
m_pszIconFile = NULL;
m_niIcon = 0;
}
if (m_pszWorkingDirectory)
{
delete m_pszWorkingDirectory;
m_pszWorkingDirectory = NULL;
}
if (m_pszFolder)
{
delete m_pszFolder;
m_pszFolder = NULL;
}
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
DebugExitVOID(InternetShortcut::~InternetShortcut);
return;
}
ULONG STDMETHODCALLTYPE InternetShortcut::AddRef(void)
{
ULONG ulcRef;
DebugEntry(InternetShortcut::AddRef);
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ulcRef = RefCount::AddRef();
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
DebugExitULONG(InternetShortcut::AddRef, ulcRef);
return(ulcRef);
}
ULONG STDMETHODCALLTYPE InternetShortcut::Release(void)
{
ULONG ulcRef;
DebugEntry(InternetShortcut::Release);
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ulcRef = RefCount::Release();
DebugExitULONG(InternetShortcut::Release, ulcRef);
return(ulcRef);
}
HRESULT STDMETHODCALLTYPE InternetShortcut::QueryInterface(REFIID riid,
PVOID *ppvObject)
{
HRESULT hr = S_OK;
DebugEntry(InternetShortcut::QueryInterface);
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ASSERT(IsValidREFIID(riid));
ASSERT(IS_VALID_WRITE_PTR(ppvObject, PVOID));
if (riid == IID_IDataObject)
{
*ppvObject = (PIDataObject)this;
TRACE_OUT(("InternetShortcut::QueryInterface(): Returning IDataObject."));
}
else if (riid == IID_IExtractIcon)
{
*ppvObject = (PIExtractIcon)this;
TRACE_OUT(("InternetShortcut::QueryInterface(): Returning IExtractIcon."));
}
else if (riid == IID_INewShortcutHook)
{
*ppvObject = (PINewShortcutHook)this;
TRACE_OUT(("InternetShortcut::QueryInterface(): Returning INewShortcutHook."));
}
else if (riid == IID_IPersist)
{
*ppvObject = (PIPersist)(PIPersistStream)this;
TRACE_OUT(("InternetShortcut::QueryInterface(): Returning IPersist."));
}
else if (riid == IID_IPersistFile)
{
*ppvObject = (PIPersistFile)this;
TRACE_OUT(("InternetShortcut::QueryInterface(): Returning IPersistFile."));
}
else if (riid == IID_IPersistStream)
{
*ppvObject = (PIPersistStream)this;
TRACE_OUT(("InternetShortcut::QueryInterface(): Returning IPersistStream."));
}
else if (riid == IID_IShellExecuteHook)
{
*ppvObject = (PIShellExecuteHook)this;
TRACE_OUT(("InternetShortcut::QueryInterface(): Returning IShellExecuteHook."));
}
else if (riid == IID_IShellExtInit)
{
*ppvObject = (PIShellExtInit)this;
TRACE_OUT(("InternetShortcut::QueryInterface(): Returning IShellExtInit."));
}
else if (riid == IID_IShellLink)
{
*ppvObject = (PIShellLink)this;
TRACE_OUT(("InternetShortcut::QueryInterface(): Returning IShellLink."));
}
else if (riid == IID_IShellPropSheetExt)
{
*ppvObject = (PIShellPropSheetExt)this;
TRACE_OUT(("InternetShortcut::QueryInterface(): Returning IShellPropSheetExt."));
}
else if (riid == IID_IUniformResourceLocator)
{
*ppvObject = (PIUniformResourceLocator)this;
TRACE_OUT(("InternetShortcut::QueryInterface(): Returning IUniformResourceLocator."));
}
else if (riid == IID_IUnknown)
{
*ppvObject = (PIUnknown)(PIUniformResourceLocator)this;
TRACE_OUT(("InternetShortcut::QueryInterface(): Returning IUnknown."));
}
else
{
TRACE_OUT(("InternetShortcut::QueryInterface(): Called on unknown interface."));
*ppvObject = NULL;
hr = E_NOINTERFACE;
}
if (hr == S_OK)
AddRef();
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
DebugExitHRESULT(InternetShortcut::QueryInterface, hr);
return(hr);
}
extern "C"
STDAPI CreateInstance_Intshcut(IUnknown *punkOuter, REFIID riid, void **ppvOut)
{
HRESULT hres;
*ppvOut = NULL;
if (punkOuter)
return CLASS_E_NOAGGREGATION;
InternetShortcut *pintshcut = new(InternetShortcut);
if (pintshcut)
{
hres = pintshcut->QueryInterface(riid, ppvOut);
pintshcut->Release();
}
else
hres = E_OUTOFMEMORY;
return hres;
}