2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 * @file FScl_CalendarbookDbMonitor.cpp
19 * @brief This is the implementation for _CalendarbookDbMonitor class.
21 * This file contains definitions of @e _CalendarbookDbMonitor class.
26 #include <unique_ptr.h>
27 #include <calendar2.h>
28 #include <FBaseRtMutex.h>
29 #include <FBaseSysLog.h>
30 #include "FScl_ICalendarbookDbChangeEventListener.h"
31 #include "FScl_CalendarbookDbChangeEvent.h"
32 #include "FScl_CalendarbookDbChangeEventArg.h"
33 #include "FScl_CalendarbookDbMonitor.h"
34 #include "FScl_CalendarbookDbConnector.h"
36 using namespace Tizen::Base;
37 using namespace Tizen::Base::Runtime;
39 namespace Tizen { namespace Social
42 Mutex _CalendarbookDbMonitor::__mutex;
43 int _CalendarbookDbMonitor::__refCnt = 0;
44 _CalendarbookDbMonitor*_CalendarbookDbMonitor::__pCalendarbookDbMonitor = null;
46 _CalendarbookDbMonitor::_CalendarbookCallback::_CalendarbookCallback(void)
49 , __isRegistered(false)
53 _CalendarbookDbMonitor::_CalendarbookCallback::~_CalendarbookCallback(void)
57 calendar_db_remove_changed_cb(_calendar_event._uri, __callback, __pUserData);
58 calendar_db_remove_changed_cb(_calendar_todo._uri, __callback, __pUserData);
63 _CalendarbookDbMonitor::_CalendarbookCallback::Register(calendar_db_changed_cb callback, void* pUserData)
65 int errorCode = CALENDAR_ERROR_NONE;
67 errorCode = calendar_db_add_changed_cb(_calendar_event._uri, callback, pUserData);
68 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_SYSTEM, "A system error has been occurred.");
69 errorCode = calendar_db_add_changed_cb(_calendar_todo._uri, callback, pUserData);
70 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_SYSTEM, "A system error has been occurred.");
72 __callback = callback;
73 __pUserData = pUserData;
74 __isRegistered = true;
79 _CalendarbookDbMonitor::_CalendarbookDbMonitor(void)
84 _CalendarbookDbMonitor::~_CalendarbookDbMonitor(void)
86 result r = _CalendarbookDbConnector::Disconnect();
87 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");
91 _CalendarbookDbMonitor::Construct(void)
95 r = _CalendarbookDbConnector::Connect();
96 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred.");
98 std::unique_ptr<_CalendarbookCallback> pChangeCallback(new (std::nothrow) _CalendarbookCallback());
99 SysTryReturnResult(NID_SCL, pChangeCallback != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
101 r = pChangeCallback->Register(OnCalendarbookDbChanged, this);
102 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred.");
104 std::unique_ptr<_CalendarbookDbChangeEvent> pEvent(new (std::nothrow) _CalendarbookDbChangeEvent());
105 SysTryReturn(NID_SCL, pEvent != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
107 r = pEvent->Construct();
108 SysTryReturn(NID_SCL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
110 __pEvent = std::move(pEvent);
111 __pChangeCallback = std::move(pChangeCallback);
117 _CalendarbookDbMonitor::AddListener(const _ICalendarbookDbChangeEventListener& listener)
119 result r = __mutex.Acquire();
120 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred.");
122 r = __pEvent->AddListener(listener);
123 SysTryCatch(NID_SCL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
125 r = __mutex.Release();
126 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred.");
137 _CalendarbookDbMonitor::RemoveListener(const _ICalendarbookDbChangeEventListener& listener)
139 result r = __mutex.Acquire();
140 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred.");
142 r = __pEvent->RemoveListener(listener);
143 SysTryCatch(NID_SCL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
145 r = __mutex.Release();
146 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred.");
156 _CalendarbookDbMonitor*
157 _CalendarbookDbMonitor::GetInstance(void)
159 result r = E_SUCCESS;
160 static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
162 std::unique_ptr<_CalendarbookDbMonitor> pCalendarbookDbMonitor;
164 if (__pCalendarbookDbMonitor == null)
167 pthread_once(&onceBlock, InitCalendarbookDbMonitor);
168 if (GetLastResult() != E_SUCCESS)
170 onceBlock = PTHREAD_ONCE_INIT;
171 SysLogException(NID_SCL, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");
175 pCalendarbookDbMonitor.reset(new (std::nothrow) _CalendarbookDbMonitor());
176 SysTryReturn(NID_SCL, pCalendarbookDbMonitor != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
178 r = pCalendarbookDbMonitor->Construct();
179 SysTryReturn(NID_SCL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
184 r = __mutex.Acquire();
185 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");
187 if (pCalendarbookDbMonitor != null)
189 __pCalendarbookDbMonitor = pCalendarbookDbMonitor.release();
194 r = __mutex.Release();
195 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");
197 return __pCalendarbookDbMonitor;
201 _CalendarbookDbMonitor::Release(void)
203 result r = __mutex.Acquire();
204 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");
210 delete __pCalendarbookDbMonitor;
211 __pCalendarbookDbMonitor = null;
214 r = __mutex.Release();
215 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");
219 _CalendarbookDbMonitor::OnCalendarbookDbChanged(const char* pViewUri, void* pUserData)
221 _CalendarbookDbMonitor* pCalendarbookDbMonitor = static_cast<_CalendarbookDbMonitor*>(pUserData);
222 _CalendarbookDbChangeEvent* pEvent = pCalendarbookDbMonitor->__pEvent.get();
224 _CalendarbookDbChangeType changeType;
225 if (strcmp(pViewUri, _calendar_event._uri) == 0)
227 changeType = _CALENDARBOOK_DB_CHANGE_TYPE_EVENT;
229 else if (strcmp(pViewUri, _calendar_todo._uri) == 0)
231 changeType = _CALENDARBOOK_DB_CHANGE_TYPE_TODO;
238 std::unique_ptr<_CalendarbookDbChangeEventArg> pArg(new (std::nothrow) _CalendarbookDbChangeEventArg(changeType));
239 SysTryReturnVoidResult(NID_SCL, pArg != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
241 result r = pEvent->Fire(*pArg.get());
242 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
248 _CalendarbookDbMonitor::InitCalendarbookDbMonitor(void)
250 result r = __mutex.Create();
251 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");