[Contact] {add|remove}AddressBook implementation
authorRafal Galka <r.galka@samsung.com>
Tue, 30 Dec 2014 17:10:23 +0000 (18:10 +0100)
committerRafal Galka <r.galka@samsung.com>
Wed, 31 Dec 2014 09:40:21 +0000 (18:40 +0900)
[Verification] Following TCT should pass:
- AddressBook_constructor
- ContactManager_addAddressBook_exist
- ContactManager_removeAddressBook_exist

Change-Id: I529231699bac5b4b0108905467c0e13415aca5d7

src/contact/contact_instance.cc
src/contact/contact_instance.h
src/contact/contact_manager.cc
src/contact/contact_manager.h
src/contact/js/tizen.contact.AddressBook.js
src/contact/js/tizen.contact.ContactManager.js

index 20bca6a8b323959e8ab2b0e2c5934b021ead399f..e11cc6a12a84fe2178011be6fe11a9100e1e2ee2 100644 (file)
@@ -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<JsonValue>(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<JsonObject>(args), val.get<JsonObject>());
   ReportSuccess(val, out);
 }
 
+void ContactInstance::ContactManager_addAddressBook(const JsonValue& args, JsonObject& out) {
+  JsonValue val{JsonObject{}};
+  ContactManager::ContactManager_addAddressBook(
+      common::JsonCast<JsonObject>(args), val.get<JsonObject>());
+  ReportSuccess(val, out);
+}
+
+void ContactInstance::ContactManager_removeAddressBook(const JsonValue& args, JsonObject& out) {
+  JsonValue val{JsonObject{}};
+  ContactManager::ContactManager_removeAddressBook(
+      common::JsonCast<JsonObject>(args), val.get<JsonObject>());
+  ReportSuccess(val, out);
+}
+
 void ContactInstance::AddressBook_startListening(const JsonValue& args, JsonObject& out) {
   JsonValue val{JsonObject{}};
   AddressBook::AddressBook_startListening(common::JsonCast<JsonObject>(args),
index 3e4df598d2fcc7b817c416265b8f9951a22f50ff..22fe6aab88a414700819b0ba7099405d85e53904 100644 (file)
@@ -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',
index b1e794eeddcfa56a75659852568779ddfd117553..d740912c9f239b6a58e849f21bc2813f35b62f09 100644 (file)
@@ -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<JsonObject>();
+
     single_obj["id"] = JsonValue(std::to_string(id));
+    single_obj["accountId"] = JsonValue(static_cast<double>(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<JsonString>(args, "addressBookID"));
-  }
-  catch (const common::InvalidValuesException&) {
+    address_book_id = common::stol(FromJson<JsonString>(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<int>(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<double>(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<JsonObject>(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<JsonString>(addressBook, "name").c_str());
+
+  contacts_address_book_mode_e mode = FromJson<bool>(addressBook, "readOnly") ?
+      CONTACTS_ADDRESS_BOOK_MODE_READONLY : CONTACTS_ADDRESS_BOOK_MODE_NONE;
+  ContactUtil::SetIntInRecord(contacts_record, _contacts_address_book.mode,
+      static_cast<int>(mode));
+
+  double account_id = FromJson<double>(addressBook, "accountId");
+  ContactUtil::SetIntInRecord(contacts_record, _contacts_address_book.account_id,
+      static_cast<int>(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<JsonString>(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<int>(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<int>(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<JsonString>(args, "personId"));
index 06d2c43628b981be94ecb28796665ca1f5d0b251..69627435023883781cc0ad5c2da503eaaa0107f1 100644 (file)
@@ -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&);
index 3ea51985288024a7f20d687765514f6d8141971b..12190abc4c57d1a6cda16a90891ce314b5c805c2 100644 (file)
@@ -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
index 9d1914c7fea753b4424789056a3defdf4a1ddc4a..c27b5128292d89a385e325301a0b058c455afbe7 100644 (file)
@@ -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.