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 ContactListenerManager.cpp
18 * @author Kisub Song (kisubs.song@samsung.com)
23 #include "ContactListenerManager.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::ContactListenerManager)
43 using namespace WrtDeviceApis::Commons;
44 using namespace TizenApis::Api::Contact;
46 ContactListenerManager::ContactListenerManager() :
47 m_callbackRegistered(false),
53 ContactListenerManager::~ContactListenerManager()
55 if(m_callbackRegistered)
57 unregisterContactSvcChangedCallbacks();
61 void ContactListenerManager::registerAppListChangedCallbacks(IContactEventCallbacks *callbacks, int addressBookId)
65 LogWarning("Parameter is NULL.");
69 if(getContactEventCallbacks(addressBookId) != NULL)
70 ThrowMsg(PlatformException, "Already registered address book (id:" << addressBookId << ")");
72 if(!m_callbackRegistered)
74 registerContactSvcChangedCallbacks();
77 m_callbacks[addressBookId] = callbacks;
80 void ContactListenerManager::unregisterAppListChangedCallbacks(IContactEventCallbacks *callbacks)
84 LogWarning("Parameter is NULL.");
88 if(m_callbacks.size() == 0)
90 LogWarning("No callbacks are registered.");
94 ContactEventCallbacksMap::iterator iter = m_callbacks.begin();
95 for(; iter != m_callbacks.end(); iter++)
97 if(iter->second == callbacks)
101 if(iter == m_callbacks.end())
103 LogWarning("Callbacks " << callbacks << " are not registered.");
107 m_callbacks.erase(iter);
109 if(m_callbacks.size() == 0)
111 unregisterContactSvcChangedCallbacks();
115 void ContactListenerManager::unregisterAppListChangedCallbacks(int addressBookId)
117 if(m_callbacks.size() == 0)
119 LogWarning("No callbacks are registered.");
123 ContactEventCallbacksMap::iterator iter = m_callbacks.find(addressBookId);
124 if(iter == m_callbacks.end())
126 LogWarning("Callbacks for addressbook " << addressBookId << " are not registered.");
130 m_callbacks.erase(iter);
132 if(m_callbacks.size() == 0)
134 unregisterContactSvcChangedCallbacks();
138 long ContactListenerManager::getWatchIdAndInc()
140 return ++m_watchIdAcc;
143 void ContactListenerManager::contactsSvcEventCallback(void *data)
147 LogWarning("contacts-service listener passed NULL user_data");
151 ContactListenerManager *contactListenerMgr = static_cast<ContactListenerManager *>(data);
152 contactListenerMgr->contactsSvcEventCallback();
155 void ContactListenerManager::contactsSvcEventCallback()
158 if(!m_callbackRegistered)
163 ContactEventCallbacksMap::iterator callbacksIter = m_callbacks.begin();
164 for(; callbacksIter != m_callbacks.end(); callbacksIter++)
166 int addressBookId = callbacksIter->first;
167 IContactEventCallbacks *callbacks = callbacksIter->second;
169 CTSiter *iter = NULL;
171 errorCode = contacts_svc_get_updated_contacts(addressBookId, m_latestVersion, &iter);
172 if(errorCode != CTS_SUCCESS)
174 LogDebug("No updated contacts for addressbook : " << addressBookId);
180 int changeVersion = 0;
182 bool existingAddedContacts = false;
183 bool existingUpdatedContacts = false;
184 bool existingRemovedContacts = false;
186 ContactArrayPtr addedContacts(new ContactArray());
187 ContactArrayPtr updatedContacts(new ContactArray());
188 StringArrayPtr removedContactIds(new StringArray());
190 while (contacts_svc_iter_next(iter) == CTS_SUCCESS)
192 CTSstruct *contact= NULL;
193 CTSvalue *row_info = NULL;
194 row_info = contacts_svc_iter_get_info(iter);
196 changeId = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_ID_INT);
197 changeType = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_TYPE_INT);
198 changeVersion = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_VER_INT);
200 if(changeType == CTS_OPERATION_INSERTED)
202 existingAddedContacts = true;
203 contacts_svc_get_contact(changeId, &contact);
205 ContactObjectP2AConverterPtr contactObjConverter(
206 new ContactObjectP2AConverter(contact, false) );
207 ContactPtr absContact = contactObjConverter->getAbstractContact();
208 if(absContact != NULL)
209 addedContacts->push_back(absContact);
213 contacts_svc_struct_free(contact);
218 if(changeType == CTS_OPERATION_UPDATED)
220 existingUpdatedContacts = true;
221 contacts_svc_get_contact(changeId, &contact);
223 ContactObjectP2AConverterPtr contactObjConverter(
224 new ContactObjectP2AConverter(contact, false) );
225 ContactPtr absContact = contactObjConverter->getAbstractContact();
226 if(absContact != NULL)
227 updatedContacts->push_back(absContact);
231 contacts_svc_struct_free(contact);
236 if(changeType == CTS_OPERATION_DELETED)
238 existingRemovedContacts = true;
240 removedContactIds->push_back(ContactUtility::intToStr(changeId));
243 contacts_svc_value_free(row_info);
245 contacts_svc_iter_remove(iter);
247 if(existingAddedContacts)
248 callbacks->onContactEventAdded(addedContacts);
250 if(existingUpdatedContacts)
251 callbacks->onContactEventUpdated(updatedContacts);
253 if(existingRemovedContacts)
254 callbacks->onContactEventRemoved(removedContactIds);
257 m_latestVersion = get_contact_version();
260 void ContactListenerManager::registerContactSvcChangedCallbacks()
264 if(m_callbackRegistered)
266 LogWarning("Callback already registered.");
270 m_latestVersion = get_contact_version();
272 errorCode = contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE,
273 contactsSvcEventCallback, reinterpret_cast<void *>(this));
274 if(errorCode != CTS_SUCCESS)
276 LogWarning("contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE) returns Error (error");
277 ThrowMsg(InvalidArgumentException, "Error while registering listener to contacts-service");
280 errorCode = contacts_svc_subscribe_change(CTS_SUBSCRIBE_ADDRESSBOOK_CHANGE,
281 refresh_addressbook_list, reinterpret_cast<void *>(this));
282 if(errorCode != CTS_SUCCESS)
284 LogWarning("contacts_svc_subscribe_change(CTS_SUBSCRIBE_ADDRESSBOOK_CHANGE) returns Error (error");
285 ThrowMsg(InvalidArgumentException, "Error while registering listener to contacts-service");
288 m_callbackRegistered = true;
291 void ContactListenerManager::unregisterContactSvcChangedCallbacks()
295 if(!m_callbackRegistered)
297 LogWarning("Callback already unregistered.");
303 errorCode = contacts_svc_unsubscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE,
304 contactsSvcEventCallback);
305 if(errorCode != CTS_SUCCESS)
307 LogWarning("contacts_svc_unsubscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE) returns Error (error");
308 ThrowMsg(InvalidArgumentException, "Error while unregistering listener to contacts-service");
311 errorCode = contacts_svc_unsubscribe_change(CTS_SUBSCRIBE_ADDRESSBOOK_CHANGE,
312 refresh_addressbook_list);
313 if(errorCode != CTS_SUCCESS)
315 LogWarning("contacts_svc_unsubscribe_change(CTS_SUBSCRIBE_ADDRESSBOOK_CHANGE) returns Error (error");
316 ThrowMsg(InvalidArgumentException, "Error while unregistering listener to contacts-service");
319 m_callbackRegistered = false;
322 IContactEventCallbacks* ContactListenerManager::getContactEventCallbacks(int id)
324 if(m_callbacks.find(id) == m_callbacks.end())
327 return m_callbacks[id];