diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c index cfd7a04a96c..684a6089b80 100644 --- a/dlls/urlmon/tests/uri.c +++ b/dlls/urlmon/tests/uri.c @@ -4347,7 +4347,7 @@ static const uri_builder_test uri_builder_tests[] = { { {TRUE,"http",NULL,Uri_PROPERTY_SCHEME_NAME,S_OK,TRUE}, {TRUE,"::192.2.3.4",NULL,Uri_PROPERTY_HOST,S_OK,FALSE}, - {TRUE,NULL,NULL,Uri_PROPERTY_PATH,S_OK,TRUE} + {TRUE,NULL,NULL,Uri_PROPERTY_PATH,S_OK,FALSE} }, {FALSE}, 0,S_OK,TRUE, @@ -4504,6 +4504,70 @@ static const uri_builder_test uri_builder_tests[] = { {URL_SCHEME_UNKNOWN,S_OK}, {URLZONE_INVALID,E_NOTIMPL} } + }, + { "http://google.com/",0,S_OK,FALSE, + { + {TRUE,"test/test",NULL,Uri_PROPERTY_PATH,S_OK,FALSE}, + }, + {FALSE}, + 0,S_OK,TRUE, + 0,S_OK,TRUE, + 0,0,0,S_OK,TRUE, + { + {"http://google.com/test/test",S_OK}, + {"google.com",S_OK}, + {"http://google.com/test/test",S_OK}, + {"google.com",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"google.com",S_OK}, + {"",S_FALSE}, + {"/test/test",S_OK}, + {"/test/test",S_OK}, + {"",S_FALSE}, + {"http://google.com/test/test",S_OK}, + {"http",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_DNS,S_OK}, + {80,S_OK}, + {URL_SCHEME_HTTP,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "zip:testing/test",0,S_OK,FALSE, + { + {TRUE,"test",NULL,Uri_PROPERTY_PATH,S_OK,FALSE}, + }, + {FALSE}, + 0,S_OK,TRUE, + 0,S_OK,TRUE, + 0,0,0,S_OK,TRUE, + { + {"zip:test",S_OK}, + {"",S_FALSE}, + {"zip:test",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"test",S_OK}, + {"test",S_OK}, + {"",S_FALSE}, + {"zip:test",S_OK}, + {"zip",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_UNKNOWN,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } } }; diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c index b5e9df0f622..41c2343bba2 100644 --- a/dlls/urlmon/uri.c +++ b/dlls/urlmon/uri.c @@ -88,6 +88,9 @@ typedef struct { WCHAR *password; DWORD password_len; + + WCHAR *path; + DWORD path_len; } UriBuilder; typedef struct { @@ -4318,6 +4321,7 @@ static ULONG WINAPI UriBuilder_Release(IUriBuilder *iface) heap_free(This->fragment); heap_free(This->host); heap_free(This->password); + heap_free(This->path); heap_free(This); } @@ -4480,19 +4484,11 @@ static HRESULT WINAPI UriBuilder_GetPath(IUriBuilder *iface, DWORD *pcchPath, LP UriBuilder *This = URIBUILDER_THIS(iface); TRACE("(%p)->(%p %p)\n", This, pcchPath, ppwzPath); - if(!pcchPath) { - if(ppwzPath) - *ppwzPath = NULL; - return E_POINTER; - } - - if(!ppwzPath) { - *pcchPath = 0; - return E_POINTER; - } - - FIXME("(%p)->(%p %p)\n", This, pcchPath, ppwzPath); - return E_NOTIMPL; + if(!This->uri || This->uri->path_start == -1 || This->modified_props & Uri_HAS_PATH) + return get_builder_component(&This->path, &This->path_len, NULL, 0, ppwzPath, pcchPath); + else + return get_builder_component(&This->path, &This->path_len, This->uri->canon_uri+This->uri->path_start, + This->uri->path_len, ppwzPath, pcchPath); } static HRESULT WINAPI UriBuilder_GetPort(IUriBuilder *iface, BOOL *pfHasPort, DWORD *pdwPort) @@ -4605,8 +4601,10 @@ static HRESULT WINAPI UriBuilder_SetPassword(IUriBuilder *iface, LPCWSTR pwzNewV static HRESULT WINAPI UriBuilder_SetPath(IUriBuilder *iface, LPCWSTR pwzNewValue) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); - return E_NOTIMPL; + TRACE("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + + This->modified_props |= Uri_HAS_PATH; + return set_builder_component(&This->path, &This->path_len, pwzNewValue, 0); } static HRESULT WINAPI UriBuilder_SetPort(IUriBuilder *iface, BOOL fHasPort, DWORD dwNewValue)