3
//=============================================================================
6
// Creation date : Tue Sep 24 09 2000 15:06:12 by Szymon Stefanek
8
// This file is part of the KVirc irc client distribution
9
// Copyright (C) 2000-2008 Szymon Stefanek (pragma at kvirc dot net)
11
// This program is FREE software. You can redistribute it and/or
12
// modify it under the terms of the GNU General Public License
13
// as published by the Free Software Foundation; either version 2
14
// of the License, or (at your opinion) any later version.
16
// This program is distributed in the HOPE that it will be USEFUL,
17
// but WITHOUT ANY WARRANTY; without even the implied warranty of
18
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19
// See the GNU General Public License for more details.
21
// You should have received a copy of the GNU General Public License
22
// along with this program. If not, write to the Free Software Foundation,
23
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25
//=============================================================================
27
#include "descriptor.h"
31
#include "kvi_window.h"
32
#include "kvi_string.h"
33
#include "kvi_sockettype.h"
34
#include "kvi_pointerlist.h"
35
#include "kvi_filetransfer.h"
37
#include "kvi_tal_popupmenu.h"
38
#include "kvi_tal_hbox.h"
39
#include "kvi_tal_vbox.h"
42
#include <QProgressBar>
50
class KviDccFileTransfer;
52
class KviTalPopupMenu;
54
typedef struct _KviDccSendThreadOptions
57
quint64 uStartPosition;
59
int iIdleStepLengthInMSec;
63
unsigned int uMaxBandwidth;
64
} KviDccSendThreadOptions;
67
class KviDccSendThread : public KviDccThread
70
KviDccSendThread(QObject * par,kvi_socket_t fd,KviDccSendThreadOptions * opt);
76
quint64 m_uFilePosition;
77
quint64 m_uAckedBytes;
78
quint64 m_uTotalSentBytes;
80
unsigned long m_uStartTime;
81
unsigned long m_uInstantSpeedInterval;
82
quint64 m_uInstantSentBytes;
83
KviDccSendThreadOptions * m_pOpt;
84
KviMSecTimeInterval * m_pTimeInterval; // used for computing the instant bandwidth but not only
87
uint averageSpeed(){ return m_uAverageSpeed; };
88
uint instantSpeed(){ return m_uInstantSpeed; };
89
quint64 filePosition(){ return m_uFilePosition; };
90
// sent ONLY in this session
91
quint64 sentBytes(){ return m_uTotalSentBytes; };
92
quint64 ackedBytes(){ return m_uAckedBytes; };
93
unsigned int bandwidthLimit(){ return m_pOpt->uMaxBandwidth; };
94
void setBandwidthLimit(unsigned int uMaxBandwidth){ m_pOpt->uMaxBandwidth = uMaxBandwidth; };
101
typedef struct _KviDccRecvThreadOptions
105
quint64 uTotalFileSize;
106
int iIdleStepLengthInMSec;
110
unsigned int uMaxBandwidth;
111
} KviDccRecvThreadOptions;
113
class KviDccRecvThread : public KviDccThread
116
KviDccRecvThread(QObject * par,kvi_socket_t fd,KviDccRecvThreadOptions * opt);
119
KviDccRecvThreadOptions * m_pOpt;
122
uint m_uAverageSpeed;
123
uint m_uInstantSpeed;
124
quint64 m_uFilePosition;
125
quint64 m_uTotalReceivedBytes;
128
unsigned long m_uStartTime;
129
KviMSecTimeInterval * m_pTimeInterval; // used for computing the instant bandwidth
130
quint64 m_uInstantReceivedBytes;
131
quint64 m_uInstantSpeedInterval;
135
uint averageSpeed(){ return m_uAverageSpeed; };
136
uint instantSpeed(){ return m_uInstantSpeed; };
137
quint64 filePosition(){ return m_uFilePosition; };
138
// received ONLY in this session
139
quint64 receivedBytes(){ return m_uTotalReceivedBytes; };
140
unsigned int bandwidthLimit(){ return m_pOpt->uMaxBandwidth; };
141
void setBandwidthLimit(unsigned int uMaxBandwidth){ m_pOpt->uMaxBandwidth = uMaxBandwidth; };
144
void postMessageEvent(const char * msg);
146
bool sendAck(int filePos);
151
class KviDccFileTransferBandwidthDialog : public QDialog
155
KviDccFileTransferBandwidthDialog(QWidget * pParent,KviDccFileTransfer * t);
156
~KviDccFileTransferBandwidthDialog();
158
KviDccFileTransfer * m_pTransfer;
159
QCheckBox * m_pEnableLimitCheck;
160
QSpinBox * m_pLimitBox;
162
virtual void closeEvent(QCloseEvent *e);
165
void cancelClicked();
169
class KviDccFileTransfer : public KviFileTransfer, public KviDccMarshalOutputContext
171
enum GeneralStatus { Connecting , Transferring , Success , Failure };
174
KviDccFileTransfer(KviDccDescriptor * dcc);
175
~KviDccFileTransfer();
177
KviDccSendThread * m_pSlaveSendThread;
178
KviDccRecvThread * m_pSlaveRecvThread;
179
KviDccDescriptor * m_pDescriptor;
180
KviDccMarshal * m_pMarshal;
184
QString m_szTransferIdString;
186
QString m_szStatusString;
187
GeneralStatus m_eGeneralStatus;
189
QString m_szTransferLog; // html
191
kvi_time_t m_tTransferStartTime;
192
kvi_time_t m_tTransferEndTime;
194
quint64 m_uTotalFileSize; // total file size to transfer
196
unsigned int m_uMaxBandwidth;
197
KviDccFileTransferBandwidthDialog * m_pBandwidthDialog;
199
QTimer * m_pResumeTimer; // used to signal resume timeout
201
bool resumeAccepted(const char * filename,const char * port,const char *szZeroPortTag);
202
bool doResume(const char * filename,const char * port,quint64 filePos);
206
static unsigned int runningTransfersCount();
207
static KviDccFileTransfer * nonFailedTransferWithLocalFileName(const QString &szLocalFileName);
208
static unsigned int transferCount();
209
static bool handleResumeAccepted(const char * filename,const char * port,const char * szZeroPortTag);
210
static bool handleResumeRequest(const char * filename,const char * port,quint64 filePos);
212
virtual bool event(QEvent *e);
214
virtual KviWindow * dccMarshalOutputWindow();
215
virtual const char * dccMarshalOutputContextString();
217
virtual void displayPaint(QPainter * p,int column, QRect rect);
218
virtual int displayHeight(int iLineSpacing);
219
virtual void fillContextPopup(KviTalPopupMenu * m);
220
virtual void fillStatusString(QString &szBuffer);
221
virtual bool active();
222
virtual QString tipText();
223
virtual QString localFileName();
225
bool isFileUpload(){ return m_pDescriptor->isFileUpload(); };
227
unsigned int averageSpeed();
228
unsigned int transferredBytes();
230
int bandwidthLimit();
231
void setBandwidthLimit(int iVal);
233
void startConnection();
234
void listenOrConnect();
235
void addToTransferLog(const QString &s);
236
void outputAndLog(const QString &s);
237
void outputAndLog(int msgtype,const QString &s);
238
KviWindow * eventWindow();
240
void connectionInProgress();
241
void sslError(const char * msg);
242
void startingSSLHandshake();
243
void handleMarshalError(int err);
245
void bandwidthDialogDestroyed();
246
void configureBandwidth();
247
void resumeTimedOut();