2 Copyright (c) 2012 Montel Laurent <montel@kde.org>
4 This program is free software; you can redistribute it and/or modify it
5 under the terms of the GNU General Public License, version 2, as
6 published by the Free Software Foundation.
8 This program is distributed in the hope that it will be useful, but
9 WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 General Public License for more details.
13 You should have received a copy of the GNU General Public License along
14 with this program; if not, write to the Free Software Foundation, Inc.,
15 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 #include "abstractsettings.h"
18 #include "importwizard.h"
19 #include "importsettingpage.h"
21 #include "mailcommon/filter/filteractionmissingargumentdialog.h"
23 #include <kpimidentities/identitymanager.h>
24 #include <kpimidentities/identity.h>
25 #include <mailtransport/transportmanager.h>
30 #include <akonadi/agenttype.h>
31 #include <akonadi/agentmanager.h>
32 #include <akonadi/agentinstancecreatejob.h>
35 #include <QDBusInterface>
36 #include <QMetaMethod>
38 using namespace Akonadi
;
40 AbstractSettings::AbstractSettings(ImportWizard
*parent
)
41 :mImportWizard(parent
)
43 mManager
= new KPIMIdentities::IdentityManager( false, this, "mIdentityManager" );
46 AbstractSettings::~AbstractSettings()
51 KPIMIdentities::Identity
* AbstractSettings::createIdentity()
53 KPIMIdentities::Identity
* identity
= &mManager
->newFromScratch( QString() );
54 addFilterImportInfo(i18n("Setting up identity..."));
58 void AbstractSettings::storeIdentity(KPIMIdentities::Identity
* identity
)
60 mManager
->setAsDefault( identity
->uoid() );
62 addFilterImportInfo(i18n("Identity set up."));
66 MailTransport::Transport
*AbstractSettings::createTransport()
68 MailTransport::Transport
* mt
= MailTransport::TransportManager::self()->createTransport();
72 //code from accountwizard
73 static QVariant::Type
argumentType( const QMetaObject
*mo
, const QString
&method
)
76 for ( int i
= 0; i
< mo
->methodCount(); ++i
) {
77 const QString signature
= QString::fromLatin1( mo
->method( i
).signature() );
78 if ( signature
.startsWith( method
) )
82 if ( !m
.signature() ) {
83 kWarning() << "Did not find D-Bus method: " << method
<< " available methods are:";
84 const int numberOfMethod(mo
->methodCount());
85 for ( int i
= 0; i
< numberOfMethod
; ++ i
)
86 kWarning() << mo
->method( i
).signature();
87 return QVariant::Invalid
;
90 const QList
<QByteArray
> argTypes
= m
.parameterTypes();
91 if ( argTypes
.count() != 1 )
92 return QVariant::Invalid
;
94 return QVariant::nameToType( argTypes
.first() );
98 void AbstractSettings::createResource( const QString
& resources
, const QString
& name
, const QMap
<QString
, QVariant
>& settings
)
100 const AgentType type
= AgentManager::self()->type( resources
);
101 if ( !type
.isValid() ) {
102 addFilterImportError( i18n( "Resource type '%1' is not available.", resources
) );
106 // check if unique instance already exists
107 kDebug() << type
.capabilities();
108 if ( type
.capabilities().contains( QLatin1String( "Unique" ) ) ) {
109 foreach ( const AgentInstance
&instance
, AgentManager::self()->instances() ) {
110 kDebug() << instance
.type().identifier() << (instance
.type() == type
);
111 if ( instance
.type() == type
) {
112 addFilterImportInfo( i18n( "Resource '%1' is already set up.", type
.name() ) );
118 addFilterImportInfo( i18n( "Creating resource instance for '%1'...", type
.name() ) );
119 AgentInstanceCreateJob
*job
= new AgentInstanceCreateJob( type
, this );
121 Akonadi::AgentInstance instance
= job
->instance();
123 if ( !settings
.isEmpty() ) {
124 addFilterImportInfo( i18n( "Configuring resource instance..." ) );
125 QDBusInterface
iface( "org.freedesktop.Akonadi.Resource." + instance
.identifier(), "/Settings" );
126 if ( !iface
.isValid() ) {
127 addFilterImportError( i18n( "Unable to configure resource instance." ) );
131 // configure resource
132 if ( !name
.isEmpty() )
133 instance
.setName( name
);
134 QMap
<QString
, QVariant
>::const_iterator
end( settings
.constEnd());
135 for ( QMap
<QString
, QVariant
>::const_iterator it
= settings
.constBegin(); it
!= end
; ++it
) {
136 kDebug() << "Setting up " << it
.key() << " for agent " << instance
.identifier();
137 const QString methodName
= QString::fromLatin1("set%1").arg( it
.key() );
138 QVariant arg
= it
.value();
139 const QVariant::Type targetType
= argumentType( iface
.metaObject(), methodName
);
140 if ( !arg
.canConvert( targetType
) ) {
141 addFilterImportError( i18n( "Could not convert value of setting '%1' to required type %2.", it
.key(), QVariant::typeToName( targetType
) ) );
144 arg
.convert( targetType
);
145 QDBusReply
<void> reply
= iface
.call( methodName
, arg
);
146 if ( !reply
.isValid() ) {
147 addFilterImportError( i18n( "Could not set setting '%1': %2", it
.key(), reply
.error().message() ) );
151 instance
.reconfigure();
154 addFilterImportError( i18n( "Resource setup completed." ) );
156 if ( job
->error() ) {
157 addFilterImportError( i18n( "Failed to create resource instance: %1", job
->errorText() ) );
163 void AbstractSettings::addFilterImportInfo( const QString
& log
)
165 mImportWizard
->importSettingPage()->addFilterImportInfo( log
);
168 void AbstractSettings::addFilterImportError( const QString
& log
)
170 mImportWizard
->importSettingPage()->addFilterImportError( log
);
174 QString
AbstractSettings::adaptFolder( const QString
& folder
)
177 bool exactPath
= false;
178 Akonadi::Collection::List lst
= FilterActionMissingCollectionDialog::potentialCorrectFolders( folder
, exactPath
);
179 if ( lst
.count() == 1 && exactPath
)
180 newFolder
= QString::number(lst
.at( 0 ).id());
182 FilterActionMissingCollectionDialog
*dlg
= new FilterActionMissingCollectionDialog( lst
, QString(), folder
);
184 newFolder
= QString::number(dlg
->selectedCollection().id());
191 #include "abstractsettings.moc"