ReactOS 0.4.17-dev-573-g8315b8c
binding.c File Reference
#include "urlmon_main.h"
#include "winreg.h"
#include "shlwapi.h"
#include "wine/debug.h"
Include dependency graph for binding.c:

Go to the source code of this file.

Classes

struct  stgmed_buf_t
 
struct  stgmed_obj_vtbl
 
struct  _stgmed_obj_t
 
struct  Binding
 
struct  ProtocolStream
 
struct  stgmed_file_obj_t
 

Macros

#define BINDING_LOCKED   0x0001
 
#define BINDING_STOPPED   0x0002
 
#define BINDING_OBJAVAIL   0x0004
 
#define BINDING_ABORTED   0x0008
 

Typedefs

typedef struct _stgmed_obj_t stgmed_obj_t
 

Enumerations

enum  download_state_t { BEFORE_DOWNLOAD , DOWNLOADING , END_DOWNLOAD }
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (urlmon)
 
static void read_protocol_data (stgmed_buf_t *stgmed_buf)
 
static void dump_BINDINFO (BINDINFO *bi)
 
static void mime_available (Binding *This, LPCWSTR mime)
 
static void stop_binding (Binding *binding, HRESULT hres, LPCWSTR str)
 
static LPWSTR get_mime_clsid (LPCWSTR mime, CLSID *clsid)
 
static void load_doc_mon (Binding *binding, IPersistMoniker *persist)
 
static HRESULT create_mime_object (Binding *binding, const CLSID *clsid, LPCWSTR clsid_str)
 
static void create_object (Binding *binding)
 
static void cache_file_available (Binding *This, const WCHAR *file_name)
 
static stgmed_buf_timpl_from_IUnknown (IUnknown *iface)
 
