Re: extracting null pointer address from PyCObject with ctypes

2008-10-11 Thread Gordon Allott
Aaron Castironpi Brady wrote:
 
 My pygame install just returns an integer in get_wm_info.  Take a
 look:
 
 pygame.display.get_wm_info()
 {'window': 1180066, 'hglrc': 0}
 pygame.display.get_wm_info()['window']
 1180066
 ctypes.c_void_p( _ )
 c_void_p(1180066)
 
 You're suggesting yours looks like this:
 
 pygame.display.get_wm_info()
 { ... 'display': ctypes.py_object( 1180066 ), ... }
 
 What does type( display ) give you?
 --
 http://mail.python.org/mailman/listinfo/python-list

yes its different on windows and linux, windows only has a few items
where linux has many more. 'window' is just the window 'id'  at any rate
which is not the data I am after (which is internally an address to an
xlib structure)
this is what pygame.display.get_wm_info() returns on linux:
{'fswindow': 31457283, 'wmwindow': 31457284, 'window': 31457294,
'lock_func': PyCObject object at 0x89dfa70, 'unlock_func': PyCObject
object at 0x89dfa88, 'display': PyCObject object at 0x89dfa58}

note how the display object is a PyCObject, thats got the address I want
 inside it.


-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-11 Thread Aaron Castironpi Brady
On Oct 11, 9:45 am, Gordon Allott [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:

  My pygame install just returns an integer in get_wm_info.  Take a
  look:

  pygame.display.get_wm_info()
  {'window': 1180066, 'hglrc': 0}
  pygame.display.get_wm_info()['window']
  1180066
  ctypes.c_void_p( _ )
  c_void_p(1180066)

  You're suggesting yours looks like this:

  pygame.display.get_wm_info()
  { ... 'display': ctypes.py_object( 1180066 ), ... }

  What does type( display ) give you?
  --
 http://mail.python.org/mailman/listinfo/python-list

 yes its different on windows and linux, windows only has a few items
 where linux has many more. 'window' is just the window 'id'  at any rate
 which is not the data I am after (which is internally an address to an
 xlib structure)
 this is what pygame.display.get_wm_info() returns on linux:
 {'fswindow': 31457283, 'wmwindow': 31457284, 'window': 31457294,
 'lock_func': PyCObject object at 0x89dfa70, 'unlock_func': PyCObject
 object at 0x89dfa88, 'display': PyCObject object at 0x89dfa58}

 note how the display object is a PyCObject, thats got the address I want
  inside it.


What does print pythonapi.PyCObject_AsVoidPtr(display) give you?
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-11 Thread Gordon Allott
Aaron Castironpi Brady wrote:
 
 What does print pythonapi.PyCObject_AsVoidPtr(display) give you?
 --
 http://mail.python.org/mailman/listinfo/python-list

Traceback (most recent call last):
  File pygametest.py, line 125, in module
app = PyGameOGREApp()
  File pygametest.py, line 33, in __init__
self._createWindow(width, height, fullscreen)
  File pygametest.py, line 65, in _createWindow
print pythonapi.PyCObject_AsVoidPtr(display)
ctypes.ArgumentError: argument 1: type 'exceptions.TypeError': Don't
know how to convert parameter 1


-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-11 Thread Aaron Castironpi Brady
On Oct 11, 1:59 pm, Gordon Allott [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:

  What does print pythonapi.PyCObject_AsVoidPtr(display) give you?
  --
 http://mail.python.org/mailman/listinfo/python-list

 Traceback (most recent call last):
   File pygametest.py, line 125, in module
     app = PyGameOGREApp()
   File pygametest.py, line 33, in __init__
     self._createWindow(width, height, fullscreen)
   File pygametest.py, line 65, in _createWindow
     print pythonapi.PyCObject_AsVoidPtr(display)
 ctypes.ArgumentError: argument 1: type 'exceptions.TypeError': Don't
 know how to convert parameter 1

 --
 Gord Allott ([EMAIL PROTECTED])

  signature.asc
  1KViewDownload

If anyone knows this better, feel free to step in.

Put this before the call:

ctypes.pythonapi.PyCObject_AsVoidPtr.restype = ctypes.c_void_p
ctypes.pythonapi.PyCObject_AsVoidPtr.argtypes = [ ctypes.py_object ]

The reason is that this is the default signature, which is wrong:

 ctypes.pythonapi.PyCObject_AsVoidPtr.restype
class 'ctypes.c_long'
 ctypes.pythonapi.PyCObject_AsVoidPtr.argtypes


There are other ways to prototype it if you like, too.
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-11 Thread Gordon Allott
Aaron Castironpi Brady wrote:
 ctypes.pythonapi.PyCObject_AsVoidPtr.restype
 class 'ctypes.c_long'
 ctypes.pythonapi.PyCObject_AsVoidPtr.argtypes


thank you so much, this works perfectly :)


-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 5:24 am, Gordon Allott [EMAIL PROTECTED] wrote:
 Hello :)

 The result of various incompatibilities has left me needing to somehow
 extract the address that a null pointer is pointing to with the null
 pointer being exposed to python via PyCObject_FromVoidPtr

 the code that creates the PyCObject is as follows:
     tmp = PyCObject_FromVoidPtr (info.info.x11.display, NULL);
     PyDict_SetItemString (dict, display, tmp);
     Py_DECREF (tmp);


Did you try:

tmp= PyLong_FromLong( ( long ) info.info.x11.display );
PyDict_SetItemString (dict, display, tmp);
Py_DECREF (tmp);

Or also try:

PyCObject_AsVoidPtr( tmp );
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Gordon Allott
Aaron Castironpi Brady wrote:
 Did you try:
 
 tmp= PyLong_FromLong( ( long ) info.info.x11.display );
 PyDict_SetItemString (dict, display, tmp);
 Py_DECREF (tmp);
 
 Or also try:
 
 PyCObject_AsVoidPtr( tmp );
 --
 http://mail.python.org/mailman/listinfo/python-list

the problem is that I can't edit the C code - well I can and might
submit a patch to the project but I also need a solution that works from
the python side of things.


-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 12:04 pm, Gordon Allott [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:
  Did you try:

  tmp= PyLong_FromLong( ( long ) info.info.x11.display );
  PyDict_SetItemString (dict, display, tmp);
  Py_DECREF (tmp);

  Or also try:

  PyCObject_AsVoidPtr( tmp );
  --
 http://mail.python.org/mailman/listinfo/python-list

 the problem is that I can't edit the C code - well I can and might
 submit a patch to the project but I also need a solution that works from
 the python side of things.


I see.  If I understand, you have a PyCObject in a dictionary.

Look at the 'ctypes' module and try calling PyCObject_AsVoidPtr.  Its
return type should be 'c_void_p', and you can use 'result.value' to
get the original pointer.
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Gordon Allott
Aaron Castironpi Brady wrote:
 I see.  If I understand, you have a PyCObject in a dictionary.
 
 Look at the 'ctypes' module and try calling PyCObject_AsVoidPtr.  Its
 return type should be 'c_void_p', and you can use 'result.value' to
 get the original pointer.
 --
 http://mail.python.org/mailman/listinfo/python-list

I have a hard time following that, if using ctypes you used PyDLL to
call PyCObject_AsVoidPtr on the PyCObject I already have surely it would
 give me back a pointer (void for sake of simplicity) but it would be a
pointer to a new PyCObject and thus calling result.value on it would
only return the memory address of the new PyCObject?
-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 4:16 pm, Gordon Allott [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:
  I see.  If I understand, you have a PyCObject in a dictionary.

  Look at the 'ctypes' module and try calling PyCObject_AsVoidPtr.  Its
  return type should be 'c_void_p', and you can use 'result.value' to
  get the original pointer.
  --
 http://mail.python.org/mailman/listinfo/python-list

 I have a hard time following that, if using ctypes you used PyDLL to
 call PyCObject_AsVoidPtr on the PyCObject I already have surely it would
  give me back a pointer (void for sake of simplicity) but it would be a
 pointer to a new PyCObject and thus calling result.value on it would
 only return the memory address of the new PyCObject?
 --
 Gord Allott ([EMAIL PROTECTED])

  signature.asc
  1KViewDownload


Yes, well said.  But no, not true, not necessarily.  You can choose/
change return types with your code.  If the call is defined already
and you can't change the return, just define a new one that returns
long.
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Gordon Allott
Aaron Castironpi Brady wrote:

 Yes, well said.  But no, not true, not necessarily.  You can choose/
 change return types with your code.  If the call is defined already
 and you can't change the return, just define a new one that returns
 long.
 --
 http://mail.python.org/mailman/listinfo/python-list

the problem is that the pointer or long or whatever it is thats returned
won't be the data I am after. the code for PyCObject_FromVoidPtr is as
follows:

PyObject *
PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *))
{
PyCObject *self;

self = PyObject_NEW(PyCObject, PyCObject_Type);
if (self == NULL)
return NULL;
self-cobject=cobj;
self-destructor=destr;
self-desc=NULL;

return (PyObject *)self;
}


it obviously creates a new PyObject and returns that, which has already
happened once (the address I am after is passed to python via
PyCObject_FromVoidPtr(adress_i_am_after, NULL), doing that puts the
address I am after into the .cobject attribute of a new pyobject
structure and passes that to the python script via the 'display' key in
a dictionary.

If I were to then take the pycobject in this display key and pass it via
ctypes into PyCObject_FromVoidPtr it would simply create a new pycobject
 and put a pointer to the old pycobject in the new pycobject's .cobject
attribute. it just means that I am getting further and further away from
where I want to be surely? if I were to take the current pointer at this
stage, to get to the address I actually want in C it would have to
follow something along the lines of
long address_i_want = (long)(new_pycobj-cobject-cobject);

What would be great is if there is some easy simple way of accessing the
.cobject attribute of the first pycobject thats passed via the
dictionary to python.

-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 7:59 pm, Gordon Allott [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:
  Yes, well said.  But no, not true, not necessarily.  You can choose/
  change return types with your code.  If the call is defined already
  and you can't change the return, just define a new one that returns
  long.
  --
 http://mail.python.org/mailman/listinfo/python-list

 the problem is that the pointer or long or whatever it is thats returned
 won't be the data I am after. the code for PyCObject_FromVoidPtr is as
 follows:

 PyObject *
 PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *))
 {
     PyCObject *self;

     self = PyObject_NEW(PyCObject, PyCObject_Type);
     if (self == NULL)
         return NULL;
     self-cobject=cobj;
     self-destructor=destr;
     self-desc=NULL;

     return (PyObject *)self;

 }

 it obviously creates a new PyObject and returns that, which has already
 happened once (the address I am after is passed to python via
 PyCObject_FromVoidPtr(adress_i_am_after, NULL), doing that puts the
 address I am after into the .cobject attribute of a new pyobject
 structure and passes that to the python script via the 'display' key in
 a dictionary.

 If I were to then take the pycobject in this display key and pass it via
 ctypes into PyCObject_FromVoidPtr it would simply create a new pycobject
  and put a pointer to the old pycobject in the new pycobject's .cobject
 attribute. it just means that I am getting further and further away from
 where I want to be surely? if I were to take the current pointer at this
 stage, to get to the address I actually want in C it would have to
 follow something along the lines of
 long address_i_want = (long)(new_pycobj-cobject-cobject);

 What would be great is if there is some easy simple way of accessing the
 .cobject attribute of the first pycobject thats passed via the
 dictionary to python.

 --
 Gord Allott ([EMAIL PROTECTED])

  signature.asc
  1KViewDownload

You are hard to follow.  There is the 'cast' function, which I've had
some success with, even in adding pointers and offsets.  It took a
look at the code for it though, and calling an undocumented version of
it.  I can post that later if you don't have luck the same.  You can
write extension modules to do that as well, and there's always a
Google search which personally I forget half the time too.  Last, you
haven't mentioned an attempt with PyCObject_AsVoidPtr yet:

void* PyCObject_AsVoidPtr(PyObject* self)
Return the object void * that the PyCObject self was created with.

Where does that get you?
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Gordon Allott
Aaron Castironpi Brady wrote:
 
 You are hard to follow.  There is the 'cast' function, which I've had
 some success with, even in adding pointers and offsets.  It took a
 look at the code for it though, and calling an undocumented version of
 it.  I can post that later if you don't have luck the same.  You can
 write extension modules to do that as well, and there's always a
 Google search which personally I forget half the time too.  Last, you
 haven't mentioned an attempt with PyCObject_AsVoidPtr yet:
 
 void* PyCObject_AsVoidPtr(PyObject* self)
 Return the object void * that the PyCObject self was created with.
 
 Where does that get you?
 --
 http://mail.python.org/mailman/listinfo/python-list

sorry yes you were right, I was reading PyCObject_AsVoidPtr as
PyCObject_FromVoidPtr :)

using AsVoidPtr is a little confusing, this is the code I am using:
display = pygame.display.get_wm_info()['display']
pyobj = py_object(display)
ref = pointer(pyobj)

print pythonapi.PyCObject_AsVoidPtr(ref)

it produces the following traceback:
Traceback (most recent call last):
  File pygametest.py, line 125, in module
app = PyGameOGREApp()
  File pygametest.py, line 33, in __init__
self._createWindow(width, height, fullscreen)
  File pygametest.py, line 64, in _createWindow
print pythonapi.PyCObject_AsVoidPtr(ref)
TypeError: PyCObject_AsVoidPtr with non-C-object

- I think that's because its a pointer to the ctypes py_object() rather
than the PyCObject we are dealing with but I have no idea how to create
a pointer to that.

-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 10:54 pm, Gordon Allott [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:
 snip
  Last, you
  haven't mentioned an attempt with PyCObject_AsVoidPtr yet:

  void* PyCObject_AsVoidPtr(PyObject* self)
      Return the object void * that the PyCObject self was created with.

  Where does that get you?
  --
 http://mail.python.org/mailman/listinfo/python-list

 sorry yes you were right, I was reading PyCObject_AsVoidPtr as
 PyCObject_FromVoidPtr :)

 using AsVoidPtr is a little confusing, this is the code I am using:
         display = pygame.display.get_wm_info()['display']
         pyobj = py_object(display)
         ref = pointer(pyobj)

         print pythonapi.PyCObject_AsVoidPtr(ref)

 it produces the following traceback:
 Traceback (most recent call last):
   File pygametest.py, line 125, in module
     app = PyGameOGREApp()
   File pygametest.py, line 33, in __init__
     self._createWindow(width, height, fullscreen)
   File pygametest.py, line 64, in _createWindow
     print pythonapi.PyCObject_AsVoidPtr(ref)
 TypeError: PyCObject_AsVoidPtr with non-C-object

 - I think that's because its a pointer to the ctypes py_object() rather
 than the PyCObject we are dealing with but I have no idea how to create
 a pointer to that.


My pygame install just returns an integer in get_wm_info.  Take a
look:

 pygame.display.get_wm_info()
{'window': 1180066, 'hglrc': 0}
 pygame.display.get_wm_info()['window']
1180066
 ctypes.c_void_p( _ )
c_void_p(1180066)

You're suggesting yours looks like this:

 pygame.display.get_wm_info()
{ ... 'display': ctypes.py_object( 1180066 ), ... }

What does type( display ) give you?
--
http://mail.python.org/mailman/listinfo/python-list