98 lines
2.9 KiB
C++
98 lines
2.9 KiB
C++
// 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<CContainerItemDispatch *> m_vecItems;
|
|
bool m_fDownloadOnInit;
|
|
};
|