1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-05 10:49:24 +02:00

git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@1557 6a642e6f-84f6-412e-ac94-c4a38d5a04b0

This commit is contained in:
Vasiliy Bout 2010-07-07 18:59:49 +00:00
parent a2d29880aa
commit 608406ab1c
7 changed files with 253 additions and 1 deletions

View file

@ -22,11 +22,13 @@ package org.geometerplus.fbreader.formats;
import org.geometerplus.fbreader.bookmodel.BookModel;
import org.geometerplus.fbreader.library.Book;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.image.ZLImage;
public abstract class FormatPlugin {
public abstract boolean acceptsFile(ZLFile file);
public abstract boolean readMetaInfo(Book book);
public abstract boolean readModel(BookModel model);
public abstract ZLImage readCover(Book book);
/*
public static void detectEncodingAndLanguage(Book book, InputStream stream) throws IOException {

View file

@ -23,6 +23,7 @@ import org.geometerplus.fbreader.bookmodel.BookModel;
import org.geometerplus.fbreader.library.Book;
import org.geometerplus.fbreader.formats.FormatPlugin;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.image.ZLImage;
public class FB2Plugin extends FormatPlugin {
@Override
@ -39,4 +40,10 @@ public class FB2Plugin extends FormatPlugin {
public boolean readModel(BookModel model) {
return new FB2Reader(model).readBook();
}
@Override
public ZLImage readCover(Book book) {
// TODO: implement
return null;
}
}

View file

@ -25,6 +25,7 @@ import org.geometerplus.fbreader.bookmodel.BookModel;
import org.geometerplus.fbreader.library.Book;
import org.geometerplus.fbreader.formats.FormatPlugin;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.image.ZLImage;
public class HtmlPlugin extends FormatPlugin {
@ -47,4 +48,9 @@ public class HtmlPlugin extends FormatPlugin {
return false;
}
}
@Override
public ZLImage readCover(Book book) {
return null;
}
}

View file

@ -0,0 +1,124 @@
/*
* Copyright (C) 2007-2010 Geometer Plus <contact@geometerplus.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.geometerplus.fbreader.formats.oeb;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.image.ZLFileImage;
import org.geometerplus.zlibrary.core.image.ZLImage;
import org.geometerplus.zlibrary.core.xml.*;
import org.geometerplus.fbreader.constants.XMLNamespace;
import org.geometerplus.fbreader.formats.util.MiscUtil;
class OEBCoverReader extends ZLXMLReaderAdapter implements XMLNamespace {
private class XHTMLImageFinder extends ZLXMLReaderAdapter {
private static final String IMG = "img";
@Override
public boolean startElementHandler(String tag, ZLStringMap attributes) {
tag = tag.toLowerCase().intern();
if (tag == IMG) {
final String src = attributes.getValue("src");
if (src != null) {
myImage = new ZLFileImage(
"image/auto",
ZLFile.createFileByPath(myPathPrefix + src)
);
return true;
}
}
return false;
}
}
private ZLImage myImage;
private String myPathPrefix;
private String myCoverXHTML;
private boolean myReadGuide;
OEBCoverReader() {
}
public ZLImage readCover(ZLFile file) {
myPathPrefix = MiscUtil.htmlDirectoryPrefix(file);
myReadGuide = false;
myImage = null;
myCoverXHTML = null;
if (!read(file) || myCoverXHTML == null) {
return null;
}
ZLFile coverFile = ZLFile.createFileByPath(myCoverXHTML);
final String ext = coverFile.getExtension();
if (ext != null && (ext.equals("gif") || ext.equals("jpg") || ext.equals("jpeg"))) {
myImage = new ZLFileImage("image/auto", coverFile);
} else {
new XHTMLImageFinder().read(coverFile);
}
return myImage;
}
private static final String GUIDE = "guide";
private static final String REFERENCE = "reference";
private static final String COVER = "cover";
private static final String COVER_IMAGE = "other.ms-coverimage-standard";
@Override
public boolean startElementHandler(String tag, ZLStringMap attributes) {
tag = tag.toLowerCase().intern();
if (GUIDE == tag) {
myReadGuide = true;
} else if (myReadGuide && REFERENCE == tag) {
final String type = attributes.getValue("type");
if (type != null) {
if (COVER == type) {
final String href = attributes.getValue("href");
if (href != null) {
myCoverXHTML = myPathPrefix + MiscUtil.decodeHtmlReference(href);
return true;
}
} else if (COVER_IMAGE == type) {
final String href = attributes.getValue("href");
if (href != null) {
myImage = new ZLFileImage(
"image/auto",
ZLFile.createFileByPath(myPathPrefix + MiscUtil.decodeHtmlReference(href))
);
return true;
}
}
}
}
return false;
}
@Override
public boolean endElementHandler(String tag) {
tag = tag.toLowerCase();
if (GUIDE == tag) {
myReadGuide = false;
return true;
}
return false;
}
}

View file

@ -23,6 +23,7 @@ import org.geometerplus.fbreader.bookmodel.BookModel;
import org.geometerplus.fbreader.library.Book;
import org.geometerplus.fbreader.formats.FormatPlugin;
import org.geometerplus.zlibrary.core.filesystem.*;
import org.geometerplus.zlibrary.core.image.ZLImage;
public class OEBPlugin extends FormatPlugin {
public boolean acceptsFile(ZLFile file) {
@ -43,14 +44,21 @@ public class OEBPlugin extends FormatPlugin {
return null;
}
@Override
public boolean readMetaInfo(Book book) {
final ZLFile opfFile = getOpfFile(book.File);
return (opfFile != null) ? new OEBMetaInfoReader(book).readMetaInfo(opfFile) : false;
}
@Override
public boolean readModel(BookModel model) {
model.Book.File.setCached(true);
final ZLFile opfFile = getOpfFile(model.Book.File);
return (opfFile != null) ? new OEBBookReader(model).readBook(opfFile) : false;
}
@Override
public ZLImage readCover(Book book) {
return new OEBCoverReader().readCover(book.File);
}
}

View file

@ -22,6 +22,7 @@ package org.geometerplus.fbreader.formats.pdb;
import java.io.*;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.image.ZLImage;
import org.geometerplus.zlibrary.core.encoding.ZLEncodingCollection;
import org.geometerplus.zlibrary.core.util.ZLLanguageUtil;
@ -130,4 +131,102 @@ public class MobipocketPlugin extends PdbPlugin {
return false;
}
}
@Override
public ZLImage readCover(Book book) {
InputStream stream = null;
try {
stream = book.File.getInputStream();
final PdbHeader header = new PdbHeader(stream);
PdbUtil.skip(stream, header.Offsets[0] + 16 - header.length());
if (PdbUtil.readInt(stream) != 0x4D4F4249) /* "MOBI" */ {
return null;
}
final int length = (int)PdbUtil.readInt(stream);
PdbUtil.skip(stream, 104);
final int exthFlags = (int)PdbUtil.readInt(stream);
int coverIndex = -1;
int thumbIndex = -1;
int offset = 132;
if ((exthFlags & 0x40) != 0) {
PdbUtil.skip(stream, length - 116);
offset = length + 20;
if (PdbUtil.readInt(stream) != 0x45585448) /* "EXTH" */ {
return null;
}
PdbUtil.skip(stream, 4);
final int recordsNumber = (int)PdbUtil.readInt(stream);
offset += 8;
for (int i = 0; i < recordsNumber; ++i) {
final int type = (int)PdbUtil.readInt(stream);
final int size = (int)PdbUtil.readInt(stream);
offset += size;
if (size <= 8) {
continue;
}
switch (type) {
default:
PdbUtil.skip(stream, size - 8);
break;
case 201:
{
if (size == 12) {
coverIndex = (int)PdbUtil.readInt(stream);
} else {
PdbUtil.skip(stream, size - 8);
}
break;
}
case 202:
{
if (size == 12) {
thumbIndex = (int)PdbUtil.readInt(stream);
} else {
PdbUtil.skip(stream, size - 8);
}
break;
}
}
}
}
final InputStream tempStream = stream;
stream = null;
tempStream.close();
if (coverIndex == -1) {
if (thumbIndex == -1) {
return null;
}
coverIndex = thumbIndex;
}
final ZLFile file = book.File;
final MobipocketStream mpStream = new MobipocketStream(file);
// TODO: implement
/*int index = pbStream.firstImageLocationIndex(file.path());
if (index >= 0) {
std::pair<int,int> imageLocation = pbStream.imageLocation(pbStream.header(), index + coverIndex);
if ((imageLocation.first > 0) && (imageLocation.second > 0)) {
return new ZLFileImage(
file,
imageLocation.first,
imageLocation.second
);
}
}*/
return null;
} catch (IOException e) {
return null;
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
}
}
}
}
}

View file

@ -25,6 +25,7 @@ import org.geometerplus.fbreader.bookmodel.BookModel;
import org.geometerplus.fbreader.library.Book;
import org.geometerplus.fbreader.formats.pdb.PdbPlugin;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.image.ZLImage;
public class PluckerPlugin extends PdbPlugin {
@Override
@ -54,4 +55,9 @@ public class PluckerPlugin extends PdbPlugin {
public boolean readModel(BookModel model) {
return new PluckerBookReader(model.Book.File, model, model.Book.getEncoding()).readDocument();
}
@Override
public ZLImage readCover(Book book) {
return null;
}
}