2 Slixmpp: The Slick XMPP Library
3 Copyright (C) 2011 Nathanael C. Fritz, Dann Martens (TOMOTON).
4 This file is part of Slixmpp.
6 See the file LICENSE for copying permission.
9 from slixmpp
.xmlstream
import ET
15 if sys
.version_info
> (3, 0):
18 log
= logging
.getLogger(__name__
)
20 _namespace
= 'jabber:iq:rpc'
24 value
['faultCode'] = fault
['code']
25 value
['faultString'] = fault
['string']
26 fault
= ET
.Element("fault", {'xmlns': _namespace
})
27 fault
.append(_py2xml((value
)))
30 def xml2fault(params
):
32 for value
in params
.findall('{%s}value' % _namespace
):
33 vals
.append(_xml2py(value
))
35 fault
['code'] = vals
[0]['faultCode']
36 fault
['string'] = vals
[0]['faultString']
40 params
= ET
.Element("{%s}params" % _namespace
)
42 param
= ET
.Element("{%s}param" % _namespace
)
43 param
.append(_py2xml(x
))
44 params
.append(param
) #<params><param>...
49 val
= ET
.Element("{%s}value" % _namespace
)
51 nil
= ET
.Element("{%s}nil" % _namespace
)
54 i4
= ET
.Element("{%s}i4" % _namespace
)
58 boolean
= ET
.Element("{%s}boolean" % _namespace
)
59 boolean
.text
= str(int(x
))
61 elif type(x
) in (str, unicode):
62 string
= ET
.Element("{%s}string" % _namespace
)
65 elif type(x
) is float:
66 double
= ET
.Element("{%s}double" % _namespace
)
69 elif type(x
) is rpcbase64
:
70 b64
= ET
.Element("{%s}base64" % _namespace
)
71 b64
.text
= x
.encoded()
73 elif type(x
) is rpctime
:
74 iso
= ET
.Element("{%s}dateTime.iso8601" % _namespace
)
77 elif type(x
) in (list, tuple):
78 array
= ET
.Element("{%s}array" % _namespace
)
79 data
= ET
.Element("{%s}data" % _namespace
)
81 data
.append(_py2xml(y
))
85 struct
= ET
.Element("{%s}struct" % _namespace
)
87 member
= ET
.Element("{%s}member" % _namespace
)
88 name
= ET
.Element("{%s}name" % _namespace
)
91 member
.append(_py2xml(x
[y
]))
97 namespace
= 'jabber:iq:rpc'
99 for param
in params
.findall('{%s}param' % namespace
):
100 vals
.append(_xml2py(param
.find('{%s}value' % namespace
)))
104 namespace
= 'jabber:iq:rpc'
105 if value
.find('{%s}nil' % namespace
) is not None:
107 if value
.find('{%s}i4' % namespace
) is not None:
108 return int(value
.find('{%s}i4' % namespace
).text
)
109 if value
.find('{%s}int' % namespace
) is not None:
110 return int(value
.find('{%s}int' % namespace
).text
)
111 if value
.find('{%s}boolean' % namespace
) is not None:
112 return bool(int(value
.find('{%s}boolean' % namespace
).text
))
113 if value
.find('{%s}string' % namespace
) is not None:
114 return value
.find('{%s}string' % namespace
).text
115 if value
.find('{%s}double' % namespace
) is not None:
116 return float(value
.find('{%s}double' % namespace
).text
)
117 if value
.find('{%s}base64' % namespace
) is not None:
118 return rpcbase64(value
.find('{%s}base64' % namespace
).text
.encode())
119 if value
.find('{%s}Base64' % namespace
) is not None:
120 # Older versions of XEP-0009 used Base64
121 return rpcbase64(value
.find('{%s}Base64' % namespace
).text
.encode())
122 if value
.find('{%s}dateTime.iso8601' % namespace
) is not None:
123 return rpctime(value
.find('{%s}dateTime.iso8601' % namespace
).text
)
124 if value
.find('{%s}struct' % namespace
) is not None:
126 for member
in value
.find('{%s}struct' % namespace
).findall('{%s}member' % namespace
):
127 struct
[member
.find('{%s}name' % namespace
).text
] = _xml2py(member
.find('{%s}value' % namespace
))
129 if value
.find('{%s}array' % namespace
) is not None:
131 for val
in value
.find('{%s}array' % namespace
).find('{%s}data' % namespace
).findall('{%s}value' % namespace
):
132 array
.append(_xml2py(val
))
138 class rpcbase64(object):
140 def __init__(self
, data
):
141 #base 64 encoded string
145 return base64
.b64decode(self
.data
)
148 return self
.decode().decode()
151 return self
.data
.decode()
155 class rpctime(object):
157 def __init__(self
,data
=None):
158 #assume string data is in iso format YYYYMMDDTHH:MM:SS
159 if type(data
) in (str, unicode):
160 self
.timestamp
= time
.strptime(data
,"%Y%m%dT%H:%M:%S")
161 elif type(data
) is time
.struct_time
:
162 self
.timestamp
= data
164 self
.timestamp
= time
.gmtime()
169 #return a iso8601 string
170 return time
.strftime("%Y%m%dT%H:%M:%S",self
.timestamp
)
173 return self
.iso8601()