📄 ftpurl.cpp
字号:
/*****************************************************************************
*
* ftpurl.cpp - Creating, encoding, and decoding URLs
*
*****************************************************************************/
#include "priv.h"
#include "ftpurl.h"
///////////////////////////////////////////////////////////////////////
// URL Path Functions (Obsolete?)
///////////////////////////////////////////////////////////////////////
/*****************************************************************************\
FUNCTION: UrlGetPath
DESCRIPTION:
pszUrlPath will NOT include the fragment if there is any.
\*****************************************************************************/
HRESULT UrlGetDifference(LPCTSTR pszBaseUrl, LPCTSTR pszSuperUrl, LPTSTR pszPathDiff, DWORD cchSize)
{
HRESULT hr = E_INVALIDARG;
pszPathDiff[0] = TEXT('\0');
if ((lstrlen(pszBaseUrl) <= lstrlen(pszSuperUrl)) &&
!StrCmpN(pszBaseUrl, pszSuperUrl, lstrlen(pszBaseUrl) - 1))
{
LPTSTR pszDelta = (LPTSTR) &pszSuperUrl[lstrlen(pszBaseUrl)];
if (TEXT('/') == pszDelta[0])
pszDelta = CharNext(pszDelta); // Skip past this.
StrCpyN(pszPathDiff, pszDelta, cchSize);
hr = S_OK;
}
return hr;
}
/*****************************************************************************\
FUNCTION: UrlGetPath
DESCRIPTION:
pszUrlPath will NOT include the fragment if there is any.
\*****************************************************************************/
HRESULT UrlPathToFilePath(LPCTSTR pszSourceUrlPath, LPTSTR pszDestFilePath, DWORD cchSize)
{
HRESULT hr = E_INVALIDARG;
LPTSTR pszSeparator;
// Is the source and destination the differnt?
if (pszSourceUrlPath != pszDestFilePath)
{
// Yes, so we need to fill the dest before we start modifying it.
StrCpyN(pszDestFilePath, pszSourceUrlPath, cchSize);
}
while (pszSeparator = StrChr(pszDestFilePath, TEXT('/')))
pszSeparator[0] = TEXT('\\');
// Some idiots use "Test%20File.txt" when "%20" is really in the file name.
// ASSERT(!StrChr(pszDestFilePath, TEXT('%'))); // Assert it doesn't contain '%' or it probably has escaped url stuff.
return hr;
}
/*****************************************************************************\
FUNCTION: UrlGetPath
DESCRIPTION:
pszUrlPath will NOT include the fragment if there is any.
HRESULT UrlGetPath(LPCTSTR pszUrl, DWORD dwFlags, LPTSTR pszUrlPath, DWORD cchUrlPathSize)
{
HRESULT hr = S_OK;
URL_COMPONENTS urlComps = {sizeof(URL_COMPONENTS), NULL, 0, INTERNET_SCHEME_FTP, NULL, 0,
0, NULL, 0, NULL, 0, pszUrlPath, cchUrlPathSize, NULL, 0};
hr = InternetCrackUrl(pszUrl, 0, ICU_DECODE, &urlComps) ? S_OK : E_FAIL;
return hr;
}
\*****************************************************************************/
/*****************************************************************************\
FUNCTION: UrlPathAppendSlash
DESCRIPTION:
HRESULT UrlPathAppendSlash(LPTSTR pszUrlPath)
{
LPTSTR pszEndOfPath = &pszUrlPath[lstrlen(pszUrlPath) - 1];
// Is it missing a backslash?
if ((pszEndOfPath >= pszUrlPath) && TEXT('/') != pszEndOfPath[0])
StrCat(pszEndOfPath, SZ_URL_SLASH); // Yes, so add it.
return S_OK;
}
\*****************************************************************************/
/*****************************************************************************\
FUNCTION: UrlPathRemoveSlashW
DESCRIPTION:
\*****************************************************************************/
HRESULT UrlPathRemoveSlashW(LPWSTR pszUrlPath)
{
LPWSTR pszEndOfPath = &pszUrlPath[lstrlenW(pszUrlPath) - 1];
// Is it missing a backslash?
if ((pszEndOfPath >= pszUrlPath) && (CH_URL_URL_SLASHW == pszEndOfPath[0]))
pszEndOfPath[0] = 0; // Yes, so remove it.
return S_OK;
}
/*****************************************************************************\
FUNCTION: UrlPathRemoveSlashA
DESCRIPTION:
\*****************************************************************************/
HRESULT UrlPathRemoveSlashA(LPSTR pszUrlPath)
{
LPSTR pszEndOfPath = &pszUrlPath[lstrlenA(pszUrlPath) - 1];
// Is it missing a backslash?
if ((pszEndOfPath >= pszUrlPath) && (CH_URL_URL_SLASHA == pszEndOfPath[0]))
pszEndOfPath[0] = 0; // Yes, so remove it.
return S_OK;
}
/*****************************************************************************\
FUNCTION: UrlPathRemoveFrontSlashW
DESCRIPTION:
\*****************************************************************************/
HRESULT UrlPathRemoveFrontSlashW(LPWSTR pszUrlPath)
{
if (pszUrlPath && (CH_URL_URL_SLASHW == pszUrlPath[0]))
return CharReplaceWithStrW(pszUrlPath, lstrlen(pszUrlPath), 1, SZ_EMPTYW);
else
return S_OK;
}
/*****************************************************************************\
FUNCTION: UrlPathRemoveFrontSlashA
DESCRIPTION:
\*****************************************************************************/
HRESULT UrlPathRemoveFrontSlashA(LPSTR pszUrlPath)
{
if (pszUrlPath && (CH_URL_URL_SLASHA == pszUrlPath[0]))
return CharReplaceWithStrA(pszUrlPath, lstrlenA(pszUrlPath), 1, SZ_EMPTYA);
else
return S_OK;
}
/*****************************************************************************\
FUNCTION: UrlPathToFilePathW
DESCRIPTION:
\*****************************************************************************/
HRESULT UrlPathToFilePathW(LPWSTR pszPath)
{
while (pszPath = StrChrW(pszPath, CH_URL_URL_SLASHW))
pszPath[0] = CH_URL_SLASHW;
return S_OK;
}
/*****************************************************************************\
FUNCTION: UrlPathToFilePathA
DESCRIPTION:
\*****************************************************************************/
HRESULT UrlPathToFilePathA(LPSTR pszPath)
{
while (pszPath = StrChrA(pszPath, CH_URL_URL_SLASHA))
pszPath[0] = CH_URL_SLASHA;
return S_OK;
}
/*****************************************************************************\
FUNCTION: FilePathToUrlPathW
DESCRIPTION:
\*****************************************************************************/
HRESULT FilePathToUrlPathW(LPWSTR pszPath)
{
while (pszPath = StrChrW(pszPath, CH_URL_SLASHW))
pszPath[0] = CH_URL_URL_SLASHW;
return S_OK;
}
/*****************************************************************************\
FUNCTION: FilePathToUrlPathA
DESCRIPTION:
\*****************************************************************************/
HRESULT FilePathToUrlPathA(LPSTR pszPath)
{
while (pszPath = StrChrA(pszPath, CH_URL_SLASHA))
pszPath[0] = CH_URL_URL_SLASHA;
return S_OK;
}
/*****************************************************************************\
FUNCTION: UrlPathAdd
DESCRIPTION:
...
\*****************************************************************************/
HRESULT UrlPathAdd(LPTSTR pszUrl, DWORD cchUrlSize, LPCTSTR pszSegment)
{
// If the segment starts with a slash, skip it.
if (TEXT('/') == pszSegment[0])
pszSegment = CharNext(pszSegment);
StrCatBuff(pszUrl, pszSegment, cchUrlSize);
return S_OK;
}
/*****************************************************************************\
FUNCTION: UrlPathAppend
DESCRIPTION:
...
HRESULT UrlPathAppend(LPTSTR pszUrl, DWORD cchUrlSize, LPCTSTR pszSegment)
{
if (!EVAL(pszSegment))
return E_INVALIDARG;
UrlPathAppendSlash(pszUrl); // Make sure the base url ends in a '/'. Note it may be "ftp://".
return UrlPathAdd(pszUrl, cchUrlSize, pszSegment);
}
\*****************************************************************************/
/*****************************************************************************\
StrRetFromFtpPidl
\*****************************************************************************/
HRESULT StrRetFromFtpPidl(LPSTRRET pStrRet, DWORD shgno, LPCITEMIDLIST pidl)
{
HRESULT hr = S_OK;
TCHAR szUrl[MAX_URL_STRING];
szUrl[0] = 0;
hr = UrlCreateFromPidl(pidl, shgno, szUrl, ARRAYSIZE(szUrl), ICU_ESCAPE | ICU_USERNAME, TRUE);
if (SUCCEEDED(hr))
{
// Will it fit into STRRET.cStr?
if (lstrlen(szUrl) < ARRAYSIZE(pStrRet->cStr))
{
// Yes, so there it goes...
pStrRet->uType = STRRET_CSTR;
SHTCharToAnsi(szUrl, pStrRet->cStr, ARRAYSIZE(pStrRet->cStr));
}
else
{
// No, so we will need to allocate it
LPWSTR pwzAllocedStr = NULL;
UINT cch = lstrlen(szUrl) + 1;
pwzAllocedStr = (LPWSTR) SHAlloc(CbFromCchW(cch));
pStrRet->uType = STRRET_WSTR;
pStrRet->pOleStr = pwzAllocedStr;
if (pwzAllocedStr)
SHTCharToUnicode(szUrl, pwzAllocedStr, cch);
else
hr = E_OUTOFMEMORY;
}
}
return hr;
}
/*****************************************************************************\
FUNCTION: UrlCreateFromFindData
DESCRIPTION:
This function will use a base url and a path from Find Data to create
a fully qualified URL.
PARAMETERS:
pszBaseUrl - This needs to be Escaped.
pwfd->cFileName - This needs to be UNEscaped.
pszFullUrl - This will to be Escaped.
HRESULT UrlCreateFromFindData(LPCTSTR pszBaseUrl, const LPWIN32_FIND_DATA pwfd, LPTSTR pszFullUrl, DWORD cchFullUrlSize)
{
TCHAR szBaseUrl[MAX_URL_STRING];
HRESULT hr = E_FAIL;
TCHAR szLastItemEscaped[MAX_PATH];
TCHAR szLastItem[MAX_PATH];
LPCTSTR pszLastItem = pwfd->cFileName;
StrCpyN(szBaseUrl, pszBaseUrl, ARRAYSIZE(szBaseUrl));
UrlPathAppendSlash(szBaseUrl);
if (CH_URL_URL_SLASH == pszLastItem[0])
pszLastItem++; // Don't let pwfd->cFileName replace the existing Url Path
StrCpyN(szLastItem, pszLastItem, ARRAYSIZE(szLastItem));
if (CH_URL_URL_SLASH == szLastItem[lstrlen(szLastItem)-1])
szLastItem[lstrlen(szLastItem)-1] = 0; // Remove the last slash because it's escaped
if (EVAL(SUCCEEDED(EscapeString(szLastItem, szLastItemEscaped, ARRAYSIZE(szLastItemEscaped)))))
{
DWORD cchSize = cchFullUrlSize;
if (EVAL(InternetCombineUrl(szBaseUrl, szLastItemEscaped, pszFullUrl, &cchSize, ICU_NO_ENCODE)))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -