Implemented some very basic functionality.
diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c
index 99a4096..8ba7e4e 100644
--- a/dlls/urlmon/umon.c
+++ b/dlls/urlmon/umon.c
@@ -13,7 +13,10 @@
#include "urlmon.h"
-DEFAULT_DEBUG_CHANNEL(win32);
+DEFAULT_DEBUG_CHANNEL(urlmon);
+
+/* native urlmon.dll uses this key, too */
+static WCHAR BSCBHolder[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
/***********************************************************************
* CreateURLMoniker (URLMON.22)
@@ -35,3 +38,76 @@
return CreateFileMoniker(szURL, ppmk);
}
+
+/***********************************************************************
+ * RegisterBindStatusCallback (URLMON.52)
+ *
+ * Register a bind status callback
+ *
+ * RETURNS
+ * S_OK success
+ * E_INVALIDARG invalid argument(s)
+ * E_OUTOFMEMORY out of memory
+ *
+ */
+HRESULT WINAPI RegisterBindStatusCallback(
+ IBindCtx *pbc,
+ IBindStatusCallback *pbsc,
+ IBindStatusCallback **ppbscPrevious,
+ DWORD dwReserved)
+{
+ IBindStatusCallback *prev;
+
+ TRACE("(%p,%p,%p,%lu)\n", pbc, pbsc, ppbscPrevious, dwReserved);
+
+ if (pbc == NULL || pbsc == NULL)
+ return E_INVALIDARG;
+
+ if (SUCCEEDED(IBindCtx_GetObjectParam(pbc, BSCBHolder, (IUnknown **)&prev)))
+ {
+ IBindCtx_RevokeObjectParam(pbc, BSCBHolder);
+ if (ppbscPrevious)
+ *ppbscPrevious = prev;
+ else
+ IBindStatusCallback_Release(prev);
+ }
+
+ return IBindCtx_RegisterObjectParam(pbc, BSCBHolder, (IUnknown *)pbsc);
+}
+
+/***********************************************************************
+ * RevokeBindStatusCallback (URLMON.57)
+ *
+ * Unregister a bind status callback
+ *
+ * RETURNS
+ * S_OK success
+ * E_INVALIDARG invalid argument(s)
+ * E_FAIL pbsc wasn't registered with pbc
+ *
+ */
+HRESULT WINAPI RevokeBindStatusCallback(
+ IBindCtx *pbc,
+ IBindStatusCallback *pbsc)
+{
+ IBindStatusCallback *callback;
+ HRESULT hr = E_FAIL;
+
+ TRACE("(%p,%p)\n", pbc, pbsc);
+
+ if (pbc == NULL || pbsc == NULL)
+ return E_INVALIDARG;
+
+ if (SUCCEEDED(IBindCtx_GetObjectParam(pbc, BSCBHolder, (IUnknown **)&callback)))
+ {
+ if (callback == pbsc)
+ {
+ IBindCtx_RevokeObjectParam(pbc, BSCBHolder);
+ hr = S_OK;
+ }
+ IBindStatusCallback_Release(pbsc);
+ }
+
+ return hr;
+}
+