Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        Makefile.am e_apps.c e_apps_cache.c e_apps_cache.h e_main.c 
        e_utils.c 
Added Files:
        e_eapp_cache_gen_main.c 


Log Message:


eapp cache works - or well, should. it should update the caches if dirs
change contents or files change etc. etc. etc. theres also a cmd-line util
that can pre-generate caches for a directory or a dir tree for you :)

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/Makefile.am,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -3 -r1.48 -r1.49
--- Makefile.am 25 Sep 2005 03:28:18 -0000      1.48
+++ Makefile.am 25 Sep 2005 04:58:18 -0000      1.49
@@ -8,7 +8,11 @@
           @cf_cflags@ \
           @EDJE_DEF@
 
-bin_PROGRAMS = enlightenment enlightenment_remote enlightenment_eapp
+bin_PROGRAMS = \
+enlightenment \
+enlightenment_remote \
+enlightenment_eapp \
+enlightenment_eapp_cache_gen
 
 ENLIGHTENMENTHEADERS = \
 e.h \
@@ -32,7 +36,6 @@
 e_object.h \
 e_icon.h \
 e_box.h \
-e_entry.h \
 e_int_menus.h \
 e_module.h \
 e_apps.h \
@@ -74,10 +77,10 @@
 e_configure.h \
 e_about.h \
 e_theme_about.h \
-e_apps_cache.h
+e_apps_cache.h \
+e_entry.h
 
-enlightenment_SOURCES = \
-e_main.c \
+enlightenment_src = \
 e_user.c \
 e_manager.c \
 e_path.c \
@@ -94,7 +97,6 @@
 e_object.c \
 e_icon.c \
 e_box.c \
-e_entry.c \
 e_int_menus.c \
 e_module.c \
 e_apps.c \
@@ -137,8 +139,13 @@
 e_about.c \
 e_theme_about.c \
 e_apps_cache.c \
+e_entry.c \
 $(ENLIGHTENMENTHEADERS)
 
+enlightenment_SOURCES = \
+e_main.c \
+$(enlightenment_src)
+
 enlightenment_LDFLAGS = -export-dynamic @e_libs@ @x_libs@ @dlopen_libs@ 
@cf_libs@
 
 enlightenment_remote_SOURCES = \
@@ -154,6 +161,13 @@
 
 enlightenment_eapp_LDFLAGS = @e_libs@ @dlopen_libs@
 
+enlightenment_eapp_cache_gen_SOURCES = \
+e_eapp_cache_gen_main.c \
+$(enlightenment_src)
+
+enlightenment_eapp_cache_gen_LDFLAGS = @e_libs@ @dlopen_libs@
+
+
 installed_headersdir = $(prefix)/include/enlightenment
 installed_headers_DATA = $(ENLIGHTENMENTHEADERS)
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_apps.c,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -3 -r1.68 -r1.69
--- e_apps.c    24 Sep 2005 17:25:48 -0000      1.68
+++ e_apps.c    25 Sep 2005 04:58:18 -0000      1.69
@@ -16,6 +16,7 @@
 /* local subsystem functions */
 typedef struct _E_App_Change_Info E_App_Change_Info;
 typedef struct _E_App_Callback    E_App_Callback;
+typedef struct _E_App_Scan_Cache  E_App_Scan_Cache;
 
 struct _E_App_Change_Info
 {
@@ -30,6 +31,16 @@
    unsigned char delete_me : 1;
 };
 
+struct _E_App_Scan_Cache
+{
+   char          *path;
+   E_App_Cache   *cache;
+   E_App         *app;
+   Ecore_List    *files;
+   Ecore_Timer   *timer;
+   unsigned char  need_rewrite : 1;
+};
+
 static void      _e_app_free               (E_App *a);
 static void      _e_app_fields_fill        (E_App *a, const char *path);
 static E_App     *_e_app_subapp_file_find  (E_App *a, const char *file);
@@ -143,12 +154,92 @@
    a->wait_exit = ac->wait_exit;
 }
 
