// XTPCalendarTimeZoneHelper.h: interfaces for Time Zone Helper classes.
//
// This file is a part of the XTREME CALENDAR MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////

//{{AFX_CODEJOCK_PRIVATE
#if !defined(_XTPCALENDARTIMEZONEHELPER_H__)
#define _XTPCALENDARTIMEZONEHELPER_H__
//}}AFX_CODEJOCK_PRIVATE

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CXTPCalendarTimeZone;
XTP_DEFINE_SMART_PTR_INTERNAL(CXTPCalendarTimeZone)


//===========================================================================
// Summary:
//      This class extend TIME_ZONE_INFORMATION structure.
// Remarks:
//      It has additional data members to represent full information about
//      time zone.
//      Also it implements some helper functions and OLE interface methods.
// See Also:
//      TIME_ZONE_INFORMATION, CXTPCalendarTimeZones.
//       MSDN Articles:
//          INFO: Retrieving Time-Zone Information
//          KB115231, Q115231
//
//          HOWTO: Change Time Zone Information Using Visual Basic
//          KB221542, Q221542
//===========================================================================
class _XTP_EXT_CLASS CXTPCalendarTimeZone : public CXTPCmdTarget,
											public TIME_ZONE_INFORMATION
{
	//{{AFX_CODEJOCK_PRIVATE
	friend class CXTPCalendarTimeZones;
	DECLARE_DYNAMIC(CXTPCalendarTimeZone)
	//}}AFX_CODEJOCK_PRIVATE

public:

	//-----------------------------------------------------------------------
	// Summary:
	//      Default object constructor.
	// Parameters:
	//      pTZInfo - Pointer to a TIME_ZONE_INFORMATION data to initialize
	//                created object data.
	// See Also:
	//      ~CXTPCalendarTimeZone(), TIME_ZONE_INFORMATION
	//-----------------------------------------------------------------------
	CXTPCalendarTimeZone(const TIME_ZONE_INFORMATION* pTZInfo = NULL);

	//-----------------------------------------------------------------------
	// Summary:
	//      Default object constructor.
	// Parameters:
	//      pTZInfoEx - Pointer to a source data object.
	// See Also:
	//      ~CXTPCalendarTimeZone(), TIME_ZONE_INFORMATION
	//-----------------------------------------------------------------------
	CXTPCalendarTimeZone(const CXTPCalendarTimeZone* pTZInfoEx);

	//-----------------------------------------------------------------------
	// Summary:
	//     Default object destructor.
	// See Also: CXTPCalendarTimeZone()
	//-----------------------------------------------------------------------
	virtual ~CXTPCalendarTimeZone();

	//-----------------------------------------------------------------------
	// Summary:
	//      Get a time zone display string value.
	// Returns:
	//      A string value like: "(GMT+02:00) Athens, Beirut, Istanbul, Minsk"
	//-----------------------------------------------------------------------
	CString GetDisplayString() const;

	//-----------------------------------------------------------------------
	// Summary:
	//      Get a time zone order index value.
	// Remarks:
	//      This index value is used to sort time zones in the right order.
	// Returns:
	//      A time zone order index value.
	//-----------------------------------------------------------------------
	DWORD   GetIndex() const;

	//-----------------------------------------------------------------------
	// Summary:
	//      Compare 2 time zones data.
	// Parameters:
	//      pTZI2 - Points to a TIME_ZONE_INFORMATION object.
	// Returns:
	//      TRUE - if time zones data related to the same time zone,
	//      otherwise - FALSE.
	//-----------------------------------------------------------------------
	BOOL IsEqual(const TIME_ZONE_INFORMATION* pTZI2) const;

	//-----------------------------------------------------------------------
	// Summary:
	//      Copy operator.
	// Parameters:
	//      rTZInfo - Pointer to a source data object.
	// Returns:
	//      A Constant reference to updated object
	// See Also:
	//      CXTPCalendarTimeZone()
	//-----------------------------------------------------------------------
	const CXTPCalendarTimeZone& operator=(const CXTPCalendarTimeZone& rTZInfo);

	//-----------------------------------------------------------------------
	// Summary:
	//      Get full information about the specified time zone.
	// Parameters:
	//      pTZIdata - Pointer to a time zone data object.
	// Remarks:
	//      Retrieve additional information from the registry.
	// Returns:
	//      A smart pointer to CXTPCalendarTimeZone object.
	// See Also:
	//      CXTPCalendarTimeZones
	//-----------------------------------------------------------------------
	static CXTPCalendarTimeZonePtr AFX_CDECL GetTimeZoneInfo(const TIME_ZONE_INFORMATION* pTZIdata);

protected:
	CString m_strDisplayString; // A time zone display string stored value.
	DWORD   m_dwIndex;          // A time zone order index stored value.

};

