FileDocCategorySizeDatePackage
EscherPropertyFactory.javaAPI DocApache Poi 3.0.14019Mon Jan 01 12:39:40 GMT 2007org.apache.poi.ddf

EscherPropertyFactory

public class EscherPropertyFactory extends Object
Generates a property given a reference into the byte array storing that property.
author
Glen Stampoultzis

Fields Summary
Constructors Summary
Methods Summary
public java.util.ListcreateProperties(byte[] data, int offset, short numProperties)
Create new properties from a byte array.

param
data The byte array containing the property
param
offset The starting offset into the byte array
return
The new properties

        List results = new ArrayList();

        int pos = offset;

//        while ( bytesRemaining >= 6 )
        for (int i = 0; i < numProperties; i++)
        {
            short propId;
            int propData;
            propId = LittleEndian.getShort( data, pos );
            propData = LittleEndian.getInt( data, pos + 2 );
            short propNumber = (short) ( propId & (short) 0x3FFF );
            boolean isComplex = ( propId & (short) 0x8000 ) != 0;
            boolean isBlipId = ( propId & (short) 0x4000 ) != 0;

            byte propertyType = EscherProperties.getPropertyType( (short) propNumber );
            if ( propertyType == EscherPropertyMetaData.TYPE_BOOLEAN )
                results.add( new EscherBoolProperty( propId, propData ) );
            else if ( propertyType == EscherPropertyMetaData.TYPE_RGB )
                results.add( new EscherRGBProperty( propId, propData ) );
            else if ( propertyType == EscherPropertyMetaData.TYPE_SHAPEPATH )
                results.add( new EscherShapePathProperty( propId, propData ) );
            else
            {
                if ( !isComplex )
                    results.add( new EscherSimpleProperty( propId, propData ) );
                else
                {
                    if ( propertyType == EscherPropertyMetaData.TYPE_ARRAY)
                        results.add( new EscherArrayProperty( propId, new byte[propData]) );
                    else
                        results.add( new EscherComplexProperty( propId, new byte[propData]) );

                }
            }
            pos += 6;
//            bytesRemaining -= 6 + complexBytes;
        }

        // Get complex data
        for ( Iterator iterator = results.iterator(); iterator.hasNext(); )
        {
            EscherProperty p = (EscherProperty) iterator.next();
            if (p instanceof EscherComplexProperty)
            {
                if (p instanceof EscherArrayProperty)
                {
                    pos += ((EscherArrayProperty)p).setArrayData(data, pos);
                }
                else
                {
                    byte[] complexData = ((EscherComplexProperty)p).getComplexData();
                    System.arraycopy(data, pos, complexData, 0, complexData.length);
                    pos += complexData.length;
                }
            }
        }

        return results;