+Evas_Bool 
+_e_app_cb_scan_hash_foreach(Evas_Hash *hash, const char *key, void *data, void 
*fdata)
+{
+   E_App_Scan_Cache *sc;
+   E_App_Cache *ac;
+   char *s;
+   char buf[4096];
+   
+   sc = fdata;
+   s = (char *)key;
+   ac = data;
+   /* file "s" has been deleted */
+   printf("Cache %s - DELETED\n", s);
+   sc->need_rewrite = 1;
+   return 1;
+}
+
+static int
+_e_app_cb_scan_cache_timer(void *data)
+{
+   E_App_Scan_Cache *sc;
+   char *s;
+   char buf[4096];
+   E_App_Cache *ac;
+   int is_dir = 0;
+   
+   sc = data;
+   s = ecore_list_next(sc->files);
+   if (!s)
+     {
+       evas_hash_foreach(sc->cache->subapps_hash, _e_app_cb_scan_hash_foreach, 
sc);
+       if (sc->need_rewrite)
+         _e_app_subdir_rescan(sc->app);
+       sc->app->monitor = ecore_file_monitor_add(sc->app->path, 
_e_app_cb_monitor, sc->app);
+       e_object_unref(E_OBJECT(sc->app));
+       ecore_list_destroy(sc->files);
+       e_app_cache_free(sc->cache);
+       ecore_timer_del(sc->timer);
+       free(sc->path);
+       free(sc);
+       printf("Cache scan finish.\n");
+       return 0;
+     }
+   snprintf(buf, sizeof(buf), "%s/%s", sc->path, s);
+   is_dir = ecore_file_is_dir(buf);
+   if (e_util_glob_match(s, "*.eap") || is_dir)
+     {
+       ac = evas_hash_find(sc->cache->subapps_hash, s);
+       if (ac)
+         {
+            if (is_dir != ac->is_dir)
+              {
+                 printf("Cache %s - CHANGED TYPE\n", s);
+                 sc->need_rewrite =1 ;
+              }
+            else if (!is_dir)
+              {
+                 unsigned long long mtime;
+                 
+                 mtime = ecore_file_mod_time(buf);
+                 if (mtime != ac->file_mod_time)
+                   {
+                      /* file "s" has changed */
+                      printf("Cache %s - MODIFIED\n", s);
+                      sc->need_rewrite = 1;
+                   }
+              }
+            sc->cache->subapps_hash = evas_hash_del(sc->cache->subapps_hash, 
s, ac);
+         }
+       else
+         {
+            /* file "s" has been added */
+            printf("Cache %s - MODIFIED\n", s);
+            sc->need_rewrite = 1;
+         }
+     }
+   return 1;
+}
+
 static E_App *
 _e_app_cache_new(E_App_Cache *ac, char *path, int scan_subdirs)
 {
    Evas_List *l;
    E_App *a;
    char buf[PATH_MAX];
+   E_App_Scan_Cache *sc;
    
    a = E_OBJECT_ALLOC(E_App, E_APP_TYPE, _e_app_free);
    _e_app_cache_copy(ac, a);
@@ -158,12 +249,10 @@
      {
        E_App_Cache *ac2;
        E_App *a2;
-       int is_dir;
        
        ac2 = l->data;
        snprintf(buf, sizeof(buf), "%s/%s", path, ac2->file);
-       is_dir = ecore_file_is_dir(buf);
-       if ((is_dir) && (scan_subdirs))
+       if ((ac2->is_dir) && (scan_subdirs))
          {
             a2 = e_app_new(buf, scan_subdirs);
             a2->parent = a;
@@ -171,11 +260,11 @@
          }
        else
          {
-            if (ecore_file_exists(buf))
+            if (!ac2->is_link)
               {
                  a2 = E_OBJECT_ALLOC(E_App, E_APP_TYPE, _e_app_free);
                  _e_app_cache_copy(ac2, a2);
-                 if (is_dir)
+                 if (ac2->is_dir)
                    {
                       E_FREE(a2->exe);
                    }
@@ -216,11 +305,19 @@
               }
          }
      }
-   
-   /* FIXME: create timer object to scan this slowly and fixup */
-   
-   // and at the end of the slow scan add this:
-   // a->monitor = ecore_file_monitor_add(a->path, _e_app_cb_monitor, a);
+
+   sc = calloc(1, sizeof(E_App_Scan_Cache));
+   if (sc)
+     {
+       sc->path = strdup(path);
+       sc->cache = ac;
+       sc->app = a;
+       sc->files = e_app_dir_file_list_get(a);
+       sc->timer = ecore_timer_add(0.001, _e_app_cb_scan_cache_timer, sc);
+       e_object_ref(E_OBJECT(sc->app));
+     }
+   else
+     e_app_cache_free(ac);
    return a;
 }
 
@@ -239,20 +336,19 @@
        e_object_ref(E_OBJECT(a));
        return a;
      }
