summaryrefslogtreecommitdiff
path: root/src/protocol/internal/fqterm_ssh_channel.h
blob: b0673ba5abdc5d8959da6e3bc8e03e2b11a3d0a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/***************************************************************************
 *   fqterm, a terminal emulator for both BBS and *nix.                    *
 *   Copyright (C) 2008 fqterm development group.                          *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.               *
 ***************************************************************************/

#ifndef FQTERM_SSH_CHANNEL_H
#define FQTERM_SSH_CHANNEL_H

#include "fqterm_ssh_types.h"

#include <QObject>

namespace FQTerm {

class FQTermSSHPacketReceiver;
class FQTermSSHPacketSender;

class FQTermSSHChannel: public QObject {
  Q_OBJECT;
protected:
  bool is_closed_;

  FQTermSSHPacketReceiver *packet_receiver_;
  FQTermSSHPacketSender *packet_sender_;

public:
  FQTermSSHChannel(){}
  virtual ~FQTermSSHChannel(){}
  virtual void initChannel(FQTermSSHPacketReceiver *packet,
                           FQTermSSHPacketSender *output, 
                           int col, int row, const QString& termtype) = 0;
  virtual void closeConnection(const char *reason) = 0;

  // TODO: it seems this function isn't used.
  virtual void changeTermSize(int col, int row) = 0;
  
  virtual void sendData(const char *data, int len) = 0;

public slots:
  virtual void handlePacket(int type) = 0;
signals:
  void channelOK();
  void channelReadyRead(const char *data, int len);
  void channelError(QString);
  void channelClosed();
};

class FQTermSSH1Channel: public FQTermSSHChannel {
  Q_OBJECT;
private:
  enum FQTermSSH1ChannelState {
    BEGIN_SERVICE, REQPTY_SENT, 
    //REQCMD_SENT,
    SERVICE_OK
  }	service_state_;

public:
  FQTermSSH1Channel();
  virtual void initChannel(FQTermSSHPacketReceiver *packet, FQTermSSHPacketSender *output,
                          int col, int row, const QString& termtype);
  virtual void closeConnection(const char *reason);
  virtual void changeTermSize(int col, int row);
  virtual void sendData(const char *data, int len);

public slots:
  virtual void handlePacket(int type);
signals:
  void channelReadyRead(const char *data, int len);
};


class FQTermSSH2Channel: public FQTermSSHChannel {
  Q_OBJECT;
private:
  static u_int32_t generateChannelID();

private:
  int col_;
  int row_;
  QString termtype_;
  enum FQTermSSH2ChannelState {
    BEGIN_CHANNEL, REQUEST_PTY_SENT, REQUEST_SHELL_SENT, CHANNEL_OK
  }	channel_state_;

  u_int32_t channel_id_;

  enum {MAX_LOCAL_WINDOW_SIZE = 0x100000, MAX_LOCAL_PACKET_SIZE = 0x4000};
  
  u_int32_t local_window_size_;

  u_int32_t server_channel_id_;
  u_int32_t server_window_size_; // connection packet window size;
  u_int32_t server_max_packet_size_; // max size of each packet sent to server.

  void requestPty();
  void requestShell();
  void processChannelPacket();
  void checkLocalWindowSize();

public:
  FQTermSSH2Channel();
  virtual void initChannel(FQTermSSHPacketReceiver *packet, FQTermSSHPacketSender *output,
                          int col, int row, const QString& termtype);
  virtual void closeConnection(const char *reason);
  virtual void changeTermSize(int col, int row);
  virtual void sendData(const char *data, int len);

public slots:
  virtual void handlePacket(int type);
signals:
  void channelReadyRead(const char *data, int len);
};

}  // namespace FQTerm

#endif  // FQTERM_SSH_CHANNEL_H