/* $Id: papi_atkimageiface.c,v 1.10.2.3 2007/03/23 06:02:19 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* _not_implemented_args (PyObject *self, PyObject *args);
static PyObject* _not_implemented_noargs (PyObject *self);
static void _image_get_image_position (AtkImage *image, gint *x, gint *y,
AtkCoordType coord_type);
static const gchar* _image_get_image_description (AtkImage *image);
static gboolean _image_set_image_description (AtkImage *image,
const gchar *desc);
static void _image_get_image_size (AtkImage *image, gint *width, gint *height);
static const gchar* _image_get_locale (AtkImage *image);
/**
* Interface methods, which are bound to the object at runtime.
*/
static PyMethodDef _atkimageiface_methods[] =
{
{ "image_get_image_position", _not_implemented_args, METH_VARARGS,
"O.image_get_image_position (coord_type) -> int, int\n\n"
"Gets the top-left position of the image.\n\n"
"Gets the position of the image in the form of a point specifying the\n"
"images top-left corner.\n\n"
"This method has to be implemented by inherited classes." },
{ "image_get_image_description", (PyCFunction) _not_implemented_noargs,
METH_NOARGS,
"O.image_get_image_description () -> string\n\n"
"Get a textual description of this image.\n\n"
"This method has to be implemented by inherited classes." },
{ "image_set_image_description", _not_implemented_args, METH_VARARGS,
"O.image_set_image_description (text) -> bool\n\n"
"Sets the textual description for this image.\n\n"
"This method has to be implemented by inherited classes." },
{ "image_get_image_size", (PyCFunction) _not_implemented_noargs,
METH_NOARGS,
"O.image_get_image_size () -> int, int\n\n"
"Gets the width and height of the image.\n\n"
"Get the width and height in pixels for the specified image. The\n"
"values of width and height are returned as -1 if the values cannot be\n"
"obtained.\n\n"
"This method has to be implemented by inherited classes." },
{ "image_get_locale", (PyCFunction) _not_implemented_noargs, METH_NOARGS,
"O.image_get_locale () -> string\n\n"
"Gets the locae of the image.\n\n"
"Gets a UTF-8 string indicating the POSIX-style LC_MESSAGES locale of\n"
"this image." },
{ NULL, NULL, 0, NULL }
};
/**
* Default implementation for the interfaces.
*/
static PyObject*
_not_implemented_args (PyObject *self, PyObject *args)
{
PyErr_SetString (PyExc_NotImplementedError, "method not implemented");
return NULL;
}
/**
* Default implementation for the interfaces.
*/
static PyObject*
_not_implemented_noargs (PyObject *self)
{
PyErr_SetString (PyExc_NotImplementedError, "method not implemented");
return NULL;
}
/**
* Wrapper for atk_image_get_image_position().
*/
static void
_image_get_image_position (AtkImage *image, gint *x, gint *y,
AtkCoordType coord_type)
{
PyObject *result;
PyObject *obj;
debug ("_image_get_image_position\n");
obj = g_object_get_data (G_OBJECT (image), PAPI_PYOBJECT);
result = PyObject_CallMethod (obj, "image_get_image_position", "i",
coord_type);
*x = 0;
*y = 0;
if (result)
{
if (PyList_Check (result))
{
*x = PyInt_AsLong (PyList_GetItem (result, 0));
*y = PyInt_AsLong (PyList_GetItem (result, 1));
}
else if (PyTuple_Check (result))
{
*x = PyInt_AsLong (PyTuple_GetItem (result, 0));
*y = PyInt_AsLong (PyTuple_GetItem (result, 1));
}
Py_DECREF (result);
}
}
/**
* Wrapper for atk_image_get_image_description().
*/
static const gchar*
_image_get_image_description (AtkImage *image)
{
PyObject *result;
PyObject *obj;
const gchar* retval = NULL;
debug ("_image_get_image_description\n");
obj = g_object_get_data (G_OBJECT (image), PAPI_PYOBJECT);
result = PyObject_CallMethod (obj, "image_get_image_description", NULL);
if (!result)
return 0;
retval = PyString_AsString (result);
Py_DECREF (result);
return retval;
}
/**
* Wrapper for atk_image_set_image_description().
*/
static gboolean
_image_set_image_description (AtkImage *image, const gchar *desc)
{
PyObject *result;
PyObject *obj;
gboolean retval = FALSE;
debug ("_image_set_image_description\n");
obj = g_object_get_data (G_OBJECT (image), PAPI_PYOBJECT);
result = PyObject_CallMethod (obj, "image_set_image_description", "s",
desc);
if (!result)
return FALSE;
retval = result == Py_True;
Py_DECREF (result);
return retval;
}
/**
* Wrapper for atk_image_get_image_size().
*/
static void
_image_get_image_size (AtkImage *image, gint *width, gint *height)
{
PyObject *result;
PyObject *obj;
debug ("_image_get_image_size\n");
obj = g_object_get_data (G_OBJECT (image), PAPI_PYOBJECT);
result = PyObject_CallMethod (obj, "image_get_image_size", NULL);
*width = 0;
*height = 0;
if (result)
{
if (PyList_Check (result))
{
*width = PyInt_AsLong (PyList_GetItem (result, 0));
*height = PyInt_AsLong (PyList_GetItem (result, 1));
}
else if (PyTuple_Check (result))
{
*width = PyInt_AsLong (PyTuple_GetItem (result, 0));
*height = PyInt_AsLong (PyTuple_GetItem (result, 1));
}
Py_DECREF (result);
}
}
/**
* Wrapper for atk_image_get_locale().
*/
static const gchar*
_image_get_locale (AtkImage *image)
{
PyObject *obj;
PyObject *result;
const gchar *retval;
debug ("_image_get_locale\n");
obj = g_object_get_data (G_OBJECT (image), PAPI_PYOBJECT);
result = PyObject_CallMethod (obj, "image_get_locale", NULL);
if (!result)
return NULL;
retval = PyString_AsString (result);
Py_DECREF (result);
return retval;
}
/**
* Bind the different AtkImageIface interfaces to the wrapper
* interfaces.
*/
static void
_atkimageiface_init (AtkImageIface *iface)
{
iface->get_image_position = _image_get_image_position;
iface->get_image_description = _image_get_image_description;
iface->set_image_description = _image_set_image_description;
iface->get_image_size = _image_get_image_size;
iface->get_image_locale = _image_get_locale;
}
/**
* Gets a modified interface for the AtkImageIface, which uses the
* python wrappers as interfaces.
*/
const GInterfaceInfo*
atkimageiface_get_info (void)
{
static const GInterfaceInfo info =
{
(GInterfaceInitFunc) _atkimageiface_init,
(GInterfaceFinalizeFunc) NULL,
NULL
};
return &info;
}
/**
* Binds the AtkImage methods to the passed object instance.
*/
void
atkimageiface_add_methods (PyObject *self)
{
int i = 0;
PyObject *func;
while (_atkimageiface_methods[i].ml_name != NULL)
{
func = PyCFunction_New (&_atkimageiface_methods[i], NULL);
PyObject_SetAttrString (self, _atkimageiface_methods[i].ml_name, func);
i++;
}
}
syntax highlighted by Code2HTML, v. 0.9.1