void Application::addWorker(Controller *controller, Worker *worker) { addToBackend(worker); connect(controller, SIGNAL(abort()), worker, SLOT(abortProcess())); connect(worker, SIGNAL(processAborted()), controller, SLOT(processAborted())); connect(worker, SIGNAL(processOver(QString)), controller, SLOT(processOver(QString))); connect(worker, SIGNAL(progress(int)), controller, SLOT(activityProgressReceived(int))); connect(worker, SIGNAL(errorDuringProcess(QString)), controller, SLOT(errorDuringProcess(QString))); }
void BatchProcessImagesDialog::slotProcessStop() { // Try to kill the current process ! if (m_ProcessusProc) m_ProcessusProc->close(); // If kill operation failed, Stop the process at the next image ! if (m_convertStatus == UNDER_PROCESS) m_convertStatus = STOP_PROCESS; m_ui->m_progress->progressCompleted(); processAborted(true); }
void BatchProcessImagesDialog::slotFinished() { if (m_convertStatus == PROCESS_DONE) { // processAborted() has already been called. No need to show the warning. return; } BatchProcessImagesItem *item = static_cast<BatchProcessImagesItem*>(**m_listFile2Process_iterator); m_listFiles->scrollToItem(m_listFiles->currentItem()); if (m_ProcessusProc->exitStatus() == QProcess::CrashExit) { int code = KMessageBox::warningContinueCancel(this, i18n("The 'convert' program from 'ImageMagick' package has been stopped abnormally"), i18n("Error running 'convert'")); if (code == KMessageBox::Cancel) { processAborted(true); } else { item->changeResult(i18nc("batch process result", "Failed.")); item->changeError(i18n("'convert' program from 'ImageMagick' package " "has been stopped abnormally.")); ++*m_listFile2Process_iterator; ++m_progressStatus; m_ui->m_progress->setValue((int)((float) m_progressStatus * (float) 100 / (float) m_nbItem)); if (**m_listFile2Process_iterator) startProcess(); else endProcess(); } return; } int ValRet = m_ProcessusProc->exitCode(); kWarning() << "Convert exit (" << ValRet << ")"; switch (ValRet) { case 0: { // Process finished successfully ! item->changeResult(i18n("OK")); item->changeError(i18n("no processing error")); processDone(); KUrl src; src.setPath(item->pathSrc()); KUrl dest = m_ui->m_destinationUrl->url(); dest.addPath(item->nameDest()); QString errmsg; KUrl::List urlList; urlList.append(src); urlList.append(dest); iface()->refreshImages(urlList); if (!item->overWrote()) { // Do not add an entry if there was an image at the location already. bool ok = iface()->addImage(dest, errmsg); if (!ok) { int code = KMessageBox::warningContinueCancel(this, i18n( "<qt>Error adding image to application; error message was: " "<b>%1</b></qt>", errmsg), i18n("Error Adding Image to Application")); if (code == KMessageBox::Cancel) { slotProcessStop(); break; } else { item->changeResult(i18nc("batch process result", "Failed.")); } } } if (src != dest) { // Clone data in KIPI host application. KPImageInfo info(src); info.cloneData(dest); // Move XMP sidecar file. KPMetadata::moveSidecar(src, dest); } if (m_ui->m_removeOriginal->isChecked() && src != dest) { KUrl deleteImage(item->pathSrc()); if (KIO::NetAccess::del(deleteImage, kapp->activeWindow()) == false) { item->changeResult(i18nc("batch process result", "Warning:")); item->changeError(i18n("cannot remove original image file.")); } else { iface()->delImage(item->pathSrc()); } } break; } case 15: { // process aborted ! processAborted(true); break; } default : { // Processing error ! item->changeResult(i18nc("batch process result", "Failed.")); item->changeError(i18n("cannot process original image file.")); break; } } ++*m_listFile2Process_iterator; ++m_progressStatus; m_ui->m_progress->setValue((int)((float)m_progressStatus *(float)100 / (float)m_nbItem)); if (**m_listFile2Process_iterator) startProcess(); else endProcess(); }
bool BatchProcessImagesDialog::startProcess() { if (m_convertStatus == STOP_PROCESS) { endProcess(); return true; } QString targetAlbum = m_ui->m_destinationUrl->url().path(); //TODO check if it is valid also for remote URL's // this is a workarond for bug 117397 QFileInfo dirInfo(targetAlbum + '/'); if (!dirInfo.isDir() || !dirInfo.isWritable()) { KMessageBox::error(this, i18n("You must specify a writable path for your output file.")); endProcess(); return true; } BatchProcessImagesItem* item = static_cast<BatchProcessImagesItem*>(**m_listFile2Process_iterator); m_listFiles->setCurrentItem(item); // Lock current item into KIPI host application KPFileReadLocker(iface(), item->pathSrc()); if (prepareStartProcess(item, targetAlbum) == false) // If there is a problem during the { // preparation -> pass to the next item! ++*m_listFile2Process_iterator; ++m_progressStatus; m_ui->m_progress->setValue((int)((float)m_progressStatus *(float)100 / (float)m_nbItem)); item = static_cast<BatchProcessImagesItem*>(**m_listFile2Process_iterator); m_listFiles->setCurrentItem(item); if (**m_listFile2Process_iterator) { startProcess(); return true; } else { endProcess(); return true; } } KUrl desturl(targetAlbum + '/' + item->nameDest()); if (KIO::NetAccess::exists(desturl, KIO::NetAccess::DestinationSide, kapp->activeWindow()) == true) { switch (overwriteMode()) { case OVERWRITE_ASK: { int ValRet = KMessageBox::warningYesNoCancel(this, i18n("The destination file \"%1\" already exists;\n" "do you want overwrite it?", item->nameDest()), i18n("Overwrite Destination Image File"), KStandardGuiItem::cont()); if (ValRet == KMessageBox::No) { item->changeResult(i18n("Skipped.")); item->changeError(i18n("destination image file already exists (skipped by user).")); ++*m_listFile2Process_iterator; ++m_progressStatus; m_ui->m_progress->setValue((int)((float)m_progressStatus *(float)100 / (float)m_nbItem)); if (**m_listFile2Process_iterator) { startProcess(); return true; } else { endProcess(); return true; } } else if (ValRet == KMessageBox::Cancel) { processAborted(false); return false; } else { item->setDidOverWrite(true); } break; } case OVERWRITE_RENAME: { QFileInfo Target(targetAlbum + '/' + item->nameDest()); QString newFileName = RenameTargetImageFile(&Target); if (newFileName.isNull()) { item->changeResult(i18nc("batch process result", "Failed.")); item->changeError(i18n("destination image file already exists and cannot be renamed.")); ++*m_listFile2Process_iterator; ++m_progressStatus; m_ui->m_progress->setValue((int)((float)m_progressStatus *(float)100 / (float)m_nbItem)); if (**m_listFile2Process_iterator) { startProcess(); return true; } else { endProcess(); return true; } } else { QFileInfo newTarget(newFileName); item->changeNameDest(newTarget.fileName()); } break; } case OVERWRITE_SKIP: { item->changeResult(i18n("Skipped.")); item->changeError(i18n("destination image file already exists (skipped automatically).")); ++*m_listFile2Process_iterator; ++m_progressStatus; m_ui->m_progress->setValue((int)((float)m_progressStatus *(float)100 / (float)m_nbItem)); if (**m_listFile2Process_iterator) { startProcess(); return true; } else { endProcess(); return true; } break; } case OVERWRITE_OVER: // In this case do nothing : 'convert' default mode... item->setDidOverWrite(true); break; default: { endProcess(); return true; } } } m_ProcessusProc = new KProcess(this); m_ProcessusProc->setOutputChannelMode(KProcess::MergedChannels); initProcess(m_ProcessusProc, item, targetAlbum); m_commandLine = m_ProcessusProc->program().join(" "); item->changeOutputMess(m_commandLine + "\n\n"); connect(m_ProcessusProc, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(slotFinished())); connect(m_ProcessusProc, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); m_ProcessusProc->start(); if (!m_ProcessusProc->waitForStarted()) { KMessageBox::error(this, i18n("Cannot start 'convert' program from 'ImageMagick' package;\n" "please check your installation.")); delete m_ProcessusProc; m_ProcessusProc = 0; return false; } return true; }