blob: ed4f87f11a0d0d1b338d12ab00d244e0da313414 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
package com.koushikdutta.async;
import com.koushikdutta.async.callback.CompletedCallback;
import com.koushikdutta.async.callback.WritableCallback;
import java.nio.ByteBuffer;
public class BufferedDataSink implements DataSink {
DataSink mDataSink;
public BufferedDataSink(DataSink datasink) {
setDataSink(datasink);
}
public boolean isBuffering() {
return mPendingWrites.hasRemaining();
}
public DataSink getDataSink() {
return mDataSink;
}
public void setDataSink(DataSink datasink) {
mDataSink = datasink;
mDataSink.setWriteableCallback(new WritableCallback() {
@Override
public void onWriteable() {
writePending();
}
});
}
private void writePending() {
// Log.i("NIO", "Writing to buffer...");
if (mPendingWrites.hasRemaining()) {
mDataSink.write(mPendingWrites);
if (mPendingWrites.remaining() == 0) {
if (endPending)
mDataSink.end();
}
}
if (!mPendingWrites.hasRemaining() && mWritable != null)
mWritable.onWriteable();
}
ByteBufferList mPendingWrites = new ByteBufferList();
@Override
public void write(ByteBuffer bb) {
if (remaining() >= getMaxBuffer())
return;
boolean needsWrite = true;
if (!mPendingWrites.hasRemaining()) {
needsWrite = false;
mDataSink.write(bb);
}
if (bb.hasRemaining()) {
ByteBuffer dup = ByteBufferList.obtain(bb.remaining());
dup.put(bb);
dup.flip();
mPendingWrites.add(dup);
if (needsWrite)
mDataSink.write(mPendingWrites);
}
}
@Override
public void write(ByteBufferList bb) {
write(bb, false);
}
protected void write(ByteBufferList bb, boolean ignoreBuffer) {
if (!mPendingWrites.hasRemaining())
mDataSink.write(bb);
if (bb.remaining() > 0) {
int toRead = Math.min(bb.remaining(), mMaxBuffer);
if (ignoreBuffer)
toRead = bb.remaining();
if (toRead > 0) {
bb.get(mPendingWrites, toRead);
}
}
}
WritableCallback mWritable;
@Override
public void setWriteableCallback(WritableCallback handler) {
mWritable = handler;
}
@Override
public WritableCallback getWriteableCallback() {
return mWritable;
}
public int remaining() {
return mPendingWrites.remaining();
}
int mMaxBuffer = Integer.MAX_VALUE;
public int getMaxBuffer() {
return mMaxBuffer;
}
public void setMaxBuffer(int maxBuffer) {
assert maxBuffer >= 0;
mMaxBuffer = maxBuffer;
}
@Override
public boolean isOpen() {
return mDataSink.isOpen();
}
@Override
public void close() {
mDataSink.close();
}
boolean endPending;
@Override
public void end() {
if (mPendingWrites.hasRemaining()) {
endPending = true;
return;
}
mDataSink.end();
}
@Override
public void setClosedCallback(CompletedCallback handler) {
mDataSink.setClosedCallback(handler);
}
@Override
public CompletedCallback getClosedCallback() {
return mDataSink.getClosedCallback();
}
@Override
public AsyncServer getServer() {
return mDataSink.getServer();
}
}
|