Kaydet (Commit) 5f61a05d authored tarafından Jack Jansen's avatar Jack Jansen

Fixed so the Res.Resource() accepts either another resource, a string

or no argument (giving an empty resource).
üst dd888a6c
...@@ -612,6 +612,48 @@ static PyGetSetDef ResObj_getsetlist[] = { ...@@ -612,6 +612,48 @@ static PyGetSetDef ResObj_getsetlist[] = {
#define ResObj_repr NULL #define ResObj_repr NULL
#define ResObj_hash NULL #define ResObj_hash NULL
static int ResObj_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
{
char *srcdata = NULL;
int srclen = 0;
Handle itself;
char *kw[] = {"itself", 0};
if (PyArg_ParseTupleAndKeywords(args, kwds, "O&", kw, ResObj_Convert, &itself))
{
((ResourceObject *)self)->ob_itself = itself;
return 0;
}
PyErr_Clear();
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|s#", kw, &srcdata, &srclen)) return -1;
if ((itself = NewHandle(srclen)) == NULL)
{
PyErr_NoMemory();
return 0;
}
((ResourceObject *)self)->ob_itself = itself;
if (srclen && srcdata)
{
HLock(itself);
memcpy(*itself, srcdata, srclen);
HUnlock(itself);
}
return 0;
}
#define ResObj_tp_alloc PyType_GenericAlloc
static PyObject *ResObj_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *self;
if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;
((ResourceObject *)self)->ob_itself = NULL;
((ResourceObject *)self)->ob_freeit = NULL;
return self;
}
#define ResObj_tp_free PyObject_Del
PyTypeObject Resource_Type = { PyTypeObject Resource_Type = {
PyObject_HEAD_INIT(NULL) PyObject_HEAD_INIT(NULL)
...@@ -634,19 +676,27 @@ PyTypeObject Resource_Type = { ...@@ -634,19 +676,27 @@ PyTypeObject Resource_Type = {
0, /*tp_str*/ 0, /*tp_str*/
PyObject_GenericGetAttr, /*tp_getattro*/ PyObject_GenericGetAttr, /*tp_getattro*/
PyObject_GenericSetAttr, /*tp_setattro */ PyObject_GenericSetAttr, /*tp_setattro */
0, /*outputHook_tp_as_buffer*/ 0, /*tp_as_buffer*/
0, /*outputHook_tp_flags*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
0, /*outputHook_tp_doc*/ 0, /*tp_doc*/
0, /*outputHook_tp_traverse*/ 0, /*tp_traverse*/
0, /*outputHook_tp_clear*/ 0, /*tp_clear*/
0, /*outputHook_tp_richcompare*/ 0, /*tp_richcompare*/
0, /*outputHook_tp_weaklistoffset*/ 0, /*tp_weaklistoffset*/
0, /*outputHook_tp_iter*/ 0, /*tp_iter*/
0, /*outputHook_tp_iternext*/ 0, /*tp_iternext*/
ResObj_methods, /* tp_methods */ ResObj_methods, /* tp_methods */
0, /*outputHook_tp_members*/ 0, /*tp_members*/
ResObj_getsetlist, /*tp_getset*/ ResObj_getsetlist, /*tp_getset*/
0, /*outputHook_tp_base*/ 0, /*tp_base*/
0, /*tp_dict*/
0, /*tp_descr_get*/
0, /*tp_descr_set*/
0, /*tp_dictoffset*/
ResObj_tp_init, /* tp_init */
ResObj_tp_alloc, /* tp_alloc */
ResObj_tp_new, /* tp_new */
ResObj_tp_free, /* tp_free */
}; };
/* -------------------- End object type Resource -------------------- */ /* -------------------- End object type Resource -------------------- */
...@@ -1694,29 +1744,6 @@ static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) ...@@ -1694,29 +1744,6 @@ static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args)
} }
#endif #endif
static PyObject *Res_Resource(PyObject *_self, PyObject *_args)
{
PyObject *_res = NULL;
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;
}
static PyObject *Res_Handle(PyObject *_self, PyObject *_args) static PyObject *Res_Handle(PyObject *_self, PyObject *_args)
{ {
PyObject *_res = NULL; PyObject *_res = NULL;
...@@ -1871,8 +1898,6 @@ static PyMethodDef Res_methods[] = { ...@@ -1871,8 +1898,6 @@ static PyMethodDef Res_methods[] = {
{"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1,
PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")},
#endif #endif
{"Resource", (PyCFunction)Res_Resource, 1,
PyDoc_STR("Convert a string to a resource object.\n\nThe created resource object is actually just a handle,\napply AddResource() to write it to a resource file.\nSee also the Handle() docstring.\n")},
{"Handle", (PyCFunction)Res_Handle, 1, {"Handle", (PyCFunction)Res_Handle, 1,
PyDoc_STR("Convert a string to a Handle object.\n\nResource() and Handle() are very similar, but objects created with Handle() are\nby default automatically DisposeHandle()d upon object cleanup. Use AutoDispose()\nto change this.\n")}, PyDoc_STR("Convert a string to a Handle object.\n\nResource() and Handle() are very similar, but objects created with Handle() are\nby default automatically DisposeHandle()d upon object cleanup. Use AutoDispose()\nto change this.\n")},
{NULL, NULL, 0} {NULL, NULL, 0}
...@@ -1937,8 +1962,10 @@ void init_Res(void) ...@@ -1937,8 +1962,10 @@ void init_Res(void)
return; return;
Resource_Type.ob_type = &PyType_Type; Resource_Type.ob_type = &PyType_Type;
Py_INCREF(&Resource_Type); Py_INCREF(&Resource_Type);
if (PyDict_SetItemString(d, "ResourceType", (PyObject *)&Resource_Type) != 0) PyModule_AddObject(m, "Resource", (PyObject *)&Resource_Type);
Py_FatalError("can't initialize ResourceType"); /* Backward-compatible name */
Py_INCREF(&Resource_Type);
PyModule_AddObject(m, "ResourceType", (PyObject *)&Resource_Type);
} }
/* ======================== End module _Res ========================= */ /* ======================== End module _Res ========================= */
......
resource_body = """ ##resource_body = """
char *buf; ##char *buf;
int len; ##int len;
Handle h; ##Handle h;
##
if (!PyArg_ParseTuple(_args, "s#", &buf, &len)) ##if (!PyArg_ParseTuple(_args, "s#", &buf, &len))
return NULL; ## return NULL;
h = NewHandle(len); ##h = NewHandle(len);
if ( h == NULL ) { ##if ( h == NULL ) {
PyErr_NoMemory(); ## PyErr_NoMemory();
return NULL; ## return NULL;
} ##}
HLock(h); ##HLock(h);
memcpy(*h, buf, len); ##memcpy(*h, buf, len);
HUnlock(h); ##HUnlock(h);
_res = ResObj_New(h); ##_res = ResObj_New(h);
return _res; ##return _res;
""" ##"""
##
f = ManualGenerator("Resource", resource_body) ##f = ManualGenerator("Resource", resource_body)
f.docstring = lambda: """Convert a string to a resource object. ##f.docstring = lambda: """Convert a string to a resource object.
##
The created resource object is actually just a handle, ##The created resource object is actually just a handle,
apply AddResource() to write it to a resource file. ##apply AddResource() to write it to a resource file.
See also the Handle() docstring. ##See also the Handle() docstring.
""" ##"""
functions.append(f) ##functions.append(f)
handle_body = """ handle_body = """
char *buf; char *buf;
......
...@@ -100,7 +100,7 @@ initstuff = initstuff + """ ...@@ -100,7 +100,7 @@ initstuff = initstuff + """
module = MacModule('_Res', 'Res', includestuff, finalstuff, initstuff) module = MacModule('_Res', 'Res', includestuff, finalstuff, initstuff)
class ResDefinition(PEP252Mixin, GlobalObjectDefinition): class ResDefinition(PEP253Mixin, GlobalObjectDefinition):
getsetlist = [ getsetlist = [
('data', ('data',
""" """
...@@ -176,6 +176,42 @@ class ResDefinition(PEP252Mixin, GlobalObjectDefinition): ...@@ -176,6 +176,42 @@ class ResDefinition(PEP252Mixin, GlobalObjectDefinition):
OutRbrace() OutRbrace()
Output("self->ob_itself = NULL;") Output("self->ob_itself = NULL;")
def output_tp_newBody(self):
Output("PyObject *self;")
Output
Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
Output("((%s *)self)->ob_itself = NULL;", self.objecttype)
Output("((%s *)self)->ob_freeit = NULL;", self.objecttype)
Output("return self;")
def output_tp_initBody(self):
Output("char *srcdata = NULL;")
Output("int srclen = 0;")
Output("%s itself;", self.itselftype);
Output("char *kw[] = {\"itself\", 0};")
Output()
Output("if (PyArg_ParseTupleAndKeywords(args, kwds, \"O&\", kw, %s_Convert, &itself))",
self.prefix);
OutLbrace()
Output("((%s *)self)->ob_itself = itself;", self.objecttype)
Output("return 0;")
OutRbrace()
Output("PyErr_Clear();")
Output("if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|s#\", kw, &srcdata, &srclen)) return -1;")
Output("if ((itself = NewHandle(srclen)) == NULL)")
OutLbrace()
Output("PyErr_NoMemory();")
Output("return 0;")
OutRbrace()
Output("((%s *)self)->ob_itself = itself;", self.objecttype)
# XXXX Output("((%s *)self)->ob_freeit = PyMac_AutoDisposeHandle;")
Output("if (srclen && srcdata)")
OutLbrace()
Output("HLock(itself);")
Output("memcpy(*itself, srcdata, srclen);")
Output("HUnlock(itself);")
OutRbrace()
Output("return 0;")
resobject = ResDefinition('Resource', 'ResObj', 'Handle') resobject = ResDefinition('Resource', 'ResObj', 'Handle')
module.addobject(resobject) module.addobject(resobject)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment