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 "../../include/javascript/JavaScript.h"
8 #include "../../include/javascript/IJavaScript.h"
9 #include "../../include/javascript/JS_Define.h"
10 #include "../../include/javascript/JS_Object.h"
11 #include "../../include/javascript/JS_Value.h"
12 #include "../../include/javascript/Document.h"
13 #include "../../include/javascript/JS_EventHandler.h"
14 #include "../../include/javascript/JS_Context.h"
15 #include "../../include/javascript/JS_Runtime.h"
16 #include "../../include/javascript/app.h"
17 #include "../../include/javascript/Field.h"
18 #include "../../include/javascript/Icon.h"
19 #include "../../include/javascript/Field.h"
20
GetIsolate(IFXJS_Context * cc)21 static v8::Isolate* GetIsolate(IFXJS_Context* cc)
22 {
23 CJS_Context* pContext = (CJS_Context *)cc;
24 ASSERT(pContext != NULL);
25
26 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
27 ASSERT(pRuntime != NULL);
28
29 return pRuntime->GetIsolate();
30 }
31
32 BEGIN_JS_STATIC_CONST(CJS_PrintParamsObj)
END_JS_STATIC_CONST()33 END_JS_STATIC_CONST()
34
35 BEGIN_JS_STATIC_PROP(CJS_PrintParamsObj)
36 END_JS_STATIC_PROP()
37
38 BEGIN_JS_STATIC_METHOD(CJS_PrintParamsObj)
39 END_JS_STATIC_METHOD()
40
41 IMPLEMENT_JS_CLASS(CJS_PrintParamsObj, PrintParamsObj)
42
43 PrintParamsObj::PrintParamsObj(CJS_Object* pJSObject)
44 : CJS_EmbedObj(pJSObject)
45 {
46 bUI = TRUE;
47 nStart = 0;
48 nEnd = 0;
49 bSilent = FALSE;
50 bShrinkToFit = FALSE;
51 bPrintAsImage = FALSE;
52 bReverse = FALSE;
53 bAnnotations = TRUE;
54 }
55
56 /* ---------------------- Document ---------------------- */
57
58 #define MINWIDTH 5.0f
59 #define MINHEIGHT 5.0f
60
61 BEGIN_JS_STATIC_CONST(CJS_Document)
END_JS_STATIC_CONST()62 END_JS_STATIC_CONST()
63
64 BEGIN_JS_STATIC_PROP(CJS_Document)
65 JS_STATIC_PROP_ENTRY(ADBE)
66 JS_STATIC_PROP_ENTRY(author)
67 JS_STATIC_PROP_ENTRY(baseURL)
68 JS_STATIC_PROP_ENTRY(bookmarkRoot)
69 JS_STATIC_PROP_ENTRY(calculate)
70 JS_STATIC_PROP_ENTRY(Collab)
71 JS_STATIC_PROP_ENTRY(creationDate)
72 JS_STATIC_PROP_ENTRY(creator)
73 JS_STATIC_PROP_ENTRY(delay)
74 JS_STATIC_PROP_ENTRY(dirty)
75 JS_STATIC_PROP_ENTRY(documentFileName)
76 JS_STATIC_PROP_ENTRY(external)
77 JS_STATIC_PROP_ENTRY(filesize)
78 JS_STATIC_PROP_ENTRY(icons)
79 JS_STATIC_PROP_ENTRY(info)
80 JS_STATIC_PROP_ENTRY(keywords)
81 JS_STATIC_PROP_ENTRY(layout)
82 JS_STATIC_PROP_ENTRY(media)
83 JS_STATIC_PROP_ENTRY(modDate)
84 JS_STATIC_PROP_ENTRY(mouseX)
85 JS_STATIC_PROP_ENTRY(mouseY)
86 JS_STATIC_PROP_ENTRY(numFields)
87 JS_STATIC_PROP_ENTRY(numPages)
88 JS_STATIC_PROP_ENTRY(pageNum)
89 JS_STATIC_PROP_ENTRY(pageWindowRect)
90 JS_STATIC_PROP_ENTRY(path)
91 JS_STATIC_PROP_ENTRY(producer)
92 JS_STATIC_PROP_ENTRY(subject)
93 JS_STATIC_PROP_ENTRY(title)
94 JS_STATIC_PROP_ENTRY(zoom)
95 JS_STATIC_PROP_ENTRY(zoomType)
96 END_JS_STATIC_PROP()
97
98 BEGIN_JS_STATIC_METHOD(CJS_Document)
99 JS_STATIC_METHOD_ENTRY(addAnnot,0)
100 JS_STATIC_METHOD_ENTRY(addField, 4)
101 JS_STATIC_METHOD_ENTRY(addLink, 0)
102 JS_STATIC_METHOD_ENTRY(addIcon, 0)
103 JS_STATIC_METHOD_ENTRY(calculateNow, 0)
104 JS_STATIC_METHOD_ENTRY(closeDoc, 0)
105 JS_STATIC_METHOD_ENTRY(createDataObject, 0)
106 JS_STATIC_METHOD_ENTRY(deletePages, 2)
107 JS_STATIC_METHOD_ENTRY(exportAsText, 3)
108 JS_STATIC_METHOD_ENTRY(exportAsFDF, 6)
109 JS_STATIC_METHOD_ENTRY(exportAsXFDF, 5)
110 JS_STATIC_METHOD_ENTRY(extractPages, 3)
111 JS_STATIC_METHOD_ENTRY(getAnnot, 0)
112 JS_STATIC_METHOD_ENTRY(getAnnots, 2)
113 JS_STATIC_METHOD_ENTRY(getAnnot3D, 2)
114 JS_STATIC_METHOD_ENTRY(getAnnots3D, 1)
115 JS_STATIC_METHOD_ENTRY(getField, 1)
116 JS_STATIC_METHOD_ENTRY(getIcon, 0)
117 JS_STATIC_METHOD_ENTRY(getLinks, 0)
118 JS_STATIC_METHOD_ENTRY(getNthFieldName, 1)
119 JS_STATIC_METHOD_ENTRY(getOCGs, 0)
120 JS_STATIC_METHOD_ENTRY(getPageBox, 0)
121 JS_STATIC_METHOD_ENTRY(getPageNthWord, 3)
122 JS_STATIC_METHOD_ENTRY(getPageNthWordQuads, 2)
123 JS_STATIC_METHOD_ENTRY(getPageNumWords, 1)
124 JS_STATIC_METHOD_ENTRY(getPrintParams, 0)
125 JS_STATIC_METHOD_ENTRY(getURL, 2)
126 JS_STATIC_METHOD_ENTRY(importAnFDF, 1)
127 JS_STATIC_METHOD_ENTRY(importAnXFDF, 1)
128 JS_STATIC_METHOD_ENTRY(importTextData, 2)
129 JS_STATIC_METHOD_ENTRY(insertPages, 4)
130 JS_STATIC_METHOD_ENTRY(mailForm, 6)
131 JS_STATIC_METHOD_ENTRY(print, 9)
132 JS_STATIC_METHOD_ENTRY(removeField, 1)
133 JS_STATIC_METHOD_ENTRY(replacePages, 4)
134 JS_STATIC_METHOD_ENTRY(resetForm, 1)
135 JS_STATIC_METHOD_ENTRY(removeIcon, 0)
136 JS_STATIC_METHOD_ENTRY(saveAs, 5)
137 JS_STATIC_METHOD_ENTRY(submitForm, 23)
138 JS_STATIC_METHOD_ENTRY(mailDoc, 0)
139 END_JS_STATIC_METHOD()
140
141 IMPLEMENT_JS_CLASS(CJS_Document, Document)
142
143 FX_BOOL CJS_Document::InitInstance(IFXJS_Context* cc)
144 {
145 CJS_Context* pContext = (CJS_Context*)cc;
146 ASSERT(pContext != NULL);
147
148 Document* pDoc = (Document*)GetEmbedObject();
149 ASSERT(pDoc != NULL);
150
151 pDoc->AttachDoc(pContext->GetReaderDocument());
152 pDoc->SetIsolate(pContext->GetJSRuntime()->GetIsolate());
153 return TRUE;
154 };
155
156 /* --------------------------------- Document --------------------------------- */
157
Document(CJS_Object * pJSObject)158 Document::Document(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject),
159 m_cwBaseURL(L""),
160 m_pIconTree(NULL),
161 m_pDocument(NULL),
162 m_bDelay(FALSE),
163 m_isolate(NULL)
164 {
165 }
166
~Document()167 Document::~Document()
168 {
169 if (m_pIconTree)
170 {
171 m_pIconTree->DeleteIconTree();
172 delete m_pIconTree;
173 m_pIconTree = NULL;
174 }
175 for (int i=0; i<m_DelayData.GetSize(); i++)
176 {
177 if (CJS_DelayData* pData = m_DelayData.GetAt(i))
178 {
179 delete pData;
180 pData = NULL;
181 m_DelayData.SetAt(i, NULL);
182
183 }
184 }
185
186 m_DelayData.RemoveAll();
187 m_DelayAnnotData.RemoveAll();
188 }
189
190 //the total number of fileds in document.
numFields(OBJ_PROP_PARAMS)191 FX_BOOL Document::numFields(OBJ_PROP_PARAMS)
192 {
193 if (!vp.IsGetting()) return FALSE;
194
195 ASSERT(m_pDocument != NULL);
196
197 CPDFSDK_InterForm *pInterForm = m_pDocument->GetInterForm();
198 ASSERT(pInterForm != NULL);
199
200 CPDF_InterForm *pPDFForm = pInterForm->GetInterForm();
201 ASSERT(pPDFForm != NULL);
202
203 vp << (int)pPDFForm->CountFields();
204
205 return TRUE;
206 }
207
dirty(OBJ_PROP_PARAMS)208 FX_BOOL Document::dirty(OBJ_PROP_PARAMS)
209 {
210 ASSERT(m_pDocument != NULL);
211
212 if (vp.IsGetting())
213 {
214 if (m_pDocument->GetChangeMark())
215 vp << true;
216 else
217 vp << false;
218 }
219 else
220 {
221 bool bChanged = false;
222
223 vp >> bChanged;
224
225 if (bChanged)
226 m_pDocument->SetChangeMark();
227 else
228 m_pDocument->ClearChangeMark();
229 }
230
231 return TRUE;
232 }
233
ADBE(OBJ_PROP_PARAMS)234 FX_BOOL Document::ADBE(OBJ_PROP_PARAMS)
235 {
236 ASSERT(m_pDocument != NULL);
237
238 if (vp.IsGetting())
239 {
240 vp.SetNull();
241 }
242 else
243 {
244 }
245
246 return TRUE;
247 }
248
pageNum(OBJ_PROP_PARAMS)249 FX_BOOL Document::pageNum(OBJ_PROP_PARAMS)
250 {
251 ASSERT(m_pDocument != NULL);
252
253 if (vp.IsGetting())
254 {
255 if (CPDFSDK_PageView* pPageView = m_pDocument->GetCurrentView())
256 {
257 vp << pPageView->GetPageIndex();
258 }
259 }
260 else
261 {
262 int iPageCount = m_pDocument->GetPageCount();
263
264 int iPageNum = 0;
265 vp >> iPageNum;
266
267 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
268 if(!pEnv)
269 return FALSE;
270
271 if (iPageNum >= 0 && iPageNum < iPageCount)
272 {
273 pEnv->JS_docgotoPage(iPageNum);
274 }
275 else if (iPageNum >= iPageCount)
276 {
277 pEnv->JS_docgotoPage(iPageCount-1);
278 }
279 else if (iPageNum < 0)
280 {
281 pEnv->JS_docgotoPage(0);
282 }
283 }
284
285 return TRUE;
286 }
287
ParserParams(JSObject * pObj,CJS_AnnotObj & annotobj)288 FX_BOOL Document::ParserParams(JSObject* pObj,CJS_AnnotObj& annotobj)
289 {
290 return TRUE;
291 }
292
addAnnot(OBJ_METHOD_PARAMS)293 FX_BOOL Document::addAnnot(OBJ_METHOD_PARAMS)
294 {
295 return TRUE;
296 }
297
addField(OBJ_METHOD_PARAMS)298 FX_BOOL Document::addField(OBJ_METHOD_PARAMS)
299 {
300 //Doesn't support.
301 return TRUE;
302 }
303
304 //exports form fields as a tab-delimited text file to a local hard disk.
305 //comment: need reader support
306 //note : watch the third parameter:cPath, for what case it can be safely saved?
307 //int CPDFSDK_InterForm::ExportAsText(FX_BOOL bNoPassword,StringArray aFields,String cPath);
308 //return value, int the index of the parameters illegal, the index is based on 1.
309
exportAsText(OBJ_METHOD_PARAMS)310 FX_BOOL Document::exportAsText(OBJ_METHOD_PARAMS)
311 {
312 if (IsSafeMode(cc)) return TRUE;
313 return TRUE;
314 }
315
316 //exports form fields as a fdf file to the local hard drive
317 //comment: need reader supports
318 //note:the last parameter hasn't been confirmed.because the previous one blocks the way.
319 //int CPDFSDK_Document::ExportAsFDF(FX_BOOL bAllFields,BOOL bNoPassword,StringArray aFields,FX_BOOL bFlags,String cPath,FX_BOOL bAnnotations);
320
exportAsFDF(OBJ_METHOD_PARAMS)321 FX_BOOL Document::exportAsFDF(OBJ_METHOD_PARAMS)
322 {
323 v8::Isolate* isolate = GetIsolate(cc);
324 if (IsSafeMode(cc)) return TRUE;
325
326 ASSERT(m_pDocument != NULL);
327
328 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
329
330 FX_BOOL bAllFields = params.size() > 0 ? (FX_BOOL)params[0] : FALSE;
331 FX_BOOL bNoPassWord = params.size() > 1 ? (FX_BOOL)params[1] : TRUE;
332 FX_BOOL bWhole = params.size() > 2 ? (params[2].GetType() == VT_null) : TRUE;
333 CJS_Array arrayFileds(isolate);
334 if (!bWhole)
335 arrayFileds.Attach(params[2]);
336 //FX_BOOL bFlags = params.size() > 3 ? (FX_BOOL)params[3] : FALSE;
337 CFX_WideString swFilePath = params.size() > 4 ? (FX_LPCWSTR)params[4].operator CFX_WideString() : (FX_LPCWSTR)L"";
338
339 if (swFilePath.IsEmpty())
340 {
341 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
342 swFilePath = pEnv->JS_fieldBrowse();
343 if(swFilePath.IsEmpty())
344 return TRUE;
345 }
346 else
347 {
348 swFilePath = app::PDFPathToSysPath(swFilePath);
349 }
350
351 m_pDocument->SetFocusAnnot(NULL);
352
353 CPDFSDK_InterForm* pInterForm= (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
354 ASSERT(pInterForm != NULL);
355
356 CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
357 ASSERT(pPDFForm != NULL);
358
359 CFX_PtrArray aFields;
360
361 if (bWhole)
362 {
363 for (int j=0,jsz=pPDFForm->CountFields(); j<jsz; j++)
364 {
365 aFields.Add(pPDFForm->GetField(j));
366 }
367 }
368 else
369 {
370 for (int i=0,isz=arrayFileds.GetLength(); i<isz; i++)
371 {
372 CJS_Value valName(isolate);
373 arrayFileds.GetElement(i,valName);
374 CFX_WideString swName = valName.operator CFX_WideString();
375
376 for (int j=0, jsz=pPDFForm->CountFields(swName); j<jsz; j++)
377 {
378 aFields.Add(pPDFForm->GetField(j, swName));
379 }
380 }
381 }
382
383 CFX_PtrArray fields;
384
385 for (int i=0,sz=aFields.GetSize(); i<sz; i++)
386 {
387 CPDF_FormField* pField = (CPDF_FormField*)aFields[i];
388
389 if (!bAllFields)
390 if (pField->GetValue() == L"")
391 continue;
392
393 if (bNoPassWord)
394 if (pField->GetFieldFlags() & 0x2000)
395 continue;
396
397 fields.Add((void*)pField);
398 }
399
400 return pInterForm->ExportFieldsToFDFFile(swFilePath, fields, TRUE);
401 }
402
403 //exports form fields an XFDF file to the local hard drive
404 //comment: need reder supports
405 //note:the last parameter can't be test
406 //int CPDFSDK_Document::ExportAsXFDF(FX_BOOL bAllFields,FX_BOOL bNoPassWord,StringArray aFields,String cPath,FX_BOOL bAnnoatations);
407
exportAsXFDF(OBJ_METHOD_PARAMS)408 FX_BOOL Document::exportAsXFDF(OBJ_METHOD_PARAMS)
409 {
410 if (IsSafeMode(cc)) return TRUE;
411 ASSERT(m_pDocument != NULL);
412
413 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
414
415 return TRUE;
416 }
417
418 //Maps a field object in PDF document to a JavaScript variable
419 //comment:
420 //note: the paremter cName, this is clue how to treat if the cName is not a valiable filed name in this document
421
getField(OBJ_METHOD_PARAMS)422 FX_BOOL Document::getField(OBJ_METHOD_PARAMS)
423 {
424 v8::Isolate* isolate = GetIsolate(cc);
425 ASSERT(m_pDocument != NULL);
426
427 if (params.size() < 1) return FALSE;
428
429 CFX_WideString wideName = params[0].operator CFX_WideString();
430
431 CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
432 ASSERT(pInterForm != NULL);
433
434 CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
435 ASSERT(pPDFForm != NULL);
436
437 if (pPDFForm->CountFields(wideName) <= 0)
438 {
439 vRet.SetNull();
440 return TRUE;
441 }
442
443 CJS_Context* pContext = (CJS_Context*)cc;
444 ASSERT(pContext != NULL);
445 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
446 ASSERT(pRuntime != NULL);
447
448 JSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Field"));
449
450 CJS_Field * pJSField = (CJS_Field*)JS_GetPrivate(isolate,pFieldObj);
451 ASSERT(pJSField != NULL);
452
453 Field * pField = (Field *)pJSField->GetEmbedObject();
454 ASSERT(pField != NULL);
455
456 pField->AttachField(this, wideName);
457 vRet = pJSField;
458
459 return TRUE;
460 }
461
462 //Gets the name of the nth field in the document
463 //comment:
464 //note: the parameter nIndex, if it is not available
465
getNthFieldName(OBJ_METHOD_PARAMS)466 FX_BOOL Document::getNthFieldName(OBJ_METHOD_PARAMS)
467 {
468 ASSERT(m_pDocument != NULL);
469
470 int nIndex = params.size() > 0 ? (int)params[0] : -1;
471 if (nIndex == -1) return FALSE;
472
473 CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
474 ASSERT(pInterForm != NULL);
475
476 CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
477 ASSERT(pPDFForm != NULL);
478
479 CPDF_FormField* pField = pPDFForm->GetField(nIndex);
480 if (!pField)
481 return FALSE;
482
483 vRet = pField->GetFullName();
484 return TRUE;
485 }
486
487 //imports the specified fdf file.
488 //comments: need reader suppport
489 //note:once the cpath is illigl then a file dialog box pops up in order to ask user to chooose the file
490 //int CPDFSDK_Document::importAnFDF(String cPath);
491
importAnFDF(OBJ_METHOD_PARAMS)492 FX_BOOL Document::importAnFDF(OBJ_METHOD_PARAMS)
493 {
494 if (IsSafeMode(cc)) return TRUE;
495 ASSERT(m_pDocument != NULL);
496
497 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
498 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
499 m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
500
501
502 CFX_WideString swPath;
503
504 if (params.size() > 0)
505 swPath = params[0];
506
507 if (swPath.IsEmpty())
508 {
509 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
510 swPath = pEnv->JS_fieldBrowse();
511 if(swPath.IsEmpty())
512 return TRUE;
513 }
514 else
515 {
516 swPath = app::PDFPathToSysPath(swPath);
517 }
518
519 m_pDocument->SetFocusAnnot(NULL);
520
521 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
522 ASSERT(pInterForm != NULL);
523
524 if (!pInterForm->ImportFormFromFDFFile(swPath, TRUE))
525 return FALSE;
526
527 m_pDocument->SetChangeMark();
528 // CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
529 // ASSERT(pEnv != NULL);
530 // IUndo* pUndo = IUndo::GetUndo(pEnv);
531 // ASSERT(pUndo != NULL);
532 // pUndo->Reset(m_pDocument);
533
534 return TRUE;
535 }
536
537 //imports and specified XFDF file containing XML form data
538 //comment: need reader supports
539 //note: same as up
540 //int CPDFSDK_Document::importAnFDF(String cPath)
541
importAnXFDF(OBJ_METHOD_PARAMS)542 FX_BOOL Document::importAnXFDF(OBJ_METHOD_PARAMS)
543 {
544 if (IsSafeMode(cc)) return TRUE;
545 ASSERT(m_pDocument != NULL);
546
547 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
548 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
549 m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
550
551 return TRUE;
552 }
553
554 //imports and specified text file
555 //commnet: need reader supports
556 //note: same as up,when nRow is not rational,adobe is dumb for it.
557 //int CPDFSDK_Document::importTextData(String cPath,int nRow);
558
importTextData(OBJ_METHOD_PARAMS)559 FX_BOOL Document::importTextData(OBJ_METHOD_PARAMS)
560 {
561 if (IsSafeMode(cc)) return TRUE;
562 ASSERT(m_pDocument != NULL);
563
564 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
565 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
566 m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
567
568 return TRUE;
569 }
570
571 //exports the form data and mails the resulting fdf file as an attachment to all recipients.
572 //comment: need reader supports
573 //note:
574 //int CPDFSDK_Document::mailForm(FX_BOOL bUI,String cto,string ccc,string cbcc,string cSubject,string cms);
575
mailForm(OBJ_METHOD_PARAMS)576 FX_BOOL Document::mailForm(OBJ_METHOD_PARAMS)
577 {
578 ASSERT(m_pDocument != NULL);
579
580 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
581
582 int iLength = params.size();
583
584 FX_BOOL bUI = iLength > 0 ? (FX_BOOL)params[0] : TRUE;
585 CFX_WideString cTo = iLength > 1 ? (FX_LPCWSTR)params[1].operator CFX_WideString() : (FX_LPCWSTR)L"";
586 CFX_WideString cCc = iLength > 2 ? (FX_LPCWSTR)params[2].operator CFX_WideString() : (FX_LPCWSTR)L"";
587 CFX_WideString cBcc = iLength > 3 ? (FX_LPCWSTR)params[3].operator CFX_WideString() : (FX_LPCWSTR)L"";
588 CFX_WideString cSubject = iLength > 4 ? (FX_LPCWSTR)params[4].operator CFX_WideString() : (FX_LPCWSTR)L"";
589 CFX_WideString cMsg = iLength > 5 ? (FX_LPCWSTR)params[5].operator CFX_WideString() : (FX_LPCWSTR)L"";
590
591 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
592 ASSERT(pInterForm != NULL);
593
594 CFX_ByteTextBuf textBuf;
595 if (!pInterForm->ExportFormToFDFTextBuf(textBuf))
596 return FALSE;
597
598 CJS_Context* pContext = (CJS_Context*)cc;
599 ASSERT(pContext != NULL);
600 CPDFDoc_Environment* pEnv = pContext->GetReaderApp();
601 ASSERT(pEnv != NULL);
602 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
603 ASSERT(pRuntime != NULL);
604
605 pRuntime->BeginBlock();
606 pEnv->JS_docmailForm(textBuf.GetBuffer(), textBuf.GetLength(), bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg);
607 pRuntime->EndBlock();
608 return TRUE;
609 }
610
print(OBJ_METHOD_PARAMS)611 FX_BOOL Document::print(OBJ_METHOD_PARAMS)
612 {
613 CJS_Context* pContext = (CJS_Context*)cc;
614 ASSERT(pContext != NULL);
615 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
616 ASSERT(pRuntime != NULL);
617
618 FX_BOOL bUI = TRUE;
619 int nStart = 0;
620 int nEnd = 0;
621 FX_BOOL bSilent = FALSE;
622 FX_BOOL bShrinkToFit = FALSE;
623 FX_BOOL bPrintAsImage = FALSE;
624 FX_BOOL bReverse = FALSE;
625 FX_BOOL bAnnotations = FALSE;
626
627 int nlength = params.size();
628 if(nlength ==9)
629 {
630 if (params[8].GetType() == VT_fxobject)
631 {
632 JSFXObject pObj = (JSFXObject)params[8];
633 {
634 if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"PrintParamsObj"))
635 {
636 if (CJS_Object* pJSObj = (CJS_Object*)params[8])
637 {
638 if (PrintParamsObj* pprintparamsObj = (PrintParamsObj*)pJSObj->GetEmbedObject())
639 {
640 bUI = pprintparamsObj->bUI;
641 nStart = pprintparamsObj->nStart;
642 nEnd = pprintparamsObj->nEnd;
643 bSilent = pprintparamsObj->bSilent;
644 bShrinkToFit = pprintparamsObj->bShrinkToFit;
645 bPrintAsImage = pprintparamsObj->bPrintAsImage;
646 bReverse = pprintparamsObj->bReverse;
647 bAnnotations = pprintparamsObj->bAnnotations;
648 }
649 }
650 }
651 }
652 }
653 }
654 else
655 {
656 if(nlength >= 1)
657 bUI = params[0];
658 if(nlength >= 2)
659 nStart = (int)params[1];
660 if(nlength >= 3)
661 nEnd = (int)params[2];
662 if(nlength >= 4)
663 bSilent = params[3];
664 if(nlength >= 5)
665 bShrinkToFit = params[4];
666 if(nlength >= 6)
667 bPrintAsImage = params[5];
668 if(nlength >= 7)
669 bReverse = params[6];
670 if(nlength >= 8)
671 bAnnotations = params[7];
672 }
673
674 ASSERT(m_pDocument != NULL);
675
676 if (CPDFDoc_Environment* pEnv = m_pDocument->GetEnv())
677 {
678 pEnv->JS_docprint(bUI, nStart, nEnd, bSilent, bShrinkToFit, bPrintAsImage, bReverse, bAnnotations);
679 return TRUE;
680 }
681 return FALSE;
682 }
683
684 //removes the specified field from the document.
685 //comment:
686 //note: if the filed name is not retional, adobe is dumb for it.
687
removeField(OBJ_METHOD_PARAMS)688 FX_BOOL Document::removeField(OBJ_METHOD_PARAMS)
689 {
690 ASSERT(m_pDocument != NULL);
691
692 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
693 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM))) return FALSE;
694
695 if (params.size() < 1)
696 return TRUE;
697
698 CFX_WideString sFieldName = params[0].operator CFX_WideString();
699
700 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
701 ASSERT(pInterForm != NULL);
702
703 CFX_PtrArray widgets;
704 pInterForm->GetWidgets(sFieldName, widgets);
705
706 int nSize = widgets.GetSize();
707
708 if (nSize > 0)
709 {
710 for (int i=0; i<nSize; i++)
711 {
712 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets[i];
713 ASSERT(pWidget != NULL);
714
715 CPDF_Rect rcAnnot = pWidget->GetRect();
716 rcAnnot.left -= 1;
717 rcAnnot.bottom -= 1;
718 rcAnnot.right += 1;
719 rcAnnot.top += 1;
720
721 CFX_RectArray aRefresh;
722 aRefresh.Add(rcAnnot);
723
724 CPDF_Page* pPage = pWidget->GetPDFPage();
725 ASSERT(pPage != NULL);
726
727 CPDFSDK_PageView* pPageView = m_pDocument->GetPageView(pPage);
728 pPageView->DeleteAnnot(pWidget);
729
730 pPageView->UpdateRects(aRefresh);
731 }
732 m_pDocument->SetChangeMark();
733 }
734
735 return TRUE;
736 }
737
738 //reset filed values within a document.
739 //comment:
740 //note: if the fields names r not rational, aodbe is dumb for it.
741
resetForm(OBJ_METHOD_PARAMS)742 FX_BOOL Document::resetForm(OBJ_METHOD_PARAMS)
743 {
744 ASSERT(m_pDocument != NULL);
745
746 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
747 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
748 m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
749
750 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
751 ASSERT(pInterForm != NULL);
752
753 CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
754 ASSERT(pPDFForm != NULL);
755
756 v8::Isolate* isolate = GetIsolate(cc);
757 CJS_Array aName(isolate);
758
759 if (params.size() > 0)
760 {
761 switch (params[0].GetType())
762 {
763 default:
764 aName.Attach(params[0]);
765 break;
766 case VT_string:
767 aName.SetElement(0,params[0]);
768 break;
769 }
770
771 CFX_PtrArray aFields;
772
773 for (int i=0,isz=aName.GetLength(); i<isz; i++)
774 {
775 CJS_Value valElement(isolate);
776 aName.GetElement(i,valElement);
777 CFX_WideString swVal = valElement.operator CFX_WideString();
778
779 for (int j=0,jsz=pPDFForm->CountFields(swVal); j<jsz; j++)
780 {
781 aFields.Add((void*)pPDFForm->GetField(j,swVal));
782 }
783 }
784
785 if (aFields.GetSize() > 0)
786 {
787 pPDFForm->ResetForm(aFields, TRUE, TRUE);
788 m_pDocument->SetChangeMark();
789
790 }
791 }
792 else
793 {
794 pPDFForm->ResetForm(TRUE);
795 m_pDocument->SetChangeMark();
796
797 }
798
799 return TRUE;
800 }
801
802
saveAs(OBJ_METHOD_PARAMS)803 FX_BOOL Document::saveAs(OBJ_METHOD_PARAMS)
804 {
805
806 if (IsSafeMode(cc)) return TRUE;
807
808 ASSERT(m_pDocument != NULL);
809
810 // m_pDocument->DoSaveAs();
811
812 return TRUE;
813 }
814
815
submitForm(OBJ_METHOD_PARAMS)816 FX_BOOL Document::submitForm(OBJ_METHOD_PARAMS)
817 {
818 ASSERT(m_pDocument != NULL);
819
820 // if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
821
822 int nSize = params.size();
823 if (nSize < 1) return FALSE;
824
825 CFX_WideString strURL;
826 FX_BOOL bFDF = TRUE;
827 FX_BOOL bEmpty = FALSE;
828 v8::Isolate* isolate = GetIsolate(cc);
829 CJS_Array aFields(isolate);
830
831 CJS_Value v = params[0];
832 if (v.GetType() == VT_string)
833 {
834 strURL = params[0].operator CFX_WideString();
835 if (nSize > 1)
836 bFDF = params[1];
837 if (nSize > 2)
838 bEmpty = params[2];
839 if (nSize > 3)
840 aFields.Attach(params[3]);
841 }
842 else if (v.GetType() == VT_object)
843 {
844 JSObject pObj = (JSObject)params[0];
845 v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"cURL");
846 if (!pValue.IsEmpty())
847 strURL = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
848 pValue = JS_GetObjectElement(isolate,pObj, L"bFDF");
849 bFDF = CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue));
850 pValue = JS_GetObjectElement(isolate,pObj, L"bEmpty");
851 bEmpty = CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue));
852 pValue = JS_GetObjectElement(isolate,pObj,L"aFields");
853 aFields.Attach(CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue)));
854 }
855
856 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
857 ASSERT(pInterForm != NULL);
858 CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
859 ASSERT(pPDFInterForm != NULL);
860
861 FX_BOOL bAll = (aFields.GetLength() == 0);
862
863 if (bAll && bEmpty)
864 {
865 CJS_Context* pContext = (CJS_Context*)cc;
866 ASSERT(pContext != NULL);
867 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
868 ASSERT(pRuntime != NULL);
869
870
871 if (pPDFInterForm->CheckRequiredFields())
872 {
873 pRuntime->BeginBlock();
874 pInterForm->SubmitForm(strURL, FALSE);
875 pRuntime->EndBlock();
876 }
877
878 return TRUE;
879 }
880 else
881 {
882 CFX_PtrArray fieldObjects;
883
884 for (int i=0,sz=aFields.GetLength(); i<sz; i++)
885 {
886 CJS_Value valName(isolate);
887 aFields.GetElement(i, valName);
888 CFX_WideString sName = valName.operator CFX_WideString();
889
890 CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
891 ASSERT(pPDFForm != NULL);
892
893 for (int j=0, jsz=pPDFForm->CountFields(sName); j<jsz; j++)
894 {
895 CPDF_FormField* pField = pPDFForm->GetField(j, sName);
896 if (!bEmpty && pField->GetValue().IsEmpty())
897 continue;
898
899 fieldObjects.Add(pField);
900 }
901 }
902
903 CJS_Context* pContext = (CJS_Context*)cc;
904 ASSERT(pContext != NULL);
905 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
906 ASSERT(pRuntime != NULL);
907
908
909 if (pPDFInterForm->CheckRequiredFields(&fieldObjects, TRUE))
910 {
911 pRuntime->BeginBlock();
912 pInterForm->SubmitFields(strURL, fieldObjects, TRUE, !bFDF);
913 pRuntime->EndBlock();
914 }
915
916 return TRUE;
917 }
918
919 }
920
921 //////////////////////////////////////////////////////////////////////////////////////////////
922
AttachDoc(CPDFSDK_Document * pDoc)923 void Document::AttachDoc(CPDFSDK_Document *pDoc)
924 {
925 m_pDocument = pDoc;
926 }
927
GetReaderDoc()928 CPDFSDK_Document * Document::GetReaderDoc()
929 {
930 return m_pDocument;
931 }
932
ExtractFileName(CPDFSDK_Document * pDoc,CFX_ByteString & strFileName)933 FX_BOOL Document::ExtractFileName(CPDFSDK_Document *pDoc,CFX_ByteString &strFileName)
934 {
935 return FALSE;
936 }
937
ExtractFolderName(CPDFSDK_Document * pDoc,CFX_ByteString & strFolderName)938 FX_BOOL Document::ExtractFolderName(CPDFSDK_Document *pDoc,CFX_ByteString &strFolderName)
939 {
940 return FALSE;
941 }
942
bookmarkRoot(OBJ_PROP_PARAMS)943 FX_BOOL Document::bookmarkRoot(OBJ_PROP_PARAMS)
944 {
945 return TRUE;
946 }
947
mailDoc(OBJ_METHOD_PARAMS)948 FX_BOOL Document::mailDoc(OBJ_METHOD_PARAMS)
949 {
950 ASSERT(m_pDocument != NULL);
951
952 FX_BOOL bUI = TRUE;
953 CFX_WideString cTo = L"";
954 CFX_WideString cCc = L"";
955 CFX_WideString cBcc = L"";
956 CFX_WideString cSubject = L"";
957 CFX_WideString cMsg = L"";
958
959
960 bUI = params.size()>=1?static_cast<FX_BOOL>(params[0]):TRUE;
961 cTo = params.size()>=2?(const wchar_t*)params[1].operator CFX_WideString():L"";
962 cCc = params.size()>=3?(const wchar_t*)params[2].operator CFX_WideString():L"";
963 cBcc = params.size()>=4?(const wchar_t*)params[3].operator CFX_WideString():L"";
964 cSubject = params.size()>=5?(const wchar_t*)params[4].operator CFX_WideString():L"";
965 cMsg = params.size()>=6?(const wchar_t*)params[5].operator CFX_WideString():L"";
966
967 v8::Isolate* isolate = GetIsolate(cc);
968
969 if(params.size()>=1 && params[0].GetType() == VT_object)
970 {
971 JSObject pObj = (JSObject )params[0];
972
973 v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"bUI");
974 bUI = (int)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
975
976 pValue = JS_GetObjectElement(isolate,pObj, L"cTo");
977 cTo = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
978
979 pValue = JS_GetObjectElement(isolate,pObj, L"cCc");
980 cCc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
981
982 pValue = JS_GetObjectElement(isolate,pObj, L"cBcc");
983 cBcc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
984
985 pValue = JS_GetObjectElement(isolate,pObj, L"cSubject");
986 cSubject = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
987
988 pValue = JS_GetObjectElement(isolate,pObj, L"cMsg");
989 cMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
990
991 }
992
993 CJS_Context* pContext = (CJS_Context*)cc;
994 ASSERT(pContext != NULL);
995 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
996 ASSERT(pRuntime != NULL);
997
998 pRuntime->BeginBlock();
999 CPDFDoc_Environment* pEnv = pRuntime->GetReaderApp();
1000 pEnv->JS_docmailForm(NULL, 0, bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg);
1001 pRuntime->EndBlock();
1002
1003 return TRUE;
1004 }
1005
author(OBJ_PROP_PARAMS)1006 FX_BOOL Document::author(OBJ_PROP_PARAMS)
1007 {
1008 ASSERT(m_pDocument != NULL);
1009
1010 CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
1011 if (!pDictionary)return FALSE;
1012
1013 if (vp.IsGetting())
1014 {
1015 vp << pDictionary->GetUnicodeText("Author");
1016 return TRUE;
1017 }
1018 else
1019 {
1020 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
1021
1022 CFX_WideString csAuthor;
1023 vp >> csAuthor;
1024 pDictionary->SetAtString("Author", PDF_EncodeText(csAuthor));
1025 m_pDocument->SetChangeMark();
1026 return TRUE;
1027 }
1028 }
1029
info(OBJ_PROP_PARAMS)1030 FX_BOOL Document::info(OBJ_PROP_PARAMS)
1031 {
1032 ASSERT(m_pDocument != NULL);
1033
1034 CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
1035 if (!pDictionary)return FALSE;
1036
1037 CFX_WideString cwAuthor = pDictionary->GetUnicodeText("Author");
1038 CFX_WideString cwTitle = pDictionary->GetUnicodeText("Title");
1039 CFX_WideString cwSubject = pDictionary->GetUnicodeText("Subject");
1040 CFX_WideString cwKeywords = pDictionary->GetUnicodeText("Keywords");
1041 CFX_WideString cwCreator = pDictionary->GetUnicodeText("Creator");
1042 CFX_WideString cwProducer = pDictionary->GetUnicodeText("Producer");
1043 CFX_WideString cwCreationDate = pDictionary->GetUnicodeText("CreationDate");
1044 CFX_WideString cwModDate = pDictionary->GetUnicodeText("ModDate");
1045 CFX_WideString cwTrapped = pDictionary->GetUnicodeText("Trapped");
1046
1047 v8::Isolate* isolate = GetIsolate(cc);
1048 if (!vp.IsSetting())
1049 {
1050 CJS_Context* pContext = (CJS_Context *)cc;
1051 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
1052
1053 JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, -1);
1054
1055 JS_PutObjectString(isolate,pObj, L"Author", cwAuthor);
1056 JS_PutObjectString(isolate,pObj, L"Title", cwTitle);
1057 JS_PutObjectString(isolate,pObj, L"Subject", cwSubject);
1058 JS_PutObjectString(isolate,pObj, L"Keywords", cwKeywords);
1059 JS_PutObjectString(isolate,pObj, L"Creator", cwCreator);
1060 JS_PutObjectString(isolate,pObj, L"Producer", cwProducer);
1061 JS_PutObjectString(isolate,pObj, L"CreationDate", cwCreationDate);
1062 JS_PutObjectString(isolate,pObj, L"ModDate", cwModDate);
1063 JS_PutObjectString(isolate,pObj, L"Trapped", cwTrapped);
1064
1065 // It's to be compatible to non-standard info dictionary.
1066 FX_POSITION pos = pDictionary->GetStartPos();
1067 while(pos)
1068 {
1069 CFX_ByteString bsKey;
1070 CPDF_Object* pValueObj = pDictionary->GetNextElement(pos, bsKey);
1071 CFX_WideString wsKey = CFX_WideString::FromUTF8(bsKey);
1072 if((pValueObj->GetType()==PDFOBJ_STRING) || (pValueObj->GetType()==PDFOBJ_NAME) )
1073 JS_PutObjectString(isolate,pObj, wsKey, pValueObj->GetUnicodeText());
1074 if(pValueObj->GetType()==PDFOBJ_NUMBER)
1075 JS_PutObjectNumber(isolate,pObj, wsKey, (float)pValueObj->GetNumber());
1076 if(pValueObj->GetType()==PDFOBJ_BOOLEAN)
1077 JS_PutObjectBoolean(isolate,pObj, wsKey, (bool)pValueObj->GetInteger());
1078 }
1079
1080 vp << pObj;
1081 return TRUE;
1082 }
1083 else
1084 {
1085 return TRUE;
1086 }
1087 }
1088
creationDate(OBJ_PROP_PARAMS)1089 FX_BOOL Document::creationDate(OBJ_PROP_PARAMS)
1090 {
1091 ASSERT(m_pDocument != NULL);
1092
1093 CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
1094 if (!pDictionary)return FALSE;
1095
1096 if (vp.IsGetting())
1097 {
1098 vp << pDictionary->GetUnicodeText("CreationDate");
1099 return TRUE;
1100 }
1101 else
1102 {
1103 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
1104
1105 CFX_WideString csCreationDate;
1106 vp >> csCreationDate;
1107 pDictionary->SetAtString("CreationDate", PDF_EncodeText(csCreationDate));
1108 m_pDocument->SetChangeMark();
1109
1110 return TRUE;
1111 }
1112 }
1113
creator(OBJ_PROP_PARAMS)1114 FX_BOOL Document::creator(OBJ_PROP_PARAMS)
1115 {
1116 ASSERT(m_pDocument != NULL);
1117
1118 CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
1119 if (!pDictionary)return FALSE;
1120
1121 if (vp.IsGetting())
1122 {
1123 vp << pDictionary->GetUnicodeText("Creator");
1124 return TRUE;
1125 }
1126 else
1127 {
1128 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
1129
1130 CFX_WideString csCreator;
1131 vp >> csCreator;
1132 pDictionary->SetAtString("Creator", PDF_EncodeText(csCreator));
1133 m_pDocument->SetChangeMark();
1134 return TRUE;
1135 }
1136 }
1137
delay(OBJ_PROP_PARAMS)1138 FX_BOOL Document::delay(OBJ_PROP_PARAMS)
1139 {
1140 if (vp.IsGetting())
1141 {
1142 vp << m_bDelay;
1143 return TRUE;
1144 }
1145 else
1146 {
1147 ASSERT(m_pDocument != NULL);
1148
1149 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
1150
1151 bool b;
1152 vp >> b;
1153
1154 m_bDelay = b;
1155
1156 if (m_bDelay)
1157 {
1158 for (int i=0,sz=m_DelayData.GetSize(); i<sz; i++)
1159 delete m_DelayData.GetAt(i);
1160
1161 m_DelayData.RemoveAll();
1162 }
1163 else
1164 {
1165 for (int i=0,sz=m_DelayData.GetSize(); i<sz; i++)
1166 {
1167 if (CJS_DelayData* pData = m_DelayData.GetAt(i))
1168 {
1169 Field::DoDelay(m_pDocument, pData);
1170 delete m_DelayData.GetAt(i);
1171 }
1172 }
1173 m_DelayData.RemoveAll();
1174 }
1175
1176 return TRUE;
1177 }
1178 }
1179
keywords(OBJ_PROP_PARAMS)1180 FX_BOOL Document::keywords(OBJ_PROP_PARAMS)
1181 {
1182 ASSERT(m_pDocument != NULL);
1183
1184 CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
1185 if (!pDictionary)return FALSE;
1186
1187 if (vp.IsGetting())
1188 {
1189 vp << pDictionary->GetUnicodeText("Keywords");
1190 return TRUE;
1191 }
1192 else
1193 {
1194 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
1195
1196 CFX_WideString csKeywords;
1197 vp >> csKeywords;
1198 pDictionary->SetAtString("Keywords", PDF_EncodeText(csKeywords));
1199 m_pDocument->SetChangeMark();
1200 return TRUE;
1201 }
1202 }
1203
modDate(OBJ_PROP_PARAMS)1204 FX_BOOL Document::modDate(OBJ_PROP_PARAMS)
1205 {
1206 ASSERT(m_pDocument != NULL);
1207
1208 CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
1209 if (!pDictionary)return FALSE;
1210
1211 if (vp.IsGetting())
1212 {
1213 vp << pDictionary->GetUnicodeText("ModDate");
1214 return TRUE;
1215 }
1216 else
1217 {
1218 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
1219
1220 CFX_WideString csmodDate;
1221 vp >> csmodDate;
1222 pDictionary->SetAtString("ModDate", PDF_EncodeText(csmodDate));
1223 m_pDocument->SetChangeMark();
1224 return TRUE;
1225 }
1226 }
1227
producer(OBJ_PROP_PARAMS)1228 FX_BOOL Document::producer(OBJ_PROP_PARAMS)
1229 {
1230 ASSERT(m_pDocument != NULL);
1231
1232 CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
1233 if (!pDictionary)return FALSE;
1234
1235 if (vp.IsGetting())
1236 {
1237 vp << pDictionary->GetUnicodeText("Producer");
1238 return TRUE;
1239 }
1240 else
1241 {
1242 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
1243
1244 CFX_WideString csproducer;
1245 vp >> csproducer;
1246 pDictionary->SetAtString("Producer", PDF_EncodeText(csproducer));
1247 m_pDocument->SetChangeMark();
1248 return TRUE;
1249 }
1250 }
1251
subject(OBJ_PROP_PARAMS)1252 FX_BOOL Document::subject(OBJ_PROP_PARAMS)
1253 {
1254 ASSERT(m_pDocument != NULL);
1255
1256 CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
1257 if (!pDictionary)return FALSE;
1258
1259 if (vp.IsGetting())
1260 {
1261 vp << pDictionary->GetUnicodeText("Subject");
1262 return TRUE;
1263 }
1264 else
1265 {
1266 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
1267
1268 CFX_WideString cssubject;
1269 vp >> cssubject;
1270 pDictionary->SetAtString("Subject", PDF_EncodeText(cssubject));
1271 m_pDocument->SetChangeMark();
1272 return TRUE;
1273 }
1274 }
1275
title(OBJ_PROP_PARAMS)1276 FX_BOOL Document::title(OBJ_PROP_PARAMS)
1277 {
1278 ASSERT(m_pDocument != NULL);
1279
1280 if (m_pDocument == NULL || m_pDocument->GetDocument() == NULL)
1281 return FALSE;
1282
1283 CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
1284 if (!pDictionary)return FALSE;
1285
1286 if (vp.IsGetting())
1287 {
1288 vp << pDictionary->GetUnicodeText("Title");
1289 return TRUE;
1290 }
1291 else
1292 {
1293 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
1294
1295 CFX_WideString cstitle;
1296 vp >> cstitle;
1297 pDictionary->SetAtString("Title", PDF_EncodeText(cstitle));
1298 m_pDocument->SetChangeMark();
1299 return TRUE;
1300 }
1301 }
1302
numPages(OBJ_PROP_PARAMS)1303 FX_BOOL Document::numPages(OBJ_PROP_PARAMS)
1304 {
1305 if (vp.IsGetting())
1306 {
1307 ASSERT(m_pDocument != NULL);
1308 vp << m_pDocument->GetPageCount();
1309 return TRUE;
1310 }
1311 else
1312 {
1313 return FALSE;
1314 }
1315 }
1316
external(OBJ_PROP_PARAMS)1317 FX_BOOL Document::external(OBJ_PROP_PARAMS)
1318 {
1319 //In Chrome case,should always return true.
1320 vp << TRUE;
1321 return TRUE;
1322 }
1323
filesize(OBJ_PROP_PARAMS)1324 FX_BOOL Document::filesize(OBJ_PROP_PARAMS)
1325 {
1326 if (!vp.IsGetting())return FALSE;
1327
1328 ASSERT(m_pDocument != NULL);
1329
1330 // CFile file(m_pDocument->GetPath(), CFile::modeRead | CFile::typeBinary | CFile::shareDenyNone);
1331 // vp << (double)file.GetLength();
1332 // file.Close();
1333
1334 if ( m_pDocument->GetPath().IsEmpty() == FALSE)
1335 {
1336 CFX_ByteString bsStr = CFX_ByteString::FromUnicode( m_pDocument->GetPath() );
1337 FILE * pFile = NULL;
1338 pFile = fopen( bsStr.GetBuffer( bsStr.GetLength() ), "rb" );
1339 if ( pFile )
1340 {
1341 fseek( pFile, 0, SEEK_END );
1342 long lSize = ftell( pFile );
1343 fclose( pFile );
1344 pFile = NULL;
1345
1346 vp << (FX_INT32)(lSize);
1347 return TRUE;
1348 }
1349 }
1350
1351 vp << 0;
1352 return TRUE;
1353 }
1354
mouseX(OBJ_PROP_PARAMS)1355 FX_BOOL Document::mouseX(OBJ_PROP_PARAMS)
1356 {
1357 return TRUE;
1358 }
1359
mouseY(OBJ_PROP_PARAMS)1360 FX_BOOL Document::mouseY(OBJ_PROP_PARAMS)
1361 {
1362 return TRUE;
1363 }
1364
baseURL(OBJ_PROP_PARAMS)1365 FX_BOOL Document::baseURL(OBJ_PROP_PARAMS)
1366 {
1367 if (vp.IsGetting())
1368 {
1369 vp << m_cwBaseURL;
1370 return TRUE;
1371 }
1372 else
1373 {
1374 vp >> m_cwBaseURL;
1375 return TRUE;
1376 }
1377 }
1378
calculate(OBJ_PROP_PARAMS)1379 FX_BOOL Document::calculate(OBJ_PROP_PARAMS)
1380 {
1381 ASSERT(m_pDocument != NULL);
1382
1383 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
1384 ASSERT(pInterForm != NULL);
1385
1386 if (vp.IsGetting())
1387 {
1388 if (pInterForm->IsCalculateEnabled())
1389 vp << true;
1390 else
1391 vp << false;
1392 }
1393 else
1394 {
1395 bool bCalculate;
1396 vp >> bCalculate;
1397
1398 pInterForm->EnableCalculate(bCalculate);
1399 }
1400
1401 return TRUE;
1402 }
1403
documentFileName(OBJ_PROP_PARAMS)1404 FX_BOOL Document::documentFileName(OBJ_PROP_PARAMS)
1405 {
1406 if (!vp.IsGetting())
1407 return FALSE;
1408
1409 CFX_WideString wsFilePath = m_pDocument->GetPath();
1410
1411 FX_INT32 i = wsFilePath.GetLength() - 1;
1412 for ( ; i >= 0; i-- )
1413 {
1414 if ( wsFilePath.GetAt( i ) == L'\\' || wsFilePath.GetAt( i ) == L'/' )
1415 break;
1416 }
1417 if ( i >= 0 && i < wsFilePath.GetLength() - 1 )
1418 {
1419 vp << ( wsFilePath.GetBuffer( wsFilePath.GetLength() ) + i + 1 );
1420 }else{
1421 vp << L"";
1422 }
1423 return TRUE;
1424 }
1425
ReversalStr(CFX_WideString cbFrom)1426 CFX_WideString Document::ReversalStr(CFX_WideString cbFrom)
1427 {
1428 wchar_t* pFrom = NULL;
1429 int iLenth = cbFrom.GetLength();
1430 wchar_t* pResult = (wchar_t*)malloc((iLenth+1) * sizeof(wchar_t));
1431 memset(pResult, 0, (iLenth+1));
1432 pFrom = (wchar_t*)cbFrom.GetBuffer(iLenth);
1433
1434 for (int i = 0; i < iLenth; i++)
1435 {
1436 pResult[i] = *(pFrom + iLenth - i - 1);
1437 }
1438
1439 cbFrom.ReleaseBuffer();
1440 CFX_WideString cbRet = CFX_WideString(pResult);
1441 free(pResult);
1442 pResult = NULL;
1443 return cbRet;
1444 }
1445
CutString(CFX_WideString cbFrom)1446 CFX_WideString Document::CutString(CFX_WideString cbFrom)
1447 {
1448 wchar_t* pFrom = NULL;
1449 int iLenth = cbFrom.GetLength();
1450 wchar_t* pResult = (wchar_t*)malloc((iLenth+1) * sizeof(wchar_t));
1451 memset(pResult, 0, (iLenth+1));
1452 pFrom = (wchar_t*)cbFrom.GetBuffer(iLenth);
1453
1454 for (int i = 0; i < iLenth; i++)
1455 {
1456 if (pFrom[i] == L'\\' || pFrom[i] == L'/')
1457 break;
1458 pResult[i] = pFrom[i];
1459 }
1460
1461 cbFrom.ReleaseBuffer();
1462 CFX_WideString cbRet = CFX_WideString(pResult);
1463 free(pResult);
1464 pResult = NULL;
1465 return cbRet;
1466 }
1467
path(OBJ_PROP_PARAMS)1468 FX_BOOL Document::path(OBJ_PROP_PARAMS)
1469 {
1470 if (!vp.IsGetting()) return FALSE;
1471
1472 vp << app::SysPathToPDFPath(m_pDocument->GetPath());
1473
1474 return TRUE;
1475 }
1476
pageWindowRect(OBJ_PROP_PARAMS)1477 FX_BOOL Document::pageWindowRect(OBJ_PROP_PARAMS)
1478 {
1479 return TRUE;
1480 }
1481
layout(OBJ_PROP_PARAMS)1482 FX_BOOL Document::layout(OBJ_PROP_PARAMS)
1483 {
1484 return TRUE;
1485 }
1486
addLink(OBJ_METHOD_PARAMS)1487 FX_BOOL Document::addLink(OBJ_METHOD_PARAMS)
1488 {
1489 return TRUE;
1490 }
1491
closeDoc(OBJ_METHOD_PARAMS)1492 FX_BOOL Document::closeDoc(OBJ_METHOD_PARAMS)
1493 {
1494 ASSERT(m_pDocument != NULL);
1495
1496
1497
1498
1499
1500 return TRUE;
1501 }
1502
getPageBox(OBJ_METHOD_PARAMS)1503 FX_BOOL Document::getPageBox(OBJ_METHOD_PARAMS)
1504 {
1505 return TRUE;
1506 }
1507
1508
getAnnot(OBJ_METHOD_PARAMS)1509 FX_BOOL Document::getAnnot(OBJ_METHOD_PARAMS)
1510 {
1511 return TRUE;
1512 }
1513
getAnnots(OBJ_METHOD_PARAMS)1514 FX_BOOL Document::getAnnots(OBJ_METHOD_PARAMS)
1515 {
1516 vRet.SetNull();
1517 return TRUE;
1518 }
1519
getAnnot3D(OBJ_METHOD_PARAMS)1520 FX_BOOL Document::getAnnot3D(OBJ_METHOD_PARAMS)
1521 {
1522 vRet.SetNull();
1523 return TRUE;
1524 }
1525
getAnnots3D(OBJ_METHOD_PARAMS)1526 FX_BOOL Document::getAnnots3D(OBJ_METHOD_PARAMS)
1527 {
1528 vRet = VT_undefined;
1529 return TRUE;
1530 }
1531
getOCGs(OBJ_METHOD_PARAMS)1532 FX_BOOL Document::getOCGs(OBJ_METHOD_PARAMS)
1533 {
1534 return TRUE;
1535 }
1536
getLinks(OBJ_METHOD_PARAMS)1537 FX_BOOL Document::getLinks(OBJ_METHOD_PARAMS)
1538 {
1539 return TRUE;
1540 }
1541
IsEnclosedInRect(CFX_FloatRect rect,CFX_FloatRect LinkRect)1542 bool Document::IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect)
1543 {
1544 if (rect.left <= LinkRect.left
1545 && rect.top <= LinkRect.top
1546 && rect.right >= LinkRect.right
1547 && rect.bottom >= LinkRect.bottom)
1548 return true;
1549 else
1550 return false;
1551 }
1552
InsertIconElement(IconElement * pNewIcon)1553 void IconTree::InsertIconElement(IconElement* pNewIcon)
1554 {
1555 if (!pNewIcon)return;
1556
1557 if (m_pHead == NULL && m_pEnd == NULL)
1558 {
1559 m_pHead = m_pEnd = pNewIcon;
1560 m_iLength++;
1561 }
1562 else
1563 {
1564 m_pEnd->NextIcon = pNewIcon;
1565 m_pEnd = pNewIcon;
1566 m_iLength++;
1567 }
1568 }
1569
DeleteIconTree()1570 void IconTree::DeleteIconTree()
1571 {
1572 if (!m_pHead || !m_pEnd)return;
1573
1574 IconElement* pTemp = NULL;
1575 while(m_pEnd != m_pHead)
1576 {
1577 pTemp = m_pHead;
1578 m_pHead = m_pHead->NextIcon;
1579 delete pTemp;
1580 }
1581
1582 delete m_pEnd;
1583 m_pHead = NULL;
1584 m_pEnd = NULL;
1585 }
1586
GetLength()1587 int IconTree::GetLength()
1588 {
1589 return m_iLength;
1590 }
1591
operator [](int iIndex)1592 IconElement* IconTree::operator [](int iIndex)
1593 {
1594 if (iIndex >= 0 && iIndex <= m_iLength)
1595 {
1596 IconElement* pTemp = m_pHead;
1597 for (int i = 0; i < iIndex; i++)
1598 {
1599 pTemp = pTemp->NextIcon;
1600 }
1601 return pTemp;
1602 }
1603 else
1604 return NULL;
1605 }
1606
DeleteIconElement(CFX_WideString swIconName)1607 void IconTree::DeleteIconElement(CFX_WideString swIconName)
1608 {
1609 IconElement* pTemp = m_pHead;
1610 int iLoopCount = m_iLength;
1611 for (int i = 0; i < iLoopCount - 1; i++)
1612 {
1613 if (pTemp == m_pEnd)
1614 break;
1615
1616 if (m_pHead->IconName == swIconName)
1617 {
1618 m_pHead = m_pHead->NextIcon;
1619 delete pTemp;
1620 m_iLength--;
1621 pTemp = m_pHead;
1622 }
1623 if (pTemp->NextIcon->IconName == swIconName)
1624 {
1625 if (pTemp->NextIcon == m_pEnd)
1626 {
1627 m_pEnd = pTemp;
1628 delete pTemp->NextIcon;
1629 m_iLength--;
1630 pTemp->NextIcon = NULL;
1631 }
1632 else
1633 {
1634 IconElement* pElement = pTemp->NextIcon;
1635 pTemp->NextIcon = pTemp->NextIcon->NextIcon;
1636 delete pElement;
1637 m_iLength--;
1638 pElement = NULL;
1639 }
1640
1641 continue;
1642 }
1643
1644 pTemp = pTemp->NextIcon;
1645 }
1646 }
1647
addIcon(OBJ_METHOD_PARAMS)1648 FX_BOOL Document::addIcon(OBJ_METHOD_PARAMS)
1649 {
1650 if (params.size() != 2)return FALSE;
1651
1652 CJS_Context* pContext = (CJS_Context*)cc;
1653 ASSERT(pContext != NULL);
1654 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
1655 ASSERT(pRuntime != NULL);
1656
1657 CFX_WideString swIconName = params[0].operator CFX_WideString();
1658
1659 JSFXObject pJSIcon = (JSFXObject)params[1];
1660 if (JS_GetObjDefnID(pJSIcon) != JS_GetObjDefnID(*pRuntime, L"Icon")) return FALSE;
1661
1662 CJS_EmbedObj* pEmbedObj = ((CJS_Object*)params[1])->GetEmbedObject();
1663 if (!pEmbedObj)return FALSE;
1664 Icon* pIcon = (Icon*)pEmbedObj;
1665
1666 if (!m_pIconTree)
1667 m_pIconTree = new IconTree();
1668
1669 IconElement* pNewIcon = new IconElement();
1670 pNewIcon->IconName = swIconName;
1671 pNewIcon->NextIcon = NULL;
1672 pNewIcon->IconStream = pIcon;
1673 m_pIconTree->InsertIconElement(pNewIcon);
1674 return TRUE;
1675 }
1676
icons(OBJ_PROP_PARAMS)1677 FX_BOOL Document::icons(OBJ_PROP_PARAMS)
1678 {
1679 if (vp.IsSetting())
1680 return FALSE;
1681
1682 if (!m_pIconTree)
1683 {
1684 vp.SetNull();
1685 return TRUE;
1686 }
1687
1688 CJS_Array Icons(m_isolate);
1689 IconElement* pIconElement = NULL;
1690 int iIconTreeLength = m_pIconTree->GetLength();
1691
1692 CJS_Context* pContext = (CJS_Context *)cc;
1693 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
1694
1695 for (int i = 0; i < iIconTreeLength; i++)
1696 {
1697 pIconElement = (*m_pIconTree)[i];
1698
1699 JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
1700 if (pObj.IsEmpty()) return FALSE;
1701
1702 CJS_Icon * pJS_Icon = (CJS_Icon *)JS_GetPrivate(pObj);
1703 if (!pJS_Icon) return FALSE;
1704
1705 Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
1706 if (!pIcon)return FALSE;
1707
1708 pIcon->SetStream(pIconElement->IconStream->GetStream());
1709 pIcon->SetIconName(pIconElement->IconName);
1710 Icons.SetElement(i, CJS_Value(m_isolate,pJS_Icon));
1711 }
1712
1713 vp << Icons;
1714 return TRUE;
1715 }
1716
getIcon(OBJ_METHOD_PARAMS)1717 FX_BOOL Document::getIcon(OBJ_METHOD_PARAMS)
1718 {
1719 if (params.size() != 1)return FALSE;
1720 if(!m_pIconTree)
1721 return FALSE;
1722 CFX_WideString swIconName = params[0].operator CFX_WideString();
1723 int iIconCounts = m_pIconTree->GetLength();
1724
1725 CJS_Context* pContext = (CJS_Context *)cc;
1726 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
1727
1728 for (int i = 0; i < iIconCounts; i++)
1729 {
1730 if ((*m_pIconTree)[i]->IconName == swIconName)
1731 {
1732 Icon* pRetIcon = (*m_pIconTree)[i]->IconStream;
1733
1734 JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
1735 if (pObj.IsEmpty()) return FALSE;
1736
1737 CJS_Icon * pJS_Icon = (CJS_Icon *)JS_GetPrivate(pObj);
1738 if (!pJS_Icon) return FALSE;
1739
1740 Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
1741 if (!pIcon)return FALSE;
1742
1743 pIcon->SetIconName(swIconName);
1744 pIcon->SetStream(pRetIcon->GetStream());
1745 vRet = pJS_Icon;
1746 return TRUE;
1747 }
1748 }
1749
1750 return FALSE;
1751 }
1752
removeIcon(OBJ_METHOD_PARAMS)1753 FX_BOOL Document::removeIcon(OBJ_METHOD_PARAMS)
1754 {
1755 if (params.size() != 1)return FALSE;
1756 if(!m_pIconTree)
1757 return FALSE;
1758 CFX_WideString swIconName = params[0].operator CFX_WideString();
1759 #ifndef FOXIT_CHROME_BUILD
1760 m_pIconTree->DeleteIconElement(swIconName);
1761 #endif
1762 return TRUE;
1763 }
1764
createDataObject(OBJ_METHOD_PARAMS)1765 FX_BOOL Document::createDataObject(OBJ_METHOD_PARAMS)
1766 {
1767 if (IsSafeMode(cc)) return TRUE;
1768 ASSERT(m_pDocument != NULL);
1769
1770 CFX_WideString swName = L"";
1771 CFX_ByteString sbName = "";
1772 CFX_WideString swValue = L"";
1773 CFX_WideString swMIMEType = L"";
1774 CFX_WideString swCryptFilter = L"";
1775 CFX_ByteString sbFileValue = "";
1776
1777 int iParamSize = params.size();
1778 for (int i = 0; i < iParamSize; i++)
1779 {
1780 if (i == 0)
1781 swName = params[0];
1782 if (i == 1)
1783 swValue = params[1];
1784 if (i == 2)
1785 swMIMEType = params[2];
1786 if (i == 3)
1787 swCryptFilter = params[4];
1788 }
1789
1790 FILE* pFile = NULL;
1791
1792 //CFileStatus fileStatus;
1793 const int BUFSIZE = 17;
1794 FX_BYTE buf[BUFSIZE];
1795 FX_BYTE *pBuffer = NULL;
1796 char* pBuf = NULL;
1797 int nFileSize = 0;
1798 sbFileValue = CFX_ByteString::FromUnicode(swValue);
1799 sbName = CFX_ByteString::FromUnicode(swName);
1800 int iBufLength = sbFileValue.GetLength();
1801 pBuf = (char*)malloc(sizeof(char) * iBufLength);
1802 pBuf = sbFileValue.GetBuffer(iBufLength);
1803
1804 if ( NULL == (pFile = FXSYS_fopen( sbName.GetBuffer(sbName.GetLength()), "wb+" )) )
1805 {
1806 return FALSE;
1807 }
1808
1809 fwrite( pBuf, sizeof(char), iBufLength, pFile );
1810 fclose( pFile );
1811 pFile = NULL;
1812
1813 pFile = FXSYS_fopen( sbName.GetBuffer(sbName.GetLength()), "rb+" );
1814 fseek( pFile, 0, SEEK_END );
1815 nFileSize = ftell( pFile );
1816
1817 pBuffer = new FX_BYTE[nFileSize];
1818 fseek( pFile, 0, SEEK_SET );
1819 size_t s = fread( pBuffer, sizeof(char), nFileSize, pFile );
1820 if(s == 0)
1821 {
1822 delete[] pBuffer;
1823 return FALSE;
1824 }
1825
1826 CRYPT_MD5Generate(pBuffer, nFileSize, buf);
1827 buf[BUFSIZE - 1] = 0;
1828 CFX_WideString csCheckSum((FX_LPCWSTR)buf, 16);
1829 delete[] pBuffer;
1830
1831 return TRUE;
1832 }
1833
media(OBJ_PROP_PARAMS)1834 FX_BOOL Document::media(OBJ_PROP_PARAMS)
1835 {
1836 return TRUE;
1837 }
1838
calculateNow(OBJ_METHOD_PARAMS)1839 FX_BOOL Document::calculateNow(OBJ_METHOD_PARAMS)
1840 {
1841 ASSERT(m_pDocument != NULL);
1842
1843 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
1844 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
1845 m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
1846
1847 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
1848 ASSERT(pInterForm != NULL);
1849 pInterForm->OnCalculate();
1850 return TRUE;
1851 }
1852
Collab(OBJ_PROP_PARAMS)1853 FX_BOOL Document::Collab(OBJ_PROP_PARAMS)
1854 {
1855 return TRUE;
1856 }
1857
getPageNthWord(OBJ_METHOD_PARAMS)1858 FX_BOOL Document::getPageNthWord(OBJ_METHOD_PARAMS)
1859 {
1860 //if (IsSafeMode(cc)) return TRUE;
1861
1862 ASSERT(m_pDocument != NULL);
1863
1864 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
1865
1866 int nPageNo = params.GetSize() > 0 ? (int)params[0] : 0;
1867 int nWordNo = params.GetSize() > 1 ? (int)params[1] : 0;
1868 bool bStrip = params.GetSize() > 2 ? (bool)params[2] : true;
1869
1870 CPDF_Document* pDocument = m_pDocument->GetDocument();
1871 if (!pDocument) return FALSE;
1872
1873 if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())
1874 {
1875 //sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
1876 return FALSE;
1877 }
1878
1879 CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
1880 if (!pPageDict) return FALSE;
1881
1882 CPDF_Page page;
1883 page.Load(pDocument, pPageDict);
1884 page.StartParse();
1885 page.ParseContent();
1886
1887 FX_POSITION pos = page.GetFirstObjectPosition();
1888
1889 int nWords = 0;
1890
1891 CFX_WideString swRet;
1892
1893 while (pos)
1894 {
1895 if (CPDF_PageObject* pPageObj = page.GetNextObject(pos))
1896 {
1897 if (pPageObj->m_Type == PDFPAGE_TEXT)
1898 {
1899 int nObjWords = CountWords((CPDF_TextObject*)pPageObj);
1900
1901 if (nWords + nObjWords >= nWordNo)
1902 {
1903 swRet = GetObjWordStr((CPDF_TextObject*)pPageObj, nWordNo - nWords);
1904 break;
1905 }
1906
1907 nWords += nObjWords;
1908 }
1909 }
1910 }
1911
1912 if (bStrip)
1913 {
1914 swRet.TrimLeft();
1915 swRet.TrimRight();
1916 }
1917
1918 vRet = swRet;
1919 return TRUE;
1920 }
1921
getPageNthWordQuads(OBJ_METHOD_PARAMS)1922 FX_BOOL Document::getPageNthWordQuads(OBJ_METHOD_PARAMS)
1923 {
1924 //if (IsSafeMode(cc)) return TRUE;
1925
1926 ASSERT(m_pDocument != NULL);
1927
1928 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
1929
1930 return FALSE;
1931 }
1932
getPageNumWords(OBJ_METHOD_PARAMS)1933 FX_BOOL Document::getPageNumWords(OBJ_METHOD_PARAMS)
1934 {
1935 ASSERT(m_pDocument != NULL);
1936
1937 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
1938
1939 int nPageNo = params.GetSize() > 0 ? (int)params[0] : 0;
1940
1941 CPDF_Document* pDocument = m_pDocument->GetDocument();
1942 ASSERT(pDocument != NULL);
1943
1944 if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())
1945 {
1946 //sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
1947 return FALSE;
1948 }
1949
1950 CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
1951 if (!pPageDict) return FALSE;
1952
1953 CPDF_Page page;
1954 page.Load(pDocument, pPageDict);
1955 page.StartParse();
1956 page.ParseContent();
1957
1958 FX_POSITION pos = page.GetFirstObjectPosition();
1959
1960 int nWords = 0;
1961
1962 while (pos)
1963 {
1964 if (CPDF_PageObject* pPageObj = page.GetNextObject(pos))
1965 {
1966 if (pPageObj->m_Type == PDFPAGE_TEXT)
1967 {
1968 CPDF_TextObject* pTextObj = (CPDF_TextObject*)pPageObj;
1969 nWords += CountWords(pTextObj);
1970 }
1971 }
1972 }
1973
1974 vRet = nWords;
1975
1976 return TRUE;
1977 }
1978
getPrintParams(OBJ_METHOD_PARAMS)1979 FX_BOOL Document::getPrintParams(OBJ_METHOD_PARAMS)
1980 {
1981 CJS_Context* pContext = (CJS_Context*)cc;
1982 ASSERT(pContext != NULL);
1983 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
1984 ASSERT(pRuntime != NULL);
1985 JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"PrintParamsObj"));
1986 //not implemented yet.
1987 vRet = pRetObj;
1988
1989 return TRUE;
1990 }
1991
1992 #define ISLATINWORD(u) (u != 0x20 && u <= 0x28FF)
1993
CountWords(CPDF_TextObject * pTextObj)1994 int Document::CountWords(CPDF_TextObject* pTextObj)
1995 {
1996 if (!pTextObj) return 0;
1997
1998 int nWords = 0;
1999
2000 CPDF_Font* pFont = pTextObj->GetFont();
2001 if (!pFont) return 0;
2002
2003 FX_BOOL bIsLatin = FALSE;
2004
2005 for (int i=0, sz=pTextObj->CountChars(); i<sz; i++)
2006 {
2007 FX_DWORD charcode = -1;
2008 FX_FLOAT kerning;
2009
2010 pTextObj->GetCharInfo(i, charcode, kerning);
2011 CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
2012
2013 FX_WORD unicode = 0;
2014 if (swUnicode.GetLength() > 0)
2015 unicode = swUnicode[0];
2016
2017 if (ISLATINWORD(unicode) && bIsLatin)
2018 continue;
2019
2020 bIsLatin = ISLATINWORD(unicode);
2021 if (unicode != 0x20)
2022 nWords++;
2023 }
2024
2025 return nWords;
2026 }
2027
GetObjWordStr(CPDF_TextObject * pTextObj,int nWordIndex)2028 CFX_WideString Document::GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex)
2029 {
2030 ASSERT(pTextObj != NULL);
2031
2032 CFX_WideString swRet;
2033
2034 CPDF_Font* pFont = pTextObj->GetFont();
2035 if (!pFont) return L"";
2036
2037 int nWords = 0;
2038 FX_BOOL bIsLatin = FALSE;
2039
2040 for (int i=0, sz=pTextObj->CountChars(); i<sz; i++)
2041 {
2042 FX_DWORD charcode = -1;
2043 FX_FLOAT kerning;
2044
2045 pTextObj->GetCharInfo(i, charcode, kerning);
2046 CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
2047
2048 FX_WORD unicode = 0;
2049 if (swUnicode.GetLength() > 0)
2050 unicode = swUnicode[0];
2051
2052 if (ISLATINWORD(unicode) && bIsLatin)
2053 {
2054 }
2055 else
2056 {
2057 bIsLatin = ISLATINWORD(unicode);
2058 if (unicode != 0x20)
2059 nWords++;
2060 }
2061
2062 if (nWords-1 == nWordIndex)
2063 swRet += unicode;
2064 }
2065
2066 return swRet;
2067 }
2068
zoom(OBJ_PROP_PARAMS)2069 FX_BOOL Document::zoom(OBJ_PROP_PARAMS)
2070 {
2071
2072 return TRUE;
2073 }
2074
2075 /**
2076 (none, NoVary)
2077 (fitP, FitPage)
2078 (fitW, FitWidth)
2079 (fitH, FitHeight)
2080 (fitV, FitVisibleWidth)
2081 (pref, Preferred)
2082 (refW, ReflowWidth)
2083 */
2084
zoomType(OBJ_PROP_PARAMS)2085 FX_BOOL Document::zoomType(OBJ_PROP_PARAMS)
2086 {
2087 return TRUE;
2088 }
2089
deletePages(OBJ_METHOD_PARAMS)2090 FX_BOOL Document::deletePages(OBJ_METHOD_PARAMS)
2091 {
2092
2093
2094
2095
2096
2097
2098 v8::Isolate* isolate = GetIsolate(cc);
2099 // if (pEnv->GetAppName().Compare(PHANTOM) != 0)
2100 // return TRUE;
2101
2102 //if (IsSafeMode(cc)) return TRUE;
2103
2104 ASSERT(m_pDocument != NULL);
2105
2106 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
2107 m_pDocument->GetPermissions(FPDFPERM_ASSEMBLE))) return FALSE;
2108
2109 int iSize = params.size();
2110
2111 int nStart = 0;
2112 int nEnd = 0;
2113
2114 if (iSize < 1)
2115 {
2116 }
2117 else if (iSize == 1)
2118 {
2119 if (params[0].GetType() == VT_object)
2120 {
2121 JSObject pObj = (JSObject )params[0];
2122 v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
2123 nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
2124
2125 pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
2126 nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
2127 }
2128 else
2129 {
2130 nStart = (int)params[0];
2131 }
2132 }
2133 else
2134 {
2135 nStart = (int)params[0];
2136 nEnd = (int)params[1];
2137 }
2138
2139 int nTotal = m_pDocument->GetPageCount();
2140
2141 if (nStart < 0) nStart = 0;
2142 if (nStart >= nTotal) nStart = nTotal - 1;
2143
2144 if (nEnd < 0) nEnd = 0;
2145 if (nEnd >= nTotal) nEnd = nTotal - 1;
2146
2147 if (nEnd < nStart) nEnd = nStart;
2148
2149
2150
2151 #ifndef FOXIT_CHROME_BUILD
2152 return m_pDocument->DeletePages(nStart, nEnd - nStart + 1);
2153 #else
2154 return TRUE;
2155 #endif
2156 }
2157
extractPages(OBJ_METHOD_PARAMS)2158 FX_BOOL Document::extractPages(OBJ_METHOD_PARAMS)
2159 {
2160
2161
2162
2163
2164
2165
2166 v8::Isolate* isolate = GetIsolate(cc);
2167
2168 if (IsSafeMode(cc)) return TRUE;
2169
2170 ASSERT(m_pDocument != NULL);
2171
2172 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT)) return FALSE;
2173
2174 int iSize = params.size();
2175
2176 int nTotal = m_pDocument->GetPageCount();
2177 int nStart = 0;
2178 int nEnd = nTotal - 1;
2179
2180 CFX_WideString swFilePath;
2181
2182 if (iSize < 1)
2183 {
2184 }
2185 else if (iSize == 1)
2186 {
2187 if (params[0].GetType() == VT_object)
2188 {
2189 JSObject pObj = (JSObject )params[0];
2190 v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
2191 nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
2192
2193 pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
2194 nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
2195
2196 pValue = JS_GetObjectElement(isolate,pObj, L"cPath");
2197 swFilePath = CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
2198 }
2199 else
2200 {
2201 nStart = (int)params[0];
2202 }
2203 }
2204 else if (iSize == 2)
2205 {
2206 nStart = (int)params[0];
2207 nEnd = (int)params[1];
2208 }
2209 else
2210 {
2211 nStart = (int)params[0];
2212 nEnd = (int)params[1];
2213 swFilePath = params[2].operator CFX_WideString();
2214 }
2215
2216 if (nEnd < nStart)
2217 nEnd = nStart;
2218
2219 CPDF_Document *pNewDoc = new CPDF_Document;
2220 pNewDoc->CreateNewDoc();
2221
2222 CFX_WordArray array;
2223 for (int i=nStart; i<=nEnd; i++)
2224 array.Add(i);
2225
2226 // m_pDocument->ExtractPages(array, pNewDoc);
2227
2228 if (swFilePath.IsEmpty())
2229 {
2230
2231 }
2232 else
2233 {
2234 swFilePath = app::PDFPathToSysPath(swFilePath);
2235 CPDF_Creator PDFCreater(pNewDoc);
2236 PDFCreater.Create(swFilePath);
2237 delete pNewDoc;
2238 // pEnv->OpenDocument(swFilePath);
2239 vRet.SetNull();
2240 }
2241
2242 return TRUE;
2243 }
2244
insertPages(OBJ_METHOD_PARAMS)2245 FX_BOOL Document::insertPages(OBJ_METHOD_PARAMS)
2246 {
2247
2248
2249
2250
2251
2252
2253 v8::Isolate* isolate = GetIsolate(cc);
2254
2255 if (IsSafeMode(cc)) return TRUE;
2256
2257 ASSERT(m_pDocument != NULL);
2258
2259 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
2260 m_pDocument->GetPermissions(FPDFPERM_ASSEMBLE))) return FALSE;
2261
2262 int iSize = params.size();
2263
2264 int nStart = 0;
2265 int nEnd = 0;
2266 int nPage = 0;
2267
2268 CFX_WideString swFilePath;
2269
2270 if (iSize < 1)
2271 {
2272 }
2273 else if (iSize == 1)
2274 {
2275 if (params[0].GetType() == VT_object)
2276 {
2277 JSObject pObj = (JSObject )params[0];
2278
2279 v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nPage");
2280 nPage = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
2281
2282 pValue = JS_GetObjectElement(isolate,pObj, L"cPath");
2283 swFilePath = CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
2284
2285 pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
2286 nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
2287
2288 pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
2289 nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
2290 }
2291 else
2292 {
2293 nPage = (int)params[0];
2294 }
2295 }
2296 else
2297 {
2298 nPage = (int)params[0];
2299
2300 if (iSize >= 2)
2301 swFilePath = params[1].operator CFX_WideString();
2302
2303 if (iSize >= 3)
2304 nStart = (int)params[2];
2305
2306 if (iSize >= 4)
2307 nEnd = (int)params[3];
2308 }
2309
2310 nPage++;
2311
2312 if (nPage < 0)
2313 nPage = 0;
2314
2315 if (nPage > m_pDocument->GetPageCount())
2316 nPage = m_pDocument->GetPageCount();
2317
2318 if (swFilePath.IsEmpty()) return FALSE;
2319
2320 swFilePath = app::PDFPathToSysPath(swFilePath);
2321
2322 CPDF_Parser pdfParser;
2323 pdfParser.StartParse(swFilePath, FALSE);
2324 CPDF_Document* pSrcDoc = pdfParser.GetDocument();
2325
2326 if (!pSrcDoc)
2327 {
2328 pdfParser.CloseParser();
2329 return FALSE;
2330 }
2331
2332 int nTotal = pSrcDoc->GetPageCount();
2333
2334 if (nStart < 0) nStart = 0;
2335 if (nStart >= nTotal) nStart = nTotal - 1;
2336
2337 if (nEnd < 0) nEnd = 0;
2338 if (nEnd >= nTotal) nEnd = nTotal - 1;
2339
2340 if (nEnd < nStart) nEnd = nStart;
2341
2342 CFX_WordArray array;
2343 for (int i=nStart; i<=nEnd; i++)
2344 array.Add(i);
2345
2346 // m_pDocument->InsertPages(nPage, pSrcDoc, array);
2347
2348 pdfParser.CloseParser();
2349
2350 return TRUE;
2351 }
2352
replacePages(OBJ_METHOD_PARAMS)2353 FX_BOOL Document::replacePages(OBJ_METHOD_PARAMS)
2354 {
2355
2356
2357
2358
2359
2360
2361 v8::Isolate* isolate = GetIsolate(cc);
2362
2363 if (IsSafeMode(cc)) return TRUE;
2364
2365 ASSERT(m_pDocument != NULL);
2366
2367 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
2368 m_pDocument->GetPermissions(FPDFPERM_ASSEMBLE))) return FALSE;
2369
2370 int iSize = params.size();
2371
2372 int nStart = -1;
2373 int nEnd = -1;
2374 int nPage = 0;
2375
2376 CFX_WideString swFilePath;
2377
2378 if (iSize < 1)
2379 {
2380 }
2381 else if (iSize == 1)
2382 {
2383 if (params[0].GetType() == VT_object)
2384 {
2385 JSObject pObj = (JSObject )params[0];
2386
2387 v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nPage");
2388 nPage = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
2389
2390 pValue = JS_GetObjectElement(isolate,pObj, L"cPath");
2391 swFilePath = CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
2392
2393 pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
2394 nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
2395
2396 pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
2397 nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
2398 }
2399 else
2400 {
2401 nPage = (int)params[0];
2402 }
2403 }
2404 else
2405 {
2406 nPage = (int)params[0];
2407
2408 if (iSize >= 2)
2409 swFilePath = params[1].operator CFX_WideString();
2410
2411 if (iSize >= 3)
2412 nStart = (int)params[2];
2413
2414 if (iSize >= 4)
2415 nEnd = (int)params[3];
2416 }
2417
2418 if (nPage < 0)
2419 nPage = 0;
2420
2421 if (nPage >= m_pDocument->GetPageCount())
2422 nPage = m_pDocument->GetPageCount() - 1;
2423
2424 if (swFilePath.IsEmpty()) return FALSE;
2425
2426 swFilePath = app::PDFPathToSysPath(swFilePath);
2427
2428 CPDF_Parser pdfParser;
2429 pdfParser.StartParse(swFilePath, FALSE);
2430 CPDF_Document* pSrcDoc = pdfParser.GetDocument();
2431
2432 if (!pSrcDoc)
2433 {
2434 pdfParser.CloseParser();
2435 return FALSE;
2436 }
2437
2438 int nTotal = pSrcDoc->GetPageCount();
2439
2440 if (nStart < 0)
2441 {
2442 if (nEnd < 0)
2443 {
2444 nStart = 0;
2445 nEnd = nTotal - 1;
2446 }
2447 else
2448 {
2449 nStart = 0;
2450 }
2451 }
2452 else
2453 {
2454 if (nEnd < 0)
2455 {
2456 nEnd = nStart;
2457 }
2458 else
2459 {
2460 if (nStart >= nTotal) nStart = nTotal - 1;
2461 if (nEnd >= nTotal) nEnd = nTotal - 1;
2462
2463 if (nEnd < nStart) nEnd = nStart;
2464 }
2465 }
2466
2467 CFX_WordArray array;
2468 for (int i=nStart; i<=nEnd; i++)
2469 array.Add(i);
2470
2471 // m_pDocument->ReplacePages(nPage, pSrcDoc, array);
2472
2473 pdfParser.CloseParser();
2474
2475 return TRUE;
2476 }
2477
getURL(OBJ_METHOD_PARAMS)2478 FX_BOOL Document::getURL(OBJ_METHOD_PARAMS)
2479 {
2480 if (IsSafeMode(cc)) return TRUE;
2481
2482 return TRUE;
2483 }
2484
AddDelayData(CJS_DelayData * pData)2485 void Document::AddDelayData(CJS_DelayData* pData)
2486 {
2487 m_DelayData.Add(pData);
2488 }
2489
DoFieldDelay(const CFX_WideString & sFieldName,int nControlIndex)2490 void Document::DoFieldDelay(const CFX_WideString& sFieldName, int nControlIndex)
2491 {
2492 CFX_DWordArray DelArray;
2493
2494 for (int i=0,sz=m_DelayData.GetSize(); i<sz; i++)
2495 {
2496 if (CJS_DelayData* pData = m_DelayData.GetAt(i))
2497 {
2498 if (pData->sFieldName == sFieldName && pData->nControlIndex == nControlIndex)
2499 {
2500 Field::DoDelay(m_pDocument, pData);
2501 delete pData;
2502 m_DelayData.SetAt(i, NULL);
2503 DelArray.Add(i);
2504 }
2505 }
2506 }
2507
2508 for (int j=DelArray.GetSize()-1; j>=0; j--)
2509 {
2510 m_DelayData.RemoveAt(DelArray[j]);
2511 }
2512 }
2513
AddDelayAnnotData(CJS_AnnotObj * pData)2514 void Document::AddDelayAnnotData(CJS_AnnotObj *pData)
2515 {
2516 m_DelayAnnotData.Add(pData);
2517 }
2518
DoAnnotDelay()2519 void Document::DoAnnotDelay()
2520 {
2521 CFX_DWordArray DelArray;
2522
2523 for (int j=DelArray.GetSize()-1; j>=0; j--)
2524 {
2525 m_DelayData.RemoveAt(DelArray[j]);
2526 }
2527 }
2528