[Contact] AddressBook addChangeListener fix
authorKarol Pawlowski <k.pawlowski@samsung.com>
Mon, 22 Dec 2014 11:41:49 +0000 (12:41 +0100)
committerRafal Galka <r.galka@samsung.com>
Tue, 23 Dec 2014 10:45:10 +0000 (19:45 +0900)
[Verification]

Use code:

exports.onRequest = function() {

console.log("Service Start~!");
try {
    addressBook = tizen.contact.getDefaultAddressBook();

    contact = new tizen.Contact({
        name: new tizen.ContactName({
            firstName: "John",
            lastName: "Doe"
        }),
        addresses: [new tizen.ContactAddress({
            country: "United States",
            region: "Florida",
            city: "Miami",
            streetAddress: "124 SW 17th Ave."
        })]
    });
    watcher = {
        oncontactsadded: function (contacts) {
            console.log("Works");
            addressBook.removeChangeListener(listener);
            console.log("Listener removed");
        },
        oncontactsupdated: function (contacts) {
        },
        oncontactsremoved: function (ids) {
        }
    };

    listener = addressBook.addChangeListener(watcher);

    addressBook.add(contact);

}catch (e) {
    console.log(e.name + ': ' + e.message);
    console.log(e.stack);
}

};

Efect:
"Works" and "Listener removed" should be visible in dlog

Change-Id: I0c4ee0c224571da554dabc87cbfad6db73675ae6
Signed-off-by: Karol Pawlowski <k.pawlowski@samsung.com>
src/contact/addressbook.cc
src/contact/addressbook.h
src/contact/contact_extension.cc
src/contact/contact_instance.cc
src/contact/contact_instance.h
src/contact/contact_manager.cc
src/contact/js/tizen.contact.AddressBook.js

index dab62956f30d335bf2e144c20cd2db6b74217e97..9b49b078528f7428e87344a3ed5cf48d831911dc 100644 (file)
@@ -22,6 +22,7 @@
 #include "common/logger.h"
 
 #include <contacts.h>
+#include "contact/contact_instance.h"
 
 namespace extension {
 namespace contact {
@@ -533,6 +534,7 @@ void AddressBook_listenerCallback(const char* view_uri, void* user_data) {
 
     JsonValue result{JsonObject{}};
     JsonObject& result_obj = result.get<JsonObject>();
+    result_obj.insert(std::make_pair("listenerId", kContactListenerId));
     JsonArray& added = result_obj.insert(std::make_pair("added", JsonArray{}))
                            .first->second.get<JsonArray>();
     JsonArray& updated =
@@ -610,23 +612,22 @@ void AddressBook_listenerCallback(const char* view_uri, void* user_data) {
         removed.push_back(std::move(removed_data));
       }
     }
-
-    // @todo implement fire event
+    ContactInstance::GetInstance().PostMessage(result.serialize().c_str());
   }
 }
 }
 
