gnome-utils r8216 - in trunk: . logview logview/tests



Author: cosimoc
Date: Tue Dec 23 13:24:53 2008
New Revision: 8216
URL: http://svn.gnome.org/viewvc/gnome-utils?rev=8216&view=rev

Log:
Make loading and fetching of new lines two separate operations and
rework them to be async.

Added:
   trunk/logview/tests/
   trunk/logview/tests/Makefile.am
   trunk/logview/tests/test-reader.c
Modified:
   trunk/configure.ac
   trunk/logview/Makefile.am
   trunk/logview/logview-log.c
   trunk/logview/logview-log.h

Modified: trunk/configure.ac
==============================================================================
--- trunk/configure.ac	(original)
+++ trunk/configure.ac	Tue Dec 23 13:24:53 2008
@@ -479,6 +479,7 @@
 baobab/src/Makefile
 baobab/help/Makefile
 logview/Makefile
+logview/tests/Makefile
 logview/gnome-system-log-security
 logview/help/Makefile
 gsearchtool/Makefile

Modified: trunk/logview/Makefile.am
==============================================================================
--- trunk/logview/Makefile.am	(original)
+++ trunk/logview/Makefile.am	Tue Dec 23 13:24:53 2008
@@ -1,6 +1,6 @@
 # Process this file with automake to produce Makefile.in
 
-SUBDIRS = help
+SUBDIRS = help tests
 
 Utilitiesdir = $(datadir)/applications
 additionaldir  = $(datadir)/gnome-system-log

Modified: trunk/logview/logview-log.c
==============================================================================
--- trunk/logview/logview-log.c	(original)
+++ trunk/logview/logview-log.c	Tue Dec 23 13:24:53 2008
@@ -33,21 +33,31 @@
   GFile *file;
 
   /* stats about the file */
-  GTimeVal *file_time;
+  GTimeVal file_time;
   goffset file_size;
 
   /* real content, array of lines */
-  char **lines;
+  GArray *lines;
+
+  /* stream poiting to the log */
+  GDataInputStream *stream;
 };
 
 typedef struct {
   LogviewLog *log;
   GError *err;
-
   LogviewCreateCallback callback;
   gpointer user_data;
 } LoadJob;
 
+typedef struct {
+  LogviewLog *log;
+  GError *err;
+  char **lines;
+  LogviewNewLinesCallback callback;
+  gpointer user_data;
+} NewLinesJob;
+
 static void
 logview_log_class_init (LogviewLogClass *klass)
 {
@@ -63,6 +73,61 @@
 }
 
 static gboolean
+new_lines_job_done (gpointer data)
+{
+  NewLinesJob *job = data;
+
+  if (job->err) {
+    job->callback (job->log, NULL, job->err, job->user_data);
+    /* drop the reference we acquired before */
+    g_object_unref (job->log);
+  } else {
+    job->callback (job->log, job->lines, job->err, job->user_data);
+  }
+
+  return FALSE;
+}
+
+static gboolean
+do_read_new_lines (GIOSchedulerJob *io_job,
+                   GCancellable *cancellable,
+                   gpointer user_data)
+{
+  /* this runs in a separate thread */
+  NewLinesJob *job = user_data;
+  LogviewLog *log = job->log;
+  GPtrArray *lines;
+  char *line;
+  GError *err = NULL;
+
+  g_assert (LOGVIEW_IS_LOG (log));
+  g_assert (log->priv->stream != NULL);
+
+  lines = g_ptr_array_new ();
+  while ((line = g_data_input_stream_read_line (log->priv->stream, NULL,
+                                               NULL, &err)) != NULL)
+  {
+    g_ptr_array_add (lines, (gpointer) line);
+  }
+
+  if (err) {
+    g_ptr_array_free (lines, TRUE);
+    job->err = err;
+    goto out;
+  }
+
+  /* NULL-terminate the array */
+  g_ptr_array_add (lines, NULL);
+
+  job->lines = (char **) g_ptr_array_free (lines, FALSE);
+
+out:
+  g_io_scheduler_job_send_to_mainloop_async (io_job,
+                                             new_lines_job_done,
+                                             job, NULL);
+}
+
+static gboolean
 log_load_done (gpointer user_data)
 {
   LoadJob *job = user_data;
@@ -71,10 +136,10 @@
     /* the callback will have NULL as log, and the error set */
     g_object_unref (job->log);
     job->callback (NULL, job->err, job->user_data);
+  } else {
+    job->callback (job->log, NULL, job->user_data);
   }
 
-  job->callback (job->log, NULL, job->user_data);
-
   g_slice_free (LoadJob, job);
 
   return FALSE;
@@ -90,6 +155,7 @@
   LogviewLog *log = job->log;
   GFile *f = log->priv->file;
   GFileInfo *info;
+  GFileInputStream *is;
   const char *content_type;
   char *buffer;
   GFileType type;
@@ -123,13 +189,13 @@
   }
 
   log->priv->file_size = g_file_info_get_size (info);
-  g_file_info_get_modification_time (info, log->priv->file_time);
+  g_file_info_get_modification_time (info, &log->priv->file_time);
 
   g_object_unref (info);
 
