📄 chxpckts.h
字号:
~_CStoreNameBufferPair();
IHXBuffer* GetValue();
void SetValue(IHXBuffer* pbufValue);
private:
IHXBuffer* m_pbufValue;
};
/****************************************************************************
*
* Class:
*
* CHXHeader
*
* Purpose:
*
* PN implementation of a basic header.
*
*/
class CHXHeader : public IHXValues
{
private:
INT32 m_lRefCount;
struct CValue
{
UINT32 m_lVal;
BOOL m_lValValid;
IHXBuffer* m_pIBuffer;
IHXBuffer* m_pIString;
const char* m_Key;
CValue() : m_lValValid(FALSE), m_pIBuffer(NULL),
m_pIString(NULL), m_Key(NULL)
{
}
CValue(CValue const& rhs)
: m_lVal(rhs.m_lVal),
m_lValValid(rhs.m_lValValid),
m_pIBuffer(rhs.m_pIBuffer),
m_pIString(rhs.m_pIString),
m_Key(rhs.m_Key)
{
if (m_pIBuffer) m_pIBuffer->AddRef();
if (m_pIString) m_pIString->AddRef();
}
CValue& operator= (CValue const&);
~CValue();
HX_RESULT Get(IHXBuffer* CValue::*pMem, IHXBuffer*& value) const
{
if (!(this->*pMem)) return HXR_FAIL;
value = this->*pMem;
value->AddRef ();
return HXR_OK;
}
HX_RESULT Get(UINT32 CValue::*pMem, UINT32& value) const
{
HX_ASSERT(pMem == &CValue::m_lVal);
if (!m_lValValid) return HXR_FAIL;
value = m_lVal;
return HXR_OK;
}
void Set(IHXBuffer* CValue::*pMem, IHXBuffer* value)
{
HX_ASSERT(value);
HX_RELEASE (this->*pMem);
this->*pMem = value;
value->AddRef();
}
void Set(UINT32 CValue::*pMem, UINT32 value)
{
m_lVal = value;
m_lValValid = TRUE;
}
void Swap(CValue& rhs)
{
std::swap(m_lVal, rhs.m_lVal);
std::swap(m_lValValid, rhs.m_lValValid);
std::swap(m_pIBuffer, rhs.m_pIBuffer);
std::swap(m_pIString, rhs.m_pIString);
std::swap(m_Key, rhs.m_Key);
}
};
struct MyCompare : public std::binary_function<const char*, const char*, bool>
{
char m_PreserveCase;
explicit MyCompare(char PreserveCase) : m_PreserveCase(PreserveCase)
{
}
bool operator()(const char* p1, const char* p2) const;
};
typedef Loki::AssocVector<const char*, CValue, MyCompare> Map;
//typedef std::map<std::string, CValue/*, MyCompare*/> Map;
Map m_Map;
template <typename TVal>
HX_RESULT GetProperty(
const char* pPropertyName,
TVal CValue::*pMem,
TVal& value)
{
HX_ASSERT(pPropertyName);
//HX_ASSERT(pMem);
Map::const_iterator i = m_Map.find(pPropertyName);
return (i == m_Map.end()) ? HXR_FAIL : i->second.Get(pMem, value);
}
template <typename TVal>
HX_RESULT SetProperty(
const char* pPropertyName,
TVal CValue::*pMem,
TVal value)
{
HX_ASSERT(pPropertyName);
Map::iterator i = m_Map.find(pPropertyName);
CValue* pVal; // uninitialized
if (i == m_Map.end())
{
char* pTmp = new char[strlen(pPropertyName)+1];
strcpy(pTmp, pPropertyName); /* Flawfinder: ignore */
pVal = &m_Map[pTmp];
pVal->m_Key = pTmp;
}
else
{
pVal = &i->second;
}
pVal->Set(pMem, value);
return HXR_OK;
}
template <typename TVal>
HX_RESULT GetNextProperty(
const char*& pPropertyName,
TVal CValue::*pMem,
TVal& value,
Map::const_iterator& iter)
{
for (; iter != m_Map.end(); ++iter)
{
if (SUCCEEDED(iter->second.Get(pMem, value)))
{
pPropertyName = iter->second.m_Key;
return HXR_OK;
}
}
return HXR_FAIL;
}
Map::const_iterator
m_ULONG32Position,
m_BufferPosition,
m_CStringPosition;
~CHXHeader();
PRIVATE_DESTRUCTORS_ARE_NOT_A_CRIME
protected:
#if 0
// function to encode CString property escape sequences
IHXBuffer* encodeCString(IHXBuffer* pBuffer);
// function to encode buffer property int MIME Base64
IHXBuffer* encodeBuffer(IHXBuffer* pBuffer);
#endif
public:
CHXHeader()
: m_lRefCount(0)
, m_Map(MyCompare(FALSE)) // case-insensitive by default
{
m_ULONG32Position = m_BufferPosition = m_CStringPosition = m_Map.end();
}
/*
* IUnknown methods
*/
STDMETHOD(QueryInterface) (THIS_
REFIID riid,
void** ppvObj);
STDMETHOD_(ULONG32,AddRef) (THIS);
STDMETHOD_(ULONG32,Release) (THIS);
/*
* IHXValues methods
*/
STDMETHOD(SetPropertyULONG32) (THIS_
const char* pPropertyName,
ULONG32 uPropertyValue);
STDMETHOD(GetPropertyULONG32) (THIS_
const char* pPropertyName,
REF(ULONG32) uPropertyValue);
STDMETHOD(GetFirstPropertyULONG32) (THIS_
REF(const char*) pPropertyName,
REF(ULONG32) uPropertyValue);
STDMETHOD(GetNextPropertyULONG32) (THIS_
REF(const char*) pPropertyName,
REF(ULONG32) uPropertyValue);
STDMETHOD(SetPropertyBuffer) (THIS_
const char* pPropertyName,
IHXBuffer* pPropertyValue);
STDMETHOD(GetPropertyBuffer) (THIS_
const char* pPropertyName,
REF(IHXBuffer*) pPropertyValue);
#if 0
STDMETHOD(GetEncodedPropertyBuffer) (THIS_
const char* pPropertyName,
REF(IHXBuffer*) pPropertyValue);
#endif
STDMETHOD(GetFirstPropertyBuffer) (THIS_
REF(const char*) pPropertyName,
REF(IHXBuffer*) pPropertyValue);
STDMETHOD(GetNextPropertyBuffer) (THIS_
REF(const char*) pPropertyName,
REF(IHXBuffer*) pPropertyValue);
STDMETHOD(SetPropertyCString) (THIS_
const char* pPropertyName,
IHXBuffer* pPropertyValue);
STDMETHOD(GetPropertyCString) (THIS_
const char* pPropertyName,
REF(IHXBuffer*) pPropertyValue);
#if 0
STDMETHOD(GetEncodedPropertyCString)(THIS_
const char* pPropertyName,
REF(IHXBuffer*) pPropertyValue);
#endif
STDMETHOD(GetFirstPropertyCString) (THIS_
REF(const char*) pPropertyName,
REF(IHXBuffer*) pPropertyValue);
STDMETHOD(GetNextPropertyCString) (THIS_
REF(const char*) pPropertyName,
REF(IHXBuffer*) pPropertyValue);
void PreserveCase(BOOL bPreserve);
public:
static void mergeHeaders
(
IHXValues* pIHXValuesDestHeaders,
IHXValues* pIHXValuesSourceHeaders
);
};
#endif
#endif /* _HXPCKTS_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -