From 44903ebfb20d9ad5c1ace3f66c5a86ae466cc022 Mon Sep 17 00:00:00 2001 From: Rafal Galka Date: Tue, 30 Dec 2014 18:10:23 +0100 Subject: [PATCH] [Contact] {add|remove}AddressBook implementation [Verification] Following TCT should pass: - AddressBook_constructor - ContactManager_addAddressBook_exist - ContactManager_removeAddressBook_exist Change-Id: I529231699bac5b4b0108905467c0e13415aca5d7 --- src/contact/contact_instance.cc | 19 ++++- src/contact/contact_instance.h | 3 + src/contact/contact_manager.cc | 111 +++++++++++++++++++------ src/contact/contact_manager.h | 4 + src/contact/js/tizen.contact.AddressBook.js | 48 +++++++---- src/contact/js/tizen.contact.ContactManager.js | 87 +++++++++++++++++-- 6 files changed, 223 insertions(+), 49 deletions(-) diff --git a/src/contact/contact_instance.cc b/src/contact/contact_instance.cc index 20bca6a..e11cc6a 100644 --- a/src/contact/contact_instance.cc +++ b/src/contact/contact_instance.cc @@ -36,6 +36,8 @@ ContactInstance::ContactInstance() { // Contact Manager REGISTER_ASYNC("ContactManager_getAddressBooks", ContactManager_getAddressBooks); REGISTER_SYNC("ContactManager_getAddressBook", ContactManager_getAddressBook); + REGISTER_SYNC("ContactManager_addAddressBook", ContactManager_addAddressBook); + REGISTER_SYNC("ContactManager_removeAddressBook", ContactManager_removeAddressBook); REGISTER_SYNC("ContactManager_get", ContactManager_get); REGISTER_SYNC("ContactManager_update", ContactManager_update); REGISTER_ASYNC("ContactManager_updateBatch", ContactManager_updateBatch); @@ -283,14 +285,27 @@ void ContactInstance::ContactManager_getAddressBooks(const JsonValue& args, Json std::shared_ptr(new JsonValue(JsonObject()))); } -void ContactInstance::ContactManager_getAddressBook(const JsonValue& args, - JsonObject& out) { +void ContactInstance::ContactManager_getAddressBook(const JsonValue& args, JsonObject& out) { JsonValue val{JsonObject{}}; ContactManager::ContactManager_getAddressBook( common::JsonCast(args), val.get()); ReportSuccess(val, out); } +void ContactInstance::ContactManager_addAddressBook(const JsonValue& args, JsonObject& out) { + JsonValue val{JsonObject{}}; + ContactManager::ContactManager_addAddressBook( + common::JsonCast(args), val.get()); + ReportSuccess(val, out); +} + +void ContactInstance::ContactManager_removeAddressBook(const JsonValue& args, JsonObject& out) { + JsonValue val{JsonObject{}}; + ContactManager::ContactManager_removeAddressBook( + common::JsonCast(args), val.get()); + ReportSuccess(val, out); +} + void ContactInstance::AddressBook_startListening(const JsonValue& args, JsonObject& out) { JsonValue val{JsonObject{}}; AddressBook::AddressBook_startListening(common::JsonCast(args), diff --git a/src/contact/contact_instance.h b/src/contact/contact_instance.h index 3e4df59..22fe6aa 100644 --- a/src/contact/contact_instance.h +++ b/src/contact/contact_instance.h @@ -71,6 +71,9 @@ class ContactInstance : public common::ParsedInstance { */ void ContactManager_getAddressBook(const JsonValue& args, JsonObject& out); + void ContactManager_addAddressBook(const JsonValue& args, JsonObject& out); + void ContactManager_removeAddressBook(const JsonValue& args, JsonObject& out); + /** * Signature: @code Person get(personId); @endcode * JSON: @code data: {method: 'ContactManager_get', diff --git a/src/contact/contact_manager.cc b/src/contact/contact_manager.cc index b1e794e..d740912 100644 --- a/src/contact/contact_manager.cc +++ b/src/contact/contact_manager.cc @@ -77,21 +77,19 @@ void ContactManager_getAddressBooks(const JsonObject &args, JsonArray &out) { } int id = 0; + int account_id = 0; int mode = 0; char *name = nullptr; - try { - ContactUtil::GetIntFromRecord(contacts_record, _contacts_address_book.id, &id); - ContactUtil::GetIntFromRecord(contacts_record, _contacts_address_book.mode, &mode); - ContactUtil::GetStrFromRecord(contacts_record, _contacts_address_book.name, &name); - } - catch (...) { - LoggerW("Fail to get data from address book"); - continue; - } + ContactUtil::GetIntFromRecord(contacts_record, _contacts_address_book.id, &id); + ContactUtil::GetIntFromRecord(contacts_record, _contacts_address_book.account_id, &account_id); + ContactUtil::GetIntFromRecord(contacts_record, _contacts_address_book.mode, &mode); + ContactUtil::GetStrFromRecord(contacts_record, _contacts_address_book.name, &name); JsonValue single = JsonValue(JsonObject()); JsonObject &single_obj = single.get(); + single_obj["id"] = JsonValue(std::to_string(id)); + single_obj["accountId"] = JsonValue(static_cast(account_id)); single_obj["name"] = JsonValue(name); single_obj["readOnly"] = JsonValue(CONTACTS_ADDRESS_BOOK_MODE_READONLY == mode); out.push_back(single); @@ -104,35 +102,34 @@ void ContactManager_getAddressBook(const JsonObject& args, JsonObject& out) { ContactUtil::CheckDBConnection(); long address_book_id; try { - address_book_id = common::stol(FromJson(args, "addressBookID")); - } - catch (const common::InvalidValuesException&) { + address_book_id = common::stol(FromJson(args, "addressBookId")); + } catch (const common::InvalidValuesException&) { throw common::NotFoundException("Invalid id"); } contacts_record_h contacts_record; int error_code = contacts_db_get_record(_contacts_address_book._uri, - address_book_id, &contacts_record); + static_cast(address_book_id), &contacts_record); if (CONTACTS_ERROR_NONE != error_code || nullptr == contacts_record) { LoggerE("Fail to get addressbook record, error code: %d", error_code); throw NotFoundException("Fail to get address book with given id"); } - ContactUtil::ContactsRecordHPtr contacts_record_ptr( - &contacts_record, ContactUtil::ContactsDeleter); + ContactUtil::ContactsRecordHPtr contacts_record_ptr(&contacts_record, + ContactUtil::ContactsDeleter); + + int account_id; + ContactUtil::GetIntFromRecord(contacts_record, _contacts_address_book.account_id, &account_id); - int mode = 0; - ContactUtil::GetIntFromRecord(contacts_record, _contacts_address_book.mode, - &mode); + int mode; + ContactUtil::GetIntFromRecord(contacts_record, _contacts_address_book.mode, &mode); - char* name = nullptr; - ContactUtil::GetStrFromRecord(contacts_record, _contacts_address_book.name, - &name); + char* name; + ContactUtil::GetStrFromRecord(contacts_record, _contacts_address_book.name, &name); + out.insert(std::make_pair("accountId", static_cast(account_id))); out.insert(std::make_pair("name", std::string(name))); - out.insert(std::make_pair( - "readOnly", - ((CONTACTS_ADDRESS_BOOK_MODE_READONLY == mode) ? "true" : "false"))); + out.insert(std::make_pair("readOnly", (CONTACTS_ADDRESS_BOOK_MODE_READONLY == mode))); } namespace { @@ -152,6 +149,72 @@ void ContactManager_get_internal(int person_id, JsonObject* out) { } } +void ContactManager_addAddressBook(const JsonObject &args, JsonObject &out) { + ContactUtil::CheckDBConnection(); + + const JsonObject &addressBook = FromJson(args, "addressBook"); + + if (!IsNull(addressBook, "id")) { + LoggerW("AddressBook already exists"); + throw common::UnknownException("AddressBook already exists"); + } + + contacts_record_h contacts_record; + int ret = contacts_record_create(_contacts_address_book._uri, &contacts_record); + if (CONTACTS_ERROR_NONE != ret) { + LoggerE("Failed to create address book record, error code : %d", ret); + throw UnknownException("Failed to create address book record"); + } + ContactUtil::ContactsRecordHPtr contacts_record_ptr(&contacts_record, + ContactUtil::ContactsDeleter); + + ContactUtil::SetStrInRecord(contacts_record, _contacts_address_book.name, + FromJson(addressBook, "name").c_str()); + + contacts_address_book_mode_e mode = FromJson(addressBook, "readOnly") ? + CONTACTS_ADDRESS_BOOK_MODE_READONLY : CONTACTS_ADDRESS_BOOK_MODE_NONE; + ContactUtil::SetIntInRecord(contacts_record, _contacts_address_book.mode, + static_cast(mode)); + + double account_id = FromJson(addressBook, "accountId"); + ContactUtil::SetIntInRecord(contacts_record, _contacts_address_book.account_id, + static_cast(account_id)); + + int address_book_id; + ret = contacts_db_insert_record(*contacts_record_ptr, &address_book_id); + if (CONTACTS_ERROR_NONE != ret) { + LoggerE("Failed to insert address book record, error code: %d", ret); + throw UnknownException("Failed to insert address book record"); + } + + out.insert(std::make_pair("id", std::to_string(address_book_id))); +} + +void ContactManager_removeAddressBook(const JsonObject &args, JsonObject &out) { + ContactUtil::CheckDBConnection(); + long address_book_id; + try { + address_book_id = common::stol(FromJson(args, "addressBookId")); + } catch (const common::InvalidValuesException&) { + throw common::NotFoundException("Invalid id"); + } + + contacts_record_h contacts_record; + int error_code = contacts_db_get_record(_contacts_address_book._uri, + static_cast(address_book_id), &contacts_record); + if (CONTACTS_ERROR_NONE != error_code || nullptr == contacts_record) { + LoggerE("Fail to get addressbook record, error code: %d", error_code); + throw NotFoundException("Fail to get address book with given id"); + } + + int ret = contacts_db_delete_record(_contacts_address_book._uri, + static_cast(address_book_id)); + if (CONTACTS_ERROR_NONE != ret) { + LOGE("Failed to delete address book record, error code : %d", ret); + throw UnknownException("Failed to delete address book record"); + } +} + void ContactManager_get(const JsonObject& args, JsonObject& out) { ContactUtil::CheckDBConnection(); long person_id = common::stol(FromJson(args, "personId")); diff --git a/src/contact/contact_manager.h b/src/contact/contact_manager.h index 06d2c43..6962743 100644 --- a/src/contact/contact_manager.h +++ b/src/contact/contact_manager.h @@ -28,6 +28,10 @@ void ContactManager_getAddressBooks(const JsonObject& args, JsonArray& out); void ContactManager_getAddressBook(const JsonObject& args, JsonObject& out); +void ContactManager_addAddressBook(const JsonObject& args, JsonObject& out); + +void ContactManager_removeAddressBook(const JsonObject& args, JsonObject& out); + void ContactManager_get(const JsonObject& args, JsonObject& out); void ContactManager_update(const JsonObject& args, JsonObject&); diff --git a/src/contact/js/tizen.contact.AddressBook.js b/src/contact/js/tizen.contact.AddressBook.js index 3ea5198..12190ab 100644 --- a/src/contact/js/tizen.contact.AddressBook.js +++ b/src/contact/js/tizen.contact.AddressBook.js @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +var DEFAULT_ADDRESSBOOK_ID = '0'; +var UNIFIED_ADDRESSBOOK_ID = '-1'; + var _contactListenerRegistered = false; var _contactCallbackMap = {}; @@ -16,7 +19,7 @@ var _filterById = function(array, id) { }; var _contactChangeListener = function(result) { - var unifiedId = -1; + var unifiedId = UNIFIED_ADDRESSBOOK_ID; var watchId; var i; @@ -43,7 +46,7 @@ var _contactChangeListener = function(result) { } for (var callbackAddressbookId in _contactCallbackMap) { - if (callbackAddressbookId !== -1 && + if (callbackAddressbookId !== UNIFIED_ADDRESSBOOK_ID && _contactCallbackMap.hasOwnProperty(callbackAddressbookId)) { var filteredAdded = []; @@ -83,53 +86,62 @@ var _contactChangeListener = function(result) { }; -var AddressBook = function(id, name, readOnly) { +var AddressBook = function(accountId, name) { AV.isConstructorCall(this, AddressBook); - var _id = ''; - var _name = ''; - var _readOnly = false; + var id_ = null; + var name_ = ''; + var readOnly_ = false; + var accountId_ = null; - if (Type.isString(id)) { - _id = id; + if (Type.isNumber(accountId)) { + accountId_ = accountId; } if (Type.isString(name)) { - _name = name; - } - if (Type.isBoolean(readOnly)) { - _readOnly = readOnly; + name_ = name; } Object.defineProperties(this, { id: { get: function() { - return _id; + return id_; + }, + set: function(v) { + if (_editGuard.isEditEnabled()) { + id_ = Converter.toString(v, false); + } + }, + enumerable: true + }, + accountId: { + get: function() { + return accountId_; }, set: function(v) { if (_editGuard.isEditEnabled()) { - _id = Converter.toString(v, false); + accountId_ = Converter.toLong(v, true); } }, enumerable: true }, name: { get: function() { - return _name; + return name_; }, set: function(v) { if (_editGuard.isEditEnabled()) { - _name = Converter.toString(v, false); + name_ = Converter.toString(v, false); } }, enumerable: true }, readOnly: { get: function() { - return _readOnly; + return readOnly_; }, set: function(v) { if (_editGuard.isEditEnabled()) { - _readOnly = Converter.toBoolean(v, false); + readOnly_ = Converter.toBoolean(v, false); } }, enumerable: true diff --git a/src/contact/js/tizen.contact.ContactManager.js b/src/contact/js/tizen.contact.ContactManager.js index 9d1914c..c27b512 100644 --- a/src/contact/js/tizen.contact.ContactManager.js +++ b/src/contact/js/tizen.contact.ContactManager.js @@ -52,7 +52,13 @@ ContactManager.prototype.getAddressBooks = function() { var tmp = []; books.forEach(function(data) { - tmp.push(new AddressBook(data.id, data.name, data.readOnly)); + return _editGuard.run(function() { + var addressBook = new AddressBook(result.accountId, result.name); + addressBook.id = data.id; + addressBook.readOnly = result.readOnly; + + tmp.push(addressBook); + }); }); native_.callIfPossible(args.successCallback, tmp); @@ -71,13 +77,19 @@ ContactManager.prototype.getUnifiedAddressBook = function() { // 'You do not have privileges for this operation'); //} - return new AddressBook(-1, 'Unified address book', false); + return _editGuard.run(function() { + var addressBook = new AddressBook(0, 'Unified address book'); + addressBook.id = UNIFIED_ADDRESSBOOK_ID; + addressBook.readOnly = false; + + return addressBook; + }); }; // Gets the default address book. ContactManager.prototype.getDefaultAddressBook = function() { //privileges are checked in getAddressBook function - return this.getAddressBook(0); + return this.getAddressBook(DEFAULT_ADDRESSBOOK_ID); }; // Gets the address book with the specified identifier. @@ -95,7 +107,7 @@ ContactManager.prototype.getAddressBook = function() { } var result = native_.callSync('ContactManager_getAddressBook', { - addressBookID: args.addressBookId + addressBookId: args.addressBookId }); if (native_.isFailure(result)) { @@ -104,7 +116,72 @@ ContactManager.prototype.getAddressBook = function() { result = native_.getResultObject(result); - return new AddressBook(args.addressBookId, result.name, Boolean(result.readOnly === 'true')); + return _editGuard.run(function() { + var addressBook = new AddressBook(result.accountId, result.name); + addressBook.id = args.addressBookId; + addressBook.readOnly = result.readOnly; + + return addressBook; + }); +}; + +ContactManager.prototype.addAddressBook = function() { + var args = AV.validateArgs(arguments, [{ + name: 'addressBook', + type: AV.Types.PLATFORM_OBJECT, + values: tizen.AddressBook, + optional: false, + nullable: false + }]); + + var result = native_.callSync('ContactManager_addAddressBook', { + addressBook: args.addressBook + }); + + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } + + var data = native_.getResultObject(result); + _editGuard.run(function() { + for (var prop in data) { + if (args.addressBook.hasOwnProperty(prop)) { + args.addressBook[prop] = data[prop]; + } + } + }); +}; + +ContactManager.prototype.removeAddressBook = function() { + // TCT: ContactManager_removeAddressBook_misarg + if (Type.isNullOrUndefined(arguments[0])) { + throw new tizen.WebAPIException(tizen.WebAPIException.INVALID_VALUES_ERR); + } + + var args = AV.validateArgs(arguments, [{ + name: 'addressBookId', + type: AV.Types.STRING, + optional: false, + nullable: false + }]); + + if (args.addressBookId === UNIFIED_ADDRESSBOOK_ID) { + throw new tizen.WebAPIException(tizen.WebAPIException.INVALID_VALUES_ERR, + 'Unified address book can not be deleted'); + } + + if (args.addressBookId === DEFAULT_ADDRESSBOOK_ID) { + throw new tizen.WebAPIException(tizen.WebAPIException.INVALID_VALUES_ERR, + 'Default address book can not be deleted'); + } + + var result = native_.callSync('ContactManager_removeAddressBook', { + addressBookId: args.addressBookId + }); + + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } }; // Gets the person with the specified identifier. -- 2.7.4