2
OpenChange MAPI implementation.
4
Copyright (C) Jelmer Vernooij <jelmer@openchange.org> 2008.
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 3 of the License, or
9
(at your option) any later version.
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with this program. If not, see <http://www.gnu.org/licenses/>.
20
#include "pymapi/pymapi.h"
22
static PyObject *PyMapiObject_FromMapiObject(mapi_object_t *obj)
24
return NULL; /* FIXME */
27
static PyObject *object_create(PyTypeObject *type, PyObject *args, PyObject *kwargs)
30
return (PyObject *)PyObject_New(PyMapiObjectObject, type);
33
static void object_dealloc(PyObject *_self)
35
PyMapiObjectObject *self = (PyMapiObjectObject *)_self;
36
mapi_object_release(self->object);
40
mapi_object_t *PyMapiObject_GetMapiObject(PyObject *obj)
42
PyMapiObjectObject *self = (PyMapiObjectObject *)obj;
43
if (!PyMapiObject_Check(obj))
49
static PyObject *py_folder_get_items_count(PyMapiObjectObject *self)
51
enum MAPISTATUS status;
52
uint32_t unread, total;
54
status = GetFolderItemsCount(self->object, &unread, &total);
55
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
57
return Py_BuildValue("(ii)", unread, total);
60
static PyObject *py_folder_remove_user_permissions(PyMapiObjectObject *self, PyObject *args)
63
enum MAPISTATUS status;
64
if (!PyArg_ParseTuple(args, "s", &username))
67
status = RemoveUserPermission(self->object, username);
68
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
73
static PyObject *py_folder_create(PyMapiObjectObject *self, PyObject *args)
78
enum MAPISTATUS status;
81
if (!PyArg_ParseTuple(args, "issI", &foldertype, &name, &comment, &flags))
84
status = CreateFolder(self->object, foldertype, name, comment, flags, &child);
85
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
87
return PyMapiObject_FromMapiObject(&child);
90
static PyObject *py_folder_delete(PyMapiObjectObject *self, PyObject *args)
94
enum MAPISTATUS status;
96
if (!PyArg_ParseTuple(args, "ii", &folderid, &flags))
99
status = DeleteFolder(self->object, folderid, flags, &partial);
100
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
102
return PyBool_FromLong(partial);
105
static PyObject *py_folder_empty(PyMapiObjectObject *self)
107
enum MAPISTATUS status = EmptyFolder(self->object);
108
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
112
static PyObject *py_folder_create_message(PyMapiObjectObject *self)
115
enum MAPISTATUS status = CreateMessage(self->object, &msg);
116
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
117
return PyMapiObject_FromMapiObject(&msg);
120
static PyObject *py_folder_delete_messages(PyMapiObjectObject *self, PyObject *args)
123
uint32_t cn_messages;
125
enum MAPISTATUS status;
128
if (!PyArg_ParseTuple(args, "O", &py_ids))
131
if (!PySequence_Check(py_ids)) {
132
PyErr_SetString(PyExc_TypeError, "ids should be a list of ids");
136
cn_messages = PySequence_Size(py_ids);
137
ids = talloc_array(NULL, mapi_id_t, cn_messages);
143
for (i = 0; i < cn_messages; i++) {
145
item = PySequence_GetItem(py_ids, i);
146
ids[i] = PyInt_AsLong(item);
149
status = DeleteMessage(self->object, ids, cn_messages);
151
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
156
static PyObject *py_folder_set_read_flags(PyMapiObjectObject *self, PyObject *args)
160
enum MAPISTATUS status;
164
if (!PyArg_ParseTuple(args, "iO", &flags, &py_ids))
167
if (!PySequence_Check(py_ids)) {
168
PyErr_SetString(PyExc_TypeError, "ids should be a list of ids");
172
cn_ids = PySequence_Size(py_ids);
173
ids = talloc_array(NULL, uint64_t, cn_ids);
179
for (i = 0; i < cn_ids; i++) {
181
item = PySequence_GetItem(py_ids, i);
182
ids[i] = PyInt_AsLong(item);
185
status = SetReadFlags(self->object, flags, cn_ids, ids);
187
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
192
static PyObject *py_folder_get_message_status(PyMapiObjectObject *self, PyObject *args)
196
enum MAPISTATUS status;
197
if (!PyArg_ParseTuple(args, "i", &msgid))
200
status = GetMessageStatus(self->object, msgid, &lstatus);
201
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
203
return PyInt_FromLong(lstatus);
206
static PyObject *py_message_get_best_body(PyMapiObjectObject *self)
208
enum MAPISTATUS status;
211
status = GetBestBody(self->object, &format);
212
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
214
return PyInt_FromLong(status);
217
static PyObject *py_get_default_folder(PyMapiObjectObject *self, PyObject *args)
219
enum MAPISTATUS status;
223
if (!PyArg_ParseTuple(args, "i", &type))
226
status = GetDefaultFolder(self->object, &folder, type);
227
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
229
return PyLong_FromLong(folder);
232
static PyObject *py_get_default_public_folder(PyMapiObjectObject *self, PyObject *args)
234
enum MAPISTATUS status;
238
if (!PyArg_ParseTuple(args, "i", &type))
241
status = GetDefaultPublicFolder(self->object, &folder, type);
242
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
244
return PyLong_FromLong(folder);
247
static PyObject *py_folder_add_user_permission(PyMapiObjectObject *self, PyObject *args)
251
enum MAPISTATUS status;
252
if (!PyArg_ParseTuple(args, "si", &name, &rights))
255
status = AddUserPermission(self->object, name, rights);
256
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
261
static PyObject *py_folder_modify_user_permission(PyMapiObjectObject *self, PyObject *args)
265
enum MAPISTATUS status;
266
if (!PyArg_ParseTuple(args, "si", &name, &rights))
269
status = ModifyUserPermission(self->object, name, rights);
270
PyErr_MAPISTATUS_IS_ERR_RAISE(status);
275
static PyMethodDef object_methods[] = {
276
{ "get_folder_items_count", (PyCFunction)py_folder_get_items_count, METH_NOARGS,
277
"S.get_folder_items_count() -> (unread, total)" },
278
{ "remove_user_permission", (PyCFunction)py_folder_remove_user_permissions, METH_VARARGS,
279
"S.remove_user_permissions(user) -> None" },
280
{ "add_user_permission", (PyCFunction)py_folder_add_user_permission, METH_VARARGS,
281
"S.add_user_permission(user, perm) -> None" },
282
{ "modify_user_permission", (PyCFunction)py_folder_modify_user_permission, METH_VARARGS,
283
"S.modify_user_permission(user, perm) -> None" },
284
{ "create_folder", (PyCFunction)py_folder_create, METH_VARARGS,
285
"S.create_folder(type, name, comment, flags) -> None" },
286
{ "empty_folder", (PyCFunction)py_folder_empty, METH_NOARGS,
287
"S.empty_folder() -> None" },
288
{ "delete_folder", (PyCFunction)py_folder_delete, METH_VARARGS,
289
"S.delete_folder(folderid, flags) -> None" },
290
{ "create_message", (PyCFunction)py_folder_create_message, METH_NOARGS,
291
"S.create_message() -> message" },
292
{ "delete_messages", (PyCFunction)py_folder_delete_messages, METH_VARARGS,
293
"S.delete_messages([ids]) -> None" },
294
{ "get_message_status", (PyCFunction)py_folder_get_message_status, METH_VARARGS,
295
"S.get_message_status(id) -> status" },
296
{ "set_read_flags", (PyCFunction)py_folder_set_read_flags, METH_VARARGS,
297
"S.set_read_flags(flags, [ids]) -> None" },
298
{ "get_best_body", (PyCFunction)py_message_get_best_body, METH_NOARGS,
299
"S.get_best_body() -> format" },
300
{ "get_default_folder", (PyCFunction)py_get_default_folder, METH_VARARGS,
301
"S.get_default_folder(type) -> id" },
302
{ "get_default_public_folder", (PyCFunction)py_get_default_public_folder, METH_VARARGS,
303
"S.get_default_public_folder(type) -> id" },
307
static PyObject *object_get_session(PyObject *_self, void *closure)
309
PyMapiObjectObject *self = (PyMapiObjectObject *)_self;
310
struct mapi_session *session;
312
session = mapi_object_get_session(self->object);
314
return PyMapiSession_FromMapiSession(session);
317
static PyObject *object_get_id(PyObject *_self, void *closure)
319
PyMapiObjectObject *self = (PyMapiObjectObject *)_self;
322
id = mapi_object_get_id(self->object);
324
return PyLong_FromLong(id);
327
static PyGetSetDef object_getsetters[] = {
328
{ "session", object_get_session, NULL, "The MAPI session" },
329
{ "id", object_get_id, NULL, "MAPI ID" },
333
PyTypeObject PyMapiObjectType = {
334
PyObject_HEAD_INIT(NULL) 0,
336
.tp_basicsize = sizeof(PyMapiObjectObject),
337
.tp_methods = object_methods,
338
.tp_getset = object_getsetters,
339
.tp_doc = "MAPI Object",
340
.tp_new = object_create,
341
.tp_dealloc = object_dealloc,
342
.tp_flags = Py_TPFLAGS_DEFAULT,