mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	- Changed FragLoader.h to CodeFragments.h - Removed Desk.h - Regenerated bgen modules from new universal headers - Changed some of the s# in PyArg_ParseTuple to m# (unfortunately: this should have been a different commit)
		
			
				
	
	
		
			585 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			585 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/***********************************************************
 | 
						|
Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam,
 | 
						|
The Netherlands.
 | 
						|
 | 
						|
                        All Rights Reserved
 | 
						|
 | 
						|
Permission to use, copy, modify, and distribute this software and its 
 | 
						|
documentation for any purpose and without fee is hereby granted, 
 | 
						|
provided that the above copyright notice appear in all copies and that
 | 
						|
both that copyright notice and this permission notice appear in 
 | 
						|
supporting documentation, and that the names of Stichting Mathematisch
 | 
						|
Centrum or CWI not be used in advertising or publicity pertaining to
 | 
						|
distribution of the software without specific, written prior permission.
 | 
						|
 | 
						|
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
 | 
						|
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 | 
						|
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
 | 
						|
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
						|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 | 
						|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 | 
						|
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
						|
 | 
						|
******************************************************************/
 | 
						|
 | 
						|
/* Note: This file is partially converted to the new naming standard */
 | 
						|
/* ctbcm objects */
 | 
						|
 | 
						|
 | 
						|
#include "Python.h"
 | 
						|
 | 
						|
#include "macglue.h"
 | 
						|
 | 
						|
#include <CommResources.h>
 | 
						|
#include <Connections.h>
 | 
						|
#include <ToolUtils.h>
 | 
						|
#include <OSUtils.h>
 | 
						|
 | 
						|
#ifndef HAVE_UNIVERSAL_HEADERS
 | 
						|
#define ConnectionCompletionUPP ProcPtr
 | 
						|
#define ConnectionChooseIdleUPP ProcPtr
 | 
						|
#define NewConnectionCompletionProc(x) (x)
 | 
						|
#define NewConnectionChooseIdleProc(x) (x)
 | 
						|
#endif
 | 
						|
 | 
						|
#define 	_UnimplementedToolTrap	0xA89F
 | 
						|
#define 	_CommToolboxTrap		0x8B
 | 
						|
#define 	_UnimplementedOSTrap	0x9F
 | 
						|
 | 
						|
extern PyObject *PyErr_Mac(PyObject *,int);
 | 
						|
 | 
						|
static PyObject *ErrorObject;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	PyObject_HEAD
 | 
						|
	ConnHandle hdl;		/* The handle to the connection */
 | 
						|
	PyObject *callback;	/* Python callback routine */
 | 
						|
	int has_callback;	/* True if callback not None */
 | 
						|
	int err;			/* Error to pass to the callback */
 | 
						|
} ctbcmobject;
 | 
						|
 | 
						|
staticforward PyTypeObject ctbcmtype;
 | 
						|
 | 
						|
#define is_ctbcmobject(v)		((v)->ob_type == &ctbcmtype)
 | 
						|
 | 
						|
static
 | 
						|
TrapAvailable(short tNumber, TrapType tType)
 | 
						|
{
 | 
						|
	short unImplemented;
 | 
						|
	
 | 
						|
	if (tType == OSTrap)
 | 
						|
		unImplemented = _UnimplementedOSTrap;
 | 
						|
	else
 | 
						|
		unImplemented = _UnimplementedToolTrap;
 | 
						|
 | 
						|
	return NGetTrapAddress(tNumber, tType) != NGetTrapAddress(unImplemented, tType);
 | 
						|
}
 | 
						|
 | 
						|
static
 | 
						|
