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 132 133 134 135 136 137 138 139 140 141 142
|
#ifndef SshBaseSocket_h
#define SshBaseSocket_h
/******************************************************************************
*
* Copyright (C) 2002 Hugo PEREIRA <mailto: hugo.pereira@free.fr>
*
* This 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 software 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, see <http://www.gnu.org/licenses/>.
*
*******************************************************************************/
#include "Counter.h"
#include <QAbstractSocket>
#include <QBasicTimer>
#include <QByteArray>
#include <QHostAddress>
#include <QIODevice>
#include <QTimerEvent>
namespace Ssh
{
//* ssh socket
class BaseSocket: public QIODevice, private Base::Counter<BaseSocket>
{
Q_OBJECT
public:
//* constructor
explicit BaseSocket( QObject* );
//* destructor
~BaseSocket() override;
//*@name accessors
//@{
//* true if connected
bool isConnected() const
{ return channel_; }
//* true if channel is closed
bool atEnd() const override;
//* sequencial mode
bool isSequential() const override
{ return true; }
//* bytes available
qint64 bytesAvailable() const override
{ return bytesAvailable_; }
//@}
//*@name modifiers
//@{
//* change latency
void setLatency( int latency )
{ latency_ = latency; }
//@}
Q_SIGNALS:
//* emit when connected
int connected();
//* error
void error(QAbstractSocket::SocketError);
public Q_SLOTS:
//* close
void close() override;
protected:
//* read
qint64 readData( char*, qint64 maxSize ) override;
//* write
qint64 writeData( const char*, qint64 maxSize ) override;
//* timer event
void timerEvent( QTimerEvent* ) override;
//* get socket latency
int _latency() const
{ return latency_; }
//* channel
void* _channel()
{ return channel_; }
//* channel
void _setChannel( void*, QIODevice::OpenMode );
private:
//* try connect channel, returns true on success
bool _tryConnect();
//* try read data from channel
bool _tryRead();
//* ssh channel
void* channel_ = nullptr;
//* timer
QBasicTimer timer_;
//* latency
int latency_ = 10;
//* buffer
QByteArray buffer_;
//* max buffer size
qint64 maxSize_ = 1<<16;
//* bytes available
qint64 bytesAvailable_ = 0;
};
}
#endif
|