|
|
/*
Copyright (c) 1997-1999 Microsoft Corporation
*/
#ifndef __SDP_TIME__
#define __SDP_TIME__
#include "sdpcommo.h"
#include "sdpgen.h"
#include "sdpfld.h"
#include "sdpval.h"
#include "sdpstp.h"
#include "sdpsadj.h"
// no Reset method to set the member values to 0 again (as its not really required and it saves
// one call per instance)
class _DllDecl SDP_TIME_PERIOD : public SDP_SINGLE_FIELD { public:
inline SDP_TIME_PERIOD();
inline BOOL IsCompact() const;
inline void IsCompact( IN BOOL IsCompactFlag );
inline CHAR GetUnit() const;
inline void SetUnit( IN CHAR Unit );
inline LONG GetCompactValue() const;
inline void SetCompactValue( IN LONG CompactValue );
inline LONG GetPeriodValue() const;
inline void SetPeriodValue( IN LONG PeriodValue );
inline void Get( OUT BOOL &IsCompactFlag, OUT CHAR &Unit, OUT LONG &CompactValue, OUT LONG &PeriodValue ) const;
inline void Set( IN BOOL IsCompactFlag, IN CHAR Unit, IN LONG CompactValue, IN LONG PeriodValue );
protected:
BOOL m_IsCompact; CHAR m_Unit; LONG m_CompactValue; LONG m_PeriodValue;
CHAR m_SdpTimePeriodBuffer[25];
virtual BOOL InternalParseToken( IN CHAR *Token ); virtual BOOL PrintData( OUT ostrstream &OutputStream ); };
inline SDP_TIME_PERIOD::SDP_TIME_PERIOD( ) : SDP_SINGLE_FIELD(sizeof(m_SdpTimePeriodBuffer), m_SdpTimePeriodBuffer) { }
inline BOOL SDP_TIME_PERIOD::IsCompact( ) const { return m_IsCompact; }
inline void SDP_TIME_PERIOD::IsCompact( IN BOOL IsCompactFlag ) { m_IsCompact = IsCompactFlag; }
inline CHAR SDP_TIME_PERIOD::GetUnit( ) const { return m_Unit; }
inline void SDP_TIME_PERIOD::SetUnit( IN CHAR Unit ) { m_Unit = Unit; }
inline LONG SDP_TIME_PERIOD::GetCompactValue( ) const { return m_CompactValue; }
inline void SDP_TIME_PERIOD::SetCompactValue( IN LONG CompactValue ) { m_CompactValue = CompactValue; }
inline LONG SDP_TIME_PERIOD::GetPeriodValue( ) const { return m_PeriodValue; }
inline void SDP_TIME_PERIOD::SetPeriodValue( IN LONG PeriodValue ) { m_PeriodValue = PeriodValue; }
inline void SDP_TIME_PERIOD::Get( OUT BOOL &IsCompactFlag, OUT CHAR &Unit, OUT LONG &CompactValue, OUT LONG &PeriodValue ) const { IsCompactFlag = IsCompact(); Unit = GetUnit(); CompactValue = GetCompactValue(); PeriodValue = GetPeriodValue(); }
inline void SDP_TIME_PERIOD::Set( IN BOOL IsCompactFlag, IN CHAR Unit, IN LONG CompactValue, IN LONG PeriodValue ) { IsCompact(IsCompactFlag); SetUnit(Unit); SetCompactValue(CompactValue); SetPeriodValue(PeriodValue);
IsValid(TRUE); IsModified(TRUE); }
class _DllDecl SDP_TIME_PERIOD_LIST : public SDP_FIELD_LIST, public SDP_TIME_PERIOD_SAFEARRAY { public:
inline SDP_TIME_PERIOD_LIST();
virtual SDP_FIELD *CreateElement(); };
inline SDP_TIME_PERIOD_LIST::SDP_TIME_PERIOD_LIST( ) : SDP_FIELD_LIST(CHAR_BLANK), SDP_TIME_PERIOD_SAFEARRAY(*this) { }
class _DllDecl SDP_REPEAT : public SDP_VALUE { public:
SDP_REPEAT();
inline SDP_TIME_PERIOD &GetInterval();
inline SDP_TIME_PERIOD &GetDuration();
inline SDP_TIME_PERIOD_LIST &GetOffsets();
protected:
SDP_TIME_PERIOD m_Interval; SDP_TIME_PERIOD m_Duration; SDP_TIME_PERIOD_LIST m_Offsets; // array of SDP_TIME_PERIOD
virtual BOOL InternalParseLine( IN OUT CHAR *&Line );
virtual BOOL GetField( OUT SDP_FIELD *&Field, OUT BOOL &AddToArray );
virtual void InternalReset(); };
inline SDP_TIME_PERIOD & SDP_REPEAT::GetInterval( ) { return m_Interval; }
inline SDP_TIME_PERIOD & SDP_REPEAT::GetDuration( ) { return m_Duration; }
inline SDP_TIME_PERIOD_LIST & SDP_REPEAT::GetOffsets( ) { return m_Offsets; }
class _DllDecl SDP_REPEAT_LIST : public SDP_VALUE_LIST { protected:
virtual SDP_VALUE *CreateElement(); };
class _DllDecl SDP_ADJUSTMENT : public SDP_VALUE, public SDP_ADJUSTMENT_SAFEARRAY { public:
SDP_ADJUSTMENT();
inline SDP_ULONG_LIST &GetAdjustmentTimes();
inline SDP_TIME_PERIOD_LIST &GetOffsets();
protected:
SDP_ULONG_LIST m_AdjustmentTimes; // array of SDP_ULONG
SDP_TIME_PERIOD_LIST m_Offsets; // array of SDP_TIME_PERIOD
CHAR m_PrintBuffer[400]; DWORD m_PrintLength;
virtual void InternalReset();
BOOL PrintData( OUT ostrstream &OutputStream );
virtual BOOL GetField( OUT SDP_FIELD *&Field, OUT BOOL &AddToArray );
virtual BOOL CalcIsModified() const;
virtual DWORD CalcCharacterStringSize();
virtual BOOL CopyValue( OUT ostrstream &OutputStream );
BOOL PrintElement( IN DWORD Index, OUT ostrstream &OutputStream ); };
inline SDP_ULONG_LIST & SDP_ADJUSTMENT::GetAdjustmentTimes( ) { return m_AdjustmentTimes; }
inline SDP_TIME_PERIOD_LIST & SDP_ADJUSTMENT::GetOffsets( ) { return m_Offsets; }
class _DllDecl SDP_TIME : public SDP_VALUE { public:
SDP_TIME();
inline HRESULT SetTimes( IN ULONG StartTime, IN ULONG StopTime );
inline HRESULT SetStartTime( IN ULONG StartTime );
inline HRESULT SetStopTime( IN ULONG StopTime );
inline HRESULT GetStartTime( OUT ULONG &StartTime );
inline HRESULT GetStopTime( OUT ULONG &StopTime );
inline SDP_REPEAT_LIST &GetRepeatList();
protected:
virtual BOOL CalcIsModified() const;
virtual DWORD CalcCharacterStringSize();
virtual BOOL CopyValue( OUT ostrstream &OutputStream );
virtual BOOL GetField( OUT SDP_FIELD *&Field, OUT BOOL &AddToArray );
virtual void InternalReset();
private:
SDP_ULONG m_StartTime; SDP_ULONG m_StopTime; SDP_REPEAT_LIST m_RepeatList; inline HRESULT FillArrays(); };
inline HRESULT SDP_TIME::FillArrays( ) { // check if the field and separator char arrays have been filled properly
if ( (2 != m_FieldArray.GetSize()) || (2 != m_SeparatorCharArray.GetSize()) ) { // clear the field and separator arrays
m_FieldArray.RemoveAll(); m_SeparatorCharArray.RemoveAll();
try { // insert the fields and the separator characters into respective arrays
m_FieldArray.SetAtGrow(0, &m_StartTime); m_SeparatorCharArray.SetAtGrow(0, CHAR_BLANK);
m_FieldArray.SetAtGrow(1, &m_StopTime); m_SeparatorCharArray.SetAtGrow(1, CHAR_NEWLINE); } catch(...) { m_FieldArray.RemoveAll(); m_SeparatorCharArray.RemoveAll();
return E_OUTOFMEMORY; } }
ASSERT(&m_StartTime == m_FieldArray[0]); ASSERT(&m_StopTime == m_FieldArray[1]);
return S_OK; }
inline HRESULT SDP_TIME::SetTimes( IN ULONG StartTime, IN ULONG StopTime ) { HRESULT hr;
// validate the start/stop times (either stop time == 0 or starttime <= stop time)
if ( !( (0 == StopTime) || (StartTime <= StopTime) ) ) { return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); }
m_StartTime.SetValueAndFlag(StartTime); m_StopTime.SetValueAndFlag(StopTime);
hr = FillArrays();
return hr; }
inline HRESULT SDP_TIME::SetStartTime( IN ULONG StartTime ) { HRESULT hr;
hr = FillArrays();
if ( FAILED(hr) ) { return hr; }
// set the value and the valid, modified flag
m_StartTime.SetValueAndFlag(StartTime);
// if the stop time is invalid, there is nothing to compare against
if ( !m_StopTime.IsValid() ) { return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); }
// check if the new start time is <= the current stop time,
// special case for an unbounded start/stop time (value 0)
if ( !((0 == m_StopTime.GetValue()) || (0 == StartTime) || (StartTime <= m_StopTime.GetValue())) ) { // unbound the stop time
m_StopTime.SetValueAndFlag(0); }
return S_OK; }
inline HRESULT SDP_TIME::SetStopTime( IN ULONG StopTime ) { HRESULT hr;
hr = FillArrays();
if ( FAILED(hr) ) { return hr; }
// set the value and the valid, modified flag
m_StopTime.SetValueAndFlag(StopTime);
// if the start time is invalid, there is nothing to compare against
if ( !m_StartTime.IsValid() ) { return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); }
// check if the current start time is <= the new stop time,
// special case for an unbounded start/stop time (value 0)
if ( !((0 == m_StartTime.GetValue()) || (0 == StopTime) || (m_StartTime.GetValue() <= StopTime)) ) { // unbound the start time
m_StartTime.SetValueAndFlag(0); }
return S_OK; }
inline HRESULT SDP_TIME::GetStartTime( OUT ULONG &StartTime ) { // check if the value being asked for is valid
if ( !m_StartTime.IsValid() ) { return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); }
StartTime = m_StartTime.GetValue(); return S_OK; }
inline HRESULT SDP_TIME::GetStopTime( OUT ULONG &StopTime ) { // check if the value being asked for is valid
if ( !m_StopTime.IsValid() ) { return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); }
StopTime = m_StopTime.GetValue(); return S_OK; }
inline SDP_REPEAT_LIST & SDP_TIME::GetRepeatList( ) { return m_RepeatList; }
class _DllDecl SDP_TIME_LIST : public SDP_VALUE_LIST { public:
virtual void Reset();
inline SDP_ADJUSTMENT &GetAdjustment();
virtual BOOL IsModified() const;
virtual DWORD GetCharacterStringSize();
virtual BOOL PrintValue( OUT ostrstream &OutputStream );
protected:
SDP_ADJUSTMENT m_Adjustment;
virtual SDP_VALUE *CreateElement(); };
inline SDP_ADJUSTMENT & SDP_TIME_LIST::GetAdjustment( ) { return m_Adjustment; }
#endif // __SDP_TIME__
|