diff options
author | Jinkun Jang <jinkun.jang@samsung.com> | 2013-03-13 01:48:41 +0900 |
---|---|---|
committer | Jinkun Jang <jinkun.jang@samsung.com> | 2013-03-13 01:48:41 +0900 |
commit | ef99ea8e643867d3964802a98e761c609bd1c571 (patch) | |
tree | 22004252f53ea163707b6276be9d0b730d4bc625 /src | |
parent | 0fa210fc66f335511720a78103ad1f4497a06ad6 (diff) | |
download | liblocation-appman-ef99ea8e643867d3964802a98e761c609bd1c571.tar.gz liblocation-appman-ef99ea8e643867d3964802a98e761c609bd1c571.tar.bz2 liblocation-appman-ef99ea8e643867d3964802a98e761c609bd1c571.zip |
Tizen 2.1 base
Diffstat (limited to 'src')
-rw-r--r-- | src/location-appman-crypt.c | 188 | ||||
-rw-r--r-- | src/location-appman.c | 993 |
2 files changed, 1181 insertions, 0 deletions
diff --git a/src/location-appman-crypt.c b/src/location-appman-crypt.c new file mode 100644 index 0000000..5541f73 --- /dev/null +++ b/src/location-appman-crypt.c @@ -0,0 +1,188 @@ +/* + * liblocation-appman + * + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang <youngae.kang@samsung.com>, Minjune Kim <sena06.kim@samsung.com> + * Genie Kim <daejins.kim@samsung.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <glib.h> +#include <gcrypt.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdio.h> +#include "location-appman.h" +#include "location-appman-log.h" +#include "location-appman-crypt.h" + +#define CIPHER_ALGORITHM GCRY_CIPHER_BLOWFISH +#define CIPHER_MODE GCRY_CIPHER_MODE_ECB +#define ONE_CIPHER_ALGORITHM_MIN_KEY_LENGTH 5 +#define ONE_CIPHER_ALGORITHM_MAX_KEY_LENGTH 32 + +static const char *key_string = "LocationAppman"; + +static void *string2hex(const char *string, size_t *buff_len) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(string); + LOCATION_APPMAN_NULL_ARG_CHECK(buff_len); + + *buff_len = g_utf8_strlen(string, -1)*2+1; + unsigned char *buffer = g_malloc0_n (*buff_len, sizeof(unsigned char*)); + unsigned int idx = 0; + for (idx = 0; idx < *buff_len; idx+=2) { + char temp[3]; + if (!g_ascii_isalnum(string[idx/2])) { + break; + } + g_snprintf (temp, 3, "%x", (unsigned int)string[idx/2]); + buffer[idx] = temp[0]; + buffer[idx+1] = temp[1]; + } + buffer[*buff_len-1] = '\0'; + return buffer; +} + +static gboolean +location_appman_encrypt_decrypt(gboolean is_encrypt, const void *key_buf, size_t key_buflen, void *inbuf, void *outbuf) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(inbuf); + LOCATION_APPMAN_NULL_ARG_CHECK(outbuf); + + gpg_error_t err; + gcry_cipher_hd_t hd; + int keylen, len; + void *outblock = NULL; + void *inblock = NULL; + + len = strlen((char *)inbuf); + + err = gcry_cipher_open(&hd, CIPHER_ALGORITHM, CIPHER_MODE, 0); + if(err) { + LOCATION_APPMAN_LOG("fail to gcry_cipher_open: %s\n", gpg_strerror (err)); + return FALSE; + } + + keylen = gcry_cipher_get_algo_keylen(CIPHER_ALGORITHM); + if(!keylen) { + LOCATION_APPMAN_LOG("fail to gcry_cipher_get_algo_keylen, %d\n", keylen); + return FALSE; + } + + if(keylen < ONE_CIPHER_ALGORITHM_MIN_KEY_LENGTH || keylen > ONE_CIPHER_ALGORITHM_MAX_KEY_LENGTH) + { + LOCATION_APPMAN_LOG("keylength problem (%d)", keylen); + return FALSE; + } + + err = gcry_cipher_setkey(hd, key_buf, key_buflen); + if(err) { + //delete + LOCATION_APPMAN_LOG("fail to gcry_cipher_setkey: %s\n", gpg_strerror (err)); + gcry_cipher_close(hd); + return FALSE; + } + + inblock = gcry_xmalloc (keylen); + outblock = gcry_xmalloc (keylen); + int idx =0 ; + while(idx < len) { + size_t tlen = ((len - idx)<keylen)? len-idx : keylen; + memset(inblock, 0, keylen); + memset(outblock, 0, keylen); + if(!memcpy(inblock, inbuf+idx, tlen)) { + LOCATION_APPMAN_LOG("location_appman_encrypt_decrypt : inblock MEMCPY ERROR/n"); + break; + } + + if(is_encrypt) err = gcry_cipher_encrypt(hd, outblock, keylen, inblock, keylen); + else err = gcry_cipher_decrypt(hd, outblock, keylen, inblock, keylen); + + if(err) { + LOCATION_APPMAN_LOG("fail to gcry_cipher_encrypt/gcry_cipher_decrypt : %s\n", gpg_strerror (err)); + break; + } + if(!memcpy(outbuf+idx, outblock, keylen)) { + LOCATION_APPMAN_LOG("gcry_cipher_decrypt : outbuf MEMCPY ERROR/n"); + } + break; + } + idx += keylen; + gcry_free(inblock); + gcry_free(outblock); + return TRUE; +} + +int location_appman_encrypt(const char *key, const char *input, char *output) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(input); + void *keybuf = NULL; + char tmp_outbuf[ONE_CIPHER_ALGORITHM_MAX_KEY_LENGTH] = {0, }; + size_t key_buflen; + + if(key == NULL) + keybuf = string2hex(key_string, &key_buflen); + else + keybuf = string2hex(key, &key_buflen); + + if(NULL != keybuf) { + if(!location_appman_encrypt_decrypt(TRUE, keybuf, key_buflen, (void *)input, (void *)tmp_outbuf)) { + LOCATION_APPMAN_LOG("location_appman_encrypt : location_private_encrypt_decrypt FAIL!!!\n"); + + return LOCATION_APPMAN_CRYPT_ERROR_GCRYPT; + }else { + strcpy(output, tmp_outbuf); + } + }else { + LOCATION_APPMAN_LOG("location_appman_encrypt : keybuf is NULL\n"); + return LOCATION_APPMAN_CRYPT_ERROR_INTERNAL; + } + + if(keybuf) gcry_free (keybuf); + + return LOCATION_APPMAN_CRYPT_ERROR_NONE; +} + + +int location_appman_decrypt(const char *key, const char *input, char *output) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(input); + size_t key_buflen; + void *keybuf = NULL; + char tmp_outbuf[ONE_CIPHER_ALGORITHM_MAX_KEY_LENGTH] = {0, }; + + if(key == NULL) + keybuf = string2hex(key_string, &key_buflen); + else + keybuf = string2hex(key, &key_buflen); + + if(NULL != keybuf) { + if(!location_appman_encrypt_decrypt(FALSE, keybuf, key_buflen, (void *)input, (void *)tmp_outbuf)) { + LOCATION_APPMAN_LOG("location_appman_decrypt : location_private_encrypt_decrypt FAIL!!\n");; + return LOCATION_APPMAN_CRYPT_ERROR_GCRYPT; + }else { + strcpy(output, tmp_outbuf); + } + }else { + LOCATION_APPMAN_LOG("location_appman_decrypt : keybuf is NULL\n"); + return LOCATION_APPMAN_CRYPT_ERROR_INTERNAL; + } + + if (keybuf) gcry_free (keybuf); + + return LOCATION_APPMAN_CRYPT_ERROR_NONE; +} diff --git a/src/location-appman.c b/src/location-appman.c new file mode 100644 index 0000000..a4b816a --- /dev/null +++ b/src/location-appman.c @@ -0,0 +1,993 @@ +/* + * liblocation-appman + * + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang <youngae.kang@samsung.com>, Minjune Kim <sena06.kim@samsung.com> + * Genie Kim <daejins.kim@samsung.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <string.h> +#include <stdlib.h> +#include <stdarg.h> +#include <glib.h> +#include <sqlite3.h> +#include <libxml/parser.h> +#include <app_manager.h> +#include "location-appman.h" +#include "location-appman-log.h" + +#define LOCATION_APPMAN_QUERY_MAX_LEN 1024 + +#define LOCATION_APPMAN_PATH_FILE ".location-appman.db" +#define LOCATION_APPMAN_PATH_DBSPACE LOCATION_APPMAN_DBDIR +#define LOCATION_APPMAN_PATH_FULL LOCATION_APPMAN_PATH_DBSPACE"/"LOCATION_APPMAN_PATH_FILE + +#define LOCATION_APPMAN_PKG_NAME "PKG_NAME" + +sqlite3 *db_handle = NULL; + +static char *__create_table = "create table if not exists LocationApp(package VARCHAR(64) PRIMARY KEY,\ + icon VARCHAR(256), app_id INTEGER, installed_date INTEGER, recently_used INTEGER, enable BOOL);"; + +static char *__default_item[] = { + "insert into LocationApp (package, app_id, installed_date, recently_used, enable) values (\"org.tizen.setting\", 0, 0, 0, 1);", + "insert into LocationApp (package, app_id, installed_date, recently_used, enable) values (\"kmcele1k0n.Internet\", 0, 0, 0, 1);", +}; + +char *location_column_name[6] = { "package", "icon", "app_id", "installed_date", "recently_used", "enable" }; + +int location_appman_check_developer_mode(void) +{ + return FALSE; +} + +void location_appman_close(void) +{ + sqlite3_close(db_handle); + db_handle = NULL; +} + +int location_appman_open(void) +{ + int rc = SQLITE_OK; + int idx = 0; + + if (NULL != db_handle) { + LOCATION_APPMAN_LOG("location_appman_open & close\n"); + location_appman_close(); + } + + rc = sqlite3_open_v2(LOCATION_APPMAN_PATH_FULL, &db_handle, SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_READWRITE, NULL); + if (SQLITE_OK != rc) { + // DB Recovery + if (SQLITE_CANTOPEN == rc) { + rc = sqlite3_open_v2(LOCATION_APPMAN_PATH_FULL, &db_handle, SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); + if (SQLITE_OK == rc) { + rc = sqlite3_exec (db_handle, __create_table, NULL, NULL, NULL); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Failed to create table : Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_close (db_handle); + db_handle = NULL; + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + for (idx = 0; idx < sizeof(__default_item) / sizeof(char*); idx++) { + rc = sqlite3_exec (db_handle, __default_item[idx], NULL, NULL, NULL); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Failed to insert default item : Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_close (db_handle); + db_handle = NULL; + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + } + return LOCATION_APPMAN_ERROR_NONE; + } + } + + LOCATION_APPMAN_LOG("Failed to open : Error[%s]\n", sqlite3_errmsg(db_handle)); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_query(char *dest, const char *src) +{ + if (NULL == dest || NULL == src) { + LOCATION_APPMAN_LOG("location_appman_query : NULL\n"); + return FALSE; + } + + g_strlcat(dest, src, strlen(src) + 1); + return TRUE; +} + +int location_appman_drop(void) +{ + int rc = SQLITE_OK; + char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, }; + + rc = location_appman_query(query, "DROP TABLE IF EXISTS LocationApp"); + if (FALSE == rc) { + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_exec(db_handle, query, NULL, NULL, NULL); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to connect to table. Error[%s]\n", sqlite3_errmsg(db_handle)); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_insert(location_appman_s * appman) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(appman); + sqlite3_stmt *state; + int rc = SQLITE_OK; + int sql_param_index = 1; + char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, }; + const char *tail; + + if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE) + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + + rc = location_appman_query(query, + "INSERT INTO LocationApp(package, icon, app_id, installed_date, recently_used, enable)" + "VALUES (?, ?, ?, ?, ?, ?)"); + if (FALSE == rc) { + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, &tail); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]\n", sqlite3_errmsg(db_handle)); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + sqlite3_bind_text(state, sql_param_index, appman->package, strlen(appman->package), SQLITE_STATIC); + sqlite3_bind_text(state, ++sql_param_index, appman->appicon, strlen(appman->appicon), SQLITE_STATIC); + sqlite3_bind_int(state, ++sql_param_index, appman->appid); + sqlite3_bind_int(state, ++sql_param_index, appman->installed_date); + sqlite3_bind_int(state, ++sql_param_index, appman->recently_used); + sqlite3_bind_int(state, ++sql_param_index, appman->enable); + + sqlite3_step(state); + sqlite3_reset(state); + + sqlite3_finalize(state); + location_appman_close(); + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_delete(const char *package) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + sqlite3_stmt *state = NULL; + int rc = SQLITE_OK; + char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, }; + + if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE) + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + + rc = location_appman_query(query, "DELETE from LocationApp where package = ?"); + if (FALSE == rc) { + LOCATION_APPMAN_LOG("location_app_delete. Error[%d]\n", rc); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, NULL); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to connect to table. Error[%s]\n", sqlite3_errmsg(db_handle)); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + // bind the values + rc = sqlite3_bind_text(state, 1, package, strlen(package), SQLITE_STATIC); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + // step + rc = sqlite3_step(state); + if (SQLITE_DONE != rc) { + LOCATION_APPMAN_LOG("Fail to step. Error[%d]", rc); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + sqlite3_finalize(state); + location_appman_close(); + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_reset(void) +{ + int rc = SQLITE_OK; + char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, }; + + if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE) + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + + if (location_appman_drop() != LOCATION_APPMAN_ERROR_NONE) + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + + rc = location_appman_query(query, "CREATE TABLE LocationApp(\n " + "package VARCHAR(64) PRIMARY KEY,\n" + "name VARChAR(32),\n" + "icon VARCHAR(256),\n" + "app_id INTEGER,\n" "installed_date INTEGER,\n" "recently_used INTEGER,\n" "enable BOOL);"); + + if (FALSE == rc) { + LOCATION_APPMAN_LOG("location_appman_reset. Error[%d]\n", rc); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_exec(db_handle, query, NULL, NULL, NULL); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to connect to table. Error[%s]\n", sqlite3_errmsg(db_handle)); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + location_appman_close(); + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_update(location_appman_s * appman) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(appman); + sqlite3_stmt *state = NULL; + int rc = SQLITE_OK; + int sql_param_index = 1; + char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, }; + + if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE) + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + + rc = location_appman_query(query, + "UPDATE LocationApp SET icon = ?, app_id = ?, installed_date = ?, recently_used = ?, enable = ? where package = ? "); + if (FALSE == rc) { + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, NULL); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to connect to table. Error[%s]\n", sqlite3_errmsg(db_handle)); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + // bind the values + // Icon + rc = sqlite3_bind_text(state, sql_param_index++, appman->appicon, strlen(appman->appicon), SQLITE_STATIC); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + // App ID + rc = sqlite3_bind_int(state, sql_param_index++, appman->appid); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + // Installed Date + rc = sqlite3_bind_int(state, sql_param_index++, appman->installed_date); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + // Recently used + rc = sqlite3_bind_int(state, sql_param_index++, appman->recently_used); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + // Enable + rc = sqlite3_bind_int(state, sql_param_index++, appman->enable); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + // Package + rc = sqlite3_bind_text(state, sql_param_index++, appman->package, strlen(appman->package), SQLITE_STATIC); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + // step + rc = sqlite3_step(state); + if (SQLITE_DONE != rc) { + LOCATION_APPMAN_LOG("Fail to step. Error[%d]", rc); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + sqlite3_finalize(state); + location_appman_close(); + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_get_total_count(int *count) +{ + sqlite3_stmt *state; + int rc = SQLITE_OK; + int num_data; + char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, }; + const char *tail; + + if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE) + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + + rc = location_appman_query(query, "SELECT count(*) FROM LocationApp"); + if (FALSE == rc) { + location_appman_close(); + *count = -1; + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, &tail); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle)); + *count = -1; + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_step(state); + if (SQLITE_ROW == rc) { + num_data = sqlite3_column_int(state, 0); + *count = num_data; + } + + sqlite3_finalize(state); + location_appman_close(); + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_get_app_list(location_appman_column_e sort_by, int *list_count, location_appman_s ** apps) +{ + sqlite3_stmt *state; + int rc = SQLITE_OK; + int column_index = 0; + int i = 0; + int count = 0; + char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, }; + const char *tail; + + if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE) + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + + if (LOCATION_APPMAN_COLUMN_PACKAGE > sort_by || LOCATION_APPMAN_COLUMN_ENABLE < sort_by) { + sort_by = LOCATION_APPMAN_COLUMN_INSTALLED_DATE; + g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "SELECT * FROM LocationApp ORDER BY %s", + location_column_name[sort_by]); + } else { + g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "SELECT * FROM LocationApp ORDER BY %s", + location_column_name[sort_by]); + } + + if (LOCATION_APPMAN_COLUMN_RECENTLY_USED == sort_by || LOCATION_APPMAN_COLUMN_ENABLE == sort_by) { + + rc = location_appman_query(query, " DESC"); + if (FALSE == rc) { + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + } + + rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, &tail); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle)); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + location_appman_get_total_count(&count); + LOCATION_APPMAN_LOG("count [%d]", count); + *apps = (location_appman_s *) g_malloc0(sizeof(location_appman_s) * count); + + for (i = 0; i < count; i++) { + char *name; + rc = sqlite3_step(state); + g_strlcpy((*apps + i)->package, (char *)sqlite3_column_text(state, column_index++), 64); + g_strlcpy((*apps + i)->appicon, (char *)sqlite3_column_text(state, column_index++), 256); + + (*apps + i)->appid = sqlite3_column_int(state, column_index++); + (*apps + i)->installed_date = sqlite3_column_int(state, column_index++); + (*apps + i)->recently_used = sqlite3_column_int(state, column_index++); + (*apps + i)->enable = (gboolean) sqlite3_column_int(state, column_index++); + column_index = 0; + + location_appman_get_name((*apps + i)->package, &name); + g_strlcpy((*apps + i)->appname, name, 64); + + if (SQLITE_ROW != rc) { + break; + } + } + + *list_count = i; + + sqlite3_finalize(state); + location_appman_close(); + + return LOCATION_APPMAN_ERROR_NONE; +} + +// GET +int location_appman_get_column_text(const char *package, location_appman_column_e type, char **data) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + sqlite3_stmt *state; + int rc = LOCATION_APPMAN_ERROR_NONE; + const char *tail; + char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, }; + + if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE) + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + + g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "SELECT %s FROM LocationApp WHERE package = ?", + location_column_name[type]); + + rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, &tail); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle)); + location_appman_close(); + data = NULL; + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_bind_text(state, 1, package, strlen(package), SQLITE_STATIC); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_step(state); + + if (SQLITE_ROW == rc) { + *data = g_strdup((char *)sqlite3_column_text(state, 0)); + } + + sqlite3_finalize(state); + location_appman_close(); + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_get_column_int(const char *package, location_appman_column_e type, unsigned int *data) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + sqlite3_stmt *state; + int rc = LOCATION_APPMAN_ERROR_NONE; + int num_data = 0; + const char *tail; + char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, }; + + if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE) + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + + g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "SELECT %s FROM LocationApp WHERE package = ?", + location_column_name[type]); + + rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, &tail); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle)); + location_appman_close(); + data = NULL; + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_bind_text(state, 1, package, strlen(package), SQLITE_STATIC); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_step(state); + + if (SQLITE_ROW == rc) { + num_data = sqlite3_column_int(state, 0); + *data = num_data; + } + + sqlite3_finalize(state); + location_appman_close(); + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_get_name(const char *package, char **appname) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + app_info_h app_info; + char *name = NULL; + int ret = 0; + + ret = app_manager_get_app_info(package, &app_info); + if (ret != APP_MANAGER_ERROR_NONE) { + if (package) { + LOCATION_APPMAN_LOG("Can't get application information: [%s]", package); + name = strdup (package); + } + else { + LOCATION_APPMAN_LOG("Can't get application information: [%s]", package); + return LOCATION_APPMAN_ERROR_INTERNAL; + } + } + else { + + app_info_get_name(app_info, &name); + if (name == NULL || g_strcmp0 (name, "(NULL)") == 0) { + LOCATION_APPMAN_LOG("name of application[%s] is NULL", package); + name = strdup (package); + } + } + + *appname = (char *) g_malloc0(sizeof(char)*64); + g_strlcpy(*appname, name, 64); + g_free(name); + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_get_icon(const char *package, char **appicon) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + int rc = LOCATION_APPMAN_ERROR_NONE; + + rc = location_appman_get_column_text(package, LOCATION_APPMAN_COLUMN_APPICON, appicon); + if (LOCATION_APPMAN_ERROR_NONE != rc) { + LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle)); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_get_appid(const char *package, int *appid) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + int rc = LOCATION_APPMAN_ERROR_NONE; + + rc = location_appman_get_column_int(package, LOCATION_APPMAN_COLUMN_APPID, (unsigned int *)appid); + if (LOCATION_APPMAN_ERROR_NONE != rc) { + LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle)); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_get_installed_date(const char *package, unsigned int *installed_date) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + int rc = LOCATION_APPMAN_ERROR_NONE; + + rc = location_appman_get_column_int(package, LOCATION_APPMAN_COLUMN_INSTALLED_DATE, installed_date); + if (LOCATION_APPMAN_ERROR_NONE != rc) { + LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle)); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_get_recently_used(const char *package, unsigned int *recently_used) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + int rc = LOCATION_APPMAN_ERROR_NONE; + + rc = location_appman_get_column_int(package, LOCATION_APPMAN_COLUMN_RECENTLY_USED, recently_used); + if (LOCATION_APPMAN_ERROR_NONE != rc) { + LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle)); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_is_enabled(const char *package, int *enable) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + int rc = SQLITE_OK; + + rc = location_appman_get_column_int(package, LOCATION_APPMAN_COLUMN_ENABLE, (unsigned int *)enable); + if (LOCATION_APPMAN_ERROR_NONE != rc) { + LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle)); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + return LOCATION_APPMAN_ERROR_NONE; +} + +// SET +int location_appman_set_column_text(const char *package, location_appman_column_e type, char *data) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + sqlite3_stmt *state = NULL; + int rc = SQLITE_OK; + char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, }; + + if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE) + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + + g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "UPDATE LocationApp SET %s = ? WHERE package = ?", + location_column_name[type]); + + rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, NULL); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to connect to table. Error[%s]\n", sqlite3_errmsg(db_handle)); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_bind_text(state, 1, data, strlen(data), SQLITE_STATIC); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_bind_text(state, 2, package, strlen(package), SQLITE_STATIC); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_step(state); + if (SQLITE_DONE != rc) { + LOCATION_APPMAN_LOG("Fail to step. rc[%d]", rc); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + sqlite3_finalize(state); + location_appman_close(); + + return LOCATION_APPMAN_ERROR_NONE; +} + +// SET +int location_appman_set_column_int(const char *package, location_appman_column_e type, int data) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + sqlite3_stmt *state = NULL; + int rc = SQLITE_OK; + char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, }; + + if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE) + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + + g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "UPDATE LocationApp SET %s = ? WHERE package = ?", + location_column_name[type]); + + rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, NULL); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to connect to table. Error[%s]\n", sqlite3_errmsg(db_handle)); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_bind_int(state, 1, data); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind int to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_bind_text(state, 2, package, strlen(package), SQLITE_STATIC); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_step(state); + if (SQLITE_DONE != rc) { + LOCATION_APPMAN_LOG("Fail to step. rc[%d]", rc); + sqlite3_finalize(state); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + sqlite3_finalize(state); + location_appman_close(); + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_set_icon(const char *package, char *appicon) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + LOCATION_APPMAN_NULL_ARG_CHECK(appicon); + int rc = LOCATION_APPMAN_ERROR_NONE; + + rc = location_appman_set_column_text(package, LOCATION_APPMAN_COLUMN_APPICON, appicon); + if (LOCATION_APPMAN_ERROR_NONE != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_set_appid(const char *package, int appid) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + int rc = LOCATION_APPMAN_ERROR_NONE; + + rc = location_appman_set_column_int(package, LOCATION_APPMAN_COLUMN_APPID, appid); + if (LOCATION_APPMAN_ERROR_NONE != rc) { + LOCATION_APPMAN_LOG("Fail to bind int to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_set_installed_date(const char *package, unsigned int installed_date) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + int rc = LOCATION_APPMAN_ERROR_NONE; + + rc = location_appman_set_column_int(package, LOCATION_APPMAN_COLUMN_INSTALLED_DATE, installed_date); + if (LOCATION_APPMAN_ERROR_NONE != rc) { + LOCATION_APPMAN_LOG("Fail to bind int to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_set_recently_used(const char *package, unsigned int recently_used) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + int rc = LOCATION_APPMAN_ERROR_NONE; + + rc = location_appman_set_column_int(package, LOCATION_APPMAN_COLUMN_RECENTLY_USED, recently_used); + if (LOCATION_APPMAN_ERROR_NONE != rc) { + LOCATION_APPMAN_LOG("Fail to bind int to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_set_on(const char *package, int onoff) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + int rc = LOCATION_APPMAN_ERROR_NONE; + + rc = location_appman_set_column_int(package, LOCATION_APPMAN_COLUMN_ENABLE, onoff); + if (LOCATION_APPMAN_ERROR_NONE != rc) { + LOCATION_APPMAN_LOG("Fail to bind int to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appamn_parse_manifest(const char *xml, location_appman_s ** appman) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(xml); + + xmlDocPtr doc; + xmlNodePtr cur; + xmlChar *key; + location_appman_s *tmp; + + char *element[4] = { "Location", "Package", "Appid", "Enable" }; + + doc = xmlParseDoc(BAD_CAST(xml)); + + if (NULL == doc) { + LOCATION_APPMAN_LOG("Document not parsed successfully.\n"); + return LOCATION_APPMAN_ERROR_INVALID_XML; + } + + cur = xmlDocGetRootElement(doc); + if (NULL == cur) { + LOCATION_APPMAN_LOG("empty document\n"); + xmlFreeDoc(doc); + return LOCATION_APPMAN_ERROR_INVALID_XML; + } + + if (xmlStrcmp(cur->name, (const xmlChar *)element[0]) != 0) { + LOCATION_APPMAN_LOG("document of the wrong type, root node != LocationApp\n"); + xmlFreeDoc(doc); + return LOCATION_APPMAN_ERROR_INVALID_XML; + } + + tmp = (location_appman_s *) g_malloc0(sizeof(location_appman_s)); + cur = cur->xmlChildrenNode; + while (NULL != cur) { + if (xmlStrcmp(cur->name, (const xmlChar *)element[1]) == 0) { + key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); + + g_strlcpy(tmp->package, (char *)key, 64); + LOCATION_APPMAN_LOG("tmp->package = [%s]", tmp->package); + xmlFree(key); + } else if (xmlStrcmp(cur->name, (const xmlChar *)element[2]) == 0) { + key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); + + tmp->appid = atoi((char *)key); + LOCATION_APPMAN_LOG("tmp->appid = [%d]", tmp->appid); + xmlFree(key); + } else if (xmlStrcmp(cur->name, (const xmlChar *)element[3]) == 0) { + key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); + + tmp->enable = atoi((char *)key); + LOCATION_APPMAN_LOG("tmp->enable = [%d]", tmp->enable); + xmlFree(key); + } + cur = cur->next; + } + + *appman = tmp; + + xmlFreeDoc(doc); + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_get_package_by_pid(pid_t pid, location_appman_s ** appman) +{ + if (pid <= 0) { + LOCATION_APPMAN_LOG("Invalid PID : [%ld]", pid); + return LOCATION_APPMAN_ERROR_INVALID_PARAMETER; + } + + location_appman_s *tmp = NULL; + char *package = NULL; + int ret = 0; + + ret = app_manager_get_package(pid, &package); + if (ret != APP_MANAGER_ERROR_NONE) { + const char *pkg_name = g_getenv(LOCATION_APPMAN_PKG_NAME); + if (!pkg_name) { + LOCATION_APPMAN_LOG("Can't find package name : [%ld]", pid); + return LOCATION_APPMAN_ERROR_INVALID_PARAMETER; + } + package = g_strdup(pkg_name); + } + + tmp = (location_appman_s *) g_malloc0(sizeof(location_appman_s)); + g_strlcpy(tmp->package, package, 64); + *appman = tmp; + + g_free(package); + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_find_package(const char *package, int *findpackage) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(package); + sqlite3_stmt *state; + int rc = LOCATION_APPMAN_ERROR_NONE; + int enable = 0; + const char *tail; + char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, }; + + if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE) + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + + g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "SELECT enable FROM LocationApp WHERE package = ?"); + + rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, &tail); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle)); + location_appman_close(); + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_bind_text(state, 1, package, strlen(package), SQLITE_STATIC); + if (SQLITE_OK != rc) { + LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle)); + sqlite3_finalize(state); + location_appman_close(); + + return LOCATION_APPMAN_ERROR_SQLITE_FAIL; + } + + rc = sqlite3_step(state); + if (SQLITE_ROW == rc) { + enable = sqlite3_column_int(state, 0); + if (enable == 0) { + *findpackage = LOCATION_APPMAN_ENABLE_OFF; + } else { + *findpackage = LOCATION_APPMAN_ENABLE_ON; + } + } else if (SQLITE_DONE) { + *findpackage = LOCATION_APPMAN_PACKAGE_NOTFOUND; + } + + sqlite3_finalize(state); + location_appman_close(); + + return LOCATION_APPMAN_ERROR_NONE; +} + +int location_appman_register_package(location_appman_s * appman) +{ + LOCATION_APPMAN_NULL_ARG_CHECK(appman); + LOCATION_APPMAN_NULL_ARG_CHECK(appman->package); + + app_info_h app_info; + time_t timestamp; + char *name = NULL; + int ret = 0; + + ret = app_manager_get_app_info(appman->package, &app_info); + if (ret == APP_MANAGER_ERROR_NONE) { + app_info_get_name(app_info, &name); + if (name != NULL) { + g_strlcpy(appman->appname, name, 64); + g_free(name); + } + app_info_get_icon(app_info, &name); + if (name != NULL) { + g_strlcpy(appman->appicon, name, 256); + g_free(name); + } + } else { + LOCATION_APPMAN_LOG("Can't get application information: [%s]", appman->package); + return LOCATION_APPMAN_ERROR_INTERNAL; + } + + // wait for a new api. + //if(0 == appman->appid) + // appman->appid = 0; + + time(×tamp); + appman->installed_date = timestamp; + appman->recently_used = timestamp; + + location_appman_insert(appman); + + app_info_destroy(app_info); + + return LOCATION_APPMAN_ERROR_NONE; +} |