40
40
#include "documentloadedimpl.h"
45
45
struct SaveJobPrivate {
46
DocumentLoadedImpl* mImpl;
50
QScopedPointer<KTemporaryFile> mTemporaryFile;
51
QScopedPointer<KSaveFile> mSaveFile;
52
QScopedPointer<QFutureWatcher<void> > mInternalSaveWatcher;
46
DocumentLoadedImpl* mImpl;
50
QScopedPointer<KTemporaryFile> mTemporaryFile;
51
QScopedPointer<KSaveFile> mSaveFile;
52
QScopedPointer<QFutureWatcher<void> > mInternalSaveWatcher;
58
57
SaveJob::SaveJob(DocumentLoadedImpl* impl, const KUrl& url, const QByteArray& format)
59
: d(new SaveJobPrivate) {
61
d->mOldUrl = impl->document()->url();
64
d->mKillReceived = false;
65
setCapabilities(Killable);
74
void SaveJob::saveInternal() {
75
if (!d->mImpl->saveInternal(d->mSaveFile.data(), d->mFormat)) {
76
d->mSaveFile->abort();
77
setError(UserDefinedError + 2);
78
setErrorText(d->mImpl->document()->errorString());
83
void SaveJob::doStart() {
84
if (d->mKillReceived) {
89
if (d->mNewUrl.isLocalFile()) {
90
fileName = d->mNewUrl.toLocalFile();
92
d->mTemporaryFile.reset(new KTemporaryFile);
93
d->mTemporaryFile->setAutoRemove(true);
94
d->mTemporaryFile->open();
95
fileName = d->mTemporaryFile->fileName();
98
d->mSaveFile.reset(new KSaveFile(fileName));
100
if (!d->mSaveFile->open()) {
101
KUrl dirUrl = d->mNewUrl;
102
dirUrl.setFileName(QString());
103
setError(UserDefinedError + 1);
104
setErrorText(i18nc("@info", "Could not open file for writing, check that you have the necessary rights in <filename>%1</filename>.", dirUrl.pathOrUrl()));
109
QFuture<void> future = QtConcurrent::run(this, &SaveJob::saveInternal);
110
d->mInternalSaveWatcher.reset(new QFutureWatcher<void>(this));
111
d->mInternalSaveWatcher->setFuture(future);
112
connect(d->mInternalSaveWatcher.data(), SIGNAL(finished()), SLOT(finishSave()));
116
void SaveJob::finishSave() {
117
d->mInternalSaveWatcher.reset(0);
118
if (d->mKillReceived) {
127
if (!d->mSaveFile->finalize()) {
128
setErrorText(i18nc("@info", "Could not overwrite file, check that you have the necessary rights to write in <filename>%1</filename>.", d->mNewUrl.pathOrUrl()));
129
setError(UserDefinedError + 3);
133
if (d->mNewUrl.isLocalFile()) {
136
KIO::Job* job = KIO::copy(KUrl::fromPath(d->mTemporaryFile->fileName()), d->mNewUrl);
137
job->ui()->setWindow(KApplication::kApplication()->activeWindow());
143
void SaveJob::slotResult(KJob* job) {
144
DocumentJob::slotResult(job);
151
KUrl SaveJob::oldUrl() const {
156
KUrl SaveJob::newUrl() const {
161
bool SaveJob::doKill() {
162
d->mKillReceived = true;
163
if (d->mInternalSaveWatcher) {
164
d->mInternalSaveWatcher->waitForFinished();
58
: d(new SaveJobPrivate)
61
d->mOldUrl = impl->document()->url();
64
d->mKillReceived = false;
65
setCapabilities(Killable);
73
void SaveJob::saveInternal()
75
if (!d->mImpl->saveInternal(d->mSaveFile.data(), d->mFormat)) {
76
d->mSaveFile->abort();
77
setError(UserDefinedError + 2);
78
setErrorText(d->mImpl->document()->errorString());
82
void SaveJob::doStart()
84
if (d->mKillReceived) {
89
if (d->mNewUrl.isLocalFile()) {
90
fileName = d->mNewUrl.toLocalFile();
92
d->mTemporaryFile.reset(new KTemporaryFile);
93
d->mTemporaryFile->setAutoRemove(true);
94
d->mTemporaryFile->open();
95
fileName = d->mTemporaryFile->fileName();
98
d->mSaveFile.reset(new KSaveFile(fileName));
100
if (!d->mSaveFile->open()) {
101
KUrl dirUrl = d->mNewUrl;
102
dirUrl.setFileName(QString());
103
setError(UserDefinedError + 1);
104
setErrorText(i18nc("@info", "Could not open file for writing, check that you have the necessary rights in <filename>%1</filename>.", dirUrl.pathOrUrl()));
109
QFuture<void> future = QtConcurrent::run(this, &SaveJob::saveInternal);
110
d->mInternalSaveWatcher.reset(new QFutureWatcher<void>(this));
111
d->mInternalSaveWatcher->setFuture(future);
112
connect(d->mInternalSaveWatcher.data(), SIGNAL(finished()), SLOT(finishSave()));
115
void SaveJob::finishSave()
117
d->mInternalSaveWatcher.reset(0);
118
if (d->mKillReceived) {
127
if (!d->mSaveFile->finalize()) {
128
setErrorText(i18nc("@info", "Could not overwrite file, check that you have the necessary rights to write in <filename>%1</filename>.", d->mNewUrl.pathOrUrl()));
129
setError(UserDefinedError + 3);
133
if (d->mNewUrl.isLocalFile()) {
136
KIO::Job* job = KIO::copy(KUrl::fromPath(d->mTemporaryFile->fileName()), d->mNewUrl);
137
job->ui()->setWindow(KApplication::kApplication()->activeWindow());
142
void SaveJob::slotResult(KJob* job)
144
DocumentJob::slotResult(job);
150
KUrl SaveJob::oldUrl() const
155
KUrl SaveJob::newUrl() const
160
bool SaveJob::doKill()
162
d->mKillReceived = true;
163
if (d->mInternalSaveWatcher) {
164
d->mInternalSaveWatcher->waitForFinished();