[Initng-svn] r3793 - initng-gui/initng-gnome/src

svn at initng.thinktux.net svn at initng.thinktux.net
Thu Apr 13 11:44:39 CEST 2006


Author: danne
Date: Thu Apr 13 11:44:36 2006
New Revision: 3793

Modified:
   initng-gui/initng-gnome/src/callbacks.c
   initng-gui/initng-gnome/src/ngehandler.c
   initng-gui/initng-gnome/src/serviceparser.c
   initng-gui/initng-gnome/src/serviceparser.h

Log:
Heavy changes are in the move. Things may not work right now...


Modified: initng-gui/initng-gnome/src/callbacks.c
==============================================================================
--- initng-gui/initng-gnome/src/callbacks.c	(original)
+++ initng-gui/initng-gnome/src/callbacks.c	Thu Apr 13 11:44:36 2006
@@ -281,7 +281,7 @@
 }
 
 void on_ok_edit_service_button_clicked(GtkButton *button, gpointer user_data) {
-  GtkWidget *textview = glade_xml_get_widget(xml_show_service, "service_textview");
+  /*  GtkWidget *textview = glade_xml_get_widget(xml_show_service, "service_textview");
   GtkTreeSelection *selected;
   GtkTreeIter iter;
   GtkTreeModel *model;
@@ -296,14 +296,14 @@
   gtk_tree_selection_get_selected(selected, &model, &iter);
   struct s_info *serviceinfo;
   gtk_tree_model_get(model, &iter, 4, &serviceinfo, -1);
-  serviceinfo->needs_saving = TRUE;
+  serviceinfo->file_content->needs_saving = TRUE;
 
   gtk_text_buffer_get_bounds(buffer, &start, &end);
   serviceinfo->data = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
 
   gtk_widget_set_sensitive(save_button, TRUE);
   gtk_widget_set_sensitive(save1, TRUE);
-  gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(button)));
+  gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(button)));*/
 }
 
 void on_show_runlevel_editor_activate (GtkMenuItem *menuitem, gpointer user_data)

Modified: initng-gui/initng-gnome/src/ngehandler.c
==============================================================================
--- initng-gui/initng-gnome/src/ngehandler.c	(original)
+++ initng-gui/initng-gnome/src/ngehandler.c	Thu Apr 13 11:44:36 2006
@@ -54,7 +54,7 @@
 		       2, NULL, 4, serviceinfo, -1);
     serviceinfo->name = service;
     serviceinfo->type = UNKNOWN;
-    serviceinfo->path = NULL;
+    serviceinfo->file_content = NULL;
   }
 
   struct s_info *serviceinfo;

