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 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) 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) 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 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 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. 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 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 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 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 288 FX_BOOL Document::ParserParams(JSObject* pObj,CJS_AnnotObj& annotobj) 289 { 290 return TRUE; 291 } 292 293 FX_BOOL Document::addAnnot(OBJ_METHOD_PARAMS) 294 { 295 return TRUE; 296 } 297 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 923 void Document::AttachDoc(CPDFSDK_Document *pDoc) 924 { 925 m_pDocument = pDoc; 926 } 927 928 CPDFSDK_Document * Document::GetReaderDoc() 929 { 930 return m_pDocument; 931 } 932 933 FX_BOOL Document::ExtractFileName(CPDFSDK_Document *pDoc,CFX_ByteString &strFileName) 934 { 935 return FALSE; 936 } 937 938 FX_BOOL Document::ExtractFolderName(CPDFSDK_Document *pDoc,CFX_ByteString &strFolderName) 939 { 940 return FALSE; 941 } 942 943 FX_BOOL Document::bookmarkRoot(OBJ_PROP_PARAMS) 944 { 945 return TRUE; 946 } 947 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 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 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 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 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 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 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 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 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 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 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 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 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 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 1355 FX_BOOL Document::mouseX(OBJ_PROP_PARAMS) 1356 { 1357 return TRUE; 1358 } 1359 1360 FX_BOOL Document::mouseY(OBJ_PROP_PARAMS) 1361 { 1362 return TRUE; 1363 } 1364 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 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 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 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 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 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 1477 FX_BOOL Document::pageWindowRect(OBJ_PROP_PARAMS) 1478 { 1479 return TRUE; 1480 } 1481 1482 FX_BOOL Document::layout(OBJ_PROP_PARAMS) 1483 { 1484 return TRUE; 1485 } 1486 1487 FX_BOOL Document::addLink(OBJ_METHOD_PARAMS) 1488 { 1489 return TRUE; 1490 } 1491 1492 FX_BOOL Document::closeDoc(OBJ_METHOD_PARAMS) 1493 { 1494 ASSERT(m_pDocument != NULL); 1495 1496 1497 1498 1499 1500 return TRUE; 1501 } 1502 1503 FX_BOOL Document::getPageBox(OBJ_METHOD_PARAMS) 1504 { 1505 return TRUE; 1506 } 1507 1508 1509 FX_BOOL Document::getAnnot(OBJ_METHOD_PARAMS) 1510 { 1511 return TRUE; 1512 } 1513 1514 FX_BOOL Document::getAnnots(OBJ_METHOD_PARAMS) 1515 { 1516 vRet.SetNull(); 1517 return TRUE; 1518 } 1519 1520 FX_BOOL Document::getAnnot3D(OBJ_METHOD_PARAMS) 1521 { 1522 vRet.SetNull(); 1523 return TRUE; 1524 } 1525 1526 FX_BOOL Document::getAnnots3D(OBJ_METHOD_PARAMS) 1527 { 1528 vRet = VT_undefined; 1529 return TRUE; 1530 } 1531 1532 FX_BOOL Document::getOCGs(OBJ_METHOD_PARAMS) 1533 { 1534 return TRUE; 1535 } 1536 1537 FX_BOOL Document::getLinks(OBJ_METHOD_PARAMS) 1538 { 1539 return TRUE; 1540 } 1541 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 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 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 1587 int IconTree::GetLength() 1588 { 1589 return m_iLength; 1590 } 1591 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 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 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 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 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 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 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 1834 FX_BOOL Document::media(OBJ_PROP_PARAMS) 1835 { 1836 return TRUE; 1837 } 1838 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 1853 FX_BOOL Document::Collab(OBJ_PROP_PARAMS) 1854 { 1855 return TRUE; 1856 } 1857 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 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 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 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 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 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 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 2085 FX_BOOL Document::zoomType(OBJ_PROP_PARAMS) 2086 { 2087 return TRUE; 2088 } 2089 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 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 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 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 2478 FX_BOOL Document::getURL(OBJ_METHOD_PARAMS) 2479 { 2480 if (IsSafeMode(cc)) return TRUE; 2481 2482 return TRUE; 2483 } 2484 2485 void Document::AddDelayData(CJS_DelayData* pData) 2486 { 2487 m_DelayData.Add(pData); 2488 } 2489 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 2514 void Document::AddDelayAnnotData(CJS_AnnotObj *pData) 2515 { 2516 m_DelayAnnotData.Add(pData); 2517 } 2518 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