You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

495 lines
9.8 KiB

/*==LICENSE==*
CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011 Cyan Worlds, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
You can contact Cyan Worlds, Inc. by email legal@cyan.com
or by snail mail at:
Cyan Worlds, Inc.
14617 N Newport Hwy
Mead, WA 99021
*==LICENSE==*/
#include "hsTypes.h"
#include "hsConfig.h"
#if HS_BUILD_FOR_WIN32
// Stolen from: http://www.mvps.org/user32/webhost.cab
// No copyright notices, so I assume it's public domain -Colin
#include "webhost.h"
#include "plWndCtrls.h"
// IUnknown
STDMETHODIMP CNullStorage::QueryInterface(REFIID riid,void ** ppvObject)
{
NOTIMPLEMENTED;
}
STDMETHODIMP_(ULONG) CNullStorage::AddRef(void)
{
return 1;
}
STDMETHODIMP_(ULONG) CNullStorage::Release(void)
{
return 1;
}
// IStorage
STDMETHODIMP CNullStorage::CreateStream(const WCHAR * pwcsName,DWORD grfMode,DWORD reserved1,DWORD reserved2,IStream ** ppstm)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::OpenStream(const WCHAR * pwcsName,void * reserved1,DWORD grfMode,DWORD reserved2,IStream ** ppstm)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::CreateStorage(const WCHAR * pwcsName,DWORD grfMode,DWORD reserved1,DWORD reserved2,IStorage ** ppstg)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::OpenStorage(const WCHAR * pwcsName,IStorage * pstgPriority,DWORD grfMode,SNB snbExclude,DWORD reserved,IStorage ** ppstg)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::CopyTo(DWORD ciidExclude,IID const * rgiidExclude,SNB snbExclude,IStorage * pstgDest)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::MoveElementTo(const OLECHAR * pwcsName,IStorage * pstgDest,const OLECHAR* pwcsNewName,DWORD grfFlags)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::Commit(DWORD grfCommitFlags)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::Revert(void)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::EnumElements(DWORD reserved1,void * reserved2,DWORD reserved3,IEnumSTATSTG ** ppenum)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::DestroyElement(const OLECHAR * pwcsName)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::RenameElement(const WCHAR * pwcsOldName,const WCHAR * pwcsNewName)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::SetElementTimes(const WCHAR * pwcsName,FILETIME const * pctime,FILETIME const * patime,FILETIME const * pmtime)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::SetClass(REFCLSID clsid)
{
return S_OK;
}
STDMETHODIMP CNullStorage::SetStateBits(DWORD grfStateBits,DWORD grfMask)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CNullStorage::Stat(STATSTG * pstatstg,DWORD grfStatFlag)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CMySite::QueryInterface(REFIID riid,void ** ppvObject)
{
if(riid == IID_IUnknown || riid == IID_IOleClientSite)
*ppvObject = (IOleClientSite*)this;
else if(riid == IID_IOleInPlaceSite) // || riid == IID_IOleInPlaceSiteEx || riid == IID_IOleInPlaceSiteWindowless)
*ppvObject = (IOleInPlaceSite*)this;
else
{
*ppvObject = NULL;
return E_NOINTERFACE;
}
return S_OK;
}
STDMETHODIMP_(ULONG) CMySite::AddRef(void)
{
return 1;
}
STDMETHODIMP_(ULONG) CMySite::Release(void)
{
return 1;
}
// IOleClientSite
STDMETHODIMP CMySite::SaveObject()
{
NOTIMPLEMENTED;
}
STDMETHODIMP CMySite::GetMoniker(DWORD dwAssign,DWORD dwWhichMoniker,IMoniker ** ppmk)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CMySite::GetContainer(LPOLECONTAINER FAR* ppContainer)
{
// We are a simple object and don't support a container.
*ppContainer = NULL;
return E_NOINTERFACE;
}
STDMETHODIMP CMySite::ShowObject()
{
// NOTIMPLEMENTED;
// huh?
return NOERROR;
}
STDMETHODIMP CMySite::OnShowWindow(BOOL fShow)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CMySite::RequestNewObjectLayout()
{
NOTIMPLEMENTED;
}
// IOleWindow
STDMETHODIMP CMySite::GetWindow(HWND FAR* lphwnd)
{
*lphwnd = host->hwnd;
return S_OK;
}
STDMETHODIMP CMySite::ContextSensitiveHelp(BOOL fEnterMode)
{
NOTIMPLEMENTED;
}
// IOleInPlaceSite
STDMETHODIMP CMySite::CanInPlaceActivate()
{
// Yes we can
return S_OK;
}
STDMETHODIMP CMySite::OnInPlaceActivate()
{
// Why disagree.
return S_OK;
}
STDMETHODIMP CMySite::OnUIActivate()
{
return S_OK;
}
STDMETHODIMP CMySite::GetWindowContext(
LPOLEINPLACEFRAME FAR* ppFrame,
LPOLEINPLACEUIWINDOW FAR* ppDoc,
LPRECT prcPosRect,
LPRECT prcClipRect,
LPOLEINPLACEFRAMEINFO lpFrameInfo)
{
*ppFrame = &host->frame;
*ppDoc = NULL;
GetClientRect(host->hwnd,prcPosRect);
GetClientRect(host->hwnd,prcClipRect);
lpFrameInfo->fMDIApp = FALSE;
lpFrameInfo->hwndFrame = host->hwnd;
lpFrameInfo->haccel = NULL;
lpFrameInfo->cAccelEntries = 0;
return S_OK;
}
STDMETHODIMP CMySite::Scroll(SIZE scrollExtent)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CMySite::OnUIDeactivate(BOOL fUndoable)
{
return S_OK;
}
STDMETHODIMP CMySite::OnInPlaceDeactivate()
{
return S_OK;
}
STDMETHODIMP CMySite::DiscardUndoState()
{
NOTIMPLEMENTED;
}
STDMETHODIMP CMySite::DeactivateAndUndo()
{
NOTIMPLEMENTED;
}
STDMETHODIMP CMySite::OnPosRectChange(LPCRECT lprcPosRect)
{
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
//
// CMyFrame
//
// IUnknown
STDMETHODIMP CMyFrame::QueryInterface(REFIID riid,void ** ppvObject)
{
NOTIMPLEMENTED;
}
STDMETHODIMP_(ULONG) CMyFrame::AddRef(void)
{
return 1;
}
STDMETHODIMP_(ULONG) CMyFrame::Release(void)
{
return 1;
}
// IOleWindow
STDMETHODIMP CMyFrame::GetWindow(HWND FAR* lphwnd)
{
*lphwnd = this->host->hwnd;
return S_OK;
// NOTIMPLEMENTED;
}
STDMETHODIMP CMyFrame::ContextSensitiveHelp(BOOL fEnterMode)
{
NOTIMPLEMENTED;
}
// IOleInPlaceUIWindow
STDMETHODIMP CMyFrame::GetBorder(LPRECT lprectBorder)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CMyFrame::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CMyFrame::SetBorderSpace(LPCBORDERWIDTHS pborderwidths)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CMyFrame::SetActiveObject(IOleInPlaceActiveObject *pActiveObject,LPCOLESTR pszObjName)
{
return S_OK;
}
// IOleInPlaceFrame
STDMETHODIMP CMyFrame::InsertMenus(HMENU hmenuShared,LPOLEMENUGROUPWIDTHS lpMenuWidths)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CMyFrame::SetMenu(HMENU hmenuShared,HOLEMENU holemenu,HWND hwndActiveObject)
{
return S_OK;
}
STDMETHODIMP CMyFrame::RemoveMenus(HMENU hmenuShared)
{
NOTIMPLEMENTED;
}
STDMETHODIMP CMyFrame::SetStatusText(LPCOLESTR pszStatusText)
{
return S_OK;
}
STDMETHODIMP CMyFrame::EnableModeless(BOOL fEnable)
{
return S_OK;
}
STDMETHODIMP CMyFrame::TranslateAccelerator( LPMSG lpmsg,WORD wID)
{
NOTIMPLEMENTED;
}
webhostwnd::webhostwnd()
{
site.host = this;
frame.host = this;
}
webhostwnd::~webhostwnd()
{
}
HWND webhostwnd::operator =(webhostwnd* rhs)
{
return hwnd;
}
webhostwnd* webhostwnd::Create(HWND hParent, RECT& rect)
{
webhostwnd* _this = TRACKED_NEW webhostwnd;
CreateWindowEx(
0,
szClassName,L"TheWebbyWindow",
WS_CHILD,
rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,
hParent,NULL,plWndCtrls::Instance(),_this);
int err = GetLastError();
return _this;
}
BOOL webhostwnd::HandleMessage(UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* r)
{
if(uMsg == WM_DESTROY)
{
UnCreateEmbeddedWebControl();
PostQuitMessage(0);
return TRUE;
}
else if(uMsg == WM_CREATE)
{
CreateEmbeddedWebControl();
return TRUE;
}
return FALSE;
}
void webhostwnd::CreateEmbeddedWebControl(void)
{
OleCreate(CLSID_WebBrowser,IID_IOleObject,OLERENDER_DRAW,0,&site,&storage,(void**)&mpWebObject);
mpWebObject->SetHostNames(L"Web Host",L"Web View");
// I have no idea why this is necessary. remark it out and everything works perfectly.
OleSetContainedObject(mpWebObject,TRUE);
RECT rect;
GetClientRect(hwnd,&rect);
mpWebObject->DoVerb(OLEIVERB_SHOW,NULL,&site,-1,hwnd,&rect);
IWebBrowser2* iBrowser;
mpWebObject->QueryInterface(IID_IWebBrowser2,(void**)&iBrowser);
VARIANT vURL;
vURL.vt = VT_BSTR;
vURL.bstrVal = SysAllocString(L"about:blank");
VARIANT ve1, ve2, ve3, ve4;
ve1.vt = VT_EMPTY;
ve2.vt = VT_EMPTY;
ve3.vt = VT_EMPTY;
ve4.vt = VT_EMPTY;
iBrowser->put_Left(0);
iBrowser->put_Top(0);
iBrowser->put_Width(rect.right);
iBrowser->put_Height(rect.bottom);
iBrowser->Navigate2(&vURL, &ve1, &ve2, &ve3, &ve4);
VariantClear(&vURL);
iBrowser->Release();
}
void webhostwnd::UnCreateEmbeddedWebControl(void)
{
mpWebObject->Close(OLECLOSE_NOSAVE);
mpWebObject->Release();
}
#include <comdef.h>
void webhostwnd::GoToPage(const char* address)
{
IWebBrowser2* iBrowser;
mpWebObject->QueryInterface(IID_IWebBrowser2,(void**)&iBrowser);
_bstr_t s(address);
VARIANT vURL;
vURL.vt = VT_BSTR;
vURL.bstrVal = SysAllocString(s);
VARIANT vHeaders;
vHeaders.vt = VT_EMPTY;
VARIANT ve1, ve2, ve3;
ve1.vt = VT_EMPTY;
ve2.vt = VT_EMPTY;
ve3.vt = VT_EMPTY;
iBrowser->Navigate2(&vURL, &ve1, &ve2, &ve3, &vHeaders);
VariantClear(&vURL);
iBrowser->Release();
}
// OleUninitialize();
#endif