/*
 * Implementation of IOleObject interfaces for IE Web Browser
 *
 * - IOleObject
 * - IOleInPlaceObject
 * - IOleControl
 *
 * Copyright 2001 John R. Sheets (for CodeWeavers)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include <string.h>
#include "wine/debug.h"
#include "shdocvw.h"
#include "ole2.h"

WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);

/**********************************************************************
 * Implement the IOleObject interface for the web browser component
 *
 * Based on DefaultHandler code in dlls/ole32/defaulthandler.c.
 */

static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface);
static ULONG WINAPI WBOOBJ_Release(LPOLEOBJECT iface);

/************************************************************************
 * WBOOBJ_QueryInterface (IUnknown)
 *
 * Interfaces we need to (at least pretend to) retrieve:
 *
 *   a6bc3ac0-dbaa-11ce-9de3-00aa004bb851  IID_IProvideClassInfo2
 *   b196b283-bab4-101a-b69c-00aa00341d07  IID_IProvideClassInfo
 *   cf51ed10-62fe-11cf-bf86-00a0c9034836  IID_IQuickActivate
 *   7fd52380-4e07-101b-ae2d-08002b2ec713  IID_IPersistStreamInit
 *   0000010a-0000-0000-c000-000000000046  IID_IPersistStorage
 *   b196b284-bab4-101a-b69c-00aa00341d07  IID_IConnectionPointContainer
 */
static HRESULT WINAPI WBOOBJ_QueryInterface(LPOLEOBJECT iface,
                                            REFIID riid, void** ppobj)
{
    ICOM_THIS(IOleObjectImpl, iface);

    /*
     * Perform a sanity check on the parameters.
     */
    if ((This == NULL) || (ppobj == NULL) )
        return E_INVALIDARG;

    if (IsEqualGUID (&IID_IPersistStorage, riid))
    {
        TRACE("Returning IID_IPersistStorage interface\n");
        *ppobj = (LPVOID)&SHDOCVW_PersistStorage;
        WBOOBJ_AddRef (iface);
        return S_OK;
    }
    else if (IsEqualGUID (&IID_IPersistStreamInit, riid))
    {
        TRACE("Returning IID_IPersistStreamInit interface\n");
        *ppobj = (LPVOID)&SHDOCVW_PersistStreamInit;
        WBOOBJ_AddRef (iface);
        return S_OK;
    }
    else if (IsEqualGUID (&IID_IProvideClassInfo, riid))
    {
        TRACE("Returning IID_IProvideClassInfo interface\n");
        *ppobj = (LPVOID)&SHDOCVW_ProvideClassInfo;
        WBOOBJ_AddRef (iface);
        return S_OK;
    }
    else if (IsEqualGUID (&IID_IProvideClassInfo2, riid))
    {
        TRACE("Returning IID_IProvideClassInfo2 interface %p\n",
              &SHDOCVW_ProvideClassInfo2);
        *ppobj = (LPVOID)&SHDOCVW_ProvideClassInfo2;
        WBOOBJ_AddRef (iface);
        return S_OK;
    }
    else if (IsEqualGUID (&IID_IQuickActivate, riid))
    {
        TRACE("Returning IID_IQuickActivate interface\n");
        *ppobj = (LPVOID)&SHDOCVW_QuickActivate;
        WBOOBJ_AddRef (iface);
        return S_OK;
    }
    else if (IsEqualGUID (&IID_IConnectionPointContainer, riid))
    {
        TRACE("Returning IID_IConnectionPointContainer interface\n");
        *ppobj = (LPVOID)&SHDOCVW_ConnectionPointContainer;
        WBOOBJ_AddRef (iface);
        return S_OK;
    }
    else if (IsEqualGUID (&IID_IOleInPlaceObject, riid))
    {
        TRACE("Returning IID_IOleInPlaceObject interface\n");
        *ppobj = (LPVOID)&SHDOCVW_OleInPlaceObject;
        WBOOBJ_AddRef (iface);
        return S_OK;
    }
    else if (IsEqualGUID (&IID_IOleControl, riid))
    {
        TRACE("Returning IID_IOleControl interface\n");
        *ppobj = (LPVOID)&SHDOCVW_OleControl;
        WBOOBJ_AddRef (iface);
        return S_OK;
    }
    else if (IsEqualGUID (&IID_IWebBrowser, riid))
    {
        TRACE("Returning IID_IWebBrowser interface\n");
        *ppobj = (LPVOID)&SHDOCVW_WebBrowser;
        WBOOBJ_AddRef (iface);
        return S_OK;
    }
    else if (IsEqualGUID (&IID_IDispatch, riid))
    {
        TRACE("Returning IID_IDispatch interface\n");
        *ppobj = (LPVOID)&SHDOCVW_WebBrowser;
        WBOOBJ_AddRef (iface);
        return S_OK;
    }

    TRACE ("Failed to find iid = %s\n", debugstr_guid(riid));

    return E_NOINTERFACE;
}

/************************************************************************
 * WBOOBJ_AddRef (IUnknown)
 */
static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface)
{
    ICOM_THIS(IOleObjectImpl, iface);

    TRACE("\n");
    return ++(This->ref);
}

/************************************************************************
 * WBOOBJ_Release (IUnknown)
 */
static ULONG WINAPI WBOOBJ_Release(LPOLEOBJECT iface)
{
    ICOM_THIS(IOleObjectImpl, iface);

    /* static class, won't be freed */
    TRACE("\n");
    return --(This->ref);
}

/************************************************************************
 * WBOOBJ_SetClientSite (IOleObject)
 */
static HRESULT WINAPI WBOOBJ_SetClientSite(LPOLEOBJECT iface,
                                           LPOLECLIENTSITE pClientSite)
{
    FIXME("stub: (%p, %p)\n", iface, pClientSite);
    return S_OK;
}

/************************************************************************
 * WBOOBJ_GetClientSite (IOleObject)
 */
static HRESULT WINAPI WBOOBJ_GetClientSite(LPOLEOBJECT iface,
                                           LPOLECLIENTSITE* ppClientSite)
{
    FIXME("stub: (%p)\n", *ppClientSite);
    return S_OK;
}

/************************************************************************
 * WBOOBJ_SetHostNames (IOleObject)
 */
static HRESULT WINAPI WBOOBJ_SetHostNames(LPOLEOBJECT iface, LPCOLESTR szContainerApp,
                                          LPCOLESTR szContainerObj)
{
    FIXME("stub: (%p, %s, %s)\n", iface, debugstr_w(szContainerApp),
          debugstr_w(szContainerObj));
    return S_OK;
}

/************************************************************************
 * WBOOBJ_Close (IOleObject)
 */
static HRESULT WINAPI WBOOBJ_Close(LPOLEOBJECT iface, DWORD dwSaveOption)
{
    FIXME("stub: ()\n");
    return S_OK;
}

/************************************************************************
 * WBOOBJ_SetMoniker (IOleObject)
 */
static HRESULT WINAPI WBOOBJ_SetMoniker(LPOLEOBJECT iface,
                                        DWORD dwWhichMoniker, IMoniker* pmk)
{
    FIXME("stub: (%p, %ld, %p)\n", iface, dwWhichMoniker, pmk);
    return S_OK;
}

/************************************************************************
 * WBOOBJ_GetMoniker (IOleObject)
 *
 * Delegate this request to the client site if we have one.
 */
static HRESULT WINAPI WBOOBJ_GetMoniker(LPOLEOBJECT iface, DWORD dwAssign,
                                        DWORD dwWhichMoniker, LPMONIKER *ppmk)
{
    FIXME("stub (%p, %ld, %ld, %p)\n", iface, dwAssign, dwWhichMoniker, ppmk);
    return E_UNSPEC;
}

/************************************************************************
 * WBOOBJ_InitFromData (IOleObject)
 *
 * This method is meaningless if the server is not running
 */
static HRESULT WINAPI WBOOBJ_InitFromData(LPOLEOBJECT iface, LPDATAOBJECT pDataObject,
                                          BOOL fCreation, DWORD dwReserved)
{
    FIXME("stub: (%p, %p, %d, %ld)\n", iface, pDataObject, fCreation, dwReserved);
    return OLE_E_NOTRUNNING;
}

/************************************************************************
 * WBOOBJ_GetClipboardData (IOleObject)
 *
 * This method is meaningless if the server is not running
 */
