diff options
Diffstat (limited to 'logview/logview-app.c')
-rw-r--r-- | logview/logview-app.c | 420 |
1 files changed, 0 insertions, 420 deletions
diff --git a/logview/logview-app.c b/logview/logview-app.c deleted file mode 100644 index ffa37ec7..00000000 --- a/logview/logview-app.c +++ /dev/null @@ -1,420 +0,0 @@ -/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ -/* logview-app.c - logview application singleton - * - * Copyright (C) 2008 Cosimo Cecchi <[email protected]> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -/* logview-app.c */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "logview-app.h" - -#include "logview-manager.h" -#include "logview-window.h" -#include "logview-prefs.h" - -#include <glib/gi18n.h> - -struct _LogviewAppPrivate { - LogviewPrefs *prefs; - LogviewManager *manager; - LogviewWindow *window; -}; - -enum { - APP_QUIT, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -static LogviewApp *app_singleton = NULL; - -G_DEFINE_TYPE (LogviewApp, logview_app, G_TYPE_OBJECT); - -#define GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGVIEW_TYPE_APP, LogviewAppPrivate)) - -static gboolean -main_window_delete_cb (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - LogviewApp *app = user_data; - - g_signal_emit (app, signals[APP_QUIT], 0, NULL); - - return FALSE; -} - -static gboolean -logview_app_set_window (LogviewApp *app) -{ - LogviewWindow *window; - gboolean retval = FALSE; - - window = LOGVIEW_WINDOW (logview_window_new ()); - - if (window) { - app->priv->window = window; - g_signal_connect (window, "delete-event", - G_CALLBACK (main_window_delete_cb), app); - retval = TRUE; - } - - gtk_window_set_default_icon_name ("mate-system-log"); - - return retval; -} - -typedef struct { - LogviewApp *app; - GSList *logs; -} EnumerateJob; - -/* TODO: ideally we should parse configuration files in /etc/logrotate.conf - * and all the files in /etc/logrotate.d/ and group all the logs referring - * to the same entry under a category. Right now, we just do some - * parsing instead, and fill with quasi-sensible defaults. - */ - -/* adapted from sysklogd sources */ -static GSList* -parse_syslog () -{ - char cbuf[BUFSIZ]; - char *cline, *p; - FILE *cf; - GSList *logfiles = NULL; - - if ((cf = fopen ("/etc/syslog.conf", "r")) == NULL) { - return NULL; - } - - cline = cbuf; - while (fgets (cline, sizeof (cbuf) - (cline - cbuf), cf) != NULL) { - gchar **list; - gint i; - - for (p = cline; g_ascii_isspace (*p); ++p); - if (*p == '\0' || *p == '#' || *p == '\n') - continue; - - list = g_strsplit_set (p, ", -\t()\n", 0); - - for (i = 0; list[i]; ++i) { - if (*list[i] == '/' && - g_slist_find_custom (logfiles, list[i], - (GCompareFunc) g_ascii_strcasecmp) == NULL) - { - logfiles = g_slist_insert (logfiles, - g_strdup (list[i]), 0); - } - } - - g_strfreev (list); - } - - fclose (cf); - - return logfiles; -} - -static void -enumerate_job_finish (EnumerateJob *job) -{ - GSList *files = job->logs; - LogviewApp *app = job->app; - - logview_manager_add_logs_from_name_list (app->priv->manager, files, files->data); - - g_slist_foreach (files, (GFunc) g_free, NULL); - g_slist_free (files); - - g_object_unref (job->app); - g_slice_free (EnumerateJob, job); -} - -static void -enumerate_next_files_async_cb (GObject *source, - GAsyncResult *res, - gpointer user_data) -{ - EnumerateJob *job = user_data; - GList *enumerated_files, *l; - GFileInfo *info; - GSList *logs; - const char *content_type, *name; - char *parse_string, *container_path; - GFileType type; - GFile *container; - - enumerated_files = g_file_enumerator_next_files_finish (G_FILE_ENUMERATOR (source), - res, NULL); - if (!enumerated_files) { - enumerate_job_finish (job); - return; - } - - logs = job->logs; - container = g_file_enumerator_get_container (G_FILE_ENUMERATOR (source)); - container_path = g_file_get_path (container); - - /* TODO: we don't support grouping rotated logs yet, skip gzipped files - * and those which name contains a formatted date. - */ - for (l = enumerated_files; l; l = l->next) { - info = l->data; - type = g_file_info_get_file_type (info); - content_type = g_file_info_get_content_type (info); - name = g_file_info_get_name (info); - - if (!g_file_info_get_attribute_boolean (info, "access::can-read")) { - g_object_unref (info); - continue; - } - - if (type != (G_FILE_TYPE_REGULAR || G_FILE_TYPE_SYMBOLIC_LINK) || - !g_content_type_is_a (content_type, "text/plain")) - { - g_object_unref (info); - continue; - } - - if (g_content_type_is_a (content_type, "application/x-gzip")) { - g_object_unref (info); - continue; - } - - if (g_regex_match_simple ("\\d{8}$", name, 0, 0)) { - g_object_unref (info); - continue; - } - - parse_string = g_build_filename (container_path, name, NULL); - - if (g_slist_find_custom (logs, parse_string, (GCompareFunc) g_ascii_strcasecmp) == NULL) { - logs = g_slist_append (logs, parse_string); - } else { - g_free (parse_string); - } - - g_object_unref (info); - parse_string = NULL; - } - - g_list_free (enumerated_files); - g_object_unref (container); - g_free (container_path); - - job->logs = logs; - - enumerate_job_finish (job); -} - -static void -enumerate_children_async_cb (GObject *source, - GAsyncResult *res, - gpointer user_data) -{ - EnumerateJob *job = user_data; - GFileEnumerator *enumerator; - - enumerator = g_file_enumerate_children_finish (G_FILE (source), - res, NULL); - if (!enumerator) { - enumerate_job_finish (job); - return; - } - - g_file_enumerator_next_files_async (enumerator, G_MAXINT, - G_PRIORITY_DEFAULT, - NULL, enumerate_next_files_async_cb, job); -} - -static void -logview_app_first_time_initialize (LogviewApp *app) -{ - GSList *logs; - GFile *log_dir; - EnumerateJob *job; - - /* let's add all accessible files in /var/log and those mentioned - * in /etc/syslog.conf. - */ - - logs = parse_syslog (); - - job = g_slice_new0 (EnumerateJob); - job->app = g_object_ref (app); - job->logs = logs; - - log_dir = g_file_new_for_path ("/var/log/"); - g_file_enumerate_children_async (log_dir, - "standard::*,access::can-read", 0, - G_PRIORITY_DEFAULT, NULL, - enumerate_children_async_cb, job); - - g_object_unref (log_dir); -} - -static void -do_finalize (GObject *obj) -{ - LogviewApp *app = LOGVIEW_APP (obj); - - g_object_unref (app->priv->manager); - g_object_unref (app->priv->prefs); - - G_OBJECT_CLASS (logview_app_parent_class)->finalize (obj); -} - -static void -logview_app_class_init (LogviewAppClass *klass) -{ - GObjectClass *oclass = G_OBJECT_CLASS (klass); - - oclass->finalize = do_finalize; - - signals[APP_QUIT] = - g_signal_new ("app-quit", - G_OBJECT_CLASS_TYPE (oclass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (LogviewAppClass, app_quit), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - g_type_class_add_private (klass, sizeof (LogviewAppPrivate)); -} - -static void -logview_app_init (LogviewApp *self) -{ - LogviewAppPrivate *priv = self->priv = GET_PRIVATE (self); - - priv->prefs = logview_prefs_get (); - priv->manager = logview_manager_get (); -} - -LogviewApp* -logview_app_get (void) -{ - if (!app_singleton) { - app_singleton = g_object_new (LOGVIEW_TYPE_APP, NULL); - - if (!logview_app_set_window (app_singleton)) { - g_object_unref (app_singleton); - app_singleton = NULL; - } - } - - return app_singleton; -} - -void -logview_app_initialize (LogviewApp *app, char **log_files) -{ - LogviewAppPrivate *priv; - - g_assert (LOGVIEW_IS_APP (app)); - - priv = app->priv; - - /* open regular logs and add each log passed as a parameter */ - - if (log_files == NULL) { - char *active_log; - gchar **logs; - - active_log = logview_prefs_get_active_logfile (priv->prefs); - logs = logview_prefs_get_stored_logfiles (priv->prefs); - - if (!logs || !logs[0]) { - logview_app_first_time_initialize (app); - } else { - logview_manager_add_logs_from_names (priv->manager, - logs, active_log); - - g_free (active_log); - g_strfreev (logs); - } - } else { - logview_manager_add_logs_from_names (priv->manager, log_files, NULL); - } - - gtk_widget_show (GTK_WIDGET (priv->window)); -} - -void -logview_app_add_error (LogviewApp *app, - const char *file_path, - const char *secondary) -{ - LogviewWindow *window; - char *primary; - - g_assert (LOGVIEW_IS_APP (app)); - - window = app->priv->window; - primary = g_strdup_printf (_("Impossible to open the file %s"), file_path); - - logview_window_add_error (window, primary, secondary); - - g_free (primary); -} - -static void -check_error_prefs (gpointer data, - gpointer user_data) -{ - gchar **strings = data; - LogviewApp *app = user_data; - GFile *file = g_file_new_for_path (strings[0]); - - logview_prefs_remove_stored_log (app->priv->prefs, file); - g_object_unref (file); -} - -void -logview_app_add_errors (LogviewApp *app, - GPtrArray *errors) -{ - LogviewWindow *window; - - g_assert (LOGVIEW_IS_APP (app)); - - window = app->priv->window; - - if (errors->len == 0) { - return; - } - - g_ptr_array_foreach (errors, check_error_prefs, app); - - if (errors->len == 1) { - char **err; - - err = g_ptr_array_index (errors, 0); - logview_window_add_error (window, err[0], err[1]); - } else { - logview_window_add_errors (window, errors); - } -} |