-  /* try now to read the file */
-  g_file_load_contents (f, NULL, &buffer,
-                        NULL, NULL, &err);
+  /* initialize the stream */
+  is = g_file_read (f, NULL, &err);
+
   if (err) {
     if (err->code == G_IO_ERROR_PERMISSION_DENIED) {
       /* TODO: PolicyKit integration */
@@ -138,9 +204,7 @@
     goto out;
   }
 
-  /* split into an array of lines */
-  log->priv->lines = g_strsplit (buffer, "\n", -1);
-  g_free (buffer);
+  log->priv->stream = g_data_input_stream_new (G_INPUT_STREAM (is));
 
 out:
   g_io_scheduler_job_send_to_mainloop_async (io_job,
@@ -167,6 +231,29 @@
                            NULL, 0, NULL);
 }
 
+/* public methods */
+
+void
+logview_log_read_new_lines (LogviewLog *log,
+                            LogviewNewLinesCallback callback,
+                            gpointer user_data)
+{
+  NewLinesJob *job;
+
+  /* initialize the job struct with sensible values */
+  job = g_slice_new0 (NewLinesJob);
+  job->callback = callback;
+  job->user_data = user_data;
+  job->log = g_object_ref (log);
+  job->err = NULL;
+  job->lines = NULL;
+
+  /* push the fetching job into another thread */
+  g_io_scheduler_push_job (do_read_new_lines,
+                           job,
+                           NULL, 0, NULL);
+}
+
 void
 logview_log_create (const char *filename, LogviewCreateCallback callback,
                     gpointer user_data)

Modified: trunk/logview/logview-log.h
==============================================================================
--- trunk/logview/logview-log.h	(original)
+++ trunk/logview/logview-log.h	Tue Dec 23 13:24:53 2008
@@ -21,8 +21,8 @@
 
 /* logview-log.h */
 
-#ifndef _LOGVIEW_LOG
-#define _LOGVIEW_LOG
+#ifndef __LOGVIEW_LOG_H__
+#define __LOGVIEW_LOG_H__
 
 #include <glib-object.h>
 
@@ -44,9 +44,15 @@
 typedef struct _LogviewLogClass LogviewLogClass;
 typedef struct _LogviewLogPrivate LogviewLogPrivate;
 
+/* callback signatures for async I/O operations */
+
 typedef void (* LogviewCreateCallback) (LogviewLog *log,
                                         GError *error,
                                         gpointer user_data);
+typedef void (* LogviewNewLinesCallback) (LogviewLog *log,
+                                          char **lines,
+                                          GError *error,
+                                          gpointer user_data);
 
 #define LOGVIEW_ERROR_QUARK g_quark_from_static_string ("logview-error")
 
@@ -64,9 +70,17 @@
   GObjectClass parent_class;
 };
 
-GType logview_log_get_type (void);
-LogviewLog* logview_log_new (char *filename, GError **error);
+GType logview_log_get_type      (void);
+
+/* public methods */
+
+void logview_log_create         (const char *filename,
+                                 LogviewCreateCallback callback,
+                                 gpointer user_data);
+void logview_log_read_new_lines (LogviewLog *log,
+                                 LogviewNewLinesCallback callback,
+                                 gpointer user_data);
 
 G_END_DECLS
 
-#endif /* _LOGVIEW_LOG */
\ No newline at end of file
+#endif /* __LOGVIEW_LOG_H__ */
\ No newline at end of file

Added: trunk/logview/tests/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/logview/tests/Makefile.am	Tue Dec 23 13:24:53 2008
@@ -0,0 +1,8 @@
+INCLUDES = \
+	$(GNOME_UTILS_CFLAGS) \
+	-I../
+
+bin_PROGRAMS = test-reader
+
+test_reader_SOURCES = test-reader.c ../logview-log.c
+test_reader_LDADD = $(GNOME_UTILS_LIBS)

Added: trunk/logview/tests/test-reader.c
==============================================================================
--- (empty file)
+++ trunk/logview/tests/test-reader.c	Tue Dec 23 13:24:53 2008
@@ -0,0 +1,45 @@
+#include "logview-log.h"
+
+#include <glib.h>
+#include <gio/gio.h>
+
+static GMainLoop *loop;
+
+static void
+new_lines_cb (LogviewLog *log,
+              char **lines,
+              GError *error,
+              gpointer user_data)
+{
+  int i;
+
+  for (i = 0; lines[i]; i++) {
+    g_print ("line %d: %s\n", i, lines[i]);
+  }
+
+  g_strfreev (lines);
+  g_object_unref (log);
+
+  g_main_loop_quit (loop);
+}
+
+static void
+callback (LogviewLog *log,
+          GError *error,
+          gpointer user_data)
+{
+  g_print ("callback! err %p, log %p\n", error, log);
+
+  logview_log_read_new_lines (log, new_lines_cb, NULL);
+}
+
+int main (int argc, char **argv)
+{
+  g_type_init ();
+
+  loop = g_main_loop_new (NULL, FALSE);
+  logview_log_create ("/var/log/messages", callback, NULL);
+  g_main_loop_run (loop);
+
+  return 0;
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]