Add parser for watchface complication label text 88/172188/4
authorSukHyung, Kang <shine.kang@samsung.com>
Mon, 12 Mar 2018 10:55:31 +0000 (19:55 +0900)
committerMyungKi Lee <mk5004.lee@samsung.com>
Tue, 13 Mar 2018 04:00:43 +0000 (04:00 +0000)
Change-Id: If2d0a4c2039cd206cfafe3d854e64ced8d7490c9
Signed-off-by: SukHyung, Kang <shine.kang@samsung.com>
parser/complication_parser_plugin.c
parser/complication_parser_plugin_internal.c

index 8ba1d6e..25d9ee9 100644 (file)
@@ -112,7 +112,7 @@ static int _get_support_type_tag(xmlNode *node)
 }
 
 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;
@@ -221,8 +221,56 @@ out:
        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;
 
@@ -246,6 +294,11 @@ static int _parse_complication(xmlNode *node, sqlite3 *db, const char *pkgid,
                        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;
+                       }
                }
        }
 
@@ -351,6 +404,37 @@ int complication_parser_plugin_parse_manifest(xmlDocPtr doc, const char *pkgid)
        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;
@@ -394,8 +478,17 @@ int complication_parser_db_remove_complication(const char *pkgid)
                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;
        }
 
index fb8bd51..dd6249f 100644 (file)
@@ -35,7 +35,7 @@ PRAGMA user_version = 50; \
 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, \
@@ -44,11 +44,18 @@ CREATE TABLE complication_provider ( \
        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)