/* * ==================================================================== * 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.model; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.apache.poi.hwpf.model.io.HWPFOutputStream; import org.apache.poi.util.Internal; /** * This class provides access to all the fields Plex. * * @author Cedric Bosdonnat <cbosdonnat@novell.com> * */ @Internal public class FieldsTables { // The size in bytes of the FLD data structure private static final int FLD_SIZE = 2; /** * annotation subdocument */ @Deprecated public static final int PLCFFLDATN = 0; /** * endnote subdocument */ @Deprecated public static final int PLCFFLDEDN = 1; /** * footnote subdocument */ @Deprecated public static final int PLCFFLDFTN = 2; /** * header subdocument */ @Deprecated public static final int PLCFFLDHDR = 3; /** * header textbox subdoc */ @Deprecated public static final int PLCFFLDHDRTXBX = 4; /** * main document */ @Deprecated public static final int PLCFFLDMOM = 5; /** * textbox subdoc */ @Deprecated public static final int PLCFFLDTXBX = 6; private static ArrayList<PlexOfField> toArrayList( PlexOfCps plexOfCps ) { if ( plexOfCps == null ) return new ArrayList<PlexOfField>(); ArrayList<PlexOfField> fields = new ArrayList<PlexOfField>( plexOfCps.length() ); for ( int i = 0; i < plexOfCps.length(); i++ ) { GenericPropertyNode propNode = plexOfCps.getProperty( i ); PlexOfField plex = new PlexOfField( propNode ); fields.add( plex ); } return fields; } private Map<FieldsDocumentPart, PlexOfCps> _tables; public FieldsTables( byte[] tableStream, FileInformationBlock fib ) { _tables = new HashMap<FieldsDocumentPart, PlexOfCps>( FieldsDocumentPart.values().length ); for ( FieldsDocumentPart part : FieldsDocumentPart.values() ) { final PlexOfCps plexOfCps = readPLCF( tableStream, fib, part ); _tables.put( part, plexOfCps ); } } public ArrayList<PlexOfField> getFieldsPLCF( FieldsDocumentPart part ) { return toArrayList( _tables.get( part ) ); } @Deprecated public ArrayList<PlexOfField> getFieldsPLCF( int partIndex ) { return getFieldsPLCF( FieldsDocumentPart.values()[partIndex] ); } private PlexOfCps readPLCF( byte[] tableStream, FileInformationBlock fib, FieldsDocumentPart documentPart ) { int start = fib.getFieldsPlcfOffset( documentPart ); int length = fib.getFieldsPlcfLength( documentPart ); if ( start <= 0 || length <= 0 ) return null; return new PlexOfCps( tableStream, start, length, FLD_SIZE ); } private int savePlex( FileInformationBlock fib, FieldsDocumentPart part, PlexOfCps plexOfCps, HWPFOutputStream outputStream ) throws IOException { if ( plexOfCps == null || plexOfCps.length() == 0 ) { fib.setFieldsPlcfOffset( part, outputStream.getOffset() ); fib.setFieldsPlcfLength( part, 0 ); return 0; } byte[] data = plexOfCps.toByteArray(); int start = outputStream.getOffset(); int length = data.length; outputStream.write( data ); fib.setFieldsPlcfOffset( part, start ); fib.setFieldsPlcfLength( part, length ); return length; } public void write( FileInformationBlock fib, HWPFOutputStream tableStream ) throws IOException { for ( FieldsDocumentPart part : FieldsDocumentPart.values() ) { PlexOfCps plexOfCps = _tables.get( part ); savePlex( fib, part, plexOfCps, tableStream ); } } }