}
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()) {
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,
}
}
- 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",
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");
namespace extension {
namespace contact {
+
+class ContactInstance;
+
namespace AddressBook {
typedef std::function<common::PlatformResult(const JsonObject&, JsonObject&)>
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,
ContactExtension::~ContactExtension() {}
common::Instance* ContactExtension::CreateInstance() {
- return &extension::contact::ContactInstance::GetInstance();
+ return new extension::contact::ContactInstance();
}
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;
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
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
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
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
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);
void PersonLink(const JsonValue& args, JsonObject& out);
void PersonUnlink(const JsonValue& args, JsonObject& out);
+
+ int current_state_;
};
} // namespace contact
} // namespace extension
void ContactManagerListenerCallback(const char* view_uri, char* changes,
void* user_data) {
(void)view_uri;
- (void)user_data;
if (nullptr == changes) {
LoggerW("changes is NULL");
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",
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",
namespace extension {
namespace contact {
+
+class ContactInstance;
+
namespace ContactManager {
common::PlatformResult ContactManagerGetAddressBooks(const JsonObject& args,
* {status: 'success'}
* @endcode
*/
-common::PlatformResult ContactManagerStartListening(const JsonObject& args,
+common::PlatformResult ContactManagerStartListening(ContactInstance& instance, const JsonObject& args,
JsonObject& out);
/**
* {status: 'success'}
* @endcode
*/
-common::PlatformResult ContactManagerStopListening(const JsonObject& args,
+common::PlatformResult ContactManagerStopListening(ContactInstance& instance, const JsonObject& args,
JsonObject& out);
} // namespace ContactManager