static HRESULT WINAPI StgMedUnk_QueryInterface (IUnknown *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI StgMedUnk_AddRef (IUnknown *iface)
 
static ULONG WINAPI StgMedUnk_Release (IUnknown *iface)
 
static stgmed_buf_tcreate_stgmed_buf (IInternetProtocolEx *protocol)
 
static ProtocolStreamimpl_from_IStream (IStream *iface)
 
static HRESULT WINAPI ProtocolStream_QueryInterface (IStream *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI ProtocolStream_AddRef (IStream *iface)
 
static ULONG WINAPI ProtocolStream_Release (IStream *iface)
 
static HRESULT WINAPI ProtocolStream_Read (IStream *iface, void *pv, ULONG cb, ULONG *pcbRead)
 
static HRESULT WINAPI ProtocolStream_Write (IStream *iface, const void *pv, ULONG cb, ULONG *pcbWritten)
 
static HRESULT WINAPI ProtocolStream_Seek (IStream *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
 
static HRESULT WINAPI ProtocolStream_SetSize (IStream *iface, ULARGE_INTEGER libNewSize)
 
static HRESULT WINAPI ProtocolStream_CopyTo (IStream *iface, IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
 
static HRESULT WINAPI ProtocolStream_Commit (IStream *iface, DWORD grfCommitFlags)
 
static HRESULT WINAPI ProtocolStream_Revert (IStream *iface)
 
static HRESULT WINAPI ProtocolStream_LockRegion (IStream *iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
 
static HRESULT WINAPI ProtocolStream_UnlockRegion (IStream *iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
 
static HRESULT WINAPI ProtocolStream_Stat (IStream *iface, STATSTG *pstatstg, DWORD dwStatFlag)
 
static HRESULT WINAPI ProtocolStream_Clone (IStream *iface, IStream **ppstm)
 
static void stgmed_stream_release (stgmed_obj_t *obj)
 
static HRESULT stgmed_stream_fill_stgmed (stgmed_obj_t *obj, STGMEDIUM *stgmed)
 
static HRESULT stgmed_stream_get_result (stgmed_obj_t *obj, DWORD bindf, void **result)
 
static stgmed_obj_tcreate_stgmed_stream (stgmed_buf_t *buf)
 
static void stgmed_file_release (stgmed_obj_t *obj)
 
static HRESULT stgmed_file_fill_stgmed (stgmed_obj_t *obj, STGMEDIUM *stgmed)
 
static HRESULT stgmed_file_get_result (stgmed_obj_t *obj, DWORD bindf, void **result)
 
static stgmed_obj_tcreate_stgmed_file (stgmed_buf_t *buf)
 
static Bindingimpl_from_IBinding (IBinding *iface)
 
static HRESULT WINAPI Binding_QueryInterface (IBinding *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI Binding_AddRef (IBinding *iface)
 
static ULONG WINAPI Binding_Release (IBinding *iface)
 
static HRESULT WINAPI Binding_Abort (IBinding *iface)
 
static HRESULT WINAPI Binding_Suspend (IBinding *iface)
 
static HRESULT WINAPI Binding_Resume (IBinding *iface)
 
static HRESULT WINAPI Binding_SetPriority (IBinding *iface, LONG nPriority)
 
static HRESULT WINAPI Binding_GetPriority (IBinding *iface, LONG *pnPriority)
 
static HRESULT WINAPI Binding_GetBindResult (IBinding *iface, CLSID *pclsidProtocol, DWORD *pdwResult, LPOLESTR *pszResult, DWORD *pdwReserved)
 
static Bindingget_bctx_binding (IBindCtx *bctx)
 
static Bindingimpl_from_IInternetProtocolSink (IInternetProtocolSink *iface)
 
static HRESULT WINAPI InternetProtocolSink_QueryInterface (IInternetProtocolSink *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI InternetProtocolSink_AddRef (IInternetProtocolSink *iface)
 
static ULONG WINAPI InternetProtocolSink_Release (IInternetProtocolSink *iface)
 
static HRESULT WINAPI InternetProtocolSink_Switch (IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
 
static void on_progress (Binding *This, ULONG progress, ULONG progress_max, ULONG status_code, LPCWSTR status_text)
 
static HRESULT WINAPI InternetProtocolSink_ReportProgress (IInternetProtocolSink *iface, ULONG ulStatusCode, LPCWSTR szStatusText)
 
static void report_data (Binding *This, DWORD bscf, ULONG progress, ULONG progress_max)
 
static HRESULT WINAPI InternetProtocolSink_ReportData (IInternetProtocolSink *iface, DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
 
static HRESULT WINAPI InternetProtocolSink_ReportResult (IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
 
static Bindingimpl_from_IInternetBindInfo (IInternetBindInfo *iface)
 
static HRESULT WINAPI InternetBindInfo_QueryInterface (IInternetBindInfo *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI InternetBindInfo_AddRef (IInternetBindInfo *iface)
 
static ULONG WINAPI InternetBindInfo_Release (IInternetBindInfo *iface)
 
static HRESULT WINAPI InternetBindInfo_GetBindInfo (IInternetBindInfo *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
 
static HRESULT WINAPI InternetBindInfo_GetBindString (IInternetBindInfo *iface, ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched)
 
static Bindingimpl_from_IWinInetHttpInfo (IWinInetHttpInfo *iface)
 
static HRESULT WINAPI WinInetHttpInfo_QueryInterface (IWinInetHttpInfo *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI WinInetHttpInfo_AddRef (IWinInetHttpInfo *iface)
 
static ULONG WINAPI WinInetHttpInfo_Release (IWinInetHttpInfo *iface)
 
static HRESULT WINAPI WinInetHttpInfo_QueryOption (IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer)
 
static HRESULT WINAPI WinInetHttpInfo_QueryInfo (IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved)
 
static Bindingimpl_from_IServiceProvider (IServiceProvider *iface)
 
static HRESULT WINAPI ServiceProvider_QueryInterface (IServiceProvider *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI ServiceProvider_AddRef (IServiceProvider *iface)
 
static ULONG WINAPI ServiceProvider_Release (IServiceProvider *iface)
 
static HRESULT WINAPI ServiceProvider_QueryService (IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
 
static HRESULT get_callback (IBindCtx *pbc, IBindStatusCallback **callback)
 
static BOOL is_urlmon_protocol (IUri *uri)
 
static HRESULT Binding_Create (IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc, BOOL to_obj, REFIID riid, Binding **binding)
 
static HRESULT start_binding (IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc, BOOL to_obj, REFIID riid, Binding **ret)
 
HRESULT bind_to_storage (IUri *uri, IBindCtx *pbc, REFIID riid, void **ppv)
 
HRESULT bind_to_object (IMoniker *mon, IUri *uri, IBindCtx *pbc, REFIID riid, void **ppv)
 

Variables

static WCHAR cbinding_contextW [] = L"CBinding Context"
 
static WCHAR bscb_holderW [] = L"_BSCB_Holder_"
 
static const IUnknownVtbl StgMedUnkVtbl
 
static const IStreamVtbl ProtocolStreamVtbl
 
static const stgmed_obj_vtbl stgmed_stream_vtbl
 
static const stgmed_obj_vtbl stgmed_file_vtbl
 
static const IBindingVtbl BindingVtbl
 
static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl
 
static const IInternetBindInfoVtbl InternetBindInfoVtbl
 
static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl
 
static const IServiceProviderVtbl ServiceProviderVtbl
 

Macro Definition Documentation

◆ BINDING_ABORTED

#define BINDING_ABORTED   0x0008

Definition at line 64 of file binding.c.

◆ BINDING_LOCKED

#define BINDING_LOCKED   0x0001

Definition at line 61 of file binding.c.

◆ BINDING_OBJAVAIL

#define BINDING_OBJAVAIL   0x0004

Definition at line 63 of file binding.c.

◆ BINDING_STOPPED

#define BINDING_STOPPED   0x0002

Definition at line 62 of file binding.c.

Typedef Documentation

◆ stgmed_obj_t

Definition at line 43 of file binding.c.

Enumeration Type Documentation

◆ download_state_t

Enumerator
BEFORE_DOWNLOAD 
DOWNLOADING 
END_DOWNLOAD 

Definition at line 55 of file binding.c.

55 {
download_state_t
Definition: binding.c:55
@ END_DOWNLOAD
Definition: binding.c:58
@ BEFORE_DOWNLOAD
Definition: binding.c:56
@ DOWNLOADING
Definition: binding.c:57

Function Documentation

◆ bind_to_object()

HRESULT bind_to_object ( IMoniker mon,
IUri uri,
IBindCtx pbc,
REFIID  riid,
void **  ppv 
)

Definition at line 1640 of file binding.c.

1641{
1643 HRESULT hres;
1644
1645 *ppv = NULL;
1646
1647 hres = start_binding(mon, NULL, uri, pbc, TRUE, riid, &binding);
1648 if(FAILED(hres))
1649 return hres;
1650
1651 if(binding->hres != S_OK) {
1652 hres = SUCCEEDED(binding->hres) ? S_OK : binding->hres;
1653 }else if(binding->bindf & BINDF_ASYNCHRONOUS) {
1654 hres = MK_S_ASYNCHRONOUS;
1655 }else {
1656 *ppv = binding->obj;
1657 IUnknown_AddRef(binding->obj);
1658 hres = S_OK;
1659 }
1660
1661 IBinding_Release(&binding->IBinding_iface);
1662
1663 return hres;
1664}
static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc, BOOL to_obj, REFIID riid, Binding **ret)
Definition: binding.c:1554
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT hres
Definition: protocol.c:465
static RPC_BINDING_HANDLE binding
Definition: server.c:166
const WCHAR * uri
Definition: sec_mgr.c:1564

◆ bind_to_storage()

HRESULT bind_to_storage ( IUri uri,
IBindCtx pbc,
REFIID  riid,
void **  ppv 
)

Definition at line 1611 of file binding.c.

1612{
1613 Binding *binding = NULL, *binding_ctx;
1614 HRESULT hres;
1615
1616 binding_ctx = get_bctx_binding(pbc);
1617
1618 hres = start_binding(NULL, binding_ctx, uri, pbc, FALSE, riid, &binding);
1619 if(binding_ctx)
1620 IBinding_Release(&binding_ctx->IBinding_iface);
1621 if(FAILED(hres))
1622 return hres;
1623
1624 if(binding->hres == S_OK && binding->download_state != BEFORE_DOWNLOAD /* FIXME */) {
1625 if((binding->state & BINDING_STOPPED) && (binding->state & BINDING_LOCKED))
1626 IInternetProtocolEx_UnlockRequest(&binding->protocol->IInternetProtocolEx_iface);
1627
1628 hres = binding->stgmed_obj->vtbl->get_result(binding->stgmed_obj, binding->bindf, ppv);
1629 }else if(binding->bindf & BINDF_ASYNCHRONOUS) {
1630 hres = MK_S_ASYNCHRONOUS;
1631 }else {
1632 hres = FAILED(binding->hres) ? binding->hres : S_OK;
1633 }
1634
1635 IBinding_Release(&binding->IBinding_iface);
1636
1637 return hres;
1638}
#define BINDING_STOPPED
Definition: binding.c:62
static Binding * get_bctx_binding(IBindCtx *bctx)
Definition: binding.c:961
#define BINDING_LOCKED
Definition: binding.c:61
#define FALSE
Definition: types.h:117

Referenced by URLMoniker_BindToStorage().

◆ Binding_Abort()

static HRESULT WINAPI Binding_Abort ( IBinding iface)
static

Definition at line 879 of file binding.c.

880{
883
884 TRACE("(%p)\n", This);
885
886 if(This->state & BINDING_ABORTED)
887 return E_FAIL;
888
889 hres = IInternetProtocolEx_Abort(&This->protocol->IInternetProtocolEx_iface, E_ABORT,
891 if(FAILED(hres))
892 return hres;
893
894 This->state |= BINDING_ABORTED;
895 return S_OK;
896}
#define BINDING_ABORTED
Definition: binding.c:64
static Binding * impl_from_IBinding(IBinding *iface)
Definition: binding.c:765
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_SUCCESS
Definition: deptool.c:10
#define TRACE(s)
Definition: solgame.cpp:4
#define E_ABORT
Definition: winerror.h:3481

◆ Binding_AddRef()

static ULONG WINAPI Binding_AddRef ( IBinding iface)
static

Definition at line 828 of file binding.c.

829{
832
833 TRACE("(%p) ref=%ld\n", This, ref);
834
835 return ref;
836}
#define InterlockedIncrement
Definition: armddk.h:53
long LONG
Definition: pedump.c:60
Definition: send.c:48

◆ Binding_Create()

static HRESULT Binding_Create ( IMoniker mon,
Binding binding_ctx,
IUri uri,
IBindCtx pbc,
BOOL  to_obj,
REFIID  riid,
Binding **  binding 
)
static

Definition at line 1441 of file binding.c.

1443{
1444 Binding *ret;
1445 HRESULT hres;
1446
1448
1449 ret = calloc(1, sizeof(Binding));
1450
1451 ret->IBinding_iface.lpVtbl = &BindingVtbl;
1452 ret->IInternetProtocolSink_iface.lpVtbl = &InternetProtocolSinkVtbl;
1453 ret->IInternetBindInfo_iface.lpVtbl = &InternetBindInfoVtbl;
1454 ret->IWinInetHttpInfo_iface.lpVtbl = &WinInetHttpInfoVtbl;
1455 ret->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
1456
1457 ret->ref = 1;
1458
1459 ret->to_object = to_obj;
1460 ret->iid = *riid;
1461 ret->notif_hwnd = get_notif_hwnd();
1462 ret->report_mime = !binding_ctx;
1463 ret->download_state = BEFORE_DOWNLOAD;
1464
1465 if(to_obj) {
1466 IBindCtx_AddRef(pbc);
1467 ret->bctx = pbc;
1468 }
1469
1470 if(mon) {
1471 IMoniker_AddRef(mon);
1472 ret->mon = mon;
1473 }
1474
1475 ret->bindinfo.cbSize = sizeof(BINDINFO);
1476
1478 ret->section.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": Binding.section");
1479
1480 hres = get_callback(pbc, &ret->callback);
1481 if(FAILED(hres)) {
1482 WARN("Could not get IBindStatusCallback\n");
1483 IBinding_Release(&ret->IBinding_iface);
1484 return hres;
1485 }
1486
1487 IBindStatusCallback_QueryInterface(ret->callback, &IID_IServiceProvider,
1488 (void**)&ret->service_provider);
1489
1490 if(binding_ctx) {
1491 ret->protocol = binding_ctx->protocol;
1492 IInternetProtocolEx_AddRef(&ret->protocol->IInternetProtocolEx_iface);
1493 }else {
1494 hres = create_binding_protocol(&ret->protocol);
1495 if(FAILED(hres)) {
1496 WARN("Could not get protocol handler\n");
1497 IBinding_Release(&ret->IBinding_iface);
1498 return hres;
1499 }
1500 }
1501
1502 hres = IBindStatusCallback_GetBindInfo(ret->callback, &ret->bindf, &ret->bindinfo);
1503 if(FAILED(hres)) {
1504 WARN("GetBindInfo failed: %08lx\n", hres);
1505 IBinding_Release(&ret->IBinding_iface);
1506 return hres;
1507 }
1508
1509 TRACE("bindf %08lx\n", ret->bindf);
1510 dump_BINDINFO(&ret->bindinfo);
1511
1512 ret->bindf |= BINDF_FROMURLMON;
1513 if(to_obj)
1514 ret->bindinfo.dwOptions |= 0x100000;
1515
1516 if(!(ret->bindf & BINDF_ASYNCHRONOUS) || !(ret->bindf & BINDF_PULLDATA)) {
1517 ret->bindf |= BINDF_NEEDFILE;
1518 ret->use_cache_file = TRUE;
1519 }else if(!is_urlmon_protocol(uri)) {
1520 ret->bindf |= BINDF_NEEDFILE;
1521 }
1522
1523 hres = IUri_GetDisplayUri(uri, &ret->url);
1524 if(FAILED(hres)) {
1525 IBinding_Release(&ret->IBinding_iface);
1526 return hres;
1527 }
1528
1529 if(binding_ctx) {
1530 ret->stgmed_buf = binding_ctx->stgmed_buf;
1531 IUnknown_AddRef(&ret->stgmed_buf->IUnknown_iface);
1532 ret->clipboard_format = binding_ctx->clipboard_format;
1533 }else {
1534 ret->stgmed_buf = create_stgmed_buf(&ret->protocol->IInternetProtocolEx_iface);
1535 }
1536
1537 if(to_obj) {
1538 ret->stgmed_obj = NULL;
1539 }else if(IsEqualGUID(&IID_IStream, riid)) {
1540 ret->stgmed_obj = create_stgmed_stream(ret->stgmed_buf);
1541 }else if(IsEqualGUID(&IID_IUnknown, riid)) {
1542 ret->bindf |= BINDF_NEEDFILE;
1543 ret->stgmed_obj = create_stgmed_file(ret->stgmed_buf);
1544 }else {
1545 FIXME("Unsupported riid %s\n", debugstr_guid(riid));
1546 IBinding_Release(&ret->IBinding_iface);
1547 return E_NOTIMPL;
1548 }
1549
1550 *binding = ret;
1551 return S_OK;
1552}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
static stgmed_obj_t * create_stgmed_stream(stgmed_buf_t *buf)
Definition: binding.c:700
static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl
Definition: binding.c:1347
static const IInternetBindInfoVtbl InternetBindInfoVtbl
Definition: binding.c:1278
static HRESULT get_callback(IBindCtx *pbc, IBindStatusCallback **callback)
Definition: binding.c:1405
static void dump_BINDINFO(BINDINFO *bi)
Definition: binding.c:115
static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl
Definition: binding.c:1184
static stgmed_obj_t * create_stgmed_file(stgmed_buf_t *buf)
Definition: binding.c:753
static const IBindingVtbl BindingVtbl
Definition: binding.c:949
static BOOL is_urlmon_protocol(IUri *uri)
Definition: binding.c:1419
static const IServiceProviderVtbl ServiceProviderVtbl
Definition: binding.c:1398
static stgmed_buf_t * create_stgmed_buf(IInternetProtocolEx *protocol)
Definition: binding.c:394
HRESULT create_binding_protocol(BindProtocol **protocol)
Definition: bindprot.c:1453
HWND get_notif_hwnd(void)
Definition: bindprot.c:107
#define E_NOTIMPL
Definition: ddrawi.h:99
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
Definition: sync.c:107
return ret
Definition: mutex.c:146
#define debugstr_guid
Definition: kernel32.h:35
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define calloc
Definition: rosglue.h:14
UINT clipboard_format
Definition: binding.c:87
stgmed_buf_t * stgmed_buf
Definition: binding.c:80
BindProtocol * protocol
Definition: binding.c:78
#define DWORD_PTR
Definition: treelist.c:76
static void URLMON_LockModule(void)
Definition: urlmon_main.h:64
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Definition: winnt_old.h:1156

Referenced by start_binding().

◆ Binding_GetBindResult()

static HRESULT WINAPI Binding_GetBindResult ( IBinding iface,
CLSID pclsidProtocol,
DWORD pdwResult,
LPOLESTR *  pszResult,
DWORD pdwReserved 
)
static

Definition at line 926 of file binding.c.

928{
930
931 TRACE("(%p)->(%p %p %p %p)\n", This, pclsidProtocol, pdwResult, pszResult, pdwReserved);
932
933 if(!pdwResult || !pszResult || pdwReserved)
934 return E_INVALIDARG;
935
936 if(!(This->state & BINDING_STOPPED)) {
937 *pclsidProtocol = CLSID_NULL;
938 *pdwResult = 0;
939 *pszResult = NULL;
940 return S_OK;
941 }
942
943 *pclsidProtocol = This->hres==S_OK ? CLSID_NULL : This->clsid;
944 *pdwResult = This->hres;
945 *pszResult = NULL;
946 return S_OK;
947}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define CLSID_NULL
Definition: guiddef.h:99
_In_ UINT _In_ DWORD _Out_ DWORD * pdwResult
Definition: ntgdi.h:250

◆ Binding_GetPriority()

static HRESULT WINAPI Binding_GetPriority ( IBinding iface,
LONG pnPriority 
)
static

Definition at line 919 of file binding.c.

920{
922 FIXME("(%p)->(%p)\n", This, pnPriority);
923 return E_NOTIMPL;
924}

◆ Binding_QueryInterface()

static HRESULT WINAPI Binding_QueryInterface ( IBinding iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 770 of file binding.c.

771{
773
774 *ppv = NULL;
775
777 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
778 *ppv = &This->IBinding_iface;
779 }else if(IsEqualGUID(&IID_IBinding, riid)) {
780 TRACE("(%p)->(IID_IBinding %p)\n", This, ppv);
781 *ppv = &This->IBinding_iface;
782 }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) {
783 TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv);
784 *ppv = &This->IInternetProtocolSink_iface;
785 }else if(IsEqualGUID(&IID_IInternetBindInfo, riid)) {
786 TRACE("(%p)->(IID_IInternetBindInfo %p)\n", This, ppv);
787 *ppv = &This->IInternetBindInfo_iface;
788 }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
789 TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
790 *ppv = &This->IServiceProvider_iface;
791 }else if(IsEqualGUID(&IID_IWinInetInfo, riid)) {
792 IWinInetInfo *wininet_info;
794
795 TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv);
796
797 /* NOTE: This violidates COM rules, but tests prove that we should do it */
798 hres = IInternetProtocolEx_QueryInterface(&This->protocol->IInternetProtocolEx_iface,
799 &IID_IWinInetInfo, (void**)&wininet_info);
800 if(SUCCEEDED(hres)) {
801 IWinInetInfo_Release(wininet_info);
802 *ppv = &This->IWinInetHttpInfo_iface;
803 }
804 }else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) {
805 IWinInetHttpInfo *http_info;
807
808 TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv);
809
810 /* NOTE: This violidates COM rules, but tests prove that we should do it */
811 hres = IInternetProtocolEx_QueryInterface(&This->protocol->IInternetProtocolEx_iface,
812 &IID_IWinInetHttpInfo, (void**)&http_info);
813 if(SUCCEEDED(hres)) {
814 IWinInetHttpInfo_Release(http_info);
815 *ppv = &This->IWinInetHttpInfo_iface;
816 }
817 }
818
819 if(*ppv) {
820 IBinding_AddRef(&This->IBinding_iface);
821 return S_OK;
822 }
823
824 WARN("Unsupported interface %s\n", debugstr_guid(riid));
825 return E_NOINTERFACE;
826}
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ Binding_Release()

static ULONG WINAPI Binding_Release ( IBinding iface)
static

Definition at line 838 of file binding.c.

839{
842
843 TRACE("(%p) ref=%ld\n", This, ref);
844
845 if(!ref) {
846 if(This->notif_hwnd)
847 release_notif_hwnd(This->notif_hwnd);
848 if(This->mon)
849 IMoniker_Release(This->mon);
850 if(This->callback)
851 IBindStatusCallback_Release(This->callback);
852 if(This->protocol)
853 IInternetProtocolEx_Release(&This->protocol->IInternetProtocolEx_iface);
854 if(This->service_provider)
855 IServiceProvider_Release(This->service_provider);
856 if(This->stgmed_buf)
857 IUnknown_Release(&This->stgmed_buf->IUnknown_iface);
858 if(This->stgmed_obj)
859 This->stgmed_obj->vtbl->release(This->stgmed_obj);
860 if(This->obj)
861 IUnknown_Release(This->obj);
862 if(This->bctx)
863 IBindCtx_Release(This->bctx);
864
865 ReleaseBindInfo(&This->bindinfo);
866 This->section.DebugInfo->Spare[0] = 0;
867 DeleteCriticalSection(&This->section);
868 SysFreeString(This->url);
869 free(This->mime);
870 free(This->redirect_url);
871 free(This);
872
874 }
875
876 return ref;
877}
#define InterlockedDecrement
Definition: armddk.h:52
void release_notif_hwnd(HWND hwnd)
Definition: bindprot.c:137
#define free
Definition: debug_ros.c:5
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
void WINAPI ReleaseBindInfo(BINDINFO *pbindinfo)
Definition: urlmon_main.c:561
static void URLMON_UnlockModule(void)
Definition: urlmon_main.h:65
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)

◆ Binding_Resume()

static HRESULT WINAPI Binding_Resume ( IBinding iface)
static

Definition at line 905 of file binding.c.

906{
908 FIXME("(%p)\n", This);
909 return E_NOTIMPL;
910}

◆ Binding_SetPriority()

static HRESULT WINAPI Binding_SetPriority ( IBinding iface,
LONG  nPriority 
)
static

Definition at line 912 of file binding.c.

913{
915 FIXME("(%p)->(%ld)\n", This, nPriority);
916 return E_NOTIMPL;
917}

◆ Binding_Suspend()

static HRESULT WINAPI Binding_Suspend ( IBinding iface)
static

Definition at line 898 of file binding.c.

899{
901 FIXME("(%p)\n", This);
902 return E_NOTIMPL;
903}

◆ cache_file_available()

static void cache_file_available ( Binding This,
const WCHAR file_name 
)
static

Definition at line 322 of file binding.c.

323{
324 free(This->stgmed_buf->cache_file);
325 This->stgmed_buf->cache_file = wcsdup(file_name);
326
327 if(This->use_cache_file) {
330 if(This->stgmed_buf->file == INVALID_HANDLE_VALUE)
331 WARN("CreateFile failed: %lu\n", GetLastError());
332 }
333}
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define GENERIC_READ
Definition: compat.h:135
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define FILE_SHARE_READ
Definition: compat.h:136
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
static LPCWSTR file_name
Definition: protocol.c:152
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by InternetProtocolSink_ReportProgress().

◆ create_mime_object()

static HRESULT create_mime_object ( Binding binding,
const CLSID clsid,
LPCWSTR  clsid_str 
)
static

Definition at line 252 of file binding.c.

253{
254 IPersistMoniker *persist;
256
257 hres = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
258 &binding->iid, (void**)&binding->obj);
259 if(FAILED(hres)) {
260 WARN("CoCreateInstance failed: %08lx\n", hres);
262 }
263
264 binding->state |= BINDING_OBJAVAIL;
265
266 hres = IUnknown_QueryInterface(binding->obj, &IID_IPersistMoniker, (void**)&persist);
267 if(SUCCEEDED(hres)) {
268 IMonikerProp *prop;
269
270 hres = IPersistMoniker_QueryInterface(persist, &IID_IMonikerProp, (void**)&prop);
271 if(SUCCEEDED(hres)) {
272 IMonikerProp_PutProperty(prop, MIMETYPEPROP, binding->mime);
273 IMonikerProp_PutProperty(prop, CLASSIDPROP, clsid_str);
274 IMonikerProp_Release(prop);
275 }
276
277 load_doc_mon(binding, persist);
278
279 IPersistMoniker_Release(persist);
280 }else {
281 FIXME("Could not get IPersistMoniker: %08lx\n", hres);
282 /* FIXME: Try query IPersistFile */
283 }
284
285 IBindStatusCallback_OnObjectAvailable(binding->callback, &binding->iid, binding->obj);
286
287 return S_OK;
288}
static void load_doc_mon(Binding *binding, IPersistMoniker *persist)
Definition: binding.c:231
#define BINDING_OBJAVAIL
Definition: binding.c:63
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
const CLSID * clsid
Definition: msctf.cpp:50
#define INET_E_CANNOT_INSTANTIATE_OBJECT
Definition: winerror.h:4666

Referenced by create_object().

◆ create_object()

static void create_object ( Binding binding)
static

Definition at line 290 of file binding.c.

291{
292 LPWSTR clsid_str;
293 CLSID clsid;
295
296 if(!binding->mime) {
297 FIXME("MIME not available\n");
298 return;
299 }
300
301 if((clsid_str = get_mime_clsid(binding->mime, &clsid)))
302 IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_CLASSIDAVAILABLE, clsid_str);
303
304 IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_BEGINSYNCOPERATION, NULL);
305
306 if(clsid_str) {
307 hres = create_mime_object(binding, &clsid, clsid_str);
308 free(clsid_str);
309 }else {
310 FIXME("Could not find object for MIME %s\n", debugstr_w(binding->mime));
312 }
313
314 IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_ENDSYNCOPERATION, NULL);
315 binding->clsid = CLSID_NULL;
316
318 if(FAILED(hres))
319 IInternetProtocolEx_Terminate(&binding->protocol->IInternetProtocolEx_iface, 0);
320}
static HRESULT create_mime_object(Binding *binding, const CLSID *clsid, LPCWSTR clsid_str)
Definition: binding.c:252
static void stop_binding(Binding *binding, HRESULT hres, LPCWSTR str)
Definition: binding.c:172
static LPWSTR get_mime_clsid(LPCWSTR mime, CLSID *clsid)
Definition: binding.c:187
#define debugstr_w
Definition: kernel32.h:32
uint16_t * LPWSTR
Definition: typedefs.h:56
#define REGDB_E_CLASSNOTREG
Definition: winerror.h:3801

Referenced by report_data().

◆ create_stgmed_buf()

static stgmed_buf_t * create_stgmed_buf ( IInternetProtocolEx protocol)
static

Definition at line 394 of file binding.c.

395{
396 stgmed_buf_t *ret = malloc(sizeof(*ret));
397
398 ret->IUnknown_iface.lpVtbl = &StgMedUnkVtbl;
399 ret->ref = 1;
401 ret->hres = S_OK;
402 ret->cache_file = NULL;
403
404 IInternetProtocolEx_AddRef(protocol);
405 ret->protocol = protocol;
406
408
409 return ret;
410}
static const IUnknownVtbl StgMedUnkVtbl
Definition: binding.c:388
#define malloc
Definition: debug_ros.c:4

Referenced by Binding_Create().

◆ create_stgmed_file()

static stgmed_obj_t * create_stgmed_file ( stgmed_buf_t buf)
static

Definition at line 753 of file binding.c.

754{
755 stgmed_file_obj_t *ret = malloc(sizeof(*ret));
756
757 ret->stgmed_obj.vtbl = &stgmed_file_vtbl;
758
759 IUnknown_AddRef(&buf->IUnknown_iface);
760 ret->buf = buf;
761
762 return &ret->stgmed_obj;
763}
static const stgmed_obj_vtbl stgmed_file_vtbl
Definition: binding.c:747
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751

Referenced by Binding_Create().

◆ create_stgmed_stream()

static stgmed_obj_t * create_stgmed_stream ( stgmed_buf_t buf)
static

Definition at line 700 of file binding.c.

701{
703
704 ret->stgmed_obj.vtbl = &stgmed_stream_vtbl;
705 ret->IStream_iface.lpVtbl = &ProtocolStreamVtbl;
706 ret->ref = 1;
707
708 IUnknown_AddRef(&buf->IUnknown_iface);
709 ret->buf = buf;
710
712
713 return &ret->stgmed_obj;
714}
static const stgmed_obj_vtbl stgmed_stream_vtbl
Definition: binding.c:689
static const IStreamVtbl ProtocolStreamVtbl
Definition: binding.c:642

Referenced by Binding_Create().

◆ dump_BINDINFO()

static void dump_BINDINFO ( BINDINFO *  bi)
static

Definition at line 115 of file binding.c.

116{
117 static const char * const BINDINFOF_str[] = {
118 "#0",
119 "BINDINFOF_URLENCODESTGMEDDATA",
120 "BINDINFOF_URLENCODEDEXTRAINFO"
121 };
122
123 static const char * const BINDVERB_str[] = {
124 "BINDVERB_GET",
125 "BINDVERB_POST",
126 "BINDVERB_PUT",
127 "BINDVERB_CUSTOM"
128 };
129
130 TRACE("\n"
131 "BINDINFO = {\n"
132 " %ld, %s,\n"
133 " {%ld, %p, %p},\n"
134 " %s,\n"
135 " %s,\n"
136 " %s,\n"
137 " %ld, %08lx, %ld, %ld\n"
138 " {%ld %p %x},\n"
139 " %s\n"
140 " %p, %ld\n"
141 "}\n",
142
143 bi->cbSize, debugstr_w(bi->szExtraInfo),
144 bi->stgmedData.tymed, bi->stgmedData.hGlobal, bi->stgmedData.pUnkForRelease,
145 bi->grfBindInfoF > BINDINFOF_URLENCODEDEXTRAINFO
146 ? "unknown" : BINDINFOF_str[bi->grfBindInfoF],
147 bi->dwBindVerb > BINDVERB_CUSTOM
148 ? "unknown" : BINDVERB_str[bi->dwBindVerb],
149 debugstr_w(bi->szCustomVerb),
150 bi->cbstgmedData, bi->dwOptions, bi->dwOptionsFlags, bi->dwCodePage,
151 bi->securityAttributes.nLength,
152 bi->securityAttributes.lpSecurityDescriptor,
153 bi->securityAttributes.bInheritHandle,
154 debugstr_guid(&bi->iid),
155 bi->pUnk, bi->dwReserved
156 );
157}

Referenced by Binding_Create().

◆ get_bctx_binding()

static Binding * get_bctx_binding ( IBindCtx bctx)
static

Definition at line 961 of file binding.c.

962{
964 IUnknown *unk;
966
967 hres = IBindCtx_GetObjectParam(bctx, cbinding_contextW, &unk);
968 if(FAILED(hres))
969 return NULL;
970
971 hres = IUnknown_QueryInterface(unk, &IID_IBinding, (void**)&binding);
972 IUnknown_Release(unk);
973 if(FAILED(hres))
974 return NULL;
975
976 if (binding->lpVtbl != &BindingVtbl)
977 return NULL;
979}
static WCHAR cbinding_contextW[]
Definition: binding.c:27

Referenced by bind_to_storage().

◆ get_callback()

static HRESULT get_callback ( IBindCtx pbc,
IBindStatusCallback **  callback 
)
static

Definition at line 1405 of file binding.c.

1406{
1407 IUnknown *unk;
1408 HRESULT hres;
1409
1410 hres = IBindCtx_GetObjectParam(pbc, bscb_holderW, &unk);
1411 if(FAILED(hres))
1413
1414 hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)callback);
1415 IUnknown_Release(unk);
1416 return hres;
1417}
static WCHAR bscb_holderW[]
Definition: binding.c:28
static IPrintDialogCallback callback
Definition: printdlg.c:326
HRESULT create_default_callback(IBindStatusCallback **ret)
Definition: download.c:361

Referenced by Binding_Create(), and cff_decoder_init().

◆ get_mime_clsid()

static LPWSTR get_mime_clsid ( LPCWSTR  mime,
CLSID clsid 
)
static

Definition at line 187 of file binding.c.

188{
190 DWORD res, type, size;
191 HKEY hkey;
192 int len;
194
195 static const WCHAR mime_keyW[] =
196 {'M','I','M','E','\\','D','a','t','a','b','a','s','e','\\',
197 'C','o','n','t','e','n','t',' ','T','y','p','e','\\'};
198
199 len = lstrlenW(mime)+1;
200 key_name = malloc(sizeof(mime_keyW) + len * sizeof(WCHAR));
201 memcpy(key_name, mime_keyW, sizeof(mime_keyW));
202 lstrcpyW(key_name + ARRAY_SIZE(mime_keyW), mime);
203
205 free(key_name);
206 if(res != ERROR_SUCCESS) {
207 WARN("Could not open MIME key: %lx\n", res);
208 return NULL;
209 }
210
211 size = 50*sizeof(WCHAR);
212 ret = malloc(size);
213 res = RegQueryValueExW(hkey, L"CLSID", NULL, &type, (BYTE*)ret, &size);
214 RegCloseKey(hkey);
215 if(res != ERROR_SUCCESS) {
216 WARN("Could not get CLSID: %08lx\n", res);
217 free(ret);
218 return NULL;
219 }
220
222 if(FAILED(hres)) {
223 WARN("Could not parse CLSID: %08lx\n", hres);
224 free(ret);
225 return NULL;
226 }
227
228 return ret;
229}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define RegCloseKey(hKey)
Definition: registry.h:49
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
HRESULT WINAPI CLSIDFromString(LPCOLESTR str, LPCLSID clsid)
Definition: combase.c:1470
#define lstrcpyW
Definition: compat.h:749
#define lstrlenW
Definition: compat.h:750
#define L(x)
Definition: resources.c:13
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint res
Definition: glext.h:9613
GLsizeiptr size
Definition: glext.h:5919
GLenum GLsizei len
Definition: glext.h:6722
const WCHAR * mime
Definition: mimefilter.c:487
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
short WCHAR
Definition: pedump.c:58
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
unsigned char BYTE
Definition: xxhash.c:193

Referenced by create_object().

◆ impl_from_IBinding()

static Binding * impl_from_IBinding ( IBinding iface)
inlinestatic

Definition at line 765 of file binding.c.

766{
767 return CONTAINING_RECORD(iface, Binding, IBinding_iface);
768}
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by Binding_Abort(), Binding_AddRef(), Binding_GetBindResult(), Binding_GetPriority(), Binding_QueryInterface(), Binding_Release(), Binding_Resume(), Binding_SetPriority(), Binding_Suspend(), and get_bctx_binding().

◆ impl_from_IInternetBindInfo()

static Binding * impl_from_IInternetBindInfo ( IInternetBindInfo iface)
inlinestatic

◆ impl_from_IInternetProtocolSink()

◆ impl_from_IServiceProvider()

static Binding * impl_from_IServiceProvider ( IServiceProvider iface)
inlinestatic

Definition at line 1355 of file binding.c.

1356{
1357 return CONTAINING_RECORD(iface, Binding, IServiceProvider_iface);
1358}

Referenced by ServiceProvider_AddRef(), ServiceProvider_QueryInterface(), ServiceProvider_QueryService(), and ServiceProvider_Release().

◆ impl_from_IStream()

◆ impl_from_IUnknown()

static stgmed_buf_t * impl_from_IUnknown ( IUnknown iface)
inlinestatic

Definition at line 335 of file binding.c.

336{
337 return CONTAINING_RECORD(iface, stgmed_buf_t, IUnknown_iface);
338}

Referenced by StgMedUnk_AddRef(), StgMedUnk_QueryInterface(), and StgMedUnk_Release().

◆ impl_from_IWinInetHttpInfo()

static Binding * impl_from_IWinInetHttpInfo ( IWinInetHttpInfo iface)
inlinestatic

Definition at line 1286 of file binding.c.

1287{
1288 return CONTAINING_RECORD(iface, Binding, IWinInetHttpInfo_iface);
1289}

Referenced by WinInetHttpInfo_AddRef(), WinInetHttpInfo_QueryInfo(), WinInetHttpInfo_QueryInterface(), WinInetHttpInfo_QueryOption(), and WinInetHttpInfo_Release().

◆ InternetBindInfo_AddRef()

static ULONG WINAPI InternetBindInfo_AddRef ( IInternetBindInfo iface)
static

Definition at line 1206 of file binding.c.

1207{
1209 return IBinding_AddRef(&This->IBinding_iface);
1210}
static Binding * impl_from_IInternetBindInfo(IInternetBindInfo *iface)
Definition: binding.c:1194

◆ InternetBindInfo_GetBindInfo()

static HRESULT WINAPI InternetBindInfo_GetBindInfo ( IInternetBindInfo iface,
DWORD grfBINDF,
BINDINFO *  pbindinfo 
)
static

Definition at line 1218 of file binding.c.

1220{
1222
1223 TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo);
1224
1225 *grfBINDF = This->bindf;
1226 return CopyBindInfo(&This->bindinfo, pbindinfo);
1227}
HRESULT WINAPI CopyBindInfo(const BINDINFO *pcbiSrc, BINDINFO *pcbiDest)
Definition: urlmon_main.c:643

◆ InternetBindInfo_GetBindString()

static HRESULT WINAPI InternetBindInfo_GetBindString ( IInternetBindInfo iface,
ULONG  ulStringType,
LPOLESTR *  ppwzStr,
ULONG  cEl,
ULONG pcElFetched 
)
static

Definition at line 1229 of file binding.c.

1231{
1233
1234 TRACE("(%p)->(%ld %p %ld %p)\n", This, ulStringType, ppwzStr, cEl, pcElFetched);
1235
1236 switch(ulStringType) {
1237 case BINDSTRING_ACCEPT_MIMES: {
1238 if(!ppwzStr || !pcElFetched)
1239 return E_INVALIDARG;
1240
1241 ppwzStr[0] = CoTaskMemAlloc(sizeof(L"*/*"));
1242 memcpy(ppwzStr[0], L"*/*", sizeof(L"*/*"));
1243 *pcElFetched = 1;
1244 return S_OK;
1245 }
1246 case BINDSTRING_USER_AGENT: {
1247 IInternetBindInfo *bindinfo = NULL;
1248 HRESULT hres;
1249
1250 hres = IBindStatusCallback_QueryInterface(This->callback, &IID_IInternetBindInfo,
1251 (void**)&bindinfo);
1252 if(FAILED(hres))
1253 return hres;
1254
1255 hres = IInternetBindInfo_GetBindString(bindinfo, ulStringType, ppwzStr,
1256 cEl, pcElFetched);
1257 IInternetBindInfo_Release(bindinfo);
1258
1259 return hres;
1260 }
1261 case BINDSTRING_URL: {
1262 DWORD size = (SysStringLen(This->url)+1) * sizeof(WCHAR);
1263
1264 if(!ppwzStr || !pcElFetched)
1265 return E_INVALIDARG;
1266
1267 *ppwzStr = CoTaskMemAlloc(size);
1268 memcpy(*ppwzStr, This->url, size);
1269 *pcElFetched = 1;
1270 return S_OK;
1271 }
1272 }
1273
1274 FIXME("not supported string type %ld\n", ulStringType);
1275 return E_NOTIMPL;
1276}
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:198

◆ InternetBindInfo_QueryInterface()

static HRESULT WINAPI InternetBindInfo_QueryInterface ( IInternetBindInfo iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1199 of file binding.c.

1201{
1203 return IBinding_QueryInterface(&This->IBinding_iface, riid, ppv);
1204}

◆ InternetBindInfo_Release()

static ULONG WINAPI InternetBindInfo_Release ( IInternetBindInfo iface)
static

Definition at line 1212 of file binding.c.

1213{
1215 return IBinding_Release(&This->IBinding_iface);
1216}

◆ InternetProtocolSink_AddRef()

static ULONG WINAPI InternetProtocolSink_AddRef ( IInternetProtocolSink iface)
static

Definition at line 993 of file binding.c.

994{
996 return IBinding_AddRef(&This->IBinding_iface);
997}
static Binding * impl_from_IInternetProtocolSink(IInternetProtocolSink *iface)
Definition: binding.c:981

◆ InternetProtocolSink_QueryInterface()

static HRESULT WINAPI InternetProtocolSink_QueryInterface ( IInternetProtocolSink iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 986 of file binding.c.

988{
990 return IBinding_QueryInterface(&This->IBinding_iface, riid, ppv);
991}

◆ InternetProtocolSink_Release()

static ULONG WINAPI InternetProtocolSink_Release ( IInternetProtocolSink iface)
static

Definition at line 999 of file binding.c.

1000{
1002 return IBinding_Release(&This->IBinding_iface);
1003}

◆ InternetProtocolSink_ReportData()

static HRESULT WINAPI InternetProtocolSink_ReportData ( IInternetProtocolSink iface,
DWORD  grfBSCF,
ULONG  ulProgress,
ULONG  ulProgressMax 
)
static

Definition at line 1160 of file binding.c.

1162{
1164
1165 TRACE("(%p)->(%ld %lu %lu)\n", This, grfBSCF, ulProgress, ulProgressMax);
1166
1167 report_data(This, grfBSCF, ulProgress, ulProgressMax);
1168 return S_OK;
1169}
static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progress_max)
Definition: binding.c:1075

◆ InternetProtocolSink_ReportProgress()

static HRESULT WINAPI InternetProtocolSink_ReportProgress ( IInternetProtocolSink iface,
ULONG  ulStatusCode,
LPCWSTR  szStatusText 
)
static

Definition at line 1022 of file binding.c.

1024{
1026
1027 TRACE("(%p)->(%s %s)\n", This, debugstr_bindstatus(ulStatusCode), debugstr_w(szStatusText));
1028
1029 switch(ulStatusCode) {
1030 case BINDSTATUS_FINDINGRESOURCE:
1031 on_progress(This, 0, 0, BINDSTATUS_FINDINGRESOURCE, szStatusText);
1032 break;
1033 case BINDSTATUS_CONNECTING:
1034 on_progress(This, 0, 0, BINDSTATUS_CONNECTING, szStatusText);
1035 break;
1036 case BINDSTATUS_REDIRECTING:
1037 free(This->redirect_url);
1038 This->redirect_url = wcsdup(szStatusText);
1039 on_progress(This, 0, 0, BINDSTATUS_REDIRECTING, szStatusText);
1040 break;
1041 case BINDSTATUS_BEGINDOWNLOADDATA:
1042 break;
1043 case BINDSTATUS_SENDINGREQUEST:
1044 on_progress(This, 0, 0, BINDSTATUS_SENDINGREQUEST, szStatusText);
1045 break;
1046 case BINDSTATUS_PROTOCOLCLASSID:
1047 CLSIDFromString(szStatusText, &This->clsid);
1048 break;
1049 case BINDSTATUS_MIMETYPEAVAILABLE:
1050 case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE:
1051 mime_available(This, szStatusText);
1052 break;
1053 case BINDSTATUS_CACHEFILENAMEAVAILABLE:
1054 cache_file_available(This, szStatusText);
1055 break;
1056 case BINDSTATUS_DECODING:
1057 IBindStatusCallback_OnProgress(This->callback, 0, 0, BINDSTATUS_DECODING, szStatusText);
1058 break;
1059 case BINDSTATUS_LOADINGMIMEHANDLER:
1060 on_progress(This, 0, 0, BINDSTATUS_LOADINGMIMEHANDLER, szStatusText);
1061 break;
1062 case BINDSTATUS_DIRECTBIND: /* FIXME: Handle BINDSTATUS_DIRECTBIND in BindProtocol */
1063 This->report_mime = FALSE;
1064 break;
1065 case BINDSTATUS_ACCEPTRANGES:
1066 break;
1067 default:
1068 FIXME("Unhandled status code %ld\n", ulStatusCode);
1069 return E_NOTIMPL;
1070 };
1071
1072 return S_OK;
1073}
static void cache_file_available(Binding *This, const WCHAR *file_name)
Definition: binding.c:322
static void on_progress(Binding *This, ULONG progress, ULONG progress_max, ULONG status_code, LPCWSTR status_text)
Definition: binding.c:1015
static void mime_available(Binding *This, LPCWSTR mime)
Definition: binding.c:159
const char * debugstr_bindstatus(ULONG status)
Definition: urlmon_main.c:173

◆ InternetProtocolSink_ReportResult()

static HRESULT WINAPI InternetProtocolSink_ReportResult ( IInternetProtocolSink iface,
HRESULT  hrResult,
DWORD  dwError,
LPCWSTR  szResult 
)
static

Definition at line 1171 of file binding.c.

1173{
1175
1176 TRACE("(%p)->(%08lx %ld %s)\n", This, hrResult, dwError, debugstr_w(szResult));
1177
1178 stop_binding(This, hrResult, szResult);
1179
1180 IInternetProtocolEx_Terminate(&This->protocol->IInternetProtocolEx_iface, 0);
1181 return S_OK;
1182}

◆ InternetProtocolSink_Switch()

static HRESULT WINAPI InternetProtocolSink_Switch ( IInternetProtocolSink iface,
PROTOCOLDATA *  pProtocolData 
)
static

Definition at line 1005 of file binding.c.

1007{
1009
1010 WARN("(%p)->(%p)\n", This, pProtocolData);
1011
1012 return E_FAIL;
1013}

◆ is_urlmon_protocol()

static BOOL is_urlmon_protocol ( IUri uri)
static

Definition at line 1419 of file binding.c.

1420{
1421 DWORD scheme;
1422 HRESULT hres;
1423
1424 hres = IUri_GetScheme(uri, &scheme);
1425 if(FAILED(hres))
1426 return FALSE;
1427
1428 switch(scheme) {
1429 case URL_SCHEME_FILE:
1430 case URL_SCHEME_FTP:
1431 case URL_SCHEME_GOPHER:
1432 case URL_SCHEME_HTTP:
1433 case URL_SCHEME_HTTPS:
1434 case URL_SCHEME_MK:
1435 return TRUE;
1436 }
1437
1438 return FALSE;
1439}
@ URL_SCHEME_MK
Definition: shlwapi.h:554
@ URL_SCHEME_HTTPS
Definition: shlwapi.h:555
@ URL_SCHEME_FTP
Definition: shlwapi.h:545
@ URL_SCHEME_HTTP
Definition: shlwapi.h:546
@ URL_SCHEME_FILE
Definition: shlwapi.h:553
@ URL_SCHEME_GOPHER
Definition: shlwapi.h:547
DWORD scheme

Referenced by Binding_Create().

◆ load_doc_mon()

static void load_doc_mon ( Binding binding,
IPersistMoniker persist 
)
static

Definition at line 231 of file binding.c.

232{
233 IBindCtx *bctx;
235
236 hres = CreateAsyncBindCtxEx(binding->bctx, 0, NULL, NULL, &bctx, 0);
237 if(FAILED(hres)) {
238 WARN("CreateAsyncBindCtxEx failed: %08lx\n", hres);
239 return;
240 }
241
242 IBindCtx_RevokeObjectParam(bctx, bscb_holderW);
243 IBindCtx_RegisterObjectParam(bctx, cbinding_contextW, (IUnknown*)&binding->IBinding_iface);
244
245 hres = IPersistMoniker_Load(persist, binding->download_state == END_DOWNLOAD, binding->mon, bctx, 0x12);
246 IBindCtx_RevokeObjectParam(bctx, cbinding_contextW);
247 IBindCtx_Release(bctx);
248 if(FAILED(hres))
249 FIXME("Load failed: %08lx\n", hres);
250}
HRESULT WINAPI CreateAsyncBindCtxEx(IBindCtx *ibind, DWORD options, IBindStatusCallback *callback, IEnumFORMATETC *format, IBindCtx **pbind, DWORD reserved)
Definition: bindctx.c:929

Referenced by create_mime_object().

◆ mime_available()

static void mime_available ( Binding This,
LPCWSTR  mime 
)
static

Definition at line 159 of file binding.c.

160{
161 free(This->mime);
162 This->mime = wcsdup(mime);
163
164 if(!This->mime || !This->report_mime)
165 return;
166
167 IBindStatusCallback_OnProgress(This->callback, 0, 0, BINDSTATUS_MIMETYPEAVAILABLE, This->mime);
168
169 This->clipboard_format = RegisterClipboardFormatW(This->mime);
170}
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)

Referenced by InternetProtocolSink_ReportProgress().

◆ on_progress()

static void on_progress ( Binding This,
ULONG  progress,
ULONG  progress_max,
ULONG  status_code,
LPCWSTR  status_text 
)
static

Definition at line 1015 of file binding.c.

1017{
1018 IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
1019 status_code, status_text);
1020}
cd_progress_ptr progress
Definition: cdjpeg.h:152

Referenced by InternetProtocolSink_ReportProgress().

◆ ProtocolStream_AddRef()

static ULONG WINAPI ProtocolStream_AddRef ( IStream iface)
static

Definition at line 453 of file binding.c.

454{
457
458 TRACE("(%p) ref=%ld\n", This, ref);
459
460 return ref;
461}
static ProtocolStream * impl_from_IStream(IStream *iface)
Definition: binding.c:421

◆ ProtocolStream_Clone()

static HRESULT WINAPI ProtocolStream_Clone ( IStream iface,
IStream **  ppstm 
)
static

Definition at line 635 of file binding.c.

636{
638 FIXME("(%p)->(%p)\n", This, ppstm);
639 return E_NOTIMPL;
640}

◆ ProtocolStream_Commit()

static HRESULT WINAPI ProtocolStream_Commit ( IStream iface,
DWORD  grfCommitFlags 
)
static

Definition at line 571 of file binding.c.

572{
574
575 TRACE("(%p)->(%08lx)\n", This, grfCommitFlags);
576
577 return E_NOTIMPL;
578}

◆ ProtocolStream_CopyTo()

static HRESULT WINAPI ProtocolStream_CopyTo ( IStream iface,
IStream pstm,
ULARGE_INTEGER  cb,
ULARGE_INTEGER pcbRead,
ULARGE_INTEGER pcbWritten 
)
static

Definition at line 563 of file binding.c.

565{
567 FIXME("(%p)->(%p %ld %p %p)\n", This, pstm, cb.LowPart, pcbRead, pcbWritten);
568 return E_NOTIMPL;
569}
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118

◆ ProtocolStream_LockRegion()

static HRESULT WINAPI ProtocolStream_LockRegion ( IStream iface,
ULARGE_INTEGER  libOffset,
ULARGE_INTEGER  cb,
DWORD  dwLockType 
)
static

Definition at line 589 of file binding.c.

591{
593 FIXME("(%p)->(%ld %ld %ld)\n", This, libOffset.LowPart, cb.LowPart, dwLockType);
594 return E_NOTIMPL;
595}
$ULONG LowPart
Definition: ntbasedef.h:581

◆ ProtocolStream_QueryInterface()

static HRESULT WINAPI ProtocolStream_QueryInterface ( IStream iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 426 of file binding.c.

428{
430
431 *ppv = NULL;
432
434 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
435 *ppv = &This->IStream_iface;
436 }else if(IsEqualGUID(&IID_ISequentialStream, riid)) {
437 TRACE("(%p)->(IID_ISequentialStream %p)\n", This, ppv);
438 *ppv = &This->IStream_iface;
439 }else if(IsEqualGUID(&IID_IStream, riid)) {
440 TRACE("(%p)->(IID_IStream %p)\n", This, ppv);
441 *ppv = &This->IStream_iface;
442 }
443
444 if(*ppv) {
445 IStream_AddRef(&This->IStream_iface);
446 return S_OK;
447 }
448
449 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
450 return E_NOINTERFACE;
451}

◆ ProtocolStream_Read()

static HRESULT WINAPI ProtocolStream_Read ( IStream iface,
void pv,
ULONG  cb,
ULONG pcbRead 
)
static

Definition at line 480 of file binding.c.

482{
484 DWORD read = 0;
486
487 TRACE("(%p)->(%p %ld %p)\n", This, pv, cb, pcbRead);
488
489 if(This->buf->file == INVALID_HANDLE_VALUE) {
490 hres = This->buf->hres = IInternetProtocolEx_Read(This->buf->protocol, (PBYTE)pv, cb, &read);
491 }else {
492 hres = ReadFile(This->buf->file, pv, cb, &read, NULL) ? S_OK : INET_E_DOWNLOAD_FAILURE;
493 }
494
495 if (pcbRead)
496 *pcbRead = read;
497
498 if(hres == E_PENDING)
499 return E_PENDING;
500 else if(FAILED(hres))
501 FIXME("Read failed: %08lx\n", hres);
502
503 return read ? S_OK : S_FALSE;
504}
#define read
Definition: acwin.h:97
#define E_PENDING
Definition: dinput.h:172
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
BYTE * PBYTE
Definition: pedump.c:66
#define S_FALSE
Definition: winerror.h:3451
#define INET_E_DOWNLOAD_FAILURE
Definition: winerror.h:4658

◆ ProtocolStream_Release()

static ULONG WINAPI ProtocolStream_Release ( IStream iface)
static

Definition at line 463 of file binding.c.

464{
467
468 TRACE("(%p) ref=%ld\n", This, ref);
469
470 if(!ref) {
471 IUnknown_Release(&This->buf->IUnknown_iface);
472 free(This);
473
475 }
476
477 return ref;
478}

◆ ProtocolStream_Revert()

static HRESULT WINAPI ProtocolStream_Revert ( IStream iface)
static

Definition at line 580 of file binding.c.

581{
583
584 TRACE("(%p)\n", This);
585
586 return E_NOTIMPL;
587}

◆ ProtocolStream_Seek()

static HRESULT WINAPI ProtocolStream_Seek ( IStream iface,
LARGE_INTEGER  dlibMove,
DWORD  dwOrigin,
ULARGE_INTEGER plibNewPosition 
)
static

Definition at line 516 of file binding.c.

518{
520 LARGE_INTEGER new_pos;
522
523 TRACE("(%p)->(%ld %08lx %p)\n", This, dlibMove.LowPart, dwOrigin, plibNewPosition);
524
525 if(This->buf->file == INVALID_HANDLE_VALUE) {
526 /* We should probably call protocol handler's Seek. */
527 FIXME("no cache file, not supported\n");
528 return E_FAIL;
529 }
530
531 switch(dwOrigin) {
532 case STREAM_SEEK_SET:
534 break;
535 case STREAM_SEEK_CUR:
537 break;
538 case STREAM_SEEK_END:
540 break;
541 default:
542 WARN("Invalid origin %lx\n", dwOrigin);
543 return E_FAIL;
544 }
545
546 if(!SetFilePointerEx(This->buf->file, dlibMove, &new_pos, method)) {
547 FIXME("SetFilePointerEx failed: %lu\n", GetLastError());
548 return E_FAIL;
549 }
550
551 if(plibNewPosition)
552 plibNewPosition->QuadPart = new_pos.QuadPart;
553 return S_OK;
554}
#define FILE_BEGIN
Definition: compat.h:761
BOOL WINAPI SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod)
Definition: fileinfo.c:177
method
Definition: dragdrop.c:54
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
LONGLONG QuadPart
Definition: typedefs.h:114
ULONG LowPart
Definition: typedefs.h:106
#define FILE_END
Definition: winbase.h:117
#define FILE_CURRENT
Definition: winbase.h:116

◆ ProtocolStream_SetSize()

static HRESULT WINAPI ProtocolStream_SetSize ( IStream iface,
ULARGE_INTEGER  libNewSize 
)
static

Definition at line 556 of file binding.c.

557{
559 FIXME("(%p)->(%ld)\n", This, libNewSize.LowPart);
560 return E_NOTIMPL;
561}

◆ ProtocolStream_Stat()

static HRESULT WINAPI ProtocolStream_Stat ( IStream iface,
STATSTG *  pstatstg,
DWORD  dwStatFlag 
)
static

Definition at line 605 of file binding.c.

607{
609 TRACE("(%p)->(%p %08lx)\n", This, pstatstg, dwStatFlag);
610
611 if(!pstatstg)
612 return E_FAIL;
613
614 memset(pstatstg, 0, sizeof(STATSTG));
615
616 if(!(dwStatFlag&STATFLAG_NONAME) && This->buf->cache_file) {
617 pstatstg->pwcsName = CoTaskMemAlloc((lstrlenW(This->buf->cache_file)+1)*sizeof(WCHAR));
618 if(!pstatstg->pwcsName)
620
621 lstrcpyW(pstatstg->pwcsName, This->buf->cache_file);
622 }
623
624 pstatstg->type = STGTY_STREAM;
625 if(This->buf->file != INVALID_HANDLE_VALUE) {
626 GetFileSizeEx(This->buf->file, (PLARGE_INTEGER)&pstatstg->cbSize);
627 GetFileTime(This->buf->file, &pstatstg->ctime, &pstatstg->atime, &pstatstg->mtime);
628 if(pstatstg->cbSize.QuadPart)
629 pstatstg->grfMode = GENERIC_READ;
630 }
631
632 return S_OK;
633}
#define GetFileSizeEx
Definition: compat.h:757
BOOL WINAPI GetFileTime(IN HANDLE hFile, OUT LPFILETIME lpCreationTime OPTIONAL, OUT LPFILETIME lpLastAccessTime OPTIONAL, OUT LPFILETIME lpLastWriteTime OPTIONAL)
Definition: fileinfo.c:880
#define memset(x, y, z)
Definition: compat.h:39
#define STG_E_INSUFFICIENTMEMORY
Definition: winerror.h:3665

