\section{Built-in Module \sectcode{ctb}}
\label{module-ctb}
\bimodindex{ctb}
\renewcommand{\indexsubitem}{(in module ctb)}

This module provides a partial interface to the Macintosh
Communications Toolbox. Currently, only Connection Manager tools are
supported.  It may not be available in all Mac Python versions.

\begin{datadesc}{error}
The exception raised on errors.
\end{datadesc}

\begin{datadesc}{cmData}
\dataline{cmCntl}
\dataline{cmAttn}
Flags for the \var{channel} argument of the \var{Read} and \var{Write}
methods.
\end{datadesc}

\begin{datadesc}{cmFlagsEOM}
End-of-message flag for \var{Read} and \var{Write}.
\end{datadesc}

\begin{datadesc}{choose*}
Values returned by \var{Choose}.
\end{datadesc}

\begin{datadesc}{cmStatus*}
Bits in the status as returned by \var{Status}.
\end{datadesc}

\begin{funcdesc}{available}{}
Return 1 if the communication toolbox is available, zero otherwise.
\end{funcdesc}

\begin{funcdesc}{CMNew}{name\, sizes}
Create a connection object using the connection tool named
\var{name}. \var{sizes} is a 6-tuple given buffer sizes for data in,
data out, control in, control out, attention in and attention out.
Alternatively, passing \code{None} will result in default buffer sizes.
\end{funcdesc}

\subsection{connection object}
For all connection methods that take a \var{timeout} argument, a value
of \code{-1} is indefinite, meaning that the command runs to completion.

\renewcommand{\indexsubitem}{(connection object attribute)}

\begin{datadesc}{callback}
If this member is set to a value other than \code{None} it should point
to a function accepting a single argument (the connection
object). This will make all connection object methods work
asynchronously, with the callback routine being called upon
completion.

{\em Note:} for reasons beyond my understanding the callback routine
is currently never called. You are advised against using asynchronous
calls for the time being.
\end{datadesc}


\renewcommand{\indexsubitem}{(connection object method)}

\begin{funcdesc}{Open}{timeout}
Open an outgoing connection, waiting at most \var{timeout} seconds for
the connection to be established.
\end{funcdesc}

\begin{funcdesc}{Listen}{timeout}
Wait for an incoming connection. Stop waiting after \var{timeout}
seconds. This call is only meaningful to some tools.
\end{funcdesc}

\begin{funcdesc}{accept}{yesno}
Accept (when \var{yesno} is non-zero) or reject an incoming call after
\var{Listen} returned.
\end{funcdesc}

\begin{funcdesc}{Close}{timeout\, now}
Close a connection. When \var{now} is zero, the close is orderly
(i.e.\ outstanding output is flushed, etc.)\ with a timeout of
\var{timeout} seconds. When \var{now} is non-zero the close is
immediate, discarding output.
\end{funcdesc}

\begin{funcdesc}{Read}{len\, chan\, timeout}
Read \var{len} bytes, or until \var{timeout} seconds have passed, from
the channel \var{chan} (which is one of \var{cmData}, \var{cmCntl} or
\var{cmAttn}). Return a 2-tuple:\ the data read and the end-of-message
flag.
\end{funcdesc}

\begin{funcdesc}{Write}{buf\, chan\, timeout\, eom}
Write \var{buf} to channel \var{chan}, aborting after \var{timeout}
seconds. When \var{eom} has the value \var{cmFlagsEOM} an
end-of-message indicator will be written after the data (if this
concept has a meaning for this communication tool). The method returns
the number of bytes written.
\end{funcdesc}

\begin{funcdesc}{Status}{}
Return connection status as the 2-tuple \code{(\var{sizes},
\var{flags})}. \var{sizes} is a 6-tuple giving the actual buffer sizes used
(see \var{CMNew}), \var{flags} is a set of bits describing the state
of the connection.
\end{funcdesc}

\begin{funcdesc}{GetConfig}{}
Return the configuration string of the communication tool. These
configuration strings are tool-dependent, but usually easily parsed
and modified.
\end{funcdesc}

\begin{funcdesc}{SetConfig}{str}
Set the configuration string for the tool. The strings are parsed
left-to-right, with later values taking precedence. This means
individual configuration parameters can be modified by simply appending
something like \code{'baud 4800'} to the end of the string returned by
\var{GetConfig} and passing that to this method. The method returns
the number of characters actually parsed by the tool before it
encountered an error (or completed successfully).
\end{funcdesc}

\begin{funcdesc}{Choose}{}
Present the user with a dialog to choose a communication tool and
configure it. If there is an outstanding connection some choices (like
selecting a different tool) may cause the connection to be
aborted. The return value (one of the \var{choose*} constants) will
indicate this.
\end{funcdesc}

\begin{funcdesc}{Idle}{}
Give the tool a chance to use the processor. You should call this
method regularly.
\end{funcdesc}

\begin{funcdesc}{Abort}{}
Abort an outstanding asynchronous \var{Open} or \var{Listen}.
\end{funcdesc}

\begin{funcdesc}{Reset}{}
Reset a connection. Exact meaning depends on the tool.
\end{funcdesc}

\begin{funcdesc}{Break}{length}
Send a break. Whether this means anything, what it means and
interpretation of the \var{length} parameter depend on the tool in
use.
\end{funcdesc}
