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 "foldertype.h"
24 #include "folderpropertiestype.h"
25 #include "messageinfotype.h"
26 #include "mailboxtype.h"
28 #include <glib/gi18n.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 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
;
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 PyUnicode_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 PyUnicode_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 PyUnicode_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
= PyUnicode_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
= PyUnicode_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 PyLong_FromLong(self
->folderitem
->total_msgs
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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 PyVarObject_HEAD_INIT(NULL
, 0)
328 "clawsmail.Folder", /* tp_name*/
329 sizeof(clawsmail_FolderObject
), /* tp_basicsize*/
331 (destructor
)Folder_dealloc
, /* tp_dealloc*/
338 0, /* tp_as_sequence*/
339 0, /* tp_as_mapping*/
342 (reprfunc
)Folder_str
, /* tp_str*/
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.",
354 0, /* tp_richcompare */
355 0, /* tp_weaklistoffset */
358 Folder_methods
, /* tp_methods */
360 Folder_getset
, /* tp_getset */
363 0, /* tp_descr_get */
364 0, /* tp_descr_set */
365 0, /* tp_dictoffset */
366 (initproc
)Folder_init
, /* tp_init */
374 0, /* tp_subclasses */
377 #if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 6) || \
378 (PY_MAJOR_VERSION == 3))
379 0, /* tp_version_tag */
381 #if (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 4)
386 gboolean
cmpy_add_folder(PyObject
*module
)
388 clawsmail_FolderType
.tp_new
= PyType_GenericNew
;
389 if(PyType_Ready(&clawsmail_FolderType
) < 0)
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
;
405 id
= folder_item_get_identifier(folderitem
);
407 arglist
= Py_BuildValue("(s)", id
);
409 ff
= (clawsmail_FolderObject
*) PyObject_CallObject((PyObject
*) &clawsmail_FolderType
, arglist
);
411 return (PyObject
*)ff
;
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);