616 lines
11 KiB
C
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__
|