Skip to content

Commit 1f722a2

Browse files
committed
Add support for payload.
Signed-off-by: Łukasz Dywicki <luke@code-house.org>
1 parent b1dee8c commit 1f722a2

4 files changed

Lines changed: 230 additions & 13 deletions

File tree

plc4j/drivers/sip/src/main/generated/org/apache/plc4x/java/sip/readwrite/SipPDU.java

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,13 @@ public class SipPDU implements Message {
4141
// Properties.
4242
protected final SipRequestLine requestLine;
4343
protected final List<Header> headers;
44+
protected final byte[] payload;
4445

45-
public SipPDU(SipRequestLine requestLine, List<Header> headers) {
46+
public SipPDU(SipRequestLine requestLine, List<Header> headers, byte[] payload) {
4647
super();
4748
this.requestLine = requestLine;
4849
this.headers = headers;
50+
this.payload = payload;
4951
}
5052

5153
public SipRequestLine getRequestLine() {
@@ -56,6 +58,10 @@ public List<Header> getHeaders() {
5658
return headers;
5759
}
5860

61+
public byte[] getPayload() {
62+
return payload;
63+
}
64+
5965
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
6066
PositionAware positionAware = writeBuffer;
6167
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
@@ -72,6 +78,13 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException {
7278
writeComplexTypeArrayField(
7379
"headers", headers, writeBuffer, WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
7480

81+
// Array Field (payload)
82+
writeByteArrayField(
83+
"payload",
84+
payload,
85+
writeByteArray(writeBuffer, 8),
86+
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
87+
7588
// Reserved Field (reserved)
7689
writeReservedField(
7790
"reserved",
@@ -110,6 +123,11 @@ public int getLengthInBits() {
110123
}
111124
}
112125

126+
// Array field
127+
if (payload != null) {
128+
lengthInBits += 8 * payload.length;
129+
}
130+
113131
// Reserved Field (reserved)
114132
lengthInBits += 8;
115133

@@ -134,7 +152,16 @@ public static SipPDU staticParse(ReadBuffer readBuffer, Integer len) throws Pars
134152
readLengthArrayField(
135153
"headers",
136154
readComplex(() -> Header.staticParse(readBuffer), readBuffer),
137-
((len) - (requestLine.getLengthInBytes())) - (2),
155+
org.apache.plc4x.java.sip.readwrite.utils.StaticHelper.untilToken(
156+
readBuffer, "\r\n\r\n", 2),
157+
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
158+
159+
byte[] payload =
160+
readBuffer.readByteArray(
161+
"payload",
162+
Math.toIntExact(
163+
(((len) - (requestLine.getLengthInBytes())) - (ARRAY_SIZE_IN_BYTES(headers)))
164+
- (2)),
138165
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
139166

140167
Byte reservedField0 =
@@ -154,7 +181,7 @@ public static SipPDU staticParse(ReadBuffer readBuffer, Integer len) throws Pars
154181
readBuffer.closeContext("SipPDU");
155182
// Create the instance
156183
SipPDU _sipPDU;
157-
_sipPDU = new SipPDU(requestLine, headers);
184+
_sipPDU = new SipPDU(requestLine, headers, payload);
158185
return _sipPDU;
159186
}
160187

@@ -169,12 +196,13 @@ public boolean equals(Object o) {
169196
SipPDU that = (SipPDU) o;
170197
return (getRequestLine() == that.getRequestLine())
171198
&& (getHeaders() == that.getHeaders())
199+
&& (getPayload() == that.getPayload())
172200
&& true;
173201
}
174202

175203
@Override
176204
public int hashCode() {
177-
return Objects.hash(getRequestLine(), getHeaders());
205+
return Objects.hash(getRequestLine(), getHeaders(), getPayload());
178206
}
179207

180208
@Override

plc4j/drivers/sip/src/main/java/org/apache/plc4x/java/sip/readwrite/utils/StaticHelper.java

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.apache.plc4x.java.sip.readwrite.utils;
2121

22+
import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
2223
import org.apache.plc4x.java.spi.generation.ParseException;
2324
import org.apache.plc4x.java.spi.generation.ReadBuffer;
2425
import org.apache.plc4x.java.spi.generation.SerializationException;
@@ -30,19 +31,52 @@ public static String asString(byte[] bytes) {
3031
return new String(bytes);
3132
}
3233

33-
public static boolean until(ReadBuffer readBuffer, String terminator) throws ParseException {
34+
public static int untilToken(ReadBuffer readBuffer, String terminator, int keep) {
3435
int start = readBuffer.getPos();
3536
StringBuilder buffer = new StringBuilder();
3637
int length = terminator.length();
3738
int retrieved = 0;
39+
boolean success = false;
3840
while (readBuffer.hasMore(8) && retrieved < length) {
39-
buffer.append((char) readBuffer.readByte());
40-
if (buffer.length() == length) {
41-
if (buffer.toString().equals(terminator)) {
42-
readBuffer.reset(start + length - 1);
43-
return false;
41+
try {
42+
buffer.append((char) readBuffer.readByte());
43+
if (buffer.length() >= length) {
44+
if (buffer.toString().endsWith(terminator)) {
45+
success = true;
46+
break;
47+
}
48+
}
49+
} catch (ParseException e) {
50+
throw new RuntimeException(e);
51+
}
52+
}
53+
54+
if (!success) {
55+
throw new PlcRuntimeException("Failed to reach termination sequence for array");
56+
}
57+
58+
int end = readBuffer.getPos();
59+
readBuffer.reset(start);
60+
return end - start - keep;
61+
}
62+
63+
public static boolean until(ReadBuffer readBuffer, String terminator) {
64+
int start = readBuffer.getPos();
65+
StringBuilder buffer = new StringBuilder();
66+
int length = terminator.length();
67+
int retrieved = 0;
68+
while (readBuffer.hasMore(8) && retrieved < length) {
69+
try {
70+
buffer.append((char) readBuffer.readByte());
71+
if (buffer.length() == length) {
72+
if (buffer.toString().equals(terminator)) {
73+
readBuffer.reset(start + length - 1);
74+
return false;
75+
}
76+
break;
4477
}
45-
break;
78+
} catch (ParseException e) {
79+
throw new RuntimeException(e);
4680
}
4781
}
4882

protocols/sip/src/main/resources/protocols/sip/sip.mspec

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88

99
[type SipPDU (uint 16 len) byteOrder='BIG_ENDIAN'
1010
[simple SipRequestLine requestLine]
11-
[array Header headers length 'len - requestLine.lengthInBytes - 2']
12-
//[array byte data count 'len - requestLine.lengthInBytes - 2']
11+
[array Header headers length 'STATIC_CALL("untilToken", readBuffer, "\r\n\r\n", 2)']
12+
[array byte payload length 'len - requestLine.lengthInBytes - ARRAY_SIZE_IN_BYTES(headers) - 2']
1313
[reserved byte 8 'Constants.R']
1414
[reserved byte 8 'Constants.N']
15+
1516
]
1617

1718
[type Header

protocols/sip/src/test/resources/protocols/sip/ParserSerializerTestsuite.xml

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,160 @@
131131
<N dataType="byte" bitLength="8">0x0a</N>
132132
</Header>
133133
</headers>
134+
<payload dataType="byte" bitLength="0">0x</payload>
135+
<reserved dataType="byte" bitLength="8">0x0d</reserved>
136+
<reserved dataType="byte" bitLength="8">0x0a</reserved>
137+
</SipPDU>
138+
</xml>
139+
</testcase>
140+
141+
<testcase>
142+
<name>Invite</name>
143+
<raw>494e56495445207369703a30303937323339323837303434407369702e6379626572636974792e646b205349502f322e300d0a5669613a205349502f322e302f554450203139322e3136382e312e323b6272616e63683d7a39684734624b6e7032303233383237352d34373839323762613139322e3136382e312e323b72706f72740d0a46726f6d3a20226172696b22203c7369703a3335313034373233407369702e6379626572636974792e646b3e3b7461673d313735613164640d0a546f3a203c7369703a30303937323339323837303434407369702e6379626572636974792e646b3e0d0a43616c6c2d49443a2032343438373339312d3434396266326130403139322e3136382e312e320d0a435365713a203220494e564954450d0a50726f78792d417574686f72697a6174696f6e3a2044696765737420757365726e616d653d22766f693138303632222c7265616c6d3d227369702e6379626572636974792e646b222c7572693d227369703a3139322e3136382e312e32222c6e6f6e63653d2231373031623937623465623663363664363464306232306635613062656638222c6f70617175653d22313730316131333531663730373935222c6e633d223030303030303031222c726573706f6e73653d223062373939306262323164353537326436353731653937623938633664373066220d0a436f6e74656e742d547970653a206170706c69636174696f6e2f7364700d0a436f6e74656e742d4c656e6774683a203237300d0a446174653a204d6f6e2c203034204a756c20323030352030393a35343a323520474d540d0a436f6e746163743a203c7369703a3335313034373233403139322e3136382e312e323e0d0a457870697265733a203132300d0a4163636570743a206170706c69636174696f6e2f7364700d0a4d61782d466f7277617264733a2037300d0a557365722d4167656e743a204e65726f2053495050532049502050686f6e652056657273696f6e20322e302e35312e31360d0a416c6c6f773a20494e564954452c2041434b2c2043414e43454c2c204259452c2052454645522c204f5054494f4e532c204e4f544946592c20494e464f0d0a0d0a763d300d0a6f3d534950505320323434363634323220323434363634313820494e20495034203139322e3136382e312e320d0a733d5349502063616c6c0d0a633d494e20495034203139322e3136382e312e320d0a743d3020300d0a6d3d617564696f203330303030205254502f41565020302038203937203220330d0a613d7274706d61703a302070636d752f383030300d0a613d7274706d61703a382070636d612f383030300d0a613d7274706d61703a393720694c42432f383030300d0a613d7274706d61703a3220473732362d33322f383030300d0a613d7274706d61703a332047534d2f383030300d0a613d666d74703a3937206d6f64653d32300d0a613d73656e64726563760d0a</raw>
144+
<root-type>SipPDU</root-type>
145+
<parser-arguments>
146+
<len>1076</len>
147+
</parser-arguments>
148+
<xml>
149+
<SipPDU>
150+
<requestLine>
151+
<SipRequestLine>
152+
<value dataType="string" bitLength="48" encoding="UTF-8">INVITE</value>
153+
<reserved dataType="byte" bitLength="8">0x20</reserved>
154+
<value dataType="string" bitLength="24" encoding="UTF-8">sip</value>
155+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
156+
<value dataType="string" bitLength="240" encoding="UTF-8">0097239287044@sip.cybercity.dk</value>
157+
<reserved dataType="byte" bitLength="8">0x20</reserved>
158+
<value dataType="string" bitLength="24" encoding="UTF-8">SIP</value>
159+
<reserved dataType="byte" bitLength="8">0x2f</reserved>
160+
<value dataType="string" bitLength="24" encoding="UTF-8">2.0</value>
161+
<reserved dataType="byte" bitLength="8">0x0d</reserved>
162+
<reserved dataType="byte" bitLength="8">0x0a</reserved>
163+
</SipRequestLine>
164+
</requestLine>
165+
<headers isList="true">
166+
<Header>
167+
<value dataType="string" bitLength="24" encoding="UTF-8">Via</value>
168+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
169+
<reserved dataType="byte" bitLength="8">0x20</reserved>
170+
<value dataType="string" bitLength="592" encoding="UTF-8">SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp20238275-478927ba192.168.1.2;rport</value>
171+
<R dataType="byte" bitLength="8">0x0d</R>
172+
<N dataType="byte" bitLength="8">0x0a</N>
173+
</Header>
174+
<Header>
175+
<value dataType="string" bitLength="32" encoding="UTF-8">From</value>
176+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
177+
<reserved dataType="byte" bitLength="8">0x20</reserved>
178+
<value dataType="string" bitLength="400" encoding="UTF-8">"arik" &lt;sip:35104723@sip.cybercity.dk>;tag=175a1dd</value>
179+
<R dataType="byte" bitLength="8">0x0d</R>
180+
<N dataType="byte" bitLength="8">0x0a</N>
181+
</Header>
182+
<Header>
183+
<value dataType="string" bitLength="16" encoding="UTF-8">To</value>
184+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
185+
<reserved dataType="byte" bitLength="8">0x20</reserved>
186+
<value dataType="string" bitLength="288" encoding="UTF-8">&lt;sip:0097239287044@sip.cybercity.dk></value>
187+
<R dataType="byte" bitLength="8">0x0d</R>
188+
<N dataType="byte" bitLength="8">0x0a</N>
189+
</Header>
190+
<Header>
191+
<value dataType="string" bitLength="56" encoding="UTF-8">Call-ID</value>
192+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
193+
<reserved dataType="byte" bitLength="8">0x20</reserved>
194+
<value dataType="string" bitLength="232" encoding="UTF-8">24487391-449bf2a0@192.168.1.2</value>
195+
<R dataType="byte" bitLength="8">0x0d</R>
196+
<N dataType="byte" bitLength="8">0x0a</N>
197+
</Header>
198+
<Header>
199+
<value dataType="string" bitLength="32" encoding="UTF-8">CSeq</value>
200+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
201+
<reserved dataType="byte" bitLength="8">0x20</reserved>
202+
<value dataType="string" bitLength="64" encoding="UTF-8">2 INVITE</value>
203+
<R dataType="byte" bitLength="8">0x0d</R>
204+
<N dataType="byte" bitLength="8">0x0a</N>
205+
</Header>
206+
<Header>
207+
<value dataType="string" bitLength="152" encoding="UTF-8">Proxy-Authorization</value>
208+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
209+
<reserved dataType="byte" bitLength="8">0x20</reserved>
210+
<value dataType="string" bitLength="1568" encoding="UTF-8">Digest username="voi18062",realm="sip.cybercity.dk",uri="sip:192.168.1.2",nonce="1701b97b4eb6c66d64d0b20f5a0bef8",opaque="1701a1351f70795",nc="00000001",response="0b7990bb21d5572d6571e97b98c6d70f"</value>
211+
<R dataType="byte" bitLength="8">0x0d</R>
212+
<N dataType="byte" bitLength="8">0x0a</N>
213+
</Header>
214+
<Header>
215+
<value dataType="string" bitLength="96" encoding="UTF-8">Content-Type</value>
216+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
217+
<reserved dataType="byte" bitLength="8">0x20</reserved>
218+
<value dataType="string" bitLength="120" encoding="UTF-8">application/sdp</value>
219+
<R dataType="byte" bitLength="8">0x0d</R>
220+
<N dataType="byte" bitLength="8">0x0a</N>
221+
</Header>
222+
<Header>
223+
<value dataType="string" bitLength="112" encoding="UTF-8">Content-Length</value>
224+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
225+
<reserved dataType="byte" bitLength="8">0x20</reserved>
226+
<value dataType="string" bitLength="24" encoding="UTF-8">270</value>
227+
<R dataType="byte" bitLength="8">0x0d</R>
228+
<N dataType="byte" bitLength="8">0x0a</N>
229+
</Header>
230+
<Header>
231+
<value dataType="string" bitLength="32" encoding="UTF-8">Date</value>
232+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
233+
<reserved dataType="byte" bitLength="8">0x20</reserved>
234+
<value dataType="string" bitLength="232" encoding="UTF-8">Mon, 04 Jul 2005 09:54:25 GMT</value>
235+
<R dataType="byte" bitLength="8">0x0d</R>
236+
<N dataType="byte" bitLength="8">0x0a</N>
237+
</Header>
238+
<Header>
239+
<value dataType="string" bitLength="56" encoding="UTF-8">Contact</value>
240+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
241+
<reserved dataType="byte" bitLength="8">0x20</reserved>
242+
<value dataType="string" bitLength="208" encoding="UTF-8">&lt;sip:35104723@192.168.1.2></value>
243+
<R dataType="byte" bitLength="8">0x0d</R>
244+
<N dataType="byte" bitLength="8">0x0a</N>
245+
</Header>
246+
<Header>
247+
<value dataType="string" bitLength="56" encoding="UTF-8">Expires</value>
248+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
249+
<reserved dataType="byte" bitLength="8">0x20</reserved>
250+
<value dataType="string" bitLength="24" encoding="UTF-8">120</value>
251+
<R dataType="byte" bitLength="8">0x0d</R>
252+
<N dataType="byte" bitLength="8">0x0a</N>
253+
</Header>
254+
<Header>
255+
<value dataType="string" bitLength="48" encoding="UTF-8">Accept</value>
256+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
257+
<reserved dataType="byte" bitLength="8">0x20</reserved>
258+
<value dataType="string" bitLength="120" encoding="UTF-8">application/sdp</value>
259+
<R dataType="byte" bitLength="8">0x0d</R>
260+
<N dataType="byte" bitLength="8">0x0a</N>
261+
</Header>
262+
<Header>
263+
<value dataType="string" bitLength="96" encoding="UTF-8">Max-Forwards</value>
264+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
265+
<reserved dataType="byte" bitLength="8">0x20</reserved>
266+
<value dataType="string" bitLength="16" encoding="UTF-8">70</value>
267+
<R dataType="byte" bitLength="8">0x0d</R>
268+
<N dataType="byte" bitLength="8">0x0a</N>
269+
</Header>
270+
<Header>
271+
<value dataType="string" bitLength="80" encoding="UTF-8">User-Agent</value>
272+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
273+
<reserved dataType="byte" bitLength="8">0x20</reserved>
274+
<value dataType="string" bitLength="296" encoding="UTF-8">Nero SIPPS IP Phone Version 2.0.51.16</value>
275+
<R dataType="byte" bitLength="8">0x0d</R>
276+
<N dataType="byte" bitLength="8">0x0a</N>
277+
</Header>
278+
<Header>
279+
<value dataType="string" bitLength="40" encoding="UTF-8">Allow</value>
280+
<reserved dataType="byte" bitLength="8">0x3a</reserved>
281+
<reserved dataType="byte" bitLength="8">0x20</reserved>
282+
<value dataType="string" bitLength="432" encoding="UTF-8">INVITE, ACK, CANCEL, BYE, REFER, OPTIONS, NOTIFY, INFO</value>
283+
<R dataType="byte" bitLength="8">0x0d</R>
284+
<N dataType="byte" bitLength="8">0x0a</N>
285+
</Header>
286+
</headers>
287+
<payload dataType="byte" bitLength="2160">0x0d0a763d300d0a6f3d534950505320323434363634323220323434363634313820494e20495034203139322e3136382e312e320d0a733d5349502063616c6c0d0a633d494e20495034203139322e3136382e312e320d0a743d3020300d0a6d3d617564696f203330303030205254502f41565020302038203937203220330d0a613d7274706d61703a302070636d752f383030300d0a613d7274706d61703a382070636d612f383030300d0a613d7274706d61703a393720694c42432f383030300d0a613d7274706d61703a3220473732362d33322f383030300d0a613d7274706d61703a332047534d2f383030300d0a613d666d74703a3937206d6f64653d32300d0a613d73656e6472656376</payload>
134288
<reserved dataType="byte" bitLength="8">0x0d</reserved>
135289
<reserved dataType="byte" bitLength="8">0x0a</reserved>
136290
</SipPDU>

0 commit comments

Comments
 (0)