{QNc@s ddlTddlZddlZddlZddlZddlZddlZiejd6ejd6ej d6ej d6Z e dgZ e dgZe d gZe d gZe d gZe e e gZe d gZe d gZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZ e dgZ!e dgZ"e dgZ#e dgZ$e dgZ%e dgZ&e dgZ'e dgZ(e d gZ)e d!gZ*e d"gZ+e d#gZ,e d$gZ-e d%gZ.e d&gZ/e d'gZ0e d(gZ1e d)gZ2e d*gZ3e d+gZ4e d,gZ5e d-gZ6e d.gZ7e d/gZ8e d0gZ9i e.e"6e/e#6e0e$6e1e%6e2e&6e3e'6e4e(6e5e)6e6e*6e7e+6e8e,6e9e-6Z:e dgZ;e dgZ<e dgZ=e dgZ>e dgZ?e dgZ@e dgZAe dgZBe d gZCe d!gZDe d"gZEe d#gZFe d$gZGe d1gZHe d2gZIe d3gZJe d4gZKe d5gZLe d6gZMe d7gZNd8ZOd9ZPd:ZQd4ZRd ZSdZTdZUdZVd8ZWd9ZXd:ZYd4ZZd Z[dZ\dZ]dZ^e dgZ_e dgZ`e dgZaideb6dec6ded6dee6def6Zgehd;egjiDZjidek6del6dem6Znehd<enjiDZodZpdZqdZrd=Zsd>Ztd?Zud@ZvdAewfdBYZxdCewfdDYZydEezfdFYZ{yddl|Z|Wn*e}k r]dGe{e~fdHYZnXdGe{e|jfdIYZdJewfdKYZedLkrddlZedMdNZejjdOeejjdPejdQejejjdRejdejndS(Si(t*Ntdebugtinfotwarningterroriiiiiiiiiiiiiiiiiiii,iiiiiii i i i ieifigihiiijikiliminioipi iiiiiiii@i ccs!|]\}}||fVqdS(N((t.0tktv((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pys sccs!|]\}}||fVqdS(N((RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pys st REQUESTEDtACTIVEtINACTIVEtREALLY_INACTIVEt TelnetOptioncBs,eZdZddZdZdZRS(s@Manage a single telnet option, keeps track of DO/DONT WILL/WONT.c Cs^||_||_||_||_||_||_||_||_t|_ | |_ dS(s-Init option. :param connection: connection used to transmit answers :param name: a readable name for debug outputs :param send_yes: what to send when option is to be enabled. :param send_no: what to send when option is to be disabled. :param ack_yes: what to expect when remote agrees on option. :param ack_no: what to expect when remote disagrees on option. :param initial_state: options initialized with REQUESTED are tried to be enabled on startup. use INACTIVE for all others. N( t connectiontnametoptiontsend_yestsend_notack_yestack_notstatetFalsetactivetactivation_callback( tselfR RRRRRRt initial_stateR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt__init__s         cCsd|j|j|jfS(sString for debug outputss %s:%s(%s)(RRR(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt__repr__scCs||jkr|jtkrOt|_t|_|jdk r|jqq|jtkraq|jtkrt|_|j j |j |j t|_|jdk r|jqq|jt kr|j j |j|j qtd|n||jkr|jtkr+t|_t|_q|jtkrht|_|j j |j|j t|_q|jtkrzq|jt krqtd|ndS(s^A DO/DONT/WILL/WONT was received for this option, update state and answer when needed.soption in illegal state %rN(RRRR tTrueRRtNoneR R ttelnetSendOptionRRR Rt ValueErrorRR(Rtcommand((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytprocess_incomings<        N(t__name__t __module__t__doc__RRRR!(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR s  tTelnetSubnegotiationcBsVeZdZddZdZdZdZeeZ ddZ dZ RS( sA object to handle subnegotiation of options. In this case actually sub-sub options for RFC 2217. It is used to track com port options.cCsO|dkr|}n||_||_||_d|_||_t|_dS(N(RR RRtvaluet ack_optionR R(RR RRR'((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR's      cCsd|j|jfS(sString for debug outputs.s%s:%s(RR(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR0scCsa||_t|_|jj|j|j|jjr]|jjjd|j|jfndS(srequest a change of the value. a request is sent to the server. if the client needs to know if the change is performed he has to check the state of this object.sSB Requesting %s -> %rN( R&RRR trfc2217SendSubnegotiationRtloggerRR(RR&((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytset4s    cCs2|jtkr%td|jn|jtkS(sjcheck if answer from server has been received. when server rejects the change, raise a ValueError.s#remote rejected value for option %r(RR RRR (R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytisReady>sicCs]tj|}xFtj|krEtjd|jrPqqWtd|jdS(swait until the subnegotiation has been acknowledged or timeout. It can also throw a value error when the answer from the server does not match the value sent.g?s#timeout while waiting for option %rN(ttimetsleepR+tSerialExceptionR(Rttimeoutt timeout_time((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytwaitGs   cCsj|j|t|j kr(t|_n t|_|jjrf|jjjd|j||jfndS(scheck an incoming subnegotiation block. the parameter already has cut off the header like sub option number and com port option value.sSB Answer %s -> %r -> %sN( R&tlenR RR R R)RR(Rt suboption((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt checkAnswerSs    N( R"R#R$RRRR*R+tpropertyRR1R4(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR%#s    t RFC2217SerialcBs+eZdZd2ZdZdZdZdZdZdZ ddZ dZ dZ dZ ddZedZed Zed!Zd"Zd#Zd$Zd%Zd&Zd'Zd(Zd)Zd*Zd+Zd,d-Zd.Zd/Zd0Z d1Z!RS(3s<Serial port implementation for RFC 2217 remote serial ports.i2iKiniiii,iXiii` ii%iKiiic Cs7d|_t|_t|_d|_|jdkrBtdn|jrZtdnyWt j t j t j |_ |j j |j|j|j jt jt jdWn5tk r}d|_ td|j|fnX|j jdtj|_tj|_t|dtttttt t|dt!ttttt"g}t|d t#ttttt"t|d t$ttttt"t|d t$ttttt"t|d tttttt t|d t!ttttt"g||_%it&|dt't(d6t&|dt)t*d6t&|dt+t,d6t&|dt-t.d6|_/it&|dt0t1d6t&|dt2t3d6|_4|j4j5|j/d|_6d|_7d|_8t|_9tj:d|j;|_<|j<j=t>|j<j?d|jf|j<j@x9|j%D].}|jAt"kr"|jB|jC|jDq"q"WtEjE|j}xYtEjE|krtEjFdtGd|DtH|krjPqjqjWtd||jr|jjId|j%n|jJt>|_|jKs|jLt>|jMt>n|jN|jOdS(sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.is.Port must be configured before it can be used.sPort is already open.isCould not open port %s: %sis we-BINARYs we-RFC2217tECHOswe-SGAsthey-SGAs they-BINARYs they-RFC2217tbaudratetdatasizetparitytstopsizetpurgetcontrolittargets&pySerial RFC 2217 reader thread for %sg?css|]}|jVqdS(N(R(Rto((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pys ss9Remote does not seem to support RFC2217 or BINARY mode %rsNegotiated options: %sN(PRR)Rt_ignore_set_control_answert_poll_modem_statet_network_timeoutt_portR.t_isOpentsockettAF_INETt SOCK_STREAMt_sockettconnecttfromURLtportstrt setsockoptt IPPROTO_TCPt TCP_NODELAYt Exceptiont settimeouttQueuet _read_buffert threadingtLockt _write_lockR tBINARYtWILLtWONTtDOtDONTR tCOM_PORT_OPTIONRR7tSGAt_telnet_optionsR%t SET_BAUDRATEtSERVER_SET_BAUDRATEt SET_DATASIZEtSERVER_SET_DATASIZEt SET_PARITYtSERVER_SET_PARITYt SET_STOPSIZEtSERVER_SET_STOPSIZEt_rfc2217_port_settingst PURGE_DATAtSERVER_PURGE_DATAt SET_CONTROLtSERVER_SET_CONTROLt_rfc2217_optionstupdatet _linestatet _modemstatet_modemstate_expirest_remote_suspend_flowtThreadt_telnetReadLoopt_threadt setDaemonRtsetNametstartRRRRR,R-tsumR2Rt_reconfigurePortt_rtsctstsetRTStsetDTRt flushInputt flushOutput(Rtmsgtmandadory_optionsRR0((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytopenesz       $!       "      cCsG|jdkrtdn|jdk r<tdnt|jttf sud|jkoodkn rt d|jn|j dj t j d|j|j d j t j d |j|j d j t j d t|j|j d j t j d t|j|j j}|jrQ|jjd |fntj|j}xYtj|krtjdtd|Dt|krgPqgqgWtd||jr|jjd|fn|jr|jrt dn?|jr|jtn&|jr6|jt n |jt!dS(s,Set communication parameters on opened port.sCan only operate on open portss'writeTimeout is currently not supportediii sinvalid baudrate: %rR8s!IR9s!BR:R;sNegotiating settings: %sg?css|]}|jVqdS(N(R(RR?((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pys ss5Remote does not accept parameter change (RFC2217): %rsNegotiated settings: %ss-xonxoff and rtscts together are not supportedNI("RHRR.t _writeTimeouttNotImplementedErrort isinstancet _baudratetinttlongRRfR*tstructtpackt _bytesizetRFC2217_PARITY_MAPt_paritytRFC2217_STOPBIT_MAPt _stopbitstvaluesR)RR,RBR-RwR2RRyt_xonxofftrfc2217SetControltSET_CONTROL_USE_HW_FLOW_CONTROLtSET_CONTROL_USE_SW_FLOW_CONTROLtSET_CONTROL_USE_NO_FLOW_CONTROL(RtitemsR0((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRxs89##''  "   cCs|jr~|jrLy$|jjtj|jjWnnXd|_n|jre|jjnt |_t j dndS(s Close portg333333?N( RDRHtshutdownREt SHUT_RDWRtcloseRRstjoinRR,R-(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs     cCstddS(Ns2there is no sensible way to turn numbers into URLs(R.(Rtport((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytmakeDeviceNamescCs|jjdr"|d}nyqd|krC|jdd\}}x|jdD]}d|kr|jdd\}}nd}|dkrtjtjd|_|jjt ||jj dqY|d krt |_ qY|d kr t |_ qY|d kr)t||_qYtd |fqYWn|jd d\}}t|}d|ko~dknstdnWn#tk r}td|nX||fS(s(extract host and port from an URL strings rfc2217://i t/it=tloggingspySerial.rfc2217senabled loggingtign_set_controlt poll_modemR/sunknown option: %rt:iisport not in range 0...65535sRexpected a string in the form "[rfc2217://]:[/option[/option...]]": %sN(tlowert startswithtsplitRRt basicConfigt getLoggerR)tsetLevelt LOGGER_LEVELSRRR@RAtfloatRBRRR.(RturltoptionsRR&thostRte((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRJs8           cCs|jstn|jjS(s>Return the number of characters currently in the input buffer.(RDtportNotOpenErrorRRtqsize(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt inWaiting&s icCs|jstnt}yZxSt||krs|jdkrQtdn|j|jj t |j q!WWnt j k rnXt|S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.s&connection failed (reader thread died)N(RDRt bytearrayR2RsRR.tappendRRtgetRt_timeoutRQtEmptytbytes(Rtsizetdata((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytread+s  'cCs|jstn|jjzMy |jj|jttWn&t j k rj}t d|nXWd|jj Xt |S(sOutput the given string over the serial port. Can block if the connection is blocked. May raise SerialException if the connection is closed.s$connection failed (socket error): %sN(RDRRUtacquireRHtsendalltreplacetIACt IAC_DOUBLEDRERR.treleaseR2(RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytwrite:s   cCsI|jstn|jtx#|jjrD|jjtq"WdS(s9Clear input buffer, discarding all that is in the buffer.N(RDRtrfc2217SendPurgetPURGE_RECEIVE_BUFFERRRRRR(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR|Is   cCs#|jstn|jtdS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.N(RDRRtPURGE_TRANSMIT_BUFFER(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR}Qs g?cCs=|jstn|jttj||jtdS(sPSend break condition. Timed, returns to idle state after given duration.N(RDRtsetBreakRR,R-R(Rtduration((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt sendBreakWs    cCsc|jstn|jr<|jjddt|n|rR|jtn |jtdS(sJSet break: Controls TXD. When active, to transmitting is possible.sset BREAK to %stinactiveRN(Rsactive(RDRR)RtboolRtSET_CONTROL_BREAK_ONtSET_CONTROL_BREAK_OFF(Rtlevel((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR_s  !cCsc|jstn|jr<|jjddt|n|rR|jtn |jtdS(s*Set terminal status line: Request To Send.s set RTS to %sRRN(sinactivesactive(RDRR)RRRtSET_CONTROL_RTS_ONtSET_CONTROL_RTS_OFF(RR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRzjs  !cCsc|jstn|jr<|jjddt|n|rR|jtn |jtdS(s.Set terminal status line: Data Terminal Ready.s set DTR to %sRRN(sinactivesactive(RDRR)RRRtSET_CONTROL_DTR_ONtSET_CONTROL_DTR_OFF(RR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR{ts  !cCs&|jstnt|jt@S(s)Read terminal status line: Clear To Send.(RDRRt getModemStatetMODEMSTATE_MASK_CTS(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytgetCTS~s cCs&|jstnt|jt@S(s*Read terminal status line: Data Set Ready.(RDRRRtMODEMSTATE_MASK_DSR(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytgetDSRs cCs&|jstnt|jt@S(s*Read terminal status line: Ring Indicator.(RDRRRtMODEMSTATE_MASK_RI(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytgetRIs cCs&|jstnt|jt@S(s*Read terminal status line: Carrier Detect.(RDRRRtMODEMSTATE_MASK_CD(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytgetCDs cCs"t}d}zx|jdk ry|jjd}WnPtjk rPqn:tjk r}|jr|jjd|fnPnX|sPnxY|D]Q}|tkr|t krt }q|dk r|j |q|j j |q|t kr|t kr>|dk r%|j t n|j j t t}q|tkr\t}t}q|tkr|jt|d}t}q|ttttfkr|}t}q|j|t}q|tkr|j||t}qqWqWWdd|_|jr|jjdnXdS(sread loop for the socket.is!socket error in reader thread: %sNsread thread terminated(tM_NORMALRRHtrecvRER/RR)RRt M_IAC_SEENRRRtputtSBRtSEt_telnetProcessSubnegotiationRRYRZRWRXt M_NEGOTIATEt_telnetProcessCommandt_telnetNegotiateOptionRs(RtmodeR3RRtbytettelnet_command((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRrsZ                     cCs'|jr#|jjd|fndS(s1Process commands other than DO, DONT, WILL, WONT.signoring Telnet command: %rN(R)R(RR ((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs cCst}x6|jD]+}|j|kr|j|t}qqW|s|tks]|tkr|j|tkrutpxt ||j r|j j d|fqqndS(s&Process incoming DO, DONT, WILL, WONT.srejected Telnet option: %rN( RR]RR!RRWRYRRZRXR)R(RR Rtknowntitem((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs  " cCs|dd!tkr|dd!tkrtt|dkrtt|dd!|_|jr|jjd|jqq|dd!tkrt|dkrt|dd!|_|jr|jjd|jnt j d|_ q|dd!t krt |_ q|dd!tkr&t|_ qx|jjD]7}|j|dd!kr6|jt|dPq6q6W|jr|jjd|fqn#|jr|jjd |fnd S( s;Process subnegotiation, the data between IAC SB and IAC SE.iiiisNOTIFY_LINESTATE: %ssNOTIFY_MODEMSTATE: %sg333333?signoring COM_PORT_OPTION: %rsignoring subnegotiation: %rN(R[tSERVER_NOTIFY_LINESTATER2tordRmR)RtSERVER_NOTIFY_MODEMSTATERnR,RotFLOWCONTROL_SUSPENDRRptFLOWCONTROL_RESUMERRkRR'R4RR(RR3R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs,% %     cCs6|jjz|jj|Wd|jjXdS(sGinternal socket write with no data escaping. used to send telnet stuff.N(RURRHRR(RR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt_internal_raw_writes cCs |jtt||gdS(sSend DO, DONT, WILL, WONT.N(Rtto_bytesR(RtactionR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRstcCsI|jtt}|jtttt|gt|ttgdS(s%Subnegotiation of RFC2217 parameters.N( RRRRRRR[tlistR(RRR&((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR(scCs.|jd}|j||j|jdS(NR<(RkR*R1RB(RR&R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR$s  cCsG|jd}|j||jr3tjdn|j|jdS(NR=g?(RkR*R@R,R-R1RB(RR&R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR)s    cCsdS(sOcheck if server is ready to receive data. block for some time when not.N((R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytrfc2217FlowServerReady4scCs|jr|jtjkr|jr:|jjdn|jttj|j}x[tj|krtjd|jtjkr]|jr|jj dnPq]q]Wn|j dk r|jr|jjdn|j St ddS(sget last modem state (cached value. if value is "old", request a new one. this cache helps that we don't issue to many requests when e.g. all status lines, one after the other is queried by te user (getCTS, getDSR etc.)spolling modem stateg?spoll for modem state failedsusing cached modem states!remote sends no NOTIFY_MODEMSTATEN( RARoR,R)RR(tNOTIFY_MODEMSTATERBR-RRnRR.(RR0((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR:s       (i2iKiniiii,iXiii` ii%iKiii("R"R#R$t BAUDRATESRRxRRRJRRRR|R}RRRRzR{RRRRRrRRRRRR(RRRR(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR6_s@ \ ,   %          B       tSerialcBseZRS((R"R#(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRbscBseZRS((R"R#(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRfst PortManagercBsqeZdZd dZdZdZddZedZ dZ dZ d Z d Z d ZRS( sThis class manages the state of Telnet and RFC 2217. It needs a serial instance and a connection to work with. Connection is expected to implement a (thread safe) write function, that writes the string to the network.cCs||_||_||_t|_t|_d|_d|_ d|_ d|_ d|_ t |dttttttt |dttttttt |dttttttt |dttttttt |dttttttt |dtttttt|j t |d tttttt|j g|_|jr]|jjd nx9|jD].}|jtkrg|j|j|jqgqgWdS( NiiR7swe-SGAsthey-SGAs we-BINARYs they-BINARYs we-RFC2217s they-RFC2217s*requesting initial Telnet/RFC 2217 options(tserialR R)Rt_client_is_rfc2217RRRR3Rtmodemstate_masktlast_modemstatet linstate_maskR R7RWRXRYRZRR\R RVR[t _client_okR]RRRRR(Rt serial_portR R)R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRrs,          $- cCs9t|_|jr%|jjdn|jdtdS(scallback of telnet option. it gets called when option is activated. this one here is used to detect when the client agrees on RFC 2217. a flag is set so that other functions like check_modem_lines know if the client is ok.sclient accepts RFC 2217tforce_notificationN(RRR)Rtcheck_modem_lines(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs  cCs#|jjtt||gdS(sSend DO, DONT, WILL, WONT.N(R RRR(RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRsRcCsL|jtt}|jjtttt|gt|tt gdS(s&Subnegotiation of RFC 2217 parameters.N( RRRR RRRR[RR(RRR&((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR(sc CsH|jjot|jjo$tB|jjo7tB|jjoJtB}||j p]dA}|t@rx|t O}n|t@r|t O}n|t@r|t O}n|t@r|t O}n||j ks|rD|jr||j@s|r4|jtt||j@g|jr4|jjd|fq4n|d@|_ ndS(NisNOTIFY_MODEMSTATE: %si(RRRRRRRRRRtMODEMSTATE_MASK_CTS_CHANGEtMODEMSTATE_MASK_DSR_CHANGEtMODEMSTATE_MASK_RI_CHANGEtMODEMSTATE_MASK_CD_CHANGERRR(RRR)R(RRt modemstatetdeltas((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs&8         ccs3x,|D]$}|tkr&tVtVq|VqWdS(sthis generator function is for the user. all outgoing data has to be properly escaped, so that no IAC character in the data stream messes up the Telnet state machine in the server. socket.sendall(escape(data)) N(R(RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytescapes   ccsx||D]t}|jtkr^|tkr4t|_q{|jdk rV|jj|q{|Vq|jtkrM|tkr|jdk r|jj|n|Vt|_q{|tkrt|_t|_q{|t kr|j t |jd|_t|_q{|t t ttfkr4||_t|_q{|j|t|_q|jtkr|j|j|t|_qqWdS(shandle a bunch of incoming bytes. this is a generator. it will yield all characters not of interest for Telnet/RFC 2217. The idea is that the reader thread pushes data from the socket through this filter: for byte in filter(socket.recv(1024)): # do things like CR/LF conversion/whatever # and write data to the serial port serial.write(byte) (socket error handling code left as exercise for the reader) N(RRRRR3RRRRRRRRYRZRWRXRRRR(RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytfilters8               cCs'|jr#|jjd|fndS(s1Process commands other than DO, DONT, WILL, WONT.signoring Telnet command: %rN(R)R(RR ((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs cCst}x6|jD]+}|j|kr|j|t}qqW|s|tks]|tkr|j|tkrutpxt ||j r|j j d|fqqndS(s&Process incoming DO, DONT, WILL, WONT.srejected Telnet option: %rN( RR]RR!RRWRYRRZRXR)R(RR RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR%s  " cCs |dd!tkr |jr6|jjd|fn|dd!tkr|jj}y&tjd|dd!\|j_WnBtk r}|jr|jj d|fn||j_n*X|jr|jj d|jjfn|j t tj d|jjq |dd!tkr|jj}y&tjd |dd !\|j_WnBtk r}|jr|jj d |fn||j_n*X|jr|jj d |jjfn|j ttj d |jjq |dd!tkr|jj}y+ttjd |dd !d|j_WnBtk rt}|jre|jj d |fn||j_n*X|jr|jj d|jjfn|j ttj d t|jjq |dd!tkr|jj}y+ttjd |dd !d|j_WnBtk rU}|jrF|jj d|fn||j_n*X|jr|jj d|jjfn|j ttj d t|jjq |dd!tkr|dd !tkr|jjr|j ttq|jj r |j tt!q|j tt"q |dd !t"kryt#|j_t#|j_ |jrf|jj dn|j tt"q |dd !tkrt$|j_|jr|jj dn|j ttq |dd !t!krt$|j_ |jr|jj dn|j tt!q |dd !t%krG|jr|jj&dqq |dd !t'kr|jj(t$|jr|jj dn|j tt'q |dd !t)kr|jj(t#|jr|jj dn|j tt)q |dd !t*kr|jr|jj&dqq |dd !t+kro|jj,t$|jr\|jj dn|j tt+q |dd !t-kr|jj,t#|jr|jj dn|j tt-q |dd !t.kr|jr|jj&dqq |dd !t/krE|jj0t$|jr2|jj dn|j tt/q |dd !t1kr |jj0t#|jr|jj dn|j tt1q q |dd!t2kr|j t3t4dgq |dd!t5kr |jr|jj dn|j6dt$q |dd!t7krF|jr:|jj dnt$|_8q |dd!t9kr|jru|jj d nt#|_8q |dd!t:krt;|dd !|_<|jr |jj d!|j<fq q |dd!t=kr% t;|dd !|_>|jr |jj d"|j>fq q |dd!t?kr_ |dd !t@kr |jjA|jrt |jj d#n|j tBt@q |dd !tCkr |jjD|jr |jj d$n|j tBtCq |dd !tEkr2 |jjA|jjD|jr |jj d%n|j tBtEq |jr |jj d&tF|dq q |jr |jj d'tF|dq n#|jr |jj&d(|fnd)S(*s;Process subnegotiation, the data between IAC SB and IAC SE.iisreceived COM_PORT_OPTION: %ris!Iisfailed to set baud rate: %sschanged baud rate: %ss!Bisfailed to set data size: %sschanged data size: %ssfailed to set parity: %sschanged parity: %ssfailed to set stop bits: %sschanged stop bits: %sschanged flow control to Nones changed flow control to XON/XOFFschanged flow control to RTS/CTSs'requested break state - not implementedschanged BREAK to activeschanged BREAK to inactives%requested DTR state - not implementedschanged DTR to activeschanged DTR to inactives%requested RTS state - not implementedschanged RTS to activeschanged RTS to inactivesrequest for modem stateRtsuspendtresumesline state mask: 0x%02xsmodem state mask: 0x%02xspurge ins purge outs purge bothsundefined PURGE_DATA: %rsundefined COM_PORT_OPTION: %rsunknown subnegotiation: %rN(GR[R)RR^RR8RtunpackRRRR(R_RR`tbytesizeRaRbR:tRFC2217_REVERSE_PARITY_MAPRcRRdtstopbitstRFC2217_REVERSE_STOPBIT_MAPReRRitSET_CONTROL_REQ_FLOW_SETTINGtxonxoffRjRtrtsctsRRRRtSET_CONTROL_REQ_BREAK_STATERRRRtSET_CONTROL_REQ_DTRRR{RtSET_CONTROL_REQ_RTSRRzRtNOTIFY_LINESTATERRRRRRpRtSET_LINESTATE_MASKRRtSET_MODEMSTATE_MASKRRgRR|RhRR}tPURGE_BOTH_BUFFERSR(RR3tbackupR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR9sF  &   % &   % +     +                                       $ $ N(R"R#R$RRRRR(RRRRRRR(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRms #    "  :  t__main__srfc2217://localhost:7000is%s s write... shello s read: %s (tserial.serialutilR,RRERSRQRtDEBUGtINFOtWARNINGtERRORRRRRZRYRXRWRRtNOPtDMtBRKtIPtAOtAYTtECtELtGARRVR7R\R[R^R`RbRdRiRRRRRRRgR_RaRcReRjRRtSERVER_FLOWCONTROL_SUSPENDtSERVER_FLOWCONTROL_RESUMEtSERVER_SET_LINESTATE_MASKtSERVER_SET_MODEMSTATE_MASKRhtRFC2217_ANSWER_MAPRRRRRRRRRRRRRtSET_CONTROL_REQ_FLOW_SETTING_INt"SET_CONTROL_USE_NO_FLOW_CONTROL_INt!SET_CONTROL_USE_SW_FLOW_CONTOL_INt!SET_CONTROL_USE_HW_FLOW_CONTOL_INt SET_CONTROL_USE_DCD_FLOW_CONTROLt SET_CONTROL_USE_DTR_FLOW_CONTROLt SET_CONTROL_USE_DSR_FLOW_CONTROLtLINESTATE_MASK_TIMEOUTtLINESTATE_MASK_SHIFTREG_EMPTYtLINESTATE_MASK_TRANSREG_EMPTYtLINESTATE_MASK_BREAK_DETECTtLINESTATE_MASK_FRAMING_ERRORtLINESTATE_MASK_PARTIY_ERRORtLINESTATE_MASK_OVERRUN_ERRORtLINESTATE_MASK_DATA_READYRRRRRRRRRRRt PARITY_NONEt PARITY_ODDt PARITY_EVENt PARITY_MARKt PARITY_SPACERtdictRR t STOPBITS_ONEtSTOPBITS_ONE_POINT_FIVEt STOPBITS_TWORR RRRRR R R tobjectR R%t SerialBaseR6tiot ImportErrortFileLikeRt RawIOBaseRR"tsystststdoutRtflushRR(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt>s(              B<