package com.google.bitcoin.bouncycastle.asn1.tsp;
import com.google.bitcoin.bouncycastle.asn1.ASN1Encodable;
import com.google.bitcoin.bouncycastle.asn1.ASN1EncodableVector;
import com.google.bitcoin.bouncycastle.asn1.ASN1Sequence;
import com.google.bitcoin.bouncycastle.asn1.DERInteger;
import com.google.bitcoin.bouncycastle.asn1.DERObject;
import com.google.bitcoin.bouncycastle.asn1.DERSequence;
import com.google.bitcoin.bouncycastle.asn1.DERTaggedObject;
public class Accuracy
extends ASN1Encodable
{
DERInteger seconds;
DERInteger millis;
DERInteger micros;
// constantes
protected static final int MIN_MILLIS = 1;
protected static final int MAX_MILLIS = 999;
protected static final int MIN_MICROS = 1;
protected static final int MAX_MICROS = 999;
protected Accuracy()
{
}
public Accuracy(
DERInteger seconds,
DERInteger millis,
DERInteger micros)
{
this.seconds = seconds;
//Verifications
if (millis != null
&& (millis.getValue().intValue() < MIN_MILLIS || millis
.getValue().intValue() > MAX_MILLIS))
{
throw new IllegalArgumentException(
"Invalid millis field : not in (1..999)");
}
else
{
this.millis = millis;
}
if (micros != null
&& (micros.getValue().intValue() < MIN_MICROS || micros
.getValue().intValue() > MAX_MICROS))
{
throw new IllegalArgumentException(
"Invalid micros field : not in (1..999)");
}
else
{
this.micros = micros;
}
}
public Accuracy(ASN1Sequence seq)
{
seconds = null;
millis = null;
micros = null;
for (int i = 0; i < seq.size(); i++)
{
// seconds
if (seq.getObjectAt(i) instanceof DERInteger)
{
seconds = (DERInteger) seq.getObjectAt(i);
}
else if (seq.getObjectAt(i) instanceof DERTaggedObject)
{
DERTaggedObject extra = (DERTaggedObject) seq.getObjectAt(i);
switch (extra.getTagNo())
{
case 0:
millis = DERInteger.getInstance(extra, false);
if (millis.getValue().intValue() < MIN_MILLIS
|| millis.getValue().intValue() > MAX_MILLIS)
{
throw new IllegalArgumentException(
"Invalid millis field : not in (1..999).");
}
break;
case 1:
micros = DERInteger.getInstance(extra, false);
if (micros.getValue().intValue() < MIN_MICROS
|| micros.getValue().intValue() > MAX_MICROS)
{
throw new IllegalArgumentException(
"Invalid micros field : not in (1..999).");
}
break;
default:
throw new IllegalArgumentException("Invalig tag number");
}
}
}
}
public static Accuracy getInstance(Object o)
{
if (o == null || o instanceof Accuracy)
{
return (Accuracy) o;
}
else if (o instanceof ASN1Sequence)
{
return new Accuracy((ASN1Sequence) o);
}
throw new IllegalArgumentException(
"Unknown object in 'Accuracy' factory : "
+ o.getClass().getName() + ".");
}
public DERInteger getSeconds()
{
return seconds;
}
public DERInteger getMillis()
{
return millis;
}
public DERInteger getMicros()
{
return micros;
}
/**
* <pre>
* Accuracy ::= SEQUENCE {
* seconds INTEGER OPTIONAL,
* millis [0] INTEGER (1..999) OPTIONAL,
* micros [1] INTEGER (1..999) OPTIONAL
* }
* </pre>
*/
public DERObject toASN1Object()
{
ASN1EncodableVector v = new ASN1EncodableVector();
if (seconds != null)
{
v.add(seconds);
}
if (millis != null)
{
v.add(new DERTaggedObject(false, 0, millis));
}
if (micros != null)
{
v.add(new DERTaggedObject(false, 1, micros));
}
return new DERSequence(v);
}
}