// Copyright (c) 2000 Microsoft Corporation. All rights reserved. // // Declaration of CContainerDispatch. // #pragma once #include "smartref.h" #include "unkhelp.h" #include "dmusicp.h" class CContainerItemDispatch : public IDispatch, public ComSingleInterface { public: CContainerItemDispatch(IDirectMusicLoader *pLoader, const WCHAR *wszAlias, const DMUS_OBJECTDESC &desc, bool fPreload, bool fAutodownload, HRESULT *phr); ~CContainerItemDispatch(); const WCHAR *Alias() { return m_wstrAlias; } IDispatch *Item() { if (m_pDispLoadedItem) return m_pDispLoadedItem; return this; } // returns the contained item when loaded, otherwise itself so Load can be called // IUnknown ComSingleInterfaceUnknownMethods(IDispatch) // IDispatch STDMETHOD(GetTypeInfoCount)(UINT *pctinfo) { return E_NOTIMPL; } STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo) { return E_NOTIMPL; } STDMETHOD(GetIDsOfNames)( REFIID riid, LPOLESTR __RPC_FAR *rgszNames, UINT cNames, LCID lcid, DISPID __RPC_FAR *rgDispId); STDMETHOD(Invoke)( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr); // If it is a segment or song, download it if needed. // If it is a script, init it. // If it is a song, compose it. enum InitWithPerfomanceFailureType { IWP_Success, IWP_DownloadFailed, IWP_ScriptInitFailed }; HRESULT InitWithPerformance(IDirectMusicPerformance *pPerf, InitWithPerfomanceFailureType *peFailureType); private: void ReleaseLoader(); HRESULT Load(bool fDynamicLoad); HRESULT DownloadOrUnload(bool fDownload, IDirectMusicPerformance *pPerf); SmartRef::WString m_wstrAlias; IDirectMusicLoader *m_pLoader; // note: use AddRefP/ReleaseP IDirectMusicLoader8P *m_pLoader8P; // note: use AddRefP/ReleaseP DMUS_OBJECTDESC m_desc; bool m_fLoaded; IDispatch *m_pDispLoadedItem; bool m_fAutodownload; IDirectMusicPerformance *m_pPerfForUnload; }; class CContainerDispatch { public: CContainerDispatch(IDirectMusicContainer *pContainer, IDirectMusicLoader *pLoader, DWORD dwScriptFlags, HRESULT *phr); ~CContainerDispatch(); HRESULT OnScriptInit(IDirectMusicPerformance *pPerf); // gives the container a chance to do auto downloading/composing during script initialization HRESULT GetIDsOfNames( REFIID riid, LPOLESTR __RPC_FAR *rgszNames, UINT cNames, LCID lcid, DISPID __RPC_FAR *rgDispId); HRESULT Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr); // For use by the script object HRESULT EnumItem(DWORD dwIndex, WCHAR *pwszName); HRESULT GetVariableObject(WCHAR *pwszVariableName, IUnknown **ppunkValue); private: SmartRef::Vector m_vecItems; bool m_fDownloadOnInit; };