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

343 lines
8.2 KiB
C++

/*
* newshk.cpp - INewShortcutHook implementation for URL class.
*/
/* Headers
**********/
#include "project.hpp"
#pragma hdrstop
#include "resource.h"
#include <mluisupp.h>
extern "C"{
extern BOOL lPathYetAnotherMakeUniqueNameA(LPSTR,LPCSTR,LPCSTR,LPCSTR);
}
/********************************** Methods **********************************/
#pragma warning(disable:4100) /* "unreferenced formal parameter" warning */
HRESULT STDMETHODCALLTYPE InternetShortcut::SetReferent(PCSTR pcszReferent,
HWND hwndParent)
{
HRESULT hr;
PSTR pszTranslatedURL;
DebugEntry(InternetShortcut::SetReferent);
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ASSERT(IS_VALID_STRING_PTR(pcszReferent, CSTR));
ASSERT(IS_VALID_HANDLE(hwndParent, WND));
hr = TranslateURL(pcszReferent, TRANSLATEURL_FL_GUESS_PROTOCOL,
&pszTranslatedURL);
if (SUCCEEDED(hr))
{
PCSTR pcszURLToUse;
pcszURLToUse = (hr == S_OK) ? pszTranslatedURL : pcszReferent;
hr = ValidateURL(pcszURLToUse);
if (hr == S_OK)
hr = SetURL(pcszURLToUse, 0);
if (pszTranslatedURL)
{
LocalFree(pszTranslatedURL);
pszTranslatedURL = NULL;
}
}
if (hr == S_OK)
TRACE_OUT(("InternetShortcut::SetReferent(): Set referent %s as URL %s.",
pcszReferent,
m_pszURL));
else
{
ASSERT(FAILED(hr));
switch (hr)
{
case URL_E_INVALID_SYNTAX:
case URL_E_UNREGISTERED_PROTOCOL:
hr = S_FALSE;
break;
default:
break;
}
TRACE_OUT(("InternetShortcut::SetReferent(): Failed to set referent to %s.",
pcszReferent));
}
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
DebugExitHRESULT(InternetShortcut::SetReferent, hr);
return(hr);
}
#pragma warning(default:4100) /* "unreferenced formal parameter" warning */
HRESULT STDMETHODCALLTYPE InternetShortcut::GetReferent(PSTR pszReferent,
int ncReferentBufLen)
{
HRESULT hr;
DebugEntry(InternetShortcut::GetReferent);
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ASSERT(IS_VALID_WRITE_BUFFER_PTR(pszReferent, STR, ncReferentBufLen));
if (m_pszURL)
{
if (lstrlen(m_pszURL) < ncReferentBufLen)
{
lstrcpy(pszReferent, m_pszURL);
hr = S_OK;
TRACE_OUT(("InternetShortcut::GetReferent(): Returning referent %s.",
pszReferent));
}
else
hr = E_FAIL;
}
else
hr = S_FALSE;
if (hr != S_OK)
{
if (ncReferentBufLen > 0)
*pszReferent = '\0';
}
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ASSERT((hr == S_OK &&
IS_VALID_STRING_PTR(pszReferent, STR) &&
EVAL(lstrlen(pszReferent) < ncReferentBufLen)) ||
((hr == S_FALSE ||
hr == E_FAIL) &&
EVAL(! ncReferentBufLen ||
! *pszReferent)));
DebugExitHRESULT(InternetShortcut::GetReferent, hr);
return(hr);
}
HRESULT STDMETHODCALLTYPE InternetShortcut::SetFolder(PCSTR pcszFolder)
{
HRESULT hr;
PSTR pszFolderCopy;
DebugEntry(InternetShortcut::SetFolder);
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ASSERT(IsPathDirectory(pcszFolder));
// (+ 1) for null terminator.
pszFolderCopy = new(char[lstrlen(pcszFolder) + 1]);
if (pszFolderCopy)
{
lstrcpy(pszFolderCopy, pcszFolder);
if (m_pszFolder)
delete m_pszFolder;
m_pszFolder = pszFolderCopy;
hr = S_OK;
TRACE_OUT(("InternetShortcut::SetFolder(): Set folder to %s.",
m_pszFolder));
}
else
hr = E_OUTOFMEMORY;
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
DebugExitHRESULT(InternetShortcut::SetFolder, hr);
return(hr);
}
HRESULT STDMETHODCALLTYPE InternetShortcut::GetFolder(PSTR pszFolder,
int ncFolderBufLen)
{
HRESULT hr;
DebugEntry(InternetShortcut::GetFolder);
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ASSERT(IS_VALID_WRITE_BUFFER_PTR(pszFolder, STR, ncFolderBufLen));
if (m_pszFolder)
{
if (lstrlen(m_pszFolder) < ncFolderBufLen)
{
lstrcpy(pszFolder, m_pszFolder);
hr = S_OK;
TRACE_OUT(("InternetShortcut::GetFolder(): Returning folder %s.",
pszFolder));
}
else
hr = E_FAIL;
}
else
hr = S_FALSE;
if (hr != S_OK)
{
if (ncFolderBufLen > 0)
*pszFolder = '\0';
}
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ASSERT((hr == S_OK &&
IS_VALID_STRING_PTR(pszFolder, STR) &&
EVAL(lstrlen(pszFolder) < ncFolderBufLen)) ||
((hr == S_FALSE ||
hr == E_FAIL) &&
EVAL(! ncFolderBufLen ||
! *pszFolder)));
DebugExitHRESULT(InternetShortcut::GetFolder, hr);
return(hr);
}
HRESULT STDMETHODCALLTYPE InternetShortcut::GetName(PSTR pszName,
int ncNameBufLen)
{
HRESULT hr = E_FAIL;
char rgchShortName[MAX_PATH_LEN];
DebugEntry(InternetShortcut::GetName);
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ASSERT(IS_VALID_WRITE_BUFFER_PTR(pszName, STR, ncNameBufLen));
hr = E_FAIL;
if (MLLoadStringA(IDS_SHORT_NEW_INTERNET_SHORTCUT,
rgchShortName, sizeof(rgchShortName)))
{
char rgchLongName[MAX_PATH_LEN];
if (MLLoadStringA(IDS_NEW_INTERNET_SHORTCUT,
rgchLongName, sizeof(rgchLongName)))
{
char rgchCurDir[MAX_PATH_LEN];
PCSTR pcszFolderToUse;
// Use current directory if m_pszFolder has not been set.
pcszFolderToUse = m_pszFolder;
if (! pcszFolderToUse)
{
if (GetCurrentDirectory(sizeof(rgchCurDir), rgchCurDir) > 0)
pcszFolderToUse = rgchCurDir;
}
if (pcszFolderToUse)
{
char rgchUniqueName[MAX_PATH_LEN];
if (lPathYetAnotherMakeUniqueNameA(rgchUniqueName, pcszFolderToUse,
rgchShortName, rgchLongName))
{
PSTR pszFileName;
PSTR pszRemoveExt;
pszFileName = (PSTR)ExtractFileName(rgchUniqueName);
pszRemoveExt = (PSTR)ExtractExtension(pszFileName);
*pszRemoveExt = '\0';
if (lstrlen(pszFileName) < ncNameBufLen)
{
lstrcpy(pszName, pszFileName);
hr = S_OK;
}
}
}
}
}
if (hr == S_OK) {
TRACE_OUT(("InternetShortcut::GetName(): Returning %s.",
pszName));
}
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ASSERT((hr == S_OK &&
IS_VALID_STRING_PTR(pszName, STR) &&
EVAL(lstrlen(pszName) < ncNameBufLen)) ||
(hr == E_FAIL &&
(! ncNameBufLen ||
! *pszName)));
DebugExitHRESULT(InternetShortcut::GetName, hr);
return(hr);
}
HRESULT STDMETHODCALLTYPE InternetShortcut::GetExtension(PSTR pszExtension,
int ncExtensionBufLen)
{
HRESULT hr;
DebugEntry(InternetShortcut::GetExtension);
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ASSERT(IS_VALID_WRITE_BUFFER_PTR(pszExtension, STR, ncExtensionBufLen));
if (lstrlen(g_cszURLExt) < ncExtensionBufLen)
{
lstrcpy(pszExtension, g_cszURLExt);
hr = S_OK;
TRACE_OUT(("InternetShortcut::GetExtension(): Returning extension %s.",
pszExtension));
}
else
{
if (ncExtensionBufLen > 0)
*pszExtension = '\0';
hr = E_FAIL;
}
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut));
ASSERT((hr == S_OK &&
IS_VALID_STRING_PTR(pszExtension, STR) &&
EVAL(lstrlen(pszExtension) < ncExtensionBufLen)) ||
(hr == E_FAIL &&
EVAL(! ncExtensionBufLen ||
! *pszExtension)));
DebugExitHRESULT(InternetShortcut::GetExtension, hr);
return(hr);
}