static void display_djvm_dirm(ByteStream & out_str, IFFByteStream & iff, GUTF8String head, size_t, DjVmInfo& djvminfo, int) { GP<DjVmDir> dir = DjVmDir::create(); dir->decode(iff.get_bytestream()); GPList<DjVmDir::File> list = dir->get_files_list(); if (dir->is_indirect()) { out_str.format( "Document directory (indirect, %d files %d pages)", dir->get_files_num(), dir->get_pages_num()); for (GPosition p=list; p; ++p) out_str.format( "\n%s%s -> %s", (const char*)head, (const char*)list[p]->get_load_name(), (const char*)list[p]->get_save_name() ); } else { out_str.format( "Document directory (bundled, %d files %d pages)", dir->get_files_num(), dir->get_pages_num()); djvminfo.dir = dir; djvminfo.map.empty(); for (GPosition p=list; p; ++p) djvminfo.map[list[p]->offset] = list[p]; } }
DjVuSource* DjVuSource::FromFile(const CString& strFileName) { TCHAR pszName[MAX_PATH] = { 0 }; LPTSTR pszFileName; GetFullPathName(strFileName, MAX_PATH, pszName, &pszFileName); openDocumentsLock.Lock(); map<CString, DjVuSource*>::iterator itSource = openDocuments.find(pszName); if (itSource != openDocuments.end()) { DjVuSource* pSource = (*itSource).second; pSource->AddRef(); openDocumentsLock.Unlock(); return pSource; } CFile file; if (!file.Open(pszName, CFile::modeRead | CFile::shareDenyWrite)) return NULL; int nLength = static_cast<int>(min(file.GetLength(), 0x40000)); LPBYTE pBuf = new BYTE[nLength]; file.Read(pBuf, nLength); file.Close(); MD5 digest(pBuf, nLength); delete[] pBuf; GP<DjVuDocument> pDoc = NULL; try { GURL url = GURL::Filename::UTF8(MakeUTF8String(CString(pszName))); pDoc = DjVuDocument::create(url); pDoc->wait_get_pages_num(); } catch (GException&) { return NULL; } if (pDoc->get_pages_num() == 0) { return NULL; } map<MD5, DocSettings>::iterator it = settings.find(digest); bool bExisting = (it != settings.end()); DocSettings* pSettings = &settings[digest]; pSettings->strLastKnownLocation = pszName; if (!bExisting && pApplication != NULL) { pApplication->LoadDocSettings(digest.ToString(), pSettings); // Remove annotations for non-existing pages. map<int, PageSettings>::iterator it; for (it = pSettings->pageSettings.begin(); it != pSettings->pageSettings.end();) { int nPage = it->first; if (nPage < 0 || nPage >= pDoc->get_pages_num()) pSettings->pageSettings.erase(it++); else ++it; } } DjVuSource* pSource = new DjVuSource(pszName, pDoc, pSettings); openDocuments.insert(make_pair(CString(pszName), pSource)); openDocumentsLock.Unlock(); return pSource; }