msi: Add test for _Streams table (based on patch by Andrey Turkin).
[wine/multimedia.git] / dlls / urlmon / internet.c
blob8ae22e0eb292a8579a3c63d9690222cbe227043e
1 /*
2 * Copyright 2005 Jacek Caban
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include <stdarg.h>
21 #define COBJMACROS
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "winreg.h"
27 #include "shlwapi.h"
28 #include "ole2.h"
29 #include "urlmon.h"
30 #include "urlmon_main.h"
32 #include "wine/debug.h"
33 #include "wine/unicode.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
37 static HRESULT parse_schema(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize)
39 WCHAR *ptr;
40 DWORD len = 0;
42 TRACE("(%s %08lx %p %ld %p)\n", debugstr_w(url), flags, result, size, rsize);
44 if(flags)
45 ERR("wrong flags\n");
47 ptr = strchrW(url, ':');
48 if(ptr)
49 len = ptr-url;
51 if(len >= size)
52 return E_POINTER;
54 if(len)
55 memcpy(result, url, len*sizeof(WCHAR));
56 result[len] = 0;
58 if(rsize)
59 *rsize = len;
61 return S_OK;
64 static HRESULT parse_security_url(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize)
66 IInternetProtocolInfo *protocol_info;
67 HRESULT hres;
69 TRACE("(%s %08lx %p %ld %p)\n", debugstr_w(url), flags, result, size, rsize);
71 protocol_info = get_protocol_info(url);
73 if(protocol_info) {
74 hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_SECURITY_URL,
75 flags, result, size, rsize, 0);
76 return hres;
79 return E_FAIL;
82 static HRESULT parse_encode(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize)
84 IInternetProtocolInfo *protocol_info;
85 DWORD prsize;
86 HRESULT hres;
88 TRACE("(%s %08lx %p %ld %p)\n", debugstr_w(url), flags, result, size, rsize);
90 protocol_info = get_protocol_info(url);
92 if(protocol_info) {
93 hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_ENCODE,
94 flags, result, size, rsize, 0);
95 if(SUCCEEDED(hres))
96 return hres;
99 prsize = size;
100 hres = UrlUnescapeW((LPWSTR)url, result, &prsize, flags);
102 if(rsize)
103 *rsize = prsize;
105 return hres;
108 static HRESULT parse_path_from_url(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize)
110 IInternetProtocolInfo *protocol_info;
111 DWORD prsize;
112 HRESULT hres;
114 TRACE("(%s %08lx %p %ld %p)\n", debugstr_w(url), flags, result, size, rsize);
116 protocol_info = get_protocol_info(url);
118 if(protocol_info) {
119 hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_PATH_FROM_URL,
120 flags, result, size, rsize, 0);
121 if(SUCCEEDED(hres))
122 return hres;
125 prsize = size;
126 hres = PathCreateFromUrlW(url, result, &prsize, 0);
128 if(rsize)
129 *rsize = prsize;
130 return hres;
133 static HRESULT parse_security_domain(LPCWSTR url, DWORD flags, LPWSTR result,
134 DWORD size, DWORD *rsize)
136 IInternetProtocolInfo *protocol_info;
137 HRESULT hres;
139 TRACE("(%s %08lx %p %ld %p)\n", debugstr_w(url), flags, result, size, rsize);
141 protocol_info = get_protocol_info(url);
143 if(protocol_info) {
144 hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_SECURITY_DOMAIN,
145 flags, result, size, rsize, 0);
146 if(SUCCEEDED(hres))
147 return hres;
150 return E_FAIL;
153 /**************************************************************************
154 * CoInternetParseUrl (URLMON.@)
156 HRESULT WINAPI CoInternetParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction, DWORD dwFlags,
157 LPWSTR pszResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved)
159 if(dwReserved)
160 WARN("dwReserved = %ld\n", dwReserved);
162 switch(ParseAction) {
163 case PARSE_SECURITY_URL:
164 return parse_security_url(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
165 case PARSE_ENCODE:
166 return parse_encode(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
167 case PARSE_PATH_FROM_URL:
168 return parse_path_from_url(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
169 case PARSE_SCHEMA:
170 return parse_schema(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
171 case PARSE_SECURITY_DOMAIN:
172 return parse_security_domain(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
173 default:
174 FIXME("not supported action %d\n", ParseAction);
177 return E_NOTIMPL;
180 /**************************************************************************
181 * CoInternetCombineUrl (URLMON.@)
183 HRESULT WINAPI CoInternetCombineUrl(LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl,
184 DWORD dwCombineFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult,
185 DWORD dwReserved)
187 IInternetProtocolInfo *protocol_info;
188 DWORD size = cchResult;
189 HRESULT hres;
191 TRACE("(%s,%s,0x%08lx,%p,%ld,%p,%ld)\n", debugstr_w(pwzBaseUrl),
192 debugstr_w(pwzRelativeUrl), dwCombineFlags, pwzResult, cchResult, pcchResult,
193 dwReserved);
195 protocol_info = get_protocol_info(pwzBaseUrl);
197 if(protocol_info) {
198 hres = IInternetProtocolInfo_CombineUrl(protocol_info, pwzBaseUrl, pwzRelativeUrl,
199 dwCombineFlags, pwzResult, cchResult, pcchResult, dwReserved);
200 if(SUCCEEDED(hres))
201 return hres;
205 hres = UrlCombineW(pwzBaseUrl, pwzRelativeUrl, pwzResult, &size, dwCombineFlags);
207 if(pcchResult)
208 *pcchResult = size;
210 return hres;