diff --git a/FBReader/fbreader/src/fbreader/FBReader.cpp b/FBReader/fbreader/src/fbreader/FBReader.cpp index 40ea5e2..275966b 100644 --- a/FBReader/fbreader/src/fbreader/FBReader.cpp +++ b/FBReader/fbreader/src/fbreader/FBReader.cpp @@ -19,6 +19,9 @@ #include +#include +#include + #include #include #include @@ -64,6 +67,26 @@ static const std::string OPTIONS = "Options"; const std::string FBReader::PageIndexParameter = "pageIndex"; +static std::string getAbsolutePath(std::string filename) +{ + std::string archive_path; + + std::string::size_type archive_delim = filename.find(BooksDBQuery::ArchiveEntryDelimiter); + if (archive_delim != std::string::npos) + { + archive_path = filename.substr(archive_delim); + filename = filename.substr(0, archive_delim); + } + + std::unique_ptr resolved_path(realpath(filename.c_str(), NULL), std::free); + if (!resolved_path) + { + return filename + archive_path; + } + + return std::string(resolved_path.get()) + archive_path; +} + class OpenFileHandler : public ZLMessageHandler { public: @@ -180,7 +203,7 @@ void FBReader::initWindow() { if (!myBookAlreadyOpen) { shared_ptr book; if (!myBookToOpen.empty()) { - createBook(ZLFile(myBookToOpen), book); + createBook(ZLFile(getAbsolutePath(myBookToOpen)), book); } if (book.isNull()) { const BookList &books = Library::Instance().recentBooks();