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

svn at initng.thinktux.net svn at initng.thinktux.net
Thu Apr 13 15:50:17 CEST 2006


Author: danne
Date: Thu Apr 13 15:50:06 2006
New Revision: 3797

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

Log:
I actually think saving services works now! Please try it out! (preferrably after taking a backup of /etc/initng ;-). Well. Happy easter!


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 15:50:06 2006
@@ -65,8 +65,7 @@
   GtkWidget *save_button = glade_xml_get_widget(xml, "save_button");
   GtkWidget *save1 = glade_xml_get_widget(xml, "save1");
   save_rl();
-  //Don't enable save_all_services() unless you know exactly what you are doing!!!
-  //save_all_services();
+  save_all_services();
   gtk_widget_set_sensitive(save_button, FALSE);
   gtk_widget_set_sensitive(save1, FALSE);
 }
@@ -272,7 +271,7 @@
   
   initconf_show_service = glade_xml_get_widget(xml_show_service, "initconf_show_service");
 
-  load_service(GTK_WIDGET(treeview));
+  show_service(GTK_WIDGET(treeview));
   glade_xml_signal_autoconnect(xml_show_service);
 }
 
@@ -281,29 +280,12 @@
 }
 
 void on_ok_edit_service_button_clicked(GtkButton *button, gpointer user_data) {
-  /*  GtkWidget *textview = glade_xml_get_widget(xml_show_service, "service_textview");
-  GtkTreeSelection *selected;
-  GtkTreeIter iter;
-  GtkTreeModel *model;
-  GtkWidget *service_list = glade_xml_get_widget(xml, "service_list");
-  GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
-  GtkTextIter start, end;
   GtkWidget *save_button = glade_xml_get_widget(xml, "save_button");
   GtkWidget *save1 = glade_xml_get_widget(xml, "save1");
-
-  selected = gtk_tree_view_get_selection(GTK_TREE_VIEW(service_list));
-  
-  gtk_tree_selection_get_selected(selected, &model, &iter);
-  struct s_info *serviceinfo;
-  gtk_tree_model_get(model, &iter, 4, &serviceinfo, -1);
-  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)));*/
+  change_service();
+  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/initng-gnome.glade
==============================================================================
--- initng-gui/initng-gnome/src/initng-gnome.glade	(original)
+++ initng-gui/initng-gnome/src/initng-gnome.glade	Thu Apr 13 15:50:06 2006
@@ -619,7 +619,7 @@
   <property name="title" translatable="yes">Edit service or daemon</property>
   <property name="type">GTK_WINDOW_TOPLEVEL</property>
   <property name="window_position">GTK_WIN_POS_NONE</property>
-  <property name="modal">False</property>
+  <property name="modal">True</property>
   <property name="default_width">400</property>
   <property name="default_height">500</property>
   <property name="resizable">True</property>

Modified: initng-gui/initng-gnome/src/main.c
==============================================================================
--- initng-gui/initng-gnome/src/main.c	(original)
+++ initng-gui/initng-gnome/src/main.c	Thu Apr 13 15:50:06 2006
@@ -89,7 +89,6 @@
   /* Enable threading, to make glib and gtk thread safe */
   g_thread_init (NULL);
   gdk_threads_init();
-  gdk_threads_enter();
 
   /* Enable native language support */
 #ifdef ENABLE_NLS
@@ -128,12 +127,12 @@
   misc_config(initconf_app);
 
   /* Okay, Showtime */
-  gtk_widget_show (initconf_app);
+  glade_xml_signal_autoconnect(xml);
 
   /* Create the thread that will listen to nge, and update status realtime */
   pthread_create(&ngethread, NULL, nge_thread, initconf_app);
 
-  glade_xml_signal_autoconnect(xml);
+  gdk_threads_enter();
 
   /* go, mainloop */
   gtk_main ();

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 15:50:06 2006
@@ -40,7 +40,7 @@
   gboolean valid = gtk_tree_model_get_iter_first(service_model, &iter);
   while(valid) {
     gtk_tree_model_get(service_model, &iter, 0, &str_data, -1);
-    if(!strcmp(str_data, service)) {
+    if(str_data && !strcmp(str_data, service)) {
       break;
     }
     valid = gtk_tree_model_iter_next(service_model, &iter);
@@ -52,7 +52,6 @@
     gtk_list_store_append (GTK_LIST_STORE(service_model), &iter);
     gtk_list_store_set(GTK_LIST_STORE(service_model), &iter, 0, service, 1, "unknown", 
 		       2, NULL, 4, serviceinfo, -1);
-    serviceinfo->name = service;
     serviceinfo->type = UNKNOWN;
     serviceinfo->file_content = NULL;
   }
@@ -94,16 +93,20 @@
 
   //fprintf(stderr, "service_change, service=%s, state=%s\n", service, state);
   initial_service_state(e, service, is, state);
+  gdk_threads_enter();
   gtk_tree_model_filter_refilter(filtermodel);
+  gdk_threads_leave();
 }
 
 void initial_state_finished(nge_event *e) {
+  gdk_threads_enter();
   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));
 
   fprintf(stderr, "initial_state_finished\n");
   gtk_tree_model_filter_refilter(filtermodel);