◆ ProtocolStream_UnlockRegion()

static HRESULT WINAPI ProtocolStream_UnlockRegion ( IStream iface,
ULARGE_INTEGER  libOffset,
ULARGE_INTEGER  cb,
DWORD  dwLockType 
)
static

Definition at line 597 of file binding.c.

599{
601 FIXME("(%p)->(%ld %ld %ld)\n", This, libOffset.LowPart, cb.LowPart, dwLockType);
602 return E_NOTIMPL;
603}

◆ ProtocolStream_Write()

static HRESULT WINAPI ProtocolStream_Write ( IStream iface,
const void pv,
ULONG  cb,
ULONG pcbWritten 
)
static

Definition at line 506 of file binding.c.

508{
510
511 TRACE("(%p)->(%p %ld %p)\n", This, pv, cb, pcbWritten);
512
513 return STG_E_ACCESSDENIED;
514}
#define STG_E_ACCESSDENIED
Definition: winerror.h:3663

◆ read_protocol_data()

static void read_protocol_data ( stgmed_buf_t stgmed_buf)
static

Definition at line 105 of file binding.c.

106{
107 BYTE buf[8192];
108 DWORD read;
110
111 do hres = IInternetProtocolEx_Read(stgmed_buf->protocol, buf, sizeof(buf), &read);
112 while(hres == S_OK);
113}
IInternetProtocolEx * protocol
Definition: binding.c:35

