Removing (hopefully) the last of the memory bugs. This time in file

upload and download.
This commit is contained in:
Juan Carlos Cornejo 2011-11-18 00:34:23 -05:00 committed by Klaas Freitag
parent 1db4fc9fd4
commit 125a0e2cfc
4 changed files with 74 additions and 12 deletions

View file

@ -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();

View file

@ -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();

View file

@ -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)

View file

@ -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);