Stupid winsock needs special way to close sockets.
[dftpd.git] / TelnetCommand.cpp
blobbdd1668ad35e1bb63ea4d143f7fe8c369afffff0
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( m_byte == 1 )
35 if( m_buf[0] != 255 )
37 return false;
39 else
41 return true;
44 else if( m_byte == 2 )
46 switch( m_buf[1] )
48 case 240: // SE
49 case 241: // NOP
50 case 242: // Data Mark
51 case 243: // Break;
52 case 244: // Interrup Process
53 case 245: // Abort output
54 case 250: // SB
55 Reset();
56 break;
58 case 246: // Are You There
59 parent->Write( "HELLO" );
60 Reset();
61 break;
63 case 247: // Erase character
64 parent->EraseCharacter();
65 Reset();
66 break;
68 case 248: // Erase Line
69 parent->EraseLine();
70 Reset();
71 break;
73 case 251: // WILL
74 case 252: // WON'T
75 case 253: // DO
76 case 254: // DON'T
77 break;
79 case 255:
80 parent->Write( IAC );
81 Reset();
82 break;
84 default:
85 return false;
88 else
90 char tmp[] = { 255, 0, m_buf[2], 0 };
92 switch( m_buf[1] )
94 case 251: // WILL
95 tmp[1] = 254; // DON'T
96 parent->Write( tmp );
97 break;
99 case 252: // WON'T
100 case 254: // DON'T
101 break;
103 case 253: // DO
104 tmp[1] = 252; // WON'T
105 parent->Write( tmp );
106 break;
108 default:
109 return false;
112 Reset();
115 return true;