| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
| 6 | |
| 7 #include "public/fpdf_ext.h" | |
| 8 | |
| 9 #include "core/include/fpdfapi/cpdf_array.h" | |
| 10 #include "core/include/fpdfapi/cpdf_document.h" | |
| 11 #include "core/include/fxcrt/fx_xml.h" | |
| 12 #include "fpdfsdk/include/fsdk_define.h" | |
| 13 | |
| 14 #ifdef PDF_ENABLE_XFA | |
| 15 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" | |
| 16 #endif // PDF_ENABLE_XFA | |
| 17 | |
| 18 #define FPDFSDK_UNSUPPORT_CALL 100 | |
| 19 | |
| 20 class CFSDK_UnsupportInfo_Adapter { | |
| 21 public: | |
| 22 CFSDK_UnsupportInfo_Adapter(UNSUPPORT_INFO* unsp_info) { | |
| 23 m_unsp_info = unsp_info; | |
| 24 } | |
| 25 void ReportError(int nErrorType); | |
| 26 | |
| 27 private: | |
| 28 UNSUPPORT_INFO* m_unsp_info; | |
| 29 }; | |
| 30 | |
| 31 void CFSDK_UnsupportInfo_Adapter::ReportError(int nErrorType) { | |
| 32 if (m_unsp_info && m_unsp_info->FSDK_UnSupport_Handler) { | |
| 33 m_unsp_info->FSDK_UnSupport_Handler(m_unsp_info, nErrorType); | |
| 34 } | |
| 35 } | |
| 36 | |
| 37 void FreeUnsupportInfo(void* pData) { | |
| 38 CFSDK_UnsupportInfo_Adapter* pAdapter = (CFSDK_UnsupportInfo_Adapter*)pData; | |
| 39 delete pAdapter; | |
| 40 } | |
| 41 | |
| 42 FX_BOOL FPDF_UnSupportError(int nError) { | |
| 43 CFSDK_UnsupportInfo_Adapter* pAdapter = | |
| 44 (CFSDK_UnsupportInfo_Adapter*)CPDF_ModuleMgr::Get()->GetPrivateData( | |
| 45 (void*)FPDFSDK_UNSUPPORT_CALL); | |
| 46 | |
| 47 if (!pAdapter) | |
| 48 return FALSE; | |
| 49 pAdapter->ReportError(nError); | |
| 50 return TRUE; | |
| 51 } | |
| 52 | |
| 53 DLLEXPORT FPDF_BOOL STDCALL | |
| 54 FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO* unsp_info) { | |
| 55 if (!unsp_info || unsp_info->version != 1) | |
| 56 return FALSE; | |
| 57 CFSDK_UnsupportInfo_Adapter* pAdapter = | |
| 58 new CFSDK_UnsupportInfo_Adapter(unsp_info); | |
| 59 | |
| 60 CPDF_ModuleMgr::Get()->SetPrivateData((void*)FPDFSDK_UNSUPPORT_CALL, pAdapter, | |
| 61 &FreeUnsupportInfo); | |
| 62 | |
| 63 return TRUE; | |
| 64 } | |
| 65 | |
| 66 void CheckUnSupportAnnot(CPDF_Document* pDoc, const CPDF_Annot* pPDFAnnot) { | |
| 67 CFX_ByteString cbSubType = pPDFAnnot->GetSubType(); | |
| 68 if (cbSubType.Compare("3D") == 0) { | |
| 69 FPDF_UnSupportError(FPDF_UNSP_ANNOT_3DANNOT); | |
| 70 } else if (cbSubType.Compare("Screen") == 0) { | |
| 71 const CPDF_Dictionary* pAnnotDict = pPDFAnnot->GetAnnotDict(); | |
| 72 CFX_ByteString cbString; | |
| 73 if (pAnnotDict->KeyExist("IT")) | |
| 74 cbString = pAnnotDict->GetStringBy("IT"); | |
| 75 if (cbString.Compare("Img") != 0) | |
| 76 FPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_MEDIA); | |
| 77 } else if (cbSubType.Compare("Movie") == 0) { | |
| 78 FPDF_UnSupportError(FPDF_UNSP_ANNOT_MOVIE); | |
| 79 } else if (cbSubType.Compare("Sound") == 0) { | |
| 80 FPDF_UnSupportError(FPDF_UNSP_ANNOT_SOUND); | |
| 81 } else if (cbSubType.Compare("RichMedia") == 0) { | |
| 82 FPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA); | |
| 83 } else if (cbSubType.Compare("FileAttachment") == 0) { | |
| 84 FPDF_UnSupportError(FPDF_UNSP_ANNOT_ATTACHMENT); | |
| 85 } else if (cbSubType.Compare("Widget") == 0) { | |
| 86 const CPDF_Dictionary* pAnnotDict = pPDFAnnot->GetAnnotDict(); | |
| 87 CFX_ByteString cbString; | |
| 88 if (pAnnotDict->KeyExist("FT")) { | |
| 89 cbString = pAnnotDict->GetStringBy("FT"); | |
| 90 } | |
| 91 if (cbString.Compare("Sig") == 0) { | |
| 92 FPDF_UnSupportError(FPDF_UNSP_ANNOT_SIG); | |
| 93 } | |
| 94 } | |
| 95 } | |
| 96 | |
| 97 FX_BOOL CheckSharedForm(const CXML_Element* pElement, CFX_ByteString cbName) { | |
| 98 int count = pElement->CountAttrs(); | |
| 99 int i = 0; | |
| 100 for (i = 0; i < count; i++) { | |
| 101 CFX_ByteString space, name; | |
| 102 CFX_WideString value; | |
| 103 pElement->GetAttrByIndex(i, space, name, value); | |
| 104 if (space == "xmlns" && name == "adhocwf" && | |
| 105 value == L"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/") { | |
| 106 CXML_Element* pVersion = pElement->GetElement("adhocwf", cbName); | |
| 107 if (!pVersion) | |
| 108 continue; | |
| 109 CFX_WideString wsContent = pVersion->GetContent(0); // == 1.1 | |
| 110 int nType = wsContent.GetInteger(); | |
| 111 switch (nType) { | |
| 112 case 1: | |
| 113 FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_ACROBAT); | |
| 114 break; | |
| 115 case 2: | |
| 116 FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM); | |
| 117 break; | |
| 118 case 0: | |
| 119 FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_EMAIL); | |
| 120 break; | |
| 121 } | |
| 122 } | |
| 123 } | |
| 124 | |
| 125 FX_DWORD nCount = pElement->CountChildren(); | |
| 126 for (i = 0; i < (int)nCount; i++) { | |
| 127 CXML_Element::ChildType childType = pElement->GetChildType(i); | |
| 128 if (childType == CXML_Element::Element) { | |
| 129 CXML_Element* pChild = pElement->GetElement(i); | |
| 130 if (CheckSharedForm(pChild, cbName)) | |
| 131 return TRUE; | |
| 132 } | |
| 133 } | |
| 134 return FALSE; | |
| 135 } | |
| 136 | |
| 137 void CheckUnSupportError(CPDF_Document* pDoc, FX_DWORD err_code) { | |
| 138 // Security | |
| 139 if (err_code == FPDF_ERR_SECURITY) { | |
| 140 FPDF_UnSupportError(FPDF_UNSP_DOC_SECURITY); | |
| 141 return; | |
| 142 } | |
| 143 if (!pDoc) | |
| 144 return; | |
| 145 | |
| 146 // Portfolios and Packages | |
| 147 CPDF_Dictionary* pRootDict = pDoc->GetRoot(); | |
| 148 if (pRootDict) { | |
| 149 CFX_ByteString cbString; | |
| 150 if (pRootDict->KeyExist("Collection")) { | |
| 151 FPDF_UnSupportError(FPDF_UNSP_DOC_PORTABLECOLLECTION); | |
| 152 return; | |
| 153 } | |
| 154 if (pRootDict->KeyExist("Names")) { | |
| 155 CPDF_Dictionary* pNameDict = pRootDict->GetDictBy("Names"); | |
| 156 if (pNameDict && pNameDict->KeyExist("EmbeddedFiles")) { | |
| 157 FPDF_UnSupportError(FPDF_UNSP_DOC_ATTACHMENT); | |
| 158 return; | |
| 159 } | |
| 160 if (pNameDict && pNameDict->KeyExist("JavaScript")) { | |
| 161 CPDF_Dictionary* pJSDict = pNameDict->GetDictBy("JavaScript"); | |
| 162 CPDF_Array* pArray = pJSDict ? pJSDict->GetArrayBy("Names") : NULL; | |
| 163 if (pArray) { | |
| 164 int nCount = pArray->GetCount(); | |
| 165 for (int i = 0; i < nCount; i++) { | |
| 166 CFX_ByteString cbStr = pArray->GetStringAt(i); | |
| 167 if (cbStr.Compare("com.adobe.acrobat.SharedReview.Register") == 0) { | |
| 168 FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDREVIEW); | |
| 169 return; | |
| 170 } | |
| 171 } | |
| 172 } | |
| 173 } | |
| 174 } | |
| 175 } | |
| 176 | |
| 177 // SharedForm | |
| 178 CPDF_Metadata metaData(pDoc); | |
| 179 const CXML_Element* pElement = metaData.GetRoot(); | |
| 180 if (pElement) | |
| 181 CheckSharedForm(pElement, "workflowType"); | |
| 182 | |
| 183 #ifndef PDF_ENABLE_XFA | |
| 184 // XFA Forms | |
| 185 CPDF_InterForm* pInterForm = new CPDF_InterForm(pDoc, FALSE); | |
| 186 if (pInterForm->HasXFAForm()) { | |
| 187 FPDF_UnSupportError(FPDF_UNSP_DOC_XFAFORM); | |
| 188 } | |
| 189 delete pInterForm; | |
| 190 #endif // PDF_ENABLE_XFA | |
| 191 } | |
| 192 | |
| 193 DLLEXPORT int FPDFDoc_GetPageMode(FPDF_DOCUMENT document) { | |
| 194 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | |
| 195 if (!pDoc) | |
| 196 return PAGEMODE_UNKNOWN; | |
| 197 | |
| 198 CPDF_Dictionary* pRoot = pDoc->GetRoot(); | |
| 199 if (!pRoot) | |
| 200 return PAGEMODE_UNKNOWN; | |
| 201 | |
| 202 CPDF_Object* pName = pRoot->GetElement("PageMode"); | |
| 203 if (!pName) | |
| 204 return PAGEMODE_USENONE; | |
| 205 | |
| 206 CFX_ByteString strPageMode = pName->GetString(); | |
| 207 if (strPageMode.IsEmpty() || strPageMode.EqualNoCase("UseNone")) | |
| 208 return PAGEMODE_USENONE; | |
| 209 if (strPageMode.EqualNoCase("UseOutlines")) | |
| 210 return PAGEMODE_USEOUTLINES; | |
| 211 if (strPageMode.EqualNoCase("UseThumbs")) | |
| 212 return PAGEMODE_USETHUMBS; | |
| 213 if (strPageMode.EqualNoCase("FullScreen")) | |
| 214 return PAGEMODE_FULLSCREEN; | |
| 215 if (strPageMode.EqualNoCase("UseOC")) | |
| 216 return PAGEMODE_USEOC; | |
| 217 if (strPageMode.EqualNoCase("UseAttachments")) | |
| 218 return PAGEMODE_USEATTACHMENTS; | |
| 219 | |
| 220 return PAGEMODE_UNKNOWN; | |
| 221 } | |
| OLD | NEW |