| ##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) |