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"
29 #include <structmember.h>
35 FolderItem *folderitem;
36 } clawsmail_FolderObject;
39 static void Folder_dealloc(clawsmail_FolderObject* self)
41 Py_XDECREF(self->properties);
42 self->ob_type->tp_free((PyObject*)self);
45 static int Folder_init(clawsmail_FolderObject *self, PyObject *args, PyObject *kwds)
47 const char *ss = NULL;
48 FolderItem *folderitem = NULL;
51 /* optional constructor argument: folderitem id string */
52 if(!PyArg_ParseTuple(args, "|sb", &ss, &create))
57 folderitem = folder_find_item_from_identifier(ss);
59 PyErr_SetString(PyExc_ValueError, "A folder with that path does not exist, and the create parameter was False.");
64 folderitem = folder_get_item_from_identifier(ss);
66 PyErr_SetString(PyExc_IOError, "A folder with that path does not exist, and could not be created.");
72 self->folderitem = folderitem;
74 self->properties = clawsmail_folderproperties_new(folderitem->prefs);
77 self->properties = Py_None;
83 static PyObject* Folder_str(clawsmail_FolderObject *self)
85 return PyString_FromFormat("Folder: %s", self->folderitem->name);
88 static PyObject* Folder_get_identifier(clawsmail_FolderObject *self, PyObject *args)
94 id = folder_item_get_identifier(self->folderitem);
95 obj = Py_BuildValue("s", id);
100 static PyObject* Folder_get_messages(clawsmail_FolderObject *self, PyObject *args)
102 GSList *msglist, *walk;
106 if(!self->folderitem)
109 msglist = folder_item_get_msg_list(self->folderitem);
110 retval = PyTuple_New(g_slist_length(msglist));
112 procmsg_msg_list_free(msglist);
117 for(pos = 0, walk = msglist; walk; walk = walk->next, ++pos) {
119 msg = clawsmail_messageinfo_new(walk->data);
120 PyTuple_SET_ITEM(retval, pos, msg);
122 procmsg_msg_list_free(msglist);
127 static PyObject* get_name(clawsmail_FolderObject *self, void *closure)
129 if(self->folderitem && self->folderitem->name)
130 return PyString_FromString(self->folderitem->name);
134 static PyObject* get_path(clawsmail_FolderObject *self, void *closure)
136 if(self->folderitem && self->folderitem->path)
137 return PyString_FromString(self->folderitem->path);
141 static PyObject* get_mailbox_name(clawsmail_FolderObject *self, void *closure)
143 if(self->folderitem && self->folderitem->folder && self->folderitem->folder->name)
144 return PyString_FromString(self->folderitem->folder->name);
148 static PyObject* get_identifier(clawsmail_FolderObject *self, void *closure)
150 if(self->folderitem) {
152 id = folder_item_get_identifier(self->folderitem);
155 retval = PyString_FromString(id);
164 static PyObject* get_properties(clawsmail_FolderObject *self, void *closure)
166 Py_INCREF(self->properties);
167 return self->properties;
170 static PyMethodDef Folder_methods[] = {
171 {"get_identifier", (PyCFunction)Folder_get_identifier, METH_NOARGS,
172 "get_identifier() - get identifier\n"
174 "Get identifier for folder as a string (e.g. #mh/foo/bar)."},
175 {"get_messages", (PyCFunction)Folder_get_messages, METH_NOARGS,
176 "get_messages() - get a tuple of messages in folder\n"
178 "Get a tuple of MessageInfos for the folder."},
182 static PyGetSetDef Folder_getset[] = {
183 {"name", (getter)get_name, (setter)NULL,
184 "name - name of folder", NULL},
186 {"path", (getter)get_path, (setter)NULL,
187 "path - path of folder", NULL},
189 {"identifier", (getter)get_identifier, (setter)NULL,
190 "identifier - identifier of folder", NULL},
192 {"mailbox_name", (getter)get_mailbox_name, (setter)NULL,
193 "mailbox_name - name of the corresponding mailbox", NULL},
195 {"properties", (getter)get_properties, (setter)NULL,
196 "properties - folder properties object", NULL},
202 static PyTypeObject clawsmail_FolderType = {
203 PyObject_HEAD_INIT(NULL)
205 "clawsmail.Folder", /* tp_name*/
206 sizeof(clawsmail_FolderObject), /* tp_basicsize*/
208 (destructor)Folder_dealloc, /* tp_dealloc*/
215 0, /* tp_as_sequence*/
216 0, /* tp_as_mapping*/
219 (reprfunc)Folder_str, /* tp_str*/
223 Py_TPFLAGS_DEFAULT, /* tp_flags*/
224 "Folder objects.\n\n" /* tp_doc */
225 "The __init__ function takes two optional arguments:\n"
226 "folder = Folder(identifier, [create_if_not_existing=False])\n"
227 "The identifier is an id string (e.g. '#mh/Mail/foo/bar'),"
228 "create_if_not_existing is a boolean expression.",
231 0, /* tp_richcompare */
232 0, /* tp_weaklistoffset */
235 Folder_methods, /* tp_methods */
237 Folder_getset, /* tp_getset */
240 0, /* tp_descr_get */
241 0, /* tp_descr_set */
242 0, /* tp_dictoffset */
243 (initproc)Folder_init, /* tp_init */
248 gboolean cmpy_add_folder(PyObject *module)
250 clawsmail_FolderType.tp_new = PyType_GenericNew;
251 if(PyType_Ready(&clawsmail_FolderType) < 0)
254 Py_INCREF(&clawsmail_FolderType);
255 return (PyModule_AddObject(module, "Folder", (PyObject*)&clawsmail_FolderType) == 0);
258 PyObject* clawsmail_folder_new(FolderItem *folderitem)
260 clawsmail_FolderObject *ff;
267 id = folder_item_get_identifier(folderitem);
269 arglist = Py_BuildValue("(s)", id);
271 ff = (clawsmail_FolderObject*) PyObject_CallObject((PyObject*) &clawsmail_FolderType, arglist);
273 return (PyObject*)ff;
278 FolderItem* clawsmail_folder_get_item(PyObject *self)
280 return ((clawsmail_FolderObject*)self)->folderitem;
283 PyTypeObject* clawsmail_folder_get_type_object()
285 return &clawsmail_FolderType;
288 gboolean clawsmail_folder_check(PyObject *self)
290 return (PyObject_TypeCheck(self, &clawsmail_FolderType) != 0);