#include "contact/contact_instance.h"
#include "common/converter.h"
+#include "common/filesystem/filesystem_provider.h"
#include "common/logger.h"
#include "common/platform_exception.h"
#include "common/task-queue.h"
namespace {
const std::string kPrivilegeContactRead = "http://tizen.org/privilege/contact.read";
const std::string kPrivilegeContactWrite = "http://tizen.org/privilege/contact.write";
-}
+const std::vector<const char*> kContactURIs = {"photoURI", "ringtoneURI", "vibrationURI",
+ "messageAlertURI"};
+const std::vector<const char*> kPersonGroupURIs = {"photoURI", "ringtoneURI"};
+const std::vector<const char*> kOrganizationURIs = {"logoURI"};
+}
+
+#define CHECK_CONTACT_ATTRIBUTES_STORAGE(in, to_check, out) \
+ do { \
+ for (auto& attr : to_check) { \
+ if (!IsNull(in, attr)) { \
+ const std::string& real_path = \
+ common::FilesystemProvider::Create().GetRealPath(FromJson<std::string>(in, attr)); \
+ CHECK_STORAGE_ACCESS(real_path, out); \
+ } \
+ } \
+ } while (0);
+
+#define CHECK_CONTACT_ATTRIBUTES_ARRAY(in, attribute, to_check, out) \
+ do { \
+ JsonArray array = FromJson<JsonArray>(in, attribute); \
+ for (auto& el : array) { \
+ JsonObject element = common::JsonCast<JsonObject>(el); \
+ CHECK_CONTACT_ATTRIBUTES_STORAGE(element, to_check, out); \
+ } \
+ } while (0);
using namespace common;
void ContactInstance::AddressBookAdd(const JsonValue& args, JsonObject& out) {
ScopeLogger();
CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out);
+
+ const auto& contact = args.get("contact").get<JsonObject>();
+ CHECK_CONTACT_ATTRIBUTES_STORAGE(contact, kContactURIs, &out);
+ CHECK_CONTACT_ATTRIBUTES_ARRAY(contact, "organizations", kOrganizationURIs, &out);
+
JsonValue val{JsonObject{}};
PlatformResult status =
AddressBook::AddressBookAdd(common::JsonCast<JsonObject>(args), val.get<JsonObject>());
ScopeLogger();
CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out);
+ const auto& batch_args = args.get("batchArgs").get<JsonArray>();
+ for (auto& item : batch_args) {
+ JsonObject contact = common::JsonCast<JsonObject>(item);
+ CHECK_CONTACT_ATTRIBUTES_STORAGE(contact, kContactURIs, &out);
+ CHECK_CONTACT_ATTRIBUTES_ARRAY(contact, "organizations", kOrganizationURIs, &out);
+ }
+
const double callback_id = args.get("callbackId").get<double>();
auto get = [=](const std::shared_ptr<JsonValue>& response) -> void {
ScopeLogger();
CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out);
+ const auto& batch_args = args.get("batchArgs").get<JsonArray>();
+ for (auto& item : batch_args) {
+ JsonObject contact = common::JsonCast<JsonObject>(item);
+ CHECK_CONTACT_ATTRIBUTES_STORAGE(contact, kContactURIs, &out);
+ CHECK_CONTACT_ATTRIBUTES_ARRAY(contact, "organizations", kOrganizationURIs, &out);
+ }
+
const double callback_id = args.get("callbackId").get<double>();
auto get = [=](const std::shared_ptr<JsonValue>& response) -> void {
void ContactInstance::AddressBookUpdate(const JsonValue& args, JsonObject& out) {
ScopeLogger();
CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out);
+
+ const auto& contact = args.get("contact").get<JsonObject>();
+ CHECK_CONTACT_ATTRIBUTES_STORAGE(contact, kContactURIs, &out);
+ CHECK_CONTACT_ATTRIBUTES_ARRAY(contact, "organizations", kOrganizationURIs, &out);
+
JsonValue val{JsonObject{}};
PlatformResult status =
AddressBook::AddressBookUpdate(common::JsonCast<JsonObject>(args), val.get<JsonObject>());
void ContactInstance::AddressBookAddGroup(const JsonValue& args, JsonObject& out) {
ScopeLogger();
CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out);
+
+ const auto& group = args.get("group").get<JsonObject>();
+ CHECK_CONTACT_ATTRIBUTES_STORAGE(group, kPersonGroupURIs, &out);
+
JsonValue val{JsonObject{}};
PlatformResult status =
AddressBook::AddressBookAddGroup(common::JsonCast<JsonObject>(args), val.get<JsonObject>());
void ContactInstance::AddressBookUpdateGroup(const JsonValue& args, JsonObject& out) {
ScopeLogger();
+
+ const auto& group = args.get("group").get<JsonObject>();
+ CHECK_CONTACT_ATTRIBUTES_STORAGE(group, kPersonGroupURIs, &out);
+
CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out);
JsonValue val{JsonObject{}};
PlatformResult status = AddressBook::AddressBookUpdateGroup(common::JsonCast<JsonObject>(args),
void ContactInstance::ContactManagerUpdate(const JsonValue& args, JsonObject& out) {
ScopeLogger();
CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out);
+
+ const auto& group = args.get("person").get<JsonObject>();
+ CHECK_CONTACT_ATTRIBUTES_STORAGE(group, kPersonGroupURIs, &out);
+
JsonValue val{JsonObject{}};
PlatformResult status = ContactManager::ContactManagerUpdate(common::JsonCast<JsonObject>(args),
val.get<JsonObject>());
ScopeLogger();
CHECK_PRIVILEGE_ACCESS(kPrivilegeContactWrite, &out);
+ const auto& batch_args = args.get("batchArgs").get<JsonArray>();
+ for (auto& item : batch_args) {
+ JsonObject contact = common::JsonCast<JsonObject>(item);
+ CHECK_CONTACT_ATTRIBUTES_STORAGE(contact, kPersonGroupURIs, &out);
+ }
+
const double callback_id = args.get("callbackId").get<double>();
auto get = [=](const std::shared_ptr<JsonValue>& response) -> void {
} else {
LogAndReportError(status, &out);
}
+#undef CHECK_CONTACT_ATTRIBUTES_STORAGE
+#undef CHECK_CONTACT_ATTRIBUTES_ARRAY
}
} // namespace contact