329 lines
7 KiB
C++
329 lines
7 KiB
C++
/*
|
|
|
|
Copyright (c) 1997-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
sdpcstrl.h
|
|
|
|
Abstract:
|
|
|
|
|
|
Author:
|
|
|
|
*/
|
|
|
|
#ifndef __SDP_CHAR_STRING__
|
|
#define __SDP_CHAR_STRING__
|
|
|
|
#include "sdpcommo.h"
|
|
#include "sdpfld.h"
|
|
#include "sdpval.h"
|
|
|
|
|
|
|
|
|
|
|
|
class _DllDecl SDP_CHAR_STRING : public SDP_SINGLE_FIELD
|
|
{
|
|
public:
|
|
|
|
inline SDP_CHAR_STRING();
|
|
|
|
virtual void Reset();
|
|
|
|
inline BOOL ByReference() const;
|
|
|
|
inline CHAR *GetCharacterString() const;
|
|
|
|
inline CHAR *GetModifiableCharString();
|
|
|
|
inline BOOL SetCharacterStringByReference(
|
|
IN CHAR *CharacterStringByReference,
|
|
IN DWORD Length = 0
|
|
);
|
|
|
|
inline BOOL SetCharacterStringByCopy(
|
|
IN const CHAR *CharacterStringByCopy,
|
|
IN DWORD Length = 0
|
|
);
|
|
|
|
inline DWORD GetLength() const;
|
|
|
|
virtual ~SDP_CHAR_STRING();
|
|
|
|
protected:
|
|
|
|
virtual BOOL InternalParseToken(
|
|
IN CHAR *Token
|
|
);
|
|
|
|
inline BOOL ReAllocCharacterString(
|
|
IN UINT BufferSize
|
|
);
|
|
|
|
virtual BOOL InternalSetCharStrByRef(
|
|
IN CHAR *CharacterStringByReference,
|
|
IN DWORD Length
|
|
);
|
|
|
|
virtual BOOL InternalSetCharStrByCopy(
|
|
IN const CHAR *CharacterStringByCopy,
|
|
IN DWORD Length
|
|
);
|
|
|
|
virtual DWORD CalcCharacterStringSize();
|
|
|
|
virtual BOOL CopyField(
|
|
OUT ostrstream &OutputStream
|
|
);
|
|
|
|
// this method should not be used
|
|
virtual BOOL PrintData(
|
|
OUT ostrstream &OutputStream
|
|
)
|
|
{
|
|
ASSERT(FALSE);
|
|
return FALSE;
|
|
}
|
|
|
|
private:
|
|
|
|
DWORD m_CharacterStringLength;
|
|
CHAR *m_CharacterString;
|
|
|
|
DWORD m_LengthByReference;
|
|
CHAR *m_CharacterStringByReference;
|
|
|
|
DWORD m_BytesAllocated;
|
|
};
|
|
|
|
|
|
inline
|
|
SDP_CHAR_STRING::SDP_CHAR_STRING(
|
|
)
|
|
: SDP_SINGLE_FIELD(0, NULL), // no buffer used (custom PrintField)
|
|
m_CharacterString(NULL),
|
|
m_CharacterStringLength(0),
|
|
m_LengthByReference(0),
|
|
m_CharacterStringByReference(NULL),
|
|
m_BytesAllocated(0)
|
|
{}
|
|
|
|
|
|
inline BOOL
|
|
SDP_CHAR_STRING::ByReference(
|
|
) const
|
|
{
|
|
// check that both the char string and the char string by ref are not null
|
|
// at the same time
|
|
ASSERT((NULL == m_CharacterString) != (NULL == m_CharacterStringByReference));
|
|
|
|
return (NULL == m_CharacterString);
|
|
}
|
|
|
|
|
|
inline CHAR *
|
|
SDP_CHAR_STRING::GetCharacterString(
|
|
) const
|
|
{
|
|
// check that both the char string and the char string by ref are not null
|
|
// at the same time
|
|
ASSERT((NULL == m_CharacterString) != (NULL == m_CharacterStringByReference));
|
|
|
|
return ((TRUE == ByReference())? m_CharacterStringByReference : m_CharacterString);
|
|
}
|
|
|
|
|
|
inline CHAR *
|
|
SDP_CHAR_STRING::GetModifiableCharString(
|
|
)
|
|
{
|
|
// check that both the char string and the char string by ref are not null
|
|
// at the same time
|
|
ASSERT((NULL == m_CharacterString) != (NULL == m_CharacterStringByReference));
|
|
|
|
// the reference string is not modifiable
|
|
ASSERT(FALSE == ByReference());
|
|
|
|
return ((TRUE == ByReference())? NULL : m_CharacterString);
|
|
}
|
|
|
|
inline DWORD
|
|
SDP_CHAR_STRING::GetLength(
|
|
) const
|
|
{
|
|
// check that both the char string and the char string by ref are not null
|
|
// at the same time
|
|
ASSERT((NULL == m_CharacterString) != (NULL == m_CharacterStringByReference));
|
|
|
|
return ((TRUE == ByReference())? m_LengthByReference : m_CharacterStringLength);
|
|
}
|
|
|
|
|
|
|
|
inline BOOL
|
|
SDP_CHAR_STRING::ReAllocCharacterString(
|
|
IN UINT BufferSize
|
|
)
|
|
{
|
|
CHAR *NewCharacterString;
|
|
|
|
// check that both the char string and the char string by ref are not null
|
|
// at the same time
|
|
ASSERT((NULL == m_CharacterString) != (NULL == m_CharacterStringByReference));
|
|
|
|
ASSERT(0 != BufferSize);
|
|
|
|
// if the length of the token (not including the end of string) is not less than
|
|
// the number of bytes allocated, release the bytes and allocate again
|
|
if ( (BufferSize - 1) >= m_BytesAllocated )
|
|
{
|
|
try
|
|
{
|
|
NewCharacterString = new CHAR[BufferSize];
|
|
}
|
|
catch(...)
|
|
{
|
|
NewCharacterString = NULL;
|
|
}
|
|
|
|
if ( NULL == NewCharacterString )
|
|
{
|
|
SetLastError(ERROR_OUTOFMEMORY);
|
|
return FALSE;
|
|
}
|
|
|
|
// If there is an old character string, delete it
|
|
if ( NULL != m_CharacterString )
|
|
{
|
|
delete m_CharacterString;
|
|
}
|
|
|
|
m_BytesAllocated = BufferSize;
|
|
m_CharacterString = NewCharacterString;
|
|
}
|
|
|
|
m_CharacterStringLength = BufferSize - 1;
|
|
|
|
// If there was a reference to another string, remove it
|
|
if ( ByReference() )
|
|
{
|
|
m_LengthByReference = 0;
|
|
m_CharacterStringByReference = NULL;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
inline BOOL
|
|
SDP_CHAR_STRING::SetCharacterStringByReference(
|
|
IN CHAR *CharacterStringByReference,
|
|
IN DWORD Length
|
|
)
|
|
{
|
|
// check that both the char string and the char string by ref are not null
|
|
// at the same time
|
|
ASSERT((NULL == m_CharacterString) != (NULL == m_CharacterStringByReference));
|
|
|
|
ASSERT(NULL != CharacterStringByReference);
|
|
if ( NULL == CharacterStringByReference )
|
|
{
|
|
SetLastError(SDP_INVALID_VALUE);
|
|
return FALSE;
|
|
}
|
|
|
|
if ( !InternalSetCharStrByRef(
|
|
CharacterStringByReference,
|
|
(0==Length)? strlen(CharacterStringByReference): Length
|
|
) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
IsValid(TRUE);
|
|
IsModified(TRUE);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
inline BOOL
|
|
SDP_CHAR_STRING::SetCharacterStringByCopy(
|
|
IN const CHAR *CharacterStringByCopy,
|
|
IN DWORD Length
|
|
)
|
|
{
|
|
// check that both the char string and the char string by ref are not null
|
|
// at the same time
|
|
ASSERT((NULL == m_CharacterString) != (NULL == m_CharacterStringByReference));
|
|
|
|
ASSERT(NULL != CharacterStringByCopy);
|
|
if ( NULL == CharacterStringByCopy )
|
|
{
|
|
SetLastError(SDP_INVALID_VALUE);
|
|
return FALSE;
|
|
}
|
|
|
|
if ( !InternalSetCharStrByCopy(
|
|
CharacterStringByCopy,
|
|
(0==Length)? strlen(CharacterStringByCopy): Length
|
|
) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
IsValid(TRUE);
|
|
IsModified(TRUE);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
class _DllDecl SDP_STRING_LINE : public SDP_VALUE
|
|
{
|
|
public:
|
|
|
|
inline SDP_STRING_LINE(
|
|
IN const DWORD ErrorCode,
|
|
IN const CHAR *TypeString,
|
|
IN SDP_FIELD &ParseField
|
|
);
|
|
|
|
virtual HRESULT GetBstrCopy(IN BSTR *Bstr) = 0;
|
|
|
|
virtual HRESULT SetBstr(IN BSTR Bstr) = 0;
|
|
|
|
protected:
|
|
|
|
SDP_FIELD &m_ParseField;
|
|
|
|
virtual BOOL InternalParseLine(
|
|
IN OUT CHAR *&Line
|
|
);
|
|
|
|
inline SDP_FIELD &GetParseField();
|
|
};
|
|
|
|
|
|
inline
|
|
SDP_STRING_LINE::SDP_STRING_LINE(
|
|
IN const DWORD ErrorCode,
|
|
IN const CHAR *TypeString,
|
|
IN SDP_FIELD &ParseField
|
|
)
|
|
: SDP_VALUE(ErrorCode, TypeString),
|
|
m_ParseField(ParseField)
|
|
{
|
|
}
|
|
|
|
|
|
inline SDP_FIELD &
|
|
SDP_STRING_LINE::GetParseField(
|
|
)
|
|
{
|
|
return m_ParseField;
|
|
}
|
|
|
|
|
|
|
|
#endif // __SDP_CHAR_STRING__
|