📄 automationproxy.cpp
字号:
}
}
CoTaskMemFree(rgszVariableNames);
rgszVariableNames = NULL;
}
if (rgvarVariableValues)
{
for (DWORD i = 0; i < cVariables; i++)
{
VariantClear(&rgvarVariableValues[i]);
}
CoTaskMemFree(rgvarVariableValues);
rgvarVariableValues = NULL;
}
if (rgszVariableDataTypes)
{
for (DWORD i = 0; i < cVariables; i++)
{
if (rgszVariableDataTypes[i])
{
CoTaskMemFree(rgszVariableDataTypes[i]);
rgszVariableDataTypes[i] = NULL;
}
}
CoTaskMemFree(rgszVariableDataTypes);
rgszVariableDataTypes = NULL;
}
}
// Clean up custom array of dispIds if we have one.
if(rgDispIdsToLookUpMem)
{
delete [] rgDispIdsToLookUpMem;
rgDispIdsToLookUpMem = rgDispIdsToLookUp = NULL;
cDispIdsToLookUp = 0;
}
TraceError("CUPnPAutomationProxy::"
"QueryStateVariablesByDispIds(): "
"Exiting",
hr);
return hr;
}
STDMETHODIMP
CUPnPAutomationProxy::ExecuteRequest(
/*[in]*/ UPNP_CONTROL_REQUEST * pucreq,
/*[out]*/ UPNP_CONTROL_RESPONSE * pucresp)
{
HRESULT hr = S_OK;
Assert(m_fInitialized);
if (lstrcmpW(pucreq->bstrActionName, L"QueryStateVariable") == 0)
{
hr = HrQueryStateVariable(pucreq, pucresp);
}
else
{
hr = HrInvokeAction(pucreq, pucresp);
}
TraceError("CUPnPAutomationProxy::ExecuteRequest(): "
"Exiting",
hr);
return hr;
}
STDMETHODIMP
CUPnPAutomationProxy::GetVariableType(
/*[in]*/ LPWSTR pszVarName,
/*[out]*/ BSTR * pbstrType)
{
HRESULT hr = S_OK;
BSTR bstrType = NULL;
UPNP_STATE_VARIABLE * pusv = NULL;
Assert(m_fInitialized);
pusv = LookupVariableByName(pszVarName);
if (pusv)
{
Assert(!pusv->strDataType.empty());
bstrType = SysAllocString(pusv->strDataType);
}
else
{
hr = E_INVALIDARG;
}
if (SUCCEEDED(hr))
{
*pbstrType = bstrType;
}
else
{
if (bstrType)
{
SysFreeString(bstrType);
bstrType = NULL;
}
}
TraceError("CUPnPAutomationProxy::GetVariableType(): "
"Exiting",
hr);
return hr;
}
STDMETHODIMP
CUPnPAutomationProxy::GetOutputArgumentNamesAndTypes(
/*[in]*/ LPWSTR pszActionName,
/*[out]*/ DWORD * pcOutArguments,
/*[out]*/ BSTR ** prgbstrNames,
/*[out]*/ BSTR ** prgbstrTypes)
{
HRESULT hr = S_OK;
DWORD cOutArguments = 0;
BSTR * rgbstrNames = NULL;
BSTR * rgbstrTypes = NULL;
UPNP_ACTION * pua = NULL;
Assert(m_fInitialized);
pua = LookupActionByName(pszActionName);
if (pua)
{
// Allocate arrays for the names and data types.
cOutArguments = pua->cOutArgs;
if(cOutArguments < ULONG_MAX / sizeof(BSTR))
{
rgbstrNames = (BSTR *) CoTaskMemAlloc(cOutArguments * sizeof(BSTR));
rgbstrTypes = (BSTR *) CoTaskMemAlloc(cOutArguments * sizeof(BSTR));
}
if (rgbstrNames && rgbstrTypes)
{
for (DWORD i = 0; SUCCEEDED(hr) && (i < cOutArguments); i++)
{
const UPNP_STATE_VARIABLE * pusvRelated = NULL;
rgbstrNames[i] = SysAllocString(pua->rgOutArgs[i].strName);
pusvRelated = pua->rgOutArgs[i].pusvRelated;
Assert(pusvRelated);
rgbstrTypes[i] = SysAllocString(pusvRelated->strDataType);
if (rgbstrNames[i] && rgbstrTypes[i])
{
TraceTag(ttidAutomationProxy,
"CUPnPAutomationProxy::"
"GetOutputArgumentNamesAndTypes(): "
"Successfully copied output argument %S "
"of type %S",
rgbstrNames[i],
rgbstrTypes[i]);
}
else
{
hr = E_OUTOFMEMORY;
TraceError("CUPnPAutomationProxy::"
"GetOutputArgumentNamesAndTypes(): "
"Failed to allocate argument name and/or type",
hr);
}
}
}
else
{
hr = E_OUTOFMEMORY;
TraceError("CUPnPAutomationProxy::"
"GetOutputArgumentNamesAndTypes(): "
"Failed to allocate output arrays",
hr);
}
}
else
{
hr = E_INVALIDARG;
TraceError("CUPnPAutomationProxy::"
"GetOutputArgumentNamesAndTypes(): "
"No such action",
hr);
}
// If successful, copy to the output, otherwise, clean up.
if (SUCCEEDED(hr))
{
*pcOutArguments = cOutArguments;
*prgbstrNames = rgbstrNames;
*prgbstrTypes = rgbstrTypes;
}
else
{
if (rgbstrNames)
{
for (DWORD i = 0; i < cOutArguments; i++)
{
if (rgbstrNames[i])
{
SysFreeString(rgbstrNames[i]);
rgbstrNames[i] = NULL;
}
}
CoTaskMemFree(rgbstrNames);
rgbstrNames = NULL;
}
if (rgbstrTypes)
{
for (DWORD i = 0; i < cOutArguments; i++)
{
if (rgbstrTypes[i])
{
SysFreeString(rgbstrTypes[i]);
rgbstrTypes[i] = NULL;
}
}
CoTaskMemFree(rgbstrTypes);
rgbstrTypes = NULL;
}
cOutArguments = 0;
}
TraceError("CUPnPAutomationProxy::GetOutputArgumentNamesAndTypes(): "
"Exiting",
hr);
return hr;
}
VOID
CUPnPAutomationProxy::FreeControlResponse(
UPNP_CONTROL_RESPONSE * pucresp)
{
if (pucresp->bstrActionName)
{
SysFreeString(pucresp->bstrActionName);
pucresp->bstrActionName = NULL;
}
UPNP_CONTROL_RESPONSE_DATA * pucrd = &pucresp->ucrData;
if (pucresp->fSucceeded)
{
if (pucrd->Success.rgvarOutputArgs)
{
for (DWORD i = 0; i < pucrd->Success.cOutputArgs; i++)
{
VariantClear(&pucrd->Success.rgvarOutputArgs[i]);
}
CoTaskMemFree(pucrd->Success.rgvarOutputArgs);
pucrd->Success.rgvarOutputArgs = NULL;
pucrd->Success.cOutputArgs = 0;
}
}
else
{
if (pucrd->Fault.bstrFaultCode)
{
SysFreeString(pucrd->Fault.bstrFaultCode);
pucrd->Fault.bstrFaultCode = NULL;
}
if (pucrd->Fault.bstrFaultString)
{
SysFreeString(pucrd->Fault.bstrFaultString);
pucrd->Fault.bstrFaultString = NULL;
}
if (pucrd->Fault.bstrUPnPErrorCode)
{
SysFreeString(pucrd->Fault.bstrUPnPErrorCode);
pucrd->Fault.bstrUPnPErrorCode = NULL;
}
if (pucrd->Fault.bstrUPnPErrorString)
{
SysFreeString(pucrd->Fault.bstrUPnPErrorString);
pucrd->Fault.bstrUPnPErrorString = NULL;
}
}
}
UPNP_STATE_VARIABLE *
CUPnPAutomationProxy::LookupVariableByDispID(DISPID dispid)
{
UPNP_STATE_VARIABLE * pusv = NULL;
for (DWORD i = 0; i < m_cVariables; i++)
{
if (m_rgVariables[i].dispid == dispid)
{
pusv = &m_rgVariables[i];
break;
}
}
if (pusv)
{
TraceTag(ttidAutomationProxy,
"CUPnPAutomationProxy::LookupVariableByDispID(): "
"DISPID %d corresponds to variable %S",
pusv->dispid,
pusv->strName);
}
else
{
TraceTag(ttidError,
"CUPnPAutomationProxy::LookupVariableByDispID(): "
"DISPID %d does not match any variable in service description.",
dispid);
}
return pusv;
}
UPNP_STATE_VARIABLE *
CUPnPAutomationProxy::LookupVariableByName(LPCWSTR pwszName)
{
UPNP_STATE_VARIABLE * pusv = NULL;
for (DWORD i = 0; i < m_cVariables; i++)
{
if (lstrcmpW(m_rgVariables[i].strName, pwszName) == 0)
{
pusv = &m_rgVariables[i];
break;
}
}
if (pusv)
{
TraceTag(ttidAutomationProxy,
"CUPnPAutomationProxy::LookupVariableByName(): "
"Found %S in variable table",
pusv->strName);
}
else
{
TraceTag(ttidAutomationProxy,
"CUPnPAutomationProxy::LookupVariableByName(): "
"%S does not match any variable in variable table",
pwszName);
}
return pusv;
}
UPNP_ACTION *
CUPnPAutomationProxy::LookupActionByName(LPCWSTR pwszName)
{
UPNP_ACTION * pua = NULL;
for (DWORD i = 0; i < m_cActions; i++)
{
if (lstrcmpW(m_rgActions[i].strName, pwszName) == 0)
{
pua = &m_rgActions[i];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -