webchild.cpp

Go to the documentation of this file.
00001 /*
00002  * Copyright 2004, 2005 Martin Fuchs
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with this library; if not, write to the Free Software
00016  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017  */
00018 
00019 
00020  //
00021  // Explorer clone
00022  //
00023  // webchild.cpp
00024  //
00025  // Martin Fuchs, 08.02.2004
00026  //
00027 
00028 
00029 #include <precomp.h>
00030 
00031 #include "../resource.h"
00032 
00033 #include "webchild.h"
00034 
00035 
00036 #ifdef _MSC_VER
00037 
00038 #if _MSC_VER>=1300  // vtMissing for VS.Net
00039 #include <comutil.h>
00040 #pragma comment(lib, "comsupp")
00041 #endif
00042 
00043 #else
00044 
00045 #ifdef __MINGW32__  // MinGW is lacking vtMissing (as of 07.02.2004)
00046 static Variant vtMissing;
00047 #endif
00048 
00049 #endif
00050 
00051 //#include <mshtml.h>
00052 
00053 
00054 Variant::Variant(const VARIANT& var)
00055 {
00056     VariantInit(this);
00057     CheckError(VariantCopy(this, const_cast<VARIANT*>(&var)));
00058 }
00059 
00060 Variant::Variant(const VARIANT* var)
00061 {
00062     VariantInit(this);
00063     CheckError(VariantCopy(this, const_cast<VARIANT*>(var)));
00064 }
00065 
00066 Variant::~Variant()
00067 {
00068     VariantClear(this);
00069 }
00070 
00071 
00072 Variant::operator long() const
00073 {
00074     Variant v;
00075     CheckError(VariantChangeType(&v, (VARIANT*)this, 0, VT_I4));
00076     return V_I4(&v);
00077 }
00078 
00079 Variant::operator bool() const
00080 {
00081     Variant v;
00082     CheckError(VariantChangeType(&v, (VARIANT*)this, 0, VT_BOOL));
00083     return V_BOOL(&v)? true: false;
00084 }
00085 
00086 Variant::operator IDispatch*() const
00087 {
00088     Variant v;
00089     CheckError(VariantChangeType(&v, (VARIANT*)this, 0, VT_DISPATCH));
00090     return V_DISPATCH(&v);
00091 }
00092 
00093 Variant::operator VARIANT_BOOL() const
00094 {
00095     Variant v;
00096     CheckError(VariantChangeType(&v, (VARIANT*)this, 0, VT_BOOL));
00097     return V_BOOL(&v);
00098 }
00099 
00100 
00101 void BStr::assign(BSTR s)
00102 {
00103     if (!SysReAllocString(&_p, s))
00104         THROW_EXCEPTION(E_OUTOFMEMORY);
00105 }
00106 
00107 void BStr::assign(const VARIANT& var)
00108 {
00109     if (V_VT(&var) == VT_BSTR)
00110         assign(V_BSTR(&var));
00111     else {
00112         Variant v;
00113         CheckError(VariantChangeType(&v, const_cast<VARIANT*>(&var), 0, VT_BSTR));
00114         assign(V_BSTR(&v));
00115     }
00116 }
00117 
00118 
00119 BrowserNavigator::BrowserNavigator()
00120  :  _browser_initialized(false)
00121 {
00122 }
00123 
00124 void BrowserNavigator::attach(IWebBrowser* browser)
00125 {
00126     _browser = browser;
00127 }
00128 
00129 void BrowserNavigator::goto_url(LPCTSTR url)
00130 {
00131     if (_browser_initialized)
00132         _browser->Navigate(BStr(url), NULL, NULL, NULL, NULL);
00133     else {
00134         _new_url = url;
00135 
00136         _browser->Navigate(BStr(L"about:blank"), NULL, NULL, NULL, NULL);
00137     }
00138 }
00139 
00140 void BrowserNavigator::set_html_page(const String& html_txt)
00141 {
00142     _new_html_txt = html_txt;
00143 
00144     goto_url(TEXT("about:blank"));
00145 }
00146 
00147 void T2nA_binary(LPCTSTR s, LPSTR d, int len)
00148 {
00149     while(len-- > 0)
00150         *d++ = (unsigned char)*s++;
00151 }
00152 
00153 void BrowserNavigator::navigated(LPCTSTR url)
00154 {
00155     _browser_initialized = true;
00156 
00157     bool nav = false;
00158 
00159     if (!_new_url.empty()) {
00160         if (!_tcscmp(url,TEXT("about:blank")) && _new_url!=TEXT("about:blank")) {
00161             _browser->Navigate(BStr(_new_url), NULL, NULL, NULL, NULL);
00162             ++nav;
00163         }
00164 
00165         _new_url.erase();
00166     }
00167 
00168     if (!nav && !_new_html_txt.empty()) {   ///@todo move this into DocumentComplete() ?
00169         int len = _new_html_txt.length();
00170         HGLOBAL hHtmlText = GlobalAlloc(GPTR, len);
00171 
00172         if (!hHtmlText) {
00173             T2nA_binary(_new_html_txt, (char*)hHtmlText, len);
00174             _new_html_txt.erase();
00175 
00176             SIfacePtr<IStream> pStream;
00177             HRESULT hr = CreateStreamOnHGlobal(hHtmlText, TRUE, &pStream);
00178 
00179             if (SUCCEEDED(hr)) {
00180                 SIfacePtr<IDispatch> pHtmlDoc;
00181                 CheckError(_browser->get_Document(&pHtmlDoc));
00182 
00183                 SIfacePtr<IPersistStreamInit> pPersistStreamInit;
00184                 pHtmlDoc.QueryInterface(IID_IPersistStreamInit, &pPersistStreamInit);
00185 
00186                 CheckError(pPersistStreamInit->InitNew());
00187                 CheckError(pPersistStreamInit->Load(pStream));
00188             } else
00189                 GlobalFree(hHtmlText);
00190         }
00191     }
00192 }
00193 
00194 
00195 HWND create_webchildwindow(const WebChildWndInfo& info)
00196 {
00197     WebChildWindow* pWnd = WebChildWindow::create(info);
00198 
00199     if (!pWnd)
00200         return 0;
00201 
00202     return *pWnd;
00203 }
00204 
00205 static const CLSID CLSID_MozillaBrowser =
00206     {0x1339B54C, 0x3453, 0x11D2, {0x93, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
00207 
00208 
00209 WebChildWindow::WebChildWindow(HWND hwnd, const WebChildWndInfo& info)
00210  :  super(hwnd, info),
00211     web_super(_navigator)
00212 {
00213      // first try to create a web control with MS IE's CLASSID
00214     HRESULT hr = create_control(hwnd, CLSID_WebBrowser, IID_IWebBrowser2);
00215 
00216      // If this failed, try to use Mozilla's web control
00217     if (FAILED(hr))
00218         hr = create_control(hwnd, CLSID_MozillaBrowser, IID_IWebBrowser2);
00219 
00220     if (SUCCEEDED(hr)) {
00221         _navigator.attach(_control);
00222 
00223         _connector = auto_ptr<EventConnector>(new EventConnector(_control, DIID_DWebBrowserEvents2, this));
00224 
00225         _control->Navigate(BStr(info._path), &vtMissing, &vtMissing, &vtMissing, &vtMissing);
00226         //browser->Navigate2(&Variant(info._path), &vtMissing, &vtMissing, &vtMissing, &vtMissing);
00227     }
00228 }
00229 
00230 LRESULT WebChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
00231 {
00232     try {
00233         switch(nmsg) {
00234           case WM_ERASEBKGND:
00235             if (!_control) {
00236                 HDC hdc = (HDC)wparam;
00237                 ClientRect rect(_hwnd);
00238 
00239                 HBRUSH hbrush = CreateSolidBrush(RGB(200,200,235));
00240                 BkMode mode(hdc, TRANSPARENT);
00241                 TextColor color(hdc, RGB(200,40,40));
00242                 FillRect(hdc, &rect, hbrush);
00243                 DrawText(hdc, TEXT("Sorry - no web browser control could be loaded."), -1, &rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
00244                 DeleteObject(hbrush);
00245             }
00246 
00247             return TRUE;
00248 
00249           case PM_DISPATCH_COMMAND: {
00250             if (!_control)
00251                 return FALSE;
00252 
00253             HRESULT hr = E_FAIL;
00254 
00255             switch(LOWORD(wparam)) {
00256               case ID_GO_BACK:
00257                 hr = _control->GoBack();
00258                 break;
00259 
00260               case ID_GO_FORWARD:
00261                 hr = _control->GoForward();
00262                 break;
00263 
00264               case ID_GO_UP:
00265                 ///@todo
00266                 break;
00267 
00268               case ID_GO_HOME:
00269                 hr = _control->GoHome();
00270                 break;
00271 
00272               case ID_GO_SEARCH:
00273                 hr = _control->GoSearch();
00274                 break;
00275 
00276               case ID_REFRESH:
00277                 hr = _control->Refresh();
00278                 break;
00279 
00280               case ID_STOP:
00281                 hr = _control->Stop();
00282                 break;
00283 
00284               default:
00285                 return super::WndProc(nmsg, wparam, lparam);
00286             }
00287 
00288             if (FAILED(hr) && hr!=E_FAIL)
00289                 THROW_EXCEPTION(hr);
00290 
00291             return TRUE;}
00292 
00293           default:
00294             return super::WndProc(nmsg, wparam, lparam);
00295         }
00296     } catch(COMException& e) {
00297         HandleException(e, _hwnd);
00298     }
00299 
00300     return 0;
00301 }
00302 
00303 
00304 String WebChildWindow::jump_to_int(LPCTSTR url)
00305 {
00306     _navigator.goto_url(url);
00307 
00308     return url;
00309 }

ROS Explorer Source Code Documentation
generated on 02.01.2013 by doxygen

ROS Explorer Homepage