/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* * Copyright © 2011 Igalia S.L. * * 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, 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifdef HAVE_CONFIG_H #include #endif #include "ephy-request-about.h" #include "ephy-file-helpers.h" #include "ephy-smaps.h" #include "ephy-web-app-utils.h" #include #include #include #include G_DEFINE_TYPE (EphyRequestAbout, ephy_request_about, SOUP_TYPE_REQUEST) struct _EphyRequestAboutPrivate { gssize content_length; gchar *css_style; EphySMaps *smaps; }; static void ephy_request_about_init (EphyRequestAbout *about) { about->priv = G_TYPE_INSTANCE_GET_PRIVATE (about, EPHY_TYPE_REQUEST_ABOUT, EphyRequestAboutPrivate); about->priv->content_length = 0; about->priv->css_style = NULL; about->priv->smaps = ephy_smaps_new (); } static void ephy_request_about_finalize (GObject *obj) { EphyRequestAboutPrivate *priv = EPHY_REQUEST_ABOUT (obj)->priv; g_object_unref (priv->smaps); g_free (priv->css_style); G_OBJECT_CLASS (ephy_request_about_parent_class)->finalize (obj); } static gboolean ephy_request_about_check_uri (SoupRequest *request, SoupURI *uri, GError **error) { return uri->host == NULL; } static void read_css_style (EphyRequestAbout *about) { GError *error = NULL; const gchar *file = ephy_file ("about.css"); if (file && !g_file_get_contents (file, &about->priv->css_style, NULL, &error)) { g_debug ("%s", error->message); g_error_free (error); } } static GInputStream * ephy_request_about_send (SoupRequest *request, GCancellable *cancellable, GError **error) { EphyRequestAbout *about = EPHY_REQUEST_ABOUT (request); SoupURI *uri = soup_request_get_uri (request); GString *data_str = g_string_new(""); if (!about->priv->css_style) read_css_style (about); if (!g_strcmp0 (uri->path, "plugins")) { WebKitWebPluginDatabase* database = webkit_get_web_plugin_database (); GSList *plugin_list, *p; g_string_append_printf (data_str, "%s" \ "", _("Installed plugins"), about->priv->css_style); g_string_append_printf (data_str, "

%s

", _("Installed plugins")); plugin_list = webkit_web_plugin_database_get_plugins (database); for (p = plugin_list; p; p = p->next) { WebKitWebPlugin *plugin = WEBKIT_WEB_PLUGIN (p->data); GSList *m, *mime_types; g_string_append_printf (data_str, "

%s

%s
%s: %s"\ "" \ " ", webkit_web_plugin_get_name (plugin), webkit_web_plugin_get_description (plugin), _("Enabled"), webkit_web_plugin_get_enabled (plugin) ? _("Yes") : _("No"), _("MIME type"), _("Description"), _("Suffixes")); mime_types = webkit_web_plugin_get_mimetypes (plugin); for (m = mime_types; m; m = m->next) { WebKitWebPluginMIMEType *mime_type = (WebKitWebPluginMIMEType*) m->data; guint i; g_string_append_printf (data_str, ""); } g_string_append (data_str, "
%s%s%s
%s%s", mime_type->name, mime_type->description); for (i = 0; mime_type->extensions[i] != NULL; i++) g_string_append_printf (data_str, "%s%c", mime_type->extensions[i], mime_type->extensions[i + 1] ? ',' : ' '); g_string_append (data_str, "
"); } webkit_web_plugin_database_plugins_list_free (plugin_list); g_string_append (data_str, ""); } else if (!g_strcmp0 (uri->path, "memory")) { char *memory = ephy_smaps_to_html (EPHY_REQUEST_ABOUT (request)->priv->smaps); if (memory) { g_string_append_printf (data_str, "%s" \ "", _("Memory usage"), about->priv->css_style); g_string_append_printf (data_str, "

%s

", _("Memory usage")); g_string_append (data_str, memory); g_free (memory); } } else if (!g_strcmp0 (uri->path, "epiphany")) { g_string_append_printf (data_str, "Epiphany" \ "" \ "", about->priv->css_style); g_string_append (data_str, "
" \ "Il semble que la perfection soit atteinte non quand il n'y a plus rien à" \ " ajouter, mais quand il n'y a plus rien à retrancher." \ "
" \ "
" \ "" \ "Antoine de Saint-Exupéry" \ "
"); } else if (!g_strcmp0 (uri->path, "applications")) { GList *applications, *p; g_string_append_printf (data_str, "%s" \ "" \ "

%s

" \ "

%s

", _("Applications"), about->priv->css_style, _("Applications"), _("List of installed web applications")); g_string_append (data_str, "
"); applications = ephy_web_application_get_application_list (); for (p = applications; p; p = p->next) { char *img_data = NULL, *img_data_base64 = NULL; gsize data_length; EphyWebApplication *app = (EphyWebApplication*)p->data; if (g_file_get_contents (app->icon_url, &img_data, &data_length, NULL)) img_data_base64 = g_base64_encode ((guchar*)img_data, data_length); g_string_append_printf (data_str, "", img_data_base64, app->name, app->url, app->name, /* Note for translators: this refers to the installation date. */ _("Installed on:"), app->install_date); g_free (img_data_base64); g_free (img_data); } g_string_append (data_str, "
" \ "
%s
%s
%s
%s
"); ephy_web_application_free_application_list (applications); } g_string_append (data_str, ""); about->priv->content_length = data_str->len; return g_memory_input_stream_new_from_data (g_string_free (data_str, false), about->priv->content_length, g_free); } static goffset ephy_request_about_get_content_length (SoupRequest *request) { return EPHY_REQUEST_ABOUT (request)->priv->content_length; } static const char * ephy_request_about_get_content_type (SoupRequest *request) { return "text/html"; } static const char *about_schemes[] = { EPHY_ABOUT_SCHEME, NULL }; static void ephy_request_about_class_init (EphyRequestAboutClass *request_about_class) { GObjectClass *gobject_class = G_OBJECT_CLASS (request_about_class); SoupRequestClass *request_class = SOUP_REQUEST_CLASS (request_about_class); gobject_class->finalize = ephy_request_about_finalize; request_class->schemes = about_schemes; request_class->check_uri = ephy_request_about_check_uri; request_class->send = ephy_request_about_send; request_class->get_content_length = ephy_request_about_get_content_length; request_class->get_content_type = ephy_request_about_get_content_type; g_type_class_add_private (request_about_class, sizeof (EphyRequestAboutPrivate)); }