Skip to content

Commit b817b97

Browse files
committed
Merge branch 'byte-buffer-abstraction' into tcp-support
# Conflicts: # modules/core/src/main/java/com/illposed/osc/OSCPacketDispatcher.java # modules/core/src/main/java/com/illposed/osc/OSCSerializer.java # modules/core/src/main/java/com/illposed/osc/OSCSerializerAndParserBuilder.java # modules/core/src/main/java/com/illposed/osc/argument/ArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/AwtColorArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/BlobArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/BooleanFalseArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/BooleanTrueArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/ByteArrayBlobArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/CharArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/ColorArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/DateTimeStampArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/DoubleArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/FloatArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/ImpulseArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/IntegerArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/LongArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/MidiMessageArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/NullArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/StringArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/SymbolArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/TimeTag64ArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/argument/handler/UnsignedIntegerArgumentHandler.java # modules/core/src/main/java/com/illposed/osc/transport/channel/OSCDatagramChannel.java # modules/core/src/test/java/com/illposed/osc/OSCMessageTest.java # modules/core/src/test/java/com/illposed/osc/OSCReparserTest.java # modules/core/src/test/java/com/illposed/osc/OSCSerializerTest.java # modules/core/src/test/java/com/illposed/osc/argument/handler/ColorArgumentHandlerTest.java
2 parents 5e0e548 + c4b2007 commit b817b97

36 files changed

