summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/include/fpdfdoc/fpdf_doc.h19
-rw-r--r--core/src/fpdfdoc/doc_metadata.cpp139
2 files changed, 21 insertions, 137 deletions
diff --git a/core/include/fpdfdoc/fpdf_doc.h b/core/include/fpdfdoc/fpdf_doc.h
index 22fdf546da..071386e2e3 100644
--- a/core/include/fpdfdoc/fpdf_doc.h
+++ b/core/include/fpdfdoc/fpdf_doc.h
@@ -9,6 +9,7 @@
#include <map>
+#include "../../../third_party/base/nonstd_unique_ptr.h"
#include "../fpdfapi/fpdf_parser.h"
#include "../fpdfapi/fpdf_render.h"
@@ -1157,23 +1158,19 @@ class CPDF_PageLabel {
protected:
CPDF_Document* m_pDocument;
};
+
class CPDF_Metadata {
public:
- CPDF_Metadata();
-
+ explicit CPDF_Metadata(CPDF_Document* pDoc);
~CPDF_Metadata();
- void LoadDoc(CPDF_Document* pDoc);
-
- int32_t GetString(const CFX_ByteStringC& bsItem, CFX_WideString& wsStr);
-
- CXML_Element* GetRoot() const;
+ const CXML_Element* GetRoot() const;
- CXML_Element* GetRDF() const;
-
- protected:
- void* m_pData;
+ private:
+ CPDF_Document* const m_pDoc; // Not owned.
+ nonstd::unique_ptr<CXML_Element> m_pXmlElement;
};
+
class CPDF_ViewerPreferences {
public:
CPDF_ViewerPreferences(CPDF_Document* pDoc);
diff --git a/core/src/fpdfdoc/doc_metadata.cpp b/core/src/fpdfdoc/doc_metadata.cpp
index e350ea6f41..c779f68354 100644
--- a/core/src/fpdfdoc/doc_metadata.cpp
+++ b/core/src/fpdfdoc/doc_metadata.cpp
@@ -6,136 +6,23 @@
#include "../../include/fpdfdoc/fpdf_doc.h"
#include "../../include/fxcrt/fx_xml.h"
-typedef struct _PDFDOC_METADATA {
- CPDF_Document* m_pDoc;
- CXML_Element* m_pXmlElmnt;
- CXML_Element* m_pElmntRdf;
- CFX_CMapByteStringToPtr* m_pStringMap;
-} PDFDOC_METADATA, *PDFDOC_LPMETADATA;
-typedef PDFDOC_METADATA const* PDFDOC_LPCMETADATA;
-const FX_CHAR* const gs_FPDFDOC_Metadata_Titles[] = {
- "Title", "title", "Subject", "description", "Author",
- "creator", "Keywords", "Keywords", "Producer", "Producer",
- "Creator", "CreatorTool", "CreationDate", "CreateDate", "ModDate",
- "ModifyDate", "MetadataDate", "MetadataDate"};
-CPDF_Metadata::CPDF_Metadata() {
- m_pData = FX_Alloc(PDFDOC_METADATA, 1);
- CFX_CMapByteStringToPtr*& pStringMap =
- ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;
- pStringMap = new CFX_CMapByteStringToPtr;
- if (pStringMap != NULL) {
- CFX_ByteString bstr;
- for (int i = 0; i < 18; i += 2) {
- bstr = gs_FPDFDOC_Metadata_Titles[i];
- pStringMap->AddValue(bstr, (void*)gs_FPDFDOC_Metadata_Titles[i + 1]);
- }
- }
-}
-CPDF_Metadata::~CPDF_Metadata() {
- FXSYS_assert(m_pData != NULL);
- CXML_Element*& p = ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;
- delete p;
- CFX_CMapByteStringToPtr* pStringMap =
- ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;
- if (pStringMap) {
- pStringMap->RemoveAll();
- delete pStringMap;
- }
- FX_Free(m_pData);
-}
-void CPDF_Metadata::LoadDoc(CPDF_Document* pDoc) {
- FXSYS_assert(pDoc != NULL);
- ((PDFDOC_LPMETADATA)m_pData)->m_pDoc = pDoc;
+
+CPDF_Metadata::CPDF_Metadata(CPDF_Document* pDoc) : m_pDoc(pDoc) {
CPDF_Dictionary* pRoot = pDoc->GetRoot();
+ if (!pRoot)
+ return;
+
CPDF_Stream* pStream = pRoot->GetStream(FX_BSTRC("Metadata"));
- if (!pStream) {
+ if (!pStream)
return;
- }
+
CPDF_StreamAcc acc;
acc.LoadAllData(pStream, FALSE);
- int size = acc.GetSize();
- const uint8_t* pBuf = acc.GetData();
- CXML_Element*& pXmlElmnt = ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;
- pXmlElmnt = CXML_Element::Parse(pBuf, size);
- if (!pXmlElmnt) {
- return;
- }
- CXML_Element*& pElmntRdf = ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;
- if (pXmlElmnt->GetTagName() == FX_BSTRC("RDF")) {
- pElmntRdf = pXmlElmnt;
- } else {
- pElmntRdf = pXmlElmnt->GetElement(NULL, FX_BSTRC("RDF"));
- }
-}
-int32_t CPDF_Metadata::GetString(const CFX_ByteStringC& bsItem,
- CFX_WideString& wsStr) {
- if (!((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt) {
- return -1;
- }
- if (!((PDFDOC_LPMETADATA)m_pData)->m_pStringMap) {
- return -1;
- }
- void* szTag;
- if (!((PDFDOC_LPMETADATA)m_pData)->m_pStringMap->Lookup(bsItem, szTag)) {
- return -1;
- }
- CFX_ByteString bsTag = (const FX_CHAR*)szTag;
- wsStr = L"";
- CXML_Element* pElmntRdf = ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;
- if (!pElmntRdf) {
- return -1;
- }
- int nChild = pElmntRdf->CountChildren();
- for (int i = 0; i < nChild; i++) {
- CXML_Element* pTag =
- pElmntRdf->GetElement(NULL, FX_BSTRC("Description"), i);
- if (!pTag) {
- continue;
- }
- if (bsItem == FX_BSTRC("Title") || bsItem == FX_BSTRC("Subject")) {
- CXML_Element* pElmnt = pTag->GetElement(NULL, bsTag);
- if (!pElmnt) {
- continue;
- }
- pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("Alt"));
- if (!pElmnt) {
- continue;
- }
- pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("li"));
- if (!pElmnt) {
- continue;
- }
- wsStr = pElmnt->GetContent(0);
- return wsStr.GetLength();
- }
- if (bsItem == FX_BSTRC("Author")) {
- CXML_Element* pElmnt = pTag->GetElement(NULL, bsTag);
- if (!pElmnt) {
- continue;
- }
- pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("Seq"));
- if (!pElmnt) {
- continue;
- }
- pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("li"));
- if (!pElmnt) {
- continue;
- }
- wsStr = pElmnt->GetContent(0);
- return wsStr.GetLength();
- }
- CXML_Element* pElmnt = pTag->GetElement(NULL, bsTag);
- if (!pElmnt) {
- continue;
- }
- wsStr = pElmnt->GetContent(0);
- return wsStr.GetLength();
- }
- return -1;
-}
-CXML_Element* CPDF_Metadata::GetRoot() const {
- return ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;
+ m_pXmlElement.reset(CXML_Element::Parse(acc.GetData(), acc.GetSize()));
}
-CXML_Element* CPDF_Metadata::GetRDF() const {
- return ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;
+
+CPDF_Metadata::~CPDF_Metadata() {}
+
+const CXML_Element* CPDF_Metadata::GetRoot() const {
+ return m_pXmlElement.get();
}