Home | History | Annotate | Download | only in src
      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:
     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 
     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 
     31 void FreeUnsupportInfo(FX_LPVOID pData)
     32 {
     33 	CFSDK_UnsupportInfo_Adapter * pAdapter = (CFSDK_UnsupportInfo_Adapter *)pData;
     34 	delete pAdapter;
     35 }
     36 
     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 
     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 
     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 
    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 
    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 
    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