Index: sources/storage/FileHandler.h =================================================================== diff -u -r3f60b9a1c0b3a43ec1c5c72955dce0d80354e35c -r1f5b2250ae70d305654d014a9aa1fd8baa29779c --- sources/storage/FileHandler.h (.../FileHandler.h) (revision 3f60b9a1c0b3a43ec1c5c72955dce0d80354e35c) +++ sources/storage/FileHandler.h (.../FileHandler.h) (revision 1f5b2250ae70d305654d014a9aa1fd8baa29779c) @@ -1,13 +1,13 @@ /*! * - * Copyright (c) 2020-2022 Diality Inc. - All Rights Reserved. + * Copyright (c) 2020-2023 Diality Inc. - All Rights Reserved. * \copyright * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * \file FileHandler.h - * \author (last) Behrouz NematiPour - * \date (last) 10-Aug-2021 + * \author (last) Vy + * \date (last) 26-Apr-2023 * \author (original) Behrouz NematiPour * \date (original) 26-Aug-2020 * @@ -21,6 +21,10 @@ #include #include +#include +#include +#include + class QDate; namespace Storage { @@ -34,11 +38,29 @@ */ class FileHandler { - static void errOut(const QString &vMessage); public: - static bool write (const QString &vFileName, const QString &vContent, bool vAppend = true); - static bool read (const QString &vFileName, QString &vContent); + enum FileCopyError_Enums { + eOK , + + eSrcFolderNotExist , + eSrcFileNotExist , + eDstFolderNotExist , + eDstFolderMakeError , + + eSrcOpenError , + eDstOpenError , + + eSrcReadError , + eDstWriteError , + eDstFlushError , + }; + +public: + static void errOut (const QString &vMessage); + + static bool write (const QString &vFileName, const QString &vContent, bool vAppend = true ); + static bool read (const QString &vFileName, QString &vContent, bool vAppend = false); static bool read (const QString &vFileName, QJsonObject &vContent, QJsonParseError *error = nullptr); static int copyFolder (const QString &vSource , const QString &vDestination); @@ -48,11 +70,94 @@ static bool makeFolder (const QString &vFolder); static bool isMounted (const QString &vPath, bool *vIsReadOnly = nullptr); + static bool tmpUsable (); static QFileInfoList find(const QString &vPath, QStringList vNameFilters, quint8 vRetainPercent); static QFileInfoList find(const QString &vPath, QStringList vNameFilters); static quint64 totalSize(const QFileInfoList &vFileInfoList); static QStringList subFolders(const QString &vFolder); + + /*! + * \brief FileHandler::copyFile + * \details Copies a file chunk by chunk + * \return + */ + template + static int copyFile(const QString &vSource, const QString &vDestination, const QString &vFileName, const NotifierFunction *notifier = nullptr, quint32 vIndex = 0) + { + FileCopyError_Enums err = eOK; + QDir srcDir = QFileInfo (vSource ).absoluteDir(); + QDir dstDir = QFileInfo (vDestination ).absoluteDir(); + QFile srcFile = QFile (vSource + vFileName); + QFile dstFile = QFile (vDestination + vFileName); + qint64 totalSize = 0; + qint64 copySize = 0; + quint32 chunkSize = 1024 * 2; + bool createFolder = true; + + static quint8 mO_CopyPercent = 0; quint8 mC_CopyPercent = 0; + + if ( ! srcDir .exists() ) { err = eSrcFolderNotExist ; goto lErr; } + if ( ! srcFile.exists() ) { err = eSrcFileNotExist ; goto lErr; } + + if ( ! createFolder ) { if ( ! dstDir.exists() ) { err = eDstFolderNotExist ; goto lErr; }} + else { if ( ! dstDir.mkpath ( dstDir.path() ) ) { err = eDstFolderMakeError ; goto lErr; }} + + + if ( ! srcFile.open(QIODevice::ReadOnly )) { err = eSrcOpenError ; goto lErr; } + if ( ! dstFile.open(QIODevice::WriteOnly )) { err = eDstOpenError ; goto lErr; } + + totalSize = srcFile.size(); + copySize = totalSize; + + qDebug() << "start ..."; + qDebug() << "Src: " << vSource + << " " + << (totalSize > 1024*1024 ? (totalSize / 1024 / 1024) : (totalSize / 1024)) + << (totalSize > 1024*1024 ? "M" : "K" ); + qDebug() << "Dst: " << vDestination; + + while ( copySize ) { + char chunkData[chunkSize] = {}; + const qint64 readSize = srcFile.read (chunkData, chunkSize); + if ( readSize < 0 ) { err = eSrcOpenError ; goto lErr; } + const qint64 writeSize = dstFile.write(chunkData, readSize); + if ( writeSize < 0 ) { err = eDstWriteError ; goto lErr; } + + if ( readSize >= chunkSize ) { // a full chunk was available to read + copySize -= writeSize; // writeSize; + } + else { // Not a full chunk available EOF + copySize = 0; + } + + mC_CopyPercent = int(((float((totalSize - copySize))) / float(totalSize)) * 100); + if ( mO_CopyPercent != mC_CopyPercent ) { + mO_CopyPercent = mC_CopyPercent; + // qDebug() << "\r" << "%" << mC_CopyPercent; + if ( notifier ) { + (*notifier )(vIndex, vFileName, mC_CopyPercent); + } + } + } + + // close source + srcFile.close(); + + //DEBUG qDebug()<< dstFile.fileName() <<" destination file size : " << dstFile.size() << " src==dest ? " << (dstFile.size() == totalSize); + + // close destination + if ( ! dstFile.flush() ) { err = eDstFlushError ; goto lErr; } + dstFile.close(); + + qDebug() << "\nFinish"; + return eOK; + + lErr: + qDebug() << "\nError: " << err; + return err; + } + }; }