Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gajim/chat_control.py49
-rw-r--r--gajim/chat_control_base.py26
-rw-r--r--gajim/common/app.py1
-rw-r--r--gajim/common/caps_cache.py4
-rw-r--r--gajim/common/config.py3
-rw-r--r--gajim/common/connection.py33
-rw-r--r--gajim/common/connection_handlers_events.py2
-rw-r--r--gajim/common/events.py3
-rw-r--r--gajim/common/helpers.py2
-rw-r--r--gajim/common/modules/message.py4
-rw-r--r--gajim/common/modules/misc.py12
-rw-r--r--gajim/common/zeroconf/connection_handlers_zeroconf.py2
-rw-r--r--gajim/conversation_textview.py10
-rw-r--r--gajim/data/gui/preferences_window.ui3
-rw-r--r--gajim/groupchat_control.py49
-rw-r--r--gajim/gtk/history.py8
-rw-r--r--gajim/gtk/htmltextview.py7
-rw-r--r--gajim/gtk/preferences.py5
-rw-r--r--gajim/message_textview.py4
-rw-r--r--gajim/remote_control.py4
-rw-r--r--gajim/session.py21
-rw-r--r--test/no_gui/unit/test_caps_cache.py6
22 files changed, 145 insertions, 113 deletions
diff --git a/gajim/chat_control.py b/gajim/chat_control.py
index 2c79ba904..80e7ea075 100644
--- a/gajim/chat_control.py
+++ b/gajim/chat_control.py
@@ -34,7 +34,7 @@ from gi.repository import Gio
from gi.repository import Pango
from gi.repository import GLib
from gi.repository import Gdk
-from nbxmpp.protocol import NS_XHTML, NS_XHTML_IM, NS_FILE, NS_MUC
+from nbxmpp.protocol import NS_XHTML_IM, NS_FILE, NS_MUC
from nbxmpp.protocol import NS_JINGLE_RTP_AUDIO, NS_JINGLE_RTP_VIDEO
from nbxmpp.protocol import NS_JINGLE_ICE_UDP, NS_JINGLE_FILE_TRANSFER_5
@@ -824,7 +824,6 @@ class ChatControl(ChatControlBase):
typ,
tim=obj.properties.timestamp,
subject=obj.properties.subject,
- xhtml=obj.xhtml,
displaymarking=obj.displaymarking,
msg_log_id=obj.msg_log_id,
message_id=obj.properties.id,
@@ -861,11 +860,13 @@ class ChatControl(ChatControlBase):
gtkgui_helpers.remove_css_class(
self.msg_textview, 'gajim-msg-correcting')
- self.add_message(obj.message, self.contact.jid, tim=obj.timestamp,
- xhtml=obj.xhtml,
- displaymarking=displaymarking, message_id=message_id,
- correct_id=obj.correct_id,
- additional_data=obj.additional_data)
+ self.add_message(obj.message,
+ self.contact.jid,
+ tim=obj.timestamp,
+ displaymarking=displaymarking,
+ message_id=message_id,
+ correct_id=obj.correct_id,
+ additional_data=obj.additional_data)
def send_message(self, message, xhtml=None,
process_commands=True, attention=False):
@@ -894,10 +895,17 @@ class ChatControl(ChatControlBase):
def get_our_nick(self):
return app.nicks[self.account]
- def add_message(self, text, frm='', tim=None,
- subject=None, xhtml=None,
- displaymarking=None, msg_log_id=None, correct_id=None,
- message_id=None, additional_data=None, error=None):
+ def add_message(self,
+ text,
+ frm='',
+ tim=None,
+ subject=None,
+ displaymarking=None,
+ msg_log_id=None,
+ correct_id=None,
+ message_id=None,
+ additional_data=None,
+ error=None):
"""
Print a line in the conversation
@@ -930,7 +938,7 @@ class ChatControl(ChatControlBase):
name = self.get_our_nick()
ChatControlBase.add_message(self, text, kind, name, tim,
- subject=subject, old_kind=self.old_msg_kind, xhtml=xhtml,
+ subject=subject, old_kind=self.old_msg_kind,
displaymarking=displaymarking,
msg_log_id=msg_log_id, message_id=message_id,
correct_id=correct_id, additional_data=additional_data,
@@ -1246,9 +1254,6 @@ class ChatControl(ChatControlBase):
tim = float(row.time)
- xhtml = None
- if msg.startswith('<body '):
- xhtml = msg
if row.subject:
msg = _('Subject: %(subject)s\n%(message)s') % \
{'subject': row.subject, 'message': msg}
@@ -1259,7 +1264,6 @@ class ChatControl(ChatControlBase):
tim,
restored=True,
old_kind=local_old_kind,
- xhtml=xhtml,
additional_data=additional_data,
message_id=row.message_id,
marker=row.marker,
@@ -1289,11 +1293,14 @@ class ChatControl(ChatControlBase):
kind = 'print_queue'
if event.sent_forwarded:
kind = 'out'
- self.add_message(event.message, kind, tim=event.time,
- subject=event.subject,
- xhtml=event.xhtml, displaymarking=event.displaymarking,
- correct_id=event.correct_id, message_id=event.message_id,
- additional_data=event.additional_data)
+ self.add_message(event.message,
+ kind,
+ tim=event.time,
+ subject=event.subject,
+ displaymarking=event.displaymarking,
+ correct_id=event.correct_id,
+ message_id=event.message_id,
+ additional_data=event.additional_data)
if isinstance(event.msg_log_id, int):
message_ids.append(event.msg_log_id)
diff --git a/gajim/chat_control_base.py b/gajim/chat_control_base.py
index d4917ac28..cd454ae62 100644
--- a/gajim/chat_control_base.py
+++ b/gajim/chat_control_base.py
@@ -907,12 +907,22 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools):
chatstate = con.get_module('Chatstate').get_active_chatstate(
self.contact)
- app.nec.push_outgoing_event(MessageOutgoingEvent(None,
- account=self.account, jid=self.contact.jid, message=message,
- type_=type_, chatstate=chatstate,
- resource=resource, user_nick=self.user_nick, xhtml=xhtml,
- label=label, control=self, attention=attention, correct_id=correct_id,
- automatic_message=False, encryption=self.encryption))
+ event = MessageOutgoingEvent(None,
+ account=self.account,
+ jid=self.contact.jid,
+ message=message,
+ type_=type_,
+ chatstate=chatstate,
+ resource=resource,
+ user_nick=self.user_nick,
+ label=label,
+ control=self,
+ attention=attention,
+ correct_id=correct_id,
+ automatic_message=False,
+ encryption=self.encryption)
+ event.additional_data.set_value('gajim', 'xhtml', xhtml)
+ app.nec.push_outgoing_event(event)
# Record the history of sent messages
self.save_message(message, 'sent')
@@ -988,7 +998,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools):
def add_message(self, text, kind, name, tim,
other_tags_for_name=None, other_tags_for_time=None,
other_tags_for_text=None, restored=False, subject=None,
- old_kind=None, xhtml=None,
+ old_kind=None,
displaymarking=None, msg_log_id=None,
message_id=None, correct_id=None, additional_data=None,
marker=None, error=None):
@@ -1014,7 +1024,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools):
textview.print_conversation_line(text, kind, name, tim,
other_tags_for_name, other_tags_for_time, other_tags_for_text,
- subject, old_kind, xhtml,
+ subject, old_kind,
displaymarking=displaymarking, message_id=message_id,
correct_id=correct_id, additional_data=additional_data,
marker=marker, error=error)
diff --git a/gajim/common/app.py b/gajim/common/app.py
index 017b75410..08b06c362 100644
--- a/gajim/common/app.py
+++ b/gajim/common/app.py
@@ -165,6 +165,7 @@ gajim_common_features = [
nbxmpp.NS_CONFERENCE,
nbxmpp.NS_CORRECT,
nbxmpp.NS_EME,
+ nbxmpp.NS_XHTML_IM,
nbxmpp.NS_HASHES_2,
nbxmpp.NS_HASHES_MD5,
nbxmpp.NS_HASHES_SHA1,
diff --git a/gajim/common/caps_cache.py b/gajim/common/caps_cache.py
index f61524213..77a0ee164 100644
--- a/gajim/common/caps_cache.py
+++ b/gajim/common/caps_cache.py
@@ -29,11 +29,11 @@ through ClientCaps objects which are hold by contact instances.
import logging
-from nbxmpp import (NS_XHTML_IM, NS_ESESSION, NS_CHATSTATES,
+from nbxmpp import (NS_ESESSION, NS_CHATSTATES,
NS_JINGLE_ICE_UDP, NS_JINGLE_RTP_AUDIO, NS_JINGLE_RTP_VIDEO,
NS_JINGLE_FILE_TRANSFER_5)
# Features where we cannot safely assume that the other side supports them
-FEATURE_BLACKLIST = [NS_CHATSTATES, NS_XHTML_IM, NS_ESESSION,
+FEATURE_BLACKLIST = [NS_CHATSTATES, NS_ESESSION,
NS_JINGLE_ICE_UDP, NS_JINGLE_RTP_AUDIO, NS_JINGLE_RTP_VIDEO,
NS_JINGLE_FILE_TRANSFER_5]
diff --git a/gajim/common/config.py b/gajim/common/config.py
index 53f9a3d45..4273f6dbb 100644
--- a/gajim/common/config.py
+++ b/gajim/common/config.py
@@ -109,7 +109,7 @@ class Config:
'sort_by_show_in_roster': [opt_bool, True, '', True],
'sort_by_show_in_muc': [opt_bool, False, '', True],
'use_speller': [opt_bool, False, ],
- 'ignore_incoming_xhtml': [opt_bool, False, ],
+ 'show_xhtml': [opt_bool, True, ],
'speller_language': [opt_str, '', _('Language used for spell checking.')],
'print_time': [opt_str, 'always', _('\'always\' - print time for every message.\n\'sometimes\' - print time every print_ichat_every_foo_minutes minute.\n\'never\' - never print time.')],
'emoticons_theme': [opt_str, 'noto-emoticons', '', True],
@@ -224,7 +224,6 @@ class Config:
'print_join_left_default': [opt_bool, False, _('Default Setting: Show a status message for every join or leave in a group chat.')],
'print_status_muc_default': [opt_bool, False, _('Default Setting: Show a status message for all status changes (away, dnd, etc.) of users in a group chat.')],
'log_contact_status_changes': [opt_bool, False],
- 'log_xhtml_messages': [opt_bool, False, _('Store XHTML messages in chat history instead of plain text messages.')],
'roster_window_skip_taskbar': [opt_bool, False, _('Don\'t show contact list window in the system taskbar.')],
'use_urgency_hint': [opt_bool, True, _('If enabled, Gajim makes the window flash (the default behaviour in most Window Managers) when holding pending events.')],
'notification_timeout': [opt_int, 5],
diff --git a/gajim/common/connection.py b/gajim/common/connection.py
index 9e5c1e09d..50d7d7d65 100644
--- a/gajim/common/connection.py
+++ b/gajim/common/connection.py
@@ -210,16 +210,22 @@ class CommonConnection:
else:
fjid = obj.get_full_jid()
+ xhtml = obj.additional_data.get_value('gajim', 'xhtml', None)
+
if obj.type_ == 'chat':
- msg_iq = nbxmpp.Message(body=obj.message, typ=obj.type_,
- xhtml=obj.xhtml)
+ msg_iq = nbxmpp.Message(body=obj.message,
+ typ=obj.type_,
+ xhtml=xhtml)
else:
if obj.subject:
- msg_iq = nbxmpp.Message(body=obj.message, typ='normal',
- subject=obj.subject, xhtml=obj.xhtml)
+ msg_iq = nbxmpp.Message(body=obj.message,
+ typ='normal',
+ subject=obj.subject,
+ xhtml=xhtml)
else:
- msg_iq = nbxmpp.Message(body=obj.message, typ='normal',
- xhtml=obj.xhtml)
+ msg_iq = nbxmpp.Message(body=obj.message,
+ typ='normal',
+ xhtml=xhtml)
if obj.correct_id:
msg_iq.setTag('replace', attrs={'id': obj.correct_id},
@@ -324,13 +330,13 @@ class CommonConnection:
if not app.config.should_log(self.name, jid):
return
- if obj.xhtml and app.config.get('log_xhtml_messages'):
- obj.message = '<body xmlns="%s">%s</body>' % (nbxmpp.NS_XHTML,
- obj.xhtml)
if obj.message is None:
return
- app.logger.insert_into_logs(self.name, jid, obj.timestamp, obj.kind,
+ app.logger.insert_into_logs(self.name,
+ jid,
+ obj.timestamp,
+ obj.kind,
message=obj.message,
subject=obj.subject,
additional_data=obj.additional_data,
@@ -1619,8 +1625,11 @@ class Connection(CommonConnection, ConnectionHandlers):
if not app.account_is_connected(self.name):
return
- msg_iq = nbxmpp.Message(obj.jid, obj.message, typ='groupchat',
- xhtml=obj.xhtml)
+ xhtml = obj.additional_data.get_value('gajim', 'xhtml', None)
+ msg_iq = nbxmpp.Message(obj.jid,
+ obj.message,
+ typ='groupchat',
+ xhtml=xhtml)
obj.stanza_id = self.connection.getAnID()
msg_iq.setID(obj.stanza_id)
diff --git a/gajim/common/connection_handlers_events.py b/gajim/common/connection_handlers_events.py
index cb81f1faf..69e11eab5 100644
--- a/gajim/common/connection_handlers_events.py
+++ b/gajim/common/connection_handlers_events.py
@@ -578,7 +578,6 @@ class MessageOutgoingEvent(nec.NetworkOutgoingEvent):
self.stanza_id = None
self.resource = None
self.user_nick = None
- self.xhtml = None
self.label = None
self.session = None
self.delayed = None
@@ -620,7 +619,6 @@ class GcMessageOutgoingEvent(nec.NetworkOutgoingEvent):
self.additional_data = AdditionalDataDict()
self.message = ''
self.chatstate = None
- self.xhtml = None
self.stanza_id = None
self.label = None
self.callback = None
diff --git a/gajim/common/events.py b/gajim/common/events.py
index 0174f2694..5da6cd015 100644
--- a/gajim/common/events.py
+++ b/gajim/common/events.py
@@ -62,7 +62,7 @@ class Event:
class ChatEvent(Event):
type_ = 'chat'
def __init__(self, message, subject, kind, time_, resource,
- msg_log_id, correct_id=None, message_id=None, xhtml=None, session=None,
+ msg_log_id, correct_id=None, message_id=None, session=None,
displaymarking=None, sent_forwarded=False, show_in_roster=False,
show_in_systray=True, additional_data=None):
Event.__init__(self, time_, show_in_roster=show_in_roster,
@@ -75,7 +75,6 @@ class ChatEvent(Event):
self.msg_log_id = msg_log_id
self.message_id = message_id
self.correct_id = correct_id
- self.xhtml = xhtml
self.session = session
self.displaymarking = displaymarking
self.sent_forwarded = sent_forwarded
diff --git a/gajim/common/helpers.py b/gajim/common/helpers.py
index 7c070ede5..eae11e7b1 100644
--- a/gajim/common/helpers.py
+++ b/gajim/common/helpers.py
@@ -1091,8 +1091,6 @@ def update_optional_features(account=None):
features.append(nbxmpp.NS_BOOKMARKS_2 + '+notify')
elif app.connections[account_].get_module('Bookmarks').using_bookmark_1:
features.append(nbxmpp.NS_BOOKMARKS + '+notify')
- if not app.config.get('ignore_incoming_xhtml'):
- features.append(nbxmpp.NS_XHTML_IM)
if app.is_installed('FARSTREAM'):
features.append(nbxmpp.NS_JINGLE_RTP)
features.append(nbxmpp.NS_JINGLE_RTP_AUDIO)
diff --git a/gajim/common/modules/message.py b/gajim/common/modules/message.py
index bf19c55fb..6c3b76d2b 100644
--- a/gajim/common/modules/message.py
+++ b/gajim/common/modules/message.py
@@ -160,7 +160,7 @@ class Message(BaseModule):
'gajim', 'user_timestamp', properties.user_timestamp)
parse_oob(properties, additional_data)
- xhtml = parse_xhtml(properties)
+ parse_xhtml(properties, additional_data)
app.nec.push_incoming_event(NetworkEvent('update-client-info',
account=self._account,
@@ -188,7 +188,6 @@ class Message(BaseModule):
'session': session,
'delayed': properties.user_timestamp is not None,
'gc_control': gc_control,
- 'xhtml': xhtml,
'popup': False,
'msg_log_id': None,
'displaymarking': parse_securitylabel(stanza),
@@ -202,7 +201,6 @@ class Message(BaseModule):
event_attr.update({
'room_jid': jid,
'nickname': resource,
- 'xhtml_msgtxt': xhtml,
'nick': resource or '',
})
event = NetworkEvent('gc-message-received', **event_attr)
diff --git a/gajim/common/modules/misc.py b/gajim/common/modules/misc.py
index a8d8b65e6..5d8c8154e 100644
--- a/gajim/common/modules/misc.py
+++ b/gajim/common/modules/misc.py
@@ -16,7 +16,7 @@
import logging
-from gajim.common import app
+from gajim.common.i18n import get_rfc5646_lang
log = logging.getLogger('gajim.c.m.misc')
@@ -43,7 +43,9 @@ def parse_correction(properties):
# XEP-0071: XHTML-IM
-def parse_xhtml(properties):
- if app.config.get('ignore_incoming_xhtml'):
- return None
- return properties.xhtml
+def parse_xhtml(properties, additional_data):
+ if not properties.has_xhtml:
+ return
+
+ body = properties.xhtml.get_body(get_rfc5646_lang())
+ additional_data.set_value('gajim', 'xhtml', body)
diff --git a/gajim/common/zeroconf/connection_handlers_zeroconf.py b/gajim/common/zeroconf/connection_handlers_zeroconf.py
index d081329c6..eb5cb6df9 100644
--- a/gajim/common/zeroconf/connection_handlers_zeroconf.py
+++ b/gajim/common/zeroconf/connection_handlers_zeroconf.py
@@ -82,6 +82,7 @@ class ConnectionHandlersZeroconf(connection_handlers.ConnectionHandlersBase):
additional_data = AdditionalDataDict()
parse_oob(properties, additional_data)
+ parse_xhtml(properties, additional_data)
if properties.is_encrypted:
additional_data['encrypted'] = properties.encrypted.additional_data
@@ -103,7 +104,6 @@ class ConnectionHandlersZeroconf(connection_handlers.ConnectionHandlersBase):
'msgtxt': msgtxt,
'session': session,
'gc_control': None,
- 'xhtml': parse_xhtml(properties),
'popup': False,
'msg_log_id': None,
'displaymarking': None,
diff --git a/gajim/conversation_textview.py b/gajim/conversation_textview.py
index 1c7627d29..52cb2d5b4 100644
--- a/gajim/conversation_textview.py
+++ b/gajim/conversation_textview.py
@@ -913,7 +913,7 @@ class ConversationTextview(GObject.GObject):
def print_conversation_line(self, text, kind, name, tim,
other_tags_for_name=None, other_tags_for_time=None, other_tags_for_text=None,
- subject=None, old_kind=None, xhtml=None, graphics=True,
+ subject=None, old_kind=None, graphics=True,
displaymarking=None, message_id=None, correct_id=None, additional_data=None,
marker=None, error=None):
"""
@@ -1028,7 +1028,7 @@ class ConversationTextview(GObject.GObject):
self.print_subject(subject, iter_=iter_)
- iter_ = self.print_real_text(text, text_tags, name, xhtml, graphics=graphics,
+ iter_ = self.print_real_text(text, text_tags, name, graphics=graphics,
mark=insert_mark, additional_data=additional_data)
message_icons = MessageIcons()
@@ -1256,7 +1256,7 @@ class ConversationTextview(GObject.GObject):
buffer_.insert(end_iter, subject)
self.print_empty_line(end_iter)
- def print_real_text(self, text, text_tags=None, name=None, xhtml=None,
+ def print_real_text(self, text, text_tags=None, name=None,
graphics=True, mark=None, additional_data=None):
"""
Add normal and special text. call this to add text
@@ -1270,7 +1270,9 @@ class ConversationTextview(GObject.GObject):
iter_ = buffer_.get_end_iter()
else:
iter_ = buffer_.get_iter_at_mark(mark)
- if xhtml:
+
+ xhtml = additional_data.get_value('gajim', 'xhtml', False)
+ if xhtml and app.config.get('show_xhtml'):
try:
if name and (text.startswith('/me ') or text.startswith('/me\n')):
xhtml = xhtml.replace('/me', '<i>* %s</i>' % (name,), 1)
diff --git a/gajim/data/gui/preferences_window.ui b/gajim/data/gui/preferences_window.ui
index a587a37e9..ee002ccc9 100644
--- a/gajim/data/gui/preferences_window.ui
+++ b/gajim/data/gui/preferences_window.ui
@@ -673,11 +673,10 @@
</child>
<child>
<object class="GtkCheckButton" id="xhtml_checkbutton">
- <property name="label" translatable="yes">_Ignore formatting of incoming messages</property>
+ <property name="label" translatable="yes">_Show XHTML formatting</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">Some messages may include rich content (xhtml formatting, colors etc). If checked, Gajim will just display the plain message text.</property>
<property name="halign">start</property>
<property name="use_underline">True</property>
<property name="draw_indicator">True</property>
diff --git a/gajim/groupchat_control.py b/gajim/groupchat_control.py
index 0adce63b2..335d03f13 100644
--- a/gajim/groupchat_control.py
+++ b/gajim/groupchat_control.py
@@ -832,7 +832,6 @@ class GroupchatControl(ChatControlBase):
# message from server
self.add_message(obj.msgtxt,
tim=obj.properties.timestamp,
- xhtml=obj.xhtml_msgtxt,
displaymarking=obj.displaymarking,
additional_data=obj.additional_data)
else:
@@ -841,16 +840,14 @@ class GroupchatControl(ChatControlBase):
self.add_message(obj.msgtxt,
contact=obj.nick,
tim=obj.properties.timestamp,
- xhtml=obj.xhtml_msgtxt,
displaymarking=obj.displaymarking,
correct_id=obj.correct_id,
message_id=obj.properties.id,
additional_data=obj.additional_data)
obj.needs_highlight = self.needs_visual_notification(obj.msgtxt)
- def on_private_message(self, nick, sent, msg, tim, xhtml, session,
- msg_log_id=None,
- displaymarking=None):
+ def on_private_message(self, nick, sent, msg, tim, session, additional_data,
+ msg_log_id=None, displaymarking=None):
# Do we have a queue?
fjid = self.room_jid + '/' + nick
@@ -860,10 +857,10 @@ class GroupchatControl(ChatControlBase):
tim,
'',
msg_log_id,
- xhtml=xhtml,
session=session,
displaymarking=displaymarking,
- sent_forwarded=sent)
+ sent_forwarded=sent,
+ additional_data=additional_data)
app.events.add_event(self.account, fjid, event)
autopopup = app.config.get('autopopup')
@@ -882,7 +879,7 @@ class GroupchatControl(ChatControlBase):
if contact:
app.interface.roster.draw_contact(self.room_jid, self.account)
- def add_message(self, text, contact='', tim=None, xhtml=None,
+ def add_message(self, text, contact='', tim=None,
displaymarking=None, correct_id=None, message_id=None,
additional_data=None):
"""
@@ -923,12 +920,18 @@ class GroupchatControl(ChatControlBase):
self.check_focus_out_line()
- ChatControlBase.add_message(
- self, text, kind, contact, tim,
- other_tags_for_name, [], other_tags_for_text, xhtml=xhtml,
- displaymarking=displaymarking,
- correct_id=correct_id, message_id=message_id,
- additional_data=additional_data)
+ ChatControlBase.add_message(self,
+ text,
+ kind,
+ contact,
+ tim,
+ other_tags_for_name,
+ [],
+ other_tags_for_text,
+ displaymarking=displaymarking,
+ correct_id=correct_id,
+ message_id=message_id,
+ additional_data=additional_data)
def get_nb_unread(self):
type_events = ['printed_marked_gc_msg']
@@ -1099,7 +1102,6 @@ class GroupchatControl(ChatControlBase):
obj.msgtxt,
frm,
tim=obj.properties.timestamp,
- xhtml=obj.xhtml,
displaymarking=obj.displaymarking,
message_id=obj.properties.id,
correct_id=obj.correct_id)
@@ -1109,8 +1111,8 @@ class GroupchatControl(ChatControlBase):
obj.properties.is_sent_carbon,
obj.msgtxt,
obj.properties.timestamp,
- obj.xhtml,
self.session,
+ obj.additional_data,
msg_log_id=obj.msg_log_id,
displaymarking=obj.displaymarking)
@@ -1574,10 +1576,17 @@ class GroupchatControl(ChatControlBase):
self.contact)
# Send the message
- app.nec.push_outgoing_event(GcMessageOutgoingEvent(
- None, account=self.account, jid=self.room_jid, message=message,
- xhtml=xhtml, label=label, chatstate=chatstate,
- correct_id=correct_id, automatic_message=False))
+ event = GcMessageOutgoingEvent(None,
+ account=self.account,
+ jid=self.room_jid,
+ message=message,
+ label=label,
+ chatstate=chatstate,
+ correct_id=correct_id,
+ automatic_message=False)
+ event.additional_data.set_value('gajim', 'xhtml', xhtml)
+ app.nec.push_outgoing_event(event)
+
self.msg_textview.get_buffer().set_text('')
self.msg_textview.grab_focus()
diff --git a/gajim/gtk/history.py b/gajim/gtk/history.py
index 407c78848..cc0bd4790 100644
--- a/gajim/gtk/history.py
+++ b/gajim/gtk/history.py
@@ -616,21 +616,17 @@ class HistoryWindow(Gtk.ApplicationWindow):
buf.insert(end_iter, format_)
if subject:
message = _('Subject: %s\n') % subject + message
- xhtml = None
- if message.startswith('<body '):
- xhtml = message
if tag_msg:
self.history_textview.print_real_text(
- message, [tag_msg],
+ message,
+ [tag_msg],
name=contact_name,
- xhtml=xhtml,
additional_data=additional_data)
else:
self.history_textview.print_real_text(
message,
name=contact_name,
- xhtml=xhtml,
additional_data=additional_data)
self.history_textview.print_real_text('\n', text_tags=['eol'])
diff --git a/gajim/gtk/htmltextview.py b/gajim/gtk/htmltextview.py
index ab50b1ca7..a5c5e9e0a 100644
--- a/gajim/gtk/htmltextview.py
+++ b/gajim/gtk/htmltextview.py
@@ -949,6 +949,13 @@ class HtmlTextView(Gtk.TextView):
parser = xml.sax.make_parser()
parser.setContentHandler(HtmlHandler(textview, conv_textview, eob))
parser.parse(StringIO(html))
+ self._delete_last_char(buffer_, eob)
+
+ @staticmethod
+ def _delete_last_char(buffer_, iter_):
+ start_iter = iter_.copy()
+ start_iter.backward_char()
+ buffer_.delete(start_iter, iter_)
@staticmethod
def _on_copy_clipboard(textview):
diff --git a/gajim/gtk/preferences.py b/gajim/gtk/preferences.py
index 897fef45e..252c68f26 100644
--- a/gajim/gtk/preferences.py
+++ b/gajim/gtk/preferences.py
@@ -147,7 +147,7 @@ class Preferences(Gtk.ApplicationWindow):
self._ui.positive_184_ack_checkbutton.set_active(st)
# Ignore XHTML
- st = app.config.get('ignore_incoming_xhtml')
+ st = app.config.get('show_xhtml')
self._ui.xhtml_checkbutton.set_active(st)
# Print status messages in single chats
@@ -674,8 +674,7 @@ class Preferences(Gtk.ApplicationWindow):
self.on_checkbutton_toggled(widget, 'positive_184_ack')
def on_xhtml_checkbutton_toggled(self, widget):
- self.on_checkbutton_toggled(widget, 'ignore_incoming_xhtml')
- helpers.update_optional_features()
+ self.on_checkbutton_toggled(widget, 'show_xhtml')
def on_print_status_in_chats_checkbutton_toggled(self, widget):
self.on_checkbutton_toggled(widget, 'print_status_in_chats')
diff --git a/gajim/message_textview.py b/gajim/message_textview.py
index cfac6995f..1ee8abd27 100644
--- a/gajim/message_textview.py
+++ b/gajim/message_textview.py
@@ -22,6 +22,8 @@ from gi.repository import GLib
from gi.repository import GObject
from gi.repository import Pango
+from nbxmpp.modules.misc import build_xhtml_body
+
from gajim.common import app
from gajim.common.i18n import _
from gajim.common.const import StyleAttr
@@ -361,7 +363,7 @@ class MessageTextView(Gtk.TextView):
text += self.end_tags[tag_name]
if modified:
- return '<p>' + self.make_clickable_urls(text) + '</p>'
+ return build_xhtml_body('<p>%s</p>' % self.make_clickable_urls(text))
return None
def replace_emojis(self):
diff --git a/gajim/remote_control.py b/gajim/remote_control.py
index 2e9705aee..dfea92238 100644
--- a/gajim/remote_control.py
+++ b/gajim/remote_control.py
@@ -369,7 +369,7 @@ class GajimRemote(Server):
# event has not been handled at GUI level
return
self.raise_signal('GCMessage', (obj.conn.name, [obj.fjid, obj.msgtxt,
- obj.properties.timestamp, obj.delayed, obj.xhtml_msgtxt,
+ obj.properties.timestamp, obj.delayed,
obj.displaymarking, obj.needs_highlight]))
def _nec_decrypted_message_received(self, obj):
@@ -379,7 +379,7 @@ class GajimRemote(Server):
self.raise_signal('NewMessage', (
obj.conn.name, [obj.fjid, obj.msgtxt, obj.properties.timestamp,
event_type, obj.properties.subject,
- obj.msg_log_id, obj.properties.nickname, obj.xhtml]))
+ obj.msg_log_id, obj.properties.nickname]))
def on_our_status(self, obj):
self.raise_signal('AccountPresence', (obj.show, obj.conn.name))
diff --git a/gajim/session.py b/gajim/session.py
index 75763eeba..50f0d8bb7 100644
--- a/gajim/session.py
+++ b/gajim/session.py
@@ -107,11 +107,6 @@ class ChatControlSession:
log_type = KindConstant.CHAT_MSG_SENT
if self.is_loggable() and obj.msgtxt:
- if obj.xhtml and app.config.get('log_xhtml_messages'):
- msg_to_log = obj.xhtml
- else:
- msg_to_log = obj.msgtxt
-
jid = obj.fjid
if not obj.properties.is_muc_pm:
jid = obj.jid
@@ -121,7 +116,7 @@ class ChatControlSession:
jid,
obj.properties.timestamp,
log_type,
- message=msg_to_log,
+ message=obj.msgtxt,
subject=obj.properties.subject,
additional_data=obj.additional_data,
stanza_id=obj.unique_id,
@@ -237,7 +232,6 @@ class ChatControlSession:
obj.msg_log_id,
correct_id=obj.correct_id,
message_id=obj.properties.id,
- xhtml=obj.xhtml,
session=self,
displaymarking=obj.displaymarking,
sent_forwarded=obj.properties.is_sent_carbon,
@@ -248,7 +242,7 @@ class ChatControlSession:
app.events.add_event(self.conn.name, fjid, event)
def roster_message(self, jid, msg, tim, msg_type='',
- subject=None, resource='', msg_log_id=None, user_nick='', xhtml=None,
+ subject=None, resource='', msg_log_id=None, user_nick='',
displaymarking=None, additional_data=None):
"""
Display the message or show notification in the roster
@@ -311,9 +305,12 @@ class ChatControlSession:
if msg_type == 'error':
typ = 'error'
- self.control.add_message(msg, typ, tim=tim,
- subject=subject, xhtml=xhtml, displaymarking=displaymarking,
- additional_data=additional_data)
+ self.control.add_message(msg,
+ typ,
+ tim=tim,
+ subject=subject,
+ displaymarking=displaymarking,
+ additional_data=additional_data)
if msg_log_id:
app.logger.set_read_messages([msg_log_id])
@@ -328,7 +325,7 @@ class ChatControlSession:
show_in_systray = get_show_in_systray(event_type, contact.jid)
event = event_t(msg, subject, msg_type, tim, resource,
- msg_log_id, xhtml=xhtml, session=self,
+ msg_log_id, session=self,
displaymarking=displaymarking, sent_forwarded=False,
show_in_roster=show_in_roster, show_in_systray=show_in_systray,
additional_data=additional_data)
diff --git a/test/no_gui/unit/test_caps_cache.py b/test/no_gui/unit/test_caps_cache.py
index 787e96dbf..bf086761a 100644
--- a/test/no_gui/unit/test_caps_cache.py
+++ b/test/no_gui/unit/test_caps_cache.py
@@ -4,7 +4,7 @@ Tests for capabilities and the capabilities cache
import unittest
from unittest.mock import MagicMock, Mock
-from nbxmpp import NS_MUC, NS_PING, NS_XHTML_IM
+from nbxmpp import NS_MUC, NS_PING, NS_XHTML_IM, NS_JINGLE_FILE_TRANSFER_5
from nbxmpp.structs import DiscoIdentity
from nbxmpp.structs import DiscoInfo
from gajim.common import caps_cache as caps
@@ -24,7 +24,7 @@ class CommonCapsTest(unittest.TestCase):
name='Gajim')
self.identities = [self.identity]
- self.features = [NS_MUC, NS_XHTML_IM]
+ self.features = [NS_MUC, NS_XHTML_IM, NS_JINGLE_FILE_TRANSFER_5]
# Simulate a filled db
db_caps_cache = {
@@ -116,7 +116,7 @@ class TestClientCaps(CommonCapsTest):
self.assertTrue(caps.client_supports(self.client_caps, NS_PING),
msg="Assume supported, if we don't have caps")
- self.assertFalse(caps.client_supports(self.client_caps, NS_XHTML_IM),
+ self.assertFalse(caps.client_supports(self.client_caps, NS_JINGLE_FILE_TRANSFER_5),
msg="Must not assume blacklisted feature is supported on default")
self.cc.initialize_from_db()