1 //=============================================================================
2 //
3 //   File : KviFileTransfer.cpp
4 //   Creation date : Mon Apr 21 22:14:31 2003 GMT by Szymon Stefanek
5 //
6 //   This file is part of the KVIrc IRC client distribution
7 //   Copyright (C) 2003-2010 Szymon Stefanek (pragma at kvirc dot net)
8 //
9 //   This program is FREE software. You can redistribute it and/or
10 //   modify it under the terms of the GNU General Public License
11 //   as published by the Free Software Foundation; either version 2
12 //   of the License, or (at your option) any later version.
13 //
14 //   This program is distributed in the HOPE that it will be USEFUL,
15 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
16 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 //   See the GNU General Public License for more details.
18 //
19 //   You should have received a copy of the GNU General Public License
20 //   along with this program. If not, write to the Free Software Foundation,
21 //   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 //
23 //=============================================================================
24 
25 #include "KviFileTransfer.h"
26 #include "KviKvsScript.h"
27 #include "KviModuleExtension.h"
28 #include "KviWindow.h"
29 
30 #include "KviApplication.h"
31 
32 #include <QMenu>
33 #include <algorithm>
34 #include <vector>
35 
36 static KviFileTransferManager * g_pFileTransferManager = nullptr;
37 
KviFileTransferManager()38 KviFileTransferManager::KviFileTransferManager()
39     : QObject()
40 {
41 }
42 
~KviFileTransferManager()43 KviFileTransferManager::~KviFileTransferManager()
44 {
45 	killAllTransfers();
46 }
47 
instance()48 KviFileTransferManager * KviFileTransferManager::instance()
49 {
50 	if(!g_pFileTransferManager)
51 		g_pFileTransferManager = new KviFileTransferManager();
52 	return g_pFileTransferManager;
53 }
54 
cleanup()55 void KviFileTransferManager::cleanup()
56 {
57 	if(g_pFileTransferManager)
58 	{
59 		delete g_pFileTransferManager;
60 		g_pFileTransferManager = nullptr;
61 	}
62 }
63 
killAllTransfers()64 void KviFileTransferManager::killAllTransfers()
65 {
66 	while (true)
67 	{
68 		const auto tIt = m_pTransferList.rbegin();
69 		if (tIt == m_pTransferList.rend())
70 			break;
71 		const auto t = *tIt;
72 		t->die();
73 	}
74 }
75 
killTerminatedTransfers()76 void KviFileTransferManager::killTerminatedTransfers()
77 {
78 	std::vector<KviFileTransfer *> copyterm;
79 	for (auto & f : m_pTransferList)
80 		if (f->terminated())
81 			copyterm.push_back(f);
82 
83 	for (auto & f : copyterm)
84 		f->die();
85 }
86 
invokeTransferWindow(bool bCreateMinimized,bool bNoRaise)87 void KviFileTransferManager::invokeTransferWindow(bool bCreateMinimized, bool bNoRaise)
88 {
89 	if(!m_pTransferWindow)
90 	{
91 		QString szScript("filetransferwindow.open");
92 		if(bCreateMinimized)
93 			szScript.append(" -m");
94 		if(bNoRaise)
95 			szScript.append(" -n");
96 		KviKvsScript::run(szScript, g_pActiveWindow);
97 	}
98 }
99 
registerTransfer(KviFileTransfer * t)100 void KviFileTransferManager::registerTransfer(KviFileTransfer * t)
101 {
102 	m_pTransferList.push_back(t);
103 
104 	emit transferRegistered(t);
105 }
106 
unregisterTransfer(KviFileTransfer * t)107 void KviFileTransferManager::unregisterTransfer(KviFileTransfer * t)
108 {
109 	if(m_pTransferList.empty())
110 	{
111 		qDebug("Oops: unregistering transfer with no transfer list!");
112 		return;
113 	}
114 
115 	emit transferUnregistering(t);
116 
117 	m_pTransferList.erase(std::remove(m_pTransferList.begin(), m_pTransferList.end(), t), m_pTransferList.end());
118 }
119 
KviFileTransfer()120 KviFileTransfer::KviFileTransfer()
121     : QObject()
122 {
123 	m_iId = g_pApp->getGloballyUniqueId();
124 	manager()->registerTransfer(this);
125 }
126 
~KviFileTransfer()127 KviFileTransfer::~KviFileTransfer()
128 {
129 	manager()->unregisterTransfer(this);
130 }
131 
outputWindow()132 KviWindow * KviFileTransfer::outputWindow()
133 {
134 	KviWindow * o = transferWindow();
135 	if(o)
136 		return o;
137 	return g_pActiveWindow;
138 }
139 
invokeTransferWindow(bool bCreateMinimized,bool bNoRaise)140 void KviFileTransfer::invokeTransferWindow(bool bCreateMinimized, bool bNoRaise)
141 {
142 	manager()->invokeTransferWindow(bCreateMinimized, bNoRaise);
143 }
144 
localFileName()145 QString KviFileTransfer::localFileName()
146 {
147 	return {};
148 }
149 
retryCommand()150 QString KviFileTransfer::retryCommand()
151 {
152 	return {};
153 }
154 
terminated()155 bool KviFileTransfer::terminated()
156 {
157 	return !active();
158 }
159 
tipText()160 QString KviFileTransfer::tipText()
161 {
162 	return {};
163 }
164 
displayHeight(int iLineSpacing)165 int KviFileTransfer::displayHeight(int iLineSpacing)
166 {
167 	return iLineSpacing * 2;
168 }
169 
displayUpdate()170 void KviFileTransfer::displayUpdate()
171 {
172 	if(m_pDisplayItem)
173 		m_pDisplayItem->displayUpdate();
174 }
175 
die()176 void KviFileTransfer::die()
177 {
178 	if(m_pDisplayItem)
179 		m_pDisplayItem->tableWidget()->removeRow(m_pDisplayItem->row());
180 	delete this;
181 }
182