##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); ##_res = ResObj_New(h); ##return _res; ##""" ## ##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; _res = (PyObject *)rv; return _res; """ 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 = """ _res = %sObj_New((%sHandle)_self->ob_itself); return _res; """ 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; _res = Py_BuildValue("i", old); return _res; """ f = ManualGenerator("AutoDispose", AutoDispose_body) f.docstring = lambda: "(int)->int. Automatically DisposeHandle the object on Python object cleanup" resmethods.append(f)