aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/Util.java11
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/callback/RequestCallback.java7
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/callback/ResultPairCallback.java5
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java16
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpPost.java2
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequest.java10
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequestContentWriter.java6
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java1
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java24
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/UrlEncodedFormWriter.java17
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/server/AsyncHttpServerResponseImpl.java11
-rw-r--r--AndroidAsyncSample/gen/com/koushikdutta/async/R.java3
-rw-r--r--AndroidAsyncSample/gen/com/koushikdutta/async/sample/R.java3
-rw-r--r--AndroidAsyncSample/res/layout/activity_main.xml5
-rw-r--r--AndroidAsyncSample/src/com/koushikdutta/async/sample/MainActivity.java64
15 files changed, 151 insertions, 34 deletions
diff --git a/AndroidAsync/src/com/koushikdutta/async/Util.java b/AndroidAsync/src/com/koushikdutta/async/Util.java
index f463290..524e0b3 100644
--- a/AndroidAsync/src/com/koushikdutta/async/Util.java
+++ b/AndroidAsync/src/com/koushikdutta/async/Util.java
@@ -5,7 +5,6 @@ import java.io.InputStream;
import java.nio.ByteBuffer;
import junit.framework.Assert;
-import android.util.Log;
import com.koushikdutta.async.callback.CompletedCallback;
import com.koushikdutta.async.callback.DataCallback;
@@ -83,21 +82,25 @@ public class Util {
cb.onWriteable();
}
- public static void writeAll(final DataSink sink, final ByteBufferList bb) {
+ public static void writeAll(final DataSink sink, final ByteBufferList bb, final CompletedCallback callback) {
sink.setWriteableCallback(new WritableCallback() {
@Override
public void onWriteable() {
if (bb.remaining() == 0)
return;
sink.write(bb);
+ if (bb.remaining() == 0 && callback != null)
+ callback.onCompleted(null);
}
});
sink.write(bb);
+ if (bb.remaining() == 0 && callback != null)
+ callback.onCompleted(null);
}
- public static void writeAll(DataSink sink, byte[] bytes) {
+ public static void writeAll(DataSink sink, byte[] bytes, CompletedCallback callback) {
ByteBuffer bb = ByteBuffer.wrap(bytes);
ByteBufferList bbl = new ByteBufferList();
bbl.add(bb);
- writeAll(sink, bbl);
+ writeAll(sink, bbl, callback);
}
}
diff --git a/AndroidAsync/src/com/koushikdutta/async/callback/RequestCallback.java b/AndroidAsync/src/com/koushikdutta/async/callback/RequestCallback.java
new file mode 100644
index 0000000..f49c808
--- /dev/null
+++ b/AndroidAsync/src/com/koushikdutta/async/callback/RequestCallback.java
@@ -0,0 +1,7 @@
+package com.koushikdutta.async.callback;
+
+import com.koushikdutta.async.http.AsyncHttpResponse;
+
+public interface RequestCallback<T> {
+ public void onCompleted(Exception e, AsyncHttpResponse response, T result);
+}
diff --git a/AndroidAsync/src/com/koushikdutta/async/callback/ResultPairCallback.java b/AndroidAsync/src/com/koushikdutta/async/callback/ResultPairCallback.java
deleted file mode 100644
index 76a775b..0000000
--- a/AndroidAsync/src/com/koushikdutta/async/callback/ResultPairCallback.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.koushikdutta.async.callback;
-
-public interface ResultPairCallback<T, U> {
- public void onCompleted(Exception e, T result, U result2);
-}
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java
index febfc5a..4977f04 100644
--- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java
+++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java
@@ -28,7 +28,7 @@ import com.koushikdutta.async.callback.ClosedCallback;
import com.koushikdutta.async.callback.CompletedCallback;
import com.koushikdutta.async.callback.ConnectCallback;
import com.koushikdutta.async.callback.DataCallback;
-import com.koushikdutta.async.callback.ResultPairCallback;
+import com.koushikdutta.async.callback.RequestCallback;
import com.koushikdutta.async.http.libcore.RawHeaders;
import com.koushikdutta.async.stream.OutputStreamDataCallback;
@@ -192,16 +192,16 @@ public class AsyncHttpClient {
}
}
- public static interface DownloadCallback extends ResultPairCallback<AsyncHttpResponse, ByteBufferList> {
+ public static interface DownloadCallback extends RequestCallback<ByteBufferList> {
}
- public static interface StringCallback extends ResultPairCallback<AsyncHttpResponse, String> {
+ public static interface StringCallback extends RequestCallback<String> {
}
- public static interface JSONObjectCallback extends ResultPairCallback<AsyncHttpResponse, JSONObject> {
+ public static interface JSONObjectCallback extends RequestCallback<JSONObject> {
}
- public static interface FileCallback extends ResultPairCallback<AsyncHttpResponse, File> {
+ public static interface FileCallback extends RequestCallback<File> {
}
private interface ResultConvert {
@@ -261,7 +261,7 @@ public class AsyncHttpClient {
});
}
- private static void invoke(Handler handler, final ResultPairCallback callback, final AsyncHttpResponse response, final Exception e, final Object result) {
+ private static void invoke(Handler handler, final RequestCallback callback, final AsyncHttpResponse response, final Exception e, final Object result) {
if (handler == null) {
callback.onCompleted(e, response, result);
return;
@@ -329,7 +329,7 @@ public class AsyncHttpClient {
});
}
- private static void execute(AsyncHttpRequest req, final ResultPairCallback callback, final ResultConvert convert) {
+ private static void execute(AsyncHttpRequest req, final RequestCallback callback, final ResultConvert convert) {
final Handler handler = Looper.myLooper() == null ? null : new Handler();
connect(req, new HttpConnectCallback() {
ByteBufferList buffer = new ByteBufferList();
@@ -363,7 +363,7 @@ public class AsyncHttpClient {
});
}
- private static void get(String uri, final ResultPairCallback callback, final ResultConvert convert) {
+ private static void get(String uri, final RequestCallback callback, final ResultConvert convert) {
try {
execute(new AsyncHttpGet(new URI(uri)), callback, convert);
}
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpPost.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpPost.java
index 21d743d..33889be 100644
--- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpPost.java
+++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpPost.java
@@ -7,7 +7,7 @@ public class AsyncHttpPost extends AsyncHttpRequest {
public static final String METHOD = "POST";
public AsyncHttpPost(String uri) throws URISyntaxException {
- super(new URI(uri), METHOD);
+ this(new URI(uri));
}
public AsyncHttpPost(URI uri) {
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequest.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequest.java
index 57d98fd..bf4705b 100644
--- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequest.java
+++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequest.java
@@ -68,4 +68,14 @@ public class AsyncHttpRequest {
protected void onConnect(AsyncHttpResponse response) {
}
+
+
+ private AsyncHttpRequestContentWriter mWriter;
+ public void setContentWriter(AsyncHttpRequestContentWriter writer) {
+ mWriter = writer;
+ }
+
+ public AsyncHttpRequestContentWriter getContentWriter() {
+ return mWriter;
+ }
}
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequestContentWriter.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequestContentWriter.java
index 1eb0f44..f015827 100644
--- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequestContentWriter.java
+++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequestContentWriter.java
@@ -1,7 +1,7 @@
package com.koushikdutta.async.http;
-import com.koushikdutta.async.DataSink;
-public abstract class AsyncHttpRequestContentWriter {
- public abstract void write(DataSink sink);
+public interface AsyncHttpRequestContentWriter {
+ public void write(AsyncHttpRequest request, AsyncHttpResponse sink);
+ public String getContentType();
}
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java
index 7a05885..5e67256 100644
--- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java
+++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java
@@ -9,4 +9,5 @@ public interface AsyncHttpResponse extends DataExchange, ExceptionEmitter {
public void setCompletedCallback(CompletedCallback handler);
public CompletedCallback getCompletedCallback();
public ResponseHeaders getHeaders();
+ public void end();
}
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java
index e6bc984..3ee6994 100644
--- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java
+++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java
@@ -32,12 +32,25 @@ public class AsyncHttpResponseImpl extends FilteredDataCallback implements Async
return mRawHeaders;
}
+ private AsyncHttpRequestContentWriter mWriter;
void setSocket(AsyncSocket socket, DataExchange exchange) {
mSocket = socket;
mExchange = exchange;
+ mWriter = mRequest.getContentWriter();
+ if (mWriter != null) {
+ mRequest.getHeaders().setContentType(mWriter.getContentType());
+ mRequest.getHeaders().getHeaders().set("Transfer-Encoding", "Chunked");
+ }
+
String rs = mRequest.getRequestString();
- Util.writeAll(exchange, rs.getBytes());
+ Util.writeAll(exchange, rs.getBytes(), new CompletedCallback() {
+ @Override
+ public void onCompleted(Exception ex) {
+ if (mWriter != null)
+ mWriter.write(mRequest, AsyncHttpResponseImpl.this);
+ }
+ });
LineEmitter liner = new LineEmitter(exchange);
liner.setLineCallback(mHeaderCallback);
@@ -67,6 +80,7 @@ public class AsyncHttpResponseImpl extends FilteredDataCallback implements Async
protected void onHeadersReceived() {
mHeaders = new ResponseHeaders(mRequest.getUri(), mRawHeaders);
+
if (mHeaders.getContentLength() == 0) {
report(null);
return;
@@ -205,7 +219,7 @@ public class AsyncHttpResponseImpl extends FilteredDataCallback implements Async
Assert.assertTrue(mRequest.getHeaders().getHeaders().get("Transfer-Encoding") != null || mRequest.getHeaders().getContentLength() != -1);
}
- FilteredDataSink mChunker;
+ ChunkedOutputFilter mChunker;
void initChunker() {
if (mChunker != null)
return;
@@ -227,6 +241,12 @@ public class AsyncHttpResponseImpl extends FilteredDataCallback implements Async
}
@Override
+ public void end() {
+ write(ByteBuffer.wrap(new byte[0]));
+ }
+
+
+ @Override
public void setWriteableCallback(WritableCallback handler) {
initChunker();
mChunker.setWriteableCallback(handler);
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/UrlEncodedFormWriter.java b/AndroidAsync/src/com/koushikdutta/async/http/UrlEncodedFormWriter.java
index dc9fd2d..854dcfb 100644
--- a/AndroidAsync/src/com/koushikdutta/async/http/UrlEncodedFormWriter.java
+++ b/AndroidAsync/src/com/koushikdutta/async/http/UrlEncodedFormWriter.java
@@ -5,15 +5,16 @@ import java.util.List;
import org.apache.http.NameValuePair;
-import com.koushikdutta.async.DataSink;
+import com.koushikdutta.async.Util;
+import com.koushikdutta.async.callback.CompletedCallback;
-public class UrlEncodedFormWriter extends AsyncHttpRequestContentWriter {
+public class UrlEncodedFormWriter implements AsyncHttpRequestContentWriter {
List<NameValuePair> mParameters;
public UrlEncodedFormWriter(List<NameValuePair> parameters) {
mParameters = parameters;
}
@Override
- public void write(DataSink sink) {
+ public void write(AsyncHttpRequest request, final AsyncHttpResponse response) {
boolean first = true;
StringBuilder b = new StringBuilder();
for (NameValuePair pair: mParameters) {
@@ -25,5 +26,15 @@ public class UrlEncodedFormWriter extends AsyncHttpRequestContentWriter {
b.append(URLEncoder.encode(pair.getValue()));
}
byte[] bytes = b.toString().getBytes();
+ Util.writeAll(response, bytes, new CompletedCallback() {
+ @Override
+ public void onCompleted(Exception ex) {
+ response.end();
+ }
+ });
+ }
+ @Override
+ public String getContentType() {
+ return "application/x-www-form-urlencoded";
}
}
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/server/AsyncHttpServerResponseImpl.java b/AndroidAsync/src/com/koushikdutta/async/http/server/AsyncHttpServerResponseImpl.java
index f5b9394..35e7154 100644
--- a/AndroidAsync/src/com/koushikdutta/async/http/server/AsyncHttpServerResponseImpl.java
+++ b/AndroidAsync/src/com/koushikdutta/async/http/server/AsyncHttpServerResponseImpl.java
@@ -35,28 +35,27 @@ public class AsyncHttpServerResponseImpl implements AsyncHttpServerResponse {
@Override
public void write(ByteBuffer bb) {
- if (!mHasWritten)
- initFirstWrite();
+ initFirstWrite();
mChunker.write(bb);
}
boolean mHasWritten = false;
FilteredDataSink mChunker;
void initFirstWrite() {
+ if (mHasWritten)
+ return;
+
Assert.assertTrue(mContentLength < 0);
Assert.assertNotNull(mRawHeaders.getStatusLine());
mRawHeaders.set("Transfer-Encoding", "Chunked");
writeHead();
mSink.setMaxBuffer(0);
mHasWritten = true;
- if (mChunker != null)
- return;
mChunker = new ChunkedOutputFilter(mSink);
}
@Override
public void write(ByteBufferList bb) {
- if (!mHasWritten)
- initFirstWrite();
+ initFirstWrite();
mChunker.write(bb);
}
diff --git a/AndroidAsyncSample/gen/com/koushikdutta/async/R.java b/AndroidAsyncSample/gen/com/koushikdutta/async/R.java
index f3dd226..a260ef9 100644
--- a/AndroidAsyncSample/gen/com/koushikdutta/async/R.java
+++ b/AndroidAsyncSample/gen/com/koushikdutta/async/R.java
@@ -15,9 +15,10 @@ public final class R {
public static final int ic_launcher=0x7f020001;
}
public static final class id {
+ public static final int chart=0x7f070004;
public static final int desksms=0x7f070002;
public static final int go=0x7f070000;
- public static final int menu_settings=0x7f070004;
+ public static final int menu_settings=0x7f070005;
public static final int rommanager=0x7f070001;
public static final int tether=0x7f070003;
}
diff --git a/AndroidAsyncSample/gen/com/koushikdutta/async/sample/R.java b/AndroidAsyncSample/gen/com/koushikdutta/async/sample/R.java
index b888225..4c6fd91 100644
--- a/AndroidAsyncSample/gen/com/koushikdutta/async/sample/R.java
+++ b/AndroidAsyncSample/gen/com/koushikdutta/async/sample/R.java
@@ -15,9 +15,10 @@ public final class R {
public static final int ic_launcher=0x7f020001;
}
public static final class id {
+ public static final int chart=0x7f070004;
public static final int desksms=0x7f070002;
public static final int go=0x7f070000;
- public static final int menu_settings=0x7f070004;
+ public static final int menu_settings=0x7f070005;
public static final int rommanager=0x7f070001;
public static final int tether=0x7f070003;
}
diff --git a/AndroidAsyncSample/res/layout/activity_main.xml b/AndroidAsyncSample/res/layout/activity_main.xml
index 8a6e550..7522766 100644
--- a/AndroidAsyncSample/res/layout/activity_main.xml
+++ b/AndroidAsyncSample/res/layout/activity_main.xml
@@ -27,4 +27,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
+ <ImageView
+ android:id="@+id/chart"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
</LinearLayout> \ No newline at end of file
diff --git a/AndroidAsyncSample/src/com/koushikdutta/async/sample/MainActivity.java b/AndroidAsyncSample/src/com/koushikdutta/async/sample/MainActivity.java
index 100fc6e..5cf7d7e 100644
--- a/AndroidAsyncSample/src/com/koushikdutta/async/sample/MainActivity.java
+++ b/AndroidAsyncSample/src/com/koushikdutta/async/sample/MainActivity.java
@@ -1,6 +1,10 @@
package com.koushikdutta.async.sample;
import java.io.File;
+import java.util.ArrayList;
+
+import org.apache.http.NameValuePair;
+import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.graphics.Bitmap;
@@ -14,12 +18,16 @@ import android.widget.Button;
import android.widget.ImageView;
import com.koushikdutta.async.http.AsyncHttpClient;
+import com.koushikdutta.async.http.AsyncHttpClient.StringCallback;
+import com.koushikdutta.async.http.AsyncHttpPost;
import com.koushikdutta.async.http.AsyncHttpResponse;
+import com.koushikdutta.async.http.UrlEncodedFormWriter;
public class MainActivity extends Activity {
ImageView rommanager;
ImageView tether;
ImageView desksms;
+ ImageView chart;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -37,6 +45,7 @@ public class MainActivity extends Activity {
rommanager = (ImageView)findViewById(R.id.rommanager);
tether = (ImageView)findViewById(R.id.tether);
desksms = (ImageView)findViewById(R.id.desksms);
+ chart = (ImageView)findViewById(R.id.chart);
}
@Override
@@ -64,17 +73,72 @@ public class MainActivity extends Activity {
});
}
+ private void getChartFile() {
+ final ImageView iv = chart;
+ final String filename = getFileStreamPath(randomFile()).getAbsolutePath();
+ ArrayList<NameValuePair> pairs = new ArrayList<NameValuePair>();
+ pairs.add(new BasicNameValuePair("cht", "lc"));
+ pairs.add(new BasicNameValuePair("chtt", "This is a google chart"));
+ pairs.add(new BasicNameValuePair("chs", "512x512"));
+ pairs.add(new BasicNameValuePair("chxt", "x"));
+ pairs.add(new BasicNameValuePair("chd", "t:40,20,50,20,100"));
+ UrlEncodedFormWriter writer = new UrlEncodedFormWriter(pairs);
+ try {
+ AsyncHttpPost post = new AsyncHttpPost("http://chart.googleapis.com/chart");
+ post.setContentWriter(writer);
+ AsyncHttpClient.execute(post, filename, new AsyncHttpClient.FileCallback() {
+ @Override
+ public void onCompleted(Exception e, AsyncHttpResponse response, File result) {
+ if (e != null) {
+ e.printStackTrace();
+ return;
+ }
+ System.out.println(result.getAbsolutePath());
+ Bitmap bitmap = BitmapFactory.decodeFile(filename);
+ result.delete();
+ if (bitmap == null)
+ return;
+ BitmapDrawable bd = new BitmapDrawable(bitmap);
+ iv.setImageDrawable(bd);
+ }
+ });
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
private String randomFile() {
return ((Long)Math.round(Math.random() * 1000)).toString() + ".png";
}
private void refresh() {
+ ArrayList<NameValuePair> pairs = new ArrayList<NameValuePair>();
+ pairs.add(new BasicNameValuePair("foo", "bar"));
+ UrlEncodedFormWriter writer = new UrlEncodedFormWriter(pairs);
+ try {
+ AsyncHttpPost post = new AsyncHttpPost("http://192.168.1.2:3000");
+ post.setContentWriter(writer);
+ AsyncHttpClient.execute(post, new StringCallback() {
+ @Override
+ public void onCompleted(Exception arg0, AsyncHttpResponse response, String result) {
+ System.out.println(arg0);
+ }
+ });
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+
+
rommanager.setImageBitmap(null);
tether.setImageBitmap(null);
desksms.setImageBitmap(null);
+ chart.setImageBitmap(null);
getFile(rommanager, "https://raw.github.com/koush/AndroidAsync/master/rommanager.png", getFileStreamPath(randomFile()).getAbsolutePath());
getFile(tether, "https://raw.github.com/koush/AndroidAsync/master/tether.png", getFileStreamPath(randomFile()).getAbsolutePath());
getFile(desksms, "https://raw.github.com/koush/AndroidAsync/master/desksms.png", getFileStreamPath(randomFile()).getAbsolutePath());
+ getChartFile();
}
}