| /* ==================================================================== |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| ==================================================================== */ |
| |
| package org.apache.poi.hwpf.dev; |
| |
| import org.apache.poi.util.Internal; |
| |
| /** |
| * <p> |
| * For iterating through our fields. Used during model classes autogeneration. |
| * </p> |
| * |
| * @author Glen Stampoultzis (glens at apache.org) |
| */ |
| @Internal |
| public class FieldIterator |
| { |
| |
| protected int offset; |
| |
| public FieldIterator() |
| { |
| } |
| |
| public String calcSize( int fieldNumber, String fieldName, String size, |
| String type ) |
| { |
| String result = " + "; |
| if ( type.startsWith( "custom:" ) ) |
| { |
| String javaFieldName = RecordUtil.getFieldName( fieldNumber, |
| fieldName, 0 ); |
| return result + javaFieldName + ".getSize()"; |
| } |
| else if ( "var".equals( size ) ) |
| { |
| String javaFieldName = RecordUtil.getFieldName( fieldNumber, |
| fieldName, 0 ); |
| return result + " ( " + javaFieldName + ".length() *2)"; |
| } |
| else if ( "varword".equals( size ) ) |
| { |
| String javaFieldName = RecordUtil.getFieldName( fieldNumber, |
| fieldName, 0 ); |
| return result + javaFieldName + ".length * 2 + 2"; |
| } |
| else |
| { |
| return result + size; |
| } |
| } |
| |
| public String fillDecoder( String size, String type ) |
| { |
| |
| String result = ""; |
| |
| if ( type.equals( "short[]" ) ) |
| result = "LittleEndian.getShortArray( data, 0x" |
| + Integer.toHexString( offset ) + " + offset, " + size |
| + " )"; |
| else if ( type.equals( "byte[]" ) ) |
| result = "LittleEndian.getByteArray( data, 0x" |
| + Integer.toHexString( offset ) + " + offset," + size |
| + " )"; |
| else if ( type.equals( "BorderCode" ) ) |
| result = "new BorderCode( data, 0x" + Integer.toHexString( offset ) |
| + " + offset )"; |
| else if ( type.equals( "Colorref" ) ) |
| result = "new Colorref( data, 0x" + Integer.toHexString( offset ) |
| + " + offset )"; |
| else if ( type.equals( "DateAndTime" ) ) |
| result = "new DateAndTime( data, 0x" + Integer.toHexString( offset ) |
| + " + offset )"; |
| else if ( type.equals( "Grfhic" ) ) |
| result = "new Grfhic( data, 0x" + Integer.toHexString( offset ) |
| + " + offset )"; |
| else if ( size.equals( "2" ) ) |
| result = "LittleEndian.getShort( data, 0x" |
| + Integer.toHexString( offset ) + " + offset )"; |
| else if ( size.equals( "4" ) ) |
| if ( type.equals( "long" ) ) |
| { |
| result = "LittleEndian.getUInt( data, 0x" |
| + Integer.toHexString( offset ) + " + offset )"; |
| } |
| else |
| { |
| result = "LittleEndian.getInt( data, 0x" |
| + Integer.toHexString( offset ) + " + offset )"; |
| } |
| else if ( size.equals( "1" ) ) |
| if ( type.equals( "short" ) ) |
| { |
| result = "LittleEndian.getUByte( data, 0x" |
| + Integer.toHexString( offset ) + " + offset )"; |
| } |
| else if ( type.equals( "int" ) || type.equals( "long" ) ) |
| { |
| result = "LittleEndian.getUnsignedByte( data, 0x" |
| + Integer.toHexString( offset ) + " + offset )"; |
| } |
| else |
| { |
| result = "data[ 0x" + Integer.toHexString( offset ) |
| + " + offset ]"; |
| } |
| else if ( type.equals( "double" ) ) |
| result = "LittleEndian.getDouble(data, 0x" |
| + Integer.toHexString( offset ) + " + offset )"; |
| |
| try |
| { |
| offset += Integer.parseInt( size ); |
| } |
| catch ( NumberFormatException ignore ) |
| { |
| } |
| return result; |
| } |
| |
| public String serialiseEncoder( int fieldNumber, String fieldName, |
| String size, String type ) |
| { |
| // String javaType = RecordUtil.getType(size, type, 0); |
| String javaFieldName = RecordUtil.getFieldName( fieldNumber, fieldName, |
| 0 ); |
| |
| String result = ""; |
| |
| if ( type.equals( "short[]" ) ) |
| result = "LittleEndian.putShortArray( data, 0x" |
| + Integer.toHexString( offset ) + " + offset, " |
| + javaFieldName + " );"; |
| else if ( type.equals( "byte[]" ) ) |
| result = "System.arraycopy( " + javaFieldName + ", 0, data, 0x" |
| + Integer.toHexString( offset ) + " + offset, " |
| + javaFieldName + ".length );"; |
| else if ( type.equals( "BorderCode" ) ) |
| result = javaFieldName + ".serialize( data, 0x" |
| + Integer.toHexString( offset ) + " + offset );"; |
| else if ( type.equals( "Colorref" ) ) |
| result = javaFieldName + ".serialize( data, 0x" |
| + Integer.toHexString( offset ) + " + offset );"; |
| else if ( type.equals( "DateAndTime" ) ) |
| result = javaFieldName + ".serialize( data, 0x" |
| + Integer.toHexString( offset ) + " + offset );"; |
| else if ( type.equals( "Grfhic" ) ) |
| result = javaFieldName + ".serialize( data, 0x" |
| + Integer.toHexString( offset ) + " + offset );"; |
| else if ( size.equals( "2" ) ) |
| if ( type.equals( "short" ) ) |
| { |
| result = "LittleEndian.putShort( data, 0x" |
| + Integer.toHexString( offset ) + " + offset, " |
| + javaFieldName + " );"; |
| } |
| else if ( type.equals( "int" ) ) |
| { |
| result = "LittleEndian.putUShort( data, 0x" |
| + Integer.toHexString( offset ) + " + offset, " |
| + javaFieldName + " );"; |
| } |
| else |
| { |
| result = "LittleEndian.putShort( data, 0x" |
| + Integer.toHexString( offset ) + " + offset, (short)" |
| + javaFieldName + " );"; |
| } |
| else if ( size.equals( "4" ) ) |
| if ( type.equals( "long" ) ) |
| { |
| result = "LittleEndian.putUInt( data, 0x" |
| + Integer.toHexString( offset ) + " + offset, " |
| + javaFieldName + " );"; |
| } |
| else |
| { |
| result = "LittleEndian.putInt( data, 0x" |
| + Integer.toHexString( offset ) + " + offset, " |
| + javaFieldName + " );"; |
| } |
| else if ( size.equals( "1" ) ) |
| if ( type.equals( "byte" ) ) |
| { |
| result = "data[ 0x" + Integer.toHexString( offset ) |
| + " + offset ] = " + javaFieldName + ";"; |
| } |
| else |
| { |
| result = "LittleEndian.putUByte( data, 0x" |
| + Integer.toHexString( offset ) + " + offset, " |
| + javaFieldName + " );"; |
| } |
| else if ( type.equals( "double" ) ) |
| result = "LittleEndian.putDouble(data, 0x" |
| + Integer.toHexString( offset ) + " + offset, " |
| + javaFieldName + " );"; |
| |
| try |
| { |
| offset += Integer.parseInt( size ); |
| } |
| catch ( NumberFormatException ignore ) |
| { |
| } |
| return result; |
| |
| } |
| |
| } |