mirror of https://github.com/python/cpython.git
Sample extension module: InterSLIP control API.
This commit is contained in:
parent
4ac724946a
commit
1dcbcc3abf
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
** InterslipLib - Routines to talk to InterSLIP. Version 1.1, 31-Oct-1995.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** (c) Jack Jansen, CWI, 1995 <jack@cwi.nl>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Devices.h>
|
||||||
|
|
||||||
|
#include "InterslipLib.h"
|
||||||
|
|
||||||
|
static CntrlParam iopb;
|
||||||
|
static short refnum = -1;
|
||||||
|
|
||||||
|
OSErr is_open()
|
||||||
|
{
|
||||||
|
if ( refnum >= 0 ) return 0;
|
||||||
|
return OpenDriver("\p.InterSLIP", &refnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
OSErr is_connect()
|
||||||
|
{
|
||||||
|
iopb.ioCRefNum = refnum;
|
||||||
|
iopb.ioVRefNum = refnum;
|
||||||
|
iopb.ioCompletion = (UniversalProcPtr) 0;
|
||||||
|
iopb.csCode = 2;
|
||||||
|
return PBControlImmed((ParmBlkPtr)&iopb);
|
||||||
|
}
|
||||||
|
|
||||||
|
OSErr is_disconnect()
|
||||||
|
{
|
||||||
|
iopb.ioCRefNum = refnum;
|
||||||
|
iopb.ioVRefNum = refnum;
|
||||||
|
iopb.ioCompletion = (UniversalProcPtr) 0;
|
||||||
|
iopb.csCode = 3;
|
||||||
|
return PBControlImmed((ParmBlkPtr)&iopb);
|
||||||
|
}
|
||||||
|
|
||||||
|
OSErr is_status(long *status, long *msgseqnum, StringPtr *msg)
|
||||||
|
{
|
||||||
|
long *csp;
|
||||||
|
OSErr err;
|
||||||
|
|
||||||
|
iopb.ioCRefNum = refnum;
|
||||||
|
iopb.ioVRefNum = refnum;
|
||||||
|
iopb.ioCompletion = (UniversalProcPtr) 0;
|
||||||
|
iopb.csCode = 4;
|
||||||
|
if( err = PBControlImmed((ParmBlkPtr)&iopb) )
|
||||||
|
return err;
|
||||||
|
csp = (long *)&iopb.csParam;
|
||||||
|
*status = csp[0];
|
||||||
|
*msgseqnum = csp[1];
|
||||||
|
*msg = (unsigned char *)csp[2];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
OSErr is_getconfig(long *baudrate, long *flags,
|
||||||
|
Str255 idrvnam, Str255 odrvnam, Str255 cfgnam)
|
||||||
|
{
|
||||||
|
long *csp;
|
||||||
|
OSErr err;
|
||||||
|
|
||||||
|
iopb.ioCRefNum = refnum;
|
||||||
|
iopb.ioVRefNum = refnum;
|
||||||
|
iopb.ioCompletion = (UniversalProcPtr) 0;
|
||||||
|
iopb.csCode = 6;
|
||||||
|
csp = (long *)&iopb.csParam;
|
||||||
|
csp[2] = (long)idrvnam;
|
||||||
|
csp[3] = (long)odrvnam;
|
||||||
|
csp[4] = (long)cfgnam;
|
||||||
|
if( err = PBControlImmed((ParmBlkPtr)&iopb) )
|
||||||
|
return err;
|
||||||
|
*baudrate = csp[0];
|
||||||
|
*flags = csp[1];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
OSErr is_setconfig(long baudrate, long flags,
|
||||||
|
Str255 idrvnam, Str255 odrvnam, Str255 cfgnam)
|
||||||
|
{
|
||||||
|
long *csp;
|
||||||
|
OSErr err;
|
||||||
|
|
||||||
|
iopb.ioCRefNum = refnum;
|
||||||
|
iopb.ioVRefNum = refnum;
|
||||||
|
iopb.ioCompletion = (UniversalProcPtr) 0;
|
||||||
|
iopb.csCode = 7;
|
||||||
|
csp = (long *)&iopb.csParam;
|
||||||
|
csp[0] = baudrate;
|
||||||
|
csp[1] = flags;
|
||||||
|
csp[2] = (long)idrvnam;
|
||||||
|
csp[3] = (long)odrvnam;
|
||||||
|
csp[4] = (long)cfgnam;
|
||||||
|
return PBControlImmed((ParmBlkPtr)&iopb);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
** InterSLIP API.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Types.h>
|
||||||
|
|
||||||
|
/* States */
|
||||||
|
#define IS_IDLE 0
|
||||||
|
#define IS_WMODEM 1
|
||||||
|
#define IS_DIAL 2
|
||||||
|
#define IS_LOGIN 3
|
||||||
|
#define IS_RUN 4
|
||||||
|
#define IS_DISC 5
|
||||||
|
|
||||||
|
OSErr is_open(); /* Open InterSLIP driver (optional) */
|
||||||
|
OSErr is_connect();/* Connect */
|
||||||
|
OSErr is_disconnect(); /* Disconnect */
|
||||||
|
OSErr is_status(long *, long *, StringPtr *); /* Get status, msg seq#, msg pointer */
|
||||||
|
OSErr is_getconfig(long *, long *, Str255 , Str255 , Str255 ); /* get config */
|
||||||
|
OSErr is_setconfig(long , long , Str255 , Str255 , Str255 ); /* set config */
|
|
@ -0,0 +1,225 @@
|
||||||
|
/***********************************************************
|
||||||
|
Copyright 1991-1995 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.
|
||||||
|
|
||||||
|
******************************************************************/
|
||||||
|
|
||||||
|
#include "Python.h"
|
||||||
|
#include "InterslipLib.h"
|
||||||
|
#include "macglue.h"
|
||||||
|
|
||||||
|
static PyObject *ErrorObject;
|
||||||
|
|
||||||
|
/* ----------------------------------------------------- */
|
||||||
|
|
||||||
|
static char pyis_open__doc__[] =
|
||||||
|
"Load the interslip driver (optional)"
|
||||||
|
;
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
pyis_open(self, args)
|
||||||
|
PyObject *self; /* Not used */
|
||||||
|
PyObject *args;
|
||||||
|
{
|
||||||
|
OSErr err;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, ""))
|
||||||
|
return NULL;
|
||||||
|
err = is_open();
|
||||||
|
if ( err ) {
|
||||||
|
PyErr_Mac(ErrorObject, err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char pyis_connect__doc__[] =
|
||||||
|
"Tell the driver to start a connect"
|
||||||
|
;
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
pyis_connect(self, args)
|
||||||
|
PyObject *self; /* Not used */
|
||||||
|
PyObject *args;
|
||||||
|
{
|
||||||
|
OSErr err;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, ""))
|
||||||
|
return NULL;
|
||||||
|
err = is_connect();
|
||||||
|
if ( err ) {
|
||||||
|
PyErr_Mac(ErrorObject, err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char pyis_disconnect__doc__[] =
|
||||||
|
"Tell the interslip driver to start a disconnect"
|
||||||
|
;
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
pyis_disconnect(self, args)
|
||||||
|
PyObject *self; /* Not used */
|
||||||
|
PyObject *args;
|
||||||
|
{
|
||||||
|
OSErr err;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, ""))
|
||||||
|
return NULL;
|
||||||
|
err = is_disconnect();
|
||||||
|
if ( err ) {
|
||||||
|
PyErr_Mac(ErrorObject, err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char pyis_status__doc__[] =
|
||||||
|
"Return (numeric_status, message_seqnum, message_string) status tuple"
|
||||||
|
;
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
pyis_status(self, args)
|
||||||
|
PyObject *self; /* Not used */
|
||||||
|
PyObject *args;
|
||||||
|
{
|
||||||
|
long status, seqnum;
|
||||||
|
StringPtr message;
|
||||||
|
OSErr err;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, ""))
|
||||||
|
return NULL;
|
||||||
|
err = is_status(&status, &seqnum, &message);
|
||||||
|
if ( err ) {
|
||||||
|
PyErr_Mac(ErrorObject, err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return Py_BuildValue("iiO&", (int)status, (int)seqnum, PyMac_BuildStr255, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char pyis_getconfig__doc__[] =
|
||||||
|
"Return configuration data (ibaud, obaud, flags, idrvname, odrvname, cfgname)"
|
||||||
|
;
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
pyis_getconfig(self, args)
|
||||||
|
PyObject *self; /* Not used */
|
||||||
|
PyObject *args;
|
||||||
|
{
|
||||||
|
long baudrate, flags;
|
||||||
|
Str255 idrvname, odrvname, cfgname;
|
||||||
|
OSErr err;
|
||||||
|
int ibaud, obaud;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, ""))
|
||||||
|
return NULL;
|
||||||
|
err = is_getconfig(&baudrate, &flags, idrvname, odrvname, cfgname);
|
||||||
|
if ( err ) {
|
||||||
|
PyErr_Mac(ErrorObject, err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ibaud = (baudrate >> 16) & 0xffff;
|
||||||
|
obaud = baudrate & 0xffff;
|
||||||
|
return Py_BuildValue("iiiO&O&O&", ibaud, obaud, (int)flags, PyMac_BuildStr255, idrvname,
|
||||||
|
PyMac_BuildStr255, odrvname, PyMac_BuildStr255, cfgname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char pyis_setconfig__doc__[] =
|
||||||
|
"Set configuration data (ibaud, obaud, flags, idrvname, odrvname, cfgname)"
|
||||||
|
;
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
pyis_setconfig(self, args)
|
||||||
|
PyObject *self; /* Not used */
|
||||||
|
PyObject *args;
|
||||||
|
{
|
||||||
|
long baudrate;
|
||||||
|
int flags;
|
||||||
|
Str255 idrvname, odrvname, cfgname;
|
||||||
|
OSErr err;
|
||||||
|
int ibaud, obaud;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "iiiO&O&O&", &ibaud, &obaud, &flags, PyMac_GetStr255, idrvname,
|
||||||
|
PyMac_GetStr255, odrvname, PyMac_GetStr255, cfgname))
|
||||||
|
return NULL;
|
||||||
|
baudrate = (ibaud << 16) | obaud;
|
||||||
|
err = is_setconfig(baudrate, (long)flags, idrvname, odrvname, cfgname);
|
||||||
|
if ( err ) {
|
||||||
|
PyErr_Mac(ErrorObject, err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* List of methods defined in the module */
|
||||||
|
|
||||||
|
static struct PyMethodDef pyis_methods[] = {
|
||||||
|
{"open", pyis_open, 1, pyis_open__doc__},
|
||||||
|
{"connect", pyis_connect, 1, pyis_connect__doc__},
|
||||||
|
{"disconnect", pyis_disconnect, 1, pyis_disconnect__doc__},
|
||||||
|
{"status", pyis_status, 1, pyis_status__doc__},
|
||||||
|
{"getconfig", pyis_getconfig, 1, pyis_getconfig__doc__},
|
||||||
|
{"setconfig", pyis_setconfig, 1, pyis_setconfig__doc__},
|
||||||
|
|
||||||
|
{NULL, NULL} /* sentinel */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialization function for the module (*must* be called initinterslip) */
|
||||||
|
|
||||||
|
static char interslip_module_documentation[] =
|
||||||
|
""
|
||||||
|
;
|
||||||
|
|
||||||
|
void
|
||||||
|
initinterslip()
|
||||||
|
{
|
||||||
|
PyObject *m, *d;
|
||||||
|
|
||||||
|
/* Create the module and add the functions */
|
||||||
|
m = Py_InitModule4("interslip", pyis_methods,
|
||||||
|
interslip_module_documentation,
|
||||||
|
(PyObject*)NULL,PYTHON_API_VERSION);
|
||||||
|
|
||||||
|
/* Add some symbolic constants to the module */
|
||||||
|
d = PyModule_GetDict(m);
|
||||||
|
ErrorObject = PyString_FromString("interslip.error");
|
||||||
|
PyDict_SetItemString(d, "error", ErrorObject);
|
||||||
|
|
||||||
|
/* XXXX Add constants here */
|
||||||
|
|
||||||
|
PyDict_SetItemString(d, "IDLE", PyInt_FromLong(IS_IDLE));
|
||||||
|
PyDict_SetItemString(d, "WMODEM", PyInt_FromLong(IS_WMODEM));
|
||||||
|
PyDict_SetItemString(d, "DIAL", PyInt_FromLong(IS_DIAL));
|
||||||
|
PyDict_SetItemString(d, "LOGIN", PyInt_FromLong(IS_LOGIN));
|
||||||
|
PyDict_SetItemString(d, "RUN", PyInt_FromLong(IS_RUN));
|
||||||
|
PyDict_SetItemString(d, "DISC", PyInt_FromLong(IS_DISC));
|
||||||
|
|
||||||
|
/* Check for errors */
|
||||||
|
if (PyErr_Occurred())
|
||||||
|
Py_FatalError("can't initialize module interslip");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue