@@ -36,16 +36,89 @@ public RequestHandler(PokemonGo api, RequestEnvelopeOuterClass.RequestEnvelope.A
3636 this .client = client ;
3737 api_endpoint = APISettings .API_ENDPOINT ;
3838 this .auth = auth ;
39- serverRequests = new ArrayList <ServerRequest >();
39+ serverRequests = new ArrayList <>();
40+ // TODO: somehow fix it so people using the deprecated functions will still work, while not calling this deprecated stuff ourselves
4041 resetBuilder ();
4142 }
4243
44+ @ Deprecated
4345 public void request (ServerRequest requestIn ) {
4446 hasRequests = true ;
4547 serverRequests .add (requestIn );
4648 builder .addRequests (requestIn .getRequest ());
4749 }
4850
51+ public void sendServerRequests (ServerRequest ... serverRequests ) throws RemoteServerException , LoginFailedException {
52+ if (serverRequests .length == 0 ) {
53+ return ;
54+ }
55+ RequestEnvelopeOuterClass .RequestEnvelope .Builder builder = RequestEnvelopeOuterClass .RequestEnvelope .newBuilder ();
56+ resetBuilder (builder );
57+
58+ for (ServerRequest serverRequest : serverRequests ) {
59+ builder .addRequests (serverRequest .getRequest ());
60+ }
61+
62+ ByteArrayOutputStream stream = new ByteArrayOutputStream ();
63+ RequestEnvelopeOuterClass .RequestEnvelope request = builder .build ();
64+ try {
65+ request .writeTo (stream );
66+ } catch (IOException e ) {
67+ Log .wtf (TAG , "Failed to write request to bytearray ouput stream. This should never happen" , e );
68+ }
69+
70+ RequestBody body = RequestBody .create (null , stream .toByteArray ());
71+ okhttp3 .Request httpRequest = new okhttp3 .Request .Builder ()
72+ .url (api_endpoint )
73+ .post (body )
74+ .build ();
75+ Response response ;
76+ try {
77+ response = client .newCall (httpRequest ).execute ();
78+ } catch (IOException e ) {
79+ throw new RemoteServerException (e );
80+ }
81+
82+ if (response .code () != 200 )
83+ throw new RemoteServerException ("Got a unexcepted http code : " + response .code ());
84+
85+ ResponseEnvelopeOuterClass .ResponseEnvelope responseEnvelop ;
86+ try (InputStream content = response .body ().byteStream ()) {
87+ responseEnvelop = ResponseEnvelopeOuterClass .ResponseEnvelope .parseFrom (content );
88+ } catch (IOException e ) {
89+ // retrieved garbage from the server
90+ throw new RemoteServerException ("Received malformed response : " + e );
91+ }
92+
93+ if (responseEnvelop .getApiUrl () != null && responseEnvelop .getApiUrl ().length () > 0 ) {
94+ api_endpoint = "https://" + responseEnvelop .getApiUrl () + "/rpc" ;
95+ }
96+
97+ if (responseEnvelop .hasAuthTicket ()) {
98+ lastAuth = responseEnvelop .getAuthTicket ();
99+ }
100+
101+ if (responseEnvelop .getStatusCode () == 102 ) {
102+ throw new LoginFailedException ();
103+ } else if (responseEnvelop .getStatusCode () == 53 ) {
104+ // 53 means that the api_endpoint was not correctly set, should be at this point, though, so redo the request
105+ sendServerRequests (serverRequests );
106+ return ;
107+ }
108+
109+ // map each reply to the numeric response, ie first response = first request and send back to the requests to handle.
110+ int count = 0 ;
111+ for (ByteString payload : responseEnvelop .getReturnsList ()) {
112+ ServerRequest serverReq = serverRequests [count ];
113+ // TODO: Probably all other payloads are garbage as well in this case, so might as well throw an exception and leave this loop
114+ if (payload != null ) {
115+ serverReq .handleData (payload );
116+ }
117+ count ++;
118+ }
119+ }
120+
121+ @ Deprecated
49122 public void sendServerRequests () throws RemoteServerException , LoginFailedException {
50123 setLatitude (api .getLatitude ());
51124 setLongitude (api .getLongitude ());
@@ -64,7 +137,7 @@ public void sendServerRequests() throws RemoteServerException, LoginFailedExcept
64137 .url (api_endpoint )
65138 .post (body )
66139 .build ();
67- Response response = null ;
140+ Response response ;
68141 try {
69142 response = client .newCall (httpRequest ).execute ();
70143 } catch (IOException e ) {
@@ -112,17 +185,25 @@ public void sendServerRequests() throws RemoteServerException, LoginFailedExcept
112185 resetBuilder ();
113186 }
114187
188+ @ Deprecated
115189 private void resetBuilder () {
116190 builder = RequestEnvelopeOuterClass .RequestEnvelope .newBuilder ();
191+ resetBuilder (builder );
192+ hasRequests = false ;
193+ serverRequests .clear ();
194+ }
195+
196+ private void resetBuilder (RequestEnvelopeOuterClass .RequestEnvelope .Builder builder ) {
117197 builder .setStatusCode (2 );
118198 builder .setRequestId (8145806132888207460l );
119199 if (lastAuth != null && lastAuth .getExpireTimestampMs () > 0 )
120200 builder .setAuthTicket (lastAuth );
121201 else
122202 builder .setAuthInfo (auth );
123203 builder .setUnknown12 (989 );
124- hasRequests = false ;
125- serverRequests .clear ();
204+ builder .setLatitude (api .getLatitude ());
205+ builder .setLongitude (api .getLongitude ());
206+ builder .setAltitude (api .getAltitude ());
126207 }
127208
128209
0 commit comments