1    /*
2     *  ====================================================================
3     *  The Apache Software License, Version 1.1
4     *
5     *  Copyright (c) 2000 The Apache Software Foundation.  All rights
6     *  reserved.
7     *
8     *  Redistribution and use in source and binary forms, with or without
9     *  modification, are permitted provided that the following conditions
10    *  are met:
11    *
12    *  1. Redistributions of source code must retain the above copyright
13    *  notice, this list of conditions and the following disclaimer.
14    *
15    *  2. Redistributions in binary form must reproduce the above copyright
16    *  notice, this list of conditions and the following disclaimer in
17    *  the documentation and/or other materials provided with the
18    *  distribution.
19    *
20    *  3. The end-user documentation included with the redistribution,
21    *  if any, must include the following acknowledgment:
22    *  "This product includes software developed by the
23    *  Apache Software Foundation (http://www.apache.org/)."
24    *  Alternately, this acknowledgment may appear in the software itself,
25    *  if and wherever such third-party acknowledgments normally appear.
26    *
27    *  4. The names "Apache" and "Apache Software Foundation" must
28    *  not be used to endorse or promote products derived from this
29    *  software without prior written permission. For written
30    *  permission, please contact apache@apache.org.
31    *
32    *  5. Products derived from this software may not be called "Apache",
33    *  nor may "Apache" appear in their name, without prior written
34    *  permission of the Apache Software Foundation.
35    *
36    *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37    *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38    *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39    *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
40    *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41    *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42    *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43    *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44    *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45    *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46    *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47    *  SUCH DAMAGE.
48    *  ====================================================================
49    *
50    *  This software consists of voluntary contributions made by many
51    *  individuals on behalf of the Apache Software Foundation.  For more
52    *  information on the Apache Software Foundation, please see
53    *  <http://www.apache.org/>.
54    *
55    */
56   package org.apache.poi.hpsf;
57   
58   import java.io.*;
59   import org.apache.poi.util.LittleEndian;
60   
61   /**
62    *  <p>Represents a class ID (16 bytes). Unlike other little-endian
63    *  type the {@link ClassID} is not just 16 bytes stored in the wrong
64    *  order. Instead, it is a double word (4 bytes) followed by two
65    *  words (2 bytes each) followed by 8 bytes.</p>
66    *
67    * @author Rainer Klute (klute@rainer-klute.de)
68    * @version $Id: ClassID.java,v 1.4 2002/07/17 16:23:22 klute Exp $
69    * @since 2002-02-09
70    */
71   public class ClassID
72   {
73   
74       /**
75        * <p>The bytes making out the class ID in correct order,
76        * i.e. big-endian.</p>
77        */
78       protected byte[] bytes;
79   
80   
81   
82       /**
83        *  <p>Creates a {@link ClassID} and reads its value from a byte
84        *  array.</p>
85        *
86        * @param src The byte array to read from.
87        * @param offset The offset of the first byte to read.
88        */
89       public ClassID(final byte[] src, final int offset)
90       {
91           read(src, offset);
92       }
93   
94   
95   
96       public final static int LENGTH = 16;
97   
98       public int length()
99       {
100          return LENGTH;
101      }
102  
103  
104  
105      /**
106       * <p>Gets the bytes making out the class ID. They are returned in
107       * correct order, i.e. big-endian.</p>
108       */
109      public byte[] getBytes()
110      {
111  	return bytes;
112      }
113  
114  
115  
116      /**
117       * <p>Reads a class ID from a byte array by turning little-endian
118       * into big-endian.</p>
119       *
120       * @param src The byte array to read from
121       *
122       * @param offset The offset within the <var>src</var> byte array
123       *
124       * @return A byte array containing the class ID.
125       */
126      public byte[] read(final byte[] src, final int offset)
127      {
128          bytes = new byte[16];
129  
130          /* Read double word. */
131          bytes[0] = src[3 + offset];
132          bytes[1] = src[2 + offset];
133          bytes[2] = src[1 + offset];
134          bytes[3] = src[0 + offset];
135  
136          /* Read first word. */
137          bytes[4] = src[5 + offset];
138          bytes[5] = src[4 + offset];
139  
140          /* Read second word. */
141          bytes[6] = src[7 + offset];
142          bytes[7] = src[6 + offset];
143  
144  	/* Read 8 bytes. */
145  	for (int i = 8; i < 16; i++)
146  	    bytes[i] = src[i + offset];
147  
148          return bytes;
149      }
150  
151  }
152