diff --git a/TODO.fileManager b/TODO.fileManager index aef1bebb5..69f36e3b3 100644 --- a/TODO.fileManager +++ b/TODO.fileManager @@ -8,5 +8,5 @@ VR: NP: DONE Локализовать все сообщения * Отдельная иконка для архивов - * Архивы в архивах + DONE Архивы в архивах * filesystem: return special result (exception?) if directory is not readable diff --git a/TODO.library b/TODO.library index 4f6ded381..75b1e9cee 100644 --- a/TODO.library +++ b/TODO.library @@ -19,6 +19,6 @@ DONE Highlight current book * Bug: search with no results clears search results subtree; should not * garbage in Boris Akunin, Сказки для идиотов * duplicate tags in the same book -* Bug: b1.zip (paths in zips?) -* Bug: b1.zip, archive inside archive +DONE Bug: b1.zip (paths in zips?) +DONE Bug: b1.zip, archive inside archive * Open the help file if the current book is deleted from library diff --git a/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java b/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java index 1fb83c69f..718ccde5e 100644 --- a/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java +++ b/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java @@ -60,7 +60,7 @@ public final class SQLiteBooksDatabase extends BooksDatabase { private void migrate(Context context) { final int version = myDatabase.getVersion(); - final int currentVersion = 11; + final int currentVersion = 12; if (version >= currentVersion) { return; } @@ -91,6 +91,8 @@ public final class SQLiteBooksDatabase extends BooksDatabase { updateTables9(); case 10: updateTables10(); + case 11: + updateTables11(); } myDatabase.setTransactionSuccessful(); myDatabase.endTransaction(); @@ -568,7 +570,7 @@ public final class SQLiteBooksDatabase extends BooksDatabase { final String[] parameters = { null }; FileInfo current = null; for (ZLFile f : fileStack) { - parameters[0] = f.getName(false); + parameters[0] = f.getLongName(); final Cursor cursor = myDatabase.rawQuery( (current == null) ? "SELECT file_id,size FROM Files WHERE name = ?" : @@ -1113,4 +1115,8 @@ public final class SQLiteBooksDatabase extends BooksDatabase { "CREATE TABLE IF NOT EXISTS Favorites(" + "book_id INTEGER UNIQUE NOT NULL REFERENCES Books(book_id))"); } + + private void updateTables11() { + myDatabase.execSQL("UPDATE Files SET size = size + 1"); + } } diff --git a/src/org/geometerplus/android/fbreader/ShowBookInfoAction.java b/src/org/geometerplus/android/fbreader/ShowBookInfoAction.java index 76554a3ed..8e566c523 100644 --- a/src/org/geometerplus/android/fbreader/ShowBookInfoAction.java +++ b/src/org/geometerplus/android/fbreader/ShowBookInfoAction.java @@ -46,13 +46,7 @@ class ShowBookInfoAction extends FBAction { final BookModel model = Reader.Model; if (model != null && model.Book != null) { final ZLFile file = model.Book.File; - final ZLFile physicalFile = file.getPhysicalFile(); - if (physicalFile == null || physicalFile == file) { - intent.putExtra(BookInfoActivity.CURRENT_BOOK_PATH_KEY, file.getPath()); - } else { - intent.putExtra(BookInfoActivity.CURRENT_BOOK_PATH_KEY, physicalFile.getPath()); - intent.putExtra(BookInfoActivity.CURRENT_BOOK_ARCHIVE_ENTRY_KEY, file.getName(false)); - } + intent.putExtra(BookInfoActivity.CURRENT_BOOK_PATH_KEY, file.getPath()); } myBaseActivity.startActivityForResult( intent, FBReader.REPAINT_CODE diff --git a/src/org/geometerplus/android/fbreader/library/FileManager.java b/src/org/geometerplus/android/fbreader/library/FileManager.java index 7053befe3..5c37a540c 100644 --- a/src/org/geometerplus/android/fbreader/library/FileManager.java +++ b/src/org/geometerplus/android/fbreader/library/FileManager.java @@ -221,9 +221,8 @@ public final class FileManager extends BaseActivity { if (children.size() == 1) { final ZLFile child = children.get(0); if (child.getPath().endsWith(".fb2")) { - final String fileName = file.getName(false); myFile = child; - myName = fileName.substring(fileName.lastIndexOf('/') + 1); + myName = file.getLongName(); mySummary = null; return; } @@ -235,12 +234,7 @@ public final class FileManager extends BaseActivity { } public String getName() { - if (myName != null) { - return myName; - } - - final String fileName = myFile.getName(false); - return fileName.substring(fileName.lastIndexOf('/') + 1); + return myName != null ? myName : myFile.getLongName(); } public String getSummary() { diff --git a/src/org/geometerplus/android/fbreader/preferences/BookInfoActivity.java b/src/org/geometerplus/android/fbreader/preferences/BookInfoActivity.java index 53bc44a59..7ab9a4191 100644 --- a/src/org/geometerplus/android/fbreader/preferences/BookInfoActivity.java +++ b/src/org/geometerplus/android/fbreader/preferences/BookInfoActivity.java @@ -85,7 +85,6 @@ class LanguagePreference extends ZLStringListPreference { public class BookInfoActivity extends ZLPreferenceActivity { public static final String CURRENT_BOOK_PATH_KEY = "CurrentBookPath"; - public static final String CURRENT_BOOK_ARCHIVE_ENTRY_KEY = "CurrentArchiveEntryPath"; private Book myBook; @@ -100,11 +99,7 @@ public class BookInfoActivity extends ZLPreferenceActivity { } final String path = intent.getStringExtra(CURRENT_BOOK_PATH_KEY); - final String archiveEntry = intent.getStringExtra(CURRENT_BOOK_ARCHIVE_ENTRY_KEY); - ZLFile file = ZLFile.createFile(null, path); - if (archiveEntry != null) { - file = ZLFile.createFile(file, archiveEntry); - } + final ZLFile file = ZLFile.createFileByPath(path); myBook = Book.getByFile(file); if (myBook.File.getPhysicalFile() != null) { diff --git a/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java b/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java index c22a51a2e..ceb17a996 100644 --- a/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java +++ b/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java @@ -136,8 +136,10 @@ public final class FBReaderApp extends ZLApplication { } public void openBook(final Book book, final Bookmark bookmark) { - if (bookmark == null & book.File.getPath().equals(Model.Book.File.getPath())) { - return; + if (Model != null) { + if (bookmark == null & book.File.getPath().equals(Model.Book.File.getPath())) { + return; + } } ZLDialogManager.Instance().wait("loadingBook", new Runnable() { public void run() { diff --git a/src/org/geometerplus/fbreader/formats/oeb/OEBBookReader.java b/src/org/geometerplus/fbreader/formats/oeb/OEBBookReader.java index bc3ba44f0..324506860 100644 --- a/src/org/geometerplus/fbreader/formats/oeb/OEBBookReader.java +++ b/src/org/geometerplus/fbreader/formats/oeb/OEBBookReader.java @@ -215,7 +215,7 @@ class OEBBookReader extends ZLXMLReaderAdapter implements XMLNamespaces { if ((type != null) && (COVER_IMAGE.equals(type))) { myModelReader.setMainTextModel(); final ZLFile imageFile = ZLFile.createFileByPath(myFilePrefix + href); - final String imageName = imageFile.getName(false); + final String imageName = imageFile.getLongName(); myModelReader.addImageReference(imageName, (short)0); myModelReader.addImage(imageName, new ZLFileImage(MimeTypes.MIME_IMAGE_AUTO, imageFile)); } diff --git a/src/org/geometerplus/fbreader/formats/util/MiscUtil.java b/src/org/geometerplus/fbreader/formats/util/MiscUtil.java index 315872269..73a011b5b 100644 --- a/src/org/geometerplus/fbreader/formats/util/MiscUtil.java +++ b/src/org/geometerplus/fbreader/formats/util/MiscUtil.java @@ -23,14 +23,9 @@ import org.geometerplus.zlibrary.core.filesystem.ZLFile; public class MiscUtil { public static String htmlDirectoryPrefix(ZLFile file) { - String shortName = file.getName(false); + String shortName = file.getShortName(); String path = file.getPath(); - int index = -1; - if ((path.length() > shortName.length()) && - (path.charAt(path.length() - shortName.length() - 1) == ':')) { - index = shortName.lastIndexOf('/'); - } - return path.substring(0, path.length() - shortName.length() + index + 1); + return path.substring(0, path.length() - shortName.length()); } public static String archiveEntryName(String fullPath) { diff --git a/src/org/geometerplus/fbreader/formats/xhtml/XHTMLTagImageAction.java b/src/org/geometerplus/fbreader/formats/xhtml/XHTMLTagImageAction.java index 47962d0c5..1e9ea2c5d 100644 --- a/src/org/geometerplus/fbreader/formats/xhtml/XHTMLTagImageAction.java +++ b/src/org/geometerplus/fbreader/formats/xhtml/XHTMLTagImageAction.java @@ -45,7 +45,7 @@ class XHTMLTagImageAction extends XHTMLTagAction { if (flag) { modelReader.endParagraph(); } - final String imageName = imageFile.getName(false); + final String imageName = imageFile.getLongName(); modelReader.addImageReference(imageName, (short)0); modelReader.addImage(imageName, new ZLFileImage(MimeTypes.MIME_IMAGE_AUTO, imageFile)); if (flag) { diff --git a/src/org/geometerplus/fbreader/library/Book.java b/src/org/geometerplus/fbreader/library/Book.java index e6c85e3d3..892cabf66 100644 --- a/src/org/geometerplus/fbreader/library/Book.java +++ b/src/org/geometerplus/fbreader/library/Book.java @@ -121,7 +121,9 @@ public class Book { return false; } if ((myTitle == null) || (myTitle.length() == 0)) { - setTitle(File.getName(true)); + final String fileName = File.getShortName(); + final int index = fileName.lastIndexOf('.'); + setTitle(index > 0 ? fileName.substring(0, index) : fileName); } final String demoPathPrefix = Paths.BooksDirectoryOption().getValue() + java.io.File.separator + "Demos" + java.io.File.separator; if (File.getPath().startsWith(demoPathPrefix)) { diff --git a/src/org/geometerplus/fbreader/library/FileInfoSet.java b/src/org/geometerplus/fbreader/library/FileInfoSet.java index 7a8ab828e..df57b37d1 100644 --- a/src/org/geometerplus/fbreader/library/FileInfoSet.java +++ b/src/org/geometerplus/fbreader/library/FileInfoSet.java @@ -145,7 +145,7 @@ public final class FileInfoSet { } FileInfo info = myInfosByFile.get(file); if (info == null) { - info = get(file.getName(false), get(file.getParent())); + info = get(file.getLongName(), get(file.getParent())); myInfosByFile.put(file, info); } return info; diff --git a/src/org/geometerplus/fbreader/library/Library.java b/src/org/geometerplus/fbreader/library/Library.java index 279f303ce..0011e7a7b 100644 --- a/src/org/geometerplus/fbreader/library/Library.java +++ b/src/org/geometerplus/fbreader/library/Library.java @@ -95,7 +95,9 @@ public final class Library { if (book != null) { myBooks.add(book); } else if (file.isArchive()) { + System.err.println("ARCHIVE: " + file.getPath()); for (ZLFile entry : fileInfos.archiveEntries(file)) { + System.err.println("ENTRY: " + entry.getPath()); collectBooks(entry, fileInfos, savedBooks, doReadMetaInfo); } } diff --git a/src/org/geometerplus/zlibrary/core/filesystem/ZLArchiveEntryFile.java b/src/org/geometerplus/zlibrary/core/filesystem/ZLArchiveEntryFile.java index 539b765d9..31a74c054 100644 --- a/src/org/geometerplus/zlibrary/core/filesystem/ZLArchiveEntryFile.java +++ b/src/org/geometerplus/zlibrary/core/filesystem/ZLArchiveEntryFile.java @@ -77,7 +77,6 @@ public abstract class ZLArchiveEntryFile extends ZLFile { protected final ZLFile myParent; protected final String myName; - private String myShortName; protected ZLArchiveEntryFile(ZLFile parent, String name) { myParent = parent; @@ -101,17 +100,8 @@ public abstract class ZLArchiveEntryFile extends ZLFile { } @Override - public String getNameWithExtension() { - if (myShortName == null) { - final String name = myName; - final int index = name.lastIndexOf('/'); - if (index == -1) { - myShortName = name; - } else { - myShortName = name.substring(index + 1); - } - } - return myShortName; + public String getLongName() { + return myName; } @Override diff --git a/src/org/geometerplus/zlibrary/core/filesystem/ZLFile.java b/src/org/geometerplus/zlibrary/core/filesystem/ZLFile.java index 39cca0c3f..2f31e3f88 100644 --- a/src/org/geometerplus/zlibrary/core/filesystem/ZLFile.java +++ b/src/org/geometerplus/zlibrary/core/filesystem/ZLFile.java @@ -35,15 +35,15 @@ public abstract class ZLFile { int ARCHIVE = 0xff00; }; - private String myNameWithoutExtension; private String myExtension; + private String myShortName; protected int myArchiveType; private boolean myIsCached; protected void init() { - final String name = getNameWithExtension(); + final String name = getLongName(); final int index = name.lastIndexOf('.'); - myNameWithoutExtension = (index != -1) ? name.substring(0, index) : name; - myExtension = (index != -1) ? name.substring(index + 1).toLowerCase().intern() : ""; + myExtension = (index > 0) ? name.substring(index + 1).toLowerCase().intern() : ""; + myShortName = name.substring(name.lastIndexOf('/') + 1); /* if (lowerCaseName.endsWith(".gz")) { @@ -140,11 +140,12 @@ public abstract class ZLFile { return (0 != (myArchiveType & ArchiveType.ARCHIVE)); } - protected abstract String getNameWithExtension(); - public final String getName(boolean hideExtension) { - return hideExtension ? myNameWithoutExtension : getNameWithExtension(); + public abstract String getLongName(); + + public final String getShortName() { + return myShortName; } - + public final String getExtension() { return myExtension; } diff --git a/src/org/geometerplus/zlibrary/core/filesystem/ZLPhysicalFile.java b/src/org/geometerplus/zlibrary/core/filesystem/ZLPhysicalFile.java index b743e1ac1..eb768d253 100644 --- a/src/org/geometerplus/zlibrary/core/filesystem/ZLPhysicalFile.java +++ b/src/org/geometerplus/zlibrary/core/filesystem/ZLPhysicalFile.java @@ -59,7 +59,7 @@ public final class ZLPhysicalFile extends ZLFile { } @Override - public String getNameWithExtension() { + public String getLongName() { return isDirectory() ? getPath() : myFile.getName(); } diff --git a/src/org/geometerplus/zlibrary/core/filesystem/ZLResourceFile.java b/src/org/geometerplus/zlibrary/core/filesystem/ZLResourceFile.java index e41357f28..2c19f45e9 100644 --- a/src/org/geometerplus/zlibrary/core/filesystem/ZLResourceFile.java +++ b/src/org/geometerplus/zlibrary/core/filesystem/ZLResourceFile.java @@ -37,14 +37,17 @@ public abstract class ZLResourceFile extends ZLFile { init(); } + @Override public String getPath() { return myPath; } - public String getNameWithExtension() { + @Override + public String getLongName() { return myPath.substring(myPath.lastIndexOf('/') + 1); } + @Override public ZLPhysicalFile getPhysicalFile() { return null; } diff --git a/src/org/geometerplus/zlibrary/core/language/ZLLanguageDetector.java b/src/org/geometerplus/zlibrary/core/language/ZLLanguageDetector.java index a452e64fe..ba8c37321 100644 --- a/src/org/geometerplus/zlibrary/core/language/ZLLanguageDetector.java +++ b/src/org/geometerplus/zlibrary/core/language/ZLLanguageDetector.java @@ -65,7 +65,7 @@ public class ZLLanguageDetector { public ZLLanguageDetector() { for (ZLFile file : ZLLanguageUtil.patternsFile().children()) { - final String name = file.getName(true); + final String name = file.getShortName(); final int index = name.indexOf('_'); if (index != -1) { final String language = name.substring(0, index); diff --git a/src/org/geometerplus/zlibrary/core/language/ZLLanguageUtil.java b/src/org/geometerplus/zlibrary/core/language/ZLLanguageUtil.java index 64e63fccc..6e88901a3 100644 --- a/src/org/geometerplus/zlibrary/core/language/ZLLanguageUtil.java +++ b/src/org/geometerplus/zlibrary/core/language/ZLLanguageUtil.java @@ -64,7 +64,7 @@ public abstract class ZLLanguageUtil { if (ourLanguageCodes.isEmpty()) { TreeSet codes = new TreeSet(); for (ZLFile file : patternsFile().children()) { - String name = file.getName(false); + String name = file.getShortName(); final int index = name.indexOf("_"); if (index != -1) { String str = name.substring(0, index);