windows-nt/Source/XPSP1/NT/shell/shdocvw/srchasst.h
2020-09-26 16:20:57 +08:00

352 lines
12 KiB
C++

#ifndef __SRCHASST_H_
#define __SRCHASST_H_
#include "caggunk.h"
#include "dspsprt.h"
class CSearch : public ISearch,
protected CImpIDispatch
{
public:
//IUnknown methods
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppv);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
//IDispatch members
virtual STDMETHODIMP GetTypeInfoCount(UINT * pctinfo)
{ return CImpIDispatch::GetTypeInfoCount(pctinfo); }
virtual STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo **pptinfo)
{ return CImpIDispatch::GetTypeInfo(itinfo, lcid, pptinfo); }
virtual STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID * rgdispid)
{ return CImpIDispatch::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid); }
virtual STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr)
{ return CImpIDispatch::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); }
//ISearch methods
STDMETHODIMP get_Title(BSTR *pbstrTitle);
STDMETHODIMP get_Id(BSTR *pbstrId);
STDMETHODIMP get_Url(BSTR *pbstrUrl);
private:
CSearch(GUID *pguid, BSTR bstrTitle, BSTR bstrUrl);
~CSearch();
LONG _cRef;
BSTR _bstrTitle;
BSTR _bstrUrl;
TCHAR _szId[40];
friend HRESULT CSearch_Create(GUID *pguid, BSTR bstrTitle, BSTR bstrUrl, ISearch **ppSearch);
};
class CSearchCollection : public ISearches,
protected CImpIDispatch
{
public:
//IUnknown methods
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppv);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
//IDispatch members
virtual STDMETHODIMP GetTypeInfoCount(UINT * pctinfo)
{ return CImpIDispatch::GetTypeInfoCount(pctinfo); }
virtual STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo **pptinfo)
{ return CImpIDispatch::GetTypeInfo(itinfo, lcid, pptinfo); }
virtual STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID * rgdispid)
{ return CImpIDispatch::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid); }
virtual STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr)
{ return CImpIDispatch::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); }
STDMETHODIMP get_Count(long *plCount);
STDMETHODIMP get_Default(BSTR *pbstr);
STDMETHODIMP Item(VARIANT index, ISearch **ppid);
STDMETHODIMP _NewEnum(IUnknown **ppunk);
private:
CSearchCollection(IFolderSearches *pfs);
~CSearchCollection();
LONG _cRef;
TCHAR _szDefault[40];
HDSA _hdsaItems;
friend HRESULT CSearchCollection_Create(IFolderSearches *pfs, ISearches **ppSearches);
};
//////////////////////////////////////////////////////////////////////////////
// CProxy_SearchAssistantEvents
template <class T>
class CProxy_SearchAssistantEvents : public IConnectionPointImpl<T, &
DIID__SearchAssistantEvents, CComDynamicUnkArray>
{
public:
//methods:
//_SearchAssistantEvents : IDispatch
public:
void Fire_OnNextMenuSelect(int idItem)
{
VARIANTARG* pvars = new VARIANTARG[1];
if (NULL != pvars)
{
for (int i = 0; i < 1; i++)
VariantInit(&pvars[i]);
T* pT = (T*)this;
pT->Lock();
IUnknown** pp = m_vec.begin();
while (pp < m_vec.end())
{
if (*pp != NULL)
{
pvars[0].vt = VT_I4;
pvars[0].lVal= idItem;
DISPPARAMS disp = { pvars, NULL, 1, 0 };
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(*pp);
pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL);
}
pp++;
}
pT->Unlock();
delete[] pvars;
}
}
void Fire_OnNewSearch()
{
T* pT = (T*)this;
pT->Lock();
IUnknown** pp = m_vec.begin();
while (pp < m_vec.end())
{
if (*pp != NULL)
{
DISPPARAMS disp = { NULL, NULL, 0, 0 };
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(*pp);
pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL);
}
pp++;
}
pT->Unlock();
}
};
/////////////////////////////////////////////////////////////////////////////
// CSearchAssistantOC
class ATL_NO_VTABLE CSearchAssistantOC :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSearchAssistantOC, &CLSID_SearchAssistantOC>,
public CComControl<CSearchAssistantOC>,
#ifndef UNIX
public IDispatchImpl<ISearchAssistantOC3, &IID_ISearchAssistantOC3, &LIBID_SHDocVw>,
public IProvideClassInfo2Impl<&CLSID_SearchAssistantOC, &DIID__SearchAssistantEvents, &LIBID_SHDocVw>,
#else
public IDispatchImpl<ISearchAssistantOC3, &IID_ISearchAssistantOC3, &LIBID_SHDocVw, 1, 0, CComTypeInfoHolder>,
public IProvideClassInfo2Impl<&CLSID_SearchAssistantOC, &DIID__SearchAssistantEvents, &LIBID_SHDocVw, 1, 0, CComTypeInfoHolder>,
#endif
public IPersistStreamInitImpl<CSearchAssistantOC>,
public IPersistStorageImpl<CSearchAssistantOC>,
public IQuickActivateImpl<CSearchAssistantOC>,
public IOleControlImpl<CSearchAssistantOC>,
public IOleObjectImpl<CSearchAssistantOC>,
public IOleInPlaceActiveObjectImpl<CSearchAssistantOC>,
public IViewObjectExImpl<CSearchAssistantOC>,
public IOleInPlaceObjectWindowlessImpl<CSearchAssistantOC>,
public IDataObjectImpl<CSearchAssistantOC>,
public CProxy_SearchAssistantEvents<CSearchAssistantOC>,
public IConnectionPointContainerImpl<CSearchAssistantOC>,
public ISpecifyPropertyPagesImpl<CSearchAssistantOC>,
#ifndef UNIX
public IObjectSafetyImpl<CSearchAssistantOC, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
#else
public IObjectSafety,
#endif
public IOleCommandTarget,
public IObjectWithSite // HACKHACK: need non-IOleClientSite host for FindXXX methods.
{
public:
CSearchAssistantOC();
~CSearchAssistantOC();
BEGIN_COM_MAP(CSearchAssistantOC)
COM_INTERFACE_ENTRY(ISearchAssistantOC3)
COM_INTERFACE_ENTRY_IID(IID_ISearchAssistantOC, ISearchAssistantOC3)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IOleCommandTarget)
COM_INTERFACE_ENTRY_IMPL(IViewObjectEx)
COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject2, IViewObjectEx)
COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject, IViewObjectEx)
COM_INTERFACE_ENTRY_IMPL(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleInPlaceObject, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY_IMPL(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY_IMPL(IOleControl)
COM_INTERFACE_ENTRY_IMPL(IOleObject)
COM_INTERFACE_ENTRY_IMPL(IQuickActivate)
COM_INTERFACE_ENTRY_IMPL(IPersistStorage)
COM_INTERFACE_ENTRY_IMPL(IPersistStreamInit)
COM_INTERFACE_ENTRY_IMPL(ISpecifyPropertyPages)
COM_INTERFACE_ENTRY_IMPL(IDataObject)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IObjectSafety)
COM_INTERFACE_ENTRY(IObjectWithSite)
END_COM_MAP()
BEGIN_PROPERTY_MAP(CSearchAssistantOC)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
#ifndef UNDER_CE
PROP_PAGE(CLSID_StockColorPage)
#endif
END_PROPERTY_MAP()
BEGIN_CONNECTION_POINT_MAP(CSearchAssistantOC)
CONNECTION_POINT_ENTRY(DIID__SearchAssistantEvents)
END_CONNECTION_POINT_MAP()
BEGIN_MSG_MAP(CSearchAssistantOC)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
END_MSG_MAP()
// IViewObjectEx
STDMETHOD(GetViewStatus)(DWORD* pdwStatus)
{
ATLTRACE(_T("IViewObjectExImpl::GetViewStatus\n"));
*pdwStatus = 0;
return S_OK;
}
public:
// *** ISearchAssistantOC methods ***
STDMETHOD(AddNextMenuItem)(BSTR bstrText, long idItem);
STDMETHOD(SetDefaultSearchUrl)(BSTR bstrUrl);
STDMETHOD(NavigateToDefaultSearch)();
STDMETHOD(IsRestricted)(BSTR bstrGuid, VARIANT_BOOL *pVal);
STDMETHOD(get_ShellFeaturesEnabled)(VARIANT_BOOL *pVal);
STDMETHOD(get_SearchAssistantDefault)(VARIANT_BOOL *pVal);
STDMETHOD(get_Searches)(ISearches **ppid);
STDMETHOD(get_InWebFolder)(VARIANT_BOOL *pVal);
STDMETHOD(PutProperty)(VARIANT_BOOL bPerLocale, BSTR bstrName, BSTR bstrValue);
STDMETHOD(GetProperty)(VARIANT_BOOL bPerLocale, BSTR bstrName, BSTR *pbstrValue);
STDMETHOD(put_EventHandled)(VARIANT_BOOL bHandled);
STDMETHOD(ResetNextMenu)();
STDMETHOD(FindOnWeb)() ;
STDMETHOD(FindFilesOrFolders)() ;
STDMETHOD(FindComputer)() ;
STDMETHOD(FindPrinter)() ;
STDMETHOD(FindPeople)() ;
STDMETHOD(GetSearchAssistantURL)(VARIANT_BOOL bSubstitute, VARIANT_BOOL bCustomize, BSTR *pbstrValue);
STDMETHOD(NotifySearchSettingsChanged)();
STDMETHOD(put_ASProvider)(BSTR Provider);
STDMETHOD(get_ASProvider)(BSTR *pProvider);
STDMETHOD(put_ASSetting)(int Setting);
STDMETHOD(get_ASSetting)(int *pSetting);
STDMETHOD(NETDetectNextNavigate)();
STDMETHOD(PutFindText)(BSTR FindText);
STDMETHOD(get_Version)(int *pVersion);
STDMETHOD(EncodeString)(BSTR bstrValue, BSTR bstrCharSet, VARIANT_BOOL bUseUTF8, BSTR *pbstrResult);
// *** ISearchAssistantOC2 methods ***
STDMETHOD(get_ShowFindPrinter)(VARIANT_BOOL *pbShowFindPrinter);
// *** ISearchAssistantOC3 methods ***
STDMETHOD(get_SearchCompanionAvailable)(VARIANT_BOOL *pbAvailable);
STDMETHOD(put_UseSearchCompanion)(VARIANT_BOOL bUseSC);
STDMETHOD(get_UseSearchCompanion)(VARIANT_BOOL *pbUseSC);
// *** IObjectWithSite ***
STDMETHOD(SetSite)(IUnknown*) ;
STDMETHOD(GetSite)(REFIID, void**) ;
#ifdef UNIX
// *** IObjectSafety ***
STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
{
ATLTRACE(_T("IObjectSafetyImpl::GetInterfaceSafetyOptions\n"));
if (pdwSupportedOptions == NULL || pdwEnabledOptions == NULL)
return E_POINTER;
HRESULT hr = S_OK;
if (riid == IID_IDispatch)
{
*pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
*pdwEnabledOptions = m_dwSafety & INTERFACESAFE_FOR_UNTRUSTED_CALLER;
}
else
{
*pdwSupportedOptions = 0;
*pdwEnabledOptions = 0;
hr = E_NOINTERFACE;
}
return hr;
}
STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions)
{
ATLTRACE(_T("IObjectSafetyImpl::SetInterfaceSafetyOptions\n"));
/* // If we're being asked to set our safe for scripting option then oblige */
if (riid == IID_IDispatch)
{
/* // Store our current safety level to return in GetInterfaceSafetyOptions */
m_dwSafety = dwEnabledOptions & dwOptionSetMask;
return S_OK;
}
return E_NOINTERFACE;
}
#endif
// *** IOleObject overrides ***
STDMETHOD(SetClientSite)(IOleClientSite *pClientSite);
STDMETHOD(QueryStatus)(const GUID *pguidCmdGroup,
ULONG cCmds,
OLECMD prgCmds[],
OLECMDTEXT *pCmdText);
STDMETHOD(Exec)(const GUID *pguidCmdGroup,
DWORD nCmdID,
DWORD nCmdexecopt,
VARIANT *pvaIn,
VARIANT *pvaOut);
HRESULT OnDraw(ATL_DRAWINFO& di);
BOOL IsTrustedSite();
HRESULT ShowSearchBand( REFGUID guidSearch ) ;
static HRESULT UpdateRegistry(BOOL bRegister);
private:
ISearchBandTBHelper *m_pSearchBandTBHelper;
BOOL m_bSafetyInited : 1;
BOOL m_bIsTrustedSite : 1;
IUnknown* m_punkSite ; // to accomodate clients who aren't hosting us as an OC.
VARIANT_BOOL m_bEventHandled;
STDMETHOD(LocalZoneCheck)(); // for wininet netdetect security
#ifdef UNIX
DWORD m_dwSafety;
#endif
};
#define CP_BOGUS ((UINT)-1)
#define CP_UTF_8 65001
#endif // __SRCHASST_H_