Skip to content

Commit 6338a54

Browse files
committed
Plugins::SSH: fix receive data bug
1 parent 3c3d4c8 commit 6338a54

7 files changed

Lines changed: 50 additions & 42 deletions

File tree

.github/workflows/build.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ jobs:
3838

3939
snap:
4040
uses: ./.github/workflows/snap.yml
41+
if: false
4142
secrets: inherit
4243

4344
docker:
@@ -67,7 +68,7 @@ jobs:
6768
deploy:
6869
#if: ${{ startsWith(github.ref, 'refs/tags/') }}
6970
runs-on: ubuntu-latest
70-
needs: [linux, docker, flatpak, snap, msvc, doxygen, android, macos]
71+
needs: [linux, docker, flatpak, msvc, doxygen, android, macos]
7172
steps:
7273
- name: Checkout Repository
7374
uses: actions/checkout@v3
@@ -119,6 +120,7 @@ jobs:
119120

120121
- name: Download snap
121122
uses: actions/download-artifact@v4
123+
if: false
122124
with:
123125
pattern: ${{ needs.snap.outputs.name }}*
124126
path: ${{ env.artifact_path }}

Plugins/SSH/BackendSSH.cpp

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -54,23 +54,27 @@ CBackendSSH::OnInitReturnValue CBackendSSH::OnInit()
5454
Q_ASSERT(check);
5555
check = connect(m_pChannelSSH, &CChannelSSHTerminal::readyRead,
5656
this, [&](){
57-
QByteArray data(256, '\0');
58-
int nLen = 0;
59-
if(m_pChannelSSH)
60-
nLen = m_pChannelSSH->read(data.data(), data.length());
61-
if(m_pTerminal && nLen > 0) {
62-
#if defined(Q_OS_WIN)
63-
if(m_pOperate) {
64-
emit m_pOperate->sigReceiveData(data);
57+
char* buf = nullptr;
58+
qint64 nLen = 0;
59+
qint64 nRet = 0;
60+
if(m_pChannelSSH) {
61+
nLen = m_pChannelSSH->bytesAvailable();
62+
if(nLen <= 0) {
63+
qDebug(log) << "No data";
64+
return;
6565
}
66-
#else
67-
write(m_pTerminal->getPtySlaveFd(), data.data(), data.length());
68-
#endif
66+
buf = new char[nLen];
67+
nRet = m_pChannelSSH->read(buf, nLen);
6968
}
70-
else
71-
qCritical(log) << "The m_pTerminal is nullptr or nLen <= 0";
72-
qDebug(log) << "Write data to QTermWidget: " << nLen;
73-
69+
if(m_pTerminal && nRet > 0) {
70+
QByteArray data(buf, nRet);
71+
if(m_pOperate)
72+
emit m_pOperate->sigReceiveData(data);
73+
} else
74+
qCritical(log) << "The m_pTerminal is nullptr or nRet <= 0";
75+
//qDebug(log) << "Write data to QTermWidget: " << nRet << nLen;
76+
if(buf)
77+
delete []buf;
7478
});
7579
Q_ASSERT(check);
7680
check = connect(m_pTerminal, &QTermWidget::sendData,
@@ -122,9 +126,10 @@ bool CBackendSSH::event(QEvent *event)
122126
QEventTerminal *d = (QEventTerminal*)event;
123127
if(m_pChannelSSH && d->m_Data.length() > 0) {
124128
qint64 nRet = m_pChannelSSH->write(d->m_Data.data(), d->m_Data.length());
125-
qDebug(log) << "Write data to ssh channel:" << nRet << d->m_Data.length();
129+
Q_UNUSED(nRet);
130+
//qDebug(log) << "Write data to ssh channel:" << nRet << d->m_Data.length();
126131
} else {
127-
qCritical(log) << "m_pChannelSSH && len <= 0";
132+
//qDebug(log) << "m_pChannelSSH && len <= 0";
128133
}
129134
break;
130135
}

Plugins/SSH/ChannelSSHTerminal.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,19 @@ qint64 CChannelSSHTerminal::readData(char *data, qint64 maxlen)
2222
if(!m_Channel || !ssh_channel_is_open(m_Channel))
2323
return -1;
2424
nRet = ssh_channel_read(m_Channel, data, maxlen, 0);
25-
qDebug(log) << "read data:" << nRet << maxlen;
25+
m_nBytesAvailable -= nRet;
26+
//qDebug(log) << Q_FUNC_INFO << nRet << maxlen << m_nBytesAvailable;
2627
return nRet;
2728
}
2829

29-
qint64 CChannelSSHTerminal::writeData(const char *data, qint64 len)
30+
qint64 CChannelSSHTerminal::writeData(const char *data, qint64 maxlen)
3031
{
3132
qint64 nRet = 0;
3233
if(!m_Channel || !ssh_channel_is_open(m_Channel))
3334
return -1;
34-
if(len > 0)
35-
nRet = ssh_channel_write(m_Channel, data, len);
36-
qDebug(log) << "write data:" << nRet << len;
35+
if(maxlen > 0)
36+
nRet = ssh_channel_write(m_Channel, data, maxlen);
37+
//qDebug(log) << Q_FUNC_INFO << nRet << maxlen;
3738
return nRet;
3839
}
3940

@@ -102,7 +103,8 @@ void CChannelSSHTerminal::SetSize(int row, int column)
102103
int CChannelSSHTerminal::OnProcess(int tm)
103104
{
104105
int nRet = 0;
105-
106+
107+
m_nBytesAvailable = 0;
106108
if(!m_Channel || !ssh_channel_is_open(m_Channel)
107109
|| ssh_channel_is_eof(m_Channel)) {
108110
QString szErr = "The channel is not open";
@@ -187,8 +189,14 @@ int CChannelSSHTerminal::OnProcess(int tm)
187189
//qDebug(log) << "The channel has not data";
188190
return 0;
189191
}
190-
192+
193+
m_nBytesAvailable = nRet;
191194
emit readyRead();
192195

193196
return 0;
194197
}
198+
199+
qint64 CChannelSSHTerminal::bytesAvailable() const
200+
{
201+
return m_nBytesAvailable;
202+
}

Plugins/SSH/ChannelSSHTerminal.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,16 @@ class CChannelSSHTerminal : public CChannelSSH
2121
// QIODevice interface
2222
protected:
2323
virtual qint64 readData(char *data, qint64 maxlen) override;
24-
virtual qint64 writeData(const char *data, qint64 len) override;
24+
virtual qint64 writeData(const char *data, qint64 maxlen) override;
2525

2626
// CChannelSSH interface
2727
private:
2828
virtual int OnOpen(ssh_session session) override;
2929
virtual void OnClose() override;
30+
31+
// QIODevice interface
32+
public:
33+
virtual qint64 bytesAvailable() const override;
34+
private:
35+
qint64 m_nBytesAvailable;
3036
};

