1 /*
2  * This program is free software; you can redistribute it and/or modify it
3  * under the terms of the GNU Lesser General Public License as published by
4  * the Free Software Foundation.
5  *
6  * This program is distributed in the hope that it will be useful, but
7  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
8  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
9  * for more details.
10  *
11  * You should have received a copy of the GNU Lesser General Public License
12  * along with this program; if not, see <http://www.gnu.org/licenses/>.
13  *
14  *
15  * Authors:
16  *		Michael Zucchi <notzed@ximian.com>
17  *
18  * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
19  *
20  */
21 
22 #include "evolution-config.h"
23 
24 #include <string.h>
25 #include <stdlib.h>
26 
27 #include "em-event.h"
28 #include "composer/e-msg-composer.h"
29 
30 static EMEvent *em_event;
31 
G_DEFINE_TYPE(EMEvent,em_event,E_TYPE_EVENT)32 G_DEFINE_TYPE (EMEvent, em_event, E_TYPE_EVENT)
33 
34 static void
35 eme_target_free (EEvent *ep,
36                  EEventTarget *t)
37 {
38 	switch (t->type) {
39 	case EM_EVENT_TARGET_FOLDER: {
40 		EMEventTargetFolder *s = (EMEventTargetFolder *) t;
41 		if (s->store != NULL)
42 			g_object_unref (s->store);
43 		g_free (s->folder_name);
44 		g_free (s->display_name);
45 		g_free (s->full_display_name);
46 		g_free (s->msg_uid);
47 		g_free (s->msg_sender);
48 		g_free (s->msg_subject);
49 		break; }
50 	case EM_EVENT_TARGET_FOLDER_UNREAD: {
51 		EMEventTargetFolderUnread *s = (EMEventTargetFolderUnread *) t;
52 		g_clear_object (&s->store);
53 		g_free (s->folder_uri);
54 		break; }
55 	case EM_EVENT_TARGET_MESSAGE: {
56 		EMEventTargetMessage *s = (EMEventTargetMessage *) t;
57 
58 		if (s->folder)
59 			g_object_unref (s->folder);
60 		if (s->message)
61 			g_object_unref (s->message);
62 		g_free (s->uid);
63 		if (s->composer)
64 			g_object_unref (s->composer);
65 		break; }
66 	case EM_EVENT_TARGET_COMPOSER : {
67 		EMEventTargetComposer *s = (EMEventTargetComposer *) t;
68 
69 		if (s->composer)
70 			g_object_unref (s->composer);
71 		break; }
72 	}
73 
74 	/* Chain up to parent's target_free() method. */
75 	E_EVENT_CLASS (em_event_parent_class)->target_free (ep, t);
76 }
77 
78 static void
em_event_class_init(EMEventClass * class)79 em_event_class_init (EMEventClass *class)
80 {
81 	EEventClass *event_class;
82 
83 	event_class = E_EVENT_CLASS (class);
84 	event_class->target_free = eme_target_free;
85 }
86 
87 static void
em_event_init(EMEvent * event)88 em_event_init (EMEvent *event)
89 {
90 }
91 
92 /**
93  * em_event_peek:
94  * @void:
95  *
96  * Get the singular instance of the mail event handler.
97  *
98  * Return value:
99  **/
100 EMEvent *
em_event_peek(void)101 em_event_peek (void)
102 {
103 	if (em_event == NULL) {
104 		em_event = g_object_new (EM_TYPE_EVENT, NULL);
105 		e_event_construct (
106 			&em_event->popup,
107 			"org.gnome.evolution.mail.events");
108 	}
109 
110 	return em_event;
111 }
112 
113 EMEventTargetFolder *
em_event_target_new_folder(EMEvent * eme,CamelStore * store,const gchar * folder_name,guint new,const gchar * msg_uid,const gchar * msg_sender,const gchar * msg_subject)114 em_event_target_new_folder (EMEvent *eme,
115                             CamelStore *store,
116                             const gchar *folder_name,
117                             guint new,
118                             const gchar *msg_uid,
119                             const gchar *msg_sender,
120                             const gchar *msg_subject)
121 {
122 	EMEventTargetFolder *t;
123 	guint32 flags = new ? EM_EVENT_FOLDER_NEWMAIL : 0;
124 
125 	g_return_val_if_fail (CAMEL_IS_STORE (store), NULL);
126 	g_return_val_if_fail (folder_name != NULL, NULL);
127 
128 	t = e_event_target_new (
129 		&eme->popup, EM_EVENT_TARGET_FOLDER, sizeof (*t));
130 
131 	t->store = g_object_ref (store);
132 	t->folder_name = g_strdup (folder_name);
133 	t->target.mask = ~flags;
134 	t->new = new;
135 	t->msg_uid = g_strdup (msg_uid);
136 	t->msg_sender = g_strdup (msg_sender);
137 	t->msg_subject = g_strdup (msg_subject);
138 
139 	return t;
140 }
141 
142 EMEventTargetFolderUnread *
em_event_target_new_folder_unread(EMEvent * eme,CamelStore * store,const gchar * folder_uri,guint unread)143 em_event_target_new_folder_unread (EMEvent *eme,
144                                    CamelStore *store,
145                                    const gchar *folder_uri,
146                                    guint unread)
147 {
148 	EMEventTargetFolderUnread *t;
149 
150 	g_return_val_if_fail (CAMEL_IS_STORE (store), NULL);
151 	g_return_val_if_fail (folder_uri != NULL, NULL);
152 
153 	t = e_event_target_new (
154 		&eme->popup, EM_EVENT_TARGET_FOLDER_UNREAD, sizeof (*t));
155 
156 	t->store = g_object_ref (store);
157 	t->folder_uri = g_strdup (folder_uri);
158 	t->unread = unread;
159 
160 	return t;
161 }
162 
163 EMEventTargetComposer *
em_event_target_new_composer(EMEvent * eme,EMsgComposer * composer,guint32 flags)164 em_event_target_new_composer (EMEvent *eme,
165                               EMsgComposer *composer,
166                               guint32 flags)
167 {
168 	EMEventTargetComposer *t;
169 
170 	t = e_event_target_new (
171 		&eme->popup, EM_EVENT_TARGET_COMPOSER, sizeof (*t));
172 
173 	t->composer = g_object_ref (composer);
174 	t->target.mask = ~flags;
175 
176 	return t;
177 }
178 
179 EMEventTargetMessage *
em_event_target_new_message(EMEvent * eme,CamelFolder * folder,CamelMimeMessage * message,const gchar * uid,guint32 flags,EMsgComposer * composer)180 em_event_target_new_message (EMEvent *eme,
181                              CamelFolder *folder,
182                              CamelMimeMessage *message,
183                              const gchar *uid,
184                              guint32 flags,
185                              EMsgComposer *composer)
186 {
187 	EMEventTargetMessage *t;
188 
189 	t = e_event_target_new (
190 		&eme->popup, EM_EVENT_TARGET_MESSAGE, sizeof (*t));
191 
192 	t->uid = g_strdup (uid);
193 	t->folder = folder;
194 	if (folder)
195 		g_object_ref (folder);
196 	t->message = message;
197 	if (message)
198 		g_object_ref (message);
199 	t->target.mask = ~flags;
200 	if (composer)
201 		t->composer = g_object_ref (composer);
202 
203 	return t;
204 }
205 
206 EMEventTargetSendReceive *
em_event_target_new_send_receive(EMEvent * eme,GtkWidget * grid,gpointer data,gint row,guint32 flags)207 em_event_target_new_send_receive (EMEvent *eme,
208                                   GtkWidget *grid,
209                                   gpointer data,
210                                   gint row,
211                                   guint32 flags)
212 {
213 	EMEventTargetSendReceive *t;
214 
215 	t = e_event_target_new (
216 		&eme->popup, EM_EVENT_TARGET_SEND_RECEIVE, sizeof (*t));
217 
218 	t->grid = grid;
219 	t->data = data;
220 	t->row = row;
221 	t->target.mask = ~flags;
222 
223 	return t;
224 }
225 
226 EMEventTargetCustomIcon *
em_event_target_new_custom_icon(EMEvent * eme,GtkTreeStore * store,GtkTreeIter * iter,const gchar * folder_name,guint32 flags)227 em_event_target_new_custom_icon (EMEvent *eme,
228                                  GtkTreeStore *store,
229                                  GtkTreeIter *iter,
230                                  const gchar *folder_name,
231                                  guint32 flags)
232 {
233 	EMEventTargetCustomIcon *t;
234 
235 	t = e_event_target_new (
236 		&eme->popup, EM_EVENT_TARGET_CUSTOM_ICON, sizeof (*t));
237 
238 	t->store = store;
239 	t->iter = iter;
240 	t->folder_name = folder_name;
241 	t->target.mask = ~flags;
242 
243 	return t;
244 }
245