XTPCalendarResourcesManager.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:14k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPCalendarResourcesManager.cpp: implementation of the
  2. // CXTPCalendarResourcesManager class.
  3. //
  4. // This file is a part of the XTREME CALENDAR MFC class library.
  5. // (c)1998-2008 Codejock Software, All Rights Reserved.
  6. //
  7. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  8. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  9. // CONSENT OF CODEJOCK SOFTWARE.
  10. //
  11. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  12. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  13. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  14. // SINGLE COMPUTER.
  15. //
  16. // CONTACT INFORMATION:
  17. // support@codejock.com
  18. // http://www.codejock.com
  19. //
  20. /////////////////////////////////////////////////////////////////////////////
  21. #include "stdafx.h"
  22. //#include "Resource.h"
  23. //#include "Common/XTPResourceManager.h"
  24. #include "Common/XTPPropExchange.h"
  25. #include "XTPCalendarResourcesManager.h"
  26. #include "XTPCalendarCustomProperties.h"
  27. #include "XTPCalendarControl.h"
  28. #include "XTPCalendarData.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. //=====================================================================
  35. static const LPCTSTR cszCalendarDPF_SaveOnDestroy   = _T("*xtp*CalendarDPF_SaveOnDestroy");
  36. static const LPCTSTR cszCalendarDPF_CloseOnDestroy  = _T("*xtp*CalendarDPF_CloseOnDestroy");
  37. //////////////////////////////////////////////////////////////////////////
  38. IMPLEMENT_DYNAMIC(CXTPCalendarResourceDescription, CCmdTarget)
  39. IMPLEMENT_DYNCREATE(CXTPCalendarResourcesManager, CCmdTarget)
  40. //////////////////////////////////////////////////////////////////////////
  41. CXTPCalendarResourceDescription::CXTPCalendarResourceDescription()
  42. {
  43. m_bEnabled = FALSE;
  44. m_bGenerateName = TRUE;
  45. }
  46. //////////////////////////////////////////////////////////////////////////
  47. //class CXTPCalendarResourcesManager
  48. CXTPCalendarResourcesManager::CXTPCalendarResourcesManager()
  49. {
  50. }
  51. CXTPCalendarResourcesManager::~CXTPCalendarResourcesManager()
  52. {
  53. RemoveAll();
  54. }
  55. void CXTPCalendarResourcesManager::RemoveAll()
  56. {
  57. int i, nDPCount = GetDataProvidersCount();
  58. for (i = 0; i < nDPCount; i++)
  59. {
  60. CXTPCalendarData* pData = GetDataProvider(i);
  61. _SaveCloseDPifNeed(pData);
  62. }
  63. //------------------------------------
  64. for (i = nDPCount - 1; i >= 0; i--)
  65. {
  66. RemoveDataProvider(i);
  67. }
  68. //------------------------------------
  69. int nRCCount = GetResourcesCount();
  70. for (i = nRCCount - 1; i >= 0; i--)
  71. {
  72. RemoveResource(i);
  73. }
  74. }
  75. void CXTPCalendarResourcesManager::_SaveCloseDPifNeed(CXTPCalendarData* pData)
  76. {
  77. if (!pData || !pData->GetCustomProperties())
  78. {
  79. ASSERT(FALSE);
  80. return;
  81. }
  82. if (!pData->IsOpen())
  83. {
  84. return;
  85. }
  86. COleVariant ovarSave((long)0);
  87. COleVariant ovarClose((long)0);
  88. BOOL bPropSave = pData->GetCustomProperties()->GetProperty(cszCalendarDPF_SaveOnDestroy, ovarSave);
  89. BOOL bPropClose = pData->GetCustomProperties()->GetProperty(cszCalendarDPF_CloseOnDestroy, ovarClose);
  90. _variant_t vtSave = bPropSave ? ovarSave : (long)0;
  91. _variant_t vtClose = bPropClose ? ovarClose : (long)0;
  92. if ((long)vtSave)
  93. {
  94. pData->Save();
  95. }
  96. if ((long)vtClose)
  97. {
  98. pData->Close();
  99. }
  100. }
  101. //=========================================================================
  102. BOOL CXTPCalendarResourcesManager::AddDataProvider(LPCTSTR pcszConnectionString,
  103.    int eDPFlags)
  104. {
  105. m_arDataProviders.Add(NULL);
  106. int nNewIndex = m_arDataProviders.GetCount()-1;
  107. BOOL bRes = SetDataProvider(nNewIndex, pcszConnectionString, eDPFlags);
  108. if (!bRes && m_arDataProviders.GetAt(nNewIndex) == NULL)
  109. {
  110. m_arDataProviders.RemoveAt(nNewIndex);
  111. }
  112. return bRes;
  113. }
  114. BOOL CXTPCalendarResourcesManager::SetDataProvider(int nIndex, LPCTSTR pcszConnectionString, int eDPFlags)
  115. {
  116. if (nIndex < 0 || nIndex >= m_arDataProviders.GetCount())
  117. {
  118. return FALSE;
  119. }
  120. CXTPCalendarData* pData = CXTPCalendarControl::CreateDataProvider(pcszConnectionString);
  121. if (!pData)
  122. {
  123. return FALSE;
  124. }
  125. CXTPCalendarData* pData_prev = m_arDataProviders.GetAt(nIndex);
  126. if (pData_prev)
  127. {
  128. _SaveCloseDPifNeed(pData_prev);
  129. }
  130. //========================================
  131. m_arDataProviders.SetAt(nIndex, pData);
  132. //----------------------------------------
  133. BOOL bOpen = pData->Open();
  134. if (!bOpen && (eDPFlags & xtpCalendarDPF_CreateIfNotExists))
  135. {
  136. bOpen = pData->Create();
  137. }
  138. if (pData->GetCustomProperties())
  139. {
  140. COleVariant ovarSave((long)0);
  141. COleVariant ovarClose((long)0);
  142. if (eDPFlags & xtpCalendarDPF_SaveOnDestroy)
  143. {
  144. ovarSave = (long)1;
  145. }
  146. if (eDPFlags & xtpCalendarDPF_CloseOnDestroy)
  147. {
  148. ovarClose = (long)1;
  149. }
  150. VERIFY(pData->GetCustomProperties()->SetProperty(cszCalendarDPF_SaveOnDestroy, ovarSave) );
  151. VERIFY(pData->GetCustomProperties()->SetProperty(cszCalendarDPF_CloseOnDestroy, ovarClose) );
  152. }
  153. return bOpen;
  154. }
  155. int CXTPCalendarResourcesManager::GetDataProvidersCount() const
  156. {
  157. return m_arDataProviders.GetCount();
  158. }
  159. CXTPCalendarData* CXTPCalendarResourcesManager::GetDataProvider(int nIndex)
  160. {
  161. if (nIndex >= 0 && nIndex < m_arDataProviders.GetCount())
  162. {
  163. return m_arDataProviders.GetAt(nIndex);
  164. }
  165. return NULL;
  166. }
  167. CXTPCalendarData* CXTPCalendarResourcesManager::GetDataProvider(
  168. LPCTSTR pcszConnectionString, int* pnIndex)
  169. {
  170. int nCount = GetDataProvidersCount();
  171. for (int i = 0; i < nCount; i++)
  172. {
  173. CString strConnStr = GetDataProvider_ConnStr(i);
  174. if (strConnStr.CompareNoCase(pcszConnectionString) == 0)
  175. {
  176. if (pnIndex)
  177. {
  178. *pnIndex = i;
  179. }
  180. return GetDataProvider(i);
  181. }
  182. }
  183. if (pnIndex)
  184. {
  185. *pnIndex = -1;
  186. }
  187. return NULL;
  188. }
  189. CString CXTPCalendarResourcesManager::GetDataProvider_ConnStr(int nIndex)
  190. {
  191. CXTPCalendarData* pData = GetDataProvider(nIndex);
  192. if (pData)
  193. {
  194. return pData->GetConnectionString();
  195. }
  196. return _T("");
  197. }
  198. void CXTPCalendarResourcesManager::RemoveDataProvider(int nIndex)
  199. {
  200. if (nIndex >= 0 && nIndex < m_arDataProviders.GetCount())
  201. {
  202. CXTPCalendarData* pData = m_arDataProviders.GetAt(nIndex);
  203. if (pData && pData->IsOpen())
  204. {
  205. pData->Close();
  206. }
  207. m_arDataProviders.RemoveAt(nIndex);
  208. }
  209. }
  210. //=========================================================================
  211. BOOL CXTPCalendarResourcesManager::AddResource(LPCTSTR pcszName, BOOL bEnabled)
  212. {
  213. CXTPCalendarResourceDescription* pRCDesc = new CXTPCalendarResourceDescription();
  214. if (!pRCDesc)
  215. {
  216. return FALSE;
  217. }
  218. //pRCDesc->m_strName = pcszName;
  219. pRCDesc->m_bEnabled = bEnabled;
  220. pRCDesc->m_ptrResource = new CXTPCalendarResource();
  221. if (!pRCDesc->m_ptrResource)
  222. {
  223. return FALSE;
  224. }
  225. pRCDesc->m_ptrResource->SetDataProvider((CXTPCalendarData*)NULL);
  226. pRCDesc->m_ptrResource->SetName(pcszName);
  227. m_arResources.Add(pRCDesc, FALSE);
  228. return TRUE;
  229. }
  230. int CXTPCalendarResourcesManager::GetResourcesCount() const
  231. {
  232. return m_arResources.GetCount();
  233. }
  234. CXTPCalendarResourceDescription*
  235. CXTPCalendarResourcesManager::GetResource(int nIndex)
  236. {
  237. if (nIndex >= 0 && nIndex < m_arResources.GetCount())
  238. {
  239. return m_arResources.GetAt(nIndex);
  240. }
  241. ASSERT(FALSE);
  242. return NULL;
  243. }
  244. void CXTPCalendarResourcesManager::RemoveResource(int nIndex)
  245. {
  246. if (nIndex >= 0 && nIndex < m_arResources.GetCount())
  247. {
  248. m_arResources.RemoveAt(nIndex);
  249. }
  250. else
  251. {
  252. ASSERT(FALSE);
  253. }
  254. }
  255. void CXTPCalendarResourcesManager::MoveResource(int nIndex, int nNewIndex)
  256. {
  257. if (nIndex < 0 || nIndex >= m_arResources.GetCount())
  258. {
  259. ASSERT(FALSE);
  260. return;
  261. }
  262. nNewIndex = max(0, min(nNewIndex, m_arResources.GetCount()-1));
  263. CXTPCalendarResourceDescription* pRC = m_arResources.GetAt(nIndex, TRUE); // AddRef. RefCnt + 1
  264. m_arResources.RemoveAt(nIndex); // Release. RefCnt - 1
  265. m_arResources.InsertAt(nNewIndex, pRC); // RefCnt - is not changed
  266. }
  267. BOOL CXTPCalendarResourcesManager::SaveCfg(LPCTSTR pcszFile)
  268. {
  269. #ifndef _XTP_EXCLUDE_XML
  270. CXTPPropExchangeXMLNode px(FALSE, 0, _T("CalendarMultiResourcesConfiguration"));
  271. _Save(&px);
  272. ::SetFileAttributes(pcszFile, FILE_ATTRIBUTE_NORMAL);
  273. ::DeleteFile(pcszFile);
  274. px.SaveToFile(pcszFile);
  275. return TRUE;
  276. #else
  277. return FALSE;
  278. #endif
  279. }
  280. BOOL CXTPCalendarResourcesManager::LoadCfg(LPCTSTR pcszFile)
  281. {
  282. #ifndef _XTP_EXCLUDE_XML
  283. BOOL bResult = FALSE;
  284. CXTPPropExchangeXMLNode px(TRUE, 0, _T("CalendarMultiResourcesConfiguration"));
  285. if (px.LoadFromFile(pcszFile))
  286. {
  287. _Load(&px);
  288. bResult = TRUE;
  289. }
  290. return bResult;
  291. #else
  292. return FALSE;
  293. #endif
  294. }
  295. void CXTPCalendarResourcesManager::DoExchangeCfg(CXTPPropExchange* pPX)
  296. {
  297. ASSERT(pPX);
  298. if (!pPX)
  299. {
  300. return;
  301. }
  302. if (pPX->IsLoading())
  303. {
  304. _Load(pPX);
  305. }
  306. else
  307. {
  308. _Save(pPX);
  309. }
  310. }
  311. void CXTPCalendarResourcesManager::_Save(CXTPPropExchange* pPX)
  312. {
  313. if (!pPX || !pPX->IsStoring())
  314. {
  315. ASSERT(FALSE);
  316. return;
  317. }
  318. pPX->ExchangeLocale();
  319. CXTPPropExchangeSection secDPs(pPX->GetSection(_T("DataProviders")));
  320. int nDPCount = GetDataProvidersCount();
  321. CXTPPropExchangeEnumeratorPtr ptrEnumDPs(secDPs->GetEnumerator(_T("DataProvider")));
  322. POSITION posStorage = ptrEnumDPs->GetPosition(nDPCount);
  323. for (int nDRNr = 0; nDRNr < nDPCount; nDRNr++)
  324. {
  325. CXTPCalendarData* pDP = GetDataProvider(nDRNr);
  326. ASSERT(pDP);
  327. if (!pDP)
  328. {
  329. continue;
  330. }
  331. CString strConnStr = pDP->GetConnectionString();
  332. CXTPPropExchangeSection secDP(ptrEnumDPs->GetNext(posStorage));
  333. PX_String(&secDP, _T("ConnectionString"), strConnStr);
  334. }
  335. //---------------------
  336. CXTPPropExchangeSection secResources(pPX->GetSection(_T("Resources")));
  337. int nRCCount = GetResourcesCount();
  338. CXTPPropExchangeEnumeratorPtr ptrEnumRCs(secResources->GetEnumerator(_T("Resource")));
  339. posStorage = ptrEnumRCs->GetPosition(nRCCount);
  340. for (int nRCNr = 0; nRCNr < nRCCount; nRCNr++)
  341. {
  342. CXTPCalendarResourceDescription* pRCdesc = GetResource(nRCNr);
  343. if (!pRCdesc || !pRCdesc->m_ptrResource)
  344. {
  345. ASSERT(FALSE);
  346. continue;
  347. }
  348. CXTPPropExchangeSection secRC(ptrEnumRCs->GetNext(posStorage));
  349. CString strRCName = pRCdesc->m_ptrResource->GetName();
  350. PX_String(&secRC, _T("Name"), strRCName);
  351. PX_Bool(&secRC, _T("Enabled"), pRCdesc->m_bEnabled);
  352. PX_Bool(&secRC, _T("GenerateName"), pRCdesc->m_bGenerateName);
  353. CXTPCalendarData* pRCdp = pRCdesc->m_ptrResource->GetDataProvider();
  354. if (pRCdp)
  355. {
  356. CString strConnStr = pRCdp->GetConnectionString();
  357. PX_String(&secRC, _T("ConnectionString"), strConnStr);
  358. int nSchIdsCount = 0;
  359. if (pRCdesc->m_ptrResource->GetSchedules())
  360. {
  361. nSchIdsCount = (int)pRCdesc->m_ptrResource->GetSchedules()->GetSize();
  362. }
  363. PX_Int(&secRC, _T("SchedulesCount"), nSchIdsCount);
  364. CXTPPropExchangeEnumeratorPtr ptrEnumSchIDs(secRC->GetEnumerator(_T("Schedules")));
  365. POSITION posSchID = ptrEnumSchIDs->GetPosition(nSchIdsCount);
  366. for (int k = 0; k < nSchIdsCount; k++)
  367. {
  368. CXTPPropExchangeSection secSchID(ptrEnumSchIDs->GetNext(posSchID));
  369. ULONG ulSchID = pRCdesc->m_ptrResource->GetSchedules()->GetAt(k);
  370. PX_ULong(&secSchID, _T("ScheduleID"), ulSchID);
  371. }
  372. }
  373. }
  374. }
  375. void CXTPCalendarResourcesManager::_Load(CXTPPropExchange* pPX)
  376. {
  377. if (!pPX || !pPX->IsLoading())
  378. {
  379. ASSERT(FALSE);
  380. return;
  381. }
  382. // Clear previous configuration.
  383. // Data providers will be saved and closed if this was specified.
  384. RemoveAll();
  385. pPX->ExchangeLocale();
  386. CXTPPropExchangeSection secDPs(pPX->GetSection(_T("DataProviders")));
  387. //int nDPCount = GetDataProvidersCount();
  388. CXTPPropExchangeEnumeratorPtr ptrEnumDPs(secDPs->GetEnumerator(_T("DataProvider")));
  389. POSITION posStorage = ptrEnumDPs->GetPosition();
  390. while (posStorage)
  391. {
  392. CString strConnStr;
  393. CXTPPropExchangeSection secDP(ptrEnumDPs->GetNext(posStorage));
  394. PX_String(&secDP, _T("ConnectionString"), strConnStr);
  395. if (!strConnStr.IsEmpty())
  396. {
  397. const int eDPFAll = xtpCalendarDPF_CreateIfNotExists |
  398. xtpCalendarDPF_SaveOnDestroy |
  399. xtpCalendarDPF_CloseOnDestroy;
  400. AddDataProvider(strConnStr, eDPFAll);
  401. }
  402. }
  403. //---------------------
  404. CXTPPropExchangeSection secResources(pPX->GetSection(_T("Resources")));
  405. CXTPPropExchangeEnumeratorPtr ptrEnumRCs(secResources->GetEnumerator(_T("Resource")));
  406. posStorage = ptrEnumRCs->GetPosition();
  407. while (posStorage)
  408. {
  409. CXTPPropExchangeSection secRC(ptrEnumRCs->GetNext(posStorage));
  410. CString strName;
  411. PX_String(&secRC, _T("Name"), strName);
  412. BOOL bAdded = AddResource(strName, FALSE);
  413. int nRCCount = GetResourcesCount();
  414. if (!bAdded || !nRCCount)
  415. {
  416. ASSERT(FALSE);
  417. continue;
  418. }
  419. CXTPCalendarResourceDescription* pRCdesc = GetResource(nRCCount - 1);
  420. if (!pRCdesc || !pRCdesc->m_ptrResource)
  421. {
  422. ASSERT(FALSE);
  423. continue;
  424. }
  425. PX_Bool(&secRC, _T("Enabled"), pRCdesc->m_bEnabled);
  426. PX_Bool(&secRC, _T("GenerateName"), pRCdesc->m_bGenerateName);
  427. //**********
  428. CString strConnStr;
  429. PX_String(&secRC, _T("ConnectionString"), strConnStr);
  430. CXTPCalendarData* pRCdp = GetDataProvider(strConnStr);
  431. pRCdesc->m_ptrResource->SetDataProvider(pRCdp);
  432. int nSchIdsCount = 0;
  433. PX_Int(&secRC, _T("SchedulesCount"), nSchIdsCount);
  434. if (nSchIdsCount)
  435. {
  436. CXTPPropExchangeEnumeratorPtr ptrEnumSchIDs(secRC->GetEnumerator(_T("Schedules")));
  437. POSITION posSchID = ptrEnumSchIDs->GetPosition();
  438. while (posSchID)
  439. {
  440. CXTPPropExchangeSection secSchID(ptrEnumSchIDs->GetNext(posSchID));
  441. ULONG ulSchID = 0;
  442. if (PX_ULong(&secSchID, _T("ScheduleID"), ulSchID))
  443. {
  444. if (pRCdesc->m_ptrResource->GetSchedules())
  445. {
  446. pRCdesc->m_ptrResource->GetSchedules()->Add(ulSchID);
  447. }
  448. }
  449. }
  450. }
  451. }
  452. }
  453. void CXTPCalendarResourcesManager::ApplyToCalendar(CXTPCalendarControl* pCalendar)
  454. {
  455. CXTPCalendarResources arResources;
  456. int nRCCount = GetResourcesCount();
  457. for (int i = 0; i < nRCCount; i++)
  458. {
  459. CXTPCalendarResourceDescription* pRCdesc = GetResource(i);
  460. if (!pRCdesc || !pRCdesc->m_ptrResource)
  461. {
  462. ASSERT(FALSE);
  463. continue;
  464. }
  465. if (!pRCdesc->m_bEnabled || !pRCdesc->m_ptrResource->GetDataProvider())
  466. {
  467. continue;
  468. }
  469. arResources.Add(pRCdesc->m_ptrResource, TRUE);
  470. }
  471. if (arResources.GetCount())
  472. {
  473. pCalendar->SetResources(&arResources);
  474. }
  475. }
  476. /////////////////////////////////////////////////////////////////////////////