Plugins/SSH/OperateSSH.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,12 @@ CBackend *COperateSSH::InstanceBackend()
5454

5555
void COperateSSH::slotReceiveData(const QByteArray &data)
5656
{
57-
qDebug(log) << Q_FUNC_INFO;
57+
//qDebug(log) << Q_FUNC_INFO << data.length();
5858
#if defined(Q_OS_WIN)
5959
if(m_pTerminal) {
6060
m_pTerminal->receiveData(data.data(), data.length());
6161
}
62+
#else
63+
write(m_pTerminal->getPtySlaveFd(), data.data(), data.length());
6264
#endif
6365
}

Src/SSH/ChannelSSH.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -238,18 +238,6 @@ void CChannelSSH::close()
238238
QIODevice::close();
239239
}
240240

241-
qint64 CChannelSSH::readData(char *data, qint64 maxlen)
242-
{
243-
qint64 nRet = 0;
244-
return nRet;
245-
}
246-
247-
qint64 CChannelSSH::writeData(const char *data, qint64 len)
248-
{
249-
qint64 nRet = 0;
250-
return nRet;
251-
}
252-
253241
int CChannelSSH::verifyKnownhost(ssh_session session)
254242
{
255243
int nRet = -1;

Src/SSH/ChannelSSH.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@ class PLUGIN_EXPORT CChannelSSH : public CChannel
2222
virtual bool open(OpenMode mode) override;
2323
virtual void close() override;
2424
virtual int WakeUp();
25-
protected:
26-
virtual qint64 readData(char *data, qint64 maxlen) override;
27-
virtual qint64 writeData(const char *data, qint64 len) override;
2825

2926
// CChannel interface
3027
public:

0 commit comments

Comments
 (0)