aboutsummaryrefslogtreecommitdiffstats
path: root/libraries/spongycastle/pg/src/main/java/org/spongycastle/bcpg/UserAttributeSubpacketInputStream.java
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/spongycastle/pg/src/main/java/org/spongycastle/bcpg/UserAttributeSubpacketInputStream.java')
-rw-r--r--libraries/spongycastle/pg/src/main/java/org/spongycastle/bcpg/UserAttributeSubpacketInputStream.java116
1 files changed, 116 insertions, 0 deletions
diff --git a/libraries/spongycastle/pg/src/main/java/org/spongycastle/bcpg/UserAttributeSubpacketInputStream.java b/libraries/spongycastle/pg/src/main/java/org/spongycastle/bcpg/UserAttributeSubpacketInputStream.java
new file mode 100644
index 000000000..ab55ea4e9
--- /dev/null
+++ b/libraries/spongycastle/pg/src/main/java/org/spongycastle/bcpg/UserAttributeSubpacketInputStream.java
@@ -0,0 +1,116 @@
+package org.spongycastle.bcpg;
+
+import java.io.*;
+
+import org.spongycastle.bcpg.attr.ImageAttribute;
+
+/**
+ * reader for user attribute sub-packets
+ */
+public class UserAttributeSubpacketInputStream
+ extends InputStream implements UserAttributeSubpacketTags
+{
+ InputStream in;
+
+ public UserAttributeSubpacketInputStream(
+ InputStream in)
+ {
+ this.in = in;
+ }
+
+ public int available()
+ throws IOException
+ {
+ return in.available();
+ }
+
+ public int read()
+ throws IOException
+ {
+ return in.read();
+ }
+
+ private void readFully(
+ byte[] buf,
+ int off,
+ int len)
+ throws IOException
+ {
+ if (len > 0)
+ {
+ int b = this.read();
+
+ if (b < 0)
+ {
+ throw new EOFException();
+ }
+
+ buf[off] = (byte)b;
+ off++;
+ len--;
+ }
+
+ while (len > 0)
+ {
+ int l = in.read(buf, off, len);
+
+ if (l < 0)
+ {
+ throw new EOFException();
+ }
+
+ off += l;
+ len -= l;
+ }
+ }
+
+ public UserAttributeSubpacket readPacket()
+ throws IOException
+ {
+ int l = this.read();
+ int bodyLen = 0;
+
+ if (l < 0)
+ {
+ return null;
+ }
+
+ if (l < 192)
+ {
+ bodyLen = l;
+ }
+ else if (l <= 223)
+ {
+ bodyLen = ((l - 192) << 8) + (in.read()) + 192;
+ }
+ else if (l == 255)
+ {
+ bodyLen = (in.read() << 24) | (in.read() << 16) | (in.read() << 8) | in.read();
+ }
+ else
+ {
+ // TODO Error?
+ }
+
+ int tag = in.read();
+
+ if (tag < 0)
+ {
+ throw new EOFException("unexpected EOF reading user attribute sub packet");
+ }
+
+ byte[] data = new byte[bodyLen - 1];
+
+ this.readFully(data, 0, data.length);
+
+ int type = tag;
+
+ switch (type)
+ {
+ case IMAGE_ATTRIBUTE:
+ return new ImageAttribute(data);
+ }
+
+ return new UserAttributeSubpacket(type, data);
+ }
+}