ParseURL is now documented, so move it into shlwapi.h.
This commit is contained in:
parent
7d6f360f94
commit
57cb25c008
|
@ -92,24 +92,6 @@ typedef enum {
|
||||||
USERPASS,
|
USERPASS,
|
||||||
} WINE_URL_SCAN_TYPE;
|
} WINE_URL_SCAN_TYPE;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
INT size; /* [in] (always 0x18) */
|
|
||||||
LPCSTR ap1; /* [out] start of scheme */
|
|
||||||
INT sizep1; /* [out] size of scheme (until colon) */
|
|
||||||
LPCSTR ap2; /* [out] pointer following first colon */
|
|
||||||
INT sizep2; /* [out] size of remainder */
|
|
||||||
INT fcncde; /* [out] function match of p1 (0 if unknown) */
|
|
||||||
} UNKNOWN_SHLWAPI_1;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
INT size; /* [in] (always 0x18) */
|
|
||||||
LPCWSTR ap1; /* [out] start of scheme */
|
|
||||||
INT sizep1; /* [out] size of scheme (until colon) */
|
|
||||||
LPCWSTR ap2; /* [out] pointer following first colon */
|
|
||||||
INT sizep2; /* [out] size of remainder */
|
|
||||||
INT fcncde; /* [out] function match of p1 (0 if unknown) */
|
|
||||||
} UNKNOWN_SHLWAPI_2;
|
|
||||||
|
|
||||||
static const CHAR hexDigits[] = "0123456789ABCDEF";
|
static const CHAR hexDigits[] = "0123456789ABCDEF";
|
||||||
|
|
||||||
static const WCHAR fileW[] = {'f','i','l','e','\0'};
|
static const WCHAR fileW[] = {'f','i','l','e','\0'};
|
||||||
|
@ -252,25 +234,25 @@ static BOOL URL_JustLocation(LPCWSTR str)
|
||||||
* Success: S_OK. y contains the parsed Url details.
|
* Success: S_OK. y contains the parsed Url details.
|
||||||
* Failure: An HRESULT error code.
|
* Failure: An HRESULT error code.
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI ParseURLA(LPCSTR x, UNKNOWN_SHLWAPI_1 *y)
|
HRESULT WINAPI ParseURLA(LPCSTR x, PARSEDURLA *y)
|
||||||
{
|
{
|
||||||
DWORD cnt;
|
DWORD cnt;
|
||||||
const SHL_2_inet_scheme *inet_pro;
|
const SHL_2_inet_scheme *inet_pro;
|
||||||
|
|
||||||
y->fcncde = URL_SCHEME_INVALID;
|
y->nScheme = URL_SCHEME_INVALID;
|
||||||
if (y->size != 0x18) return E_INVALIDARG;
|
if (y->cbSize != sizeof(*y)) return E_INVALIDARG;
|
||||||
/* FIXME: leading white space generates error of 0x80041001 which
|
/* FIXME: leading white space generates error of 0x80041001 which
|
||||||
* is undefined
|
* is undefined
|
||||||
*/
|
*/
|
||||||
if (*x <= ' ') return 0x80041001;
|
if (*x <= ' ') return 0x80041001;
|
||||||
cnt = 0;
|
cnt = 0;
|
||||||
y->sizep1 = 0;
|
y->cchProtocol = 0;
|
||||||
y->ap1 = x;
|
y->pszProtocol = x;
|
||||||
while (*x) {
|
while (*x) {
|
||||||
if (*x == ':') {
|
if (*x == ':') {
|
||||||
y->sizep1 = cnt;
|
y->cchProtocol = cnt;
|
||||||
cnt = -1;
|
cnt = -1;
|
||||||
y->ap2 = x+1;
|
y->pszSuffix = x+1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
x++;
|
x++;
|
||||||
|
@ -279,21 +261,21 @@ DWORD WINAPI ParseURLA(LPCSTR x, UNKNOWN_SHLWAPI_1 *y)
|
||||||
|
|
||||||
/* check for no scheme in string start */
|
/* check for no scheme in string start */
|
||||||
/* (apparently schemes *must* be larger than a single character) */
|
/* (apparently schemes *must* be larger than a single character) */
|
||||||
if ((*x == '\0') || (y->sizep1 <= 1)) {
|
if ((*x == '\0') || (y->cchProtocol <= 1)) {
|
||||||
y->ap1 = 0;
|
y->pszProtocol = NULL;
|
||||||
return 0x80041001;
|
return 0x80041001;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* found scheme, set length of remainder */
|
/* found scheme, set length of remainder */
|
||||||
y->sizep2 = lstrlenA(y->ap2);
|
y->cchSuffix = lstrlenA(y->pszSuffix);
|
||||||
|
|
||||||
/* see if known scheme and return indicator number */
|
/* see if known scheme and return indicator number */
|
||||||
y->fcncde = URL_SCHEME_UNKNOWN;
|
y->nScheme = URL_SCHEME_UNKNOWN;
|
||||||
inet_pro = shlwapi_schemes;
|
inet_pro = shlwapi_schemes;
|
||||||
while (inet_pro->scheme_name) {
|
while (inet_pro->scheme_name) {
|
||||||
if (!strncasecmp(inet_pro->scheme_name, y->ap1,
|
if (!strncasecmp(inet_pro->scheme_name, y->pszProtocol,
|
||||||
min(y->sizep1, lstrlenA(inet_pro->scheme_name)))) {
|
min(y->cchProtocol, lstrlenA(inet_pro->scheme_name)))) {
|
||||||
y->fcncde = inet_pro->scheme_number;
|
y->nScheme = inet_pro->scheme_number;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
inet_pro++;
|
inet_pro++;
|
||||||
|
@ -306,27 +288,27 @@ DWORD WINAPI ParseURLA(LPCSTR x, UNKNOWN_SHLWAPI_1 *y)
|
||||||
*
|
*
|
||||||
* Unicode version of ParseURLA.
|
* Unicode version of ParseURLA.
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI ParseURLW(LPCWSTR x, UNKNOWN_SHLWAPI_2 *y)
|
HRESULT WINAPI ParseURLW(LPCWSTR x, PARSEDURLW *y)
|
||||||
{
|
{
|
||||||
DWORD cnt;
|
DWORD cnt;
|
||||||
const SHL_2_inet_scheme *inet_pro;
|
const SHL_2_inet_scheme *inet_pro;
|
||||||
LPSTR cmpstr;
|
LPSTR cmpstr;
|
||||||
INT len;
|
INT len;
|
||||||
|
|
||||||
y->fcncde = URL_SCHEME_INVALID;
|
y->nScheme = URL_SCHEME_INVALID;
|
||||||
if (y->size != 0x18) return E_INVALIDARG;
|
if (y->cbSize != sizeof(*y)) return E_INVALIDARG;
|
||||||
/* FIXME: leading white space generates error of 0x80041001 which
|
/* FIXME: leading white space generates error of 0x80041001 which
|
||||||
* is undefined
|
* is undefined
|
||||||
*/
|
*/
|
||||||
if (*x <= L' ') return 0x80041001;
|
if (*x <= L' ') return 0x80041001;
|
||||||
cnt = 0;
|
cnt = 0;
|
||||||
y->sizep1 = 0;
|
y->cchProtocol = 0;
|
||||||
y->ap1 = x;
|
y->pszProtocol = x;
|
||||||
while (*x) {
|
while (*x) {
|
||||||
if (*x == L':') {
|
if (*x == L':') {
|
||||||
y->sizep1 = cnt;
|
y->cchProtocol = cnt;
|
||||||
cnt = -1;
|
cnt = -1;
|
||||||
y->ap2 = x+1;
|
y->pszSuffix = x+1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
x++;
|
x++;
|
||||||
|
@ -335,24 +317,24 @@ DWORD WINAPI ParseURLW(LPCWSTR x, UNKNOWN_SHLWAPI_2 *y)
|
||||||
|
|
||||||
/* check for no scheme in string start */
|
/* check for no scheme in string start */
|
||||||
/* (apparently schemes *must* be larger than a single character) */
|
/* (apparently schemes *must* be larger than a single character) */
|
||||||
if ((*x == L'\0') || (y->sizep1 <= 1)) {
|
if ((*x == L'\0') || (y->cchProtocol <= 1)) {
|
||||||
y->ap1 = 0;
|
y->pszProtocol = NULL;
|
||||||
return 0x80041001;
|
return 0x80041001;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* found scheme, set length of remainder */
|
/* found scheme, set length of remainder */
|
||||||
y->sizep2 = lstrlenW(y->ap2);
|
y->cchSuffix = lstrlenW(y->pszSuffix);
|
||||||
|
|
||||||
/* see if known scheme and return indicator number */
|
/* see if known scheme and return indicator number */
|
||||||
len = WideCharToMultiByte(0, 0, y->ap1, y->sizep1, 0, 0, 0, 0);
|
len = WideCharToMultiByte(0, 0, y->pszProtocol, y->cchProtocol, 0, 0, 0, 0);
|
||||||
cmpstr = (LPSTR)HeapAlloc(GetProcessHeap(), 0, len);
|
cmpstr = (LPSTR)HeapAlloc(GetProcessHeap(), 0, len);
|
||||||
WideCharToMultiByte(0, 0, y->ap1, y->sizep1, cmpstr, len, 0, 0);
|
WideCharToMultiByte(0, 0, y->pszProtocol, y->cchProtocol, cmpstr, len, 0, 0);
|
||||||
y->fcncde = URL_SCHEME_UNKNOWN;
|
y->nScheme = URL_SCHEME_UNKNOWN;
|
||||||
inet_pro = shlwapi_schemes;
|
inet_pro = shlwapi_schemes;
|
||||||
while (inet_pro->scheme_name) {
|
while (inet_pro->scheme_name) {
|
||||||
if (!strncasecmp(inet_pro->scheme_name, cmpstr,
|
if (!strncasecmp(inet_pro->scheme_name, cmpstr,
|
||||||
min(len, lstrlenA(inet_pro->scheme_name)))) {
|
min(len, lstrlenA(inet_pro->scheme_name)))) {
|
||||||
y->fcncde = inet_pro->scheme_number;
|
y->nScheme = inet_pro->scheme_number;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
inet_pro++;
|
inet_pro++;
|
||||||
|
@ -661,7 +643,7 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
|
||||||
LPWSTR pszCombined, LPDWORD pcchCombined,
|
LPWSTR pszCombined, LPDWORD pcchCombined,
|
||||||
DWORD dwFlags)
|
DWORD dwFlags)
|
||||||
{
|
{
|
||||||
UNKNOWN_SHLWAPI_2 base, relative;
|
PARSEDURLW base, relative;
|
||||||
DWORD myflags, sizeloc = 0;
|
DWORD myflags, sizeloc = 0;
|
||||||
DWORD len, res1, res2, process_case = 0;
|
DWORD len, res1, res2, process_case = 0;
|
||||||
LPWSTR work, preliminary, mbase, mrelative;
|
LPWSTR work, preliminary, mbase, mrelative;
|
||||||
|
@ -676,8 +658,8 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
|
||||||
if(!pszBase || !pszRelative || !pcchCombined)
|
if(!pszBase || !pszRelative || !pcchCombined)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
base.size = 24;
|
base.cbSize = sizeof(base);
|
||||||
relative.size = 24;
|
relative.cbSize = sizeof(relative);
|
||||||
|
|
||||||
/* Get space for duplicates of the input and the output */
|
/* Get space for duplicates of the input and the output */
|
||||||
preliminary = HeapAlloc(GetProcessHeap(), 0, (3*INTERNET_MAX_URL_LENGTH) *
|
preliminary = HeapAlloc(GetProcessHeap(), 0, (3*INTERNET_MAX_URL_LENGTH) *
|
||||||
|
@ -705,7 +687,7 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
|
||||||
else do {
|
else do {
|
||||||
|
|
||||||
/* get size of location field (if it exists) */
|
/* get size of location field (if it exists) */
|
||||||
work = (LPWSTR)base.ap2;
|
work = (LPWSTR)base.pszSuffix;
|
||||||
sizeloc = 0;
|
sizeloc = 0;
|
||||||
if (*work++ == L'/') {
|
if (*work++ == L'/') {
|
||||||
if (*work++ == L'/') {
|
if (*work++ == L'/') {
|
||||||
|
@ -713,23 +695,23 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
|
||||||
* it ends at next '/' or end of string.
|
* it ends at next '/' or end of string.
|
||||||
*/
|
*/
|
||||||
while(*work && (*work != L'/')) work++;
|
while(*work && (*work != L'/')) work++;
|
||||||
sizeloc = (DWORD)(work - base.ap2);
|
sizeloc = (DWORD)(work - base.pszSuffix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Change .sizep2 to not have the last leaf in it,
|
/* Change .sizep2 to not have the last leaf in it,
|
||||||
* Note: we need to start after the location (if it exists)
|
* Note: we need to start after the location (if it exists)
|
||||||
*/
|
*/
|
||||||
work = strrchrW((base.ap2+sizeloc), L'/');
|
work = strrchrW((base.pszSuffix+sizeloc), L'/');
|
||||||
if (work) {
|
if (work) {
|
||||||
len = (DWORD)(work - base.ap2 + 1);
|
len = (DWORD)(work - base.pszSuffix + 1);
|
||||||
base.sizep2 = len;
|
base.cchSuffix = len;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* At this point:
|
* At this point:
|
||||||
* .ap2 points to location (starting with '//')
|
* .pszSuffix points to location (starting with '//')
|
||||||
* .sizep2 length of location (above) and rest less the last
|
* .cchSuffix length of location (above) and rest less the last
|
||||||
* leaf (if any)
|
* leaf (if any)
|
||||||
* sizeloc length of location (above) up to but not including
|
* sizeloc length of location (above) up to but not including
|
||||||
* the last '/'
|
* the last '/'
|
||||||
*/
|
*/
|
||||||
|
@ -738,8 +720,8 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
|
||||||
if (res2) {
|
if (res2) {
|
||||||
/* no scheme in pszRelative */
|
/* no scheme in pszRelative */
|
||||||
TRACE("no scheme detected in Relative\n");
|
TRACE("no scheme detected in Relative\n");
|
||||||
relative.ap2 = mrelative; /* case 3,4,5 depends on this */
|
relative.pszSuffix = mrelative; /* case 3,4,5 depends on this */
|
||||||
relative.sizep2 = strlenW(mrelative);
|
relative.cchSuffix = strlenW(mrelative);
|
||||||
if (*pszRelative == L':') {
|
if (*pszRelative == L':') {
|
||||||
/* case that is either left alone or uses pszBase */
|
/* case that is either left alone or uses pszBase */
|
||||||
if (dwFlags & URL_PLUGGABLE_PROTOCOL) {
|
if (dwFlags & URL_PLUGGABLE_PROTOCOL) {
|
||||||
|
@ -765,21 +747,21 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
|
||||||
process_case = 4;
|
process_case = 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
process_case = (*base.ap2 == L'/') ? 5 : 3;
|
process_case = (*base.pszSuffix == L'/') ? 5 : 3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* handle cases where pszRelative has scheme */
|
/* handle cases where pszRelative has scheme */
|
||||||
if ((base.sizep1 == relative.sizep1) &&
|
if ((base.cchProtocol == relative.cchProtocol) &&
|
||||||
(strncmpW(base.ap1, relative.ap1, base.sizep1) == 0)) {
|
(strncmpW(base.pszProtocol, relative.pszProtocol, base.cchProtocol) == 0)) {
|
||||||
|
|
||||||
/* since the schemes are the same */
|
/* since the schemes are the same */
|
||||||
if ((*relative.ap2 == L'/') && (*(relative.ap2+1) == L'/')) {
|
if ((*relative.pszSuffix == L'/') && (*(relative.pszSuffix+1) == L'/')) {
|
||||||
/* case where pszRelative replaces location and following */
|
/* case where pszRelative replaces location and following */
|
||||||
process_case = 3;
|
process_case = 3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (*relative.ap2 == L'/') {
|
if (*relative.pszSuffix == L'/') {
|
||||||
/* case where pszRelative is root to location */
|
/* case where pszRelative is root to location */
|
||||||
process_case = 4;
|
process_case = 4;
|
||||||
break;
|
break;
|
||||||
|
@ -788,7 +770,7 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
|
||||||
process_case = 5;
|
process_case = 5;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((*relative.ap2 == L'/') && (*(relative.ap2+1) == L'/')) {
|
if ((*relative.pszSuffix == L'/') && (*(relative.pszSuffix+1) == L'/')) {
|
||||||
/* case where pszRelative replaces scheme, location,
|
/* case where pszRelative replaces scheme, location,
|
||||||
* and following and handles PLUGGABLE
|
* and following and handles PLUGGABLE
|
||||||
*/
|
*/
|
||||||
|
@ -816,7 +798,7 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
|
||||||
*/
|
*/
|
||||||
strcpyW(preliminary, mrelative);
|
strcpyW(preliminary, mrelative);
|
||||||
if (!(dwFlags & URL_PLUGGABLE_PROTOCOL) &&
|
if (!(dwFlags & URL_PLUGGABLE_PROTOCOL) &&
|
||||||
URL_JustLocation(relative.ap2))
|
URL_JustLocation(relative.pszSuffix))
|
||||||
strcatW(preliminary, single_slash);
|
strcatW(preliminary, single_slash);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -824,11 +806,11 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
|
||||||
* Return the pszBase scheme with pszRelative. Basically
|
* Return the pszBase scheme with pszRelative. Basically
|
||||||
* keeps the scheme and replaces the domain and following.
|
* keeps the scheme and replaces the domain and following.
|
||||||
*/
|
*/
|
||||||
strncpyW(preliminary, base.ap1, base.sizep1 + 1);
|
strncpyW(preliminary, base.pszProtocol, base.cchProtocol + 1);
|
||||||
work = preliminary + base.sizep1 + 1;
|
work = preliminary + base.cchProtocol + 1;
|
||||||
strcpyW(work, relative.ap2);
|
strcpyW(work, relative.pszSuffix);
|
||||||
if (!(dwFlags & URL_PLUGGABLE_PROTOCOL) &&
|
if (!(dwFlags & URL_PLUGGABLE_PROTOCOL) &&
|
||||||
URL_JustLocation(relative.ap2))
|
URL_JustLocation(relative.pszSuffix))
|
||||||
strcatW(work, single_slash);
|
strcatW(work, single_slash);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -837,22 +819,22 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
|
||||||
* after the location is pszRelative. (Replace document
|
* after the location is pszRelative. (Replace document
|
||||||
* from root on.)
|
* from root on.)
|
||||||
*/
|
*/
|
||||||
strncpyW(preliminary, base.ap1, base.sizep1+1+sizeloc);
|
strncpyW(preliminary, base.pszProtocol, base.cchProtocol+1+sizeloc);
|
||||||
work = preliminary + base.sizep1 + 1 + sizeloc;
|
work = preliminary + base.cchProtocol + 1 + sizeloc;
|
||||||
if (dwFlags & URL_PLUGGABLE_PROTOCOL)
|
if (dwFlags & URL_PLUGGABLE_PROTOCOL)
|
||||||
*(work++) = L'/';
|
*(work++) = L'/';
|
||||||
strcpyW(work, relative.ap2);
|
strcpyW(work, relative.pszSuffix);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5: /*
|
case 5: /*
|
||||||
* Return the pszBase without its document (if any) and
|
* Return the pszBase without its document (if any) and
|
||||||
* append pszRelative after its scheme.
|
* append pszRelative after its scheme.
|
||||||
*/
|
*/
|
||||||
strncpyW(preliminary, base.ap1, base.sizep1+1+base.sizep2);
|
strncpyW(preliminary, base.pszProtocol, base.cchProtocol+1+base.cchSuffix);
|
||||||
work = preliminary + base.sizep1+1+base.sizep2 - 1;
|
work = preliminary + base.cchProtocol+1+base.cchSuffix - 1;
|
||||||
if (*work++ != L'/')
|
if (*work++ != L'/')
|
||||||
*(work++) = L'/';
|
*(work++) = L'/';
|
||||||
strcpyW(work, relative.ap2);
|
strcpyW(work, relative.pszSuffix);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1248,18 +1230,18 @@ HRESULT WINAPI UrlUnescapeW(
|
||||||
LPCSTR WINAPI UrlGetLocationA(
|
LPCSTR WINAPI UrlGetLocationA(
|
||||||
LPCSTR pszUrl)
|
LPCSTR pszUrl)
|
||||||
{
|
{
|
||||||
UNKNOWN_SHLWAPI_1 base;
|
PARSEDURLA base;
|
||||||
DWORD res1;
|
DWORD res1;
|
||||||
|
|
||||||
base.size = 24;
|
base.cbSize = sizeof(base);
|
||||||
res1 = ParseURLA(pszUrl, &base);
|
res1 = ParseURLA(pszUrl, &base);
|
||||||
if (res1) return NULL; /* invalid scheme */
|
if (res1) return NULL; /* invalid scheme */
|
||||||
|
|
||||||
/* if scheme is file: then never return pointer */
|
/* if scheme is file: then never return pointer */
|
||||||
if (strncmp(base.ap1, "file", min(4,base.sizep1)) == 0) return NULL;
|
if (strncmp(base.pszProtocol, "file", min(4,base.cchProtocol)) == 0) return NULL;
|
||||||
|
|
||||||
/* Look for '#' and return its addr */
|
/* Look for '#' and return its addr */
|
||||||
return strchr(base.ap2, '#');
|
return strchr(base.pszSuffix, '#');
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
@ -1270,18 +1252,18 @@ LPCSTR WINAPI UrlGetLocationA(
|
||||||
LPCWSTR WINAPI UrlGetLocationW(
|
LPCWSTR WINAPI UrlGetLocationW(
|
||||||
LPCWSTR pszUrl)
|
LPCWSTR pszUrl)
|
||||||
{
|
{
|
||||||
UNKNOWN_SHLWAPI_2 base;
|
PARSEDURLW base;
|
||||||
DWORD res1;
|
DWORD res1;
|
||||||
|
|
||||||
base.size = 24;
|
base.cbSize = sizeof(base);
|
||||||
res1 = ParseURLW(pszUrl, &base);
|
res1 = ParseURLW(pszUrl, &base);
|
||||||
if (res1) return NULL; /* invalid scheme */
|
if (res1) return NULL; /* invalid scheme */
|
||||||
|
|
||||||
/* if scheme is file: then never return pointer */
|
/* if scheme is file: then never return pointer */
|
||||||
if (strncmpW(base.ap1, fileW, min(4,base.sizep1)) == 0) return NULL;
|
if (strncmpW(base.pszProtocol, fileW, min(4,base.cchProtocol)) == 0) return NULL;
|
||||||
|
|
||||||
/* Look for '#' and return its addr */
|
/* Look for '#' and return its addr */
|
||||||
return strchrW(base.ap2, L'#');
|
return strchrW(base.pszSuffix, L'#');
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
@ -1567,7 +1549,7 @@ static HRESULT URL_ApplyDefault(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut)
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI UrlApplySchemeW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DWORD dwFlags)
|
HRESULT WINAPI UrlApplySchemeW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DWORD dwFlags)
|
||||||
{
|
{
|
||||||
UNKNOWN_SHLWAPI_2 in_scheme;
|
PARSEDURLW in_scheme;
|
||||||
DWORD res1;
|
DWORD res1;
|
||||||
HRESULT ret;
|
HRESULT ret;
|
||||||
|
|
||||||
|
@ -1582,7 +1564,7 @@ HRESULT WINAPI UrlApplySchemeW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DW
|
||||||
return S_FALSE;
|
return S_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
in_scheme.size = 24;
|
in_scheme.cbSize = sizeof(in_scheme);
|
||||||
/* See if the base has a scheme */
|
/* See if the base has a scheme */
|
||||||
res1 = ParseURLW(pszIn, &in_scheme);
|
res1 = ParseURLW(pszIn, &in_scheme);
|
||||||
if (res1) {
|
if (res1) {
|
||||||
|
@ -1594,7 +1576,7 @@ HRESULT WINAPI UrlApplySchemeW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DW
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* we have a scheme, see if valid (known scheme) */
|
/* we have a scheme, see if valid (known scheme) */
|
||||||
if (in_scheme.fcncde) {
|
if (in_scheme.nScheme) {
|
||||||
/* have valid scheme, so just copy and exit */
|
/* have valid scheme, so just copy and exit */
|
||||||
if (strlenW(pszIn) + 1 > *pcchOut) {
|
if (strlenW(pszIn) + 1 > *pcchOut) {
|
||||||
*pcchOut = strlenW(pszIn) + 1;
|
*pcchOut = strlenW(pszIn) + 1;
|
||||||
|
@ -1643,17 +1625,17 @@ HRESULT WINAPI UrlApplySchemeW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DW
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis)
|
BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis)
|
||||||
{
|
{
|
||||||
UNKNOWN_SHLWAPI_1 base;
|
PARSEDURLA base;
|
||||||
DWORD res1;
|
DWORD res1;
|
||||||
LPCSTR last;
|
LPCSTR last;
|
||||||
|
|
||||||
switch (Urlis) {
|
switch (Urlis) {
|
||||||
|
|
||||||
case URLIS_OPAQUE:
|
case URLIS_OPAQUE:
|
||||||
base.size = 24;
|
base.cbSize = sizeof(base);
|
||||||
res1 = ParseURLA(pszUrl, &base);
|
res1 = ParseURLA(pszUrl, &base);
|
||||||
if (res1) return FALSE; /* invalid scheme */
|
if (res1) return FALSE; /* invalid scheme */
|
||||||
if ((*base.ap2 == '/') && (*(base.ap2+1) == '/'))
|
if ((*base.pszSuffix == '/') && (*(base.pszSuffix+1) == '/'))
|
||||||
/* has scheme followed by 2 '/' */
|
/* has scheme followed by 2 '/' */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -1683,17 +1665,17 @@ BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis)
|
||||||
BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis)
|
BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis)
|
||||||
{
|
{
|
||||||
static const WCHAR stemp[] = { 'f','i','l','e',':','/','/',0 };
|
static const WCHAR stemp[] = { 'f','i','l','e',':','/','/',0 };
|
||||||
UNKNOWN_SHLWAPI_2 base;
|
PARSEDURLW base;
|
||||||
DWORD res1;
|
DWORD res1;
|
||||||
LPCWSTR last;
|
LPCWSTR last;
|
||||||
|
|
||||||
switch (Urlis) {
|
switch (Urlis) {
|
||||||
|
|
||||||
case URLIS_OPAQUE:
|
case URLIS_OPAQUE:
|
||||||
base.size = 24;
|
base.cbSize = sizeof(base);
|
||||||
res1 = ParseURLW(pszUrl, &base);
|
res1 = ParseURLW(pszUrl, &base);
|
||||||
if (res1) return FALSE; /* invalid scheme */
|
if (res1) return FALSE; /* invalid scheme */
|
||||||
if ((*base.ap2 == '/') && (*(base.ap2+1) == '/'))
|
if ((*base.pszSuffix == '/') && (*(base.pszSuffix+1) == '/'))
|
||||||
/* has scheme followed by 2 '/' */
|
/* has scheme followed by 2 '/' */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -2086,15 +2068,15 @@ HRESULT WINAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut,
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI PathIsURLA(LPCSTR lpstrPath)
|
BOOL WINAPI PathIsURLA(LPCSTR lpstrPath)
|
||||||
{
|
{
|
||||||
UNKNOWN_SHLWAPI_1 base;
|
PARSEDURLA base;
|
||||||
DWORD res1;
|
DWORD res1;
|
||||||
|
|
||||||
if (!lpstrPath || !*lpstrPath) return FALSE;
|
if (!lpstrPath || !*lpstrPath) return FALSE;
|
||||||
|
|
||||||
/* get protocol */
|
/* get protocol */
|
||||||
base.size = sizeof(base);
|
base.cbSize = sizeof(base);
|
||||||
res1 = ParseURLA(lpstrPath, &base);
|
res1 = ParseURLA(lpstrPath, &base);
|
||||||
return (base.fcncde > 0);
|
return (base.nScheme > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
@ -2104,15 +2086,15 @@ BOOL WINAPI PathIsURLA(LPCSTR lpstrPath)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI PathIsURLW(LPCWSTR lpstrPath)
|
BOOL WINAPI PathIsURLW(LPCWSTR lpstrPath)
|
||||||
{
|
{
|
||||||
UNKNOWN_SHLWAPI_2 base;
|
PARSEDURLW base;
|
||||||
DWORD res1;
|
DWORD res1;
|
||||||
|
|
||||||
if (!lpstrPath || !*lpstrPath) return FALSE;
|
if (!lpstrPath || !*lpstrPath) return FALSE;
|
||||||
|
|
||||||
/* get protocol */
|
/* get protocol */
|
||||||
base.size = sizeof(base);
|
base.cbSize = sizeof(base);
|
||||||
res1 = ParseURLW(lpstrPath, &base);
|
res1 = ParseURLW(lpstrPath, &base);
|
||||||
return (base.fcncde > 0);
|
return (base.nScheme > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|
|
@ -668,6 +668,28 @@ HRESULT WINAPI UrlCreateFromPathA(LPCSTR,LPSTR,LPDWORD,DWORD);
|
||||||
HRESULT WINAPI UrlCreateFromPathW(LPCWSTR,LPWSTR,LPDWORD,DWORD);
|
HRESULT WINAPI UrlCreateFromPathW(LPCWSTR,LPWSTR,LPDWORD,DWORD);
|
||||||
#define UrlCreateFromPath WINELIB_AW_NAME(UrlCreateFromPath)
|
#define UrlCreateFromPath WINELIB_AW_NAME(UrlCreateFromPath)
|
||||||
|
|
||||||
|
typedef struct tagPARSEDURLA {
|
||||||
|
DWORD cbSize;
|
||||||
|
LPCSTR pszProtocol;
|
||||||
|
UINT cchProtocol;
|
||||||
|
LPCSTR pszSuffix;
|
||||||
|
UINT cchSuffix;
|
||||||
|
UINT nScheme;
|
||||||
|
} PARSEDURLA, *PPARSEDURLA;
|
||||||
|
|
||||||
|
typedef struct tagPARSEDURLW {
|
||||||
|
DWORD cbSize;
|
||||||
|
LPCWSTR pszProtocol;
|
||||||
|
UINT cchProtocol;
|
||||||
|
LPCWSTR pszSuffix;
|
||||||
|
UINT cchSuffix;
|
||||||
|
UINT nScheme;
|
||||||
|
} PARSEDURLW, *PPARSEDURLW;
|
||||||
|
|
||||||
|
HRESULT WINAPI ParseURLA(LPCSTR pszUrl, PARSEDURLA *ppu);
|
||||||
|
HRESULT WINAPI ParseURLW(LPCWSTR pszUrl, PARSEDURLW *ppu);
|
||||||
|
#define ParseURL WINELIB_AW_NAME(ParseUrl)
|
||||||
|
|
||||||
#endif /* NO_SHLWAPI_PATH */
|
#endif /* NO_SHLWAPI_PATH */
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue