mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	Also added a Handle() function which is like Resource() but has auto-dispose on by default.
		
			
				
	
	
		
			98 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
resource_body = """
 | 
						|
char *buf;
 | 
						|
int len;
 | 
						|
Handle h;
 | 
						|
 | 
						|
if (!PyArg_ParseTuple(_args, "s#", &buf, &len))
 | 
						|
	return NULL;
 | 
						|
h = NewHandle(len);
 | 
						|
if ( h == NULL ) {
 | 
						|
	PyErr_NoMemory();
 | 
						|
	return NULL;
 | 
						|
}
 | 
						|
HLock(h);
 | 
						|
memcpy(*h, buf, len);
 | 
						|
HUnlock(h);
 | 
						|
return ResObj_New(h);
 | 
						|
"""
 | 
						|
 | 
						|
f = ManualGenerator("Resource", resource_body)
 | 
						|
f.docstring = lambda: """Convert a string to a resource object.
 | 
						|
 | 
						|
The created resource object is actually just a handle,
 | 
						|
apply AddResource() to write it to a resource file.
 | 
						|
See also the Handle() docstring.
 | 
						|
"""
 | 
						|
functions.append(f)
 | 
						|
 | 
						|
handle_body = """
 | 
						|
char *buf;
 | 
						|
int len;
 | 
						|
Handle h;
 | 
						|
ResourceObject *rv;
 | 
						|
 | 
						|
if (!PyArg_ParseTuple(_args, "s#", &buf, &len))
 | 
						|
	return NULL;
 | 
						|
h = NewHandle(len);
 | 
						|
if ( h == NULL ) {
 | 
						|
	PyErr_NoMemory();
 | 
						|
	return NULL;
 | 
						|
}
 | 
						|
HLock(h);
 | 
						|
memcpy(*h, buf, len);
 | 
						|
HUnlock(h);
 | 
						|
rv = (ResourceObject *)ResObj_New(h);
 | 
						|
rv->ob_freeit = PyMac_AutoDisposeHandle;
 | 
						|
return (PyObject *)rv;
 | 
						|
"""
 | 
						|
 | 
						|
f = ManualGenerator("Handle", handle_body)
 | 
						|
f.docstring = lambda: """Convert a string to a Handle object.
 | 
						|
 | 
						|
Resource() and Handle() are very similar, but objects created with Handle() are
 | 
						|
by default automatically DisposeHandle()d upon object cleanup. Use AutoDispose()
 | 
						|
to change this.
 | 
						|
"""
 | 
						|
functions.append(f)
 | 
						|
 | 
						|
# Convert resources to other things.
 | 
						|
 | 
						|
as_xxx_body = """
 | 
						|
return %sObj_New((%sHandle)_self->ob_itself);
 | 
						|
"""
 | 
						|
 | 
						|
def genresconverter(longname, shortname):
 | 
						|
 | 
						|
	f = ManualGenerator("as_%s"%longname, as_xxx_body%(shortname, longname))
 | 
						|
	docstring =  "Return this resource/handle as a %s"%longname
 | 
						|
	f.docstring = lambda docstring=docstring: docstring
 | 
						|
	return f
 | 
						|
 | 
						|
resmethods.append(genresconverter("Control", "Ctl"))
 | 
						|
resmethods.append(genresconverter("Menu", "Menu"))
 | 
						|
 | 
						|
# The definition of this one is MacLoadResource, so we do it by hand...
 | 
						|
 | 
						|
f = ResMethod(void, 'LoadResource',
 | 
						|
    (Handle, 'theResource', InMode),
 | 
						|
)
 | 
						|
resmethods.append(f)
 | 
						|
 | 
						|
#
 | 
						|
# A method to set the auto-dispose flag
 | 
						|
#
 | 
						|
AutoDispose_body = """
 | 
						|
int onoff, old = 0;
 | 
						|
if (!PyArg_ParseTuple(_args, "i", &onoff))
 | 
						|
	return NULL;
 | 
						|
if ( _self->ob_freeit )
 | 
						|
	old = 1;
 | 
						|
if ( onoff )
 | 
						|
	_self->ob_freeit = PyMac_AutoDisposeHandle;
 | 
						|
else
 | 
						|
	_self->ob_freeit = NULL;
 | 
						|
return Py_BuildValue("i", old);
 | 
						|
"""
 | 
						|
f = ManualGenerator("AutoDispose", AutoDispose_body)
 | 
						|
f.docstring = lambda: "(int)->int. Automatically DisposeHandle the object on Python object cleanup"
 | 
						|
resmethods.append(f)
 |