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_PersonImpl.cpp
18 * @brief This is the implementation for Profile class.
20 * This file contains definitions of @e _PersonImpl class.
23 #include <unique_ptr.h>
24 #include <FBaseSysLog.h>
25 #include <FBaseUtilStringTokenizer.h>
26 #include <FBaseInteger.h>
27 #include <FSclPerson.h>
28 #include <FSclContact.h>
29 #include <FSclCategory.h>
30 #include <FApp_AppInfo.h>
31 #include <FScl_ContactImpl.h>
32 #include <FScl_CategoryImpl.h>
33 #include <FScl_RecordImpl.h>
34 #include "FScl_PersonImpl.h"
35 #include "FScl_EmailImpl.h"
36 #include "FScl_PhoneNumberImpl.h"
37 #include "FScl_AddressbookUtil.h"
38 #include "FScl_ContactDbConnector.h"
39 #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 unique_ptr<ContactRecord, ContactRecordDeleter> pPersonRecord(_AddressbookUtil::GetContactRecordN(_contacts_person._uri, __personId));
243 SysTryReturn(NID_SCL, pPersonRecord != null, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
245 bool boolValue = false;
246 contacts_record_get_bool(pPersonRecord.get(), _contacts_person.is_favorite, &boolValue);
248 if (boolValue != isFavorite)
250 contacts_record_set_bool(pPersonRecord.get(), _contacts_person.is_favorite, isFavorite);
252 result r = _AddressbookUtil::UpdateContactRecord(pPersonRecord.get());
253 SysTryReturn(NID_SCL, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
255 __isFavorite = isFavorite;
262 _PersonImpl::SetAsPrimaryPhoneNumber(const PhoneNumber& phoneNumber)
264 int numberId = _PhoneNumberImpl::GetInstance(phoneNumber)->GetRecordId();
266 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));
267 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
269 int ret = contacts_person_set_default_property(CONTACTS_PERSON_PROPERTY_NUMBER, __personId, numberId);
270 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));
271 SysTryReturn(NID_SCL, ret == CONTACTS_ERROR_NONE, E_SYSTEM, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
277 _PersonImpl::SetAsPrimaryEmail(const Email& email)
279 int emailId = _EmailImpl::GetInstance(email)->GetRecordId();
281 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));
282 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
284 int ret = contacts_person_set_default_property(CONTACTS_PERSON_PROPERTY_EMAIL, __personId, emailId);
285 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));
286 SysTryReturn(NID_SCL, ret == CONTACTS_ERROR_NONE, E_SYSTEM, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
293 _PersonImpl::GetPrimaryPhoneNumber(void) const
295 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, PhoneNumber(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
298 char* pCharValue = null;
300 PhoneNumberType type = PHONENUMBER_TYPE_HOME;
302 PhoneNumber primaryPhoneNumber;
304 contacts_record_h currentHandle = null;
306 __Filter<__ContactsPersonNumber> filter;
308 filter.AddInt(_contacts_person_number.person_id, CONTACTS_MATCH_EQUAL, __personId);
309 filter.AddOperator(CONTACTS_FILTER_OPERATOR_AND);
310 filter.AddBool(_contacts_person_email.is_primary_default, true);
312 __Query<__ContactsPersonNumber> query;
314 query.SetFilter(filter);
316 std::unique_ptr<__SearchResult<__ContactsPersonNumber> > pSearchResult(_AddressbookUtil::ExecuteQuery(query));
317 SysTryReturn(NID_SCL, pSearchResult != null, primaryPhoneNumber, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
319 if (pSearchResult->GetCount() == 0)
321 return primaryPhoneNumber;
324 while (pSearchResult->MoveNext() == E_SUCCESS)
326 currentHandle = pSearchResult->GetCurrentRecord();
327 contacts_record_get_int(currentHandle, _contacts_person_number.number_id, &intValue);
329 contacts_record_get_int(currentHandle, _contacts_person_number.number_id, &intValue);
330 _PhoneNumberImpl::GetInstance(primaryPhoneNumber)->SetRecordId(intValue);
332 contacts_record_get_str_p(currentHandle, _contacts_person_number.label, &pCharValue);
333 _PhoneNumberImpl::GetInstance(primaryPhoneNumber)->SetLabel(pCharValue);
335 contacts_record_get_int(currentHandle, _contacts_person_number.type, &intValue);
338 case CONTACTS_NUMBER_TYPE_HOME | CONTACTS_NUMBER_TYPE_VOICE:
339 type = PHONENUMBER_TYPE_HOME;
341 case CONTACTS_NUMBER_TYPE_WORK | CONTACTS_NUMBER_TYPE_VOICE:
342 type = PHONENUMBER_TYPE_WORK;
344 case CONTACTS_NUMBER_TYPE_CELL:
345 type = PHONENUMBER_TYPE_MOBILE;
347 case CONTACTS_NUMBER_TYPE_FAX | CONTACTS_NUMBER_TYPE_HOME:
348 type = PHONENUMBER_TYPE_HOME_FAX;
350 case CONTACTS_NUMBER_TYPE_FAX | CONTACTS_NUMBER_TYPE_WORK:
351 type = PHONENUMBER_TYPE_WORK_FAX;
353 case CONTACTS_NUMBER_TYPE_PAGER:
354 type = PHONENUMBER_TYPE_PAGER;
356 case CONTACTS_NUMBER_TYPE_CUSTOM:
357 type = PHONENUMBER_TYPE_CUSTOM;
359 case CONTACTS_NUMBER_TYPE_ASSISTANT:
360 if (_AppInfo::GetApiVersion() < _API_VERSION_2_1)
362 type = PHONENUMBER_TYPE_OTHER;
366 type = PHONENUMBER_TYPE_ASSISTANT;
370 type = PHONENUMBER_TYPE_OTHER;
374 _PhoneNumberImpl::GetInstance(primaryPhoneNumber)->SetType(type);
376 contacts_record_get_str_p(currentHandle, _contacts_person_number.number, &pCharValue);
377 _PhoneNumberImpl::GetInstance(primaryPhoneNumber)->SetPhoneNumber(pCharValue);
382 return primaryPhoneNumber;
386 _PersonImpl::GetPrimaryEmail(void) const
388 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, Email(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
391 char* pCharValue = null;
392 EmailType type = EMAIL_TYPE_PERSONAL;
397 contacts_record_h currentHandle = null;
399 __Filter<__ContactsPersonEmail> filter;
401 filter.AddInt(_contacts_person_email.person_id, CONTACTS_MATCH_EQUAL, __personId);
402 filter.AddOperator(CONTACTS_FILTER_OPERATOR_AND);
403 filter.AddBool(_contacts_person_email.is_primary_default, true);
405 __Query<__ContactsPersonEmail> query;
407 query.SetFilter(filter);
409 std::unique_ptr<__SearchResult<__ContactsPersonEmail> > pSearchResult(_AddressbookUtil::ExecuteQuery(query));
410 SysTryReturn(NID_SCL, pSearchResult != null, primaryEmail, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
412 if (pSearchResult->GetCount() == 0)
416 while (pSearchResult->MoveNext() == E_SUCCESS)
418 currentHandle = pSearchResult->GetCurrentRecord();
420 contacts_record_get_int(currentHandle, _contacts_person_email.email_id, &intValue);
421 _EmailImpl::GetInstance(primaryEmail)->SetRecordId(intValue);
423 contacts_record_get_str_p(currentHandle, _contacts_person_email.label, &pCharValue);
424 _EmailImpl::GetInstance(primaryEmail)->SetLabel(pCharValue);
426 contacts_record_get_int(currentHandle, _contacts_person_email.type, &intValue);
429 case CONTACTS_EMAIL_TYPE_HOME:
430 type = EMAIL_TYPE_PERSONAL;
432 case CONTACTS_EMAIL_TYPE_WORK:
433 type = EMAIL_TYPE_WORK;
435 case CONTACTS_EMAIL_TYPE_CUSTOM:
436 type = EMAIL_TYPE_CUSTOM;
438 case CONTACTS_EMAIL_TYPE_MOBILE:
439 if (_AppInfo::GetApiVersion() < _API_VERSION_2_1)
441 type = EMAIL_TYPE_OTHER;
445 type = EMAIL_TYPE_MOBILE;
449 type = EMAIL_TYPE_OTHER;
453 _EmailImpl::GetInstance(primaryEmail)->SetType(type);
455 contacts_record_get_str_p(currentHandle, _contacts_person_email.email, &pCharValue);
456 _EmailImpl::GetInstance(primaryEmail)->SetEmail(pCharValue);
463 _PersonImpl::GetInstance(Person& person)
465 return person.__pPersonImpl;
469 _PersonImpl::GetInstance(const Person& person)
471 return person.__pPersonImpl;