You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/libkcal/attachmenthandler.cpp

259 lines
7.6 KiB

/*
This file is part of the kcal library.
Copyright (c) 2010 Klar<61>lvdalens Datakonsult AB, a KDAB Group company <info@kdab.net>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
/**
@file
This file is part of the API for handling calendar data and provides
static functions for dealing with calendar incidence attachments.
@brief
vCalendar/iCalendar attachment handling.
@author Allen Winter \<winter@kde.org\>
*/
#include "attachmenthandler.h"
#include "attachment.h"
#include "calendarresources.h"
#include "incidence.h"
#include "scheduler.h"
#include <kapplication.h>
#include <kfiledialog.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <kmimetype.h>
#include <krun.h>
#include <ktempfile.h>
#include <kio/netaccess.h>
#include <tqfile.h>
namespace KCal {
Attachment *AttachmentHandler::find( TQWidget *parent, const TQString &attachmentName,
Incidence *incidence )
{
if ( !incidence ) {
return 0;
}
// get the attachment by name from the incidence
Attachment::List as = incidence->attachments();
Attachment *a = 0;
if ( as.count() > 0 ) {
Attachment::List::ConstIterator it;
for ( it = as.begin(); it != as.end(); ++it ) {
if ( (*it)->label() == attachmentName ) {
a = *it;
break;
}
}
}
if ( !a ) {
KMessageBox::error(
parent,
i18n( "No attachment named \"%1\" found in the incidence." ).arg( attachmentName ) );
return 0;
}
if ( a->isUri() ) {
if ( !KIO::NetAccess::exists( a->uri(), true, parent ) ) {
KMessageBox::sorry(
parent,
i18n( "The attachment \"%1\" is a web link that is inaccessible from this computer. " ).
arg( KURL::decode_string( a->uri() ) ) );
return 0;
}
}
return a;
}
Attachment *AttachmentHandler::find( TQWidget *parent,
const TQString &attachmentName, const TQString &uid )
{
if ( uid.isEmpty() ) {
return 0;
}
CalendarResources *cal = new CalendarResources( "UTC" );
cal->readConfig();
cal->load();
Incidence *incidence = cal->incidence( uid );
if ( !incidence ) {
KMessageBox::error(
parent,
i18n( "The incidence that owns the attachment named \"%1\" could not be found. "
"Perhaps it was removed from your calendar?" ).arg( attachmentName ) );
return 0;
}
return find( parent, attachmentName, incidence );
}
Attachment *AttachmentHandler::find( TQWidget *parent, const TQString &attachmentName,
ScheduleMessage *message )
{
if ( !message ) {
return 0;
}
Incidence *incidence = dynamic_cast<Incidence*>( message->event() );
if ( !incidence ) {
KMessageBox::error(
parent,
i18n( "The calendar invitation stored in this email message is broken in some way. "
"Unable to continue." ) );
return 0;
}
return find( parent, attachmentName, incidence );
}
static KTempFile *s_tempFile = 0;
static KURL tempFileForAttachment( Attachment *attachment )
{
KURL url;
TQStringList patterns = KMimeType::mimeType( attachment->mimeType() )->patterns();
if ( !patterns.empty() ) {
s_tempFile = new KTempFile( TQString(),
TQString( patterns.first() ).remove( '*' ), 0600 );
} else {
s_tempFile = new KTempFile( TQString(), TQString(), 0600 );
}
TQFile *qfile = s_tempFile->file();
qfile->open( IO_WriteOnly );
TQTextStream stream( qfile );
stream.writeRawBytes( attachment->decodedData().data(), attachment->size() );
s_tempFile->close();
TQFile tf( s_tempFile->name() );
if ( tf.size() != attachment->size() ) {
//whoops. failed to write the entire attachment. return an invalid URL.
delete s_tempFile;
s_tempFile = 0;
return url;
}
url.setPath( s_tempFile->name() );
return url;
}
bool AttachmentHandler::view( TQWidget *parent, Attachment *attachment )
{
if ( !attachment ) {
return false;
}
bool stat = true;
if ( attachment->isUri() ) {
kapp->invokeBrowser( attachment->uri() );
} else {
// put the attachment in a temporary file and launch it
KURL tempUrl = tempFileForAttachment( attachment );
if ( tempUrl.isValid() ) {
stat = KRun::runURL( tempUrl, attachment->mimeType(), false, true );
} else {
stat = false;
KMessageBox::error(
parent,
i18n( "Unable to create a temporary file for the attachment." ) );
}
delete s_tempFile;
s_tempFile = 0;
}
return stat;
}
bool AttachmentHandler::view( TQWidget *parent, const TQString &attachmentName, Incidence *incidence )
{
return view( parent, find( parent, attachmentName, incidence ) );
}
bool AttachmentHandler::view( TQWidget *parent, const TQString &attachmentName, const TQString &uid )
{
return view( parent, find( parent, attachmentName, uid ) );
}
bool AttachmentHandler::view( TQWidget *parent, const TQString &attachmentName,
ScheduleMessage *message )
{
return view( parent, find( parent, attachmentName, message ) );
}
bool AttachmentHandler::saveAs( TQWidget *parent, Attachment *attachment )
{
// get the saveas file name
TQString saveAsFile = KFileDialog::getSaveFileName( attachment->label(), TQString(), parent,
i18n( "Save Attachment" ) );
if ( saveAsFile.isEmpty() ||
( TQFile( saveAsFile ).exists() &&
( KMessageBox::warningYesNo(
parent,
i18n( "%1 already exists. Do you want to overwrite it?").
arg( saveAsFile ) ) == KMessageBox::No ) ) ) {
return false;
}
bool stat = false;
if ( attachment->isUri() ) {
// save the attachment url
stat = KIO::NetAccess::file_copy( attachment->uri(), KURL( saveAsFile ), -1, true );
} else {
// put the attachment in a temporary file and save it
KURL tempUrl = tempFileForAttachment( attachment );
if ( tempUrl.isValid() ) {
stat = KIO::NetAccess::file_copy( tempUrl, KURL( saveAsFile ), -1, true );
if ( !stat && KIO::NetAccess::lastError() ) {
KMessageBox::error( parent, KIO::NetAccess::lastErrorString() );
}
} else {
stat = false;
KMessageBox::error(
parent,
i18n( "Unable to create a temporary file for the attachment." ) );
}
delete s_tempFile;
s_tempFile = 0;
}
return stat;
}
bool AttachmentHandler::saveAs( TQWidget *parent, const TQString &attachmentName,
Incidence *incidence )
{
return saveAs( parent, find( parent, attachmentName, incidence ) );
}
bool AttachmentHandler::saveAs( TQWidget *parent, const TQString &attachmentName, const TQString &uid )
{
return saveAs( parent, find( parent, attachmentName, uid ) );
}
bool AttachmentHandler::saveAs( TQWidget *parent, const TQString &attachmentName,
ScheduleMessage *message )
{
return saveAs( parent, find( parent, attachmentName, message ) );
}
}