aboutsummaryrefslogtreecommitdiff
path: root/src/org/gnunet/construct/parsers/FixedSizeIntegerArrayParser.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/gnunet/construct/parsers/FixedSizeIntegerArrayParser.java')
-rw-r--r--src/org/gnunet/construct/parsers/FixedSizeIntegerArrayParser.java99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/org/gnunet/construct/parsers/FixedSizeIntegerArrayParser.java b/src/org/gnunet/construct/parsers/FixedSizeIntegerArrayParser.java
new file mode 100644
index 0000000..3605e97
--- /dev/null
+++ b/src/org/gnunet/construct/parsers/FixedSizeIntegerArrayParser.java
@@ -0,0 +1,99 @@
1/*
2 This file is part of GNUnet.
3 (C) 2011, 2012 Christian Grothoff (and other contributing authors)
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19 */
20
21package org.gnunet.construct.parsers;
22
23import org.gnunet.construct.Message;
24import org.gnunet.construct.ReflectUtil;
25
26import java.lang.reflect.Array;
27import java.lang.reflect.Field;
28import java.nio.ByteBuffer;
29import java.util.List;
30
31public class FixedSizeIntegerArrayParser implements Parser {
32
33 private final int byteSize;
34 private final boolean signed;
35
36 private final Field targetField;
37
38 private final int elemNumber;
39
40 public FixedSizeIntegerArrayParser(final int elemNumber, boolean signed, int byteSize, final Field f) {
41 targetField = f;
42 this.elemNumber = elemNumber;
43 this.signed = signed;
44 this.byteSize = byteSize;
45 }
46
47 @Override
48 public int getSize(final Message srcObj) {
49 return byteSize * elemNumber;
50 }
51
52 @Override
53 public int parse(ByteBuffer srcBuf, int frameOffset,
54 Message frameObj, final Message dstObj, List<Field> frameSizePath) {
55 int size = 0;
56
57 @SuppressWarnings("unchecked")
58 final Class<Message> arrayElementType = (Class<Message>) targetField.getType().getComponentType();
59
60 if (!arrayElementType.isPrimitive()) {
61 throw new AssertionError("IntegerFillParser is expected to be of primitive type, not " + arrayElementType);
62 }
63
64 final Object arr = Array.newInstance(targetField.getType().getComponentType(), elemNumber);
65 ReflectUtil.justSet(dstObj, targetField, arr);
66
67 for (int i = 0; i < elemNumber; ++i) {
68 long v = IntegerUtil.readLong(srcBuf, signed, byteSize);
69 ReflectUtil.justSetArray(arr, i, v);
70 }
71
72 return size;
73 }
74
75 @Override
76 public int write(final ByteBuffer dstBuf,
77 final Message srcObj) {
78 int size = 0;
79 final Object arr = ReflectUtil.justGet(srcObj, targetField);
80 if (Array.getLength(arr) != elemNumber) {
81 throw new AssertionError("wrong number of elements");
82 }
83 for (int i = 0; i < Array.getLength(arr); ++i) {
84 IntegerUtil.writeLong(Array.getLong(arr, i), dstBuf, signed, byteSize);
85 size += byteSize;
86 }
87 return size;
88 }
89
90 @Override
91 public void patch(Message m, int frameSize, List<Field> frameSizePath, Message frameObj) {
92 // nothing to patch!
93 }
94
95 @Override
96 public int getStaticSize() {
97 return elemNumber * byteSize;
98 }
99}