Don't block in Data::Send().
[dftpd.git] / TelnetCommand.cpp
blob57dccd1d488cb9debe762717615df7f7eb3e9b7a
1 #include <string.h>
2 #include "TelnetCommand.hpp"
3 #include "Telnet.hpp"
5 static char IAC[] = { 255, 0 };
7 TelnetCommand::TelnetCommand( const TelnetWPtr& parent )
8 : m_parent( parent )
10 Reset();
13 TelnetCommand::~TelnetCommand()
17 void TelnetCommand::Reset()
19 memset( m_buf, 0, sizeof( m_buf ) );
20 m_byte = 0;
23 bool TelnetCommand::Parse( unsigned char byte )
25 if( m_byte > 2 )
27 return false;
30 m_buf[m_byte++] = byte;
32 TelnetPtr parent = m_parent.lock();
33 if( !parent )
35 throw "TelnetCommand lost its Telnet";
38 if( m_byte == 1 )
40 if( m_buf[0] != 255 )
42 return false;
44 else
46 return true;
49 else if( m_byte == 2 )
51 switch( m_buf[1] )
53 case 240: // SE
54 case 241: // NOP
55 case 242: // Data Mark
56 case 243: // Break;
57 case 244: // Interrup Process
58 case 245: // Abort output
59 case 250: // SB
60 Reset();
61 break;
63 case 246: // Are You There
64 parent->Write( "HELLO" );
65 Reset();
66 break;
68 case 247: // Erase character
69 parent->EraseCharacter();
70 Reset();
71 break;
73 case 248: // Erase Line
74 parent->EraseLine();
75 Reset();
76 break;
78 case 251: // WILL
79 case 252: // WON'T
80 case 253: // DO
81 case 254: // DON'T
82 break;
84 case 255:
85 parent->Write( IAC );
86 Reset();
87 break;
89 default:
90 return false;
93 else
95 char tmp[] = { 255, 0, m_buf[2], 0 };
97 switch( m_buf[1] )
99 case 251: // WILL
100 tmp[1] = 254; // DON'T
101 parent->Write( tmp );
102 break;
104 case 252: // WON'T
105 case 254: // DON'T
106 break;
108 case 253: // DO
109 tmp[1] = 252; // WON'T
110 parent->Write( tmp );
111 break;
113 default:
114 return false;
117 Reset();
120 return true;