maniaplanet-rpc 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/maniaplanet_rpc/maniaplanet_client.rb +54 -45
- metadata +1 -1
@@ -1,30 +1,29 @@
|
|
1
|
-
require 'xmlrpc/
|
1
|
+
require 'xmlrpc/client'
|
2
2
|
|
3
3
|
class ManiaplanetClient < XMLRPC::Client
|
4
4
|
|
5
|
-
attr_accessor :
|
6
|
-
attr_accessor :socket
|
7
|
-
attr_accessor :request_handle
|
5
|
+
attr_accessor :request_handle, :ip, :port
|
8
6
|
|
9
7
|
def initialize(ip, port)
|
10
|
-
|
8
|
+
@request_handle = 0x80000000
|
9
|
+
@ip = ip
|
10
|
+
@port = port
|
11
11
|
end
|
12
12
|
|
13
13
|
def new_socket(ip, port)
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
@socket
|
14
|
+
socket = TCPSocket.new ip, port
|
15
|
+
authenticate socket
|
16
|
+
socket
|
18
17
|
end
|
19
18
|
|
20
19
|
def authenticate(socket)
|
21
|
-
header = socket.recv(4).unpack
|
20
|
+
header = socket.recv(4).unpack "Vsize"
|
22
21
|
|
23
22
|
if header[0] > 64
|
24
23
|
raise Exception, "Wrong low-level protocol header!"
|
25
24
|
end
|
26
25
|
|
27
|
-
handshake = socket.recv
|
26
|
+
handshake = socket.recv header[0]
|
28
27
|
|
29
28
|
if handshake == "GBXRemote 1"
|
30
29
|
@protocol = 1
|
@@ -33,60 +32,70 @@ class ManiaplanetClient < XMLRPC::Client
|
|
33
32
|
else
|
34
33
|
raise Exception, "Unknown protocol version!"
|
35
34
|
end
|
35
|
+
puts "Handshake Complete"
|
36
36
|
end
|
37
37
|
|
38
38
|
def read_response(socket)
|
39
|
-
|
40
|
-
|
41
|
-
if
|
42
|
-
|
39
|
+
response = ""
|
40
|
+
loop do
|
41
|
+
if protocol == 1
|
42
|
+
content = socket.recv 4
|
43
|
+
if content.bytesize == 0
|
44
|
+
raise Exception, "Cannot read size!"
|
45
|
+
end
|
46
|
+
result = content.unpack "Vsize"
|
47
|
+
size = result[0]
|
48
|
+
receive_handle = @request_handle
|
49
|
+
else
|
50
|
+
content = socket.recv 8
|
51
|
+
if content.bytesize == 0
|
52
|
+
raise Exception, "Cannot read size/handle!"
|
53
|
+
end
|
54
|
+
result = content.unpack "Vsize/Vhandle"
|
55
|
+
size = result[0]
|
56
|
+
receive_handle = result[1]
|
43
57
|
end
|
44
|
-
|
45
|
-
size
|
46
|
-
|
47
|
-
else
|
48
|
-
content = socket.recv(8)
|
49
|
-
if content.length == 0
|
50
|
-
raise Exception, "Cannot read size/handle!"
|
58
|
+
|
59
|
+
if receive_handle == 0 || size == 0
|
60
|
+
raise Exception, "Connection interrupted!"
|
51
61
|
end
|
52
|
-
result = content.unpack("Vsize/Vhandle")
|
53
|
-
size = result[0]
|
54
|
-
receive_handle = result[1]
|
55
|
-
end
|
56
62
|
|
57
|
-
|
58
|
-
|
59
|
-
|
63
|
+
if size > 4096 * 1024
|
64
|
+
raise Exception, "Response too large!"
|
65
|
+
end
|
60
66
|
|
61
|
-
|
62
|
-
|
63
|
-
|
67
|
+
response = ""
|
68
|
+
response_length = 0
|
69
|
+
|
70
|
+
while response_length < size
|
71
|
+
response << socket.recv(size - response_length)
|
72
|
+
response_length = response.bytesize
|
73
|
+
end
|
74
|
+
|
75
|
+
if @request_handle - 0x80000000 != receive_handle
|
76
|
+
# TODO: Add support for callbacks here.
|
77
|
+
end
|
64
78
|
|
65
|
-
response = ""
|
66
|
-
response_length = 0
|
67
79
|
|
68
|
-
|
69
|
-
response << socket.recv(size - response_length)
|
70
|
-
response_length = response.length
|
80
|
+
break if @request_handle - 0x80000000 == receive_handle
|
71
81
|
end
|
72
82
|
response
|
73
83
|
end
|
74
84
|
|
75
|
-
def write_request(socket,request)
|
85
|
+
def write_request(socket,request)
|
76
86
|
@request_handle = @request_handle + 1
|
77
87
|
if protocol == 1
|
78
|
-
bytes = [request.
|
79
|
-
socket.write(bytes)
|
88
|
+
bytes = [request.bytesize, request].pack("Va*")
|
80
89
|
else
|
81
|
-
bytes = [request.
|
82
|
-
socket.write(bytes)
|
90
|
+
bytes = [request.bytesize, @request_handle, request].pack("VVa*")
|
83
91
|
end
|
84
92
|
socket.write bytes
|
85
93
|
end
|
86
94
|
|
87
|
-
def do_rpc(
|
88
|
-
|
89
|
-
|
95
|
+
def do_rpc(request, async) # TODO: Handle async requests
|
96
|
+
sock = new_socket ip, port
|
97
|
+
write_request sock, request
|
98
|
+
read_response sock
|
90
99
|
end
|
91
100
|
|
92
101
|
end
|