Bug 127016

Summary: display name bugs in chat windows when using msn
Product: [Unmaintained] kopete Reporter: lancelot <lancelot_pro>
Component: Chat WindowAssignee: Kopete Developers <kopete-bugs-null>
Status: RESOLVED FIXED    
Severity: normal    
Priority: NOR    
Version First Reported In: unspecified   
Target Milestone: ---   
Platform: unspecified   
OS: Linux   
Latest Commit: Version Fixed In:
Sentry Crash Report:

Description lancelot 2006-05-09 15:32:32 UTC
Version:           0.10.4 (using KDE KDE 3.4.3)
Installed from:    I Don't Know
OS:                Linux

i've noticed that when talking to somebody whose display name is included in your own display name, my display name doesn't display correctly.

eg:
im' talking to somebody called "juliet" (as display name) and my display name is "romeo - juliet i love you" then it will display something like : 
juliet i love you (lancelotdm@gmail.com)" dir="ltr"> romeo - juliet i love you

I've had this bug while talking to somebody using original msn messenger and also somebody using kopete. The bugs also occurs if the display name is longer and contains spaces.
Comment 1 Olivier Goffart 2006-05-13 12:35:27 UTC
bug in   includenickslink
Comment 2 Olivier Goffart 2006-06-21 00:19:38 UTC
SVN commit 553398 by ogoffart:

Remove the addNickLinks function,  it was completelly wrong and bugged 
(i don't want to insult his author of course)

add the link at the source instead.

BUG: 127780
BUG: 127016





 M  +22 -48    chatmessagepart.cpp  
 M  +1 -3      chatmessagepart.h  


--- branches/kopete/0.12/kopete/kopete/chatwindow/chatmessagepart.cpp #553397:553398
@@ -34,6 +34,7 @@
 #include <qregexp.h>
 #include <qvaluelist.h>
 #include <qtimer.h>
+#include <qstylesheet.h>
 
 // KHTML::DOM includes
 #include <dom/dom_doc.h>
@@ -547,40 +548,6 @@
 #endif
 }
 
-const QString ChatMessagePart::addNickLinks( const QString &html ) const
-{
-	QString retVal = html;
-
-	Kopete::ContactPtrList members = d->manager->members();
-	for ( QPtrListIterator<Kopete::Contact> it( members ); it.current(); ++it )
-	{
-		QString nick = (*it)->property( Kopete::Global::Properties::self()->nickName().key() ).value().toString();
-		//FIXME: this is really slow in channels with lots of contacts
-		QString parsed_nick = Kopete::Emoticons::parseEmoticons( nick );
-
-		if ( nick != parsed_nick )
-		{
-			retVal.replace( QRegExp( QString::fromLatin1("([\\s&;>])%1([\\s&;<:])")
-					.arg( QRegExp::escape( parsed_nick ) )  ), QString::fromLatin1("\\1%1\\2").arg( nick ) );
-		}
-		if ( nick.length() > 0 && ( retVal.find( nick ) > -1 ) && d->manager->protocol() )
-		{
-			retVal.replace(
-				QRegExp( QString::fromLatin1("([\\s&;>])(%1)([\\s&;<:])")
-					.arg( QRegExp::escape( nick ) )  ),
-			QString::fromLatin1("\\1<a href=\"kopetemessage://%1/?protocolId=%2&accountId=%3\" class=\"KopeteDisplayName\">\\2</a>\\3")
-				.arg( (*it)->contactId(), d->manager->protocol()->pluginId(), d->manager->account()->accountId() )
-			);
-		}
-	}
-#if 0  //disabled because it causes crash on exit  - Olivier 2006-03-31
-	QString nick = d->manager->myself()->property( Kopete::Global::Properties::self()->nickName().key() ).value().toString();
-	retVal.replace( QRegExp( QString::fromLatin1("([\\s&;>])%1([\\s&;<:])")
-			.arg( QRegExp::escape( Kopete::Emoticons::parseEmoticons( nick ) ) )  ), QString::fromLatin1("\\1%1\\2").arg( nick ) );
-#endif
-	return retVal;
-}
-
 void ChatMessagePart::slotRefreshView()
 {
 	DOM::HTMLElement kopeteNode = document().getElementById( QString::fromUtf8("KopeteStyle") );
@@ -954,10 +921,11 @@
 }
 
 // Style formatting for messages(incoming, outgoing, status)
-QString ChatMessagePart::formatStyleKeywords( const QString &sourceHTML, Kopete::Message &message )
+QString ChatMessagePart::formatStyleKeywords( const QString &sourceHTML, const Kopete::Message &_message )
 {
+	Kopete::Message message=_message; //we will eventually need to modify it before showing it.
 	QString resultHTML = sourceHTML;
-	QString nick, contactId, service, protocolIcon;
+	QString nick, contactId, service, protocolIcon, nickLink;
 	
 	if( message.from() )
 	{
@@ -988,18 +956,28 @@
 		}
 
 		protocolIcon = KGlobal::iconLoader()->iconPath( iconName, KIcon::Small );
+		
+		nickLink=QString::fromLatin1("<a href=\"kopetemessage://%1/?protocolId=%2&amp;accountId=%3\" class=\"KopeteDisplayName\">")
+				.arg( QStyleSheet::escape(message.from()->contactId()).replace('"',"&quot;"),
+					  QStyleSheet::escape(message.from()->protocol()->pluginId()).replace('"',"&quot;"), 
+					  QStyleSheet::escape(message.from()->account()->accountId() ).replace('"',"&quot;"));
 	}
+	else
+	{
+		nickLink="<a>";
+	}
 	
+	
 	// Replace sender (contact nick)
-	resultHTML = resultHTML.replace( QString::fromUtf8("%sender%"), nick );
+	resultHTML = resultHTML.replace( QString::fromUtf8("%sender%"), nickLink+nick+"</a>" );
 	// Replace time, by default display only time and display seconds(that was true means).
 	resultHTML = resultHTML.replace( QString::fromUtf8("%time%"), KGlobal::locale()->formatTime(message.timestamp().time(), true) );
 	// Replace %screenName% (contact ID)
-	resultHTML = resultHTML.replace( QString::fromUtf8("%senderScreenName%"), contactId );
+	resultHTML = resultHTML.replace( QString::fromUtf8("%senderScreenName%"), nickLink+QStyleSheet::escape(contactId)+"</a>" );
 	// Replace service name (protocol name)
-	resultHTML = resultHTML.replace( QString::fromUtf8("%service%"), service );
+	resultHTML = resultHTML.replace( QString::fromUtf8("%service%"), QStyleSheet::escape(service) );
 	// Replace protocolIcon (sender statusIcon)
-	resultHTML = resultHTML.replace( QString::fromUtf8("%senderStatusIcon%"), protocolIcon );
+	resultHTML = resultHTML.replace( QString::fromUtf8("%senderStatusIcon%"), QStyleSheet::escape(protocolIcon).replace('"',"&quot;") );
 	
 	// Look for %time{X}%
 	QRegExp timeRegExp("%time\\{([^}]*)\\}%");
@@ -1062,13 +1040,9 @@
 	{
 		kdDebug(14000) << k_funcinfo << "Map Action message to Status template. " << endl;
 
-		QString boldNick = QString::fromUtf8("<b>%1</b> ").arg(nick);
-		// Don't set the body twice.
-		if( !message.parsedBody().contains(boldNick) )
-		{
-			QString newBody = boldNick + message.parsedBody();
-			message.setBody(newBody, Kopete::Message::ParsedHTML );
-		}
+		QString boldNick = QString::fromUtf8("%1<b>%2</b></a> ").arg(nickLink,nick);
+		QString newBody = boldNick + message.parsedBody();
+		message.setBody(newBody, Kopete::Message::ParsedHTML );
 	}
 
 	// Set message direction("rtl"(Right-To-Left) or "ltr"(Left-to-right))
@@ -1109,7 +1083,7 @@
 	resultHTML = resultHTML.replace( QString::fromUtf8("%message%"), formatMessageBody(message) );
 
 	// TODO: %status
-	resultHTML = addNickLinks( resultHTML );
+//	resultHTML = addNickLinks( resultHTML );
 	return resultHTML;
 }
 
--- branches/kopete/0.12/kopete/kopete/chatwindow/chatmessagepart.h #553397:553398
@@ -171,8 +171,6 @@
 
 	const QString styleHTML() const;
 
-	const QString addNickLinks( const QString &html ) const;
-
 	Kopete::Contact *contactFromNode( const DOM::Node &n ) const;
 
 	/**
@@ -194,7 +192,7 @@
 	 * 
 	 * @return the resulting HTML with replaced keywords.
 	 */
-	QString formatStyleKeywords( const QString &sourceHTML, Kopete::Message &message );
+	QString formatStyleKeywords( const QString &sourceHTML, const Kopete::Message &message );
 	/**
 	 * Format(replace) style keywords for header and footers.
 	 * For messages, use formatStyleKeywords(const QString &sourceHTML, Kopete::Message &message)  instead.