1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Authors: Jon Trowbridge <trow@ximian.com>
4 * Jeffrey Stedfast <fejj@ximian.com>
6 * Copyright 2001-2002 Ximian, Inc.(www.ximian.com)
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option)any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
31 #include "em-filter-source-element.h"
34 #include <libedataserver/e-sexp.h>
35 #include <libedataserver/e-account-list.h>
36 #include <camel/camel-url.h>
39 static void em_filter_source_element_class_init(EMFilterSourceElementClass
*klass
);
40 static void em_filter_source_element_init(EMFilterSourceElement
*fs
);
41 static void em_filter_source_element_finalize(GObject
*obj
);
43 static int source_eq(FilterElement
*fe
, FilterElement
*cm
);
44 static void xml_create(FilterElement
*fe
, xmlNodePtr node
);
45 static xmlNodePtr
xml_encode(FilterElement
*fe
);
46 static int xml_decode(FilterElement
*fe
, xmlNodePtr node
);
47 static FilterElement
*clone(FilterElement
*fe
);
48 static GtkWidget
*get_widget(FilterElement
*fe
);
49 static void build_code(FilterElement
*fe
, GString
*out
, struct _FilterPart
*ff
);
50 static void format_sexp(FilterElement
*, GString
*);
52 static void em_filter_source_element_add_source (EMFilterSourceElement
*fs
, const char *account_name
, const char *name
,
53 const char *addr
, const char *url
);
54 static void em_filter_source_element_get_sources(EMFilterSourceElement
*fs
);
56 typedef struct _SourceInfo
{
63 struct _EMFilterSourceElementPrivate
{
69 static FilterElementClass
*parent_class
= NULL
;
73 em_filter_source_element_get_type(void)
75 static GType type
= 0;
78 static const GTypeInfo info
= {
79 sizeof(EMFilterSourceElementClass
),
80 NULL
, /* base_class_init */
81 NULL
, /* base_class_finalize */
82 (GClassInitFunc
)em_filter_source_element_class_init
,
83 NULL
, /* class_finalize */
84 NULL
, /* class_data */
85 sizeof(EMFilterSourceElement
),
87 (GInstanceInitFunc
)em_filter_source_element_init
,
90 type
= g_type_register_static(FILTER_TYPE_ELEMENT
, "EMFilterSourceElement", &info
, 0);
97 em_filter_source_element_class_init(EMFilterSourceElementClass
*klass
)
99 GObjectClass
*object_class
= G_OBJECT_CLASS(klass
);
100 FilterElementClass
*fe_class
= FILTER_ELEMENT_CLASS(klass
);
102 parent_class
= g_type_class_ref(FILTER_TYPE_ELEMENT
);
104 object_class
->finalize
= em_filter_source_element_finalize
;
106 /* override methods */
107 fe_class
->eq
= source_eq
;
108 fe_class
->xml_create
= xml_create
;
109 fe_class
->xml_encode
= xml_encode
;
110 fe_class
->xml_decode
= xml_decode
;
111 fe_class
->clone
= clone
;
112 fe_class
->get_widget
= get_widget
;
113 fe_class
->build_code
= build_code
;
114 fe_class
->format_sexp
= format_sexp
;
118 em_filter_source_element_init(EMFilterSourceElement
*fs
)
120 fs
->priv
= g_new(struct _EMFilterSourceElementPrivate
, 1);
121 fs
->priv
->sources
= NULL
;
122 fs
->priv
->current_url
= NULL
;
126 em_filter_source_element_finalize(GObject
*obj
)
128 EMFilterSourceElement
*fs
= (EMFilterSourceElement
*)obj
;
129 GList
*i
= fs
->priv
->sources
;
132 SourceInfo
*info
= i
->data
;
133 g_free(info
->account_name
);
135 g_free(info
->address
);
141 g_list_free(fs
->priv
->sources
);
142 g_free(fs
->priv
->current_url
);
146 G_OBJECT_CLASS(parent_class
)->finalize(obj
);
149 EMFilterSourceElement
*
150 em_filter_source_element_new(void)
152 return (EMFilterSourceElement
*)g_object_new(em_filter_source_element_get_type(), NULL
, NULL
);
156 source_eq(FilterElement
*fe
, FilterElement
*cm
)
158 EMFilterSourceElement
*fs
= (EMFilterSourceElement
*)fe
, *cs
= (EMFilterSourceElement
*)cm
;
160 return FILTER_ELEMENT_CLASS(parent_class
)->eq(fe
, cm
)
161 &&((fs
->priv
->current_url
&& cs
->priv
->current_url
162 && strcmp(fs
->priv
->current_url
, cs
->priv
->current_url
)== 0)
163 ||(fs
->priv
->current_url
== NULL
&& cs
->priv
->current_url
== NULL
));
167 xml_create(FilterElement
*fe
, xmlNodePtr node
)
169 /* Call parent implementation */
170 FILTER_ELEMENT_CLASS(parent_class
)->xml_create(fe
, node
);
174 xml_encode(FilterElement
*fe
)
178 EMFilterSourceElement
*fs
= (EMFilterSourceElement
*)fe
;
180 value
= xmlNewNode(NULL
, "value");
181 xmlSetProp(value
, "name", fe
->name
);
182 xmlSetProp(value
, "type", "uri");
184 if (fs
->priv
->current_url
)
185 xmlNewTextChild(value
, NULL
, "uri", fs
->priv
->current_url
);
191 xml_decode(FilterElement
*fe
, xmlNodePtr node
)
193 EMFilterSourceElement
*fs
= (EMFilterSourceElement
*)fe
;
197 node
= node
->children
;
198 while (node
!= NULL
) {
199 if (!strcmp(node
->name
, "uri")) {
200 uri
= xmlNodeGetContent(node
);
201 url
= camel_url_new(uri
, NULL
);
204 g_free(fs
->priv
->current_url
);
205 fs
->priv
->current_url
= camel_url_to_string(url
, CAMEL_URL_HIDE_ALL
);
216 static FilterElement
*
217 clone(FilterElement
*fe
)
219 EMFilterSourceElement
*fs
= (EMFilterSourceElement
*)fe
;
220 EMFilterSourceElement
*cpy
= em_filter_source_element_new();
223 ((FilterElement
*)cpy
)->name
= xmlStrdup(fe
->name
);
225 cpy
->priv
->current_url
= g_strdup(fs
->priv
->current_url
);
227 for (i
= fs
->priv
->sources
; i
!= NULL
; i
= g_list_next(i
)) {
228 SourceInfo
*info
= (SourceInfo
*)i
->data
;
229 em_filter_source_element_add_source(cpy
, info
->account_name
, info
->name
, info
->address
, info
->url
);
232 return (FilterElement
*)cpy
;
236 source_changed(GtkWidget
*item
, EMFilterSourceElement
*fs
)
238 SourceInfo
*info
= (SourceInfo
*)g_object_get_data((GObject
*)item
, "source");
240 g_free(fs
->priv
->current_url
);
241 fs
->priv
->current_url
= g_strdup(info
->url
);
245 get_widget(FilterElement
*fe
)
247 EMFilterSourceElement
*fs
= (EMFilterSourceElement
*)fe
;
252 SourceInfo
*first
= NULL
;
253 int index
, current_index
;
255 if (fs
->priv
->sources
== NULL
)
256 em_filter_source_element_get_sources(fs
);
258 menu
= gtk_menu_new();
263 for (i
= fs
->priv
->sources
; i
!= NULL
; i
= g_list_next(i
)) {
264 SourceInfo
*info
= (SourceInfo
*)i
->data
;
267 if (info
->url
!= NULL
) {
271 if (info
->account_name
&& strcmp(info
->account_name
, info
->address
))
272 label
= g_strdup_printf("%s <%s>(%s)", info
->name
,
273 info
->address
, info
->account_name
);
275 label
= g_strdup_printf("%s <%s>", info
->name
, info
->address
);
277 item
= gtk_menu_item_new_with_label(label
);
280 g_object_set_data((GObject
*)item
, "source", info
);
281 g_signal_connect(item
, "activate", G_CALLBACK(source_changed
), fs
);
283 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), item
);
284 gtk_widget_show(item
);
286 if (fs
->priv
->current_url
&& !strcmp(info
->url
, fs
->priv
->current_url
))
287 current_index
= index
;
293 omenu
= gtk_option_menu_new();
294 gtk_option_menu_set_menu(GTK_OPTION_MENU(omenu
), menu
);
296 if (current_index
>= 0) {
297 gtk_option_menu_set_history(GTK_OPTION_MENU(omenu
), current_index
);
299 gtk_option_menu_set_history(GTK_OPTION_MENU(omenu
), 0);
300 g_free(fs
->priv
->current_url
);
303 fs
->priv
->current_url
= g_strdup(first
->url
);
305 fs
->priv
->current_url
= NULL
;
312 build_code(FilterElement
*fe
, GString
*out
, struct _FilterPart
*ff
)
314 /* We are doing nothing on purpose. */
318 format_sexp(FilterElement
*fe
, GString
*out
)
320 EMFilterSourceElement
*fs
= (EMFilterSourceElement
*)fe
;
322 e_sexp_encode_string(out
, fs
->priv
->current_url
);
327 em_filter_source_element_add_source(EMFilterSourceElement
*fs
, const char *account_name
, const char *name
,
328 const char *addr
, const char *url
)
332 g_return_if_fail(EM_IS_FILTER_SOURCE_ELEMENT(fs
));
334 info
= g_new0(SourceInfo
, 1);
335 info
->account_name
= g_strdup(account_name
);
336 info
->name
= g_strdup(name
);
337 info
->address
= g_strdup(addr
);
338 info
->url
= g_strdup(url
);
340 fs
->priv
->sources
= g_list_append(fs
->priv
->sources
, info
);
344 em_filter_source_element_get_sources(EMFilterSourceElement
*fs
)
346 EAccountList
*accounts
;
347 const EAccount
*account
;
353 /* should this get the global object from mail? */
354 gconf
= gconf_client_get_default();
355 accounts
= e_account_list_new(gconf
);
356 g_object_unref(gconf
);
358 for (it
= e_list_get_iterator((EList
*)accounts
);
359 e_iterator_is_valid(it
);
360 e_iterator_next(it
)) {
361 account
= (const EAccount
*)e_iterator_get(it
);
363 if (account
->source
== NULL
|| account
->source
->url
== NULL
|| account
->source
->url
[0] == 0)
366 url
= camel_url_new(account
->source
->url
, NULL
);
368 /* hide secret stuff */
369 uri
= camel_url_to_string(url
, CAMEL_URL_HIDE_ALL
);
371 em_filter_source_element_add_source(fs
, account
->name
, account
->id
->name
, account
->id
->address
, uri
);
376 g_object_unref(accounts
);