ϪfJUdZddlZddlmZddlmZddlmZmZddl m Z ddl m Z ddl mZiZeeefed <Gd d Zeej(Gd d ZGddZGddej.ZGddeZy)z4 Basic line editing support. @author: Jp Calderone N)Dict) implementer)helperinsults)Logger)reflect) iterbytes _counterscHeZdZdZdZdeffd Zdeffd ZfdZxZ S)Loggingz Wrapper which logs attribute lookups. This was useful in debugging something, I guess. I forget what. It can probably be deleted or moved somewhere more appropriate. Nothing special going on here, really. c||_tj|j}tj |d}|dzt|<t |dzt|zd|_y)Nr-w) originalrqual __class__r getopenstr_logFile)selfrkeycounts 8/usr/lib/python3/dist-packages/twisted/conch/recvline.py__init__zLogging.__init__!sU  ll8--. c1% #S3YU3S9 returnc4tt| dSNr)rsuper__getattribute__rrs r__str__zLogging.__str__(s57+J788rc4tt| dSr )reprr!r"r#s r__repr__zLogging.__repr__+sEG,Z899rct|d}t|d}|j|dzt||S)Nrr )r!r"writegetattr)rnamerlogFilers rr"zLogging.__getattribute__.s>7+J7'*:6 dTk"x&&r) __name__ __module__ __qualname____doc__rrr$r'r" __classcell__rs@rr r s/:99:#:''rr ceZdZdZdD] ZedzZej dZee"dZ dZ dZ e jD]Zeded ed d Zd Zd ZdZdZd:dZd:dZd:dZd:dZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'd$Z(d%Z)d&Z*d'Z+d(Z,d)Z-d;d*Z.d+Z/d,Z0d-Z1d.Z2d/Z3d0Z4d1Z5d2Z6d:d3Z7d:d4Z8d:d5Z9d6Z:d7Z;d8Zs rgetPeerzTransportSequence.getPeersr@rctd)Nz/Unimplemented: TransportSequence.loseConnectionr<r>s rloseConnectionz TransportSequence.loseConnectionw!"STTrctd)Nz&Unimplemented: TransportSequence.writer<rdatas rr*zTransportSequence.write{!"JKKrctd)Nz.Unimplemented: TransportSequence.writeSequencer<rGs r writeSequencezTransportSequence.writeSequence!"RSSrctd)Nz)Unimplemented: TransportSequence.cursorUpr<rns rcursorUpzTransportSequence.cursorUp!"MNNrctd)Nz+Unimplemented: TransportSequence.cursorDownr<rNs r cursorDownzTransportSequence.cursorDown!"OPPrctd)Nz.Unimplemented: TransportSequence.cursorForwardr<rNs r cursorForwardzTransportSequence.cursorForwardrLrctd)Nz/Unimplemented: TransportSequence.cursorBackwardr<rNs rcursorBackwardz TransportSequence.cursorBackwardrErctd)Nz/Unimplemented: TransportSequence.cursorPositionr<)rcolumnlines rcursorPositionz TransportSequence.cursorPositionrErctd)Nz+Unimplemented: TransportSequence.cursorHomer<r>s r cursorHomezTransportSequence.cursorHomerTrctd)Nz&Unimplemented: TransportSequence.indexr<r>s rindexzTransportSequence.indexrIrctd)Nz-Unimplemented: TransportSequence.reverseIndexr<r>s r reverseIndexzTransportSequence.reverseIndex!"QRRrctd)Nz)Unimplemented: TransportSequence.nextLiner<r>s rnextLinezTransportSequence.nextLinerQrctd)Nz+Unimplemented: TransportSequence.saveCursorr<r>s r saveCursorzTransportSequence.saveCursorrTrctd)Nz.Unimplemented: TransportSequence.restoreCursorr<r>s r restoreCursorzTransportSequence.restoreCursorrLrctd)Nz)Unimplemented: TransportSequence.setModesr<rmodess rsetModeszTransportSequence.setModesrQrctd)Nz+Unimplemented: TransportSequence.resetModesr<)rmodes r resetModeszTransportSequence.resetModesrTrctd)Nz0Unimplemented: TransportSequence.setPrivateModesr<rks rsetPrivateModesz!TransportSequence.setPrivateModes!"TUUrctd)Nz2Unimplemented: TransportSequence.resetPrivateModesr<rks rresetPrivateModesz#TransportSequence.resetPrivateModes!"VWWrctd)Nz6Unimplemented: TransportSequence.applicationKeypadModer<r>s rapplicationKeypadModez'TransportSequence.applicationKeypadModes! D  rctd)Nz2Unimplemented: TransportSequence.numericKeypadModer<r>s rnumericKeypadModez#TransportSequence.numericKeypadModervrctd)Nz3Unimplemented: TransportSequence.selectCharacterSetr<)rcharSetwhichs rselectCharacterSetz$TransportSequence.selectCharacterSet!"WXXrctd)Nz(Unimplemented: TransportSequence.shiftInr<r>s rshiftInzTransportSequence.shiftInr@rctd)Nz)Unimplemented: TransportSequence.shiftOutr<r>s rshiftOutzTransportSequence.shiftOutrQrctd)Nz-Unimplemented: TransportSequence.singleShift2r<r>s r singleShift2zTransportSequence.singleShift2rcrctd)Nz-Unimplemented: TransportSequence.singleShift3r<r>s r singleShift3zTransportSequence.singleShift3rcrctd)Nz7Unimplemented: TransportSequence.selectGraphicRenditionr<)r attributess rselectGraphicRenditionz(TransportSequence.selectGraphicRenditions! E  rctd)Nz8Unimplemented: TransportSequence.horizontalTabulationSetr<r>s rhorizontalTabulationSetz)TransportSequence.horizontalTabulationSet! F  rctd)Nz0Unimplemented: TransportSequence.tabulationClearr<r>s rtabulationClearz!TransportSequence.tabulationClearrsrctd)Nz3Unimplemented: TransportSequence.tabulationClearAllr<r>s rtabulationClearAllz$TransportSequence.tabulationClearAllrrctd)Nz1Unimplemented: TransportSequence.doubleHeightLiner<)rtops rdoubleHeightLinez"TransportSequence.doubleHeightLines!"UVVrctd)Nz0Unimplemented: TransportSequence.singleWidthLiner<r>s rsingleWidthLinez!TransportSequence.singleWidthLinersrctd)Nz0Unimplemented: TransportSequence.doubleWidthLiner<r>s rdoubleWidthLinez!TransportSequence.doubleWidthLinersrctd)Nz/Unimplemented: TransportSequence.eraseToLineEndr<r>s reraseToLineEndz TransportSequence.eraseToLineEndrErctd)Nz5Unimplemented: TransportSequence.eraseToLineBeginningr<r>s reraseToLineBeginningz&TransportSequence.eraseToLineBeginning! C  rctd)Nz*Unimplemented: TransportSequence.eraseLiner<r>s r eraseLinezTransportSequence.eraseLines!"NOOrctd)Nz2Unimplemented: TransportSequence.eraseToDisplayEndr<r>s reraseToDisplayEndz#TransportSequence.eraseToDisplayEnd rvrctd)Nz8Unimplemented: TransportSequence.eraseToDisplayBeginningr<r>s reraseToDisplayBeginningz)TransportSequence.eraseToDisplayBeginningrrctd)Nz-Unimplemented: TransportSequence.eraseDisplayr<r>s r eraseDisplayzTransportSequence.eraseDisplayrcrctd)Nz0Unimplemented: TransportSequence.deleteCharacterr<rNs rdeleteCharacterz!TransportSequence.deleteCharacterrsrctd)Nz+Unimplemented: TransportSequence.insertLiner<rNs r insertLinezTransportSequence.insertLinerTrctd)Nz+Unimplemented: TransportSequence.deleteLiner<rNs r deleteLinezTransportSequence.deleteLine!rTrctd)Nz5Unimplemented: TransportSequence.reportCursorPositionr<r>s rreportCursorPositionz&TransportSequence.reportCursorPosition%rrctd)Nz&Unimplemented: TransportSequence.resetr<r>s rresetzTransportSequence.reset+rIrctd)Nz9Unimplemented: TransportSequence.unhandledControlSequencer<rseqs runhandledControlSequencez*TransportSequence.unhandledControlSequence/s! G  rN)r)T)=r.r/r0r1keyID execBytesdecodeexecStrexecTAB BACKSPACErrITerminalTransportmethodr?rBrDr*rKrPrSrVrXr\r^r`rbrergrirmrprrrurxrzr~rrrrrrrrrrrrrrrrrrrrrrrrrr5r55s0N* ""7+ W 58 CI%,,   v     NNULTOQTUUQLSOQTOQVX XYNOSS  VYWVVU PX SVQQ L rr5c.eZdZdZfdZdefdZxZS)LocalTerminalBufferMixina A mixin for RecvLine subclasses which records the state of the terminal. This is accomplished by performing all L{ITerminalTransport} operations on both the transport passed to makeConnection and an instance of helper.TerminalBuffer. @ivar terminalCopy: A L{helper.TerminalBuffer} instance which efforts will be made to keep up to date with the actual terminal associated with this protocol instance. ctj|_|jjt|t ||jSN)rTerminalBuffer terminalCopyconnectionMader!makeConnectionr5)r transportrs rrz'LocalTerminalBufferMixin.makeConnectionBsD"113 ((*w%&7 4CTCT&UVVrrc,t|jSr)rrr>s rr$z LocalTerminalBufferMixin.__str__Gs4$$%%r)r.r/r0r1rrr$r2r3s@rrr6s W &&rrceZdZdZdZdZdZdZdZe jjdZ e ZdZd Zd Zd Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"y)RecvLinea L{TerminalProtocol} which adds line editing features. Clients will be prompted for lines of input with all the usual features: character echoing, left and right arrow support for moving the cursor to different areas of the line buffer, backspace and delete for removing characters, and insert for toggling between typeover and insert mode. Tabs will be expanded to enough spaces to move the cursor to the next tabstop (every four characters by default). Enter causes the line buffer to be cleared and the line to be passed to the lineReceived() method which, by default, does nothing. Subclasses are responsible for redrawing the input prompt (this will probably change). P)s>>> s... rr6cg|_d|_|j}|j|j|j |j |j|jd|jd|j|j|j|j|j|j|j|j |j"|j$|j&i |_|j+y)Nr  ) lineBufferlineBufferIndexterminal LEFT_ARROW handle_LEFT RIGHT_ARROW handle_RIGHTr handle_TAB handle_RETURNrhandle_BACKSPACEDELETE handle_DELETEINSERT handle_INSERTHOME handle_HOMEEND handle_END keyHandlersinitializeScreenrts rrzRecvLine.connectionMadefs ! MM LL$** MM4,, EE4?? 4%% 4%% KK.. HHd(( HHd(( FFD$$ EE4??   rc|jj|jj|j|j|j yr)rrr*pspn setInsertModer>s rrzRecvLine.initializeScreensA  DGGDGG,- rctdj|j}|d|j||jdfSNr)joinrr)rss rcurrentLineBufferzRecvLine.currentLineBuffers; HHT__ %'4''(!D,@,@,B*CCCrczd|_|jjtjj gy)Ninsert)rorrmrrlIRMr>s rrzRecvLine.setInsertModes(   1 123rczd|_|jjtjj gy)Ntypeover)rorrprrlrr>s rsetTypeoverModezRecvLine.setTypeoverModes(    '--"3"3!45rc|jj|j|jdj |j zy)z Write a line containing the current input prompt and the current line buffer at the current cursor position. rN)rr*rrrrr>s r drawInputLinezRecvLine.drawInputLines5 DGGDGG,sxx/HHIrc|jj|jj||_||_|j yr)rrr^widthheightr)rrrs r terminalSizezRecvLine.terminalSizes> ""$   "   rcyrrrs rrz!RecvLine.unhandledControlSequence rc|jj|}||y||jvr|j|dy|jj d|y)NFz#Received unhandled keyID: {keyID!r})r)rr_printableCharscharacterReceived_logwarn)rrmodifierms rkeystrokeReceivedzRecvLine.keystrokeReceivedsU     ' = C d** *  " "5% 0 IINN@N Nrc|jdk(r'|jj|j|n'|g|j|j|jdz|xjdz c_|jj |y)Nrr)rorrrrr*)rchmoreCharactersComings rrzRecvLine.characterReceivedsn 99 OO " "4#7#7 s rrzRecvLine.handle_LEFTs6   ! #  A % MM ( ( * $rc|jt|jkr0|xjdz c_|jj yy)Nr)rr rrrVr>s rrzRecvLine.handle_RIGHTs?   #doo"6 6  A % MM ' ' ) 7rcv|jr-|jj|jd|_yyNrrr>s rrzRecvLine.handle_HOMEs0    MM ( ()=)= >#$D  rct|j|jz }|r6|jj |t|j|_yyr)r rrrrV)roffsets rrzRecvLine.handle_ENDsFT__%(<(<<  MM ' ' /#&t#7D  rc|jdkDra|xjdzc_|j|j=|jj|jj yyr)rrrrXrr>s rrzRecvLine.handle_BACKSPACEsX   ! #  A %  4 45 MM ( ( * MM ) ) + $rc|jt|jkr2|j|j=|jj yyr)rr rrrr>s rrzRecvLine.handle_DELETEs@   #doo"6 6 4 45 MM ) ) + 7rcdj|j}g|_d|_|jj |j |y)Nrr)rrrrre lineReceivedrr[s rrzRecvLine.handle_RETURNsAxx(    $rc|jdvsJ|jdk(r|jy|jy)N)rrr)rorrr>s rrzRecvLine.handle_INSERTs9yy2222 99 "     "rcyrrrs rrzRecvLine.lineReceivedrrN)#r.r/r0r1rrr rrstring printableencoderrrrrrrrrrrrrrrrrrrrrrrrrrrrKs  E FG B B&&--g6O 8D 6 D46J O 4 + * % 8 ,,  # rrc4eZdZdZdZdZdZdZdZdZ y) HistoricRecvLinea; L{TerminalProtocol} which adds both basic line-editing features and input history. Everything supported by L{RecvLine} is also supported by this class. In addition, the up and down arrows traverse the input history. Each received line is automatically added to the end of the input history. ctj|g|_d|_|j}|j j |j|j|j|jiyr) rr historyLineshistoryPositionrrupdateUP_ARROW handle_UP DOWN_ARROW handle_DOWNrs rrzHistoricRecvLine.connectionMades[%  MM  ZZt7G7G H rcht|j}|d|j||jdfSr)tupler"r#)rbs rcurrentHistoryBufferz%HistoricRecvLine.currentHistoryBuffers9 $## $'4''(!D,@,@,B*CCCrc~|r;t|ddD]}|j|d|j|dddyy)NTF)r r)rbufrs r_deliverBufferzHistoricRecvLine._deliverBuffersJ CR) 1&&r40 1  " "3rs8U 3 rc|jrV|jt|jk(r4|jj dj |j|jdkDro|j |jj|xjdzc_g|_|j|j|jyy)Nrrr) rr#r r"appendrrrrr0r>s rr&zHistoricRecvLine.handle_UPs ??t33s4;L;L7MM    $ $SXXdoo%> ?   ! #     MM ( ( *  A %  DO    1 1$2F2F G H $rc|jt|jdz kro|j|jj |xjdz c_g|_|j|j|jy|j|jj t|j|_g|_d|_y)Nrr) r#r r"rrrrr0rr>s rr(zHistoricRecvLine.handle_DOWN$s   #d&7&7"81"< <     MM ( ( *  A %  DO    1 1$2F2F G H     MM ( ( *#&t'8'8#9D  DO#$D rc|jr4|jjdj|jt |j|_t j|Sr)rr"r2rr r#rrr>s rrzHistoricRecvLine.handle_RETURN5sN ??    $ $SXXdoo%> ?"4#4#45%%d++rN) r.r/r0r1rr,r0r&r(rrrrr r s'  D4 I%",rr )r1rtypingrzope.interfacertwisted.conch.insultsrrtwisted.loggerrtwisted.pythonrtwisted.python.compatr r rint__annotations__r rr5rTerminalProtocolrr rrrr>s  &1!"+ 4S>'': W ' '(} } )} @&&*l w''l ^?,x?,r