Alexander Sashnov <[EMAIL PROTECTED]> writes:
>> I have just tested with my two ICQ acounts and it seems to work.
>
> I create another test account and test offline messages between 2 test ICQ
> accounts.
>
> And it works.
>
> Why it not work with my primary ICQ account I now know for now.
Partially researched.
Offline messages works fine on pyicq-t-0.8a
But it have some problems with away status with non-ascii text.
Offline messages not work on pyicq-t-0.8a with patch for fix backtraces
like this:
Unhandled error in Deferred:
Traceback (most recent call last):
File "/home/alex/pj/pyicq-t/src/tlib/oscar.py", line 647, in dataReceived
state=func(flap)
File "/home/alex/pj/pyicq-t/src/tlib/oscar.py", line 756, in oscar_Data
d.callback(snac)
File "/usr/lib/python2.4/site-packages/twisted/internet/defer.py", line 239,
in callback
self._startRunCallbacks(result)
File "/usr/lib/python2.4/site-packages/twisted/internet/defer.py", line 304,
in _startRunCallbacks
self._runCallbacks()
--- <exception caught here> ---
File "/usr/lib/python2.4/site-packages/twisted/internet/defer.py", line 317,
in _runCallbacks
self.result = callback(self.result, *args, **kw)
File "/home/alex/pj/pyicq-t/src/legacy/icqt.py", line 330, in sendAwayPresence
LogEvent(INFO, self.session.jabberID, "Away (%s, %s) message %s" %
(charset, msg[0], status))
exceptions.UnicodeDecodeError: 'utf8' codec can't decode bytes in position
19-22: invalid data
Here is the patch (not from me, I just find it on forum):
diff -ur /home/alex/pj/pyicq-t/src/globals.py
/home/alex/tmp/pyicq_on_make/src/globals.py
--- /home/alex/pj/pyicq-t/src/globals.py 2007-09-21 09:37:07.000000000
+0700
+++ /home/alex/tmp/pyicq_on_make/src/globals.py 2007-09-26 11:33:34.000000000
+0700
@@ -37,6 +37,7 @@
XAVATAR = "jabber:x:avatar"
XCONFERENCE = "jabber:x:conference"
XDATA = "jabber:x:data"
+XDELAY = "jabber:x:delay"
XEVENT = "jabber:x:event"
XHTML = "http://jabber.org/protocol/xhtml-im"
SAPO_NOERROR = "sapo:noerror"
diff -ur /home/alex/pj/pyicq-t/src/jabw.py
/home/alex/tmp/pyicq_on_make/src/jabw.py
--- /home/alex/pj/pyicq-t/src/jabw.py 2007-09-21 09:37:07.000000000 +0700
+++ /home/alex/tmp/pyicq_on_make/src/jabw.py 2007-09-26 11:33:34.000000000
+0700
@@ -22,7 +22,7 @@
if delay:
x = el.addElement("x")
- x.attributes["xmlns"] = globals.IQDELAY
+ x.attributes["xmlns"] = globals.XDELAY
x.attributes["from"] = fro
x.attributes["stamp"] = delay
diff -ur /home/alex/pj/pyicq-t/src/legacy/icqt.py
/home/alex/tmp/pyicq_on_make/src/legacy/icqt.py
--- /home/alex/pj/pyicq-t/src/legacy/icqt.py 2007-09-21 09:37:06.000000000
+0700
+++ /home/alex/tmp/pyicq_on_make/src/legacy/icqt.py 2007-09-26
11:33:32.000000000 +0700
@@ -153,6 +153,11 @@
status = status.decode("iso-8859-1", "replace")
if status == "Away" or status=="I am currently away from the
computer." or status=="I am away from my computer right now.":
status = ""
+ try:
+ status = status.decode("utf16be", "replace")
+ debug.log("mxx: icqt status.decode utf16be")
+ except:
+ pass
if user.idleTime:
if user.idleTime>60*24:
idle_time = "Idle %d
days"%(user.idleTime/(60*24))
@@ -176,7 +181,6 @@
if user.caps:
self.oscarcon.legacyList.setCapabilities(user.name,
user.caps)
- status = status.encode("utf-8", "replace")
if user.flags.count("away"):
self.getAway(user.name).addCallback(self.sendAwayPresence, user)
else:
@@ -201,7 +205,7 @@
c.updatePresence(show=show, status=status, ptype=ptype)
self.oscarcon.legacyList.updateSSIContact(user.name,
presence=ptype, show=show, status=status)
- def receiveMessage(self, user, multiparts, flags):
+ def receiveMessage(self, user, multiparts, flags, delay=None):
from glue import icq2jid
LogEvent(INFO, self.session.jabberID, "%s %s %s" % (user.name,
multiparts, flags))
@@ -224,7 +228,7 @@
if "auto" in flags:
mtype = "headline"
- self.session.sendMessage(to=self.session.jabberID,
fro=sourcejid, body=text, mtype=mtype, xhtml=xhtml)
+ self.session.sendMessage(to=self.session.jabberID,
fro=sourcejid, body=text, mtype=mtype, delay=delay, xhtml=xhtml)
self.session.pytrans.serviceplugins['Statistics'].stats['IncomingMessages'] += 1
self.session.pytrans.serviceplugins['Statistics'].sessionUpdate(self.session.jabberID,
'IncomingMessages', 1)
if not config.disableAwayMessage and self.awayMessage and not
"auto" in flags:
@@ -306,11 +310,12 @@
else:
show = 'away'
- status = oscar.dehtml(msg[1]) # Removes any HTML tags
+ #status = oscar.dehtml(msg[1]) # Removes any HTML tags
+ status = msg[1]
url = user.url
if status != None:
- charset = "iso-8859-1"
+ charset = config.encoding
m = None
if msg[0]:
m = re.search('charset="(.+)"', msg[0])
@@ -327,7 +332,14 @@
status = msg[0] + ": " + status
status = status.decode(charset, 'replace')
- LogEvent(INFO, self.session.jabberID, "Away (%s, %s)
message %s" % (charset, msg[0], status))
+ if charset == 'utf-16be':
+ status = status.encode(config.encoding,
'replace')
+ status = oscar.dehtml(status) # Removes any HTML tags
+ try:
+ LogEvent(INFO, self.session.jabberID, "Away
(%s, %s) message %s" % (charset, msg[0], status))
+ except:
+ LogEvent(INFO, self.session.jabberID, "Away
broken (%s, s) message s" % (charset))
+ pass
if status == "Away" or status=="I am currently away from the
computer." or status=="I am away from my computer right now.":
status = ""
diff -ur /home/alex/pj/pyicq-t/src/main.py
/home/alex/tmp/pyicq_on_make/src/main.py
--- /home/alex/pj/pyicq-t/src/main.py 2007-09-21 09:37:07.000000000 +0700
+++ /home/alex/tmp/pyicq_on_make/src/main.py 2007-09-26 11:33:34.000000000
+0700
@@ -89,7 +89,10 @@
import signal
signal.signal(signal.SIGHUP, reloadConfig)
# Load scripts for PID and daemonizing
- from twisted.scripts import twistd
+ try:
+ from twisted.scripts import _twistd_unix as twistd
+ except:
+ from twisted.scripts import twistd
selectWarning = "Unable to install any good reactors (kqueue, cf, epoll,
poll).\nWe fell back to using select. You may have scalability problems.\nThis
reactor will not support more than 1024 connections +at a time. You may
silence this message by choosing 'select' or 'default' as your reactor in the
transport config."
if config.reactor and len(config.reactor) > 0:
diff -ur /home/alex/pj/pyicq-t/src/tlib/oscar.py
/home/alex/tmp/pyicq_on_make/src/tlib/oscar.py
--- /home/alex/pj/pyicq-t/src/tlib/oscar.py 2007-09-21 09:37:06.000000000
+0700
+++ /home/alex/tmp/pyicq_on_make/src/tlib/oscar.py 2007-09-26
11:33:47.000000000 +0700
@@ -19,6 +19,7 @@
from scheduler import Scheduler
+import config
import struct
import md5
import string
@@ -199,7 +200,7 @@
# in the docutils extension module
# see http://docutils.sourceforge.net
# modified for better use here
-def guess_encoding(data, defaultencoding='iso-8859-1'):
+def guess_encoding(data, defaultencoding=config.encoding):
"""
Given a byte string, attempt to decode it.
Tries 'utf-16be, 'utf-8' and 'iso-8859-1' (or something else) encodings.
@@ -870,7 +871,7 @@
self.connectPort = 5190
# Note that this is "no unicode" default encoding
# We use unicode if it's there
- self.defaultEncoding = 'iso-8859-1'
+ self.defaultEncoding = config.encoding
if not self.capabilities:
self.capabilities = [CAP_CHAT]
@@ -1641,12 +1642,12 @@
# Offline message
senderuin = struct.unpack('<I',v[10:14])[0]
#print "senderuin: "+str(senderuin)+"\n"
- msg_date = str( "%4d-%02d-%02d %02d:%02d"
- % struct.unpack('<HBBBB', v[14:20]) )
+ msg_date = str( "%4d-%02d-%02dT%02d:%02d:00Z" #XEP-091
date format
+ % struct.unpack('<HBBBB', v[14:20]) )
messagetype, messageflags,messagelen =
struct.unpack('<BBH',v[20:24])
umessage, encoding =
guess_encoding(v[24:24+messagelen-1],self.defaultEncoding)
log.msg("Converted message, encoding %r: %r" % (encoding,
umessage))
- umessage = umessage + "\n\n/sent " + msg_date
+ #umessage = umessage + "\n\n/sent " + msg_date
message = [ umessage.encode("utf-16be"), "unicode" ]
#message = [ str( v[24:24+messagelen-1] )
# + "\n\n/sent " + msg_date ]
@@ -1657,7 +1658,7 @@
tlvs = dict()
multiparts.append(tuple(message))
user = OSCARUser(str(senderuin), None, tlvs)
- self.receiveMessage(user, multiparts, flags)
+ self.receiveMessage(user, multiparts, flags, msg_date)
elif (type == 0x42):
# End of offline messages
reqdata =
'\x08\x00'+struct.pack("<I",int(self.username))+'\x3e\x00\x02\x00'
@@ -2022,14 +2023,14 @@
charSet = 0x0000
except:
try:
- part[0] = part[0].encode('iso-8859-1')
+ part[0] = part[0].encode(config.encoding)
charSet = 0x0003
except:
try:
part[0] = part[0].encode('utf-16be', 'replace')
charSet = 0x0002
except:
- part[0] = part[0].encode('iso-8859-1', 'replace')
+ part[0] = part[0].encode(config.encoding,
'replace')
charSet = 0x0003
if 'macintosh' in part[1:]:
charSubSet = 0x000b
@@ -2042,7 +2043,7 @@
# We'll investigate this in more detail later.
features = '\x01\x01\x02'
# Why do i need to encode this? I shouldn't .. it's data.
- data = data.encode('iso-8859-1', 'replace') + TLV(2, TLV(0x0501,
features)+messageData)
+ data = data.encode(config.encoding, 'replace') + TLV(2, TLV(0x0501,
features)+messageData)
if wantAck:
log.msg("sendMessage: Sending wanting ACK")
data = data + TLV(3)
Seems this patch is not correct, so I will remove them.
But question with away messages incoding is open, I think changes like this
- part[0] = part[0].encode('iso-8859-1')
+ part[0] = part[0].encode(config.encoding)
reasonable.
--
Alexander Sashnov
_______________________________________________
py-transports mailing list
[email protected]
http://lists.modevia.com/cgi-bin/mailman/listinfo/py-transports