Referenced by report_data(), and stgmed_file_fill_stgmed().

◆ report_data()

static void report_data ( Binding This,
DWORD  bscf,
ULONG  progress,
ULONG  progress_max 
)
static

Definition at line 1075 of file binding.c.

1076{
1077 FORMATETC formatetc = {0, NULL, 1, -1, TYMED_ISTREAM};
1078 BOOL sent_begindownloaddata = FALSE;
1079
1080 TRACE("(%p)->(%ld %lu %lu)\n", This, bscf, progress, progress_max);
1081
1082 if(This->download_state == END_DOWNLOAD || (This->state & BINDING_ABORTED)) {
1083 read_protocol_data(This->stgmed_buf);
1084 return;
1085 }
1086
1087 if(This->state & BINDING_STOPPED)
1088 return;
1089
1090 if(This->stgmed_buf->file != INVALID_HANDLE_VALUE)
1091 read_protocol_data(This->stgmed_buf);
1092
1093 if(This->download_state == BEFORE_DOWNLOAD) {
1094 This->download_state = DOWNLOADING;
1095 sent_begindownloaddata = TRUE;
1096 IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
1097 BINDSTATUS_BEGINDOWNLOADDATA, This->url);
1098
1099 if(This->stgmed_buf->cache_file)
1100 IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
1101 BINDSTATUS_CACHEFILENAMEAVAILABLE, This->stgmed_buf->cache_file);
1102 }
1103
1104 if(This->stgmed_buf->hres == S_FALSE || (bscf & BSCF_LASTDATANOTIFICATION)) {
1105 This->download_state = END_DOWNLOAD;
1106 IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
1107 BINDSTATUS_ENDDOWNLOADDATA, This->url);
1108 }else if(!sent_begindownloaddata) {
1109 IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
1110 BINDSTATUS_DOWNLOADINGDATA, This->url);
1111 }
1112
1113 if(This->state & (BINDING_STOPPED|BINDING_ABORTED))
1114 return;
1115
1116 if(This->to_object) {
1117 if(!(This->state & BINDING_OBJAVAIL)) {
1118 IBinding_AddRef(&This->IBinding_iface);
1120 IBinding_Release(&This->IBinding_iface);
1121 }
1122 }else {
1123 STGMEDIUM stgmed;
1124 HRESULT hres;
1125
1126 if(!(This->state & BINDING_LOCKED)) {
1127 hres = IInternetProtocolEx_LockRequest(&This->protocol->IInternetProtocolEx_iface, 0);
1128 if(SUCCEEDED(hres))
1129 This->state |= BINDING_LOCKED;
1130 }
1131
1132 hres = This->stgmed_obj->vtbl->fill_stgmed(This->stgmed_obj, &stgmed);
1133 if(FAILED(hres)) {
1135 return;
1136 }
1137
1138 formatetc.tymed = stgmed.tymed;
1139 formatetc.cfFormat = This->clipboard_format;
1140
1141 hres = IBindStatusCallback_OnDataAvailable(This->callback, bscf, progress,
1142 &formatetc, &stgmed);
1143 if(hres != S_OK) {
1144 if(This->download_state != END_DOWNLOAD) {
1145 This->download_state = END_DOWNLOAD;
1146 IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
1147 BINDSTATUS_ENDDOWNLOADDATA, This->url);
1148 }
1149
1150 WARN("OnDataAvailable returned %lx\n", hres);
1152 return;
1153 }
1154
1155 if(This->download_state == END_DOWNLOAD)
1157 }
1158}
static void create_object(Binding *binding)
Definition: binding.c:290
static void read_protocol_data(stgmed_buf_t *stgmed_buf)
Definition: binding.c:105
unsigned int BOOL
Definition: ntddk_ex.h:94

