1 package ro
.ieval
.fonbot
;
3 import static ro
.ieval
.fonbot
.Utils
.toNonNull
;
5 import java
.io
.IOException
;
6 import java
.net
.HttpURLConnection
;
7 import java
.net
.MalformedURLException
;
9 import java
.util
.ArrayList
;
10 import java
.util
.List
;
12 import org
.eclipse
.jdt
.annotation
.Nullable
;
13 import org
.json
.JSONArray
;
14 import org
.json
.JSONException
;
15 import org
.json
.JSONObject
;
17 import ro
.ieval
.fonbot
.Address
.Protocol
;
18 import android
.content
.Context
;
19 import android
.os
.AsyncTask
;
20 import android
.preference
.PreferenceManager
;
21 import android
.util
.Base64
;
22 import android
.util
.Log
;
24 import com
.google
.android
.gcm
.GCMRegistrar
;
27 * Copyright © 2013 Marius Gavrilescu
29 * This file is part of FonBot.
31 * FonBot is free software: you can redistribute it and/or modify
32 * it under the terms of the GNU General Public License as published by
33 * the Free Software Foundation, either version 3 of the License, or
34 * (at your option) any later version.
36 * FonBot is distributed in the hope that it will be useful,
37 * but WITHOUT ANY WARRANTY; without even the implied warranty of
38 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
39 * GNU General Public License for more details.
41 * You should have received a copy of the GNU General Public License
42 * along with FonBot. If not, see <http://www.gnu.org/licenses/>.
46 * AsyncTask that polls the server for pending commands and executes any commands found.
48 * @author Marius Gavrilescu <marius@ieval.ro>
50 public final class PollServerAsyncTask
extends AsyncTask
<Void
, Void
, List
<PollServerAsyncTask
.Command
>> {
52 * POJO that represents a command in a basic form: a command name, a list of arguments and a reply address, all of them being strings
54 * @author Marius Gavrilescu <marius@ieval.ro>
60 final String command
;//NOPMD no confusion here
62 * The list of command arguments
66 * The reply address, excluding the protocol
71 * Construct a Command from its three parts
73 * @param command the command name
74 * @param args the command arguments
75 * @param replyto the reply address
77 Command(final String command
, final String
[] args
, final String replyto
) {//NOPMD array is immutable
84 /** Context instance */
85 private final Context context
;
88 * Constructs a PollServerAsyncTask.
90 * @param context Context instance
92 public PollServerAsyncTask(final Context context
) {
97 protected List
<Command
> doInBackground(final @Nullable Void
... params
) {
98 Log
.d(getClass().getName(), "Polling server");
99 final List
<Command
> commands
=new ArrayList
<Command
>(10);
101 final URL url
=Utils
.getServerURL(toNonNull(context
),"/get");
102 final HttpURLConnection conn
=(HttpURLConnection
) url
.openConnection();
103 conn
.setRequestProperty("X-ID", GCMRegistrar
.getRegistrationId(context
));
104 final String user
=PreferenceManager
.getDefaultSharedPreferences(context
).getString("username", null);
105 final String password
=PreferenceManager
.getDefaultSharedPreferences(context
).getString("password", null);
106 if(user
== null || password
== null)
109 conn
.setRequestProperty("Authorization", "Basic "+Base64
.encodeToString(
110 (user
+':'+password
).getBytes(), Base64
.NO_WRAP
));
112 final byte[] buf
=new byte[4096*1024];
113 Log
.d(getClass().getName(), "Server poll got response code "+conn
.getResponseCode()+" and message "+conn
.getResponseMessage());
114 if(conn
.getResponseCode()!=200)
116 conn
.getInputStream().read(buf
);
117 final JSONArray array
=new JSONArray(new String(buf
));
118 final List
<String
> list
=new ArrayList
<String
>();
119 for(int i
=0;i
<array
.length();i
++){
120 final JSONObject object
=array
.getJSONObject(i
);
122 for(int j
=0;object
.has("arg"+j
);j
++)
123 list
.add(object
.getString("arg"+j
));
125 commands
.add(new Command(//NOPMD command changes for each JSON object
126 toNonNull(object
.getString("command")),
127 toNonNull(list
.toArray(new String
[list
.size()])),
128 toNonNull(object
.getString("replyto"))));
131 } catch (MalformedURLException e
) {
133 } catch (IOException e
) {
135 } catch (JSONException e
) {
139 throw new AssertionError("commands is null in PollServerAsyncTask#doInBackground");//silence Eclipse bug
144 protected void onPostExecute(final @Nullable List
<Command
> commands
) {
147 for (Command command
: commands
) {
148 Log
.d(getClass().getName(), "Poll got command "+command
.command
+" with "+((command
.args
.length
==0)?
"no args":"args "+Utils
.join(
149 " ",toNonNull(command
.args
))));
150 Utils
.processCommand(
152 toNonNull(command
.command
),
153 toNonNull(command
.args
),
154 new Address(toNonNull(Protocol
.HTTP
), command
.replyto
));//NOPMD address depends on command
This page took 0.024538 seconds and 4 git commands to generate.