-/*   
+
    ac = e_app_cache_load((char *)path);
    if (ac)
      {
-       a = _e_app_cache_new(ac, path, scan_subdirs);
+       a = _e_app_cache_new(ac, (char *)path, scan_subdirs);
        if (a)
          {
             _e_apps = evas_hash_add(_e_apps, a->path, a);
             _e_apps_list = evas_list_prepend(_e_apps_list, a);
          }
-       e_app_cache_free(ac);
+//     e_app_cache_free(ac);
      }
    else
- */
      {
        if (ecore_file_exists(path))
          {
@@ -1480,6 +1576,14 @@
        e_object_unref(E_OBJECT(ch->app));
        free(ch);
      }
+   if (changes)
+     {
+       E_App_Cache *ac;
+       
+       ac = e_app_cache_generate(app);
+       e_app_cache_save(ac, app->path);
+       e_app_cache_free(ac);
+     }
    evas_list_free(changes);
 }
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_apps_cache.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- e_apps_cache.c      24 Sep 2005 17:25:48 -0000      1.2
+++ e_apps_cache.c      25 Sep 2005 04:58:18 -0000      1.3
@@ -46,6 +46,8 @@
    NEWL("ap", subapps, _e_app_cache_edd);
    NEWI("sn", startup_notify, EET_T_UCHAR);
    NEWI("wx", wait_exit, EET_T_UCHAR);
+   NEWI("il", is_link, EET_T_UCHAR);
+   NEWI("id", is_dir, EET_T_UCHAR);
    return 1;
 }
 
@@ -69,6 +71,18 @@
    if (!ef) return NULL;
    ac = eet_data_read(ef, _e_app_cache_edd, "cache");
    eet_close(ef);
+   if (ac)
+     {
+       Evas_List *l;
+       
+       for (l = ac->subapps; l; l = l->next)
+         {
+            E_App_Cache *ac2;
+            
+            ac2 = l->data;
+            ac->subapps_hash = evas_hash_add(ac->subapps_hash, ac2->file, ac2);
+         }
+     }
    return ac;
 }
 
@@ -77,6 +91,7 @@
 {
    E_App_Cache *ac;
    Evas_List *l;
+   char buf[PATH_MAX];
    
    if (!a) return NULL;
    ac = calloc(1, sizeof(E_App_Cache));
@@ -92,6 +107,11 @@
        if (ac2)
          {
             _e_eapp_cache_fill(ac2, a2);
+            ac2->is_dir = ecore_file_is_dir(a2->path);
+            snprintf(buf, sizeof(buf), "%s/%s", a->path, 
ecore_file_get_file(a2->path));
+            if (a2->orig) ac2->is_link = 1;
+            if ((!ac2->is_link) && (!ac2->is_dir))
+              ac2->file_mod_time = ecore_file_mod_time(buf);
             ac->subapps = evas_list_append(ac->subapps, ac2);
             ac->subapps_hash = evas_hash_add(ac->subapps_hash, ac2->file, ac2);
          }
@@ -99,70 +119,6 @@
    return ac;
 }
 
-E_App_Cache *
-e_app_cache_path_generate(char *path)
-{
-   E_App_Cache *ac;
-   E_App *a;
-   char buf[PATH_MAX];
-   Ecore_List *files;
-
-   if (!path) return NULL;
-   ac = calloc(1, sizeof(E_App_Cache));
-   if (!ac) return NULL;
-   a = e_app_raw_new();
-   a->path = strdup(path);
-   _e_eapp_cache_fill(ac, a);
-   if (ecore_file_is_dir(a->path))
-     {
-       snprintf(buf, sizeof(buf), "%s/.directory.eap", path);
-       if (ecore_file_exists(buf))
-         e_app_fields_fill(a, buf);
-       else
-         a->name = strdup(ecore_file_get_file(a->path));
-       
-       files = e_app_dir_file_list_get(a);
-       if (files)
-         {
-            char *s = NULL;
-            
-            while ((s = ecore_list_next(files)))
-              {
-                 E_App *a2;
-                 E_App_Cache *ac2;
-                 
-                 ac2 = calloc(1, sizeof(E_App_Cache));
-                 if (ac2)
-                   {
-                      a2 = e_app_raw_new();
-                      if (a2)
-                        {
-                           snprintf(buf, sizeof(buf), "%s/%s", a->path, s);
-                           a2->path = strdup(buf);
-                           if (ecore_file_is_dir(a2->path))
-                             {
-                                snprintf(buf, sizeof(buf), 
"%s/.directory.eap", a2->path);
-                                e_app_fields_fill(a2, buf);
-                             }
-                           else
-                             e_app_fields_fill(a2, a2->path);
-                           _e_eapp_cache_fill(ac2, a2);
-                           e_app_fields_empty(a2);
-                           free(a2);
-                        }
-                      ac->subapps = evas_list_append(ac->subapps, ac2);
-                      ac->subapps_hash = evas_hash_add(ac->subapps_hash, 
ac2->file, ac2);
-                   }
-              }
-            ecore_list_destroy(files);
-         }
-     }
-   e_app_fields_empty(a);
-   free(a);
-   
-   return ac;
-}
-
 void
 e_app_cache_free(E_App_Cache *ac)
 {
@@ -189,8 +145,6 @@
    free(ac);
 }
 
