windows-nt/Source/XPSP1/NT/multimedia/directx/dmusic/dmscript/autconstants.cpp
2020-09-26 16:20:57 +08:00

168 lines
4.8 KiB
C++

// Copyright (c) 1999 Microsoft Corporation. All rights reserved.
//
// Functions that implement the automation interfaces for the DirectMusic constants.
//
#include "stdinc.h"
#include "autconstants.h"
#include "oleaut.h"
struct AutConstantDef
{
DISPID dispid;
const WCHAR *pwszName;
LONG lVal;
};
// Performance
const DISPID DMCONSTDISP_IsSecondary = 1;
const DISPID DMCONSTDISP_IsControl = 2;
const DISPID DMCONSTDISP_AtFinish = 3;
const DISPID DMCONSTDISP_AtGrid = 4;
const DISPID DMCONSTDISP_AtBeat = 5;
const DISPID DMCONSTDISP_AtMeasure = 6;
const DISPID DMCONSTDISP_AtMarker = 7;
const DISPID DMCONSTDISP_AtImmediate = 8;
const DISPID DMCONSTDISP_AlignToBar = 9;
const DISPID DMCONSTDISP_AlignToBeat = 10;
const DISPID DMCONSTDISP_AlignToSegment = 11;
const DISPID DMCONSTDISP_PlayFill = 12;
const DISPID DMCONSTDISP_PlayIntro = 13;
const DISPID DMCONSTDISP_PlayBreak = 14;
const DISPID DMCONSTDISP_PlayEnd = 15;
const DISPID DMCONSTDISP_PlayEndAndIntro = 16;
const DISPID DMCONSTDISP_PlayModulate = 17;
const DISPID DMCONSTDISP_UseClockTime = 18;
const DISPID DMCONSTDISP_NoCutoff = 19;
const AutConstantDef gs_Constants[] =
{
{ DMCONSTDISP_IsSecondary, L"IsSecondary", ScriptConstants::IsSecondary },
{ DMCONSTDISP_IsControl, L"IsControl", ScriptConstants::IsControl },
{ DMCONSTDISP_AtFinish, L"AtFinish", ScriptConstants::AtFinish },
{ DMCONSTDISP_AtGrid, L"AtGrid", ScriptConstants::AtGrid },
{ DMCONSTDISP_AtBeat, L"AtBeat", ScriptConstants::AtBeat },
{ DMCONSTDISP_AtMeasure, L"AtMeasure", ScriptConstants::AtMeasure },
{ DMCONSTDISP_AtMarker, L"AtMarker", ScriptConstants::AtMarker },
{ DMCONSTDISP_AtImmediate, L"AtImmediate", ScriptConstants::AtImmediate },
{ DMCONSTDISP_AlignToBar, L"AlignToBar", ScriptConstants::AlignToBar },
{ DMCONSTDISP_AlignToBeat, L"AlignToBeat", ScriptConstants::AlignToBeat },
{ DMCONSTDISP_AlignToSegment, L"AlignToSegment", ScriptConstants::AlignToSegment },
{ DMCONSTDISP_PlayFill, L"PlayFill", ScriptConstants::PlayFill },
{ DMCONSTDISP_PlayIntro, L"PlayIntro", ScriptConstants::PlayIntro },
{ DMCONSTDISP_PlayBreak, L"PlayBreak", ScriptConstants::PlayBreak },
{ DMCONSTDISP_PlayEnd, L"PlayEnd", ScriptConstants::PlayEnd },
{ DMCONSTDISP_PlayEndAndIntro, L"PlayEndAndIntro", ScriptConstants::PlayEndAndIntro },
{ DMCONSTDISP_PlayModulate, L"PlayModulate", ScriptConstants::PlayModulate },
{ DMCONSTDISP_NoCutoff, L"NoCutoff", ScriptConstants::NoCutoff },
{ DISPID_UNKNOWN }
};
HRESULT
AutConstantsGetIDsOfNames(
REFIID riid,
LPOLESTR __RPC_FAR *rgszNames,
UINT cNames,
LCID lcid,
DISPID __RPC_FAR *rgDispId)
{
V_INAME(AutConstantsGetIDsOfNames);
V_BUFPTR_READ(rgszNames, sizeof(LPOLESTR) * cNames);
V_BUFPTR_WRITE(rgDispId, sizeof(DISPID) * cNames);
if (riid != IID_NULL)
return DISP_E_UNKNOWNINTERFACE;
if (cNames == 0)
return S_OK;
// Clear out dispid's
for (UINT c = 0; c < cNames; ++c)
{
rgDispId[c] = DISPID_UNKNOWN;
}
// See if we have a method with the first name
for (c = 0; gs_Constants[c].dispid != DISPID_UNKNOWN; ++c)
{
if (0 == _wcsicmp(rgszNames[0], gs_Constants[c].pwszName))
{
rgDispId[0] = gs_Constants[c].dispid;
break;
}
}
// Additional names requested (cNames > 1) are named parameters,
// which isn't something we support.
// Return DISP_E_UNKNOWNNAME in this case, and in the case that we didn't match
// the first name.
if (rgDispId[0] == DISPID_UNKNOWN || cNames > 1)
return DISP_E_UNKNOWNNAME;
return S_OK;
}
HRESULT AutConstantsInvoke(
DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS __RPC_FAR *pDispParams,
VARIANT __RPC_FAR *pVarResult,
EXCEPINFO __RPC_FAR *pExcepInfo,
UINT __RPC_FAR *puArgErr)
{
V_INAME(AutConstantsInvoke);
V_PTR_READ(pDispParams, DISPPARAMS);
V_PTR_WRITE_OPT(pVarResult, VARIANT);
V_PTR_WRITE_OPT(pExcepInfo, EXCEPINFO);
bool fUseOleAut = !!(riid == IID_NULL);
// Additional parameter validation
if (!fUseOleAut && riid != g_guidInvokeWithoutOleaut)
return DISP_E_UNKNOWNINTERFACE;
if (!(wFlags & DISPATCH_PROPERTYGET))
return DISP_E_MEMBERNOTFOUND;
if (pDispParams->cArgs > 0)
return DISP_E_BADPARAMCOUNT;
if (pDispParams->cNamedArgs > 0)
return DISP_E_NONAMEDARGS;
// Zero the out params
if (puArgErr)
*puArgErr = 0;
if (pVarResult)
{
DMS_VariantInit(fUseOleAut, pVarResult);
}
// Find the constant
for (const AutConstantDef *pConst = gs_Constants;
pConst->dispid != DISPID_UNKNOWN && pConst->dispid != dispIdMember;
++pConst)
{
}
if (pConst->dispid == DISPID_UNKNOWN)
return DISP_E_MEMBERNOTFOUND;
// Return the value value
if (pVarResult)
{
pVarResult->vt = VT_I4;
pVarResult->lVal = pConst->lVal;
}
return S_OK;
}