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>
31 #include <modest-tny-folder.h>
33 /* 'private'/'protected' functions */
34 static void modest_email_clipboard_class_init (ModestEmailClipboardClass * klass);
35 static void modest_email_clipboard_init (ModestEmailClipboard * obj);
36 static void modest_email_clipboard_finalize (GObject * obj);
39 static GObjectClass *parent_class = NULL;
41 typedef struct _ModestEmailClipboardPrivate ModestEmailClipboardPrivate;
42 struct _ModestEmailClipboardPrivate {
50 #define MODEST_EMAIL_CLIPBOARD_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
51 MODEST_TYPE_EMAIL_CLIPBOARD, \
52 ModestEmailClipboardPrivate))
56 modest_email_clipboard_get_type (void)
58 static GType my_type = 0;
61 static const GTypeInfo my_info = {
62 sizeof (ModestEmailClipboardClass),
64 NULL, /* base finalize */
65 (GClassInitFunc) modest_email_clipboard_class_init,
66 NULL, /* class finalize */
67 NULL, /* class data */
68 sizeof (ModestEmailClipboard),
70 (GInstanceInitFunc) modest_email_clipboard_init,
74 my_type = g_type_register_static (G_TYPE_OBJECT,
75 "ModestEmailClipboard",
84 modest_email_clipboard_class_init (ModestEmailClipboardClass * klass)
86 GObjectClass *gobject_class;
87 gobject_class = (GObjectClass *) klass;
89 parent_class = g_type_class_peek_parent (klass);
90 gobject_class->finalize = modest_email_clipboard_finalize;
92 g_type_class_add_private (gobject_class,
93 sizeof (ModestEmailClipboardPrivate));
95 /* signal definitions */
100 modest_email_clipboard_init (ModestEmailClipboard * obj)
102 ModestEmailClipboardPrivate *priv =
103 MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (obj);
106 priv->selection = NULL;
107 priv->hidding = NULL;
108 priv->delete = FALSE;
112 modest_email_clipboard_finalize (GObject * obj)
114 /* Clear objects stored on clipboard */
115 modest_email_clipboard_clear (MODEST_EMAIL_CLIPBOARD(obj));
117 G_OBJECT_CLASS(parent_class)->finalize (obj);
121 ModestEmailClipboard *
122 modest_email_clipboard_new ()
125 ModestEmailClipboardPrivate *priv;
127 obj = G_OBJECT (g_object_new (MODEST_TYPE_EMAIL_CLIPBOARD, NULL));
128 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (obj);
130 return MODEST_EMAIL_CLIPBOARD (obj);
135 modest_email_clipboard_get_data (ModestEmailClipboard *self,
136 TnyFolder **src_folder,
140 ModestEmailClipboardPrivate *priv = NULL;;
146 g_return_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self));
147 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
148 g_return_if_fail (TNY_IS_FOLDER (priv->src));
150 /* if no data into clipboard, do nothing */
151 if (modest_email_clipboard_cleared (self)) return;
153 /* Get data stored on clipboard */
154 *src_folder = g_object_ref(priv->src);
156 *data = g_object_ref(priv->selection);
157 *delete = priv->delete;
159 /* Clear objects stored on clipboard */
160 modest_email_clipboard_clear (MODEST_EMAIL_CLIPBOARD(self));
164 modest_email_clipboard_set_data (ModestEmailClipboard *self,
165 TnyFolder *src_folder,
169 ModestEmailClipboardPrivate *priv = NULL;;
170 TnyIterator *iter = NULL;
175 g_return_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self));
176 g_return_if_fail (TNY_IS_FOLDER (src_folder));
177 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
179 /* if data into clipboard, clear them */
180 if (!modest_email_clipboard_cleared (self))
181 modest_email_clipboard_clear (self);
184 priv->src = g_object_ref (src_folder);
186 priv->selection = g_object_ref (data);
187 priv->delete = delete;
188 priv->hidding = NULL;
190 /* Fill hidding array (for cut operation) */
194 n_selected = tny_list_get_length (data);
195 priv->hidding = g_malloc0(sizeof(gchar *) * n_selected);
196 iter = tny_list_create_iterator (priv->selection);
198 while (!tny_iterator_is_done (iter)) {
199 obj = tny_iterator_get_current (iter);
200 if (obj && TNY_IS_HEADER (obj))
201 id = g_strdup(tny_header_get_message_id (TNY_HEADER (obj)));
203 priv->hidding[i++] = id;
204 tny_iterator_next (iter);
207 g_object_unref (obj);
209 g_object_unref (iter);
212 priv->hidding = g_malloc0(sizeof(gchar *));
213 id = g_strdup (tny_folder_get_id (src_folder));
214 priv->hidding[0] = id;
220 modest_email_clipboard_clear (ModestEmailClipboard *self)
222 ModestEmailClipboardPrivate *priv = NULL;
225 g_return_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self));
226 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
230 g_object_unref (priv->src);
231 if (priv->selection) {
232 n_selected = tny_list_get_length(priv->selection);
233 g_object_unref (priv->selection);
236 for (i=0; i < n_selected; i++)
237 g_free (priv->hidding[i]);
238 g_free(priv->hidding);
242 priv->selection = NULL;
243 priv->hidding = NULL;
244 priv->delete = FALSE;
248 modest_email_clipboard_cleared (ModestEmailClipboard *self)
250 ModestEmailClipboardPrivate *priv = NULL;;
251 gboolean cleared = FALSE;
253 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), TRUE);
254 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
256 cleared = ((priv->src == NULL) && (priv->selection == NULL));
262 modest_email_clipboard_check_source_folder (ModestEmailClipboard *self,
263 const TnyFolder *folder)
265 TnyFolderType folder_type1;
266 TnyFolderType folder_type2;
267 ModestEmailClipboardPrivate *priv = NULL;;
268 const gchar *id1 = NULL;
269 const gchar *id2 = NULL;
270 gboolean same_folder = FALSE;
272 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), TRUE);
273 g_return_val_if_fail (TNY_IS_FOLDER (folder), TRUE);
274 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
276 /* If cleared, return always FALSE*/
277 if (modest_email_clipboard_cleared (self)) return FALSE;
279 /* Check target and source folders */
280 id1 = tny_folder_get_id (priv->src);
281 id2 = tny_folder_get_id (TNY_FOLDER(folder));
282 folder_type1 = modest_tny_folder_guess_folder_type (priv->src);
283 folder_type2 = modest_tny_folder_guess_folder_type (folder);
285 if (folder_type1 == TNY_FOLDER_TYPE_INVALID || folder_type2 == TNY_FOLDER_TYPE_INVALID)
286 g_warning ("%s: BUG: folder of type TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
288 same_folder = ((folder_type1 == folder_type2) &&
289 (!g_ascii_strcasecmp (id1, id2)));
295 modest_email_clipboard_headers_copied (ModestEmailClipboard *self)
297 ModestEmailClipboardPrivate *priv = NULL;;
298 gboolean result = FALSE;
300 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), FALSE);
301 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
303 result = priv->selection != NULL;
309 modest_email_clipboard_folder_copied (ModestEmailClipboard *self)
311 ModestEmailClipboardPrivate *priv = NULL;;
312 gboolean result = FALSE;
314 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), FALSE);
315 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
317 result = ((priv->selection == NULL) && (priv->src != NULL));
323 modest_email_clipboard_get_folder_name (ModestEmailClipboard *self)
325 ModestEmailClipboardPrivate *priv = NULL;;
326 const gchar *folder_name = NULL;
328 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), NULL);
329 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
331 /* If cleared, return always FALSE*/
332 if (modest_email_clipboard_cleared (self)) return NULL;
334 /* Check target and source folders */
335 folder_name = tny_folder_get_name (priv->src);
341 modest_email_clipboard_get_hidding_ids (ModestEmailClipboard *self,
344 ModestEmailClipboardPrivate *priv = NULL;;
348 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), NULL);
349 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
351 if (priv->selection != NULL)
352 *n_selected = tny_list_get_length (priv->selection);
356 return (const gchar **) priv->hidding;