Commit 17751e6b 17751e6bf80cd75c278145222f414f4cd434fe9e by Wojciech Polak

Add scripting to libmu_py.

* python/libmu_py/script.c: New file.
1 parent 38e3ef3d
......@@ -156,6 +156,7 @@ extern PyFolder * PyFolder_NEW ();
extern PyHeader * PyHeader_NEW ();
extern PyMailcap * PyMailcap_NEW ();
extern PyMailcapEntry * PyMailcapEntry_NEW ();
extern PyMailbox * PyMailbox_NEW ();
extern PyMailer * PyMailer_NEW ();
extern PyMessage * PyMessage_NEW ();
extern PyMime * PyMime_NEW ();
......@@ -170,6 +171,26 @@ extern int PyAuthData_Check (PyObject *x);
extern int PyMessage_Check (PyObject *x);
extern int PyStream_Check (PyObject *x);
typedef struct {
char *name;
PyObject *obj;
} mu_py_dict;
typedef struct {
char *module_name;
mu_py_dict *attrs;
} mu_py_script_data;
extern void mu_py_script_init (int argc, char *argv[]);
extern void mu_py_script_finish (void);
extern int mu_py_script_run (const char *filename,
mu_py_script_data *data);
extern int mu_py_script_process_mailbox (int argc, char *argv[],
const char *python_filename,
const char *module_name,
mu_mailbox_t mbox);
#ifdef __cplusplus
}
#endif
......
......@@ -41,6 +41,7 @@ libmu_py_la_SOURCES = \
mailcap.c \
message.c \
mime.c \
script.c \
stream.c \
registrar.c \
url.c \
......
......@@ -73,6 +73,12 @@ static PyTypeObject PyMailboxType = {
0, /* tp_new */
};
PyMailbox *
PyMailbox_NEW ()
{
return (PyMailbox *)PyObject_NEW (PyMailbox, &PyMailboxType);
}
static PyObject *
api_mailbox_create (PyObject *self, PyObject *args)
{
......
/*
GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2009 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library; if not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301 USA
*/
#include "libmu_py.h"
void
mu_py_script_init (int argc, char *argv[])
{
if (!Py_IsInitialized ())
Py_Initialize ();
PySys_SetArgv (argc, argv);
}
void
mu_py_script_finish (void)
{
Py_Finalize ();
}
static PyMethodDef nomethods[] = {
{ NULL, NULL }
};
int
mu_py_script_run (const char *python_filename, mu_py_script_data *data)
{
FILE *fp;
PyObject *py_module;
if (!python_filename)
return MU_ERR_OUT_PTR_NULL;
fp = fopen (python_filename, "r");
if (!fp)
return errno;
py_module = Py_InitModule (data->module_name, nomethods);
if (!py_module)
return MU_ERR_FAILURE;
for (; data->attrs->name; data->attrs++)
PyObject_SetAttrString (py_module, data->attrs->name, data->attrs->obj);
if (PyRun_SimpleFile (fp, python_filename))
return MU_ERR_FAILURE;
fclose (fp);
return 0;
}
int
mu_py_script_process_mailbox (int argc, char *argv[],
const char *python_filename,
const char *module_name,
mu_mailbox_t mbox)
{
int status;
PyMailbox *py_mbox;
mu_py_dict dict[2];
mu_py_script_data data[1];
mu_py_script_init (argc, argv);
py_mbox = PyMailbox_NEW ();
py_mbox->mbox = mbox;
Py_INCREF (py_mbox);
dict[0].name = "mailbox";
dict[0].obj = (PyObject *)py_mbox;
dict[1].name = NULL;
data[0].module_name = module_name;
data[0].attrs = dict;
status = mu_py_script_run (python_filename, data);
mu_py_script_finish ();
return status;
}
......@@ -161,14 +161,20 @@ class MailboxBase:
class Mailbox (MailboxBase):
__owner = False
def __init__ (self, name):
self.mbox = mailbox.MailboxType ()
status = mailbox.create (self.mbox, name)
if status:
raise MailboxError (status)
if isinstance (name, mailbox.MailboxType):
self.mbox = name
else:
self.mbox = mailbox.MailboxType ()
self.__owner = True
status = mailbox.create (self.mbox, name)
if status:
raise MailboxError (status)
def __del__ (self):
mailbox.destroy (self.mbox)
if self.__owner:
mailbox.destroy (self.mbox)
del self.mbox
class MailboxDefault (MailboxBase):
......