1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import struct
20
21
22 from xmlrpclib import dumps, loads
23
24
26
27 - def __init__(self, faultCode, faultString, *params):
28 Exception.__init__(self)
29 self.faultCode = faultCode
30 self.faultString = faultString
31 self.args = params
32
33
35 """ Reads exactly n bytes from the file descriptor fd (if possible) """
36 result = ""
37 while n > 0:
38 buff = fd.read(n)
39 if not buff:
40 break
41 n = n - len(buff)
42 result = result + buff
43 return result
44
45
46 -def send(fd, methodname=None, fault=None, *params):
47 if methodname:
48 buff = dumps(params, methodname=methodname)
49 elif fault:
50 buff = dumps(fault)
51 else:
52 buff = dumps(params)
53
54 fd.write(struct.pack("!L", len(buff)))
55
56 fd.write(buff)
57 return len(buff)
58
59
61
62 n = struct.calcsize("L")
63
64 buff = readSocket(rfile, n)
65 if len(buff) != n:
66
67 raise CommunicationError(0,
68 "Expected %d bytes; got only %d" % (n, len(buff)))
69
70 n, = struct.unpack("!L", buff)
71
72 if n > 65536:
73
74 raise CommunicationError(1, "Block too big: %s" % len(buff))
75
76 buff = readSocket(rfile, n)
77 if len(buff) != n:
78
79 raise CommunicationError(0,
80 "Expected %d bytes; got only %d" % (n, len(buff)))
81
82 return loads(buff)
83