+  gdk_threads_leave();
 }
 
 void *nge_thread(void *args) {
@@ -114,7 +117,8 @@
 
   /* set the hooks */
   e.service_state_change = &service_change;
-  e.initial_service_state = &service_change;
+  e.initial_service_state = &initial_service_state;
+  e.initial_state_finished = &initial_state_finished;
 
   /* open correct socket */
   ngeclient_open_socket(&e, NGE_REAL);
@@ -126,6 +130,9 @@
     return;
   }
 
+  //Avoid nasty race scenarios
+  sleep(1);
+
   /* this is the MAIN LOOP for ngeclient */
   ngeclient_exec(&e);
 

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 15:50:06 2006
@@ -115,7 +115,6 @@
       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)
         break;
       if(S_ISDIR(buff.st_mode)) {
@@ -142,7 +141,6 @@
             tok = strtok(NULL, " ");
             gtk_list_store_prepend (store, &iter);
             gtk_list_store_set (store, &iter, 0, tok, 1, "daemon", 2, NULL, 4, serviceinfo, -1);
-            serviceinfo->name = tok;
             serviceinfo->type = DAEMON;
 	    serviceinfo->file_content = file_content;
           } else if(strstr(buffer, "service") == buffer) {
@@ -153,7 +151,6 @@
             tok = strtok(NULL, " ");
             gtk_list_store_prepend (store, &iter);
             gtk_list_store_set (store, &iter, 0, tok, 1, "service", 2, NULL, 4, serviceinfo, -1);
-            serviceinfo->name = tok;
             serviceinfo->type = SERVICE;
 	    serviceinfo->file_content = file_content;
           } else if(strstr(buffer, "virtual") == buffer) {
@@ -164,7 +161,6 @@
             tok = strtok(NULL, " ");
             gtk_list_store_prepend (store, &iter);
             gtk_list_store_set (store, &iter, 0, tok, 1, "virtual", 2, NULL, 4, serviceinfo, -1);
-            serviceinfo->name = tok;
             serviceinfo->type = VIRTUAL;
 	    serviceinfo->file_content = file_content;
           }
@@ -186,7 +182,6 @@
         gtk_list_store_prepend (store, &iter);
         gtk_list_store_set(store, &iter, 0, namelist[n]->d_name, 1, "runlevel", 
 			   2, NULL, 4, serviceinfo, -1);
-        serviceinfo->name = namelist[n]->d_name;
         serviceinfo->type = RUNLEVEL;
         serviceinfo->startline = NULL;
 	serviceinfo->file_content = file_content;
@@ -205,7 +200,6 @@
         gtk_list_store_prepend (store, &iter);
         gtk_list_store_set(store, &iter, 0, namelist[n]->d_name, 1, "virtual", 
 			   2, NULL, 4, serviceinfo, -1);
-        serviceinfo->name = namelist[n]->d_name;
         serviceinfo->type = VIRTUALFILE;
         serviceinfo->startline = NULL;
 	serviceinfo->file_content = file_content;
@@ -218,14 +212,15 @@
   }
 }
 
-void load_service(GtkWidget *treeview) {
+void show_service(GtkWidget *treeview) {
   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));
+  GtkWidget *initconf_show_service = glade_xml_get_widget(xml_show_service, "initconf_show_service");
+
   GtkTreeIter iter;
   GtkTreeModel *model;
   gchar *servicename;
-  struct stat buff;
   FILE *stream;
   gchar res;
   int depth = 1;
@@ -236,10 +231,6 @@
   gtk_tree_model_get(model, &iter, 0, &servicename, 4, &serviceinfo, -1);
   struct s_file_content *file_content = serviceinfo->file_content;
 
-  if(lstat(file_content->path, &buff)<0)
-    perror("Strange fault!");
-  
-  //file = fopen(serviceinfo->path, "rt");
   stream = (FILE*)fmemopen(file_content->data, strlen(file_content->data), "r");
   if (stream == NULL)
     return;
@@ -256,7 +247,6 @@
 
   gtk_text_buffer_set_text(buffer, "", 0);
   
-  fprintf(stderr, "Loading service\n");
   do {
     res = fgetc(stream);
     if(res == '{') {
@@ -269,12 +259,90 @@
     gtk_text_buffer_insert_at_cursor(buffer, &res, 1);
   } while(TRUE);
   gtk_text_buffer_get_bounds(buffer, &start, &end);
+
+  gtk_window_set_title(GTK_WINDOW(initconf_show_service), servicename);
+  g_free(servicename);
+}
+
+void change_service() {
+  GtkWidget *service_textview = glade_xml_get_widget(xml_show_service, "service_textview");
+  GtkWidget *service_list = glade_xml_get_widget(xml, "service_list");
+  GtkTreeSelection *selected = gtk_tree_view_get_selection(GTK_TREE_VIEW(service_list));
+  GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(service_textview));
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+  gchar *servicename;
+  gchar *newdata;
+  FILE *oldstream, *newstream;
+  size_t newsize;
+  gchar res;
+  int depth = 0;
+  GtkTextIter start, end;
   
