Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_fm.c e_fm.h 


Log Message:


fop first gets its run for recursive deltes.

===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm.c,v
retrieving revision 1.105
retrieving revision 1.106
diff -u -3 -r1.105 -r1.106
--- e_fm.c      4 Nov 2006 02:31:52 -0000       1.105
+++ e_fm.c      4 Nov 2006 04:49:36 -0000       1.106
@@ -107,6 +107,7 @@
    } typebuf;
    
    E_Fm2_Fop          *fop;
+   int                 busy_count;
    
    E_Object           *eobj;
    E_Drop_Handler     *drop_handler;
@@ -168,6 +169,7 @@
    const char  *dir;
    Evas_List   *items;
    Ecore_Idler *idler;
+   Ecore_Timer *timer;
 };
 
 struct _E_Fm2_Fop_Item
@@ -295,6 +297,13 @@
 static int _e_fm2_cb_live_timer(void *data);
 static void _e_fm2_cb_file_monitor(void *data, Ecore_File_Monitor *em, 
Ecore_File_Event event, const char *path);
 
+static E_Fm2_Fop *_e_fm2_fop_add(E_Fm2_Smart_Data *sd);
+static void _e_fm2_fop_del(E_Fm2_Fop *fop);
+static void _e_fm2_fop_detach(E_Fm2_Smart_Data *sd);
+static int _e_fm2_fop_process(E_Fm2_Fop *fop);
+static int _e_fm2_cb_fop_idler(void *data);
+static int _e_fm2_cb_fop_timer(void *data);
+
 static char *_e_fm2_meta_path = NULL;
 static Evas_Smart *_e_fm2_smart = NULL;
 static Evas_List *_e_fm2_list = NULL;
@@ -352,6 +361,8 @@
    if (!evas_object_type_get(obj)) return; // safety
    if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
 
+   _e_fm2_fop_detach(sd);
+   
    /* internal config for now - don't see a pont making this configurable */
    sd->regions.member_max = 64;
 
@@ -759,173 +770,6 @@
    /* FIXME: implement - update all icons as config changes */
 }
 
