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.
583 lines
14 KiB
C++
583 lines
14 KiB
C++
// XTPCalendarResourcesManager.cpp: implementation of the
|
|
// CXTPCalendarResourcesManager 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/XTPNotifyConnection.h"
|
|
#include "Common/XTPSmartPtrInternalT.h"
|
|
|
|
|
|
#include "XTPCalendarDefines.h"
|
|
#include "XTPCalendarPtrCollectionT.h"
|
|
|
|
#include "XTPCalendarResource.h"
|
|
|
|
#include "XTPCalendarResourcesManager.h"
|
|
#include "XTPCalendarCustomProperties.h"
|
|
|
|
#include "XTPCalendarData.h"
|
|
#include "XTPCalendarControl.h"
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
//=====================================================================
|
|
static const LPCTSTR cszCalendarDPF_SaveOnDestroy = _T("*xtp*CalendarDPF_SaveOnDestroy");
|
|
static const LPCTSTR cszCalendarDPF_CloseOnDestroy = _T("*xtp*CalendarDPF_CloseOnDestroy");
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
IMPLEMENT_DYNAMIC(CXTPCalendarResourceDescription, CCmdTarget)
|
|
IMPLEMENT_DYNCREATE(CXTPCalendarResourcesManager, CCmdTarget)
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
CXTPCalendarResourceDescription::CXTPCalendarResourceDescription()
|
|
{
|
|
m_bEnabled = FALSE;
|
|
m_bGenerateName = TRUE;
|
|
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//class CXTPCalendarResourcesManager
|
|
CXTPCalendarResourcesManager::CXTPCalendarResourcesManager()
|
|
{
|
|
}
|
|
|
|
CXTPCalendarResourcesManager::~CXTPCalendarResourcesManager()
|
|
{
|
|
RemoveAll();
|
|
}
|
|
|
|
void CXTPCalendarResourcesManager::RemoveAll()
|
|
{
|
|
int i, nDPCount = GetDataProvidersCount();
|
|
|
|
for (i = 0; i < nDPCount; i++)
|
|
{
|
|
CXTPCalendarData* pData = GetDataProvider(i);
|
|
_SaveCloseDPifNeed(pData);
|
|
}
|
|
|
|
//------------------------------------
|
|
for (i = nDPCount - 1; i >= 0; i--)
|
|
{
|
|
RemoveDataProvider(i);
|
|
}
|
|
|
|
//------------------------------------
|
|
int nRCCount = GetResourcesCount();
|
|
for (i = nRCCount - 1; i >= 0; i--)
|
|
{
|
|
RemoveResource(i);
|
|
}
|
|
}
|
|
|
|
void CXTPCalendarResourcesManager::_SaveCloseDPifNeed(CXTPCalendarData* pData)
|
|
{
|
|
if (!pData || !pData->GetCustomProperties())
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
|
|
if (!pData->IsOpen())
|
|
{
|
|
return;
|
|
}
|
|
|
|
COleVariant ovarSave((long)0);
|
|
COleVariant ovarClose((long)0);
|
|
BOOL bPropSave = pData->GetCustomProperties()->GetProperty(cszCalendarDPF_SaveOnDestroy, ovarSave);
|
|
BOOL bPropClose = pData->GetCustomProperties()->GetProperty(cszCalendarDPF_CloseOnDestroy, ovarClose);
|
|
|
|
_variant_t vtSave = bPropSave ? ovarSave : (long)0;
|
|
_variant_t vtClose = bPropClose ? ovarClose : (long)0;
|
|
|
|
if ((long)vtSave)
|
|
{
|
|
pData->Save();
|
|
}
|
|
if ((long)vtClose)
|
|
{
|
|
pData->Close();
|
|
}
|
|
}
|
|
//=========================================================================
|
|
BOOL CXTPCalendarResourcesManager::AddDataProvider(LPCTSTR pcszConnectionString, int eDPFlags)
|
|
{
|
|
m_arDataProviders.Add(NULL);
|
|
int nNewIndex = m_arDataProviders.GetCount()-1;
|
|
|
|
BOOL bRes = SetDataProvider(nNewIndex, pcszConnectionString, eDPFlags);
|
|
|
|
if (!bRes && m_arDataProviders.GetAt(nNewIndex) == NULL)
|
|
{
|
|
m_arDataProviders.RemoveAt(nNewIndex);
|
|
}
|
|
return bRes;
|
|
}
|
|
|
|
BOOL CXTPCalendarResourcesManager::SetDataProvider(int nIndex, LPCTSTR pcszConnectionString, int eDPFlags)
|
|
{
|
|
if (nIndex < 0 || nIndex >= m_arDataProviders.GetCount())
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
CXTPCalendarData* pData = CXTPCalendarData::CreateDataProvider(pcszConnectionString);
|
|
if (!pData)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
CXTPCalendarData* pData_prev = m_arDataProviders.GetAt(nIndex);
|
|
if (pData_prev)
|
|
{
|
|
_SaveCloseDPifNeed(pData_prev);
|
|
}
|
|
|
|
//========================================
|
|
m_arDataProviders.SetAt(nIndex, pData);
|
|
|
|
//----------------------------------------
|
|
BOOL bOpen = pData->Open();
|
|
if (!bOpen && (eDPFlags & xtpCalendarDPF_CreateIfNotExists))
|
|
{
|
|
bOpen = pData->Create();
|
|
}
|
|
|
|
if (pData->GetCustomProperties())
|
|
{
|
|
COleVariant ovarSave((long)0);
|
|
COleVariant ovarClose((long)0);
|
|
|
|
if (eDPFlags & xtpCalendarDPF_SaveOnDestroy)
|
|
{
|
|
ovarSave = (long)1;
|
|
}
|
|
if (eDPFlags & xtpCalendarDPF_CloseOnDestroy)
|
|
{
|
|
ovarClose = (long)1;
|
|
}
|
|
VERIFY(pData->GetCustomProperties()->SetProperty(cszCalendarDPF_SaveOnDestroy, ovarSave) );
|
|
VERIFY(pData->GetCustomProperties()->SetProperty(cszCalendarDPF_CloseOnDestroy, ovarClose) );
|
|
}
|
|
return bOpen;
|
|
}
|
|
|
|
int CXTPCalendarResourcesManager::GetDataProvidersCount() const
|
|
{
|
|
return m_arDataProviders.GetCount();
|
|
}
|
|
|
|
CXTPCalendarData* CXTPCalendarResourcesManager::GetDataProvider(int nIndex) const
|
|
{
|
|
if (nIndex >= 0 && nIndex < m_arDataProviders.GetCount())
|
|
{
|
|
return m_arDataProviders.GetAt(nIndex);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
CXTPCalendarData* CXTPCalendarResourcesManager::GetDataProvider(
|
|
LPCTSTR pcszConnectionString, int* pnIndex) const
|
|
{
|
|
int nCount = GetDataProvidersCount();
|
|
for (int i = 0; i < nCount; i++)
|
|
{
|
|
CString strConnStr = GetDataProvider_ConnStr(i);
|
|
if (strConnStr.CompareNoCase(pcszConnectionString) == 0)
|
|
{
|
|
if (pnIndex)
|
|
{
|
|
*pnIndex = i;
|
|
}
|
|
return GetDataProvider(i);
|
|
}
|
|
}
|
|
|
|
if (pnIndex)
|
|
{
|
|
*pnIndex = -1;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
CString CXTPCalendarResourcesManager::GetDataProvider_ConnStr(int nIndex) const
|
|
{
|
|
CXTPCalendarData* pData = GetDataProvider(nIndex);
|
|
|
|
if (pData)
|
|
{
|
|
return pData->GetConnectionString();
|
|
}
|
|
return _T("");
|
|
}
|
|
|
|
void CXTPCalendarResourcesManager::RemoveDataProvider(int nIndex)
|
|
{
|
|
if (nIndex >= 0 && nIndex < m_arDataProviders.GetCount())
|
|
{
|
|
CXTPCalendarData* pData = m_arDataProviders.GetAt(nIndex);
|
|
if (pData && pData->IsOpen())
|
|
{
|
|
pData->Close();
|
|
}
|
|
|
|
m_arDataProviders.RemoveAt(nIndex);
|
|
}
|
|
}
|
|
|
|
//=========================================================================
|
|
BOOL CXTPCalendarResourcesManager::AddResource(LPCTSTR pcszName, BOOL bEnabled)
|
|
{
|
|
CXTPCalendarResourceDescription* pRCDesc = new CXTPCalendarResourceDescription();
|
|
if (!pRCDesc)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//pRCDesc->m_strName = pcszName;
|
|
pRCDesc->m_bEnabled = bEnabled;
|
|
pRCDesc->m_ptrResource = new CXTPCalendarResource();
|
|
|
|
if (!pRCDesc->m_ptrResource)
|
|
{
|
|
return FALSE;
|
|
}
|
|
pRCDesc->m_ptrResource->SetDataProvider((CXTPCalendarData*)NULL);
|
|
pRCDesc->m_ptrResource->SetName(pcszName);
|
|
|
|
m_arResources.Add(pRCDesc, FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
int CXTPCalendarResourcesManager::GetResourcesCount() const
|
|
{
|
|
return m_arResources.GetCount();
|
|
}
|
|
|
|
CXTPCalendarResourceDescription* CXTPCalendarResourcesManager::GetResource(int nIndex) const
|
|
{
|
|
if (nIndex >= 0 && nIndex < m_arResources.GetCount())
|
|
{
|
|
return m_arResources.GetAt(nIndex);
|
|
}
|
|
|
|
ASSERT(FALSE);
|
|
return NULL;
|
|
}
|
|
|
|
void CXTPCalendarResourcesManager::RemoveResource(int nIndex)
|
|
{
|
|
if (nIndex >= 0 && nIndex < m_arResources.GetCount())
|
|
{
|
|
m_arResources.RemoveAt(nIndex);
|
|
}
|
|
else
|
|
{
|
|
ASSERT(FALSE);
|
|
}
|
|
}
|
|
|
|
void CXTPCalendarResourcesManager::MoveResource(int nIndex, int nNewIndex)
|
|
{
|
|
if (nIndex < 0 || nIndex >= m_arResources.GetCount())
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
nNewIndex = max(0, min(nNewIndex, m_arResources.GetCount()-1));
|
|
|
|
CXTPCalendarResourceDescription* pRC = m_arResources.GetAt(nIndex, TRUE); // AddRef. RefCnt + 1
|
|
m_arResources.RemoveAt(nIndex); // Release. RefCnt - 1
|
|
m_arResources.InsertAt(nNewIndex, pRC); // RefCnt - is not changed
|
|
}
|
|
|
|
BOOL CXTPCalendarResourcesManager::SaveCfg(LPCTSTR pcszFile)
|
|
{
|
|
#ifndef _XTP_EXCLUDE_XML
|
|
CXTPPropExchangeXMLNode px(FALSE, 0, _T("CalendarMultiResourcesConfiguration"));
|
|
|
|
_Save(&px);
|
|
|
|
::SetFileAttributes(pcszFile, FILE_ATTRIBUTE_NORMAL);
|
|
::DeleteFile(pcszFile);
|
|
|
|
px.SaveToFile(pcszFile);
|
|
|
|
return TRUE;
|
|
#else
|
|
return FALSE;
|
|
#endif
|
|
}
|
|
|
|
BOOL CXTPCalendarResourcesManager::LoadCfg(LPCTSTR pcszFile)
|
|
{
|
|
#ifndef _XTP_EXCLUDE_XML
|
|
BOOL bResult = FALSE;
|
|
CXTPPropExchangeXMLNode px(TRUE, 0, _T("CalendarMultiResourcesConfiguration"));
|
|
|
|
if (px.LoadFromFile(pcszFile))
|
|
{
|
|
_Load(&px);
|
|
bResult = TRUE;
|
|
}
|
|
|
|
return bResult;
|
|
|
|
#else
|
|
return FALSE;
|
|
#endif
|
|
|
|
}
|
|
|
|
void CXTPCalendarResourcesManager::DoExchangeCfg(CXTPPropExchange* pPX)
|
|
{
|
|
ASSERT(pPX);
|
|
if (!pPX)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (pPX->IsLoading())
|
|
{
|
|
_Load(pPX);
|
|
}
|
|
else
|
|
{
|
|
_Save(pPX);
|
|
}
|
|
}
|
|
|
|
void CXTPCalendarResourcesManager::_Save(CXTPPropExchange* pPX)
|
|
{
|
|
if (!pPX || !pPX->IsStoring())
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
|
|
}
|
|
pPX->ExchangeLocale();
|
|
|
|
CXTPPropExchangeSection secDPs(pPX->GetSection(_T("DataProviders")));
|
|
|
|
int nDPCount = GetDataProvidersCount();
|
|
CXTPPropExchangeEnumeratorPtr ptrEnumDPs(secDPs->GetEnumerator(_T("DataProvider")));
|
|
POSITION posStorage = ptrEnumDPs->GetPosition(nDPCount);
|
|
|
|
for (int nDRNr = 0; nDRNr < nDPCount; nDRNr++)
|
|
{
|
|
CXTPCalendarData* pDP = GetDataProvider(nDRNr);
|
|
ASSERT(pDP);
|
|
if (!pDP)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
CString strConnStr = pDP->GetConnectionString();
|
|
|
|
CXTPPropExchangeSection secDP(ptrEnumDPs->GetNext(posStorage));
|
|
PX_String(&secDP, _T("ConnectionString"), strConnStr);
|
|
}
|
|
|
|
//---------------------
|
|
CXTPPropExchangeSection secResources(pPX->GetSection(_T("Resources")));
|
|
|
|
int nRCCount = GetResourcesCount();
|
|
CXTPPropExchangeEnumeratorPtr ptrEnumRCs(secResources->GetEnumerator(_T("Resource")));
|
|
posStorage = ptrEnumRCs->GetPosition(nRCCount);
|
|
|
|
for (int nRCNr = 0; nRCNr < nRCCount; nRCNr++)
|
|
{
|
|
CXTPCalendarResourceDescription* pRCdesc = GetResource(nRCNr);
|
|
if (!pRCdesc || !pRCdesc->m_ptrResource)
|
|
{
|
|
ASSERT(FALSE);
|
|
continue;
|
|
}
|
|
|
|
CXTPPropExchangeSection secRC(ptrEnumRCs->GetNext(posStorage));
|
|
|
|
CString strRCName = pRCdesc->m_ptrResource->GetName();
|
|
PX_String(&secRC, _T("Name"), strRCName);
|
|
PX_Bool(&secRC, _T("Enabled"), pRCdesc->m_bEnabled);
|
|
PX_Bool(&secRC, _T("GenerateName"), pRCdesc->m_bGenerateName);
|
|
|
|
CXTPCalendarData* pRCdp = pRCdesc->m_ptrResource->GetDataProvider();
|
|
if (pRCdp)
|
|
{
|
|
CString strConnStr = pRCdp->GetConnectionString();
|
|
PX_String(&secRC, _T("ConnectionString"), strConnStr);
|
|
|
|
int nSchIdsCount = 0;
|
|
if (pRCdesc->m_ptrResource->GetSchedules())
|
|
{
|
|
nSchIdsCount = (int)pRCdesc->m_ptrResource->GetSchedules()->GetSize();
|
|
}
|
|
PX_Int(&secRC, _T("SchedulesCount"), nSchIdsCount);
|
|
|
|
CXTPPropExchangeEnumeratorPtr ptrEnumSchIDs(secRC->GetEnumerator(_T("Schedules")));
|
|
POSITION posSchID = ptrEnumSchIDs->GetPosition(nSchIdsCount);
|
|
|
|
for (int k = 0; k < nSchIdsCount; k++)
|
|
{
|
|
CXTPPropExchangeSection secSchID(ptrEnumSchIDs->GetNext(posSchID));
|
|
ULONG ulSchID = pRCdesc->m_ptrResource->GetSchedules()->GetAt(k);
|
|
PX_ULong(&secSchID, _T("ScheduleID"), ulSchID);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CXTPCalendarResourcesManager::_Load(CXTPPropExchange* pPX)
|
|
{
|
|
if (!pPX || !pPX->IsLoading())
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
|
|
}
|
|
|
|
// Clear previous configuration.
|
|
// Data providers will be saved and closed if this was specified.
|
|
RemoveAll();
|
|
|
|
pPX->ExchangeLocale();
|
|
|
|
CXTPPropExchangeSection secDPs(pPX->GetSection(_T("DataProviders")));
|
|
|
|
//int nDPCount = GetDataProvidersCount();
|
|
CXTPPropExchangeEnumeratorPtr ptrEnumDPs(secDPs->GetEnumerator(_T("DataProvider")));
|
|
POSITION posStorage = ptrEnumDPs->GetPosition();
|
|
|
|
while (posStorage)
|
|
{
|
|
CString strConnStr;
|
|
|
|
CXTPPropExchangeSection secDP(ptrEnumDPs->GetNext(posStorage));
|
|
PX_String(&secDP, _T("ConnectionString"), strConnStr);
|
|
|
|
if (!strConnStr.IsEmpty())
|
|
{
|
|
const int eDPFAll = xtpCalendarDPF_CreateIfNotExists |
|
|
xtpCalendarDPF_SaveOnDestroy |
|
|
xtpCalendarDPF_CloseOnDestroy;
|
|
AddDataProvider(strConnStr, eDPFAll);
|
|
}
|
|
}
|
|
|
|
//---------------------
|
|
CXTPPropExchangeSection secResources(pPX->GetSection(_T("Resources")));
|
|
|
|
CXTPPropExchangeEnumeratorPtr ptrEnumRCs(secResources->GetEnumerator(_T("Resource")));
|
|
posStorage = ptrEnumRCs->GetPosition();
|
|
|
|
while (posStorage)
|
|
{
|
|
CXTPPropExchangeSection secRC(ptrEnumRCs->GetNext(posStorage));
|
|
CString strName;
|
|
PX_String(&secRC, _T("Name"), strName);
|
|
BOOL bAdded = AddResource(strName, FALSE);
|
|
|
|
int nRCCount = GetResourcesCount();
|
|
if (!bAdded || !nRCCount)
|
|
{
|
|
ASSERT(FALSE);
|
|
continue;
|
|
}
|
|
|
|
CXTPCalendarResourceDescription* pRCdesc = GetResource(nRCCount - 1);
|
|
if (!pRCdesc || !pRCdesc->m_ptrResource)
|
|
{
|
|
ASSERT(FALSE);
|
|
continue;
|
|
}
|
|
|
|
PX_Bool(&secRC, _T("Enabled"), pRCdesc->m_bEnabled);
|
|
PX_Bool(&secRC, _T("GenerateName"), pRCdesc->m_bGenerateName);
|
|
|
|
|
|
//**********
|
|
CString strConnStr;
|
|
PX_String(&secRC, _T("ConnectionString"), strConnStr);
|
|
CXTPCalendarData* pRCdp = GetDataProvider(strConnStr);
|
|
pRCdesc->m_ptrResource->SetDataProvider(pRCdp);
|
|
|
|
int nSchIdsCount = 0;
|
|
PX_Int(&secRC, _T("SchedulesCount"), nSchIdsCount);
|
|
|
|
if (nSchIdsCount)
|
|
{
|
|
CXTPPropExchangeEnumeratorPtr ptrEnumSchIDs(secRC->GetEnumerator(_T("Schedules")));
|
|
POSITION posSchID = ptrEnumSchIDs->GetPosition();
|
|
|
|
while (posSchID)
|
|
{
|
|
CXTPPropExchangeSection secSchID(ptrEnumSchIDs->GetNext(posSchID));
|
|
ULONG ulSchID = 0;
|
|
if (PX_ULong(&secSchID, _T("ScheduleID"), ulSchID))
|
|
{
|
|
if (pRCdesc->m_ptrResource->GetSchedules())
|
|
{
|
|
pRCdesc->m_ptrResource->GetSchedules()->Add(ulSchID);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CXTPCalendarResourcesManager::ApplyToCalendar(CXTPCalendarControl* pCalendar)
|
|
{
|
|
CXTPCalendarResources arResources;
|
|
|
|
int nRCCount = GetResourcesCount();
|
|
for (int i = 0; i < nRCCount; i++)
|
|
{
|
|
CXTPCalendarResourceDescription* pRCdesc = GetResource(i);
|
|
if (!pRCdesc || !pRCdesc->m_ptrResource)
|
|
{
|
|
ASSERT(FALSE);
|
|
continue;
|
|
}
|
|
if (!pRCdesc->m_bEnabled || !pRCdesc->m_ptrResource->GetDataProvider())
|
|
{
|
|
continue;
|
|
}
|
|
|
|
arResources.Add(pRCdesc->m_ptrResource, TRUE);
|
|
}
|
|
|
|
if (arResources.GetCount())
|
|
{
|
|
pCalendar->SetResources(&arResources);
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|