@@ -58,7 +58,9 @@ public RequestHandler(PokemonGo api, RequestEnvelopeOuterClass.RequestEnvelope.A
5858 this .client = client ;
5959 apiEndpoint = ApiSettings .API_ENDPOINT ;
6060 this .auth = auth ;
61- serverRequests = new ArrayList <ServerRequest >();
61+ serverRequests = new ArrayList <>();
62+ /* TODO: somehow fix it so people using the deprecated functions will still work,
63+ while not calling this deprecated stuff ourselves */
6264 resetBuilder ();
6365 }
6466
@@ -67,18 +69,100 @@ public RequestHandler(PokemonGo api, RequestEnvelopeOuterClass.RequestEnvelope.A
6769 *
6870 * @param requestIn the request in
6971 */
72+ @ Deprecated
7073 public void request (ServerRequest requestIn ) {
7174 hasRequests = true ;
7275 serverRequests .add (requestIn );
7376 builder .addRequests (requestIn .getRequest ());
7477 }
7578
79+ /**
80+ * Sends multiple ServerRequests in a thread safe manner.
81+ *
82+ * @param serverRequests list of ServerRequests to be sent
83+ * @throws RemoteServerException the remote server exception
84+ * @throws LoginFailedException the login failed exception
85+ */
86+ public void sendServerRequests (ServerRequest ... serverRequests ) throws RemoteServerException , LoginFailedException {
87+ if (serverRequests .length == 0 ) {
88+ return ;
89+ }
90+ RequestEnvelopeOuterClass .RequestEnvelope .Builder builder = RequestEnvelopeOuterClass .RequestEnvelope .newBuilder ();
91+ resetBuilder (builder );
92+
93+ for (ServerRequest serverRequest : serverRequests ) {
94+ builder .addRequests (serverRequest .getRequest ());
95+ }
96+
97+ ByteArrayOutputStream stream = new ByteArrayOutputStream ();
98+ RequestEnvelopeOuterClass .RequestEnvelope request = builder .build ();
99+ try {
100+ request .writeTo (stream );
101+ } catch (IOException e ) {
102+ Log .wtf (TAG , "Failed to write request to bytearray ouput stream. This should never happen" , e );
103+ }
104+
105+ RequestBody body = RequestBody .create (null , stream .toByteArray ());
106+ okhttp3 .Request httpRequest = new okhttp3 .Request .Builder ()
107+ .url (apiEndpoint )
108+ .post (body )
109+ .build ();
110+ Response response ;
111+ try {
112+ response = client .newCall (httpRequest ).execute ();
113+ } catch (IOException e ) {
114+ throw new RemoteServerException (e );
115+ }
116+
117+ if (response .code () != 200 ) {
118+ throw new RemoteServerException ("Got a unexcepted http code : " + response .code ());
119+ }
120+
121+ ResponseEnvelopeOuterClass .ResponseEnvelope responseEnvelop ;
122+ try (InputStream content = response .body ().byteStream ()) {
123+ responseEnvelop = ResponseEnvelopeOuterClass .ResponseEnvelope .parseFrom (content );
124+ } catch (IOException e ) {
125+ // retrieved garbage from the server
126+ throw new RemoteServerException ("Received malformed response : " + e );
127+ }
128+
129+ if (responseEnvelop .getApiUrl () != null && responseEnvelop .getApiUrl ().length () > 0 ) {
130+ apiEndpoint = "https://" + responseEnvelop .getApiUrl () + "/rpc" ;
131+ }
132+
133+ if (responseEnvelop .hasAuthTicket ()) {
134+ lastAuth = responseEnvelop .getAuthTicket ();
135+ }
136+
137+ if (responseEnvelop .getStatusCode () == 102 ) {
138+ throw new LoginFailedException ();
139+ } else if (responseEnvelop .getStatusCode () == 53 ) {
140+ // 53 means that the api_endpoint was not correctly set, should be at this point, though, so redo the request
141+ sendServerRequests (serverRequests );
142+ return ;
143+ }
144+
145+ /* map each reply to the numeric response,
146+ ie first response = first request and send back to the requests to handle. */
147+ int count = 0 ;
148+ for (ByteString payload : responseEnvelop .getReturnsList ()) {
149+ ServerRequest serverReq = serverRequests [count ];
150+ /* TODO: Probably all other payloads are garbage as well in this case,
151+ so might as well throw an exception and leave this loop */
152+ if (payload != null ) {
153+ serverReq .handleData (payload );
154+ }
155+ count ++;
156+ }
157+ }
158+
76159 /**
77160 * Send server requests.
78161 *
79162 * @throws RemoteServerException the remote server exception
80163 * @throws LoginFailedException the login failed exception
81164 */
165+ @ Deprecated
82166 public void sendServerRequests () throws RemoteServerException , LoginFailedException {
83167 setLatitude (api .getLatitude ());
84168 setLongitude (api .getLongitude ());
@@ -97,7 +181,7 @@ public void sendServerRequests() throws RemoteServerException, LoginFailedExcept
97181 .url (apiEndpoint )
98182 .post (body )
99183 .build ();
100- Response response = null ;
184+ Response response ;
101185 try {
102186 response = client .newCall (httpRequest ).execute ();
103187 } catch (IOException e ) {
@@ -147,8 +231,15 @@ public void sendServerRequests() throws RemoteServerException, LoginFailedExcept
147231 resetBuilder ();
148232 }
149233
234+ @ Deprecated
150235 private void resetBuilder () {
151236 builder = RequestEnvelopeOuterClass .RequestEnvelope .newBuilder ();
237+ resetBuilder (builder );
238+ hasRequests = false ;
239+ serverRequests .clear ();
240+ }
241+
242+ private void resetBuilder (RequestEnvelopeOuterClass .RequestEnvelope .Builder builder ) {
152243 builder .setStatusCode (2 );
153244 builder .setRequestId (8145806132888207460L );
154245 if (lastAuth != null && lastAuth .getExpireTimestampMs () > 0 ) {
@@ -157,8 +248,9 @@ private void resetBuilder() {
157248 builder .setAuthInfo (auth );
158249 }
159250 builder .setUnknown12 (989 );
160- hasRequests = false ;
161- serverRequests .clear ();
251+ builder .setLatitude (api .getLatitude ());
252+ builder .setLongitude (api .getLongitude ());
253+ builder .setAltitude (api .getAltitude ());
162254 }
163255
164256
0 commit comments