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()

Reply via email to