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-defs.h>
31 #include <modest-email-clipboard.h>
32 #include <modest-tny-folder.h>
34 /* 'private'/'protected' functions */
35 static void modest_email_clipboard_class_init (ModestEmailClipboardClass * klass);
36 static void modest_email_clipboard_init (ModestEmailClipboard * obj);
37 static void modest_email_clipboard_finalize (GObject * obj);
40 static GObjectClass *parent_class = NULL;
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;
60 if (G_UNLIKELY (!my_type)) {
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)
103 if (obj->priv == NULL)
104 obj->priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (obj);
106 obj->priv->src = NULL;
107 obj->priv->selection = NULL;
108 obj->priv->hidding = NULL;
109 obj->priv->delete = FALSE;
113 modest_email_clipboard_finalize (GObject * obj)
115 /* Clear objects stored on clipboard */
116 modest_email_clipboard_clear (MODEST_EMAIL_CLIPBOARD(obj));
118 G_OBJECT_CLASS(parent_class)->finalize (obj);
122 ModestEmailClipboard *
123 modest_email_clipboard_new (void)
126 obj = G_OBJECT (g_object_new (MODEST_TYPE_EMAIL_CLIPBOARD, NULL));
128 return MODEST_EMAIL_CLIPBOARD (obj);
133 modest_email_clipboard_get_data (ModestEmailClipboard *self,
134 TnyFolder **src_folder,
138 ModestEmailClipboardPrivate *priv = NULL;;
144 g_return_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self));
145 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
146 g_return_if_fail (TNY_IS_FOLDER (priv->src));
148 /* if no data into clipboard, do nothing */
149 if (modest_email_clipboard_cleared (self)) return;
151 /* Get data stored on clipboard */
152 *src_folder = g_object_ref(priv->src);
154 *data = g_object_ref(priv->selection);
155 *delete = priv->delete;
157 /* Clear objects stored on clipboard */
158 modest_email_clipboard_clear (MODEST_EMAIL_CLIPBOARD(self));
162 modest_email_clipboard_set_data (ModestEmailClipboard *self,
163 TnyFolder *src_folder,
167 ModestEmailClipboardPrivate *priv = NULL;;
168 TnyIterator *iter = NULL;
173 g_return_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self));
174 g_return_if_fail (TNY_IS_FOLDER (src_folder));
175 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
177 /* if data into clipboard, clear them */
178 if (!modest_email_clipboard_cleared (self))
179 modest_email_clipboard_clear (self);
182 priv->src = g_object_ref (src_folder);
184 priv->selection = g_object_ref (data);
185 priv->delete = delete;
186 priv->hidding = NULL;
188 /* Fill hidding array (for cut operation) */
192 n_selected = tny_list_get_length (data);
193 priv->hidding = g_malloc0(sizeof(gchar *) * n_selected);
194 iter = tny_list_create_iterator (priv->selection);
196 while (!tny_iterator_is_done (iter)) {
197 obj = tny_iterator_get_current (iter);
198 if (obj && TNY_IS_HEADER (obj))
199 id = tny_header_dup_message_id (TNY_HEADER (obj));
201 priv->hidding[i++] = id;
202 tny_iterator_next (iter);
205 g_object_unref (obj);
207 g_object_unref (iter);
210 priv->hidding = g_malloc0(sizeof(gchar *));
211 id = g_strdup (tny_folder_get_id (src_folder));
212 priv->hidding[0] = id;
218 modest_email_clipboard_clear (ModestEmailClipboard *self)
220 ModestEmailClipboardPrivate *priv = NULL;
223 g_return_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self));
224 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
228 g_object_unref (priv->src);
229 if (priv->selection) {
230 n_selected = tny_list_get_length(priv->selection);
231 g_object_unref (priv->selection);
234 for (i=0; i < n_selected; i++)
235 g_free (priv->hidding[i]);
236 g_free(priv->hidding);
240 priv->selection = NULL;
241 priv->hidding = NULL;
242 priv->delete = FALSE;
246 modest_email_clipboard_cleared (ModestEmailClipboard *self)
248 gboolean cleared = FALSE;
250 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), TRUE);
252 cleared = ((self->priv->src == NULL) && (self->priv->selection == NULL));
258 modest_email_clipboard_check_source_folder (ModestEmailClipboard *self,
261 TnyFolderType folder_type1;
262 TnyFolderType folder_type2;
263 ModestEmailClipboardPrivate *priv = NULL;;
264 const gchar *id1 = NULL;
265 const gchar *id2 = NULL;
266 gboolean same_folder = FALSE;
268 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), TRUE);
269 g_return_val_if_fail (TNY_IS_FOLDER (folder), TRUE);
270 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
272 /* If cleared, return always FALSE*/
273 if (modest_email_clipboard_cleared (self)) return FALSE;
275 /* Check target and source folders */
276 id1 = tny_folder_get_id (priv->src);
277 id2 = tny_folder_get_id (TNY_FOLDER(folder));
278 folder_type1 = modest_tny_folder_guess_folder_type (priv->src);
279 folder_type2 = modest_tny_folder_guess_folder_type (folder);
281 if (folder_type1 == TNY_FOLDER_TYPE_INVALID || folder_type2 == TNY_FOLDER_TYPE_INVALID)
282 g_warning ("%s: BUG: folder of type TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
284 same_folder = ((folder_type1 == folder_type2) &&
285 (!g_ascii_strcasecmp (id1, id2)));
291 modest_email_clipboard_headers_copied (ModestEmailClipboard *self)
293 ModestEmailClipboardPrivate *priv = NULL;;
294 gboolean result = FALSE;
296 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), FALSE);
297 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
299 result = priv->selection != NULL;
305 modest_email_clipboard_folder_copied (ModestEmailClipboard *self)
307 ModestEmailClipboardPrivate *priv = NULL;;
308 gboolean result = FALSE;
310 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), FALSE);
311 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
313 result = ((priv->selection == NULL) && (priv->src != NULL));
319 modest_email_clipboard_get_folder_name (ModestEmailClipboard *self)
321 ModestEmailClipboardPrivate *priv = NULL;;
322 const gchar *folder_name = NULL;
324 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), NULL);
325 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
327 /* If cleared, return always FALSE*/
328 if (modest_email_clipboard_cleared (self)) return NULL;
330 /* Check target and source folders */
331 folder_name = tny_folder_get_name (priv->src);
337 modest_email_clipboard_get_hidding_ids (ModestEmailClipboard *self,
340 ModestEmailClipboardPrivate *priv = NULL;;
344 g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), NULL);
345 priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
347 if (priv->selection != NULL)
348 *n_selected = tny_list_get_length (priv->selection);
352 return (const gchar **) priv->hidding;