From: Karol Pawlowski Date: Mon, 22 Dec 2014 11:41:49 +0000 (+0100) Subject: [Contact] AddressBook addChangeListener fix X-Git-Tag: submit/tizen_tv/20150603.064601~1^2~743 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6769b28b3a459a8f0a70e120a891d0714ff22dd1;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Contact] AddressBook addChangeListener fix [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 --- diff --git a/src/contact/addressbook.cc b/src/contact/addressbook.cc index dab62956..9b49b078 100644 --- a/src/contact/addressbook.cc +++ b/src/contact/addressbook.cc @@ -22,6 +22,7 @@ #include "common/logger.h" #include +#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(); + result_obj.insert(std::make_pair("listenerId", kContactListenerId)); JsonArray& added = result_obj.insert(std::make_pair("added", JsonArray{})) .first->second.get(); 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"); diff --git a/src/contact/addressbook.h b/src/contact/addressbook.h index f2336128..c5fe9628 100644 --- a/src/contact/addressbook.h +++ b/src/contact/addressbook.h @@ -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/*, diff --git a/src/contact/contact_extension.cc b/src/contact/contact_extension.cc index 72cc9727..6d9e5b90 100644 --- a/src/contact/contact_extension.cc +++ b/src/contact/contact_extension.cc @@ -38,5 +38,5 @@ ContactExtension::ContactExtension() { ContactExtension::~ContactExtension() {} common::Instance* ContactExtension::CreateInstance() { - return new extension::contact::ContactInstance; + return &extension::contact::ContactInstance::GetInstance(); } diff --git a/src/contact/contact_instance.cc b/src/contact/contact_instance.cc index 945a042b..17a146a9 100644 --- a/src/contact/contact_instance.cc +++ b/src/contact/contact_instance.cc @@ -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(args), + val.get()); + ReportSuccess(val, out); +} + +void ContactInstance::AddressBook_stopListening(const JsonValue& args, JsonObject& out) { + JsonValue val{JsonObject{}}; + AddressBook::AddressBook_stopListening(common::JsonCast(args), + val.get()); + ReportSuccess(val, out); +} + void ContactInstance::ContactManager_get(const JsonValue& args, JsonObject& out) { JsonValue val{JsonObject{}}; diff --git a/src/contact/contact_instance.h b/src/contact/contact_instance.h index 1d40ca76..237cd58b 100644 --- a/src/contact/contact_instance.h +++ b/src/contact/contact_instance.h @@ -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); diff --git a/src/contact/contact_manager.cc b/src/contact/contact_manager.cc index 0ceb0da9..b758731b 100644 --- a/src/contact/contact_manager.cc +++ b/src/contact/contact_manager.cc @@ -22,6 +22,7 @@ #include "common/logger.h" #include +#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(); + result_obj.insert(std::make_pair("listenerId", kContactPersonListenerId)); JsonArray& added = result_obj.insert(std::make_pair("added", JsonArray{})) .first->second.get(); 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()); } } diff --git a/src/contact/js/tizen.contact.AddressBook.js b/src/contact/js/tizen.contact.AddressBook.js index 708cf933..038d681f 100644 --- a/src/contact/js/tizen.contact.AddressBook.js +++ b/src/contact/js/tizen.contact.AddressBook.js @@ -16,8 +16,6 @@ var _filterById = function(array, id) { }; var _contactChangeListener = function(result) { - result = JSON.parse(result); - var unifiedId = -1; var watchId; var i;