Modified: initng-gui/initng-gnome/src/serviceparser.c
==============================================================================
--- initng-gui/initng-gnome/src/serviceparser.c	(original)
+++ initng-gui/initng-gnome/src/serviceparser.c	Thu Apr 13 11:44:36 2006
@@ -77,7 +77,7 @@
 }
 
 void servicelist_cleanup() {
-  GtkTreeView *service_list = GTK_TREE_VIEW(glade_xml_get_widget(xml, "service_list"));
+  /*GtkTreeView *service_list = GTK_TREE_VIEW(glade_xml_get_widget(xml, "service_list"));
   GtkTreeModelSort *sortmodel = GTK_TREE_MODEL_SORT(gtk_tree_view_get_model(service_list));
   GtkTreeModelFilter *filtermodel = GTK_TREE_MODEL_FILTER(gtk_tree_model_sort_get_model(sortmodel));
   GtkTreeModel *model = gtk_tree_model_filter_get_model(filtermodel);
@@ -92,36 +92,48 @@
     g_free(serviceinfo->name);
     g_free(serviceinfo->path);
     g_free(serviceinfo->startline);
+    //FIXME: Can't just free memory, since more serviceinfo's may point at same filecontents
+    //if(serviceinfo->filecontents)
+    //g_free(serviceinfo->file_contents);
     g_free(serviceinfo);
     valid = gtk_tree_model_iter_next(model, &iter);
-  }
+  }*/
 }
 
 void recursive_scan(char* path, GtkListStore *store) {
   GtkTreeIter iter;
   struct s_info *serviceinfo;
+  struct s_file_content *file_content;
   
   struct dirent **namelist;
   int n = scandir(path, &namelist, &filefilter, alphasort);
   if(n < 0)
     perror("Unable to read directory");
   else {
+    FILE *file, *stream;
     while(n--) {
       struct stat buff;
       char *fullpath = malloc(strlen(path) + strlen(namelist[n]->d_name) + 2);
       sprintf(fullpath, "%s/%s", path, namelist[n]->d_name);
+      fprintf(stderr, "Opening file %s\n", fullpath);
       if(lstat(fullpath, &buff)<0)
-        perror("Strange fault!");
-      if(S_ISDIR(buff.st_mode))
+        break;
+      if(S_ISDIR(buff.st_mode)) {
         recursive_scan(fullpath, store);
-      else if(!fnmatch("*.i", namelist[n]->d_name, 0)) {
-        FILE *file = fopen(fullpath, "rt");   /* Open file. */
-
-        if (file == NULL) 
+	free(fullpath);
+      } else if(!fnmatch("*.i", namelist[n]->d_name, 0)) {
+	file_content = malloc(sizeof(struct s_file_content));
+	file_content->data = malloc(buff.st_size + 1);
+        file = fopen(fullpath, "rt");   /* Open file. */
+        if (file == NULL)
           continue;
-
+	fread(file_content->data, buff.st_size, 1, file);
+	file_content->data[buff.st_size] = 0;
+	file_content->needs_saving = FALSE;
+	file_content->path = fullpath;
+	stream = (FILE*)fmemopen(file_content->data, strlen(file_content->data), "r");
         char* buffer = malloc(255); //UGLY!
-        while(fgets(buffer, 255, file) > 0) {
+        while(fgets(buffer, 255, stream) > 0) {
           if(strstr(buffer, "daemon") == buffer) {
             serviceinfo = malloc(sizeof(struct s_info));
             serviceinfo->startline = malloc(strlen(buffer) + 1);
@@ -132,9 +144,7 @@
             gtk_list_store_set (store, &iter, 0, tok, 1, "daemon", 2, NULL, 4, serviceinfo, -1);
             serviceinfo->name = tok;
             serviceinfo->type = DAEMON;
-            serviceinfo->path = fullpath;
-	    serviceinfo->needs_saving = FALSE;
-	    serviceinfo->data = NULL;
+	    serviceinfo->file_content = file_content;
           } else if(strstr(buffer, "service") == buffer) {
             serviceinfo = malloc(sizeof(struct s_info));
             serviceinfo->startline = malloc(strlen(buffer) + 1);
@@ -145,9 +155,7 @@
             gtk_list_store_set (store, &iter, 0, tok, 1, "service", 2, NULL, 4, serviceinfo, -1);
             serviceinfo->name = tok;
             serviceinfo->type = SERVICE;
-            serviceinfo->path = fullpath;
-	    serviceinfo->needs_saving = FALSE;
-	    serviceinfo->data = NULL;
+	    serviceinfo->file_content = file_content;
           } else if(strstr(buffer, "virtual") == buffer) {
             serviceinfo = malloc(sizeof(struct s_info));
             serviceinfo->startline = malloc(strlen(buffer) + 1);
@@ -158,14 +166,21 @@
             gtk_list_store_set (store, &iter, 0, tok, 1, "virtual", 2, NULL, 4, serviceinfo, -1);
             serviceinfo->name = tok;
             serviceinfo->type = VIRTUAL;
-            serviceinfo->path = fullpath;
-	    serviceinfo->needs_saving = FALSE;
-	    serviceinfo->data = NULL;
+	    serviceinfo->file_content = file_content;
           }
         }
         fclose(file);
         free(buffer);
       } else if(!fnmatch("*.runlevel", namelist[n]->d_name, 0)) {
+	file_content = malloc(sizeof(struct s_file_content));
+	file_content->data = malloc(buff.st_size + 1);
+        file = fopen(fullpath, "rt");   /* Open file. */
+        if (file == NULL)
+          continue;
+	fread(file_content->data, buff.st_size, 1, file);
+	file_content->data[buff.st_size] = 0;
+	file_content->needs_saving = FALSE;
+	file_content->path = fullpath;
         serviceinfo = malloc(sizeof(struct s_info));
         namelist[n]->d_name[strlen(namelist[n]->d_name)-9] = 0;
         gtk_list_store_prepend (store, &iter);
@@ -173,11 +188,18 @@
 			   2, NULL, 4, serviceinfo, -1);
         serviceinfo->name = namelist[n]->d_name;
         serviceinfo->type = RUNLEVEL;
-        serviceinfo->path = fullpath;
         serviceinfo->startline = NULL;
-	serviceinfo->needs_saving = FALSE;
-	serviceinfo->data = NULL;
+	serviceinfo->file_content = file_content;
       } else if(!fnmatch("*.virtual", namelist[n]->d_name, 0)) {
+	file_content = malloc(sizeof(struct s_file_content));
+	file_content->data = malloc(buff.st_size + 1);
+        file = fopen(fullpath, "rt");   /* Open file. */
+        if (file == NULL)
+          continue;
+	fread(file_content->data, buff.st_size, 1, file);
+	file_content->data[buff.st_size] = 0;
+	file_content->needs_saving = FALSE;
+	file_content->path = fullpath;
         serviceinfo = malloc(sizeof(struct s_info));
         namelist[n]->d_name[strlen(namelist[n]->d_name)-8] = 0;
         gtk_list_store_prepend (store, &iter);
@@ -185,10 +207,10 @@
 			   2, NULL, 4, serviceinfo, -1);
         serviceinfo->name = namelist[n]->d_name;
         serviceinfo->type = VIRTUALFILE;
-        serviceinfo->path = fullpath;
         serviceinfo->startline = NULL;
-	serviceinfo->needs_saving = FALSE;
-	serviceinfo->data = NULL;
+	serviceinfo->file_content = file_content;
+      } else {
+	free(fullpath);
       }
       free(namelist[n]);
     }
@@ -197,36 +219,34 @@
 }
 
 void load_service(GtkWidget *treeview) {
-  GtkWidget *service_textview;
-  GtkTreeSelection *selected;
-  GtkTextBuffer *buffer;
+  GtkWidget *service_textview = glade_xml_get_widget(xml_show_service, "service_textview");
+  GtkTreeSelection *selected = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+  GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(service_textview));
   GtkTreeIter iter;
   GtkTreeModel *model;
   gchar *servicename;
   struct stat buff;
-  FILE *file;
+  FILE *stream;
   gchar res;
   int depth = 1;
   GtkTextIter start, end;
   
-  service_textview = glade_xml_get_widget(xml_show_service, "service_textview");
-  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(service_textview));
-  selected = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
-  
   gtk_tree_selection_get_selected(selected, &model, &iter);
   struct s_info *serviceinfo;
   gtk_tree_model_get(model, &iter, 0, &servicename, 4, &serviceinfo, -1);
