improve readability of symbol list
[claws.git] / src / plugins / python / foldertype.c
blob44479ed265add15a14b073b5abed2788d888b4e1
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/>.
18 #ifdef HAVE_CONFIG_H
19 # include "config.h"
20 #include "claws-features.h"
21 #endif
23 #include "foldertype.h"
24 #include "folderpropertiestype.h"
25 #include "messageinfotype.h"
26 #include "mailboxtype.h"
28 #include <glib/gi18n.h>
30 #include <structmember.h>
33 typedef struct {
34 PyObject_HEAD
35 PyObject *properties;
36 FolderItem *folderitem;
37 } clawsmail_FolderObject;
40 static void Folder_dealloc(clawsmail_FolderObject* self)
42 Py_XDECREF(self->properties);
43 Py_TYPE(self)->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;
50 char create = 0;
52 /* optional constructor argument: folderitem id string */
53 if(!PyArg_ParseTuple(args, "|sb", &ss, &create))
54 return -1;
56 if(ss) {
57 if(create == 0) {
58 folderitem = folder_find_item_from_identifier(ss);
59 if(!folderitem) {
60 PyErr_SetString(PyExc_ValueError, "A folder with that path does not exist, and the create parameter was False.");
61 return -1;
64 else {
65 folderitem = folder_get_item_from_identifier(ss);
66 if(!folderitem) {
67 PyErr_SetString(PyExc_IOError, "A folder with that path does not exist, and could not be created.");
68 return -1;
73 self->folderitem = folderitem;
74 if(folderitem)
75 self->properties = clawsmail_folderproperties_new(folderitem->prefs);
76 else {
77 Py_INCREF(Py_None);
78 self->properties = Py_None;
81 return 0;
84 static PyObject* Folder_str(clawsmail_FolderObject *self)
86 return PyUnicode_FromFormat("Folder: %s", self->folderitem->name);
89 static PyObject* Folder_get_identifier(clawsmail_FolderObject *self, PyObject *args)
91 PyObject *obj;
92 gchar *id;
93 if(!self->folderitem)
94 return NULL;
95 id = folder_item_get_identifier(self->folderitem);
96 obj = Py_BuildValue("s", id);
97 g_free(id);
98 return obj;
101 static PyObject* Folder_get_messages(clawsmail_FolderObject *self, PyObject *args)
103 GSList *msglist, *walk;
104 PyObject *retval;
105 Py_ssize_t pos;
107 if(!self->folderitem)
108 return NULL;
110 msglist = folder_item_get_msg_list(self->folderitem);
111 retval = PyTuple_New(g_slist_length(msglist));
112 if(!retval) {
113 procmsg_msg_list_free(msglist);
114 Py_INCREF(Py_None);
115 return Py_None;
118 for(pos = 0, walk = msglist; walk; walk = walk->next, ++pos) {
119 PyObject *msg;
120 msg = clawsmail_messageinfo_new(walk->data);
121 PyTuple_SET_ITEM(retval, pos, msg);
123 procmsg_msg_list_free(msglist);
125 return retval;
128 static PyObject* get_name(clawsmail_FolderObject *self, void *closure)
130 if(self->folderitem && self->folderitem->name)
131 return PyUnicode_FromString(self->folderitem->name);
132 Py_RETURN_NONE;
135 static PyObject* get_mailbox_name(clawsmail_FolderObject *self, void *closure)
137 if(self->folderitem && self->folderitem->folder && self->folderitem->folder->name)
138 return PyUnicode_FromString(self->folderitem->folder->name);
139 Py_RETURN_NONE;
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);
146 Py_RETURN_NONE;
150 static PyObject* get_identifier(clawsmail_FolderObject *self, void *closure)
152 if(self->folderitem) {
153 gchar *id;
154 id = folder_item_get_identifier(self->folderitem);
155 if(id) {
156 PyObject *retval;
157 retval = PyUnicode_FromString(id);
158 g_free(id);
159 return retval;
162 Py_RETURN_NONE;
165 static PyObject* get_path(clawsmail_FolderObject *self, void *closure)
167 if(self->folderitem) {
168 gchar *path;
169 path = folder_item_get_path(self->folderitem);
170 if(path) {
171 PyObject *retval;
172 retval = PyUnicode_FromString(path);
173 g_free(path);
174 return retval;
177 Py_RETURN_NONE;
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 PyLong_FromLong(self->folderitem->total_msgs);
191 Py_RETURN_NONE;
194 static PyObject* get_num_new_messages(clawsmail_FolderObject *self, void *closure)
196 if(self && self->folderitem)
197 return PyLong_FromLong(self->folderitem->new_msgs);
198 Py_RETURN_NONE;
201 static PyObject* get_num_unread_messages(clawsmail_FolderObject *self, void *closure)
203 if(self && self->folderitem)
204 return PyLong_FromLong(self->folderitem->unread_msgs);
205 Py_RETURN_NONE;
208 static PyObject* get_num_marked_messages(clawsmail_FolderObject *self, void *closure)
210 if(self && self->folderitem)
211 return PyLong_FromLong(self->folderitem->marked_msgs);
212 Py_RETURN_NONE;
215 static PyObject* get_num_locked_messages(clawsmail_FolderObject *self, void *closure)
217 if(self && self->folderitem)
218 return PyLong_FromLong(self->folderitem->locked_msgs);
219 Py_RETURN_NONE;
222 static PyObject* get_num_unread_marked_messages(clawsmail_FolderObject *self, void *closure)
224 if(self && self->folderitem)
225 return PyLong_FromLong(self->folderitem->unreadmarked_msgs);
226 Py_RETURN_NONE;
229 static PyObject* get_num_ignored_messages(clawsmail_FolderObject *self, void *closure)
231 if(self && self->folderitem)
232 return PyLong_FromLong(self->folderitem->ignored_msgs);
233 Py_RETURN_NONE;
236 static PyObject* get_num_watched_messages(clawsmail_FolderObject *self, void *closure)
238 if(self && self->folderitem)
239 return PyLong_FromLong(self->folderitem->watched_msgs);
240 Py_RETURN_NONE;
243 static PyObject* get_num_replied_messages(clawsmail_FolderObject *self, void *closure)
245 if(self && self->folderitem)
246 return PyLong_FromLong(self->folderitem->replied_msgs);
247 Py_RETURN_NONE;
250 static PyObject* get_num_forwarded_messages(clawsmail_FolderObject *self, void *closure)
252 if(self && self->folderitem)
253 return PyLong_FromLong(self->folderitem->forwarded_msgs);
254 Py_RETURN_NONE;
257 static PyMethodDef Folder_methods[] = {
258 {"get_identifier", (PyCFunction)Folder_get_identifier, METH_NOARGS,
259 "get_identifier() - get identifier\n"
260 "\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"
266 "\n"
267 "Get a tuple of MessageInfos for the folder."},
269 {NULL}
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},
322 {NULL}
326 static PyTypeObject clawsmail_FolderType = {
327 PyVarObject_HEAD_INIT(NULL, 0)
328 "clawsmail.Folder", /* tp_name*/
329 sizeof(clawsmail_FolderObject), /* tp_basicsize*/
330 0, /* tp_itemsize*/
331 (destructor)Folder_dealloc, /* tp_dealloc*/
332 0, /* tp_print*/
333 0, /* tp_getattr*/
334 0, /* tp_setattr*/
335 0, /* tp_compare*/
336 0, /* tp_repr*/
337 0, /* tp_as_number*/
338 0, /* tp_as_sequence*/
339 0, /* tp_as_mapping*/
340 0, /* tp_hash */
341 0, /* tp_call*/
342 (reprfunc)Folder_str, /* tp_str*/
343 0, /* tp_getattro*/
344 0, /* tp_setattro*/
345 0, /* tp_as_buffer*/
346 Py_TPFLAGS_DEFAULT, /* tp_flags*/
347 "Folder objects.\n\n" /* tp_doc */
348 "The __init__ function takes two optional arguments:\n"
349 "folder = Folder(identifier, [create_if_not_existing=False])\n"
350 "The identifier is an id string (e.g. '#mh/Mail/foo/bar'),"
351 "create_if_not_existing is a boolean expression.",
352 0, /* tp_traverse */
353 0, /* tp_clear */
354 0, /* tp_richcompare */
355 0, /* tp_weaklistoffset */
356 0, /* tp_iter */
357 0, /* tp_iternext */
358 Folder_methods, /* tp_methods */
359 0, /* tp_members */
360 Folder_getset, /* tp_getset */
361 0, /* tp_base */
362 0, /* tp_dict */
363 0, /* tp_descr_get */
364 0, /* tp_descr_set */
365 0, /* tp_dictoffset */
366 (initproc)Folder_init, /* tp_init */
367 0, /* tp_alloc */
368 0, /* tp_new */
369 0, /* tp_free */
370 0, /* tp_is_gc */
371 0, /* tp_bases */
372 0, /* tp_mro */
373 0, /* tp_cache */
374 0, /* tp_subclasses */
375 0, /* tp_weaklist */
376 0, /* tp_del */
377 #if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 6) || \
378 (PY_MAJOR_VERSION == 3))
379 0, /* tp_version_tag */
380 #endif
381 #if (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 4)
382 0, /* tp_finalize */
383 #endif
386 gboolean cmpy_add_folder(PyObject *module)
388 clawsmail_FolderType.tp_new = PyType_GenericNew;
389 if(PyType_Ready(&clawsmail_FolderType) < 0)
390 return FALSE;
392 Py_INCREF(&clawsmail_FolderType);
393 return (PyModule_AddObject(module, "Folder", (PyObject*)&clawsmail_FolderType) == 0);
396 PyObject* clawsmail_folder_new(FolderItem *folderitem)
398 clawsmail_FolderObject *ff;
399 PyObject *arglist;
400 gchar *id;
402 if(!folderitem)
403 return NULL;
405 id = folder_item_get_identifier(folderitem);
406 if(id) {
407 arglist = Py_BuildValue("(s)", id);
408 g_free(id);
409 ff = (clawsmail_FolderObject*) PyObject_CallObject((PyObject*) &clawsmail_FolderType, arglist);
410 Py_DECREF(arglist);
411 return (PyObject*)ff;
413 Py_RETURN_NONE;
416 FolderItem* clawsmail_folder_get_item(PyObject *self)
418 return ((clawsmail_FolderObject*)self)->folderitem;
421 PyTypeObject* clawsmail_folder_get_type_object()
423 return &clawsmail_FolderType;
426 gboolean clawsmail_folder_check(PyObject *self)
428 return (PyObject_TypeCheck(self, &clawsmail_FolderType) != 0);