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_PersonImpl.cpp
19 * @brief This is the implementation for Profile class.
21 * This file contains definitions of @e _PersonImpl class.
24 #include <unique_ptr.h>
25 #include <FBaseSysLog.h>
26 #include <FBaseUtilStringTokenizer.h>
27 #include <FBaseInteger.h>
28 #include <FSclPerson.h>
29 #include <FSclContact.h>
30 #include <FSclCategory.h>
31 #include <FApp_AppInfo.h>
32 #include <FScl_ContactImpl.h>
33 #include <FScl_CategoryImpl.h>
34 #include <FScl_RecordImpl.h>
35 #include "FScl_PersonImpl.h"
36 #include "FScl_EmailImpl.h"
37 #include "FScl_PhoneNumberImpl.h"
38 #include "FScl_AddressbookUtil.h"
39 #include "FScl_ContactDbConnector.h"
40 #include "FScl_ContactDbMonitor.h"
42 using namespace Tizen::App;
43 using namespace Tizen::Base;
44 using namespace Tizen::Base::Collection;
45 using namespace Tizen::Base::Utility;
46 using namespace Tizen::Graphics;
47 using namespace Tizen::Media;
49 namespace Tizen { namespace Social
52 _PersonImpl::_PersonImpl()
54 , __hasPhoneNumber(false)
64 _PersonImpl::~_PersonImpl(void)
70 _PersonImpl::Equals(const Object& rhs) const
72 const _PersonImpl* pPersonImpl = dynamic_cast<const _PersonImpl*>(&rhs);
73 if (pPersonImpl == null)
78 if (__personId == pPersonImpl->__personId)
87 _PersonImpl::GetHashCode(void) const
93 _PersonImpl::SetId(int personId)
95 __personId = personId;
99 _PersonImpl::GetId(void) const
105 _PersonImpl::SetIsFavorite(bool isFavorite)
107 __isFavorite = isFavorite;
111 _PersonImpl::IsFavorite(void) const
117 _PersonImpl::SetAddressbookIdString(const String& addressbookIdString)
119 __addressbookIdString = addressbookIdString;
123 _PersonImpl::SetDisplayName(const String& displayName)
125 __displayName = displayName;
129 _PersonImpl::GetDisplayName(void) const
131 return __displayName;
135 _PersonImpl::SetThumbnailPath(const String& thumbnailPath)
137 __thumbnailPath = thumbnailPath;
141 _PersonImpl::GetThumbnailPath(void) const
143 return __thumbnailPath;
147 _PersonImpl::SetRingtonePath(const String& ringtonePath)
149 __ringtonePath = ringtonePath;
153 _PersonImpl::GetRingtonePath(void) const
155 return __ringtonePath;
159 _PersonImpl::SetHasPhoneNumber(bool hasPhoneNumber)
161 __hasPhoneNumber = hasPhoneNumber;
165 _PersonImpl::HasPhoneNumber(void) const
167 return __hasPhoneNumber;
171 _PersonImpl::SetHasEmail(bool hasEmail)
173 __hasEmail = hasEmail;
177 _PersonImpl::HasEmail(void) const
183 _PersonImpl::GetAccountIdsN(void) const
187 if (__pAccountIds == null)
189 _ContactDbMonitor* pContactDbMonitor = _ContactDbMonitor::GetInstance();
190 SysTryReturn(NID_SCL, GetLastResult() != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
191 SysTryReturn(NID_SCL, GetLastResult() == E_SUCCESS, null, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
193 std::unique_ptr<ArrayListT<AccountId> > pAccountIdList(new (std::nothrow) ArrayListT<AccountId>());
194 SysTryReturn(NID_SCL, pAccountIdList != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
196 result r = pAccountIdList->Construct();
197 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
200 StringTokenizer tokenizer(__addressbookIdString, delim);
202 int addressbookId = 0;
205 while (tokenizer.HasMoreTokens())
207 tokenizer.GetNextToken(token);
208 Integer::Parse(token, addressbookId);
209 if (addressbookId == DEFAULT_ADDRESSBOOK_ID)
214 accountId = pContactDbMonitor->GetAccountIdByAddressbookId(addressbookId);
215 SysTryReturn(NID_SCL, GetLastResult() != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
216 SysTryReturn(NID_SCL, GetLastResult() == E_SUCCESS, null, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
220 result r = pAccountIdList->Add(accountId);
221 SysTryReturn(NID_SCL, !IsFailed(r), null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
225 __pAccountIds = std::move(pAccountIdList);
228 std::unique_ptr<ArrayListT<AccountId> > pList(new (std::nothrow) ArrayListT<AccountId>());
229 SysTryReturn(NID_SCL, pList != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
231 result r = pList->Construct(*__pAccountIds);
232 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
234 return pList.release();
238 _PersonImpl::SetAsFavorite(bool isFavorite)
240 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
242 bool boolValue = false;
243 contacts_record_h personHandle = null;
245 int ret = contacts_db_get_record(_contacts_person._uri, __personId, &personHandle);
246 SysTryReturn(NID_SCL, ret != CONTACTS_ERROR_OUT_OF_MEMORY, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
247 SysTryReturn(NID_SCL, ret != CONTACTS_ERROR_NO_DATA, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[%s] The person is not found.", GetErrorMessage(E_OBJ_NOT_FOUND));
249 __ContactsRecordHandle recordHandle(personHandle);
251 contacts_record_get_bool(personHandle, _contacts_person.is_favorite, &boolValue);
253 if (boolValue != isFavorite)
255 contacts_record_set_bool(personHandle, _contacts_person.is_favorite, isFavorite);
257 ret = contacts_db_update_record(personHandle);
258 SysTryReturn(NID_SCL, ret != CONTACTS_ERROR_OUT_OF_MEMORY, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
259 SysTryReturn(NID_SCL, ret == CONTACTS_ERROR_NONE, E_SYSTEM, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
261 __isFavorite = isFavorite;
268 _PersonImpl::SetAsPrimaryPhoneNumber(const PhoneNumber& phoneNumber)
270 int numberId = _PhoneNumberImpl::GetInstance(phoneNumber)->GetRecordId();
272 SysTryReturn(NID_SCL, numberId > 0, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. The specified number is invalid.", GetErrorMessage(E_INVALID_ARG));
273 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
275 int ret = contacts_person_set_default_property(CONTACTS_PERSON_PROPERTY_NUMBER, __personId, numberId);
276 SysTryReturn(NID_SCL, ret != CONTACTS_ERROR_OUT_OF_MEMORY, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
277 SysTryReturn(NID_SCL, ret == CONTACTS_ERROR_NONE, E_SYSTEM, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
283 _PersonImpl::SetAsPrimaryEmail(const Email& email)
285 int emailId = _EmailImpl::GetInstance(email)->GetRecordId();
287 SysTryReturn(NID_SCL, emailId > 0, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. The specified number is invalid.", GetErrorMessage(E_INVALID_ARG));
288 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
290 int ret = contacts_person_set_default_property(CONTACTS_PERSON_PROPERTY_EMAIL, __personId, emailId);
291 SysTryReturn(NID_SCL, ret != CONTACTS_ERROR_OUT_OF_MEMORY, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
292 SysTryReturn(NID_SCL, ret == CONTACTS_ERROR_NONE, E_SYSTEM, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
299 _PersonImpl::GetPrimaryPhoneNumber(void) const
301 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, PhoneNumber(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
304 char* pCharValue = null;
306 PhoneNumberType type = PHONENUMBER_TYPE_HOME;
308 PhoneNumber primaryPhoneNumber;
310 contacts_record_h currentHandle = null;
312 __Filter<__ContactsPersonNumber> filter;
314 filter.AddInt(_contacts_person_number.person_id, CONTACTS_MATCH_EQUAL, __personId);
315 filter.AddOperator(CONTACTS_FILTER_OPERATOR_AND);
316 filter.AddBool(_contacts_person_email.is_primary_default, true);
318 __Query<__ContactsPersonNumber> query;
320 query.SetFilter(filter);
322 std::unique_ptr<__SearchResult<__ContactsPersonNumber> > pSearchResult(_AddressbookUtil::ExecuteQuery(query));
323 SysTryReturn(NID_SCL, pSearchResult != null, primaryPhoneNumber, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
325 if (pSearchResult->GetCount() == 0)
327 return primaryPhoneNumber;
330 while (pSearchResult->MoveNext() == E_SUCCESS)
332 currentHandle = pSearchResult->GetCurrentRecord();
333 contacts_record_get_int(currentHandle, _contacts_person_number.number_id, &intValue);
335 contacts_record_get_int(currentHandle, _contacts_person_number.number_id, &intValue);
336 _PhoneNumberImpl::GetInstance(primaryPhoneNumber)->SetRecordId(intValue);
338 contacts_record_get_str_p(currentHandle, _contacts_person_number.label, &pCharValue);
339 _PhoneNumberImpl::GetInstance(primaryPhoneNumber)->SetLabel(pCharValue);
341 contacts_record_get_int(currentHandle, _contacts_person_number.type, &intValue);
344 case CONTACTS_NUMBER_TYPE_HOME | CONTACTS_NUMBER_TYPE_VOICE:
345 type = PHONENUMBER_TYPE_HOME;
347 case CONTACTS_NUMBER_TYPE_WORK | CONTACTS_NUMBER_TYPE_VOICE:
348 type = PHONENUMBER_TYPE_WORK;
350 case CONTACTS_NUMBER_TYPE_CELL:
351 type = PHONENUMBER_TYPE_MOBILE;
353 case CONTACTS_NUMBER_TYPE_FAX | CONTACTS_NUMBER_TYPE_HOME:
354 type = PHONENUMBER_TYPE_HOME_FAX;
356 case CONTACTS_NUMBER_TYPE_FAX | CONTACTS_NUMBER_TYPE_WORK:
357 type = PHONENUMBER_TYPE_WORK_FAX;
359 case CONTACTS_NUMBER_TYPE_PAGER:
360 type = PHONENUMBER_TYPE_PAGER;
362 case CONTACTS_NUMBER_TYPE_CUSTOM:
363 type = PHONENUMBER_TYPE_CUSTOM;
365 case CONTACTS_NUMBER_TYPE_ASSISTANT:
366 if (_AppInfo::GetApiVersion() < _API_VERSION_2_1)
368 type = PHONENUMBER_TYPE_OTHER;
372 type = PHONENUMBER_TYPE_ASSISTANT;
376 type = PHONENUMBER_TYPE_OTHER;
380 _PhoneNumberImpl::GetInstance(primaryPhoneNumber)->SetType(type);
382 contacts_record_get_str_p(currentHandle, _contacts_person_number.number, &pCharValue);
383 _PhoneNumberImpl::GetInstance(primaryPhoneNumber)->SetPhoneNumber(pCharValue);
388 return primaryPhoneNumber;
392 _PersonImpl::GetPrimaryEmail(void) const
394 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, Email(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
397 char* pCharValue = null;
398 EmailType type = EMAIL_TYPE_PERSONAL;
403 contacts_record_h currentHandle = null;
405 __Filter<__ContactsPersonEmail> filter;
407 filter.AddInt(_contacts_person_email.person_id, CONTACTS_MATCH_EQUAL, __personId);
408 filter.AddOperator(CONTACTS_FILTER_OPERATOR_AND);
409 filter.AddBool(_contacts_person_email.is_primary_default, true);
411 __Query<__ContactsPersonEmail> query;
413 query.SetFilter(filter);
415 std::unique_ptr<__SearchResult<__ContactsPersonEmail> > pSearchResult(_AddressbookUtil::ExecuteQuery(query));
416 SysTryReturn(NID_SCL, pSearchResult != null, primaryEmail, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
418 if (pSearchResult->GetCount() == 0)
422 while (pSearchResult->MoveNext() == E_SUCCESS)
424 currentHandle = pSearchResult->GetCurrentRecord();
426 contacts_record_get_int(currentHandle, _contacts_person_email.email_id, &intValue);
427 _EmailImpl::GetInstance(primaryEmail)->SetRecordId(intValue);
429 contacts_record_get_str_p(currentHandle, _contacts_person_email.label, &pCharValue);
430 _EmailImpl::GetInstance(primaryEmail)->SetLabel(pCharValue);
432 contacts_record_get_int(currentHandle, _contacts_person_email.type, &intValue);
435 case CONTACTS_EMAIL_TYPE_HOME:
436 type = EMAIL_TYPE_PERSONAL;
438 case CONTACTS_EMAIL_TYPE_WORK:
439 type = EMAIL_TYPE_WORK;
441 case CONTACTS_EMAIL_TYPE_CUSTOM:
442 type = EMAIL_TYPE_CUSTOM;
444 case CONTACTS_EMAIL_TYPE_MOBILE:
445 if (_AppInfo::GetApiVersion() < _API_VERSION_2_1)
447 type = EMAIL_TYPE_OTHER;
451 type = EMAIL_TYPE_MOBILE;
455 type = EMAIL_TYPE_OTHER;
459 _EmailImpl::GetInstance(primaryEmail)->SetType(type);
461 contacts_record_get_str_p(currentHandle, _contacts_person_email.email, &pCharValue);
462 _EmailImpl::GetInstance(primaryEmail)->SetEmail(pCharValue);
469 _PersonImpl::GetInstance(Person& person)
471 return person.__pPersonImpl;
475 _PersonImpl::GetInstance(const Person& person)
477 return person.__pPersonImpl;