initialize_ctb()
 | 
						|
{
 | 
						|
	OSErr err;
 | 
						|
	static initialized = -1;
 | 
						|
	
 | 
						|
	if ( initialized >= 0 )
 | 
						|
		return initialized;
 | 
						|
	initialized = 0;
 | 
						|
	
 | 
						|
	if ( !TrapAvailable(_CommToolboxTrap, OSTrap) ) {
 | 
						|
		PyErr_SetString(ErrorObject, "CTB not available");
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
	if ( (err=InitCTBUtilities()) ) {
 | 
						|
		PyErr_Mac(ErrorObject, (int)err);
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
	if ( (err=InitCRM()) ) {
 | 
						|
		PyErr_Mac(ErrorObject, (int)err);
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
	if ( (err=InitCM()) ) {
 | 
						|
		PyErr_Mac(ErrorObject, (int)err);
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
	initialized = 1;
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
ctbcm_pycallback(arg)
 | 
						|
	void *arg;
 | 
						|
{
 | 
						|
	ctbcmobject *self = (ctbcmobject *)arg;
 | 
						|
	PyObject *args, *rv;
 | 
						|
	
 | 
						|
	if ( !self->has_callback )    /* It could have been removed in the meantime */
 | 
						|
		return 0;
 | 
						|
	args = Py_BuildValue("(i)", self->err);
 | 
						|
	rv = PyEval_CallObject(self->callback, args);
 | 
						|
	Py_DECREF(args);
 | 
						|
	if( rv == NULL )
 | 
						|
		return -1;
 | 
						|
	Py_DECREF(rv);
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
/*DBG*/int ncallback;
 | 
						|
static pascal void
 | 
						|
ctbcm_ctbcallback(hconn)
 | 
						|
	ConnHandle hconn;
 | 
						|
{
 | 
						|
	ctbcmobject *self;
 | 
						|
	
 | 
						|
	/* XXXX Do I have to do the A5 mumbo-jumbo? */
 | 
						|
	ncallback++; /*DBG*/
 | 
						|
	self = (ctbcmobject *)CMGetUserData(hconn);
 | 
						|
	self->err = (int)((*hconn)->errCode);
 | 
						|
	Py_AddPendingCall(ctbcm_pycallback, (void *)self);
 | 
						|
}
 | 
						|
 | 
						|
static ctbcmobject *
 | 
						|
newctbcmobject(arg)
 | 
						|
	PyObject *arg;
 | 
						|
{
 | 
						|
	ctbcmobject *self;
 | 
						|
	self = PyObject_NEW(ctbcmobject, &ctbcmtype);
 | 
						|
	if (self == NULL)
 | 
						|
		return NULL;
 | 
						|
	self->hdl = NULL;
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	self->callback = Py_None;
 | 
						|
	self->has_callback = 0;
 | 
						|
	return self;
 | 
						|
}
 | 
						|
 | 
						|
/* ctbcm methods */
 | 
						|
 | 
						|
static void
 | 
						|
ctbcm_dealloc(self)
 | 
						|
	ctbcmobject *self;
 | 
						|
{
 | 
						|
	if ( self->hdl ) {
 | 
						|
		(void)CMClose(self->hdl, 0, (ConnectionCompletionUPP)0, 0, 1);
 | 
						|
		/*XXXX Is this safe? */
 | 
						|
		CMDispose(self->hdl);
 | 
						|
		self->hdl = NULL;
 | 
						|
	}
 | 
						|
	PyMem_DEL(self);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_open(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	long timeout;
 | 
						|
	OSErr err;
 | 
						|
	ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback);
 | 
						|
	
 | 
						|
	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);
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_listen(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	long timeout;
 | 
						|
	OSErr err;
 | 
						|
	ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback);
 | 
						|
	
 | 
						|
	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);
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_accept(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	int accept;
 | 
						|
	OSErr err;
 | 
						|
	
 | 
						|
	if (!PyArg_Parse(args, "i", &accept))
 | 
						|
		return NULL;
 | 
						|
	if ( (err=CMAccept(self->hdl, accept)) < 0)
 | 
						|
		return PyErr_Mac(ErrorObject, (int)err);
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_close(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	int now;
 | 
						|
	long timeout;
 | 
						|
	OSErr err;
 | 
						|
	ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback);
 | 
						|
	
 | 
						|
	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);
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_read(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	long timeout, len;
 | 
						|
	int chan;
 | 
						|
	CMFlags flags;
 | 
						|
	OSErr err;
 | 
						|
	PyObject *rv;
 | 
						|
	ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback);
 | 
						|
	
 | 
						|
	if (!PyArg_Parse(args, "(lil)", &len, &chan, &timeout))
 | 
						|
		return NULL;
 | 
						|
	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);
 | 
						|
	_PyString_Resize(&rv, len);
 | 
						|
	return Py_BuildValue("(Oi)", rv, (int)flags);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_write(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	long timeout, len;
 | 
						|
	int chan, ilen, flags;
 | 
						|
	OSErr err;
 | 
						|
	char *buf;
 | 
						|
	ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback);
 | 
						|
	
 | 
						|
	if (!PyArg_Parse(args, "(m#ili)", &buf, &ilen, &chan, &timeout, &flags))
 | 
						|
		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);
 | 
						|
	return PyInt_FromLong((int)len);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_status(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	CMBufferSizes sizes;
 | 
						|
	CMStatFlags flags;
 | 
						|
	OSErr err;
 | 
						|
	PyObject *rv;
 | 
						|
	
 | 
						|
	if (!PyArg_NoArgs(args))
 | 
						|
		return NULL;
 | 
						|
	if ((err=CMStatus(self->hdl, sizes, &flags)) < 0)
 | 
						|
		return PyErr_Mac(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);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_getconfig(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	char *rv;
 | 
						|
 | 
						|
	if (!PyArg_NoArgs(args))
 | 
						|
		return NULL;
 | 
						|
	if ((rv=(char *)CMGetConfig(self->hdl)) == NULL ) {
 | 
						|
		PyErr_SetString(ErrorObject, "CMGetConfig failed");
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
	return PyString_FromString(rv);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_setconfig(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	char *cfg;
 | 
						|
	OSErr err;
 | 
						|
	
 | 
						|
	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);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_choose(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	int rv;
 | 
						|
	Point pt;
 | 
						|
 | 
						|
	if (!PyArg_NoArgs(args))
 | 
						|
		return NULL;
 | 
						|
	pt.v = 40;
 | 
						|
	pt.h = 40;
 | 
						|
	rv=CMChoose(&self->hdl, pt, (ConnectionChooseIdleUPP)0);
 | 
						|
	return PyInt_FromLong(rv);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_idle(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	if (!PyArg_NoArgs(args))
 | 
						|
		return NULL;
 | 
						|
	CMIdle(self->hdl);
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_abort(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	if (!PyArg_NoArgs(args))
 | 
						|
		return NULL;
 | 
						|
	CMAbort(self->hdl);
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_reset(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	if (!PyArg_NoArgs(args))
 | 
						|
		return NULL;
 | 
						|
	CMReset(self->hdl);
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_break(self, args)
 | 
						|
	ctbcmobject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	long duration;
 | 
						|
	ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback);
 | 
						|
	
 | 
						|
	if (!PyArg_Parse(args, "l", &duration))
 | 
						|
		return NULL;
 | 
						|
	CMBreak(self->hdl, duration,self->has_callback, cb_upp);
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
static struct PyMethodDef ctbcm_methods[] = {
 | 
						|
	{"Open",		(PyCFunction)ctbcm_open},
 | 
						|
	{"Close",		(PyCFunction)ctbcm_close},
 | 
						|
	{"Read",		(PyCFunction)ctbcm_read},
 | 
						|
	{"Write",		(PyCFunction)ctbcm_write},
 | 
						|
	{"Status",		(PyCFunction)ctbcm_status},
 | 
						|
	{"GetConfig",	(PyCFunction)ctbcm_getconfig},
 | 
						|
	{"SetConfig",	(PyCFunction)ctbcm_setconfig},
 | 
						|
	{"Choose",		(PyCFunction)ctbcm_choose},
 | 
						|
	{"Idle",		(PyCFunction)ctbcm_idle},
 | 
						|
	{"Listen",		(PyCFunction)ctbcm_listen},
 | 
						|
	{"Accept",		(PyCFunction)ctbcm_accept},
 | 
						|
	{"Abort",		(PyCFunction)ctbcm_abort},
 | 
						|
	{"Reset",		(PyCFunction)ctbcm_reset},
 | 
						|
	{"Break",		(PyCFunction)ctbcm_break},
 | 
						|
	{NULL,		NULL}		/* sentinel */
 | 
						|
};
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctbcm_getattr(self, name)
 | 
						|
	ctbcmobject *self;
 | 
						|
	char *name;
 | 
						|
{
 | 
						|
	if ( strcmp(name, "callback") == 0 ) {
 | 
						|
		Py_INCREF(self->callback);
 | 
						|
		return self->callback;
 | 
						|
	}
 | 
						|
	return Py_FindMethod(ctbcm_methods, (PyObject *)self, name);
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
ctbcm_setattr(self, name, v)
 | 
						|
	ctbcmobject *self;
 | 
						|
	char *name;
 | 
						|
	PyObject *v;
 | 
						|
{
 | 
						|
	if ( strcmp(name, "callback") != 0 ) {
 | 
						|
		PyErr_SetString(PyExc_AttributeError, "ctbcm objects have callback attr only");
 | 
						|
		return -1;
 | 
						|
	}
 | 
						|
	if ( v == NULL ) {
 | 
						|
		v = Py_None;
 | 
						|
	}
 | 
						|
	Py_INCREF(v);	/* XXXX Must I do this? */
 | 
						|
	self->callback = v;
 | 
						|
	self->has_callback = (v != Py_None);
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
statichere PyTypeObject ctbcmtype = {
 | 
						|
	PyObject_HEAD_INIT(&PyType_Type)
 | 
						|
	0,			/*ob_size*/
 | 
						|
	"ctbcm",			/*tp_name*/
 | 
						|
	sizeof(ctbcmobject),	/*tp_basicsize*/
 | 
						|
	0,			/*tp_itemsize*/
 | 
						|
	/* methods */
 | 
						|
	(destructor)ctbcm_dealloc, /*tp_dealloc*/
 | 
						|
	0,			/*tp_print*/
 | 
						|
	(getattrfunc)ctbcm_getattr, /*tp_getattr*/
 | 
						|
	(setattrfunc)ctbcm_setattr, /*tp_setattr*/
 | 
						|
	0,			/*tp_compare*/
 | 
						|
	0,			/*tp_repr*/
 | 
						|
	0,			/*tp_as_number*/
 | 
						|
	0,			/*tp_as_sequence*/
 | 
						|
	0,			/*tp_as_mapping*/
 | 
						|
	0,			/*tp_hash*/
 | 
						|
};
 | 
						|
/* --------------------------------------------------------------------- */
 | 
						|
 | 
						|
/* Function of no arguments returning new ctbcm object */
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctb_cmnew(self, args)
 | 
						|
	PyObject *self; /* Not used */
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	int strlen;
 | 
						|
	PyObject *sizes_obj;
 | 
						|
	char *c_str;
 | 
						|
	unsigned char p_str[255];
 | 
						|
	CMBufferSizes sizes;
 | 
						|
	short procid;
 | 
						|
	ConnHandle hdl;
 | 
						|
	ctbcmobject *rv;
 | 
						|
	
 | 
						|
	if (!PyArg_Parse(args, "(s#O)", &c_str, &strlen, &sizes_obj))
 | 
						|
		return NULL;
 | 
						|
	strncpy((char *)p_str+1, c_str, strlen);
 | 
						|
	p_str[0] = strlen;
 | 
						|
	if (!initialize_ctb())
 | 
						|
		return NULL;
 | 
						|
	if ( sizes_obj == Py_None ) {
 | 
						|
		memset(sizes, '\0', sizeof sizes);
 | 
						|
	} else {
 | 
						|
		if ( !PyArg_Parse(sizes_obj, "(llllll)", &sizes[0], &sizes[1], &sizes[2],
 | 
						|
						&sizes[3], &sizes[4], &sizes[5]))
 | 
						|
			return NULL;
 | 
						|
	}
 | 
						|
	if ( (procid=CMGetProcID(p_str)) < 0 )
 | 
						|
		return PyErr_Mac(ErrorObject, procid);
 | 
						|
	hdl = CMNew(procid, cmNoMenus|cmQuiet, sizes, 0, 0);
 | 
						|
	if ( hdl == NULL ) {
 | 
						|
		PyErr_SetString(ErrorObject, "CMNew failed");
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
	rv = newctbcmobject(args);
 | 
						|
	if ( rv == NULL )
 | 
						|
	    return NULL;   /* XXXX Should dispose of hdl */
 | 
						|
	rv->hdl = hdl;
 | 
						|
	CMSetUserData(hdl, (long)rv);
 | 
						|
	return (PyObject *)rv;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
ctb_available(self, args)
 | 
						|
	PyObject *self;
 | 
						|
	PyObject *args;
 | 
						|
{
 | 
						|
	int ok;
 | 
						|
	
 | 
						|
	if (!PyArg_NoArgs(args))
 | 
						|
		return NULL;
 | 
						|
	ok = initialize_ctb();
 | 
						|
	PyErr_Clear();
 | 
						|
	return PyInt_FromLong(ok);
 | 
						|
}
 | 
						|
 | 
						|
/* List of functions defined in the module */
 | 
						|
 | 
						|
static struct PyMethodDef ctb_methods[] = {
 | 
						|
	{"CMNew",		ctb_cmnew},
 | 
						|
	{"available",	ctb_available},
 | 
						|
	{NULL,		NULL}		/* sentinel */
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* Initialization function for the module (*must* be called initctb) */
 | 
						|
 | 
						|
void
 | 
						|
initctb()
 | 
						|
{
 | 
						|
	PyObject *m, *d, *o;
 | 
						|
 | 
						|
	/* Create the module and add the functions */
 | 
						|
	m = Py_InitModule("ctb", ctb_methods);
 | 
						|
 | 
						|
	/* Add some symbolic constants to the module */
 | 
						|
	d = PyModule_GetDict(m);
 | 
						|
	
 | 
						|
#define CMCONST(name, value) o = PyInt_FromLong(value); PyDict_SetItemString(d, name, o)
 | 
						|
 | 
						|
	CMCONST("cmData", 1);
 | 
						|
	CMCONST("cmCntl", 2);
 | 
						|
	CMCONST("cmAttn", 3);
 | 
						|
	
 | 
						|
	CMCONST("cmFlagsEOM", 1);
 | 
						|
	
 | 
						|
	CMCONST("chooseDisaster", -2);
 | 
						|
	CMCONST("chooseFailed", -1);
 | 
						|
	CMCONST("chooseAborted", 0);
 | 
						|
	CMCONST("chooseOKMinor", 1);
 | 
						|
	CMCONST("chooseOKMajor", 2);
 | 
						|
	CMCONST("chooseCancel", 3);
 | 
						|
	
 | 
						|
	CMCONST("cmStatusOpening", 1);
 | 
						|
	CMCONST("cmStatusOpen", 2);
 | 
						|
	CMCONST("cmStatusClosing", 4);
 | 
						|
	CMCONST("cmStatusDataAvail", 8);
 | 
						|
	CMCONST("cmStatusCntlAvail", 0x10);
 | 
						|
	CMCONST("cmStatusAttnAvail", 0x20);
 | 
						|
	CMCONST("cmStatusDRPend", 0x40);
 | 
						|
	CMCONST("cmStatusDWPend", 0x80);
 | 
						|
	CMCONST("cmStatusCWPend", 0x100);
 | 
						|
	CMCONST("cmStatusCWPend", 0x200);
 | 
						|
	CMCONST("cmStatusARPend", 0x400);
 | 
						|
	CMCONST("cmStatusAWPend", 0x800);
 | 
						|
	CMCONST("cmStatusBreakPending", 0x1000);
 | 
						|
	CMCONST("cmStatusListenPend", 0x2000);
 | 
						|
	CMCONST("cmStatusIncomingCallPresent", 0x4000);
 | 
						|
	
 | 
						|
	ErrorObject = PyString_FromString("ctb.error");
 | 
						|
	PyDict_SetItemString(d, "error", ErrorObject);
 | 
						|
 | 
						|
	/* Check for errors */
 | 
						|
	if (PyErr_Occurred())
 | 
						|
		Py_FatalError("can't initialize module ctb");
 | 
						|
}
 |