diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c index 6756d992b02..a8b495229b2 100644 --- a/dlls/urlmon/tests/uri.c +++ b/dlls/urlmon/tests/uri.c @@ -4280,7 +4280,7 @@ static const uri_builder_test uri_builder_tests[] = { { {TRUE,"#fragment",NULL,Uri_PROPERTY_FRAGMENT,S_OK,FALSE}, {TRUE,"password",NULL,Uri_PROPERTY_PASSWORD,S_OK,FALSE}, - {TRUE,"?query=x",NULL,Uri_PROPERTY_QUERY,S_OK,TRUE}, + {TRUE,"?query=x",NULL,Uri_PROPERTY_QUERY,S_OK,FALSE}, {TRUE,"username",NULL,Uri_PROPERTY_USER_NAME,S_OK,TRUE} }, {FALSE}, @@ -4671,6 +4671,39 @@ static const uri_builder_test uri_builder_tests[] = { {URL_SCHEME_HTTP,S_OK}, {URLZONE_INVALID,E_NOTIMPL} } + }, + { "http://google.com/",0,S_OK,FALSE, + { + {TRUE,"test","?test",Uri_PROPERTY_QUERY,S_OK,FALSE}, + }, + + {FALSE}, + 0,S_OK,TRUE, + 0,S_OK,TRUE, + 0,0,0,S_OK,TRUE, + { + {"http://google.com/?test",S_OK}, + {"google.com",S_OK}, + {"http://google.com/?test",S_OK}, + {"google.com",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"google.com",S_OK}, + {"",S_FALSE}, + {"/",S_OK}, + {"/?test",S_OK}, + {"?test",S_OK}, + {"http://google.com/?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} + } } }; diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c index dbc17479205..ce144466be1 100644 --- a/dlls/urlmon/uri.c +++ b/dlls/urlmon/uri.c @@ -94,6 +94,9 @@ typedef struct { BOOL has_port; DWORD port; + + WCHAR *query; + DWORD query_len; } UriBuilder; typedef struct { @@ -4324,6 +4327,7 @@ static ULONG WINAPI UriBuilder_Release(IUriBuilder *iface) heap_free(This->host); heap_free(This->password); heap_free(This->path); + heap_free(This->query); heap_free(This); } @@ -4519,19 +4523,11 @@ static HRESULT WINAPI UriBuilder_GetQuery(IUriBuilder *iface, DWORD *pcchQuery, UriBuilder *This = URIBUILDER_THIS(iface); TRACE("(%p)->(%p %p)\n", This, pcchQuery, ppwzQuery); - if(!pcchQuery) { - if(ppwzQuery) - *ppwzQuery = NULL; - return E_POINTER; - } - - if(!ppwzQuery) { - *pcchQuery = 0; - return E_POINTER; - } - - FIXME("(%p)->(%p %p)\n", This, pcchQuery, ppwzQuery); - return E_NOTIMPL; + if(!This->uri || This->uri->query_start == -1 || This->modified_props & Uri_HAS_QUERY) + return get_builder_component(&This->query, &This->query_len, NULL, 0, ppwzQuery, pcchQuery); + else + return get_builder_component(&This->query, &This->query_len, This->uri->canon_uri+This->uri->query_start, + This->uri->query_len, ppwzQuery, pcchQuery); } static HRESULT WINAPI UriBuilder_GetSchemeName(IUriBuilder *iface, DWORD *pcchSchemeName, LPCWSTR *ppwzSchemeName) @@ -4620,8 +4616,9 @@ static HRESULT WINAPI UriBuilder_SetPort(IUriBuilder *iface, BOOL fHasPort, DWOR static HRESULT WINAPI UriBuilder_SetQuery(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)); + return set_builder_component(&This->query, &This->query_len, pwzNewValue, '?', + &This->modified_props, Uri_HAS_QUERY); } static HRESULT WINAPI UriBuilder_SetSchemeName(IUriBuilder *iface, LPCWSTR pwzNewValue)