mirror of
https://github.com/nextcloud/desktop.git
synced 2024-10-24 21:35:47 +03:00
Removing (hopefully) the last of the memory bugs. This time in file
upload and download.
This commit is contained in:
parent
1db4fc9fd4
commit
125a0e2cfc
4 changed files with 74 additions and 12 deletions
|
@ -71,8 +71,8 @@ OwnCloudSync::OwnCloudSync(QString name, WId id) : mAccountName(name),mWinId(id)
|
|||
this, SLOT(directoryListingError(QString)));
|
||||
connect(mWebdav,SIGNAL(directoryListingReady(QList<QWebDAV::FileInfo>)),
|
||||
this, SLOT(processDirectoryListing(QList<QWebDAV::FileInfo>)));
|
||||
connect(mWebdav,SIGNAL(fileReady(QByteArray,QString)),
|
||||
this, SLOT(processFileReady(QByteArray,QString)));
|
||||
connect(mWebdav,SIGNAL(fileReady(QNetworkReply*,QString)),
|
||||
this, SLOT(processFileReady(QNetworkReply*,QString)));
|
||||
|
||||
connect(mWebdav,SIGNAL(uploadComplete(QString)),
|
||||
this, SLOT(updateDBUpload(QString)));
|
||||
|
@ -324,7 +324,7 @@ void OwnCloudSync::processDirectoryListing(QList<QWebDAV::FileInfo> fileInfo)
|
|||
}
|
||||
}
|
||||
|
||||
void OwnCloudSync::processFileReady(QByteArray data,QString fileName)
|
||||
void OwnCloudSync::processFileReady(QNetworkReply *reply,QString fileName)
|
||||
{
|
||||
fileName = stringRemoveBasePath(fileName,mRemoteDirectory);
|
||||
// Temporarily remove this watcher so we don't get a message when
|
||||
|
@ -345,12 +345,24 @@ void OwnCloudSync::processFileReady(QByteArray data,QString fileName)
|
|||
return;
|
||||
}
|
||||
QDataStream out(&file);
|
||||
out.writeRawData(data.constData(),data.length());
|
||||
qint64 bytes = reply->bytesAvailable();
|
||||
qint64 bytesToRead;
|
||||
while( bytes > 0 ) {
|
||||
if( bytes > 100 ) {
|
||||
bytesToRead = 100;
|
||||
bytes -= 100;
|
||||
} else {
|
||||
bytesToRead = bytes;
|
||||
bytes = 0;
|
||||
}
|
||||
out.writeRawData(reply->read(bytesToRead).constData(),bytesToRead);
|
||||
}
|
||||
file.flush();
|
||||
file.close();
|
||||
updateDBDownload(fileName);
|
||||
if(mFileWatcher)
|
||||
mFileWatcher->addPath(mLocalDirectory+fileName); // Add the watcher back!
|
||||
reply->deleteLater();
|
||||
processNextStep();
|
||||
}
|
||||
|
||||
|
@ -741,8 +753,7 @@ void OwnCloudSync::upload( FileInfo fileInfo)
|
|||
<< file.error();
|
||||
return;
|
||||
}
|
||||
QByteArray data = file.readAll();
|
||||
QNetworkReply *reply = mWebdav->put(fileInfo.name,data);
|
||||
QNetworkReply *reply = mWebdav->put(fileInfo.name,mLocalDirectory+localName);
|
||||
connect(reply, SIGNAL(uploadProgress(qint64,qint64)),
|
||||
this, SLOT(transferProgress(qint64,qint64)));
|
||||
restartRequestTimer();
|
||||
|
|
|
@ -30,6 +30,8 @@
|
|||
|
||||
class QTimer;
|
||||
class QFileSystemWatcher;
|
||||
class QNetworkReply;
|
||||
|
||||
#ifdef Q_OS_LINUX
|
||||
#include <kde4/kwallet.h>
|
||||
#endif
|
||||
|
@ -194,7 +196,7 @@ signals:
|
|||
public slots:
|
||||
void directoryListingError(QString url);
|
||||
void processDirectoryListing(QList<QWebDAV::FileInfo> fileInfo);
|
||||
void processFileReady(QByteArray data,QString fileName);
|
||||
void processFileReady(QNetworkReply *reply,QString fileName);
|
||||
void updateDBUpload(QString fileName);
|
||||
void timeToSync();
|
||||
void sync();
|
||||
|
|
|
@ -34,6 +34,9 @@
|
|||
#include <QDomDocument>
|
||||
#include <QDomElement>
|
||||
|
||||
// Qt File I/O related
|
||||
#include <QFile>
|
||||
|
||||
qint64 QWebDAV::mRequestNumber = 0;
|
||||
|
||||
QWebDAV::QWebDAV(QObject *parent) :
|
||||
|
@ -98,8 +101,15 @@ QNetworkReply* QWebDAV::sendWebdavRequest(QUrl url, DAVType type,
|
|||
this, SLOT(slotSslErrors(QList<QSslError>)));
|
||||
} else if ( type == DAVPUT ) {
|
||||
request.setAttribute(QNetworkRequest::User, QVariant("put"));
|
||||
request.setAttribute(QNetworkRequest::Attribute(QNetworkRequest::User+1)
|
||||
if ( mRequestFile.value(mRequestNumber) ) {
|
||||
request.setAttribute(QNetworkRequest::Attribute(
|
||||
QNetworkRequest::User+2)
|
||||
,QVariant(mRequestNumber));
|
||||
} else {
|
||||
request.setAttribute(QNetworkRequest::Attribute(
|
||||
QNetworkRequest::User+1)
|
||||
,QVariant(mRequestNumber));
|
||||
}
|
||||
reply = QNetworkAccessManager::put(request,data);
|
||||
} else if ( type == DAVMKCOL ) {
|
||||
request.setAttribute(QNetworkRequest::User, QVariant("mkcol"));
|
||||
|
@ -150,6 +160,7 @@ void QWebDAV::slotReplyFinished()
|
|||
|
||||
void QWebDAV::slotFinished(QNetworkReply *reply)
|
||||
{
|
||||
bool keepReply = false;
|
||||
if ( reply->error() != 0 ) {
|
||||
qDebug() << "WebDAV request returned error: " << reply->error()
|
||||
<< " On URL: " << reply->url().toString();
|
||||
|
@ -166,6 +177,7 @@ void QWebDAV::slotFinished(QNetworkReply *reply)
|
|||
//qDebug() << "Oh a GET! How fun!!";
|
||||
//qDebug() << "Get Data: "<< reply->readAll();
|
||||
processFile(reply);
|
||||
keepReply = true;
|
||||
} else if ( reply->request().attribute(
|
||||
QNetworkRequest::User).toString().contains("put")) {
|
||||
//qDebug() << "Oh a PUT! How fun!!" <<
|
||||
|
@ -194,7 +206,17 @@ void QWebDAV::slotFinished(QNetworkReply *reply)
|
|||
mRequestQueries.remove(value);
|
||||
}
|
||||
|
||||
reply->deleteLater();
|
||||
value = reply->request().attribute(
|
||||
QNetworkRequest::Attribute(
|
||||
QNetworkRequest::User+2)).toLongLong();
|
||||
if(value > 0 ) {
|
||||
delete mRequestFile.value(value);
|
||||
mRequestFile.remove(value);
|
||||
}
|
||||
|
||||
if(!keepReply) {
|
||||
reply->deleteLater();
|
||||
}
|
||||
}
|
||||
|
||||
void QWebDAV::slotAuthenticationRequired(QNetworkReply *reply,
|
||||
|
@ -339,6 +361,31 @@ QNetworkReply* QWebDAV::put(QString fileName, QByteArray data)
|
|||
return reply;
|
||||
}
|
||||
|
||||
QNetworkReply* QWebDAV::put(QString fileName, QString absoluteFileName)
|
||||
{
|
||||
// Make sure the user has already initialized this instance!
|
||||
if (!mInitialized)
|
||||
return 0;
|
||||
|
||||
// This is the Url of the webdav server + the file we want to get
|
||||
QUrl url(mHostname+fileName);
|
||||
|
||||
// Encapsulate data in an QIODevice
|
||||
mRequestNumber++;
|
||||
QFile *file = new QFile(absoluteFileName);
|
||||
if (!file->open(QIODevice::ReadOnly)) {
|
||||
qDebug() << "File read error " + absoluteFileName +" Code: "
|
||||
<< file->error();
|
||||
return 0;
|
||||
}
|
||||
mRequestFile[mRequestNumber] = file;
|
||||
|
||||
// Finally send this to the WebDAV server
|
||||
QNetworkReply *reply = sendWebdavRequest(url,DAVPUT,0,file);
|
||||
//qDebug() << "PUT REPLY: " << reply->readAll();
|
||||
return reply;
|
||||
}
|
||||
|
||||
QNetworkReply* QWebDAV::mkdir(QString dirName)
|
||||
{
|
||||
// Make sure the user has already initialized this instance!
|
||||
|
@ -376,7 +423,7 @@ void QWebDAV::processFile(QNetworkReply* reply)
|
|||
.replace("\%20"," ");
|
||||
|
||||
//qDebug() << "File Ready: " << fileName;
|
||||
emit fileReady(reply->readAll(),fileName);
|
||||
emit fileReady(reply,fileName);
|
||||
}
|
||||
|
||||
void QWebDAV::connectReplyFinished(QNetworkReply *reply)
|
||||
|
|
|
@ -24,9 +24,9 @@
|
|||
#include <QDebug>
|
||||
#include <QNetworkReply>
|
||||
|
||||
class QNetworkReply;
|
||||
class QBuffer;
|
||||
class QUrl;
|
||||
class QFile;
|
||||
|
||||
|
||||
class QWebDAV : public QNetworkAccessManager
|
||||
|
@ -96,6 +96,7 @@ public:
|
|||
QNetworkReply* list(QString dir, int depth = 1);
|
||||
QNetworkReply* get(QString fileName );
|
||||
QNetworkReply* put(QString fileName , QByteArray data);
|
||||
QNetworkReply* put(QString fileName , QString absoluteFileName);
|
||||
QNetworkReply* mkdir(QString dirName );
|
||||
QNetworkReply* sendWebdavRequest( QUrl url, DAVType type,
|
||||
QByteArray verb = 0,QIODevice *data = 0,
|
||||
|
@ -111,6 +112,7 @@ private:
|
|||
static qint64 mRequestNumber;
|
||||
QHash<qint64,QByteArray*> mRequestQueries;
|
||||
QHash<qint64,QBuffer*> mRequestData;
|
||||
QHash<qint64,QFile*> mRequestFile;
|
||||
|
||||
void processDirList(QByteArray xml, QString url);
|
||||
void processFile(QNetworkReply* reply);
|
||||
|
@ -119,7 +121,7 @@ private:
|
|||
|
||||
signals:
|
||||
void directoryListingReady(QList<QWebDAV::FileInfo>);
|
||||
void fileReady(QByteArray data, QString fileName);
|
||||
void fileReady(QNetworkReply *reply, QString fileName);
|
||||
void uploadComplete(QString name);
|
||||
void directoryCreated(QString name);
|
||||
void directoryListingError(QString url);
|
||||
|
|
Loading…
Reference in a new issue