Files
core/ASCMediaFormatSettings3/ASCMediaFormatSerialize.h

125 lines
3.6 KiB
C++

#pragma once
#include "resource.h" // main symbols
#include "MediaFormatXMLConst.h"
#define DONT_USE_GET_DIGIT
#include "XMLUtils.h"
using namespace XmlUtils;
[object, uuid("0F55D9B8-CCFD-47d6-99FD-235217C5C5D5"), dual, pointer_default(unique)]
__interface IAVSMediaFormatSerialize : IDispatch
{
[id(190000 + 1)] HRESULT SaveToXML([in] IUnknown *pUnknown, [in] BSTR XMLNodeName, [out, retval] BSTR *pXML);
[id(190000 + 2)] HRESULT LoadFromXML([in] BSTR XML, [out, retval] IUnknown **ppUnknown);
};
// CAVSAudioFormat
[ coclass, uuid("9B287A8F-0CC2-4e57-A4D7-A30ADD66F431"), threading(apartment), vi_progid("AVSMediaFormatSettings3.AVSAudioFormat"), progid("AVSMediaFormatSettings3.AVSAudioForma.1"), version(1.0)]
class ATL_NO_VTABLE CAVSMediaFormatSerialize
: public IAVSMediaFormatSerialize
{
public:
CAVSMediaFormatSerialize()
{
}
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
STDMETHOD(SaveToXML)(IUnknown *pUnknown, BSTR XMLNodeName, BSTR *pXML)
{
if (NULL==pXML)
return S_OK;
*pXML = NULL;
if (NULL==pUnknown)
return S_OK;
IAVSMediaFormat *pMediaFormat = NULL;
pUnknown->QueryInterface(__uuidof(IAVSMediaFormat), (void**)&pMediaFormat);
if (NULL==pMediaFormat)
return S_OK;
CString sXMLNodeName; sXMLNodeName = XMLNodeName;
XmlUtils::CDispatchXmlWriter oXMLWriter;
oXMLWriter.WriteNodeBegin(sXMLNodeName);
//Íè êàêîãî ëó÷øåãî ñïîñîáà ïîëó÷èòü CLSID íå íàøåë
CString sTemp = g_cpszCLSIDParamName;
BSTR bsParamName = sTemp.AllocSysString();
VARIANT val;
pMediaFormat->GetAdditionalParam(bsParamName, &val);
SysFreeString(bsParamName);
sTemp = val.bstrVal;
SysFreeString(val.bstrVal);
((CXmlWriter *)&oXMLWriter)->WriteNode(g_cpszCLSIDNodeName, sTemp);
sTemp = g_cpszXMLSettingParamName;
bsParamName = sTemp.AllocSysString();
pMediaFormat->GetAdditionalParam(bsParamName, &val);
SysFreeString(bsParamName);
if (NULL!=val.bstrVal)
{
sTemp = val.bstrVal;
oXMLWriter.WriteString(sTemp);
SysFreeString(val.bstrVal);
}
oXMLWriter.WriteNodeEnd(sXMLNodeName);
RELEASEINTERFACE(pMediaFormat);
(*pXML) = oXMLWriter.GetXmlString().AllocSysString();
return S_OK;
}
STDMETHOD(LoadFromXML)(BSTR XML, IUnknown **ppUnknown)
{
if (NULL==ppUnknown)
return S_OK;
XmlUtils::CDispatchXmlReader oXMLReader;
CString sXMLData; sXMLData = XML;
oXMLReader.SetXmlString(sXMLData);
CString sCLSID = oXMLReader.ReadNodeValue(g_cpszCLSIDNodeName);
IAVSMediaFormat *pMediaFormat = NULL;
if (!CreateObject(sCLSID, &pMediaFormat))
return S_FALSE;
oXMLReader.ReadNodeValue(g_cpszSettingNodeName);
CString sNodeXML = oXMLReader.ReadNodeXml();
CString sTemp = g_cpszXMLSettingParamName;
BSTR bsParamName = sTemp.AllocSysString();
VARIANT val;
val.vt = VT_BSTR;
val.bstrVal = sNodeXML.AllocSysString();
pMediaFormat->SetAdditionalParam(bsParamName, val);
SysFreeString(bsParamName);
SysFreeString(val.bstrVal);
pMediaFormat->QueryInterface(__uuidof(IUnknown), (void**)ppUnknown);
RELEASEINTERFACE(pMediaFormat);
return S_OK;
}
protected:
static BOOL CreateObject(const CString &sCLSID, IAVSMediaFormat **pFormat)
{
CStringW swCLSID; swCLSID = sCLSID;
CLSID clsid;
HRESULT hr = CLSIDFromString((WCHAR *)swCLSID.GetBuffer(), &clsid);
if (S_OK!=hr)
return FALSE;
hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, __uuidof(IAVSMediaFormat), (void**)pFormat);
return (NULL!=(*pFormat));
}
};