1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the Nokia Corporation nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #include <modest-email-clipboard.h>
32 /* 'private'/'protected' functions */
33 static void modest_email_clipboard_class_init (ModestEmailClipboardClass * klass);
34 static void modest_email_clipboard_init (ModestEmailClipboard * obj);
35 static void modest_email_clipboard_finalize (GObject * obj);
38 static GObjectClass *parent_class = NULL;
40 typedef struct _ModestEmailClipboardPrivate ModestEmailClipboardPrivate;
41 struct _ModestEmailClipboardPrivate {
49 #define MODEST_EMAIL_CLIPBOARD_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
50 MODEST_TYPE_EMAIL_CLIPBOARD, \
51 ModestEmailClipboardPrivate))
55 modest_email_clipboard_get_type (void)
57 static GType my_type = 0;
60 static const GTypeInfo my_info = {
61 sizeof (ModestEmailClipboardClass),
63 NULL, /* base finalize */
64 (GClassInitFunc) modest_email_clipboard_class_init,
65 NULL, /* class finalize */
66 NULL, /* class data */
67 sizeof (ModestEmailClipboard),
69 (GInstanceInitFunc) modest_email_clipboard_init,
73 my_type = g_type_register_static (G_TYPE_OBJECT,
74 "ModestEmailClipboard",
83 modest_email_clipboard_class_init (ModestEmailClipboardClass * klass)
85 GObjectClass *gobject_class;
86 gobject_class = (GObjectClass *) klass;
88 parent_class = g_type_class_peek_parent (klass);
89 gobject_class->finalize = modest_email_clipboard_finalize;
91 g_type_class_add_private (gobject_class,
92 sizeof (ModestEmailClipboardPrivate));
94 /* signal definitions */
99 modest_email_clipboard_init (ModestEmailClipboard * obj)
101 ModestEmailClipboardPrivate *priv =
102 MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (obj);
105 priv->selection = NULL;
106 priv->hidding = NULL;
107 priv->delete = FALSE;
111 modest_email_clipboard_finalize (GObject * obj)
113 /* Clear objects stored on clipboard */
114 modest_email_clipboard_clear (MODEST_EMAIL_CLIPBOARD(obj));
116 G_OBJECT_CLASS(parent_class)->finalize (obj);
120 ModestEmailClipboard *
121 modest_email_clipboard_new ()
124 ModestEmailClipboardPrivate *priv;
126 obj = G_OBJECT (g_object_new (MODEST_TYPE_EMAIL_CLIPBOARD, NULL));
127 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (obj);
129 return MODEST_EMAIL_CLIPBOARD (obj);
134 modest_email_clipboard_get_data (ModestEmailClipboard *self,
135 TnyFolder **src_folder,
139 ModestEmailClipboardPrivate *priv = NULL;;
145 g_return_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self));
146 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
147 g_return_if_fail (TNY_IS_FOLDER (priv->src));
149 /* if no data into clipboard, do nothing */
150 if (modest_email_clipboard_cleared (self)) return;
152 /* Get data stored on clipboard */
153 *src_folder = g_object_ref(priv->src);
155 *data = g_object_ref(priv->selection);
156 *delete = priv->delete;
158 /* Clear objects stored on clipboard */
159 modest_email_clipboard_clear (MODEST_EMAIL_CLIPBOARD(self));
163 modest_email_clipboard_set_data (ModestEmailClipboard *self,
164 TnyFolder *src_folder,
168 ModestEmailClipboardPrivate *priv = NULL;;
169 TnyIterator *iter = NULL;
174 g_return_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self));
175 g_return_if_fail (TNY_IS_FOLDER (src_folder));
176 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
178 /* if data into clipboard, clear them */
179 if (!modest_email_clipboard_cleared (self))
180 modest_email_clipboard_clear (self);
183 priv->src = g_object_ref (src_folder);
185 priv->selection = g_object_ref (data);
186 priv->delete = delete;
187 priv->hidding = NULL;
189 /* Fill hidding array (for cut operation) */
193 n_selected = tny_list_get_length (data);
194 priv->hidding = g_malloc0(sizeof(gchar *) * n_selected);
195 iter = tny_list_create_iterator (priv->selection);
197 while (!tny_iterator_is_done (iter)) {
198 obj = tny_iterator_get_current (iter);
199 if (obj && TNY_IS_HEADER (obj))
200 id = g_strdup(tny_header_get_message_id (TNY_HEADER (obj)));
202 priv->hidding[i++] = id;
203 tny_iterator_next (iter);
206 g_object_unref (obj);
208 g_object_unref (iter);
211 priv->hidding = g_malloc0(sizeof(gchar *));
212 id = g_strdup (tny_folder_get_id (src_folder));
213 priv->hidding[0] = id;
219 modest_email_clipboard_clear (ModestEmailClipboard *self)
221 ModestEmailClipboardPrivate *priv = NULL;
224 g_return_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self));
225 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
229 g_object_unref (priv->src);
230 if (priv->selection) {
231 n_selected = tny_list_get_length(priv->selection);
232 g_object_unref (priv->selection);
235 for (i=0; i < n_selected; i++)
236 g_free (priv->hidding[i]);
237 g_free(priv->hidding);
241 priv->selection = NULL;
242 priv->hidding = NULL;
243 priv->delete = FALSE;
247 modest_email_clipboard_cleared (ModestEmailClipboard *self)
249 ModestEmailClipboardPrivate *priv = NULL;;
250 gboolean cleared = FALSE;
252 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), TRUE);
253 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
255 cleared = ((priv->src == NULL) && (priv->selection == NULL));
261 modest_email_clipboard_check_source_folder (ModestEmailClipboard *self,
262 const TnyFolder *folder)
264 ModestEmailClipboardPrivate *priv = NULL;;
265 const gchar *id1 = NULL;
266 const gchar *id2 = NULL;
267 gboolean same_folder = FALSE;
269 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), TRUE);
270 g_return_val_if_fail (TNY_IS_FOLDER (folder), TRUE);
271 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
273 /* If cleared, return always FALSE*/
274 if (modest_email_clipboard_cleared (self)) return FALSE;
276 /* Check target and source folders */
277 id1 = tny_folder_get_id (priv->src);
278 id2 = tny_folder_get_id (TNY_FOLDER(folder));
279 same_folder = !g_ascii_strcasecmp (id1, id2);
285 modest_email_clipboard_get_hidding_ids (ModestEmailClipboard *self,
288 ModestEmailClipboardPrivate *priv = NULL;;
292 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), NULL);
293 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
295 if (priv->selection != NULL)
296 *n_selected = tny_list_get_length (priv->selection);
300 return (const gchar **) priv->hidding;