-static E_Fm2_Fop *_e_fm2_fop_add(E_Fm2_Smart_Data *sd);
-static void _e_fm2_fop_del(E_Fm2_Fop *fop);
-static void _e_fm2_fop_detach(E_Fm2_Smart_Data *sd);
-static int _e_fm2_fop_process(E_Fm2_Fop *fop);
-static int _e_fm2_cb_fop_idler(void *data);
-static int _e_fm2_cb_fop_timer(void *data);
-
-static E_Fm2_Fop *
-_e_fm2_fop_add(E_Fm2_Smart_Data *sd)
-{
-   if (!sd->fop)
-     {
-       sd->fop = E_NEW(E_Fm2_Fop, 1);
-       if (!sd->fop) return NULL;
-       sd->fop->obj = sd->obj;
-       sd->fop->dir = evas_stringshare_add(e_fm2_real_path_get(sd->obj));
-       if (!sd->fop->dir)
-         {
-            free(sd->fop);
-            sd->fop = NULL;
-            return NULL;
-         }
-       sd->fop->idler = ecore_idler_add(_e_fm2_cb_fop_idler, sd->fop);
-       if (!sd->fop->idler)
-         {
-            evas_stringshare_del(sd->fop->dir);
-            free(sd->fop);
-            sd->fop = NULL;
-            return NULL;
-         }
-       /* FIXME: add a timer that updates the fop->obj to the current
-        * file being deleted and spin the wheel
-        */
-     }
-   _e_fm2_fop_list = evas_list_append(_e_fm2_fop_list, sd->fop);
-   return sd->fop;
-}
-
-static void
-_e_fm2_fop_del(E_Fm2_Fop *fop)
-{
-   if (fop->idler)
-     {
-       ecore_idler_del(fop->idler);
-       fop->idler = NULL;
-     } 
-   /* FIXME: delete timer */
-   if (fop->dir)
-     {
-       evas_stringshare_del(fop->dir);
-       fop->dir = NULL;
-     }
-   if (fop->obj)
-     {
-       E_Fm2_Smart_Data *sd;
-       
-       sd = evas_object_smart_data_get(fop->obj);
-       if (sd) sd->fop = NULL;
-       fop->obj = NULL;
-     }
-   _e_fm2_fop_list = evas_list_remove(_e_fm2_fop_list, fop);
-  free(fop);
-}
-
-static void
-_e_fm2_fop_detach(E_Fm2_Smart_Data *sd)
-{
-   if (!sd->fop) return;
-   sd->fop->obj = NULL;
-   sd->fop = NULL;
-}
-
-static int
-_e_fm2_fop_process(E_Fm2_Fop *fop)
-{
-   E_Fm2_Fop_Item *fi, *fi2;
-   char buf[4096];
-   struct dirent *dp;
-   
-   if (fop->items) return 0;
-   fi = fop->items->data;
-   switch (fi->type)
-     {
-      case FOP_DELETE:
-       if (fi->dir)
-         {
-            dp = readdir(fi->dir);
-            if (!dp)
-              {
-                 snprintf(buf, sizeof(buf), "%s/%s", fi->fop->dir, fi->file);
-                 ecore_file_rmdir(buf);
-              }
-            else
-              {
-                 if ((!strcmp(dp->d_name, ".")) || (!strcmp(dp->d_name, 
".."))) return 1;
-                 fi2 = E_NEW(E_Fm2_Fop_Item, 1);
-                 fi2->fop = fop;
-                 fi2->type = FOP_DELETE;
-                 snprintf(buf, sizeof(buf), "%s/%s/%s", fi->fop->dir, 
fi->file, dp->d_name);
-                 fi2->is_dir = ecore_file_is_dir(buf);
-                 snprintf(buf, sizeof(buf), "%s/%s", fi->file, dp->d_name);
-                 fi2->file = evas_stringshare_add(buf);
-                 fi->fop->items = evas_list_prepend(fi->fop->items, fi2);
-                 return 1;
-              }
-         }
-       else if (fi->is_dir)
-         {
-            snprintf(buf, sizeof(buf), "%s/%s", fi->fop->dir, fi->file);
-            fi->dir = opendir(buf);
-            if (!fi->dir)
-              ecore_file_rmdir(buf);
-            else
-              return 1;
-         }
-       else
-         {
-            snprintf(buf, sizeof(buf), "%s/%s", fi->fop->dir, fi->file);
-            ecore_file_unlink(buf);
-         }
-       break;
-      case FOP_MOVE:
-       /* FIXME: */
-       break;
-      default:
-       break;
-     }
-   /* remove and free */
-   fop->items = evas_list_remove_list(fop->items, fop->items);
-   if (fi->file)
-     {
-       evas_stringshare_del(fi->file);
-       fi->file = NULL;
-     }
-   if (fi->dir)
-     {
-       closedir(fi->dir);
-       fi->dir = NULL;
-     }
-   free(fi);
-   if (fop->items) return 0;
-   return 1;
-}
-
-static int
-_e_fm2_cb_fop_idler(void *data)
-{
-   E_Fm2_Fop *fop;
-   
-   fop = data;
-   if (!_e_fm2_fop_process(fop))
-     {
-       _e_fm2_fop_del(fop);
-       return 0;
-     }
-   return 1;
-}
-
-static int
-_e_fm2_cb_fop_timer(void *data)
-{
-   E_Fm2_Fop *fop;
-   
-   fop = data;
-   return 1;
-}
-
 EAPI void
 e_fm2_fop_delete_add(Evas_Object *obj, E_Fm2_Icon_Info *ici)
 {
@@ -961,8 +805,10 @@
    fi->fop = fop;
    fi->type = FOP_DELETE;
    fi->file = evas_stringshare_add(ici->file);
-   if (S_ISDIR(ici->statinfo.st_mode)) fi->is_dir = 1;
+   if ((S_ISDIR(ici->statinfo.st_mode)) && (!ici->real_link))
+     fi->is_dir = 1;
    fi->fop->items = evas_list_append(fi->fop->items, fi);
+   printf("ADD0: %s\n", fi->file);
 }
 
 /* FIXME: not so easy with .orders etc. */
@@ -1188,7 +1034,9 @@
    sd->monitor.monitor = ecore_file_monitor_add(sd->realpath, 
_e_fm2_cb_file_monitor, obj);
    sd->scan_idler = ecore_idler_add(_e_fm2_cb_scan_idler, obj);
    sd->scan_timer = ecore_timer_add(0.2, _e_fm2_cb_scan_timer, obj);
-   edje_object_signal_emit(sd->overlay, "e,state,busy,start", "e");
+   sd->busy_count++;
+   if (sd->busy_count == 1)
+     edje_object_signal_emit(sd->overlay, "e,state,busy,start", "e");
 }
 
 static void
