windows-nt/Source/XPSP1/NT/net/tapi/skywalker/inc/sdptime.h
2020-09-26 16:20:57 +08:00

616 lines
11 KiB
C++

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