// TuningSpace.h : Declaration of the CTuningSpace // Copyright (c) Microsoft Corporation 1999. #ifndef TUNINGSPACEIMPL_H #define TUNINGSPACEIMPL_H #include #include "componenttypes.h" namespace BDATuningModel { const int MAX_DEFAULT_PREFERRED_COMPONENT_TYPES = 64; template class ATL_NO_VTABLE ITuningSpaceImpl : public IPersistPropertyBagImpl, public IDispatchImpl { public: ITuningSpaceImpl() {} virtual ~ITuningSpaceImpl() {} typedef ITuningSpaceImpl thistype; typedef CComQIPtr PQLocator; BEGIN_PROP_MAP(thistype) PROP_DATA_ENTRY("Name", m_UniqueName.m_str, VT_BSTR) PROP_DATA_ENTRY("Description", m_FriendlyName.m_str, VT_BSTR) PROP_DATA_ENTRY("Network Type", m_NetworkType.m_str, VT_BSTR) PROP_DATA_QI_ENTRY("Default Component Types", m_DefaultPreferredComponents.p, __uuidof(IComponentTypes)) PROP_DATA_ENTRY("Frequency Mapping", m_FrequencyMapping.m_str, VT_BSTR_BLOB) PROP_DATA_QI_ENTRY("Default Locator", m_DefaultLocator.p, __uuidof(ILocator)) END_PROPERTY_MAP() // note: don't put a com map in an impl. it will override the derived classes // and script clients will get only get type info for the base class methods . // only provide a com map in the most derived class representing the actual coclass CComBSTR m_UniqueName; CComBSTR m_FriendlyName; CComBSTR m_FrequencyMapping; CComBSTR m_NetworkType; PQComponentTypes m_DefaultPreferredComponents; PQLocator m_DefaultLocator; // ITuningSpace STDMETHOD(get_UniqueName)(/* [out, retval] */ BSTR *pName){ if (!pName) { return E_POINTER; } ATL_LOCKT(); return m_UniqueName.CopyTo(pName); } STDMETHOD(put_UniqueName)(/* [in] */ BSTR Name){ CHECKBSTRLIMIT(Name); ATL_LOCKT(); m_UniqueName = Name; MARK_DIRTY(T); return NOERROR; } STDMETHOD(get_FriendlyName)(/* [out, retval] */ BSTR *pName){ if (!pName) { return E_POINTER; } ATL_LOCKT(); return m_FriendlyName.CopyTo(pName); } STDMETHOD(put_FriendlyName)(/* [in] */ BSTR Name){ CHECKBSTRLIMIT(Name); ATL_LOCKT(); m_FriendlyName = Name; MARK_DIRTY(T); return NOERROR; } STDMETHOD(get_CLSID)(/* [out, retval] */ BSTR *pbstrCLSID){ if (!pbstrCLSID) { return E_POINTER; } try { GUID2 g; HRESULT hr = GetClassID(&g); if (FAILED(hr)) { return hr; } ATL_LOCKT(); *pbstrCLSID = g.GetBSTR(); return NOERROR; } CATCHCOM(); } STDMETHOD(get_NetworkType)(/* [out, retval] */ BSTR *pNetworkTypeGuid){ if (!pNetworkTypeGuid) { return E_POINTER; } try { GUID2 g; HRESULT hr = get__NetworkType(&g); if (FAILED(hr)) { return hr; } *pNetworkTypeGuid = g.GetBSTR(); return NOERROR; } CATCHCOM(); } // should be network provider clsid STDMETHOD(put_NetworkType)(/* [in] */ BSTR NetworkTypeGuid){ try { GUID2 g(NetworkTypeGuid); return put__NetworkType(g); } CATCHCOM(); } STDMETHOD(get__NetworkType)(/* [out, retval] */ GUID* pNetworkTypeGuid){ if (!pNetworkTypeGuid) { return E_POINTER; } try { ATL_LOCKT(); GUID2 g(m_NetworkType); memcpy(pNetworkTypeGuid, &g, sizeof(GUID)); return NOERROR; } CATCHCOM(); } STDMETHOD(put__NetworkType)(/* [out, retval] */ REFCLSID pNetworkTypeGuid){ try { GUID2 g(pNetworkTypeGuid); ATL_LOCKT(); // NOTE: the network type guid is the clsid for the network provider filter // for this type of this tuning space. since we're only allowing // ourselves to run from trusted zones we can assume that this clsid is also // trustworthy. however, if we do more security review and decide to enable // use of the tuning model from the internet zone then this is no longer safe. // in this case, we need to get IInternetHostSecurityManager from IE and // call ProcessURLAction(URLACTION_ACTIVEX_RUN) and make sure we get back // URLPOLICY_ALLOW. otherwise, we're bypassing IE's list of known bad // objects. // see ericli's complete guide to script security part I on http://pgm/wsh // for more details. m_NetworkType = g.GetBSTR(); MARK_DIRTY(T); return NOERROR; } CATCHCOM(); } STDMETHOD(EnumCategoryGUIDs)(/* [out, retval] */ IEnumGUID **ppEnum){ return E_NOTIMPL; } STDMETHOD(EnumDeviceMonikers)(/* [out, retval] */ IEnumMoniker **ppEnum){ return E_NOTIMPL; } STDMETHOD(get_DefaultPreferredComponentTypes)(/* [out, retval] */ IComponentTypes** ppComponentTypes){ if (!ppComponentTypes) { return E_POINTER; } ATL_LOCKT(); m_DefaultPreferredComponents.CopyTo(ppComponentTypes); return NOERROR; } STDMETHOD(put_DefaultPreferredComponentTypes)(/* [in] */ IComponentTypes* pNewComponentTypes){ try { HRESULT hr = NOERROR; PQComponentTypes pct; if (pNewComponentTypes) { long lCount = 0; hr = pNewComponentTypes->get_Count(&lCount); if (FAILED(hr) || lCount > MAX_DEFAULT_PREFERRED_COMPONENT_TYPES) { return E_INVALIDARG; } hr = pNewComponentTypes->Clone(&pct); } if (SUCCEEDED(hr)) { ATL_LOCKT(); m_DefaultPreferredComponents = pct; MARK_DIRTY(T); } return hr; } CATCHCOM(); } STDMETHOD(CreateTuneRequest)(/* [out, retval] */ ITuneRequest **ppTuneRequest){ if (!ppTuneRequest) { return E_POINTER; } TuneRequestType *pt = NULL; try { pt = new CComObject; if (!pt) { return E_OUTOFMEMORY; } ATL_LOCKT(); HRESULT hr = Clone(&pt->m_TS); if (FAILED(hr)) { delete pt; return hr; } pt->AddRef(); *ppTuneRequest = pt; return NOERROR; } CATCHCOM_CLEANUP(delete pt); } STDMETHOD(get_FrequencyMapping)(/* [out, retval] */ BSTR *pMap){ if(!pMap){ return E_POINTER; } ATL_LOCKT(); return m_FrequencyMapping.CopyTo(pMap); } STDMETHOD(put_FrequencyMapping)(/* [in] */ BSTR Map){ CHECKBSTRLIMIT(Map); ATL_LOCKT(); m_FrequencyMapping = ⤅ MARK_DIRTY(T); return NOERROR; } STDMETHOD(get_DefaultLocator)(/* [out, retval] */ ILocator** ppLocator){ if (!ppLocator) { return E_POINTER; } ATL_LOCKT(); m_DefaultLocator.CopyTo(ppLocator); return NOERROR; } STDMETHOD(put_DefaultLocator)(/* [in] */ ILocator* NewLocator){ try { ATL_LOCKT(); PQLocator pl; HRESULT hr = NOERROR; if (NewLocator) { hr = NewLocator->Clone(&pl); } if (SUCCEEDED(hr)) { m_DefaultLocator = pl; MARK_DIRTY(T); } return hr; } CATCHCOM(); } STDMETHOD(Clone) (ITuningSpace **ppTR) { T* pt = NULL; try { if (!ppTR) { return E_POINTER; } ATL_LOCKT(); pt = static_cast(new CComObject); if (!pt) { return E_OUTOFMEMORY; } pt->m_UniqueName = m_UniqueName; pt->m_FriendlyName = m_FriendlyName; pt->m_NetworkType = m_NetworkType; if (m_DefaultPreferredComponents) { ASSERT(!pt->m_DefaultPreferredComponents); HRESULT hr = m_DefaultPreferredComponents->Clone(&pt->m_DefaultPreferredComponents); if (FAILED(hr)) { delete pt; return hr; } } pt->m_FrequencyMapping = m_FrequencyMapping; if (m_DefaultLocator) { ASSERT(!pt->m_DefaultLocator); HRESULT hr = m_DefaultLocator->Clone(&pt->m_DefaultLocator); if (FAILED(hr)) { delete pt; return hr; } } pt->m_bRequiresSave = true; pt->AddRef(); *ppTR = pt; return NOERROR; } CATCHCOM_CLEANUP(delete pt); } }; }; //namespace #endif // TUNINGSPACEIMPL_H // end of file -- tuningspaceimpl.h