@@ -1199,7 +1047,11 @@
    sd = evas_object_smart_data_get(obj);
    if (!sd) return;
    if ((sd->dir) || (sd->order))
-     edje_object_signal_emit(sd->overlay, "e,state,busy,stop", "e");
+     {
+       sd->busy_count--;
+       if (sd->busy_count == 0)
+         edje_object_signal_emit(sd->overlay, "e,state,busy,stop", "e");
+     }
    /* stop the scan idler, the sort timer and free the queue */
    if (sd->dir)
      {
@@ -4233,7 +4085,9 @@
 
    sd = evas_object_smart_data_get(obj);
    if (!sd) return;
-  
+
+   _e_fm2_fop_detach(sd);
+   
    if (sd->monitor.monitor)
      {
        ecore_file_monitor_del(sd->monitor.monitor);
@@ -5056,6 +4910,8 @@
                  if (e_filereg_file_protected(buf)) continue;
                  
                  /* FIXME: recursive rm might block - need to get smart */
+                 e_fm2_fop_delete_add(ic->sd->obj, ici);
+/*               
                  if (!(ecore_file_recursive_rm(buf)))
                    {
                       char text[4096 + 256];
@@ -5081,7 +4937,10 @@
                              }
                         }
                    }
-                 else ici->deleted = 1;
+                 else
+ */
+//               ici->deleted = 1;
+                 ok = 0;
               }
             else ici->deleted = 1;
             if (ok) _e_fm2_live_file_del(ic->sd->obj, ici->file);
@@ -5096,6 +4955,8 @@
             if (e_filereg_file_protected(buf)) return;
 
             /* FIXME: recursive rm might block - need to get smart */
+            e_fm2_fop_delete_add(ic->sd->obj, &(ic->info));
+/*          
             if (!(ecore_file_recursive_rm(buf)))
               {
                  char text[4096 + 256];
@@ -5118,9 +4979,13 @@
                  // e_object_del(E_OBJECT(dialog));
                  return;
               }
+ */
+         }
+       else
+         {
+            ic->info.deleted = 1;
+            _e_fm2_live_file_del(ic->sd->obj, ic->info.file);
          }
-       _e_fm2_live_file_del(ic->sd->obj, ic->info.file);
-       ic->info.deleted = 1;
      }
    
 //   if (ic->sd->order_file) _e_fm2_order_file_rewrite(ic->sd->obj);
@@ -5388,4 +5253,289 @@
             evas_object_smart_callback_call(sd->obj, "dir_deleted", NULL);
          }
      }
