okteta
abstractfilesystemsyncwithremotejob.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "abstractfilesystemsyncwithremotejob.h"
00024
00025
00026 #include "abstractmodelfilesystemsynchronizer.h"
00027 #include <kabstractdocument.h>
00028
00029 #include <KIO/NetAccess>
00030 #include <KTemporaryFile>
00031 #include <KLocale>
00032 #include <KDirWatch>
00033
00034 #include <QtCore/QTimer>
00035
00036
00037 class AbstractFileSystemSyncWithRemoteJob::Private
00038 {
00039 public:
00040 Private( AbstractModelFileSystemSynchronizer* synchronizer,
00041 const KUrl& url, AbstractModelSynchronizer::ConnectOption option );
00042
00043 public:
00044 void setTemporaryFile( KTemporaryFile *temporaryFile );
00045 void setWorkFilePath( const QString &workFilePath );
00046
00047 public:
00048 KUrl url() const;
00049 AbstractModelSynchronizer::ConnectOption option() const;
00050 KTemporaryFile *temporaryFile() const;
00051 QString workFilePath() const;
00052 QWidget *widget() const;
00053 AbstractModelFileSystemSynchronizer* synchronizer() const;
00054
00055 protected:
00056 AbstractModelFileSystemSynchronizer* mSynchronizer;
00057 const KUrl mUrl;
00058 const AbstractModelSynchronizer::ConnectOption mOption;
00059 KTemporaryFile *mTemporaryFile;
00060 QString mWorkFilePath;
00061 };
00062
00063 AbstractFileSystemSyncWithRemoteJob::Private::Private( AbstractModelFileSystemSynchronizer* synchronizer,
00064 const KUrl &url, AbstractModelSynchronizer::ConnectOption option )
00065 : mSynchronizer( synchronizer ), mUrl( url ), mOption( option ), mTemporaryFile( 0 )
00066 {}
00067
00068 inline KUrl AbstractFileSystemSyncWithRemoteJob::Private::url() const { return mUrl; }
00069 inline KTemporaryFile *AbstractFileSystemSyncWithRemoteJob::Private::temporaryFile() const { return mTemporaryFile; }
00070 inline QString AbstractFileSystemSyncWithRemoteJob::Private::workFilePath() const { return mWorkFilePath; }
00071
00072 inline QWidget *AbstractFileSystemSyncWithRemoteJob::Private::widget() const { return 0; }
00073 inline AbstractModelFileSystemSynchronizer* AbstractFileSystemSyncWithRemoteJob::Private::synchronizer() const
00074 {
00075 return mSynchronizer;
00076 }
00077 inline AbstractModelSynchronizer::ConnectOption AbstractFileSystemSyncWithRemoteJob::Private::option() const
00078 {
00079 return mOption;
00080 }
00081
00082 inline void AbstractFileSystemSyncWithRemoteJob::Private::setTemporaryFile( KTemporaryFile *temporaryFile )
00083 {
00084 mTemporaryFile = temporaryFile;
00085 }
00086 inline void AbstractFileSystemSyncWithRemoteJob::Private::setWorkFilePath( const QString &workFilePath )
00087 {
00088 mWorkFilePath = workFilePath;
00089 }
00090
00091
00092
00093 AbstractFileSystemSyncWithRemoteJob::AbstractFileSystemSyncWithRemoteJob( AbstractModelFileSystemSynchronizer* synchronizer,
00094 const KUrl &url, AbstractModelSynchronizer::ConnectOption option )
00095 : d( new Private(synchronizer,url,option) )
00096 {}
00097
00098 AbstractModelFileSystemSynchronizer* AbstractFileSystemSyncWithRemoteJob::synchronizer() const
00099 {
00100 return d->synchronizer();
00101 }
00102 QString AbstractFileSystemSyncWithRemoteJob::workFilePath() const { return d->workFilePath(); }
00103 QWidget *AbstractFileSystemSyncWithRemoteJob::widget() const { return d->widget(); }
00104
00105 void AbstractFileSystemSyncWithRemoteJob::start()
00106 {
00107 QTimer::singleShot( 0, this, SLOT(syncWithRemote()) );
00108 }
00109
00110 void AbstractFileSystemSyncWithRemoteJob::syncWithRemote()
00111 {
00112
00113
00114
00115
00116 QString workFilePath;
00117
00118 const KUrl newUrl = d->url();
00119 bool isWorkFileOk;
00120 if( d->option() == AbstractModelSynchronizer::ReplaceRemote )
00121 {
00122 if( newUrl.isLocalFile() )
00123 workFilePath = newUrl.path();
00124 else
00125 {
00126 KTemporaryFile *temporaryFile = new KTemporaryFile;
00127 temporaryFile->open();
00128 workFilePath = temporaryFile->fileName();
00129 d->setTemporaryFile( temporaryFile );
00130 }
00131 isWorkFileOk = true;
00132 }
00133 else
00134 isWorkFileOk = KIO::NetAccess::download( newUrl.url(), workFilePath, d->widget() );
00135
00136 if( isWorkFileOk )
00137 {
00138 d->setWorkFilePath( workFilePath );
00139 startSyncWithRemote();
00140 }
00141 else
00142 {
00143 setError( KilledJobError );
00144 setErrorText( KIO::NetAccess::lastErrorString() );
00145
00146 emitResult();
00147 }
00148 }
00149
00150
00151 void AbstractFileSystemSyncWithRemoteJob::completeSync( bool success )
00152 {
00153 AbstractModelFileSystemSynchronizer* synchronizer = d->synchronizer();
00154 if( success )
00155 {
00156 KDirWatch *dirWatch = KDirWatch::self();
00157 const KUrl oldUrl = synchronizer->url();
00158
00159 if( oldUrl.isLocalFile() )
00160 {
00161 dirWatch->disconnect( synchronizer );
00162 dirWatch->removeFile( oldUrl.path() );
00163 }
00164 const KUrl newUrl = d->url();
00165 if( !newUrl.isLocalFile() )
00166 {
00167 const bool uploaded = KIO::NetAccess::upload( workFilePath(), newUrl, d->widget() );
00168 if( !uploaded )
00169 {
00170 setError( KilledJobError );
00171 setErrorText( KIO::NetAccess::lastErrorString() );
00172 }
00173 }
00174 else
00175 {
00176 connect( dirWatch, SIGNAL(dirty( const QString & )),
00177 synchronizer, SLOT(onFileDirty( const QString & )) );
00178
00179 connect( dirWatch, SIGNAL(created( const QString & )),
00180 synchronizer, SLOT(onFileCreated( const QString & )) );
00181
00182 connect( dirWatch, SIGNAL(deleted( const QString & )),
00183 synchronizer, SLOT(onFileDeleted( const QString & )) );
00184 dirWatch->addFile( workFilePath() );
00185 }
00186 synchronizer->setUrl( newUrl );
00187 }
00188 else
00189 {
00190 setError( KilledJobError );
00191 setErrorText( i18nc("@info","Problem when synching with local filesystem.") );
00192 }
00193
00194 KIO::NetAccess::removeTempFile( d->workFilePath() );
00195 delete d->temporaryFile();
00196
00197 emitResult();
00198 }
00199
00200
00201 AbstractFileSystemSyncWithRemoteJob::~AbstractFileSystemSyncWithRemoteJob()
00202 {
00203 delete d;
00204 }