static HRESULT WINAPI WBOOBJ_GetClipboardData(LPOLEOBJECT iface, DWORD dwReserved,
                                              LPDATAOBJECT *ppDataObject)
{
    FIXME("stub: (%p, %ld, %p)\n", iface, dwReserved, ppDataObject);
    return OLE_E_NOTRUNNING;
}

/************************************************************************
 * WBOOBJ_DoVerb (IOleObject)
 */
static HRESULT WINAPI WBOOBJ_DoVerb(LPOLEOBJECT iface, LONG iVerb, struct tagMSG* lpmsg,
                                    LPOLECLIENTSITE pActiveSite, LONG lindex,
                                    HWND hwndParent, LPCRECT lprcPosRect)
{
    FIXME(": stub iVerb = %ld\n", iVerb);
    switch (iVerb)
    {
    case OLEIVERB_INPLACEACTIVATE:
        FIXME ("stub for OLEIVERB_INPLACEACTIVATE\n");
        break;
    case OLEIVERB_HIDE:
        FIXME ("stub for OLEIVERB_HIDE\n");
        break;
    }

    return S_OK;
}

/************************************************************************
 * WBOOBJ_EnumVerbs (IOleObject)
 *
 * Delegate to OleRegEnumVerbs.
 */
static HRESULT WINAPI WBOOBJ_EnumVerbs(LPOLEOBJECT iface,
                                       IEnumOLEVERB** ppEnumOleVerb)
{
    TRACE("(%p, %p)\n", iface, ppEnumOleVerb);

    return OleRegEnumVerbs(&CLSID_WebBrowser, ppEnumOleVerb);
}

/************************************************************************
 * WBOOBJ_EnumVerbs (IOleObject)
 */
static HRESULT WINAPI WBOOBJ_Update(LPOLEOBJECT iface)
{
    FIXME(": Stub\n");
    return E_NOTIMPL;
}

/************************************************************************
 * WBOOBJ_IsUpToDate (IOleObject)
 *
 * This method is meaningless if the server is not running
 */
static HRESULT WINAPI WBOOBJ_IsUpToDate(LPOLEOBJECT iface)
{
    FIXME("(%p)\n", iface);
    return OLE_E_NOTRUNNING;
}

/************************************************************************
 * WBOOBJ_GetUserClassID (IOleObject)
 */
static HRESULT WINAPI WBOOBJ_GetUserClassID(LPOLEOBJECT iface, CLSID* pClsid)
{
    FIXME("stub: (%p, %p)\n", iface, pClsid);
    return S_OK;
}

/************************************************************************
 * WBOOBJ_GetUserType (IOleObject)
 *
 * Delegate to OleRegGetUserType.
 */
static HRESULT WINAPI WBOOBJ_GetUserType(LPOLEOBJECT iface, DWORD dwFormOfType,
                                         LPOLESTR* pszUserType)
{
    TRACE("(%p, %ld, %p)\n", iface, dwFormOfType, pszUserType);

    return OleRegGetUserType(&CLSID_WebBrowser, dwFormOfType, pszUserType);
}

/************************************************************************
 * WBOOBJ_SetExtent (IOleObject)
 *
 * This method is meaningless if the server is not running
 */
static HRESULT WINAPI WBOOBJ_SetExtent(LPOLEOBJECT iface, DWORD dwDrawAspect,
                                       SIZEL* psizel)
{
    FIXME("stub: (%p, %lx, (%ld x %ld))\n", iface, dwDrawAspect,
          psizel->cx, psizel->cy);
    return OLE_E_NOTRUNNING;
}

/************************************************************************
 * WBOOBJ_GetExtent (IOleObject)
 */
static HRESULT WINAPI WBOOBJ_GetExtent(LPOLEOBJECT iface, DWORD dwDrawAspect,
                                       SIZEL* psizel)
{
    FIXME("stub: (%p, %lx, %p)\n", iface, dwDrawAspect, psizel);
    return S_OK;
}

/************************************************************************
 * WBOOBJ_Advise (IOleObject)
 */
static HRESULT WINAPI WBOOBJ_Advise(LPOLEOBJECT iface, IAdviseSink* pAdvSink,
                                    DWORD* pdwConnection)
{
    FIXME("stub: (%p, %p, %p)\n", iface, pAdvSink, pdwConnection);
    return S_OK;
}