+}
+
+static E_Fm2_Fop *
+_e_fm2_fop_add(E_Fm2_Smart_Data *sd)
+{
+   if (!sd->fop)
+     {
+       sd->fop = E_NEW(E_Fm2_Fop, 1);
+       if (!sd->fop) return NULL;
+       sd->fop->obj = sd->obj;
+       sd->fop->dir = evas_stringshare_add(e_fm2_real_path_get(sd->obj));
+       if (!sd->fop->dir)
+         {
+            free(sd->fop);
+            sd->fop = NULL;
+            return NULL;
+         }
+       sd->fop->idler = ecore_idler_add(_e_fm2_cb_fop_idler, sd->fop);
+       if (!sd->fop->idler)
+         {
+            evas_stringshare_del(sd->fop->dir);
+            free(sd->fop);
+            sd->fop = NULL;
+            return NULL;
+         }
+       sd->fop->timer = ecore_timer_add(0.2, _e_fm2_cb_fop_timer, sd->fop);
+       sd->busy_count++;
+       if (sd->busy_count == 1)
+         edje_object_signal_emit(sd->overlay, "e,state,busy,start", "e");
+     }
+   _e_fm2_fop_list = evas_list_append(_e_fm2_fop_list, sd->fop);
+   return sd->fop;
+}
+
+static void
+_e_fm2_fop_del(E_Fm2_Fop *fop)
+{
+   if (fop->idler)
+     {
+       ecore_idler_del(fop->idler);
+       fop->idler = NULL;
+     } 
+   if (fop->timer)
+     {
+       _e_fm2_cb_fop_timer(fop);
+       ecore_timer_del(fop->timer);
+       fop->timer = NULL;
+     } 
+   if (fop->dir)
+     {
+       evas_stringshare_del(fop->dir);
+       fop->dir = NULL;
+     }
+   if (fop->obj)
+     {
+       E_Fm2_Smart_Data *sd;
+       
+       sd = evas_object_smart_data_get(fop->obj);
+       if (sd) sd->fop = NULL;
+       fop->obj = NULL;
+       sd->busy_count--;
+       if (sd->busy_count == 0)
+         edje_object_signal_emit(sd->overlay, "e,state,busy,stop", "e");
+     }
+   _e_fm2_fop_list = evas_list_remove(_e_fm2_fop_list, fop);
+  free(fop);
+}
+
+static void
+_e_fm2_fop_detach(E_Fm2_Smart_Data *sd)
+{
+   if (!sd->fop) return;
+   sd->fop->obj = NULL;
+   sd->fop = NULL;
+   sd->busy_count--;
+   if (sd->busy_count == 0)
+     edje_object_signal_emit(sd->overlay, "e,state,busy,stop", "e");
+}
+
+static int
+_e_fm2_fop_process(E_Fm2_Fop *fop)
+{
+   E_Fm2_Fop_Item *fi, *fi2;
+   char buf[4096];
+   struct dirent *dp;
+   E_Manager *man;
+   E_Container *con;
+   E_Dialog *dialog;
+   
+   if (!fop->items) return 0;
+   fi = fop->items->data;
+   switch (fi->type)
+     {
+      case FOP_DELETE:
+       if (fi->dir)
+         {
+            dp = readdir(fi->dir);
+            if (!dp)
+              {
+                 snprintf(buf, sizeof(buf), "%s/%s", fi->fop->dir, fi->file);
+                 if (ecore_file_rmdir(buf))
+                   {
+                      if ((fi->fop->obj) && (!strchr(fi->file, '/')))
+                        _e_fm2_live_file_del(fi->fop->obj, fi->file);
+                   }
+                 /* FIXME: if deletign vast dirs and lots of errors happen
+                  * we need a central dialog that just collects all of them
+                  * and not have dozens or 100's of dialogs */
+                 else
+                   {
+                      char text[4096 + 256];
+                    
+                      man = e_manager_current_get();
+                      if (man)
+                        {
+                           con = e_container_current_get(man);
+                           if (con)
+                             {
+                                dialog = e_dialog_new(con, "E", 
"_fm_file_delete_error_dialog");
+                                e_dialog_button_add(dialog, _("OK"), NULL, 
NULL, NULL);
+                                e_dialog_button_focus_num(dialog, 1);
+                                e_dialog_title_set(dialog, _("Error"));
+                                snprintf(text, sizeof(text),
+                                         _("Could not delete <br>"
+                                           "<hilight>%s</hilight>"), buf);
+                                e_dialog_text_set(dialog, text);
+                                e_win_centered_set(dialog->win, 1);
+                                e_dialog_show(dialog);
+                                // e_object_del(E_OBJECT(dialog));
+                             }
+                        }
+                   }
+              }
+            else
+              {
+                 if ((!strcmp(dp->d_name, ".")) || (!strcmp(dp->d_name, 
".."))) return 1;
+                 fi2 = E_NEW(E_Fm2_Fop_Item, 1);
+                 fi2->fop = fop;
+                 fi2->type = FOP_DELETE;
+                 snprintf(buf, sizeof(buf), "%s/%s/%s", fi->fop->dir, 
fi->file, dp->d_name);
+                 if (ecore_file_is_dir(buf))
+                   {
+                      char *lnk;
+                      
+                      lnk = ecore_file_readlink(buf);
+                      if (lnk) free(lnk);
+                      else fi2->is_dir = 1;
+                   }
+                 snprintf(buf, sizeof(buf), "%s/%s", fi->file, dp->d_name);
+                 fi2->file = evas_stringshare_add(buf);
+                 fi->fop->items = evas_list_prepend(fi->fop->items, fi2);
+                 printf("ADD: %s\n", fi2->file);
+                 return 1;
+              }
+         }
+       else if (fi->is_dir)
+         {
+            snprintf(buf, sizeof(buf), "%s/%s", fi->fop->dir, fi->file);
+            fi->dir = opendir(buf);
+            if (!fi->dir)
+              {
+                 if (ecore_file_rmdir(buf))
+                   {
+                      if ((fi->fop->obj) && (!strchr(fi->file, '/')))
+                        _e_fm2_live_file_del(fi->fop->obj, fi->file);
+                   }
+                 /* FIXME: if deletign vast dirs and lots of errors happen
+                  * we need a central dialog that just collects all of them
+                  * and not have dozens or 100's of dialogs */
+                 else
+                   {
+                      char text[4096 + 256];
+                    
+                      man = e_manager_current_get();
+                      if (man)
+                        {
+                           con = e_container_current_get(man);
+                           if (con)
+                             {
+                                dialog = e_dialog_new(con, "E", 
"_fm_file_delete_error_dialog");
+                                e_dialog_button_add(dialog, _("OK"), NULL, 
NULL, NULL);
+                                e_dialog_button_focus_num(dialog, 1);
+                                e_dialog_title_set(dialog, _("Error"));
+                                snprintf(text, sizeof(text),
+                                         _("Could not delete <br>"
+                                           "<hilight>%s</hilight>"), buf);
+                                e_dialog_text_set(dialog, text);
+                                e_win_centered_set(dialog->win, 1);
+                                e_dialog_show(dialog);
+                                // e_object_del(E_OBJECT(dialog));
+                             }
+                        }
+                   }
+              }
+            else
+              return 1;
+         }
+       else
+         {
+            snprintf(buf, sizeof(buf), "%s/%s", fi->fop->dir, fi->file);
+            if (ecore_file_unlink(buf))
+              {
+                 if ((fi->fop->obj) && (!strchr(fi->file, '/')))
+                   _e_fm2_live_file_del(fi->fop->obj, fi->file);
+              }
+            /* FIXME: if deletign vast dirs and lots of errors happen
+             * we need a central dialog that just collects all of them
+             * and not have dozens or 100's of dialogs */
+            else
+              {
+                 char text[4096 + 256];
+                 
+                 man = e_manager_current_get();
+                 if (man)
+                   {
+                      con = e_container_current_get(man);
+                      if (con)
+                        {
+                           dialog = e_dialog_new(con, "E", 
"_fm_file_delete_error_dialog");
+                           e_dialog_button_add(dialog, _("OK"), NULL, NULL, 
NULL);
+                           e_dialog_button_focus_num(dialog, 1);
+                           e_dialog_title_set(dialog, _("Error"));
+                           snprintf(text, sizeof(text),
+                                    _("Could not delete <br>"
+                                      "<hilight>%s</hilight>"), buf);
+                           e_dialog_text_set(dialog, text);
+                           e_win_centered_set(dialog->win, 1);
+                           e_dialog_show(dialog);
+                           // e_object_del(E_OBJECT(dialog));
+                        }
+                   }
+              }
+         }
+       break;
+      case FOP_MOVE:
+       /* FIXME: handle moves */
+       break;
+      default:
+       break;
+     }
+   /* remove and free */
+   printf("DONE: %s\n", fi->file);
+   fop->items = evas_list_remove_list(fop->items, fop->items);
+   if (fi->file)
+     {
+       evas_stringshare_del(fi->file);
+       fi->file = NULL;
+     }
+   if (fi->dir)
+     {
+       closedir(fi->dir);
+       fi->dir = NULL;
+     }
+   free(fi);
+   if (!fop->items) return 0;
+   return 1;
+}
+
+static int
+_e_fm2_cb_fop_idler(void *data)
+{
+   E_Fm2_Fop *fop;
+   
+   fop = data;
+   if (!_e_fm2_fop_process(fop))
+     {
+       _e_fm2_fop_del(fop);
+       return 0;
+     }
+   return 1;
+}
+
+static int
+_e_fm2_cb_fop_timer(void *data)
+{
+   E_Fm2_Fop *fop;
+   E_Fm2_Smart_Data *sd;
+   char buf[4096];
+   
+   fop = data;
+   if (!fop->obj) return 1;
+   sd = evas_object_smart_data_get(fop->obj);
+   snprintf(buf, sizeof(buf), _("%i Queued"), evas_list_count(fop->items));
+   edje_object_part_text_set(sd->overlay, "e.text.busy_label", buf);
+   return 1;
 }
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -3 -r1.29 -r1.30
--- e_fm.h      4 Nov 2006 02:31:52 -0000       1.29
+++ e_fm.h      4 Nov 2006 04:49:36 -0000       1.30
@@ -140,5 +140,8 @@
 EAPI void                  e_fm2_pan_child_size_get(Evas_Object *obj, 
Evas_Coord *w, Evas_Coord *h);
 
 EAPI void                  e_fm2_all_icons_update(void);
+
+EAPI void                  e_fm2_fop_delete_add(Evas_Object *obj, 
E_Fm2_Icon_Info *ici);
+    
 #endif
 #endif



-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to