1 /* 2 * Implementation of IShellBrowser interface 3 * 4 * Copyright 2011 Piotr Caban for CodeWeavers 5 * Copyright 2012 Jacek Caban for CodeWeavers 6 * 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. 11 * 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. 16 * 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 20 */ 21 22 #include <assert.h> 23 24 #include "ieframe.h" 25 #include "exdispid.h" 26 #include "shlwapi.h" 27 28 #include "wine/debug.h" 29 30 WINE_DEFAULT_DEBUG_CHANNEL(ieframe); 31 32 static inline ShellBrowser *impl_from_IShellBrowser(IShellBrowser *iface) 33 { 34 return CONTAINING_RECORD(iface, ShellBrowser, IShellBrowser_iface); 35 } 36 37 static HRESULT WINAPI ShellBrowser_QueryInterface(IShellBrowser* iface, REFIID riid, void **ppv) 38 { 39 ShellBrowser *This = impl_from_IShellBrowser(iface); 40 41 if(IsEqualGUID(&IID_IUnknown, riid)) { 42 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); 43 *ppv = &This->IShellBrowser_iface; 44 }else if(IsEqualGUID(&IID_IOleWindow, riid)) { 45 TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv); 46 *ppv = &This->IShellBrowser_iface; 47 }else if(IsEqualGUID(&IID_IShellBrowser, riid)) { 48 TRACE("(%p)->(IID_IShellBrowser %p)\n", This, ppv); 49 *ppv = &This->IShellBrowser_iface; 50 }else if(IsEqualGUID(&IID_IBrowserService, riid)) { 51 TRACE("(%p)->(IID_IBrowserService %p)\n", This, ppv); 52 *ppv = &This->IBrowserService_iface; 53 }else if(IsEqualGUID(&IID_IDocObjectService, riid)) { 54 TRACE("(%p)->(IID_IDocObjectService %p)\n", This, ppv); 55 *ppv = &This->IDocObjectService_iface; 56 }else { 57 FIXME("%p %s %p\n", This, debugstr_guid(riid), ppv); 58 *ppv = NULL; 59 return E_NOINTERFACE; 60 } 61 62 IUnknown_AddRef((IUnknown*)*ppv); 63 return S_OK; 64 } 65 66 static ULONG WINAPI ShellBrowser_AddRef( 67 IShellBrowser* iface) 68 { 69 ShellBrowser *This = impl_from_IShellBrowser(iface); 70 LONG ref = InterlockedIncrement(&This->ref); 71 72 TRACE("(%p) ref=%d\n", This, ref); 73 74 return ref; 75 } 76 77 static ULONG WINAPI ShellBrowser_Release(IShellBrowser* iface) 78 { 79 ShellBrowser *This = impl_from_IShellBrowser(iface); 80 LONG ref = InterlockedDecrement(&This->ref); 81 82 TRACE("(%p) ref=%d\n", This, ref); 83 84 if(!ref) { 85 assert(!This->doc_host); 86 heap_free(This); 87 } 88 89 return ref; 90 } 91 92 static HRESULT WINAPI ShellBrowser_GetWindow( 93 IShellBrowser* iface, 94 HWND *phwnd) 95 { 96 ShellBrowser *This = impl_from_IShellBrowser(iface); 97 FIXME("%p %p\n", This, phwnd); 98 return E_NOTIMPL; 99 } 100 101 static HRESULT WINAPI ShellBrowser_ContextSensitiveHelp( 102 IShellBrowser* iface, 103 BOOL fEnterMode) 104 { 105 ShellBrowser *This = impl_from_IShellBrowser(iface); 106 FIXME("%p %d\n", This, fEnterMode); 107 return E_NOTIMPL; 108 } 109 110 static HRESULT WINAPI ShellBrowser_InsertMenusSB( 111 IShellBrowser* iface, 112 HMENU hmenuShared, 113 LPOLEMENUGROUPWIDTHS lpMenuWidths) 114 { 115 ShellBrowser *This = impl_from_IShellBrowser(iface); 116 FIXME("%p %p %p\n", This, hmenuShared, lpMenuWidths); 117 return E_NOTIMPL; 118 } 119 120 static HRESULT WINAPI ShellBrowser_SetMenuSB( 121 IShellBrowser* iface, 122 HMENU hmenuShared, 123 HOLEMENU holemenuReserved, 124 HWND hwndActiveObject) 125 { 126 ShellBrowser *This = impl_from_IShellBrowser(iface); 127 FIXME("%p %p %p %p\n", This, hmenuShared, holemenuReserved, hwndActiveObject); 128 return E_NOTIMPL; 129 } 130 131 static HRESULT WINAPI ShellBrowser_RemoveMenusSB( 132 IShellBrowser* iface, 133 HMENU hmenuShared) 134 { 135 ShellBrowser *This = impl_from_IShellBrowser(iface); 136 FIXME("%p %p\n", This, hmenuShared); 137 return E_NOTIMPL; 138 } 139 140 static HRESULT WINAPI ShellBrowser_SetStatusTextSB( 141 IShellBrowser* iface, 142 LPCOLESTR pszStatusText) 143 { 144 ShellBrowser *This = impl_from_IShellBrowser(iface); 145 FIXME("%p %s\n", This, debugstr_w(pszStatusText)); 146 return E_NOTIMPL; 147 } 148 149 static HRESULT WINAPI ShellBrowser_EnableModelessSB( 150 IShellBrowser* iface, 151 BOOL fEnable) 152 { 153 ShellBrowser *This = impl_from_IShellBrowser(iface); 154 FIXME("%p %d\n", This, fEnable); 155 return E_NOTIMPL; 156 } 157 158 static HRESULT WINAPI ShellBrowser_TranslateAcceleratorSB( 159 IShellBrowser* iface, 160 MSG *pmsg, 161 WORD wID) 162 { 163 ShellBrowser *This = impl_from_IShellBrowser(iface); 164 FIXME("%p %p %d\n", This, pmsg, (int)wID); 165 return E_NOTIMPL; 166 } 167 168 static HRESULT WINAPI ShellBrowser_BrowseObject( 169 IShellBrowser* iface, 170 LPCITEMIDLIST pidl, 171 UINT wFlags) 172 { 173 ShellBrowser *This = impl_from_IShellBrowser(iface); 174 FIXME("%p %p %u\n", This, pidl, wFlags); 175 return E_NOTIMPL; 176 } 177 178 static HRESULT WINAPI ShellBrowser_GetViewStateStream( 179 IShellBrowser* iface, 180 DWORD grfMode, 181 IStream **ppStrm) 182 { 183 ShellBrowser *This = impl_from_IShellBrowser(iface); 184 FIXME("%p %x %p\n", This, grfMode, ppStrm); 185 return E_NOTIMPL; 186 } 187 188 static HRESULT WINAPI ShellBrowser_GetControlWindow( 189 IShellBrowser* iface, 190 UINT id, 191 HWND *phwnd) 192 { 193 ShellBrowser *This = impl_from_IShellBrowser(iface); 194 FIXME("%p %u %p\n", This, id, phwnd); 195 return E_NOTIMPL; 196 } 197 198 static HRESULT WINAPI ShellBrowser_SendControlMsg( 199 IShellBrowser* iface, 200 UINT id, 201 UINT uMsg, 202 WPARAM wParam, 203 LPARAM lParam, 204 LRESULT *pret) 205 { 206 ShellBrowser *This = impl_from_IShellBrowser(iface); 207 FIXME("%p %u %u %p\n", This, id, uMsg, pret); 208 return E_NOTIMPL; 209 } 210 211 static HRESULT WINAPI ShellBrowser_QueryActiveShellView( 212 IShellBrowser* iface, 213 IShellView **ppshv) 214 { 215 ShellBrowser *This = impl_from_IShellBrowser(iface); 216 FIXME("%p %p\n", This, ppshv); 217 return E_NOTIMPL; 218 } 219 220 static HRESULT WINAPI ShellBrowser_OnViewWindowActive( 221 IShellBrowser* iface, 222 IShellView *pshv) 223 { 224 ShellBrowser *This = impl_from_IShellBrowser(iface); 225 FIXME("%p %p\n", This, pshv); 226 return E_NOTIMPL; 227 } 228 229 static HRESULT WINAPI ShellBrowser_SetToolbarItems( 230 IShellBrowser* iface, 231 LPTBBUTTONSB lpButtons, 232 UINT nButtons, 233 UINT uFlags) 234 { 235 ShellBrowser *This = impl_from_IShellBrowser(iface); 236 FIXME("%p %p %u %u\n", This, lpButtons, nButtons, uFlags); 237 return E_NOTIMPL; 238 } 239 240 static const IShellBrowserVtbl ShellBrowserVtbl = { 241 ShellBrowser_QueryInterface, 242 ShellBrowser_AddRef, 243 ShellBrowser_Release, 244 ShellBrowser_GetWindow, 245 ShellBrowser_ContextSensitiveHelp, 246 ShellBrowser_InsertMenusSB, 247 ShellBrowser_SetMenuSB, 248 ShellBrowser_RemoveMenusSB, 249 ShellBrowser_SetStatusTextSB, 250 ShellBrowser_EnableModelessSB, 251 ShellBrowser_TranslateAcceleratorSB, 252 ShellBrowser_BrowseObject, 253 ShellBrowser_GetViewStateStream, 254 ShellBrowser_GetControlWindow, 255 ShellBrowser_SendControlMsg, 256 ShellBrowser_QueryActiveShellView, 257 ShellBrowser_OnViewWindowActive, 258 ShellBrowser_SetToolbarItems 259 }; 260 261 static inline ShellBrowser *impl_from_IBrowserService(IBrowserService *iface) 262 { 263 return CONTAINING_RECORD(iface, ShellBrowser, IBrowserService_iface); 264 } 265 266 static HRESULT WINAPI BrowserService_QueryInterface( 267 IBrowserService* iface, 268 REFIID riid, 269 void **ppvObject) 270 { 271 ShellBrowser *This = impl_from_IBrowserService(iface); 272 return IShellBrowser_QueryInterface(&This->IShellBrowser_iface, riid, ppvObject); 273 } 274 275 static ULONG WINAPI BrowserService_AddRef( 276 IBrowserService *iface) 277 { 278 ShellBrowser *This = impl_from_IBrowserService(iface); 279 return IShellBrowser_AddRef(&This->IShellBrowser_iface); 280 } 281 282 static ULONG WINAPI BrowserService_Release( 283 IBrowserService* iface) 284 { 285 ShellBrowser *This = impl_from_IBrowserService(iface); 286 return IShellBrowser_Release(&This->IShellBrowser_iface); 287 } 288 289 static HRESULT WINAPI BrowserService_GetParentSite( 290 IBrowserService* iface, 291 IOleInPlaceSite **ppipsite) 292 { 293 ShellBrowser *This = impl_from_IBrowserService(iface); 294 FIXME("%p %p\n", This, ppipsite); 295 return E_NOTIMPL; 296 } 297 298 static HRESULT WINAPI BrowserService_SetTitle( 299 IBrowserService* iface, 300 IShellView *psv, 301 LPCWSTR pszName) 302 { 303 ShellBrowser *This = impl_from_IBrowserService(iface); 304 FIXME("%p %p %s\n", This, psv, debugstr_w(pszName)); 305 return E_NOTIMPL; 306 } 307 308 static HRESULT WINAPI BrowserService_GetTitle( 309 IBrowserService* iface, 310 IShellView *psv, 311 LPWSTR pszName, 312 DWORD cchName) 313 { 314 ShellBrowser *This = impl_from_IBrowserService(iface); 315 FIXME("%p %p %p %d\n", This, psv, pszName, cchName); 316 return E_NOTIMPL; 317 } 318 319 static HRESULT WINAPI BrowserService_GetOleObject( 320 IBrowserService* iface, 321 IOleObject **ppobjv) 322 { 323 ShellBrowser *This = impl_from_IBrowserService(iface); 324 FIXME("%p %p\n", This, ppobjv); 325 return E_NOTIMPL; 326 } 327 328 static HRESULT WINAPI BrowserService_GetTravelLog( 329 IBrowserService* iface, 330 ITravelLog **pptl) 331 { 332 ShellBrowser *This = impl_from_IBrowserService(iface); 333 FIXME("%p %p\n", This, pptl); 334 return E_NOTIMPL; 335 } 336 337 static HRESULT WINAPI BrowserService_ShowControlWindow( 338 IBrowserService* iface, 339 UINT id, 340 BOOL fShow) 341 { 342 ShellBrowser *This = impl_from_IBrowserService(iface); 343 FIXME("%p %u %d\n", This, id, fShow); 344 return E_NOTIMPL; 345 } 346 347 static HRESULT WINAPI BrowserService_IsControlWindowShown( 348 IBrowserService* iface, 349 UINT id, 350 BOOL *pfShown) 351 { 352 ShellBrowser *This = impl_from_IBrowserService(iface); 353 FIXME("%p %u %p\n", This, id, pfShown); 354 return E_NOTIMPL; 355 } 356 357 static HRESULT WINAPI BrowserService_IEGetDisplayName( 358 IBrowserService* iface, 359 PCIDLIST_ABSOLUTE pidl, 360 LPWSTR pwszName, 361 UINT uFlags) 362 { 363 ShellBrowser *This = impl_from_IBrowserService(iface); 364 FIXME("%p %p %p %u\n", This, pidl, pwszName, uFlags); 365 return E_NOTIMPL; 366 } 367 368 static HRESULT WINAPI BrowserService_IEParseDisplayName( 369 IBrowserService* iface, 370 UINT uiCP, 371 LPCWSTR pwszPath, 372 PIDLIST_ABSOLUTE *ppidlOut) 373 { 374 ShellBrowser *This = impl_from_IBrowserService(iface); 375 FIXME("%p %u %s %p\n", This, uiCP, debugstr_w(pwszPath), ppidlOut); 376 return E_NOTIMPL; 377 } 378 379 static HRESULT WINAPI BrowserService_DisplayParseError( 380 IBrowserService* iface, 381 HRESULT hres, 382 LPCWSTR pwszPath) 383 { 384 ShellBrowser *This = impl_from_IBrowserService(iface); 385 FIXME("%p %x %s\n", This, hres, debugstr_w(pwszPath)); 386 return E_NOTIMPL; 387 } 388 389 static HRESULT WINAPI BrowserService_NavigateToPidl( 390 IBrowserService* iface, 391 PCIDLIST_ABSOLUTE pidl, 392 DWORD grfHLNF) 393 { 394 ShellBrowser *This = impl_from_IBrowserService(iface); 395 FIXME("%p %p %d\n", This, pidl, grfHLNF); 396 return E_NOTIMPL; 397 } 398 399 static HRESULT WINAPI BrowserService_SetNavigateState( 400 IBrowserService* iface, 401 BNSTATE bnstate) 402 { 403 ShellBrowser *This = impl_from_IBrowserService(iface); 404 FIXME("%p %d\n", This, bnstate); 405 return E_NOTIMPL; 406 } 407 408 static HRESULT WINAPI BrowserService_GetNavigateState( 409 IBrowserService* iface, 410 BNSTATE *pbnstate) 411 { 412 ShellBrowser *This = impl_from_IBrowserService(iface); 413 FIXME("%p %p\n", This, pbnstate); 414 return E_NOTIMPL; 415 } 416 417 static HRESULT WINAPI BrowserService_NotifyRedirect( 418 IBrowserService* iface, 419 IShellView *psv, 420 PCIDLIST_ABSOLUTE pidl, 421 BOOL *pfDidBrowse) 422 { 423 ShellBrowser *This = impl_from_IBrowserService(iface); 424 FIXME("%p %p %p %p\n", This, psv, pidl, pfDidBrowse); 425 return E_NOTIMPL; 426 } 427 428 static HRESULT WINAPI BrowserService_UpdateWindowList( 429 IBrowserService* iface) 430 { 431 ShellBrowser *This = impl_from_IBrowserService(iface); 432 FIXME("%p\n", This); 433 return E_NOTIMPL; 434 } 435 436 static HRESULT WINAPI BrowserService_UpdateBackForwardState( 437 IBrowserService* iface) 438 { 439 ShellBrowser *This = impl_from_IBrowserService(iface); 440 FIXME("%p\n", This); 441 return E_NOTIMPL; 442 } 443 444 static HRESULT WINAPI BrowserService_SetFlags( 445 IBrowserService* iface, 446 DWORD dwFlags, 447 DWORD dwFlagMask) 448 { 449 ShellBrowser *This = impl_from_IBrowserService(iface); 450 FIXME("%p %x %x\n", This, dwFlags, dwFlagMask); 451 return E_NOTIMPL; 452 } 453 454 static HRESULT WINAPI BrowserService_GetFlags( 455 IBrowserService* iface, 456 DWORD *pdwFlags) 457 { 458 ShellBrowser *This = impl_from_IBrowserService(iface); 459 FIXME("%p %p\n", This, pdwFlags); 460 return E_NOTIMPL; 461 } 462 463 static HRESULT WINAPI BrowserService_CanNavigateNow( 464 IBrowserService* iface) 465 { 466 ShellBrowser *This = impl_from_IBrowserService(iface); 467 FIXME("%p\n", This); 468 return E_NOTIMPL; 469 } 470 471 static HRESULT WINAPI BrowserService_GetPidl( 472 IBrowserService* iface, 473 PIDLIST_ABSOLUTE *ppidl) 474 { 475 ShellBrowser *This = impl_from_IBrowserService(iface); 476 FIXME("%p %p\n", This, ppidl); 477 return E_NOTIMPL; 478 } 479 480 static HRESULT WINAPI BrowserService_SetReferrer( 481 IBrowserService* iface, 482 PCIDLIST_ABSOLUTE pidl) 483 { 484 ShellBrowser *This = impl_from_IBrowserService(iface); 485 FIXME("%p %p\n", This, pidl); 486 return E_NOTIMPL; 487 } 488 489 static DWORD WINAPI BrowserService_GetBrowserIndex( 490 IBrowserService* iface) 491 { 492 ShellBrowser *This = impl_from_IBrowserService(iface); 493 FIXME("%p\n", This); 494 return E_NOTIMPL; 495 } 496 497 static HRESULT WINAPI BrowserService_GetBrowserByIndex( 498 IBrowserService* iface, 499 DWORD dwID, 500 IUnknown **ppunk) 501 { 502 ShellBrowser *This = impl_from_IBrowserService(iface); 503 FIXME("%p %x %p\n", This, dwID, ppunk); 504 return E_NOTIMPL; 505 } 506 507 static HRESULT WINAPI BrowserService_GetHistoryObject( 508 IBrowserService* iface, 509 IOleObject **ppole, 510 IStream **pstm, 511 IBindCtx **ppbc) 512 { 513 ShellBrowser *This = impl_from_IBrowserService(iface); 514 FIXME("%p %p %p %p\n", This, ppole, pstm, ppbc); 515 return E_NOTIMPL; 516 } 517 518 static HRESULT WINAPI BrowserService_SetHistoryObject( 519 IBrowserService* iface, 520 IOleObject *pole, 521 BOOL fIsLocalAnchor) 522 { 523 ShellBrowser *This = impl_from_IBrowserService(iface); 524 FIXME("%p %p %d\n", This, pole, fIsLocalAnchor); 525 return E_NOTIMPL; 526 } 527 528 static HRESULT WINAPI BrowserService_CacheOLEServer( 529 IBrowserService* iface, 530 IOleObject *pole) 531 { 532 ShellBrowser *This = impl_from_IBrowserService(iface); 533 FIXME("%p %p\n", This, pole); 534 return E_NOTIMPL; 535 } 536 537 static HRESULT WINAPI BrowserService_GetSetCodePage( 538 IBrowserService* iface, 539 VARIANT *pvarIn, 540 VARIANT *pvarOut) 541 { 542 ShellBrowser *This = impl_from_IBrowserService(iface); 543 FIXME("%p %s %p\n", This, debugstr_variant(pvarIn), pvarOut); 544 return E_NOTIMPL; 545 } 546 547 static HRESULT WINAPI BrowserService_OnHttpEquiv( 548 IBrowserService* iface, 549 IShellView *psv, 550 BOOL fDone, 551 VARIANT *pvarargIn, 552 VARIANT *pvarargOut) 553 { 554 ShellBrowser *This = impl_from_IBrowserService(iface); 555 FIXME("%p %p %d %s %p\n", This, psv, fDone, debugstr_variant(pvarargIn), pvarargOut); 556 return E_NOTIMPL; 557 } 558 559 static HRESULT WINAPI BrowserService_GetPalette( 560 IBrowserService* iface, 561 HPALETTE *hpal) 562 { 563 ShellBrowser *This = impl_from_IBrowserService(iface); 564 FIXME("%p %p\n", This, hpal); 565 return E_NOTIMPL; 566 } 567 568 static HRESULT WINAPI BrowserService_RegisterWindow( 569 IBrowserService* iface, 570 BOOL fForceRegister, 571 int swc) 572 { 573 ShellBrowser *This = impl_from_IBrowserService(iface); 574 FIXME("%p %d %d\n", This, fForceRegister, swc); 575 return E_NOTIMPL; 576 } 577 578 static const IBrowserServiceVtbl BrowserServiceVtbl = { 579 BrowserService_QueryInterface, 580 BrowserService_AddRef, 581 BrowserService_Release, 582 BrowserService_GetParentSite, 583 BrowserService_SetTitle, 584 BrowserService_GetTitle, 585 BrowserService_GetOleObject, 586 BrowserService_GetTravelLog, 587 BrowserService_ShowControlWindow, 588 BrowserService_IsControlWindowShown, 589 BrowserService_IEGetDisplayName, 590 BrowserService_IEParseDisplayName, 591 BrowserService_DisplayParseError, 592 BrowserService_NavigateToPidl, 593 BrowserService_SetNavigateState, 594 BrowserService_GetNavigateState, 595 BrowserService_NotifyRedirect, 596 BrowserService_UpdateWindowList, 597 BrowserService_UpdateBackForwardState, 598 BrowserService_SetFlags, 599 BrowserService_GetFlags, 600 BrowserService_CanNavigateNow, 601 BrowserService_GetPidl, 602 BrowserService_SetReferrer, 603 BrowserService_GetBrowserIndex, 604 BrowserService_GetBrowserByIndex, 605 BrowserService_GetHistoryObject, 606 BrowserService_SetHistoryObject, 607 BrowserService_CacheOLEServer, 608 BrowserService_GetSetCodePage, 609 BrowserService_OnHttpEquiv, 610 BrowserService_GetPalette, 611 BrowserService_RegisterWindow 612 }; 613 614 static inline ShellBrowser *impl_from_IDocObjectService(IDocObjectService *iface) 615 { 616 return CONTAINING_RECORD(iface, ShellBrowser, IDocObjectService_iface); 617 } 618 619 static HRESULT WINAPI DocObjectService_QueryInterface( 620 IDocObjectService* iface, 621 REFIID riid, 622 void **ppvObject) 623 { 624 ShellBrowser *This = impl_from_IDocObjectService(iface); 625 return IShellBrowser_QueryInterface(&This->IShellBrowser_iface, riid, ppvObject); 626 } 627 628 static ULONG WINAPI DocObjectService_AddRef( 629 IDocObjectService* iface) 630 { 631 ShellBrowser *This = impl_from_IDocObjectService(iface); 632 return IShellBrowser_AddRef(&This->IShellBrowser_iface); 633 } 634 635 static ULONG WINAPI DocObjectService_Release( 636 IDocObjectService* iface) 637 { 638 ShellBrowser *This = impl_from_IDocObjectService(iface); 639 return IShellBrowser_Release(&This->IShellBrowser_iface); 640 } 641 642 static HRESULT WINAPI DocObjectService_FireBeforeNavigate2( 643 IDocObjectService* iface, 644 IDispatch *pDispatch, 645 LPCWSTR lpszUrl, 646 DWORD dwFlags, 647 LPCWSTR lpszFrameName, 648 BYTE *pPostData, 649 DWORD cbPostData, 650 LPCWSTR lpszHeaders, 651 BOOL fPlayNavSound, 652 BOOL *pfCancel) 653 { 654 ShellBrowser *This = impl_from_IDocObjectService(iface); 655 VARIANT var_url, var_flags, var_frame_name, var_post_data, var_post_data2, var_headers; 656 VARIANTARG params[7]; 657 DISPPARAMS dp = {params, NULL, 7, 0}; 658 VARIANT_BOOL cancel = VARIANT_FALSE; 659 SAFEARRAY *post_data; 660 WCHAR file_path[MAX_PATH]; 661 DWORD file_path_len = ARRAY_SIZE(file_path); 662 663 TRACE("%p %p %s %x %s %p %d %s %d %p\n", This, pDispatch, debugstr_w(lpszUrl), 664 dwFlags, debugstr_w(lpszFrameName), pPostData, cbPostData, 665 debugstr_w(lpszHeaders), fPlayNavSound, pfCancel); 666 667 if(cbPostData) { 668 post_data = SafeArrayCreateVector(VT_UI1, 0, cbPostData); 669 if(!post_data) 670 return E_OUTOFMEMORY; 671 memcpy(post_data->pvData, pPostData, cbPostData); 672 }else { 673 post_data = NULL; 674 } 675 676 V_VT(params) = VT_BOOL|VT_BYREF; 677 V_BOOLREF(params) = &cancel; 678 679 V_VT(params+1) = (VT_BYREF|VT_VARIANT); 680 V_VARIANTREF(params+1) = &var_headers; 681 V_VT(&var_headers) = VT_BSTR; 682 V_BSTR(&var_headers) = lpszHeaders ? SysAllocString(lpszHeaders) : NULL; 683 684 V_VT(params+2) = (VT_BYREF|VT_VARIANT); 685 V_VARIANTREF(params+2) = &var_post_data2; 686 V_VT(&var_post_data2) = (VT_BYREF|VT_VARIANT); 687 V_VARIANTREF(&var_post_data2) = &var_post_data; 688 689 if(post_data) { 690 V_VT(&var_post_data) = VT_UI1|VT_ARRAY; 691 V_ARRAY(&var_post_data) = post_data; 692 }else { 693 V_VT(&var_post_data) = VT_EMPTY; 694 } 695 696 V_VT(params+3) = (VT_BYREF|VT_VARIANT); 697 V_VARIANTREF(params+3) = &var_frame_name; 698 V_VT(&var_frame_name) = VT_BSTR; 699 V_BSTR(&var_frame_name) = lpszFrameName ? SysAllocString(lpszFrameName) : NULL; 700 701 V_VT(params+4) = (VT_BYREF|VT_VARIANT); 702 V_VARIANTREF(params+4) = &var_flags; 703 V_VT(&var_flags) = VT_I4; 704 V_I4(&var_flags) = 0; 705 706 V_VT(params+5) = (VT_BYREF|VT_VARIANT); 707 V_VARIANTREF(params+5) = &var_url; 708 V_VT(&var_url) = VT_BSTR; 709 if(PathCreateFromUrlW(lpszUrl, file_path, &file_path_len, 0) == S_OK) 710 V_BSTR(&var_url) = SysAllocString(file_path); 711 else 712 V_BSTR(&var_url) = SysAllocString(lpszUrl); 713 714 V_VT(params+6) = (VT_DISPATCH); 715 V_DISPATCH(params+6) = (IDispatch*)This->doc_host->wb; 716 717 /* Keep reference to This. It may be released in event handler. */ 718 IShellBrowser_AddRef(&This->IShellBrowser_iface); 719 720 TRACE(">>>\n"); 721 call_sink(This->doc_host->cps.wbe2, DISPID_BEFORENAVIGATE2, &dp); 722 TRACE("<<<\n"); 723 724 IShellBrowser_Release(&This->IShellBrowser_iface); 725 726 SysFreeString(V_BSTR(&var_url)); 727 SysFreeString(V_BSTR(&var_headers)); 728 SysFreeString(V_BSTR(&var_frame_name)); 729 SafeArrayDestroy(post_data); 730 731 *pfCancel = !!cancel; 732 return S_OK; 733 } 734 735 static HRESULT WINAPI DocObjectService_FireNavigateComplete2( 736 IDocObjectService* iface, 737 IHTMLWindow2 *pHTMLWindow2, 738 DWORD dwFlags) 739 { 740 ShellBrowser *This = impl_from_IDocObjectService(iface); 741 DocHost *doc_host = This->doc_host; 742 IHTMLPrivateWindow *priv_window; 743 VARIANTARG params[2]; 744 DISPPARAMS dp = {params, NULL, 2, 0}; 745 VARIANT url_var; 746 BSTR url; 747 HRESULT hres; 748 749 TRACE("%p %p %x\n", This, pHTMLWindow2, dwFlags); 750 751 update_navigation_commands(This->doc_host); 752 753 if(doc_host->travellog.loading_pos != -1) { 754 WARN("histupdate not notified\n"); 755 doc_host->travellog.position = doc_host->travellog.loading_pos; 756 doc_host->travellog.loading_pos = -1; 757 } 758 759 hres = IHTMLWindow2_QueryInterface(pHTMLWindow2, &IID_IHTMLPrivateWindow, (void**)&priv_window); 760 if(FAILED(hres)) 761 return hres; 762 763 hres = IHTMLPrivateWindow_GetAddressBarUrl(priv_window, &url); 764 IHTMLPrivateWindow_Release(priv_window); 765 if(FAILED(hres)) 766 return hres; 767 768 TRACE("got URL %s\n", debugstr_w(url)); 769 set_dochost_url(This->doc_host, url); 770 771 V_VT(params) = (VT_BYREF|VT_VARIANT); 772 V_VARIANTREF(params) = &url_var; 773 774 V_VT(params+1) = VT_DISPATCH; 775 V_DISPATCH(params+1) = (IDispatch*)doc_host->wb; 776 777 V_VT(&url_var) = VT_BSTR; 778 V_BSTR(&url_var) = url; 779 780 /* Keep reference to This. It may be released in event handler. */ 781 IShellBrowser_AddRef(&This->IShellBrowser_iface); 782 783 TRACE(">>>\n"); 784 call_sink(This->doc_host->cps.wbe2, DISPID_NAVIGATECOMPLETE2, &dp); 785 TRACE("<<<\n"); 786 787 SysFreeString(url); 788 789 This->doc_host->busy = VARIANT_FALSE; 790 IShellBrowser_Release(&This->IShellBrowser_iface); 791 return S_OK; 792 } 793 794 static HRESULT WINAPI DocObjectService_FireDownloadBegin( 795 IDocObjectService* iface) 796 { 797 ShellBrowser *This = impl_from_IDocObjectService(iface); 798 FIXME("%p\n", This); 799 return E_NOTIMPL; 800 } 801 802 static HRESULT WINAPI DocObjectService_FireDownloadComplete( 803 IDocObjectService* iface) 804 { 805 ShellBrowser *This = impl_from_IDocObjectService(iface); 806 FIXME("%p\n", This); 807 return E_NOTIMPL; 808 } 809 810 static HRESULT WINAPI DocObjectService_FireDocumentComplete( 811 IDocObjectService* iface, 812 IHTMLWindow2 *pHTMLWindow, 813 DWORD dwFlags) 814 { 815 ShellBrowser *This = impl_from_IDocObjectService(iface); 816 IHTMLPrivateWindow *priv_window; 817 VARIANTARG params[2]; 818 DISPPARAMS dp = {params, NULL, 2, 0}; 819 VARIANT url_var; 820 BSTR url; 821 HRESULT hres; 822 823 TRACE("%p %p %x\n", This, pHTMLWindow, dwFlags); 824 825 hres = IHTMLWindow2_QueryInterface(pHTMLWindow, &IID_IHTMLPrivateWindow, (void**)&priv_window); 826 if(FAILED(hres)) 827 return hres; 828 829 hres = IHTMLPrivateWindow_GetAddressBarUrl(priv_window, &url); 830 IHTMLPrivateWindow_Release(priv_window); 831 if(FAILED(hres)) 832 return hres; 833 834 TRACE("got URL %s\n", debugstr_w(url)); 835 836 V_VT(params) = (VT_BYREF|VT_VARIANT); 837 V_VARIANTREF(params) = &url_var; 838 839 V_VT(params+1) = VT_DISPATCH; 840 V_DISPATCH(params+1) = (IDispatch*)This->doc_host->wb; 841 842 V_VT(&url_var) = VT_BSTR; 843 V_BSTR(&url_var) = url; 844 845 /* Keep reference to This. It may be released in event handler. */ 846 IShellBrowser_AddRef(&This->IShellBrowser_iface); 847 848 TRACE(">>>\n"); 849 call_sink(This->doc_host->cps.wbe2, DISPID_DOCUMENTCOMPLETE, &dp); 850 TRACE("<<<\n"); 851 852 SysFreeString(url); 853 if(This->doc_host) 854 This->doc_host->busy = VARIANT_FALSE; 855 856 IShellBrowser_Release(&This->IShellBrowser_iface); 857 return S_OK; 858 } 859 860 static HRESULT WINAPI DocObjectService_UpdateDesktopComponent( 861 IDocObjectService* iface, 862 IHTMLWindow2 *pHTMLWindow) 863 { 864 ShellBrowser *This = impl_from_IDocObjectService(iface); 865 FIXME("%p %p\n", This, pHTMLWindow); 866 return E_NOTIMPL; 867 } 868 869 static HRESULT WINAPI DocObjectService_GetPendingUrl( 870 IDocObjectService* iface, 871 BSTR *pbstrPendingUrl) 872 { 873 ShellBrowser *This = impl_from_IDocObjectService(iface); 874 FIXME("%p %p\n", This, pbstrPendingUrl); 875 return E_NOTIMPL; 876 } 877 878 static HRESULT WINAPI DocObjectService_ActiveElementChanged( 879 IDocObjectService* iface, 880 IHTMLElement *pHTMLElement) 881 { 882 ShellBrowser *This = impl_from_IDocObjectService(iface); 883 FIXME("%p %p\n", This, pHTMLElement); 884 return E_NOTIMPL; 885 } 886 887 static HRESULT WINAPI DocObjectService_GetUrlSearchComponent( 888 IDocObjectService* iface, 889 BSTR *pbstrSearch) 890 { 891 ShellBrowser *This = impl_from_IDocObjectService(iface); 892 FIXME("%p %p\n", This, pbstrSearch); 893 return E_NOTIMPL; 894 } 895 896 static HRESULT WINAPI DocObjectService_IsErrorUrl( 897 IDocObjectService* iface, 898 LPCWSTR lpszUrl, 899 BOOL *pfIsError) 900 { 901 ShellBrowser *This = impl_from_IDocObjectService(iface); 902 FIXME("%p %s %p\n", This, debugstr_w(lpszUrl), pfIsError); 903 904 *pfIsError = FALSE; 905 return S_OK; 906 } 907 908 static const IDocObjectServiceVtbl DocObjectServiceVtbl = { 909 DocObjectService_QueryInterface, 910 DocObjectService_AddRef, 911 DocObjectService_Release, 912 DocObjectService_FireBeforeNavigate2, 913 DocObjectService_FireNavigateComplete2, 914 DocObjectService_FireDownloadBegin, 915 DocObjectService_FireDownloadComplete, 916 DocObjectService_FireDocumentComplete, 917 DocObjectService_UpdateDesktopComponent, 918 DocObjectService_GetPendingUrl, 919 DocObjectService_ActiveElementChanged, 920 DocObjectService_GetUrlSearchComponent, 921 DocObjectService_IsErrorUrl 922 }; 923 924 HRESULT create_browser_service(DocHost *doc_host, ShellBrowser **ret) 925 { 926 ShellBrowser *sb; 927 928 sb = heap_alloc(sizeof(ShellBrowser)); 929 if(!sb) 930 return E_OUTOFMEMORY; 931 932 sb->IShellBrowser_iface.lpVtbl = &ShellBrowserVtbl; 933 sb->IBrowserService_iface.lpVtbl = &BrowserServiceVtbl; 934 sb->IDocObjectService_iface.lpVtbl = &DocObjectServiceVtbl; 935 936 sb->ref = 1; 937 sb->doc_host = doc_host; 938 939 *ret = sb; 940 return S_OK; 941 } 942 943 void detach_browser_service(ShellBrowser *sb) 944 { 945 sb->doc_host = NULL; 946 IShellBrowser_Release(&sb->IShellBrowser_iface); 947 } 948 949 static inline NewWindowManager *impl_from_INewWindowManager(INewWindowManager *iface) 950 { 951 return CONTAINING_RECORD(iface, NewWindowManager, INewWindowManager_iface); 952 } 953 954 static HRESULT WINAPI NewWindowManager_QueryInterface(INewWindowManager *iface, REFIID riid, void **ppv) 955 { 956 NewWindowManager *This = impl_from_INewWindowManager(iface); 957 958 if(IsEqualGUID(&IID_IUnknown, riid)) { 959 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); 960 *ppv = &This->INewWindowManager_iface; 961 }else if(IsEqualGUID(&IID_INewWindowManager, riid)) { 962 TRACE("(%p)->(IID_INewWindowManager %p)\n", This, ppv); 963 *ppv = &This->INewWindowManager_iface; 964 }else { 965 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); 966 *ppv = NULL; 967 return E_NOINTERFACE; 968 } 969 970 IUnknown_AddRef((IUnknown*)*ppv); 971 return S_OK; 972 } 973 974 static ULONG WINAPI NewWindowManager_AddRef(INewWindowManager *iface) 975 { 976 NewWindowManager *This = impl_from_INewWindowManager(iface); 977 978 TRACE("(%p)\n", This); 979 980 return IOleClientSite_AddRef(&This->doc_host->IOleClientSite_iface); 981 } 982 983 static ULONG WINAPI NewWindowManager_Release(INewWindowManager *iface) 984 { 985 NewWindowManager *This = impl_from_INewWindowManager(iface); 986 987 TRACE("(%p)\n", This); 988 989 return IOleClientSite_Release(&This->doc_host->IOleClientSite_iface); 990 } 991 992 static HRESULT WINAPI NewWindowManager_EvaluateNewWindow(INewWindowManager *iface, LPCWSTR pszUrl, 993 LPCWSTR pszName, LPCWSTR pszUrlContext, LPCWSTR pszFeatures, BOOL fReplace, DWORD dwFlags, 994 DWORD dwUserActionTime) 995 { 996 NewWindowManager *This = impl_from_INewWindowManager(iface); 997 FIXME("(%p)->(%s %s %s %s %x %x %d)\n", This, debugstr_w(pszUrl), debugstr_w(pszName), debugstr_w(pszUrlContext), 998 debugstr_w(pszFeatures), fReplace, dwFlags, dwUserActionTime); 999 return S_OK; 1000 } 1001 1002 static const INewWindowManagerVtbl NewWindowManagerVtbl = { 1003 NewWindowManager_QueryInterface, 1004 NewWindowManager_AddRef, 1005 NewWindowManager_Release, 1006 NewWindowManager_EvaluateNewWindow 1007 }; 1008 1009 void NewWindowManager_Init(DocHost *doc_host) 1010 { 1011 doc_host->nwm.INewWindowManager_iface.lpVtbl = &NewWindowManagerVtbl; 1012 doc_host->nwm.doc_host = doc_host; 1013 } 1014