virtual const unsigned char *GetDataForUrl(const WCHAR *url, size_t *len) { ScopedCritSec scope(&docAccess); ScopedMem<WCHAR> plainUrl(url::GetFullPath(url)); ScopedMem<char> urlUtf8(str::conv::ToUtf8(plainUrl)); data.Append(doc->GetData(urlUtf8, len)); return data.Last(); }
virtual void Visit(const WCHAR *name, const WCHAR *url, int level) { if (!url || IsExternalUrl(url)) return; ScopedMem<WCHAR> plainUrl(str::ToPlainUrl(url)); if (added.FindI(plainUrl) != -1) return; ScopedMem<char> urlUtf8(str::conv::ToUtf8(plainUrl)); size_t pageHtmlLen; ScopedMem<unsigned char> pageHtml(doc->GetData(urlUtf8, &pageHtmlLen)); if (!pageHtml) return; html.AppendFmt("<pagebreak page_path=\"%s\" page_marker />", urlUtf8); html.AppendAndFree(doc->ToUtf8(pageHtml, ExtractHttpCharset((const char *)pageHtml.Get(), pageHtmlLen))); added.Append(plainUrl.StealData()); }
ImageData *GetImageData(const char *id, const char *pagePath) { ScopedMem<char> url(NormalizeURL(id, pagePath)); str::UrlDecodeInPlace(url); for (size_t i = 0; i < images.Count(); i++) { if (str::Eq(images.At(i).id, url)) return &images.At(i).base; } ImageData2 data = { 0 }; data.base.data = (char *)doc->GetData(url, &data.base.len); if (!data.base.data) return NULL; data.id = url.StealData(); images.Append(data); return &images.Last().base; }
// Load and cache data for a given url inside CHM file. bool ChmEngineImpl::GetDataForUrl(const WCHAR *url, char **data, size_t *len) { ScopedMem<WCHAR> plainUrl(str::ToPlainUrl(url)); ChmCacheEntry *e = FindDataForUrl(plainUrl); if (!e) { e = new ChmCacheEntry(plainUrl); ScopedMem<char> urlUtf8(str::conv::ToUtf8(plainUrl)); e->data = (char *)doc->GetData(urlUtf8, &e->size); if (!e->data) { delete e; return false; } urlDataCache.Append(e); } *data = e->data; *len = e->size; return true; }