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