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>
2010-03-29 01:35:30 +04:00
# include "pytalloc.h"
2010-10-24 21:52:01 +04:00
# include <assert.h>
2008-01-13 18:44:42 +03:00
2011-08-10 17:15:18 +04:00
_PUBLIC_ PyTypeObject * pytalloc_GetObjectType ( void )
2010-12-01 00:59:51 +03:00
{
static PyTypeObject * type = NULL ;
PyObject * mod ;
if ( type ! = NULL ) {
return type ;
}
mod = PyImport_ImportModule ( " talloc " ) ;
if ( mod = = NULL ) {
return NULL ;
}
type = ( PyTypeObject * ) PyObject_GetAttrString ( mod , " Object " ) ;
Py_DECREF ( mod ) ;
return type ;
}
2008-12-23 06:06:21 +03:00
/**
* Import an existing talloc pointer into a Python object .
*/
2011-08-10 17:15:18 +04:00
_PUBLIC_ PyObject * pytalloc_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
{
2011-08-10 17:15:18 +04:00
pytalloc_Object * ret = ( pytalloc_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 ;
}
2010-08-25 06:31:32 +04:00
talloc_set_name_const ( ret - > talloc_ctx , py_type - > tp_name ) ;
2009-07-01 08:05:17 +04:00
ret - > ptr = ptr ;
return ( PyObject * ) ret ;
}
2010-08-25 08:29:59 +04:00
/**
* Import an existing talloc pointer into a Python object .
*/
2011-08-10 17:15:18 +04:00
_PUBLIC_ PyObject * pytalloc_steal ( PyTypeObject * py_type , void * ptr )
2010-08-25 08:29:59 +04:00
{
2011-08-10 17:15:18 +04:00
return pytalloc_steal_ex ( py_type , ptr , ptr ) ;
2010-08-25 08:29:59 +04:00
}
2009-07-01 08:05:17 +04:00
/**
* Import an existing talloc pointer into a Python object , leaving the
* original parent , and creating a reference to the object in the python
* object
*/
2011-08-10 17:15:18 +04:00
_PUBLIC_ PyObject * pytalloc_reference_ex ( PyTypeObject * py_type , TALLOC_CTX * mem_ctx , void * ptr )
2009-07-01 08:05:17 +04:00
{
2011-08-10 17:15:18 +04:00
pytalloc_Object * ret ;
2010-08-28 15:53:27 +04:00
if ( ptr = = NULL ) {
Py_RETURN_NONE ;
}
2011-08-10 17:15:18 +04:00
ret = ( pytalloc_Object * ) py_type - > tp_alloc ( py_type , 0 ) ;
2009-07-01 08:05:17 +04:00
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 ;
}
2010-08-25 06:31:32 +04:00
talloc_set_name_const ( ret - > talloc_ctx , py_type - > tp_name ) ;
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
2009-09-28 17:03:17 +04:00
static void py_cobject_talloc_free ( void * ptr )
{
talloc_free ( ptr ) ;
}
2011-08-10 17:15:18 +04:00
_PUBLIC_ PyObject * pytalloc_CObject_FromTallocPtr ( void * ptr )
2009-09-28 17:03:17 +04:00
{
2010-08-28 16:00:21 +04:00
if ( ptr = = NULL ) {
Py_RETURN_NONE ;
}
2009-09-28 17:03:17 +04:00
return PyCObject_FromVoidPtr ( ptr , py_cobject_talloc_free ) ;
}
2010-08-28 16:00:21 +04:00
2011-08-10 17:15:18 +04:00
_PUBLIC_ int pytalloc_Check ( PyObject * obj )
2010-12-01 00:59:51 +03:00
{
2011-08-10 17:15:18 +04:00
PyTypeObject * tp = pytalloc_GetObjectType ( ) ;
2010-12-01 00:59:51 +03:00
return PyObject_TypeCheck ( obj , tp ) ;
}