2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
17 * @file FScl_CalendarbookDbMonitor.cpp
18 * @brief This is the implementation for _CalendarbookDbMonitor class.
20 * This file contains definitions of @e _CalendarbookDbMonitor class.
25 #include <unique_ptr.h>
26 #include <calendar2.h>
27 #include <FBaseRtMutex.h>
28 #include <FBaseSysLog.h>
29 #include "FScl_ICalendarbookDbChangeEventListener.h"
30 #include "FScl_CalendarbookDbChangeEvent.h"
31 #include "FScl_CalendarbookDbChangeEventArg.h"
32 #include "FScl_CalendarbookDbMonitor.h"
33 #include "FScl_CalendarbookDbConnector.h"
35 using namespace Tizen::Base;
36 using namespace Tizen::Base::Runtime;
38 namespace Tizen { namespace Social
41 Mutex _CalendarbookDbMonitor::__mutex;
42 int _CalendarbookDbMonitor::__refCnt = 0;
43 _CalendarbookDbMonitor*_CalendarbookDbMonitor::__pCalendarbookDbMonitor = null;
45 _CalendarbookDbMonitor::_CalendarbookCallback::_CalendarbookCallback(void)
48 , __isRegistered(false)
52 _CalendarbookDbMonitor::_CalendarbookCallback::~_CalendarbookCallback(void)
56 calendar_db_remove_changed_cb(_calendar_event._uri, __callback, __pUserData);
57 calendar_db_remove_changed_cb(_calendar_todo._uri, __callback, __pUserData);
62 _CalendarbookDbMonitor::_CalendarbookCallback::Register(calendar_db_changed_cb callback, void* pUserData)
64 int errorCode = CALENDAR_ERROR_NONE;
66 errorCode = calendar_db_add_changed_cb(_calendar_event._uri, callback, pUserData);
67 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_SYSTEM, "A system error has been occurred.");
68 errorCode = calendar_db_add_changed_cb(_calendar_todo._uri, callback, pUserData);
69 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_SYSTEM, "A system error has been occurred.");
71 __callback = callback;
72 __pUserData = pUserData;
73 __isRegistered = true;
78 _CalendarbookDbMonitor::_CalendarbookDbMonitor(void)
83 _CalendarbookDbMonitor::~_CalendarbookDbMonitor(void)
85 result r = _CalendarbookDbConnector::Disconnect();
86 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");
90 _CalendarbookDbMonitor::Construct(void)
94 r = _CalendarbookDbConnector::Connect();
95 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred.");
97 std::unique_ptr<_CalendarbookCallback> pChangeCallback(new (std::nothrow) _CalendarbookCallback());
98 SysTryReturnResult(NID_SCL, pChangeCallback != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
100 r = pChangeCallback->Register(OnCalendarbookDbChanged, this);
101 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred.");
103 std::unique_ptr<_CalendarbookDbChangeEvent> pEvent(new (std::nothrow) _CalendarbookDbChangeEvent());
104 SysTryReturn(NID_SCL, pEvent != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
106 r = pEvent->Construct();
107 SysTryReturn(NID_SCL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
109 __pEvent = std::move(pEvent);
110 __pChangeCallback = std::move(pChangeCallback);
116 _CalendarbookDbMonitor::AddListener(const _ICalendarbookDbChangeEventListener& listener)
118 result r = __mutex.Acquire();
119 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred.");
121 r = __pEvent->AddListener(listener);
122 SysTryCatch(NID_SCL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
124 r = __mutex.Release();
125 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred.");
136 _CalendarbookDbMonitor::RemoveListener(const _ICalendarbookDbChangeEventListener& listener)
138 result r = __mutex.Acquire();
139 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred.");
141 r = __pEvent->RemoveListener(listener);
142 SysTryCatch(NID_SCL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
144 r = __mutex.Release();
145 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred.");
155 _CalendarbookDbMonitor*
156 _CalendarbookDbMonitor::GetInstance(void)
158 result r = E_SUCCESS;
159 static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
161 std::unique_ptr<_CalendarbookDbMonitor> pCalendarbookDbMonitor;
163 if (__pCalendarbookDbMonitor == null)
166 pthread_once(&onceBlock, InitCalendarbookDbMonitor);
167 if (GetLastResult() != E_SUCCESS)
169 onceBlock = PTHREAD_ONCE_INIT;
170 SysLogException(NID_SCL, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");
174 pCalendarbookDbMonitor.reset(new (std::nothrow) _CalendarbookDbMonitor());
175 SysTryReturn(NID_SCL, pCalendarbookDbMonitor != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
177 r = pCalendarbookDbMonitor->Construct();
178 SysTryReturn(NID_SCL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
183 r = __mutex.Acquire();
184 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");
186 if (pCalendarbookDbMonitor != null)
188 __pCalendarbookDbMonitor = pCalendarbookDbMonitor.release();
193 r = __mutex.Release();
194 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");
196 return __pCalendarbookDbMonitor;
200 _CalendarbookDbMonitor::Release(void)
202 result r = __mutex.Acquire();
203 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");
209 delete __pCalendarbookDbMonitor;
210 __pCalendarbookDbMonitor = null;
213 r = __mutex.Release();
214 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");
218 _CalendarbookDbMonitor::OnCalendarbookDbChanged(const char* pViewUri, void* pUserData)
220 _CalendarbookDbMonitor* pCalendarbookDbMonitor = static_cast<_CalendarbookDbMonitor*>(pUserData);
221 _CalendarbookDbChangeEvent* pEvent = pCalendarbookDbMonitor->__pEvent.get();
223 _CalendarbookDbChangeType changeType;
224 if (strcmp(pViewUri, _calendar_event._uri) == 0)
226 changeType = _CALENDARBOOK_DB_CHANGE_TYPE_EVENT;
228 else if (strcmp(pViewUri, _calendar_todo._uri) == 0)
230 changeType = _CALENDARBOOK_DB_CHANGE_TYPE_TODO;
237 std::unique_ptr<_CalendarbookDbChangeEventArg> pArg(new (std::nothrow) _CalendarbookDbChangeEventArg(changeType));
238 SysTryReturnVoidResult(NID_SCL, pArg != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
240 result r = pEvent->Fire(*pArg.get());
241 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
247 _CalendarbookDbMonitor::InitCalendarbookDbMonitor(void)
249 result r = __mutex.Create();
250 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.");