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 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;
59 if (G_UNLIKELY (!my_type)) {
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)
102 if (obj->priv == NULL)
103 obj->priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (obj);
105 obj->priv->src = NULL;
106 obj->priv->selection = NULL;
107 obj->priv->hidding = NULL;
108 obj->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 (void)
125 obj = G_OBJECT (g_object_new (MODEST_TYPE_EMAIL_CLIPBOARD, NULL));
127 return MODEST_EMAIL_CLIPBOARD (obj);
132 modest_email_clipboard_get_data (ModestEmailClipboard *self,
133 TnyFolder **src_folder,
137 ModestEmailClipboardPrivate *priv = NULL;;
143 g_return_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self));
144 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
145 g_return_if_fail (TNY_IS_FOLDER (priv->src));
147 /* if no data into clipboard, do nothing */
148 if (modest_email_clipboard_cleared (self)) return;
150 /* Get data stored on clipboard */
151 *src_folder = g_object_ref(priv->src);
153 *data = g_object_ref(priv->selection);
154 *delete = priv->delete;
156 /* Clear objects stored on clipboard */
157 modest_email_clipboard_clear (MODEST_EMAIL_CLIPBOARD(self));
161 modest_email_clipboard_set_data (ModestEmailClipboard *self,
162 TnyFolder *src_folder,
166 ModestEmailClipboardPrivate *priv = NULL;;
167 TnyIterator *iter = NULL;
172 g_return_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self));
173 g_return_if_fail (TNY_IS_FOLDER (src_folder));
174 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
176 /* if data into clipboard, clear them */
177 if (!modest_email_clipboard_cleared (self))
178 modest_email_clipboard_clear (self);
181 priv->src = g_object_ref (src_folder);
183 priv->selection = g_object_ref (data);
184 priv->delete = delete;
185 priv->hidding = NULL;
187 /* Fill hidding array (for cut operation) */
191 n_selected = tny_list_get_length (data);
192 priv->hidding = g_malloc0(sizeof(gchar *) * n_selected);
193 iter = tny_list_create_iterator (priv->selection);
195 while (!tny_iterator_is_done (iter)) {
196 obj = tny_iterator_get_current (iter);
197 if (obj && TNY_IS_HEADER (obj))
198 id = tny_header_dup_message_id (TNY_HEADER (obj));
200 priv->hidding[i++] = id;
201 tny_iterator_next (iter);
204 g_object_unref (obj);
206 g_object_unref (iter);
209 priv->hidding = g_malloc0(sizeof(gchar *));
210 id = g_strdup (tny_folder_get_id (src_folder));
211 priv->hidding[0] = id;
217 modest_email_clipboard_clear (ModestEmailClipboard *self)
219 ModestEmailClipboardPrivate *priv = NULL;
222 g_return_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self));
223 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
227 g_object_unref (priv->src);
228 if (priv->selection) {
229 n_selected = tny_list_get_length(priv->selection);
230 g_object_unref (priv->selection);
233 for (i=0; i < n_selected; i++)
234 g_free (priv->hidding[i]);
235 g_free(priv->hidding);
239 priv->selection = NULL;
240 priv->hidding = NULL;
241 priv->delete = FALSE;
245 modest_email_clipboard_cleared (ModestEmailClipboard *self)
247 gboolean cleared = FALSE;
249 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), TRUE);
251 cleared = ((self->priv->src == NULL) && (self->priv->selection == NULL));
257 modest_email_clipboard_check_source_folder (ModestEmailClipboard *self,
260 TnyFolderType folder_type1;
261 TnyFolderType folder_type2;
262 ModestEmailClipboardPrivate *priv = NULL;;
263 const gchar *id1 = NULL;
264 const gchar *id2 = NULL;
265 gboolean same_folder = FALSE;
267 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), TRUE);
268 g_return_val_if_fail (TNY_IS_FOLDER (folder), TRUE);
269 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
271 /* If cleared, return always FALSE*/
272 if (modest_email_clipboard_cleared (self)) return FALSE;
274 /* Check target and source folders */
275 id1 = tny_folder_get_id (priv->src);
276 id2 = tny_folder_get_id (TNY_FOLDER(folder));
277 folder_type1 = modest_tny_folder_guess_folder_type (priv->src);
278 folder_type2 = modest_tny_folder_guess_folder_type (folder);
280 if (folder_type1 == TNY_FOLDER_TYPE_INVALID || folder_type2 == TNY_FOLDER_TYPE_INVALID)
281 g_warning ("%s: BUG: folder of type TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
283 same_folder = ((folder_type1 == folder_type2) &&
284 (!g_ascii_strcasecmp (id1, id2)));
290 modest_email_clipboard_headers_copied (ModestEmailClipboard *self)
292 ModestEmailClipboardPrivate *priv = NULL;;
293 gboolean result = FALSE;
295 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), FALSE);
296 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
298 result = priv->selection != NULL;
304 modest_email_clipboard_folder_copied (ModestEmailClipboard *self)
306 ModestEmailClipboardPrivate *priv = NULL;;
307 gboolean result = FALSE;
309 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), FALSE);
310 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
312 result = ((priv->selection == NULL) && (priv->src != NULL));
318 modest_email_clipboard_get_folder_name (ModestEmailClipboard *self)
320 ModestEmailClipboardPrivate *priv = NULL;;
321 const gchar *folder_name = NULL;
323 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), NULL);
324 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
326 /* If cleared, return always FALSE*/
327 if (modest_email_clipboard_cleared (self)) return NULL;
329 /* Check target and source folders */
330 folder_name = tny_folder_get_name (priv->src);
336 modest_email_clipboard_get_hidding_ids (ModestEmailClipboard *self,
339 ModestEmailClipboardPrivate *priv = NULL;;
343 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), NULL);
344 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
346 if (priv->selection != NULL)
347 *n_selected = tny_list_get_length (priv->selection);
351 return (const gchar **) priv->hidding;