//*********************************************************************
//*                  Microsoft Windows                               **
//*            Copyright(c) Microsoft Corp., 1999                    **
//*********************************************************************
//
//  SYSCLOCK.H - Header for the implementation of CSystemClock
//
//  HISTORY:
//
//  1/27/99 a-jaswed Created.
//

#ifndef _SYSCLOCK_H_
#define _SYSCLOCK_H_

#include <windows.h>
#include <assert.h>
#include <oleauto.h>
#include <regstr.h>

// Time Zone data value keys

#define TIME_ZONE_REGKEY \
    L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones"

#define TIME_ZONE_INFO_REGKEY \
    L"SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation"

#define TIMEZONE_STANDARD_NAME \
    L"StandardName"

#define TIME_ZONE_DISPLAYNAME_REGVAL  L"Display"
#define TIME_ZONE_STANDARDNAME_REGVAL L"Std"
#define TIME_ZONE_DAYLIGHTNAME_REGVAL L"Dlt"
#define TIME_ZONE_INDEX_REGVAL        L"Index"
#define TIME_ZONE_TZI_REGVAL          L"TZI"
#define TIME_ZONE_MAPINFO_REGVAL      L"MapID"

#define TZNAME_SIZE 32
#define TZDISPLAYZ  500
#define MAXKEYNAMELEN 100


// stuff from registry goes in here
// whole point of this re-ordered structure is
// because registry stores the last 5 fields
// together in hex, want to read them in all at once
typedef struct tagTZINFO {
    struct tagTZINFO *next;
    WCHAR       szDisplayName[TZDISPLAYZ];
    WCHAR       szStandardName[TZNAME_SIZE];
    WCHAR       szDaylightName[TZNAME_SIZE];
    LONG        Index;
    LONG       Bias;
    LONG       StandardBias;
    LONG       DaylightBias;
    SYSTEMTIME StandardDate;
    SYSTEMTIME DaylightDate;
} TZINFO, NEAR *PTZINFO;


class CSystemClock : public IDispatch
{
private:
    ULONG m_cRef;

    WCHAR   *m_szTimeZoneOptionStrs;
    PTZINFO  m_pTimeZoneArr;
    ULONG    m_cNumTimeZones, m_uCurTimeZoneIdx;
    BOOL     m_bSetAutoDaylightMode;
    BOOL     m_bTimeZonePreset;
    HINSTANCE m_hInstance;
    WCHAR DefltZoneKeyValue[MAXKEYNAMELEN];

    //internal SET functions
    HRESULT  set_TimeZone (BSTR bstrTimeZone);
    HRESULT  set_Time     (WORD wHour, WORD wMinute, WORD wSec);
    HRESULT  set_Date     (WORD wMonth, WORD wDay, WORD wYear);

    //Methods
    void GetTimeZoneInfo(BOOL fAutoDaylightSavings, PTZINFO ptZone);
    void SetAllowLocalTimeChange (BOOL fAutoDaylightSavings);
    BOOL SetTheTimezone          (BOOL fAutoDaylightSavings, PTZINFO ptZone);
    HRESULT ReadZoneData            (PTZINFO ptZone, HKEY hKey, LPCWSTR szKeyName);
    HRESULT InitSystemClock();
    int GetTimeZoneValStr();

public:

     CSystemClock (HINSTANCE m_bhInstance);
    ~CSystemClock ();

    // IUnknown Interfaces
    STDMETHODIMP         QueryInterface (REFIID riid, LPVOID* ppvObj);
    STDMETHODIMP_(ULONG) AddRef         ();
    STDMETHODIMP_(ULONG) Release        ();

    //IDispatch Interfaces
    STDMETHOD (GetTypeInfoCount) (UINT* pcInfo);
    STDMETHOD (GetTypeInfo)      (UINT, LCID, ITypeInfo** );
    STDMETHOD (GetIDsOfNames)    (REFIID, OLECHAR**, UINT, LCID, DISPID* );
    STDMETHOD (Invoke)           (DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr);
 };

#endif