2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
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 ContactsSvcChangeListenerManager.cpp
18 * @author Kisub Song (kisubs.song@samsung.com)
23 #include "ContactsSvcChangeListenerManager.h"
25 #include <contacts-svc.h>
27 #include <dpl/log/log.h>
28 #include <dpl/singleton_impl.h>
29 #include <Commons/Exception.h>
30 #include <Commons/Regex.h>
32 #include "ContactUtility.h"
33 #include "ContactObjectP2AConverter.h"
34 #include "query-svc/query-service.h"
36 IMPLEMENT_SINGLETON(TizenApis::Platform::Contact::ContactsSvcChangeListenerManager)
43 using namespace WrtDeviceApis::Commons;
44 using namespace TizenApis::Api::Contact;
46 ContactsSvcChangeListenerManager::ContactsSvcChangeListenerManager() :
47 EventRequestReceiver< EventInvokeChangeListener >(ThreadEnum::CONTACT_THREAD),
48 m_callbackRegistered(false),
54 ContactsSvcChangeListenerManager::~ContactsSvcChangeListenerManager()
56 if(m_callbackRegistered)
58 unregisterContactSvcChangedCallbacks();
62 void ContactsSvcChangeListenerManager::registerAppListChangedCallbacks(IContactEventCallbacks *callbacks, int addressBookId)
66 LogWarning("Parameter is NULL.");
70 if(getContactEventCallbacks(addressBookId) != NULL)
71 ThrowMsg(PlatformException, "Already registered address book (id:" << addressBookId << ")");
73 if(!m_callbackRegistered)
75 registerContactSvcChangedCallbacks();
78 m_callbacks[addressBookId] = callbacks;
81 void ContactsSvcChangeListenerManager::unregisterAppListChangedCallbacks(IContactEventCallbacks *callbacks)
85 LogWarning("Parameter is NULL.");
89 if(m_callbacks.size() == 0)
91 LogWarning("No callbacks are registered.");
95 ContactEventCallbacksMap::iterator iter = m_callbacks.begin();
96 for(; iter != m_callbacks.end(); iter++)
98 if(iter->second == callbacks)
102 if(iter == m_callbacks.end())
104 LogWarning("Callbacks " << callbacks << " are not registered.");
108 m_callbacks.erase(iter);
110 if(m_callbacks.size() == 0)
112 unregisterContactSvcChangedCallbacks();
116 void ContactsSvcChangeListenerManager::unregisterAppListChangedCallbacks(int addressBookId)
118 if(m_callbacks.size() == 0)
120 LogWarning("No callbacks are registered.");
124 ContactEventCallbacksMap::iterator iter = m_callbacks.find(addressBookId);
125 if(iter == m_callbacks.end())
127 LogWarning("Callbacks for addressbook " << addressBookId << " are not registered.");
131 m_callbacks.erase(iter);
133 if(m_callbacks.size() == 0)
135 unregisterContactSvcChangedCallbacks();
139 long ContactsSvcChangeListenerManager::getWatchIdAndInc()
141 return ++m_watchIdAcc;
144 void ContactsSvcChangeListenerManager::contactsSvcEventCallback(void *data)
146 // This callback is to be called from main thread.
149 LogWarning("contacts-service listener passed NULL user_data");
153 ContactsSvcChangeListenerManager *contactListenerMgr = static_cast<ContactsSvcChangeListenerManager *>(data);
154 contactListenerMgr->contactsSvcEventCallback();
157 void ContactsSvcChangeListenerManager::contactsSvcEventCallback()
159 EventInvokeChangeListenerPtr event(new EventInvokeChangeListener());
161 event->setForAsynchronousCall(NULL);
162 EventRequestReceiver< EventInvokeChangeListener >::PostRequest(event);
165 void ContactsSvcChangeListenerManager::OnRequestReceived(const EventInvokeChangeListenerPtr &event)
168 if(!m_callbackRegistered)
173 ContactEventCallbacksMap::iterator callbacksIter = m_callbacks.begin();
174 for(; callbacksIter != m_callbacks.end(); callbacksIter++)
176 int addressBookId = callbacksIter->first;
177 IContactEventCallbacks *callbacks = callbacksIter->second;
179 CTSiter *iter = NULL;
181 errorCode = contacts_svc_get_updated_contacts(addressBookId, m_latestVersion, &iter);
182 if(errorCode != CTS_SUCCESS)
184 LogDebug("No updated contacts for addressbook : " << addressBookId);
190 int changeVersion = 0;
192 bool existingAddedContacts = false;
193 bool existingUpdatedContacts = false;
194 bool existingRemovedContacts = false;
196 ContactArrayPtr addedContacts(new ContactArray());
197 ContactArrayPtr updatedContacts(new ContactArray());
198 StringArrayPtr removedContactIds(new StringArray());
200 while (contacts_svc_iter_next(iter) == CTS_SUCCESS)
202 CTSstruct *contact= NULL;
203 CTSvalue *row_info = NULL;
204 row_info = contacts_svc_iter_get_info(iter);
206 changeId = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_ID_INT);
207 changeType = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_TYPE_INT);
208 changeVersion = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_VER_INT);
210 if(changeType == CTS_OPERATION_INSERTED)
212 existingAddedContacts = true;
213 contacts_svc_get_contact(changeId, &contact);
215 ContactObjectP2AConverterPtr contactObjConverter(
216 new ContactObjectP2AConverter(contact, false) );
217 ContactPtr absContact = contactObjConverter->getAbstractContact();
218 if(absContact != NULL)
219 addedContacts->push_back(absContact);
223 contacts_svc_struct_free(contact);
228 if(changeType == CTS_OPERATION_UPDATED)
230 existingUpdatedContacts = true;
231 contacts_svc_get_contact(changeId, &contact);
233 ContactObjectP2AConverterPtr contactObjConverter(
234 new ContactObjectP2AConverter(contact, false) );
235 ContactPtr absContact = contactObjConverter->getAbstractContact();
236 if(absContact != NULL)
237 updatedContacts->push_back(absContact);
241 contacts_svc_struct_free(contact);
246 if(changeType == CTS_OPERATION_DELETED)
248 existingRemovedContacts = true;
250 removedContactIds->push_back(ContactUtility::intToStr(changeId));
253 contacts_svc_value_free(row_info);
255 contacts_svc_iter_remove(iter);
257 if(existingAddedContacts)
258 callbacks->onContactEventAdded(addedContacts);
260 if(existingUpdatedContacts)
261 callbacks->onContactEventUpdated(updatedContacts);
263 if(existingRemovedContacts)
264 callbacks->onContactEventRemoved(removedContactIds);
267 m_latestVersion = get_contact_version();
270 void ContactsSvcChangeListenerManager::registerContactSvcChangedCallbacks()
274 if(m_callbackRegistered)
276 LogWarning("Callback already registered.");
280 m_latestVersion = get_contact_version();
282 errorCode = contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE,
283 contactsSvcEventCallback, reinterpret_cast<void *>(this));
284 if(errorCode != CTS_SUCCESS)
286 LogWarning("contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE) returns Error (error");
287 ThrowMsg(InvalidArgumentException, "Error while registering listener to contacts-service");
290 errorCode = contacts_svc_subscribe_change(CTS_SUBSCRIBE_ADDRESSBOOK_CHANGE,
291 refresh_addressbook_list, reinterpret_cast<void *>(this));
292 if(errorCode != CTS_SUCCESS)
294 LogWarning("contacts_svc_subscribe_change(CTS_SUBSCRIBE_ADDRESSBOOK_CHANGE) returns Error (error");
295 ThrowMsg(InvalidArgumentException, "Error while registering listener to contacts-service");
298 m_callbackRegistered = true;
301 void ContactsSvcChangeListenerManager::unregisterContactSvcChangedCallbacks()
305 if(!m_callbackRegistered)
307 LogWarning("Callback already unregistered.");
313 errorCode = contacts_svc_unsubscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE,
314 contactsSvcEventCallback);
315 if(errorCode != CTS_SUCCESS)
317 LogWarning("contacts_svc_unsubscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE) returns Error (error");
318 ThrowMsg(InvalidArgumentException, "Error while unregistering listener to contacts-service");
321 errorCode = contacts_svc_unsubscribe_change(CTS_SUBSCRIBE_ADDRESSBOOK_CHANGE,
322 refresh_addressbook_list);
323 if(errorCode != CTS_SUCCESS)
325 LogWarning("contacts_svc_unsubscribe_change(CTS_SUBSCRIBE_ADDRESSBOOK_CHANGE) returns Error (error");
326 ThrowMsg(InvalidArgumentException, "Error while unregistering listener to contacts-service");
329 m_callbackRegistered = false;
332 IContactEventCallbacks* ContactsSvcChangeListenerManager::getContactEventCallbacks(int id)
334 if(m_callbacks.find(id) == m_callbacks.end())
337 return m_callbacks[id];