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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
|
#ifndef _SEND_H_
#define _SEND_H_
//=============================================================================
//
// File : send.h
// Creation date : Tue Sep 24 09 2000 15:06:12 by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
// Copyright (C) 2000-2005 Szymon Stefanek (pragma at kvirc dot net)
//
// 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 opinion) 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================
#include "kvi_window.h"
#include "kvi_string.h"
#include "descriptor.h"
#include "window.h"
#include "thread.h"
#include "kvi_sockettype.h"
#include "kvi_pointerlist.h"
#include <qlabel.h>
#include <qprogressbar.h>
#include "kvi_tal_popupmenu.h"
#include "kvi_tal_hbox.h"
#include "kvi_tal_vbox.h"
#include <qfile.h>
#include <qdialog.h>
#include "kvi_filetransfer.h"
#include "kvi_time.h"
typedef struct _KviDccSendThreadOptions
{
KviStr szFileName;
int iStartPosition;
int iPacketSize;
int iIdleStepLengthInMSec;
bool bFastSend;
bool bNoAcks;
bool bIsTdcc;
unsigned int uMaxBandwidth;
} KviDccSendThreadOptions;
class KviDccSendThread : public KviDccThread
{
public:
KviDccSendThread(QObject * par,kvi_socket_t fd,KviDccSendThreadOptions * opt);
~KviDccSendThread();
private:
// stats: SHARED!!!
int m_iAverageSpeed;
int m_iInstantSpeed;
int m_iFilePosition;
int m_iAckedBytes;
int m_iTotalSentBytes;
// internal
unsigned long m_uStartTime;
unsigned long m_uInstantSpeedInterval;
int m_iInstantSentBytes;
KviDccSendThreadOptions * m_pOpt;
KviMSecTimeInterval * m_pTimeInterval; // used for computing the instant bandwidth but not only
public:
void initGetInfo();
int averageSpeed(){ return m_iAverageSpeed; };
int instantSpeed(){ return m_iInstantSpeed; };
int filePosition(){ return m_iFilePosition; };
// sent ONLY in this session
int sentBytes(){ return m_iTotalSentBytes; };
int ackedBytes(){ return m_iAckedBytes; };
unsigned int bandwidthLimit(){ return m_pOpt->uMaxBandwidth; };
void setBandwidthLimit(unsigned int uMaxBandwidth){ m_pOpt->uMaxBandwidth = uMaxBandwidth; };
void doneGetInfo();
protected:
void updateStats();
virtual void run();
};
typedef struct _KviDccRecvThreadOptions
{
bool bResume;
KviStr szFileName;
int iTotalFileSize;
int iIdleStepLengthInMSec;
bool bSendZeroAck;
bool bNoAcks;
bool bIsTdcc;
unsigned int uMaxBandwidth;
} KviDccRecvThreadOptions;
class KviDccRecvThread : public KviDccThread
{
public:
KviDccRecvThread(QObject * par,kvi_socket_t fd,KviDccRecvThreadOptions * opt);
~KviDccRecvThread();
protected:
KviDccRecvThreadOptions * m_pOpt;
// stats: SHARED!
int m_iAverageSpeed;
int m_iInstantSpeed;
int m_iFilePosition;
int m_iTotalReceivedBytes;
// internal
unsigned long m_uStartTime;
KviMSecTimeInterval * m_pTimeInterval; // used for computing the instant bandwidth
int m_iInstantReceivedBytes;
unsigned long m_uInstantSpeedInterval;
QFile * m_pFile;
public:
void initGetInfo();
int averageSpeed(){ return m_iAverageSpeed; };
int instantSpeed(){ return m_iInstantSpeed; };
int filePosition(){ return m_iFilePosition; };
// received ONLY in this session
int receivedBytes(){ return m_iTotalReceivedBytes; };
unsigned int bandwidthLimit(){ return m_pOpt->uMaxBandwidth; };
void setBandwidthLimit(unsigned int uMaxBandwidth){ m_pOpt->uMaxBandwidth = uMaxBandwidth; };
void doneGetInfo();
protected:
void postMessageEvent(const char * msg);
void updateStats();
bool sendAck(int filePos);
virtual void run();
};
class KviDccFileTransfer;
class QSpinBox;
class QTimer;
#include "kvi_styled_controls.h"
class KviDccFileTransferBandwidthDialog : public QDialog
{
Q_OBJECT
public:
KviDccFileTransferBandwidthDialog(QWidget * pParent,KviDccFileTransfer * t);
~KviDccFileTransferBandwidthDialog();
protected:
KviDccFileTransfer * m_pTransfer;
KviStyledCheckBox * m_pEnableLimitCheck;
QSpinBox * m_pLimitBox;
protected:
virtual void closeEvent(QCloseEvent *e);
protected slots:
void okClicked();
void cancelClicked();
};
class KviDccMarshal;
class QPainter;
class KviTalPopupMenu;
class KviDccFileTransfer : public KviFileTransfer, public KviDccMarshalOutputContext
{
enum GeneralStatus { Connecting , Transferring , Success , Failure };
Q_OBJECT
public:
KviDccFileTransfer(KviDccDescriptor * dcc);
~KviDccFileTransfer();
private:
KviDccSendThread * m_pSlaveSendThread;
KviDccRecvThread * m_pSlaveRecvThread;
KviDccDescriptor * m_pDescriptor;
KviDccMarshal * m_pMarshal;
KviStr m_szTarget;
KviStr m_szDccType;
QString m_szTransferIdString;
QString m_szStatusString;
GeneralStatus m_eGeneralStatus;
QString m_szTransferLog; // html
kvi_time_t m_tTransferStartTime;
kvi_time_t m_tTransferEndTime;
// cached stats
unsigned int m_uTotalFileSize; // total file size to transfer
unsigned int m_uMaxBandwidth;
KviDccFileTransferBandwidthDialog * m_pBandwidthDialog;
QTimer * m_pResumeTimer; // used to signal resume timeout
public:
bool resumeAccepted(const char * filename,const char * port,const char *szZeroPortTag);
bool doResume(const char * filename,const char * port,unsigned int filePos);
static void init();
static void done();
static unsigned int runningTransfersCount();
static KviDccFileTransfer * nonFailedTransferWithLocalFileName(const QString &szLocalFileName);
static unsigned int transferCount();
static bool handleResumeAccepted(const char * filename,const char * port,const char * szZeroPortTag);
static bool handleResumeRequest(const char * filename,const char * port,unsigned int filePos);
virtual bool event(QEvent *e);
virtual KviWindow * dccMarshalOutputWindow();
virtual const char * dccMarshalOutputContextString();
virtual void displayPaint(QPainter * p,int column,int width,int height);
virtual int displayHeight(int iLineSpacing);
virtual void fillContextPopup(KviTalPopupMenu * m,int column);
virtual void fillStatusString(QString &szBuffer);
virtual bool active();
virtual void die();
virtual QString tipText();
virtual QString localFileName();
bool isFileUpload(){ return m_pDescriptor->isFileUpload(); };
unsigned int averageSpeed();
unsigned int transferredBytes();
int bandwidthLimit();
void setBandwidthLimit(int iVal);
protected:
void startConnection();
void listenOrConnect();
void addToTransferLog(const QString &s);
void outputAndLog(const QString &s);
void outputAndLog(int msgtype,const QString &s);
KviWindow * eventWindow();
protected slots:
void connectionInProgress();
void sslError(const char * msg);
void startingSSLHandshake();
void handleMarshalError(int err);
void connected();
void bandwidthDialogDestroyed();
void configureBandwidth();
void resumeTimedOut();
public slots:
void abort();
void retryDCC();
void retryTDCC();
void retryRevDCC();
};
#endif //_SEND_H_
|