//===========================================================================
// Summary:
//      This class represents a simple array collection of CXTPCalendarTimeZone
//      objects.
// Remarks:
//      Array indexes always start at position 0.
//      An InitFromRegistry() method is used to read all time zones from the
//      registry and add them to the collection.
//      Also it implements some helper functions and OLE interface methods.
// See Also:
//      TIME_ZONE_INFORMATION, CXTPCalendarTimeZone.
//       MSDN Articles:
//          INFO: Retrieving Time-Zone Information
//          KB115231, Q115231
//
//          HOWTO: Change Time Zone Information Using Visual Basic
//          KB221542, Q221542
//===========================================================================
class _XTP_EXT_CLASS CXTPCalendarTimeZones : public CXTPCmdTarget
{
	//{{AFX_CODEJOCK_PRIVATE
	DECLARE_DYNAMIC(CXTPCalendarTimeZones)
	//}}AFX_CODEJOCK_PRIVATE
public:
	//-----------------------------------------------------------------------
	// Summary:
	//      Default object constructor.
	// See Also: ~CXTPCalendarTimeZones()
	//-----------------------------------------------------------------------
	CXTPCalendarTimeZones();

	//-----------------------------------------------------------------------
	// Summary:
	//     Default object destructor.
	// See Also: CXTPCalendarTimeZones()
	//-----------------------------------------------------------------------
	virtual ~CXTPCalendarTimeZones();

	//-----------------------------------------------------------------------
	// Summary:
	//      Read all time zones from the registry and add them to the
	//      collection.
	// Returns:
	//      TRUE - if all time zones where successfully read,
	//      otherwise - FALSE.
	//-----------------------------------------------------------------------
	BOOL InitFromRegistry();

	//-----------------------------------------------------------------------
	// Summary:
	//      This member function is used to obtain the number of elements in
	//      this collection.
	// Returns:
	//     An int that contains the number of items in the collection.
	// See Also: GetAt()
	//-----------------------------------------------------------------------
	int GetCount() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to get an element at the specified numeric index.
	// Parameters:
	//     nIndex - An integer index that is greater than or equal to 0
	//              and less than the value returned by GetCount.
	// Returns:
	//     The pointer to the CXTPCalendarTimeZone element currently at this
	//     index.
	// See Also: GetCount()
	//-----------------------------------------------------------------------
	CXTPCalendarTimeZone* GetAt(long nIndex) const;

	//-----------------------------------------------------------------------
	// Summary:
	//      This method is used to find a time zone information using the
	//      specified time zone data.
	// Parameters:
	//      pTZI2 - Pointer to a time zone data object.
	// Returns:
	//     The pointer to the first object in the collection
	//     that matches the requested time zone.
	//     NULL if the such object is not found.
	//-----------------------------------------------------------------------
	CXTPCalendarTimeZone* Find(const TIME_ZONE_INFORMATION* pTZI2) const;

public:
	//-----------------------------------------------------------------------
	// Summary:
	//      This structure represents format of binary data stored in the
	//      "TZI" registry key.
	// See also:
	//      Microsoft KB115231, TIME_ZONE_INFORMATION,
	//      XTP_CALENDAR_TZIRegValName_DATA,
	//      XTP_CALENDAR_TIMEZONESKEY_NT, XTP_CALENDAR_TIMEZONESKEY_9X
	//-----------------------------------------------------------------------
	struct REGISTRY_TIMEZONE_INFORMATION
	{
		LONG       Bias;         // Current bias for local time translation on this computer, in minutes.
		LONG       StandardBias; // Bias value to be used during local time translations that occur during standard time.
		LONG       DaylightBias; // Bias value to be used during local time translations that occur during daylight saving time.
		SYSTEMTIME StandardDate; // A SYSTEMTIME structure that contains a date and local time when the transition from daylight saving time to standard time occurs on this operating system.
		SYSTEMTIME DaylightDate; // A SYSTEMTIME structure that contains a date and local time when the transition from standard time to daylight saving time occurs on this operating system.
	};

