/* ============================================================ * * This file is a part of kipi-plugins project * http://www.kipi-plugins.org * * Date : 2004-02-25 * Description : a kipi plugin to e-mailing images * * Copyright (C) 2004-2008 by Gilles Caulier * Copyright (C) 2006 by Tom Albers * Copyright (C) 2006 by Michael Hoechstetter * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ // TQt includes. #include #include #include #include #include #include #include #include #include // KDE includes #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // LibKExiv2 includes. #include // LibKDcraw includes. #include #include #if KDCRAW_VERSION < 0x000106 #include #endif // Local includes. #include "sendimagesdialog.h" #include "listimageserrordialog.h" #include "actions.h" #include "pluginsversion.h" #include "sendimages.h" #include "sendimages.moc" namespace KIPISendimagesPlugin { ///Constructor: saves system handoff parameters in member variables SendImages::SendImages(KIPI::Interface* interface, const TQString &tmpFolder, const KIPI::ImageCollection& imagesCollection, TQObject *parent) : TQObject(parent), TQThread() { m_invokedBefore = false; m_interface = interface; m_tmp = tmpFolder; m_collection = imagesCollection; m_parent = parent; m_mozillaTimer = new TQTimer(this); KImageIO::registerFormats(); connect(m_mozillaTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotMozillaTimeout())); } ///Destructor SendImages::~SendImages() { delete m_sendImagesDialog; wait(); } ///Invokes the User Dialog Window void SendImages::showDialog() { m_sendImagesDialog = new KIPISendimagesPlugin::SendImagesDialog(TQT_TQWIDGET(kapp->activeWindow()), m_interface, m_collection); m_sendImagesDialog->show(); connect(m_sendImagesDialog, TQT_SIGNAL(signalAccepted()), m_parent, TQT_SLOT(slotAcceptedConfigDlg())); } /** Execute the no threadable operations before the real thread. Gets input from the user dialog and store it into member variables */ void SendImages::prepare(void) { m_filesSendList.clear(); m_imagesResizedWithError.clear(); m_imagesPackage.clear(); m_images = m_sendImagesDialog->m_images2send; m_changeProp = m_sendImagesDialog->m_changeImagesProp->isChecked(); m_imageFormat = m_sendImagesDialog->m_imagesFormat->currentText(); m_sizeFactor = getSize( m_sendImagesDialog->m_imagesResize->currentItem() ); m_imageCompression = m_sendImagesDialog->m_imageCompression->value(); // Base64-encoding needs a lot of space. m_attachmentlimit = m_sendImagesDialog->m_attachmentlimit->value()*770000-2000; } /** List of threaded operations. Prepares the image list. This includes resizing, copying, maintaining an image's exif, and dropping evil characters out of filenames ;-) */ void SendImages::run() { KIPISendimagesPlugin::EventData *d; d = new KIPISendimagesPlugin::EventData; d->action = KIPISendimagesPlugin::Initialize; d->starting = true; d->success = false; d->total = m_images.count(); TQApplication::postEvent(m_parent, new TQCustomEvent(TQEvent::User, d)); for( KURL::List::Iterator it = m_images.begin() ; it != m_images.end() ; ++it ) { TQString imageName = (*it).path(); TQString ItemName = imageName.section( '/', -1 ); d = new KIPISendimagesPlugin::EventData; d->action = KIPISendimagesPlugin::ResizeImages; d->fileName = (*it).fileName(); d->albumName = (*it).directory().section('/', -1); d->starting = true; d->success = false; TQApplication::postEvent(m_parent, new TQCustomEvent(TQEvent::User, d)); // Prepare resized target images to send. TQString imageFileName=""; KIPI::ImageInfo info = m_interface->info( *it ); ///Generate filename of destination image TQString commentItem = info.description(); if ((m_sendImagesDialog->m_comment2ImageName->isChecked() == true ) && !commentItem.isEmpty() ) { tqDebug("commentItem: %s",commentItem.ascii()); } else { commentItem = ItemName.left(ItemName.findRev('.')); tqDebug("commentItem is empty"); } //TQString TempFileName = (*it).directory().section('/', -1); TQString TempFileName=(*it).path().section('/', -2,-2)+"/"+commentItem+ +"."+(*it).path().section('.', -1,-1); tqDebug("TempFileName: %s",TempFileName.ascii()); // Thunderbird does not like (). Replace them, BUG:131343 TempFileName.replace(TQChar('('), "_").replace(TQChar(')'), "_"); // and these characters are better eliminated, too ;-) TempFileName.replace(TQChar(','), "_").replace(TQChar(' '), "_"); TempFileName.replace(TQChar(';'), "_").replace(TQChar('%'), "_"); TempFileName.replace(TQChar('/'), "-").replace(TQChar('?'), ""); TempFileName.replace(TQChar('"'), ""); //If TempFileName already exists, add a number oder increase number if (entry_already_exists(m_filesSendList,m_tmp + TempFileName)) { tqDebug ("I entered"); TQString secondpart=(m_tmp+TempFileName).section(".",-1,-1); TQString firstpart= (m_tmp+TempFileName).left((m_tmp+TempFileName).length()-secondpart.length()-1); tqDebug("Firstpart: %s \n Secondpart: %s",firstpart.ascii(), secondpart.ascii()); //Add _integer value in the end and prove again int int_index=2; TQString index=TQString::number(int_index,10); while (entry_already_exists(m_filesSendList,firstpart + "_"+index+"."+secondpart)) { int_index++; index=TQString::number(int_index,10); tqDebug("Index: %s",index.ascii()); } TQString temp=firstpart + "_"+index+"."+secondpart; TempFileName=temp.right(temp.length()-m_tmp.length()); // .section("-",-2,-1); // m_tmp=(firstpart + "_"+index+"."+secondpart).section("-",-2); } if ( m_changeProp == true ) { // Prepare resizing images. //TQString imageNameFormat = TempFileName.replace(TQChar('.'), "_") + // extension(m_imageFormat); tqDebug( "Resizing %s-> '%s %s ' (%s ; %d )",imageName.ascii(), m_tmp.ascii(),TempFileName.ascii(),m_imageFormat.ascii(),m_sizeFactor); // Return value for resizeImageProcess-function, in order to avoid reopening // the image for exiv-writing. TQSize newsize; if ( resizeImageProcess( imageName, m_tmp, m_imageFormat, TempFileName, m_sizeFactor, m_imageCompression, newsize) == false ) { // Resized images failed... d = new KIPISendimagesPlugin::EventData; d->action = KIPISendimagesPlugin::ResizeImages; d->fileName = (*it).fileName(); d->albumName = (*it).directory().section('/', -1); d->starting = false; d->success = false; TQApplication::postEvent(m_parent, new TQCustomEvent(TQEvent::User, d)); m_imagesResizedWithError.append(*it); } else // Resized images OK... { // Only try to write Exif if both src and destination are JPEG files. if (TQString(TQImageIO::imageFormat(imageName)).upper() == "JPEG" && m_imageFormat.upper() == "JPEG") { TQString targetFile = m_tmp + TempFileName; KExiv2Iface::KExiv2 exiv2Iface; if (exiv2Iface.load(imageName)) { exiv2Iface.setImageProgramId(TQString("Kipi-plugins"), TQString(kipiplugins_version)); exiv2Iface.setImageDimensions(newsize); exiv2Iface.save(targetFile); } } else { tqWarning( "createThumb::No Exif Data Found") ; } d = new KIPISendimagesPlugin::EventData; d->action = KIPISendimagesPlugin::ResizeImages; d->fileName = (*it).fileName(); d->albumName = (*it).directory().section('/', -1); d->starting = false; d->success = true; TQApplication::postEvent(m_parent, new TQCustomEvent(TQEvent::User, d)); m_filesSendList.append(m_tmp + TempFileName); m_imagesPackage.append(*it); m_imagesPackage.append(m_tmp + TempFileName); } } else // No resize images operations... { if ( copyImageProcess( imageName, m_tmp, TempFileName) == true ) { d = new KIPISendimagesPlugin::EventData; d->action = KIPISendimagesPlugin::Progress; d->fileName = (*it).fileName(); d->albumName = (*it).directory().section('/', -1); d->starting = true; d->success = false; TQApplication::postEvent(m_parent, new TQCustomEvent(TQEvent::User, d)); m_filesSendList.append(m_tmp + TempFileName); m_imagesPackage.append(*it); m_imagesPackage.append(m_tmp + TempFileName); } } } d = new KIPISendimagesPlugin::EventData; d->action = KIPISendimagesPlugin::Progress; d->starting = false; d->success = true; TQApplication::postEvent(m_parent, new TQCustomEvent(TQEvent::User, d)); } bool SendImages::entry_already_exists(KURL::List filenamelist,TQString entry) { KURL::List::Iterator it = filenamelist.begin(); while( it != filenamelist.end() ) { if ((*it)==entry) return true; it++; } return false; } /// Creates a text file with the images comments. void SendImages::makeCommentsFile(void) { if ( m_sendImagesDialog->m_addComments->isChecked() == true ) { TQString ImageCommentsText; KURL::List::Iterator it = m_imagesPackage.begin(); bool anyCommentsPresent = false; while( it != m_imagesPackage.end() ) { KIPI::ImageInfo info = m_interface->info( *it ); TQString commentItem = info.description(); ++it; TQString targetFile = (*it).filename(); if ( commentItem.isEmpty() ) commentItem = i18n("no caption"); else anyCommentsPresent = true; ImageCommentsText += i18n("Caption for image \"%1\": %2\n") .arg(targetFile).arg(commentItem); //Tags from the database if (m_interface->hasFeature(KIPI::HostSupportsTags)) { TQMap attribs=info.attributes(); if (attribs["tags"].asStringList().count() > 0) { ImageCommentsText += i18n("Tags: %2\n").arg(attribs["tags"].asStringList().join(",")); anyCommentsPresent = true; } } ImageCommentsText += "\n"; ++it; } if ( anyCommentsPresent ) { TQFile commentsFile( m_tmp + i18n("comments.txt") ); TQTextStream stream( &commentsFile ); stream.setEncoding( TQTextStream::UnicodeUTF8 ); commentsFile.open( IO_WriteOnly ); stream << ImageCommentsText << "\n"; commentsFile.close(); m_filesSendList.append( m_tmp + i18n("comments.txt") ); } } } ///Shows up an error dialog and the problematic images bool SendImages::showErrors() { if ( m_imagesResizedWithError.isEmpty() == false ) { listImagesErrorDialog *ErrorImagesDialog = new listImagesErrorDialog(TQT_TQWIDGET(kapp->activeWindow()), i18n("Error during resize images process."), i18n("Cannot resize the following image files:"), i18n("Do you want them to be added as attachments " "(without resizing)?"), m_imagesResizedWithError); int ValRet = ErrorImagesDialog->exec(); switch (ValRet) { case KDialogBase::Yes : // Added source image files instead resized images... for ( KURL::List::Iterator it = m_imagesResizedWithError.begin(); it != m_imagesResizedWithError.end(); ++it ) { m_filesSendList.append(*it); m_imagesPackage.append(*it); m_imagesPackage.append(*it); } break; case KDialogBase::No : // Do nothing... break; case KDialogBase::Cancel : // Stop process... removeTmpFiles(); return false; break; } } return true; } /** Returns a list of Filenames, whose sum filesize is smaller than the quota The returned images are deleted from the m_filesSendList */ KURL::List SendImages::divideEmails(void) { unsigned long mylistsize=0; KURL::List sendnow; KURL::List filesSendList; for ( KURL::List::Iterator it = m_filesSendList.begin() ; it != m_filesSendList.end() ; ++it ) { tqDebug("m_attachmentlimit: %lu ", m_attachmentlimit); TQString imageName = (*it).path(); tqDebug("Imagename: %s", imageName.ascii()); TQFile file(imageName); tqDebug("filesize: %lu", file.size()); if ((mylistsize + file.size()) <= m_attachmentlimit) { mylistsize+=file.size(); sendnow.append(*it); tqDebug("mylistsize: %lu; attachmentlimit: %lu",mylistsize, m_attachmentlimit); } else { tqDebug("file %s is out of %lu",imageName.ascii(),m_attachmentlimit); filesSendList.append(*it); } } m_filesSendList = filesSendList; return sendnow; } /** Invokes mail agent. Depending on which mail agent to be used, we have different proceedings. Easy for every agent except of mozilla derivates */ bool SendImages::invokeMailAgent(void) { bool agentInvoked = false; KURL::List filelist; kurllistdeepcopy(m_filesSendList_copy,m_filesSendList); tqDebug("invokeMailagent1: Number of elements in m_filesSendList=%d, and in m_filesSendList_copy=%d)",(int)m_filesSendList.size(),(int)m_filesSendList_copy.size()); while (!((filelist=divideEmails()).empty())) { tqDebug("invokeMailagent2: Number of elements in m_filesSendList=%d, and in m_filesSendList_copy=%d)",(int) m_filesSendList.size(),(int)m_filesSendList_copy.size()); tqDebug("number of elements in filelist %d",(int)filelist.size()); tqDebug("number of elements in m_filelist %d", (int)m_filesSendList.size()); if ( m_sendImagesDialog->m_mailAgentName->currentText() == "Default" ) { TDEApplication::kApplication()->invokeMailer( TQString(), // Destination address. TQString(), // Carbon Copy address. TQString(), // Blind Carbon Copy address TQString(), // Message Subject. TQString(), // Message Body. TQString(), // Message Body File. filelist.toStringList()); // Images attachments (+ comments). agentInvoked = true; } // KMail mail agent call. if ( m_sendImagesDialog->m_mailAgentName->currentText() == "KMail" ) { m_mailAgentProc = new TDEProcess; *m_mailAgentProc << "kmail"; for ( KURL::List::Iterator it = filelist.begin() ; it != filelist.end() ; ++it ) { *m_mailAgentProc << "--attach"; *m_mailAgentProc << TQFile::encodeName((*it).path()).data(); } if ( m_mailAgentProc->start() == false ) KMessageBox::error(TQT_TQWIDGET(kapp->activeWindow()), i18n("Cannot start '%1' program;\nplease " "check your installation.") .arg(m_sendImagesDialog->m_mailAgentName->currentText())); else agentInvoked = true; } // Claws Mail and Sylpheed mail agent call. if ( m_sendImagesDialog->m_mailAgentName->currentText() == "Claws Mail" || m_sendImagesDialog->m_mailAgentName->currentText() == "Sylpheed" || m_sendImagesDialog->m_mailAgentName->currentText() == "Sylpheed-Claws" ) { m_mailAgentProc = new TDEProcess; if ( m_sendImagesDialog->m_mailAgentName->currentText() == "Claws Mail") *m_mailAgentProc << "claws-mail"; else if ( m_sendImagesDialog->m_mailAgentName->currentText() == "Sylpheed") *m_mailAgentProc << "sylpheed"; else *m_mailAgentProc << "sylpheed-claws"; *m_mailAgentProc << "--compose" << "--attach"; for ( KURL::List::Iterator it = filelist.begin() ; it != filelist.end() ; ++it ) *m_mailAgentProc << TQFile::encodeName((*it).path()).data(); if ( m_mailAgentProc->start() == false ) KMessageBox::error(TQT_TQWIDGET(kapp->activeWindow()), i18n("Cannot start '%1' program;\nplease " "check your installation.") .arg(m_sendImagesDialog->m_mailAgentName->currentText())); else agentInvoked = true; } // Balsa mail agent call. if ( m_sendImagesDialog->m_mailAgentName->currentText() == "Balsa" ) { m_mailAgentProc = new TDEProcess; *m_mailAgentProc << "balsa" << "-m" << "mailto:"; for ( KURL::List::Iterator it = filelist.begin() ; it != filelist.end() ; ++it ) { *m_mailAgentProc << "-a"; *m_mailAgentProc << TQFile::encodeName((*it).path()).data(); } if ( m_mailAgentProc->start() == false ) KMessageBox::error(TQT_TQWIDGET(kapp->activeWindow()), i18n("Cannot start '%1' program;\nplease " "check your installation.") .arg(m_sendImagesDialog->m_mailAgentName->currentText())); else agentInvoked = true; } // Evolution mail agent call. if ( m_sendImagesDialog->m_mailAgentName->currentText() == "Evolution" ) { m_mailAgentProc = new TDEProcess; *m_mailAgentProc << "evolution"; TQString Temp = "mailto:?subject="; for ( KURL::List::Iterator it = filelist.begin() ; it != filelist.end() ; ++it ) { Temp.append("&attach="); Temp.append( TQFile::encodeName((*it).path()) ); } *m_mailAgentProc << Temp; if ( m_mailAgentProc->start() == false ) KMessageBox::error(TQT_TQWIDGET(kapp->activeWindow()), i18n("Cannot start '%1' program;\nplease " "check your installation.") .arg(m_sendImagesDialog->m_mailAgentName->currentText())); else agentInvoked = true; } // Mozilla | Netscape | Thunderbird mail agent call. if ( m_sendImagesDialog->m_mailAgentName->currentText() == "Mozilla" || m_sendImagesDialog->m_mailAgentName->currentText() == "Netscape" || m_sendImagesDialog->m_mailAgentName->currentText() == "Thunderbird" || m_sendImagesDialog->m_mailAgentName->currentText() == "GmailAgent") { m_mailAgentProc = new TDEProcess; m_thunderbirdUrl = m_sendImagesDialog->m_ThunderbirdBinPath->url(); if ( m_sendImagesDialog->m_mailAgentName->currentText() == "Mozilla" ) { *m_mailAgentProc << "mozilla" << "-remote"; } else if ( m_sendImagesDialog->m_mailAgentName->currentText() == "Thunderbird" ) { *m_mailAgentProc << m_thunderbirdUrl << "-remote"; tqDebug("URL: %s", m_thunderbirdUrl.ascii()); } else if ( m_sendImagesDialog->m_mailAgentName->currentText() == "GmailAgent" ) { *m_mailAgentProc << "gmailagent" << "-remote"; } else { *m_mailAgentProc << "netscape" << "-remote"; } TQString Temp = " xfeDoCommand(composeMessage,attachment='"; for ( KURL::List::Iterator it = filelist.begin() ; it != filelist.end() ; ++it ) { Temp.append( "file://" ); TQString toencode=(*it).encodedPathAndQuery(); Temp.append(toencode); Temp.append( "," ); } Temp.remove(Temp.length()-1,1); Temp.append("')"); *m_mailAgentProc << Temp; if (!m_invokedBefore) { connect(m_mailAgentProc, TQT_SIGNAL(processExited(TDEProcess *)), this, TQT_SLOT(slotMozillaExited(TDEProcess*))); connect(m_mailAgentProc, TQT_SIGNAL(receivedStderr(TDEProcess *, char*, int)), this, TQT_SLOT(slotMozillaReadStderr(TDEProcess*, char*, int))); } tqDebug ("%s", Temp.ascii()); if ( m_mailAgentProc->start(TDEProcess::NotifyOnExit , TDEProcess::All) == false ) KMessageBox::error(TQT_TQWIDGET(kapp->activeWindow()), i18n("Cannot start '%1' program;\nplease " "check your installation.") .arg(m_sendImagesDialog->m_mailAgentName->currentText())); else { agentInvoked = true; m_invokedBefore=true; } } } return agentInvoked; } ///Cleans up the temp directory void SendImages::removeTmpFiles(void) { if (DeleteDir(m_tmp) == false) KMessageBox::error(TQT_TQWIDGET(kapp->activeWindow()), i18n("Cannot remove temporary folder %1.").arg(m_tmp)); } ///Checks if directory is empty and invokes its deletion bool SendImages::DeleteDir(TQString dirname) { if ( !dirname.isEmpty() ) { TQDir dir; if (dir.exists ( dirname ) == true) { if (deldir(dirname) == false) return false; if (dir.rmdir( dirname ) == false ) return false; } else return false; } else return false; return true; } ///Deletes a directory and all its contents - Please call it using "DeleteDir" bool SendImages::deldir(TQString dirname) { TQDir *dir = new TQDir(dirname); dir->setFilter ( TQDir::Dirs | TQDir::Files | TQDir::NoSymLinks ); const TQFileInfoList* fileinfolist = dir->entryInfoList(); TQFileInfoListIterator it(*fileinfolist); TQFileInfo* fi; while( (fi = it.current() ) ) { if(fi->fileName() == "." || fi->fileName() == ".." ) { ++it; continue; } if( fi->isDir() ) { if (deldir( fi->absFilePath() ) == false) return false; if (dir->rmdir( fi->absFilePath() ) == false) return false; } else if( fi->isFile() ) if (dir->remove(fi->absFilePath() ) == false) return false; kapp->processEvents(); ++it; } return true; } ///Returns the file-extension of the corresponding fileformat TQString SendImages::extension(const TQString& imageFileFormat) { if (imageFileFormat == "PNG") return ".png"; if (imageFileFormat == "JPEG") return ".jpg"; Q_ASSERT(false); return ""; } /** in sendimagesplugin dialog the user can select a compression of images this function returns the pixel-size of the selected entry */ int SendImages::getSize ( int choice ) { switch (choice) { case 0: return (320); break; case 1: return (640); break; case 2: return (800); break; case 3: return (1024); break; case 4: return (1280); break; case 5: return (1600); break; default: return (800); // Default value... break; } } /** This function should copy the images to tempfolder in order to avoid suspicious filenames It is used, when no resizing should take place This function can be replaced with TQt4 TQFile.copy */ bool SendImages::copyImageProcess(const TQString &oldFilePath, const TQString &DestPath, const TQString &ImageName) { //same file, no need to copy tqDebug("DestPath: %s",(DestPath).ascii()); tqDebug("ImageName: %s",(ImageName).ascii()); if(oldFilePath.compare(DestPath+ImageName) == 0) return true; //load both files TQFile oldFile(oldFilePath); TQFile newFile(DestPath+ImageName); bool openOld = oldFile.open( IO_ReadOnly ); bool openNew = newFile.open( IO_WriteOnly ); //if either file fails to open bail if(!openOld || !openNew) { return false; } //copy contents uint BUFFER_SIZE = 16000; char* buffer = new char[BUFFER_SIZE]; while(!oldFile.atEnd()) { TQ_LONG len = oldFile.readBlock( buffer, BUFFER_SIZE ); newFile.writeBlock( buffer, len ); } //deallocate buffer delete[] buffer; buffer = NULL; return true; } ///Resizes the Images before Sending... bool SendImages::resizeImageProcess(const TQString &SourcePath, const TQString &DestPath, const TQString &ImageFormat, const TQString &ImageName, int SizeFactor, int ImageCompression, TQSize &newsize) { TQImage img; // Check if RAW file. #if KDCRAW_VERSION < 0x000106 TQString rawFilesExt(KDcrawIface::DcrawBinary::instance()->rawFiles()); #else TQString rawFilesExt(KDcrawIface::KDcraw::rawFiles()); #endif TQFileInfo fileInfo(SourcePath); if (rawFilesExt.upper().contains( fileInfo.extension(false).upper() )) KDcrawIface::KDcraw::loadDcrawPreview(img, SourcePath); else img.load(SourcePath); if ( !img.isNull() ) { int w = img.width(); int h = img.height(); if( w > SizeFactor || h > SizeFactor ) { if( w > h ) { h = (int)( (double)( h * SizeFactor ) / w ); if ( h == 0 ) h = 1; w = SizeFactor; Q_ASSERT( h <= SizeFactor ); } else { w = (int)( (double)( w * SizeFactor ) / h ); if ( w == 0 ) w = 1; h = SizeFactor; Q_ASSERT( w <= SizeFactor ); } const TQImage scaleImg(img.smoothScale( w, h )); if ( scaleImg.width() != w || scaleImg.height() != h ) { tqDebug ("Resizing failed. Aborting."); return false; } img = scaleImg; newsize=img.size(); } if ( !img.save(DestPath + ImageName, ImageFormat.latin1(), ImageCompression) ) { tqDebug("Saving failed with specific compression value. Aborting."); return false; } return true; } return false; } /** If mozilla, or thunderbird or any derivate isn't already running, start it now, wait 5 seconds and start SlotMozillaTimeout() */ void SendImages::slotMozillaExited(TDEProcess*) { tqDebug("slotMozillaExited"); ///Here would be the right point to clear the sendlist in order to avoid infinite resendings!! m_filesSendList.clear(); ///Also disconnect SLOT m_mailAgentProc->disconnect(TQT_SIGNAL(processExited(TDEProcess *)), this, TQT_SLOT(slotMozillaExited(TDEProcess*))); tqDebug("Number of elements in m_filesSendList=%d, and in m_filesSendList_copy=%d)",(int)m_filesSendList.size(),(int)m_filesSendList_copy.size()); if ( m_mozillaStdErr.find("No running window found") != -1 ) // No remote Mozilla | Netscape | { // Thunderbird env. loaded ! m_mailAgentProc2 = new TDEProcess; // Init a new env. if ( m_sendImagesDialog->m_mailAgentName->currentText() == "Mozilla" ) *m_mailAgentProc2 << "mozilla" << "-mail"; else if ( m_sendImagesDialog->m_mailAgentName->currentText() == "Thunderbird" ) *m_mailAgentProc2 << m_thunderbirdUrl << "-mail"; ///for new versions of thunderbird, we don't need it anymore //*m_mailAgentProc2 << m_thunderbirdUrl; else *m_mailAgentProc2 << "netscape" << "-mail"; // Start an instance of mozilla mail agent before a remote call. if ( m_mailAgentProc2->start() == false ) { KMessageBox::error(TQT_TQWIDGET(kapp->activeWindow()), i18n("Cannot start '%1' program;\nplease " "check your installation.") .arg(m_sendImagesDialog->m_mailAgentName->currentText())); } else { // Mozilla | Netscape | Thunderbird mail agent started correctly // -> start a remote mail agent with multiple attachments after the env. is loaded ! m_mozillaTimer->start(5000, true); return; } } } ///If Mozilla wasn't started before, now it is and so we can begin with the transmission void SendImages::slotMozillaTimeout(void) { m_mozillaTimer->disconnect(TQT_SIGNAL(timeout()), this, TQT_SLOT(slotMozillaTimeout())); tqDebug("slotMozillaTimeout: Number of elements in m_filesSendList=%d, and in m_filesSendList_copy=%d)",(int)m_filesSendList.size(),(int)m_filesSendList_copy.size()); kurllistdeepcopy(m_filesSendList,m_filesSendList_copy); invokeMailAgent(); } ///Handles mozillas errors void SendImages::slotMozillaReadStderr(TDEProcess*, char *buffer, int buflen) { m_mozillaStdErr = TQString::fromLocal8Bit(buffer, buflen); } ///Makes a deep copy of a KURL-list: Real and slow copying instead of only pointer arithmetics bool SendImages::kurllistdeepcopy(KURL::List &Destination, KURL::List Source) { Destination.clear(); tqDebug("kurllistdeepcopy started"); for ( KURL::List::Iterator it = Source.begin() ; it != Source.end() ; ++it ) { //TQString Tempstring; TQString Getstring=(*it).path(); TQString Tempstring=Getstring.copy(); Destination.append(Tempstring); tqDebug("%s",Tempstring.ascii()); } /* tqDebug("deepcopytest"); Source.clear(); for ( KURL::List::Iterator it = Destination.begin() ; it != Destination.end() ; ++it ) { tqDebug("%s",(*it).path().ascii()); } */ tqDebug("kurllistdeepcopy ended\n"); return true; } } // NameSpace KIPISendimagesPlugin