/* Copyright (c) 1997-1999 Microsoft Corporation Module Name: sdp.h Abstract: Author: */ #ifndef __SDP__ #define __SDP__ #include "sdpcommo.h" #include "sdpcset.h" #include "sdpgen.h" #include "sdpver.h" #include "sdporigi.h" #include "sdpconn.h" #include "sdpbw.h" #include "sdpatt.h" #include "sdpcstrl.h" #include "sdpbstrl.h" #include "sdptime.h" #include "sdpadtex.h" #include "sdpenc.h" #include "sdpmedia.h" enum PARSE_STATE { STATE_START, STATE_VERSION, STATE_ORIGIN, STATE_SESSION_NAME, STATE_TITLE, STATE_URI, STATE_EMAIL, STATE_PHONE, STATE_CONNECTION, STATE_BANDWIDTH, STATE_TIME, STATE_REPEAT, STATE_ADJUSTMENT, STATE_KEY, STATE_ATTRIBUTE, STATE_MEDIA, STATE_MEDIA_TITLE, STATE_MEDIA_CONNECTION, STATE_MEDIA_BANDWIDTH, STATE_MEDIA_KEY, STATE_MEDIA_ATTRIBUTE, STATE_NUM_STATES // not a valid state, merely to count the number of states }; class _DllDecl SDP { public: inline SDP(); BOOL Init(); BOOL IsValid(); void Reset(); BOOL IsModified(); BOOL ParseSdpPacket( IN CHAR *SdpPacket, IN SDP_CHARACTER_SET CharacterSet = CS_IMPLICIT ); // clears the modified state for each member field/value // this is used in sdpblb.dll to clear the modified state (when an sdp // is parsed in, the state of all parsed in fields/values is modified) and // the m_WasModified dirty flag void ClearModifiedState(); CHAR *GenerateSdpPacket(); inline BOOL GetWasModified(); inline SDP_CHARACTER_SET GetCharacterSet(); inline SDP_VERSION &GetProtocolVersion(); inline SDP_ORIGIN &GetOrigin(); inline SDP_REQD_BSTRING_LINE &GetSessionName(); inline SDP_REQD_BSTRING_LINE &GetSessionTitle(); inline SDP_CHAR_STRING_LINE &GetUri(); inline SDP_EMAIL_LIST &GetEmailList(); inline SDP_PHONE_LIST &GetPhoneList(); inline SDP_CONNECTION &GetConnection(); inline SDP_BANDWIDTH &GetBandwidth(); inline void ClearDestroyTimeListFlag(); inline SDP_TIME_LIST &GetTimeList(); inline SDP_ENCRYPTION_KEY &GetEncryptionKey(); inline SDP_ATTRIBUTE_LIST &GetAttributeList(); inline void ClearDestroyMediaListFlag(); inline SDP_MEDIA_LIST &GetMediaList(); virtual ~SDP(); protected: // tracks if the last attempt to generate an sdp packet failed (starts with FALSE) BOOL m_LastGenFailed; CHAR *m_SdpPacket; DWORD m_BytesAllocated; DWORD m_SdpPacketLength; // dirty flag - is initially false and is set to TRUE when an sdp is generated because it had // been modified since the last time the sdp was generated. // (as IsModified() becomes FALSE after that) BOOL m_WasModified; CHAR *m_Current; PARSE_STATE m_ParseState; BOOL m_DestroyMediaList; BOOL m_DestroyTimeList; SDP_CHARACTER_SET m_CharacterSet; SDP_VERSION m_ProtocolVersion; SDP_ORIGIN m_Origin; SDP_REQD_BSTRING_LINE m_SessionName; SDP_REQD_BSTRING_LINE m_SessionTitle; // optional SDP_CHAR_STRING_LINE m_Uri; // optional SDP_EMAIL_LIST m_EmailList; // optional SDP_PHONE_LIST m_PhoneList; // optional SDP_CONNECTION m_Connection; SDP_BANDWIDTH m_Bandwidth; // optional SDP_TIME_LIST *m_TimeList; // optional SDP_ENCRYPTION_KEY m_EncryptionKey; // optional SDP_ATTRIBUTE_LIST m_AttributeList; // optional SDP_MEDIA_LIST *m_MediaList; BOOL DetermineCharacterSet( IN CHAR *SdpPacket, OUT SDP_CHARACTER_SET &CharacterSet ); private: BOOL GetType( OUT CHAR &Type, OUT BOOL &EndOfPacket ); BOOL CheckTransition( IN CHAR Type, IN PARSE_STATE CurrentParseState, OUT PARSE_STATE &NewParseState ); BOOL GetValue(IN CHAR Type); BOOL IsValidEndState() const; }; inline SDP::SDP( ) : m_SessionName(SDP_INVALID_SESSION_NAME, SESSION_NAME_STRING), m_SessionTitle(SDP_INVALID_SESSION_TITLE, TITLE_STRING), m_Uri(SDP_INVALID_URI, URI_STRING), m_AttributeList(ATTRIBUTE_STRING), m_DestroyMediaList(FALSE), m_MediaList(NULL), m_DestroyTimeList(FALSE), m_TimeList(NULL), m_SdpPacket(NULL), m_Current(NULL), m_ParseState(STATE_START), m_LastGenFailed(FALSE), m_WasModified(FALSE), m_BytesAllocated(0), m_SdpPacketLength(0) { } inline BOOL SDP::GetWasModified( ) { return m_WasModified; } inline SDP_CHARACTER_SET SDP::GetCharacterSet( ) { return m_CharacterSet; } inline SDP_VERSION & SDP::GetProtocolVersion( ) { return m_ProtocolVersion; } inline SDP_ORIGIN & SDP::GetOrigin( ) { return m_Origin; } inline SDP_REQD_BSTRING_LINE & SDP::GetSessionName( ) { return m_SessionName; } inline SDP_REQD_BSTRING_LINE & SDP::GetSessionTitle( ) { return m_SessionTitle; } inline SDP_CHAR_STRING_LINE & SDP::GetUri( ) { return m_Uri; } inline SDP_EMAIL_LIST & SDP::GetEmailList( ) { return m_EmailList; } inline SDP_PHONE_LIST & SDP::GetPhoneList( ) { return m_PhoneList; } inline SDP_CONNECTION & SDP::GetConnection( ) { return m_Connection; } inline SDP_BANDWIDTH & SDP::GetBandwidth( ) { return m_Bandwidth; } inline void SDP::ClearDestroyTimeListFlag( ) { m_DestroyTimeList = FALSE; } inline SDP_TIME_LIST & SDP::GetTimeList( ) { ASSERT(NULL != m_TimeList); return *m_TimeList; } inline SDP_ENCRYPTION_KEY & SDP::GetEncryptionKey( ) { return m_EncryptionKey; } inline SDP_ATTRIBUTE_LIST & SDP::GetAttributeList( ) { return m_AttributeList; } inline void SDP::ClearDestroyMediaListFlag( ) { m_DestroyMediaList = FALSE; } inline SDP_MEDIA_LIST & SDP::GetMediaList( ) { ASSERT(NULL != m_MediaList); return *m_MediaList; } #endif // __SDP__