summaryrefslogtreecommitdiff
path: root/patch
diff options
context:
space:
mode:
authorThomas Preud'homme <robotux@celest.fr>2013-03-21 11:01:59 +0100
committerThomas Preud'homme <robotux@celest.fr>2013-03-21 11:01:59 +0100
commite297dbd8052ef4e66f069e2dd1865ae7fa8af28e (patch)
tree342fea0a2f6f33b8b62dad2d1729f8209da1a1ba /patch
parent8f9f382e1c97cab2e72e97495650c73ac4b97314 (diff)
Imported Upstream version 0.3.1.0
Diffstat (limited to 'patch')
-rw-r--r--patch/comercial/rsync-copy-engine.patch902
-rw-r--r--patch/opensource/KDE-Ultracopier.patch290
-rw-r--r--patch/opensource/options-with-pass.patch336
3 files changed, 1528 insertions, 0 deletions
diff --git a/patch/comercial/rsync-copy-engine.patch b/patch/comercial/rsync-copy-engine.patch
new file mode 100644
index 0000000..f469d50
--- /dev/null
+++ b/patch/comercial/rsync-copy-engine.patch
@@ -0,0 +1,902 @@
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/ListThread.cpp Rsync/ListThread.cpp
+--- Ultracopier-0.3/ListThread.cpp 2012-06-26 14:12:53.082114806 +0200
++++ Rsync/ListThread.cpp 2012-06-29 22:21:40.395733284 +0200
+@@ -28,6 +28,7 @@
+ numberOfInodeOperation = 0;
+ maxSpeed = 0;
+ doRightTransfer = false;
++ rsync = false;
+ keepDate = false;
+ blockSize = 1024;
+ osBufferLimit = 512;
+@@ -265,6 +266,21 @@
+ this->autoStart=autoStart;
+ }
+
++/// \brief set rsync
++void ListThread::setRsync(const bool rsync)
++{
++ this->rsync=rsync;
++ int index=0;
++ loop_sub_size_transfer_thread_search=transferThreadList.size();
++ while(index<loop_sub_size_transfer_thread_search)
++ {
++ transferThreadList.at(index)->setRsync(rsync);
++ index++;
++ }
++ for(int i=0;i<scanFileOrFolderThreadsPool.size();i++)
++ scanFileOrFolderThreadsPool.at(i)->setRsync(rsync);
++}
++
+ //set check destination folder
+ void ListThread::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
+ {
+@@ -327,11 +343,13 @@
+ #endif
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(newFolderListing(QString)), this,SIGNAL(newFolderListing(QString)));
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(addToRmPath(QString,int)), this,SLOT(addToRmPath(QString,int)), Qt::QueuedConnection);
++ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(addToRmForRsync(QString)), this,SLOT(addToRmForRsync(QString)), Qt::QueuedConnection);
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(addToMkPath(QString)), this,SLOT(addToMkPath(QString)), Qt::QueuedConnection);
+
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(errorOnFolder(QFileInfo,QString)), this,SLOT(errorOnFolder(QFileInfo,QString)), Qt::QueuedConnection);
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(folderAlreadyExists(QFileInfo,QFileInfo,bool)), this,SLOT(folderAlreadyExists(QFileInfo,QFileInfo,bool)), Qt::QueuedConnection);
+
++ scanFileOrFolderThreadsPool.last()->setRsync(rsync);
+ scanFileOrFolderThreadsPool.last()->setFilters(include,exclude);
+ scanFileOrFolderThreadsPool.last()->setCheckDestinationFolderExists(checkDestinationFolderExists && alwaysDoThisActionForFolderExists!=FolderExists_Merge);
+ if(scanFileOrFolderThreadsPool.size()==1)
+@@ -761,6 +779,18 @@
+ actionToDoListInode_afterTheTransfer << temp;
+ }
+
++//rsync rm
++void ListThread::addToRmForRsync(const QString& inode)
++{
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"inode: "+inode);
++ actionToDoInode temp;
++ temp.type = ActionType_RmSync;
++ temp.id = generateIdNumber();
++ temp.folder.setFile(inode);
++ temp.isRunning = false;
++ actionToDoListInode << temp;
++}
++
+ //send action done
+ void ListThread::sendActionDone()
+ {
+@@ -1526,7 +1556,7 @@
+ loop_size=actionToDoListInode.size();
+ while(int_for_loop<loop_size)
+ {
+- if(actionToDoListInode.at(int_for_loop).type==ActionType_RmPath)
++ if(actionToDoListInode.at(int_for_loop).type==ActionType_RmPath || actionToDoListInode.at(int_for_loop).type==ActionType_RmSync)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("stop rmpath: %1").arg(actionToDoListInode.at(int_for_loop).folder.absoluteFilePath()));
+ actionToDoListInode.removeAt(int_for_loop);
+@@ -1658,6 +1688,7 @@
+ last->set_osBuffer(osBuffer);
+ last->set_osBufferLimited(osBufferLimited);
+ last->set_osBufferLimit(osBufferLimit);
++ last->setRsync(rsync);
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(last,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)),this,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)), Qt::QueuedConnection);
+@@ -1669,7 +1700,7 @@
+ connect(last,SIGNAL(preOperationStopped()), this,SLOT(doNewActions_start_transfer()), Qt::QueuedConnection);
+ connect(last,SIGNAL(postOperationStopped()), this,SLOT(transferInodeIsClosed()), Qt::QueuedConnection);
+ connect(last,SIGNAL(checkIfItCanBeResumed()), this,SLOT(restartTransferIfItCan()), Qt::QueuedConnection);
+- connect(last,SIGNAL(pushStat(TransferStat,quint64)), this,SLOT(newTransferStat(TransferStat,quint64)), Qt::QueuedConnection);
++ connect(last,SIGNAL(pushStat(TransferStat,quint64)), this,SLOT(newTransferStat(TransferStat,quint64)), Qt::QueuedConnection);
+
+ connect(this,SIGNAL(send_sendNewRenamingRules(QString,QString)), last,SLOT(setRenamingRules(QString,QString)), Qt::QueuedConnection);
+
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/ListThread.h Rsync/ListThread.h
+--- Ultracopier-0.3/ListThread.h 2012-06-25 16:46:19.931261209 +0200
++++ Rsync/ListThread.h 2012-06-29 21:53:37.495762350 +0200
+@@ -77,7 +77,8 @@
+ enum ActionType
+ {
+ ActionType_MkPath=1,
+- ActionType_RmPath=2
++ ActionType_RmPath=2,
++ ActionType_RmSync=3
+ };
+ /// \brief to store one action to do
+ struct actionToDoInode
+@@ -155,6 +156,8 @@
+ void setBlockSize(const int blockSize);
+ /// \brief set auto start
+ void setAutoStart(const bool autoStart);
++ /// \brief set rsync
++ void setRsync(const bool rsync);
+ /// \brief set check destination folder
+ void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ /// \brief set data local to the thread
+@@ -196,6 +199,7 @@
+ quint64 bytesToTransfer;
+ quint64 bytesTransfered;
+ bool autoStart;
++ bool rsync;
+ bool putInPause;
+ QList<returnActionOnCopyList> actionDone;///< to action to send to the interface
+ quint64 idIncrementNumber;///< to store the last id returned
+@@ -302,6 +306,8 @@
+ quint64 addToMkPath(const QString& folder);
+ //add rm path to do
+ void addToRmPath(const QString& folder,const int& inodeToRemove);
++ //rsync rm
++ void addToRmForRsync(const QString& inode);
+ //send the progression, after full reset of the interface (then all is empty)
+ void syncTransferList_internal();
+ signals:
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/ListThread_InodeAction.cpp Rsync/ListThread_InodeAction.cpp
+--- Ultracopier-0.3/ListThread_InodeAction.cpp 2012-06-29 21:57:47.000000000 +0200
++++ Rsync/ListThread_InodeAction.cpp 2012-06-29 22:19:11.515735854 +0200
+@@ -19,6 +19,14 @@
+ if(numberOfInodeOperation>=ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT)
+ return;
+ break;
++case ActionType_RmSync:
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("launch rm to sync: %1").arg(currentActionToDoInode.folder.absoluteFilePath()));
++ rmPathQueue.addPath(currentActionToDoInode.folder.absoluteFilePath(),true);
++ currentActionToDoInode.isRunning=true;
++ numberOfInodeOperation++;
++ if(numberOfInodeOperation>=ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT)
++ return;
++break;
+ case ActionType_RmPath:
+ /* What is this code?
+ if((int_for_loop+number_rm_path_moved)>=(loop_size-1))
+@@ -34,7 +42,7 @@
+ if(numberOfTranferRuning>0)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("skipped because already inode = 0 and transfer is running: %1").arg(currentActionToDoInode.folder.absoluteFilePath()));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("launch rmpath: %1").arg(currentActionToDoInode.folder.absoluteFilePath()));
+- rmPathQueue.addPath(currentActionToDoInode.folder.absoluteFilePath());
++ rmPathQueue.addPath(currentActionToDoInode.folder.absoluteFilePath(),false);
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT)
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/RmPath.cpp Rsync/RmPath.cpp
+--- Ultracopier-0.3/RmPath.cpp 2012-06-29 22:37:41.715716675 +0200
++++ Rsync/RmPath.cpp 2012-06-29 22:42:25.105711780 +0200
+@@ -16,12 +16,12 @@
+ wait();
+ }
+
+-void RmPath::addPath(const QString &path)
++void RmPath::addPath(const QString &path,const bool &toSync)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+path);
+ if(stopIt)
+ return;
+- emit internalStartAddPath(path);
++ emit internalStartAddPath(path,toSync);
+ }
+
+ void RmPath::skip()
+@@ -38,7 +38,7 @@
+
+ void RmPath::run()
+ {
+- connect(this,SIGNAL(internalStartAddPath(QString)),this,SLOT(internalAddPath(QString)),Qt::QueuedConnection);
++ connect(this,SIGNAL(internalStartAddPath(QString,bool)),this,SLOT(internalAddPath(QString,bool)),Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartDoThisPath()),this,SLOT(internalDoThisPath()),Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartSkip()),this,SLOT(internalSkip()),Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartRetry()),this,SLOT(internalRetry()),Qt::QueuedConnection);
+@@ -50,23 +50,63 @@
+ if(waitAction || pathList.isEmpty())
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+pathList.first());
+- if(!rmpath(pathList.first()))
++ if(!toSyncList.first())
+ {
+- if(stopIt)
++ if(!rmpath(pathList.first(),false))
++ {
++ if(stopIt)
++ return;
++ waitAction=true;
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to remove the folder: "+pathList.first());
++ emit errorOnFolder(pathList.first(),tr("Unable to remove the folder"));
+ return;
+- waitAction=true;
+- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to remove the folder: "+pathList.first());
+- emit errorOnFolder(pathList.first(),tr("Unable to remove the folder"));
+- return;
++ }
++ }
++ else
++ {
++ if(QFileInfo(pathList.first()).isDir())
++ {
++ if(!rmpath(pathList.first(),true))
++ {
++ if(stopIt)
++ return;
++ waitAction=true;
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to remove the folder: "+pathList.first());
++ emit errorOnFolder(pathList.first(),tr("Unable to remove the folder"));
++ return;
++ }
++ }
++ else if(!rmfile(pathList.first()))
++ {
++ if(stopIt)
++ return;
++ waitAction=true;
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to remove the file: "+pathList.first());
++ emit errorOnFolder(pathList.first(),tr("Unable to remove the file"));
++ return;
++ }
+ }
+ pathList.removeFirst();
++ toSyncList.removeFirst();
+ emit firstFolderFinish();
+ checkIfCanDoTheNext();
+ }
+
++bool RmPath::rmfile(QString filePath)
++{
++ QFile file(filePath);
++ if(!file.remove())
++ {
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to remove the file: "+file.fileName()+", error: "+file.errorString());
++ return false;
++ }
++ else
++ return true;
++}
++
+ /** remplace QDir::rmpath() because it return false if the folder not exists
+ and seam bug with parent folder */
+-bool RmPath::rmpath(const QDir &dir)
++bool RmPath::rmpath(const QDir &dir,const bool &toSync)
+ {
+ if(!dir.exists())
+ return true;
+@@ -77,28 +117,40 @@
+ QFileInfo fileInfo(list.at(i));
+ if(!fileInfo.isDir())
+ {
+- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"found a file: "+fileInfo.fileName());
+- allHaveWork=false;
++ if(toSync)
++ {
++ if(!rmfile(fileInfo.absoluteFilePath()))
++ {
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to remove a file: "+fileInfo.fileName());
++ allHaveWork=false;
++ }
++ }
++ else
++ {
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"found a file: "+fileInfo.fileName());
++ allHaveWork=false;
++ }
+ }
+ else
+ {
+ //return the fonction for scan the new folder
+- if(!rmpath(dir.absolutePath()+'/'+fileInfo.fileName()+'/'))
++ if(!rmpath(dir.absolutePath()+'/'+fileInfo.fileName()+'/',toSync))
+ allHaveWork=false;
+ }
+ }
+ if(!allHaveWork)
+- return allHaveWork;
++ return false;
+ allHaveWork=dir.rmdir(dir.absolutePath());
+ if(!allHaveWork)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to remove the folder: "+dir.absolutePath());
+ return allHaveWork;
+ }
+
+-void RmPath::internalAddPath(const QString &path)
++void RmPath::internalAddPath(const QString &path,const bool &toSync)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+path);
+ pathList << path;
++ toSyncList << toSync;
+ if(!waitAction)
+ checkIfCanDoTheNext();
+ }
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/RmPath.h Rsync/RmPath.h
+--- Ultracopier-0.3/RmPath.h 2012-03-19 17:34:43.572371290 +0100
++++ Rsync/RmPath.h 2012-06-29 22:36:02.135718395 +0200
+@@ -24,11 +24,11 @@
+ explicit RmPath();
+ ~RmPath();
+ /// \brief add new path to remove
+- void addPath(const QString &path);
++ void addPath(const QString &path,const bool &toSync);
+ signals:
+ void errorOnFolder(const QFileInfo &,const QString &);
+ void firstFolderFinish();
+- void internalStartAddPath(const QString &path);
++ void internalStartAddPath(const QString &path,const bool &toSync);
+ void internalStartDoThisPath();
+ void internalStartSkip();
+ void internalStartRetry();
+@@ -42,12 +42,14 @@
+ bool stopIt;
+ bool skipIt;
+ QStringList pathList;
++ QList<bool> toSyncList;
+ void checkIfCanDoTheNext();
+ QDir dir;
+- bool rmpath(const QDir &dir);
++ bool rmpath(const QDir &dir,const bool &toSync);
++ bool rmfile(QString filePath);
+ private slots:
+ void internalDoThisPath();
+- void internalAddPath(const QString &path);
++ void internalAddPath(const QString &path,const bool &toSync);
+ void internalSkip();
+ void internalRetry();
+ };
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/TransferThread.cpp Rsync/TransferThread.cpp
+--- Ultracopier-0.3/TransferThread.cpp 2012-06-29 15:58:31.546130402 +0200
++++ Rsync/TransferThread.cpp 2012-06-29 18:58:24.095943961 +0200
+@@ -26,6 +26,7 @@
+ alwaysDoFileExistsAction= FileExists_NotSet;
+ readError = false;
+ writeError = false;
++ rsync = false;
+ this->mkpathTransfer = mkpathTransfer;
+ readThread.setWriteThread(&writeThread);
+
+@@ -278,7 +279,7 @@
+ {
+ //check if destination exists
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] overwrite: "+QString::number(fileExistsAction)+", always action: "+QString::number(alwaysDoFileExistsAction));
+- if(alwaysDoFileExistsAction==FileExists_Overwrite || readError || writeError)
++ if(alwaysDoFileExistsAction==FileExists_Overwrite || rsync || readError || writeError)
+ return false;
+ if(destinationInfo.exists())
+ {
+@@ -1124,6 +1125,12 @@
+ emit tryPutAtBottom();
+ }
+
++/// \brief set rsync
++void TransferThread::setRsync(const bool rsync)
++{
++ this->rsync=rsync;
++}
++
+ void TransferThread::set_osBufferLimit(unsigned int osBufferLimit)
+ {
+ this->osBufferLimit=osBufferLimit;
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/TransferThread.h Rsync/TransferThread.h
+--- Ultracopier-0.3/TransferThread.h 2012-06-26 11:10:54.541994070 +0200
++++ Rsync/TransferThread.h 2012-06-29 15:54:29.286134585 +0200
+@@ -113,6 +113,8 @@
+ qint64 copiedSize();
+ /// \brief put the current file at bottom
+ void putAtBottom();
++ /// \brief set rsync
++ void setRsync(const bool rsync);
+
+ void set_osBufferLimit(unsigned int osBufferLimit);
+ void setRenamingRules(QString firstRenamingRule,QString otherRenamingRule);
+@@ -166,6 +168,7 @@
+ bool readIsClosedVariable;
+ bool writeIsClosedVariable;
+ bool canBeMovedDirectlyVariable;
++ bool rsync;
+ QByteArray sourceChecksum,destinationChecksum;
+ volatile bool stopIt;
+ volatile bool canStartTransfer;
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/copyEngine.cpp Rsync/copyEngine.cpp
+--- Ultracopier-0.3/copyEngine.cpp 2012-06-26 14:14:40.892116001 +0200
++++ Rsync/copyEngine.cpp 2012-06-29 21:22:50.945794251 +0200
+@@ -186,6 +186,7 @@
+ connect(ui->keepDate, SIGNAL(toggled(bool)), &threadOfTheTransfer, SLOT(setKeepDate(bool)));
+ connect(ui->blockSize, SIGNAL(valueChanged(int)), &threadOfTheTransfer, SLOT(setBlockSize(int)));*/
+ connect(ui->autoStart, SIGNAL(toggled(bool)), this, SLOT(setAutoStart(bool)));
++ connect(ui->rsync, SIGNAL(toggled(bool)), this, SLOT(setRsync(bool)));
+ connect(ui->checkBoxDestinationFolderExists, SIGNAL(toggled(bool)), this, SLOT(setCheckDestinationFolderExists(bool)));
+ uiIsInstalled=true;
+ setRightTransfer(doRightTransfer);
+@@ -193,6 +194,7 @@
+ setSpeedLimitation(maxSpeed);
+ setBlockSize(blockSize);
+ setAutoStart(autoStart);
++ setRsync(rsync);
+ setCheckDestinationFolderExists(checkDestinationFolderExists);
+ set_doChecksum(doChecksum);
+ set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
+@@ -216,6 +218,7 @@
+ connect(ui->keepDate, SIGNAL(toggled(bool)), this,SLOT(setKeepDate(bool)));
+ connect(ui->blockSize, SIGNAL(valueChanged(int)), this,SLOT(setBlockSize(int)));
+ connect(ui->autoStart, SIGNAL(toggled(bool)), this,SLOT(setAutoStart(bool)));
++ connect(ui->rsync, SIGNAL(toggled(bool)), this,SLOT(setRsync(bool)));
+ connect(ui->doChecksum, SIGNAL(toggled(bool)), this,SLOT(doChecksum_toggled(bool)));
+ connect(ui->checksumIgnoreIfImpossible, SIGNAL(toggled(bool)), this,SLOT(checksumIgnoreIfImpossible_toggled(bool)));
+ connect(ui->checksumOnlyOnError, SIGNAL(toggled(bool)), this,SLOT(checksumOnlyOnError_toggled(bool)));
+@@ -505,6 +508,13 @@
+ /** \brief give the forced mode, to export/import transfer list */
+ void copyEngine::forceMode(const CopyMode &mode)
+ {
++ if(mode==Move)
++ {
++ listThread->setRsync(false);
++ rsync=false;
++ }
++ if(uiIsInstalled)
++ ui->rsync->setEnabled(mode==Copy);
+ if(forcedMode)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Mode forced previously"));
+@@ -617,6 +627,19 @@
+ listThread->setAutoStart(autoStart);
+ }
+
++/// \brief set rsync
++void copyEngine::setRsync(const bool rsync)
++{
++ this->rsync=rsync;
++ if(uiIsInstalled)
++ {
++ ui->rsync->setChecked(rsync);
++ ui->rsync->setEnabled(forcedMode && mode==Copy);
++ ui->label_rsync->setEnabled(forcedMode && mode==Copy);
++ }
++ listThread->setRsync(rsync);
++}
++
+ //set check destination folder
+ void copyEngine::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
+ {
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/copyEngine.h Rsync/copyEngine.h
+--- Ultracopier-0.3/copyEngine.h 2012-06-25 16:50:12.191263770 +0200
++++ Rsync/copyEngine.h 2012-06-29 15:49:45.856139485 +0200
+@@ -60,6 +60,7 @@
+ bool keepDate;
+ int blockSize;
+ bool autoStart;
++ bool rsync;
+ bool checkDestinationFolderExists;
+ FileExistsAction alwaysDoThisActionForFileExists;
+ FileErrorAction alwaysDoThisActionForFileError;
+@@ -273,6 +274,8 @@
+ void setBlockSize(const int blockSize);
+ /// \brief set auto start
+ void setAutoStart(const bool autoStart);
++ /// \brief set rsync
++ void setRsync(const bool rsync);
+ /// \brief set if need check if the destination folder exists
+ void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ /// \brief reset widget
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/copyEngine.pro.user Rsync/copyEngine.pro.user
+--- Ultracopier-0.3/copyEngine.pro.user 2012-06-26 15:50:53.722179836 +0200
++++ Rsync/copyEngine.pro.user 2012-06-29 22:42:24.025711798 +0200
+@@ -1,6 +1,6 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <!DOCTYPE QtCreatorProject>
+-<!-- Written by Qt Creator 2.5.0, 2012-06-26T15:50:53. -->
++<!-- Written by Qt Creator 2.5.0, 2012-06-29T22:42:24. -->
+ <qtcreator>
+ <data>
+ <variable>ProjectExplorer.Project.ActiveTarget</variable>
+@@ -163,7 +163,113 @@
+ <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId">2</value>
+ <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+ </valuemap>
+- <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
++ <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
++ <value type="QString" key="ProjectExplorer.BuildCOnfiguration.ToolChain">ProjectExplorer.ToolChain.Gcc:{d6ee78f7-3364-4f54-a93f-b3c1e2a8c8c9}</value>
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
++ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
++ <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
++ <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
++ <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
++ <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
++ </valuemap>
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
++ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
++ <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
++ </valuemap>
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
++ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
++ <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
++ <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
++ <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 5.0.0 (qt-everywhere-opensource-src-5.0.0) Release</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
++ <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
++ <value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/home/user/Desktop/ultracopier/sources/plugins/CopyEngine/copyEngine-build-desktop-Qt_5_0_0__qt-everywhere-opensource-src-5_0_0__Release</value>
++ <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId">3</value>
++ <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
++ </valuemap>
++ <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3">
++ <value type="QString" key="ProjectExplorer.BuildCOnfiguration.ToolChain">ProjectExplorer.ToolChain.Gcc:{d6ee78f7-3364-4f54-a93f-b3c1e2a8c8c9}</value>
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
++ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
++ <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
++ <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
++ <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
++ <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
++ </valuemap>
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
++ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
++ <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
++ </valuemap>
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
++ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
++ <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
++ <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
++ <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 5.0.0 (qt-everywhere-opensource-src-5.0.0) Debug</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
++ <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
++ <value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/home/user/Desktop/ultracopier/sources/plugins/CopyEngine/copyEngine-build-desktop-Qt_5_0_0__qt-everywhere-opensource-src-5_0_0__Debug</value>
++ <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId">3</value>
++ <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">4</value>
+ <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/factory.cpp Rsync/factory.cpp
+--- Ultracopier-0.3/factory.cpp 2012-06-26 14:10:39.972113336 +0200
++++ Rsync/factory.cpp 2012-06-29 15:40:43.606148853 +0200
+@@ -35,6 +35,7 @@
+ connect(ui->keepDate, SIGNAL(toggled(bool)), this,SLOT(setKeepDate(bool)));
+ connect(ui->blockSize, SIGNAL(valueChanged(int)), this,SLOT(setBlockSize(int)));
+ connect(ui->autoStart, SIGNAL(toggled(bool)), this,SLOT(setAutoStart(bool)));
++ connect(ui->rsync, SIGNAL(toggled(bool)), this,SLOT(setRsync(bool)));
+ connect(ui->doChecksum, SIGNAL(toggled(bool)), this,SLOT(doChecksum_toggled(bool)));
+ connect(ui->checksumIgnoreIfImpossible, SIGNAL(toggled(bool)), this,SLOT(checksumIgnoreIfImpossible_toggled(bool)));
+ connect(ui->checksumOnlyOnError, SIGNAL(toggled(bool)), this,SLOT(checksumOnlyOnError_toggled(bool)));
+@@ -71,6 +72,7 @@
+ realObject->setKeepDate( optionsEngine->getOptionValue("keepDate").toBool());
+ realObject->setBlockSize( optionsEngine->getOptionValue("blockSize").toInt());
+ realObject->setAutoStart( optionsEngine->getOptionValue("autoStart").toBool());
++ realObject->setRsync( optionsEngine->getOptionValue("rsync").toBool());
+ realObject->on_comboBoxFolderColision_currentIndexChanged(ui->comboBoxFolderColision->currentIndex());
+ realObject->on_comboBoxFolderError_currentIndexChanged(ui->comboBoxFolderError->currentIndex());
+ realObject->setCheckDestinationFolderExists( optionsEngine->getOptionValue("checkDestinationFolder").toBool());
+@@ -123,6 +125,7 @@
+ KeysList.append(qMakePair(QString("keepDate"),QVariant(true)));
+ KeysList.append(qMakePair(QString("blockSize"),QVariant(1024)));//1024KB as default
+ KeysList.append(qMakePair(QString("autoStart"),QVariant(true)));
++ KeysList.append(qMakePair(QString("rsync"),QVariant(true)));
+ KeysList.append(qMakePair(QString("folderError"),QVariant(0)));
+ KeysList.append(qMakePair(QString("folderColision"),QVariant(0)));
+ KeysList.append(qMakePair(QString("checkDestinationFolder"),QVariant(true)));
+@@ -151,6 +154,7 @@
+ ui->keepDate->setChecked(optionsEngine->getOptionValue("keepDate").toBool());
+ ui->blockSize->setValue(optionsEngine->getOptionValue("blockSize").toUInt());
+ ui->autoStart->setChecked(optionsEngine->getOptionValue("autoStart").toBool());
++ ui->rsync->setChecked(optionsEngine->getOptionValue("rsync").toBool());
+ ui->comboBoxFolderError->setCurrentIndex(optionsEngine->getOptionValue("folderError").toUInt());
+ ui->comboBoxFolderColision->setCurrentIndex(optionsEngine->getOptionValue("folderColision").toUInt());
+ ui->checkBoxDestinationFolderExists->setChecked(optionsEngine->getOptionValue("checkDestinationFolder").toBool());
+@@ -287,6 +291,15 @@
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"internal error, crash prevented");
+ }
++
++void Factory::setRsync(bool rsync)
++{
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"the checkbox have changed");
++ if(optionsEngine!=NULL)
++ optionsEngine->setOptionValue("rsync",rsync);
++ else
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"internal error, crash prevented");
++}
+
+ void Factory::newLanguageLoaded()
+ {
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/factory.h Rsync/factory.h
+--- Ultracopier-0.3/factory.h 2012-05-19 15:44:05.354039716 +0200
++++ Rsync/factory.h 2012-06-29 15:40:20.016149261 +0200
+@@ -71,6 +71,7 @@
+ void setKeepDate(bool keepDate);
+ void setBlockSize(int blockSize);
+ void setAutoStart(bool autoStart);
++ void setRsync(bool rsync);
+ void showFilterDialog();
+ void sendNewFilters(QStringList includeStrings,QStringList includeOptions,QStringList excludeStrings,QStringList excludeOptions);
+ void doChecksum_toggled(bool);
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/informations.xml Rsync/informations.xml
+--- Ultracopier-0.3/informations.xml 2012-06-25 17:31:49.331291383 +0200
++++ Rsync/informations.xml 2012-06-29 15:11:53.696178734 +0200
+@@ -1,7 +1,7 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <package>
+- <title xml:lang="en"><![CDATA[Copy engine of Ultracopier 0.3]]></title><!-- english is required -->
+- <title xml:lang="fr"><![CDATA[Moteur de copie d'ultracopier 0.3]]></title>
++ <title xml:lang="en"><![CDATA[Rsync copy engine]]></title><!-- english is required -->
++ <title xml:lang="fr"><![CDATA[Moteur de copie rsync]]></title>
+ <!-- What kind of plugin this is -->
+ <category>CopyEngine</category>
+ <!-- Who wrote this plugin -->
+@@ -14,12 +14,12 @@
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>linux-x86_64-pc</architecture>
+ <!-- Detailed description -->
+- <description xml:lang="en"><![CDATA[Copy engine of Ultracopier 0.3, do in Qt for all platform, and copy by stream]]></description>
+- <description xml:lang="fr"><![CDATA[Moteur de copie d'ultracopier 0.3, fait en Qt pour toutes les plateformes, et copie par stream]]></description>
++ <description xml:lang="en"><![CDATA[Rsync copy engine, variant of the official copy engine to provide simple way to do backups]]></description>
++ <description xml:lang="fr"><![CDATA[Moteur de copie rsync, variante du moteur de copie officiel pour fournir une maniƩre simple de faire des backups]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>0.3.0.10</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+- <name>Ultracopier-0.3</name>
++ <name>Rsync</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ >=ultracopier-0.3.0.10
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/options.ui Rsync/options.ui
+--- Ultracopier-0.3/options.ui 2012-06-20 14:56:21.509908805 +0200
++++ Rsync/options.ui 2012-06-29 22:15:47.595739375 +0200
+@@ -6,8 +6,8 @@
+ <rect>
+ <x>0</x>
+ <y>0</y>
+- <width>356</width>
+- <height>376</height>
++ <width>354</width>
++ <height>399</height>
+ </rect>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+@@ -122,7 +122,7 @@
+ <item row="6" column="2">
+ <widget class="QCheckBox" name="checkBoxDestinationFolderExists"/>
+ </item>
+- <item row="7" column="0" colspan="3">
++ <item row="8" column="0" colspan="3">
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Checksum</string>
+@@ -175,24 +175,24 @@
+ </layout>
+ </widget>
+ </item>
+- <item row="8" column="1">
++ <item row="9" column="1">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Enable OS buffer</string>
+ </property>
+ </widget>
+ </item>
+- <item row="8" column="2">
++ <item row="9" column="2">
+ <widget class="QCheckBox" name="osBuffer"/>
+ </item>
+- <item row="9" column="0" colspan="2">
++ <item row="10" column="0" colspan="2">
+ <widget class="QCheckBox" name="osBufferLimited">
+ <property name="text">
+ <string>OS buffer only if smaller than</string>
+ </property>
+ </widget>
+ </item>
+- <item row="9" column="2">
++ <item row="10" column="2">
+ <widget class="QSpinBox" name="osBufferLimit">
+ <property name="suffix">
+ <string>KB</string>
+@@ -215,7 +215,7 @@
+ </property>
+ </widget>
+ </item>
+- <item row="12" column="1">
++ <item row="13" column="1">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+@@ -228,20 +228,34 @@
+ </property>
+ </spacer>
+ </item>
+- <item row="11" column="1">
++ <item row="12" column="1">
+ <widget class="QPushButton" name="filters">
+ <property name="text">
+ <string>Filters</string>
+ </property>
+ </widget>
+ </item>
+- <item row="10" column="1">
++ <item row="11" column="1">
+ <widget class="QPushButton" name="renamingRules">
+ <property name="text">
+ <string>Renaming rules</string>
+ </property>
+ </widget>
+ </item>
++ <item row="7" column="2">
++ <widget class="QCheckBox" name="rsync">
++ <property name="text">
++ <string/>
++ </property>
++ </widget>
++ </item>
++ <item row="7" column="0" colspan="2">
++ <widget class="QLabel" name="label_rsync">
++ <property name="text">
++ <string>Rsync (only in copy mode)</string>
++ </property>
++ </widget>
++ </item>
+ </layout>
+ </widget>
+ <resources/>
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/scanFileOrFolder.cpp Rsync/scanFileOrFolder.cpp
+--- Ultracopier-0.3/scanFileOrFolder.cpp 2012-05-23 11:06:25.001037392 +0200
++++ Rsync/scanFileOrFolder.cpp 2012-06-29 21:54:15.555761695 +0200
+@@ -1,9 +1,10 @@
+ #include "scanFileOrFolder.h"
+
+-#include <QMessageBox>
++#include <QDateTime>
+
+ scanFileOrFolder::scanFileOrFolder(CopyMode mode)
+ {
++ rsync=false;
+ stopped = true;
+ stopIt = false;
+ this->mode=mode;
+@@ -427,7 +428,17 @@
+ if(!included)
+ {}
+ else
+- emit fileTransfer(fileInfo.absoluteFilePath(),finalDest+fileName,mode);
++ {
++ bool sendToTransfer=false;
++ if(!rsync)
++ sendToTransfer=true;
++ else if(!QFile::exists(finalDest+fileName))
++ sendToTransfer=true;
++ else if(fileInfo.lastModified()!=QFileInfo(finalDest+fileName).lastModified())
++ sendToTransfer=true;
++ if(sendToTransfer)
++ emit fileTransfer(fileInfo.absoluteFilePath(),finalDest+fileName,mode);
++ }
+ }
+ }
+ }
+@@ -437,9 +448,43 @@
+ //listFolder(source,destination,suffixPath+fileInfo.fileName()+QDir::separator());
+ listFolder(source,destination,sourceSuffixPath+fileInfo.fileName()+"/",destinationSuffixPath+fileInfo.fileName()+"/");//put unix separator because it's transformed into that's under windows too
+ else
+- emit fileTransfer(fileInfo.absoluteFilePath(),finalDest+fileInfo.fileName(),mode);
++ {
++ bool sendToTransfer=false;
++ if(!rsync)
++ sendToTransfer=true;
++ else if(!QFile::exists(finalDest+fileInfo.fileName()))
++ sendToTransfer=true;
++ else if(fileInfo.lastModified()!=QFileInfo(finalDest+fileInfo.fileName()).lastModified())
++ sendToTransfer=true;
++ if(sendToTransfer)
++ emit fileTransfer(fileInfo.absoluteFilePath(),finalDest+fileInfo.fileName(),mode);
++ }
+ }
+ }
++ if(rsync)
++ {
++ //check the reverse path here
++ QFileInfoList entryListDestination=QDir(finalDest).entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System,QDir::DirsFirst|QDir::Name|QDir::IgnoreCase);//possible wait time here
++ int sizeEntryListDestination=entryListDestination.size();
++ int index=0;
++ for (int indexDestination=0;indexDestination<sizeEntryListDestination;++indexDestination)
++ {
++ index=0;
++ while(index<sizeEntryList)
++ {
++ if(entryListDestination.at(indexDestination).fileName()==entryList.at(index).fileName())
++ break;
++ index++;
++ }
++ if(index==sizeEntryList)
++ {
++ //then not found, need be remove
++ emit addToRmForRsync(finalDest+entryListDestination.at(indexDestination).fileName());
++ }
++ }
++ return;
++ }
++
+ if(mode==Move)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"newSource: "+newSource+", sizeEntryList: "+QString::number(sizeEntryList));
+@@ -458,3 +503,9 @@
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+ }
++
++/// \brief set rsync
++void scanFileOrFolder::setRsync(const bool rsync)
++{
++ this->rsync=rsync;
++}
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/scanFileOrFolder.h Rsync/scanFileOrFolder.h
+--- Ultracopier-0.3/scanFileOrFolder.h 2012-05-20 20:32:43.695874620 +0200
++++ Rsync/scanFileOrFolder.h 2012-06-29 21:51:45.235764294 +0200
+@@ -38,6 +38,8 @@
+ /// \brief set if need check if the destination exists
+ void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ void setRenamingRules(QString firstRenamingRule,QString otherRenamingRule);
++ /// \brief set rsync
++ void setRsync(const bool rsync);
+ signals:
+ void fileTransfer(const QFileInfo &source,const QFileInfo &destination,const CopyMode &mode);
+ /// \brief To debug source
+@@ -49,6 +51,7 @@
+ void newFolderListing(const QString &path);
+ void addToMkPath(const QString& folder);
+ void addToRmPath(const QString& folder,const int& inodeToRemove);
++ void addToRmForRsync(const QString& inode);
+ public slots:
+ void addToList(const QStringList& sources,const QString& destination);
+ void setFilters(QList<Filters_rules> include,QList<Filters_rules> exclude);
+@@ -69,6 +72,7 @@
+ QString prefix;
+ QString suffix;
+ CopyMode mode;
++ bool rsync;
+ QList<Filters_rules> include,exclude;
+ QList<Filters_rules> include_send,exclude_send;
+ bool reloadTheNewFilters;
diff --git a/patch/opensource/KDE-Ultracopier.patch b/patch/opensource/KDE-Ultracopier.patch
new file mode 100644
index 0000000..4130c08
--- /dev/null
+++ b/patch/opensource/KDE-Ultracopier.patch
@@ -0,0 +1,290 @@
+diff -U 3 -H -d -r -N -- kde-baseapps-4.8.4/lib/konq/CMakeLists.txt kde-baseapps-4.8.4-ultracopier/lib/konq/CMakeLists.txt
+--- kde-baseapps-4.8.4/lib/konq/CMakeLists.txt 2011-09-26 11:43:17.390868969 +0200
++++ kde-baseapps-4.8.4-ultracopier/lib/konq/CMakeLists.txt 2012-06-27 09:54:15.909492978 +0200
+@@ -9,6 +9,7 @@
+ include_directories( ${ZLIB_INCLUDE_DIR} )
+
+ set(konq_LIB_SRCS
++ ClientCatchcopy.cpp
+ konq_popupmenu.cpp # used by konqueror, kfind, folderview, kickoff
+ konq_popupmenuplugin.cpp # for KonqPopupMenu and its plugins
+ konq_dndpopupmenuplugin.cpp # for KonqDndPopupMenu and its plugins
+@@ -53,6 +54,7 @@
+
+ install( FILES directory_bookmarkbar.desktop DESTINATION ${DATA_INSTALL_DIR}/kbookmark )
+ install( FILES
++ ClientCatchcopy.h
+ konq_popupmenu.h
+ konq_popupmenuinformation.h
+ konq_popupmenuplugin.h
+diff -U 3 -H -d -r -N -- kde-baseapps-4.8.4/lib/konq/ClientCatchcopy.cpp kde-baseapps-4.8.4-ultracopier/lib/konq/ClientCatchcopy.cpp
+--- kde-baseapps-4.8.4/lib/konq/ClientCatchcopy.cpp 1970-01-01 01:00:00.000000000 +0100
++++ kde-baseapps-4.8.4-ultracopier/lib/konq/ClientCatchcopy.cpp 2012-06-27 10:28:25.049457581 +0200
+@@ -0,0 +1,142 @@
++/** \file ClientCatchcopy.cpp
++\brief Define the catchcopy client
++\author alpha_one_x86
++\version 0002
++\date 2010 */
++
++#include "ClientCatchcopy.h"
++
++ClientCatchcopy::ClientCatchcopy()
++{
++ disconnectedFromSocket();
++ connect(&socket, SIGNAL(disconnected()), this, SLOT(disconnectedFromSocket()));
++ connect(&socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
++ connect(&socket, SIGNAL(connected()), this, SLOT(socketIsConnected()));
++}
++
++void ClientCatchcopy::socketIsConnected()
++{
++ sendProtocol();
++}
++
++void ClientCatchcopy::connectToServer()
++{
++ socket.connectToServer(pathSocket());
++ socket.waitForConnected();
++}
++
++const QString ClientCatchcopy::pathSocket()
++{
++#ifdef Q_OS_UNIX
++ return "advanced-copier-"+QString::number(getuid());
++#else
++ QString userName;
++ DWORD size=0;
++ if(GetUserNameW(NULL,&size) || (GetLastError()!=ERROR_INSUFFICIENT_BUFFER))
++ {
++ }
++ else
++ {
++ WCHAR * userNameW=new WCHAR[size];
++ if(GetUserNameW(userNameW,&size))
++ {
++ userName.fromWCharArray(userNameW,size*2);
++ userName=QString(QByteArray((char*)userNameW,size*2-2).toHex());
++ }
++ delete userNameW;
++ }
++ return "advanced-copier-"+userName;
++#endif
++}
++
++void ClientCatchcopy::disconnectFromServer()
++{
++ socket.abort();
++ socket.disconnectFromServer();
++}
++
++/// \brief to send stream of string list
++quint32 ClientCatchcopy::sendRawOrderList(const QStringList & order)
++{
++ if(!socket.isValid())
++ return -1;
++ if(socket.state()!=QLocalSocket::ConnectedState)
++ return -1;
++ idNextOrder++;
++ if(idNextOrder>2000000000)
++ idNextOrder=0;
++ QByteArray block;
++ QDataStream out(&block, QIODevice::WriteOnly);
++ out.setVersion(QDataStream::Qt_4_4);
++ out << int(0);
++ out << idNextOrder;
++ out << order;
++ out.device()->seek(0);
++ out << block.size();
++ do //cut string list and send it as block of 32KB
++ {
++ QByteArray blockToSend;
++ int byteWriten;
++ blockToSend=block.left(32*1024);//32KB
++ block.remove(0,blockToSend.size());
++ byteWriten = socket.write(blockToSend);
++ if(!socket.isValid())
++ return -1;
++ if(socket.errorString()!="Unknown error" && socket.errorString()!="")
++ return -1;
++ if(blockToSend.size()!=byteWriten)
++ return -1;
++ }
++ while(block.size());
++ return idNextOrder;
++}
++
++void ClientCatchcopy::readyRead()
++{
++ while(socket.bytesAvailable()>0)
++ {
++ socket.readAll();
++ }
++}
++
++void ClientCatchcopy::disconnectedFromSocket()
++{
++ idNextOrder = 0;
++}
++
++/// \brief to send the protocol version used
++void ClientCatchcopy::sendProtocol()
++{
++ sendRawOrderList(QStringList() << "protocol" << "0002");
++}
++
++void ClientCatchcopy::setClientName(const QString & name)
++{
++ sendRawOrderList(QStringList() << "client" << name);
++}
++
++bool ClientCatchcopy::addCopyWithDestination(const QStringList & sources,const QString & destination)
++{
++ if(socket.state()==QLocalSocket::UnconnectedState)
++ connectToServer();
++ if(socket.state()==QLocalSocket::ConnectedState)
++ {
++ sendRawOrderList(QStringList() << "cp" << sources << destination);
++ return true;
++ }
++ else
++ return false;
++}
++
++bool ClientCatchcopy::addMoveWithDestination(const QStringList & sources,const QString & destination)
++{
++ if(socket.state()==QLocalSocket::UnconnectedState)
++ connectToServer();
++ if(socket.state()==QLocalSocket::ConnectedState)
++ {
++ sendRawOrderList(QStringList() << "mv" << sources << destination);
++ return true;
++ }
++ else
++ return false;
++}
+diff -U 3 -H -d -r -N -- kde-baseapps-4.8.4/lib/konq/ClientCatchcopy.h kde-baseapps-4.8.4-ultracopier/lib/konq/ClientCatchcopy.h
+--- kde-baseapps-4.8.4/lib/konq/ClientCatchcopy.h 1970-01-01 01:00:00.000000000 +0100
++++ kde-baseapps-4.8.4-ultracopier/lib/konq/ClientCatchcopy.h 2012-06-27 10:28:52.169457112 +0200
+@@ -0,0 +1,58 @@
++/** \file ClientCatchcopy.h
++\brief Define the catchcopy client
++\author alpha_one_x86
++\version 0002
++\date 2010 */
++
++#ifndef CLIENTCATCHCOPY_H
++#define CLIENTCATCHCOPY_H
++
++#include <QObject>
++#include <QLocalSocket>
++#include <QStringList>
++#include <QString>
++#include <QByteArray>
++
++#ifdef Q_OS_UNIX
++ #include <unistd.h>
++ #include <sys/types.h>
++#else
++ #include <windows.h>
++#endif
++
++/// \brief Define the catchcopy client
++class ClientCatchcopy : public QObject
++{
++ Q_OBJECT
++ public:
++ ClientCatchcopy();
++ public slots:
++ void connectToServer();
++ void disconnectFromServer();
++ //to test and internal use
++ /// \brief set the client name
++ void setClientName(const QString & name);
++ /// \brief add copy with destination
++ bool addCopyWithDestination(const QStringList & sources,const QString & destination);
++ /// \brief add move with destination
++ bool addMoveWithDestination(const QStringList & sources,const QString & destination);
++ private:
++ /// \brief to send order
++ void sendProtocol();
++
++ const QString pathSocket();
++ quint32 idNextOrder;
++ //the local socket
++ QLocalSocket socket;
++
++ /// \brief to send stream of string list
++ quint32 sendRawOrderList(const QStringList & order);
++ private slots:
++ void readyRead();
++ void disconnectedFromSocket();
++ void socketIsConnected();
++ protected:
++ bool parseReply(quint32 orderId,quint32 returnCode,QStringList returnList);
++};
++
++#endif // CLIENTCATCHCOPY_H
+diff -U 3 -H -d -r -N -- kde-baseapps-4.8.4/lib/konq/konq_operations.cpp kde-baseapps-4.8.4-ultracopier/lib/konq/konq_operations.cpp
+--- kde-baseapps-4.8.4/lib/konq/konq_operations.cpp 2011-09-26 11:43:17.392868951 +0200
++++ kde-baseapps-4.8.4-ultracopier/lib/konq/konq_operations.cpp 2012-06-27 10:29:32.879456409 +0200
+@@ -154,6 +154,8 @@
+ }
+ }
+
++ClientCatchcopy KonqOperations::clientCatchcopy;
++
+ void KonqOperations::copy( QWidget * parent, Operation method, const KUrl::List & selectedUrls, const KUrl& destUrl )
+ {
+ kDebug(1203) << parent->metaObject()->className() << selectedUrls << destUrl;
+@@ -175,7 +177,30 @@
+ else if (method == MOVE)
+ job = KIO::move( selectedUrls, destUrl );
+ else
++ {
++ QStringList selectedFiles;
++ bool isLocal=true;
++ int index=0;
++ while(index<selectedUrls.size())
++ {
++ if(!selectedUrls.at(index).isLocalFile())
++ {
++ isLocal=false;
++ break;
++ }
++ selectedFiles << selectedUrls.at(index).toLocalFile();
++ index++;
++ }
++ isLocal&=destUrl.isLocalFile();
++ if(isLocal)
++ {
++ if(clientCatchcopy.addCopyWithDestination(selectedFiles,destUrl.toLocalFile()))
++ return;
++ }
++ else
+ job = KIO::copy( selectedUrls, destUrl );
++
++ }
+
+ op->setOperation( job, method, destUrl );
+
+diff -U 3 -H -d -r -N -- kde-baseapps-4.8.4/lib/konq/konq_operations.h kde-baseapps-4.8.4-ultracopier/lib/konq/konq_operations.h
+--- kde-baseapps-4.8.4/lib/konq/konq_operations.h 2011-07-27 20:36:39.112044764 +0200
++++ kde-baseapps-4.8.4-ultracopier/lib/konq/konq_operations.h 2012-06-27 09:31:29.109516591 +0200
+@@ -23,6 +23,8 @@
+ #ifndef __konq_operations_h__
+ #define __konq_operations_h__
+
++#include "ClientCatchcopy.h"
++
+ #include <kurl.h>
+ #include <libkonq_export.h>
+
+@@ -221,6 +223,7 @@
+
+ private:
+ QWidget* parentWidget() const;
++ static ClientCatchcopy clientCatchcopy;
+ void _del( Operation method, const KUrl::List & selectedUrls, ConfirmationType confirmation );
+ void _restoreTrashedItems( const KUrl::List& urls );
+ void _statUrl( const KUrl & url, const QObject *receiver, const char *member );
diff --git a/patch/opensource/options-with-pass.patch b/patch/opensource/options-with-pass.patch
new file mode 100644
index 0000000..c53cefd
--- /dev/null
+++ b/patch/opensource/options-with-pass.patch
@@ -0,0 +1,336 @@
+diff -U 3 -H -d -r -N -- sources/EventDispatcher.cpp sources-with-pass/EventDispatcher.cpp
+--- sources/EventDispatcher.cpp 2012-02-20 11:16:29.402151959 +0100
++++ sources-with-pass/EventDispatcher.cpp 2012-02-21 19:16:06.540690161 +0100
+@@ -52,6 +52,8 @@
+ KeysList.append(qMakePair(QString("Last_version_used"),QVariant("na")));
+ KeysList.append(qMakePair(QString("ActionOnManualOpen"),QVariant(1)));
+ KeysList.append(qMakePair(QString("GroupWindowWhen"),QVariant(0)));
++ KeysList.append(qMakePair(QString("checkBoxPass"),QVariant(true)));
++ KeysList.append(qMakePair(QString("Password"),QVariant("admin")));
+ options->addOptionGroup("Ultracopier",KeysList);
+ if(options->getOptionValue("Ultracopier","Last_version_used")!=QVariant("na") && options->getOptionValue("Ultracopier","Last_version_used")!=QVariant(ULTRACOPIER_VERSION))
+ {
+diff -U 3 -H -d -r -N -- sources/OptionDialog.cpp sources-with-pass/OptionDialog.cpp
+--- sources/OptionDialog.cpp 2012-02-21 19:22:24.990694347 +0100
++++ sources-with-pass/OptionDialog.cpp 2012-02-21 19:24:59.290696056 +0100
+@@ -222,6 +222,8 @@
+ newOptionValue("Themes", "Ultracopier_current_theme", options->getOptionValue("Themes","Ultracopier_current_theme"));
+ newOptionValue("Ultracopier", "ActionOnManualOpen", options->getOptionValue("Ultracopier","ActionOnManualOpen"));
+ newOptionValue("Ultracopier", "GroupWindowWhen", options->getOptionValue("Ultracopier","GroupWindowWhen"));
++ newOptionValue("Ultracopier", "checkBoxPass", options->getOptionValue("Ultracopier","checkBoxPass"));
++ newOptionValue("Ultracopier", "Password", options->getOptionValue("Ultracopier","Password"));
+ newOptionValue("Language", "Language", options->getOptionValue("Language","Language"));
+ newOptionValue("Language", "Language_autodetect", options->getOptionValue("Language","Language_autodetect"));
+ newOptionValue("SessionLoader", "LoadAtSessionStarting", options->getOptionValue("SessionLoader","LoadAtSessionStarting"));
+@@ -361,6 +363,14 @@
+ {
+ ui->GroupWindowWhen->setCurrentIndex(value.toInt());
+ }
++ if(name=="checkBoxPass")
++ {
++ ui->checkBoxPass->setChecked(value.toBool());
++ }
++ if(name=="Password")
++ {
++ ui->Password->setText(value.toString());
++ }
+ }
+ }
+
+@@ -706,3 +716,21 @@
+ options->setOptionValue("Ultracopier","ActionOnManualOpen",index);
+ }
+ }
++
++void OptionDialog::on_checkBoxPass_toggled(bool checked)
++{
++ if(index!=-1 && plugins->allPluginHaveBeenLoaded())
++ {
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
++ options->setOptionValue("Ultracopier","checkBoxPass",checked);
++ }
++}
++
++void OptionDialog::on_Password_editingFinished()
++{
++ if(index!=-1 && plugins->allPluginHaveBeenLoaded())
++ {
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
++ options->setOptionValue("Ultracopier","Password",ui->Password->text());
++ }
++}
+diff -U 3 -H -d -r -N -- sources/OptionDialog.h sources-with-pass/OptionDialog.h
+--- sources/OptionDialog.h 2012-02-21 19:22:33.220694431 +0100
++++ sources-with-pass/OptionDialog.h 2012-02-21 19:25:05.490696125 +0100
+@@ -57,7 +57,8 @@
+ void on_checkBoxLog_folder_clicked();
+ void on_checkBoxLog_sync_clicked();
+ void on_ActionOnManualOpen_currentIndexChanged(int index);
+-
++ void on_checkBoxPass_toggled(bool checked);
++ void on_Password_editingFinished();
+ private:
+ Ui::OptionDialog *ui;
+ struct pluginStore
+diff -U 3 -H -d -r -N -- sources/OptionDialog.ui sources-with-pass/OptionDialog.ui
+--- sources/OptionDialog.ui 2012-02-10 19:52:43.711122987 +0100
++++ sources-with-pass/OptionDialog.ui 2012-02-21 19:16:55.130690698 +0100
+@@ -6,7 +6,7 @@
+ <rect>
+ <x>0</x>
+ <y>0</y>
+- <width>638</width>
++ <width>717</width>
+ <height>455</height>
+ </rect>
+ </property>
+@@ -80,6 +80,9 @@
+ <layout class="QVBoxLayout" name="verticalLayout_10">
+ <item>
+ <layout class="QFormLayout" name="formLayout_2">
++ <property name="fieldGrowthPolicy">
++ <enum>QFormLayout::ExpandingFieldsGrow</enum>
++ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelLanguage">
+ <property name="text">
+@@ -158,6 +161,13 @@
+ </item>
+ </widget>
+ </item>
++ <item row="5" column="0">
++ <widget class="QLabel" name="label_9">
++ <property name="text">
++ <string>Group window when:</string>
++ </property>
++ </widget>
++ </item>
+ <item row="5" column="1">
+ <widget class="QComboBox" name="GroupWindowWhen">
+ <item>
+@@ -192,10 +202,20 @@
+ </item>
+ </widget>
+ </item>
+- <item row="5" column="0">
+- <widget class="QLabel" name="label_9">
++ <item row="6" column="0">
++ <widget class="QCheckBox" name="checkBoxPass">
+ <property name="text">
+- <string>Group window when:</string>
++ <string>Protect options with a pass:</string>
++ </property>
++ </widget>
++ </item>
++ <item row="6" column="1">
++ <widget class="QLineEdit" name="Password">
++ <property name="enabled">
++ <bool>false</bool>
++ </property>
++ <property name="echoMode">
++ <enum>QLineEdit::Password</enum>
+ </property>
+ </widget>
+ </item>
+@@ -770,12 +790,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>313</x>
+- <y>13</y>
++ <x>301</x>
++ <y>5</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>533</x>
+- <y>44</y>
++ <x>237</x>
++ <y>9</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -786,12 +806,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>583</x>
+- <y>20</y>
++ <x>301</x>
++ <y>5</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>584</x>
+- <y>40</y>
++ <x>300</x>
++ <y>9</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -802,12 +822,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>345</x>
+- <y>21</y>
++ <x>301</x>
++ <y>5</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>582</x>
+- <y>105</y>
++ <x>301</x>
++ <y>14</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -818,12 +838,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>348</x>
+- <y>25</y>
++ <x>301</x>
++ <y>5</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>557</x>
+- <y>156</y>
++ <x>301</x>
++ <y>19</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -834,12 +854,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>537</x>
+- <y>105</y>
++ <x>301</x>
++ <y>14</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>533</x>
+- <y>131</y>
++ <x>301</x>
++ <y>16</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -850,12 +870,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>501</x>
+- <y>156</y>
++ <x>301</x>
++ <y>19</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>501</x>
+- <y>182</y>
++ <x>301</x>
++ <y>22</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -866,12 +886,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>269</x>
+- <y>15</y>
++ <x>301</x>
++ <y>5</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>456</x>
+- <y>207</y>
++ <x>301</x>
++ <y>25</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -882,12 +902,28 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>334</x>
+- <y>12</y>
++ <x>301</x>
++ <y>5</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>304</x>
+- <y>69</y>
++ <x>301</x>
++ <y>11</y>
++ </hint>
++ </hints>
++ </connection>
++ <connection>
++ <sender>checkBoxPass</sender>
++ <signal>toggled(bool)</signal>
++ <receiver>Password</receiver>
++ <slot>setEnabled(bool)</slot>
++ <hints>
++ <hint type="sourcelabel">
++ <x>412</x>
++ <y>169</y>
++ </hint>
++ <hint type="destinationlabel">
++ <x>482</x>
++ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+diff -U 3 -H -d -r -N -- sources/SystrayIcon.cpp sources-with-pass/SystrayIcon.cpp
+--- sources/SystrayIcon.cpp 2012-02-05 14:25:43.462930072 +0100
++++ sources-with-pass/SystrayIcon.cpp 2012-02-21 19:35:36.630703097 +0100
+@@ -5,6 +5,7 @@
+ \date 2010 */
+
+ #include <QMessageBox>
++#include <QInputDialog>
+
+ #include "SystrayIcon.h"
+
+@@ -33,7 +34,7 @@
+ //connect the action
+ connect(actionMenuQuit, SIGNAL(triggered()), this, SIGNAL(quit()));
+ connect(actionMenuAbout, SIGNAL(triggered()), this, SIGNAL(showHelp()));
+- connect(actionOptions, SIGNAL(triggered()), this, SIGNAL(showOptions()));
++ connect(actionOptions, SIGNAL(triggered()), this, SLOT(askPassIfNeeded()));
+ connect(sysTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(CatchAction(QSystemTrayIcon::ActivationReason)));
+ connect(plugins, SIGNAL(pluginListingIsfinish()), this, SLOT(reloadEngineList()));
+ //display the icon
+@@ -375,3 +376,17 @@
+ }
+ }
+ }
++
++void SystrayIcon::askPassIfNeeded()
++{
++ if(!options->getOptionValue("Ultracopier","checkBoxPass").toBool())
++ {
++ emit showOptions();
++ return;
++ }
++ QString pass=QInputDialog::getText(NULL,tr("Options password"),tr("Give the option for the password"),QLineEdit::Password);
++ if(pass==options->getOptionValue("Ultracopier","Password").toString())
++ emit showOptions();
++ else
++ QMessageBox::warning(NULL,tr("Error"),tr("Wrong password!"));
++}
+diff -U 3 -H -d -r -N -- sources/SystrayIcon.h sources-with-pass/SystrayIcon.h
+--- sources/SystrayIcon.h 2011-12-12 08:53:27.000000000 +0100
++++ sources-with-pass/SystrayIcon.h 2012-02-21 19:27:11.780697518 +0100
+@@ -78,6 +78,8 @@
+ /// \brief to retranslate the ui
+ void retranslateTheUI();
+ void reloadEngineList();
++ /// \brief ask the pass if needed
++ void askPassIfNeeded();
+ signals:
+ /// \brief Quit ultracopier
+ void quit();