/* ============================================================
*
* 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 < caulier dot gilles at gmail dot com >
* Copyright ( C ) 2006 by Tom Albers < tomalbers at kde dot nl >
* Copyright ( C ) 2006 by Michael Hoechstetter < michael dot hoechstetter at gmx dot de >
*
* 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 <tqfileinfo.h>
# include <tqdir.h>
# include <tqimage.h>
# include <tqprogressdialog.h>
# include <tqcombobox.h>
# include <tqcheckbox.h>
# include <tqtimer.h>
# include <tqurl.h>
# include <tqdeepcopy.h>
// KDE includes
# include <klocale.h>
# include <kinstance.h>
# include <kconfig.h>
# include <kapplication.h>
# include <kimageeffect.h>
# include <kprogress.h>
# include <kmessagebox.h>
# include <kstandarddirs.h>
# include <kio/job.h>
# include <kio/jobclasses.h>
# include <kio/netaccess.h>
# include <kio/global.h>
# include <kprocess.h>
# include <kimageio.h>
# include <knuminput.h>
# include <kurlrequester.h>
// LibKExiv2 includes.
# include <libkexiv2/kexiv2.h>
// LibKDcraw includes.
# include <libkdcraw/version.h>
# include <libkdcraw/kdcraw.h>
# if KDCRAW_VERSION < 0x000106
# include <libkdcraw/dcrawbinary.h>
# 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 < TQString , TQVariant > 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; \n please "
" 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; \n please "
" 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; \n please "
" 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; \n please "
" 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; \n please "
" 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; \n please "
" 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