}
static int _parse_support_type(xmlNode *node, sqlite3 *db, const char *pkgid,
- char *appid, char *providerid, int period)
+ const char *appid, const char *providerid, int period)
{
int ret;
int idx;
return result;
}
+static int _parse_label(xmlNode *node, sqlite3 *db, const char *providerid)
+{
+ int ret;
+ int idx;
+ sqlite3_stmt *stmt = NULL;
+ xmlChar *lang = NULL;
+
+ 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: %s", sqlite3_errmsg(db));
+ goto out;
+ }
+
+ lang = xmlNodeGetLang(node);
+
+ idx = 1;
+
+ sqlite3_bind_text(stmt, idx++, providerid, -1, SQLITE_TRANSIENT);
+
+ if (lang)
+ sqlite3_bind_text(stmt, idx++, (char *)lang, -1, SQLITE_TRANSIENT);
+ else
+ sqlite3_bind_text(stmt, idx++, "No Locale", -1, SQLITE_TRANSIENT);
+
+ sqlite3_bind_text(stmt, idx, (char *)node->children->content, -1, SQLITE_TRANSIENT);
+
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_DONE) {
+ LOGE("step error: %s", sqlite3_errmsg(db));
+ goto out;
+ }
+
+ ret = 0;
+out:
+ if (stmt)
+ sqlite3_finalize(stmt);
+
+ if (lang)
+ xmlFree(lang);
+
+ return ret;
+}
+
static int _parse_complication(xmlNode *node, sqlite3 *db, const char *pkgid,
- char *appid, char *providerid)
+ const char *appid, const char *providerid)
{
int period = 60;
period = atoi((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_complication parse label fail");
+ return -1;
+ }
}
}
return 0;
}
+static int _remove_label(sqlite3 *db, const char *pkgid)
+{
+ int ret;
+ sqlite3_stmt *stmt = NULL;
+
+ static const char query[] =
+ "DELETE FROM provider_localized_info WHERE provider_id IN "
+ "(SELECT DISTINCT provider_id FROM complication_provider "
+ "WHERE pkgid=?)";
+
+ ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+ if (ret != SQLITE_OK) {
+ LOGE("prepare error : %s", sqlite3_errmsg(db));
+ return -1;
+ }
+
+ sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
+
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_DONE) {
+ LOGE("step error : %s", sqlite3_errmsg(db));
+ sqlite3_finalize(stmt);
+ return -1;
+ }
+
+ if (stmt)
+ sqlite3_finalize(stmt);
+
+ return 0;
+}
+
static int _remove_complication(sqlite3 *db, const char *pkgid)
{
int ret;
goto out;
}
+ if (_remove_label(db, pkgid)) {
+ LOGE("failed to remove provider localized info");
+
+ sqlite3_exec(db, "ROLLBACK TRANSACTION", NULL, NULL, NULL);
+ goto out;
+ }
+
if (_remove_complication(db, pkgid)) {
- LOGE("failed to remove widget class data");
+ LOGE("failed to remove complication provider");
+
+ sqlite3_exec(db, "ROLLBACK TRANSACTION", NULL, NULL, NULL);
goto out;
}
PRAGMA journal_mode = PERSIST; \
PRAGMA foreign_keys = ON; \
BEGIN EXCLUSIVE TRANSACTION; \
-CREATE TABLE complication_provider ( \
+CREATE TABLE IF NOT EXISTS complication_provider ( \
pkgid TEXT NOT NULL, \
appid TEXT NOT NULL, \
provider_id TEXT NOT NULL, \
default_data TEXT NOT NULL, \
PRIMARY KEY (provider_id, support_type) \
); \
+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) \
+); \
COMMIT TRANSACTION; "
-#define COMPLICATION_TBL_COUNT 1
+#define COMPLICATION_TBL_COUNT 2
static char *_complication_table_list[COMPLICATION_TBL_COUNT] = {
- "complication_provider"
+ "complication_provider",
+ "provider_localized_info"
};
static int _is_global(uid_t uid)