/************************************************************************
 * WBOOBJ_Unadvise (IOleObject)
 */
static HRESULT WINAPI WBOOBJ_Unadvise(LPOLEOBJECT iface, DWORD dwConnection)
{
    FIXME("stub: (%p, %ld)\n", iface, dwConnection);
    return S_OK;
}

/************************************************************************
 * WBOOBJ_EnumAdvise (IOleObject)
 */
static HRESULT WINAPI WBOOBJ_EnumAdvise(LPOLEOBJECT iface, IEnumSTATDATA** ppenumAdvise)
{
    FIXME("stub: (%p, %p)\n", iface, ppenumAdvise);
    return S_OK;
}

/************************************************************************
 * WBOOBJ_GetMiscStatus (IOleObject)
 *
 * Delegate to OleRegGetMiscStatus.
 */
static HRESULT WINAPI WBOOBJ_GetMiscStatus(LPOLEOBJECT iface, DWORD dwAspect,
                                           DWORD* pdwStatus)
{
    HRESULT hres;

    TRACE("(%p, %lx, %p)\n", iface, dwAspect, pdwStatus);

    hres = OleRegGetMiscStatus(&CLSID_WebBrowser, dwAspect, pdwStatus);

    if (FAILED(hres))
        *pdwStatus = 0;

    return S_OK;
}

/************************************************************************
 * WBOOBJ_SetColorScheme (IOleObject)
 *
 * This method is meaningless if the server is not running
 */
static HRESULT WINAPI WBOOBJ_SetColorScheme(LPOLEOBJECT iface,
                                            struct tagLOGPALETTE* pLogpal)
{
    FIXME("stub: (%p, %p))\n", iface, pLogpal);
    return OLE_E_NOTRUNNING;
}

/**********************************************************************
 * IOleObject virtual function table for IE Web Browser component
 */

static ICOM_VTABLE(IOleObject) WBOOBJ_Vtbl =
{
    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    WBOOBJ_QueryInterface,
    WBOOBJ_AddRef,
    WBOOBJ_Release,
    WBOOBJ_SetClientSite,
    WBOOBJ_GetClientSite,
    WBOOBJ_SetHostNames,
    WBOOBJ_Close,
    WBOOBJ_SetMoniker,
    WBOOBJ_GetMoniker,
    WBOOBJ_InitFromData,
    WBOOBJ_GetClipboardData,
    WBOOBJ_DoVerb,
    WBOOBJ_EnumVerbs,
    WBOOBJ_Update,
    WBOOBJ_IsUpToDate,
    WBOOBJ_GetUserClassID,
    WBOOBJ_GetUserType,
    WBOOBJ_SetExtent,
    WBOOBJ_GetExtent,
    WBOOBJ_Advise,
    WBOOBJ_Unadvise,
    WBOOBJ_EnumAdvise,
    WBOOBJ_GetMiscStatus,
    WBOOBJ_SetColorScheme
};

IOleObjectImpl SHDOCVW_OleObject = { &WBOOBJ_Vtbl, 1 };


/**********************************************************************
 * Implement the IOleInPlaceObject interface
 */

static HRESULT WINAPI WBOIPO_QueryInterface(LPOLEINPLACEOBJECT iface,
                                            REFIID riid, LPVOID *ppobj)
{
    ICOM_THIS(IOleInPlaceObjectImpl, iface);

    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
    return E_NOINTERFACE;
}

static ULONG WINAPI WBOIPO_AddRef(LPOLEINPLACEOBJECT iface)
{
    ICOM_THIS(IOleInPlaceObjectImpl, iface);

    TRACE("\n");
    return ++(This->ref);
}

static ULONG WINAPI WBOIPO_Release(LPOLEINPLACEOBJECT iface)
{
    ICOM_THIS(IOleInPlaceObjectImpl, iface);

    /* static class, won't be freed */
    TRACE("\n");
    return --(This->ref);
}

static HRESULT WINAPI WBOIPO_GetWindow(LPOLEINPLACEOBJECT iface, HWND* phwnd)
{
#if 0
    /* Create a fake window to fool MFC into believing that we actually
     * have an implemented browser control.  Avoids the assertion.
     */
    HWND hwnd;
    hwnd = CreateWindowA("BUTTON", "Web Control",
                        WS_HSCROLL | WS_VSCROLL | WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT, 600,
                        400, NULL, NULL, NULL, NULL);

    *phwnd = hwnd;
    TRACE ("Returning hwnd = %d\n", hwnd);
#endif

    FIXME("stub HWND* = %p\n", phwnd);
    return S_OK;
}

