4 * Copyright 2004 Kevin Koltzau
5 * Copyright 2004-2007 Jacek Caban for CodeWeavers
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
34 #include "wine/test.h"
36 #define DEFINE_EXPECT(func) \
37 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
39 #define SET_EXPECT(func) \
40 expect_ ## func = TRUE
42 #define CHECK_EXPECT(func) \
44 ok(expect_ ##func, "unexpected call " #func "\n"); \
45 expect_ ## func = FALSE; \
46 called_ ## func = TRUE; \
49 #define CHECK_EXPECT2(func) \
51 ok(expect_ ##func, "unexpected call " #func "\n"); \
52 called_ ## func = TRUE; \
55 #define CHECK_CALLED(func) \
57 ok(called_ ## func, "expected " #func "\n"); \
58 expect_ ## func = called_ ## func = FALSE; \
61 #define CHECK_NOT_CALLED(func) \
63 ok(!called_ ## func, "unexpected " #func "\n"); \
64 expect_ ## func = called_ ## func = FALSE; \
67 #define CLEAR_CALLED(func) \
68 expect_ ## func = called_ ## func = FALSE
70 DEFINE_EXPECT(QueryInterface_IServiceProvider
);
71 DEFINE_EXPECT(QueryInterface_IHttpNegotiate
);
72 DEFINE_EXPECT(QueryInterface_IBindStatusCallback
);
73 DEFINE_EXPECT(QueryInterface_IBindStatusCallbackHolder
);
74 DEFINE_EXPECT(QueryInterface_IInternetBindInfo
);
75 DEFINE_EXPECT(QueryInterface_IAuthenticate
);
76 DEFINE_EXPECT(QueryInterface_IInternetProtocol
);
77 DEFINE_EXPECT(QueryService_IAuthenticate
);
78 DEFINE_EXPECT(QueryService_IInternetProtocol
);
79 DEFINE_EXPECT(QueryService_IInternetBindInfo
);
80 DEFINE_EXPECT(BeginningTransaction
);
81 DEFINE_EXPECT(OnResponse
);
82 DEFINE_EXPECT(QueryInterface_IHttpNegotiate2
);
83 DEFINE_EXPECT(GetRootSecurityId
);
84 DEFINE_EXPECT(GetBindInfo
);
85 DEFINE_EXPECT(OnStartBinding
);
86 DEFINE_EXPECT(OnProgress_FINDINGRESOURCE
);
87 DEFINE_EXPECT(OnProgress_CONNECTING
);
88 DEFINE_EXPECT(OnProgress_SENDINGREQUEST
);
89 DEFINE_EXPECT(OnProgress_MIMETYPEAVAILABLE
);
90 DEFINE_EXPECT(OnProgress_BEGINDOWNLOADDATA
);
91 DEFINE_EXPECT(OnProgress_DOWNLOADINGDATA
);
92 DEFINE_EXPECT(OnProgress_ENDDOWNLOADDATA
);
93 DEFINE_EXPECT(OnProgress_CLASSIDAVAILABLE
);
94 DEFINE_EXPECT(OnProgress_BEGINSYNCOPERATION
);
95 DEFINE_EXPECT(OnProgress_ENDSYNCOPERATION
);
96 DEFINE_EXPECT(OnStopBinding
);
97 DEFINE_EXPECT(OnDataAvailable
);
98 DEFINE_EXPECT(OnObjectAvailable
);
101 DEFINE_EXPECT(LockRequest
);
102 DEFINE_EXPECT(Terminate
);
103 DEFINE_EXPECT(UnlockRequest
);
104 DEFINE_EXPECT(Continue
);
106 static const WCHAR TEST_URL_1
[] = {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','\0'};
107 static const WCHAR TEST_PART_URL_1
[] = {'/','t','e','s','t','/','\0'};
109 static const WCHAR WINE_ABOUT_URL
[] = {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.',
110 'o','r','g','/','s','i','t','e','/','a','b','o','u','t',0};
111 static const WCHAR SHORT_RESPONSE_URL
[] =
112 {'h','t','t','p',':','/','/','c','r','o','s','s','o','v','e','r','.',
113 'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m','/',
114 'p','o','s','t','t','e','s','t','.','p','h','p',0};
115 static const WCHAR ABOUT_BLANK
[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
116 static WCHAR INDEX_HTML
[MAX_PATH
];
117 static const WCHAR ITS_URL
[] =
118 {'i','t','s',':','t','e','s','t','.','c','h','m',':',':','/','b','l','a','n','k','.','h','t','m','l',0};
119 static const WCHAR MK_URL
[] = {'m','k',':','@','M','S','I','T','S','t','o','r','e',':',
120 't','e','s','t','.','c','h','m',':',':','/','b','l','a','n','k','.','h','t','m','l',0};
122 static const WCHAR wszTextHtml
[] = {'t','e','x','t','/','h','t','m','l',0};
124 static WCHAR BSCBHolder
[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
126 static const WCHAR wszWineHQSite
[] =
127 {'w','w','w','.','w','i','n','e','h','q','.','o','r','g',0};
128 static const WCHAR wszWineHQIP
[] =
129 {'2','0','9','.','3','2','.','1','4','1','.','3',0};
130 static const WCHAR wszIndexHtml
[] = {'i','n','d','e','x','.','h','t','m','l',0};
132 static BOOL stopped_binding
= FALSE
, emulate_protocol
= FALSE
,
133 data_available
= FALSE
, http_is_first
= TRUE
;
134 static DWORD read
= 0, bindf
= 0, prot_state
= 0, thread_id
;
135 static CHAR mime_type
[512];
136 static IInternetProtocolSink
*protocol_sink
= NULL
;
137 static HANDLE complete_event
, complete_event2
;
139 extern IID IID_IBindStatusCallbackHolder
;
141 static LPCWSTR urls
[] = {
163 static const char *debugstr_guid(REFIID riid
)
167 sprintf(buf
, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
168 riid
->Data1
, riid
->Data2
, riid
->Data3
, riid
->Data4
[0],
169 riid
->Data4
[1], riid
->Data4
[2], riid
->Data4
[3], riid
->Data4
[4],
170 riid
->Data4
[5], riid
->Data4
[6], riid
->Data4
[7]);
175 static void test_CreateURLMoniker(LPCWSTR url1
, LPCWSTR url2
)
178 IMoniker
*mon1
= NULL
;
179 IMoniker
*mon2
= NULL
;
181 hr
= CreateURLMoniker(NULL
, url1
, &mon1
);
182 ok(SUCCEEDED(hr
), "failed to create moniker: 0x%08x\n", hr
);
184 hr
= CreateURLMoniker(mon1
, url2
, &mon2
);
185 ok(SUCCEEDED(hr
), "failed to create moniker: 0x%08x\n", hr
);
187 if(mon1
) IMoniker_Release(mon1
);
188 if(mon2
) IMoniker_Release(mon2
);
191 static void test_create(void)
193 test_CreateURLMoniker(TEST_URL_1
, TEST_PART_URL_1
);
196 static HRESULT WINAPI
Protocol_QueryInterface(IInternetProtocol
*iface
, REFIID riid
, void **ppv
)
198 if(IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_IInternetProtocol
, riid
)) {
204 return E_NOINTERFACE
;
207 static ULONG WINAPI
Protocol_AddRef(IInternetProtocol
*iface
)
212 static ULONG WINAPI
Protocol_Release(IInternetProtocol
*iface
)
217 static DWORD WINAPI
thread_proc(PVOID arg
)
219 PROTOCOLDATA protocoldata
;
222 SET_EXPECT(OnProgress_FINDINGRESOURCE
);
223 hres
= IInternetProtocolSink_ReportProgress(protocol_sink
,
224 BINDSTATUS_FINDINGRESOURCE
, wszWineHQSite
);
225 ok(hres
== S_OK
, "ReportProgress failed: %08x\n", hres
);
226 WaitForSingleObject(complete_event
, INFINITE
);
227 CHECK_CALLED(OnProgress_FINDINGRESOURCE
);
229 SET_EXPECT(OnProgress_CONNECTING
);
230 hres
= IInternetProtocolSink_ReportProgress(protocol_sink
,
231 BINDSTATUS_CONNECTING
, wszWineHQIP
);
232 ok(hres
== S_OK
, "ReportProgress failed: %08x\n", hres
);
233 WaitForSingleObject(complete_event
, INFINITE
);
234 CHECK_CALLED(OnProgress_CONNECTING
);
236 SET_EXPECT(OnProgress_SENDINGREQUEST
);
237 hres
= IInternetProtocolSink_ReportProgress(protocol_sink
,
238 BINDSTATUS_SENDINGREQUEST
, NULL
);
239 ok(hres
== S_OK
, "ReportProgress failed: %08x\n", hres
);
240 WaitForSingleObject(complete_event
, INFINITE
);
241 CHECK_CALLED(OnProgress_SENDINGREQUEST
);
243 SET_EXPECT(Continue
);
245 hres
= IInternetProtocolSink_Switch(protocol_sink
, &protocoldata
);
246 ok(hres
== S_OK
, "Switch failed: %08x\n", hres
);
247 WaitForSingleObject(complete_event
, INFINITE
);
248 CHECK_CALLED(Continue
);
250 CHECK_CALLED(OnProgress_MIMETYPEAVAILABLE
);
251 CHECK_CALLED(OnProgress_BEGINDOWNLOADDATA
);
252 CHECK_CALLED(LockRequest
);
253 CHECK_CALLED(OnDataAvailable
);
255 SET_EXPECT(Continue
);
257 hres
= IInternetProtocolSink_Switch(protocol_sink
, &protocoldata
);
258 ok(hres
== S_OK
, "Switch failed: %08x\n", hres
);
259 WaitForSingleObject(complete_event
, INFINITE
);
260 CHECK_CALLED(Continue
);
262 CHECK_CALLED(OnProgress_DOWNLOADINGDATA
);
263 CHECK_CALLED(OnDataAvailable
);
265 SET_EXPECT(Continue
);
267 hres
= IInternetProtocolSink_Switch(protocol_sink
, &protocoldata
);
268 ok(hres
== S_OK
, "Switch failed: %08x\n", hres
);
269 WaitForSingleObject(complete_event
, INFINITE
);
270 CHECK_CALLED(Continue
);
272 CHECK_CALLED(OnProgress_DOWNLOADINGDATA
);
273 CHECK_CALLED(OnDataAvailable
);
275 SET_EXPECT(Continue
);
277 hres
= IInternetProtocolSink_Switch(protocol_sink
, &protocoldata
);
278 ok(hres
== S_OK
, "Switch failed: %08x\n", hres
);
279 WaitForSingleObject(complete_event
, INFINITE
);
280 CHECK_CALLED(Continue
);
282 CHECK_CALLED(OnProgress_ENDDOWNLOADDATA
);
283 CHECK_CALLED(OnDataAvailable
);
284 CHECK_CALLED(OnStopBinding
);
286 SetEvent(complete_event2
);
291 static HRESULT WINAPI
Protocol_Start(IInternetProtocol
*iface
, LPCWSTR szUrl
,
292 IInternetProtocolSink
*pOIProtSink
, IInternetBindInfo
*pOIBindInfo
,
293 DWORD grfPI
, DWORD dwReserved
)
295 BINDINFO bindinfo
, bi
= {sizeof(bi
), 0};
296 DWORD bindf
, bscf
= BSCF_FIRSTDATANOTIFICATION
| BSCF_LASTDATANOTIFICATION
;
304 ok(szUrl
&& !lstrcmpW(szUrl
, urls
[test_protocol
]), "wrong url\n");
305 ok(pOIProtSink
!= NULL
, "pOIProtSink == NULL\n");
306 ok(pOIBindInfo
!= NULL
, "pOIBindInfo == NULL\n");
307 ok(grfPI
== 0, "grfPI=%d, expected 0\n", grfPI
);
308 ok(dwReserved
== 0, "dwReserved=%d, expected 0\n", dwReserved
);
310 memset(&bindinfo
, 0, sizeof(bindinfo
));
311 bindinfo
.cbSize
= sizeof(bindinfo
);
312 hres
= IInternetBindInfo_GetBindInfo(pOIBindInfo
, &bindf
, &bindinfo
);
313 ok(hres
== S_OK
, "GetBindInfo failed: %08x\n", hres
);
315 if(test_protocol
== FILE_TEST
|| test_protocol
== MK_TEST
|| test_protocol
== HTTP_TEST
) {
316 ok(bindf
== (BINDF_ASYNCHRONOUS
|BINDF_ASYNCSTORAGE
|BINDF_PULLDATA
318 "bindf=%08x\n", bindf
);
320 ok(bindf
== (BINDF_ASYNCHRONOUS
|BINDF_ASYNCSTORAGE
|BINDF_PULLDATA
|
321 BINDF_FROMURLMON
|BINDF_NEEDFILE
),
322 "bindf=%08x\n", bindf
);
325 ok(!memcmp(&bindinfo
, &bi
, sizeof(bindinfo
)), "wrong bindinfo\n");
327 switch(test_protocol
) {
329 hres
= IInternetProtocolSink_ReportProgress(pOIProtSink
,
330 BINDSTATUS_DIRECTBIND
, NULL
);
332 "ReportProgress(BINDSTATUS_SENDINGREQUEST) failed: %08x\n", hres
);
336 SET_EXPECT(OnProgress_SENDINGREQUEST
);
337 hres
= IInternetProtocolSink_ReportProgress(pOIProtSink
,
338 BINDSTATUS_SENDINGREQUEST
, &null_char
);
340 "ReportProgress(BINDSTATUS_SENDINGREQUEST) failed: %08x\n", hres
);
341 CHECK_CALLED(OnProgress_SENDINGREQUEST
);
346 if(test_protocol
== HTTP_TEST
) {
347 IServiceProvider
*service_provider
;
348 IHttpNegotiate
*http_negotiate
;
349 IHttpNegotiate2
*http_negotiate2
;
350 LPWSTR ua
= (LPWSTR
)0xdeadbeef, accept_mimes
[256];
351 LPWSTR additional_headers
= (LPWSTR
)0xdeadbeef;
353 DWORD fetched
= 256, size
= 100;
355 static const WCHAR wszMimes
[] = {'*','/','*',0};
357 SET_EXPECT(QueryInterface_IInternetBindInfo
);
358 SET_EXPECT(QueryService_IInternetBindInfo
);
359 hres
= IInternetBindInfo_GetBindString(pOIBindInfo
, BINDSTRING_USER_AGENT
,
362 CHECK_CALLED(QueryInterface_IInternetBindInfo
);
363 CHECK_CALLED(QueryService_IInternetBindInfo
);
365 ok(hres
== E_NOINTERFACE
,
366 "GetBindString(BINDSTRING_USER_AGETNT) failed: %08x\n", hres
);
367 ok(fetched
== 256, "fetched = %d, expected 254\n", fetched
);
368 ok(ua
== (LPWSTR
)0xdeadbeef, "ua = %p\n", ua
);
370 hres
= IInternetBindInfo_GetBindString(pOIBindInfo
, BINDSTRING_ACCEPT_MIMES
,
371 accept_mimes
, 256, &fetched
);
373 "GetBindString(BINDSTRING_ACCEPT_MIMES) failed: %08x\n", hres
);
374 ok(fetched
== 1, "fetched = %d, expected 1\n", fetched
);
375 ok(!lstrcmpW(wszMimes
, accept_mimes
[0]), "unexpected mimes\n");
377 hres
= IInternetBindInfo_GetBindString(pOIBindInfo
, BINDSTRING_ACCEPT_MIMES
,
378 NULL
, 256, &fetched
);
379 ok(hres
== E_INVALIDARG
,
380 "GetBindString(BINDSTRING_ACCEPT_MIMES) failed: %08x\n", hres
);
382 hres
= IInternetBindInfo_GetBindString(pOIBindInfo
, BINDSTRING_ACCEPT_MIMES
,
383 accept_mimes
, 256, NULL
);
384 ok(hres
== E_INVALIDARG
,
385 "GetBindString(BINDSTRING_ACCEPT_MIMES) failed: %08x\n", hres
);
387 hres
= IInternetBindInfo_QueryInterface(pOIBindInfo
, &IID_IServiceProvider
,
388 (void**)&service_provider
);
389 ok(hres
== S_OK
, "QueryInterface failed: %08x\n", hres
);
391 SET_EXPECT(QueryInterface_IHttpNegotiate
);
392 hres
= IServiceProvider_QueryService(service_provider
, &IID_IHttpNegotiate
,
393 &IID_IHttpNegotiate
, (void**)&http_negotiate
);
394 CHECK_CALLED(QueryInterface_IHttpNegotiate
);
395 ok(hres
== S_OK
, "QueryService failed: %08x\n", hres
);
397 SET_EXPECT(BeginningTransaction
);
398 hres
= IHttpNegotiate_BeginningTransaction(http_negotiate
, urls
[test_protocol
],
399 NULL
, 0, &additional_headers
);
400 CHECK_CALLED(BeginningTransaction
);
401 IHttpNegotiate_Release(http_negotiate
);
402 ok(hres
== S_OK
, "BeginningTransction failed: %08x\n", hres
);
403 ok(additional_headers
== NULL
, "additional_headers=%p\n", additional_headers
);
405 SET_EXPECT(QueryInterface_IHttpNegotiate2
);
406 hres
= IServiceProvider_QueryService(service_provider
, &IID_IHttpNegotiate2
,
407 &IID_IHttpNegotiate2
, (void**)&http_negotiate2
);
408 CHECK_CALLED(QueryInterface_IHttpNegotiate2
);
409 ok(hres
== S_OK
, "QueryService failed: %08x\n", hres
);
412 SET_EXPECT(GetRootSecurityId
);
413 hres
= IHttpNegotiate2_GetRootSecurityId(http_negotiate2
, sec_id
, &size
, 0);
414 CHECK_CALLED(GetRootSecurityId
);
415 IHttpNegotiate2_Release(http_negotiate2
);
416 ok(hres
== E_FAIL
, "GetRootSecurityId failed: %08x, expected E_FAIL\n", hres
);
417 ok(size
== 13, "size=%d\n", size
);
419 IServiceProvider_Release(service_provider
);
421 IInternetProtocolSink_AddRef(pOIProtSink
);
422 protocol_sink
= pOIProtSink
;
423 CreateThread(NULL
, 0, thread_proc
, NULL
, 0, NULL
);
428 if(test_protocol
== FILE_TEST
) {
429 hres
= IInternetProtocolSink_ReportProgress(pOIProtSink
,
430 BINDSTATUS_CACHEFILENAMEAVAILABLE
, &null_char
);
432 "ReportProgress(BINDSTATUS_CACHEFILENAMEAVAILABLE) failed: %08x\n", hres
);
434 SET_EXPECT(OnProgress_MIMETYPEAVAILABLE
);
435 hres
= IInternetProtocolSink_ReportProgress(pOIProtSink
,
436 BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE
, wszTextHtml
);
438 "ReportProgress(BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE) failed: %08x\n", hres
);
439 CHECK_CALLED(OnProgress_MIMETYPEAVAILABLE
);
441 hres
= IInternetProtocolSink_ReportProgress(pOIProtSink
,
442 BINDSTATUS_MIMETYPEAVAILABLE
, wszTextHtml
);
444 "ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE) failed: %08x\n", hres
);
447 if(test_protocol
== ABOUT_TEST
)
448 bscf
|= BSCF_DATAFULLYAVAILABLE
;
449 if(test_protocol
== ITS_TEST
)
450 bscf
= BSCF_FIRSTDATANOTIFICATION
|BSCF_DATAFULLYAVAILABLE
;
453 if(test_protocol
!= FILE_TEST
&& test_protocol
!= MK_TEST
)
454 SET_EXPECT(OnProgress_MIMETYPEAVAILABLE
);
455 SET_EXPECT(OnProgress_BEGINDOWNLOADDATA
);
456 SET_EXPECT(OnProgress_ENDDOWNLOADDATA
);
457 SET_EXPECT(LockRequest
);
458 SET_EXPECT(OnDataAvailable
);
459 SET_EXPECT(OnStopBinding
);
461 hres
= IInternetProtocolSink_ReportData(pOIProtSink
, bscf
, 13, 13);
462 ok(hres
== S_OK
, "ReportData failed: %08x\n", hres
);
465 if(test_protocol
!= FILE_TEST
&& test_protocol
!= MK_TEST
)
466 CHECK_CALLED(OnProgress_MIMETYPEAVAILABLE
);
467 CHECK_CALLED(OnProgress_BEGINDOWNLOADDATA
);
468 CHECK_CALLED(OnProgress_ENDDOWNLOADDATA
);
469 CHECK_CALLED(LockRequest
);
470 CHECK_CALLED(OnDataAvailable
);
471 CHECK_CALLED(OnStopBinding
);
473 if(test_protocol
== ITS_TEST
) {
475 hres
= IInternetProtocolSink_ReportProgress(pOIProtSink
, BINDSTATUS_BEGINDOWNLOADDATA
, NULL
);
476 ok(hres
== S_OK
, "ReportProgress(BINDSTATUS_BEGINDOWNLOADDATA) failed: %08x\n", hres
);
480 SET_EXPECT(Terminate
);
481 hres
= IInternetProtocolSink_ReportResult(pOIProtSink
, S_OK
, 0, NULL
);
482 ok(hres
== S_OK
, "ReportResult failed: %08x\n", hres
);
483 CHECK_CALLED(Terminate
);
488 static HRESULT WINAPI
Protocol_Continue(IInternetProtocol
*iface
,
489 PROTOCOLDATA
*pProtocolData
)
494 CHECK_EXPECT(Continue
);
496 ok(GetCurrentThreadId() == thread_id
, "wrong thread %d\n", GetCurrentThreadId());
498 ok(pProtocolData
!= NULL
, "pProtocolData == NULL\n");
504 IServiceProvider
*service_provider
;
505 IHttpNegotiate
*http_negotiate
;
506 static WCHAR header
[] = {'?',0};
508 hres
= IInternetProtocolSink_QueryInterface(protocol_sink
, &IID_IServiceProvider
,
509 (void**)&service_provider
);
510 ok(hres
== S_OK
, "Could not get IServiceProvicder\n");
512 hres
= IServiceProvider_QueryService(service_provider
, &IID_IHttpNegotiate
,
513 &IID_IHttpNegotiate
, (void**)&http_negotiate
);
514 ok(hres
== S_OK
, "Could not get IHttpNegotiate\n");
516 SET_EXPECT(OnResponse
);
517 hres
= IHttpNegotiate_OnResponse(http_negotiate
, 200, header
, NULL
, NULL
);
518 CHECK_CALLED(OnResponse
);
519 IHttpNegotiate_Release(http_negotiate
);
520 ok(hres
== S_OK
, "OnResponse failed: %08x\n", hres
);
522 hres
= IInternetProtocolSink_ReportProgress(protocol_sink
,
523 BINDSTATUS_MIMETYPEAVAILABLE
, wszTextHtml
);
525 "ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE) failed: %08x\n", hres
);
527 bscf
|= BSCF_FIRSTDATANOTIFICATION
;
532 bscf
= BSCF_INTERMEDIATEDATANOTIFICATION
;
536 hres
= IInternetProtocolSink_ReportData(protocol_sink
, bscf
, 100, 400);
537 ok(hres
== S_OK
, "ReportData failed: %08x\n", hres
);
542 SET_EXPECT(OnProgress_MIMETYPEAVAILABLE
);
543 SET_EXPECT(OnProgress_BEGINDOWNLOADDATA
);
544 SET_EXPECT(LockRequest
);
547 SET_EXPECT(OnProgress_DOWNLOADINGDATA
);
550 SET_EXPECT(OnProgress_DOWNLOADINGDATA
);
551 SET_EXPECT(OnProgress_ENDDOWNLOADDATA
);
553 SET_EXPECT(OnDataAvailable
);
555 SET_EXPECT(OnStopBinding
);
560 static HRESULT WINAPI
Protocol_Abort(IInternetProtocol
*iface
, HRESULT hrReason
,
563 ok(0, "unexpected call\n");
567 static HRESULT WINAPI
Protocol_Terminate(IInternetProtocol
*iface
, DWORD dwOptions
)
569 CHECK_EXPECT(Terminate
);
571 ok(dwOptions
== 0, "dwOptions=%d, expected 0\n", dwOptions
);
574 IInternetProtocolSink_Release(protocol_sink
);
575 protocol_sink
= NULL
;
581 static HRESULT WINAPI
Protocol_Suspend(IInternetProtocol
*iface
)
583 ok(0, "unexpected call\n");
587 static HRESULT WINAPI
Protocol_Resume(IInternetProtocol
*iface
)
589 ok(0, "unexpected call\n");
593 static HRESULT WINAPI
Protocol_Read(IInternetProtocol
*iface
, void *pv
,
594 ULONG cb
, ULONG
*pcbRead
)
596 static const char data
[] = "<HTML></HTML>";
600 if(test_protocol
== HTTP_TEST
) {
603 static BOOL pending
= TRUE
;
625 hres
= IInternetProtocolSink_ReportData(protocol_sink
,
626 BSCF_LASTDATANOTIFICATION
|BSCF_INTERMEDIATEDATANOTIFICATION
, 2000, 2000);
627 ok(hres
== S_OK
, "ReportData failed: %08x\n", hres
);
629 hres
= IInternetProtocolSink_ReportResult(protocol_sink
, S_OK
, 0, NULL
);
630 ok(hres
== S_OK
, "ReportResult failed: %08x\n", hres
);
644 ok(pv
!= NULL
, "pv == NULL\n");
645 ok(cb
!= 0, "cb == 0\n");
646 ok(pcbRead
!= NULL
, "pcbRead == NULL\n");
648 ok(*pcbRead
== 0, "*pcbRead=%d, expected 0\n", *pcbRead
);
649 read
+= *pcbRead
= sizeof(data
)-1;
652 memcpy(pv
, data
, sizeof(data
));
657 static HRESULT WINAPI
Protocol_Seek(IInternetProtocol
*iface
,
658 LARGE_INTEGER dlibMove
, DWORD dwOrigin
, ULARGE_INTEGER
*plibNewPosition
)
660 ok(0, "unexpected call\n");
664 static HRESULT WINAPI
Protocol_LockRequest(IInternetProtocol
*iface
, DWORD dwOptions
)
666 CHECK_EXPECT(LockRequest
);
670 static HRESULT WINAPI
Protocol_UnlockRequest(IInternetProtocol
*iface
)
672 CHECK_EXPECT(UnlockRequest
);
676 static const IInternetProtocolVtbl ProtocolVtbl
= {
677 Protocol_QueryInterface
,
688 Protocol_LockRequest
,
689 Protocol_UnlockRequest
692 static IInternetProtocol Protocol
= { &ProtocolVtbl
};
694 static HRESULT WINAPI
HttpNegotiate_QueryInterface(IHttpNegotiate2
*iface
, REFIID riid
, void **ppv
)
696 if(IsEqualGUID(&IID_IUnknown
, riid
)
697 || IsEqualGUID(&IID_IHttpNegotiate
, riid
)
698 || IsEqualGUID(&IID_IHttpNegotiate2
, riid
)) {
703 ok(0, "unexpected call\n");
704 return E_NOINTERFACE
;
707 static ULONG WINAPI
HttpNegotiate_AddRef(IHttpNegotiate2
*iface
)
712 static ULONG WINAPI
HttpNegotiate_Release(IHttpNegotiate2
*iface
)
717 static HRESULT WINAPI
HttpNegotiate_BeginningTransaction(IHttpNegotiate2
*iface
, LPCWSTR szURL
,
718 LPCWSTR szHeaders
, DWORD dwReserved
, LPWSTR
*pszAdditionalHeaders
)
720 CHECK_EXPECT(BeginningTransaction
);
722 ok(GetCurrentThreadId() == thread_id
, "wrong thread %d\n", GetCurrentThreadId());
724 ok(!lstrcmpW(szURL
, urls
[test_protocol
]), "szURL != urls[test_protocol]\n");
725 ok(!dwReserved
, "dwReserved=%d, expected 0\n", dwReserved
);
726 ok(pszAdditionalHeaders
!= NULL
, "pszAdditionalHeaders == NULL\n");
727 if(pszAdditionalHeaders
)
728 ok(*pszAdditionalHeaders
== NULL
, "*pszAdditionalHeaders != NULL\n");
733 static HRESULT WINAPI
HttpNegotiate_OnResponse(IHttpNegotiate2
*iface
, DWORD dwResponseCode
,
734 LPCWSTR szResponseHeaders
, LPCWSTR szRequestHeaders
, LPWSTR
*pszAdditionalRequestHeaders
)
736 CHECK_EXPECT(OnResponse
);
738 ok(GetCurrentThreadId() == thread_id
, "wrong thread %d\n", GetCurrentThreadId());
740 ok(dwResponseCode
== 200, "dwResponseCode=%d, expected 200\n", dwResponseCode
);
741 ok(szResponseHeaders
!= NULL
, "szResponseHeaders == NULL\n");
742 ok(szRequestHeaders
== NULL
, "szRequestHeaders != NULL\n");
743 /* Note: in protocol.c tests, OnResponse pszAdditionalRequestHeaders _is_ NULL */
744 ok(pszAdditionalRequestHeaders
!= NULL
, "pszAdditionalHeaders == NULL\n");
745 if(pszAdditionalRequestHeaders
)
746 ok(*pszAdditionalRequestHeaders
== NULL
, "*pszAdditionalHeaders != NULL\n");
751 static HRESULT WINAPI
HttpNegotiate_GetRootSecurityId(IHttpNegotiate2
*iface
,
752 BYTE
*pbSecurityId
, DWORD
*pcbSecurityId
, DWORD_PTR dwReserved
)
754 static const BYTE sec_id
[] = {'h','t','t','p',':','t','e','s','t',1,0,0,0};
756 CHECK_EXPECT(GetRootSecurityId
);
758 ok(GetCurrentThreadId() == thread_id
, "wrong thread %d\n", GetCurrentThreadId());
760 ok(!dwReserved
, "dwReserved=%ld, expected 0\n", dwReserved
);
761 ok(pbSecurityId
!= NULL
, "pbSecurityId == NULL\n");
762 ok(pcbSecurityId
!= NULL
, "pcbSecurityId == NULL\n");
764 if(pbSecurityId
== (void*)0xdeadbeef)
768 ok(*pcbSecurityId
== 512, "*pcbSecurityId=%d, expected 512\n", *pcbSecurityId
);
769 *pcbSecurityId
= sizeof(sec_id
);
773 memcpy(pbSecurityId
, sec_id
, sizeof(sec_id
));
778 static IHttpNegotiate2Vtbl HttpNegotiateVtbl
= {
779 HttpNegotiate_QueryInterface
,
780 HttpNegotiate_AddRef
,
781 HttpNegotiate_Release
,
782 HttpNegotiate_BeginningTransaction
,
783 HttpNegotiate_OnResponse
,
784 HttpNegotiate_GetRootSecurityId
787 static IHttpNegotiate2 HttpNegotiate
= { &HttpNegotiateVtbl
};
789 static HRESULT WINAPI
ServiceProvider_QueryInterface(IServiceProvider
*iface
, REFIID riid
, void **ppv
)
791 ok(0, "unexpected call\n");
792 return E_NOINTERFACE
;
795 static ULONG WINAPI
ServiceProvider_AddRef(IServiceProvider
*iface
)
800 static ULONG WINAPI
ServiceProvider_Release(IServiceProvider
*iface
)
805 static HRESULT WINAPI
ServiceProvider_QueryService(IServiceProvider
*iface
,
806 REFGUID guidService
, REFIID riid
, void **ppv
)
808 if(IsEqualGUID(&IID_IAuthenticate
, guidService
)) {
809 CHECK_EXPECT(QueryService_IAuthenticate
);
813 if(IsEqualGUID(&IID_IInternetProtocol
, guidService
)) {
814 CHECK_EXPECT2(QueryService_IInternetProtocol
);
818 if(IsEqualGUID(&IID_IInternetBindInfo
, guidService
)) {
819 CHECK_EXPECT(QueryService_IInternetBindInfo
);
823 ok(0, "unexpected service %s\n", debugstr_guid(guidService
));
824 return E_NOINTERFACE
;
827 static IServiceProviderVtbl ServiceProviderVtbl
= {
828 ServiceProvider_QueryInterface
,
829 ServiceProvider_AddRef
,
830 ServiceProvider_Release
,
831 ServiceProvider_QueryService
834 static IServiceProvider ServiceProvider
= { &ServiceProviderVtbl
};
836 static HRESULT WINAPI
statusclb_QueryInterface(IBindStatusCallback
*iface
, REFIID riid
, void **ppv
)
838 ok(GetCurrentThreadId() == thread_id
, "wrong thread %d\n", GetCurrentThreadId());
840 if(IsEqualGUID(&IID_IInternetProtocol
, riid
)) {
841 CHECK_EXPECT2(QueryInterface_IInternetProtocol
);
842 if(emulate_protocol
) {
846 return E_NOINTERFACE
;
849 else if (IsEqualGUID(&IID_IServiceProvider
, riid
))
851 CHECK_EXPECT2(QueryInterface_IServiceProvider
);
852 *ppv
= &ServiceProvider
;
855 else if (IsEqualGUID(&IID_IHttpNegotiate
, riid
))
857 CHECK_EXPECT(QueryInterface_IHttpNegotiate
);
858 *ppv
= &HttpNegotiate
;
861 else if (IsEqualGUID(&IID_IHttpNegotiate2
, riid
))
863 CHECK_EXPECT(QueryInterface_IHttpNegotiate2
);
864 *ppv
= &HttpNegotiate
;
867 else if (IsEqualGUID(&IID_IAuthenticate
, riid
))
869 CHECK_EXPECT(QueryInterface_IAuthenticate
);
870 return E_NOINTERFACE
;
872 else if(IsEqualGUID(&IID_IBindStatusCallback
, riid
))
874 CHECK_EXPECT2(QueryInterface_IBindStatusCallback
);
878 else if(IsEqualGUID(&IID_IBindStatusCallbackHolder
, riid
))
880 CHECK_EXPECT2(QueryInterface_IBindStatusCallbackHolder
);
881 return E_NOINTERFACE
;
883 else if(IsEqualGUID(&IID_IInternetBindInfo
, riid
))
886 CHECK_EXPECT2(QueryInterface_IInternetBindInfo
);
890 ok(0, "unexpected interface %s\n", debugstr_guid(riid
));
893 return E_NOINTERFACE
;
896 static ULONG WINAPI
statusclb_AddRef(IBindStatusCallback
*iface
)
901 static ULONG WINAPI
statusclb_Release(IBindStatusCallback
*iface
)
906 static HRESULT WINAPI
statusclb_OnStartBinding(IBindStatusCallback
*iface
, DWORD dwReserved
,
912 CHECK_EXPECT(OnStartBinding
);
914 ok(GetCurrentThreadId() == thread_id
, "wrong thread %d\n", GetCurrentThreadId());
916 ok(pib
!= NULL
, "pib should not be NULL\n");
917 ok(dwReserved
== 0xff, "dwReserved=%x\n", dwReserved
);
919 if(pib
== (void*)0xdeadbeef)
922 hres
= IBinding_QueryInterface(pib
, &IID_IMoniker
, (void**)&mon
);
923 ok(hres
== E_NOINTERFACE
, "IBinding should not have IMoniker interface\n");
925 IMoniker_Release(mon
);
930 static HRESULT WINAPI
statusclb_GetPriority(IBindStatusCallback
*iface
, LONG
*pnPriority
)
932 ok(0, "unexpected call\n");
936 static HRESULT WINAPI
statusclb_OnLowResource(IBindStatusCallback
*iface
, DWORD reserved
)
938 ok(0, "unexpected call\n");
942 static HRESULT WINAPI
statusclb_OnProgress(IBindStatusCallback
*iface
, ULONG ulProgress
,
943 ULONG ulProgressMax
, ULONG ulStatusCode
, LPCWSTR szStatusText
)
945 ok(GetCurrentThreadId() == thread_id
, "wrong thread %d\n", GetCurrentThreadId());
947 switch(ulStatusCode
) {
948 case BINDSTATUS_FINDINGRESOURCE
:
949 CHECK_EXPECT(OnProgress_FINDINGRESOURCE
);
950 if((bindf
& BINDF_ASYNCHRONOUS
) && emulate_protocol
)
951 SetEvent(complete_event
);
953 case BINDSTATUS_CONNECTING
:
954 CHECK_EXPECT(OnProgress_CONNECTING
);
955 if((bindf
& BINDF_ASYNCHRONOUS
) && emulate_protocol
)
956 SetEvent(complete_event
);
958 case BINDSTATUS_SENDINGREQUEST
:
959 CHECK_EXPECT(OnProgress_SENDINGREQUEST
);
960 if((bindf
& BINDF_ASYNCHRONOUS
) && emulate_protocol
)
961 SetEvent(complete_event
);
963 case BINDSTATUS_MIMETYPEAVAILABLE
:
964 CHECK_EXPECT(OnProgress_MIMETYPEAVAILABLE
);
965 ok(download_state
== BEFORE_DOWNLOAD
, "Download state was %d, expected BEFORE_DOWNLOAD\n",
967 WideCharToMultiByte(CP_ACP
, 0, szStatusText
, -1, mime_type
, sizeof(mime_type
)-1, NULL
, NULL
);
969 case BINDSTATUS_BEGINDOWNLOADDATA
:
970 CHECK_EXPECT(OnProgress_BEGINDOWNLOADDATA
);
971 ok(szStatusText
!= NULL
, "szStatusText == NULL\n");
973 ok(!lstrcmpW(szStatusText
, urls
[test_protocol
]), "wrong szStatusText\n");
974 ok(download_state
== BEFORE_DOWNLOAD
, "Download state was %d, expected BEFORE_DOWNLOAD\n",
976 download_state
= DOWNLOADING
;
978 case BINDSTATUS_DOWNLOADINGDATA
:
979 CHECK_EXPECT2(OnProgress_DOWNLOADINGDATA
);
980 ok(download_state
== DOWNLOADING
, "Download state was %d, expected DOWNLOADING\n",
983 case BINDSTATUS_ENDDOWNLOADDATA
:
984 CHECK_EXPECT(OnProgress_ENDDOWNLOADDATA
);
985 ok(szStatusText
!= NULL
, "szStatusText == NULL\n");
987 ok(!lstrcmpW(szStatusText
, urls
[test_protocol
]), "wrong szStatusText\n");
988 ok(download_state
== DOWNLOADING
, "Download state was %d, expected DOWNLOADING\n",
990 download_state
= END_DOWNLOAD
;
992 case BINDSTATUS_CACHEFILENAMEAVAILABLE
:
993 ok(szStatusText
!= NULL
, "szStatusText == NULL\n");
994 if(szStatusText
&& test_protocol
== FILE_TEST
)
995 ok(!lstrcmpW(INDEX_HTML
+7, szStatusText
), "wrong szStatusText\n");
997 case BINDSTATUS_CLASSIDAVAILABLE
:
1001 CHECK_EXPECT(OnProgress_CLASSIDAVAILABLE
);
1002 hr
= CLSIDFromString((LPOLESTR
)szStatusText
, &clsid
);
1003 ok(hr
== S_OK
, "CLSIDFromString failed with error 0x%08x\n", hr
);
1004 ok(IsEqualCLSID(&clsid
, &CLSID_HTMLDocument
),
1005 "Expected clsid to be CLSID_HTMLDocument instead of {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",
1006 clsid
.Data1
, clsid
.Data2
, clsid
.Data3
,
1007 clsid
.Data4
[0], clsid
.Data4
[1], clsid
.Data4
[2], clsid
.Data4
[3],
1008 clsid
.Data4
[4], clsid
.Data4
[5], clsid
.Data4
[6], clsid
.Data4
[7]);
1011 case BINDSTATUS_BEGINSYNCOPERATION
:
1012 CHECK_EXPECT(OnProgress_BEGINSYNCOPERATION
);
1013 ok(szStatusText
== NULL
, "Expected szStatusText to be NULL\n");
1015 case BINDSTATUS_ENDSYNCOPERATION
:
1016 CHECK_EXPECT(OnProgress_ENDSYNCOPERATION
);
1017 ok(szStatusText
== NULL
, "Expected szStatusText to be NULL\n");
1020 ok(0, "unexpexted code %d\n", ulStatusCode
);
1025 static HRESULT WINAPI
statusclb_OnStopBinding(IBindStatusCallback
*iface
, HRESULT hresult
, LPCWSTR szError
)
1027 CHECK_EXPECT(OnStopBinding
);
1029 ok(GetCurrentThreadId() == thread_id
, "wrong thread %d\n", GetCurrentThreadId());
1031 stopped_binding
= TRUE
;
1033 /* ignore DNS failure */
1034 if (hresult
== HRESULT_FROM_WIN32(ERROR_INTERNET_NAME_NOT_RESOLVED
))
1037 ok(hresult
== S_OK
, "binding failed: %08x\n", hresult
);
1038 ok(szError
== NULL
, "szError should be NULL\n");
1040 if(test_protocol
== HTTP_TEST
&& emulate_protocol
) {
1041 SetEvent(complete_event
);
1042 WaitForSingleObject(complete_event2
, INFINITE
);
1048 static HRESULT WINAPI
statusclb_GetBindInfo(IBindStatusCallback
*iface
, DWORD
*grfBINDF
, BINDINFO
*pbindinfo
)
1052 CHECK_EXPECT(GetBindInfo
);
1054 ok(GetCurrentThreadId() == thread_id
, "wrong thread %d\n", GetCurrentThreadId());
1057 cbSize
= pbindinfo
->cbSize
;
1058 memset(pbindinfo
, 0, cbSize
);
1059 pbindinfo
->cbSize
= cbSize
;
1064 static HRESULT WINAPI
statusclb_OnDataAvailable(IBindStatusCallback
*iface
, DWORD grfBSCF
,
1065 DWORD dwSize
, FORMATETC
* pformatetc
, STGMEDIUM
* pstgmed
)
1072 CHECK_EXPECT2(OnDataAvailable
);
1074 ok(GetCurrentThreadId() == thread_id
, "wrong thread %d\n", GetCurrentThreadId());
1076 ok(download_state
== DOWNLOADING
|| download_state
== END_DOWNLOAD
,
1077 "Download state was %d, expected DOWNLOADING or END_DOWNLOAD\n",
1079 data_available
= TRUE
;
1081 ok(pformatetc
!= NULL
, "pformatetx == NULL\n");
1083 if (mime_type
[0]) todo_wine
{
1085 ok(GetClipboardFormatName(pformatetc
->cfFormat
, clipfmt
, sizeof(clipfmt
)-1),
1086 "GetClipboardFormatName failed, error %d\n", GetLastError());
1087 ok(!lstrcmp(clipfmt
, mime_type
), "clipformat != mime_type, \"%s\" != \"%s\"\n",
1088 clipfmt
, mime_type
);
1090 ok(pformatetc
->cfFormat
== 0, "clipformat=%x\n", pformatetc
->cfFormat
);
1092 ok(pformatetc
->ptd
== NULL
, "ptd = %p\n", pformatetc
->ptd
);
1093 ok(pformatetc
->dwAspect
== 1, "dwAspect=%u\n", pformatetc
->dwAspect
);
1094 ok(pformatetc
->lindex
== -1, "lindex=%d\n", pformatetc
->lindex
);
1095 ok(pformatetc
->tymed
== TYMED_ISTREAM
, "tymed=%u\n", pformatetc
->tymed
);
1098 ok(pstgmed
!= NULL
, "stgmeg == NULL\n");
1100 ok(pstgmed
->tymed
== TYMED_ISTREAM
, "tymed=%u\n", pstgmed
->tymed
);
1101 ok(U(*pstgmed
).pstm
!= NULL
, "pstm == NULL\n");
1102 ok(pstgmed
->pUnkForRelease
!= NULL
, "pUnkForRelease == NULL\n");
1105 if(grfBSCF
& BSCF_FIRSTDATANOTIFICATION
) {
1106 hres
= IStream_Write(U(*pstgmed
).pstm
, buf
, 10, NULL
);
1107 ok(hres
== STG_E_ACCESSDENIED
,
1108 "Write failed: %08x, expected STG_E_ACCESSDENIED\n", hres
);
1110 hres
= IStream_Commit(U(*pstgmed
).pstm
, 0);
1111 ok(hres
== E_NOTIMPL
, "Commit failed: %08x, expected E_NOTIMPL\n", hres
);
1113 hres
= IStream_Revert(U(*pstgmed
).pstm
);
1114 ok(hres
== E_NOTIMPL
, "Revert failed: %08x, expected E_NOTIMPL\n", hres
);
1117 ok(U(*pstgmed
).pstm
!= NULL
, "U(*pstgmed).pstm == NULL\n");
1119 if(U(*pstgmed
).pstm
) {
1120 do hres
= IStream_Read(U(*pstgmed
).pstm
, buf
, 512, &readed
);
1121 while(hres
== S_OK
);
1122 ok(hres
== S_FALSE
|| hres
== E_PENDING
, "IStream_Read returned %08x\n", hres
);
1125 if(test_protocol
== HTTP_TEST
&& emulate_protocol
&& prot_state
< 4)
1126 SetEvent(complete_event
);
1131 static HRESULT WINAPI
statusclb_OnObjectAvailable(IBindStatusCallback
*iface
, REFIID riid
, IUnknown
*punk
)
1133 CHECK_EXPECT(OnObjectAvailable
);
1137 static const IBindStatusCallbackVtbl BindStatusCallbackVtbl
= {
1138 statusclb_QueryInterface
,
1141 statusclb_OnStartBinding
,
1142 statusclb_GetPriority
,
1143 statusclb_OnLowResource
,
1144 statusclb_OnProgress
,
1145 statusclb_OnStopBinding
,
1146 statusclb_GetBindInfo
,
1147 statusclb_OnDataAvailable
,
1148 statusclb_OnObjectAvailable
1151 static IBindStatusCallback bsc
= { &BindStatusCallbackVtbl
};
1153 static void test_CreateAsyncBindCtx(void)
1155 IBindCtx
*bctx
= (IBindCtx
*)0x0ff00ff0;
1161 hres
= CreateAsyncBindCtx(0, NULL
, NULL
, &bctx
);
1162 ok(hres
== E_INVALIDARG
, "CreateAsyncBindCtx failed. expected: E_INVALIDARG, got: %08x\n", hres
);
1163 ok(bctx
== (IBindCtx
*)0x0ff00ff0, "bctx should not be changed\n");
1165 hres
= CreateAsyncBindCtx(0, NULL
, NULL
, NULL
);
1166 ok(hres
== E_INVALIDARG
, "CreateAsyncBindCtx failed. expected: E_INVALIDARG, got: %08x\n", hres
);
1168 SET_EXPECT(QueryInterface_IServiceProvider
);
1169 hres
= CreateAsyncBindCtx(0, &bsc
, NULL
, &bctx
);
1170 ok(hres
== S_OK
, "CreateAsyncBindCtx failed: %08x\n", hres
);
1171 CHECK_CALLED(QueryInterface_IServiceProvider
);
1173 bindopts
.cbStruct
= sizeof(bindopts
);
1174 hres
= IBindCtx_GetBindOptions(bctx
, &bindopts
);
1175 ok(SUCCEEDED(hres
), "IBindCtx_GetBindOptions failed: %08x\n", hres
);
1176 ok(bindopts
.grfFlags
== BIND_MAYBOTHERUSER
,
1177 "bindopts.grfFlags = %08x, expected: BIND_MAYBOTHERUSER\n", bindopts
.grfFlags
);
1178 ok(bindopts
.grfMode
== (STGM_READWRITE
| STGM_SHARE_EXCLUSIVE
),
1179 "bindopts.grfMode = %08x, expected: STGM_READWRITE | STGM_SHARE_EXCLUSIVE\n",
1181 ok(bindopts
.dwTickCountDeadline
== 0,
1182 "bindopts.dwTickCountDeadline = %08x, expected: 0\n", bindopts
.dwTickCountDeadline
);
1184 hres
= IBindCtx_QueryInterface(bctx
, &IID_IAsyncBindCtx
, (void**)&unk
);
1185 ok(hres
== E_NOINTERFACE
, "QueryInterface(IID_IAsyncBindCtx) failed: %08x, expected E_NOINTERFACE\n", hres
);
1187 IUnknown_Release(unk
);
1189 ref
= IBindCtx_Release(bctx
);
1190 ok(ref
== 0, "bctx should be destroyed here\n");
1193 static void test_CreateAsyncBindCtxEx(void)
1195 IBindCtx
*bctx
= NULL
, *bctx_arg
= NULL
;
1200 hres
= CreateAsyncBindCtxEx(NULL
, 0, NULL
, NULL
, NULL
, 0);
1201 ok(hres
== E_INVALIDARG
, "CreateAsyncBindCtx failed: %08x, expected E_INVALIDARG\n", hres
);
1203 hres
= CreateAsyncBindCtxEx(NULL
, 0, NULL
, NULL
, &bctx
, 0);
1204 ok(hres
== S_OK
, "CreateAsyncBindCtxEx failed: %08x\n", hres
);
1206 if(SUCCEEDED(hres
)) {
1207 bindopts
.cbStruct
= sizeof(bindopts
);
1208 hres
= IBindCtx_GetBindOptions(bctx
, &bindopts
);
1209 ok(SUCCEEDED(hres
), "IBindCtx_GetBindOptions failed: %08x\n", hres
);
1210 ok(bindopts
.grfFlags
== BIND_MAYBOTHERUSER
,
1211 "bindopts.grfFlags = %08x, expected: BIND_MAYBOTHERUSER\n", bindopts
.grfFlags
);
1212 ok(bindopts
.grfMode
== (STGM_READWRITE
| STGM_SHARE_EXCLUSIVE
),
1213 "bindopts.grfMode = %08x, expected: STGM_READWRITE | STGM_SHARE_EXCLUSIVE\n",
1215 ok(bindopts
.dwTickCountDeadline
== 0,
1216 "bindopts.dwTickCountDeadline = %08x, expected: 0\n", bindopts
.dwTickCountDeadline
);
1218 IBindCtx_Release(bctx
);
1221 CreateBindCtx(0, &bctx_arg
);
1222 hres
= CreateAsyncBindCtxEx(NULL
, 0, NULL
, NULL
, &bctx
, 0);
1223 ok(hres
== S_OK
, "CreateAsyncBindCtxEx failed: %08x\n", hres
);
1225 if(SUCCEEDED(hres
)) {
1226 bindopts
.cbStruct
= sizeof(bindopts
);
1227 hres
= IBindCtx_GetBindOptions(bctx
, &bindopts
);
1228 ok(SUCCEEDED(hres
), "IBindCtx_GetBindOptions failed: %08x\n", hres
);
1229 ok(bindopts
.grfFlags
== BIND_MAYBOTHERUSER
,
1230 "bindopts.grfFlags = %08x, expected: BIND_MAYBOTHERUSER\n", bindopts
.grfFlags
);
1231 ok(bindopts
.grfMode
== (STGM_READWRITE
| STGM_SHARE_EXCLUSIVE
),
1232 "bindopts.grfMode = %08x, expected: STGM_READWRITE | STGM_SHARE_EXCLUSIVE\n",
1234 ok(bindopts
.dwTickCountDeadline
== 0,
1235 "bindopts.dwTickCountDeadline = %08x, expected: 0\n", bindopts
.dwTickCountDeadline
);
1237 IBindCtx_Release(bctx
);
1240 IBindCtx_Release(bctx_arg
);
1242 SET_EXPECT(QueryInterface_IServiceProvider
);
1243 hres
= CreateAsyncBindCtxEx(NULL
, 0, &bsc
, NULL
, &bctx
, 0);
1244 ok(hres
== S_OK
, "CreateAsyncBindCtxEx failed: %08x\n", hres
);
1245 CHECK_CALLED(QueryInterface_IServiceProvider
);
1247 hres
= IBindCtx_QueryInterface(bctx
, &IID_IAsyncBindCtx
, (void**)&unk
);
1248 ok(hres
== S_OK
, "QueryInterface(IID_IAsyncBindCtx) failed: %08x\n", hres
);
1250 IUnknown_Release(unk
);
1253 IBindCtx_Release(bctx
);
1256 static void test_bscholder(IBindStatusCallback
*holder
)
1258 IServiceProvider
*serv_prov
;
1259 IHttpNegotiate
*http_negotiate
, *http_negotiate_serv
;
1260 IHttpNegotiate2
*http_negotiate2
, *http_negotiate2_serv
;
1261 IAuthenticate
*authenticate
, *authenticate_serv
;
1262 IInternetProtocol
*protocol
;
1263 BINDINFO bindinfo
= {sizeof(bindinfo
)};
1268 static const WCHAR emptyW
[] = {0};
1270 hres
= IBindStatusCallback_QueryInterface(holder
, &IID_IServiceProvider
, (void**)&serv_prov
);
1271 ok(hres
== S_OK
, "Could not get IServiceProvider interface: %08x\n", hres
);
1274 SET_EXPECT(GetBindInfo
);
1275 hres
= IBindStatusCallback_GetBindInfo(holder
, &dw
, &bindinfo
);
1276 ok(hres
== S_OK
, "GetBindInfo failed: %08x\n", hres
);
1277 CHECK_CALLED(GetBindInfo
);
1279 SET_EXPECT(OnStartBinding
);
1280 hres
= IBindStatusCallback_OnStartBinding(holder
, 0, (void*)0xdeadbeef);
1281 ok(hres
== S_OK
, "OnStartBinding failed: %08x\n", hres
);
1282 CHECK_CALLED(OnStartBinding
);
1284 hres
= IBindStatusCallback_QueryInterface(holder
, &IID_IHttpNegotiate
, (void**)&http_negotiate
);
1285 ok(hres
== S_OK
, "Could not get IHttpNegotiate interface: %08x\n", hres
);
1287 wstr
= (void*)0xdeadbeef;
1288 hres
= IHttpNegotiate_BeginningTransaction(http_negotiate
, urls
[test_protocol
], (void*)0xdeadbeef, 0xff, &wstr
);
1289 ok(hres
== S_OK
, "BeginningTransaction failed: %08x\n", hres
);
1290 ok(wstr
== NULL
, "wstr = %p\n", wstr
);
1292 SET_EXPECT(QueryInterface_IHttpNegotiate
);
1293 hres
= IServiceProvider_QueryService(serv_prov
, &IID_IHttpNegotiate
, &IID_IHttpNegotiate
,
1294 (void**)&http_negotiate_serv
);
1295 ok(hres
== S_OK
, "Could not get IHttpNegotiate service: %08x\n", hres
);
1296 CHECK_CALLED(QueryInterface_IHttpNegotiate
);
1298 ok(http_negotiate
== http_negotiate_serv
, "http_negotiate != http_negotiate_serv\n");
1300 wstr
= (void*)0xdeadbeef;
1301 SET_EXPECT(BeginningTransaction
);
1302 hres
= IHttpNegotiate_BeginningTransaction(http_negotiate_serv
, urls
[test_protocol
], emptyW
, 0, &wstr
);
1303 CHECK_CALLED(BeginningTransaction
);
1304 ok(hres
== S_OK
, "BeginningTransaction failed: %08x\n", hres
);
1305 ok(wstr
== NULL
, "wstr = %p\n", wstr
);
1307 IHttpNegotiate_Release(http_negotiate_serv
);
1309 hres
= IServiceProvider_QueryService(serv_prov
, &IID_IHttpNegotiate
, &IID_IHttpNegotiate
,
1310 (void**)&http_negotiate_serv
);
1311 ok(hres
== S_OK
, "Could not get IHttpNegotiate service: %08x\n", hres
);
1312 ok(http_negotiate
== http_negotiate_serv
, "http_negotiate != http_negotiate_serv\n");
1313 IHttpNegotiate_Release(http_negotiate_serv
);
1315 hres
= IBindStatusCallback_QueryInterface(holder
, &IID_IHttpNegotiate2
, (void**)&http_negotiate2
);
1316 ok(hres
== S_OK
, "Could not get IHttpNegotiate2 interface: %08x\n", hres
);
1318 hres
= IHttpNegotiate2_GetRootSecurityId(http_negotiate2
, (void*)0xdeadbeef, (void*)0xdeadbeef, 0);
1319 ok(hres
== E_FAIL
, "GetRootSecurityId failed: %08x\n", hres
);
1321 IHttpNegotiate_Release(http_negotiate2
);
1323 SET_EXPECT(QueryInterface_IHttpNegotiate2
);
1324 hres
= IServiceProvider_QueryService(serv_prov
, &IID_IHttpNegotiate2
, &IID_IHttpNegotiate2
,
1325 (void**)&http_negotiate2_serv
);
1326 ok(hres
== S_OK
, "Could not get IHttpNegotiate2 service: %08x\n", hres
);
1327 CHECK_CALLED(QueryInterface_IHttpNegotiate2
);
1328 ok(http_negotiate2
== http_negotiate2_serv
, "http_negotiate != http_negotiate_serv\n");
1330 SET_EXPECT(GetRootSecurityId
);
1331 hres
= IHttpNegotiate2_GetRootSecurityId(http_negotiate2
, (void*)0xdeadbeef, (void*)0xdeadbeef, 0);
1332 ok(hres
== E_NOTIMPL
, "GetRootSecurityId failed: %08x\n", hres
);
1333 CHECK_CALLED(GetRootSecurityId
);
1335 IHttpNegotiate_Release(http_negotiate2_serv
);
1337 SET_EXPECT(OnProgress_FINDINGRESOURCE
);
1338 hres
= IBindStatusCallback_OnProgress(holder
, 0, 0, BINDSTATUS_FINDINGRESOURCE
, NULL
);
1339 ok(hres
== S_OK
, "OnProgress failed: %08x\n", hres
);
1340 CHECK_CALLED(OnProgress_FINDINGRESOURCE
);
1342 SET_EXPECT(OnResponse
);
1343 wstr
= (void*)0xdeadbeef;
1344 hres
= IHttpNegotiate_OnResponse(http_negotiate
, 200, emptyW
, NULL
, NULL
);
1345 ok(hres
== S_OK
, "OnResponse failed: %08x\n", hres
);
1346 CHECK_CALLED(OnResponse
);
1348 IHttpNegotiate_Release(http_negotiate
);
1350 hres
= IBindStatusCallback_QueryInterface(holder
, &IID_IAuthenticate
, (void**)&authenticate
);
1351 ok(hres
== S_OK
, "Could not get IAuthenticate interface: %08x\n", hres
);
1353 SET_EXPECT(QueryInterface_IAuthenticate
);
1354 SET_EXPECT(QueryService_IAuthenticate
);
1355 hres
= IServiceProvider_QueryService(serv_prov
, &IID_IAuthenticate
, &IID_IAuthenticate
,
1356 (void**)&authenticate_serv
);
1357 ok(hres
== S_OK
, "Could not get IAuthenticate service: %08x\n", hres
);
1358 CHECK_CALLED(QueryInterface_IAuthenticate
);
1359 CHECK_CALLED(QueryService_IAuthenticate
);
1360 ok(authenticate
== authenticate_serv
, "authenticate != authenticate_serv\n");
1361 IAuthenticate_Release(authenticate_serv
);
1363 hres
= IServiceProvider_QueryService(serv_prov
, &IID_IAuthenticate
, &IID_IAuthenticate
,
1364 (void**)&authenticate_serv
);
1365 ok(hres
== S_OK
, "Could not get IAuthenticate service: %08x\n", hres
);
1366 ok(authenticate
== authenticate_serv
, "authenticate != authenticate_serv\n");
1368 IAuthenticate_Release(authenticate
);
1369 IAuthenticate_Release(authenticate_serv
);
1371 SET_EXPECT(OnStopBinding
);
1372 hres
= IBindStatusCallback_OnStopBinding(holder
, S_OK
, NULL
);
1373 ok(hres
== S_OK
, "OnStopBinding failed: %08x\n", hres
);
1374 CHECK_CALLED(OnStopBinding
);
1376 SET_EXPECT(QueryInterface_IInternetProtocol
);
1377 SET_EXPECT(QueryService_IInternetProtocol
);
1378 hres
= IServiceProvider_QueryService(serv_prov
, &IID_IInternetProtocol
, &IID_IInternetProtocol
,
1380 ok(hres
== E_NOINTERFACE
, "QueryService(IInternetProtocol) failed: %08x\n", hres
);
1381 CHECK_CALLED(QueryInterface_IInternetProtocol
);
1382 CHECK_CALLED(QueryService_IInternetProtocol
);
1384 IServiceProvider_Release(serv_prov
);
1387 static void test_RegisterBindStatusCallback(void)
1389 IBindStatusCallback
*prevbsc
, *clb
;
1394 hres
= CreateBindCtx(0, &bindctx
);
1395 ok(hres
== S_OK
, "BindCtx failed: %08x\n", hres
);
1397 SET_EXPECT(QueryInterface_IServiceProvider
);
1399 hres
= IBindCtx_RegisterObjectParam(bindctx
, BSCBHolder
, (IUnknown
*)&bsc
);
1400 ok(hres
== S_OK
, "RegisterObjectParam failed: %08x\n", hres
);
1402 SET_EXPECT(QueryInterface_IBindStatusCallback
);
1403 SET_EXPECT(QueryInterface_IBindStatusCallbackHolder
);
1404 prevbsc
= (void*)0xdeadbeef;
1405 hres
= RegisterBindStatusCallback(bindctx
, &bsc
, &prevbsc
, 0);
1406 ok(hres
== S_OK
, "RegisterBindStatusCallback failed: %08x\n", hres
);
1407 ok(prevbsc
== &bsc
, "prevbsc=%p\n", prevbsc
);
1408 CHECK_CALLED(QueryInterface_IBindStatusCallback
);
1409 CHECK_CALLED(QueryInterface_IBindStatusCallbackHolder
);
1411 CHECK_CALLED(QueryInterface_IServiceProvider
);
1413 hres
= IBindCtx_GetObjectParam(bindctx
, BSCBHolder
, &unk
);
1414 ok(hres
== S_OK
, "GetObjectParam failed: %08x\n", hres
);
1416 hres
= IUnknown_QueryInterface(unk
, &IID_IBindStatusCallback
, (void**)&clb
);
1417 IUnknown_Release(unk
);
1418 ok(hres
== S_OK
, "QueryInterface(IID_IBindStatusCallback) failed: %08x\n", hres
);
1419 ok(clb
!= &bsc
, "bsc == clb\n");
1421 test_bscholder(clb
);
1423 IBindStatusCallback_Release(clb
);
1425 hres
= RevokeBindStatusCallback(bindctx
, &bsc
);
1426 ok(hres
== S_OK
, "RevokeBindStatusCallback failed: %08x\n", hres
);
1428 unk
= (void*)0xdeadbeef;
1429 hres
= IBindCtx_GetObjectParam(bindctx
, BSCBHolder
, &unk
);
1430 ok(hres
== E_FAIL
, "GetObjectParam failed: %08x\n", hres
);
1431 ok(unk
== NULL
, "unk != NULL\n");
1434 IUnknown_Release(unk
);
1436 hres
= RevokeBindStatusCallback(bindctx
, (void*)0xdeadbeef);
1437 ok(hres
== S_OK
, "RevokeBindStatusCallback failed: %08x\n", hres
);
1439 hres
= RevokeBindStatusCallback(NULL
, (void*)0xdeadbeef);
1440 ok(hres
== E_INVALIDARG
, "RevokeBindStatusCallback failed: %08x\n", hres
);
1442 hres
= RevokeBindStatusCallback(bindctx
, NULL
);
1443 ok(hres
== E_INVALIDARG
, "RevokeBindStatusCallback failed: %08x\n", hres
);
1445 IBindCtx_Release(bindctx
);
1448 static void test_BindToStorage(int protocol
, BOOL emul
)
1452 LPOLESTR display_name
;
1455 IBindStatusCallback
*previousclb
;
1456 IUnknown
*unk
= (IUnknown
*)0x00ff00ff;
1459 test_protocol
= protocol
;
1460 emulate_protocol
= emul
;
1461 download_state
= BEFORE_DOWNLOAD
;
1462 stopped_binding
= FALSE
;
1463 data_available
= FALSE
;
1466 SET_EXPECT(QueryInterface_IServiceProvider
);
1467 hres
= CreateAsyncBindCtx(0, &bsc
, NULL
, &bctx
);
1468 ok(hres
== S_OK
, "CreateAsyncBindCtx failed: %08x\n\n", hres
);
1469 CHECK_CALLED(QueryInterface_IServiceProvider
);
1473 SET_EXPECT(QueryInterface_IServiceProvider
);
1474 hres
= RegisterBindStatusCallback(bctx
, &bsc
, &previousclb
, 0);
1475 ok(hres
== S_OK
, "RegisterBindStatusCallback failed: %08x\n", hres
);
1476 ok(previousclb
== &bsc
, "previousclb(%p) != sclb(%p)\n", previousclb
, &bsc
);
1477 CHECK_CALLED(QueryInterface_IServiceProvider
);
1479 IBindStatusCallback_Release(previousclb
);
1481 hres
= CreateURLMoniker(NULL
, urls
[test_protocol
], &mon
);
1482 ok(SUCCEEDED(hres
), "failed to create moniker: %08x\n", hres
);
1484 IBindCtx_Release(bctx
);
1488 if(test_protocol
== FILE_TEST
&& INDEX_HTML
[7] == '/')
1489 memmove(INDEX_HTML
+7, INDEX_HTML
+8, lstrlenW(INDEX_HTML
+7)*sizeof(WCHAR
));
1491 hres
= IMoniker_QueryInterface(mon
, &IID_IBinding
, (void**)&bind
);
1492 ok(hres
== E_NOINTERFACE
, "IMoniker should not have IBinding interface\n");
1494 IBinding_Release(bind
);
1496 hres
= IMoniker_GetDisplayName(mon
, bctx
, NULL
, &display_name
);
1497 ok(hres
== S_OK
, "GetDisplayName failed %08x\n", hres
);
1498 ok(!lstrcmpW(display_name
, urls
[test_protocol
]), "GetDisplayName got wrong name\n");
1500 SET_EXPECT(GetBindInfo
);
1501 SET_EXPECT(QueryInterface_IInternetProtocol
);
1502 if(!emulate_protocol
)
1503 SET_EXPECT(QueryService_IInternetProtocol
);
1504 SET_EXPECT(OnStartBinding
);
1505 if(emulate_protocol
) {
1507 if(test_protocol
== HTTP_TEST
)
1508 SET_EXPECT(Terminate
);
1509 SET_EXPECT(UnlockRequest
);
1511 if(test_protocol
== HTTP_TEST
) {
1512 SET_EXPECT(QueryInterface_IHttpNegotiate
);
1513 SET_EXPECT(BeginningTransaction
);
1514 SET_EXPECT(QueryInterface_IHttpNegotiate2
);
1515 SET_EXPECT(GetRootSecurityId
);
1516 SET_EXPECT(OnProgress_FINDINGRESOURCE
);
1517 SET_EXPECT(OnProgress_CONNECTING
);
1519 if(test_protocol
== HTTP_TEST
|| test_protocol
== FILE_TEST
)
1520 SET_EXPECT(OnProgress_SENDINGREQUEST
);
1521 if(test_protocol
== HTTP_TEST
)
1522 SET_EXPECT(OnResponse
);
1523 SET_EXPECT(OnProgress_MIMETYPEAVAILABLE
);
1524 SET_EXPECT(OnProgress_BEGINDOWNLOADDATA
);
1525 if(test_protocol
== HTTP_TEST
)
1526 SET_EXPECT(OnProgress_DOWNLOADINGDATA
);
1527 SET_EXPECT(OnProgress_ENDDOWNLOADDATA
);
1528 SET_EXPECT(OnDataAvailable
);
1529 SET_EXPECT(OnStopBinding
);
1532 hres
= IMoniker_BindToStorage(mon
, bctx
, NULL
, &IID_IStream
, (void**)&unk
);
1533 if (test_protocol
== HTTP_TEST
&& hres
== HRESULT_FROM_WIN32(ERROR_INTERNET_NAME_NOT_RESOLVED
))
1535 trace( "Network unreachable, skipping tests\n" );
1538 if (!SUCCEEDED(hres
)) return;
1540 if((bindf
& BINDF_ASYNCHRONOUS
) && !data_available
) {
1541 ok(hres
== MK_S_ASYNCHRONOUS
, "IMoniker_BindToStorage failed: %08x\n", hres
);
1542 ok(unk
== NULL
, "istr should be NULL\n");
1544 ok(hres
== S_OK
, "IMoniker_BindToStorage failed: %08x\n", hres
);
1545 ok(unk
!= NULL
, "unk == NULL\n");
1548 IUnknown_Release(unk
);
1550 while((bindf
& BINDF_ASYNCHRONOUS
) &&
1551 !stopped_binding
&& GetMessage(&msg
,NULL
,0,0)) {
1552 TranslateMessage(&msg
);
1553 DispatchMessage(&msg
);
1556 CHECK_CALLED(GetBindInfo
);
1557 CHECK_CALLED(QueryInterface_IInternetProtocol
);
1558 if(!emulate_protocol
)
1559 CHECK_CALLED(QueryService_IInternetProtocol
);
1560 CHECK_CALLED(OnStartBinding
);
1561 if(emulate_protocol
) {
1562 CHECK_CALLED(Start
);
1563 if(test_protocol
== HTTP_TEST
)
1564 CHECK_CALLED(Terminate
);
1565 CHECK_CALLED(UnlockRequest
);
1567 if(test_protocol
== HTTP_TEST
) {
1568 CHECK_CALLED(QueryInterface_IHttpNegotiate
);
1569 CHECK_CALLED(BeginningTransaction
);
1570 /* QueryInterface_IHttpNegotiate2 and GetRootSecurityId
1571 * called on WinXP but not on Win98 */
1572 CLEAR_CALLED(QueryInterface_IHttpNegotiate2
);
1573 CLEAR_CALLED(GetRootSecurityId
);
1575 CHECK_CALLED(OnProgress_FINDINGRESOURCE
);
1576 CHECK_CALLED(OnProgress_CONNECTING
);
1578 CHECK_NOT_CALLED(OnProgress_FINDINGRESOURCE
);
1579 CHECK_NOT_CALLED(OnProgress_CONNECTING
);
1582 if(test_protocol
== HTTP_TEST
|| test_protocol
== FILE_TEST
)
1583 CHECK_CALLED(OnProgress_SENDINGREQUEST
);
1584 if(test_protocol
== HTTP_TEST
)
1585 CHECK_CALLED(OnResponse
);
1586 CHECK_CALLED(OnProgress_MIMETYPEAVAILABLE
);
1587 CHECK_CALLED(OnProgress_BEGINDOWNLOADDATA
);
1588 if(test_protocol
== HTTP_TEST
)
1589 CLEAR_CALLED(OnProgress_DOWNLOADINGDATA
);
1590 CHECK_CALLED(OnProgress_ENDDOWNLOADDATA
);
1591 CHECK_CALLED(OnDataAvailable
);
1592 CHECK_CALLED(OnStopBinding
);
1595 ok(IMoniker_Release(mon
) == 0, "mon should be destroyed here\n");
1596 ok(IBindCtx_Release(bctx
) == 0, "bctx should be destroyed here\n");
1598 if(test_protocol
== HTTP_TEST
)
1599 http_is_first
= FALSE
;
1602 static void test_BindToObject(int protocol
, BOOL emul
)
1606 LPOLESTR display_name
;
1609 IBindStatusCallback
*previousclb
;
1610 IUnknown
*unk
= (IUnknown
*)0x00ff00ff;
1613 test_protocol
= protocol
;
1614 emulate_protocol
= emul
;
1615 download_state
= BEFORE_DOWNLOAD
;
1616 stopped_binding
= FALSE
;
1617 data_available
= FALSE
;
1620 SET_EXPECT(QueryInterface_IServiceProvider
);
1621 hres
= CreateAsyncBindCtx(0, &bsc
, NULL
, &bctx
);
1622 ok(SUCCEEDED(hres
), "CreateAsyncBindCtx failed: %08x\n\n", hres
);
1625 CHECK_CALLED(QueryInterface_IServiceProvider
);
1627 SET_EXPECT(QueryInterface_IServiceProvider
);
1628 hres
= RegisterBindStatusCallback(bctx
, &bsc
, &previousclb
, 0);
1629 ok(SUCCEEDED(hres
), "RegisterBindStatusCallback failed: %08x\n", hres
);
1630 ok(previousclb
== &bsc
, "previousclb(%p) != sclb(%p)\n", previousclb
, &bsc
);
1631 CHECK_CALLED(QueryInterface_IServiceProvider
);
1633 IBindStatusCallback_Release(previousclb
);
1635 hres
= CreateURLMoniker(NULL
, urls
[test_protocol
], &mon
);
1636 ok(SUCCEEDED(hres
), "failed to create moniker: %08x\n", hres
);
1638 IBindCtx_Release(bctx
);
1642 if(test_protocol
== FILE_TEST
&& INDEX_HTML
[7] == '/')
1643 memmove(INDEX_HTML
+7, INDEX_HTML
+8, lstrlenW(INDEX_HTML
+7)*sizeof(WCHAR
));
1645 hres
= IMoniker_QueryInterface(mon
, &IID_IBinding
, (void**)&bind
);
1646 ok(hres
== E_NOINTERFACE
, "IMoniker should not have IBinding interface\n");
1648 IBinding_Release(bind
);
1650 hres
= IMoniker_GetDisplayName(mon
, bctx
, NULL
, &display_name
);
1651 ok(hres
== S_OK
, "GetDisplayName failed %08x\n", hres
);
1652 ok(!lstrcmpW(display_name
, urls
[test_protocol
]), "GetDisplayName got wrong name\n");
1654 SET_EXPECT(QueryInterface_IServiceProvider
);
1655 SET_EXPECT(GetBindInfo
);
1656 SET_EXPECT(OnStartBinding
);
1657 if(emulate_protocol
) {
1659 SET_EXPECT(UnlockRequest
);
1661 if(test_protocol
== HTTP_TEST
) {
1662 SET_EXPECT(QueryInterface_IHttpNegotiate
);
1663 SET_EXPECT(BeginningTransaction
);
1664 SET_EXPECT(QueryInterface_IHttpNegotiate2
);
1665 SET_EXPECT(GetRootSecurityId
);
1666 SET_EXPECT(OnProgress_FINDINGRESOURCE
);
1667 SET_EXPECT(OnProgress_CONNECTING
);
1669 if(test_protocol
== HTTP_TEST
|| test_protocol
== FILE_TEST
)
1670 SET_EXPECT(OnProgress_SENDINGREQUEST
);
1671 if(test_protocol
== HTTP_TEST
)
1672 SET_EXPECT(OnResponse
);
1673 SET_EXPECT(OnProgress_MIMETYPEAVAILABLE
);
1674 SET_EXPECT(OnProgress_BEGINDOWNLOADDATA
);
1675 if(test_protocol
== HTTP_TEST
)
1676 SET_EXPECT(OnProgress_DOWNLOADINGDATA
);
1677 SET_EXPECT(OnProgress_ENDDOWNLOADDATA
);
1678 SET_EXPECT(OnProgress_CLASSIDAVAILABLE
);
1679 SET_EXPECT(OnProgress_BEGINSYNCOPERATION
);
1680 SET_EXPECT(OnProgress_ENDSYNCOPERATION
);
1681 SET_EXPECT(OnObjectAvailable
);
1682 SET_EXPECT(OnStopBinding
);
1685 hres
= IMoniker_BindToObject(mon
, bctx
, NULL
, &IID_IUnknown
, (void**)&unk
);
1686 if (test_protocol
== HTTP_TEST
&& hres
== HRESULT_FROM_WIN32(ERROR_INTERNET_NAME_NOT_RESOLVED
))
1688 trace( "Network unreachable, skipping tests\n" );
1691 todo_wine
ok(SUCCEEDED(hres
), "IMoniker_BindToObject failed with error 0x%08x\n", hres
);
1692 /* no point testing the calls if binding didn't even work */
1693 if (!SUCCEEDED(hres
)) return;
1695 if((bindf
& BINDF_ASYNCHRONOUS
) && !data_available
) {
1696 ok(hres
== MK_S_ASYNCHRONOUS
, "IMoniker_BindToStorage failed: %08x\n", hres
);
1697 ok(unk
== NULL
, "istr should be NULL\n");
1699 ok(hres
== S_OK
, "IMoniker_BindToStorage failed: %08x\n", hres
);
1700 ok(unk
!= NULL
, "unk == NULL\n");
1703 IUnknown_Release(unk
);
1705 while((bindf
& BINDF_ASYNCHRONOUS
) &&
1706 !stopped_binding
&& GetMessage(&msg
,NULL
,0,0)) {
1707 TranslateMessage(&msg
);
1708 DispatchMessage(&msg
);
1711 todo_wine
CHECK_NOT_CALLED(QueryInterface_IServiceProvider
);
1712 CHECK_CALLED(GetBindInfo
);
1713 CHECK_CALLED(OnStartBinding
);
1714 if(emulate_protocol
) {
1715 CHECK_CALLED(Start
);
1716 CHECK_CALLED(UnlockRequest
);
1718 if(test_protocol
== HTTP_TEST
) {
1719 CHECK_CALLED(QueryInterface_IHttpNegotiate
);
1720 CHECK_CALLED(BeginningTransaction
);
1721 /* QueryInterface_IHttpNegotiate2 and GetRootSecurityId
1722 * called on WinXP but not on Win98 */
1723 CLEAR_CALLED(QueryInterface_IHttpNegotiate2
);
1724 CLEAR_CALLED(GetRootSecurityId
);
1726 CHECK_CALLED(OnProgress_FINDINGRESOURCE
);
1727 CHECK_CALLED(OnProgress_CONNECTING
);
1729 CHECK_NOT_CALLED(OnProgress_FINDINGRESOURCE
);
1730 CHECK_NOT_CALLED(OnProgress_CONNECTING
);
1733 if(test_protocol
== HTTP_TEST
|| test_protocol
== FILE_TEST
)
1734 CHECK_CALLED(OnProgress_SENDINGREQUEST
);
1735 if(test_protocol
== HTTP_TEST
)
1736 CHECK_CALLED(OnResponse
);
1737 CHECK_CALLED(OnProgress_MIMETYPEAVAILABLE
);
1738 CHECK_CALLED(OnProgress_BEGINDOWNLOADDATA
);
1739 if(test_protocol
== HTTP_TEST
)
1740 CLEAR_CALLED(OnProgress_DOWNLOADINGDATA
);
1741 CHECK_CALLED(OnProgress_ENDDOWNLOADDATA
);
1742 CHECK_CALLED(OnProgress_CLASSIDAVAILABLE
);
1743 CHECK_CALLED(OnProgress_BEGINSYNCOPERATION
);
1744 CHECK_CALLED(OnProgress_ENDSYNCOPERATION
);
1745 CHECK_CALLED(OnObjectAvailable
);
1746 CHECK_CALLED(OnStopBinding
);
1749 ok(IMoniker_Release(mon
) == 0, "mon should be destroyed here\n");
1750 ok(IBindCtx_Release(bctx
) == 0, "bctx should be destroyed here\n");
1752 if(test_protocol
== HTTP_TEST
)
1753 http_is_first
= FALSE
;
1756 static void set_file_url(void)
1760 static const WCHAR wszFile
[] = {'f','i','l','e',':','/','/'};
1762 memcpy(INDEX_HTML
, wszFile
, sizeof(wszFile
));
1763 len
= sizeof(wszFile
)/sizeof(WCHAR
);
1764 INDEX_HTML
[len
++] = '/';
1765 len
+= GetCurrentDirectoryW(sizeof(INDEX_HTML
)/sizeof(WCHAR
)-len
, INDEX_HTML
+len
);
1766 INDEX_HTML
[len
++] = '\\';
1767 memcpy(INDEX_HTML
+len
, wszIndexHtml
, sizeof(wszIndexHtml
));
1770 static void create_file(void)
1775 static const char html_doc
[] = "<HTML></HTML>";
1777 file
= CreateFileW(wszIndexHtml
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
,
1778 FILE_ATTRIBUTE_NORMAL
, NULL
);
1779 ok(file
!= INVALID_HANDLE_VALUE
, "CreateFile failed\n");
1780 if(file
== INVALID_HANDLE_VALUE
)
1783 WriteFile(file
, html_doc
, sizeof(html_doc
)-1, &size
, NULL
);
1789 static void test_BindToStorage_fail(void)
1791 IMoniker
*mon
= NULL
;
1792 IBindCtx
*bctx
= NULL
;
1796 hres
= CreateURLMoniker(NULL
, ABOUT_BLANK
, &mon
);
1797 ok(hres
== S_OK
, "CreateURLMoniker failed: %08x\n", hres
);
1801 hres
= CreateAsyncBindCtxEx(NULL
, 0, NULL
, NULL
, &bctx
, 0);
1802 ok(hres
== S_OK
, "CreateAsyncBindCtxEx failed: %08x\n", hres
);
1804 hres
= IMoniker_BindToStorage(mon
, bctx
, NULL
, &IID_IStream
, (void**)&unk
);
1805 ok(hres
== MK_E_SYNTAX
, "hres=%08x, expected INET_E_SYNTAX\n", hres
);
1807 IBindCtx_Release(bctx
);
1809 IMoniker_Release(mon
);
1814 complete_event
= CreateEvent(NULL
, FALSE
, FALSE
, NULL
);
1815 complete_event2
= CreateEvent(NULL
, FALSE
, FALSE
, NULL
);
1816 thread_id
= GetCurrentThreadId();
1819 test_CreateAsyncBindCtx();
1820 test_CreateAsyncBindCtxEx();
1821 test_RegisterBindStatusCallback();
1823 trace("synchronous http test (COM not initialised)...\n");
1824 test_BindToStorage(HTTP_TEST
, FALSE
);
1825 test_BindToStorage_fail();
1829 trace("synchronous http test...\n");
1830 test_BindToStorage(HTTP_TEST
, FALSE
);
1831 test_BindToObject(HTTP_TEST
, FALSE
);
1833 trace("synchronous file test...\n");
1835 test_BindToStorage(FILE_TEST
, FALSE
);
1836 test_BindToObject(FILE_TEST
, FALSE
);
1837 DeleteFileW(wszIndexHtml
);
1839 bindf
= BINDF_ASYNCHRONOUS
| BINDF_ASYNCSTORAGE
| BINDF_PULLDATA
;
1841 trace("http test...\n");
1842 test_BindToStorage(HTTP_TEST
, FALSE
);
1843 test_BindToObject(HTTP_TEST
, FALSE
);
1845 trace("http test (short response)...\n");
1846 http_is_first
= TRUE
;
1847 urls
[HTTP_TEST
] = SHORT_RESPONSE_URL
;
1848 test_BindToStorage(HTTP_TEST
, FALSE
);
1849 test_BindToObject(HTTP_TEST
, FALSE
);
1851 trace("emulated http test...\n");
1852 test_BindToStorage(HTTP_TEST
, TRUE
);
1854 trace("about test...\n");
1855 test_BindToStorage(ABOUT_TEST
, FALSE
);
1856 test_BindToObject(ABOUT_TEST
, FALSE
);
1858 trace("emulated about test...\n");
1859 test_BindToStorage(ABOUT_TEST
, TRUE
);
1861 trace("file test...\n");
1863 test_BindToStorage(FILE_TEST
, FALSE
);
1864 test_BindToObject(FILE_TEST
, FALSE
);
1865 DeleteFileW(wszIndexHtml
);
1867 trace("emulated file test...\n");
1869 test_BindToStorage(FILE_TEST
, TRUE
);
1871 trace("emulated its test...\n");
1872 test_BindToStorage(ITS_TEST
, TRUE
);
1874 trace("emulated mk test...\n");
1875 test_BindToStorage(MK_TEST
, TRUE
);
1877 test_BindToStorage_fail();
1879 CloseHandle(complete_event
);
1880 CloseHandle(complete_event2
);