xref: /reactos/dll/win32/browseui/bandproxy.cpp (revision 1734f297)
1 /*
2  * ReactOS Explorer
3  *
4  * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20 
21 /*
22 Used by the address band to dispatch navigation changes to the main browser object.
23 
24 TODO:
25 
26 */
27 
28 #include "precomp.h"
29 
30 CBandProxy::CBandProxy()
31 {
32 }
33 
34 CBandProxy::~CBandProxy()
35 {
36 }
37 
38 HRESULT CBandProxy::FindBrowserWindow(IUnknown **browser)
39 {
40     IWebBrowser2* webBrowser;
41     HRESULT hResult;
42 
43     if (browser == NULL)
44         return E_POINTER;
45     hResult = IUnknown_QueryService(fSite, SID_IWebBrowserApp, IID_PPV_ARG(IWebBrowser2, &webBrowser));
46     if (FAILED_UNEXPECTEDLY(hResult))
47         return hResult;
48     *browser = webBrowser;
49     return S_OK;
50 }
51 
52 HRESULT STDMETHODCALLTYPE CBandProxy::SetSite(IUnknown *paramC)
53 {
54     fSite = paramC;
55     return S_OK;
56 }
57 
58 HRESULT STDMETHODCALLTYPE CBandProxy::CreateNewWindow(long paramC)
59 {
60     return E_NOTIMPL;
61 }
62 
63 HRESULT STDMETHODCALLTYPE CBandProxy::GetBrowserWindow(IUnknown **paramC)
64 {
65     if (paramC == NULL)
66         return E_POINTER;
67     return FindBrowserWindow(paramC);
68 }
69 
70 HRESULT STDMETHODCALLTYPE CBandProxy::IsConnected()
71 {
72     CComPtr<IUnknown>                       webBrowser;
73     HRESULT                                 hResult;
74 
75     hResult = FindBrowserWindow(&webBrowser);
76     if (FAILED_UNEXPECTEDLY(hResult) || webBrowser.p == NULL)
77         return S_FALSE;
78     return S_OK;
79 }
80 
81 HRESULT STDMETHODCALLTYPE CBandProxy::NavigateToPIDL(LPCITEMIDLIST pidl)
82 {
83     CComPtr<IOleWindow>                     oleWindow;
84     CComPtr<IServiceProvider>               serviceProvider;
85     CComPtr<IUnknown>                       webBrowserUnknown;
86     CComPtr<IWebBrowser2>                   webBrowser;
87     HWND                                    browserWindow;
88     CComVariant                             args;
89     CComVariant                             emptyVariant;
90     unsigned int                            arraySize;
91     HRESULT                                 hResult;
92 
93     hResult = FindBrowserWindow(&webBrowserUnknown);
94     if (FAILED_UNEXPECTEDLY(hResult))
95         return hResult;
96     hResult = webBrowserUnknown->QueryInterface(IID_PPV_ARG(IWebBrowser2, &webBrowser));
97     if (FAILED_UNEXPECTEDLY(hResult))
98         return hResult;
99     hResult = webBrowser->put_Visible(TRUE);
100     hResult = webBrowser->QueryInterface(IID_PPV_ARG(IServiceProvider, &serviceProvider));
101     if (SUCCEEDED(hResult))
102     {
103         hResult = serviceProvider->QueryService(SID_STopLevelBrowser,
104             IID_PPV_ARG(IOleWindow, &oleWindow));
105         if (SUCCEEDED(hResult))
106         {
107             hResult = oleWindow->GetWindow(&browserWindow);
108             if (IsIconic(browserWindow))
109                 ShowWindow(browserWindow, SW_RESTORE);
110         }
111     }
112     arraySize = ILGetSize(pidl);
113     V_VT(&args) = VT_ARRAY | VT_UI1;
114     V_ARRAY(&args) = SafeArrayCreateVector(VT_UI1, 0, arraySize);
115     if (V_ARRAY(&args) == NULL)
116         return E_OUTOFMEMORY;
117     memcpy(V_ARRAY(&args)->pvData, pidl, arraySize);
118     hResult = webBrowser->Navigate2(&args, &emptyVariant, &emptyVariant, &emptyVariant, &emptyVariant);
119     if (FAILED_UNEXPECTEDLY(hResult))
120         return hResult;
121     return S_OK;
122 }
123 
124 HRESULT STDMETHODCALLTYPE CBandProxy::NavigateToURL(long paramC, long param10)
125 {
126     return E_NOTIMPL;
127 }
128