Create a database to save to and load form history from

This commit is contained in:
Christian Dywan 2009-11-01 23:49:58 +01:00
parent 1b8def494d
commit e982985976

View file

@ -19,6 +19,10 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
#if HAVE_SQLITE
#include <sqlite3.h>
#endif
static GHashTable* global_keys; static GHashTable* global_keys;
static gchar* jsforms; static gchar* jsforms;
@ -99,7 +103,19 @@ formhistory_build_js ()
} }
static void static void
formhistory_update_main_hash (GHashTable* keys) formhistory_update_database (gpointer db,
const gchar* key,
const gchar* value)
{
#if HAVE_SQLITE
/* FIXME: Write keys to the database */
/* g_print (":: %s= %s\n", key, value); */
#endif
}
static void
formhistory_update_main_hash (GHashTable* keys,
gpointer db)
{ {
GHashTableIter iter; GHashTableIter iter;
gchar* key; gchar* key;
@ -117,8 +133,7 @@ formhistory_update_main_hash (GHashTable* keys)
if (length > MAXCHARS || length < MINCHARS) if (length > MAXCHARS || length < MINCHARS)
continue; continue;
tmp = g_hash_table_lookup (global_keys, (gpointer)key); if ((tmp = g_hash_table_lookup (global_keys, (gpointer)key)))
if (tmp)
{ {
gchar* rvalue = g_strdup_printf ("\"%s\"",value); gchar* rvalue = g_strdup_printf ("\"%s\"",value);
if (!g_regex_match_simple (rvalue, tmp, if (!g_regex_match_simple (rvalue, tmp,
@ -126,6 +141,7 @@ formhistory_update_main_hash (GHashTable* keys)
{ {
gchar* new_value = g_strdup_printf ("%s%s,", tmp, rvalue); gchar* new_value = g_strdup_printf ("%s%s,", tmp, rvalue);
g_hash_table_replace (global_keys, key, new_value); g_hash_table_replace (global_keys, key, new_value);
formhistory_update_database (db, key, value);
} }
g_free (rvalue); g_free (rvalue);
} }
@ -133,29 +149,34 @@ formhistory_update_main_hash (GHashTable* keys)
{ {
gchar* new_value = g_strdup_printf ("\"%s\",",value); gchar* new_value = g_strdup_printf ("\"%s\",",value);
g_hash_table_insert (global_keys, key, new_value); g_hash_table_insert (global_keys, key, new_value);
formhistory_update_database (db, key, value);
} }
} }
} }
static void static void
formhistory_session_request_queued_cb (SoupSession* session, formhistory_session_request_queued_cb (SoupSession* session,
SoupMessage* msg) SoupMessage* msg,
MidoriExtension* extension)
{ {
gchar* method = katze_object_get_string (msg, "method"); gchar* method = katze_object_get_string (msg, "method");
if (method && !strncmp (method, "POST", 4)) if (method && !strncmp (method, "POST", 4))
{ {
/* SoupMessageHeaders* hdrs = msg->request_headers;
const gchar* referer; */
SoupMessageBody* body = msg->request_body; SoupMessageBody* body = msg->request_body;
if (soup_message_body_get_accumulate (body)) if (soup_message_body_get_accumulate (body))
{ {
SoupBuffer* buffer = soup_message_body_flatten (body); SoupBuffer* buffer;
GHashTable* keys = soup_form_decode (body->data); GHashTable* keys;
formhistory_update_main_hash (keys); gpointer db;
buffer = soup_message_body_flatten (body);
keys = soup_form_decode (body->data);
db = g_object_get_data (G_OBJECT (extension), "formhistory-db");
formhistory_update_main_hash (keys, db);
soup_buffer_free (buffer); soup_buffer_free (buffer);
g_hash_table_destroy (keys);
} }
/* FIXME: Need a permanent storage implementation */
/* referer = soup_message_headers_get_one (hdrs, "Referer"); */
} }
g_free (method); g_free (method);
} }
@ -173,14 +194,15 @@ formhistory_window_object_cleared_cb (GtkWidget* web_view,
static void static void
formhistory_add_tab_cb (MidoriBrowser* browser, formhistory_add_tab_cb (MidoriBrowser* browser,
MidoriView* view) MidoriView* view,
MidoriExtension* extension)
{ {
GtkWidget* web_view = gtk_bin_get_child (GTK_BIN (view)); GtkWidget* web_view = gtk_bin_get_child (GTK_BIN (view));
SoupSession *session = webkit_get_default_session (); SoupSession *session = webkit_get_default_session ();
g_signal_connect (web_view, "window-object-cleared", g_signal_connect (web_view, "window-object-cleared",
G_CALLBACK (formhistory_window_object_cleared_cb), 0); G_CALLBACK (formhistory_window_object_cleared_cb), NULL);
g_signal_connect (session, "request-queued", g_signal_connect (session, "request-queued",
G_CALLBACK (formhistory_session_request_queued_cb), 0); G_CALLBACK (formhistory_session_request_queued_cb), extension);
} }
static void static void
@ -189,9 +211,10 @@ formhistory_deactivate_cb (MidoriExtension* extension,
static void static void
formhistory_add_tab_foreach_cb (MidoriView* view, formhistory_add_tab_foreach_cb (MidoriView* view,
MidoriBrowser* browser) MidoriBrowser* browser,
MidoriExtension* extension)
{ {
formhistory_add_tab_cb (browser, view); formhistory_add_tab_cb (browser, view, extension);
} }
static void static void
@ -200,24 +223,26 @@ formhistory_app_add_browser_cb (MidoriApp* app,
MidoriExtension* extension) MidoriExtension* extension)
{ {
midori_browser_foreach (browser, midori_browser_foreach (browser,
(GtkCallback)formhistory_add_tab_foreach_cb, browser); (GtkCallback)formhistory_add_tab_foreach_cb, extension);
g_signal_connect (browser, "add-tab", G_CALLBACK (formhistory_add_tab_cb), 0); g_signal_connect (browser, "add-tab",
G_CALLBACK (formhistory_add_tab_cb), extension);
g_signal_connect (extension, "deactivate", g_signal_connect (extension, "deactivate",
G_CALLBACK (formhistory_deactivate_cb), browser); G_CALLBACK (formhistory_deactivate_cb), browser);
} }
static void static void
formhistory_deactivate_tabs (MidoriView* view, formhistory_deactivate_tabs (MidoriView* view,
MidoriBrowser* browser) MidoriBrowser* browser,
MidoriExtension* extension)
{ {
GtkWidget* web_view = gtk_bin_get_child (GTK_BIN (view)); GtkWidget* web_view = gtk_bin_get_child (GTK_BIN (view));
SoupSession *session = webkit_get_default_session (); SoupSession *session = webkit_get_default_session ();
g_signal_handlers_disconnect_by_func ( g_signal_handlers_disconnect_by_func (
browser, formhistory_add_tab_cb, 0); browser, formhistory_add_tab_cb, extension);
g_signal_handlers_disconnect_by_func ( g_signal_handlers_disconnect_by_func (
web_view, formhistory_window_object_cleared_cb, 0); web_view, formhistory_window_object_cleared_cb, NULL);
g_signal_handlers_disconnect_by_func ( g_signal_handlers_disconnect_by_func (
session, formhistory_session_request_queued_cb, 0); session, formhistory_session_request_queued_cb, extension);
} }
static void static void
@ -225,22 +250,36 @@ formhistory_deactivate_cb (MidoriExtension* extension,
MidoriBrowser* browser) MidoriBrowser* browser)
{ {
MidoriApp* app = midori_extension_get_app (extension); MidoriApp* app = midori_extension_get_app (extension);
#if HAVE_SQLITE
sqlite3* db;
#endif
g_signal_handlers_disconnect_by_func ( g_signal_handlers_disconnect_by_func (
extension, formhistory_deactivate_cb, browser); extension, formhistory_deactivate_cb, browser);
g_signal_handlers_disconnect_by_func ( g_signal_handlers_disconnect_by_func (
app, formhistory_app_add_browser_cb, extension); app, formhistory_app_add_browser_cb, extension);
midori_browser_foreach (browser, (GtkCallback)formhistory_deactivate_tabs, browser); midori_browser_foreach (browser,
(GtkCallback)formhistory_deactivate_tabs, extension);
jsforms = ""; jsforms = "";
if (global_keys) if (global_keys)
g_hash_table_destroy (global_keys); g_hash_table_destroy (global_keys);
#if HAVE_SQLITE
if ((db = g_object_get_data (G_OBJECT (extension), "formhistory-db")))
sqlite3_close (db);
#endif
} }
static void static void
formhistory_activate_cb (MidoriExtension* extension, formhistory_activate_cb (MidoriExtension* extension,
MidoriApp* app) MidoriApp* app)
{ {
#if HAVE_SQLITE
const gchar* config_dir;
gchar* filename;
sqlite3* db;
#endif
KatzeArray* browsers; KatzeArray* browsers;
MidoriBrowser* browser; MidoriBrowser* browser;
guint i; guint i;
@ -248,6 +287,21 @@ formhistory_activate_cb (MidoriExtension* extension,
global_keys = g_hash_table_new_full (g_str_hash, g_str_equal, global_keys = g_hash_table_new_full (g_str_hash, g_str_equal,
(GDestroyNotify)g_free, (GDestroyNotify)g_free,
(GDestroyNotify)g_free); (GDestroyNotify)g_free);
#if HAVE_SQLITE
config_dir = midori_extension_get_config_dir (extension);
katze_mkdir_with_parents (config_dir, 0700);
filename = g_build_filename (config_dir, "forms.db", NULL);
if (sqlite3_open (filename, &db))
{
g_warning (_("Failed to open database: %s\n"), sqlite3_errmsg (db));
sqlite3_close (db);
}
g_free (filename);
/* FIXME: Load keys from the database */
g_object_set_data (G_OBJECT (extension), "formhistory-db", db);
#endif
browsers = katze_object_get_object (app, "browsers"); browsers = katze_object_get_object (app, "browsers");
i = 0; i = 0;
while ((browser = katze_array_get_nth_item (browsers, i++))) while ((browser = katze_array_get_nth_item (browsers, i++)))
@ -278,8 +332,10 @@ MidoriExtension*
extension_init (void) extension_init (void)
{ {
gboolean should_init = TRUE; gboolean should_init = TRUE;
gchar* ver; const gchar* ver;
gchar* desc; gchar* desc;
MidoriExtension* extension;
if (formhistory_prepare_js ()) if (formhistory_prepare_js ())
{ {
ver = "0.1"; ver = "0.1";
@ -292,7 +348,8 @@ extension_init (void)
ver = NULL; ver = NULL;
should_init = FALSE; should_init = FALSE;
} }
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
extension = g_object_new (MIDORI_TYPE_EXTENSION,
"name", _("Form history filler"), "name", _("Form history filler"),
"description", desc, "description", desc,
"version", ver, "version", ver,