OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../include/fpdfdoc/fpdf_doc.h" | 7 #include "../../include/fpdfdoc/fpdf_doc.h" |
8 CPDF_Dest CPDF_Action::GetDest(CPDF_Document* pDoc) const | 8 CPDF_Dest CPDF_Action::GetDest(CPDF_Document* pDoc) const { |
9 { | 9 if (!m_pDict) { |
10 if (!m_pDict) { | |
11 return CPDF_Dest(); | |
12 } | |
13 CFX_ByteString type = m_pDict->GetString("S"); | |
14 if (type != "GoTo" && type != "GoToR") { | |
15 return CPDF_Dest(); | |
16 } | |
17 CPDF_Object* pDest = m_pDict->GetElementValue("D"); | |
18 if (!pDest) { | |
19 return CPDF_Dest(); | |
20 } | |
21 if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) { | |
22 CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests")); | |
23 CFX_ByteStringC name = pDest->GetString(); | |
24 return CPDF_Dest(name_tree.LookupNamedDest(pDoc, name)); | |
25 } | |
26 if (pDest->GetType() == PDFOBJ_ARRAY) { | |
27 return CPDF_Dest((CPDF_Array*)pDest); | |
28 } | |
29 return CPDF_Dest(); | 10 return CPDF_Dest(); |
30 } | 11 } |
31 const FX_CHAR* g_sATypes[] = {"Unknown", "GoTo", "GoToR", "GoToE", "Launch", "Th
read", "URI", "Sound", "Movie", | 12 CFX_ByteString type = m_pDict->GetString("S"); |
32 "Hide",» "Named", "SubmitForm", "ResetForm", "Imp
ortData", "JavaScript", "SetOCGState", | 13 if (type != "GoTo" && type != "GoToR") { |
33 "Rendition", "Trans", "GoTo3DView", "" | 14 return CPDF_Dest(); |
34 }; | 15 } |
35 CPDF_Action::ActionType CPDF_Action::GetType() const | 16 CPDF_Object* pDest = m_pDict->GetElementValue("D"); |
36 { | 17 if (!pDest) { |
37 ActionType eType = Unknown; | 18 return CPDF_Dest(); |
38 if (m_pDict != NULL) { | 19 } |
39 CFX_ByteString csType = m_pDict->GetString("S"); | 20 if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) { |
40 if (!csType.IsEmpty()) { | 21 CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests")); |
41 int i = 0; | 22 CFX_ByteStringC name = pDest->GetString(); |
42 while (g_sATypes[i][0] != '\0') { | 23 return CPDF_Dest(name_tree.LookupNamedDest(pDoc, name)); |
43 if (csType == g_sATypes[i]) { | 24 } |
44 return (ActionType)i; | 25 if (pDest->GetType() == PDFOBJ_ARRAY) { |
45 } | 26 return CPDF_Dest((CPDF_Array*)pDest); |
46 i ++; | 27 } |
47 } | 28 return CPDF_Dest(); |
48 } | 29 } |
49 } | 30 const FX_CHAR* g_sATypes[] = { |
50 return eType; | 31 "Unknown", "GoTo", "GoToR", "GoToE", "Launch", |
51 } | 32 "Thread", "URI", "Sound", "Movie", "Hide", |
52 CFX_WideString CPDF_Action::GetFilePath() const | 33 "Named", "SubmitForm", "ResetForm", "ImportData", "JavaScript", |
53 { | 34 "SetOCGState", "Rendition", "Trans", "GoTo3DView", ""}; |
54 CFX_ByteString type = m_pDict->GetString("S"); | 35 CPDF_Action::ActionType CPDF_Action::GetType() const { |
55 if (type != "GoToR" && type != "Launch" && | 36 ActionType eType = Unknown; |
56 type != "SubmitForm" && type != "ImportData") { | 37 if (m_pDict != NULL) { |
57 return CFX_WideString(); | |
58 } | |
59 CPDF_Object* pFile = m_pDict->GetElementValue("F"); | |
60 CFX_WideString path; | |
61 if (pFile == NULL) { | |
62 if (type == "Launch") { | |
63 CPDF_Dictionary* pWinDict = m_pDict->GetDict(FX_BSTRC("Win")); | |
64 if (pWinDict) { | |
65 return CFX_WideString::FromLocal(pWinDict->GetString(FX_BSTRC("F
"))); | |
66 } | |
67 } | |
68 return path; | |
69 } | |
70 CPDF_FileSpec filespec(pFile); | |
71 filespec.GetFileName(path); | |
72 return path; | |
73 } | |
74 CFX_ByteString CPDF_Action::GetURI(CPDF_Document* pDoc) const | |
75 { | |
76 CFX_ByteString csURI; | |
77 if (m_pDict == NULL) { | |
78 return csURI; | |
79 } | |
80 if (m_pDict->GetString("S") != "URI") { | |
81 return csURI; | |
82 } | |
83 csURI = m_pDict->GetString("URI"); | |
84 CPDF_Dictionary* pRoot = pDoc->GetRoot(); | |
85 CPDF_Dictionary* pURI = pRoot->GetDict("URI"); | |
86 if (pURI != NULL) { | |
87 if (csURI.Find(FX_BSTRC(":"), 0) < 1) { | |
88 csURI = pURI->GetString("Base") + csURI; | |
89 } | |
90 } | |
91 return csURI; | |
92 } | |
93 FX_DWORD CPDF_ActionFields::GetFieldsCount() const | |
94 { | |
95 if (m_pAction == NULL) { | |
96 return 0; | |
97 } | |
98 CPDF_Dictionary* pDict = m_pAction->GetDict(); | |
99 if (pDict == NULL) { | |
100 return 0; | |
101 } | |
102 CFX_ByteString csType = pDict->GetString("S"); | |
103 CPDF_Object* pFields = NULL; | |
104 if (csType == "Hide") { | |
105 pFields = pDict->GetElementValue("T"); | |
106 } else { | |
107 pFields = pDict->GetArray("Fields"); | |
108 } | |
109 if (pFields == NULL) { | |
110 return 0; | |
111 } | |
112 int iType = pFields->GetType(); | |
113 if (iType == PDFOBJ_DICTIONARY) { | |
114 return 1; | |
115 } | |
116 if (iType == PDFOBJ_STRING) { | |
117 return 1; | |
118 } | |
119 if (iType == PDFOBJ_ARRAY) { | |
120 return ((CPDF_Array*)pFields)->GetCount(); | |
121 } | |
122 return 0; | |
123 } | |
124 void CPDF_ActionFields::GetAllFields(CFX_PtrArray& fieldObjects) const | |
125 { | |
126 fieldObjects.RemoveAll(); | |
127 if (m_pAction == NULL) { | |
128 return; | |
129 } | |
130 CPDF_Dictionary* pDict = m_pAction->GetDict(); | |
131 if (pDict == NULL) { | |
132 return; | |
133 } | |
134 CFX_ByteString csType = pDict->GetString("S"); | |
135 CPDF_Object* pFields = NULL; | |
136 if (csType == "Hide") { | |
137 pFields = pDict->GetElementValue("T"); | |
138 } else { | |
139 pFields = pDict->GetArray("Fields"); | |
140 } | |
141 if (pFields == NULL) { | |
142 return; | |
143 } | |
144 int iType = pFields->GetType(); | |
145 if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) { | |
146 fieldObjects.Add(pFields); | |
147 } else if (iType == PDFOBJ_ARRAY) { | |
148 CPDF_Array* pArray = (CPDF_Array*)pFields; | |
149 FX_DWORD iCount = pArray->GetCount(); | |
150 for (FX_DWORD i = 0; i < iCount; i ++) { | |
151 CPDF_Object* pObj = pArray->GetElementValue(i); | |
152 if (pObj != NULL) { | |
153 fieldObjects.Add(pObj); | |
154 } | |
155 } | |
156 } | |
157 } | |
158 CPDF_Object* CPDF_ActionFields::GetField(FX_DWORD iIndex) const | |
159 { | |
160 if (m_pAction == NULL) { | |
161 return NULL; | |
162 } | |
163 CPDF_Dictionary* pDict = m_pAction->GetDict(); | |
164 if (pDict == NULL) { | |
165 return NULL; | |
166 } | |
167 CFX_ByteString csType = pDict->GetString("S"); | |
168 CPDF_Object* pFields = NULL; | |
169 if (csType == "Hide") { | |
170 pFields = pDict->GetElementValue("T"); | |
171 } else { | |
172 pFields = pDict->GetArray("Fields"); | |
173 } | |
174 if (pFields == NULL) { | |
175 return NULL; | |
176 } | |
177 CPDF_Object* pFindObj = NULL; | |
178 int iType = pFields->GetType(); | |
179 if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) { | |
180 if (iIndex == 0) { | |
181 pFindObj = pFields; | |
182 } | |
183 } else if (iType == PDFOBJ_ARRAY) { | |
184 pFindObj = ((CPDF_Array*)pFields)->GetElementValue(iIndex); | |
185 } | |
186 return pFindObj; | |
187 } | |
188 CPDF_LWinParam CPDF_Action::GetWinParam() const | |
189 { | |
190 if (m_pDict == NULL) { | |
191 return NULL; | |
192 } | |
193 if (m_pDict->GetString("S") != "Launch") { | |
194 return NULL; | |
195 } | |
196 return m_pDict->GetDict("Win"); | |
197 } | |
198 CFX_WideString CPDF_Action::GetJavaScript() const | |
199 { | |
200 CFX_WideString csJS; | |
201 if (m_pDict == NULL) { | |
202 return csJS; | |
203 } | |
204 CPDF_Object* pJS = m_pDict->GetElementValue("JS"); | |
205 if (pJS != NULL) { | |
206 return pJS->GetUnicodeText(); | |
207 } | |
208 return csJS; | |
209 } | |
210 CPDF_Dictionary* CPDF_Action::GetAnnot() const | |
211 { | |
212 if (!m_pDict) { | |
213 return nullptr; | |
214 } | |
215 CFX_ByteString csType = m_pDict->GetString("S"); | 38 CFX_ByteString csType = m_pDict->GetString("S"); |
216 if (csType == FX_BSTRC("Rendition")) { | 39 if (!csType.IsEmpty()) { |
217 return m_pDict->GetDict("AN"); | 40 int i = 0; |
218 } | 41 while (g_sATypes[i][0] != '\0') { |
219 if (csType == FX_BSTRC("Movie")) { | 42 if (csType == g_sATypes[i]) { |
220 return m_pDict->GetDict("Annotation"); | 43 return (ActionType)i; |
221 } | |
222 return nullptr; | |
223 } | |
224 int32_t CPDF_Action::GetOperationType() const | |
225 { | |
226 if (m_pDict == NULL) { | |
227 return 0; | |
228 } | |
229 CFX_ByteString csType = m_pDict->GetString("S"); | |
230 if (csType == FX_BSTRC("Rendition")) { | |
231 return m_pDict->GetInteger("OP"); | |
232 } | |
233 if (csType == FX_BSTRC("Movie")) { | |
234 CFX_ByteString csOP = m_pDict->GetString("Operation"); | |
235 if (csOP == FX_BSTRC("Play")) { | |
236 return 0; | |
237 } | |
238 if (csOP == FX_BSTRC("Stop")) { | |
239 return 1; | |
240 } | |
241 if (csOP == FX_BSTRC("Pause")) { | |
242 return 2; | |
243 } | |
244 if (csOP == FX_BSTRC("Resume")) { | |
245 return 3; | |
246 } | |
247 } | |
248 return 0; | |
249 } | |
250 FX_DWORD CPDF_Action::GetSubActionsCount() const | |
251 { | |
252 if (m_pDict == NULL || !m_pDict->KeyExist("Next")) { | |
253 return 0; | |
254 } | |
255 CPDF_Object* pNext = m_pDict->GetElementValue("Next"); | |
256 if (!pNext) { | |
257 return 0; | |
258 } | |
259 int iObjType = pNext->GetType(); | |
260 if (iObjType == PDFOBJ_DICTIONARY) { | |
261 return 1; | |
262 } | |
263 if (iObjType == PDFOBJ_ARRAY) { | |
264 return ((CPDF_Array*)pNext)->GetCount(); | |
265 } | |
266 return 0; | |
267 } | |
268 CPDF_Action CPDF_Action::GetSubAction(FX_DWORD iIndex) const | |
269 { | |
270 if (m_pDict == NULL || !m_pDict->KeyExist("Next")) { | |
271 return CPDF_Action(); | |
272 } | |
273 CPDF_Object* pNext = m_pDict->GetElementValue("Next"); | |
274 int iObjType = pNext->GetType(); | |
275 if (iObjType == PDFOBJ_DICTIONARY) { | |
276 CPDF_Dictionary *pDict = static_cast<CPDF_Dictionary*>(pNext); | |
277 if (iIndex == 0) { | |
278 return CPDF_Action(pDict); | |
279 } | |
280 } else if (iObjType == PDFOBJ_ARRAY) { | |
281 CPDF_Array* pArray = static_cast<CPDF_Array*>(pNext); | |
282 return CPDF_Action(pArray->GetDict(iIndex)); | |
283 } | |
284 return CPDF_Action(); | |
285 } | |
286 const FX_CHAR* g_sAATypes[] = {"E", "X", "D", "U", "Fo", "Bl", "PO", "PC", "PV",
"PI", | |
287 "O", "C", | |
288 "K", "F", "V", "C", | |
289 "WC", "WS", "DS", "WP", "DP", | |
290 "" | |
291 }; | |
292 FX_BOOL CPDF_AAction::ActionExist(AActionType eType) const | |
293 { | |
294 if (m_pDict == NULL) { | |
295 return FALSE; | |
296 } | |
297 return m_pDict->KeyExist(g_sAATypes[(int)eType]); | |
298 } | |
299 CPDF_Action CPDF_AAction::GetAction(AActionType eType) const | |
300 { | |
301 if (!m_pDict) { | |
302 return CPDF_Action(); | |
303 } | |
304 return CPDF_Action(m_pDict->GetDict(g_sAATypes[(int)eType])); | |
305 } | |
306 FX_POSITION CPDF_AAction::GetStartPos() const | |
307 { | |
308 if (m_pDict == NULL) { | |
309 return NULL; | |
310 } | |
311 return m_pDict->GetStartPos(); | |
312 } | |
313 CPDF_Action CPDF_AAction::GetNextAction(FX_POSITION& pos, AActionType& eType) co
nst | |
314 { | |
315 if (m_pDict == NULL) { | |
316 return CPDF_Action(); | |
317 } | |
318 CFX_ByteString csKey; | |
319 CPDF_Object* pObj = m_pDict->GetNextElement(pos, csKey); | |
320 if (!pObj) { | |
321 return CPDF_Action(); | |
322 } | |
323 CPDF_Object* pDirect = pObj->GetDirect(); | |
324 if (!pDirect || pDirect->GetType() != PDFOBJ_DICTIONARY) { | |
325 return CPDF_Action(); | |
326 } | |
327 int i = 0; | |
328 while (g_sAATypes[i][0] != '\0') { | |
329 if (csKey == g_sAATypes[i]) { | |
330 break; | |
331 } | 44 } |
332 i++; | 45 i++; |
333 } | 46 } |
334 eType = (AActionType)i; | 47 } |
335 return CPDF_Action(static_cast<CPDF_Dictionary*>(pDirect)); | 48 } |
336 } | 49 return eType; |
337 CPDF_DocJSActions::CPDF_DocJSActions(CPDF_Document* pDoc) | 50 } |
338 { | 51 CFX_WideString CPDF_Action::GetFilePath() const { |
339 m_pDocument = pDoc; | 52 CFX_ByteString type = m_pDict->GetString("S"); |
340 } | 53 if (type != "GoToR" && type != "Launch" && type != "SubmitForm" && |
341 int CPDF_DocJSActions::CountJSActions() const | 54 type != "ImportData") { |
342 { | 55 return CFX_WideString(); |
343 ASSERT(m_pDocument != NULL); | 56 } |
344 CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript")); | 57 CPDF_Object* pFile = m_pDict->GetElementValue("F"); |
345 return name_tree.GetCount(); | 58 CFX_WideString path; |
346 } | 59 if (pFile == NULL) { |
347 CPDF_Action CPDF_DocJSActions::GetJSAction(int index, CFX_ByteString& csName) co
nst | 60 if (type == "Launch") { |
348 { | 61 CPDF_Dictionary* pWinDict = m_pDict->GetDict(FX_BSTRC("Win")); |
349 ASSERT(m_pDocument != NULL); | 62 if (pWinDict) { |
350 CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript")); | 63 return CFX_WideString::FromLocal(pWinDict->GetString(FX_BSTRC("F"))); |
351 CPDF_Object *pAction = name_tree.LookupValue(index, csName); | 64 } |
352 if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) { | 65 } |
353 return CPDF_Action(); | 66 return path; |
354 } | 67 } |
355 return CPDF_Action(pAction->GetDict()); | 68 CPDF_FileSpec filespec(pFile); |
356 } | 69 filespec.GetFileName(path); |
357 CPDF_Action CPDF_DocJSActions::GetJSAction(const CFX_ByteString& csName) const | 70 return path; |
358 { | 71 } |
359 ASSERT(m_pDocument != NULL); | 72 CFX_ByteString CPDF_Action::GetURI(CPDF_Document* pDoc) const { |
360 CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript")); | 73 CFX_ByteString csURI; |
361 CPDF_Object *pAction = name_tree.LookupValue(csName); | 74 if (m_pDict == NULL) { |
362 if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) { | 75 return csURI; |
363 return CPDF_Action(); | 76 } |
364 } | 77 if (m_pDict->GetString("S") != "URI") { |
365 return CPDF_Action(pAction->GetDict()); | 78 return csURI; |
366 } | 79 } |
367 int CPDF_DocJSActions::FindJSAction(const CFX_ByteString& csName) const | 80 csURI = m_pDict->GetString("URI"); |
368 { | 81 CPDF_Dictionary* pRoot = pDoc->GetRoot(); |
369 ASSERT(m_pDocument != NULL); | 82 CPDF_Dictionary* pURI = pRoot->GetDict("URI"); |
370 CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript")); | 83 if (pURI != NULL) { |
371 return name_tree.GetIndex(csName); | 84 if (csURI.Find(FX_BSTRC(":"), 0) < 1) { |
372 } | 85 csURI = pURI->GetString("Base") + csURI; |
| 86 } |
| 87 } |
| 88 return csURI; |
| 89 } |
| 90 FX_DWORD CPDF_ActionFields::GetFieldsCount() const { |
| 91 if (m_pAction == NULL) { |
| 92 return 0; |
| 93 } |
| 94 CPDF_Dictionary* pDict = m_pAction->GetDict(); |
| 95 if (pDict == NULL) { |
| 96 return 0; |
| 97 } |
| 98 CFX_ByteString csType = pDict->GetString("S"); |
| 99 CPDF_Object* pFields = NULL; |
| 100 if (csType == "Hide") { |
| 101 pFields = pDict->GetElementValue("T"); |
| 102 } else { |
| 103 pFields = pDict->GetArray("Fields"); |
| 104 } |
| 105 if (pFields == NULL) { |
| 106 return 0; |
| 107 } |
| 108 int iType = pFields->GetType(); |
| 109 if (iType == PDFOBJ_DICTIONARY) { |
| 110 return 1; |
| 111 } |
| 112 if (iType == PDFOBJ_STRING) { |
| 113 return 1; |
| 114 } |
| 115 if (iType == PDFOBJ_ARRAY) { |
| 116 return ((CPDF_Array*)pFields)->GetCount(); |
| 117 } |
| 118 return 0; |
| 119 } |
| 120 void CPDF_ActionFields::GetAllFields(CFX_PtrArray& fieldObjects) const { |
| 121 fieldObjects.RemoveAll(); |
| 122 if (m_pAction == NULL) { |
| 123 return; |
| 124 } |
| 125 CPDF_Dictionary* pDict = m_pAction->GetDict(); |
| 126 if (pDict == NULL) { |
| 127 return; |
| 128 } |
| 129 CFX_ByteString csType = pDict->GetString("S"); |
| 130 CPDF_Object* pFields = NULL; |
| 131 if (csType == "Hide") { |
| 132 pFields = pDict->GetElementValue("T"); |
| 133 } else { |
| 134 pFields = pDict->GetArray("Fields"); |
| 135 } |
| 136 if (pFields == NULL) { |
| 137 return; |
| 138 } |
| 139 int iType = pFields->GetType(); |
| 140 if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) { |
| 141 fieldObjects.Add(pFields); |
| 142 } else if (iType == PDFOBJ_ARRAY) { |
| 143 CPDF_Array* pArray = (CPDF_Array*)pFields; |
| 144 FX_DWORD iCount = pArray->GetCount(); |
| 145 for (FX_DWORD i = 0; i < iCount; i++) { |
| 146 CPDF_Object* pObj = pArray->GetElementValue(i); |
| 147 if (pObj != NULL) { |
| 148 fieldObjects.Add(pObj); |
| 149 } |
| 150 } |
| 151 } |
| 152 } |
| 153 CPDF_Object* CPDF_ActionFields::GetField(FX_DWORD iIndex) const { |
| 154 if (m_pAction == NULL) { |
| 155 return NULL; |
| 156 } |
| 157 CPDF_Dictionary* pDict = m_pAction->GetDict(); |
| 158 if (pDict == NULL) { |
| 159 return NULL; |
| 160 } |
| 161 CFX_ByteString csType = pDict->GetString("S"); |
| 162 CPDF_Object* pFields = NULL; |
| 163 if (csType == "Hide") { |
| 164 pFields = pDict->GetElementValue("T"); |
| 165 } else { |
| 166 pFields = pDict->GetArray("Fields"); |
| 167 } |
| 168 if (pFields == NULL) { |
| 169 return NULL; |
| 170 } |
| 171 CPDF_Object* pFindObj = NULL; |
| 172 int iType = pFields->GetType(); |
| 173 if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) { |
| 174 if (iIndex == 0) { |
| 175 pFindObj = pFields; |
| 176 } |
| 177 } else if (iType == PDFOBJ_ARRAY) { |
| 178 pFindObj = ((CPDF_Array*)pFields)->GetElementValue(iIndex); |
| 179 } |
| 180 return pFindObj; |
| 181 } |
| 182 CPDF_LWinParam CPDF_Action::GetWinParam() const { |
| 183 if (m_pDict == NULL) { |
| 184 return NULL; |
| 185 } |
| 186 if (m_pDict->GetString("S") != "Launch") { |
| 187 return NULL; |
| 188 } |
| 189 return m_pDict->GetDict("Win"); |
| 190 } |
| 191 CFX_WideString CPDF_Action::GetJavaScript() const { |
| 192 CFX_WideString csJS; |
| 193 if (m_pDict == NULL) { |
| 194 return csJS; |
| 195 } |
| 196 CPDF_Object* pJS = m_pDict->GetElementValue("JS"); |
| 197 if (pJS != NULL) { |
| 198 return pJS->GetUnicodeText(); |
| 199 } |
| 200 return csJS; |
| 201 } |
| 202 CPDF_Dictionary* CPDF_Action::GetAnnot() const { |
| 203 if (!m_pDict) { |
| 204 return nullptr; |
| 205 } |
| 206 CFX_ByteString csType = m_pDict->GetString("S"); |
| 207 if (csType == FX_BSTRC("Rendition")) { |
| 208 return m_pDict->GetDict("AN"); |
| 209 } |
| 210 if (csType == FX_BSTRC("Movie")) { |
| 211 return m_pDict->GetDict("Annotation"); |
| 212 } |
| 213 return nullptr; |
| 214 } |
| 215 int32_t CPDF_Action::GetOperationType() const { |
| 216 if (m_pDict == NULL) { |
| 217 return 0; |
| 218 } |
| 219 CFX_ByteString csType = m_pDict->GetString("S"); |
| 220 if (csType == FX_BSTRC("Rendition")) { |
| 221 return m_pDict->GetInteger("OP"); |
| 222 } |
| 223 if (csType == FX_BSTRC("Movie")) { |
| 224 CFX_ByteString csOP = m_pDict->GetString("Operation"); |
| 225 if (csOP == FX_BSTRC("Play")) { |
| 226 return 0; |
| 227 } |
| 228 if (csOP == FX_BSTRC("Stop")) { |
| 229 return 1; |
| 230 } |
| 231 if (csOP == FX_BSTRC("Pause")) { |
| 232 return 2; |
| 233 } |
| 234 if (csOP == FX_BSTRC("Resume")) { |
| 235 return 3; |
| 236 } |
| 237 } |
| 238 return 0; |
| 239 } |
| 240 FX_DWORD CPDF_Action::GetSubActionsCount() const { |
| 241 if (m_pDict == NULL || !m_pDict->KeyExist("Next")) { |
| 242 return 0; |
| 243 } |
| 244 CPDF_Object* pNext = m_pDict->GetElementValue("Next"); |
| 245 if (!pNext) { |
| 246 return 0; |
| 247 } |
| 248 int iObjType = pNext->GetType(); |
| 249 if (iObjType == PDFOBJ_DICTIONARY) { |
| 250 return 1; |
| 251 } |
| 252 if (iObjType == PDFOBJ_ARRAY) { |
| 253 return ((CPDF_Array*)pNext)->GetCount(); |
| 254 } |
| 255 return 0; |
| 256 } |
| 257 CPDF_Action CPDF_Action::GetSubAction(FX_DWORD iIndex) const { |
| 258 if (m_pDict == NULL || !m_pDict->KeyExist("Next")) { |
| 259 return CPDF_Action(); |
| 260 } |
| 261 CPDF_Object* pNext = m_pDict->GetElementValue("Next"); |
| 262 int iObjType = pNext->GetType(); |
| 263 if (iObjType == PDFOBJ_DICTIONARY) { |
| 264 CPDF_Dictionary* pDict = static_cast<CPDF_Dictionary*>(pNext); |
| 265 if (iIndex == 0) { |
| 266 return CPDF_Action(pDict); |
| 267 } |
| 268 } else if (iObjType == PDFOBJ_ARRAY) { |
| 269 CPDF_Array* pArray = static_cast<CPDF_Array*>(pNext); |
| 270 return CPDF_Action(pArray->GetDict(iIndex)); |
| 271 } |
| 272 return CPDF_Action(); |
| 273 } |
| 274 const FX_CHAR* g_sAATypes[] = {"E", "X", "D", "U", "Fo", "Bl", "PO", "PC", |
| 275 "PV", "PI", "O", "C", "K", "F", "V", "C", |
| 276 "WC", "WS", "DS", "WP", "DP", ""}; |
| 277 FX_BOOL CPDF_AAction::ActionExist(AActionType eType) const { |
| 278 if (m_pDict == NULL) { |
| 279 return FALSE; |
| 280 } |
| 281 return m_pDict->KeyExist(g_sAATypes[(int)eType]); |
| 282 } |
| 283 CPDF_Action CPDF_AAction::GetAction(AActionType eType) const { |
| 284 if (!m_pDict) { |
| 285 return CPDF_Action(); |
| 286 } |
| 287 return CPDF_Action(m_pDict->GetDict(g_sAATypes[(int)eType])); |
| 288 } |
| 289 FX_POSITION CPDF_AAction::GetStartPos() const { |
| 290 if (m_pDict == NULL) { |
| 291 return NULL; |
| 292 } |
| 293 return m_pDict->GetStartPos(); |
| 294 } |
| 295 CPDF_Action CPDF_AAction::GetNextAction(FX_POSITION& pos, |
| 296 AActionType& eType) const { |
| 297 if (m_pDict == NULL) { |
| 298 return CPDF_Action(); |
| 299 } |
| 300 CFX_ByteString csKey; |
| 301 CPDF_Object* pObj = m_pDict->GetNextElement(pos, csKey); |
| 302 if (!pObj) { |
| 303 return CPDF_Action(); |
| 304 } |
| 305 CPDF_Object* pDirect = pObj->GetDirect(); |
| 306 if (!pDirect || pDirect->GetType() != PDFOBJ_DICTIONARY) { |
| 307 return CPDF_Action(); |
| 308 } |
| 309 int i = 0; |
| 310 while (g_sAATypes[i][0] != '\0') { |
| 311 if (csKey == g_sAATypes[i]) { |
| 312 break; |
| 313 } |
| 314 i++; |
| 315 } |
| 316 eType = (AActionType)i; |
| 317 return CPDF_Action(static_cast<CPDF_Dictionary*>(pDirect)); |
| 318 } |
| 319 CPDF_DocJSActions::CPDF_DocJSActions(CPDF_Document* pDoc) { |
| 320 m_pDocument = pDoc; |
| 321 } |
| 322 int CPDF_DocJSActions::CountJSActions() const { |
| 323 ASSERT(m_pDocument != NULL); |
| 324 CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript")); |
| 325 return name_tree.GetCount(); |
| 326 } |
| 327 CPDF_Action CPDF_DocJSActions::GetJSAction(int index, |
| 328 CFX_ByteString& csName) const { |
| 329 ASSERT(m_pDocument != NULL); |
| 330 CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript")); |
| 331 CPDF_Object* pAction = name_tree.LookupValue(index, csName); |
| 332 if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) { |
| 333 return CPDF_Action(); |
| 334 } |
| 335 return CPDF_Action(pAction->GetDict()); |
| 336 } |
| 337 CPDF_Action CPDF_DocJSActions::GetJSAction(const CFX_ByteString& csName) const { |
| 338 ASSERT(m_pDocument != NULL); |
| 339 CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript")); |
| 340 CPDF_Object* pAction = name_tree.LookupValue(csName); |
| 341 if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) { |
| 342 return CPDF_Action(); |
| 343 } |
| 344 return CPDF_Action(pAction->GetDict()); |
| 345 } |
| 346 int CPDF_DocJSActions::FindJSAction(const CFX_ByteString& csName) const { |
| 347 ASSERT(m_pDocument != NULL); |
| 348 CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript")); |
| 349 return name_tree.GetIndex(csName); |
| 350 } |
OLD | NEW |