--- a +++ b/filecopier.cpp @@ -0,0 +1,80 @@ +#include "filecopier.h" +#include "mainwindow.h" + +FileCopier::FileCopier() +{ + mFileIn = NULL; + mFileOut = NULL; +} + +FileCopier::~FileCopier() +{ + Close(); +} + +bool FileCopier::Open(const QString &aFileIn, const QString &aFileOut) +{ + mFileIn = fopen(aFileIn.toAscii().data(),"rb"); + if(!mFileIn) return false; + + mFileOut = fopen(aFileOut.toAscii().data(),"wb"); + if(!mFileOut) { fclose(mFileIn); mFileIn = NULL; return false; } + + print_log(QString("Open :")+aFileIn+QString(" to ")+aFileOut); + + return true; +} + +bool FileCopier::Write(const VideoSegment &aSegment, QProgressDialog *aDial) +{ + size_t aBuffSize = 3000*188; // Packets MPEG + size_t aRestSize = aSegment.mEnd.mFilePos-aSegment.mBegin.mFilePos; + char *aBuff = new char[aBuffSize]; + size_t aPosition = aSegment.mBegin.mFilePos; + + + fseek(mFileIn,aPosition,SEEK_SET); + bool aStatus = true; + + while(aRestSize) + { + if(aDial) + { + aDial->setValue(aPosition); + MainWindow::FlushAll(); + } + + if(aBuffSize > aRestSize) + aBuffSize = aRestSize; + size_t aReadSize = fread(aBuff,1,aBuffSize,mFileIn); + if(aReadSize<aBuffSize) + { + print_log(QString("Erreur entrée : %1/%2").arg(aReadSize).arg(aBuffSize)); + aStatus = false; + break; + } + + size_t aWrittenSize = fwrite(aBuff,1,aBuffSize,mFileOut); + if(aWrittenSize<aBuffSize) + { + print_log(QString("Erreur sortie : %1/%2").arg(aWrittenSize).arg(aBuffSize)); + aStatus = false; + break; + } + + aPosition += aWrittenSize; + aRestSize -= aWrittenSize; + } + + delete aBuff; + return aStatus; +} + +void FileCopier::Close() +{ + if(mFileIn) fclose(mFileIn); + if(mFileOut) fclose(mFileOut); + + mFileIn = NULL; + mFileOut = NULL; +}