/**
* @file ReaderWrapper.java
*
* @revision: none
*
* @version 0.0.1
* @author: Zenki (zhajun), zenki2001cn@163.com
* @date: 2011-1-26 下午04:03:37
*/
package com.easyview.ebook.reader.engine.core.adobe;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.text.TextUtils;
import android.util.Log;
import com.easyview.ebook.jni.SearchResult;
import com.easyview.ebook.reader.engine.core.DecAdapter;
import com.easyview.ebook.reader.engine.core.ERManager;
import com.easyview.ebook.reader.engine.core.EngineCode;
import com.easyview.ebook.reader.engine.core.IDatabaseService;
import com.easyview.ebook.reader.engine.core.ReaderWrapper;
import com.easyview.ebook.reader.engine.core.EngineCode.AdobeMsgCode;
import com.easyview.ebook.reader.engine.core.EngineCode.EngineMsgCode;
import com.easyview.ebook.reader.engine.core.adobe.AdobeAdapter;
import com.easyview.ebook.reader.engine.model.AdobePage;
import com.easyview.ebook.reader.engine.model.Book;
import com.easyview.ebook.reader.engine.model.BookSearchInfo;
import com.easyview.ebook.reader.engine.model.IBookEmphasisCursor;
import com.easyview.ebook.reader.engine.model.IBookMarkCursor;
import com.easyview.ebook.reader.engine.model.IBookSearchCursor;
import com.easyview.ebook.reader.engine.model.Page;
import com.easyview.ebook.reader.engine.model.BookEmphasisInfo.BookEmphasis;
import com.easyview.ebook.reader.engine.model.BookMarkInfo.Bookmark;
import com.easyview.ebook.reader.engine.model.ChapterTreeInfo.ChapterTreeState;
import com.easyview.ebook.reader.engine.util.Logger;
/**
*
*/
public class AdobeWrapper extends ReaderWrapper {
static private final String TAG = "AdobeWrapper";
static private AdobeWrapper mAction;
static private AdobeAdapter mAdapter;
private int mTotalNumber = 1;
private final int MAX_FONT_LEVEL = 3;
private final int MIN_FONT_LEVEL = 0;
private final int DEFAULT_FONT_LEVEL = 1;
// 对全文内容做连续搜索
private final int SEARCH_MODE_CONTINUE = 1;
// 只对目录搜索一次
private final int SEARCH_MODE_ONCE = 0;
// 每次搜索的数量
private final int SEARCH_PER_SIZE = 10;
// 横竖屏标志
private final int ROTATE_ANGLE = 90;
private double mHighlightStartX = -1;
private double mHighlightStartY = -1;
private double mHighlightEndX = -1;
private double mHighlightEndY = -1;
private int mHighlightColor = -1;
public interface ADOBE_META_TYPE {
static public final String META_TITLE = "DC.title";
static public final String META_AUTHOR = "DC.creator";
static public final String META_PUBLISHER = "DC.publisher";
}
private AdobeWrapper() {
super();
if (null == mAdapter) {
mAdapter = AdobeAdapter.getInstance();
}
}
public static AdobeWrapper getInstance() {
if (null == mAction) {
mAction = new AdobeWrapper();
}
return mAction;
}
protected void free() {
super.free();
// TaskManager must stop, or AdobeAdapter may crash
// if (getTaskManager() != null) {
// getTaskManager().free();
// }
if (mAdapter != null) {
mAdapter.free();
mAdapter = null;
}
if (mAction != null) {
mAction = null;
}
Logger.dLog(TAG, "ReaderWrapper free mAdapter: " + mAdapter
+ " mAction: " + mAction);
}
private boolean getPageByNumber(AdobePage page, int number) {
if (null == page) {
Logger.eLog(TAG, "getPage is null");
return false;
}
if (!canWork()) {
Logger.eLog(TAG, "assertWork == null");
return false;
}
int code = -1;
if (number > mTotalNumber) {
code = mAdapter.goToPosition(mTotalNumber - 1);
} else if (number <= 1) {
code = mAdapter.goToPosition(0);
} else {
code = mAdapter.goToPosition(number - 1);
}
if (hasError(code)) {
return false;
}
return getPage(page);
}
private boolean getPageByLocation(AdobePage page, String location) {
if (null == page) {
Logger.eLog(TAG, "getPage = " + page);
return false;
}
if (!canWork()) {
Logger.eLog(TAG, "assertWork == null");
return false;
}
int code = mAdapter.goToLocation(location);
if (hasError(code)) {
return false;
}
return getPage(page);
}
private boolean getPageBySearchResult(AdobePage page,
BookSearchInfo.BookSearchResult result) {
mAdapter.goToLocation(result.start_pos);
mAdapter.delAllHighlight();
boolean highlighted = mAdapter.setHighlightbyloc(result.start_pos,
result.end_pos, 0);
if (highlighted) {
}
return getPage(page);
}
private boolean getPage(AdobePage page) {
Bitmap bmp = null;
Book book = getBook();
if (null == page) {
Logger.eLog(TAG, "getPage = " + page);
setLastCode(EngineMsgCode.ENGINE_ERROR_CODE_ERROR);
return false;
}
if (!canWork()) {
Logger.eLog(TAG, "assertWork == null");
return false;
}
int buf[] = page.getBuf();
mAdapter.getCurrentPage(buf);
int width = book.getViewWidth();
int height = book.getViewHeight();
try {
bmp = Bitmap.createBitmap(buf, width, height, getBitmapConfig());
// if (true == getLandMode()) {
// Matrix m = new Matrix();
// m.postRotate(ROTATE_ANGLE);
// bmp = Bitmap.createBitmap(bmp, 0, 0, width, height, m, false);
// }
} catch (OutOfMemoryError e) {
Logger.eLog(TAG, "CreateBitmap error " + e);
bmp = null;
setLastCode(EngineMsgCode.ENGINE_FATAL_OUTOF_MEMORY);
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
page.setPageContent(bmp);
String location = mAdapter.getCurrentLocation();
int num = (int) mAdapter.getPagePosition(location) + 1;
page.setPageNum(num);
page.setLocation(location);
page.setSummary(mAdapter.getSummaryByLocation(location));
page.setLoaded(true);
return true;
}
private void updateBookInfo(Page page) {
Book book = getBook();
if (book != null) {
Logger.iLog(TAG, "updateBookInfo pageNum = " + page.getPageNum());
book.updateFromPage(page);
book.setFontLevel(getCurFontLevel());
}
}
private int checkPassword() {
int code = EngineMsgCode.NO_ERROR;
Book book = getBook();
String username = book.getUserName();
String password = book.getPassword();
if (book.getBookType() == Book.BookType.PDF) {
if ((password != null) && (!TextUtils.isEmpty(password))) {
code = mAdapter.setPDFPassword(password);
Logger.dLog(TAG, "checkPassword code = " + code);
}
} else if (book.getBookType() == Book.BookType.EPUB) {
if ((password != null) && (!TextUtils.isEmpty(password))
&& (username != null) && (!TextUtils.isEmpty(username))) {
code = mAdapter.setPassHash(username, password);
Logger.dLog(TAG, "checkPassword code = " + code);
}
}
return code;
}
private void resetHighlight() {
mHighlightStartX = -1;
mHighlightStartY = -1;
mHighlightEndX = -1;
mHighlightEndY = -1;
mHighlightColor = -1;
}
private BookSearchInfo.BookSearchResult[] convertAdobeResult(
SearchResult[] results) {
Book book = getBook();
BookSearchInfo.BookSearchResult[] bookResults = book
.makeSearchResults(results.length);
for (int i = 0; i < results.length; i++) {
bookResults[i].text = results[i].text;
bookResults[i].start_pos = results[i].start_pos;
bookResults[i].end_pos = results[i].end_pos;
}
return bookResults;
}
protected void iCloseBook() {
int code = 0;
if (!canWork()) {
Logger.eLog(TAG, "AssertWork == null");
return;
}
Book book = getBook();
if (book.getOpened()
|| (getLastCode() == AdobeMsgCode.STATE_FATAL_PREVIOUS_FILE_NOT_CLOSED)) {
code = mAdapter.closeFile();
if (hasError(code)) {
Logger.eLog(TAG, "Close book error");
} else {
Logger.vLog(TAG, "Close book success");
book.setOpened(false);
}
try {
saveBookDB();
} catch (Exception e) {
e.printStackTrace();
}
} else {
Logger.vLog(TAG, "Book is not opened");
}
}
protected boolean iLoadBook() {
String bookPath;
if (!canWork()) {
Logger.eLog(TAG, "iLoadBook assertWork failed");
return false;
}
/*
* Step 1. ensure close previous file.
*/
int code = mAdapter.closeFile();
if (hasError(code)) {
setLastCode(EngineMsgCode.ENGINE_ERROR_BOOK_CLOSE_PREVIOUS_FAILED);
Logger.eLog(TAG, "Close previous file error, code = " + code);
} else {
Logger.dLog(TAG, "Close previous file ok");
}
/*
* Step 2. 2.1 check password
*/
code = checkPassword();
if (hasError(code)) {
Logger.eLog(TAG, "checkPassword error");
return false;
}
/*
* 2.2 get file path name and open file.
*/
Book book = getBook();
bookPath = book.getBookPath();
code = mAdapter.openFile(bookPath);
if (hasError(code)) {
Logger.eLog(TAG, "Open book error, code = " + code);
try {
Thread.sleep(30);
} catch (InterruptedException e) {
Logger.eLog(TAG, "Thread.sleep error" + e);
}
return false;
} else {
/*
* Step 4. get meta data about opened book, set total page number.
*/
Book.MetaData data = book.getMetaData();
if (data.isEmpty()) {
String title = mAdapter.getMetaData(ADOBE_META_TYPE.META_TITLE);
String author = mAdapter
.getMetaData(ADOBE_META_TYPE.META_AUTHOR);
String publisher = mAdapter
.getMetaData(ADOBE_META_TYPE.META_PUBLISHER);
data.setValue(Book.MetaData.META_TITLE,
((title != null) ? title : Book.VALUE_NULL));
data.setValue(Book.MetaData.META_AUTHOR,
((author != null) ? author : Book.VALUE_NULL));
data.setValue(Book.MetaData.META_PUBLISHER,
((publisher != null) ? publisher : Book.VALUE_NULL));
book.setMetaData(data);
}
mTotalNumber = mAdapter.getNumPages();
book.setTotalPageNumber(mTotalNumber);
book.setLastAccessTime(System.currentTimeMillis());
book.setOpened(true);
Logger.vLog(TAG, "Open book success");
}
/*
* Step 5.
*/
try {
// 5.1 set view size.
mAdapter.setViewPortSize(book.getViewWidth(), book.getViewHeight());
// 5.2 set font size.
setCurFontLevel(book.getFontLevel());
mAdapter.setFontSize(getCurFontLevel());
// 5.3 set last page location or page index.
AdobePage page = (AdobePage) book.getCurPage();
if (book.getLastLocation().equals(Book.VALUE_NULL)) {
getPageByNumber(page, book.getLastPageNumber());
} else {
getPageByLocation(page, book.getLastLocation());
}
/*
* Step 6. 6.1 if needed, update and show the content.
*/
updateView();
// 6.2 update book information.
updateBookInfo(page);
} catch (Exception e) {
Logger.eLog(TAG, "Load book error");
return false;
}
return true;
}
protected void iLoadChapterInformation() {
String[] chapters;
int[] indexs;
if (!canWork()) {
Logger.eLog(TAG, "iLoadChapterInformation assertWork failed");
return;
}
Book book = getBook();
if (!book.chapterIsLoad()) {
if (mAdapter.getNumChapters() > 0) {
chapters = mAdapter.getChapterList();
indexs = new int[chapters.length];
for (int i = 0; i < chapters.length; i++) {
if (null == chapters[i]) {
chapters[i] = "";
indexs[i] = 0;
} else {
indexs[i] = (int) mAdapter
.getChapterPagePosition(chapters[i]);
}
}
book.chapterInit(indexs, chapters);
} else {
book.chapterInit(null, null);
}
Logger.dLog(TAG,
"loadChapterInfo finished == " + book.chapterIsLoad());
}
// debug code can be delete
// String chapterList[] = mOpenedBook.getChapterTree().getChapterList();
// int[] nums = mOpenedBook.getChapterTree().getChapterPageNums();
// for (int i = 0; i < chapterList.length; i++) {
// Logger.iLog(TAG,
// "chapter: "
// + i
// + " "
// + chapterList[i]
// + " page: "
// + nums[i]
// + " index: "
// + mOpenedBook.getChapterTree().getChapterIndex(
// chapterList[i]));
// }
}
protected void iChapterJumpByTitle(String title) {
if (!canWork()) {
Logger.eLog(TAG, "iChapterJumpByTitle assertWork failed");
return;
}
int code = mAdapter.goToChapter(title);
if (hasError(code)) {
return;
}
Book book = getBook();
try {
AdobePage page = (AdobePage) book.getCurPage();
getPage(page);
setBorder(false);
updateView();
updateBookInfo(page);
book.resetPrePage();
book.resetNextPage();
} catch (Exception e) {
Logger.eLog(TAG, "ichapterJumpTo failed");
}
Logger.vLog(TAG, "ichapterJumpTo finished");
}
protected void iChapterJumpByIndex(int index) {
if (!canWork()) {
Logger.eLog(TAG, "iChapterJumpByIndex assertWork failed");
return;
}
Book book = getBook();
if (index < 0 || index >= book.getMaxChapterNum()) {
Logger.dLog(TAG, "Chapter index out of bounds!");
setLastCode(EngineMsgCode.ENGINE_WARN_CHAPTER_JUMP_FAILED);
return;
}
int code = mAdapter.goToChapterIndex(index);
if (hasError(code)) {
return;
}
try {
AdobePage page = (AdobePage) book.getCurPage();
getPage(page);
setBorder(false);
updateView();
updateBookInfo(page);
book.resetPrePage();
book.resetNextPage();
} catch (Exception e) {
Logger.eLog(TAG, "ichapterJumpTo failed");
}
Logger.vLog(TAG, "ichapterJumpTo finished");
}
protected void iChapterUp() {
if (!canWork()) {
Logger.eLog(TAG, "iChapterUp assertWork failed");
return;
}
Book book = getBook();
AdobePage curPage = (AdobePage) book.getCurPage();
int curPageIndex = curPage.getPageNum() - 1;
if (book.hasPreviousChapter()) {
int preIndex = book.getPreviousChapterIndex(curPageIndex);
int code = mAdapter.goToChapterIndex(preIndex);
if (hasError(code)) {
return;
}
try {
curPage = (AdobePage) book.getCurPage();
getPage(curPage);
setBorder(false);
updateView();
updateBookInfo(curPage);
book.resetPrePage();
book.resetNextPage();
} catch (Exception e) {
Logger.eLog(TAG, "ichapterUp failed ");
}
// debug code, can be delete
// int curIndex = mOpenedBook.getCurChapterIndex();
// int pageIndex = mOpenedBook.chapterGetCurPageIndex(curIndex);
// Logger.vLog(TAG, "ichapterUp finished " + curIndex + " -- " +
// pageIndex);
} else {
Logger.vLog(TAG, "hasPreviousChapter = false");
setLastCode(EngineMsgCode.ENGINE_WARN_CHAPTER_UP_FAILED);
}
}
protected void iChapterDown() {
if (!canWork()) {
Logger.eLog(TAG, "iChapterDown assertWork failed");
return;
}
Book book = getBook();
AdobePage curPage = (AdobePage) book.getCurPage();
int curPageIndex = curPage.getPageNum() - 1;
if (book.hasNextChapter()) {
int nextIndex = book.getNextChapterIndex(curPageIndex);
int code = mAdapter.goToChapterIndex(nextIndex);
if (hasError(code)) {
return;
}
try {
curPage = (AdobePage) book.getCurPage();
getPage(curPage);
setBorder(false);
updateView();
updateBookInfo(curPage);
book.resetPrePage();
book.resetNextPage();
} catch (Exception e) {
Logger.eLog(TAG, "ichapterUp failed");
}
// debug code, can be delete
// int curIndex = mOpenedBook.getCurChapterIndex();
// int pageIndex = mOpenedBook.chapterGetCurPageIndex(curIndex);
// Logger.vLog(TAG, "ichapterUp finished " + curIndex + " -- " +
// pageIndex);
} else {
Logger.vLog(TAG, "hasNextChapter = false");
setLastCode(EngineMsgCode.ENGINE_WARN_CHAPTER_DOWN_FAILED);
}
}
protected void iChapterUpdateInfo() {
if (!canWork()) {
Logger.eLog(TAG, "iChapterUpdateInfo assertWork failed");
return;
}
Book book = getBook();
if (book.chapterIsLoad()) {
if (book.chapterIsEmpty()) {
book.setCurChapterIndex(-1);
} else {
book.setCurChapterIndex(mAdapter.getCurrentChapterIndex());
book.setChapterState(ChapterTreeState.CURRENT_LOADED);
// Logger.d(TAG,
// "Tree.getCurChapterIndex(): "
// + mOpenedBook.getCurChapterIndex()
// + " Tree.getMaxChapterNum():"
// + mOpenedBook.getMaxChapterNum());
}
}
}
protected boolean iPageUp() {
boolean hasPrePage = false;
if (!canWork()) {
Logger.eLog(TAG, "iPageUp assertWork failed");
return false;
}
Book book = getBook();
AdobePage curPage = (AdobePage) book.getCurPage();
AdobePage prePage = (AdobePage) book.getPrePage();
AdobePage nextPage = (AdobePage) book.getNextPage();
try {
if (prePage.isLoaded()) {
Logger.vLog(TAG, "PrePage is loaded");
nextPage.copy(curPage);
curPage.copy(prePage);
setBorder(false);
updateView();
prePage.reset();
hasPrePage = mAdapter.getPreviousPage();
setBorder(!hasPrePage);
} else {
Logger.vLog(TAG, "PrePage is not loaded");
hasPrePage = mAdapter.getPreviousPage();
setBorder(!hasPrePage);
if (hasPrePage) {
nextPage.copy(curPage);
getPage(curPage);
updateView();
}
}
Logger.vLog(TAG, "Has prepage = " + hasPrePage);
// update Book information
updateBookInfo(curPage);
} catch (Exception e) {
Logger.eLog(TAG, "TurnPageUp error");
setLastCode(EngineMsgCode.STATE_ERROR_PAGE_UP_FAILED);
return false;
}
return hasPrePage;
}
protected boolean iPageDown() {
boolean hasNextPage = false;
if (!canWork()) {
Logger.eLog(TAG, "iPageDown assertWork failed");
return false;
}
Book book = getBook();
AdobePage curPage = (AdobePage) book.getCurPage();
AdobePage prePage = (AdobePage) book.getPrePage();
AdobePage nextPage = (AdobePage) book.getNextPage();
try {
if (nextPage.isLoaded()) {
Logger.vLog(TAG, "NextPage is loaded");
prePage.copy(curPage);
curPage.copy(nextPage);
setBorder(false);
updateView();
nextPage.reset();
hasNextPage = mAdapter.getNextPage();
setBorder(!hasNextPage);
} else {
Logger.vLog(TAG, "NextPage is not loaded");
hasNextPage = mAdapter.getNextPage();
setBorder(!hasNextPage);
if (hasNextPage) {
prePage.copy(curPage);
getPage(curPage);
updateView();
}
}
Logger.vLog(TAG, "Has nextpage = " + hasNextPage);
// update Book information
updateBookInfo(curPage);
} catch (Exception e) {
Logger.eLog(TAG, "TurnPageDown error");
setLastCode(EngineMsgCode.STATE_ERROR_PAGE_DOWN_FAILED);
return false;
}
return hasNextPage;
}
protected boolean iPageJumpTo(int pageNum) {
Logger.vLog(TAG, "iPageJumpTo pageNum = " + pageNum + " totalnum = "
+ mTotalNumber);
if ((pageNum > mTotalNumber) || (pageNum <= 0)) {
Logger.vLog(TAG, "PageNum is not invalid");
setLastCode(EngineMsgCode.ENGINE_ERROR_PAGE_NUMBER_INVALID);
return false;
}
if (!canWork()) {
Logger.vLog(TAG, "iPageJumpTo assertWork failed");
return false;
}
Book book = getBook();
try {
AdobePage curPage = (AdobePage) book.getCurPage();
mAdapter.goToPosition(pageNum - 1);
// if (hasError(code)) {
// return false;
// }
curPage.reset();
getPage(curPage);
setBorder(false);
updateView();
book.resetPrePage();
book.resetNextPage();
// update Book information
updateBookInfo(curPage);
} catch (Exception e) {
Logger.vLog(TAG, "PageJump error");
setLastCode(EngineMsgCode.STATE_ERROR_GOTO_PAGE_FAILED);
return false;
}
return true;
}
/* (non-Javadoc)
* @see com.easyview.ebook.reader.engine.core.ReaderWrapper#iPageZoomLevel(int)
*/
@Override
protected boolean iPageZoomLevel(int lv) {
if (!canWork()) {
Logger.eLog(TAG, "iPageZoomLevel assertWork failed");
return false;
}
int desFontLev;
if (lv > MAX_FONT_LEVEL) {
desFontLev = MAX_FONT_LEVEL;
} else if (lv < MIN_FONT_LEVEL) {
desFontLev = MIN_FONT_LEVEL;
} else {
desFontLev = lv;
}
Book book = getBook();
try {
AdobePage curPage = (AdobePage) book.getCurPage();
mAdapter.setFontSize(desFontLev);
curPage.reset();
getPage(curPage);
setBorder(false);
updateView();
book.resetPrePage();
book.resetNextPage();
// update Book information
setCurFontLevel(desFontLev);
updateBookInfo(curPage);
} catch (Exception e) {
Logger.eLog(TAG, "iPageZoomLevel error");
setLastCode(EngineMsgCode.STATE_ERROR_ZOOM_LEVEL_FAILED);
return false;
}
return true;
}
protected boolean iPageZoomIn() {
int fontLevel = getCurFontLevel();
if (fontLevel < MAX_FONT_LEVEL) {
fontLevel++;
setCurFontLevel(fontLevel);
} else {
Logger.vLog(TAG, "iPageZoomIn max");
setLastCode(EngineMsgCode.ENGINE_WARN_MAX_FONT);
return false;
}
if (!canWork()) {
Logger.eLog(TAG, "iPageZoomIn assertWork failed");
return false;
}
Logger.vLog(TAG, "ZoomIn level = " + fontLevel);
Book book = getBook();
try {
AdobePage curPage = (AdobePage) book.getCurPage();
mAdapter.setFontSize(fontLevel);
curPage.reset();
getPage(curPage);
setBorder(false);
updateView();
book.resetPrePage();
book.resetNextPage();
// update Book information
updateBookInfo(curPage);
} catch (Exception e) {
Logger.eLog(TAG, "ZoomIn error");
setLastCode(EngineMsgCode.STATE_ERROR_ZOOM_IN_FAILED);
return false;
}
return true;
}
protected boolean iPageZoomOut() {
int fontLevel = getCurFontLevel();
if (fontLevel > MIN_FONT_LEVEL) {
fontLevel--;
setCurFontLevel(fontLevel);
} else {
Logger.vLog(TAG, "iPageZoomOut min");
setLastCode(EngineMsgCode.ENGINE_WARN_MIN_FONT);
return false;
}
if (!canWork()) {
Logger.eLog(TAG, "iPageZoomOut assertWork failed");
return false;
}
Logger.vLog(TAG, "ZoomOut level = " + fontLevel);
Book book = getBook();
try {
AdobePage curPage = (AdobePage) book.getCurPage();
mAdapter.setFontSize(fontLevel);
curPage.reset();
getPage(curPage);
setBorder(false);
updateView();
book.resetPrePage();
book.resetNextPage();
// update Book information
updateBookInfo(curPage);
} catch (Exception e) {
Logger.eLog(TAG, "ZoomOut error");
setLastCode(EngineMsgCode.STATE_ERROR_ZOOM_OUT_FAILED);
return false;
}
return true;
}
protected void preloadPage() {
preloadPreviousPage();
preloadNextPage();
}
protected boolean preloadPreviousPage() {
if (!canWork()) {
Logger.eLog(TAG, "preloadPreviousPage assertWork failed");
return false;
}
if (hasError(getLastCode())) {
if ((getLastCode() == EngineMsgCode.ENGINE_WARN_MIN_FONT)
|| (getLastCode() == EngineMsgCode.ENGINE_WARN_MAX_FONT)) {
setLastCode(EngineMsgCode.NO_ERROR);
} else {
Logger.eLog(TAG,
"Has error no handle, exit preloadPreviousPage");
return false;
}
}
Book book = getBook();
AdobePage prePage = (AdobePage) book.getPrePage();
if (null == prePage) {
Logger.eLog(TAG, "GetPage = " + prePage);
setLastCode(EngineMsgCode.ENGINE_ERROR_CODE_ERROR);
return false;
}
if (!prePage.isLoaded() && mAdapter.getPreviousPage()) {
getPage(prePage);
mAdapter.getNextPage();
Logger.vLog(TAG, "preloadPreviousPage finished");
}
return true;
}
protected boolean preloadNextPage() {
if (!canWork()) {
Logger.eLog(TAG, "preloadNextPage assertWork failed");
return false;
}
if (hasError(getLastCode())) {
if ((getLastCode() == EngineMsgCode.ENGINE_WARN_MIN_FONT)
|| (getLastCode() == EngineMsgCode.ENGINE_WARN_MAX_FONT)) {
setLastCode(EngineMsgCode.NO_ERROR);
} else {
Logger.eLog(TAG, "Has error no handle, exit preloadNextPage");
return false;
}
}
Book book = getBook();
AdobePage nextPage = (AdobePage) book.getNextPage();
if (null == nextPage) {
Logger.eLog(TAG, "getPage = " + nextPage);
setLastCode(EngineMsgCode.ENGINE_ERROR_CODE_ERROR);
return false;
}
if (!nextPage.isLoaded() && mAdapter.getNextPage()) {
getPage(nextPage);
mAdapter.getPreviousPage();
Logger.vLog(TAG, "preloadNextPage finished");
}
return true;
}
@Override
protected DecAdapter getCurAdapter() {
return mAdapter;
}
@Override
protected void iEnterSearchMode() {
if (!canWork()) {
Logger.eLog(TAG, "iEnterSearchMode assertWork failed");
return;
}
SearchResult[] results;
BookSearchInfo.BookSearchResult[] bookResults;
Book book = getBook();
IBookSearchCursor bookSearchOps = book.getBookSearchCursor();
String key = bookSearchOps.getSearchKeyword();
if ((null == key) || key.equalsIgnoreCase("")) {
Logger.vLog(TAG, "iEnterSearchMode key == null");
setLastCode(EngineMsgCode.ENGINE_WARN_SEARCH_KEY_NULL);
return;
}
mAdapter.delAllHighlight();
mAdapter.resetFindText();
// record current location
String curLocation = mAdapter.getCurrentLocation();
// goto cover and search
mAdapter.goToPosition(1);
while (mAdapter.getPreviousPage()) {
}
bookSearchOps.resetResults();
results = doSearch(key, SEARCH_MODE_CONTINUE);
if (null == results) {
bookSearchOps.setSearchKeyword(null);
mAdapter.goToLocation(curLocation);
setLastCode(EngineMsgCode.ENGINE_WARN_SEARCH_RESULT_NULL);
return;
}
bookResults = convertAdobeResult(results);
bookSearchOps.addResults(bookResults);
// debug, it can be deleted
// ArrayList<BookSearchResult> res = book.getSearchResults();
// for (BookSearchResult searchResult : res) {
// Logger.dLog(TAG, "search key = " + searchResult.text + " start = "
// + searchResult.start_pos + " end = " + searchResult.end_pos);
// }
AdobePage page = (AdobePage) book.getCurPage();
BookSearchInfo.BookSearchResult result = bookSearchOps.getNextResult();
if (result != null) {
getPageBySearchResult(page, result);
} else {
setLastCode(EngineMsgCode.ENGINE_WARN_SEARCH_RESULT_NULL);
return;
}
updateView();
updateBookInfo(page);
book.resetNextPage();
book.resetPrePage();
}
@Override
protected void iSearchGoNext() {
if (!canWork()) {
Logger.eLog(TAG, "iSearchGoNext assertWork failed");
return;
}
SearchResult[] results;
BookSearchInfo.BookSearchResult result;
BookSearchInfo.BookSearchResult[] bookResults;
Book book = getBook();
IBookSearchCursor bookSearchOps = book.getBookSearchCursor();
AdobePage page = (AdobePage) book.getCurPage();
// check keyword
String key = bookSearchOps.getSearchKeyword();
if ((null == key) || key.equalsIgnoreCase("")) {
Logger.vLog(TAG, "iSearchGoNext key == null");
setLastCode(EngineMsgCode.ENGINE_WARN_SEARCH_KEY_NULL);
return;
}
result = bookSearchOps.getNextResult();
if (result != null) {
getPageBySearchResult(page, result);
} else {
setLastCode(AdobeMsgCode.STATE_NORMAL_GET_MORE_SEARCH_RESULT);
handleError();
results = doSearch(key, SEARCH_MODE_CONTINUE);
if (null == results) {
Logger.eLog(TAG, "iSearchGoNext failed");
setLastCode(EngineMsgCode.ENGINE_ERROR_SEARCH_GO_NEXT_FAILED);
return;
}
bookResults = convertAdobeResult(results);
bookSearchOps.addResults(bookResults);
result = bookSearchOps.getNextResult();
getPageBySearchResult(page, result);
}
updateView();
updateBookInfo(page);
}
@Override
protected void iSearchGoPrevious() {
if (!canWork()) {
Logger.eLog(TAG, "iSearchGoPrevious assertWork failed");
return;
}
BookSearchInfo.BookSearchResult result;
Book book = getBook();
IBookSearchCursor bookSearchOps = book.getBookSearchCursor();
AdobePage page = (AdobePage) book.getCurPage();
// check keyword
String key = bookSearchOps.getSearchKeyword();
if ((null == key) || key.equalsIgnoreCase("")) {
Logger.vLog(TAG, "iSearchGoPrevious key == null");
setLastCode(EngineMsgCode.ENGINE_WARN_SEARCH_KEY_NULL);
return;
}
result = bookSearchOps.getPreResult();
if (result != null) {
getPageBySearchResult(page, result);
} else {
Logger.eLog(TAG, "iSearchGoPrevious failed");
setLastCode(EngineMsgCode.ENGINE_ERROR_SEARCH_GO_PREVIOUS_FAILED);
}
updateView();
updateBookInfo(page);
}
/*
* (non-Javadoc)
*
* @see
* com.easyview.ebook.reader.engine.core.ReaderWrapper#iSearchGoto(com.easyview
* .ebook.reader.engine.model.BookSearchInfo.SearchResult)
*/
@Override
protected void iSearchGoto(
com.easyview.ebook.reader.engine.model.BookSearchInfo.BookSearchResult result) {
if (!canWork()) {
Logger.eLog(TAG, "iSearchGoto assertWork failed");
return;
}
Book book = getBook();
AdobePage page = (AdobePage) book.getCurPage();
if ((result != null) && (!result.start_pos.equals(Book.VALUE_NULL))) {
getPageBySearchResult(page, result);
} else {
Logger.eLog(TAG, "iSearchGoto failed");
setLastCode(EngineMsgCode.STATE_ERROR_SEARCH_GOTO_RESULT_FAILED);
}
updateView();
updateBookInfo(page);
}
@Override
protected void iSearchUpdateInfo() {
}
@Override
protected void iQuitSearch() {
if (!canWork()) {
Logger.eLog(TAG, "iSearchGoPrevious assertWork failed");
return;
}
Logger.eLog(TAG, "iQuitSearch >>>>");
mAdapter.delAllHighlight();
mAdapter.resetFindText();
// clear search keyword
Book book = getBook();
IBookSearchCursor bookSearchOps = book.getBookSearchCursor();
bookSearchOps.setSearchKeyword(null);
// reset error code
setLastCode(EngineCode.EngineMsgCode.NO_ERROR);
}
private SearchResult[] doSearch(String key, int cont) {
SearchResult[] results;
results = mAdapter.getSearchResult(key, SEARCH_PER_SIZE, cont);
return results;
}
@Override
protected void iAddBookmark() {
if (!canWork()) {
Logger.eLog(TAG, "iSearchGoPrevious assertWork failed");
return;
}
try {
Book book = getBook();
String location = mAdapter.getCurrentLocation();
// 判斷當前頁是否已存在書簽,該邏輯移到ERSqliteProxy中處理
// IDatabaseService dbService = (IDatabaseService) ERManager
// .getService(ERManager.DATABASE_SERVICE);
// boolean hasBookmark = dbService.queryBookmark(book, location);
// if (hasBookmark) {
// Logger.dLog(TAG, "iAddBookmark has bookmark");
// return;
// }
AdobePage page = (AdobePage) book.getCurPage();
IBookMarkCursor bookmarkOps = book.getBookMarkCursor();
Bookmark bookmark = book.makeBookmark();
int pageNum = (int) mAdapter.getPagePosition(location) + 1;
String summary = mAdapter.getSummaryByLocation(location);
page.setSummary(summary);
bookmark.setBookId(book.getBookId());
bookmark.setLocation(location);
bookmark.setPageNum(pageNum);
bookmark.setSummary(summary);
bookmark.setTime(System.currentTimeMillis());
boolean addRes = bookmarkOps.addBookmark(bookmark);
addBookMarkDB(bookmark);
} catch (Exception e) {
setLastCode(EngineMsgCode.ENGINE_ERROR_BOOKMARK_ADD_FAILED);
}
}
/* (non-Javadoc)
* @see com.easyview.ebook.reader.engine.core.ReaderWrapper#iGotoBookmark(com.easyview.ebook.reader.engine.model.BookMarkInfo.Bookmark)
*/
@Override
protected void iGotoBookmark(Bookmark bookmark) {
if (!canWork()) {
Logger.eLog(TAG, "iGotoBookmark assertWork failed");
return;
}
if (null == bookmark) {
setLastCode(EngineMsgCode.ENGINE_ERROR_BOOKMARK_GOTO_FAILED);
return;
}
Book book = getBook();
AdobePage page = (AdobePage) book.getCurPage();
getPageByLocation(page, bookmark.getLocation());
updateView();
updateBookInfo(page);
}
@Override
protected void iGotoBookmark() {
if (!canWork()) {
Logger.eLog(TAG, "iGotoBookmark assertWork failed");
return;
}
Book book = getBook();
IBookMarkCursor bookmarkOps = book.getBookMarkCursor();
Bookmark bookmark = bookmarkOps.getBookmarkTogo();
iGotoBookmark(bookmark);
}
@Override
protected void iDeleteBookmark(Bookmark bookmark) {
if (!canWork()) {
Logger.eLog(TAG, "iSearchGoPrevious assertWork failed");
return;
}
if (null == bookmark) {
setLastCode(EngineMsgCode.ENGINE_ERROR_BOOKMARK_DEL_FAILED);
return;
}
try {
Book book = getBook();
IBookMarkCursor bookmarkOps = book.getBookMarkCursor();
bookmarkOps.delBookmark(bookmark);
delBookMarkDB(bookmark);
} catch (Exception e) {
setLastCode(EngineMsgCode.ENGINE_ERROR_BOOKMARK_DEL_FAILED);
}
}
@Override
protected void iDelAllBookmark() {
if (!canWork()) {
Logger.eLog(TAG, "iSearchGoPrevious assertWork failed");
return;
}
try {
Book book = getBook();
IBookMarkCursor bookmarkOps = book.getBookMarkCursor();
bookmarkOps.cleanBookmarks();
cleanBookMarkDB();
} catch (Exception e) {
setLastCode(EngineMsgCode.ENGINE_ERROR_BOOKMARK_DEL_FAILED);
}
}
@Override
protected boolean iOpenLinkByTouch(int x, int y) {
if (!canWork()) {
Logger.eLog(TAG, "iTouchLinkToOpen assertWork failed");
return false;
}
Book book = getBook();
AdobePage curPage = (AdobePage) book.getCurPage();
if (curPage.getLinkCount() == -1) {
int mCount = mAdapter.getLinkCount();
curPage.setLinkCount(mCount);
}
if (book.getCurPage().getLinkCount() > 0) {
String[] urlStrings = new String[1];
int code = mAdapter.linkTest(x, y, urlStrings);
Logger.dLog(TAG, "iTouchLinkToOpen code: " + code);
if (code == 1) {
Logger.dLog(TAG, "iTouchLinkToOpen External link, url= "
+ urlStrings[0]);
} else if (code == 2) {
Logger.dLog(TAG, "iTouchLinkToOpen Internal link");
try {
getPage(curPage);
setBorder(false);
updateView();
updateBookInfo(curPage);
book.resetPrePage();
book.resetNextPage();
} catch (Exception e) {
Logger.eLog(TAG, "iTouchLinkToOpen failed");
}
}
}
return true;
}
@Override
protected boolean iResizeScreen(int width, int height) {
if (!canWork()) {
Logger.eLog(TAG, "iSetScreenLandMode assertWork failed");
return false;
}
// if (getLandMode() == land) {
// Logger.dLog(TAG, "iSetScreenLandMode land mode is " + land);
// return false;
// }
//
// setLandMode(land);
Book book = getBook();
book.setViewWidth(width);
book.setViewHeight(height);
book.initPage();
Logger.dLog(TAG, "width = " + width + " height = " + height);
mAdapter.setViewPortSize(width, height);
mAdapter.setFontSize(getCurFontLevel());
try {
AdobePage curPage = (AdobePage) book.getCurPage();
getPage(curPage);
setBorder(false);
updateView();
updateBookInfo(curPage);
book.resetPrePage();
book.resetNextPage();
} catch (Exception e) {
Logger.eLog(TAG, "iSetScreenLandMode failed");
}
return true;
}
@Override
protected boolean iStartHighlightByXY(double x1, double y1) {
if (!canWork()) {
Logger.eLog(TAG, "iAddHighlightByXY assertWork failed");
return false;
}
mHighlightStartX = x1;
mHighlightStartY = y1;
mHighlightColor = 0;
return true;
}
@Override
protected boolean iMoveHighlightByXY(double x, double y) {
return true;
}
@Override
protected boolean iEndHighlightByXY(double x, double y) {
if (!canWork()) {
Logger.eLog(TAG, "iDelHighlightByXY assertWork failed");
return false;
}
mHighlightEndX = x;
mHighlightEndY = y;
mAdapter.delAllHighlight();
String hitStr1 = mAdapter.hitTest(mHighlightStartX, mHighlightStartY);
String hitStr2 = mAdapter.hitTest(mHighlightEndX, mHighlightEndY);
boolean res = mAdapter.setHighlightbyloc(hitStr1, hitStr2,
mHighlightColor);
Logger.dLog(TAG, "iAddHighlightByXY res = " + res + " hit1 = "
+ hitStr1 + " hit2 = " + hitStr2);
// String hlStr = mAdapter.setHighlightbyxy(x1, y1, x2, y2, z);
// Logger.dLog(TAG, "iSetHighlightByXY hlStr = " + hlStr);
if (!res) {
setLastCode(EngineMsgCode.ENGINE_ERROR_BOOK_ADD_HIGHLIGHT_FAILED);
return false;
}
Book book = getBook();
BookEmphasis emp = book.makeEmphasis();
IBookEmphasisCursor beops = book.getBookEmphasisCursor();
String location = mAdapter.getCurrentLocation();
String summary = mAdapter.getSummaryByLocation(location);
emp.setBookId(book.getBookId());
emp.setXY(mHighlightStartX, mHighlightStartY, mHighlightEndX,
mHighlightEndY);
emp.setCourse(hitStr1, hitStr2);
emp.setLocation(location);
emp.setColor(mHighlightColor);
emp.setTime(System.currentTimeMillis());
emp.setSummary(summary);
emp.setFontLevel(getCurFontLevel());
boolean addRes = beops.addEmphasis(emp);
try {
AdobePage curPage = (AdobePage) book.getCurPage();
getPage(curPage);
setBorder(false);
updateView();
updateBookInfo(curPage);
resetHighlight();
addBookEmphasisDB(emp);
} catch (Exception e) {
Logger.eLog(TAG, "iAddHighlightByXY failed");
setLastCode(EngineMsgCode.ENGINE_ERROR_BOOK_ADD_HIGHLIGHT_FAILED);
}
return true;
}
@Override
protected boolean iDelHighlight(BookEmphasis emphasis) {
if (!canWork()) {
Logger.eLog(TAG, "iDelHighlightByXY assertWork failed");
return false;
}
Book book = getBook();
String hitStr1 = emphasis.startCursor;
String hitStr2 = emphasis.endCursor;
int color = emphasis.color;
boolean res = mAdapter.delHighlight(hitStr1, hitStr2, color);
Logger.dLog(TAG, "iDelHighlightByXY res = " + res + " hit1 = "
+ hitStr1 + " hit2 = " + hitStr2 + " color = " + color);
if (!res) {
// setLastCode(EngineMsgCode.ENGINE_ERROR_BOOK_DEL_HIGHLIGHT_FAILED);
// return false;
}
try {
String location = emphasis.pageLocation;
if (mAdapter.getCurrentLocation().equals(location)) {
AdobePage curPage = (AdobePage) book.getCurPage();
getPage(curPage);
setBorder(false);
updateView();
updateBookInfo(curPage);
}
IBookEmphasisCursor beops = book.getBookEmphasisCursor();
beops.delEmphasis(emphasis);
delBookEmphasisDB(emphasis);
} catch (Exception e) {
Logger.eLog(TAG, "iDelHighlightByXY failed");
setLastCode(EngineMsgCode.ENGINE_ERROR_BOOK_DEL_HIGHLIGHT_FAILED);
}
return true;
}
@Override
protected boolean iGotoHighlight(BookEmphasis emphasis) {
if (!canWork()) {
Logger.eLog(TAG, "iGotoHighlight assertWork failed");
return false;
}
Book book = getBook();
mAdapter.setFontSize(emphasis.fontLevel);
mAdapter.delAllHighlight();
boolean res = mAdapter.setHighlightbyloc(emphasis.startCursor,
emphasis.endCursor, emphasis.color);
// Logger.dLog(TAG, "iGotoHighlight res = " + res + " start = "
// + emphasis.startCursor + " end = " + emphasis.endCursor);
try {
String location = emphasis.pageLocation;
AdobePage curPage = (AdobePage) book.getCurPage();
getPageByLocation(curPage, location);
setBorder(false);
updateView();
setCurFontLevel(emphasis.fontLevel);
updateBookInfo(curPage);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
@Override
protected boolean iDelAllHighlight() {
if (!canWork()) {
Logger.eLog(TAG, "iDelAllHighlight assertWork failed");
return false;
}
try {
Book book = getBook();
IBookEmphasisCursor beops = book.getBookEmphasisCursor();
beops.clear();
mAdapter.delAllHighlight();
AdobePage curPage = (AdobePage) book.getCurPage();
getPage(curPage);
setBorder(false);
updateView();
updateBookInfo(curPage);
cleanBookEmphasisDB();
} catch (Exception e) {
setLastCode(EngineMsgCode.ENGINE_ERROR_BOOK_DEL_HIGHLIGHT_FAILED);
}
return true;
}
/* (non-Javadoc)
* @see com.easyview.ebook.reader.engine.core.ReaderWrapper#iDoFetchText()
*/
@Override
protected boolean iDoFetchText() {
// TODO Auto-generated method stub
return false;
}
@Override
protected void setDefaultVal() {
setCurFontLevel(DEFAULT_FONT_LEVEL);
}
}