#include <bundle.h>
#include <bundle_cpp.h>
+#include <memory>
+#include <list>
+
#include "watchface-complication/include/watchface-complication-internal.h"
#include "watchface-complication/include/watchface-complication.h"
+#include "watchface-common/watchface-util.h"
#include "watchface-common/watchface-common-internal.h"
#include "parser/complication_parser_plugin_internal.h"
using namespace std;
using namespace tizen_base;
+using namespace watchface_complication;
struct support_event_tag_map {
const char* name;
return 0;
}
-static char* _get_attribute(xmlNode* node, const char* name) {
+static string _get_attribute(xmlNode* node, const char* name) {
xmlChar* val;
- char* attr = NULL;
+ string attr = "";
val = xmlGetProp(node, (const xmlChar*)name);
if (val) {
- attr = strdup(reinterpret_cast<char*>(val));
+ attr = string(reinterpret_cast<char*>(val));
xmlFree(val);
}
}
}
-static int _insert_parsed_data(sqlite3* db, sqlite3_stmt* stmt, xmlNode* node,
- int support_type, const char* pkgid, const char* appid,
- const char* providerid, int period, bool trusted) {
- int idx = 1;
- int ret = sqlite3_bind_text(stmt, idx++, pkgid, -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
- }
-
- ret = sqlite3_bind_text(stmt, idx++, appid, -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
- }
-
- ret = sqlite3_bind_text(stmt, idx++, providerid, -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
- }
-
- ret = sqlite3_bind_int(stmt, idx++, trusted ? 1 : 0);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_int() error: %d(%s)", ret, sqlite3_errmsg(db));
- return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
- }
-
- ret = sqlite3_bind_int(stmt, idx++, period);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_int() error: %d(%s)", ret, sqlite3_errmsg(db));
- return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
- }
-
- ret = sqlite3_bind_int(stmt, idx++, support_type);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_int() error: %d(%s)", ret, sqlite3_errmsg(db));
- return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
- }
-
- string raw_default_data = _make_raw_default_data(node, support_type);
- if (raw_default_data.empty())
- return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
-
- ret = sqlite3_bind_text(stmt, idx, raw_default_data.c_str(),
- -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
- }
-
- ret = sqlite3_step(stmt);
- if (ret != SQLITE_DONE) {
- LOGE("step error: %d(%s)", ret, sqlite3_errmsg(db));
- return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
- }
-
- ret = sqlite3_reset(stmt);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_reset() error: %d", ret);
- return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
- }
- sqlite3_clear_bindings(stmt);
- return WATCHFACE_COMPLICATION_ERROR_NONE;
-}
-
-static int _parse_support_type(xmlNode* node, sqlite3* db, const char* pkgid,
- const char* appid, const char* providerid, int period, bool trusted) {
- int ret;
- sqlite3_stmt* stmt = nullptr;
+static bool _parse_support_type(xmlNode* node, shared_ptr<util::DBHelper>& db,
+ string providerid) {
static const char query[] =
- "INSERT INTO complication_provider ( "
- "pkgid, appid, provider_id, trusted, period, "
- "support_type, default_data) "
- "VALUES (?, ?, ?, ?, ?, ?, ?)";
+ "INSERT INTO provider_support_types ( "
+ "provider_id, support_type, default_data) "
+ "VALUES (?, ?, ?)";
if (node->children == NULL)
- return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
+ return false;
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK) {
- LOGE("prepare error: %d(%s)", ret, sqlite3_errmsg(db));
- return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
- }
+ if (!db->Prepare(query))
+ return false;
xmlNode* c_node;
for (c_node = node->children; c_node; c_node = c_node->next) {
int support_type = _get_support_type_tag(c_node);
if (!support_type) {
- LOGE("not supported type");
- sqlite3_finalize(stmt);
- return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
+ LOGE("Wrong supported type");
+ return false;
}
- ret = _insert_parsed_data(db,
- stmt, c_node, support_type, pkgid, appid, providerid, period, trusted);
- if (ret != WATCHFACE_COMPLICATION_ERROR_NONE) {
- sqlite3_finalize(stmt);
- return ret;
- }
+ if (!db->Bind(1, providerid))
+ return false;
+
+ if (!db->Bind(2, support_type))
+ return false;
+
+ string raw_default_data = _make_raw_default_data(c_node, support_type);
+ if (raw_default_data.empty())
+ return false;
+
+ if (!db->Bind(3, raw_default_data))
+ return false;
+
+ if (db->Step() != SQLITE_DONE)
+ return false;
+
+ if (db->Reset() != SQLITE_OK)
+ return false;
}
- sqlite3_finalize(stmt);
- return ret;
+ return true;
}
-static int _parse_label(xmlNode* node, sqlite3* db, const char* providerid) {
- int ret;
- int idx;
- sqlite3_stmt* stmt = NULL;
- xmlChar* lang = NULL;
-
+static bool _parse_label(xmlNode* node, shared_ptr<util::DBHelper>& db,
+ string providerid) {
+ xmlChar* lang = nullptr;
static const char query[] =
"INSERT INTO provider_localized_info "
"(provider_id, locale, provider_label) "
"VALUES (?, ?, ?)";
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK) {
- LOGE("prepare error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
-
- lang = xmlNodeGetLang(node);
+ if (!db->Prepare(query))
+ return false;
- idx = 1;
+ if (!db->Bind(1, providerid))
+ return false;
- ret = sqlite3_bind_text(stmt, idx++, providerid, -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
-
- if (lang)
- ret = sqlite3_bind_text(stmt, idx++, reinterpret_cast<char*>(lang), -1,
- SQLITE_TRANSIENT);
- else
- ret = sqlite3_bind_text(stmt, idx++, "No Locale", -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
-
- ret = sqlite3_bind_text(stmt, idx, reinterpret_cast<char*>(node->children->content),
- -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
-
- ret = sqlite3_step(stmt);
- if (ret != SQLITE_DONE) {
- LOGE("step error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
+ lang = xmlNodeGetLang(node);
+ if (lang) {
+ bool ret = db->Bind(2, reinterpret_cast<char*>(lang));
+ xmlFree(lang);
+ if (!ret)
+ return false;
+ } else {
+ if (!db->Bind(2, "No Locale"))
+ return false;
}
- ret = 0;
-out:
- if (stmt)
- sqlite3_finalize(stmt);
+ if (!db->Bind(3, reinterpret_cast<char*>(node->children->content)))
+ return false;
- if (lang)
- xmlFree(lang);
+ if (db->Step() != SQLITE_DONE)
+ return false;
- return ret;
+ if (db->Reset() != SQLITE_OK)
+ return false;
+ return true;
}
-static int _parse_privilege(xmlNode* node, sqlite3* db,
- const char* providerid) {
- int ret;
- sqlite3_stmt* stmt = NULL;
+static bool _parse_privilege(xmlNode* node, shared_ptr<util::DBHelper>& db,
+ string providerid) {
xmlNode* tmp;
-
static const char query[] =
"INSERT INTO provider_privilege "
"(provider_id, privilege) "
"VALUES (?, ?)";
if (node->children == NULL)
- return -1;
-
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK) {
- LOGE("prepare error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
+ return true;
+ if (!db->Prepare(query))
+ return false;
for (tmp = node->children; tmp; tmp = tmp->next) {
- if (!xmlStrcasecmp(tmp->name, (const xmlChar*)"privilege")) {
- ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
-
- ret = sqlite3_bind_text(stmt, 2, (char*)tmp->children->content, -1,
- SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
-
- ret = sqlite3_step(stmt);
- if (ret != SQLITE_DONE) {
- LOGE("step error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
-
- ret = sqlite3_reset(stmt);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_reset() error: %d", ret);
- goto out;
- }
+ if (xmlStrcasecmp(tmp->name, (const xmlChar*)"privilege"))
+ continue;
- sqlite3_clear_bindings(stmt);
- }
+ if (!db->Bind(1, providerid))
+ return false;
+ if (!db->Bind(2, (char*)tmp->children->content))
+ return false;
+ if (db->Step() != SQLITE_DONE)
+ return false;
+ if (db->Reset() != SQLITE_OK)
+ return false;
}
- ret = 0;
-out:
- if (stmt)
- sqlite3_finalize(stmt);
-
- return ret;
+ return true;
}
-static int _parse_support_event(xmlNode* node, sqlite3* db,
- const char* providerid) {
- int ret;
- sqlite3_stmt* stmt = NULL;
- xmlNode* tmp;
+static bool _parse_support_event(xmlNode* node, shared_ptr<util::DBHelper>& db,
+ string providerid) {
+ if (node->children == nullptr)
+ return true;
+
int support_events = 0;
+ for (xmlNode* tmp = node->children; tmp; tmp = tmp->next) {
+ if (xmlStrcasecmp(tmp->name, (const xmlChar*)"event"))
+ continue;
+
+ int ret = _get_support_event_tag(tmp);
+ if (ret != 0)
+ support_events |= ret;
+ }
+
+ if (support_events == 0)
+ return true;
static const char query[] =
"INSERT INTO provider_support_events "
"(provider_id, support_events) "
"VALUES (?, ?)";
- if (node->children == NULL)
- return -1;
-
- for (tmp = node->children; tmp; tmp = tmp->next) {
- if (!xmlStrcasecmp(tmp->name, (const xmlChar*)"event")) {
- ret = _get_support_event_tag(tmp);
- if (ret != 0)
- support_events |= ret;
- }
- }
-
- if (support_events != 0) {
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK) {
- LOGE("prepare error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
-
- ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
-
- ret = sqlite3_bind_int(stmt, 2, support_events);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_int() error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
+ if (!db->Prepare(query))
+ return false;
- ret = sqlite3_step(stmt);
- if (ret != SQLITE_DONE) {
- LOGE("step error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
+ if (!db->Bind(1, providerid))
+ return false;
- ret = sqlite3_reset(stmt);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_reset() error: %d", ret);
- goto out;
- }
+ if (!db->Bind(2, support_events))
+ return false;
- sqlite3_clear_bindings(stmt);
- }
+ if (db->Step() != SQLITE_DONE)
+ return false;
- ret = 0;
-out:
- if (stmt)
- sqlite3_finalize(stmt);
+ if (db->Reset() != SQLITE_OK)
+ return false;
- return ret;
+ return true;
}
-static int _parse_setup_appid(sqlite3* db, const char* providerid,
- const char* setup_appid) {
- int ret;
- sqlite3_stmt* stmt = NULL;
+static bool _insert_setup_appid(shared_ptr<util::DBHelper>& db,
+ string providerid, string setup_appid) {
static const char query[] =
"INSERT INTO provider_setup_appid "
"(provider_id, setup_appid) "
"VALUES (?, ?)";
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK) {
- LOGE("prepare error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
+ if (!db->Prepare(query))
+ return false;
- ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
- ret = sqlite3_bind_text(stmt, 2, setup_appid, -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
+ if (!db->Bind(1, providerid))
+ return false;
- ret = sqlite3_step(stmt);
- if (ret != SQLITE_DONE) {
- LOGE("step error: %s", sqlite3_errmsg(db));
- goto out;
- }
+ if (!db->Bind(2, setup_appid))
+ return false;
+
+ if (db->Step() != SQLITE_DONE)
+ return false;
+
+ if (db->Reset() != SQLITE_OK)
+ return false;
+
+ return true;
+}
+
+static bool _insert_complication(shared_ptr<util::DBHelper>& db,
+ string pkgid, string appid, string providerid, bool trusted, int period) {
+ static const char query[] =
+ "INSERT INTO complication_provider ( "
+ "pkgid, appid, provider_id, trusted, period) "
+ "VALUES (?, ?, ?, ?, ?)";
+
+ if (!db->Prepare(query))
+ return false;
+
+ if (!db->Bind(1, pkgid))
+ return false;
+
+ if (!db->Bind(2, appid))
+ return false;
+
+ if (!db->Bind(3, providerid))
+ return false;
+
+ if (!db->Bind(4, trusted))
+ return false;
- ret = 0;
-out:
- if (stmt)
- sqlite3_finalize(stmt);
+ if (!db->Bind(5, period))
+ return false;
- return ret;
+ if (db->Step() != SQLITE_DONE)
+ return false;
+
+ if (db->Reset() != SQLITE_OK)
+ return false;
+ return true;
}
-static int _parse_complication(xmlNode* node, sqlite3* db, const char* pkgid,
- const char* appid, const char* providerid, const char* setup_appid, bool trusted) {
+static bool _parse_complication(xmlNode* node, shared_ptr<util::DBHelper>& db,
+ string pkgid, string appid, string providerid, string setup_appid, bool trusted) {
int period = -1;
- xmlNode* tmp = NULL;
- xmlNode* support_type_node = NULL;
+ xmlNode* tmp = nullptr;
+ xmlNode* support_type_node = nullptr;
+ xmlNode* privilege_node = nullptr;
+ xmlNode* support_event_node = nullptr;
+ list<xmlNode*> label_list;
if (node->children == NULL)
- return -1;
+ return false;
for (tmp = node->children; tmp; tmp = tmp->next) {
if (!xmlStrcasecmp(tmp->name, (const xmlChar*)"support-type")) {
if (tmp->children == NULL)
- return -1;
+ return false;
support_type_node = tmp;
} else if (!xmlStrcasecmp(tmp->name, (const xmlChar*)"period")) {
if (tmp->children == NULL
|| tmp->children->content == NULL)
- return -1;
+ return false;
period = atoi(reinterpret_cast<char*>(tmp->children->content));
if (period < 60)
period = 60;
} else if (!xmlStrcasecmp(tmp->name, (const xmlChar*)"label")) {
- if (_parse_label(tmp, db, providerid)) {
- LOGE("parse label fail");
- return -1;
- }
+ label_list.push_back(tmp);
} else if (!xmlStrcasecmp(tmp->name, (const xmlChar*)"privileges")) {
- if (_parse_privilege(tmp, db, providerid)) {
- LOGE("parse privilege fail");
- return -1;
- }
+ privilege_node = tmp;
} else if (!xmlStrcasecmp(tmp->name, (const xmlChar*)"support-event")) {
- if (_parse_support_event(tmp, db, providerid)) {
- LOGE("parse support event fail");
- return -1;
- }
+ support_event_node = tmp;
}
}
- if (!support_type_node) {
+ if (!_insert_complication(db, pkgid, appid, providerid, trusted, period)) {
LOGE("complication provider doesn't have support-type");
- return -1;
+ return false;
}
- if (setup_appid) {
- if (_parse_setup_appid(db, providerid, setup_appid)) {
- LOGE("parse setup appid fail");
- return -1;
- }
+ if (!support_type_node) {
+ LOGE("complication provider doesn't have support-type");
+ return false;
}
- if (_parse_support_type(support_type_node, db, pkgid,
- appid, providerid, period, trusted)) {
+ if (!_parse_support_type(support_type_node, db, providerid)) {
LOGE("parse support type fail");
- return -1;
+ return false;
}
- return 0;
-}
-
-static int _parse_service_application(xmlNode* node, const char* pkgid) {
- int result = -1;
- char* appid;
- char* providerid;
- char* setup_appid;
- char* trusted_str;
- bool trusted;
- xmlNode* tmp;
- sqlite3* db;
-
- appid = _get_attribute(node, "appid");
- if (appid == NULL)
- return -1;
-
- db = open_db(_get_target_uid());
- if (db == NULL) {
- LOGE("failed to open db");
- goto out;
+ if (privilege_node != nullptr &&
+ !_parse_privilege(privilege_node, db, providerid)) {
+ LOGE("parse privilege fail");
+ return false;
}
- if (sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, NULL)) {
- LOGE("begin transaction error");
- goto out;
+ if (support_event_node != nullptr &&
+ !_parse_support_event(support_event_node, db, providerid)) {
+ LOGE("parse support event fail");
+ return false;
}
- for (tmp = node->children; tmp; tmp = tmp->next) {
- if (!xmlStrcasecmp(tmp->name, (const xmlChar*)"complication")) {
- providerid = _get_attribute(tmp, "provider-id");
- if (providerid == NULL) {
- LOGE("provider-id error");
-
- if (sqlite3_exec(db, "ROLLBACK TRANSACTION", NULL, NULL, NULL))
- LOGE("rollback transaction error");
-
- goto out;
- }
+ for (auto& i : label_list) {
+ if (!_parse_label(i, db, providerid)) {
+ LOGE("parse label fail");
+ return false;
+ }
+ }
- setup_appid = _get_attribute(tmp, "setup-appid");
- trusted_str = _get_attribute(tmp, "trusted");
- if (trusted_str != NULL && strcasecmp(trusted_str, "true") == 0)
- trusted = true;
- else
- trusted = false;
+ if (!setup_appid.empty()) {
+ if (!_insert_setup_appid(db, providerid, setup_appid)) {
+ LOGE("insert setup appid fail");
+ return false;
+ }
+ }
- if (_parse_complication(tmp, db, pkgid, appid, providerid, setup_appid,
- trusted)) {
- LOGE("parse complication error");
+ return true;
+}
- if (sqlite3_exec(db, "ROLLBACK TRANSACTION", NULL, NULL, NULL))
- LOGE("rollback transaction error");
+static bool _parse_service_application(xmlNode* node, const char* pkgid) {
+ bool trusted;
+ xmlNode* tmp;
+ shared_ptr<util::DBHelper> db = make_shared<util::DBHelper>();
- free(providerid);
+ string appid = _get_attribute(node, "appid");
+ if (appid.empty())
+ return false;
- if (setup_appid)
- free(setup_appid);
- if (trusted_str)
- free(trusted_str);
+ if (!db->Open(SQLITE_OPEN_READWRITE))
+ return false;
- goto out;
- }
+ if (!db->Exec("BEGIN TRANSACTION"))
+ return false;
- free(providerid);
+ for (tmp = node->children; tmp; tmp = tmp->next) {
+ if (xmlStrcasecmp(tmp->name, (const xmlChar*)"complication"))
+ continue;
- if (setup_appid)
- free(setup_appid);
- if (trusted_str)
- free(trusted_str);
+ string providerid = _get_attribute(tmp, "provider-id");
+ if (providerid.empty()) {
+ LOGE("provider-id error");
+ if (!db->Exec("ROLLBACK TRANSACTION"))
+ return false;
}
- }
- if (sqlite3_exec(db, "END TRANSACTION", NULL, NULL, NULL)) {
- LOGE("end transaction error");
- goto out;
+ string setup_appid = _get_attribute(tmp, "setup-appid");
+ string trusted_str = _get_attribute(tmp, "trusted");
+ if (!trusted_str.empty() && strcasecmp(trusted_str.c_str(), "true") == 0)
+ trusted = true;
+ else
+ trusted = false;
+
+ if (!_parse_complication(tmp, db, pkgid, appid, providerid, setup_appid,
+ trusted)) {
+ LOGE("parse complication error");
+ if (!db->Exec("ROLLBACK TRANSACTION"))
+ return false;
+ }
}
- result = 0;
-out:
- if (db)
- sqlite3_close_v2(db);
-
- if (appid)
- free(appid);
+ if (!db->Exec("END TRANSACTION"))
+ return false;
- return result;
+ return true;
}
int complication_parser_plugin_parse_manifest(xmlDocPtr doc,
if (xmlStrcasecmp(tmp->name, (const xmlChar*)"service-application"))
continue;
- if (_parse_service_application(tmp, pkgid)) {
+ if (!_parse_service_application(tmp, pkgid)) {
LOGE("parse failed");
return -1;
}
return 0;
}
-static int _remove_complication(sqlite3* db, const char* pkgid) {
- int ret;
- unsigned int i;
- sqlite3_stmt* stmt = NULL;
-
- static const char* query[] = {
- "DELETE FROM provider_privilege WHERE provider_id IN "
- "(SELECT DISTINCT provider_id FROM complication_provider "
- "WHERE pkgid=?)",
- "DELETE FROM provider_localized_info WHERE provider_id IN "
- "(SELECT DISTINCT provider_id FROM complication_provider "
- "WHERE pkgid=?)",
- "DELETE FROM provider_setup_appid WHERE provider_id IN "
- "(SELECT DISTINCT provider_id FROM complication_provider "
- "WHERE pkgid=?)",
- "DELETE FROM provider_support_events WHERE provider_id IN "
- "(SELECT DISTINCT provider_id FROM complication_provider "
- "WHERE pkgid=?)",
- "DELETE FROM complication_provider WHERE pkgid=?"
- };
-
- for (i = 0; i < (sizeof(query) / sizeof(*query)); i++) {
- ret = sqlite3_prepare_v2(db, query[i], strlen(query[i]), &stmt, NULL);
- if (ret != SQLITE_OK) {
- LOGE("prepare error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
-
- ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("sqlite3_bind_text() error: %d(%s)", ret, sqlite3_errmsg(db));
- goto out;
- }
-
- ret = sqlite3_step(stmt);
- if (ret != SQLITE_DONE) {
- LOGE("step error: %s", sqlite3_errmsg(db));
- goto out;
- }
-
- sqlite3_finalize(stmt);
- stmt = NULL;
- }
-
- ret = 0;
-
-out:
- if (stmt)
- sqlite3_finalize(stmt);
-
- return ret;
-}
-
int complication_parser_db_remove_complication(const char* pkgid) {
- int ret;
- sqlite3* db;
+ util::DBHelper db;
+ if (!db.Open(SQLITE_OPEN_READWRITE))
+ return -1;
- db = open_db(_get_target_uid());
- if (db == NULL)
+ if (!db.Exec("BEGIN TRANSACTION"))
return -1;
- ret = sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, NULL);
- if (ret != SQLITE_OK) {
- LOGE("begin transaction error %d", ret);
- goto out;
+ if (!db.Prepare("DELETE FROM complication_provider WHERE pkgid=?")) {
+ if (!db.Exec("ROLLBACK TRANSACTION"))
+ return -1;
}
- if (_remove_complication(db, pkgid)) {
- LOGE("failed to remove complication provider");
-
- ret = sqlite3_exec(db, "ROLLBACK TRANSACTION", NULL, NULL, NULL);
- if (ret != SQLITE_OK) {
- LOGE("rollback transaction error %d", ret);
- }
- goto out;
+ if (!db.Bind(1, pkgid)) {
+ if (!db.Exec("ROLLBACK TRANSACTION"))
+ return -1;
}
- ret = sqlite3_exec(db, "END TRANSACTION", NULL, NULL, NULL);
- if (ret != SQLITE_OK) {
- LOGE("begin transaction error %d", ret);
- goto out;
+ if (db.Step() != SQLITE_DONE) {
+ if (!db.Exec("ROLLBACK TRANSACTION"))
+ return -1;
}
- ret = 0;
-out:
- if (db)
- sqlite3_close_v2(db);
-
- return ret;
+ if (!db.Exec("END TRANSACTION"))
+ return -1;
+ return 0;
}
#include <dlog.h>
#include <tzplatform_config.h>
+#include "watchface-common/watchface-util.h"
#include "parser/complication_parser_plugin_internal.h"
#define BUSY_WAITING_USEC 50000 /* 0.05 sec */
provider_id TEXT NOT NULL, \
trusted INTEGER DEFAULT 0, \
period INTEGER DEFAULT -1, \
+ PRIMARY KEY (provider_id) \
+); \
+CREATE TABLE IF NOT EXISTS provider_support_types ( \
+ provider_id TEXT NOT NULL, \
support_type INTEGER DEFAULT 0, \
default_data TEXT NOT NULL, \
- PRIMARY KEY (provider_id, support_type) \
+ UNIQUE (provider_id, support_type), \
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE \
); \
CREATE TABLE IF NOT EXISTS provider_localized_info ( \
provider_id TEXT NOT NULL, \
locale TEXT NOT NULL DEFAULT 'No Locale', \
provider_label TEXT, \
- PRIMARY KEY (provider_id, locale) \
+ UNIQUE (provider_id, locale), \
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE \
); \
CREATE TABLE IF NOT EXISTS provider_privilege ( \
provider_id TEXT NOT NULL, \
privilege TEXT NOT NULL, \
- PRIMARY KEY (provider_id, privilege) \
+ UNIQUE (provider_id, privilege) \
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE \
); \
CREATE TABLE IF NOT EXISTS provider_setup_appid ( \
provider_id TEXT NOT NULL, \
setup_appid TEXT, \
- PRIMARY KEY (provider_id) \
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE \
); \
CREATE TABLE IF NOT EXISTS provider_support_events ( \
provider_id TEXT NOT NULL, \
support_events INTEGER DEFAULT 1, \
- PRIMARY KEY (provider_id) \
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE \
); \
COMMIT TRANSACTION; "
-#define COMPLICATION_TBL_COUNT 5
+#define COMPLICATION_TBL_COUNT 6
static const char* _complication_table_list[COMPLICATION_TBL_COUNT] = {
"complication_provider",
"provider_localized_info",
"provider_privilege",
"provider_setup_appid",
- "provider_support_events"
+ "provider_support_events",
+ "provider_support_types"
};
static int _is_global(uid_t uid) {
return -1;
}
- while (sqlite3_step(stmt) == SQLITE_ROW
- && idx < COMPLICATION_TBL_COUNT) {
+ while (idx < COMPLICATION_TBL_COUNT) {
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_ROW) {
+ LOGW("fail to get row");
+ break;
+ }
val = reinterpret_cast<const char*>(sqlite3_column_text(stmt, 0));
if (val == nullptr) {
LOGW("name is nullptr");
idx++;
}
-
sqlite3_finalize(stmt);
if (idx != COMPLICATION_TBL_COUNT) {
- LOGE("table count not matched");
+ LOGE("table count not matched, %d, %d", idx, COMPLICATION_TBL_COUNT);
return -1;
}
provider_id TEXT NOT NULL,
trusted INTEGER DEFAULT 0,
period INTEGER DEFAULT -1,
+ PRIMARY KEY (provider_id)
+);
+
+DROP TABLE IF EXISTS provider_support_types;
+CREATE TABLE IF NOT EXISTS provider_support_types (
+ provider_id TEXT NOT NULL,
support_type INTEGER DEFAULT 0,
default_data TEXT NOT NULL,
- PRIMARY KEY (provider_id, support_type)
+ UNIQUE (provider_id, support_type),
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE
);
DROP TABLE IF EXISTS provider_localized_info;
provider_id TEXT NOT NULL,
locale TEXT NOT NULL DEFAULT 'No Locale',
provider_label TEXT,
- PRIMARY KEY (provider_id, locale)
+ UNIQUE (provider_id, locale),
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE
);
DROP TABLE IF EXISTS provider_privilege;
CREATE TABLE IF NOT EXISTS provider_privilege (
provider_id TEXT NOT NULL,
privilege TEXT NOT NULL,
- PRIMARY KEY (provider_id, privilege)
+ UNIQUE (provider_id, privilege)
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE
);
DROP TABLE IF EXISTS provider_setup_appid;
CREATE TABLE IF NOT EXISTS provider_setup_appid (
provider_id TEXT NOT NULL,
setup_appid TEXT,
- PRIMARY KEY (provider_id)
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE
);
DROP TABLE IF EXISTS provider_support_events;
CREATE TABLE IF NOT EXISTS provider_support_events (
provider_id TEXT NOT NULL,
support_events INTEGER DEFAULT 1,
- PRIMARY KEY (provider_id)
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE
);
COMMIT TRANSACTION;
provider_id TEXT NOT NULL,
trusted INTEGER DEFAULT 0,
period INTEGER DEFAULT -1,
+ PRIMARY KEY (provider_id)
+);
+CREATE TABLE IF NOT EXISTS provider_support_types (
+ provider_id TEXT NOT NULL,
support_type INTEGER DEFAULT 0,
default_data TEXT NOT NULL,
- PRIMARY KEY (provider_id, support_type)
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS provider_localized_info (
provider_id TEXT NOT NULL,
locale TEXT NOT NULL DEFAULT 'No Locale',
provider_label TEXT,
- PRIMARY KEY (provider_id, locale)
+ UNIQUE (provider_id, locale),
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS provider_privilege (
provider_id TEXT NOT NULL,
privilege TEXT NOT NULL,
- PRIMARY KEY (provider_id, privilege)
+ UNIQUE (provider_id, privilege)
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS provider_setup_appid (
provider_id TEXT NOT NULL,
setup_appid TEXT,
- PRIMARY KEY (provider_id)
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS provider_support_events (
provider_id TEXT NOT NULL,
support_events INTEGER DEFAULT 1,
- PRIMARY KEY (provider_id)
+ FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE
);
INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
+ pkgid, appid, provider_id, trusted, period) VALUES (
'org.tizen.gmock_comp_provider',
'org.tizen.gmock_comp_provider',
'org.tizen.gmock_comp_provider/test',
0,
- 1,
+ 1
+);
+
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
+ 'org.tizen.gmock_comp_provider/test',
2,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider',
- 'org.tizen.gmock_comp_provider',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider/test',
- 0,
- 1,
4,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider',
- 'org.tizen.gmock_comp_provider',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider/test',
- 0,
- 1,
8,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider',
- 'org.tizen.gmock_comp_provider',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider/test',
- 0,
- 1,
16,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider',
- 'org.tizen.gmock_comp_provider',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider/test',
- 0,
- 1,
32,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider',
- 'org.tizen.gmock_comp_provider',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider/test',
- 0,
- 1,
64,
'test'
);
INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
+ pkgid, appid, provider_id, trusted, period) VALUES (
'org.tizen.gmock_comp_provider2',
'org.tizen.gmock_comp_provider2',
'org.tizen.gmock_comp_provider2/test',
0,
- 1,
+ 1
+);
+
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
+ 'org.tizen.gmock_comp_provider2/test',
2,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider2',
- 'org.tizen.gmock_comp_provider2',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider2/test',
- 0,
- 1,
4,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider2',
- 'org.tizen.gmock_comp_provider2',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider2/test',
- 0,
- 1,
8,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider2',
- 'org.tizen.gmock_comp_provider2',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider2/test',
- 0,
- 1,
16,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider2',
- 'org.tizen.gmock_comp_provider2',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider2/test',
- 0,
- 1,
32,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider2',
- 'org.tizen.gmock_comp_provider2',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider2/test',
- 0,
- 1,
64,
'test'
);
);
INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
+ pkgid, appid, provider_id, trusted, period) VALUES (
'org.tizen.gmock_comp_provider3',
'org.tizen.gmock_comp_provider3',
'org.tizen.gmock_comp_provider3/test',
0,
- 1,
+ 1
+);
+
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
+ 'org.tizen.gmock_comp_provider3/test',
2,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider3',
- 'org.tizen.gmock_comp_provider3',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider3/test',
- 0,
- 1,
4,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider3',
- 'org.tizen.gmock_comp_provider3',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider3/test',
- 0,
- 1,
8,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider3',
- 'org.tizen.gmock_comp_provider3',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider3/test',
- 0,
- 1,
16,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider3',
- 'org.tizen.gmock_comp_provider3',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider3/test',
- 0,
- 1,
32,
'test'
);
-INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
- 'org.tizen.gmock_comp_provider3',
- 'org.tizen.gmock_comp_provider3',
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
'org.tizen.gmock_comp_provider3/test',
- 0,
- 1,
64,
'test'
);
INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
+ pkgid, appid, provider_id, trusted, period) VALUES (
'org.tizen.gmock_comp_provider4',
'org.tizen.gmock_comp_provider4',
'org.tizen.gmock_comp_provider4/test',
0,
- 1,
+ 1
+);
+
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
+ 'org.tizen.gmock_comp_provider4/test',
2,
'test'
);
);
INSERT INTO complication_provider (
- pkgid, appid, provider_id, trusted, period,
- support_type, default_data) VALUES (
+ pkgid, appid, provider_id, trusted, period) VALUES (
'org.tizen.gmock_comp_provider5',
'org.tizen.gmock_comp_provider5',
'org.tizen.gmock_comp_provider5/test',
1,
- 1,
+ 1
+);
+
+INSERT INTO provider_support_types (
+ provider_id, support_type, default_data) VALUES (
+ 'org.tizen.gmock_comp_provider5/test',
2,
'test'
);
\ No newline at end of file
}
static const char query[] =
- "UPDATE complication_provider "
+ "UPDATE provider_support_types "
"SET default_data = ?";
sqlite3_stmt* stmt = nullptr;
#include <cynara-creds-gdbus.h>
#include <cynara-session.h>
#include <pkgmgr-info.h>
+#include <pkgmgr_installer_info.h>
#include <system_info.h>
#include <string>
#define EDITABLE_PATH_PREFIX "/org/tizen/watchface_editable_"
#define COMPLICATION_OBJECT_PATH "/org/tizen/watchface_complication"
#define MAX_CACHE_COUNT 10
+#define ROOT_USER 0
#define LOG_TAG "WATCHFACE_COMPLICATION"
free(info_s);
}
+ const char* DBHelper::GetParserDataPath() const {
+ uid_t target_uid;
+ const char* path;
+ bool is_global;
+
+ pkgmgr_installer_info_get_target_uid(&target_uid);
+
+ if (target_uid == ROOT_USER
+ || target_uid == tzplatform_getuid(TZ_SYS_GLOBALAPP_USER))
+ is_global = true;
+ else
+ is_global = false;
+
+ if (!is_global)
+ tzplatform_set_user(target_uid);
+
+ path = tzplatform_mkpath(is_global ? TZ_SYS_DB : TZ_USER_DB,
+ ".complication_provider.db");
+ tzplatform_reset_user();
+
+ return path;
+ }
+
+ bool DBHelper::Open() {
+ const char* path = GetParserDataPath();
+ if (path == nullptr)
+ return false;
+
+ sqlite3* db = nullptr;
+ int ret = sqlite3_open_v2(path, &db, SQLITE_OPEN_READONLY, nullptr);
+ if (ret != SQLITE_OK) {
+ LOGE("open db(%s) error: %d", path, ret);
+ return false;
+ }
+ db_.reset(db);
+ Exec("PRAGMA foreign_keys = ON");
+
+ return true;
+ }
+
+ bool DBHelper::Open(int mode) {
+ const char* path = GetParserDataPath();
+ if (path == nullptr)
+ return false;
+
+ sqlite3* db = nullptr;
+ int ret = sqlite3_open_v2(path, &db, mode, nullptr);
+ if (ret != SQLITE_OK) {
+ LOGE("open db(%s) error: %d", path, ret);
+ return false;
+ }
+ db_.reset(db);
+ Exec("PRAGMA foreign_keys = ON");
+
+ return true;
+ }
+
+ void DBHelper::Close() {
+ db_.reset();
+ }
+
+ bool DBHelper::Exec(const std::string& query) {
+ if (sqlite3_exec(db_.get(), query.c_str(), NULL, NULL, NULL) != SQLITE_OK) {
+ LOGE("exec error %s", sqlite3_errmsg(db_.get()));
+ return false;
+ }
+ return true;
+ }
+
+ bool DBHelper::Prepare(const std::string& query) {
+ sqlite3_stmt* stmt = nullptr;
+ if (sqlite3_prepare_v2(db_.get(), query.c_str(), query.size(), &stmt,
+ nullptr) != SQLITE_OK) {
+ LOGE("prepare error: %s", sqlite3_errmsg(db_.get()));
+ return false;
+ }
+
+ stmt_.reset(stmt);
+
+ return true;
+ }
+
+ const DBHelper::Cursor& DBHelper::GetCursor() const {
+ return stmt_;
+ }
+
+ int DBHelper::Step() const {
+ int ret = sqlite3_step(stmt_.get());
+ if (ret != SQLITE_DONE || ret != SQLITE_ROW)
+ LOGE("step error: %s", sqlite3_errmsg(db_.get()));
+ return ret;
+ }
+
+ int DBHelper::Reset() const {
+ return sqlite3_reset(stmt_.get());
+ }
+
+ bool DBHelper::Bind(int pos, std::string text) {
+ int ret = sqlite3_bind_text(stmt_.get(), pos, text.c_str(),
+ -1, SQLITE_TRANSIENT);
+ if (ret != SQLITE_OK) {
+ LOGE("bind error: %s", sqlite3_errmsg(db_.get()));
+ return false;
+ }
+
+ return true;
+ }
+
+ bool DBHelper::Bind(int pos, int val) {
+ if (sqlite3_bind_int(stmt_.get(), pos, val) != SQLITE_OK) {
+ LOGE("bind error: %s", sqlite3_errmsg(db_.get()));
+ return false;
+ }
+
+ return true;
+ }
+
+ const char* DBHelper::GetText(int pos) const {
+ return reinterpret_cast<const char*>(sqlite3_column_text(stmt_.get(), pos));
+ }
+
+ int DBHelper::GetInt(int pos) const {
+ return sqlite3_column_int(stmt_.get(), pos);
+ }
+
} // namespace util
} // namespace watchface_complication
#include <gio/gio.h>
#include <bundle.h>
#include <bundle_cpp.h>
+#include <sqlite3.h>
+#include <tzplatform_config.h>
#include <string>
#include "watchface-common/include/watchface-common.h"
EXPORT_API int GetDataType(tizen_base::Bundle shared_data);
EXPORT_API int ConvertAulError(int ret);
EXPORT_API void DestroyTimeInfo(struct complication_time_info_s* info);
+
+ class EXPORT_API DBHelper {
+ public:
+ using Cursor = std::unique_ptr<sqlite3_stmt, decltype(sqlite3_finalize)*>;
+ DBHelper()
+ : db_(nullptr, sqlite3_close_v2), stmt_(nullptr, sqlite3_finalize) {}
+
+ bool Open();
+ bool Open(int mode);
+ void Close();
+ bool Prepare(const std::string& query);
+ bool Exec(const std::string& query);
+ const Cursor& GetCursor() const;
+ int Step() const;
+ int Reset() const;
+
+ bool Bind(int pos, std::string text);
+ bool Bind(int pos, int val);
+
+ const char* GetText(int pos) const;
+ int GetInt(int pos) const;
+
+ private:
+ const char* GetParserDataPath() const;
+
+ private:
+ std::unique_ptr<sqlite3, decltype(sqlite3_close_v2)*> db_;
+ Cursor stmt_;
+ };
} // namespace util
} // namespace watchface_complication
#include "watchface-complication-provider/complication-provider-implementation.h"
#include "watchface-complication-provider/include/watchface-complication-provider.h"
-#ifdef LOGE
-#undef LOGE
-#endif
-#define LOGE printf
-
#ifdef LOG_TAG
#undef LOG_TAG
#endif
#define LOG_TAG "WATCHFACE_COMPLICATION"
-#define PRIVILEGE_DATASHARING "http://tizen.org/privilege/datasharing"
using namespace std;
using namespace tizen_base;
#endif
#define LOG_TAG "WATCHFACE_COMPLICATION"
-
#define DEFAULT_LOCALE "No Locale"
-#define ROOT_USER 0
using namespace tizen_base;
-
-namespace {
-class DBHelper {
- public:
- using Cursor = std::unique_ptr<sqlite3_stmt, decltype(sqlite3_finalize)*>;
- DBHelper()
- : db_(nullptr, sqlite3_close_v2), stmt_(nullptr, sqlite3_finalize) {}
-
- bool Open() {
- const char* path = GetParserDataPath();
- if (path == nullptr)
- return false;
-
- sqlite3* db = nullptr;
- int ret = sqlite3_open_v2(path, &db, SQLITE_OPEN_READONLY, nullptr);
- if (ret != SQLITE_OK) {
- LOGE("open db(%s) error: %d", path, ret);
- return false;
- }
-
- db_.reset(db);
-
- return true;
- }
-
- void Close() {
- db_.reset();
- }
-
- bool Prepare(const std::string& query) {
- sqlite3_stmt* stmt = nullptr;
- if (sqlite3_prepare_v2(db_.get(), query.c_str(), query.size(), &stmt,
- nullptr) != SQLITE_OK) {
- LOGE("prepare error: %s", sqlite3_errmsg(db_.get()));
- return false;
- }
-
- stmt_.reset(stmt);
-
- return true;
- }
-
- const Cursor& GetCursor() const {
- return stmt_;
- }
-
- int Step() const {
- return sqlite3_step(stmt_.get());
- }
-
- bool Bind(int pos, std::string text) {
- int ret = sqlite3_bind_text(stmt_.get(), pos, text.c_str(),
- -1, SQLITE_TRANSIENT);
- if (ret != SQLITE_OK) {
- LOGE("bind error: %s", sqlite3_errmsg(db_.get()));
- return false;
- }
-
- return true;
- }
-
- bool Bind(int pos, int val) {
- if (sqlite3_bind_int(stmt_.get(), pos, val) != SQLITE_OK) {
- LOGE("bind error: %s", sqlite3_errmsg(db_.get()));
- return false;
- }
-
- return true;
- }
-
- const char* GetText(int pos) const {
- return reinterpret_cast<const char*>(sqlite3_column_text(stmt_.get(), pos));
- }
-
- int GetInt(int pos) const {
- return sqlite3_column_int(stmt_.get(), pos);
- }
-
- private:
- const char* GetParserDataPath() const {
- uid_t target_uid;
- const char* path;
- bool is_global;
-
- pkgmgr_installer_info_get_target_uid(&target_uid);
-
- if (target_uid == ROOT_USER
- || target_uid == tzplatform_getuid(TZ_SYS_GLOBALAPP_USER))
- is_global = true;
- else
- is_global = false;
-
- if (!is_global)
- tzplatform_set_user(target_uid);
-
- path = tzplatform_mkpath(is_global ? TZ_SYS_DB : TZ_USER_DB,
- ".complication_provider.db");
- tzplatform_reset_user();
-
- return path;
- }
-
- private:
- std::unique_ptr<sqlite3, decltype(sqlite3_close_v2)*> db_;
- Cursor stmt_;
-};
-} // namespace
-
namespace watchface_complication {
DBManager::DBManager() = default;
std::unique_ptr<Bundle> DBManager::GetDefaultData(const char* provider_id,
int support_type) {
static const char query[] =
- "SELECT trusted, appid, default_data FROM complication_provider "
- "WHERE provider_id=? AND support_type=?";
+ "SELECT trusted, appid, default_data FROM complication_provider as A "
+ "LEFT JOIN provider_support_types as B ON A.provider_id = B.provider_id "
+ "WHERE A.provider_id=? AND support_type=?";
- ::DBHelper db;
+ util::DBHelper db;
if (!db.Open())
return nullptr;
static const char query[] =
"SELECT period FROM complication_provider WHERE provider_id=?";
- ::DBHelper db;
+ util::DBHelper db;
if (!db.Open())
return WATCHFACE_COMPLICATION_ERROR_DB;
bool DBManager::IsProviderExist(std::string& provider_id, int support_type) {
static const char query[] =
- "SELECT trusted, appid FROM complication_provider "
- "WHERE provider_id=? AND support_type=?";
- ::DBHelper db;
+ "SELECT trusted, appid FROM complication_provider as A "
+ "LEFT JOIN provider_support_types as B ON A.provider_id = B.provider_id "
+ "WHERE A.provider_id=? AND support_type=?";
+ util::DBHelper db;
if (!db.Open())
return false;
std::string DBManager::GetProviderAppId(const char* provider_id) {
static const char query[] =
"SELECT trusted, appid FROM complication_provider WHERE provider_id=?";
- ::DBHelper db;
+ util::DBHelper db;
if (!db.Open())
return std::string();
std::list<std::unique_ptr<DBManager::ProviderInfo>>
DBManager::GetProviderListWithTypes(int supported_types) {
static const char query[] =
- "SELECT trusted, appid, provider_id, support_type FROM complication_provider "
+ "SELECT trusted, appid, A.provider_id, support_type FROM "
+ "complication_provider as A LEFT JOIN provider_support_types as B "
+ "ON A.provider_id = B.provider_id "
"WHERE (support_type & ?) > 0";
- ::DBHelper db;
+ util::DBHelper db;
if (!db.Open())
return {};
const char* provider_app_id) {
static const char query[] =
"SELECT DISTINCT provider_id FROM complication_provider WHERE appid=?";
- ::DBHelper db;
+ util::DBHelper db;
if (!db.Open())
return {};
int DBManager::GetSupportTypes(std::string& provider_id, int* types) {
static const char query[] =
- "SELECT trusted, appid, SUM(support_type) FROM complication_provider "
- "WHERE provider_id = ?";
- ::DBHelper db;
+ "SELECT trusted, appid, SUM(support_type) FROM complication_provider as A "
+ "LEFT JOIN provider_support_types as B ON A.provider_id = B.provider_id "
+ "WHERE A.provider_id = ?";
+ util::DBHelper db;
if (!db.Open())
return WATCHFACE_COMPLICATION_ERROR_DB;
std::string& provider_id) {
static const char query[] =
"SELECT DISTINCT privilege FROM provider_privilege WHERE provider_id=?";
- ::DBHelper db;
+ util::DBHelper db;
if (!db.Open())
return {};
int support_events = WATCHFACE_COMPLICATION_EVENT_NONE;
static const char query[] =
"SELECT support_events FROM provider_support_events WHERE provider_id=?";
- ::DBHelper db;
+ util::DBHelper db;
if (!db.Open())
return -1;
static const char query[] =
"SELECT provider_label FROM provider_localized_info "
"WHERE provider_id=? AND locale=?";
- ::DBHelper db;
+ util::DBHelper db;
if (!db.Open())
return std::string();
std::string DBManager::GetSetupAppId(const char* provider_id) {
static const char query[] =
"SELECT DISTINCT setup_appid FROM provider_setup_appid WHERE provider_id=?";
- ::DBHelper db;
+ util::DBHelper db;
if (!db.Open())
return std::string();
int DBManager::GetTrustedInfo(std::string& provider_id, bool* trusted) {
static const char query[] =
"SELECT trusted FROM complication_provider WHERE provider_id = ?";
- ::DBHelper db;
+ util::DBHelper db;
if (!db.Open())
return WATCHFACE_COMPLICATION_ERROR_DB;