[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdenetwork/kopete/protocols/wlm
From: Roman Jarosz <kedgedev () gmail ! com>
Date: 2009-05-31 22:42:36
Message-ID: 1243809756.049194.15844.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 976115 by rjarosz:
If we don't get emoticons in 5 seconds show the pending message otherwise we could \
wait forever. There's also a bug in libmsn which will be fixed in libmsn 4.0 beta6.
BUG: 181026
M +90 -78 wlmchatmanager.cpp
M +16 -2 wlmchatmanager.h
--- trunk/KDE/kdenetwork/kopete/protocols/wlm/wlmchatmanager.cpp #976114:976115
@@ -25,6 +25,7 @@
#include <QRegExp>
#include <QDomDocument>
#include <QTextDocument>
+#include <QTimerEvent>
#include <kconfig.h>
#include <kdebug.h>
@@ -50,9 +51,11 @@
#include "wlmprotocol.h"
#include "wlmaccount.h"
+const int EmoticonsTimeoutCheckInterval = 2; //seconds
+const int EmoticonsTimeoutThreshold = 5; //seconds
WlmChatManager::WlmChatManager (WlmAccount * account1):
-m_account (account1)
+m_account (account1), m_emoticonsTimeoutTimerId(0)
{
QObject::connect (&account ()->server ()->cb,
SIGNAL (messageReceived
@@ -356,37 +359,12 @@
newMessage->setForegroundColor (message.foregroundColor ());
newMessage->setDirection (Kopete::Message::Inbound);
- // stolen from msn plugin
- QMap<QString,QString>::ConstIterator it = chat->emoticonsList.constBegin();
- for(;it!=chat->emoticonsList.constEnd(); ++it)
+ if (!fillEmoticons(chat, newMessage))
{
- QString es=Qt::escape(it.key());
- QString message1=newMessage->escapedBody();
- if(message1.contains(es))
- {
- QFile f(it.value());
- if(!f.exists())
- {
- // an emoticon is still missing, so wait for it
- QLinkedList<Kopete::Message*> msgs = pendingMessages[conn];
- newMessage->setHtmlBody(message1);
- msgs.append(newMessage);
- pendingMessages[conn] = msgs;
- return;
- }
- QImage iconImage = QImageReader(it.value()).read();
-
- message1.replace( \
QRegExp(QString::fromLatin1("%1(?![^><]*>)").arg(QRegExp::escape(es))),
- QString::fromLatin1("<img align=\"center\" width=\"") +
- QString::number(iconImage.width()) +
- QString::fromLatin1("\" height=\"") +
- QString::number(iconImage.height()) +
- QString::fromLatin1("\" src=\"") + it.value() +
- QString::fromLatin1("\" title=\"") + es +
- QString::fromLatin1("\" alt=\"") + es +
- QString::fromLatin1( "\"/>" ) );
- newMessage->setHtmlBody(message1);
- }
+ pendingMessages[conn].append(PendingMessage(newMessage));
+ if (m_emoticonsTimeoutTimerId == 0)
+ m_emoticonsTimeoutTimerId = startTimer(EmoticonsTimeoutCheckInterval \
* 1000); + return;
}
// Add it to the manager
chat->appendMessage (*newMessage);
@@ -572,7 +550,6 @@
// track display pictures by SHA1D field
QString SHA1D = xmlobj.documentElement ().attribute ("SHA1D");
-
if (SHA1D.isEmpty ())
return;
@@ -608,58 +585,23 @@
chat->emoticonsList[alias] = file;
- if(pendingMessages[conn].isEmpty())
+ if(pendingMessages.value(conn).isEmpty())
return;
- // duplicate to avoid crashes when removing items in the next loop
- QLinkedList<Kopete::Message *> pendingMessages1 = pendingMessages[conn];
-
- QLinkedList<Kopete::Message *>::iterator it = pendingMessages1.begin();
- for(;it!=pendingMessages1.end(); ++it)
+ QMutableLinkedListIterator<PendingMessage> it(pendingMessages[conn]);
+ while (it.hasNext())
{
- Kopete::Message *message = (*it);
- QMap<QString,QString>::iterator it2 = chat->emoticonsList.begin();
- bool ok = true;
- // for each emoticon in our list
- for(;it2!=chat->emoticonsList.end(); ++it2)
+ PendingMessage pendingMsg = it.next();
+ if (fillEmoticons(chat, pendingMsg.message))
{
- QString es=Qt::escape(it2.key());
- QString message1=message->escapedBody();
- if(message1.contains(es))
- {
- QFile f(it2.value());
- if(!f.exists())
- {
- // an emoticon is still missing, so wait for it
- QLinkedList<Kopete::Message*> pmsgs = pendingMessages[conn];
- message->setHtmlBody(message1);
- pmsgs.removeOne((*it));
- pmsgs.append((*it));
- pendingMessages[conn] = pmsgs;
- ok = false;
- break;
- }
- QImage iconImage = QImageReader(it2.value()).read();
-
- message1.replace( \
QRegExp(QString::fromLatin1("%1(?![^><]*>)").arg(QRegExp::escape(es))),
- QString::fromLatin1("<img align=\"center\" width=\"") +
- QString::number(iconImage.width()) +
- QString::fromLatin1("\" height=\"") +
- QString::number(iconImage.height()) +
- QString::fromLatin1("\" src=\"") + it2.value() +
- QString::fromLatin1("\" title=\"") + es +
- QString::fromLatin1("\" alt=\"") + es +
- QString::fromLatin1( "\"/>" ) );
- message->setHtmlBody(message1);
- }
+ chat->appendMessage(*pendingMsg.message);
+ it.remove();
+ delete pendingMsg.message;
}
- if(ok)
- {
- chatSessions[conn]->appendMessage (*message);
- pendingMessages[conn].removeOne(message);
- delete message;
- }
}
+
+ if (pendingMessages.value(conn).isEmpty())
+ pendingMessages.remove(conn);
}
void
@@ -672,4 +614,74 @@
Q_UNUSED( file );
}
+void WlmChatManager::timerEvent(QTimerEvent *event)
+{
+ if (m_emoticonsTimeoutTimerId == event->timerId() )
+ {
+ QTime thresholdTime = \
QTime::currentTime().addSecs(-EmoticonsTimeoutThreshold); + \
QMutableMapIterator<MSN::SwitchboardServerConnection*, QLinkedList<PendingMessage> > \
connIt(pendingMessages); + while (connIt.hasNext())
+ {
+ connIt.next();
+
+ QMutableLinkedListIterator<PendingMessage> it(connIt.value());
+ while (it.hasNext())
+ {
+ PendingMessage pendingMsg = it.next();
+ if (pendingMsg.receiveTime < thresholdTime)
+ {
+ kDebug(14210) << "Did not get emoticons in time!";
+ WlmChatSession *chat = chatSessions[connIt.key()];
+ if (chat)
+ chat->appendMessage(*pendingMsg.message);
+
+ it.remove();
+ delete pendingMsg.message;
+ }
+ }
+ if (connIt.value().isEmpty())
+ connIt.remove();
+ }
+
+ if (pendingMessages.isEmpty())
+ {
+ killTimer(m_emoticonsTimeoutTimerId);
+ m_emoticonsTimeoutTimerId = 0;
+ }
+ }
+}
+
+bool WlmChatManager::fillEmoticons(WlmChatSession *chat, Kopete::Message* message)
+{
+ QString escapedMessage = message->escapedBody();
+
+ // for each emoticon in our list
+ QMap<QString,QString>::iterator it2 = chat->emoticonsList.begin();
+ for (;it2!=chat->emoticonsList.end(); ++it2)
+ {
+ QString es = Qt::escape(it2.key());
+ if (escapedMessage.contains(es))
+ {
+ if (!QFile::exists(it2.value()))
+ { // an emoticon is still missing, so wait for it
+ message->setHtmlBody(escapedMessage);
+ return false;
+ }
+
+ QImage iconImage = QImageReader(it2.value()).read();
+
+ escapedMessage.replace( \
QRegExp(QString::fromLatin1("%1(?![^><]*>)").arg(QRegExp::escape(es))), + \
QString::fromLatin1("<img align=\"center\" width=\"") + + \
QString::number(iconImage.width()) + + \
QString::fromLatin1("\" height=\"") + + \
QString::number(iconImage.height()) + + \
QString::fromLatin1("\" src=\"") + it2.value() + + \
QString::fromLatin1("\" title=\"") + es + + \
QString::fromLatin1("\" alt=\"") + es + + \
QString::fromLatin1( "\"/>" ) ); + }
+ }
+ message->setHtmlBody(escapedMessage);
+ return true;
+}
#include "wlmchatmanager.moc"
--- trunk/KDE/kdenetwork/kopete/protocols/wlm/wlmchatmanager.h #976114:976115
@@ -40,8 +40,17 @@
QMap < MSN::SwitchboardServerConnection *, WlmChatSession * >chatSessions;
// messages waiting for emoticons to be received
- QMap < MSN::SwitchboardServerConnection *, QLinkedList<Kopete::Message *> > \
pendingMessages; + class PendingMessage {
+ public:
+ PendingMessage( Kopete::Message* msg )
+ : receiveTime(QTime::currentTime()), message(msg)
+ {}
+ QTime receiveTime;
+ Kopete::Message* message;
+ };
+ QMap <MSN::SwitchboardServerConnection*, QLinkedList<PendingMessage> > \
pendingMessages; +
void requestDisplayPicture (QString contactId);
void createChat (MSN::SwitchboardServerConnection * conn);
@@ -106,8 +115,13 @@
const QString & alias,
const QString & msnobject);
- private:
+protected:
+ virtual void timerEvent(QTimerEvent *event);
+ bool fillEmoticons(WlmChatSession *chat, Kopete::Message* message);
+
+private:
WlmAccount * m_account;
+ int m_emoticonsTimeoutTimerId;
};
#endif
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic