svnno****@sourc*****
svnno****@sourc*****
Wed Mar 21 08:59:54 JST 2007
Revision: 2930 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=kazehakase&view=rev&rev=2930 Author: ikezoe Date: 2007-03-21 08:59:54 +0900 (Wed, 21 Mar 2007) Log Message: ----------- * src/kz-embed-module-impl.h: KZ_EMBED_MODULE_IMPL_INIT needs KzApp. * module/embed/gecko/kz-gecko-embed.cpp: Follow the above change. Add some KzEmbedPrefs interfaces. Modified Paths: -------------- kazehakase/trunk/ChangeLog kazehakase/trunk/module/embed/gecko/kz-gecko-embed.cpp kazehakase/trunk/src/kz-embed-module-impl.h Modified: kazehakase/trunk/ChangeLog =================================================================== --- kazehakase/trunk/ChangeLog 2007-03-20 23:41:18 UTC (rev 2929) +++ kazehakase/trunk/ChangeLog 2007-03-20 23:59:54 UTC (rev 2930) @@ -2,6 +2,9 @@ * src/kz-embed-prefs.[ch]: get_string returns gboolean. * src/kz-window.c: Use kz_embed_new() instead of kz_moz_embed_new(). + * src/kz-embed-module-impl.h: KZ_EMBED_MODULE_IMPL_INIT needs KzApp. + * module/embed/gecko/kz-gecko-embed.cpp: Follow the above change. + Add some KzEmbedPrefs interfaces. 2007-03-21 Hiroyuki Ikezoe <poinc****@ikezo*****> Modified: kazehakase/trunk/module/embed/gecko/kz-gecko-embed.cpp =================================================================== --- kazehakase/trunk/module/embed/gecko/kz-gecko-embed.cpp 2007-03-20 23:41:18 UTC (rev 2929) +++ kazehakase/trunk/module/embed/gecko/kz-gecko-embed.cpp 2007-03-20 23:59:54 UTC (rev 2930) @@ -20,12 +20,14 @@ #include "kz-embed-module-impl.h" +#include "kz-embed-prefs.h" #include "kz-gecko-single.h" #define KZ_REGRESSION_BUG4474 1 #include <string.h> #include <math.h> +#include <sys/utsname.h> #include <gtkmozembed.h> #include <gtkmozembed_internal.h> #include <glib/gi18n.h> @@ -93,6 +95,12 @@ #include <nsMemory.h> #include <nsILocalFile.h> #include <nsIDOM3Node.h> +#include <nsBuildID.h> +#include <nsIPrefService.h> +#include <nsIFontEnumerator.h> +#include <nsISimpleEnumerator.h> +#include <nsIFontList.h> +#include <nsMemory.h> #define KZ_GECKO_EMBED_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), KZ_TYPE_GECKO_EMBED, KzGeckoEmbedPrivate)) @@ -135,6 +143,7 @@ static GType kz_type_gecko_embed = 0; static GtkMozEmbedClass *kz_gecko_embed_parent_class; +static KzGeckoSingle *gecko_single = NULL; static GtkWidget *kz_gecko_embed_new (const gchar *url); @@ -348,6 +357,45 @@ gboolean allow); static void kz_gecko_embed_show_page_certificate (KzEmbed *kzembed); +/* KzEmbedPrefs interfaces */ +static void kz_gecko_embed_prefs_iface_init (KzEmbedPrefsIFace *iface); +static gboolean kz_gecko_embed_prefs_init (KzEmbedPrefs *embed_prefs); +static void kz_gecko_embed_prefs_set_profile (KzEmbedPrefs *embed_prefs, + KzProfile *profile); +static gboolean kz_gecko_embed_prefs_get_string (KzEmbedPrefs *embed_prefs, + const gchar *preference_name, + gchar **value); +static gboolean kz_gecko_embed_prefs_get_int (KzEmbedPrefs *embed_prefs, + const gchar *preference_name, + gint *value); +static gboolean kz_gecko_embed_prefs_get_boolean (KzEmbedPrefs *embed_prefs, + const gchar *preference_name, + gboolean *value); +static gboolean kz_gecko_embed_prefs_set_string (KzEmbedPrefs *embed_prefs, + const gchar *preference_name, + const gchar *new_value); +static gboolean kz_gecko_embed_prefs_set_boolean (KzEmbedPrefs *embed_prefs, + const gchar *preference_name, + gboolean new_boolean_value); +static gboolean kz_gecko_embed_prefs_set_int (KzEmbedPrefs *embed_prefs, + const gchar *preference_name, + gint new_int_value); +static gboolean kz_gecko_embed_prefs_get_font_list (KzEmbedPrefs *embed_prefs, + const gchar *lang_group, + const gchar *font_type, + GList **font_list, + GList **all_font_list, + gchar **default_font); + +static gboolean kz_gecko_embed_prefs_get_passwords (KzEmbedPrefs *embed_prefs, + GList **passwords); +static gboolean kz_gecko_embed_prefs_remove_passwords (KzEmbedPrefs *embed_prefs, + GList *passwords); +static void kz_gecko_embed_prefs_set_proxy (KzEmbedPrefs *embed_prefs, + KzProxyItem *item); +static void kz_gecko_embed_prefs_set_use_proxy (KzEmbedPrefs *embed_prefs, + gboolean use); + /* KzGeckoEmbed Class */ static void kz_gecko_embed_class_init (KzGeckoEmbedClass *klass); static void kz_gecko_embed_init (KzGeckoEmbed *embed); @@ -375,6 +423,13 @@ NULL }; + const GInterfaceInfo kz_embed_prefs_info = + { + (GInterfaceInitFunc) kz_gecko_embed_prefs_iface_init, + NULL, + NULL + }; + kz_type_gecko_embed = g_type_module_register_type(module, GTK_TYPE_MOZ_EMBED, "KzGeckoEmbed", @@ -385,17 +440,24 @@ KZ_TYPE_GECKO_EMBED, KZ_TYPE_EMBED, &kz_embed_info); + + g_type_module_add_interface(module, + KZ_TYPE_GECKO_EMBED, + KZ_TYPE_EMBED_PREFS, + &kz_embed_info); } G_MODULE_EXPORT void -KZ_EMBED_MODULE_IMPL_INIT (GTypeModule *module) +KZ_EMBED_MODULE_IMPL_INIT (GTypeModule *module, KzApp *kz_app) { + gecko_single = kz_gecko_single_new(kz_app); kz_gecko_embed_register_type(module); } G_MODULE_EXPORT void KZ_EMBED_MODULE_IMPL_EXIT (void) { + g_object_unref(gecko_single); } G_MODULE_EXPORT GtkWidget * @@ -516,6 +578,24 @@ } static void +kz_gecko_embed_prefs_iface_init (KzEmbedPrefsIFace *iface) +{ + iface->init = kz_gecko_embed_prefs_init; + iface->set_profile = kz_gecko_embed_prefs_set_profile; + iface->get_string = kz_gecko_embed_prefs_get_string; + iface->get_int = kz_gecko_embed_prefs_get_int; + iface->get_boolean = kz_gecko_embed_prefs_get_boolean; + iface->set_string = kz_gecko_embed_prefs_set_string; + iface->set_boolean = kz_gecko_embed_prefs_set_boolean; + iface->set_int = kz_gecko_embed_prefs_set_int; + iface->get_font_list = kz_gecko_embed_prefs_get_font_list; + iface->get_passwords = kz_gecko_embed_prefs_get_passwords; + iface->remove_passwords = kz_gecko_embed_prefs_remove_passwords; + iface->set_proxy = kz_gecko_embed_prefs_set_proxy; + iface->set_use_proxy = kz_gecko_embed_prefs_set_use_proxy; +} + +static void kz_gecko_embed_class_init (KzGeckoEmbedClass *klass) { GObjectClass *gobject_class; @@ -3402,3 +3482,441 @@ priv->last_highlight = NULL; } +static gboolean +kz_gecko_embed_prefs_init (KzEmbedPrefs *embed_prefs) +{ + gchar *full_path; + + full_path = g_build_filename(g_get_home_dir(), + "."PACKAGE, + "mozilla", + NULL); + gtk_moz_embed_set_profile_path(full_path, "kazehakase"); + + g_free(full_path); + + return TRUE; +} + +static void +build_user_agent (gchar *user_agent, gint size) +{ + struct utsname name; + gchar *system; + + if (uname (&name) >= 0) + { + system = g_strdup_printf ("%s %s", + name.sysname, + name.machine); + } + else + { + system = g_strdup ("Unknown"); + } + + g_snprintf(user_agent, size, + "Mozilla/5.0 (X11; %s; U;) Gecko/%d Kazehakase/" VERSION, + system, + NS_BUILD_ID/100); + g_free (system); +} + + +static void +kz_gecko_embed_prefs_set_profile (KzEmbedPrefs *embed_prefs, KzProfile *profile) +{ + char *value; + gchar user_agent[1024]; + gboolean override = FALSE, use_proxy = FALSE; + gchar proxy_name[1024]; + gboolean conf_exist = FALSE, use_proxy_exist = FALSE; + KzProxyItem *item = NULL; + + // set user agent name + kz_profile_get_value(profile, "Global", "override_user_agent", + &override, sizeof(gboolean), + KZ_PROFILE_VALUE_TYPE_BOOL); + if (override) + { + override = kz_profile_get_value(profile, "Global", "user_agent", + &user_agent, sizeof(user_agent), + KZ_PROFILE_VALUE_TYPE_STRING); + } + if (!override) + build_user_agent(user_agent, G_N_ELEMENTS(user_agent)); + mozilla_prefs_set_string ("general.useragent.override", user_agent); + + if (!mozilla_prefs_get_string("kazehakase.font.language", &value)) + { + mozilla_prefs_set_string("kazehakase.font.language", + "x-western"); + } + else + { + g_free(value); + } + + // set default charset to ISO-8859-1 + if (!mozilla_prefs_get_string("intl.charset.default", &value)) + { + mozilla_prefs_set_string("intl.charset.default", + "ISO-8859-1"); + } + else + { + if (!strcmp(value, "chrome://global-platform/locale/intl.properties")) + { + mozilla_prefs_set_string("intl.charset.default", + "ISO-8859-1"); + } + g_free(value); + } + + use_proxy_exist = kz_profile_get_value(profile, "Global", "use_proxy", + &use_proxy, sizeof(gboolean), + KZ_PROFILE_VALUE_TYPE_BOOL); + conf_exist = kz_profile_get_value(profile, "Global" , "proxy_name", + &proxy_name, sizeof(proxy_name), + KZ_PROFILE_VALUE_TYPE_STRING); + + if (!use_proxy_exist && conf_exist) + use_proxy = TRUE; + if (use_proxy) + { + mozilla_prefs_set_use_proxy(TRUE); + if (conf_exist) + item = kz_proxy_find(proxy_name); + if (item) + { + mozilla_prefs_set_proxy(item); + g_object_unref(G_OBJECT(item)); + } + } + else + { + mozilla_prefs_set_use_proxy(FALSE); + } +} + +static gboolean +kz_gecko_embed_prefs_get_string (KzEmbedPrefs *embed_prefs, + const gchar *preference_name, + gchar **value) +{ + g_return_val_if_fail(preference_name != NULL, FALSE); + + g_return_val_if_fail(value, FALSE); + + nsCOMPtr<nsIPrefService> prefService = + do_GetService (NS_PREFSERVICE_CONTRACTID); + nsCOMPtr<nsIPrefBranch> pref; + prefService->GetBranch("", getter_AddRefs(pref)); + + if (pref) + { + nsresult rv = pref->GetCharPref(preference_name, value); + return NS_SUCCEEDED(rv) ? TRUE : FALSE; + } + + return FALSE; +} + +static gboolean +kz_gecko_embed_prefs_get_int (KzEmbedPrefs *embed_prefs, + const gchar *preference_name, + gint *value) +{ + g_return_val_if_fail(preference_name != NULL, FALSE); + + g_return_val_if_fail(value, FALSE); + + nsCOMPtr<nsIPrefService> prefService = + do_GetService(NS_PREFSERVICE_CONTRACTID); + nsCOMPtr<nsIPrefBranch> pref; + prefService->GetBranch("", getter_AddRefs(pref)); + + if (pref) + { + nsresult rv = pref->GetIntPref(preference_name, value); + return NS_SUCCEEDED(rv) ? TRUE : FALSE; + } + + return FALSE; +} + +static gboolean +kz_gecko_embed_prefs_get_boolean (KzEmbedPrefs *embed_prefs, + const gchar *preference_name, + gboolean *value) +{ + g_return_val_if_fail(preference_name != NULL, FALSE); + + g_return_val_if_fail(value, FALSE); + + nsCOMPtr<nsIPrefService> prefService = + do_GetService(NS_PREFSERVICE_CONTRACTID); + nsCOMPtr<nsIPrefBranch> pref; + prefService->GetBranch("", getter_AddRefs(pref)); + + if (pref) + { + nsresult rv = pref->GetBoolPref(preference_name, value); + return NS_SUCCEEDED(rv) ? TRUE : FALSE; + } + + return FALSE; +} + +// +// this function is picked from galeon-1.2.7 +// mozilla_preference_set: set a string mozilla preference +// +static gboolean +kz_gecko_embed_prefs_set_string (KzEmbedPrefs *embed_prefs, + const gchar *preference_name, + const gchar *new_value) +{ + g_return_val_if_fail(preference_name != NULL, FALSE); + + // It is legitimate to pass in a NULL value sometimes. So let's not + // assert and just check and return. + if (!new_value) return FALSE; + + nsCOMPtr<nsIPrefService> prefService = + do_GetService(NS_PREFSERVICE_CONTRACTID); + nsCOMPtr<nsIPrefBranch> pref; + prefService->GetBranch("", getter_AddRefs(pref)); + + if (pref) + { + nsresult rv = pref->SetCharPref(preference_name, new_value); + return NS_SUCCEEDED(rv) ? TRUE : FALSE; + } + + return FALSE; +} + +// +// this function is picked from galeon-1.2.7 +// mozilla_preference_set_boolean: set a boolean mozilla preference +// +static gboolean +kz_gecko_embed_prefs_set_boolean (KzEmbedPrefs *embed_prefs, + const gchar *preference_name, + gboolean new_boolean_value) +{ + g_return_val_if_fail(preference_name != NULL, FALSE); + + nsCOMPtr<nsIPrefService> prefService = + do_GetService(NS_PREFSERVICE_CONTRACTID); + nsCOMPtr<nsIPrefBranch> pref; + prefService->GetBranch("", getter_AddRefs(pref)); + + if (pref) + { + nsresult rv = pref->SetBoolPref(preference_name, + new_boolean_value ? PR_TRUE : PR_FALSE); + return NS_SUCCEEDED(rv) ? TRUE : FALSE; + } + + return FALSE; +} + +// +// this function is picked from galeon-1.2.7 +// mozilla_preference_set_int: set an integer mozilla preference +// +static gboolean +kz_gecko_embed_prefs_set_int (KzEmbedPrefs *embed_prefs, + const gchar *preference_name, + gint new_int_value) +{ + g_return_val_if_fail(preference_name != NULL, FALSE); + + nsCOMPtr<nsIPrefService> prefService = + do_GetService(NS_PREFSERVICE_CONTRACTID); + nsCOMPtr<nsIPrefBranch> pref; + prefService->GetBranch("", getter_AddRefs(pref)); + + if (pref) + { + nsresult rv = pref->SetIntPref(preference_name, new_int_value); + return NS_SUCCEEDED(rv) ? TRUE : FALSE; + } + + return FALSE; +} + +// +// Picked from Epiphany-0.7.0 (embed/mozilla/mozilla-embed-single.cpp). +// Copyright (C) 2000, 2001, 2002 Marco Pesenti Gritti +// +static gboolean +kz_gecko_embed_prefs_get_font_list (KzEmbedPrefs *embed_prefs, + const gchar *lang_group, + const gchar *font_type, + GList **font_list, + GList **all_font_list, + gchar **default_font) + +{ + nsresult rv; + PRUint32 count; + PRUnichar **fontArray; + + nsCOMPtr<nsIFontEnumerator> mozFontEnumerator; + mozFontEnumerator = do_CreateInstance("@mozilla.org/gfx/fontenumerator;1"); + NS_ENSURE_TRUE (mozFontEnumerator, FALSE); + + // get the language proper fonts + rv = mozFontEnumerator->EnumerateFonts(lang_group, font_type, + &count, &fontArray); + NS_ENSURE_SUCCESS (rv, FALSE); + + if (font_list) + { + GList *list = NULL; + for (PRUint32 i = 0; i < count; i++) + { + char *gFontString; + + nsEmbedCString tmp; + NS_UTF16ToCString(nsEmbedString(fontArray[i]), + NS_CSTRING_ENCODING_UTF8, tmp); + gFontString = g_strdup(tmp.get()); + list = g_list_prepend(list, gFontString); + nsMemory::Free (fontArray[i]); + } + *font_list = g_list_reverse(list); + } + nsMemory::Free (fontArray); + + // get all fonts + rv = mozFontEnumerator->EnumerateAllFonts(&count, &fontArray); + NS_ENSURE_SUCCESS (rv, FALSE); + + if (font_list) + { + GList *list = NULL; + for (PRUint32 i = 0; i < count; i++) + { + char *gFontString; + + nsEmbedCString tmp; + NS_UTF16ToCString(nsEmbedString(fontArray[i]), + NS_CSTRING_ENCODING_UTF8, tmp); + if (!g_list_find_custom(*font_list, tmp.get(), + (GCompareFunc)strcmp)) + { + gFontString = g_strdup(tmp.get()); + list = g_list_prepend(list, gFontString); + nsMemory::Free (fontArray[i]); + } + } + *all_font_list = g_list_reverse(list); + } + nsMemory::Free (fontArray); + + if (default_font != NULL) + { + char key[255]; + char *value = NULL; + nsCOMPtr<nsIPrefService> prefService; + + prefService = do_GetService(NS_PREFSERVICE_CONTRACTID); + g_return_val_if_fail(prefService != NULL, FALSE); + + nsCOMPtr<nsIPrefBranch> pref; + prefService->GetBranch("", getter_AddRefs(pref)); + g_return_val_if_fail(pref != NULL, FALSE); + + g_snprintf(key, sizeof(key), "font.name.%s.%s", + font_type, lang_group); + + pref->GetCharPref(key, &value); + *default_font = g_strdup(value); + nsMemory::Free(value); + } + + return TRUE; +} + +static gboolean +kz_gecko_embed_prefs_get_passwords (KzEmbedPrefs *embed_prefs, GList **passwords) +{ +} + +static gboolean +kz_gecko_embed_prefs_remove_passwords (KzEmbedPrefs *embed_prefs, GList *passwords) +{ +} + +static void +kz_gecko_embed_prefs_set_proxy (KzEmbedPrefs *embed_prefs, KzProxyItem *item) +{ + gboolean use_same_proxy; + gchar *http_host, *https_host, *ftp_host, *no_proxies_on; + guint http_port, https_port, ftp_port; + + g_return_if_fail(KZ_IS_PROXY_ITEM(item)); + + g_object_get(G_OBJECT(item), + "use_same_proxy", &use_same_proxy, + "http_host", &http_host, + "http_port", &http_port, + "https_host", &https_host, + "https_port", &https_port, + "ftp_host", &ftp_host, + "ftp_port", &ftp_port, + "no_proxies_on", &no_proxies_on, + NULL); + + mozilla_prefs_set_use_proxy(TRUE); + mozilla_prefs_set_string("network.proxy.http", http_host); + mozilla_prefs_set_int ("network.proxy.http_port", http_port); + mozilla_prefs_set_string("network.proxy.no_proxies_on", no_proxies_on); + + if (use_same_proxy) + { + if (https_host) + g_free(https_host); + if (ftp_host) + g_free(ftp_host); + + https_host = ftp_host = http_host; + http_port = ftp_port = http_port; + } + else + { + if (!https_host) + { + https_host = ""; + https_port = 0; + } + if (!ftp_host) + { + ftp_host = ""; + ftp_port = 0; + } + } + mozilla_prefs_set_string("network.proxy.ssl", https_host); + mozilla_prefs_set_int ("network.proxy.ssl_port", https_port); + mozilla_prefs_set_string("network.proxy.ftp", ftp_host); + mozilla_prefs_set_int ("network.proxy.ftp_port", ftp_port); + + if (http_host) + g_free(http_host); + if (no_proxies_on) + g_free(no_proxies_on); +} + +static void +kz_gecko_embed_prefs_set_use_proxy (KzEmbedPrefs *embed_prefs, gboolean use) +{ + if (use) + mozilla_prefs_set_int("network.proxy.type", 1); + else + mozilla_prefs_set_int("network.proxy.type", 0); +} + Modified: kazehakase/trunk/src/kz-embed-module-impl.h =================================================================== --- kazehakase/trunk/src/kz-embed-module-impl.h 2007-03-20 23:41:18 UTC (rev 2929) +++ kazehakase/trunk/src/kz-embed-module-impl.h 2007-03-20 23:59:54 UTC (rev 2930) @@ -22,6 +22,7 @@ #define __KZ_EMBED_MODULE_IMPL_H__ #include <glib-object.h> +#include "kz-app.h" G_BEGIN_DECLS @@ -36,7 +37,7 @@ #define KZ_EMBED_MODULE_IMPL_CREATE kz_embed_module_impl_create -void KZ_EMBED_MODULE_IMPL_INIT (GTypeModule *module); +void KZ_EMBED_MODULE_IMPL_INIT (GTypeModule *module, KzApp *kz_app); void KZ_EMBED_MODULE_IMPL_EXIT (void); GtkWidget *KZ_EMBED_MODULE_IMPL_CREATE (const gchar *url);