aboutsummaryrefslogtreecommitdiffstats
path: root/embed/ephy-embed-single.c
diff options
context:
space:
mode:
authorXan Lopez <xan@gnome.org>2009-06-06 04:50:06 +0800
committerXan Lopez <xan@gnome.org>2009-06-06 04:50:06 +0800
commitc3c1771fb6776ee3371ef06e5509d7e347880464 (patch)
treefd4d2786898ba60905727f3c336d3978478d2c01 /embed/ephy-embed-single.c
parentecd30f7b95964ec717d5da6873492fab939f2523 (diff)
downloadgsoc2013-epiphany-c3c1771fb6776ee3371ef06e5509d7e347880464.tar
gsoc2013-epiphany-c3c1771fb6776ee3371ef06e5509d7e347880464.tar.gz
gsoc2013-epiphany-c3c1771fb6776ee3371ef06e5509d7e347880464.tar.bz2
gsoc2013-epiphany-c3c1771fb6776ee3371ef06e5509d7e347880464.tar.lz
gsoc2013-epiphany-c3c1771fb6776ee3371ef06e5509d7e347880464.tar.xz
gsoc2013-epiphany-c3c1771fb6776ee3371ef06e5509d7e347880464.tar.zst
gsoc2013-epiphany-c3c1771fb6776ee3371ef06e5509d7e347880464.zip
Make EphyEmbedSingle a non-interface type.
Diffstat (limited to 'embed/ephy-embed-single.c')
-rw-r--r--embed/ephy-embed-single.c302
1 files changed, 253 insertions, 49 deletions
diff --git a/embed/ephy-embed-single.c b/embed/ephy-embed-single.c
index 9b0e8178f..76539457a 100644
--- a/embed/ephy-embed-single.c
+++ b/embed/ephy-embed-single.c
@@ -20,42 +20,121 @@
#include "config.h"
#include "ephy-embed-single.h"
+#include "ephy-embed-prefs.h"
#include "ephy-embed-type-builtins.h"
+#include "ephy-file-helpers.h"
#include "ephy-marshal.h"
#include "ephy-signal-accumulator.h"
+#include "ephy-password-manager.h"
+#include "ephy-permission-manager.h"
-static void ephy_embed_single_iface_init (gpointer g_class);
+#ifdef ENABLE_CERTIFICATE_MANAGER
+#include "ephy-certificate-manager.h"
+#endif
-GType
-ephy_embed_single_get_type (void)
+#include <webkit/webkit.h>
+#include <libsoup/soup-gnome.h>
+
+#define EPHY_EMBED_SINGLE_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_EMBED_SINGLE, EphyEmbedSinglePrivate))
+
+struct _EphyEmbedSinglePrivate {
+ guint online : 1;
+};
+
+enum {
+ PROP_0,
+ PROP_NETWORK_STATUS
+};
+
+static void ephy_embed_single_init (EphyEmbedSingle *single);
+static void ephy_embed_single_class_init (EphyEmbedSingleClass *klass);
+static void ephy_permission_manager_iface_init (EphyPermissionManagerIface *iface);
+static void ephy_password_manager_iface_init (EphyPasswordManagerIface *iface);
+#ifdef ENABLE_CERTIFICATE_MANAGER
+static void ephy_certificate_manager_iface_init (EphyCertificateManagerIface *iface);
+#endif
+
+static void
+ephy_embed_single_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
{
- static GType type = 0;
-
- if (G_UNLIKELY (type == 0))
- {
- const GTypeInfo our_info =
- {
- sizeof (EphyEmbedSingleIface),
- ephy_embed_single_iface_init,
- NULL,
- };
-
- type = g_type_register_static (G_TYPE_INTERFACE,
- "EphyEmbedSingle",
- &our_info,
- (GTypeFlags) 0);
- }
-
- return type;
+ EphyEmbedSingle *single = EPHY_EMBED_SINGLE (object);
+
+ switch (prop_id) {
+ case PROP_NETWORK_STATUS:
+ g_value_set_boolean (value, ephy_embed_single_get_network_status (single));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
}
static void
-ephy_embed_single_iface_init (gpointer g_iface)
+ephy_embed_single_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
{
- static gboolean initialised = FALSE;
+ EphyEmbedSingle *single = EPHY_EMBED_SINGLE (object);
+
+ switch (prop_id) {
+ case PROP_NETWORK_STATUS:
+ ephy_embed_single_set_network_status (single, g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* Some compilers (like gcc 2.95) don't support preprocessor directives inside macros,
+ so we have to duplicate the whole thing */
+
+#ifdef ENABLE_CERTIFICATE_MANAGER
+G_DEFINE_TYPE_WITH_CODE (EphyEmbedSingle, ephy_embed_single, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (EPHY_TYPE_PASSWORD_MANAGER,
+ ephy_password_manager_iface_init)
+ G_IMPLEMENT_INTERFACE (EPHY_TYPE_CERTIFICATE_MANAGER,
+ ephy_certificate_manager_iface_init)
+ G_IMPLEMENT_INTERFACE (EPHY_TYPE_PERMISSION_MANAGER,
+ ephy_permission_manager_iface_init))
+#else
+G_DEFINE_TYPE_WITH_CODE (EphyEmbedSingle, ephy_embed_single, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (EPHY_TYPE_PASSWORD_MANAGER,
+ ephy_password_manager_iface_init)
+ G_IMPLEMENT_INTERFACE (EPHY_TYPE_PERMISSION_MANAGER,
+ ephy_permission_manager_iface_init))
+#endif
+
+static void
+ephy_embed_single_finalize (GObject *object)
+{
+ ephy_embed_prefs_shutdown ();
+
+ G_OBJECT_CLASS (ephy_embed_single_parent_class)->finalize (object);
+}
+
+static void
+ephy_embed_single_init (EphyEmbedSingle *single)
+{
+ EphyEmbedSinglePrivate *priv;
+
+ single->priv = priv = EPHY_EMBED_SINGLE_GET_PRIVATE (single);
+ priv->online = TRUE;
+}
+
+static void
+ephy_embed_single_class_init (EphyEmbedSingleClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = ephy_embed_single_finalize;
+ object_class->get_property = ephy_embed_single_get_property;
+ object_class->set_property = ephy_embed_single_set_property;
- if (initialised == FALSE)
- {
/**
* EphyEmbedSingle::new-window:
* @single:
@@ -70,7 +149,7 @@ ephy_embed_single_iface_init (gpointer g_iface)
g_signal_new ("new-window",
EPHY_TYPE_EMBED_SINGLE,
G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EphyEmbedSingleIface, new_window),
+ G_STRUCT_OFFSET (EphyEmbedSingleClass, new_window),
ephy_signal_accumulator_object, ephy_embed_get_type,
ephy_marshal_OBJECT__OBJECT_FLAGS,
GTK_TYPE_WIDGET,
@@ -94,7 +173,7 @@ ephy_embed_single_iface_init (gpointer g_iface)
g_signal_new ("handle_content",
EPHY_TYPE_EMBED_SINGLE,
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EphyEmbedSingleIface, handle_content),
+ G_STRUCT_OFFSET (EphyEmbedSingleClass, handle_content),
g_signal_accumulator_true_handled, NULL,
ephy_marshal_BOOLEAN__STRING_STRING,
G_TYPE_BOOLEAN,
@@ -114,7 +193,7 @@ ephy_embed_single_iface_init (gpointer g_iface)
g_signal_new ("add-sidebar",
EPHY_TYPE_EMBED_SINGLE,
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EphyEmbedSingleIface, add_sidebar),
+ G_STRUCT_OFFSET (EphyEmbedSingleClass, add_sidebar),
g_signal_accumulator_true_handled, NULL,
ephy_marshal_BOOLEAN__STRING_STRING,
G_TYPE_BOOLEAN,
@@ -135,7 +214,7 @@ ephy_embed_single_iface_init (gpointer g_iface)
g_signal_new ("add-search-engine",
EPHY_TYPE_EMBED_SINGLE,
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EphyEmbedSingleIface, add_search_engine),
+ G_STRUCT_OFFSET (EphyEmbedSingleClass, add_search_engine),
g_signal_accumulator_true_handled, NULL,
ephy_marshal_BOOLEAN__STRING_STRING_STRING,
G_TYPE_BOOLEAN,
@@ -149,30 +228,162 @@ ephy_embed_single_iface_init (gpointer g_iface)
*
* Whether the network is on-line.
*/
- g_object_interface_install_property
- (g_iface,
+ g_object_class_install_property
+ (object_class,
+ PROP_NETWORK_STATUS,
g_param_spec_boolean ("network-status",
"network-status",
"network-status",
FALSE,
G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
- initialised = TRUE;
- }
+ g_type_class_add_private (object_class, sizeof (EphyEmbedSinglePrivate));
+}
+
+static void
+impl_permission_manager_add (EphyPermissionManager *manager,
+ const char *host,
+ const char *type,
+ EphyPermission permission)
+{
+}
+
+static void
+impl_permission_manager_remove (EphyPermissionManager *manager,
+ const char *host,
+ const char *type)
+{
+}
+
+static void
+impl_permission_manager_clear (EphyPermissionManager *manager)
+{
+}
+
+static EphyPermission
+impl_permission_manager_test (EphyPermissionManager *manager,
+ const char *host,
+ const char *type)
+{
+ g_return_val_if_fail (type != NULL && type[0] != '\0', EPHY_PERMISSION_DEFAULT);
+
+ return (EphyPermission)0;
+}
+
+static GList *
+impl_permission_manager_list (EphyPermissionManager *manager,
+ const char *type)
+{
+ GList *list = NULL;
+ return list;
+}
+
+static void
+ephy_permission_manager_iface_init (EphyPermissionManagerIface *iface)
+{
+ iface->add = impl_permission_manager_add;
+ iface->remove = impl_permission_manager_remove;
+ iface->clear = impl_permission_manager_clear;
+ iface->test = impl_permission_manager_test;
+ iface->list = impl_permission_manager_list;
+}
+
+static GList *
+impl_list_passwords (EphyPasswordManager *manager)
+{
+ return NULL;
+}
+
+static void
+impl_remove_password (EphyPasswordManager *manager,
+ EphyPasswordInfo *info)
+{
+}
+
+static void
+impl_remove_all_passwords (EphyPasswordManager *manager)
+{
+}
+
+static void
+impl_add_password (EphyPasswordManager *manager,
+ EphyPasswordInfo *info)
+{
+}
+
+static void
+ephy_password_manager_iface_init (EphyPasswordManagerIface *iface)
+{
+ iface->add = impl_add_password;
+ iface->remove = impl_remove_password;
+ iface->remove_all = impl_remove_all_passwords;
+ iface->list = impl_list_passwords;
}
+#ifdef ENABLE_CERTIFICATE_MANAGER
+
+static gboolean
+impl_remove_certificate (EphyCertificateManager *manager,
+ EphyX509Cert *cert)
+{
+ return TRUE;
+}
+
+#define NICK_DELIMITER PRUnichar ('\001')
+static GList *
+impl_get_certificates (EphyCertificateManager *manager,
+ EphyX509CertType type)
+{
+ return NULL;
+}
+
+static gboolean
+impl_import (EphyCertificateManager *manager,
+ const gchar *file)
+{
+ return TRUE;
+}
+
+static void
+ephy_certificate_manager_iface_init (EphyCertificateManagerIface *iface)
+{
+ iface->get_certificates = impl_get_certificates;
+ iface->remove_certificate = impl_remove_certificate;
+ iface->import = impl_import;
+}
+
+#endif /* ENABLE_CERTIFICATE_MANAGER */
+
/**
- * ephy_embed_single_init:
+ * ephy_embed_single_initialize:
* @single: the #EphyEmbedSingle
*
* Performs startup initialisations. Must be called before calling
* any other methods.
**/
gboolean
-ephy_embed_single_init (EphyEmbedSingle *single)
+ephy_embed_single_initialize (EphyEmbedSingle *single)
{
- EphyEmbedSingleIface *iface = EPHY_EMBED_SINGLE_GET_IFACE (single);
- return iface->init (single);
+ SoupSession *session;
+ SoupCookieJar *jar;
+ char *filename;
+
+ ephy_embed_prefs_init ();
+
+ session = webkit_get_default_session ();
+
+ /* Store cookies in moz-compatible SQLite format */
+ filename = g_build_filename (ephy_dot_dir (), "cookies.sqlite", NULL);
+ jar = soup_cookie_jar_sqlite_new (filename, FALSE);
+ g_free (filename);
+
+ soup_session_add_feature (session, SOUP_SESSION_FEATURE(jar));
+ g_object_unref (jar);
+
+ /* Use GNOME proxy settings through libproxy */
+ soup_session_add_feature_by_type (session, SOUP_TYPE_PROXY_RESOLVER_GNOME);
+
+ return TRUE;
}
/**
@@ -184,8 +395,6 @@ ephy_embed_single_init (EphyEmbedSingle *single)
void
ephy_embed_single_clear_cache (EphyEmbedSingle *single)
{
- EphyEmbedSingleIface *iface = EPHY_EMBED_SINGLE_GET_IFACE (single);
- iface->clear_cache (single);
}
/**
@@ -205,8 +414,6 @@ ephy_embed_single_clear_cache (EphyEmbedSingle *single)
void
ephy_embed_single_clear_auth_cache (EphyEmbedSingle *single)
{
- EphyEmbedSingleIface *iface = EPHY_EMBED_SINGLE_GET_IFACE (single);
- iface->clear_auth_cache (single);
}
/**
@@ -220,8 +427,8 @@ void
ephy_embed_single_set_network_status (EphyEmbedSingle *single,
gboolean status)
{
- EphyEmbedSingleIface *iface = EPHY_EMBED_SINGLE_GET_IFACE (single);
- iface->set_network_status (single, status);
+ if (status != single->priv->online)
+ single->priv->online = status;
}
/**
@@ -235,8 +442,7 @@ ephy_embed_single_set_network_status (EphyEmbedSingle *single,
gboolean
ephy_embed_single_get_network_status (EphyEmbedSingle *single)
{
- EphyEmbedSingleIface *iface = EPHY_EMBED_SINGLE_GET_IFACE (single);
- return iface->get_network_status (single);
+ return single->priv->online;
}
/**
@@ -256,8 +462,7 @@ GList *
ephy_embed_single_get_font_list (EphyEmbedSingle *single,
const char *lang_group)
{
- EphyEmbedSingleIface *iface = EPHY_EMBED_SINGLE_GET_IFACE (single);
- return iface->get_font_list (single, lang_group);
+ return NULL;
}
/**
@@ -285,6 +490,5 @@ ephy_embed_single_open_window (EphyEmbedSingle *single,
const char *name,
const char *features)
{
- EphyEmbedSingleIface *iface = EPHY_EMBED_SINGLE_GET_IFACE (single);
- return iface->open_window (single, parent, address, name, features);
+ return NULL;
}