玉兔远程控制 0.1.0-bate4
载入中...
搜索中...
未找到
OperateFileTransfer.cpp
1// Copyright Copyright (c) Kang Lin studio, All Rights Reserved
2// Author Kang Lin <kl222@126.com>
3
4#include <QLoggingCategory>
5#include <QRegularExpression>
6#include <QClipboard>
7#include <QApplication>
8#include <QMimeData>
9#include <QUrl>
10
11#include "BackendFileTransfer.h"
12#include "OperateFileTransfer.h"
13#include "Plugin.h"
14#include "DlgFileTransfer.h"
15
16static Q_LOGGING_CATEGORY(log, "Plugin.FileTransfer.Operate")
17
19 , m_frmFileTransfer(nullptr)
20 , m_pThread(nullptr)
21{
22 qDebug(log) << Q_FUNC_INFO;
23 bool check = connect(&m_Parameter, &CParameter::sigChanged,
24 this, [&](){
25 emit this->sigUpdateParameters(this);
26 });
27 Q_ASSERT(check);
28}
29
30COperateFileTransfer::~COperateFileTransfer()
31{
32 qDebug(log) << Q_FUNC_INFO;
33}
34
39
40CParameterFileTransfer* COperateFileTransfer::GetParameter()
41{
42 return &m_Parameter;
43}
44
46{
47 return GetPlugin()->Version().toInt();
48}
49
51{
52 return m_frmFileTransfer;
53}
54
56{
57 int nRet = 0;
58 nRet = COperate::Initial();
59 if(nRet)
60 return nRet;
61
62 if(m_pActionSettings) {
63 m_Menu.addSeparator();
64 m_Menu.addAction(m_pActionSettings);
65 }
66
67 m_frmFileTransfer = new CFrmFileTransfer();
68 if(m_frmFileTransfer) {
69 bool check = connect(m_frmFileTransfer, SIGNAL(sigCopyUrlToClipboard(const QString&)),
70 this, SLOT(slotCopyUrlToClipboard(const QString&)));
71 Q_ASSERT(check);
72 }
73
74 return nRet;
75}
76
78{
79 int nRet = 0;
80 if(m_frmFileTransfer) {
81 m_frmFileTransfer->deleteLater();
82 m_frmFileTransfer = nullptr;
83 }
84 nRet = COperate::Clean();
85 return nRet;
86}
87
89{
90 int nRet = 0;
91 m_pThread = new CBackendThread(this);
92 if(!m_pThread) {
93 qCritical(log) << "new CBackendThread fail";
94 return -2;
95 }
96 m_pThread->start();
97 return nRet;
98}
99
101{
102 int nRet = 0;
103 if(m_pThread)
104 {
105 m_pThread->quit();
106 //Don't delete m_pThread, See CBackendThread
107 m_pThread = nullptr;
108 }
109 return nRet;
110}
111
113{
114 return m_Parameter.SetGlobalParameters(pPara);
115}
116
118{
119 return new CDlgFileTransfer(&m_Parameter, parent);
120}
121
122int COperateFileTransfer::Load(QSettings &set)
123{
124 if(m_frmFileTransfer)
125 m_frmFileTransfer->Load(set);
126 return m_Parameter.Load(set);
127}
128
129int COperateFileTransfer::Save(QSettings &set)
130{
131 if(m_frmFileTransfer)
132 m_frmFileTransfer->Save(set);
133 return m_Parameter.Save(set);
134}
135
137{
138 QString szName;
139 CParameterNet* pNet = nullptr;
140 switch((CParameterFileTransfer::Protocol)m_Parameter.GetProtocol()) {
141 case CParameterFileTransfer::Protocol::SFTP:
142 pNet = &m_Parameter.m_SSH.m_Net;
143 break;
144 case CParameterFileTransfer::Protocol::FTP:
145 pNet = &m_Parameter.m_Net;
146 break;
147 }
148 if(!pNet->GetHost().isEmpty()) {
149 if(m_Parameter.GetGlobalParameters()
150 && m_Parameter.GetGlobalParameters()->GetShowProtocolPrefix())
151 szName = Protocol() + ":";
152 szName += pNet->GetHost()
153 + ":" + QString::number(pNet->GetPort());
154 }
155 if(szName.isEmpty())
156 szName = COperate::Name();
157 return szName;
158}
159
161{
162 QString szDescription;
163 if(!Name().isEmpty())
164 szDescription = tr("Name: ") + Name() + "\n";
165
166 if(!GetTypeName().isEmpty())
167 szDescription += tr("Type: ") + GetTypeName() + "\n";
168
169 if(!Protocol().isEmpty()) {
170 szDescription += tr("Protocol: ") + Protocol();
171#ifdef DEBUG
172 if(!GetPlugin()->DisplayName().isEmpty())
173 szDescription += " - " + GetPlugin()->DisplayName();
174#endif
175 szDescription += "\n";
176 }
177
178 auto &net = m_Parameter.m_Net;
179 if(!net.GetHost().isEmpty())
180 szDescription += tr("Server address: ") + net.GetHost()
181 + ":" + QString::number(net.GetPort()) + "\n";
182
183 if(GetSecurityLevel() != SecurityLevel::No)
184 szDescription += tr("Security level: ") + GetSecurityLevelString() + "\n";
185
186 if(!GetPlugin()->Description().isEmpty())
187 szDescription += tr("Description: ") + GetPlugin()->Description();
188
189 return szDescription;
190}
191
193{
194 switch(m_Parameter.GetProtocol()) {
195 case CParameterFileTransfer::Protocol::FTP:
196 return "FTP";
197 case CParameterFileTransfer::Protocol::SFTP:
198 return "SFTP";
199 }
200 return QString();
201}
202
204{
205 QString szId = COperate::Id();
206 CParameterNet* pNet = nullptr;
207 switch(m_Parameter.GetProtocol()) {
208 case CParameterFileTransfer::Protocol::SFTP:
209 pNet = &m_Parameter.m_SSH.m_Net;
210 break;
211 case CParameterFileTransfer::Protocol::FTP:
212 pNet = &m_Parameter.m_Net;
213 break;
214 default:
215 break;
216 }
217 if(pNet && !pNet->GetHost().isEmpty())
218 szId += "_" + pNet->GetHost()
219 + "_" + QString::number(pNet->GetPort());
220
221 static QRegularExpression exp("[-@:/#%!^&* \\.]");
222 szId = szId.replace(exp, "_");
223 return szId;
224}
225
226void COperateFileTransfer::slotCopyUrlToClipboard(const QString &szPath)
227{
228 QUrl url;
229 url.setPath(szPath);
230 CParameterNet* pNet = nullptr;
231 if(m_Parameter.GetProtocol() == CParameterFileTransfer::Protocol::SFTP) {
232 pNet = &m_Parameter.m_SSH.m_Net;
233 if(pNet->GetHost().isEmpty()) {
234 return;
235 }
236 url.setScheme("sftp");
237 }
238 if(m_Parameter.GetProtocol() == CParameterFileTransfer::Protocol::FTP) {
239 pNet = &m_Parameter.m_Net;
240 if(pNet->GetHost().isEmpty()) {
241 return;
242 }
243 url.setScheme("ftp");
244 }
245 if(!pNet) return;
246 url.setUserName(pNet->m_User.GetUser());
247 //url.setPassword(pNet->m_User.GetPassword());
248 url.setHost(pNet->GetHost());
249 url.setPort(pNet->GetPort());
250 QClipboard* pClipboard = QApplication::clipboard();
251 pClipboard->setText(url.toString());
252 // QMimeData* d = new QMimeData();
253 // d->setUrls(QList<QUrl>() << QUrl(url));
254 // pClipboard->setMimeData(d);
255}
The backend thread
virtual void quit()
Quit
后端接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Start()、 slotTimeOut()、 OnProcess() 。 当然,它仍然支...
Definition Backend.h:42
File transfer operate interface
virtual const QString Protocol() const override
Protocol
virtual int Stop() override
关闭
virtual int Initial() override
Initial parameters and resource
virtual const QString Id() override
Identity
virtual int Save(QSettings &set) override
保存参数
virtual const QString Description() override
Description
virtual const QString Name() override
Name
virtual int Load(QSettings &set) override
加载参数
virtual QWidget * GetViewer() override
得到显示视图
virtual int Clean() override
Clean parameters and resource
virtual int Start() override
开始
virtual int SetGlobalParameters(CParameterPlugin *pPara) override
应用插件全局参数
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
得到设置对话框
virtual Q_INVOKABLE CBackend * InstanceBackend()
新建后端实例。它的所有者是调用者, 如果调用者不再使用它,调用者必须负责释放它。
virtual const qint16 Version() const override
Version
操作接口。
Definition Operate.h:51
virtual Q_INVOKABLE int Initial()
Initial parameters and resource
Definition Operate.cpp:230
virtual Q_INVOKABLE int Clean()
Clean parameters and resource
Definition Operate.cpp:247
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin
Definition Operate.cpp:259
virtual const QString Name()
Name
Definition Operate.cpp:41
virtual const QString Id()
Identity
Definition Operate.cpp:33
virtual const QString GetTypeName() const
Get type name
Definition Operate.cpp:76
网络连接参数接口。此类仅在插件内有效。 其界面为 CParameterNetUI
CParameterUser m_User
[Instance user]
CParameterPlugin * GetGlobalParameters()
Get CParameterPlugin
插件的全局参数。
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file
Definition Parameter.cpp:46
void sigChanged()
当参数改变时,触发 通常如果需要,则相应的参数会对应一个改变事件。
virtual int Load(QString szFile=QString())
Load from file
Definition Parameter.cpp:35
插件接口
Definition Plugin.h:15
virtual const QString Version() const =0
Version
virtual const QString DisplayName() const
在界面上显示的名称
Definition Plugin.cpp:73
virtual const QString Description() const =0
描述