gnome-utils r8216 - in trunk: . logview logview/tests
- From: cosimoc svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-utils r8216 - in trunk: . logview logview/tests
- Date: Tue, 23 Dec 2008 13:24:53 +0000 (UTC)
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]