+  struct s_file_content *file_content = serviceinfo->file_content;
 
-  if(lstat(serviceinfo->path, &buff)<0)
+  if(lstat(file_content->path, &buff)<0)
     perror("Strange fault!");
   
-  file = fopen(serviceinfo->path, "rt");
-  if (file == NULL) 
+  //file = fopen(serviceinfo->path, "rt");
+  stream = (FILE*)fmemopen(file_content->data, strlen(file_content->data), "r");
+  if (stream == NULL)
     return;
   
   if(serviceinfo->type != RUNLEVEL && serviceinfo->type != VIRTUALFILE) {
     char* temp = malloc(255); //UGLY!
-    while(fgets(temp, 255, file) > 0) {
+    while(fgets(temp, 255, stream) > 0) {
       if(strcmp(temp, serviceinfo->startline) == 0) {
         break;
       }
@@ -236,30 +256,25 @@
 
   gtk_text_buffer_set_text(buffer, "", 0);
   
-  if(!serviceinfo->data) {
-    fprintf(stderr, "Loading service\n");
-    do {
-      res = fgetc(file);
-      if(res == '{') {
-	depth++;
-      } else if(res == '}') {
-	depth--;
-      }
-      if(depth <= 0 || res == EOF)
-	break;
-      gtk_text_buffer_insert_at_cursor(buffer, &res, 1);
-    } while(TRUE);
-    gtk_text_buffer_get_bounds(buffer, &start, &end);
-    serviceinfo->data = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
-  } else {
-    gtk_text_buffer_insert_at_cursor(buffer, serviceinfo->data, strlen(serviceinfo->data));
-  }
+  fprintf(stderr, "Loading service\n");
+  do {
+    res = fgetc(stream);
+    if(res == '{') {
+      depth++;
+    } else if(res == '}') {
+      depth--;
+    }
+    if(depth <= 0 || res == EOF)
+      break;
+    gtk_text_buffer_insert_at_cursor(buffer, &res, 1);
+  } while(TRUE);
+  gtk_text_buffer_get_bounds(buffer, &start, &end);
   
   g_free(servicename);
 }
 
 void save_all_services() {
-  GtkTreeView *service_list = GTK_TREE_VIEW(glade_xml_get_widget(xml, "service_list"));
+  /*GtkTreeView *service_list = GTK_TREE_VIEW(glade_xml_get_widget(xml, "service_list"));
   GtkTreeModelSort *sortmodel = GTK_TREE_MODEL_SORT(gtk_tree_view_get_model(service_list));
   GtkTreeModelFilter *filtermodel = GTK_TREE_MODEL_FILTER(gtk_tree_model_sort_get_model(sortmodel));
   GtkTreeModel *model = gtk_tree_model_filter_get_model(filtermodel);
@@ -277,7 +292,7 @@
       fputs(serviceinfo->data, file);
     }
     valid = gtk_tree_model_iter_next(model, &iter);
-  }
+  }*/
 }
 
 gint service_sorter(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data) {

Modified: initng-gui/initng-gnome/src/serviceparser.h
==============================================================================
--- initng-gui/initng-gnome/src/serviceparser.h	(original)
+++ initng-gui/initng-gnome/src/serviceparser.h	Thu Apr 13 11:44:36 2006
@@ -40,14 +40,24 @@
   UNKNOWN
 };
 
-struct s_info {
+struct s_file_content {
+  char *data;
+  gboolean needs_saving;
   char *path;
+};
+
+struct s_info {
+  //char *path;
   char *name;
   char type;
   char *startline;
   e_is status_id;
-  gboolean needs_saving;
-  gchar *data;
+  //gboolean needs_saving;
+  //char *file_contents;
+  //gchar *data;
+  struct s_file_content *file_content;
 };
 
+
+
 #endif


More information about the Initng-svn mailing list