/* 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__