Referenced by InternetProtocolSink_ReportData(), and start_binding().

◆ ServiceProvider_AddRef()

static ULONG WINAPI ServiceProvider_AddRef ( IServiceProvider iface)
static

Definition at line 1367 of file binding.c.

1368{
1370 return IBinding_AddRef(&This->IBinding_iface);
1371}
static Binding * impl_from_IServiceProvider(IServiceProvider *iface)
Definition: binding.c:1355

◆ ServiceProvider_QueryInterface()

static HRESULT WINAPI ServiceProvider_QueryInterface ( IServiceProvider iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1360 of file binding.c.

1362{
1364 return IBinding_QueryInterface(&This->IBinding_iface, riid, ppv);
1365}

◆ ServiceProvider_QueryService()

static HRESULT WINAPI ServiceProvider_QueryService ( IServiceProvider iface,
REFGUID  guidService,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1379 of file binding.c.

1381{
1383 HRESULT hres;
1384
1385 TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
1386
1387 if(This->service_provider) {
1388 hres = IServiceProvider_QueryService(This->service_provider, guidService,
1389 riid, ppv);
1390 if(SUCCEEDED(hres))
1391 return hres;
1392 }
1393
1394 WARN("unknown service %s\n", debugstr_guid(guidService));
1395 return E_NOINTERFACE;
1396}

◆ ServiceProvider_Release()

static ULONG WINAPI ServiceProvider_Release ( IServiceProvider iface)
static

Definition at line 1373 of file binding.c.

1374{
1376 return IBinding_Release(&This->IBinding_iface);
1377}

◆ start_binding()

static HRESULT start_binding ( IMoniker mon,
Binding binding_ctx,
IUri uri,
IBindCtx pbc,
BOOL  to_obj,
REFIID  riid,
Binding **  ret 
)
static

Definition at line 1554 of file binding.c.

1556{
1557 Binding *binding = NULL;
1558 HRESULT hres;
1559 MSG msg;
1560
1561 hres = Binding_Create(mon, binding_ctx, uri, pbc, to_obj, riid, &binding);
1562 if(FAILED(hres))
1563 return hres;
1564
1565 hres = IBindStatusCallback_OnStartBinding(binding->callback, 0, &binding->IBinding_iface);
1566 if(FAILED(hres)) {
1567 WARN("OnStartBinding failed: %08lx\n", hres);
1568 if(hres != E_ABORT && hres != E_NOTIMPL)
1570
1572 IBinding_Release(&binding->IBinding_iface);
1573 return hres;
1574 }
1575
1576 if(binding_ctx) {
1577 set_binding_sink(binding->protocol, &binding->IInternetProtocolSink_iface,
1578 &binding->IInternetBindInfo_iface);
1579 if(binding_ctx->redirect_url)
1580 IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_REDIRECTING, binding_ctx->redirect_url);
1581 report_data(binding, BSCF_FIRSTDATANOTIFICATION | (binding_ctx->download_state == END_DOWNLOAD ? BSCF_LASTDATANOTIFICATION : 0),
1582 0, 0);
1583 }else {
1584 hres = IInternetProtocolEx_StartEx(&binding->protocol->IInternetProtocolEx_iface, uri,
1585 &binding->IInternetProtocolSink_iface, &binding->IInternetBindInfo_iface,
1586 PI_APARTMENTTHREADED|PI_MIMEVERIFICATION, 0);
1587
1588 TRACE("start ret %08lx\n", hres);
1589
1590 if(FAILED(hres) && hres != E_PENDING) {
1592 IBinding_Release(&binding->IBinding_iface);
1593
1594 return hres;
1595 }
1596 }
1597
1598 while(!(binding->bindf & BINDF_ASYNCHRONOUS) &&
1599 !(binding->state & BINDING_STOPPED)) {
1601 while (PeekMessageW(&msg, binding->notif_hwnd, WM_USER, WM_USER+117, PM_REMOVE|PM_NOYIELD)) {
1604 }
1605 }
1606
1607 *ret = binding;
1608 return S_OK;
1609}
#define msg(x)
Definition: auth_time.c:54
static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc, BOOL to_obj, REFIID riid, Binding **binding)
Definition: binding.c:1441
void set_binding_sink(BindProtocol *This, IInternetProtocolSink *sink, IInternetBindInfo *bind_info)
Definition: bindprot.c:560
LPWSTR redirect_url
Definition: binding.c:89
download_state_t download_state
Definition: binding.c:96
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
BOOL WINAPI TranslateMessage(_In_ const MSG *)
DWORD WINAPI MsgWaitForMultipleObjects(_In_ DWORD nCount, _In_reads_opt_(nCount) CONST HANDLE *pHandles, _In_ BOOL fWaitAll, _In_ DWORD dwMilliseconds, _In_ DWORD dwWakeMask)
#define PM_NOYIELD
Definition: winuser.h:1208
BOOL WINAPI PeekMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
#define PM_REMOVE
Definition: winuser.h:1207
#define QS_POSTMESSAGE
Definition: winuser.h:888
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
#define WM_USER
Definition: winuser.h:1923

Referenced by bind_to_object(), and bind_to_storage().

◆ stgmed_file_fill_stgmed()

static HRESULT stgmed_file_fill_stgmed ( stgmed_obj_t obj,
STGMEDIUM *  stgmed 
)
static

Definition at line 724 of file binding.c.

725{
727
728 if(!file_obj->buf->cache_file) {
729 WARN("cache_file not set\n");
731 }
732
733 read_protocol_data(file_obj->buf);
734
735 stgmed->tymed = TYMED_FILE;
736 stgmed->lpszFileName = file_obj->buf->cache_file;
737 stgmed->pUnkForRelease = &file_obj->buf->IUnknown_iface;
738
739 return S_OK;
740}
LPWSTR cache_file
Definition: binding.c:40
IUnknown IUnknown_iface
Definition: binding.c:31
stgmed_buf_t * buf
Definition: binding.c:697
#define INET_E_DATA_NOT_AVAILABLE
Definition: winerror.h:4657

◆ stgmed_file_get_result()

static HRESULT stgmed_file_get_result ( stgmed_obj_t obj,
DWORD  bindf,
void **  result 
)
static

Definition at line 742 of file binding.c.

743{
744 return bindf & BINDF_ASYNCHRONOUS ? MK_S_ASYNCHRONOUS : S_OK;
745}
static DWORD bindf
Definition: protocol.c:70

◆ stgmed_file_release()

static void stgmed_file_release ( stgmed_obj_t obj)
static

Definition at line 716 of file binding.c.

717{
719
720 IUnknown_Release(&file_obj->buf->IUnknown_iface);
721 free(file_obj);
722}

◆ stgmed_stream_fill_stgmed()

static HRESULT stgmed_stream_fill_stgmed ( stgmed_obj_t obj,
STGMEDIUM *  stgmed 
)
static

Definition at line 665 of file binding.c.

666{
668
669 stgmed->tymed = TYMED_ISTREAM;
670 stgmed->pstm = &stream->IStream_iface;
671 stgmed->pUnkForRelease = &stream->buf->IUnknown_iface;
672
673 return S_OK;
674}
Definition: parse.h:23
IStream IStream_iface
Definition: request.c:5732

◆ stgmed_stream_get_result()

static HRESULT stgmed_stream_get_result ( stgmed_obj_t obj,
DWORD  bindf,
void **  result 
)
static

Definition at line 676 of file binding.c.

677{
679
680 if(!(bindf & BINDF_ASYNCHRONOUS) && stream->buf->file == INVALID_HANDLE_VALUE
681 && stream->buf->hres != S_FALSE)
683
684 IStream_AddRef(&stream->IStream_iface);
686 return S_OK;
687}
GLuint64EXT * result
Definition: glext.h:11304

◆ stgmed_stream_release()

static void stgmed_stream_release ( stgmed_obj_t obj)
static

Definition at line 659 of file binding.c.

660{
662 IStream_Release(&stream->IStream_iface);
663}

◆ StgMedUnk_AddRef()

static ULONG WINAPI StgMedUnk_AddRef ( IUnknown iface)
static

Definition at line 358 of file binding.c.

359{
362
363 TRACE("(%p) ref=%ld\n", This, ref);
364
365 return ref;
366}
static stgmed_buf_t * impl_from_IUnknown(IUnknown *iface)
Definition: binding.c:335

◆ StgMedUnk_QueryInterface()

static HRESULT WINAPI StgMedUnk_QueryInterface ( IUnknown iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 340 of file binding.c.

341{
343
344 *ppv = NULL;
345
347 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
348
349 *ppv = &This->IUnknown_iface;
350 IUnknown_AddRef(&This->IUnknown_iface);
351 return S_OK;
352 }
353
354 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
355 return E_NOINTERFACE;
356}

◆ StgMedUnk_Release()

static ULONG WINAPI StgMedUnk_Release ( IUnknown iface)
static

Definition at line 368 of file binding.c.

369{
372
373 TRACE("(%p) ref=%ld\n", This, ref);
374
375 if(!ref) {
376 if(This->file != INVALID_HANDLE_VALUE)
377 CloseHandle(This->file);
378 IInternetProtocolEx_Release(This->protocol);
379 free(This->cache_file);
380 free(This);
381
383 }
384
385 return ref;
386}
#define CloseHandle
Definition: compat.h:739

◆ stop_binding()

static void stop_binding ( Binding binding,
HRESULT  hres,
LPCWSTR  str 
)
static

Definition at line 172 of file binding.c.

173{
174 if(binding->state & BINDING_LOCKED) {
175 IInternetProtocolEx_UnlockRequest(&binding->protocol->IInternetProtocolEx_iface);
176 binding->state &= ~BINDING_LOCKED;
177 }
178
179 if(!(binding->state & BINDING_STOPPED)) {
180 binding->state |= BINDING_STOPPED;
181
182 binding->hres = hres;
183 IBindStatusCallback_OnStopBinding(binding->callback, hres, str);
184 }
185}
const WCHAR * str

Referenced by create_object(), InternetProtocolSink_ReportResult(), report_data(), and start_binding().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( urlmon  )

◆ WinInetHttpInfo_AddRef()

static ULONG WINAPI WinInetHttpInfo_AddRef ( IWinInetHttpInfo iface)
static

Definition at line 1297 of file binding.c.

