/*******************************************************************************
* Copyright (c) 2009, Adobe Systems Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* · Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* · Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* · Neither the name of Adobe Systems Incorporated nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/
package com.adobe.dp.epub.opf;
import com.adobe.dp.epub.io.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.Deflater;
public class FontResource extends Resource {
FontResource(Publication owner, String name, DataSource source) {
super(owner, name, "application/vnd.ms-opentype", source);
}
static class DeflaterInputStreamImpl extends InputStream {
InputStream in;
Deflater def;
DeflaterInputStreamImpl(InputStream in, Deflater def) {
this.in = in;
this.def = def;
}
public void close() throws IOException {
def.end();
}
public int read() throws IOException {
byte[] b = new byte[1];
if (read(b) == 1)
return b[0] & 0xFF;
return -1;
}
public int read(byte[] b, int off, int len) throws IOException {
int total = 0;
while (len > 0) {
int got = def.deflate(b, off, len);
if (got <= 0) {
if (in != null && def.needsInput()) {
byte[] buffer = new byte[4096];
int rlen = in.read(buffer);
if (rlen <= 0) {
def.finish();
in.close();
in = null;
} else {
def.setInput(buffer, 0, rlen);
}
} else {
break;
}
} else {
total += got;
off += got;
len -= got;
}
}
return total;
}
}
public void serialize(OutputStream out) throws IOException {
byte[] buf = new byte[4096];
InputStream in = source.getInputStream();
int len;
while ((len = in.read(buf)) >= 0) {
out.write(buf, 0, len);
}
out.close();
}
/**
* Serializes this embedded font. Implements the Obfuscation Algorithm
* either from
* http://www.openebook.org/doc_library/informationaldocs/FontManglingSpec
* .html or from
* http://www.adobe.com/devnet/digitalpublishing/pdfs/content_protection.pdf
* depending on the type of font mangling used
*/
// public void serialize(OutputStream out) throws IOException {
//
// int headerLen;
// byte[] mask;
//
// if (epub.useIDPFFontMangling) {
// headerLen = 1040;
// mask = epub.makeIDPFXORMask();
// } else {
// headerLen = 1024;
// mask = epub.makeAdobeXORMask();
// }
//
// Deflater def = null;
// try {
// byte[] buffer = new byte[4096];
// int len;
// InputStream in = source.getInputStream();
// if (mask != null) {
// // encryption assumes compression
// def = new Deflater(9, true);
// in = new DeflaterInputStreamImpl(in, def);
// }
// boolean first = true;
// while ((len = in.read(buffer)) > 0) {
// if (first && mask != null) {
// first = false;
// for (int i = 0; i < headerLen; i++) {
// buffer[i] = (byte) (buffer[i] ^ mask[i % mask.length]);
// }
// }
// out.write(buffer, 0, len);
// }
// } catch (IOException e) {
// e.printStackTrace();
// } finally {
// // It is important to do this to free non-Java-heap memory
// // see Java bug 4797189 for details
// if (def != null) {
// def.end();
// def = null;
// }
// }
// out.close();
// }
/**
* Return false to inhibit compressing
*/
public boolean canCompress() {
return true;
}
}