From dbb7eb3d8831f47c22336c884d5172e41118188e Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 14 May 2014 12:15:57 +0000 Subject: [PATCH] * I2CP: Prep for per-message reliability settings (ticket #788) Add bounds checks for flags --- .../net/i2p/client/SendMessageOptions.java | 64 +++++++++++++++++++ core/java/src/net/i2p/data/DateAndFlags.java | 8 +++ 2 files changed, 72 insertions(+) diff --git a/core/java/src/net/i2p/client/SendMessageOptions.java b/core/java/src/net/i2p/client/SendMessageOptions.java index 996986495..2b72892d7 100644 --- a/core/java/src/net/i2p/client/SendMessageOptions.java +++ b/core/java/src/net/i2p/client/SendMessageOptions.java @@ -48,6 +48,16 @@ public class SendMessageOptions extends DateAndFlags { 35, 45, 57, 72, 92, 117, 147, 192 }; + /** + * Reliability bits 9-10 + * @since 0.9.14 + */ + public enum Reliability { DEFAULT, BEST_EFFORT, GUARANTEED, UNDEFINED } + + private static final int BEST_EFFORT_MASK = 0x0200; + private static final int GUARANTEED_MASK = 0x0400; + private static final int RELIABILITY_MASK = BEST_EFFORT_MASK | GUARANTEED_MASK; + /** default true */ public void setSendLeaseSet(boolean yes) { if (yes) @@ -141,4 +151,58 @@ public class SendMessageOptions extends DateAndFlags { private static int codeToVal(int code, int[] codes) { return codes[code]; } + + /** + * default Reliability.DEFAULT + * @since 0.9.14 + */ + public void setReliability(Reliability r) { + _flags &= ~RELIABILITY_MASK; + switch (r) { + case BEST_EFFORT: + _flags |= BEST_EFFORT_MASK; + break; + + case GUARANTEED: + _flags |= GUARANTEED_MASK; + break; + + case UNDEFINED: + _flags |= RELIABILITY_MASK; + break; + + case DEFAULT: + default: + break; + } + } + + /** + * default Reliability.DEFAULT + * @since 0.9.14 + */ + public Reliability getReliability() { + return getReliability(_flags); + } + + /** + * default Reliability.DEFAULT + * @since 0.9.14 + */ + public static Reliability getReliability(int flags) { + switch (flags & RELIABILITY_MASK) { + case BEST_EFFORT_MASK: + return Reliability.BEST_EFFORT; + + case GUARANTEED_MASK: + return Reliability.GUARANTEED; + + default: + case RELIABILITY_MASK: + return Reliability.UNDEFINED; + + case 0: + return Reliability.DEFAULT; + } + } } diff --git a/core/java/src/net/i2p/data/DateAndFlags.java b/core/java/src/net/i2p/data/DateAndFlags.java index 24de09e36..8b1cbedc0 100644 --- a/core/java/src/net/i2p/data/DateAndFlags.java +++ b/core/java/src/net/i2p/data/DateAndFlags.java @@ -21,6 +21,8 @@ import java.util.Date; * be designed so that a flags value of 0 is the default, for * compatibility with an 8-byte Date. * + * See extending class net.i2p.client.SendMessageOptions for more info. + * * If we really need some more bits we could use the first few bits * of the third byte. * @@ -37,6 +39,8 @@ public class DateAndFlags extends DataStructureImpl { * @param flags 0 - 65535 */ public DateAndFlags(long date, int flags) { + if (flags < 0 || flags > 65535) + throw new IllegalArgumentException(); _flags = flags; _date = date; } @@ -45,6 +49,8 @@ public class DateAndFlags extends DataStructureImpl { * @param flags 0 - 65535 */ public DateAndFlags(Date date, int flags) { + if (flags < 0 || flags > 65535) + throw new IllegalArgumentException(); _flags = flags; _date = date.getTime(); } @@ -57,6 +63,8 @@ public class DateAndFlags extends DataStructureImpl { * @param flags 0 - 65535 */ public void setFlags(int flags) { + if (flags < 0 || flags > 65535) + throw new IllegalArgumentException(); _flags = flags; }