1 /***********************************************************
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI not be used in advertising or publicity pertaining to
13 distribution of the software without specific, written prior permission.
15 STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18 FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 ******************************************************************/
25 /* Note: This file is partially converted to the new naming standard */
29 #include "allobjects.h"
33 #include <CommResources.h>
34 #include <Connections.h>
35 #include <ToolUtils.h>
38 #ifndef HAVE_UNIVERSAL_HEADERS
39 #define ConnectionCompletionUPP ProcPtr
40 #define ConnectionChooseIdleUPP ProcPtr
41 #define NewConnectionCompletionProc(x) (x)
42 #define NewConnectionChooseIdleProc(x) (x)
45 #define _UnimplementedToolTrap 0xA89F
46 #define _CommToolboxTrap 0x8B
47 #define _UnimplementedOSTrap 0x9F
49 extern object
*PyErr_Mac(object
*,int);
51 static object
*ErrorObject
;
55 ConnHandle hdl
; /* The handle to the connection */
56 object
*callback
; /* Python callback routine */
57 int has_callback
; /* True if callback not None */
58 int err
; /* Error to pass to the callback */
61 staticforward typeobject ctbcmtype
;
63 #define is_ctbcmobject(v) ((v)->ob_type == &ctbcmtype)
66 TrapAvailable(short tNumber
, TrapType tType
)
71 unImplemented
= _UnimplementedOSTrap
;
73 unImplemented
= _UnimplementedToolTrap
;
75 return NGetTrapAddress(tNumber
, tType
) != NGetTrapAddress(unImplemented
, tType
);
82 static initialized
= -1;
84 if ( initialized
>= 0 )
88 if ( !TrapAvailable(_CommToolboxTrap
, OSTrap
) ) {
89 err_setstr(ErrorObject
, "CTB not available");
92 if ( (err
=InitCTBUtilities()) ) {
93 PyErr_Mac(ErrorObject
, (int)err
);
96 if ( (err
=InitCRM()) ) {
97 PyErr_Mac(ErrorObject
, (int)err
);
100 if ( (err
=InitCM()) ) {
101 PyErr_Mac(ErrorObject
, (int)err
);
109 ctbcm_pycallback(arg
)
112 ctbcmobject
*self
= (ctbcmobject
*)arg
;
115 if ( !self
->has_callback
) /* It could have been removed in the meantime */
117 args
= mkvalue("(i)", self
->err
);
118 rv
= call_object(self
->callback
, args
);
126 /*DBG*/int ncallback
;
128 ctbcm_ctbcallback(hconn
)
133 /* XXXX Do I have to do the A5 mumbo-jumbo? */
135 self
= (ctbcmobject
*)CMGetUserData(hconn
);
136 self
->err
= (int)((*hconn
)->errCode
);
137 Py_AddPendingCall(ctbcm_pycallback
, (void *)self
);
145 self
= NEWOBJ(ctbcmobject
, &ctbcmtype
);
150 self
->callback
= None
;
151 self
->has_callback
= 0;
162 (void)CMClose(self
->hdl
, 0, (ConnectionCompletionUPP
)0, 0, 1);
163 /*XXXX Is this safe? */
164 CMDispose(self
->hdl
);
171 ctbcm_open(self
, args
)
177 ConnectionCompletionUPP cb_upp
= NewConnectionCompletionProc(ctbcm_ctbcallback
);
179 if (!getargs(args
, "l", &timeout
))
181 if ( (err
=CMOpen(self
->hdl
, self
->has_callback
, cb_upp
, timeout
)) < 0)
182 return PyErr_Mac(ErrorObject
, (int)err
);
188 ctbcm_listen(self
, args
)
194 ConnectionCompletionUPP cb_upp
= NewConnectionCompletionProc(ctbcm_ctbcallback
);
196 if (!getargs(args
, "l", &timeout
))
198 if ( (err
=CMListen(self
->hdl
,self
->has_callback
, cb_upp
, timeout
)) < 0)
199 return PyErr_Mac(ErrorObject
, (int)err
);
205 ctbcm_accept(self
, args
)
212 if (!getargs(args
, "i", &accept
))
214 if ( (err
=CMAccept(self
->hdl
, accept
)) < 0)
215 return PyErr_Mac(ErrorObject
, (int)err
);
221 ctbcm_close(self
, args
)
228 ConnectionCompletionUPP cb_upp
= NewConnectionCompletionProc(ctbcm_ctbcallback
);
230 if (!getargs(args
, "(li)", &timeout
, &now
))
232 if ( (err
=CMClose(self
->hdl
, self
->has_callback
, cb_upp
, timeout
, now
)) < 0)
233 return PyErr_Mac(ErrorObject
, (int)err
);
239 ctbcm_read(self
, args
)
248 ConnectionCompletionUPP cb_upp
= NewConnectionCompletionProc(ctbcm_ctbcallback
);
250 if (!getargs(args
, "(lil)", &len
, &chan
, &timeout
))
252 if ((rv
=newsizedstringobject(NULL
, len
)) == NULL
)
254 if ((err
=CMRead(self
->hdl
, (Ptr
)getstringvalue(rv
), &len
, (CMChannel
)chan
,
255 self
->has_callback
, cb_upp
, timeout
, &flags
)) < 0)
256 return PyErr_Mac(ErrorObject
, (int)err
);
257 resizestring(&rv
, len
);
258 return mkvalue("(Oi)", rv
, (int)flags
);
262 ctbcm_write(self
, args
)
267 int chan
, ilen
, flags
;
270 ConnectionCompletionUPP cb_upp
= NewConnectionCompletionProc(ctbcm_ctbcallback
);
272 if (!getargs(args
, "(s#ili)", &buf
, &ilen
, &chan
, &timeout
, &flags
))
275 if ((err
=CMWrite(self
->hdl
, (Ptr
)buf
, &len
, (CMChannel
)chan
,
276 self
->has_callback
, cb_upp
, timeout
, (CMFlags
)flags
)) < 0)
277 return PyErr_Mac(ErrorObject
, (int)err
);
278 return newintobject((int)len
);
282 ctbcm_status(self
, args
)
293 if ((err
=CMStatus(self
->hdl
, sizes
, &flags
)) < 0)
294 return PyErr_Mac(ErrorObject
, (int)err
);
295 rv
= mkvalue("(llllll)", sizes
[0], sizes
[1], sizes
[2], sizes
[3], sizes
[4], sizes
[5]);
298 return mkvalue("(Ol)", rv
, (long)flags
);
302 ctbcm_getconfig(self
, args
)
310 if ((rv
=(char *)CMGetConfig(self
->hdl
)) == NULL
) {
311 err_setstr(ErrorObject
, "CMGetConfig failed");
314 return newstringobject(rv
);
318 ctbcm_setconfig(self
, args
)
325 if (!getargs(args
, "s", &cfg
))
327 if ((err
=CMSetConfig(self
->hdl
, (Ptr
)cfg
)) < 0)
328 return PyErr_Mac(ErrorObject
, err
);
329 return newintobject((int)err
);
333 ctbcm_choose(self
, args
)
344 rv
=CMChoose(&self
->hdl
, pt
, (ConnectionChooseIdleUPP
)0);
345 return newintobject(rv
);
349 ctbcm_idle(self
, args
)
361 ctbcm_abort(self
, args
)
373 ctbcm_reset(self
, args
)
385 ctbcm_break(self
, args
)
390 ConnectionCompletionUPP cb_upp
= NewConnectionCompletionProc(ctbcm_ctbcallback
);
392 if (!getargs(args
, "l", &duration
))
394 CMBreak(self
->hdl
, duration
,self
->has_callback
, cb_upp
);
399 static struct methodlist ctbcm_methods
[] = {
400 {"Open", (method
)ctbcm_open
},
401 {"Close", (method
)ctbcm_close
},
402 {"Read", (method
)ctbcm_read
},
403 {"Write", (method
)ctbcm_write
},
404 {"Status", (method
)ctbcm_status
},
405 {"GetConfig", (method
)ctbcm_getconfig
},
406 {"SetConfig", (method
)ctbcm_setconfig
},
407 {"Choose", (method
)ctbcm_choose
},
408 {"Idle", (method
)ctbcm_idle
},
409 {"Listen", (method
)ctbcm_listen
},
410 {"Accept", (method
)ctbcm_accept
},
411 {"Abort", (method
)ctbcm_abort
},
412 {"Reset", (method
)ctbcm_reset
},
413 {"Break", (method
)ctbcm_break
},
414 {NULL
, NULL
} /* sentinel */
418 ctbcm_getattr(self
, name
)
422 if ( strcmp(name
, "callback") == 0 ) {
423 INCREF(self
->callback
);
424 return self
->callback
;
426 return findmethod(ctbcm_methods
, (object
*)self
, name
);
430 ctbcm_setattr(self
, name
, v
)
435 if ( strcmp(name
, "callback") != 0 ) {
436 err_setstr(AttributeError
, "ctbcm objects have callback attr only");
442 INCREF(v
); /* XXXX Must I do this? */
444 self
->has_callback
= (v
!= None
);
448 statichere typeobject ctbcmtype
= {
449 OB_HEAD_INIT(&Typetype
)
452 sizeof(ctbcmobject
), /*tp_basicsize*/
455 (destructor
)ctbcm_dealloc
, /*tp_dealloc*/
457 (getattrfunc
)ctbcm_getattr
, /*tp_getattr*/
458 (setattrfunc
)ctbcm_setattr
, /*tp_setattr*/
462 0, /*tp_as_sequence*/
466 /* --------------------------------------------------------------------- */
468 /* Function of no arguments returning new ctbcm object */
471 ctb_cmnew(self
, args
)
472 object
*self
; /* Not used */
478 unsigned char p_str
[255];
484 if (!getargs(args
, "(s#O)", &c_str
, &strlen
, &sizes_obj
))
486 strncpy((char *)p_str
+1, c_str
, strlen
);
488 if (!initialize_ctb())
490 if ( sizes_obj
== None
) {
491 memset(sizes
, '\0', sizeof sizes
);
493 if ( !getargs(sizes_obj
, "(llllll)", &sizes
[0], &sizes
[1], &sizes
[2],
494 &sizes
[3], &sizes
[4], &sizes
[5]))
497 if ( (procid
=CMGetProcID(p_str
)) < 0 )
498 return PyErr_Mac(ErrorObject
, procid
);
499 hdl
= CMNew(procid
, cmNoMenus
|cmQuiet
, sizes
, 0, 0);
501 err_setstr(ErrorObject
, "CMNew failed");
504 rv
= newctbcmobject(args
);
506 return NULL
; /* XXXX Should dispose of hdl */
508 CMSetUserData(hdl
, (long)rv
);
513 ctb_available(self
, args
)
521 ok
= initialize_ctb();
523 return newintobject(ok
);
526 /* List of functions defined in the module */
528 static struct methodlist ctb_methods
[] = {
529 {"CMNew", ctb_cmnew
},
530 {"available", ctb_available
},
531 {NULL
, NULL
} /* sentinel */
535 /* Initialization function for the module (*must* be called initctb) */
542 /* Create the module and add the functions */
543 m
= initmodule("ctb", ctb_methods
);
545 /* Add some symbolic constants to the module */
546 d
= getmoduledict(m
);
548 #define CMCONST(name, value) o = newintobject(value); dictinsert(d, name, o)
550 CMCONST("cmData", 1);
551 CMCONST("cmCntl", 2);
552 CMCONST("cmAttn", 3);
554 CMCONST("cmFlagsEOM", 1);
556 CMCONST("chooseDisaster", -2);
557 CMCONST("chooseFailed", -1);
558 CMCONST("chooseAborted", 0);
559 CMCONST("chooseOKMinor", 1);
560 CMCONST("chooseOKMajor", 2);
561 CMCONST("chooseCancel", 3);
563 CMCONST("cmStatusOpening", 1);
564 CMCONST("cmStatusOpen", 2);
565 CMCONST("cmStatusClosing", 4);
566 CMCONST("cmStatusDataAvail", 8);
567 CMCONST("cmStatusCntlAvail", 0x10);
568 CMCONST("cmStatusAttnAvail", 0x20);
569 CMCONST("cmStatusDRPend", 0x40);
570 CMCONST("cmStatusDWPend", 0x80);
571 CMCONST("cmStatusCWPend", 0x100);
572 CMCONST("cmStatusCWPend", 0x200);
573 CMCONST("cmStatusARPend", 0x400);
574 CMCONST("cmStatusAWPend", 0x800);
575 CMCONST("cmStatusBreakPending", 0x1000);
576 CMCONST("cmStatusListenPend", 0x2000);
577 CMCONST("cmStatusIncomingCallPresent", 0x4000);
579 ErrorObject
= newstringobject("ctb.error");
580 dictinsert(d
, "error", ErrorObject
);
582 /* Check for errors */
584 fatal("can't initialize module ctb");