\section{Built-in Module \sectcode{ctb}}
\label{module-ctb}
\bimodindex{ctb}
\setindexsubitem{(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.

\setindexsubitem{(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.

\emph{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}


\setindexsubitem{(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}
