From 7384fbb384ff9b4dcc8efad6f8534ad675dc1940 Mon Sep 17 00:00:00 2001 From: Pawel Andruszkiewicz Date: Thu, 9 Apr 2015 09:30:38 +0200 Subject: [PATCH] [Contact] Allow to create multiple instances of ContactInstance class. Change-Id: Ide5b4ee72919aa7430ba3e8e16097adc71f6eb73 --- src/contact/addressbook.cc | 25 ++++++++++++++----------- src/contact/addressbook.h | 7 +++++-- src/contact/contact_extension.cc | 2 +- src/contact/contact_instance.cc | 18 ++++++------------ src/contact/contact_instance.h | 7 +++++-- src/contact/contact_manager.cc | 12 ++++++------ src/contact/contact_manager.h | 7 +++++-- 7 files changed, 42 insertions(+), 36 deletions(-) diff --git a/src/contact/addressbook.cc b/src/contact/addressbook.cc index 9f6a5a61..5b8278b9 100644 --- a/src/contact/addressbook.cc +++ b/src/contact/addressbook.cc @@ -675,10 +675,10 @@ PlatformResult AddressBookGetGroups(const JsonObject& args, JsonArray& out) { } namespace { + void AddressBookListenerCallback(const char* view_uri, void* user_data) { LoggerD("entered"); (void)view_uri; - (void)user_data; PlatformResult status = ContactUtil::CheckDBConnection(); if (status.IsError()) { @@ -695,8 +695,9 @@ void AddressBookListenerCallback(const char* view_uri, void* user_data) { LoggerW("get current version returns error, code: %d", error_code); } - for (int version = ContactInstance::current_state; version < current_version; - ++version) { + ContactInstance* instance = static_cast(user_data); + + for (int version = instance->current_state(); version < current_version; ++version) { int latest_version = 0; error_code = contacts_db_get_changes_by_version( _contacts_contact_updated_info._uri, kUnifiedAddressBookId, version, @@ -820,27 +821,29 @@ void AddressBookListenerCallback(const char* view_uri, void* user_data) { } } - ContactInstance::GetInstance().PostMessage(result.serialize().c_str()); + instance->PostMessage(result.serialize().c_str()); } - ContactInstance::current_state = current_version; + instance->set_current_state(current_version); } } -PlatformResult AddressBookStartListening(const JsonObject&, JsonObject& out) { +PlatformResult AddressBookStartListening(ContactInstance& instance, const JsonObject&, JsonObject& out) { PlatformResult status = ContactUtil::CheckDBConnection(); if (status.IsError()) return status; + int current_state = 0; // 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(&ContactInstance::current_state); + int error_code = contacts_db_get_current_version(¤t_state); if (CONTACTS_ERROR_NONE != error_code) { LoggerW("get current version returns error, code: %d", error_code); } + instance.set_current_state(current_state); + error_code = contacts_db_add_changed_cb(_contacts_contact._uri, - AddressBookListenerCallback, NULL); + AddressBookListenerCallback, &instance); if (CONTACTS_ERROR_NONE != error_code) { LoggerE("Error while registering listener to contacts db, code: %d", @@ -852,12 +855,12 @@ PlatformResult AddressBookStartListening(const JsonObject&, JsonObject& out) { return PlatformResult(ErrorCode::NO_ERROR); } -PlatformResult AddressBookStopListening(const JsonObject&, JsonObject& out) { +PlatformResult AddressBookStopListening(ContactInstance& instance, const JsonObject&, JsonObject& out) { PlatformResult status = ContactUtil::CheckDBConnection(); if (status.IsError()) return status; int error_code = contacts_db_remove_changed_cb( - _contacts_contact._uri, AddressBookListenerCallback, NULL); + _contacts_contact._uri, AddressBookListenerCallback, &instance); if (CONTACTS_ERROR_NONE != error_code) { LoggerE("Error while removing listener"); diff --git a/src/contact/addressbook.h b/src/contact/addressbook.h index 90dfcb22..e978c833 100644 --- a/src/contact/addressbook.h +++ b/src/contact/addressbook.h @@ -24,6 +24,9 @@ namespace extension { namespace contact { + +class ContactInstance; + namespace AddressBook { typedef std::function @@ -46,9 +49,9 @@ common::PlatformResult AddressBookRemoveGroup(const JsonObject& args, JsonObject&); common::PlatformResult AddressBookGetGroups(const JsonObject& args, JsonArray& out); -common::PlatformResult AddressBookStartListening(const JsonObject& args, +common::PlatformResult AddressBookStartListening(ContactInstance& instance, const JsonObject& args, JsonObject& out); -common::PlatformResult AddressBookStopListening(const JsonObject& args, +common::PlatformResult AddressBookStopListening(ContactInstance& instance, const JsonObject& args, JsonObject& out); common::PlatformResult AddressBookBatchFunc(NativeFunction impl, diff --git a/src/contact/contact_extension.cc b/src/contact/contact_extension.cc index c1551b46..c5410f7b 100644 --- a/src/contact/contact_extension.cc +++ b/src/contact/contact_extension.cc @@ -27,5 +27,5 @@ ContactExtension::ContactExtension() { ContactExtension::~ContactExtension() {} common::Instance* ContactExtension::CreateInstance() { - return &extension::contact::ContactInstance::GetInstance(); + return new extension::contact::ContactInstance(); } diff --git a/src/contact/contact_instance.cc b/src/contact/contact_instance.cc index 6bf974be..30d01217 100644 --- a/src/contact/contact_instance.cc +++ b/src/contact/contact_instance.cc @@ -23,14 +23,8 @@ const std::string kPrivilegeContactWrite = "http://tizen.org/privilege/contact.w using namespace common; -ContactInstance& ContactInstance::GetInstance() { - static ContactInstance instance; - return instance; -} - -int ContactInstance::current_state = 0; - -ContactInstance::ContactInstance() { +ContactInstance::ContactInstance() + : current_state_(0) { using std::placeholders::_1; using std::placeholders::_2; @@ -382,7 +376,7 @@ void ContactInstance::AddressBookStartListening(const JsonValue& args, CHECK_PRIVILEGE_ACCESS(kPrivilegeContactRead, &out); JsonValue val{JsonObject{}}; PlatformResult status = AddressBook::AddressBookStartListening( - common::JsonCast(args), val.get()); + *this, common::JsonCast(args), val.get()); if (status.IsSuccess()) ReportSuccess(val, out); else @@ -394,7 +388,7 @@ void ContactInstance::AddressBookStopListening(const JsonValue& args, CHECK_PRIVILEGE_ACCESS(kPrivilegeContactRead, &out); JsonValue val{JsonObject{}}; PlatformResult status = AddressBook::AddressBookStopListening( - common::JsonCast(args), val.get()); + *this, common::JsonCast(args), val.get()); if (status.IsSuccess()) ReportSuccess(val, out); else @@ -548,7 +542,7 @@ void ContactInstance::ContactManagerStartListening(const JsonValue& args, CHECK_PRIVILEGE_ACCESS(kPrivilegeContactRead, &out); JsonValue val{JsonObject{}}; PlatformResult status = ContactManager::ContactManagerStartListening( - common::JsonCast(args), val.get()); + *this, common::JsonCast(args), val.get()); if (status.IsSuccess()) ReportSuccess(val, out); else @@ -560,7 +554,7 @@ void ContactInstance::ContactManagerStopListening(const JsonValue& args, CHECK_PRIVILEGE_ACCESS(kPrivilegeContactRead, &out); JsonValue val{JsonObject{}}; PlatformResult status = ContactManager::ContactManagerStopListening( - common::JsonCast(args), val.get()); + *this, common::JsonCast(args), val.get()); if (status.IsSuccess()) ReportSuccess(val, out); else diff --git a/src/contact/contact_instance.h b/src/contact/contact_instance.h index 7d3bdb78..924aad0f 100644 --- a/src/contact/contact_instance.h +++ b/src/contact/contact_instance.h @@ -16,10 +16,11 @@ namespace contact { class ContactInstance : public common::ParsedInstance { public: ContactInstance(); - static ContactInstance& GetInstance(); - static int current_state; virtual ~ContactInstance(); + int current_state() const { return current_state_; } + void set_current_state(int state) { current_state_ = state; } + private: void AddressBookGet(const JsonValue& args, JsonObject& out); void AddressBookAdd(const JsonValue& args, JsonObject& out); @@ -213,6 +214,8 @@ class ContactInstance : public common::ParsedInstance { void PersonLink(const JsonValue& args, JsonObject& out); void PersonUnlink(const JsonValue& args, JsonObject& out); + + int current_state_; }; } // namespace contact } // namespace extension diff --git a/src/contact/contact_manager.cc b/src/contact/contact_manager.cc index 5399021b..607f4cc2 100644 --- a/src/contact/contact_manager.cc +++ b/src/contact/contact_manager.cc @@ -810,7 +810,6 @@ bool IsNumeric(const char* s) { void ContactManagerListenerCallback(const char* view_uri, char* changes, void* user_data) { (void)view_uri; - (void)user_data; if (nullptr == changes) { LoggerW("changes is NULL"); @@ -883,17 +882,18 @@ void ContactManagerListenerCallback(const char* view_uri, char* changes, token = strtok(nullptr, kTokenDelimiter); } - ContactInstance::GetInstance().PostMessage(result.serialize().c_str()); + ContactInstance* instance = static_cast(user_data); + instance->PostMessage(result.serialize().c_str()); } } -PlatformResult ContactManagerStartListening(const JsonObject& /*args*/, +PlatformResult ContactManagerStartListening(ContactInstance& instance, const JsonObject& /*args*/, JsonObject& /*out*/) { PlatformResult status = ContactUtil::CheckDBConnection(); if (status.IsError()) return status; int error_code = contacts_db_add_changed_cb_with_info( - _contacts_person._uri, ContactManagerListenerCallback, nullptr); + _contacts_person._uri, ContactManagerListenerCallback, &instance); if (CONTACTS_ERROR_NONE != error_code) { LoggerE("contacts_db_add_changed_cb(_contacts_person._uri) error: %d", @@ -904,13 +904,13 @@ PlatformResult ContactManagerStartListening(const JsonObject& /*args*/, return PlatformResult(ErrorCode::NO_ERROR); } -PlatformResult ContactManagerStopListening(const JsonObject& /*args*/, +PlatformResult ContactManagerStopListening(ContactInstance& instance, const JsonObject& /*args*/, JsonObject& /*out*/) { PlatformResult status = ContactUtil::CheckDBConnection(); if (status.IsError()) return status; int error_code = contacts_db_remove_changed_cb_with_info( - _contacts_person._uri, ContactManagerListenerCallback, nullptr); + _contacts_person._uri, ContactManagerListenerCallback, &instance); if (CONTACTS_ERROR_NONE != error_code) { LoggerE("contacts_db_remove_changed_cb(_contacts_person._uri) error: %d", diff --git a/src/contact/contact_manager.h b/src/contact/contact_manager.h index 69f35a80..9840dda4 100644 --- a/src/contact/contact_manager.h +++ b/src/contact/contact_manager.h @@ -22,6 +22,9 @@ namespace extension { namespace contact { + +class ContactInstance; + namespace ContactManager { common::PlatformResult ContactManagerGetAddressBooks(const JsonObject& args, @@ -62,7 +65,7 @@ common::PlatformResult ContactManagerImportFromVCard(const JsonObject& args, * {status: 'success'} * @endcode */ -common::PlatformResult ContactManagerStartListening(const JsonObject& args, +common::PlatformResult ContactManagerStartListening(ContactInstance& instance, const JsonObject& args, JsonObject& out); /** @@ -76,7 +79,7 @@ common::PlatformResult ContactManagerStartListening(const JsonObject& args, * {status: 'success'} * @endcode */ -common::PlatformResult ContactManagerStopListening(const JsonObject& args, +common::PlatformResult ContactManagerStopListening(ContactInstance& instance, const JsonObject& args, JsonObject& out); } // namespace ContactManager -- 2.34.1