1298{
1300 return IBinding_AddRef(&This->IBinding_iface);
1301}
static Binding * impl_from_IWinInetHttpInfo(IWinInetHttpInfo *iface)
Definition: binding.c:1286

◆ WinInetHttpInfo_QueryInfo()

static HRESULT WINAPI WinInetHttpInfo_QueryInfo ( IWinInetHttpInfo iface,
DWORD  dwOption,
void pBuffer,
DWORD pcbBuffer,
DWORD pdwFlags,
DWORD pdwReserved 
)
static

Definition at line 1328 of file binding.c.

1330{
1332 IWinInetHttpInfo *http_info;
1333 HRESULT hres;
1334
1335 TRACE("(%p)->(%lx %p %p %p %p)\n", This, dwOption, pBuffer, pcbBuffer, pdwFlags, pdwReserved);
1336
1337 hres = IInternetProtocolEx_QueryInterface(&This->protocol->IInternetProtocolEx_iface,
1338 &IID_IWinInetHttpInfo, (void**)&http_info);
1339 if(FAILED(hres))
1340 return E_FAIL;
1341
1342 hres = IWinInetHttpInfo_QueryInfo(http_info, dwOption, pBuffer, pcbBuffer, pdwFlags, pdwReserved);
1343 IWinInetHttpInfo_Release(http_info);
1344 return hres;
1345}
PVOID pBuffer

◆ WinInetHttpInfo_QueryInterface()

static HRESULT WINAPI WinInetHttpInfo_QueryInterface ( IWinInetHttpInfo iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1291 of file binding.c.

1292{
1294 return IBinding_QueryInterface(&This->IBinding_iface, riid, ppv);
1295}

◆ WinInetHttpInfo_QueryOption()

static HRESULT WINAPI WinInetHttpInfo_QueryOption ( IWinInetHttpInfo iface,
DWORD  dwOption,
void pBuffer,
DWORD pcbBuffer 
)
static

Definition at line 1309 of file binding.c.

1311{
1313 IWinInetInfo *wininet_info;
1314 HRESULT hres;
1315
1316 TRACE("(%p)->(%lx %p %p)\n", This, dwOption, pBuffer, pcbBuffer);
1317
1318 hres = IInternetProtocolEx_QueryInterface(&This->protocol->IInternetProtocolEx_iface,
1319 &IID_IWinInetInfo, (void**)&wininet_info);
1320 if(FAILED(hres))
1321 return E_FAIL;
1322
1323 hres = IWinInetInfo_QueryOption(wininet_info, dwOption, pBuffer, pcbBuffer);
1324 IWinInetInfo_Release(wininet_info);
1325 return hres;
1326}

◆ WinInetHttpInfo_Release()

static ULONG WINAPI WinInetHttpInfo_Release ( IWinInetHttpInfo iface)
static

Definition at line 1303 of file binding.c.

1304{
1306 return IBinding_Release(&This->IBinding_iface);
1307}

Variable Documentation

◆ BindingVtbl

const IBindingVtbl BindingVtbl
static
Initial value:
= {
}
static HRESULT WINAPI Binding_SetPriority(IBinding *iface, LONG nPriority)
Definition: binding.c:912
static HRESULT WINAPI Binding_Suspend(IBinding *iface)
Definition: binding.c:898
static HRESULT WINAPI Binding_Abort(IBinding *iface)
Definition: binding.c:879
static HRESULT WINAPI Binding_GetPriority(IBinding *iface, LONG *pnPriority)
Definition: binding.c:919
static ULONG WINAPI Binding_Release(IBinding *iface)
Definition: binding.c:838
static ULONG WINAPI Binding_AddRef(IBinding *iface)
Definition: binding.c:828
static HRESULT WINAPI Binding_GetBindResult(IBinding *iface, CLSID *pclsidProtocol, DWORD *pdwResult, LPOLESTR *pszResult, DWORD *pdwReserved)
Definition: binding.c:926
static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void **ppv)
Definition: binding.c:770
static HRESULT WINAPI Binding_Resume(IBinding *iface)
Definition: binding.c:905

Definition at line 949 of file binding.c.

Referenced by Binding_Create(), and get_bctx_binding().

◆ bscb_holderW

WCHAR bscb_holderW[] = L"_BSCB_Holder_"
static

Definition at line 28 of file binding.c.

Referenced by get_callback(), and load_doc_mon().

◆ cbinding_contextW

WCHAR cbinding_contextW[] = L"CBinding Context"
static

Definition at line 27 of file binding.c.

Referenced by get_bctx_binding(), load_doc_mon(), and PersistMoniker_Load().

◆ InternetBindInfoVtbl

const IInternetBindInfoVtbl InternetBindInfoVtbl
static
Initial value:
= {
}
static HRESULT WINAPI InternetBindInfo_GetBindString(IInternetBindInfo *iface, ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched)
Definition: binding.c:1229
static ULONG WINAPI InternetBindInfo_Release(IInternetBindInfo *iface)
Definition: binding.c:1212
static ULONG WINAPI InternetBindInfo_AddRef(IInternetBindInfo *iface)
Definition: binding.c:1206
static HRESULT WINAPI InternetBindInfo_QueryInterface(IInternetBindInfo *iface, REFIID riid, void **ppv)
Definition: binding.c:1199
static HRESULT WINAPI InternetBindInfo_GetBindInfo(IInternetBindInfo *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: binding.c:1218

Definition at line 1278 of file binding.c.

Referenced by Binding_Create().

◆ InternetProtocolSinkVtbl

const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl
static
Initial value:
= {
}
static HRESULT WINAPI InternetProtocolSink_ReportProgress(IInternetProtocolSink *iface, ULONG ulStatusCode, LPCWSTR szStatusText)
Definition: binding.c:1022
static ULONG WINAPI InternetProtocolSink_Release(IInternetProtocolSink *iface)
Definition: binding.c:999
static HRESULT WINAPI InternetProtocolSink_QueryInterface(IInternetProtocolSink *iface, REFIID riid, void **ppv)
Definition: binding.c:986
static ULONG WINAPI InternetProtocolSink_AddRef(IInternetProtocolSink *iface)
Definition: binding.c:993
static HRESULT WINAPI InternetProtocolSink_Switch(IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
Definition: binding.c:1005
static HRESULT WINAPI InternetProtocolSink_ReportData(IInternetProtocolSink *iface, DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
Definition: binding.c:1160
static HRESULT WINAPI InternetProtocolSink_ReportResult(IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
Definition: binding.c:1171

Definition at line 1184 of file binding.c.

Referenced by Binding_Create().

◆ ProtocolStreamVtbl

const IStreamVtbl ProtocolStreamVtbl
static
Initial value:
= {
}
static HRESULT WINAPI ProtocolStream_Stat(IStream *iface, STATSTG *pstatstg, DWORD dwStatFlag)
Definition: binding.c:605
static HRESULT WINAPI ProtocolStream_Revert(IStream *iface)
Definition: binding.c:580
static HRESULT WINAPI ProtocolStream_Clone(IStream *iface, IStream **ppstm)
Definition: binding.c:635
static HRESULT WINAPI ProtocolStream_Write(IStream *iface, const void *pv, ULONG cb, ULONG *pcbWritten)
Definition: binding.c:506
static ULONG WINAPI ProtocolStream_AddRef(IStream *iface)
Definition: binding.c:453
static HRESULT WINAPI ProtocolStream_UnlockRegion(IStream *iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
Definition: binding.c:597
static HRESULT WINAPI ProtocolStream_CopyTo(IStream *iface, IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
Definition: binding.c:563
static HRESULT WINAPI ProtocolStream_LockRegion(IStream *iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
Definition: binding.c:589
static HRESULT WINAPI ProtocolStream_SetSize(IStream *iface, ULARGE_INTEGER libNewSize)
Definition: binding.c:556
static HRESULT WINAPI ProtocolStream_QueryInterface(IStream *iface, REFIID riid, void **ppv)
Definition: binding.c:426
static HRESULT WINAPI ProtocolStream_Seek(IStream *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: binding.c:516
static HRESULT WINAPI ProtocolStream_Read(IStream *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: binding.c:480
static ULONG WINAPI ProtocolStream_Release(IStream *iface)
Definition: binding.c:463
static HRESULT WINAPI ProtocolStream_Commit(IStream *iface, DWORD grfCommitFlags)
Definition: binding.c:571

Definition at line 642 of file binding.c.

Referenced by create_stgmed_stream().

◆ ServiceProviderVtbl

const IServiceProviderVtbl ServiceProviderVtbl
static
Initial value:
= {
}
static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
Definition: binding.c:1379
static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
Definition: binding.c:1373
static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
Definition: binding.c:1360
static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
Definition: binding.c:1367

Definition at line 1398 of file binding.c.

Referenced by Binding_Create().

◆ stgmed_file_vtbl

const stgmed_obj_vtbl stgmed_file_vtbl
static
Initial value:
= {
}
static HRESULT stgmed_file_fill_stgmed(stgmed_obj_t *obj, STGMEDIUM *stgmed)
Definition: binding.c:724
static void stgmed_file_release(stgmed_obj_t *obj)
Definition: binding.c:716
static HRESULT stgmed_file_get_result(stgmed_obj_t *obj, DWORD bindf, void **result)
Definition: binding.c:742

Definition at line 747 of file binding.c.

Referenced by create_stgmed_file().

◆ stgmed_stream_vtbl

const stgmed_obj_vtbl stgmed_stream_vtbl
static
Initial value:
= {
}
static void stgmed_stream_release(stgmed_obj_t *obj)
Definition: binding.c:659
static HRESULT stgmed_stream_fill_stgmed(stgmed_obj_t *obj, STGMEDIUM *stgmed)
Definition: binding.c:665
static HRESULT stgmed_stream_get_result(stgmed_obj_t *obj, DWORD bindf, void **result)
Definition: binding.c:676

Definition at line 689 of file binding.c.

Referenced by create_stgmed_stream().

◆ StgMedUnkVtbl

const IUnknownVtbl StgMedUnkVtbl
static
Initial value:
= {
}
static ULONG WINAPI StgMedUnk_AddRef(IUnknown *iface)
Definition: binding.c:358
static ULONG WINAPI StgMedUnk_Release(IUnknown *iface)
Definition: binding.c:368
static HRESULT WINAPI StgMedUnk_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: binding.c:340

Definition at line 388 of file binding.c.

Referenced by create_stgmed_buf().

◆ WinInetHttpInfoVtbl

const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl
static
Initial value:
= {
}
static HRESULT WINAPI WinInetHttpInfo_QueryInterface(IWinInetHttpInfo *iface, REFIID riid, void **ppv)
Definition: binding.c:1291
static ULONG WINAPI WinInetHttpInfo_AddRef(IWinInetHttpInfo *iface)
Definition: binding.c:1297
static HRESULT WINAPI WinInetHttpInfo_QueryInfo(IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved)
Definition: binding.c:1328
static HRESULT WINAPI WinInetHttpInfo_QueryOption(IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer)
Definition: binding.c:1309
static ULONG WINAPI WinInetHttpInfo_Release(IWinInetHttpInfo *iface)
Definition: binding.c:1303

Definition at line 1347 of file binding.c.

Referenced by Binding_Create().