Files
evolution/plugins/groupwise-features/junk-settings.c
Jonathon Jongsma c2ee0afbc8 Rename EError to EAlert to match general use better
The EError mechanism is used both for error dialogs as well as basic alerts or
user prompts, so we should give it a more general name which matches this use.

This patch also cleans up a few includes of e-alert.h (formerly e-error.h) that
were not actually being used.

https://bugzilla.gnome.org/show_bug.cgi?id=602963
2009-11-30 13:33:04 -06:00

428 lines
12 KiB
C

/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) version 3.
*
* 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with the program; if not, see <http://www.gnu.org/licenses/>
*
*
* Authors:
* Vivek Jain <jvivek@novell.com>
*
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "junk-settings.h"
#include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <e-util/e-util.h>
#include <e-util/e-util-private.h>
#include <e-gw-connection.h>
#define ROOTNODE "vboxSettings"
#define d(x)
struct _JunkEntry {
EGwJunkEntry *entry;
gint flag;
};
typedef struct _JunkEntry JunkEntry;
static void junk_settings_class_init (JunkSettingsClass *class);
static void junk_settings_init (JunkSettings *js);
static void junk_settings_destroy (GtkObject *obj);
static void junk_settings_finalise (GObject *obj);
static void free_all(JunkSettings *js);
static void get_junk_list (JunkSettings *js);
static void disable_clicked (GtkRadioButton *button, JunkSettings *js);
static void enable_clicked (GtkRadioButton *button, JunkSettings *js);
static GtkVBoxClass *parent_class = NULL;
GType
junk_settings_get_type (void)
{
static GType type = 0;
if (!type) {
static const GTypeInfo info = {
sizeof (JunkSettingsClass),
NULL, NULL,
(GClassInitFunc) junk_settings_class_init,
NULL, NULL,
sizeof (JunkSettings),
0,
(GInstanceInitFunc) junk_settings_init
};
type = g_type_register_static (gtk_vbox_get_type (), "JunkSettings", &info, 0);
}
return type;
}
static void
junk_settings_class_init (JunkSettingsClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
parent_class = g_type_class_ref (gtk_vbox_get_type ());
object_class->destroy = junk_settings_destroy;
gobject_class->finalize = junk_settings_finalise;
}
static void
junk_settings_finalise (GObject *obj)
{
JunkSettings *js = (JunkSettings *) obj;
g_object_unref (js->builder);
free_all(js);
G_OBJECT_CLASS (parent_class)->finalize (obj);
}
static void
junk_settings_destroy (GtkObject *obj)
{
JunkSettings *js = (JunkSettings *) obj;
free_all (js);
GTK_OBJECT_CLASS (parent_class)->destroy (obj);
}
static void
junk_settings_init (JunkSettings *js)
{
js->users = 0;
js->flag_for_ok = 0;
js->enabled = FALSE;
js->junk_list = NULL;
js->entry_list = NULL;
}
static void
free_entry_node(EGwJunkEntry *entry)
{
if (entry) {
g_free(entry->match);
entry->match = NULL;
}
return;
}
static void
free_node(JunkEntry *nentry)
{
EGwJunkEntry *junk_entry = nentry->entry;
if (junk_entry) {
g_free(junk_entry->match);
junk_entry->match = NULL;
}
return;
}
static JunkEntry *
find_node(GList *list, gchar *match)
{
JunkEntry *one_entry = NULL;
EGwJunkEntry *ent = NULL;
GList *tmp;
gint i;
if (list) {
tmp = g_list_first(list);
for (i=0; tmp; i++)
{
one_entry = tmp->data;
ent = one_entry->entry;
if (!g_ascii_strcasecmp(ent->match, match)) {
return one_entry;
/*if found, it returns that user*/
}
tmp= g_list_next(tmp);
}
}
return NULL;
}
static void
free_all (JunkSettings *js)
{
if (js->junk_list) {
g_list_foreach (js->junk_list,(GFunc) free_node, NULL);
g_list_free (js->junk_list);
js->junk_list = NULL;
}
}
static void
get_junk_list (JunkSettings *js)
{
GList *list = NULL;
gchar *entry;
gchar *msg;
gint use_junk, use_block, use_pab, persistence;
if (E_IS_GW_CONNECTION (js->cnc)) {
if (e_gw_connection_get_junk_settings (js->cnc, &use_junk, &use_block, &use_pab, &persistence) == E_GW_CONNECTION_STATUS_OK) {
if (use_junk) {
js->enabled = TRUE;
gtk_toggle_button_set_active((GtkToggleButton *) js->enable, TRUE);
enable_clicked(js->enable , js);
gtk_widget_set_sensitive (GTK_WIDGET (js->table), TRUE);
} else {
gtk_toggle_button_set_active ((GtkToggleButton *) js->disable, TRUE);
disable_clicked (js->disable , js);
}
}
/* get list of containers */
if (e_gw_connection_get_junk_entries (js->cnc, &(list)) == E_GW_CONNECTION_STATUS_OK) {
js->users = g_list_length (list);
if (js->users) {
/* I populate the list and set flags to 0 for the existing users*/
while (list) {
JunkEntry *junk_entry = g_new0 (JunkEntry , 1);
junk_entry->entry = list->data;
junk_entry->flag = 0;
entry = g_strdup ((junk_entry->entry)->match);
msg = g_strdup_printf ("%s", entry);
gtk_list_store_append (GTK_LIST_STORE (js->model), &(js->iter));
gtk_list_store_set (GTK_LIST_STORE (js->model), &(js->iter), 0, msg, -1);
js->junk_list = g_list_append (js->junk_list, junk_entry);
g_free (msg);
g_free (entry);
msg = NULL;
entry = NULL;
list = list->next;
}
}
}
else
g_warning("Could not get the JUNK List");
}
}
void
commit_changes (JunkSettings *js)
{
GList *new_list = NULL;
GList *remove_list = NULL;
GList *node = NULL;
JunkEntry *junk_entry = NULL;
EGwJunkEntry *entry;
gint use_junk, use_pab, use_block, persistence;
for (node = js->junk_list; node; node = node->next)
{
junk_entry = node->data;
if (junk_entry->flag & 0x1)
new_list = g_list_append (new_list, junk_entry->entry);
else if (junk_entry->flag & 0x4) {
remove_list = g_list_append (remove_list, junk_entry->entry);
}
}
if (E_IS_GW_CONNECTION (js->cnc)) {
if (js->flag_for_ok == 2 && js->enabled){ /* just turn off the bits*/
use_junk = use_pab = use_block = persistence = 0;
if (e_gw_connection_modify_junk_settings (js->cnc, use_junk, use_pab, use_block, persistence) == E_GW_CONNECTION_STATUS_OK) {
;
}
}
if (js->flag_for_ok == 0 && !js->enabled) {
use_block = use_pab =0;
use_junk = 1;
persistence = 14; /* We are setting the default persistence*/
if (e_gw_connection_modify_junk_settings (js->cnc, use_junk, use_pab, use_block, persistence) == E_GW_CONNECTION_STATUS_OK) {
;
}
}
while (new_list) {
entry = new_list->data;
if (e_gw_connection_create_junk_entry (js->cnc, entry->match, "email", "junk") == E_GW_CONNECTION_STATUS_OK) {
;
}
new_list = new_list->next;
}
while (remove_list) {
entry = remove_list->data;
if (e_gw_connection_remove_junk_entry (js->cnc, entry->id) == E_GW_CONNECTION_STATUS_OK) {
;
}
remove_list = remove_list->next;
}
}
if (new_list) {
g_list_foreach (new_list, (GFunc) free_entry_node, NULL);
g_list_free (new_list);
}
new_list = NULL;
if (remove_list) {
g_list_foreach (remove_list,(GFunc) free_entry_node, NULL);
g_list_free (remove_list);
}
remove_list = NULL;
}
static void
enable_clicked (GtkRadioButton *button, JunkSettings *js)
{
js->flag_for_ok = 0;
gtk_widget_set_sensitive (GTK_WIDGET (js->table) ,TRUE);
}
static void
disable_clicked (GtkRadioButton *button, JunkSettings *js)
{
js->flag_for_ok = 2;
gtk_widget_set_sensitive (GTK_WIDGET (js->table), FALSE);
}
static void
add_clicked(GtkButton *button, JunkSettings *js)
{
const gchar *email = NULL;
const gchar *self_email = NULL;
JunkEntry *new_entry = NULL;
EGwJunkEntry *junk_entry = NULL;
gchar *msg = NULL;
self_email = g_strdup (e_gw_connection_get_user_email (js->cnc));
email = gtk_entry_get_text (js->entry);
/* You can't mark junk sender yourself*/
if (g_strrstr (email, "@") == NULL || (!g_ascii_strcasecmp (email , self_email)) || !g_ascii_strcasecmp (email, "" ))
return;
else {
/*check whether already exists*/
if (js->junk_list && email) {
new_entry = find_node (js->junk_list, (gchar *)email);
if (new_entry)
return;
}
junk_entry = g_new0 (EGwJunkEntry, 1);
new_entry = g_new0 (JunkEntry, 1);
junk_entry->match = g_strdup(email);
/*XXX:populate more fields*/
new_entry->entry = junk_entry;
new_entry->flag = 1;
msg = g_strdup (email);
gtk_list_store_append (GTK_LIST_STORE (js->model), &(js->iter));
gtk_list_store_set (GTK_LIST_STORE (js->model), &(js->iter), 0, msg, -1);
g_free(msg);
js->junk_list = g_list_append (js->junk_list, new_entry);
js->flag_for_ok = 0;
}
gtk_entry_set_text (GTK_ENTRY(js->entry), "");
}
static void
remove_clicked(GtkButton *button, JunkSettings *js)
{
JunkEntry *entry = NULL;
gchar *email;
gtk_tree_model_get ((GtkTreeModel *) js->model, &(js->iter), 0, &email, -1);
entry = find_node (js->junk_list, email);
if (entry->flag & 0x1) {
js->junk_list = g_list_remove (js->junk_list, entry);
free_node(entry);
} else {
entry->flag = 0;
entry->flag |= 0x4;
}
g_free (email);
gtk_list_store_remove (GTK_LIST_STORE (js->model), &(js->iter));
}
static void
user_selected(GtkTreeSelection *selection, JunkSettings *js)
{
GtkTreeModel *model;
gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
if (gtk_tree_selection_get_selected (selection, &model, &(js->iter))) {
gtk_widget_set_sensitive (GTK_WIDGET (js->remove), TRUE);
}
}
static void
junk_settings_construct (JunkSettings *js)
{
js->builder = gtk_builder_new ();
e_load_ui_builder_definition (js->builder, "junk-settings.ui");
js->vbox = GTK_VBOX (e_builder_get_widget(js->builder, "vboxSettings"));
js->table = GTK_VBOX (e_builder_get_widget (js->builder, "vbox194"));
gtk_widget_set_sensitive (GTK_WIDGET (js->table), FALSE);
js->enable = GTK_RADIO_BUTTON (e_builder_get_widget (js->builder, "radEnable"));
g_signal_connect ((gpointer) js->enable, "clicked", G_CALLBACK (enable_clicked), js);
js->disable = GTK_RADIO_BUTTON (e_builder_get_widget (js->builder, "radDisable"));
g_signal_connect ((gpointer) js->disable, "clicked", G_CALLBACK (disable_clicked), js);
js->add_button = GTK_BUTTON (e_builder_get_widget(js->builder, "Add"));
g_signal_connect((GtkWidget *) js->add_button, "clicked", G_CALLBACK (add_clicked), js);
js->remove = GTK_BUTTON(e_builder_get_widget(js->builder, "Remove"));
g_signal_connect ((GtkWidget *) js->remove, "clicked", G_CALLBACK (remove_clicked), js);
gtk_widget_set_sensitive(GTK_WIDGET (js->remove), FALSE);
js->entry = GTK_ENTRY (e_builder_get_widget (js->builder, "entry4"));
/*TODO:connect entry and label*/
gtk_widget_show ((GtkWidget *) js->entry);
js->scrolled_window = GTK_WIDGET (e_builder_get_widget (js->builder,"scrolledwindow4"));
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (js->scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
js->model = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN);
js->entry_list = (GtkTreeView *)gtk_tree_view_new ();
/*gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (js->scrolled_window), (GtkWidget *)js->entry_list);*/
gtk_container_add (GTK_CONTAINER (js->scrolled_window), (GtkWidget *)js->entry_list);
gtk_tree_view_set_model (GTK_TREE_VIEW (js->entry_list), GTK_TREE_MODEL (js->model));
gtk_widget_show (GTK_WIDGET (js->entry_list));
js->cell = gtk_cell_renderer_text_new ();
js->column = gtk_tree_view_column_new_with_attributes (_("Email"), js->cell, "text", 0, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (js->entry_list),
GTK_TREE_VIEW_COLUMN (js->column));
g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW (js->entry_list)), "changed", G_CALLBACK (user_selected), js);
}
JunkSettings *
junk_settings_new (EGwConnection *ccnc)
{
JunkSettings *new;
new = (JunkSettings *) g_object_new (junk_settings_get_type (), NULL);
junk_settings_construct (new);
new->cnc = ccnc;
if (new->cnc)
get_junk_list(new);
return (JunkSettings *) new;
}