/*
|
* CDDL HEADER START
|
*
|
* The contents of this file are subject to the terms of the
|
* Common Development and Distribution License, Version 1.0 only
|
* (the "License"). You may not use this file except in compliance
|
* with the License.
|
*
|
* You can obtain a copy of the license at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
|
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
|
* See the License for the specific language governing permissions
|
* and limitations under the License.
|
*
|
* When distributing Covered Code, include this CDDL HEADER in each
|
* file and include the License file at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
|
* add the following below this CDDL HEADER, with the fields enclosed
|
* by brackets "[]" replaced with your own identifying information:
|
* Portions Copyright [yyyy] [name of copyright owner]
|
*
|
* CDDL HEADER END
|
*
|
*
|
* Copyright 2006-2009 Sun Microsystems, Inc.
|
* Portions Copyright 2012 Forgerock AS
|
*/
|
package org.opends.server.protocols.asn1;
|
|
|
|
import java.io.Closeable;
|
import java.io.IOException;
|
|
import org.opends.server.types.ByteString;
|
import org.opends.server.types.ByteStringBuilder;
|
|
|
/**
|
* An interface for decoding ASN.1 elements from a data source.
|
* <p>
|
* Methods for creating {@link ASN1Reader}s are provided in the
|
* {@link ASN1} class.
|
*/
|
public interface ASN1Reader extends Closeable
|
{
|
|
/**
|
* Closes this ASN.1 reader.
|
*
|
* @throws IOException if an I/O error occurs
|
*/
|
void close() throws IOException;
|
|
|
|
/**
|
* Determines if a complete ASN.1 element is waiting to be read.
|
*
|
* @return <code>true</code> if another complete element is available or
|
* <code>false</code> otherwise.
|
* @throws ASN1Exception If an error occurs while trying to decode
|
* an ASN1 element.
|
*/
|
public boolean elementAvailable() throws ASN1Exception;
|
|
|
|
/**
|
* Determines if at least one ASN.1 element is waiting to be read.
|
*
|
* @return <code>true</code> if another element is available or
|
* <code>false</code> if the EOF is reached.
|
* @throws ASN1Exception
|
* If an error occurs while trying to decode an ASN1
|
* element.
|
*/
|
boolean hasNextElement() throws ASN1Exception;
|
|
|
|
/**
|
* Gets the data length of the next element without actually reading
|
* the element and advancing the cursor.
|
*
|
* @return The data length of the next element or -1 if the EOF is
|
* encountered.
|
* @throws ASN1Exception
|
* If an error occurs while determining the length.
|
*/
|
int peekLength() throws ASN1Exception;
|
|
|
|
/**
|
* Gets the BER type of the next element without actually reading
|
* the element and advancing the cursor.
|
*
|
* @return The BER type of the next element or -1 if the EOF is
|
* encountered.
|
* @throws ASN1Exception
|
* If an error occurs while determining the BER type.
|
*/
|
byte peekType() throws ASN1Exception;
|
|
|
|
/**
|
* Reads the next ASN.1 element as a boolean and advance the cursor.
|
*
|
* @return The decoded boolean value.
|
* @throws ASN1Exception
|
* If the element cannot be decoded as a boolean.
|
*/
|
boolean readBoolean() throws ASN1Exception;
|
|
|
|
/**
|
* Finishes reading an explicit tag. Any elements not read in the
|
* explicit tag will be discarded.
|
*
|
* @throws ASN1Exception
|
* If an error occurs while advancing to the end of the
|
* explicit tag.
|
*/
|
void readEndExplicitTag() throws ASN1Exception;
|
|
|
|
/**
|
* Finishes reading a sequence. Any elements not read in the
|
* sequence will be discarded.
|
*
|
* @throws ASN1Exception
|
* If an error occurs while advancing to the end of the
|
* sequence.
|
*/
|
void readEndSequence() throws ASN1Exception;
|
|
|
|
/**
|
* Finishes reading a set. Any elements not read in the set will be
|
* discarded.
|
*
|
* @throws ASN1Exception
|
* If an error occurs while advancing to the end of the set.
|
*/
|
void readEndSet() throws ASN1Exception;
|
|
|
|
/**
|
* Reads the next ASN.1 element as an enumerated value and advances
|
* the cursor.
|
*
|
* @return The decoded enumerated value.
|
* @throws ASN1Exception
|
* If the element cannot be decoded as an enumerated value.
|
*/
|
int readEnumerated() throws ASN1Exception;
|
|
|
|
/**
|
* Reads the next ASN.1 element as an integer and advances the
|
* cursor.
|
*
|
* @return The decoded integer value.
|
* @throws ASN1Exception
|
* If the element cannot be decoded as a integer.
|
*/
|
long readInteger() throws ASN1Exception;
|
|
|
|
/**
|
* Reads the next ASN.1 element as a null element and advances the
|
* cursor.
|
*
|
* @throws ASN1Exception
|
* If the element cannot be decoded as an null element.
|
*/
|
void readNull() throws ASN1Exception;
|
|
|
|
/**
|
* Reads the next ASN.1 element as an octet string and advances the
|
* cursor.
|
*
|
* @return The decoded octet string value represented using a
|
* {@link ByteString}.
|
* @throws ASN1Exception
|
* If the element cannot be decoded as an octet string.
|
*/
|
ByteString readOctetString() throws ASN1Exception;
|
|
|
|
/**
|
* Reads the next ASN.1 element as an octet string and advances the
|
* cursor. The data will be appended to the provided
|
* {@link ByteStringBuilder}.
|
*
|
* @param buffer
|
* The {@link ByteStringBuilder} to append the data to.
|
* @throws ASN1Exception
|
* If the element cannot be decoded as an octet string.
|
*/
|
void readOctetString(ByteStringBuilder buffer) throws ASN1Exception;
|
|
|
|
/**
|
* Reads the next ASN.1 element as an octet string and advances the
|
* cursor. The data will be decoded to a UTF-8 string. This method
|
* is equivalent to:
|
*
|
* <pre>
|
* readOctetStringAsString("UTF-8");
|
* </pre>
|
*
|
* @return The string representation of the octet string data.
|
* @throws ASN1Exception
|
* If the element cannot be decoded as an octet string.
|
*/
|
String readOctetStringAsString() throws ASN1Exception;
|
|
|
|
/**
|
* Reads the next ASN.1 element as an octet string and advances the
|
* cursor. The data will be decoded to a string using the provided
|
* character set.
|
*
|
* @param charSet
|
* The character set to use in order to decode the data
|
* into a string.
|
* @return The string representation of the octet string data.
|
* @throws ASN1Exception
|
* If the element cannot be decoded as an octet string.
|
*/
|
String readOctetStringAsString(String charSet) throws ASN1Exception;
|
|
|
|
/**
|
* Reads the next ASN.1 element as an explicit tag. All further
|
* reads will read the elements in the explicit tag until
|
* {@link #readEndExplicitTag()} is called.
|
*
|
* @throws ASN1Exception
|
* If the next element is not an explicit tag.
|
*/
|
void readStartExplicitTag() throws ASN1Exception;
|
|
|
|
/**
|
* Reads the next ASN.1 element as a sequence. All further reads
|
* will read the elements in the sequence until
|
* {@link #readEndSequence()} is called.
|
*
|
* @throws ASN1Exception
|
* If the next element is not a sequence.
|
*/
|
void readStartSequence() throws ASN1Exception;
|
|
|
|
/**
|
* Reads the next ASN.1 element as a set. All further reads will read
|
* the elements in the sequence until {@link #readEndSet()} is called.
|
*
|
* @throws ASN1Exception
|
* If the next element is not a set.
|
*/
|
void readStartSet() throws ASN1Exception;
|
|
|
|
/**
|
* Advances this ASN.1 reader beyond the next ASN.1 element without
|
* decoding it.
|
*
|
* @throws ASN1Exception
|
* If the next ASN.1 element could not be skipped.
|
*/
|
void skipElement() throws ASN1Exception;
|
}
|