Ejemplo n.º 1
0
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];
  }
}
Ejemplo n.º 2
0
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;
}