avik        2003/10/31 08:33:46

  Modified:    src/java/org/apache/poi/hpsf Tag: REL_2_BRANCH ClassID.java
               src/java/org/apache/poi/poifs/property Tag: REL_2_BRANCH
                        Property.java
               src/testcases/org/apache/poi/poifs/property Tag:
                        REL_2_BRANCH TestDocumentProperty.java
                        TestRootProperty.java
  Added:       src/testcases/org/apache/poi/hpsf/basic Tag: REL_2_BRANCH
                        TestClassID.java
  Log:
  bug 22195, ClassID support, by Michael Zalewski
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.5.4.1   +79 -24    jakarta-poi/src/java/org/apache/poi/hpsf/ClassID.java
  
  Index: ClassID.java
  ===================================================================
  RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hpsf/ClassID.java,v
  retrieving revision 1.5
  retrieving revision 1.5.4.1
  diff -u -r1.5 -r1.5.4.1
  --- ClassID.java      22 Feb 2003 14:27:15 -0000      1.5
  +++ ClassID.java      31 Oct 2003 16:33:46 -0000      1.5.4.1
  @@ -56,6 +56,8 @@
   package org.apache.poi.hpsf;
   
   import java.io.*;
  +
  +import org.apache.poi.util.HexDump;
   import org.apache.poi.util.LittleEndian;
   
   /**
  @@ -98,15 +100,21 @@
        */
       public ClassID()
       {
  -     bytes = new byte[LENGTH];
  -     for (int i = 0; i < LENGTH; i++)
  -         bytes[i] = 0x00;
  +        bytes = new byte[LENGTH];
  +        for (int i = 0; i < LENGTH; i++)
  +            bytes[i] = 0x00;
       }
   
   
   
  -    public final static int LENGTH = 16;
  +    /** <p>The number of bytes occupied by this object in the byte
  +     * stream.</p> */
  +    public static final int LENGTH = 16;
   
  +    /**
  +     * @return The number of bytes occupied by this object in the byte
  +     * stream.
  +     */
       public int length()
       {
           return LENGTH;
  @@ -117,10 +125,12 @@
       /**
        * <p>Gets the bytes making out the class ID. They are returned in
        * correct order, i.e. big-endian.</p>
  +     * 
  +     * @return the bytes making out the class ID.
        */
       public byte[] getBytes()
       {
  -     return bytes;
  +        return bytes;
       }
   
   
  @@ -153,9 +163,9 @@
           bytes[6] = src[7 + offset];
           bytes[7] = src[6 + offset];
   
  -     /* Read 8 bytes. */
  -     for (int i = 8; i < 16; i++)
  -         bytes[i] = src[i + offset];
  +        /* Read 8 bytes. */
  +        for (int i = 8; i < 16; i++)
  +            bytes[i] = src[i + offset];
   
           return bytes;
       }
  @@ -170,30 +180,75 @@
        *
        * @param offset The offset within the <var>dst</var> byte array.
        *
  -     * @throws ArrayIndexOutOfBoundsException if there is not enough
  -     * room for the class ID in the byte array. There must be at least
  -     * 16 bytes in the byte array after the <var>offset</var>
  -     * position.
  +     * @exception ArrayStoreException if there is not enough room for the class 
  +     * ID 16 bytes in the byte array after the <var>offset</var> position.
        */
       public void write(final byte[] dst, final int offset)
  +    throws ArrayStoreException
       {
  +        /* Check array size: */
  +        if (dst.length < 16)
  +            throw new ArrayStoreException
  +                ("Destination byte[] must have room for at least 16 bytes, " +
  +                 "but has a length of only " + dst.length + ".");
           /* Write double word. */
  -     dst[0 + offset] = bytes[3];
  -     dst[1 + offset] = bytes[2];
  -     dst[2 + offset] = bytes[1];
  -     dst[3 + offset] = bytes[0];
  +        dst[0 + offset] = bytes[3];
  +        dst[1 + offset] = bytes[2];
  +        dst[2 + offset] = bytes[1];
  +        dst[3 + offset] = bytes[0];
   
           /* Write first word. */
  -     dst[4 + offset] = bytes[5];
  -     dst[5 + offset] = bytes[4];
  +        dst[4 + offset] = bytes[5];
  +        dst[5 + offset] = bytes[4];
   
           /* Write second word. */
  -     dst[6 + offset] = bytes[7];
  -     dst[7 + offset] = bytes[6];
  +        dst[6 + offset] = bytes[7];
  +        dst[7 + offset] = bytes[6];
   
  -     /* Write 8 bytes. */
  -     for (int i = 8; i < 16; i++)
  -         dst[i + offset] = bytes[i];
  +        /* Write 8 bytes. */
  +        for (int i = 8; i < 16; i++)
  +            dst[i + offset] = bytes[i];
       }
   
  +
  +
  +    /**
  +     * <p>Checks whether this <code>ClassID</code> is equal to another
  +     * object.</p>
  +     *
  +     * @param o the object to compare this <code>PropertySet</code> with
  +     * @return <code>true</code> if the objects are equal, else
  +     * <code>false</code>.</p>
  +     */
  +    public boolean equals(final Object o)
  +    {
  +        if (o == null || !(o instanceof ClassID))
  +            return false;
  +        final ClassID cid = (ClassID) o;
  +        if (bytes.length != cid.bytes.length)
  +            return false;
  +        for (int i = 0; i < bytes.length; i++)
  +            if (bytes[i] != cid.bytes[i])
  +                return false;
  +        return true;
  +    }
  +    /**
  +     * Returns a human readable representation of the Class ID
  +     *   in standard format <code>"{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"</code>
  +     * @return String representation of the Class ID represented
  +     *   by this object.
  +     */
  +    public String toString()
  +    {
  +        StringBuffer sbClassId = new StringBuffer( 38);
  +        sbClassId.append( '{');
  +        for( int i=0; i < 16; i++) {
  +            sbClassId.append( HexDump.toHex( bytes[ i]));
  +            if( i == 3 || i == 5 || i == 7 || i == 9) {
  +                sbClassId.append( '-');
  +            }
  +        }
  +        sbClassId.append( '}');
  +        return sbClassId.toString();
  +    }
   }
  
  
  
  No                   revision
  No                   revision
  1.3.2.1   +34 -1     jakarta-poi/src/java/org/apache/poi/poifs/property/Property.java
  
  Index: Property.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/poifs/property/Property.java,v
  retrieving revision 1.3
  retrieving revision 1.3.2.1
  diff -u -r1.3 -r1.3.2.1
  --- Property.java     30 Apr 2003 04:39:16 -0000      1.3
  +++ Property.java     31 Oct 2003 16:33:46 -0000      1.3.2.1
  @@ -59,6 +59,8 @@
   
   import java.util.*;
   
  +import org.apache.poi.hpsf.ClassID;
  +
   import org.apache.poi.poifs.common.POIFSConstants;
   import org.apache.poi.poifs.dev.POIFSViewable;
   import org.apache.poi.util.ByteField;
  @@ -87,6 +89,8 @@
       static final private int    _previous_property_offset = 0x44;
       static final private int    _next_property_offset     = 0x48;
       static final private int    _child_property_offset    = 0x4C;
  +    static final private int    _storage_clsid_offset     = 0x50;
  +    static final private int    _user_flags_offset        = 0x60;
       static final private int    _seconds_1_offset         = 0x64;
       static final private int    _days_1_offset            = 0x68;
       static final private int    _seconds_2_offset         = 0x6C;
  @@ -107,6 +111,8 @@
       private IntegerField        _previous_property;
       private IntegerField        _next_property;
       private IntegerField        _child_property;
  +    private ClassID             _storage_clsid;
  +    private IntegerField        _user_flags;
       private IntegerField        _seconds_1;
       private IntegerField        _days_1;
       private IntegerField        _seconds_2;
  @@ -136,6 +142,8 @@
                                                 _NO_INDEX, _raw_data);
           _child_property    = new IntegerField(_child_property_offset,
                                                 _NO_INDEX, _raw_data);
  +        _storage_clsid     = new ClassID(_raw_data,_storage_clsid_offset);
  +        _user_flags        = new IntegerField(_user_flags_offset, 0, _raw_data);
           _seconds_1         = new IntegerField(_seconds_1_offset, 0,
                                                 _raw_data);
           _days_1            = new IntegerField(_days_1_offset, 0, _raw_data);
  @@ -173,6 +181,8 @@
                                                 _raw_data);
           _child_property    = new IntegerField(_child_property_offset,
                                                 _raw_data);
  +        _storage_clsid     = new ClassID(_raw_data,_storage_clsid_offset);
  +        _user_flags        = new IntegerField(_user_flags_offset, 0, _raw_data);
           _seconds_1         = new IntegerField(_seconds_1_offset, _raw_data);
           _days_1            = new IntegerField(_days_1_offset, _raw_data);
           _seconds_2         = new IntegerField(_seconds_2_offset, _raw_data);
  @@ -296,11 +306,20 @@
       abstract public boolean isDirectory();
   
       /**
  +     * Sets the storage clsid, which is the Class ID of a COM object which
  +     *   reads and writes this stream
  +     * @return storage Class ID for this property stream
  +     */
  +    public ClassID getStorageClsid()
  +    {
  +        return _storage_clsid;
  +    }
  +
  +    /**
        * Set the name; silently truncates the name if it's too long.
        *
        * @param name the new name
        */
  -
       protected final void setName(final String name)
       {
           char[] char_array = name.toCharArray();
  @@ -327,6 +346,20 @@
                               * LittleEndianConsts.SHORT_SIZE), _raw_data);
       }
   
  +    /**
  +     * Sets the storage class ID for this property stream. This is the Class ID
  +     *   of the COM object which can read and write this property stream
  +     * @param clsidStorage Storage Class ID
  +     */
  +    public void setStorageClsid( ClassID clsidStorage)
  +    {
  +        _storage_clsid = clsidStorage;
  +        if( clsidStorage == null) {
  +            Arrays.fill( _raw_data, _storage_clsid_offset, _storage_clsid_offset + 
ClassID.LENGTH, (byte) 0);
  +        } else {
  +            clsidStorage.write( _raw_data, _storage_clsid_offset);
  +        }
  +    }
       /**
        * Set the property type. Makes no attempt to validate the value.
        *
  
  
  
  No                   revision
  No                   revision
  1.1.2.1   +171 -0    
jakarta-poi/src/testcases/org/apache/poi/hpsf/basic/Attic/TestClassID.java
  
  
  
  
  No                   revision
  No                   revision
  1.2.2.1   +3 -0      
jakarta-poi/src/testcases/org/apache/poi/poifs/property/TestDocumentProperty.java
  
  Index: TestDocumentProperty.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/testcases/org/apache/poi/poifs/property/TestDocumentProperty.java,v
  retrieving revision 1.2
  retrieving revision 1.2.2.1
  diff -u -r1.2 -r1.2.2.1
  --- TestDocumentProperty.java 30 Apr 2003 04:39:17 -0000      1.2
  +++ TestDocumentProperty.java 31 Oct 2003 16:33:46 -0000      1.2.2.1
  @@ -150,6 +150,7 @@
               ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF,
               ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00,
               ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00,
  +
               ( byte ) 0x57, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00,
               ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6B, ( byte ) 0x00,
               ( byte ) 0x62, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00,
  @@ -182,6 +183,7 @@
               ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00,
               ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00,
               ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00,
  +
               ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x53, ( byte ) 0x00,
               ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00,
               ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00,
  @@ -214,6 +216,7 @@
               ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00,
               ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00,
               ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00,
  +
               ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00,
               ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00,
               ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00,
  
  
  
  1.3.2.1   +3 -2      
jakarta-poi/src/testcases/org/apache/poi/poifs/property/TestRootProperty.java
  
  Index: TestRootProperty.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/testcases/org/apache/poi/poifs/property/TestRootProperty.java,v
  retrieving revision 1.3
  retrieving revision 1.3.2.1
  diff -u -r1.3 -r1.3.2.1
  --- TestRootProperty.java     30 Apr 2003 04:39:17 -0000      1.3
  +++ TestRootProperty.java     31 Oct 2003 16:33:46 -0000      1.3.2.1
  @@ -217,11 +217,11 @@
               ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00
           };
   
  -        verifyReadingProperty(0, input, 0, "Root Entry");
  +        verifyReadingProperty(0, input, 0, "Root Entry", 
"{00020820-0000-0000-C000-000000000046}");
       }
   
       private void verifyReadingProperty(int index, byte [] input, int offset,
  -                                       String name)
  +                                       String name, String sClsId)
           throws IOException
       {
           RootProperty          property = new RootProperty(index, input,
  @@ -242,6 +242,7 @@
           assertEquals(index, property.getIndex());
           assertEquals(name, property.getName());
           assertTrue(!property.getChildren().hasNext());
  +        assertEquals(property.getStorageClsid().toString(), sClsId);
       }
   
       /**
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to