/** \file CopyListener.h \brief Define the copy listener \author alpha_one_x86 \licence GPL3, see the file COPYING */ #include "CopyListener.h" #include "LanguagesManager.h" #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT #include "plugins/Listener/catchcopy-v0002/listener.h" #endif #include #include CopyListener::CopyListener(OptionDialog *optionDialog) { stopIt=false; this->optionDialog=optionDialog; pluginLoader=new PluginLoader(optionDialog); //load the options tryListen=false; PluginsManager::pluginsManager->lockPluginListEdition(); QList list=PluginsManager::pluginsManager->getPluginsByCategory(PluginType_Listener); connect(this,&CopyListener::previouslyPluginAdded, this,&CopyListener::onePluginAdded,Qt::QueuedConnection); connect(PluginsManager::pluginsManager,&PluginsManager::onePluginAdded, this,&CopyListener::onePluginAdded,Qt::QueuedConnection); #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE connect(PluginsManager::pluginsManager,&PluginsManager::onePluginWillBeRemoved, this,&CopyListener::onePluginWillBeRemoved,Qt::DirectConnection); #endif connect(PluginsManager::pluginsManager,&PluginsManager::pluginListingIsfinish, this,&CopyListener::allPluginIsloaded,Qt::QueuedConnection); connect(pluginLoader,&PluginLoader::pluginLoaderReady, this,&CopyListener::pluginLoaderReady); foreach(PluginsAvailable currentPlugin,list) emit previouslyPluginAdded(currentPlugin); PluginsManager::pluginsManager->unlockPluginListEdition(); last_state=Ultracopier::NotListening; last_have_plugin=false; last_inWaitOfReply=false; stripSeparatorRegex=QRegularExpression(QStringLiteral("[\\\\/]+$")); } CopyListener::~CopyListener() { stopIt=true; if(pluginLoader!=NULL) { delete pluginLoader; pluginLoader=NULL; } } void CopyListener::resendState() { if(PluginsManager::pluginsManager->allPluginHaveBeenLoaded()) { sendState(true); if(pluginLoader!=NULL) pluginLoader->resendState(); } } void CopyListener::onePluginAdded(const PluginsAvailable &plugin) { if(plugin.category!=PluginType_Listener) return; PluginListener newPluginListener; ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("try load: ")+plugin.path+PluginsManager::getResolvedPluginName("listener")); //setFileName #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE PluginInterface_Listener *listen; #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT QObjectList objectList=QPluginLoader::staticInstances(); int index=0; QObject *pluginObject; while(index(pluginObject); if(listen!=NULL) break; index++; } if(index==objectList.size()) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("static listener not found")); return; } #else listen=new Listener(); #endif #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT newPluginListener.pluginLoader=NULL; #endif #else QPluginLoader *pluginOfPluginLoader=new QPluginLoader(plugin.path+PluginsManager::getResolvedPluginName(QStringLiteral("listener"))); QObject *pluginInstance = pluginOfPluginLoader->instance(); if(!pluginInstance) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("unable to load the plugin: ")+pluginOfPluginLoader->errorString()); return; } PluginInterface_Listener *listen = qobject_cast(pluginInstance); if(!listen) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("unable to load the plugin: ")+pluginOfPluginLoader->errorString()); return; } //check if found int index=0; while(indexunload(); return; } index++; } newPluginListener.pluginLoader = pluginOfPluginLoader; #endif ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("Plugin correctly loaded")); #ifdef ULTRACOPIER_DEBUG connect(listen,&PluginInterface_Listener::debugInformation,this,&CopyListener::debugInformation,Qt::DirectConnection); #endif // ULTRACOPIER_DEBUG connect(listen,&PluginInterface_Listener::error, this,&CopyListener::error,Qt::DirectConnection); connect(listen,&PluginInterface_Listener::newCopyWithoutDestination, this,&CopyListener::newPluginCopyWithoutDestination,Qt::DirectConnection); connect(listen,&PluginInterface_Listener::newCopy, this,&CopyListener::newPluginCopy,Qt::DirectConnection); connect(listen,&PluginInterface_Listener::newMoveWithoutDestination, this,&CopyListener::newPluginMoveWithoutDestination,Qt::DirectConnection); connect(listen,&PluginInterface_Listener::newMove, this,&CopyListener::newPluginMove,Qt::DirectConnection); connect(listen,&PluginInterface_Listener::newClientList, this,&CopyListener::reloadClientList,Qt::DirectConnection); newPluginListener.listenInterface = listen; newPluginListener.path = plugin.path+PluginsManager::getResolvedPluginName(QStringLiteral("listener")); newPluginListener.state = Ultracopier::NotListening; newPluginListener.inWaitOfReply = false; newPluginListener.options=new LocalPluginOptions(QStringLiteral("Listener-")+plugin.name); newPluginListener.listenInterface->setResources(newPluginListener.options,plugin.writablePath,plugin.path,ULTRACOPIER_VERSION_PORTABLE_BOOL); optionDialog->addPluginOptionWidget(PluginType_Listener,plugin.name,newPluginListener.listenInterface->options()); connect(LanguagesManager::languagesManager,&LanguagesManager::newLanguageLoaded,newPluginListener.listenInterface,&PluginInterface_Listener::newLanguageLoaded,Qt::DirectConnection); pluginList << newPluginListener; connect(pluginList.last().listenInterface,&PluginInterface_Listener::newState,this,&CopyListener::newState,Qt::DirectConnection); if(tryListen) { pluginList.last().inWaitOfReply=true; listen->listen(); } } #ifdef ULTRACOPIER_DEBUG void CopyListener::debugInformation(const Ultracopier::DebugLevel &level, const QString& fonction, const QString& text, const QString& file, const int& ligne) { DebugEngine::addDebugInformationStatic(level,fonction,text,file,ligne,QStringLiteral("Listener plugin")); } #endif // ULTRACOPIER_DEBUG void CopyListener::error(const QString &error) { QMessageBox::critical(NULL,tr("Error"),tr("Error during the reception of the copy/move list\n%1").arg(error)); } bool CopyListener::oneListenerIsLoaded() { return (pluginList.size()>0); } #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE void CopyListener::onePluginWillBeRemoved(const PluginsAvailable &plugin) { if(plugin.category!=PluginType_Listener) return; int indexPlugin=0; while(indexPluginclose(); delete pluginList.at(indexPlugin).listenInterface; } if(pluginList.at(indexPlugin).pluginLoader!=NULL) { pluginList.at(indexPlugin).pluginLoader->unload(); delete pluginList.at(indexPlugin).options; } pluginList.removeAt(indexPlugin); sendState(); return; } indexPlugin++; } ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"not found"); } #endif void CopyListener::newState(const Ultracopier::ListeningState &state) { if(stopIt) return; ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("start")); PluginInterface_Listener *temp=qobject_cast(QObject::sender()); if(temp==NULL) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,QStringLiteral("listener not located!")); return; } int index=0; while(indexlisten(); index++; } if(pluginLoader!=NULL) pluginLoader->load(); } void CopyListener::close() { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("start")); tryListen=false; if(pluginLoader!=NULL) pluginLoader->unload(); int index=0; while(indexclose(); index++; } copyRunningList.clear(); } QStringList CopyListener::stripSeparator(QStringList sources) { int index=0; while(indextransferFinished(copyRunningList.at(index).pluginOrderId,withError); copyRunningList.removeAt(index); return; } index++; } } void CopyListener::copyCanceled(const quint32 & orderId) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("start")); int index=0; while(indextransferCanceled(copyRunningList.at(index).pluginOrderId); copyRunningList.removeAt(index); return; } index++; } } void CopyListener::newPluginCopyWithoutDestination(const quint32 &orderId,const QStringList &sources) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("sources: ")+sources.join(QStringLiteral(";"))); PluginInterface_Listener *plugin = qobject_cast(sender()); CopyRunning newCopyInformation; newCopyInformation.listenInterface = plugin; newCopyInformation.pluginOrderId = orderId; newCopyInformation.orderId = incrementOrderId(); copyRunningList << newCopyInformation; emit newCopyWithoutDestination(orderId,QStringList() << QStringLiteral("file"),stripSeparator(sources)); } void CopyListener::newPluginCopy(const quint32 &orderId,const QStringList &sources,const QString &destination) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("sources: ")+sources.join(QStringLiteral(";"))+QStringLiteral(", destination: ")+destination); PluginInterface_Listener *plugin = qobject_cast(sender()); CopyRunning newCopyInformation; newCopyInformation.listenInterface = plugin; newCopyInformation.pluginOrderId = orderId; newCopyInformation.orderId = incrementOrderId(); copyRunningList << newCopyInformation; emit newCopy(orderId,QStringList() << QStringLiteral("file"),stripSeparator(sources),QStringLiteral("file"),destination); } void CopyListener::newPluginMoveWithoutDestination(const quint32 &orderId,const QStringList &sources) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("sources: ")+sources.join(QStringLiteral(";"))); PluginInterface_Listener *plugin = qobject_cast(sender()); CopyRunning newCopyInformation; newCopyInformation.listenInterface = plugin; newCopyInformation.pluginOrderId = orderId; newCopyInformation.orderId = incrementOrderId(); copyRunningList << newCopyInformation; emit newMoveWithoutDestination(orderId,QStringList() << QStringLiteral("file"),stripSeparator(sources)); } void CopyListener::newPluginMove(const quint32 &orderId,const QStringList &sources,const QString &destination) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("sources: ")+sources.join(";")+QStringLiteral(", destination: ")+destination); PluginInterface_Listener *plugin = qobject_cast(sender()); CopyRunning newCopyInformation; newCopyInformation.listenInterface = plugin; newCopyInformation.pluginOrderId = orderId; newCopyInformation.orderId = incrementOrderId(); copyRunningList << newCopyInformation; emit newMove(orderId,QStringList() << QStringLiteral("file"),stripSeparator(sources),QStringLiteral("file"),destination); } quint32 CopyListener::incrementOrderId() { do { nextOrderId++; if(nextOrderId>2000000) nextOrderId=0; } while(orderList.contains(nextOrderId)); return nextOrderId; } void CopyListener::allPluginIsloaded() { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("with value: ")+QString::number(pluginList.size()>0)); sendState(true); reloadClientList(); } void CopyListener::reloadClientList() { if(!PluginsManager::pluginsManager->allPluginHaveBeenLoaded()) return; QStringList clients; int indexPlugin=0; while(indexPluginclientsList(); ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("ask client to: ")+pluginList.at(indexPlugin).path); } indexPlugin++; } emit newClientList(clients); } void CopyListener::sendState(bool force) { if(stopIt) return; ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("start, pluginList.size(): %1, force: %2").arg(pluginList.size()).arg(force)); Ultracopier::ListeningState current_state=Ultracopier::NotListening; bool found_not_listen=false,found_listen=false,found_inWaitOfReply=false; int index=0; while(index0; if(force || current_state!=last_state || have_plugin!=last_have_plugin || found_inWaitOfReply!=last_inWaitOfReply) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("send listenerReady(%1,%2,%3)").arg(current_state).arg(have_plugin).arg(found_inWaitOfReply)); emit listenerReady(current_state,have_plugin,found_inWaitOfReply); } else ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("Skip the signal sending")); last_state=current_state; last_have_plugin=have_plugin; last_inWaitOfReply=found_inWaitOfReply; }