2008-01-13 18:44:42 +03:00
/*
Unix SMB / CIFS implementation .
Python / Talloc glue
Copyright ( C ) Jelmer Vernooij < jelmer @ samba . org > 2008
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 3 of the License , or
( at your option ) any later version .
This program 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 General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
2010-01-20 05:07:09 +03:00
# include <Python.h>
2009-01-30 21:38:09 +03:00
# include "replace.h"
2008-10-24 04:52:51 +04:00
# include <talloc.h>
2008-12-23 06:06:21 +03:00
# include <pytalloc.h>
2008-01-13 18:44:42 +03:00
2008-12-23 06:06:21 +03:00
/**
* Simple dealloc for talloc - wrapping PyObjects
*/
2008-01-13 18:44:42 +03:00
void py_talloc_dealloc ( PyObject * self )
{
py_talloc_Object * obj = ( py_talloc_Object * ) self ;
2008-01-13 22:41:34 +03:00
talloc_free ( obj - > talloc_ctx ) ;
2008-05-23 17:09:51 +04:00
obj - > talloc_ctx = NULL ;
2008-12-21 05:08:14 +03:00
self - > ob_type - > tp_free ( self ) ;
2008-01-13 18:44:42 +03:00
}
2008-12-23 06:06:21 +03:00
/**
* Import an existing talloc pointer into a Python object .
*/
2009-07-30 22:04:42 +04:00
PyObject * py_talloc_steal_ex ( PyTypeObject * py_type , TALLOC_CTX * mem_ctx ,
2008-01-13 22:41:34 +03:00
void * ptr )
2008-01-13 18:44:42 +03:00
{
2008-12-21 05:08:14 +03:00
py_talloc_Object * ret = ( py_talloc_Object * ) py_type - > tp_alloc ( py_type , 0 ) ;
2008-05-23 17:09:51 +04:00
ret - > talloc_ctx = talloc_new ( NULL ) ;
if ( ret - > talloc_ctx = = NULL ) {
return NULL ;
}
2009-07-01 08:05:17 +04:00
if ( talloc_steal ( ret - > talloc_ctx , mem_ctx ) = = NULL ) {
return NULL ;
}
ret - > ptr = ptr ;
return ( PyObject * ) ret ;
}
/**
* Import an existing talloc pointer into a Python object , leaving the
* original parent , and creating a reference to the object in the python
* object
*/
2009-07-30 22:04:42 +04:00
PyObject * py_talloc_reference_ex ( PyTypeObject * py_type , TALLOC_CTX * mem_ctx , void * ptr )
2009-07-01 08:05:17 +04:00
{
py_talloc_Object * ret = ( py_talloc_Object * ) py_type - > tp_alloc ( py_type , 0 ) ;
ret - > talloc_ctx = talloc_new ( NULL ) ;
if ( ret - > talloc_ctx = = NULL ) {
return NULL ;
}
2009-07-30 22:04:42 +04:00
if ( talloc_reference ( ret - > talloc_ctx , mem_ctx ) = = NULL ) {
2008-05-23 17:09:51 +04:00
return NULL ;
}
2008-01-13 22:41:34 +03:00
ret - > ptr = ptr ;
2008-01-14 04:48:50 +03:00
return ( PyObject * ) ret ;
2008-01-13 18:44:42 +03:00
}
2008-01-13 20:38:12 +03:00
2008-12-23 06:06:21 +03:00
/**
* Default ( but slightly more useful than the default ) implementation of Repr ( ) .
*/
PyObject * py_talloc_default_repr ( PyObject * obj )
2008-01-13 20:38:12 +03:00
{
2008-12-23 06:06:21 +03:00
py_talloc_Object * talloc_obj = ( py_talloc_Object * ) obj ;
PyTypeObject * type = ( PyTypeObject * ) PyObject_Type ( obj ) ;
2008-01-13 20:38:12 +03:00
2009-07-01 08:05:17 +04:00
return PyString_FromFormat ( " <%s talloc object at 0x%p> " ,
type - > tp_name , talloc_obj - > ptr ) ;
2008-01-13 20:38:12 +03:00
}
2009-09-28 17:03:17 +04:00
static void py_cobject_talloc_free ( void * ptr )
{
talloc_free ( ptr ) ;
}
PyObject * PyCObject_FromTallocPtr ( void * ptr )
{
return PyCObject_FromVoidPtr ( ptr , py_cobject_talloc_free ) ;
}