[Contact] Allow to create multiple instances of ContactInstance class.
authorPawel Andruszkiewicz <p.andruszkie@samsung.com>
Thu, 9 Apr 2015 07:30:38 +0000 (09:30 +0200)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Tue, 14 Apr 2015 08:09:41 +0000 (17:09 +0900)
Change-Id: Ide5b4ee72919aa7430ba3e8e16097adc71f6eb73

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/contact_manager.h

index 9f6a5a61deed67f7d81055cac7f716f1b31f0d09..5b8278b9fbd18583916e955d6855ee1d8a0640ee 100644 (file)
@@ -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<ContactInstance*>(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(&current_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");
index 90dfcb222afc0855beea47d1107fb9ea70a48957..e978c8334fd35192b9f08870201dd8547dc0b2aa 100644 (file)
@@ -24,6 +24,9 @@
 
 namespace extension {
 namespace contact {
+
+class ContactInstance;
+
 namespace AddressBook {
 
 typedef std::function<common::PlatformResult(const JsonObject&, JsonObject&)>
@@ -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,
index c1551b462632df4b22d397feec27ef85cc1043fd..c5410f7bbf824f3a767bc8fb309faf9a0c38d366 100644 (file)
@@ -27,5 +27,5 @@ ContactExtension::ContactExtension() {
 ContactExtension::~ContactExtension() {}
 
 common::Instance* ContactExtension::CreateInstance() {
-  return &extension::contact::ContactInstance::GetInstance();
+  return new extension::contact::ContactInstance();
 }
index 6bf974beb0f821ea82d9a920cec53cf0f94cf508..30d012173ec8f2df318db5002159f0399093768b 100644 (file)
@@ -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<JsonObject>(args), val.get<JsonObject>());
+      *this, common::JsonCast<JsonObject>(args), val.get<JsonObject>());
   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<JsonObject>(args), val.get<JsonObject>());
+      *this, common::JsonCast<JsonObject>(args), val.get<JsonObject>());
   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<JsonObject>(args), val.get<JsonObject>());
+      *this, common::JsonCast<JsonObject>(args), val.get<JsonObject>());
   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<JsonObject>(args), val.get<JsonObject>());
+      *this, common::JsonCast<JsonObject>(args), val.get<JsonObject>());
   if (status.IsSuccess())
     ReportSuccess(val, out);
   else
index 7d3bdb78b8e5c5528364236a356198849d2e919b..924aad0f639f723e24b9c74e5d5f0acc6a42fcbb 100644 (file)
@@ -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
index 5399021beae132eef9a9ebb172300a345025bab7..607f4cc2a0a6204d572fc24fb37c87ce905c94a5 100644 (file)
@@ -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<ContactInstance*>(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",
index 69f35a80e6cfe2fee93a52355d7a521e8259258e..9840dda4cdc208ad3d12590785c34f436ff2b7a6 100644 (file)
@@ -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