/* $Id: papi_atkrelation.c,v 1.7.2.3 2007/03/23 06:02:20 marcusva Exp $
*
* Copyright (c) 2006, Marcus von Appen
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "papi.h"
#include "papi_private.h"
/* Forward declarations. */
static PyObject* _atkrelation_new (PyTypeObject *type, PyObject *args,
PyObject *kwds);
static int _atkrelation_init (PyAtkRelation *self, PyObject *args,
PyObject *kwds);
static void _atkrelation_dealloc (PyAtkRelation *self);
static PyObject* _atkrelation_get_relation_type (PyAtkRelation *self,
void *closure);
static PyObject* _atkrelation_get_target (PyAtkRelation *self);
static PyObject* _atkrelation_add_target (PyAtkRelation *self, PyObject *args);
/**
* Methods, which are bound to the PyAtkRelation type.
*/
static PyMethodDef _atkrelation_methods[] =
{
{ "get_target", (PyCFunction) _atkrelation_get_target, METH_NOARGS,
"O.get_target () -> list\n\n"
"Gets the target list of the relation." },
{ "add_target", (PyCFunction) _atkrelation_add_target, METH_VARARGS,
"O.add_target (obj) -> None\n\n"
"Adds an AtkObject to the target for the relation.\n\n"
"Adds the specified AtkObject to the target for the relation, if it\n"
"is not already present." },
{ NULL, NULL, 0, NULL }
};
/**
* Getters and setters for the AtkRelation.
*/
static PyGetSetDef _atkrelation_getsets[] =
{
{ "relation_type", (getter) _atkrelation_get_relation_type, NULL,
"The type of the relation.", NULL },
{ NULL, NULL, NULL, NULL, NULL }
};
/**
* PyAtkRelation wrapper type, that encapsulates the AtkRelation.
*/
PyTypeObject PyAtkRelation_Type =
{
PyObject_HEAD_INIT(NULL)
0,
"papi.AtkRelation", /* tp_name */
sizeof (PyAtkRelation), /* tp_basicsize */
0, /* tp_itemsize */
(destructor) _atkrelation_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_compare */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
"ATK accessibility relation", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
_atkrelation_methods, /* tp_methods */
0, /* tp_members */
_atkrelation_getsets, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
(initproc) _atkrelation_init, /* tp_init */
0, /* tp_alloc */
_atkrelation_new, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
0, /* tp_mro */
0, /* tp_cache */
0, /* tp_subclasses */
0, /* tp_weaklist */
0 /* tp_del */
};
/**
* Creates a new PyAtkRelation.
*/
static PyObject*
_atkrelation_new (PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyAtkRelation *self;
debug ("_atkrelation_new\n");
self = (PyAtkRelation *) type->tp_alloc (type, 0);
return (PyObject *) self;
}
/**
* Initializes the PyAtkRelation members, such as the AtkRelation.
*/
static int
_atkrelation_init (PyAtkRelation *self, PyObject *args, PyObject *kwds)
{
PyObject *list = NULL;
gboolean istuple = FALSE;
gboolean islist = FALSE;
AtkObject **targets = NULL;
int i;
int amount;
AtkRelationType type;
PyObject *val;
static char *kwlist[] = { "targets", "type", NULL };
debug ("_atkrelation_init\n");
if (!PyArg_ParseTupleAndKeywords (args, kwds, "|Oi", kwlist, &list, &type))
return -1;
if (list)
{
istuple = PyTuple_Check (list);
if (!istuple)
islist = PyList_Check (list);
}
if (!list || (!istuple && !islist))
{
PyErr_SetString (PyExc_TypeError, "argument 1 must be a sequence");
return -1;
}
amount = (islist) ? PyList_Size (list) : PyTuple_Size (list);
targets = PyMem_New (AtkObject*, amount);
if (!targets)
{
PyErr_SetNone (PyExc_MemoryError);
return -1;
}
for (i = 0; i < amount; i++)
{
val = (islist) ? PyList_GetItem (list, i) : PyTuple_GetItem (list, i);
if (!PyObject_TypeCheck (val, &PyAtkObject_Type))
{
PyErr_SetString (PyExc_TypeError, "an AtkObject is required");
PyMem_Free (targets);
return -1;
}
targets[i] = ATKOBJECT (val);
}
if (!self->obj)
self->obj = atk_relation_new (targets, amount, type);
PyMem_Free (targets);
return 0;
}
/**
* Deallocates the PyAtkRelation and its members.
*/
static void
_atkrelation_dealloc (PyAtkRelation *self)
{
debug ("_atkrelation_dealloc\n");
if (self->obj)
g_object_unref (self->obj);
self->ob_type->tp_free ((PyObject *) self);
}
/**
* Wrapper for atk_relation_get_relation_type().
*/
static PyObject*
_atkrelation_get_relation_type (PyAtkRelation *self, void *closure)
{
AtkRelationType type;
debug ("_atkrelation_get_relation_type\n");
type = atk_relation_get_relation_type (ATKRELATION (self));
return PyInt_FromLong ((long) type);
}
/**
* Wrapper for atk_relation_get_target().
*/
static PyObject*
_atkrelation_get_target (PyAtkRelation *self)
{
PyObject *list = NULL;
PyAtkObject *obj = NULL;
int i;
GPtrArray *array = NULL;
debug ("_atkrelation_get_target\n");
array = atk_relation_get_target (ATKRELATION (self));
list = PyList_New ((int) array->len);
if (!list)
return NULL;
for (i = 0; i < (int) array->len; i++)
{
obj = (PyAtkObject *)
PyAtkObject_Type.tp_new (&PyAtkObject_Type, NULL, NULL);
obj->obj = g_object_ref (ATK_OBJECT (array->pdata[i]));
PyList_SetItem (list, i, (PyObject *) obj);
};
return list;
}
/**
* Wrapper for atk_relation_add_target().
*/
static PyObject*
_atkrelation_add_target (PyAtkRelation *self, PyObject *args)
{
PyObject *val;
debug ("_atkrelation_add_target\n");
if (!PyArg_ParseTuple (args, "O:add_target", &val))
return NULL;
if (!PyObject_TypeCheck (val, &PyAtkObject_Type))
{
PyErr_SetString (PyExc_TypeError, "parameter must be an AtkObject");
return NULL;
}
atk_relation_add_target (ATKRELATION (self), ATKOBJECT (val));
Py_RETURN_NONE;
}
syntax highlighted by Code2HTML, v. 0.9.1