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_properties(clawsmail_FolderObject *self, void *closure)
150 Py_INCREF(self->properties);
151 return self->properties;
154 static PyMethodDef Folder_methods[] = {
155 {"get_identifier", (PyCFunction)Folder_get_identifier, METH_NOARGS,
156 "get_identifier() - get identifier\n"
158 "Get identifier for folder as a string (e.g. #mh/foo/bar)."},
159 {"get_messages", (PyCFunction)Folder_get_messages, METH_NOARGS,
160 "get_messages() - get a tuple of messages in folder\n"
162 "Get a tuple of MessageInfos for the folder."},
166 static PyGetSetDef Folder_getset[] = {
167 {"name", (getter)get_name, (setter)NULL,
168 "name - name of folder", NULL},
170 {"path", (getter)get_path, (setter)NULL,
171 "path - path of folder", NULL},
173 {"mailbox_name", (getter)get_mailbox_name, (setter)NULL,
174 "mailbox_name - name of the corresponding mailbox", NULL},
176 {"properties", (getter)get_properties, (setter)NULL,
177 "properties - folder properties object", NULL},
183 static PyTypeObject clawsmail_FolderType = {
184 PyObject_HEAD_INIT(NULL)
186 "clawsmail.Folder", /* tp_name*/
187 sizeof(clawsmail_FolderObject), /* tp_basicsize*/
189 (destructor)Folder_dealloc, /* tp_dealloc*/
196 0, /* tp_as_sequence*/
197 0, /* tp_as_mapping*/
200 (reprfunc)Folder_str, /* tp_str*/
204 Py_TPFLAGS_DEFAULT, /* tp_flags*/
205 "Folder objects.\n\n" /* tp_doc */
206 "The __init__ function takes two optional arguments:\n"
207 "folder = Folder(identifier, [create_if_not_existing=False])\n"
208 "The identifier is an id string (e.g. '#mh/Mail/foo/bar'),"
209 "create_if_not_existing is a boolean expression.",
212 0, /* tp_richcompare */
213 0, /* tp_weaklistoffset */
216 Folder_methods, /* tp_methods */
218 Folder_getset, /* tp_getset */
221 0, /* tp_descr_get */
222 0, /* tp_descr_set */
223 0, /* tp_dictoffset */
224 (initproc)Folder_init, /* tp_init */
229 gboolean cmpy_add_folder(PyObject *module)
231 clawsmail_FolderType.tp_new = PyType_GenericNew;
232 if(PyType_Ready(&clawsmail_FolderType) < 0)
235 Py_INCREF(&clawsmail_FolderType);
236 return (PyModule_AddObject(module, "Folder", (PyObject*)&clawsmail_FolderType) == 0);
239 PyObject* clawsmail_folder_new(FolderItem *folderitem)
241 clawsmail_FolderObject *ff;
248 id = folder_item_get_identifier(folderitem);
249 arglist = Py_BuildValue("(s)", id);
251 ff = (clawsmail_FolderObject*) PyObject_CallObject((PyObject*) &clawsmail_FolderType, arglist);
253 return (PyObject*)ff;
256 FolderItem* clawsmail_folder_get_item(PyObject *self)
258 return ((clawsmail_FolderObject*)self)->folderitem;
261 PyTypeObject* clawsmail_folder_get_type_object()
263 return &clawsmail_FolderType;
266 gboolean clawsmail_folder_check(PyObject *self)
268 return (PyObject_TypeCheck(self, &clawsmail_FolderType) != 0);