	//-----------------------------------------------------------------------
	// Summary:
	//      This method is used to read a string value from the registry.
	// Parameters:
	//      hKey          - [in] Parent key handle.
	//      pcszValueName - [in] Value key name.
	//      rstrValue     - [out] CString object reference to store value.
	// Returns:
	//      TRUE - if successful, otherwise - FALSE.
	// See Also: GetRegBSTR()
	//-----------------------------------------------------------------------
	static BOOL GetRegStr(HKEY hKey, LPCTSTR pcszValueName, CString& rstrValue);

	//-----------------------------------------------------------------------
	// Summary:
	//      This method is used to read a UNICODE string value from the registry.
	// Parameters:
	//      hKey           - [in] Parent key handle.
	//      pcszValueNameW - [in] Value key name in the UNICODE format.
	//      rbstrValue     - [out] BSTR object reference to store value.
	// Remarks:
	//      It is used to get UNICODE strings without conversion to MBCS.
	//      If rbstrValue parameter is not NULL the SysFreeString()
	//      API function is called to erase value.
	// Returns:
	//      TRUE - if successful, otherwise - FALSE.
	// See Also: GetRegStr()
	//-----------------------------------------------------------------------
	static BOOL GetRegBSTR(HKEY hKey, LPCWSTR pcszValueNameW, BSTR& rbstrValue);

	//-----------------------------------------------------------------------
	// Summary:
	//      This method is used to read a DWORD value from the registry.
	// Parameters:
	//      hKey          - [in] Parent key handle.
	//      pcszValueName - [in] Value key name.
	//      rdwValue      - [out] DWORD variable reference to store value.
	// Returns:
	//      TRUE - if successful, otherwise - FALSE.
	//-----------------------------------------------------------------------
	static BOOL GetRegDWORD(HKEY hKey, LPCTSTR pcszValueName, DWORD& rdwValue);

	//-----------------------------------------------------------------------
	// Summary:
	//      This method is used to read a time zone information stored as
	//      binary value in the registry.
	// Parameters:
	//      hKey          - [in] Parent key handle.
	//      pcszValueName - [in] Value key name.
	//      rRegTZI       - [out] REGISTRY_TIMEZONE_INFORMATION object
	//                      reference to store value.
	// Returns:
	//      TRUE - if successful, otherwise - FALSE.
	//-----------------------------------------------------------------------
	static BOOL GetRegTZI(HKEY hKey, LPCTSTR pcszValueName, REGISTRY_TIMEZONE_INFORMATION& rRegTZI);

protected:
	//--------------------------------------------------------------
	CXTPCalendarPtrCollectionT<CXTPCalendarTimeZone> m_arTZInfo; // Collection to store CXTPCalendarTimeZone object pointers;

private:
	int CompareTZI(const CXTPCalendarTimeZone* pTZI1,
					const CXTPCalendarTimeZone* pTZI2,
					BOOL bUseIndex) const;

	void ParseDisplayStr(LPCTSTR str, int& rnBias, CString& rstrPlace) const;
	int GetDigit(TCHAR ch) const;

protected:

};

//================================================================


////////////////////////////////////////////////////////////////////////////
#endif // !defined(_XTPCALENDARTIMEZONEHELPER_H__)