/** \file Core.cpp \brief Define the class for the core \author alpha_one_x86 \version 0.3 \date 2010 \licence GPL3, see the file COPYING */ #include #include #include "Core.h" Core::Core(CopyEngineManager *copyEngineList) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start"); this->copyEngineList=copyEngineList; nextId=0; forUpateInformation.setInterval(ULTRACOPIER_TIME_INTERFACE_UPDATE); loadInterface(); //connect(©EngineList, SIGNAL(newCanDoOnlyCopy(bool)), this, SIGNAL(newCanDoOnlyCopy(bool))); connect(themes, SIGNAL(theThemeNeedBeUnloaded()), this, SLOT(unloadInterface())); connect(themes, SIGNAL(theThemeIsReloaded()), this, SLOT(loadInterface())); connect(&forUpateInformation, SIGNAL(timeout()), this, SLOT(periodicSynchronization())); qRegisterMetaType >("QList"); qRegisterMetaType >("QList"); qRegisterMetaType >("QList"); qRegisterMetaType >("QList"); qRegisterMetaType("EngineActionInProgress"); qRegisterMetaType("CopyMode"); qRegisterMetaType >("QList"); qRegisterMetaType >("QList"); } void Core::newCopy(const quint32 &orderId,const QStringList &protocolsUsedForTheSources,const QStringList &sources) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start"); if(openNewCopyEngineInstance(Copy,false,protocolsUsedForTheSources)==-1) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance"); QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance")); return; } copyList.last().orderId<newCopy(sources); copyList.last().interface->haveExternalOrder(); } void Core::newCopy(const quint32 &orderId,const QStringList &protocolsUsedForTheSources,const QStringList &sources,const QString &protocolsUsedForTheDestination,const QString &destination) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+sources.join(";")+", dest: "+destination); //search to group the window int GroupWindowWhen=options->getOptionValue("Ultracopier","GroupWindowWhen").toInt(); bool haveSameSource=false,haveSameDestination=false; if(GroupWindowWhen!=0) { int index=0; while(indexhaveSameSource(sources); if(GroupWindowWhen!=1) haveSameDestination=copyList.at(index).engine->haveSameDestination(destination); } if( GroupWindowWhen==5 || (GroupWindowWhen==1 && haveSameSource) || (GroupWindowWhen==2 && haveSameDestination) || (GroupWindowWhen==3 && (haveSameSource && haveSameDestination)) || (GroupWindowWhen==4 && (haveSameSource || haveSameDestination)) ) { /*protocols are same*/ if(copyEngineList->protocolsSupportedByTheCopyEngine(copyList.at(index).engine,protocolsUsedForTheSources,protocolsUsedForTheDestination)) { copyList[index].orderId<newCopy(sources,destination); copyList.at(index).interface->haveExternalOrder(); return; } } } index++; } } //else open new windows if(openNewCopyEngineInstance(Copy,false,protocolsUsedForTheSources,protocolsUsedForTheDestination)==-1) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance"); QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance")); return; } copyList.last().orderId<newCopy(sources,destination); copyList.last().interface->haveExternalOrder(); } void Core::newMove(const quint32 &orderId,const QStringList &protocolsUsedForTheSources,const QStringList &sources) { if(openNewCopyEngineInstance(Move,false,protocolsUsedForTheSources)==-1) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance"); QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance")); return; } copyList.last().orderId<newMove(sources); copyList.last().interface->haveExternalOrder(); } void Core::newMove(const quint32 &orderId,const QStringList &protocolsUsedForTheSources,const QStringList &sources,const QString &protocolsUsedForTheDestination,const QString &destination) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+sources.join(";")+", dest: "+destination); //search to group the window int GroupWindowWhen=options->getOptionValue("Ultracopier","GroupWindowWhen").toInt(); bool haveSameSource=false,haveSameDestination=false; if(GroupWindowWhen!=0) { int index=0; while(indexhaveSameSource(sources); if(GroupWindowWhen!=1) haveSameDestination=copyList.at(index).engine->haveSameDestination(destination); } if( GroupWindowWhen==5 || (GroupWindowWhen==1 && haveSameSource) || (GroupWindowWhen==2 && haveSameDestination) || (GroupWindowWhen==3 && (haveSameSource && haveSameDestination)) || (GroupWindowWhen==4 && (haveSameSource || haveSameDestination)) ) { /*protocols are same*/ if(copyEngineList->protocolsSupportedByTheCopyEngine(copyList.at(index).engine,protocolsUsedForTheSources,protocolsUsedForTheDestination)) { copyList[index].orderId<newCopy(sources,destination); copyList.at(index).interface->haveExternalOrder(); return; } } } index++; } } //else open new windows if(openNewCopyEngineInstance(Move,false,protocolsUsedForTheSources,protocolsUsedForTheDestination)==-1) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance"); QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance")); return; } copyList.last().orderId<newMove(sources,destination); copyList.last().interface->haveExternalOrder(); } /// \brief name to open the right copy engine void Core::addWindowCopyMove(const CopyMode &mode,const QString &name) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+name); if(openNewCopyEngineInstance(mode,false,name)==-1) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance"); QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance")); return; } ActionOnManualOpen ActionOnManualOpen_value=(ActionOnManualOpen)options->getOptionValue("Ultracopier","ActionOnManualOpen").toInt(); if(ActionOnManualOpen_value!=ActionOnManualOpen_Nothing) { if(ActionOnManualOpen_value==ActionOnManualOpen_Folder) copyList.last().engine->userAddFolder(mode); else copyList.last().engine->userAddFile(mode); } } /// \brief name to open the right copy engine void Core::addWindowTransfer(const QString &name) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start"+name); if(openNewCopyEngineInstance(Copy,true,name)==-1) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance"); QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance")); return; } } /** new transfer list pased by the CLI */ void Core::newTransferList(QString engine,QString mode,QString file) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("engine: %1, mode: %2, file: %3").arg(engine).arg(mode).arg(file)); if(mode=="Transfer") { if(openNewCopyEngineInstance(Copy,true,engine)==-1) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance"); QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance")); return; } } else if(mode=="Copy") { if(openNewCopyEngineInstance(Copy,false,engine)==-1) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance"); QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance")); return; } } else if(mode=="Move") { if(openNewCopyEngineInstance(Move,false,engine)==-1) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance"); QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance")); return; } } else { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"The argument for the mode is not understand"); QMessageBox::critical(NULL,tr("Error"),tr("The argument for the mode is not understand")); return; } copyList.last().engine->newTransferList(file); } void Core::loadInterface() { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start"); //load the extra files to check the themes availability if(copyList.size()>0) { bool error=false; index=0; loop_size=copyList.size(); while(indexgetThemesInstance(); if(copyList[index].interface==NULL) { copyInstanceCanceledByIndex(index); index--; error=true; } else { if(!copyList.at(index).ignoreMode) copyList.at(index).interface->forceCopyMode(copyList.at(index).mode); connectInterfaceAndSync(copyList.count()-1); copyList.at(index).engine->syncTransferList(); } index++; } if(error) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to load the interface, copy aborted"); QMessageBox::critical(NULL,tr("Error"),tr("Unable to load the interface, copy aborted")); } } } void Core::unloadInterface() { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start"); index=0; loop_size=copyList.size(); while(index2000000) nextId=0; } while(idList.contains(nextId)); return nextId; } /** open with specific source/destination \param move Copy or move \param ignoreMode if need ignore the mode \param protocolsUsedForTheSources protocols used for sources \param protocolsUsedForTheDestination protocols used for destination */ int Core::openNewCopyEngineInstance(const CopyMode &mode,const bool &ignoreMode,const QStringList &protocolsUsedForTheSources,const QString &protocolsUsedForTheDestination) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start"); CopyEngineManager::returnCopyEngine returnInformations=copyEngineList->getCopyEngine(mode,protocolsUsedForTheSources,protocolsUsedForTheDestination); if(returnInformations.engine==NULL) return -1; return connectCopyEngine(mode,ignoreMode,returnInformations); } /** open with specific copy engine \param move Copy or move \param ignoreMode if need ignore the mode \param protocolsUsedForTheSources protocols used for sources \param protocolsUsedForTheDestination protocols used for destination */ int Core::openNewCopyEngineInstance(const CopyMode &mode,const bool &ignoreMode,const QString &name) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start, mode: "+QString::number(mode)+", name: "+name); CopyEngineManager::returnCopyEngine returnInformations=copyEngineList->getCopyEngine(mode,name); if(returnInformations.engine==NULL) return -1; return connectCopyEngine(mode,ignoreMode,returnInformations); } /** Connect the copy engine instance provided previously to the management */ int Core::connectCopyEngine(const CopyMode &mode,bool ignoreMode,const CopyEngineManager::returnCopyEngine &returnInformations) { if(returnInformations.canDoOnlyCopy) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Mode force for unknow reason"); ignoreMode=false;//force mode if need, normaly not used } CopyInstance newItem; newItem.engine=returnInformations.engine; if(newItem.engine!=NULL) { PluginInterface_Themes *theme=themes->getThemesInstance(); if(theme!=NULL) { newItem.id=incrementId(); newItem.lastProgression=0; newItem.interface=theme; newItem.ignoreMode=ignoreMode; newItem.mode=mode; newItem.type=returnInformations.type; newItem.transferListOperation=returnInformations.transferListOperation; newItem.baseTime=0; newItem.numberOfFile=0; newItem.numberOfTransferedFile=0; newItem.currentProgression=0; newItem.totalProgression=0; newItem.action=Idle; newItem.lastProgression=0;//store the real byte transfered, used in time remaining calculation newItem.isPaused=false; newItem.baseTime=0;//stored in ms newItem.isRunning=false; newItem.haveError=false; newItem.lastConditionalSync.start(); newItem.nextConditionalSync=new QTimer(); newItem.nextConditionalSync->setSingleShot(true); newItem.copyEngineIsSync=true; if(!ignoreMode) { newItem.interface->forceCopyMode(mode); newItem.engine->forceMode(mode); } if(copyList.size()==0) forUpateInformation.start(); copyList << newItem; connectEngine(copyList.count()-1); connectInterfaceAndSync(copyList.count()-1); return newItem.id; } ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to load the interface, copy aborted"); delete newItem.engine; QMessageBox::critical(NULL,tr("Error"),tr("Unable to load the interface, copy aborted")); } else { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to load the copy engine, copy aborted"); QMessageBox::critical(NULL,tr("Error"),tr("Unable to load the copy engine, copy aborted")); } return -1; } void Core::resetSpeedDetectedEngine() { int index=indexCopySenderCopyEngine(); if(index!=-1) resetSpeedDetected(index); } void Core::resetSpeedDetectedInterface() { int index=indexCopySenderInterface(); if(index!=-1) resetSpeedDetected(index); } void Core::resetSpeedDetected(const int &index) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("start on %1").arg(index)); copyList[index].runningTime.restart(); copyList[index].lastSpeedDetected.clear(); copyList[index].lastSpeedTime.clear(); } void Core::actionInProgess(const EngineActionInProgress &action) { index=indexCopySenderCopyEngine(); if(index!=-1) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("action: %1, from %2").arg(action).arg(index)); //drop here the duplicate action if(copyList[index].action==action) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("The copy engine have send 2x the same EngineActionInProgress")); return; } //update time runing for time remaning caculation if(action==Copying || action==CopyingAndListing) { if(!copyList.at(index).isRunning) { copyList[index].isRunning=true; copyList[index].runningTime.restart(); } } else { if(copyList.at(index).isRunning) { copyList[index].isRunning=false; copyList[index].baseTime+=copyList[index].runningTime.elapsed(); } } //do sync periodicSynchronization(index); copyList[index].action=action; if(copyList.at(index).interface!=NULL) copyList.at(index).interface->actionInProgess(action); if(action==Idle) { index_sub_loop=0; loop_size=copyList.at(index).orderId.size(); while(index_sub_loopnewFolderListing(path); } } void Core::newCollisionAction(const QString &action) { int index=indexCopySenderCopyEngine(); if(index!=-1) { copyList[index].collisionAction=action; copyList.at(index).interface->newCollisionAction(action); } } void Core::newErrorAction(const QString &action) { int index=indexCopySenderCopyEngine(); if(index!=-1) { copyList[index].errorAction=action; copyList.at(index).interface->newErrorAction(action); } } void Core::isInPause(const bool &isPaused) { int index=indexCopySenderCopyEngine(); if(index!=-1) { if(!isPaused) resetSpeedDetected(index); copyList[index].isPaused=isPaused; copyList.at(index).interface->isInPause(isPaused); } } /// \brief get the right copy instance (copy engine + interface), by signal emited from copy engine int Core::indexCopySenderCopyEngine() { QObject * senderObject=sender(); if(senderObject==NULL) { //QMessageBox::critical(NULL,tr("Internal error"),tr("A communication error occured between the interface and the copy plugin. Please report this bug.")); ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Qt sender() NULL"); return -1; } index=0; loop_size=copyList.size(); while(index(senderObject); if(interface==NULL) { //QMessageBox::critical(NULL,tr("Internal error"),tr("A communication error occured between the interface and the copy plugin. Please report this bug.")); ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Qt sender themes NULL"); return -1; } index=0; while(index)), currentCopyInstance.engine,SLOT(removeItems(QList)))) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for removeItems()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.interface,SIGNAL(moveItemsOnTop(QList)), currentCopyInstance.engine,SLOT(moveItemsOnTop(QList)))) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for moveItemsOnTop()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.interface,SIGNAL(moveItemsUp(QList)), currentCopyInstance.engine,SLOT(moveItemsUp(QList)))) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for moveItemsUp()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.interface,SIGNAL(moveItemsDown(QList)), currentCopyInstance.engine,SLOT(moveItemsDown(QList)))) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for moveItemsDown()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.interface,SIGNAL(moveItemsOnBottom(QList)), currentCopyInstance.engine,SLOT(moveItemsOnBottom(QList)))) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for moveItemsOnBottom()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.interface,SIGNAL(exportTransferList()), currentCopyInstance.engine,SLOT(exportTransferList()))) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for exportTransferList()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.interface,SIGNAL(importTransferList()), currentCopyInstance.engine,SLOT(importTransferList()))) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for importTransferList()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.interface,SIGNAL(newSpeedLimitation(qint64)), this,SLOT(resetSpeedDetectedInterface()))) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for newSpeedLimitation()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.interface,SIGNAL(resume()), this,SLOT(resetSpeedDetectedInterface()))) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for resume()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.interface,SIGNAL(cancel()), this,SLOT(copyInstanceCanceledByInterface()),Qt::QueuedConnection)) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for cancel()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.interface,SIGNAL(urlDropped(QList)), this,SLOT(urlDropped(QList)),Qt::QueuedConnection)) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for urlDropped()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.engine,SIGNAL(newActionOnList(QList)),this,SLOT(getActionOnList(QList)), Qt::QueuedConnection)) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for newActionOnList()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.engine,SIGNAL(pushFileProgression(QList)), currentCopyInstance.interface,SLOT(setFileProgression(QList)), Qt::QueuedConnection)) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for pushFileProgression()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.engine,SIGNAL(pushGeneralProgression(quint64,quint64)), currentCopyInstance.interface,SLOT(setGeneralProgression(quint64,quint64)), Qt::QueuedConnection)) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for pushGeneralProgression()").arg(index).arg((quint64)sender())); if(!connect(currentCopyInstance.engine,SIGNAL(pushGeneralProgression(quint64,quint64)), this,SLOT(pushGeneralProgression(quint64,quint64)), Qt::QueuedConnection)) ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for pushGeneralProgression() for this").arg(index).arg((quint64)sender())); currentCopyInstance.interface->setSpeedLimitation(currentCopyInstance.engine->getSpeedLimitation()); currentCopyInstance.interface->setErrorAction(currentCopyInstance.engine->getErrorAction()); currentCopyInstance.interface->setCollisionAction(currentCopyInstance.engine->getCollisionAction()); currentCopyInstance.interface->setCopyType(currentCopyInstance.type); currentCopyInstance.interface->setTransferListOperation(currentCopyInstance.transferListOperation); currentCopyInstance.interface->actionInProgess(currentCopyInstance.action); currentCopyInstance.interface->isInPause(currentCopyInstance.isPaused); if(currentCopyInstance.haveError) currentCopyInstance.interface->errorDetected(); QWidget *tempWidget=currentCopyInstance.interface->getOptionsEngineWidget(); if(tempWidget!=NULL) currentCopyInstance.interface->getOptionsEngineEnabled(currentCopyInstance.engine->getOptionsEngine(tempWidget)); //important, to have the modal dialog currentCopyInstance.engine->setInterfacePointer(currentCopyInstance.interface); //put entry into the interface currentCopyInstance.engine->syncTransferList(); //force the updating, without wait the timer periodicSynchronization(index); } void Core::disconnectEngine(const int &index) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("start with index: %1").arg(index)); // CopyInstance& currentCopyInstance=copyList[index]; /* disconnect(currentCopyInstance.engine,SIGNAL(newFolderListing(QString)), this,SLOT(newFolderListing(QString)));//to check to change disconnect(currentCopyInstance.engine,SIGNAL(newCollisionAction(QString)), this,SLOT(newCollisionAction(QString))); disconnect(currentCopyInstance.engine,SIGNAL(newErrorAction(QString)), this,SLOT(newErrorAction(QString))); disconnect(currentCopyInstance.engine,SIGNAL(actionInProgess(EngineActionInProgress)), this,SLOT(actionInProgess(EngineActionInProgress))); disconnect(currentCopyInstance.engine,SIGNAL(isInPause(bool)), this,SLOT(isInPause(bool)));//to check to change disconnect(currentCopyInstance.engine,SIGNAL(cancelAll()), this,SLOT(copyInstanceCanceledByEngine())); disconnect(currentCopyInstance.engine,SIGNAL(error(QString,quint64,QDateTime,QString)), this,SLOT(error(QString,quint64,QDateTime,QString))); disconnect(currentCopyInstance.engine,SIGNAL(rmPath(QString)), this,SLOT(rmPath(QString))); disconnect(currentCopyInstance.engine,SIGNAL(mkPath(QString)), this,SLOT(mkPath(QString)));*/ } void Core::disconnectInterface(const int &index) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("start with index: %1").arg(index)); Q_UNUSED(index); /* CopyInstance& currentCopyInstance=copyList[index]; disconnect(currentCopyInstance.interface,SIGNAL(pause()), currentCopyInstance.engine,SLOT(pause())); disconnect(currentCopyInstance.interface,SIGNAL(resume()), currentCopyInstance.engine,SLOT(resume())); disconnect(currentCopyInstance.interface,SIGNAL(skip(quint64)), currentCopyInstance.engine,SLOT(skip(quint64))); disconnect(currentCopyInstance.interface,SIGNAL(sendErrorAction(QString)), currentCopyInstance.engine,SLOT(setErrorAction(QString))); disconnect(currentCopyInstance.interface,SIGNAL(newSpeedLimitation(qint64)), currentCopyInstance.engine,SLOT(setSpeedLimitation(qint64))); disconnect(currentCopyInstance.interface,SIGNAL(sendCollisionAction(QString)), currentCopyInstance.engine,SLOT(setCollisionAction(QString))); disconnect(currentCopyInstance.interface,SIGNAL(userAddFolder(CopyMode)), currentCopyInstance.engine,SLOT(userAddFolder(CopyMode))); disconnect(currentCopyInstance.interface,SIGNAL(userAddFile(CopyMode)), currentCopyInstance.engine,SLOT(userAddFile(CopyMode))); disconnect(currentCopyInstance.interface,SIGNAL(removeItems(QList)), currentCopyInstance.engine,SLOT(removeItems(QList))); disconnect(currentCopyInstance.interface,SIGNAL(moveItemsOnTop(QList)), currentCopyInstance.engine,SLOT(moveItemsOnTop(QList))); disconnect(currentCopyInstance.interface,SIGNAL(moveItemsUp(QList)), currentCopyInstance.engine,SLOT(moveItemsUp(QList))); disconnect(currentCopyInstance.interface,SIGNAL(moveItemsDown(QList)), currentCopyInstance.engine,SLOT(moveItemsDown(QList))); disconnect(currentCopyInstance.interface,SIGNAL(moveItemsOnBottom(QList)), currentCopyInstance.engine,SLOT(moveItemsOnBottom(QList))); disconnect(currentCopyInstance.interface,SIGNAL(newSpeedLimitation(qint64)), this,SLOT(resetSpeedDetectedInterface())); disconnect(currentCopyInstance.interface,SIGNAL(resume()), this,SLOT(resetSpeedDetectedInterface())); disconnect(currentCopyInstance.interface,SIGNAL(cancel()), this,SLOT(copyInstanceCanceledByInterface())); disconnect(currentCopyInstance.interface,SIGNAL(urlDropped(QList)), this,SLOT(urlDropped(QList))); disconnect(currentCopyInstance.engine,SIGNAL(newActionOnList(QList)), currentCopyInstance.interface,SLOT(getActionOnList(QList))); disconnect(currentCopyInstance.engine,SIGNAL(pushFileProgression(QList)), currentCopyInstance.interface,SLOT(setFileProgression(QList))); disconnect(currentCopyInstance.engine,SIGNAL(pushGeneralProgression(quint64,quint64)), currentCopyInstance.interface,SLOT(setGeneralProgression(quint64,quint64)));*/ } void Core::periodicSynchronization() { index_sub_loop=0; loop_size=copyList.size(); while(index_sub_looprealByteTransfered(); diffCopiedSize=0; if(realByteTransfered>=currentCopyInstance.lastProgression) diffCopiedSize=realByteTransfered-currentCopyInstance.lastProgression; currentCopyInstance.lastProgression=realByteTransfered; // algo 1: // ((double)currentProgression)/totalProgression -> example: done 80% -> 0.8 // baseTime+runningTime -> example: done into 80s, remaining time: 80/0.8-80=80*(1/0.8-1)=20s // algo 2 (not used): // remaining byte/current speed transferAddedTime=currentCopyInstance.baseTime+currentCopyInstance.runningTime.elapsed(); //remaining time: (total byte - lastProgression)/byte per ms since the start if(currentCopyInstance.totalProgression==0 || currentCopyInstance.currentProgression==0) currentCopyInstance.interface->remainingTime(-1); else currentCopyInstance.interface->remainingTime(transferAddedTime*((double)currentCopyInstance.totalProgression/(double)currentCopyInstance.currentProgression-1)/1000); //do the speed calculation if(lastProgressionTime.isNull()) lastProgressionTime.start(); else { if((currentCopyInstance.action==Copying || currentCopyInstance.action==CopyingAndListing)) { currentCopyInstance.lastSpeedTime << lastProgressionTime.elapsed(); currentCopyInstance.lastSpeedDetected << diffCopiedSize; while(currentCopyInstance.lastSpeedDetected.size()>ULTRACOPIER_MAXVALUESPEEDSTORED) { currentCopyInstance.lastSpeedTime.removeFirst(); currentCopyInstance.lastSpeedDetected.removeFirst(); } totTime=0; totSpeed=0; index_sub_loop=0; loop_size=currentCopyInstance.lastSpeedDetected.size(); while(index_sub_loopdetectedSpeed(totSpeed/totTime); } lastProgressionTime.restart(); } } } /// \brief the copy engine have canceled the transfer void Core::copyInstanceCanceledByEngine() { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start"); int index=indexCopySenderCopyEngine(); if(index!=-1) copyInstanceCanceledByIndex(index); else ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to locate the copy engine sender"); } /// \brief the interface have canceled the transfer void Core::copyInstanceCanceledByInterface() { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start"); int index=indexCopySenderInterface(); if(index!=-1) copyInstanceCanceledByIndex(index); else ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to locate the copy engine sender"); } /// \brief the transfer have been canceled void Core::copyInstanceCanceledByIndex(const int &index) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start, remove with the index: "+QString::number(index)); disconnectEngine(index); disconnectInterface(index); CopyInstance& currentCopyInstance=copyList[index]; currentCopyInstance.engine->cancel(); delete currentCopyInstance.nextConditionalSync; currentCopyInstance.engine->cancel(); delete currentCopyInstance.interface; index_sub_loop=0; loop_size=currentCopyInstance.orderId.size(); while(index_sub_loop(senderObject); if(copyEngine==NULL) { //QMessageBox::critical(NULL,tr("Internal error"),tr("A communication error occured between the interface and the copy plugin. Please report this bug.")); ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Qt sender() NULL"); return; } ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start, delete the copy engine"); delete copyEngine; ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"stop, delete the copy engine"); } //error occurred void Core::error(const QString &path,const quint64 &size,const QDateTime &mtime,const QString &error) { log.error(path,size,mtime,error); int index=indexCopySenderCopyEngine(); if(index!=-1) { copyList[index].haveError=true; copyList.at(index).interface->errorDetected(); } else ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to locate the copy engine sender"); } //for the extra logging void Core::rmPath(const QString &path) { log.rmPath(path); } void Core::mkPath(const QString &path) { log.mkPath(path); } /// \brief to rsync after a new interface connection void Core::syncReady() { int index=indexCopySenderCopyEngine(); if(index!=-1) copyList[index].copyEngineIsSync=true; else ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to locate the copy engine sender"); } void Core::getActionOnList(const QList & actionList) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start"); int index=indexCopySenderCopyEngine(); if(index!=-1) { if(copyList[index].copyEngineIsSync) copyList[index].interface->getActionOnList(actionList); } else ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to locate the copy engine sender"); } void Core::pushGeneralProgression(const quint64 ¤t,const quint64 &total) { int index=indexCopySenderCopyEngine(); if(index!=-1) { copyList[index].currentProgression=current; copyList[index].totalProgression=total; } else ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to locate the copy engine sender"); } /// \brief used to drag and drop files void Core::urlDropped(const QList &urls) { ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start"); int index=indexCopySenderInterface(); if(index!=-1) { QStringList sources; int index_loop=0; while(index_loopnewCopy(sources); if(reply==QMessageBox::No) copyList.at(index).engine->newMove(sources); } else { if(copyList.at(index).mode==Copy) copyList.at(index).engine->newCopy(sources); else copyList.at(index).engine->newMove(sources); } } } else ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to locate the copy engine sender"); }