/*
* 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.hslf.record;
import org.apache.poi.ddf.*;
import org.apache.poi.util.LittleEndian;
import java.io.OutputStream;
import java.io.IOException;
import java.io.ByteArrayOutputStream;
import java.util.List;
import java.util.Iterator;
/**
* Container records which always exists inside Document.
* It always acts as a holder for escher DGG container
* which may contain which Escher BStore container information
* about pictures containes in the presentation (if any).
*
* @author Yegor Kozlov
*/
public class PPDrawingGroup extends RecordAtom {
private byte[] _header;
private EscherContainerRecord dggContainer;
protected PPDrawingGroup(byte[] source, int start, int len) {
// Get the header
_header = new byte[8];
System.arraycopy(source,start,_header,0,8);
// Get the contents for now
byte[] contents = new byte[len];
System.arraycopy(source,start,contents,0,len);
DefaultEscherRecordFactory erf = new DefaultEscherRecordFactory();
EscherRecord child = erf.createRecord(contents, 0);
child.fillFields( contents, 0, erf );
dggContainer = (EscherContainerRecord)child.getChild(0);
}
/**
* We are type 1035
*/
public long getRecordType() {
return RecordTypes.PPDrawingGroup.typeID;
}
/**
* We're pretending to be an atom, so return null
*/
public Record[] getChildRecords() {
return null;
}
public void writeOut(OutputStream out) throws IOException {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
List child = dggContainer.getChildRecords();
for (int i = 0; i < child.size(); i++) {
EscherRecord r = (EscherRecord)child.get(i);
if (r.getRecordId() == EscherContainerRecord.BSTORE_CONTAINER){
EscherContainerRecord bstore = (EscherContainerRecord)r;
ByteArrayOutputStream b2 = new ByteArrayOutputStream();
List blip = bstore.getChildRecords();
for (Iterator it=blip.iterator(); it.hasNext();) {
EscherBSERecord bse = (EscherBSERecord)it.next();
byte[] b = new byte[36+8];
bse.serialize(0, b);
b2.write(b);
}
byte[] bstorehead = new byte[8];
LittleEndian.putShort(bstorehead, 0, bstore.getOptions());
LittleEndian.putShort(bstorehead, 2, bstore.getRecordId());
LittleEndian.putInt(bstorehead, 4, b2.size());
bout.write(bstorehead);
bout.write(b2.toByteArray());
} else {
bout.write(r.serialize());
}
}
int size = bout.size();
// Update the size (header bytes 5-8)
LittleEndian.putInt(_header,4,size+8);
// Write out our header
out.write(_header);
byte[] dgghead = new byte[8];
LittleEndian.putShort(dgghead, 0, dggContainer.getOptions());
LittleEndian.putShort(dgghead, 2, dggContainer.getRecordId());
LittleEndian.putInt(dgghead, 4, size);
out.write(dgghead);
// Finally, write out the children
out.write(bout.toByteArray());
}
public EscherContainerRecord getDggContainer(){
return dggContainer;
}
}
|