-void AddressBook_startListening(int* current_state, const JsonObject&) {
+void AddressBook_startListening(const JsonObject& args, JsonObject& out) {
   ContactUtil::CheckDBConnection();
   // Set the initial latest version before registering the callback.
   // The callback should only be registered once so no race can occur.
-  int error_code = contacts_db_get_current_version(current_state);
+  int error_code = contacts_db_get_current_version(&ContactInstance::current_state);
   if (CONTACTS_ERROR_NONE != error_code) {
     LoggerW("get current version returns error, code: %d", error_code);
   }
 
   error_code = contacts_db_add_changed_cb(
-      _contacts_contact._uri, AddressBook_listenerCallback, current_state);
+      _contacts_contact._uri, AddressBook_listenerCallback, &ContactInstance::current_state);
 
   if (CONTACTS_ERROR_NONE != error_code) {
     LoggerE("Error while registering listener to contacts db, code: %d",
@@ -635,10 +636,10 @@ void AddressBook_startListening(int* current_state, const JsonObject&) {
   }
 }
 
-void AddressBook_stopListening(int* current_state, const JsonObject&) {
+void AddressBook_stopListening(const JsonObject& args, JsonObject& out) {
   ContactUtil::CheckDBConnection();
   int error_code = contacts_db_remove_changed_cb(
-      _contacts_contact._uri, AddressBook_listenerCallback, current_state);
+      _contacts_contact._uri, AddressBook_listenerCallback, &ContactInstance::current_state);
 
   if (CONTACTS_ERROR_NONE != error_code) {
     LoggerE("Error while removing listener");
index f233612863f03e88bc67dd9f55bcc4720be17ea3..c5fe96285e7b8b86e74ab7ed8c52cc7fba778b68 100644 (file)
@@ -34,10 +34,8 @@ void AddressBook_getGroup(const JsonObject& args, JsonObject& out);
 void AddressBook_updateGroup(const JsonObject& args, JsonObject&);
 void AddressBook_removeGroup(const JsonObject& args, JsonObject&);
 void AddressBook_getGroups(const JsonObject& args, JsonArray& out);
-void AddressBook_startListening(int* current_state, const JsonObject& args,
-                                JsonObject& out);
-void AddressBook_stopListening(int* current_state, const JsonObject& args,
-                               JsonObject& out);
+void AddressBook_startListening(const JsonObject& args, JsonObject& out);
+void AddressBook_stopListening(const JsonObject& args, JsonObject& out);
 
 void AddressBook_batchFunc(/*common::NativeFunction impl,*/
                            const char* single_arg_name, const JsonObject& args/*,
index 72cc9727fe18258adb0a1b6cb1d4d4cc51fa798d..6d9e5b90925a76749d595efe377ae4185a348eea 100644 (file)
@@ -38,5 +38,5 @@ ContactExtension::ContactExtension() {
 ContactExtension::~ContactExtension() {}
 
 common::Instance* ContactExtension::CreateInstance() {
-  return new extension::contact::ContactInstance;
+  return &extension::contact::ContactInstance::GetInstance();
 }
index 945a042b49a6c30c6d8be4424cadd8a9d9764c03..17a146a98f2c5c5e8cde5080eeee0f06ecf8c021 100644 (file)
@@ -18,6 +18,13 @@ namespace contact {
 
 using namespace common;
 
+ContactInstance& ContactInstance::GetInstance() {
+    static ContactInstance instance;
+    return instance;
+}
+
+int ContactInstance::current_state = 0;
+
 ContactInstance::ContactInstance() {
   using namespace std::placeholders;
 
@@ -49,6 +56,8 @@ ContactInstance::ContactInstance() {
   REGISTER_SYNC("AddressBook_updateGroup", AddressBook_updateGroup);
   REGISTER_SYNC("AddressBook_removeGroup", AddressBook_removeGroup);
   REGISTER_SYNC("AddressBook_getGroups", AddressBook_getGroups);
+  REGISTER_SYNC("AddressBook_startListening", AddressBook_startListening);
+  REGISTER_SYNC("AddressBook_stopListening", AddressBook_stopListening);
 
   // Person
   REGISTER_SYNC("Person_link", Person_link);
@@ -199,6 +208,20 @@ void ContactInstance::ContactManager_getAddressBook(const JsonValue& args,
   ReportSuccess(val, out);
 }
 
+void ContactInstance::AddressBook_startListening(const JsonValue& args, JsonObject& out) {
+  JsonValue val{JsonObject{}};
+  AddressBook::AddressBook_startListening(common::JsonCast<JsonObject>(args),
+                               val.get<JsonObject>());
+  ReportSuccess(val, out);
+}
+
+void ContactInstance::AddressBook_stopListening(const JsonValue& args, JsonObject& out) {
+  JsonValue val{JsonObject{}};
+  AddressBook::AddressBook_stopListening(common::JsonCast<JsonObject>(args),
+                               val.get<JsonObject>());
+  ReportSuccess(val, out);
+}
+
 void ContactInstance::ContactManager_get(const JsonValue& args,
                                          JsonObject& out) {
   JsonValue val{JsonObject{}};
index 1d40ca76f6d63896beb744c7ed25456a6dc20746..237cd58b872d1f20fcc0420305975b34b892efe0 100644 (file)
@@ -16,6 +16,8 @@ namespace contact {
 class ContactInstance : public common::ParsedInstance {
  public:
   ContactInstance();
+  static ContactInstance& GetInstance();
+  static int current_state;
   virtual ~ContactInstance();
 
  private:
@@ -30,6 +32,8 @@ class ContactInstance : public common::ParsedInstance {
   void AddressBook_updateGroup(const JsonValue& args, JsonObject& out);
   void AddressBook_removeGroup(const JsonValue& args, JsonObject& out);
   void AddressBook_getGroups(const JsonValue& args, JsonObject& out);
+  void AddressBook_startListening(const JsonValue& args, JsonObject& out);
+  void AddressBook_stopListening(const JsonValue& args,JsonObject& out);
 
   /**
    * Signature: @code void getAddressBooks(successCallback, errorCallback);
index 0ceb0da94b2eaadff48454508ccfbb79f3785d15..b758731badc8e7a01131d2db93fa8f42e6e32a34 100644 (file)
@@ -22,6 +22,7 @@
 #include "common/logger.h"
 
 #include <contacts.h>
+#include "contact/contact_instance.h"
 #include "contact/person.h"
 
 namespace extension {
@@ -275,6 +276,7 @@ void ContactManager_listenerCallback(const char* view_uri, char* changes,
 
   JsonValue result{JsonObject{}};
   JsonObject& result_obj = result.get<JsonObject>();
+  result_obj.insert(std::make_pair("listenerId", kContactPersonListenerId));
   JsonArray& added = result_obj.insert(std::make_pair("added", JsonArray{}))
                            .first->second.get<JsonArray>();
   JsonArray& updated =
@@ -329,7 +331,7 @@ void ContactManager_listenerCallback(const char* view_uri, char* changes,
     token = strtok(nullptr, kTokenDelimiter);
   }
 
-  // @todo implement fire event
+  ContactInstance::GetInstance().PostMessage(result.serialize().c_str());
 }
 }
 
index 708cf933d09d740be60a319b334f496791ff67cd..038d681fa3662fb1f0967e85d0d5db719287a2e3 100644 (file)
@@ -16,8 +16,6 @@ var _filterById = function(array, id) {
 };
 
 var _contactChangeListener = function(result) {
-  result = JSON.parse(result);
-
   var unifiedId = -1;
   var watchId;
   var i;