1    package org.bouncycastle.asn1;
2    
3    import java.io.*;
4    
5    /**
6     * DER PrintableString object.
7     */
8    public class DERPrintableString
9        extends DERObject
10       implements DERString
11   {
12       String  string;
13   
14       /**
15        * return a printable string from the passed in object.
16        * 
17        * @exception IllegalArgumentException if the object cannot be converted.
18        */
19       public static DERPrintableString getInstance(
20           Object  obj)
21       {
22           if (obj == null || obj instanceof DERPrintableString)
23           {
24               return (DERPrintableString)obj;
25           }
26   
27           if (obj instanceof ASN1OctetString)
28           {
29               return new DERPrintableString(((ASN1OctetString)obj).getOctets());
30           }
31   
32           if (obj instanceof ASN1TaggedObject)
33           {
34               return getInstance(((ASN1TaggedObject)obj).getObject());
35           }
36   
37           throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
38       }
39   
40       /**
41        * return a Printable String from a tagged object.
42        *
43        * @param obj the tagged object holding the object we want
44        * @param explicit true if the object is meant to be explicitly
45        *              tagged false otherwise.
46        * @exception IllegalArgumentException if the tagged object cannot
47        *               be converted.
48        */
49       public static DERPrintableString getInstance(
50           ASN1TaggedObject obj,
51           boolean          explicit)
52       {
53           return getInstance(obj.getObject());
54       }
55   
56       /**
57        * basic constructor - byte encoded string.
58        */
59       public DERPrintableString(
60           byte[]   string)
61       {
62           char[]  cs = new char[string.length];
63   
64           for (int i = 0; i != cs.length; i++)
65           {
66               cs[i] = (char)(string[i] & 0xff);
67           }
68   
69           this.string = new String(cs);
70       }
71   
72       /**
73        * basic constructor
74        */
75       public DERPrintableString(
76           String   string)
77       {
78           this.string = string;
79       }
80   
81       public String getString()
82       {
83           return string;
84       }
85   
86       public byte[] getOctets()
87       {
88           char[]  cs = string.toCharArray();
89           byte[]  bs = new byte[cs.length];
90   
91           for (int i = 0; i != cs.length; i++)
92           {
93               bs[i] = (byte)cs[i];
94           }
95   
96           return bs; 
97       }
98   
99       void encode(
100          DEROutputStream  out)
101          throws IOException
102      {
103          out.writeEncoded(PRINTABLE_STRING, this.getOctets());
104      }
105  
106      public int hashCode()
107      {
108          return this.getString().hashCode();
109      }
110  
111      public boolean equals(
112          Object  o)
113      {
114          if (!(o instanceof DERPrintableString))
115          {
116              return false;
117          }
118  
119          DERPrintableString  s = (DERPrintableString)o;
120  
121          return this.getString().equals(s.getString());
122      }
123  }
124