bool WriteThread::write() { if(stopIt) return false; emit internalStartWrite(); if(stopIt) return false; return true; }
void WriteThread::run() { connect(this,SIGNAL(internalStartOpen()), this,SLOT(internalOpen()), Qt::QueuedConnection); connect(this,SIGNAL(internalStartReopen()), this,SLOT(internalReopen()), Qt::QueuedConnection); connect(this,SIGNAL(internalStartWrite()), this,SLOT(internalWrite()), Qt::QueuedConnection); connect(this,SIGNAL(internalStartClose()), this,SLOT(internalClose()), Qt::QueuedConnection); connect(this,SIGNAL(internalStartEndOfFile()), this,SLOT(internalEndOfFile()), Qt::QueuedConnection); connect(this,SIGNAL(internalStartFlushAndSeekToZero()), this,SLOT(internalFlushAndSeekToZero()),Qt::QueuedConnection); connect(this,SIGNAL(internalStartChecksum()), this,SLOT(checkSum()), Qt::QueuedConnection); exec(); }
bool WriteThread::write(const QByteArray &data) { if(stopIt) return false; freeBlock.acquire(); if(stopIt) return false; { QMutexLocker lock_mutex(&accessList); theBlockList.append(data); } emit internalStartWrite(); return true; }
void WriteThread::internalEndOfFile() { if(!bufferIsEmpty()) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start the write"); emit internalStartWrite(); } else { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] writeIsStopped"); flushBuffer(); emit writeIsStopped(); } }
void WriteThread::internalEndOfFile() { if(!bufferIsEmpty()) { if(sequential) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[")+QString::number(id)+QStringLiteral("] start the write")); emit internalStartWrite(); } else ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[")+QString::number(id)+QStringLiteral("] buffer is not empty!")); } else { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[")+QString::number(id)+QStringLiteral("] writeIsStopped")); emit writeIsStopped(); } }
void WriteThread::internalWrite() { #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT if(sequential) { multiForBigSpeed=0; QMutexLocker lock_mutex(&accessList); if(theBlockList.size()<numberOfBlock && !endDetected) return; } #endif bool haveBlock; do { if(putInPause) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("[")+QString::number(id)+QStringLiteral("] write put in pause")); if(stopIt) return; pauseMutex.acquire(); if(stopIt) return; } if(stopIt) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("[")+QString::number(id)+QStringLiteral("] stopIt")); return; } if(stopIt) return; //read one block { QMutexLocker lock_mutex(&accessList); if(theBlockList.isEmpty()) haveBlock=false; else { blockArray=theBlockList.first(); if(multiForBigSpeed>0) { if(blockArray.size()==blockSize) { theBlockList.removeFirst(); //if remove one block if(!sequential) writeFull.release(); } else { blockArray.clear(); while(blockArray.size()!=blockSize) { //if larger if(theBlockList.first().size()>blockSize) { blockArray+=theBlockList.first().mid(0,blockSize); theBlockList.first().remove(0,blockSize); if(!sequential) { //do write in loop to finish the actual block emit internalStartWrite(); } break; } //if smaller else { blockArray+=theBlockList.first(); theBlockList.removeFirst(); //if remove one block if(!sequential) writeFull.release(); if(theBlockList.isEmpty()) break; } } } haveBlock=!blockArray.isEmpty(); } else { theBlockList.removeFirst(); //if remove one block if(!sequential) writeFull.release(); } haveBlock=true; } } if(stopIt) return; if(!haveBlock) { if(sequential) { if(endDetected) internalEndOfFile(); else writeFull.release(); return; } ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("[")+QString::number(id)+QStringLiteral("] End detected of the file")); return; } #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT //wait for limitation speed if stop not query if(multiForBigSpeed>0) { numberOfBlockCopied++; if(sequential || (!sequential && writeFullBlocked)) { if(numberOfBlockCopied>=(multiForBigSpeed*2)) { numberOfBlockCopied=0; waitNewClockForSpeed.acquire(); if(stopIt) break; } } else { if(numberOfBlockCopied>=multiForBigSpeed) { numberOfBlockCopied=0; waitNewClockForSpeed.acquire(); if(stopIt) break; } } } #endif if(stopIt) return; #ifdef ULTRACOPIER_PLUGIN_DEBUG stat=Write; #endif bytesWriten=file.write(blockArray); #ifdef ULTRACOPIER_PLUGIN_DEBUG stat=Idle; #endif //mutex for stream this data if(lastGoodPosition==0) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[")+QString::number(id)+QStringLiteral("] emit writeIsStarted()")); emit writeIsStarted(); } if(stopIt) return; if(file.error()!=QFile::NoError) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("[")+QString::number(id)+QStringLiteral("] ")+QStringLiteral("Error in writing: %1 (%2)").arg(file.errorString()).arg(file.error())); errorString_internal=QStringLiteral("Error in writing: %1 (%2)").arg(file.errorString()).arg(file.error()); stopIt=true; emit error(); return; } if(bytesWriten!=blockArray.size()) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("[")+QString::number(id)+QStringLiteral("] ")+QStringLiteral("Error in writing, bytesWriten: %1, blockArray.size(): %2").arg(bytesWriten).arg(blockArray.size())); errorString_internal=QStringLiteral("Error in writing, bytesWriten: %1, blockArray.size(): %2").arg(bytesWriten).arg(blockArray.size()); stopIt=true; emit error(); return; } lastGoodPosition+=bytesWriten; } while(sequential); }
bool WriteThread::write(const QByteArray &data) { if(stopIt) return false; bool atMax; if(sequential) { if(stopIt) return false; { QMutexLocker lock_mutex(&accessList); theBlockList.append(data); atMax=(theBlockList.size()>=numberOfBlock); } if(atMax) emit internalStartWrite(); } else { if(stopIt) return false; { QMutexLocker lock_mutex(&accessList); theBlockList.append(data); atMax=(theBlockList.size()>=numberOfBlock); } emit internalStartWrite(); } if(atMax) { writeFullBlocked=true; writeFull.acquire(); writeFullBlocked=false; } if(stopIt) return false; #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT //wait for limitation speed if stop not query if(multiForBigSpeed>0) { if(sequential) { numberOfBlockCopied++; if(numberOfBlockCopied>=(multiForBigSpeed*2)) { numberOfBlockCopied=0; waitNewClockForSpeed.acquire(); } } else { numberOfBlockCopied2++; if(numberOfBlockCopied2>=multiForBigSpeed) { numberOfBlockCopied2=0; waitNewClockForSpeed2.acquire(); } } } #endif if(stopIt) return false; return true; }
void WriteThread::callBack() { emit internalStartWrite(); }