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"
41 using namespace Tizen::App;
42 using namespace Tizen::Base;
43 using namespace Tizen::Base::Collection;
44 using namespace Tizen::Base::Utility;
45 using namespace Tizen::Graphics;
46 using namespace Tizen::Media;
48 namespace Tizen { namespace Social
51 _PersonImpl::_PersonImpl()
53 , __hasPhoneNumber(false)
63 _PersonImpl::~_PersonImpl(void)
69 _PersonImpl::Equals(const Object& rhs) const
71 const _PersonImpl* pPersonImpl = dynamic_cast<const _PersonImpl*>(&rhs);
72 if (pPersonImpl == null)
77 if (__personId == pPersonImpl->__personId)
86 _PersonImpl::GetHashCode(void) const
92 _PersonImpl::SetId(int personId)
94 __personId = personId;
98 _PersonImpl::GetId(void) const
104 _PersonImpl::SetIsFavorite(bool isFavorite)
106 __isFavorite = isFavorite;
110 _PersonImpl::IsFavorite(void) const
116 _PersonImpl::SetAddressbookIdString(const String& addressbookIdString)
118 __addressbookIdString = addressbookIdString;
122 _PersonImpl::SetDisplayName(const String& displayName)
124 __displayName = displayName;
128 _PersonImpl::GetDisplayName(void) const
130 return __displayName;
134 _PersonImpl::SetThumbnailPath(const String& thumbnailPath)
136 __thumbnailPath = thumbnailPath;
140 _PersonImpl::GetThumbnailPath(void) const
142 return __thumbnailPath;
146 _PersonImpl::SetRingtonePath(const String& ringtonePath)
148 __ringtonePath = ringtonePath;
152 _PersonImpl::GetRingtonePath(void) const
154 return __ringtonePath;
158 _PersonImpl::SetHasPhoneNumber(bool hasPhoneNumber)
160 __hasPhoneNumber = hasPhoneNumber;
164 _PersonImpl::HasPhoneNumber(void) const
166 return __hasPhoneNumber;
170 _PersonImpl::SetHasEmail(bool hasEmail)
172 __hasEmail = hasEmail;
176 _PersonImpl::HasEmail(void) const
182 _PersonImpl::GetAccountIdsN(void) const
186 if (__pAccountIds == null)
188 _ContactDbMonitor* pContactDbMonitor = _ContactDbMonitor::GetInstance();
189 SysTryReturn(NID_SCL, GetLastResult() != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
190 SysTryReturn(NID_SCL, GetLastResult() == E_SUCCESS, null, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
192 std::unique_ptr<ArrayListT<AccountId> > pAccountIdList(new (std::nothrow) ArrayListT<AccountId>());
193 SysTryReturn(NID_SCL, pAccountIdList != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
195 result r = pAccountIdList->Construct();
196 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
199 StringTokenizer tokenizer(__addressbookIdString, delim);
201 int addressbookId = 0;
204 while (tokenizer.HasMoreTokens())
206 tokenizer.GetNextToken(token);
207 Integer::Parse(token, addressbookId);
208 if (addressbookId == DEFAULT_ADDRESSBOOK_ID)
213 accountId = pContactDbMonitor->GetAccountIdByAddressbookId(addressbookId);
214 SysTryReturn(NID_SCL, GetLastResult() != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
215 SysTryReturn(NID_SCL, GetLastResult() == E_SUCCESS, null, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
219 result r = pAccountIdList->Add(accountId);
220 SysTryReturn(NID_SCL, !IsFailed(r), null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
224 __pAccountIds = std::move(pAccountIdList);
227 std::unique_ptr<ArrayListT<AccountId> > pList(new (std::nothrow) ArrayListT<AccountId>());
228 SysTryReturn(NID_SCL, pList != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
230 result r = pList->Construct(*__pAccountIds);
231 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
233 return pList.release();
237 _PersonImpl::SetAsFavorite(bool isFavorite)
239 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
241 bool boolValue = false;
242 contacts_record_h personHandle = null;
244 int ret = contacts_db_get_record(_contacts_person._uri, __personId, &personHandle);
245 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));
246 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));
248 __ContactsRecordHandle recordHandle(personHandle);
250 contacts_record_get_bool(personHandle, _contacts_person.is_favorite, &boolValue);
252 if (boolValue != isFavorite)
254 contacts_record_set_bool(personHandle, _contacts_person.is_favorite, isFavorite);
256 ret = contacts_db_update_record(personHandle);
257 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));
258 SysTryReturn(NID_SCL, ret == CONTACTS_ERROR_NONE, E_SYSTEM, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
260 __isFavorite = isFavorite;
267 _PersonImpl::SetAsPrimaryPhoneNumber(const PhoneNumber& phoneNumber)
269 int numberId = _PhoneNumberImpl::GetInstance(phoneNumber)->GetRecordId();
271 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));
272 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
274 int ret = contacts_person_set_default_property(CONTACTS_PERSON_PROPERTY_NUMBER, __personId, numberId);
275 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));
276 SysTryReturn(NID_SCL, ret == CONTACTS_ERROR_NONE, E_SYSTEM, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
282 _PersonImpl::SetAsPrimaryEmail(const Email& email)
284 int emailId = _EmailImpl::GetInstance(email)->GetRecordId();
286 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));
287 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
289 int ret = contacts_person_set_default_property(CONTACTS_PERSON_PROPERTY_EMAIL, __personId, emailId);
290 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));
291 SysTryReturn(NID_SCL, ret == CONTACTS_ERROR_NONE, E_SYSTEM, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
298 _PersonImpl::GetPrimaryPhoneNumber(void) const
300 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, PhoneNumber(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
303 char* pCharValue = null;
305 PhoneNumberType type = PHONENUMBER_TYPE_HOME;
307 PhoneNumber primaryPhoneNumber;
309 contacts_record_h currentHandle = null;
311 __Filter<__ContactsPersonNumber> filter;
313 filter.AddInt(_contacts_person_number.person_id, CONTACTS_MATCH_EQUAL, __personId);
314 filter.AddOperator(CONTACTS_FILTER_OPERATOR_AND);
315 filter.AddBool(_contacts_person_email.is_primary_default, true);
317 __Query<__ContactsPersonNumber> query;
319 query.SetFilter(filter);
321 std::unique_ptr<__SearchResult<__ContactsPersonNumber> > pSearchResult(_AddressbookUtil::ExecuteQuery(query));
322 SysTryReturn(NID_SCL, pSearchResult != null, primaryPhoneNumber, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
324 if (pSearchResult->GetCount() == 0)
326 return primaryPhoneNumber;
329 while (pSearchResult->MoveNext() == E_SUCCESS)
331 currentHandle = pSearchResult->GetCurrentRecord();
332 contacts_record_get_int(currentHandle, _contacts_person_number.number_id, &intValue);
334 contacts_record_get_int(currentHandle, _contacts_person_number.number_id, &intValue);
335 _PhoneNumberImpl::GetInstance(primaryPhoneNumber)->SetRecordId(intValue);
337 contacts_record_get_str_p(currentHandle, _contacts_person_number.label, &pCharValue);
338 _PhoneNumberImpl::GetInstance(primaryPhoneNumber)->SetLabel(pCharValue);
340 contacts_record_get_int(currentHandle, _contacts_person_number.type, &intValue);
343 case CONTACTS_NUMBER_TYPE_HOME | CONTACTS_NUMBER_TYPE_VOICE:
344 type = PHONENUMBER_TYPE_HOME;
346 case CONTACTS_NUMBER_TYPE_WORK | CONTACTS_NUMBER_TYPE_VOICE:
347 type = PHONENUMBER_TYPE_WORK;
349 case CONTACTS_NUMBER_TYPE_CELL:
350 type = PHONENUMBER_TYPE_MOBILE;
352 case CONTACTS_NUMBER_TYPE_FAX | CONTACTS_NUMBER_TYPE_HOME:
353 type = PHONENUMBER_TYPE_HOME_FAX;
355 case CONTACTS_NUMBER_TYPE_FAX | CONTACTS_NUMBER_TYPE_WORK:
356 type = PHONENUMBER_TYPE_WORK_FAX;
358 case CONTACTS_NUMBER_TYPE_PAGER:
359 type = PHONENUMBER_TYPE_PAGER;
361 case CONTACTS_NUMBER_TYPE_CUSTOM:
362 type = PHONENUMBER_TYPE_CUSTOM;
364 case CONTACTS_NUMBER_TYPE_ASSISTANT:
365 if (_AppInfo::GetApiVersion() < _API_VERSION_2_1)
367 type = PHONENUMBER_TYPE_OTHER;
371 type = PHONENUMBER_TYPE_ASSISTANT;
375 type = PHONENUMBER_TYPE_OTHER;
379 _PhoneNumberImpl::GetInstance(primaryPhoneNumber)->SetType(type);
381 contacts_record_get_str_p(currentHandle, _contacts_person_number.number, &pCharValue);
382 _PhoneNumberImpl::GetInstance(primaryPhoneNumber)->SetPhoneNumber(pCharValue);
387 return primaryPhoneNumber;
391 _PersonImpl::GetPrimaryEmail(void) const
393 SysTryReturn(NID_SCL, _ContactDbConnector::EnsureDbConnection() == E_SUCCESS, Email(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
396 char* pCharValue = null;
397 EmailType type = EMAIL_TYPE_PERSONAL;
402 contacts_record_h currentHandle = null;
404 __Filter<__ContactsPersonEmail> filter;
406 filter.AddInt(_contacts_person_email.person_id, CONTACTS_MATCH_EQUAL, __personId);
407 filter.AddOperator(CONTACTS_FILTER_OPERATOR_AND);
408 filter.AddBool(_contacts_person_email.is_primary_default, true);
410 __Query<__ContactsPersonEmail> query;
412 query.SetFilter(filter);
414 std::unique_ptr<__SearchResult<__ContactsPersonEmail> > pSearchResult(_AddressbookUtil::ExecuteQuery(query));
415 SysTryReturn(NID_SCL, pSearchResult != null, primaryEmail, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
417 if (pSearchResult->GetCount() == 0)
421 while (pSearchResult->MoveNext() == E_SUCCESS)
423 currentHandle = pSearchResult->GetCurrentRecord();
425 contacts_record_get_int(currentHandle, _contacts_person_email.email_id, &intValue);
426 _EmailImpl::GetInstance(primaryEmail)->SetRecordId(intValue);
428 contacts_record_get_str_p(currentHandle, _contacts_person_email.label, &pCharValue);
429 _EmailImpl::GetInstance(primaryEmail)->SetLabel(pCharValue);
431 contacts_record_get_int(currentHandle, _contacts_person_email.type, &intValue);
434 case CONTACTS_EMAIL_TYPE_HOME:
435 type = EMAIL_TYPE_PERSONAL;
437 case CONTACTS_EMAIL_TYPE_WORK:
438 type = EMAIL_TYPE_WORK;
440 case CONTACTS_EMAIL_TYPE_CUSTOM:
441 type = EMAIL_TYPE_CUSTOM;
443 case CONTACTS_EMAIL_TYPE_MOBILE:
444 if (_AppInfo::GetApiVersion() < _API_VERSION_2_1)
446 type = EMAIL_TYPE_OTHER;
450 type = EMAIL_TYPE_MOBILE;
454 type = EMAIL_TYPE_OTHER;
458 _EmailImpl::GetInstance(primaryEmail)->SetType(type);
460 contacts_record_get_str_p(currentHandle, _contacts_person_email.email, &pCharValue);
461 _EmailImpl::GetInstance(primaryEmail)->SetEmail(pCharValue);
468 _PersonImpl::GetInstance(Person& person)
470 return person.__pPersonImpl;
474 _PersonImpl::GetInstance(const Person& person)
476 return person.__pPersonImpl;