+  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;
+
+  oldstream = (FILE*)fmemopen(file_content->data, strlen(file_content->data), "r");
+  if (oldstream == NULL)
+    return;
+  newstream = (FILE*)open_memstream(&newdata, &newsize);
+  
+  //Put anything before the current service into the file
+  if(serviceinfo->type != RUNLEVEL && serviceinfo->type != VIRTUALFILE) {
+    char* temp = malloc(255); //UGLY!
+    while(fgets(temp, 255, oldstream) > 0) {
+      fputs(temp, newstream);
+      if(strcmp(temp, serviceinfo->startline) == 0) {
+        break;
+      }
+    }
+    free(temp);
+    if(strrchr(serviceinfo->startline, '{'))
+      depth++;
+  }
+
+  //Put the old contents of the service into the trash
+  do {
+    res = fgetc(oldstream);
+    if(res == '{') {
+      depth++;
+    } else if(res == '}') {
+      depth--;
+    }
+    if(depth <= 0 || res == EOF)
+      break;
+  } while(TRUE);
+
+  //Put the new contents of the service into the file
+  gtk_text_buffer_get_bounds(buffer, &start, &end);
+  fputs(gtk_text_buffer_get_text(buffer, &start, &end, FALSE), newstream);
+
+  //Put anything after the current service into the file
+  if(serviceinfo->type != RUNLEVEL && serviceinfo->type != VIRTUALFILE) {
+    fputs("}", newstream);
+    do {
+      res = fgetc(oldstream);
+      if(res == EOF)
+	break;
+      fputc(res, newstream);
+    } while(TRUE);
+  }
+
+  fclose(oldstream);
+  fclose(newstream);
+
+  free(file_content->data);
+
+  file_content->data = newdata;
+  file_content->needs_saving = TRUE;
+
   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);
@@ -285,14 +353,16 @@
   gboolean valid = gtk_tree_model_get_iter_first(model, &iter);
   while(valid) {
     gtk_tree_model_get(model, &iter, 4, &serviceinfo, -1);
-    if(serviceinfo->needs_saving) {
-      file = fopen(serviceinfo->path, "r+");
-      if (file == NULL) 
-	return;
-      fputs(serviceinfo->data, file);
+    struct s_file_content *file_content = serviceinfo->file_content;
+    if(file_content && file_content->needs_saving) {
+      file = fopen(file_content->path, "w");
+      if (file == NULL)
+	break;
+      fputs(file_content->data, file);
+      file_content->needs_saving = FALSE;
     }
     valid = gtk_tree_model_iter_next(model, &iter);
-  }*/
+  }
 }
 
 gint service_sorter(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data) {
@@ -300,8 +370,6 @@
   gint ret = 0;
   gchar *name1, *name2;
 
-  fprintf(stderr, "service_sorter check 1\n");
-
   gtk_tree_model_get(model, a, sortcol, &name1, -1);
   gtk_tree_model_get(model, b, sortcol, &name2, -1);
 
@@ -314,6 +382,7 @@
 }
 
 void populate_service_list() {
+  gdk_threads_enter();
   GtkWidget *service_list = glade_xml_get_widget(xml, "service_list");
   GtkTreeModel *filtermodel, *sortmodel;
   GtkTreeViewColumn *column;
@@ -359,4 +428,5 @@
 					 service_filter, NULL, NULL);
   sortmodel = gtk_tree_model_sort_new_with_model(filtermodel);
   gtk_tree_view_set_model(GTK_TREE_VIEW(service_list), sortmodel);
+  gdk_threads_leave();
 }

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 15:50:06 2006
@@ -27,7 +27,8 @@
 gboolean service_filter(GtkTreeModel *model, GtkTreeIter *iter, gpointer data);
 
 void populate_service_list();
-void load_service(GtkWidget *treeview);
+void show_service(GtkWidget *treeview);
+void change_service();
 void save_all_services();
 void servicelist_cleanup();
 
@@ -41,21 +42,24 @@
 };
 
 struct s_file_content {
-  char *data;
-  gboolean needs_saving;
-  char *path;
+  char *data;             //Entire file contents
+  gboolean needs_saving;  //Whether this file has been altered
+  char *path;             //Full path to file
 };
 
 struct s_info {
   //char *path;
-  char *name;
-  char type;
-  char *startline;
-  e_is status_id;
+  //char *name;        //Name of service;
+  char type;         //Type (See enum above)
+  char *startline;   //First line of service in file
+  e_is status_id;    //Status of service
   //gboolean needs_saving;
   //char *file_contents;
   //gchar *data;
-  struct s_file_content *file_content;
+  struct s_file_content *file_content; //Pointer to file contents
+  //int startpos;
+  //int endpos;
+  //int size;           //Size of service in bytes
 };
 
 


More information about the Initng-svn mailing list