Add new internal API
authorSung-jae Park <nicesj.park@samsung.com>
Thu, 27 Jun 2013 07:50:50 +0000 (16:50 +0900)
committerSung-jae Park <nicesj.park@samsung.com>
Thu, 27 Jun 2013 07:50:50 +0000 (16:50 +0900)
Detecting updated file is not completed handled by inotify.
So add new API for explictly notify updated cotnent to the provider.

Change-Id: Ie7febc177aec73a570242f9e8efa2cbc97a75bf8

include/lb.h
include/update_monitor.h
packaging/org.tizen.data-provider-slave.spec
src/lb.c
src/update_monitor.c

index d2ac15d..34bab45 100644 (file)
@@ -53,5 +53,6 @@ extern int lb_delete_all_deleteme(void);
  */
 extern const char *livebox_find_pkgname(const char *filename);
 extern int livebox_request_update_by_id(const char *filename);
+extern int livebox_trigger_update_monitor(const char *id, int is_pd);
 
 /* End of a file */
index e52a260..bd2b55c 100644 (file)
@@ -21,5 +21,7 @@ extern int update_monitor_add_update_cb(const char *filename, int (*cb)(const ch
 extern int update_monitor_add_delete_cb(const char *filename, int (*cb)(const char *filename, void *data, int over), void *data);
 extern void *update_monitor_del_update_cb(const char *filename, int (*cb)(const char *filename, void *data, int over));
 extern void *update_monitor_del_delete_cb(const char *filename, int (*cb)(const char *filename, void *data, int over));
+extern int update_monitor_trigger_update_cb(const char *filename, int over);
+extern int update_monitor_trigger_delete_cb(const char *filename, int over);
 
 // End of a file
index a1f218b..be86389 100644 (file)
@@ -2,7 +2,7 @@
 
 Name: org.tizen.data-provider-slave
 Summary: Plugin type livebox service provider.
-Version: 0.11.11
+Version: 0.12.0
 Release: 1
 Group: HomeTF/Livebox
 License: Flora License
index 25cb140..417c4bd 100644 (file)
--- a/src/lb.c
+++ b/src/lb.c
@@ -17,6 +17,7 @@
 #include <stdio.h>
 #include <stdlib.h> /* exit */
 #include <errno.h>
+#include <unistd.h> /* access */
 
 #include <Ecore.h>
 #include <Eina.h>
@@ -757,6 +758,41 @@ int livebox_request_update_by_id(const char *filename)
        return LB_STATUS_ERROR_NOT_EXIST;
 }
 
+int livebox_trigger_update_monitor(const char *filename, int is_pd)
+{
+       char *fname;
+       int ret;
+
+       if (is_pd) {
+               int len;
+               len = strlen(filename) + strlen(".desc");
+
+               fname = malloc(len + 1);
+               if (!fname) {
+                       ErrPrint("Heap: %s\n", strerror(errno));
+                       return LB_STATUS_ERROR_MEMORY;
+               }
+
+               snprintf(fname, len, "%s.desc", filename);
+       } else {
+               fname = strdup(filename);
+               if (!fname) {
+                       ErrPrint("Heap: %s\n", strerror(errno));
+                       return LB_STATUS_ERROR_MEMORY;
+               }
+       }
+
+       if (access(fname, R_OK | W_OK) != 0) {
+               ErrPrint("access: %s (%s)\n", fname, strerror(errno));
+               ret = LB_STATUS_ERROR_IO;
+       } else {
+               ret = update_monitor_trigger_update_cb(fname, 0);
+       }
+
+       free(fname);
+       return ret;
+}
+
 HAPI int lb_open_pd(const char *pkgname)
 {
        Eina_List *l;
index bf19c10..7722f45 100644 (file)
@@ -60,9 +60,6 @@ static Eina_Bool monitor_cb(void *data, Ecore_Fd_Handler *handler)
 {
        int fd;
        int read_size;
-       Eina_List *l;
-       Eina_List *n;
-       struct cb_item *item;
        char *buffer;
        register int i;
        struct inotify_event *evt;
@@ -128,21 +125,9 @@ static Eina_Bool monitor_cb(void *data, Ecore_Fd_Handler *handler)
                }
 
                if (evt->mask & (IN_DELETE | IN_MOVED_FROM)) {
-                       EINA_LIST_FOREACH_SAFE(s_info.delete_list, l, n, item) {
-                               if (!strcmp(filename, item->filename) && item->cb(filename, item->data, !!(evt->mask & IN_Q_OVERFLOW)) == EXIT_FAILURE) {
-                                       s_info.delete_list = eina_list_remove_list(s_info.delete_list, l);
-                                       free(item->filename);
-                                       free(item);
-                               }
-                       }
+                       update_monitor_trigger_delete_cb(filename, !!(evt->mask & IN_Q_OVERFLOW));
                } else if (evt->mask & (IN_CLOSE_WRITE | IN_MOVED_TO)) {
-                       EINA_LIST_FOREACH_SAFE(s_info.update_list, l, n, item) {
-                               if (!strcmp(filename, item->filename) && item->cb(filename, item->data, !!(evt->mask & IN_Q_OVERFLOW)) == EXIT_FAILURE) {
-                                       s_info.update_list = eina_list_remove_list(s_info.update_list, l);
-                                       free(item->filename);
-                                       free(item);
-                               }
-                       }
+                       update_monitor_trigger_update_cb(filename, !!(evt->mask & IN_Q_OVERFLOW));
                }
 
                free(filename);
@@ -214,6 +199,44 @@ HAPI int update_monitor_fini(void)
        return LB_STATUS_SUCCESS;
 }
 
+HAPI int update_monitor_trigger_update_cb(const char *filename, int over)
+{
+       Eina_List *l;
+       Eina_List *n;
+       struct cb_item *item;
+       int cnt = 0;
+
+       EINA_LIST_FOREACH_SAFE(s_info.update_list, l, n, item) {
+               if (!strcmp(filename, item->filename) && item->cb(filename, item->data, over) == EXIT_FAILURE) {
+                       s_info.update_list = eina_list_remove_list(s_info.update_list, l);
+                       free(item->filename);
+                       free(item);
+                       cnt++;
+               }
+       }
+
+       return cnt == 0 ? LB_STATUS_ERROR_INVALID : LB_STATUS_SUCCESS;
+}
+
+HAPI int update_monitor_trigger_delete_cb(const char *filename, int over)
+{
+       Eina_List *l;
+       Eina_List *n;
+       struct cb_item *item;
+       int cnt = 0;
+
+       EINA_LIST_FOREACH_SAFE(s_info.delete_list, l, n, item) {
+               if (!strcmp(filename, item->filename) && item->cb(filename, item->data, over) == EXIT_FAILURE) {
+                       s_info.delete_list = eina_list_remove_list(s_info.delete_list, l);
+                       free(item->filename);
+                       free(item);
+                       cnt++;
+               }
+       }
+
+       return cnt == 0 ? LB_STATUS_ERROR_INVALID : LB_STATUS_SUCCESS;
+}
+
 HAPI int update_monitor_add_update_cb(const char *filename,
                int (*cb)(const char *filename, void *data, int over), void *data)
 {