summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJaeho Lee <jaeho81.lee@samsung.com>2012-12-07 11:20:40 +0900
committerJaeho Lee <jaeho81.lee@samsung.com>2012-12-07 11:20:40 +0900
commit1d6058631764d25163b836e9622c196707809411 (patch)
tree316d7e952c56babb516acaf1677cb4640608e4a8 /src
parent59fd9dece4cc98b1f8ce4642d787fc38fa5fc7fc (diff)
downloadapp-svc-1d6058631764d25163b836e9622c196707809411.tar.gz
app-svc-1d6058631764d25163b836e9622c196707809411.tar.bz2
app-svc-1d6058631764d25163b836e9622c196707809411.zip
support wildcard for uri path
Signed-off-by: Jaeho Lee <jaeho81.lee@samsung.com>
Diffstat (limited to 'src')
-rwxr-xr-xsrc/appsvc.c70
-rwxr-xr-xsrc/appsvc_db.c151
2 files changed, 218 insertions, 3 deletions
diff --git a/src/appsvc.c b/src/appsvc.c
index 772407b..37fabb8 100755
--- a/src/appsvc.c
+++ b/src/appsvc.c
@@ -515,6 +515,14 @@ static int __get_list_with_condition_mime_extened(char *op, char *uri, char *mim
return 0;
}
+static int __get_list_with_condition_mime_extened_with_collation(char *op, char *uri, char *mime,
+ char *m_type, char *s_type, GSList **pkg_list)
+{
+ _svc_db_get_list_with_collation(op, uri, mime, pkg_list);
+
+ return 0;
+}
+
GSList *tmp_list;
static int __app_list_cb(pkgmgrinfo_appinfo_h handle, void *user_data)
{
@@ -601,6 +609,54 @@ SLPAPI int appsvc_run_service(bundle *b, int request_code, appsvc_res_fn cbfunc,
return ret;
}
+ /*uri*/
+ pkgname = _svc_db_get_app(info.op, info.origin_mime, info.uri);
+ if(pkgname==NULL){
+ __get_list_with_condition_mime_extened_with_collation(info.op, info.uri,
+ info.mime, info.m_type, info.s_type, &pkg_list);
+ pkg_count = g_slist_length(pkg_list);
+ if(pkg_count > 0) {
+
+ if(info.uri_r_info) {
+ __get_list_with_condition_mime_extened(info.op, info.uri_r_info,
+ info.mime, info.m_type, info.s_type, &pkg_list);
+ }
+
+ __get_list_with_condition_mime_extened(info.op, info.scheme,
+ info.mime, info.m_type, info.s_type, &pkg_list);
+
+ if(info.category) {
+ __get_list_with_category(info.category, &pkg_list);
+ }
+
+ pkg_count = g_slist_length(pkg_list);
+ _D("pkg_count : %d", pkg_count);
+
+ if(pkg_count == 1){
+ pkgname = (char *)pkg_list->data;
+ if(pkgname != NULL){
+ ret = __run_svc_with_pkgname(pkgname, b, request_code, cbfunc, data);
+ goto end;
+ }
+ } else {
+ bundle_add(b, APP_SVC_K_URI_R_INFO, info.uri);
+ ret = __run_svc_with_pkgname(APP_SELECTOR, b, request_code, cbfunc, data);
+ goto end;
+ }
+ for (iter = pkg_list; iter != NULL; iter = g_slist_next(iter)) {
+ list_item = (char *)iter->data;
+ g_free(list_item);
+ }
+ g_slist_free(pkg_list);
+ pkg_list = NULL;
+ }
+ } else {
+ ret = __run_svc_with_pkgname(pkgname, b, request_code, cbfunc, data);
+ free(pkgname);
+ goto end;
+ }
+
+ /*scheme & host*/
if(info.uri_r_info) {
pkgname = _svc_db_get_app(info.op, info.origin_mime, info.uri_r_info);
@@ -626,7 +682,7 @@ SLPAPI int appsvc_run_service(bundle *b, int request_code, appsvc_res_fn cbfunc,
goto end;
}
} else {
- bundle_add(b, APP_SVC_K_URI_R_INFO, APP_SVC_V_SCHEME_AND_HOST);
+ bundle_add(b, APP_SVC_K_URI_R_INFO, info.uri_r_info);
ret = __run_svc_with_pkgname(APP_SELECTOR, b, request_code, cbfunc, data);
goto end;
}
@@ -643,7 +699,8 @@ SLPAPI int appsvc_run_service(bundle *b, int request_code, appsvc_res_fn cbfunc,
goto end;
}
}
-
+
+ /*scheme*/
pkgname = _svc_db_get_app(info.op, info.origin_mime, info.scheme);
if(pkgname==NULL){
@@ -666,7 +723,7 @@ SLPAPI int appsvc_run_service(bundle *b, int request_code, appsvc_res_fn cbfunc,
__free_resolve_info_data(&info);
return APPSVC_RET_ENOMATCH;
} else {
- bundle_add(b, APP_SVC_K_URI_R_INFO, APP_SVC_V_SCHEME);
+ bundle_add(b, APP_SVC_K_URI_R_INFO, info.scheme);
ret = __run_svc_with_pkgname(APP_SELECTOR, b, request_code, cbfunc, data);
}
@@ -714,6 +771,9 @@ SLPAPI int appsvc_get_list(bundle *b, appsvc_info_iter_fn iter_fn, void *data)
_D("operation - %s / shceme - %s / mime - %s\n", info.op, info.scheme, info.mime);
+ __get_list_with_condition_mime_extened_with_collation(info.op, info.uri,
+ info.mime, info.m_type, info.s_type, &pkg_list);
+
if(info.uri_r_info) {
__get_list_with_condition_mime_extened(info.op, info.uri_r_info,
info.mime, info.m_type, info.s_type, &pkg_list);
@@ -722,6 +782,10 @@ SLPAPI int appsvc_get_list(bundle *b, appsvc_info_iter_fn iter_fn, void *data)
__get_list_with_condition_mime_extened(info.op, info.scheme,
info.mime, info.m_type, info.s_type, &pkg_list);
+ if(info.category) {
+ __get_list_with_category(info.category, &pkg_list);
+ }
+
pkg_count = g_slist_length(pkg_list);
if (pkg_count == 0) {
_E("Cannot find associated application");
diff --git a/src/appsvc_db.c b/src/appsvc_db.c
index 3edcbdb..800e644 100755
--- a/src/appsvc_db.c
+++ b/src/appsvc_db.c
@@ -23,16 +23,23 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#include <glib.h>
#include "appsvc_db.h"
#include "internal.h"
#define SVC_DB_PATH "/opt/dbspace/.appsvc.db"
+#define APP_INFO_DB_PATH "/opt/dbspace/.app_info.db"
+
#define QUERY_MAXLEN 4096
#define BUF_MAX_LEN 1024
+#define APPSVC_COLLATION "appsvc_collation"
+
static sqlite3 *svc_db = NULL;
+static sqlite3 *app_info_db = NULL;
+
/**
@@ -66,6 +73,104 @@ err:
return -1;
}
+static int __collate_appsvc(void *ucol, int str1_len, const void *str1, int str2_len, const void *str2)
+{
+ char *saveptr1, *saveptr2;
+ char *dup_str1;
+ char *dup_str2;
+ char *token;
+ char *in_op;
+ char *in_uri;
+ char *in_mime;
+ char *op;
+ char *uri;
+ char *mime;
+ int i;
+
+ if(str1 == NULL || str2 == NULL)
+ return -1;
+
+ dup_str1 = strdup(str1);
+ dup_str2 = strdup(str2);
+
+ in_op = strtok_r(dup_str2, "|", &saveptr1);
+ in_uri = strtok_r(NULL, "|", &saveptr1);
+ in_mime = strtok_r(NULL, "|", &saveptr1);
+
+ token = strtok_r(dup_str1, ";", &saveptr1);
+
+ if(token == NULL) {
+ free(dup_str1);
+ free(dup_str2);
+ return -1;
+ }
+
+ do {
+ //_D("token : %s", token);
+ op = strtok_r(token, "|", &saveptr2);
+ uri = strtok_r(NULL, "|", &saveptr2);
+ mime = strtok_r(NULL, "|", &saveptr2);
+
+ if( (strcmp(op, in_op) == 0) && (strcmp(mime, in_mime) == 0) ) {
+ _D("%s %s %s %s %s %s", op, in_op, mime, in_mime, uri, in_uri);
+ if(strcmp(uri, in_uri) == 0) {
+ free(dup_str1);
+ free(dup_str2);
+ return 0;
+ } else {
+ for(i=0; uri[i]!=0; i++) {
+ if(uri[i] == '*') {
+ uri[i] = 0;
+ if(strstr(in_uri, uri)) {
+ _D("in_uri : %s | uri : %s", in_uri, uri);
+ free(dup_str1);
+ free(dup_str2);
+ return 0;
+ }
+ }
+ }
+ }
+ }
+ } while(token = strtok_r(NULL, ";", &saveptr1));
+
+ free(dup_str1);
+ free(dup_str2);
+
+ return -1;
+}
+
+static int __init_app_info_db(void)
+{
+ int rc;
+
+ if (app_info_db) {
+ _D("Already initialized\n");
+ return 0;
+ }
+
+ rc = sqlite3_open(APP_INFO_DB_PATH, &app_info_db);
+ if(rc) {
+ _E("Can't open database: %s", sqlite3_errmsg(app_info_db));
+ goto err;
+ }
+
+ // Enable persist journal mode
+ rc = sqlite3_exec(app_info_db, "PRAGMA journal_mode = PERSIST", NULL, NULL, NULL);
+ if(SQLITE_OK!=rc){
+ _D("Fail to change journal mode\n");
+ goto err;
+ }
+
+ sqlite3_create_collation(app_info_db, APPSVC_COLLATION, SQLITE_UTF8, NULL,
+ __collate_appsvc);
+
+ return 0;
+err:
+ sqlite3_close(app_info_db);
+ return -1;
+}
+
+
static int __fini(void)
{
if (svc_db) {
@@ -233,3 +338,49 @@ char* _svc_db_get_app(const char *op, const char *mime_type, const char *uri)
return pkgname;
}
+int _svc_db_get_list_with_collation(char *op, char *uri, char *mime, GSList **pkg_list)
+{
+ char query[BUF_MAX_LEN];
+ sqlite3_stmt* stmt;
+ int ret;
+ GSList *iter = NULL;
+ char *str = NULL;
+ char *pkgname = NULL;
+ int found;
+
+ if(__init_app_info_db()<0)
+ return 0;
+
+ sprintf(query,"select package from app_info where x_slp_svc='%s|%s|%s' collate appsvc_collation", op,uri,mime);
+ _D("query : %s\n",query);
+
+ ret = sqlite3_prepare(app_info_db, query, strlen(query), &stmt, NULL);
+
+ if ( ret != SQLITE_OK) {
+ _E("prepare error\n");
+ return -1;
+ }
+
+ while (sqlite3_step(stmt) == SQLITE_ROW) {
+ str = sqlite3_column_text(stmt, 0);
+ found = 0;
+ for (iter = *pkg_list; iter != NULL; iter = g_slist_next(iter)) {
+ pkgname = (char *)iter->data;
+ if (strncmp(str,pkgname, MAX_PACKAGE_STR_SIZE-1) == 0) {
+ found = 1;
+ break;
+ }
+ }
+ if(found == 0) {
+ pkgname = strdup(str);
+ *pkg_list = g_slist_append(*pkg_list, (void *)pkgname);
+ _D("%s is added",pkgname);
+ }
+ }
+
+ ret = sqlite3_finalize(stmt);
+
+ return 0;
+}
+
+