298 lines
6.5 KiB
C++
298 lines
6.5 KiB
C++
/*
|
||
|
||
Copyright (c) 1998-1999 Microsoft Corporation
|
||
|
||
Module Name:
|
||
blbtime.cpp
|
||
|
||
Abstract:
|
||
Implementation of CSdpblbApp and DLL registration.
|
||
|
||
Author:
|
||
|
||
*/
|
||
|
||
#include "stdafx.h"
|
||
|
||
#include "blbgen.h"
|
||
#include "sdpblb.h"
|
||
#include "sdpblob.h"
|
||
#include "blbtime.h"
|
||
#include "blbreg.h"
|
||
|
||
// static variables
|
||
const IID &TIME::ELEM_IF_ID = IID_ITTime;
|
||
|
||
// uses GetElement() to access the sdp time instance - calls ENUM_ELEMENT::GetElement()
|
||
|
||
HRESULT
|
||
TIME::Init(
|
||
IN CSdpConferenceBlob &ConfBlob
|
||
)
|
||
{
|
||
// create a defalt sdp time instance
|
||
SDP_TIME *SdpTime;
|
||
|
||
try
|
||
{
|
||
SdpTime = new SDP_TIME();
|
||
}
|
||
catch(...)
|
||
{
|
||
SdpTime = NULL;
|
||
}
|
||
|
||
BAIL_IF_NULL(SdpTime, E_OUTOFMEMORY);
|
||
|
||
// allocate memory for the time blob
|
||
TCHAR SdpTimeBlob[50];
|
||
|
||
TCHAR *BlobPtr = SdpTimeBlob;
|
||
// use the Time template to create a Time blob
|
||
// parse the Time blob to initialize the sdp Time instance
|
||
// if not successful, delete the sdp Time instance and return error
|
||
if ( (0 == _stprintf(
|
||
SdpTimeBlob,
|
||
SDP_REG_READER::GetTimeTemplate(),
|
||
GetCurrentNtpTime() + SDP_REG_READER::GetStartTimeOffset(), // start time - current time + start offset,
|
||
GetCurrentNtpTime() + SDP_REG_READER::GetStopTimeOffset() // stop time - current time + stop offset
|
||
) ) ||
|
||
(!SdpTime->ParseLine(BlobPtr)) )
|
||
{
|
||
delete SdpTime;
|
||
return HRESULT_FROM_ERROR_CODE(GetLastError());
|
||
}
|
||
|
||
m_ConfBlob = &ConfBlob;
|
||
|
||
// the init methods returns void
|
||
ENUM_ELEMENT<SDP_TIME>::SuccessInit(*SdpTime, TRUE);
|
||
|
||
return S_OK;
|
||
}
|
||
|
||
|
||
HRESULT
|
||
TIME::Init(
|
||
IN CSdpConferenceBlob &ConfBlob,
|
||
IN DWORD StartTime,
|
||
IN DWORD StopTime
|
||
)
|
||
{
|
||
// create a defalt sdp time instance
|
||
SDP_TIME *SdpTime;
|
||
|
||
try
|
||
{
|
||
SdpTime = new SDP_TIME();
|
||
}
|
||
catch(...)
|
||
{
|
||
SdpTime = NULL;
|
||
}
|
||
|
||
BAIL_IF_NULL(SdpTime, E_OUTOFMEMORY);
|
||
|
||
// set the time instance start/stop time (also make it valid)
|
||
BAIL_ON_FAILURE(SdpTime->SetTimes(StartTime, StopTime));
|
||
|
||
m_ConfBlob = &ConfBlob;
|
||
|
||
// the init methods returns void
|
||
ENUM_ELEMENT<SDP_TIME>::SuccessInit(*SdpTime, TRUE);
|
||
|
||
return S_OK;
|
||
}
|
||
|
||
|
||
|
||
inline
|
||
DWORD_PTR TimetToNtpTime(IN time_t TimetVal)
|
||
{
|
||
return TimetVal + NTP_OFFSET;
|
||
}
|
||
|
||
|
||
inline
|
||
time_t NtpTimeToTimet(IN DWORD_PTR NtpTime)
|
||
{
|
||
return NtpTime - NTP_OFFSET;
|
||
}
|
||
|
||
|
||
inline HRESULT
|
||
SystemTimeToNtpTime(
|
||
IN SYSTEMTIME &Time,
|
||
OUT DWORD_PTR &NtpDword
|
||
)
|
||
{
|
||
_ASSERTE(FIRST_POSSIBLE_YEAR <= Time.wYear);
|
||
|
||
// fill in a tm struct with the values
|
||
tm NtpTmStruct;
|
||
NtpTmStruct.tm_isdst = -1; // no info available about daylight savings time
|
||
NtpTmStruct.tm_year = (int)Time.wYear - 1900;
|
||
NtpTmStruct.tm_mon = (int)Time.wMonth - 1; // months since january
|
||
NtpTmStruct.tm_mday = (int)Time.wDay;
|
||
NtpTmStruct.tm_wday = (int)Time.wDayOfWeek;
|
||
NtpTmStruct.tm_hour = (int)Time.wHour;
|
||
NtpTmStruct.tm_min = (int)Time.wMinute;
|
||
NtpTmStruct.tm_sec = (int)Time.wSecond;
|
||
|
||
// try to convert into a time_t value
|
||
time_t TimetVal = mktime(&NtpTmStruct);
|
||
if ( -1 == TimetVal )
|
||
{
|
||
return E_INVALIDARG;
|
||
}
|
||
|
||
// convert the time_t value into an NTP value
|
||
NtpDword = TimetToNtpTime(TimetVal);
|
||
return S_OK;
|
||
}
|
||
|
||
|
||
inline
|
||
HRESULT
|
||
NtpTimeToSystemTime(
|
||
IN DWORD dwNtpTime,
|
||
OUT SYSTEMTIME &Time
|
||
)
|
||
{
|
||
// if the gen time is WSTR_GEN_TIME_ZERO then,
|
||
// all the out parameters should be set to 0
|
||
if (dwNtpTime == 0)
|
||
{
|
||
memset(&Time, 0, sizeof(SYSTEMTIME));
|
||
return S_OK;
|
||
}
|
||
|
||
time_t Timet = NtpTimeToTimet(dwNtpTime);
|
||
|
||
// get the local tm struct for this time value
|
||
tm LocalTm = *localtime(&Timet);
|
||
|
||
//
|
||
// win64: added casts below
|
||
//
|
||
|
||
// set the ref parameters to the tm struct values
|
||
Time.wYear = (WORD) ( LocalTm.tm_year + 1900 ); // years since 1900
|
||
Time.wMonth = (WORD) ( LocalTm.tm_mon + 1 ); // months SINCE january (0,11)
|
||
Time.wDay = (WORD) LocalTm.tm_mday;
|
||
Time.wDayOfWeek = (WORD) LocalTm.tm_wday;
|
||
Time.wHour = (WORD) LocalTm.tm_hour;
|
||
Time.wMinute = (WORD) LocalTm.tm_min;
|
||
Time.wSecond = (WORD) LocalTm.tm_sec;
|
||
Time.wMilliseconds = (WORD) 0;
|
||
|
||
return S_OK;
|
||
}
|
||
|
||
STDMETHODIMP TIME::get_StartTime(DOUBLE * pVal)
|
||
{
|
||
BAIL_IF_NULL(pVal, E_INVALIDARG);
|
||
|
||
CLock Lock(g_DllLock);
|
||
|
||
ULONG StartTime;
|
||
BAIL_ON_FAILURE(GetElement().GetStartTime(StartTime));
|
||
|
||
SYSTEMTIME Time;
|
||
NtpTimeToSystemTime(StartTime, Time);
|
||
|
||
DOUBLE vtime;
|
||
if (SystemTimeToVariantTime(&Time, &vtime) == FALSE)
|
||
{
|
||
return E_INVALIDARG;
|
||
}
|
||
|
||
*pVal = vtime;
|
||
return S_OK;
|
||
}
|
||
|
||
STDMETHODIMP TIME::put_StartTime(DOUBLE newVal)
|
||
{
|
||
SYSTEMTIME Time;
|
||
|
||
if (VariantTimeToSystemTime(newVal, &Time) == FALSE)
|
||
{
|
||
return E_INVALIDARG;
|
||
}
|
||
|
||
DWORD_PTR dwNtpStartTime;
|
||
if (newVal == 0)
|
||
{
|
||
// unbounded start time
|
||
dwNtpStartTime = 0;
|
||
}
|
||
else if ( FIRST_POSSIBLE_YEAR > Time.wYear )
|
||
{
|
||
// cannot handle years less than FIRST_POSSIBLE_YEAR
|
||
return E_INVALIDARG;
|
||
}
|
||
else
|
||
{
|
||
BAIL_ON_FAILURE(SystemTimeToNtpTime(Time, dwNtpStartTime));
|
||
}
|
||
|
||
CLock Lock(g_DllLock);
|
||
|
||
HRESULT HResult = GetElement().SetStartTime((ULONG) dwNtpStartTime);
|
||
|
||
return HResult;
|
||
}
|
||
|
||
STDMETHODIMP TIME::get_StopTime(DOUBLE * pVal)
|
||
{
|
||
BAIL_IF_NULL(pVal, E_INVALIDARG);
|
||
|
||
CLock Lock(g_DllLock);
|
||
|
||
ULONG StopTime;
|
||
BAIL_ON_FAILURE(GetElement().GetStopTime(StopTime));
|
||
|
||
SYSTEMTIME Time;
|
||
NtpTimeToSystemTime(StopTime, Time);
|
||
|
||
DOUBLE vtime;
|
||
if (SystemTimeToVariantTime(&Time, &vtime) == FALSE)
|
||
{
|
||
return E_INVALIDARG;
|
||
}
|
||
|
||
*pVal = vtime;
|
||
return S_OK;
|
||
}
|
||
|
||
STDMETHODIMP TIME::put_StopTime(DOUBLE newVal)
|
||
{
|
||
SYSTEMTIME Time;
|
||
if (VariantTimeToSystemTime(newVal, &Time) == FALSE)
|
||
{
|
||
return E_INVALIDARG;
|
||
}
|
||
|
||
DWORD_PTR dwNtpStartTime;
|
||
if (newVal == 0)
|
||
{
|
||
// unbounded start time
|
||
dwNtpStartTime = 0;
|
||
}
|
||
else if ( FIRST_POSSIBLE_YEAR > Time.wYear )
|
||
{
|
||
// cannot handle years less than FIRST_POSSIBLE_YEAR
|
||
return E_INVALIDARG;
|
||
}
|
||
else
|
||
{
|
||
BAIL_ON_FAILURE(SystemTimeToNtpTime(Time, dwNtpStartTime));
|
||
}
|
||
|
||
CLock Lock(g_DllLock);
|
||
|
||
GetElement().SetStopTime((ULONG)dwNtpStartTime);
|
||
|
||
return S_OK;
|
||
}
|