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