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