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]