11#include <QNetworkAccessManager>
12#include <QNetworkCookie>
18#include <QStringMatcher>
81 QString path = url.path();
82 QString infofilebasename = QFileInfo(path).fileName();
83 if (!infofilebasename.isEmpty()&&path.endsWith(infofilebasename)) {
116 connect(
m_netreply, SIGNAL(downloadProgress(qint64,qint64)),
124 const QString& tmpcopydir,
128 ,
m_d(new
Imp(this,fileinfoUrl,updateInterval))
144 m_d->m_netmanager = netmanager;
150 return m_d->m_fileInfoUrl;
155 QUrl fileInfoUrl(
m_d->m_fileInfoUrl);
156 QNetworkRequest netrequest(fileInfoUrl);
157 if(
m_d->m_stage==0) {
161 m_d->m_netreply =
m_d->m_netmanager->head(netrequest);
162 }
else if(
m_d->m_stage==1) {
166 m_d->m_netreply =
m_d->m_netmanager->get(netrequest);
174 QString target = activeRetrievalDir +
"downloadedfileinfo.txt";
177 if (!newEvtsOnServerInfo.
isValid()) {
178 message(
"Problems decoding info in file downloaded from " +
m_d->m_fileInfoUrl);
179 QFile::remove(target);
182 m_d->startTimer(
m_d->m_updateInterval);
191 if (!evt.isValid()||
inHistory(evt.runNumber(),evt.eventNumber()))
193 if (!QFile::exists(localfiledir+evt.fileName())){
203 QList<VP1EventFile> freshLocalEvents =
freshEvents();
206 if (evt < evtToGet) {
210 m_d->startTimer(
m_d->m_updateInterval);
217 m_d->m_expectedMD5Sum = evtToGet.
md5Sum();
221 QNetworkRequest netrequestEvt(url);
223 m_d->m_netreply =
m_d->m_netmanager->get(netrequestEvt);
226 m_d->startTimer(
m_d->m_updateInterval);
230 m_d->connectNetworkSignalsToSlots();
237 QVariant val =
m_d->m_netreply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
238 if(val.type()==QVariant::Int)
239 sc = val.value<
int>();
240 else if(val.type()==QVariant::Invalid)
241 message(
"No status code obtained while processing " +
m_d->m_netreply->url().toString());
242 else if(!val.canConvert<
int>())
243 message(
"Cannot convert status code to int while processing " +
m_d->m_netreply->url().toString());
245 sc = val.value<
int>();
249 QString lastModified;
250 QVariant lastModHeader =
m_d->m_netreply->header(QNetworkRequest::LastModifiedHeader);
251 if(lastModHeader.type()!=QVariant::Invalid &&
252 lastModHeader.canConvert<QDateTime>()) {
253 QDateTime lastModTime = lastModHeader.value<QDateTime>();
254 lastModified = lastModTime.toString();
264 if(
m_d->m_netreply->error()==QNetworkReply::NoError) {
265 if(
m_d->m_stage==0) {
266 if(!lastModified.isEmpty() && lastModified!=
m_d->m_urlLastMod) {
268 m_d->m_urlLastMod = std::move(lastModified);
274 }
else if(
m_d->m_stage==1) {
277 QString target = activeRetrievalDir +
"downloadedfileinfo.txt";
284 if(QFileInfo(target).
exists() && !QFile(target).remove()) {
285 message(
"ERROR: Could not remove the old fileinfo " + target);
287 m_d->startTimer(
m_d->m_updateInterval);
292 QFile localfileinfo(target);
293 if(!localfileinfo.open(QIODevice::WriteOnly)) {
294 message(
"ERROR: Unable to open " + target +
" for writing");
296 m_d->startTimer(
m_d->m_updateInterval);
301 QByteArray ba =
m_d->m_netreply->readAll();
302 localfileinfo.write(ba);
303 localfileinfo.close();
305 }
else if(
m_d->m_stage==2) {
308 QFile targetFile(target);
309 if(!targetFile.open(QIODevice::WriteOnly)) {
310 message(
"ERROR: Unable to open " + target +
" for writing");
312 m_d->startTimer(
m_d->m_updateInterval);
317 QByteArray ba =
m_d->m_netreply->readAll();
318 targetFile.write(ba);
327 message(
"Checksum did not match");
328 QFile::remove(target);
330 m_d->startTimer(
m_d->m_updateInterval);
335 if(!QFile::rename(target,finalTarget)) {
336 message(
"ERROR: Could not move " + target +
" to " + finalTarget);
337 QFile::remove(target);
338 QFile::remove(finalTarget);
349 m_d->m_netreply->blockSignals(
true);
350 m_d->m_netreply->deleteLater();
353 int interval =
m_d->m_stage>0 ? 0 :
m_d->m_updateInterval;
354 m_d->startTimer(interval);
359 message(
"Error processing " +
m_d->m_netreply->url().toString()
360 +
"\n ===> Error code: " + QString::number((
int)err)
361 +
"\n Error decoding here: http://doc.trolltech.com/4.4/qnetworkreply.html#NetworkError-enum");
373 m_d->m_netreply->ignoreSslErrors();
380 if(received>
m_d->m_bytesReceived) {
381 m_d->m_lastChangeTime = QDateTime::currentDateTime().toTime_t();
382 m_d->m_bytesReceived = received;
385 m_d->m_lastChangeTime = QDateTime::currentDateTime().toTime_t();
391 unsigned currentTime = QDateTime::currentDateTime().toTime_t();
392 if (currentTime>
m_d->m_lastChangeTime+10) {
394 if(
m_d->m_netreply) {
395 m_d->m_netreply->blockSignals(
true);
396 delete m_d->m_netreply;
399 m_d->startTimer(
m_d->m_updateInterval);
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
QList< VP1EventFile > freshEvents() const
QString tmpLocalFileDir() const
void message(const QString &) const
VP1AvailEvents(int timeCutForNew, const QString &tmpdir, int maxLocalFilesToKeep=-1, QObject *parent=0)
bool requireNewestRunNumber() const
int timeCutForNew() const
bool inHistory(int run, int event) const
int maxLocalFilesToKeep() const
void invalidateDirCache(const QString &dir)
void cleanupAndCheckForEventListChanges()
QString tmpActiveRetrievalDir()
unsigned m_lastChangeTime
void connectNetworkSignalsToSlots()
QNetworkAccessManager * m_netmanager
void startTimer(int interval=0)
VP1AvailEvtsHttps * m_theclass
Imp(VP1AvailEvtsHttps *, QString, int)
QNetworkReply * m_netreply
void error(QNetworkReply::NetworkError)
void generateHttpsRequest()
virtual ~VP1AvailEvtsHttps()
const QString & fileinfoLocation()
VP1AvailEvtsHttps(const QString &fileinfoUrl, int updateInterval, int timeCutForNew, const QString &tmpcopydir, int maxLocalFilesToKeep=-1, QObject *parent=0)
void sslErrors(const QList< QSslError > &)
void dataReadProgress(qint64, qint64)
void start(QNetworkAccessManager *netmanager)
const QString & fileName() const
const QString & md5Sum() const
QList< VP1EventFile > events(int timecut=-1, bool requireNewestRunNumber=false) const
static bool sumMatches(const QString &filename, const QByteArray &md5sum)
static void messageDebug(const QString &)
bool exists(const std::string &filename)
does a file exist
bool match(std::string s1, std::string s2)
match the individual directories of two strings