diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 1997-04-03 14:48:04 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 1997-04-03 14:48:04 (GMT) |
commit | 377df98005862e587939b42f135bd653130e7913 (patch) | |
tree | ee872331bfc177f506b9f672caf0cd93daa4e63f | |
parent | cb2554effaf91d357ebbd7e3980b6f53ae66832e (diff) | |
download | cpython-377df98005862e587939b42f135bd653130e7913.zip cpython-377df98005862e587939b42f135bd653130e7913.tar.gz cpython-377df98005862e587939b42f135bd653130e7913.tar.bz2 |
- Most errors are *not* OSErr style, so raise better exceptions (with
textual messages)
- Plugged a memory leak or two
-rw-r--r-- | Mac/Modules/ctbmodule.c | 84 |
1 files changed, 57 insertions, 27 deletions
diff --git a/Mac/Modules/ctbmodule.c b/Mac/Modules/ctbmodule.c index 2c58019..6f0923b 100644 --- a/Mac/Modules/ctbmodule.c +++ b/Mac/Modules/ctbmodule.c @@ -46,8 +46,35 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define _CommToolboxTrap 0x8B #define _UnimplementedOSTrap 0x9F +static char *errornames[] = { + "No Error", + "Rejected", /* 1 */ + "Failed", /* 2 */ + "Timeout", /* 3 */ + "Not Open", /* 4 */ + "Not Closed", /* 5 */ + "No Request Pending", /* 6 */ + "Not Supported", /* 7 */ + "No Tools", /* 8 */ + "User Cancel", /* 9 */ + "Error 10", /* 10 */ + "Unknown Error", /* 11 */ +#define MAX_POS_ERROR 11 +}; + extern PyObject *PyErr_Mac(PyObject *,int); +static PyObject * +PyCtb_Error(PyObject *errobj, int errcode) +{ + if ( errcode > 0 && errcode <= MAX_POS_ERROR ) { + PyErr_SetString(errobj, errornames[errcode]); + return NULL; + } else { + return PyErr_Mac(errobj, errcode); + } +} + static PyObject *ErrorObject; typedef struct { @@ -90,15 +117,15 @@ initialize_ctb() return 0; } if ( (err=InitCTBUtilities()) ) { - PyErr_Mac(ErrorObject, (int)err); + PyCtb_Error(ErrorObject, (int)err); return 0; } if ( (err=InitCRM()) ) { - PyErr_Mac(ErrorObject, (int)err); + PyCtb_Error(ErrorObject, (int)err); return 0; } if ( (err=InitCM()) ) { - PyErr_Mac(ErrorObject, (int)err); + PyCtb_Error(ErrorObject, (int)err); return 0; } initialized = 1; @@ -178,8 +205,8 @@ ctbcm_open(self, args) if (!PyArg_Parse(args, "l", &timeout)) return NULL; - if ( (err=CMOpen(self->hdl, self->has_callback, cb_upp, timeout)) < 0) - return PyErr_Mac(ErrorObject, (int)err); + if ( (err=CMOpen(self->hdl, self->has_callback, cb_upp, timeout)) != 0) + return PyCtb_Error(ErrorObject, (int)err); Py_INCREF(Py_None); return Py_None; } @@ -195,8 +222,8 @@ ctbcm_listen(self, args) if (!PyArg_Parse(args, "l", &timeout)) return NULL; - if ( (err=CMListen(self->hdl,self->has_callback, cb_upp, timeout)) < 0) - return PyErr_Mac(ErrorObject, (int)err); + if ( (err=CMListen(self->hdl,self->has_callback, cb_upp, timeout)) != 0) + return PyCtb_Error(ErrorObject, (int)err); Py_INCREF(Py_None); return Py_None; } @@ -211,8 +238,8 @@ ctbcm_accept(self, args) if (!PyArg_Parse(args, "i", &accept)) return NULL; - if ( (err=CMAccept(self->hdl, accept)) < 0) - return PyErr_Mac(ErrorObject, (int)err); + if ( (err=CMAccept(self->hdl, accept)) != 0) + return PyCtb_Error(ErrorObject, (int)err); Py_INCREF(Py_None); return Py_None; } @@ -229,8 +256,8 @@ ctbcm_close(self, args) if (!PyArg_Parse(args, "(li)", &timeout, &now)) return NULL; - if ( (err=CMClose(self->hdl, self->has_callback, cb_upp, timeout, now)) < 0) - return PyErr_Mac(ErrorObject, (int)err); + if ( (err=CMClose(self->hdl, self->has_callback, cb_upp, timeout, now)) != 0) + return PyCtb_Error(ErrorObject, (int)err); Py_INCREF(Py_None); return Py_None; } @@ -244,7 +271,7 @@ ctbcm_read(self, args) int chan; CMFlags flags; OSErr err; - PyObject *rv; + PyObject *rv, *rrv; ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback); if (!PyArg_Parse(args, "(lil)", &len, &chan, &timeout)) @@ -252,10 +279,12 @@ ctbcm_read(self, args) if ((rv=PyString_FromStringAndSize(NULL, len)) == NULL) return NULL; if ((err=CMRead(self->hdl, (Ptr)PyString_AsString(rv), &len, (CMChannel)chan, - self->has_callback, cb_upp, timeout, &flags)) < 0) - return PyErr_Mac(ErrorObject, (int)err); + self->has_callback, cb_upp, timeout, &flags)) != 0 && err != cmTimeOut) + return PyCtb_Error(ErrorObject, (int)err); _PyString_Resize(&rv, len); - return Py_BuildValue("(Oi)", rv, (int)flags); + rrv = Py_BuildValue("(Oi)", rv, (int)flags); + Py_DECREF(rv); + return rrv; } static PyObject * @@ -273,8 +302,8 @@ ctbcm_write(self, args) return NULL; len = ilen; if ((err=CMWrite(self->hdl, (Ptr)buf, &len, (CMChannel)chan, - self->has_callback, cb_upp, timeout, (CMFlags)flags)) < 0) - return PyErr_Mac(ErrorObject, (int)err); + self->has_callback, cb_upp, timeout, (CMFlags)flags)) != 0 && err != cmTimeOut) + return PyCtb_Error(ErrorObject, (int)err); return PyInt_FromLong((int)len); } @@ -286,16 +315,18 @@ ctbcm_status(self, args) CMBufferSizes sizes; CMStatFlags flags; OSErr err; - PyObject *rv; + PyObject *rv, *rrv; if (!PyArg_NoArgs(args)) return NULL; - if ((err=CMStatus(self->hdl, sizes, &flags)) < 0) - return PyErr_Mac(ErrorObject, (int)err); + if ((err=CMStatus(self->hdl, sizes, &flags)) != 0) + return PyCtb_Error(ErrorObject, (int)err); rv = Py_BuildValue("(llllll)", sizes[0], sizes[1], sizes[2], sizes[3], sizes[4], sizes[5]); if ( rv == NULL ) return NULL; - return Py_BuildValue("(Ol)", rv, (long)flags); + rrv = Py_BuildValue("(Ol)", rv, (long)flags); + Py_DECREF(rv); + return rrv; } static PyObject * @@ -320,13 +351,12 @@ ctbcm_setconfig(self, args) PyObject *args; { char *cfg; - OSErr err; + short rv; if (!PyArg_Parse(args, "s", &cfg)) return NULL; - if ((err=CMSetConfig(self->hdl, (Ptr)cfg)) < 0) - return PyErr_Mac(ErrorObject, err); - return PyInt_FromLong((int)err); + rv=CMSetConfig(self->hdl, (Ptr)cfg); + return PyInt_FromLong((long)rv); } static PyObject * @@ -439,7 +469,7 @@ ctbcm_setattr(self, name, v) if ( v == NULL ) { v = Py_None; } - Py_INCREF(v); /* XXXX Must I do this? */ + Py_INCREF(v); self->callback = v; self->has_callback = (v != Py_None); return 0; @@ -495,7 +525,7 @@ ctb_cmnew(self, args) return NULL; } if ( (procid=CMGetProcID(p_str)) < 0 ) - return PyErr_Mac(ErrorObject, procid); + return PyCtb_Error(ErrorObject, procid); hdl = CMNew(procid, cmNoMenus|cmQuiet, sizes, 0, 0); if ( hdl == NULL ) { PyErr_SetString(ErrorObject, "CMNew failed"); |