#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 CProxy_SearchAssistantEvents : public IConnectionPointImpl { 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(*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(*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, public CComCoClass, public CComControl, #ifndef UNIX public IDispatchImpl, public IProvideClassInfo2Impl<&CLSID_SearchAssistantOC, &DIID__SearchAssistantEvents, &LIBID_SHDocVw>, #else public IDispatchImpl, public IProvideClassInfo2Impl<&CLSID_SearchAssistantOC, &DIID__SearchAssistantEvents, &LIBID_SHDocVw, 1, 0, CComTypeInfoHolder>, #endif public IPersistStreamInitImpl, public IPersistStorageImpl, public IQuickActivateImpl, public IOleControlImpl, public IOleObjectImpl, public IOleInPlaceActiveObjectImpl, public IViewObjectExImpl, public IOleInPlaceObjectWindowlessImpl, public IDataObjectImpl, public CProxy_SearchAssistantEvents, public IConnectionPointContainerImpl, public ISpecifyPropertyPagesImpl, #ifndef UNIX public IObjectSafetyImpl, #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_