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.
@@ -1,30 +1,29 @@
1
- require 'xmlrpc/xmlrpcs'
1
+ require 'xmlrpc/client'
2
2
 
3
3
  class ManiaplanetClient < XMLRPC::Client
4
4
 
5
- attr_accessor :protocol
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
- new_socket(ip, port)
8
+ @request_handle = 0x80000000
9
+ @ip = ip
10
+ @port = port
11
11
  end
12
12
 
13
13
  def new_socket(ip, port)
14
- @socket = TCPSocket.new(ip, port)
15
- @request_handle = 0x80000000
16
- authenticate(@socket)
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("Vsize")
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(header[0])
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
- if protocol == 1
40
- content = socket.recv(4)
41
- if content.length == 0
42
- raise Exception, "Cannot read size!"
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
- result = content.unpack("Vsize")
45
- size = result[0]
46
- receive_handle = request_handle
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
- if receive_handle == 0 || size == 0
58
- raise Exception, "Connection interrupted!"
59
- end
63
+ if size > 4096 * 1024
64
+ raise Exception, "Response too large!"
65
+ end
60
66
 
61
- if size > 4096 * 1024
62
- raise Exception, "Response too large!"
63
- end
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
- while response_length < size
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) # :doc:
85
+ def write_request(socket,request)
76
86
  @request_handle = @request_handle + 1
77
87
  if protocol == 1
78
- bytes = [request.length, request].pack("Va*")
79
- socket.write(bytes)
88
+ bytes = [request.bytesize, request].pack("Va*")
80
89
  else
81
- bytes = [request.length, request_handle, request].pack("VVa*")
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( request, async )
88
- write_request(socket,request)
89
- read_response(socket)
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maniaplanet-rpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: