1 /* Python plugin for Claws-Mail
2 * Copyright (C) 2009 Holger Berndt
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "claws-features.h"
23 #include <glib/gi18n.h>
25 #include "foldertype.h"
26 #include "folderpropertiestype.h"
27 #include "messageinfotype.h"
28 #include "mailboxtype.h"
30 #include <structmember.h>
36 FolderItem *folderitem;
37 } clawsmail_FolderObject;
40 static void Folder_dealloc(clawsmail_FolderObject* self)
42 Py_XDECREF(self->properties);
43 self->ob_type->tp_free((PyObject*)self);
46 static int Folder_init(clawsmail_FolderObject *self, PyObject *args, PyObject *kwds)
48 const char *ss = NULL;
49 FolderItem *folderitem = NULL;
52 /* optional constructor argument: folderitem id string */
53 if(!PyArg_ParseTuple(args, "|sb", &ss, &create))
58 folderitem = folder_find_item_from_identifier(ss);
60 PyErr_SetString(PyExc_ValueError, "A folder with that path does not exist, and the create parameter was False.");
65 folderitem = folder_get_item_from_identifier(ss);
67 PyErr_SetString(PyExc_IOError, "A folder with that path does not exist, and could not be created.");
73 self->folderitem = folderitem;
75 self->properties = clawsmail_folderproperties_new(folderitem->prefs);
78 self->properties = Py_None;
84 static PyObject* Folder_str(clawsmail_FolderObject *self)
86 return PyString_FromFormat("Folder: %s", self->folderitem->name);
89 static PyObject* Folder_get_identifier(clawsmail_FolderObject *self, PyObject *args)
95 id = folder_item_get_identifier(self->folderitem);
96 obj = Py_BuildValue("s", id);
101 static PyObject* Folder_get_messages(clawsmail_FolderObject *self, PyObject *args)
103 GSList *msglist, *walk;
107 if(!self->folderitem)
110 msglist = folder_item_get_msg_list(self->folderitem);
111 retval = PyTuple_New(g_slist_length(msglist));
113 procmsg_msg_list_free(msglist);
118 for(pos = 0, walk = msglist; walk; walk = walk->next, ++pos) {
120 msg = clawsmail_messageinfo_new(walk->data);
121 PyTuple_SET_ITEM(retval, pos, msg);
123 procmsg_msg_list_free(msglist);
128 static PyObject* get_name(clawsmail_FolderObject *self, void *closure)
130 if(self->folderitem && self->folderitem->name)
131 return PyString_FromString(self->folderitem->name);
135 static PyObject* get_mailbox_name(clawsmail_FolderObject *self, void *closure)
137 if(self->folderitem && self->folderitem->folder && self->folderitem->folder->name)
138 return PyString_FromString(self->folderitem->folder->name);
142 static PyObject* get_mailbox(clawsmail_FolderObject *self, void *closure)
144 if(self->folderitem && self->folderitem->folder)
145 return clawsmail_mailbox_new(self->folderitem->folder);
150 static PyObject* get_identifier(clawsmail_FolderObject *self, void *closure)
152 if(self->folderitem) {
154 id = folder_item_get_identifier(self->folderitem);
157 retval = PyString_FromString(id);
165 static PyObject* get_path(clawsmail_FolderObject *self, void *closure)
167 if(self->folderitem) {
169 path = folder_item_get_path(self->folderitem);
172 retval = PyString_FromString(path);
181 static PyObject* get_properties(clawsmail_FolderObject *self, void *closure)
183 Py_INCREF(self->properties);
184 return self->properties;
187 static PyObject* get_num_messages(clawsmail_FolderObject *self, void *closure)
189 if(self && self->folderitem)
190 return PyInt_FromLong(self->folderitem->total_msgs);
194 static PyObject* get_num_new_messages(clawsmail_FolderObject *self, void *closure)
196 if(self && self->folderitem)
197 return PyInt_FromLong(self->folderitem->new_msgs);
201 static PyObject* get_num_unread_messages(clawsmail_FolderObject *self, void *closure)
203 if(self && self->folderitem)
204 return PyInt_FromLong(self->folderitem->unread_msgs);
208 static PyObject* get_num_marked_messages(clawsmail_FolderObject *self, void *closure)
210 if(self && self->folderitem)
211 return PyInt_FromLong(self->folderitem->marked_msgs);
215 static PyObject* get_num_locked_messages(clawsmail_FolderObject *self, void *closure)
217 if(self && self->folderitem)
218 return PyInt_FromLong(self->folderitem->locked_msgs);
222 static PyObject* get_num_unread_marked_messages(clawsmail_FolderObject *self, void *closure)
224 if(self && self->folderitem)
225 return PyInt_FromLong(self->folderitem->unreadmarked_msgs);
229 static PyObject* get_num_ignored_messages(clawsmail_FolderObject *self, void *closure)
231 if(self && self->folderitem)
232 return PyInt_FromLong(self->folderitem->ignored_msgs);
236 static PyObject* get_num_watched_messages(clawsmail_FolderObject *self, void *closure)
238 if(self && self->folderitem)
239 return PyInt_FromLong(self->folderitem->watched_msgs);
243 static PyObject* get_num_replied_messages(clawsmail_FolderObject *self, void *closure)
245 if(self && self->folderitem)
246 return PyInt_FromLong(self->folderitem->replied_msgs);
250 static PyObject* get_num_forwarded_messages(clawsmail_FolderObject *self, void *closure)
252 if(self && self->folderitem)
253 return PyInt_FromLong(self->folderitem->forwarded_msgs);
257 static PyMethodDef Folder_methods[] = {
258 {"get_identifier", (PyCFunction)Folder_get_identifier, METH_NOARGS,
259 "get_identifier() - get identifier\n"
261 "Get identifier for folder as a string (e.g. #mh/foo/bar).\n\n"
262 "DEPRECATED: Use identifier property instead."},
264 {"get_messages", (PyCFunction)Folder_get_messages, METH_NOARGS,
265 "get_messages() - get a tuple of messages in folder\n"
267 "Get a tuple of MessageInfos for the folder."},
272 static PyGetSetDef Folder_getset[] = {
273 {"name", (getter)get_name, (setter)NULL,
274 "name - name of folder", NULL},
276 {"path", (getter)get_path, (setter)NULL,
277 "path - path of folder", NULL},
279 {"identifier", (getter)get_identifier, (setter)NULL,
280 "identifier - identifier of folder", NULL},
282 {"mailbox", (getter)get_mailbox, (setter)NULL,
283 "mailbox - corresponding mailbox", NULL},
285 {"mailbox_name", (getter)get_mailbox_name, (setter)NULL,
286 "mailbox_name - name of the corresponding mailbox\n\n"
287 "DEPRECATED: Use folder.mailbox.name instead", NULL},
289 {"properties", (getter)get_properties, (setter)NULL,
290 "properties - folder properties object", NULL},
292 {"num_messages", (getter)get_num_messages, (setter)NULL,
293 "num_messages - total number of messages in folder", NULL},
295 {"num_new_messages", (getter)get_num_new_messages, (setter)NULL,
296 "num_new_messages - number of new messages in folder", NULL},
298 {"num_unread_messages", (getter)get_num_unread_messages, (setter)NULL,
299 "num_unread_messages - number of unread messages in folder", NULL},
301 {"num_marked_messages", (getter)get_num_marked_messages, (setter)NULL,
302 "num_marked_messages - number of marked messages in folder", NULL},
304 {"num_locked_messages", (getter)get_num_locked_messages, (setter)NULL,
305 "num_locked_messages - number of locked messages in folder", NULL},
307 {"num_unread_marked_messages", (getter)get_num_unread_marked_messages, (setter)NULL,
308 "num_unread_marked_messages - number of unread marked messages in folder", NULL},
310 {"num_ignored_messages", (getter)get_num_ignored_messages, (setter)NULL,
311 "num_ignored_messages - number of ignored messages in folder", NULL},
313 {"num_watched_messages", (getter)get_num_watched_messages, (setter)NULL,
314 "num_watched_messages - number of watched messages in folder", NULL},
316 {"num_replied_messages", (getter)get_num_replied_messages, (setter)NULL,
317 "num_replied_messages - number of replied messages in folder", NULL},
319 {"num_forwarded_messages", (getter)get_num_forwarded_messages, (setter)NULL,
320 "num_forwarded_messages - number of forwarded messages in folder", NULL},
326 static PyTypeObject clawsmail_FolderType = {
327 PyObject_HEAD_INIT(NULL)
329 "clawsmail.Folder", /* tp_name*/
330 sizeof(clawsmail_FolderObject), /* tp_basicsize*/
332 (destructor)Folder_dealloc, /* tp_dealloc*/
339 0, /* tp_as_sequence*/
340 0, /* tp_as_mapping*/
343 (reprfunc)Folder_str, /* tp_str*/
347 Py_TPFLAGS_DEFAULT, /* tp_flags*/
348 "Folder objects.\n\n" /* tp_doc */
349 "The __init__ function takes two optional arguments:\n"
350 "folder = Folder(identifier, [create_if_not_existing=False])\n"
351 "The identifier is an id string (e.g. '#mh/Mail/foo/bar'),"
352 "create_if_not_existing is a boolean expression.",
355 0, /* tp_richcompare */
356 0, /* tp_weaklistoffset */
359 Folder_methods, /* tp_methods */
361 Folder_getset, /* tp_getset */
364 0, /* tp_descr_get */
365 0, /* tp_descr_set */
366 0, /* tp_dictoffset */
367 (initproc)Folder_init, /* tp_init */
372 gboolean cmpy_add_folder(PyObject *module)
374 clawsmail_FolderType.tp_new = PyType_GenericNew;
375 if(PyType_Ready(&clawsmail_FolderType) < 0)
378 Py_INCREF(&clawsmail_FolderType);
379 return (PyModule_AddObject(module, "Folder", (PyObject*)&clawsmail_FolderType) == 0);
382 PyObject* clawsmail_folder_new(FolderItem *folderitem)
384 clawsmail_FolderObject *ff;
391 id = folder_item_get_identifier(folderitem);
393 arglist = Py_BuildValue("(s)", id);
395 ff = (clawsmail_FolderObject*) PyObject_CallObject((PyObject*) &clawsmail_FolderType, arglist);
397 return (PyObject*)ff;
402 FolderItem* clawsmail_folder_get_item(PyObject *self)
404 return ((clawsmail_FolderObject*)self)->folderitem;
407 PyTypeObject* clawsmail_folder_get_type_object()
409 return &clawsmail_FolderType;
412 gboolean clawsmail_folder_check(PyObject *self)
414 return (PyObject_TypeCheck(self, &clawsmail_FolderType) != 0);