-
-
 int
 e_app_cache_save(E_App_Cache *ac, char *path)
 {
@@ -218,7 +172,6 @@
    IF_DUP(comment);
    IF_DUP(exe);
    ac->file = strdup(ecore_file_get_file(a->path));
-   ac->file_mod_time = ecore_file_mod_time(a->path);
    IF_DUP(win_name);
    IF_DUP(win_class);
    IF_DUP(win_title);
@@ -227,4 +180,3 @@
    ac->startup_notify = a->startup_notify;
    ac->wait_exit = a->wait_exit;
 }
-
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_apps_cache.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- e_apps_cache.h      24 Sep 2005 17:25:48 -0000      1.2
+++ e_apps_cache.h      25 Sep 2005 04:58:18 -0000      1.3
@@ -30,6 +30,9 @@
    
    unsigned char       startup_notify; /* disable while starting etc. */
    unsigned char       wait_exit; /* wait for app to exit before execing next 
*/
+
+   unsigned char       is_link; /* cached .order logic info */
+   unsigned char       is_dir; /* cached stat info */
    
    /* these are generated post-load */
    Evas_Hash          *subapps_hash; /* a quick lookup hash */
@@ -40,7 +43,6 @@
 
 EAPI E_App_Cache *e_app_cache_load(char *path);
 EAPI E_App_Cache *e_app_cache_generate(E_App *a);
-EAPI E_App_Cache *e_app_cache_path_generate(char *path);
 EAPI void         e_app_cache_free(E_App_Cache *ac);
 EAPI int          e_app_cache_save(E_App_Cache *ac, char *path);
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_main.c,v
retrieving revision 1.124
retrieving revision 1.125
diff -u -3 -r1.124 -r1.125
--- e_main.c    14 Sep 2005 20:19:44 -0000      1.124
+++ e_main.c    25 Sep 2005 04:58:18 -0000      1.125
@@ -30,19 +30,6 @@
 static void _e_main_desk_save(void);
 static void _e_main_desk_restore(E_Manager *man, E_Container *con);
 
-E_Path *path_data    = NULL;
-E_Path *path_images  = NULL;
-E_Path *path_fonts   = NULL;
-E_Path *path_themes  = NULL;
-E_Path *path_init    = NULL;
-E_Path *path_icons   = NULL;
-E_Path *path_modules = NULL;
-E_Path *path_backgrounds = NULL;
-int     restart      = 0;
-int     good         = 0;
-int     evil         = 0;
-int     starting     = 1;
-
 /* local subsystem globals */
 #define MAX_LEVEL 32
 static int (*_e_main_shutdown_func[MAX_LEVEL]) (void);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_utils.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -3 -r1.26 -r1.27
--- e_utils.c   21 Sep 2005 18:02:04 -0000      1.26
+++ e_utils.c   25 Sep 2005 04:58:18 -0000      1.27
@@ -3,6 +3,19 @@
  */
 #include "e.h"
 
+E_Path *path_data    = NULL;
+E_Path *path_images  = NULL;
+E_Path *path_fonts   = NULL;
+E_Path *path_themes  = NULL;
+E_Path *path_init    = NULL;
+E_Path *path_icons   = NULL;
+E_Path *path_modules = NULL;
+E_Path *path_backgrounds = NULL;
+int     restart      = 0;
+int     good         = 0;
+int     evil         = 0;
+int     starting     = 1;
+
 typedef struct _E_Util_Fake_Mouse_Up_Info E_Util_Fake_Mouse_Up_Info;
 
 struct _E_Util_Fake_Mouse_Up_Info




-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to