HRESULT CPdfFilter::GetNextChunkValue(CChunkValue& chunkValue) { AutoFreeW str; switch (m_state) { case STATE_PDF_START: m_state = STATE_PDF_AUTHOR; chunkValue.SetTextValue(PKEY_PerceivedType, L"document"); return S_OK; case STATE_PDF_AUTHOR: m_state = STATE_PDF_TITLE; str.Set(m_pdfEngine->GetProperty(DocumentProperty::Author)); if (!str::IsEmpty(str.Get())) { chunkValue.SetTextValue(PKEY_Author, str); return S_OK; } // fall through case STATE_PDF_TITLE: m_state = STATE_PDF_DATE; str.Set(m_pdfEngine->GetProperty(DocumentProperty::Title)); if (!str) str.Set(m_pdfEngine->GetProperty(DocumentProperty::Subject)); if (!str::IsEmpty(str.Get())) { chunkValue.SetTextValue(PKEY_Title, str); return S_OK; } // fall through case STATE_PDF_DATE: m_state = STATE_PDF_CONTENT; str.Set(m_pdfEngine->GetProperty(DocumentProperty::ModificationDate)); if (!str) str.Set(m_pdfEngine->GetProperty(DocumentProperty::CreationDate)); if (!str::IsEmpty(str.Get())) { SYSTEMTIME systime; FILETIME filetime; if (PdfDateParse(str, &systime) && SystemTimeToFileTime(&systime, &filetime)) { chunkValue.SetFileTimeValue(PKEY_ItemDate, filetime); return S_OK; } } // fall through case STATE_PDF_CONTENT: while (++m_iPageNo <= m_pdfEngine->PageCount()) { str.Set(m_pdfEngine->ExtractPageText(m_iPageNo, L"\r\n")); if (str::IsEmpty(str.Get())) continue; chunkValue.SetTextValue(PKEY_Search_Contents, str, CHUNK_TEXT); return S_OK; } m_state = STATE_PDF_END; // fall through case STATE_PDF_END: default: return FILTER_E_END_OF_CHUNKS; } }
HRESULT CEpubFilter::GetNextChunkValue(CChunkValue& chunkValue) { AutoFreeW str; switch (m_state) { case STATE_EPUB_START: m_state = STATE_EPUB_AUTHOR; chunkValue.SetTextValue(PKEY_PerceivedType, L"document"); return S_OK; case STATE_EPUB_AUTHOR: m_state = STATE_EPUB_TITLE; str.Set(m_epubDoc->GetProperty(DocumentProperty::Author)); if (!str::IsEmpty(str.Get())) { chunkValue.SetTextValue(PKEY_Author, str); return S_OK; } // fall through case STATE_EPUB_TITLE: m_state = STATE_EPUB_DATE; str.Set(m_epubDoc->GetProperty(DocumentProperty::Title)); if (!str) str.Set(m_epubDoc->GetProperty(DocumentProperty::Subject)); if (!str::IsEmpty(str.Get())) { chunkValue.SetTextValue(PKEY_Title, str); return S_OK; } // fall through case STATE_EPUB_DATE: m_state = STATE_EPUB_CONTENT; str.Set(m_epubDoc->GetProperty(DocumentProperty::ModificationDate)); if (!str) str.Set(m_epubDoc->GetProperty(DocumentProperty::CreationDate)); if (!str::IsEmpty(str.Get())) { SYSTEMTIME systime; if (IsoDateParse(str, &systime)) { FILETIME filetime; SystemTimeToFileTime(&systime, &filetime); chunkValue.SetFileTimeValue(PKEY_ItemDate, filetime); return S_OK; } } // fall through case STATE_EPUB_CONTENT: m_state = STATE_EPUB_END; str.Set(ExtractHtmlText(m_epubDoc)); if (!str::IsEmpty(str.Get())) { chunkValue.SetTextValue(PKEY_Search_Contents, str, CHUNK_TEXT); return S_OK; } // fall through case STATE_EPUB_END: default: return FILTER_E_END_OF_CHUNKS; } }
void CopySelectionToClipboard(WindowInfo* win) { if (!win->currentTab || !win->currentTab->selectionOnPage) return; CrashIf(win->currentTab->selectionOnPage->size() == 0 && win->mouseAction != MouseAction::SelectingText); if (win->currentTab->selectionOnPage->size() == 0) return; CrashIf(!win->AsFixed()); if (!win->AsFixed()) return; if (!OpenClipboard(nullptr)) return; EmptyClipboard(); DisplayModel* dm = win->AsFixed(); #ifndef DISABLE_DOCUMENT_RESTRICTIONS if (!dm->GetEngine()->AllowsCopyingText()) win->ShowNotification(_TR("Copying text was denied (copying as image only)")); else #endif if (!dm->GetEngine()->IsImageCollection()) { AutoFreeW selText; bool isTextSelection = dm->textSelection->result.len > 0; if (isTextSelection) { selText.Set(dm->textSelection->ExtractText(L"\r\n")); } else { WStrVec selections; for (SelectionOnPage& sel : *win->currentTab->selectionOnPage) { WCHAR* text = dm->GetTextInRegion(sel.pageNo, sel.rect); if (text) selections.Push(text); } selText.Set(selections.Join()); } // don't copy empty text if (!str::IsEmpty(selText.Get())) CopyTextToClipboard(selText, true); if (isTextSelection) { // don't also copy the first line of a text selection as an image CloseClipboard(); return; } } /* also copy a screenshot of the current selection to the clipboard */ SelectionOnPage* selOnPage = &win->currentTab->selectionOnPage->at(0); RenderedBitmap* bmp = dm->GetEngine()->RenderBitmap(selOnPage->pageNo, dm->GetZoomReal(), dm->GetRotation(), &selOnPage->rect, RenderTarget::Export); if (bmp) CopyImageToClipboard(bmp->GetBitmap(), true); delete bmp; CloseClipboard(); }