Doc Doc::CreateFromFile(const WCHAR *filePath) { Doc doc; if (EpubDoc::IsSupportedFile(filePath)) doc = Doc(EpubDoc::CreateFromFile(filePath)); else if (Fb2Doc::IsSupportedFile(filePath)) doc = Doc(Fb2Doc::CreateFromFile(filePath)); else if (MobiDoc::IsSupportedFile(filePath)) { doc = Doc(MobiDoc::CreateFromFile(filePath)); // MobiDoc is also used for loading PalmDoc - don't expose that to Doc users, though if (doc.mobiDoc && doc.mobiDoc->GetDocType() != Pdb_Mobipocket) { doc.Delete(); // .prc files can be both MobiDoc or PalmDoc if (PalmDoc::IsSupportedFile(filePath)) doc = Doc(PalmDoc::CreateFromFile(filePath)); } } else if (PalmDoc::IsSupportedFile(filePath)) doc = Doc(PalmDoc::CreateFromFile(filePath)); // if failed to load and more specific error message hasn't been // set above, set a generic error message if (doc.IsNone()) { CrashIf(doc.error); doc.error = Error_Unknown; doc.filePath.Set(str::Dup(filePath)); } else { CrashIf(!Doc::IsSupportedFile(filePath)); } CrashIf(!doc.generic && !doc.IsNone()); return doc; }
virtual void Run() { doc = Doc::CreateFromFile(fileName); // don't load PalmDoc, etc. files as long as they're not correctly formatted if (doc.AsMobi() && Pdb_Mobipocket != doc.AsMobi()->GetDocType()) doc.Delete(); // let uitask clean up this thread uitask::Post(this); }
// this is to compare the time it takes to layout a whole ebook file // using different text measurement method (since the time is mostly // dominated by text measure) void BenchEbookLayout(const WCHAR *filePath) { bool deleteLog = false; if (!gLog) { gLog = new slog::StderrLogger(); deleteLog = true; } logbench(L"Starting: %s", filePath); if (!file::Exists(filePath)) { logbench(L"Error: file doesn't exist"); return; } if (!Doc::IsSupportedFile(filePath)) { logbench(L"Error: not an ebook file"); return; } Timer t; Doc doc = Doc::CreateFromFile(filePath); if (doc.LoadingFailed()) { logbench(L"Error: failed to load the file as doc"); doc.Delete(); return; } double timeMs = t.Stop(); logbench(L"load: %.2f ms", timeMs); int nPages = TimeOneMethod(doc, TextRenderMethodGdi, L"gdi "); TimeOneMethod(doc, TextRenderMethodGdiplus, L"gdi+ "); TimeOneMethod(doc, TextRenderMethodGdiplusQuick, L"gdi+ quick"); // do it twice because the first run is very unfair to the first version that runs // (probably because of font caching) TimeOneMethod(doc, TextRenderMethodGdi, L"gdi "); TimeOneMethod(doc, TextRenderMethodGdiplus, L"gdi+ "); TimeOneMethod(doc, TextRenderMethodGdiplusQuick, L"gdi+ quick"); doc.Delete(); logbench(L"pages: %d", nPages); if (deleteLog) { delete gLog; } }
virtual void Run() { //lf(L"ThreadLoadEbook::Run(%s)", fileName); Timer t(true); doc = Doc::CreateFromFile(fileName); double loadingTimeMs = t.GetTimeInMs(); lf(L"Loaded %s in %.2f ms", fileName, loadingTimeMs); // don't load PalmDoc, etc. files as long as they're not correctly formatted if (doc.AsMobi() && Pdb_Mobipocket != doc.AsMobi()->GetDocType()) doc.Delete(); // let uitask clean up this thread uitask::Post(this); }
void ThreadLoadEbook::Run() { //lf(L"ThreadLoadEbook::Run(%s)", fileName); Timer t(true); Doc doc = Doc::CreateFromFile(fileName); double loadingTimeMs = t.GetTimeInMs(); //lf(L"Loaded %s in %.2f ms", fileName, t.GetTimeInMs()); // don't load PalmDoc, etc. files as long as they're not correctly formatted if (doc.AsMobi() && Pdb_Mobipocket != doc.AsMobi()->GetDocType()) doc.Delete(); uitask::Post(new FinishedEbookLoadingTask(win, doc)); }
void ThreadLoadEbook::Run() { //lf(L"ThreadLoadEbook::Run(%s)", fileName); Timer t(true); Doc doc = Doc::CreateFromFile(fileName); // TODO: even under heavy load, Doc::CreateFromFile doesn't take more // than 50ms - any reason not to synchronously load ebooks? double loadingTimeMs = t.GetTimeInMs(); lf(L"Loaded %s in %.2f ms", fileName, loadingTimeMs); // don't load PalmDoc, etc. files as long as they're not correctly formatted if (doc.AsMobi() && Pdb_Mobipocket != doc.AsMobi()->GetDocType()) doc.Delete(); uitask::Post(new FinishedEbookLoadingTask(win, doc)); }
void ThreadLoadEbook::Run() { //lf(_T("ThreadLoadEbook::Run(%s)"), fileName); Timer t(true); Doc doc = Doc::CreateFromFile(fileName); double loadingTimeMs = t.GetTimeInMs(); //lf(_T("Loaded %s in %.2f ms"), fileName, t.GetTimeInMs()); // don't load PalmDoc, etc. files as long as they're not correctly formatted if (doc.AsMobi() && Pdb_Mobipocket != doc.AsMobi()->GetDocType()) doc.Delete(); UiMsg *msg = new UiMsg(UiMsg::FinishedMobiLoading); msg->finishedMobiLoading.doc = new Doc(doc); msg->finishedMobiLoading.fileName = fileName; msg->finishedMobiLoading.win = win; fileName = NULL; uimsg::Post(msg); }