|
|
|
/* This file is part of the KDE Project
|
|
|
|
Copyright (c) 2005 Jean-Remy Falleri <jr.falleri@laposte.net>
|
|
|
|
Copyright (c) 2005 Kévin Ottens <ervin ipsquad net>
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Library General Public
|
|
|
|
License version 2 as published by the Free Software Foundation.
|
|
|
|
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "notifiersettings.h"
|
|
|
|
|
|
|
|
#include <kglobal.h>
|
|
|
|
#include <kdesktopfile.h>
|
|
|
|
#include <kstandarddirs.h>
|
|
|
|
#include <tqdir.h>
|
|
|
|
#include <tqfile.h>
|
|
|
|
|
|
|
|
#include "notifieropenaction.h"
|
|
|
|
#include "notifiernothingaction.h"
|
|
|
|
|
|
|
|
|
|
|
|
NotifierSettings::NotifierSettings()
|
|
|
|
{
|
|
|
|
m_supportedMimetypes.append( "media/removable_unmounted" );
|
|
|
|
m_supportedMimetypes.append( "media/removable_unmounted_encrypted" );
|
|
|
|
m_supportedMimetypes.append( "media/removable_unmounted_decrypted" );
|
|
|
|
m_supportedMimetypes.append( "media/removable_mounted" );
|
|
|
|
m_supportedMimetypes.append( "media/removable_mounted_decrypted" );
|
|
|
|
m_supportedMimetypes.append( "media/camera_unmounted" );
|
|
|
|
m_supportedMimetypes.append( "media/camera_mounted" );
|
|
|
|
m_supportedMimetypes.append( "media/gphoto2camera" );
|
|
|
|
m_supportedMimetypes.append( "media/cdrom_unmounted" );
|
|
|
|
m_supportedMimetypes.append( "media/cdrom_unmounted_encrypted" );
|
|
|
|
m_supportedMimetypes.append( "media/cdrom_unmounted_decrypted" );
|
|
|
|
m_supportedMimetypes.append( "media/cdrom_mounted" );
|
|
|
|
m_supportedMimetypes.append( "media/cdrom_mounted_decrypted" );
|
|
|
|
m_supportedMimetypes.append( "media/dvd_unmounted" );
|
|
|
|
m_supportedMimetypes.append( "media/dvd_unmounted_encrypted" );
|
|
|
|
m_supportedMimetypes.append( "media/dvd_unmounted_decrypted" );
|
|
|
|
m_supportedMimetypes.append( "media/dvd_mounted" );
|
|
|
|
m_supportedMimetypes.append( "media/dvd_mounted_decrypted" );
|
|
|
|
m_supportedMimetypes.append( "media/cdwriter_unmounted" );
|
|
|
|
m_supportedMimetypes.append( "media/cdwriter_unmounted_encrypted" );
|
|
|
|
m_supportedMimetypes.append( "media/cdwriter_unmounted_decrypted" );
|
|
|
|
m_supportedMimetypes.append( "media/cdwriter_mounted" );
|
|
|
|
m_supportedMimetypes.append( "media/cdwriter_mounted_decrypted" );
|
|
|
|
m_supportedMimetypes.append( "media/blankcd" );
|
|
|
|
m_supportedMimetypes.append( "media/blankdvd" );
|
|
|
|
m_supportedMimetypes.append( "media/audiocd" );
|
|
|
|
m_supportedMimetypes.append( "media/dvdvideo" );
|
|
|
|
m_supportedMimetypes.append( "media/vcd" );
|
|
|
|
m_supportedMimetypes.append( "media/svcd" );
|
|
|
|
|
|
|
|
reload();
|
|
|
|
}
|
|
|
|
|
|
|
|
NotifierSettings::~NotifierSettings()
|
|
|
|
{
|
|
|
|
while ( !m_actions.isEmpty() )
|
|
|
|
{
|
|
|
|
NotifierAction *a = m_actions.first();
|
|
|
|
m_actions.remove( a );
|
|
|
|
delete a;
|
|
|
|
}
|
|
|
|
|
|
|
|
while ( !m_deletedActions.isEmpty() )
|
|
|
|
{
|
|
|
|
NotifierServiceAction *a = m_deletedActions.first();
|
|
|
|
m_deletedActions.remove( a );
|
|
|
|
delete a;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TQValueList<NotifierAction*> NotifierSettings::actions()
|
|
|
|
{
|
|
|
|
return m_actions;
|
|
|
|
}
|
|
|
|
|
|
|
|
const TQStringList &NotifierSettings::supportedMimetypes()
|
|
|
|
{
|
|
|
|
return m_supportedMimetypes;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQValueList<NotifierAction*> NotifierSettings::actionsForMimetype( const TQString &mimetype )
|
|
|
|
{
|
|
|
|
TQValueList<NotifierAction*> result;
|
|
|
|
|
|
|
|
TQValueList<NotifierAction*>::iterator it = m_actions.begin();
|
|
|
|
TQValueList<NotifierAction*>::iterator end = m_actions.end();
|
|
|
|
|
|
|
|
for ( ; it!=end; ++it )
|
|
|
|
{
|
|
|
|
if ( (*it)->supportsMimetype( mimetype ) )
|
|
|
|
{
|
|
|
|
result.append( *it );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool NotifierSettings::tqaddAction( NotifierServiceAction *action )
|
|
|
|
{
|
|
|
|
if ( !m_idMap.tqcontains( action->id() ) )
|
|
|
|
{
|
|
|
|
m_actions.insert( --m_actions.end(), action );
|
|
|
|
m_idMap[ action->id() ] = action;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool NotifierSettings::deleteAction( NotifierServiceAction *action )
|
|
|
|
{
|
|
|
|
if ( action->isWritable() )
|
|
|
|
{
|
|
|
|
m_actions.remove( action );
|
|
|
|
m_idMap.remove( action->id() );
|
|
|
|
m_deletedActions.append( action );
|
|
|
|
|
|
|
|
TQStringList auto_mimetypes = action->autoMimetypes();
|
|
|
|
TQStringList::iterator it = auto_mimetypes.begin();
|
|
|
|
TQStringList::iterator end = auto_mimetypes.end();
|
|
|
|
|
|
|
|
for ( ; it!=end; ++it )
|
|
|
|
{
|
|
|
|
action->removeAutoMimetype( *it );
|
|
|
|
m_autoMimetypesMap.remove( *it );
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void NotifierSettings::setAutoAction( const TQString &mimetype, NotifierAction *action )
|
|
|
|
{
|
|
|
|
resetAutoAction( mimetype );
|
|
|
|
m_autoMimetypesMap[mimetype] = action;
|
|
|
|
action->addAutoMimetype( mimetype );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void NotifierSettings::resetAutoAction( const TQString &mimetype )
|
|
|
|
{
|
|
|
|
if ( m_autoMimetypesMap.tqcontains( mimetype ) )
|
|
|
|
{
|
|
|
|
NotifierAction *action = m_autoMimetypesMap[mimetype];
|
|
|
|
action->removeAutoMimetype( mimetype );
|
|
|
|
m_autoMimetypesMap.remove(mimetype);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void NotifierSettings::clearAutoActions()
|
|
|
|
{
|
|
|
|
TQMap<TQString,NotifierAction*>::iterator it = m_autoMimetypesMap.begin();
|
|
|
|
TQMap<TQString,NotifierAction*>::iterator end = m_autoMimetypesMap.end();
|
|
|
|
|
|
|
|
for ( ; it!=end; ++it )
|
|
|
|
{
|
|
|
|
NotifierAction *action = it.data();
|
|
|
|
TQString mimetype = it.key();
|
|
|
|
|
|
|
|
if ( action )
|
|
|
|
action->removeAutoMimetype( mimetype );
|
|
|
|
m_autoMimetypesMap[mimetype] = 0L;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NotifierAction *NotifierSettings::autoActionForMimetype( const TQString &mimetype )
|
|
|
|
{
|
|
|
|
if ( m_autoMimetypesMap.tqcontains( mimetype ) )
|
|
|
|
{
|
|
|
|
return m_autoMimetypesMap[mimetype];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return 0L;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void NotifierSettings::reload()
|
|
|
|
{
|
|
|
|
while ( !m_actions.isEmpty() )
|
|
|
|
{
|
|
|
|
NotifierAction *a = m_actions.first();
|
|
|
|
m_actions.remove( a );
|
|
|
|
delete a;
|
|
|
|
}
|
|
|
|
|
|
|
|
while ( !m_deletedActions.isEmpty() )
|
|
|
|
{
|
|
|
|
NotifierServiceAction *a = m_deletedActions.first();
|
|
|
|
m_deletedActions.remove( a );
|
|
|
|
delete a;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_idMap.clear();
|
|
|
|
m_autoMimetypesMap.clear();
|
|
|
|
|
|
|
|
NotifierOpenAction *open = new NotifierOpenAction();
|
|
|
|
m_actions.append( open );
|
|
|
|
m_idMap[ open->id() ] = open;
|
|
|
|
|
|
|
|
TQValueList<NotifierServiceAction*> services = listServices();
|
|
|
|
|
|
|
|
TQValueList<NotifierServiceAction*>::iterator serv_it = services.begin();
|
|
|
|
TQValueList<NotifierServiceAction*>::iterator serv_end = services.end();
|
|
|
|
|
|
|
|
for ( ; serv_it!=serv_end; ++serv_it )
|
|
|
|
{
|
|
|
|
m_actions.append( *serv_it );
|
|
|
|
m_idMap[ (*serv_it)->id() ] = *serv_it;
|
|
|
|
}
|
|
|
|
|
|
|
|
NotifierNothingAction *nothing = new NotifierNothingAction();
|
|
|
|
m_actions.append( nothing );
|
|
|
|
m_idMap[ nothing->id() ] = nothing;
|
|
|
|
|
|
|
|
KConfig config( "medianotifierrc", true );
|
|
|
|
TQMap<TQString,TQString> auto_actions_map = config.entryMap( "Auto Actions" );
|
|
|
|
|
|
|
|
TQMap<TQString,TQString>::iterator auto_it = auto_actions_map.begin();
|
|
|
|
TQMap<TQString,TQString>::iterator auto_end = auto_actions_map.end();
|
|
|
|
|
|
|
|
for ( ; auto_it!=auto_end; ++auto_it )
|
|
|
|
{
|
|
|
|
TQString mime = auto_it.key();
|
|
|
|
TQString action_id = auto_it.data();
|
|
|
|
|
|
|
|
if ( m_idMap.tqcontains( action_id ) )
|
|
|
|
{
|
|
|
|
setAutoAction( mime, m_idMap[action_id] );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
config.deleteEntry( mime );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void NotifierSettings::save()
|
|
|
|
{
|
|
|
|
TQValueList<NotifierAction*>::iterator act_it = m_actions.begin();
|
|
|
|
TQValueList<NotifierAction*>::iterator act_end = m_actions.end();
|
|
|
|
|
|
|
|
for ( ; act_it!=act_end; ++act_it )
|
|
|
|
{
|
|
|
|
NotifierServiceAction *service;
|
|
|
|
if ( ( service=dynamic_cast<NotifierServiceAction*>( *act_it ) )
|
|
|
|
&& service->isWritable() )
|
|
|
|
{
|
|
|
|
service->save();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
while ( !m_deletedActions.isEmpty() )
|
|
|
|
{
|
|
|
|
NotifierServiceAction *a = m_deletedActions.first();
|
|
|
|
m_deletedActions.remove( a );
|
|
|
|
TQFile::remove( a->filePath() );
|
|
|
|
delete a;
|
|
|
|
}
|
|
|
|
|
|
|
|
KSimpleConfig config( "medianotifierrc" );
|
|
|
|
config.setGroup( "Auto Actions" );
|
|
|
|
|
|
|
|
TQMap<TQString,NotifierAction*>::iterator auto_it = m_autoMimetypesMap.begin();
|
|
|
|
TQMap<TQString,NotifierAction*>::iterator auto_end = m_autoMimetypesMap.end();
|
|
|
|
|
|
|
|
for ( ; auto_it!=auto_end; ++auto_it )
|
|
|
|
{
|
|
|
|
if ( auto_it.data()!=0L )
|
|
|
|
{
|
|
|
|
config.writeEntry( auto_it.key(), auto_it.data()->id() );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
config.deleteEntry( auto_it.key() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TQValueList<NotifierServiceAction*> NotifierSettings::loadActions( KDesktopFile &desktop ) const
|
|
|
|
{
|
|
|
|
desktop.setDesktopGroup();
|
|
|
|
|
|
|
|
TQValueList<NotifierServiceAction*> services;
|
|
|
|
|
|
|
|
const TQString filename = desktop.fileName();
|
|
|
|
const TQStringList mimetypes = desktop.readListEntry( "ServiceTypes" );
|
|
|
|
|
|
|
|
TQValueList<KDEDesktopMimeType::Service> type_services
|
|
|
|
= KDEDesktopMimeType::userDefinedServices(filename, true);
|
|
|
|
|
|
|
|
TQValueList<KDEDesktopMimeType::Service>::iterator service_it = type_services.begin();
|
|
|
|
TQValueList<KDEDesktopMimeType::Service>::iterator service_end = type_services.end();
|
|
|
|
for (; service_it!=service_end; ++service_it)
|
|
|
|
{
|
|
|
|
NotifierServiceAction *service_action
|
|
|
|
= new NotifierServiceAction();
|
|
|
|
|
|
|
|
service_action->setService( *service_it );
|
|
|
|
service_action->setFilePath( filename );
|
|
|
|
service_action->setMimetypes( mimetypes );
|
|
|
|
|
|
|
|
services += service_action;
|
|
|
|
}
|
|
|
|
|
|
|
|
return services;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool NotifierSettings::shouldLoadActions( KDesktopFile &desktop, const TQString &mimetype ) const
|
|
|
|
{
|
|
|
|
desktop.setDesktopGroup();
|
|
|
|
|
|
|
|
if ( desktop.hasKey( "Actions" )
|
|
|
|
&& desktop.hasKey( "ServiceTypes" )
|
|
|
|
&& !desktop.readBoolEntry( "X-KDE-MediaNotifierHide", false ) )
|
|
|
|
{
|
|
|
|
const TQStringList actions = desktop.readListEntry( "Actions" );
|
|
|
|
|
|
|
|
if ( actions.size()!=1 )
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
const TQStringList types = desktop.readListEntry( "ServiceTypes" );
|
|
|
|
|
|
|
|
if ( mimetype.isEmpty() )
|
|
|
|
{
|
|
|
|
TQStringList::ConstIterator type_it = types.begin();
|
|
|
|
TQStringList::ConstIterator type_end = types.end();
|
|
|
|
for (; type_it != type_end; ++type_it)
|
|
|
|
{
|
|
|
|
if ( (*type_it).startsWith( "media/" ) )
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( types.tqcontains(mimetype) )
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQValueList<NotifierServiceAction*> NotifierSettings::listServices( const TQString &mimetype ) const
|
|
|
|
{
|
|
|
|
TQValueList<NotifierServiceAction*> services;
|
|
|
|
TQStringList dirs = KGlobal::dirs()->findDirs("data", "konqueror/servicemenus/");
|
|
|
|
|
|
|
|
TQStringList::ConstIterator dir_it = dirs.begin();
|
|
|
|
TQStringList::ConstIterator dir_end = dirs.end();
|
|
|
|
for (; dir_it != dir_end; ++dir_it)
|
|
|
|
{
|
|
|
|
TQDir dir( *dir_it );
|
|
|
|
|
|
|
|
TQStringList entries = dir.entryList( "*.desktop", TQDir::Files );
|
|
|
|
|
|
|
|
TQStringList::ConstIterator entry_it = entries.begin();
|
|
|
|
TQStringList::ConstIterator entry_end = entries.end();
|
|
|
|
|
|
|
|
for (; entry_it != entry_end; ++entry_it )
|
|
|
|
{
|
|
|
|
TQString filename = *dir_it + *entry_it;
|
|
|
|
|
|
|
|
KDesktopFile desktop( filename, true );
|
|
|
|
|
|
|
|
if ( shouldLoadActions(desktop, mimetype) )
|
|
|
|
{
|
|
|
|
services+=loadActions(desktop);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return services;
|
|
|
|
}
|