+812
-370
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*
2+
* Copyright (C) 2017, C. Ramakrishnan / Illposed Software.
3+
* All rights reserved.
4+
*
5+
* This code is licensed under the BSD 3-Clause license.
6+
* See file LICENSE (or LICENSE.html) for more information.
7+
*/
8+
9+
package com.illposed.osc;
10+
11+
import java.nio.Buffer;
12+
import java.nio.ByteBuffer;
13+
14+
/**
15+
* Implementation of a {@link BytesReceiver} using a {@code ByteBuffer}
16+
* as the internal buffer.
17+
* This is useful if we know an upper limit for the size
18+
* of the expected data in total.
19+
* It is thus an ideal candidate for synchronous data receiving,
20+
* as is the case in TCP.
21+
*/
22+
public class BufferBytesReceiver implements BytesReceiver {
23+
24+
private final ByteBuffer buffer;
25+
26+
public BufferBytesReceiver(final ByteBuffer buffer) {
27+
this.buffer = buffer;
28+
}
29+
30+
@Override
31+
public BytesReceiver put(final byte b) {
32+
33+
buffer.put(b);
34+
return this;
35+
}
36+
37+
@Override
38+
public BytesReceiver put(final byte[] src) {
39+
40+
buffer.put(src);
41+
return this;
42+
}
43+
44+
@Override
45+
public BytesReceiver put(final ByteBuffer src) {
46+
47+
buffer.put(src);
48+
return this;
49+
}
50+
51+
@Override
52+
public BytesReceiver clear() {
53+
54+
buffer.clear();
55+
return this;
56+
}
57+
58+
@Override
59+
public int position() {
60+
return buffer.position();
61+
}
62+
63+
// HACK try to get rid of this method
64+
public ByteBuffer getBuffer() {
65+
return buffer;
66+
}
67+
68+
private class PlaceHolderImpl implements PlaceHolder {
69+
70+
private final int position;
71+
private final int size;
72+
73+
PlaceHolderImpl(final int position, final int size) {
74+
75+
this.position = position;
76+
this.size = size;
77+
}
78+
79+
@Override
80+
public void replace(final byte[] src) throws OSCSerializeException {
81+
82+
if (src.length != size) {
83+
throw new OSCSerializeException(String.format(
84+
"Trying to replace placeholder of size %d with data of size %d",
85+
size, src.length));
86+
}
87+
final int curPosition = buffer.position();
88+
buffer.position(position);
89+
put(src);
90+
buffer.position(curPosition);
91+
}
92+
}
93+
94+
@Override
95+
public PlaceHolder putPlaceHolder(final byte[] src) {
96+
97+
final PlaceHolderImpl placeHolder = new PlaceHolderImpl(position(), src.length);
98+
put(src);
99+
return placeHolder;
100+
}
101+
102+
@Override
103+
public byte[] toByteArray() {
104+
105+
buffer.flip(); // TODO check if this is always required
106+
final byte[] bytes = new byte[buffer.remaining()];
107+
buffer.get(bytes);
108+
return bytes;
109+
}
110+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/*
2+
* Copyright (C) 2017, C. Ramakrishnan / Illposed Software.
3+
* All rights reserved.
4+
*
5+
* This code is licensed under the BSD 3-Clause license.
6+
* See file LICENSE (or LICENSE.html) for more information.
7+
*/
8+
9+
package com.illposed.osc;
10+
11+
import java.io.IOException;
12+
import java.io.OutputStream;
13+
import java.nio.Buffer;
14+
import java.nio.ByteBuffer;
15+
import java.util.LinkedList;
16+
import java.util.List;
17+
18+
/**
19+
* Implementation of a {@link BytesReceiver} using a {@code List<byte[]>}
20+
* as the internal buffer.
21+
* This is useful if we do not now initially know the size
22+
* of the expected data in total, and at the same time want to prevent
23+
* re-allocating {@code ByteBuffer} or {@code byte[]}
24+
* whenever the buffer gets too small.
25+
* It is thus an ideal candidate for asynchronous data receiving,
26+
* as is the case in UDP.
27+
*/
28+
public class ByteArrayListBytesReceiver implements BytesReceiver {
29+
30+
private final List<byte[]> buffer;
31+
private int position;
32+
33+
public ByteArrayListBytesReceiver() {
34+
35+
this.buffer = new LinkedList<>();
36+
this.position = 0;
37+
}
38+
39+
@Override
40+
public BytesReceiver put(final byte b) {
41+
42+
buffer.add(new byte[] {b});
43+
position += 1;
44+
return this;
45+
}
46+
47+
@Override
48+
public BytesReceiver put(final byte[] src) {
49+
50+
buffer.add(src);
51+
position += src.length;
52+
return this;
53+
}
54+
55+
@Override
56+
public BytesReceiver put(final ByteBuffer src) {
57+
return put(src.array()); // HACK better get rid of this method altogether!
58+
}
59+
60+
@Override
61+
public BytesReceiver clear() {
62+
63+
buffer.clear();
64+
return this;
65+
}
66+
67+
@Override
68+
public int position() {
69+
return position;
70+
}
71+
72+
private class PlaceHolderImpl implements PlaceHolder {
73+
74+
private final byte[] part;
75+
76+
PlaceHolderImpl(final byte[] part) {
77+
78+
this.part = part;
79+
}
80+
81+
@Override
82+
public void replace(final byte[] src) throws OSCSerializeException {
83+
84+
if (src.length != part.length) {
85+
throw new OSCSerializeException(String.format(
86+
"Trying to replace placeholder of size %d with data of size %d",
87+
part.length, src.length));
88+
}
89+
System.arraycopy(src, 0, part, 0, src.length);
90+
}
91+
}
92+
93+
@Override
94+
public PlaceHolder putPlaceHolder(final byte[] src) {
95+
96+
final PlaceHolderImpl placeHolder = new PlaceHolderImpl(src);
97+
put(src);
98+
return placeHolder;
99+
}
100+
101+
@Override
102+
public byte[] toByteArray() {
103+
104+
final byte[] bytes = new byte[position];
105+
int curPos = 0;
106+
for (byte[] curPart : buffer) {
107+
System.arraycopy(curPart, 0, bytes, curPos, curPart.length);
108+
curPos += curPart.length;
109+
}
110+
return bytes;
111+
}
112+
113+
public void writeTo(final OutputStream out) throws IOException {
114+
115+
for (final byte[] dataPiece : buffer) {
116+
out.write(dataPiece);
117+
}
118+
}
119+
}

0 commit comments

Comments
 (0)