urlmon: Added implementation for PARSE_ROOTDOCUMENT for CoInternetParseIUri.

This commit is contained in:
Thomas Mullaly 2010-11-28 15:42:16 -05:00 committed by Alexandre Julliard
parent 6d996f32a5
commit 81c274a5f0
2 changed files with 69 additions and 1 deletions

View File

@ -5925,7 +5925,15 @@ static const uri_parse_test uri_parse_tests[] = {
/* PARSE_FRIENDLY tests. */
{"http://test@google.com/test#test",0,PARSE_FRIENDLY,0,"http://google.com/test#test",S_OK,FALSE},
{"zip://test@google.com/test",0,PARSE_FRIENDLY,0,"zip://test@google.com/test",S_OK,FALSE}
{"zip://test@google.com/test",0,PARSE_FRIENDLY,0,"zip://test@google.com/test",S_OK,FALSE},
/* PARSE_ROOTDOCUMENT tests. */
{"http://google.com:200/test/test",0,PARSE_ROOTDOCUMENT,0,"http://google.com:200/",S_OK,FALSE},
{"http://google.com",Uri_CREATE_NO_CANONICALIZE,PARSE_ROOTDOCUMENT,0,"http://google.com/",S_OK,FALSE},
{"zip://google.com/",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE},
{"file:///c:/testing/",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE},
{"file://server/test",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE},
{"zip:test/test",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE}
};
static inline LPWSTR a2w(LPCSTR str) {

View File

@ -6214,6 +6214,57 @@ static HRESULT parse_friendly(IUri *uri, LPWSTR output, DWORD output_len,
return S_OK;
}
static HRESULT parse_rootdocument(const Uri *uri, LPWSTR output, DWORD output_len,
DWORD *result_len)
{
static const WCHAR colon_slashesW[] = {':','/','/'};
WCHAR *ptr;
DWORD len = 0;
/* Windows only returns the root document if the URI has an authority
* and it's not an unknown scheme type or a file scheme type.
*/
if(uri->authority_start == -1 ||
uri->scheme_type == URL_SCHEME_UNKNOWN ||
uri->scheme_type == URL_SCHEME_FILE) {
*result_len = 0;
if(!output_len)
return STRSAFE_E_INSUFFICIENT_BUFFER;
output[0] = 0;
return S_OK;
}
len = uri->scheme_len+uri->authority_len;
/* For the "://" and '/' which will be added. */
len += 4;
if(len+1 > output_len) {
*result_len = len;
return STRSAFE_E_INSUFFICIENT_BUFFER;
}
ptr = output;
memcpy(ptr, uri->canon_uri+uri->scheme_start, uri->scheme_len*sizeof(WCHAR));
/* Add the "://". */
ptr += uri->scheme_len;
memcpy(ptr, colon_slashesW, sizeof(colon_slashesW));
/* Add the authority. */
ptr += sizeof(colon_slashesW)/sizeof(WCHAR);
memcpy(ptr, uri->canon_uri+uri->authority_start, uri->authority_len*sizeof(WCHAR));
/* Add the '/' after the authority. */
ptr += uri->authority_len;
*ptr = '/';
ptr[1] = 0;
*result_len = len;
return S_OK;
}
/***********************************************************************
* CoInternetParseIUri (urlmon.@)
*/
@ -6248,6 +6299,15 @@ HRESULT WINAPI CoInternetParseIUri(IUri *pIUri, PARSEACTION ParseAction, DWORD d
case PARSE_FRIENDLY:
hr = parse_friendly(pIUri, pwzResult, cchResult, pcchResult);
break;
case PARSE_ROOTDOCUMENT:
if(!(uri = get_uri_obj(pIUri))) {
*pcchResult = 0;
FIXME("(%p %d %x %p %d %p %x) Unknown IUri's not supported for this action.\n",
pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved);
return E_NOTIMPL;
}
hr = parse_rootdocument(uri, pwzResult, cchResult, pcchResult);
break;
case PARSE_SECURITY_URL:
case PARSE_MIME:
case PARSE_SERVER: