4 * Copyright (c) 2000 Patrik Stridvall
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #define NO_SHLWAPI_REG
32 #include "wine/debug.h"
36 #include "urlmon_main.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
40 LONG URLMON_refCount = 0;
42 HINSTANCE URLMON_hInstance = 0;
44 /***********************************************************************
45 * DllMain (URLMON.init)
47 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
49 TRACE("%p 0x%lx %p\n", hinstDLL, fdwReason, fImpLoad);
52 case DLL_PROCESS_ATTACH:
53 DisableThreadLibraryCalls(hinstDLL);
54 URLMON_hInstance = hinstDLL;
57 case DLL_PROCESS_DETACH:
65 /***********************************************************************
66 * DllInstall (URLMON.@)
68 HRESULT WINAPI DllInstall(BOOL bInstall, LPCWSTR cmdline)
70 FIXME("(%s, %s): stub\n", bInstall?"TRUE":"FALSE",
76 /***********************************************************************
77 * DllCanUnloadNow (URLMON.@)
79 HRESULT WINAPI DllCanUnloadNow(void)
81 return URLMON_refCount != 0 ? S_FALSE : S_OK;
86 /******************************************************************************
90 IClassFactory ITF_IClassFactory;
93 HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
96 struct object_creation_info
99 HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
102 static const struct object_creation_info object_creation[] =
104 { &CLSID_FileProtocol, FileProtocol_Construct },
105 { &CLSID_InternetSecurityManager, &SecManagerImpl_Construct },
106 { &CLSID_InternetZoneManager, ZoneMgrImpl_Construct }
109 static HRESULT WINAPI
110 CF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
112 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
114 if (IsEqualGUID(riid, &IID_IUnknown)
115 || IsEqualGUID(riid, &IID_IClassFactory))
117 IClassFactory_AddRef(iface);
122 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
123 return E_NOINTERFACE;
126 static ULONG WINAPI CF_AddRef(LPCLASSFACTORY iface)
128 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
129 return InterlockedIncrement(&This->ref);
132 static ULONG WINAPI CF_Release(LPCLASSFACTORY iface)
134 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
136 ULONG ref = InterlockedDecrement(&This->ref);
139 HeapFree(GetProcessHeap(), 0, This);
140 URLMON_UnlockModule();
147 static HRESULT WINAPI CF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter,
148 REFIID riid, LPVOID *ppobj)
150 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
154 TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
157 if(SUCCEEDED(hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk))) {
158 hres = IUnknown_QueryInterface(punk, riid, ppobj);
159 IUnknown_Release(punk);
164 static HRESULT WINAPI CF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
166 TRACE("(%d)\n", dolock);
171 URLMON_UnlockModule();
176 static const IClassFactoryVtbl CF_Vtbl =
185 /*******************************************************************************
186 * DllGetClassObject [URLMON.@]
187 * Retrieves class object from a DLL object
190 * Docs say returns STDAPI
193 * rclsid [I] CLSID for the class object
194 * riid [I] Reference to identifier of interface for class object
195 * ppv [O] Address of variable to receive interface pointer for riid
199 * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG,
203 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
206 IClassFactoryImpl *factory;
208 TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
210 if ( !IsEqualGUID( &IID_IClassFactory, riid )
211 && ! IsEqualGUID( &IID_IUnknown, riid) )
212 return E_NOINTERFACE;
214 for (i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++)
216 if (IsEqualGUID(object_creation[i].clsid, rclsid))
220 if (i == sizeof(object_creation)/sizeof(object_creation[0]))
222 FIXME("%s: no class found.\n", debugstr_guid(rclsid));
223 return CLASS_E_CLASSNOTAVAILABLE;
226 factory = HeapAlloc(GetProcessHeap(), 0, sizeof(*factory));
227 if (factory == NULL) return E_OUTOFMEMORY;
229 factory->ITF_IClassFactory.lpVtbl = &CF_Vtbl;
231 factory->pfnCreateInstance = object_creation[i].pfnCreateInstance;
233 *ppv = &(factory->ITF_IClassFactory);
241 /***********************************************************************
242 * DllRegisterServerEx (URLMON.@)
244 HRESULT WINAPI DllRegisterServerEx(void)
246 FIXME("(void): stub\n");
251 /**************************************************************************
252 * UrlMkSetSessionOption (URLMON.@)
254 HRESULT WINAPI UrlMkSetSessionOption(DWORD dwOption, LPVOID pBuffer, DWORD dwBufferLength,
257 FIXME("(%#lx, %p, %#lx): stub\n", dwOption, pBuffer, dwBufferLength);
262 /**************************************************************************
263 * UrlMkGetSessionOption (URLMON.@)
265 HRESULT WINAPI UrlMkGetSessionOption(DWORD dwOption, LPVOID pBuffer, DWORD dwBufferLength,
266 DWORD* pdwBufferLength, DWORD dwReserved)
268 FIXME("(%#lx, %p, %#lx, %p): stub\n", dwOption, pBuffer, dwBufferLength, pdwBufferLength);
273 static const CHAR Agent[] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)";
275 /**************************************************************************
276 * ObtainUserAgentString (URLMON.@)
278 HRESULT WINAPI ObtainUserAgentString(DWORD dwOption, LPSTR pcszUAOut, DWORD *cbSize)
280 FIXME("(%ld, %p, %p): stub\n", dwOption, pcszUAOut, cbSize);
283 ERR("dwOption: %ld, must be zero\n", dwOption);
286 if (sizeof(Agent) < *cbSize)
287 *cbSize = sizeof(Agent);
288 lstrcpynA(pcszUAOut, Agent, *cbSize);
293 HRESULT WINAPI CoInternetCombineUrl(LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, DWORD dwCombineFlags,
294 LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved)
297 DWORD size = cchResult;
299 TRACE("(%s,%s,0x%08lx,%p,%ld,%p,%ld)\n", debugstr_w(pwzBaseUrl), debugstr_w(pwzRelativeUrl), dwCombineFlags,
300 pwzResult, cchResult, pcchResult, dwReserved);
301 hres = UrlCombineW(pwzBaseUrl, pwzRelativeUrl, pwzResult, &size, dwCombineFlags);
302 if(pcchResult) *pcchResult = size;
306 HRESULT WINAPI CoInternetCompareUrl(LPCWSTR pwzUrl1, LPCWSTR pwzUrl2, DWORD dwCompareFlags)
308 TRACE("(%s,%s,%08lx)\n", debugstr_w(pwzUrl1), debugstr_w(pwzUrl2), dwCompareFlags);
309 return UrlCompareW(pwzUrl1, pwzUrl2, dwCompareFlags)==0?S_OK:S_FALSE;
312 /**************************************************************************
313 * IsValidURL (URLMON.@)
315 * Determines if a specified string is a valid URL.
318 * pBC [I] ignored, must be NULL.
319 * szURL [I] string that represents the URL in question.
320 * dwReserved [I] reserved and must be zero.
325 * returns E_INVALIDARG if one or more of the args is invalid.
328 * test functionality against windows to see what a valid URL is.
330 HRESULT WINAPI IsValidURL(LPBC pBC, LPCWSTR szURL, DWORD dwReserved)
332 FIXME("(%p, %s, %ld): stub\n", pBC, debugstr_w(szURL), dwReserved);
334 if (pBC != NULL || dwReserved != 0)
340 /**************************************************************************
341 * FaultInIEFeature (URLMON.@)
343 * Undocumented. Appears to be used by native shdocvw.dll.
345 HRESULT WINAPI FaultInIEFeature( HWND hwnd, uCLSSPEC * pClassSpec,
346 QUERYCONTEXT *pQuery, DWORD flags )
348 FIXME("%p %p %p %08lx\n", hwnd, pClassSpec, pQuery, flags);
352 /**************************************************************************
353 * CoGetClassObjectFromURL (URLMON.@)
355 HRESULT WINAPI CoGetClassObjectFromURL( REFCLSID rclsid, LPCWSTR szCodeURL, DWORD dwFileVersionMS,
356 DWORD dwFileVersionLS, LPCWSTR szContentType,
357 LPBINDCTX pBindCtx, DWORD dwClsContext, LPVOID pvReserved,
358 REFIID riid, LPVOID *ppv )
360 FIXME("(%s %s %ld %ld %s %p %ld %p %s %p) Stub!\n", debugstr_guid(rclsid), debugstr_w(szCodeURL),
361 dwFileVersionMS, dwFileVersionLS, debugstr_w(szContentType), pBindCtx, dwClsContext, pvReserved,
362 debugstr_guid(riid), ppv);
363 return E_NOINTERFACE;
366 /***********************************************************************
367 * ReleaseBindInfo (URLMON.@)
369 * Release the resources used by the specified BINDINFO structure.
372 * pbindinfo [I] BINDINFO to release.
377 void WINAPI ReleaseBindInfo(BINDINFO* pbindinfo)
379 TRACE("(%p)\n", pbindinfo);
384 CoTaskMemFree(pbindinfo->szExtraInfo);
387 IUnknown_Release(pbindinfo->pUnk);