summaryrefslogtreecommitdiffstats
path: root/kbabel/common/kbmailer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kbabel/common/kbmailer.cpp')
-rw-r--r--kbabel/common/kbmailer.cpp244
1 files changed, 244 insertions, 0 deletions
diff --git a/kbabel/common/kbmailer.cpp b/kbabel/common/kbmailer.cpp
new file mode 100644
index 00000000..fb3ab3b1
--- /dev/null
+++ b/kbabel/common/kbmailer.cpp
@@ -0,0 +1,244 @@
+/* ****************************************************************************
+ This file is part of KBabel
+
+ Copyright (C) 2002-2003 by Marco Wegner <[email protected]>
+ 2004 by Stanislav Visnovsky <[email protected]>
+ Copyright (C) 2006 by Nicolas GOUTTE <[email protected]>
+
+ 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 of the License, 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+
+**************************************************************************** */
+
+
+#include <qfileinfo.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qwidget.h>
+
+#include <kapplication.h>
+#include <kio/netaccess.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <ktar.h>
+#include <kurl.h>
+#include <kdebug.h>
+#include <ktempdir.h>
+#include <kinputdialog.h>
+
+#include "kbmailer.h"
+
+using namespace KBabel;
+
+KBabelMailer::KBabelMailer( QWidget* parent, Project::Ptr project)
+ : _project( project ), m_parent( parent )
+{
+ m_tempDir.setAutoDelete( true );
+ readConfig();
+}
+
+KBabelMailer::~KBabelMailer()
+{
+ saveConfig( );
+}
+
+void KBabelMailer::sendOneFile(const QString& fileName)
+{
+ if (!singleFileCompression) {
+ kapp->invokeMailer("", "", "", "", "", "", fileName);
+ } else {
+ const QString archive ( createArchive( QStringList( fileName ), QFileInfo( fileName ).baseName() ) );
+ if ( !archive.isEmpty() ) {
+ kapp->invokeMailer("", "", "", "", "", "", archive);
+ }
+ }
+}
+
+void KBabelMailer::sendOneFile( const KURL& url)
+{
+#if KDE_IS_VERSION( 3, 5, 0)
+ const KURL localUrl( KIO::NetAccess::mostLocalURL( url, m_parent ) );
+#else
+ const KURL localUrl( url );
+#endif
+ if ( localUrl.isLocalFile() )
+ {
+ sendOneFile( localUrl.path() );
+ return;
+ }
+
+ if (!singleFileCompression) {
+ QString fileName( url.filename() );
+ if ( fileName.isEmpty() )
+ {
+ fileName = "attachment";
+ }
+ // ### TODO: the current implementation has the default to possibly overwrite an already existing temporary file
+ QString tempName( m_tempDir.name() );
+ tempName += fileName;
+ if ( KIO::NetAccess::download( url, tempName, m_parent ) )
+ kapp->invokeMailer("", "", "", "", "", "", fileName);
+ else
+ {
+ KMessageBox::error( m_parent, i18n("Error while trying to download file %1.").arg( url.prettyURL() ) );
+ }
+ }
+ else
+ {
+ const QString archive ( createArchive( QStringList( url.url() ), url.filename() ) );
+ if ( !archive.isEmpty() ) {
+ kapp->invokeMailer("", "", "", "", "", "", archive);
+ }
+ }
+}
+
+void KBabelMailer::sendFiles(QStringList fileList, const QString& initialName)
+{
+ const QString archive ( createArchive( fileList, initialName ) );
+ if ( !archive.isEmpty() ) {
+ kapp->invokeMailer("", "", "", "", "", "", archive);
+ }
+}
+
+QString KBabelMailer::createArchive(QStringList fileList, QString initialName)
+{
+ if ( m_tempDir.name().isEmpty() )
+ {
+ kdWarning() << "KBabelMailer has not a valid temporary directory!" << endl;
+ return QString(); // No temporary directory!
+ }
+
+ // do nothing if there are no files in the list
+ if (fileList.empty())
+ return QString::null;
+
+ // determine the name of the archive, do nothing if none is given
+ // or Cancel was pressed
+ initialName = ( initialName.isEmpty() ? QString("translations") : initialName );
+ bool ok = false;
+ QStringList list( archiveList );
+ list.prepend( initialName );
+ QString archiveName ( KInputDialog::getItem( i18n("Save"),
+ i18n( "Enter the name of the archive without file extension" ),
+ archiveList, 0, true, &ok, m_parent ) );
+ if ( !ok || archiveName.isEmpty() )
+ return QString();
+
+ // file extensions are determined from the type of compression
+ archiveName.remove( QRegExp( "\\.tar\\.(gz|bz2)$" ) );
+
+ // Update the list of archive names, keep only the ten most recent ones.
+ archiveList.remove( archiveName );
+ archiveList.prepend( archiveName );
+ if ( archiveList.count( ) > 10 )
+ archiveList.pop_back();
+
+ // set the correct extension and mimetype
+ QString mimetype;
+ if (bzipCompression) {
+ archiveName += ".tar.bz2";
+ mimetype = "application/x-bzip2";
+ } else {
+ archiveName += ".tar.gz";
+ mimetype = "application/x-gzip";
+ }
+
+ return buildArchive (fileList, m_tempDir.name()+archiveName, mimetype, true);
+}
+
+QString KBabelMailer::buildArchive(QStringList fileList, QString archiveName, QString mimetype, bool remove)
+{
+ Q_UNUSED( remove );
+ // create a new archive
+ KTar archive(archiveName, mimetype);
+ if (!archive.open(IO_WriteOnly)) {
+ KMessageBox::error( m_parent, i18n("Error while trying to create archive file.") );
+ return QString::null;
+ }
+
+ // add files to this archive
+ QStringList::const_iterator it;
+ for (it = fileList.constBegin(); it != fileList.constEnd(); ++it) {
+#if KDE_IS_VERSION( 3, 5, 0 )
+ // Try to get a local URL instead of a remote one
+ const KURL url( KIO::NetAccess::mostLocalURL( KURL::fromPathOrURL( *it ), m_parent ) );
+#else
+ const KURL url( KURL::fromPathOrURL( *it ) );
+#endif
+ QString poTempName;
+ if ( !KIO::NetAccess::download( url, poTempName, m_parent ) ) {
+ KMessageBox::error( m_parent, i18n("Error while trying to read file %1.").arg( url.prettyURL() ) );
+ continue;
+ }
+
+ // The files in the archive are stored relatively to the PO base dir
+ // but only if "PoBaseDir" in the config file is set and the files
+ // actually reside in one of its subdirectories. Else they are stored
+ // without relative path.
+ QString poArchFileName = url.path();
+ if (_poBaseDir.isEmpty( ) || poArchFileName.find(_poBaseDir) != 0)
+ poArchFileName = QFileInfo( poArchFileName ).fileName();
+ else
+ poArchFileName.remove( QRegExp( "^" + QRegExp::escape( _poBaseDir ) + "/?" ) );
+ if ( !archive.addLocalFile( poTempName, poArchFileName ) )
+ {
+ KMessageBox::error( m_parent, i18n("Error while trying to copy file %1 into archive.").arg( url.prettyURL() ) );
+ }
+
+ KIO::NetAccess::removeTempFile(poTempName);
+ }
+ archive.close();
+
+ return archive.fileName();
+}
+
+void KBabelMailer::readConfig()
+{
+ // The relevant variables are never stored in catalogmanagerrc but in
+ // project config file. Therefore they are read from the project.
+
+ MiscSettings _settings = _project->miscSettings();
+
+ bzipCompression = _settings.useBzip;
+ singleFileCompression = _settings.compressSingleFile;
+
+ KConfig* conf = _project->config();
+
+ conf->setGroup ("Misc");
+ archiveList = conf->readListEntry("MailArchiveNames");
+
+ _poBaseDir = _project->catManSettings().poBaseDir;
+}
+
+void KBabelMailer::saveConfig()
+{
+ // For an explanation see readConfig( )
+ KConfig* _config = _project->config();
+
+ _config->setGroup("Misc");
+ _config->writeEntry("MailArchiveNames", archiveList);
+}
+