static HRESULT WINAPI WBOIPO_ContextSensitiveHelp(LPOLEINPLACEOBJECT iface,
                                                  BOOL fEnterMode)
{
    FIXME("stub fEnterMode = %d\n", fEnterMode);
    return S_OK;
}

static HRESULT WINAPI WBOIPO_InPlaceDeactivate(LPOLEINPLACEOBJECT iface)
{
    FIXME("stub \n");
    return S_OK;
}

static HRESULT WINAPI WBOIPO_UIDeactivate(LPOLEINPLACEOBJECT iface)
{
    FIXME("stub \n");
    return S_OK;
}

static HRESULT WINAPI WBOIPO_SetObjectRects(LPOLEINPLACEOBJECT iface,
                                            LPCRECT lprcPosRect, LPCRECT lprcClipRect)
{
    FIXME("stub PosRect = %p, ClipRect = %p\n", lprcPosRect, lprcClipRect);
    return S_OK;
}

static HRESULT WINAPI WBOIPO_ReactivateAndUndo(LPOLEINPLACEOBJECT iface)
{
    FIXME("stub \n");
    return S_OK;
}

/**********************************************************************
 * IOleInPlaceObject virtual function table for IE Web Browser component
 */

static ICOM_VTABLE(IOleInPlaceObject) WBOIPO_Vtbl =
{
    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    WBOIPO_QueryInterface,
    WBOIPO_AddRef,
    WBOIPO_Release,
    WBOIPO_GetWindow,
    WBOIPO_ContextSensitiveHelp,
    WBOIPO_InPlaceDeactivate,
    WBOIPO_UIDeactivate,
    WBOIPO_SetObjectRects,
    WBOIPO_ReactivateAndUndo
};

IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject = { &WBOIPO_Vtbl, 1 };


/**********************************************************************
 * Implement the IOleControl interface
 */

static HRESULT WINAPI WBOC_QueryInterface(LPOLECONTROL iface,
                                          REFIID riid, LPVOID *ppobj)
{
    ICOM_THIS(IOleControlImpl, iface);

    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
    return E_NOINTERFACE;
}

static ULONG WINAPI WBOC_AddRef(LPOLECONTROL iface)
{
    ICOM_THIS(IOleControlImpl, iface);

    TRACE("\n");
    return ++(This->ref);
}

static ULONG WINAPI WBOC_Release(LPOLECONTROL iface)
{
    ICOM_THIS(IOleControlImpl, iface);

    /* static class, won't be freed */
    TRACE("\n");
    return --(This->ref);
}

static HRESULT WINAPI WBOC_GetControlInfo(LPOLECONTROL iface, LPCONTROLINFO pCI)
{
    FIXME("stub: LPCONTROLINFO = %p\n", pCI);
    return S_OK;
}

static HRESULT WINAPI WBOC_OnMnemonic(LPOLECONTROL iface, struct tagMSG *pMsg)
{
    FIXME("stub: MSG* = %p\n", pMsg);
    return S_OK;
}

static HRESULT WINAPI WBOC_OnAmbientPropertyChange(LPOLECONTROL iface, DISPID dispID)
{
    FIXME("stub: DISPID = %ld\n", dispID);
    return S_OK;
}

static HRESULT WINAPI WBOC_FreezeEvents(LPOLECONTROL iface, BOOL bFreeze)
{
    FIXME("stub: bFreeze = %d\n", bFreeze);
    return S_OK;
}

/**********************************************************************
 * IOleControl virtual function table for IE Web Browser component
 */

static ICOM_VTABLE(IOleControl) WBOC_Vtbl =
{
    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    WBOC_QueryInterface,
    WBOC_AddRef,
    WBOC_Release,
    WBOC_GetControlInfo,
    WBOC_OnMnemonic,
    WBOC_OnAmbientPropertyChange,
    WBOC_FreezeEvents
};

IOleControlImpl SHDOCVW_OleControl = { &WBOC_Vtbl, 1 };
