diff options
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(); } } |