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 = """ _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; 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)