You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
312 lines
7.0 KiB
C++
312 lines
7.0 KiB
C++
// XTPCalendarCustomProperties.cpp: implementation of the
|
|
// CXTPCalendarCustomProperties class.
|
|
//
|
|
// 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
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "Common/XTPPropExchange.h"
|
|
|
|
#include "Common/XTPResourceManager.h"
|
|
|
|
|
|
#include "XTPCalendarCustomProperties.h"
|
|
|
|
|
|
#define XTP_CUSTOM_PROP_DATA_VER 1
|
|
|
|
// 37, 53, 79 , 101, 127, 199, 503
|
|
#define XTP_CUSTOM_PROP_HASH_TABLE_SIZE 127
|
|
|
|
IMPLEMENT_DYNAMIC(CXTPCalendarCustomProperties, CCmdTarget)
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CXTPCalendarCustomProperties::CXTPCalendarCustomProperties(BOOL bNameIgnoreCase)
|
|
{
|
|
m_bNameIgnoreCase = bNameIgnoreCase;
|
|
m_mapProperties.InitHashTable(XTP_CUSTOM_PROP_HASH_TABLE_SIZE, FALSE);
|
|
|
|
}
|
|
|
|
CXTPCalendarCustomProperties::~CXTPCalendarCustomProperties()
|
|
{
|
|
}
|
|
|
|
CString CXTPCalendarCustomProperties::PrepareName(LPCTSTR pcszName) const
|
|
{
|
|
CString strName = pcszName;
|
|
if (m_bNameIgnoreCase)
|
|
{
|
|
strName.MakeLower();
|
|
}
|
|
return strName;
|
|
}
|
|
|
|
BOOL CXTPCalendarCustomProperties::GetProperty(LPCTSTR pcszName, COleVariant& rVarValue) const
|
|
{
|
|
return m_mapProperties.Lookup(PrepareName(pcszName), rVarValue);
|
|
}
|
|
|
|
BOOL CXTPCalendarCustomProperties::SetProperty(LPCTSTR pcszName, const COleVariant& varValue)
|
|
{
|
|
COleVariant varVal = varValue;
|
|
m_mapProperties.SetAt(PrepareName(pcszName), varVal);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CXTPCalendarCustomProperties::RemoveProperty(LPCTSTR pcszName)
|
|
{
|
|
return m_mapProperties.RemoveKey(PrepareName(pcszName));
|
|
}
|
|
|
|
void CXTPCalendarCustomProperties::RemoveAll()
|
|
{
|
|
m_mapProperties.RemoveAll();
|
|
}
|
|
|
|
int CXTPCalendarCustomProperties::GetCount()
|
|
{
|
|
return (int)m_mapProperties.GetCount();
|
|
}
|
|
|
|
POSITION CXTPCalendarCustomProperties::GetStartPosition() const
|
|
{
|
|
return m_mapProperties.GetStartPosition();
|
|
}
|
|
|
|
void CXTPCalendarCustomProperties::GetNextProperty(POSITION& rPos, CString& rStrName, COleVariant& rVarValue) const
|
|
{
|
|
m_mapProperties.GetNextAssoc(rPos, rStrName, rVarValue);
|
|
}
|
|
|
|
void CXTPCalendarCustomProperties::DoPropExchange(CXTPPropExchange* pPX)
|
|
{
|
|
if (!pPX)
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
|
|
if (pPX->IsLoading())
|
|
{
|
|
_Load(pPX);
|
|
}
|
|
else
|
|
{
|
|
_Save(pPX);
|
|
}
|
|
}
|
|
|
|
void CXTPCalendarCustomProperties::_Save(CXTPPropExchange* pPX)
|
|
{
|
|
if (!pPX || !pPX->IsStoring())
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
|
|
CXTPPropExchangeSection secProps(pPX->GetSection(_T("CustomProperties")));
|
|
secProps->EmptySection();
|
|
|
|
long nVersion = XTP_CUSTOM_PROP_DATA_VER;
|
|
PX_Long(&secProps, _T("Version"), nVersion, XTP_CUSTOM_PROP_DATA_VER);
|
|
|
|
int nPropsCount = GetCount();
|
|
CXTPPropExchangeEnumeratorPtr pEnumerator(secProps->GetEnumerator(_T("CustomProperty")));
|
|
POSITION posStorage = pEnumerator->GetPosition(nPropsCount);
|
|
|
|
int nPropSaved = 0;
|
|
POSITION pos = m_mapProperties.GetStartPosition();
|
|
while (pos)
|
|
{
|
|
CString strName;
|
|
COleVariant varValue;
|
|
m_mapProperties.GetNextAssoc(pos, strName, varValue);
|
|
|
|
CXTPPropExchangeSection secProp(pEnumerator->GetNext(posStorage));
|
|
PX_String(&secProp, _T("Name"), strName);
|
|
PX_Variant(&secProp, _T("Value"), varValue, COleVariant((long)0));
|
|
long lVt = varValue.vt;
|
|
PX_Long(&secProp, _T("VariantType"), lVt);
|
|
|
|
nPropSaved++;
|
|
}
|
|
ASSERT(nPropSaved == nPropsCount);
|
|
}
|
|
|
|
void CXTPCalendarCustomProperties::_Load(CXTPPropExchange* pPX)
|
|
{
|
|
if (!pPX || !pPX->IsLoading())
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
m_mapProperties.RemoveAll();
|
|
|
|
CXTPPropExchangeSection secProps(pPX->GetSection(_T("CustomProperties")));
|
|
|
|
long nVersion;
|
|
PX_Long(&secProps, _T("Version"), nVersion, XTP_CUSTOM_PROP_DATA_VER);
|
|
|
|
if (nVersion != XTP_CUSTOM_PROP_DATA_VER)
|
|
{
|
|
TRACE(_T("ERROR! XTPCalendarCustomProperties: Unsupported data file version. (%d) \n"), nVersion);
|
|
return;
|
|
}
|
|
|
|
CXTPPropExchangeEnumeratorPtr pEnumerator(secProps->GetEnumerator(_T("CustomProperty")));
|
|
POSITION posStorage = pEnumerator->GetPosition();
|
|
|
|
while (posStorage)
|
|
{
|
|
CString strName;
|
|
COleVariant varValue;
|
|
|
|
CXTPPropExchangeSection secProp(pEnumerator->GetNext(posStorage));
|
|
PX_String(&secProp, _T("Name"), strName);
|
|
PX_Variant(&secProp, _T("Value"), varValue, COleVariant((long)0));
|
|
|
|
long lVt;
|
|
PX_Long(&secProp, _T("VariantType"), lVt, VT_EMPTY);
|
|
if (lVt != VT_EMPTY && varValue.vt != lVt)
|
|
{
|
|
LCID lcidID = pPX->m_lcidDateTime;
|
|
if (lcidID == XTP_LOCALE_ISO8601)
|
|
{
|
|
lcidID = LOCALE_NEUTRAL;
|
|
}
|
|
COleVariant varValue2;
|
|
|
|
HRESULT hr = VariantChangeTypeEx(&varValue2, &varValue,
|
|
lcidID, 0, (VARTYPE)lVt);
|
|
if (FAILED(hr))
|
|
{
|
|
hr = VariantChangeType(&varValue2, &varValue, 0, (VARTYPE)lVt);
|
|
}
|
|
if (FAILED(hr))
|
|
{
|
|
hr = VariantChangeType(&varValue2, &varValue, VARIANT_NOUSEROVERRIDE, (VARTYPE)lVt);
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
varValue = varValue2;
|
|
}
|
|
else if (varValue.vt == VT_BSTR && (lVt == VT_R4 || lVt == VT_R8 || lVt == VT_DATE))
|
|
{
|
|
CString strValue = varValue.bstrVal;
|
|
strValue.Replace(_T(','), _T('.'));
|
|
double dblVal = atof(XTP_CT2CA(strValue));
|
|
|
|
if (lVt == VT_R4)
|
|
{
|
|
varValue = (float)dblVal;
|
|
}
|
|
else if (lVt == VT_R8)
|
|
{
|
|
varValue = (double)dblVal;
|
|
}
|
|
else if (lVt == VT_DATE)
|
|
{
|
|
varValue = COleDateTime((DATE)dblVal);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ASSERT(FALSE);
|
|
}
|
|
}
|
|
|
|
SetProperty(strName, varValue);
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
void CXTPCalendarCustomProperties::CopyTo(CXTPCalendarCustomProperties* pDest)
|
|
{
|
|
if (!pDest)
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
|
|
pDest->RemoveAll();
|
|
|
|
POSITION pos = GetStartPosition();
|
|
while (pos)
|
|
{
|
|
|
|
CString strName;
|
|
COleVariant varValue;
|
|
GetNextProperty(pos, strName, varValue);
|
|
|
|
VERIFY(pDest->SetProperty(strName, varValue));
|
|
}
|
|
}
|
|
|
|
BOOL CXTPCalendarCustomProperties::LoadFromXML(LPCTSTR pcszXMLData)
|
|
{
|
|
if (!pcszXMLData)
|
|
{
|
|
ASSERT(FALSE);
|
|
return FALSE;
|
|
}
|
|
|
|
RemoveAll();
|
|
|
|
if (*pcszXMLData == _T('\0'))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
#ifndef _XTP_EXCLUDE_XML
|
|
CXTPPropExchangeXMLNode propPX(TRUE, 0, _T("Calendar"));
|
|
if (!propPX.LoadFromString(pcszXMLData))
|
|
return FALSE;
|
|
|
|
propPX.ExchangeLocale();
|
|
|
|
DoPropExchange(&propPX);
|
|
|
|
return TRUE;
|
|
#else
|
|
return FALSE;
|
|
#endif
|
|
}
|
|
|
|
BOOL CXTPCalendarCustomProperties::SaveToXML(CString& rstrXMLData)
|
|
{
|
|
|
|
#ifndef _XTP_EXCLUDE_XML
|
|
CXTPPropExchangeXMLNode propPX(FALSE, 0, _T("Calendar"));
|
|
propPX.ExchangeLocale();
|
|
|
|
DoPropExchange(&propPX);
|
|
|
|
rstrXMLData = propPX.GetXML();
|
|
return TRUE;
|
|
#else
|
|
return FALSE;
|
|
#endif
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|