Hi Pali
Following some comments on the branch.
I read the diff and wrote them in a train so it's rather brief ;-)
On a general note, anyc API in a loop of course sucks but it might still
worth trying to get rid of the nested event loops
Cheers,
Thomas
+
+namespace Common {
+
+PluginLoader::PluginLoader() : QObject(qApp)
+{
+++ // TODO: make more generic (pass plugin type as parameter)
+ m_preferedAddressbookPlugin =
QSettings().value(Common::SettingsNames::addressbookPlugin).toString();
+ m_preferedPasswordPlugin =
QSettings().value(Common::SettingsNames::passwordPlugin).toString();
+ m_pluginDirs =
QSettings().value(Common::SettingsNames::pluginDirs).toStringList();
+
+ reloadPlugins();
--
+ }
+}
+
+void PluginLoader::reloadPlugins()
+{
++++ // TODO allow reloading per plugin type
+ delete m_addressbook;
+ delete m_password;
+
+ unloadPlugin(m_addressbookLoader);
+ unloadPlugin(m_passwordLoader);
--
+ return m_availablePasswordPlugins;
+}
+
+QString PluginLoader::preferedAddressbookPlugin()
+{
+++ // TODO pass type here
+ return m_preferedAddressbookPlugin;
+}
+
+QString PluginLoader::preferedPasswordPlugin()
+{
--
Q_ASSERT(sender());
QLineEdit *toEdit = static_cast<QLineEdit*>(sender());
- QStringList contacts = m_mainWindow->addressBook()->complete(text,
QStringList(), m_completionCount);
+
+ AddressbookJob *job = m_completionRequests.take(toEdit);
+++ // TODO this can lead to a race where never ajob completes in time.
+++ // should check whether old jobs can still reasonably complete?
+ if (job) {
+ disconnect(job, 0, 0, 0);
+ job->stop();
+++ // TODO how do the get off the hash?
+ job->deleteLater();
+ }
+
+ AddressbookInterface *addressbook =
Common::PluginLoader::instance()->addressbook();
+ if (!addressbook || !(addressbook->features() &
AddressbookInterface::FeatureCompletion))
--
namespace Ui
{
@@ -103,6 +104,8 @@ private slots:
void setUiWidgetsEnabled(const bool enabled);
+++ // TODO completionDone
+ void completeDone(const NameList &completion = NameList());
+
private:
static QByteArray extractMailAddress(const QString &text, bool &ok);
static Composer::RecipientKind recipientKindForNextRow(const
Composer::RecipientKind kind);
@@ -152,6 +155,8 @@ private:
QLineEdit *m_completionReceiver;
int m_completionCount;
+++ // TODO QMap is gonna perform better here
+ QHash <QLineEdit *, AddressbookJob *> m_completionRequests;
+
ComposeWidget(const ComposeWidget &); // don't implement
ComposeWidget &operator=(const ComposeWidget &); // don't implement
--
+ if (addressbook && (addressbook->features() &
AddressbookInterface::FeaturePrettyNames)) {
+ AddressbookJob *job =
addressbook->requestPrettyNamesForAddress(addr.mailbox + QLatin1Char('@') +
addr.host);
+ if (job) {
+ // it is hard to port this method to new async interface,
so make use QPointer<QEventLoop> - this is hack but should work
+ QPointer<EnvelopeView> thisptr(this);
+++ // TODO no nested event loops
+ m_loop = new QEventLoop(this);
+ connect(job,
SIGNAL(prettyNamesForAddressAvailable(QStringList)), this,
SLOT(htmlizeAddressesAvailable(QStringList)));
+ connect(job, SIGNAL(error(AddressbookJob::Error)), this,
SLOT(htmlizeAddressesAvailable()));
+ job->setAutoDelete(true);
+ job->start();
--
- } else {
- setToolTip(link + tr("<hr/><b>Address Book:</b><br/>") +
identities);
+
+ AddressbookInterface *addressbook =
Common::PluginLoader::instance()->addressbook();
+ if (!addressbook || !(addressbook->features() &
AddressbookInterface::FeaturePrettyNames)) {
+++ // TODO have a fast string now and the special version later.
+ setToolTip(m_link);
+ return;
+ }
+
+ m_toolTipJob =
addressbook->requestPrettyNamesForAddress(addr.mailbox + QLatin1Char('@') +
addr.host);
--
+ return;
+ }
+
+ bool first = true;
+ QString identities;
+++ // TODO \n is pointless and last entry will have extra break. test
count()
+ Q_FOREACH(const QString &str, matchingIdentities) {
+ if (first)
+ first = false;
+ else
+ identities += QLatin1String("<br/>\n");
--
+++ b/src/Gui/EnvelopeView.h
@@ -24,6 +24,10 @@
#include <QModelIndex>
#include <QLabel>
+++ //TODO QWeakPointer
+#include <QPointer>
+
+class QEventLoop;
+class AddressbookJob;
--
#endif
+
+ saveSignalCount = 0;
+
+ connect(general, SIGNAL(saved()), this, SLOT(slotAccept()));
+++ // TODO prefix, not post
+ saveSignalCount++;
+ connect(imap, SIGNAL(saved()), this, SLOT(slotAccept()));
+ saveSignalCount++;
+ connect(cache, SIGNAL(saved()), this, SLOT(slotAccept()));
+ saveSignalCount++;
--
+
+void SettingsDialog::slotAccept()
+{
+ disconnect(sender(), SIGNAL(saved()), this, SLOT(slotAccept()));
+ saveSignalCount--;
+++ // TODO QT5, test isConnected
+ if (saveSignalCount > 0)
+ return;
QDialog::accept();
}
--
+
+ for (int i = 0; i < addressbookPlugins.size(); ++i) {
+ const QPair<QString, QString> &plugin = addressbookPlugins.at(i);
+ addressbookBox->addItem(plugin.first + QLatin1String(" - ") +
plugin.second, plugin.first);
+ if (addressbookPlugin == plugin.first)
+++ // TODO "addressbookIndex < 0 &&"
+ addressbookIndex = i;
+ }
+
+ for (int i = 0; i < passwordPlugins.size(); ++i) {
+ const QPair<QString, QString> &plugin = passwordPlugins.at(i);
+ passwordBox->addItem(plugin.first + QLatin1String(" - ") +
plugin.second, plugin.first);
+++ // TODO "addressbookIndex < 0 &&"
+ if (passwordIndex == plugin.first)
+ passwordIndex = i;
+ }
+
+ addressbookBox->addItem(tr("None - Disable addressbook"),
QLatin1String("None"));
--
- QSettings s;
- QString user = s.value(Common::SettingsNames::imapUserKey).toString();
- QString pass = s.value(Common::SettingsNames::imapPassKey).toString();
+ const QString &user =
QSettings().value(Common::SettingsNames::imapUserKey).toString();
+
+++ // TODO cache the password?
+ PasswordInterface *password =
Common::PluginLoader::instance()->password();
+ if (password) {
+ PasswordJob *job = password->requestPassword(user, "imap");
+ if (job) {
+ connect(job, SIGNAL(passwordAvailable(QString)), this,
SLOT(authenticationContinue(QString)));
--
+void TrojitaPluginJob::start()
+{
+ if (m_running)
+ return;
+ m_running = true;
+++ // TODO QMetaObject::invokeMethod
+ QTimer::singleShot(0, this, SLOT(doStart()));
+}
+
+void TrojitaPluginJob::stop()
+{
+ if (!m_running)
+ return;
+++ // TODO QMetaObject::invokeMethod
+ QTimer::singleShot(0, this, SLOT(doStop()));
+}
+
+bool TrojitaPluginJob::autoDelete()
+{
--
+
+protected:
+ TrojitaPluginJob(QObject *parent);
+
+protected slots:
+++ // TODO slots don't have to be virtual
+ /** @short Reimplement starting job */
+ virtual void doStart() = 0;
+
+ /** @short Reimplement stopping job */
+ virtual void doStop() = 0;
--
+ PasswordJob *job = password->requestPassword(user, "smtp");
+ if (!job)
+ return;
+
+ QPointer<SMTP> thisptr(this);
+++ // TODO nonononono ;-P
+ loop = new QEventLoop(this);
+
+ connect(job, SIGNAL(passwordAvailable(QString)), this,
SLOT(gotPassword(QString)));
+ connect(job, SIGNAL(error(PasswordJob::Error)), this,
SLOT(gotPassword()));
+
--
+
+void KDEAddressbook::openContactWindow(const QString &email, const QString
&displayName)
+{
+ // check if running: qdbus org.kde.kaddressbook
+ // if not start: kaddressbook
+++ // TODO this *severely* blocks! process starting and dbus
introspection
+ if
(!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kaddressbook").value())
+ {
+ if (QProcess::execute("kaddressbook") != 0)
+ return;
+ }
+
+++ // TODO forking can take time and this might fail
+ if
(!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kaddressbook").value())
+ return;
+
+ QDBusInterface ifaceIntrospect("org.kde.kaddressbook",
"/KAddressBook", "org.freedesktop.DBus.Introspectable");
+
--
+ return;
+ }
+ m_isOpening = true;
+ delete m_wallet;
+ // TODO: How to tell application name??
+++ // TODO fixed string - the information is worthless anyway and the
dialog to be removed
+ m_wallet =
KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(), 0,
KWallet::Wallet::Asynchronous);
+ connect(m_wallet, SIGNAL(walletOpened(bool)), this,
SLOT(walletOpened(bool)));
+}
+
+void KWalletManager::walletOpened(bool opened)
--
+
+class NullAddressbookCompletionJob : public AddressbookCompletionJob
+{
+ Q_OBJECT
+
+++ // TODO make abook internal to support overlay and merge? - drop this
one in case
+public:
+ NullAddressbookCompletionJob(const QString &, const QStringList &,
int, QObject *parent) : AddressbookCompletionJob(parent) {}
+
+public slots:
+ virtual void doStart()