blob: 28badc4144fa0ca9a5b31c3057d2e369090f1343 [file] [log] [blame]
dsinclaira440bb32016-09-14 07:01:54 -07001// Copyright 2016 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
dsinclairbec76922016-09-29 16:52:30 -07007#include "fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h"
dsinclaira440bb32016-09-14 07:01:54 -07008
tsepez0e606b52016-11-18 16:22:41 -08009#include <memory>
10
dsinclair488b7ad2016-10-04 11:55:50 -070011#include "core/fpdfapi/parser/cpdf_array.h"
12#include "core/fpdfapi/parser/cpdf_stream_acc.h"
13#include "core/fpdfapi/parser/cpdf_string.h"
tsepez833619b2016-12-07 09:21:17 -080014#include "core/fxcrt/cfx_retain_ptr.h"
dsinclair735606d2016-10-05 15:47:02 -070015#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
dsinclair114e46a2016-09-29 17:18:21 -070016#include "fpdfsdk/cpdfsdk_interform.h"
17#include "fpdfsdk/cpdfsdk_pageview.h"
dsinclair521b7502016-11-02 13:02:28 -070018#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
dsinclair4d29e782016-10-04 14:02:47 -070019#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h"
dsinclaira440bb32016-09-14 07:01:54 -070020#include "fpdfsdk/javascript/ijs_runtime.h"
Dan Sinclair80c48782017-03-23 12:11:20 -040021#include "xfa/fxfa/cxfa_ffdocview.h"
22#include "xfa/fxfa/cxfa_ffwidget.h"
23#include "xfa/fxfa/cxfa_ffwidgethandler.h"
24#include "xfa/fxfa/cxfa_widgetacciterator.h"
dsinclaira440bb32016-09-14 07:01:54 -070025
26#define IDS_XFA_Validate_Input \
27 "At least one required field was empty. Please fill in the required " \
28 "fields\r\n(highlighted) before continuing."
29
30// submit
31#define FXFA_CONFIG 0x00000001
32#define FXFA_TEMPLATE 0x00000010
33#define FXFA_LOCALESET 0x00000100
34#define FXFA_DATASETS 0x00001000
35#define FXFA_XMPMETA 0x00010000
36#define FXFA_XFDF 0x00100000
37#define FXFA_FORM 0x01000000
38#define FXFA_PDF 0x10000000
39#define FXFA_XFA_ALL 0x01111111
40
dsinclair521b7502016-11-02 13:02:28 -070041CPDFXFA_DocEnvironment::CPDFXFA_DocEnvironment(CPDFXFA_Context* pContext)
Tom Sepez7dc9fe52017-05-18 09:51:57 -070042 : m_pContext(pContext) {
dsinclair521b7502016-11-02 13:02:28 -070043 ASSERT(m_pContext);
dsinclaira440bb32016-09-14 07:01:54 -070044}
45
Tom Sepez7dc9fe52017-05-18 09:51:57 -070046CPDFXFA_DocEnvironment::~CPDFXFA_DocEnvironment() {}
dsinclaira440bb32016-09-14 07:01:54 -070047
48void CPDFXFA_DocEnvironment::SetChangeMark(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -070049 if (hDoc == m_pContext->GetXFADoc() && m_pContext->GetFormFillEnv())
50 m_pContext->GetFormFillEnv()->SetChangeMark();
dsinclaira440bb32016-09-14 07:01:54 -070051}
52
53void CPDFXFA_DocEnvironment::InvalidateRect(CXFA_FFPageView* pPageView,
Dan Sinclaire3978d02017-03-23 09:12:10 -040054 const CFX_RectF& rt) {
dsinclair521b7502016-11-02 13:02:28 -070055 if (!m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -070056 return;
57
Dan Sinclaircdba7472017-03-23 09:17:10 -040058 if (m_pContext->GetDocType() != XFA_DocType::Dynamic)
dsinclaira440bb32016-09-14 07:01:54 -070059 return;
60
Tom Sepez9792f162017-05-16 14:11:30 -070061 CFX_RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pPageView);
dsinclaira440bb32016-09-14 07:01:54 -070062 if (!pPage)
63 return;
64
dsinclair521b7502016-11-02 13:02:28 -070065 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -070066 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -070067 return;
68
Lei Zhang671630e2017-05-19 19:25:16 -070069 pFormFillEnv->Invalidate(pPage.Get(),
Dan Sinclair6eec1c42017-02-21 17:20:43 -050070 CFX_FloatRect::FromCFXRectF(rt).ToFxRect());
dsinclaira440bb32016-09-14 07:01:54 -070071}
72
73void CPDFXFA_DocEnvironment::DisplayCaret(CXFA_FFWidget* hWidget,
tsepez4cf55152016-11-02 14:37:54 -070074 bool bVisible,
dsinclaira440bb32016-09-14 07:01:54 -070075 const CFX_RectF* pRtAnchor) {
dsinclair521b7502016-11-02 13:02:28 -070076 if (!hWidget || !pRtAnchor || !m_pContext->GetXFADoc() ||
77 !m_pContext->GetFormFillEnv() || !m_pContext->GetXFADocView())
dsinclaira440bb32016-09-14 07:01:54 -070078 return;
79
Dan Sinclaircdba7472017-03-23 09:17:10 -040080 if (m_pContext->GetDocType() != XFA_DocType::Dynamic)
dsinclaira440bb32016-09-14 07:01:54 -070081 return;
82
83 CXFA_FFWidgetHandler* pWidgetHandler =
dsinclair521b7502016-11-02 13:02:28 -070084 m_pContext->GetXFADocView()->GetWidgetHandler();
dsinclaira440bb32016-09-14 07:01:54 -070085 if (!pWidgetHandler)
86 return;
87
88 CXFA_FFPageView* pPageView = hWidget->GetPageView();
89 if (!pPageView)
90 return;
91
Tom Sepez9792f162017-05-16 14:11:30 -070092 CFX_RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pPageView);
dsinclaira440bb32016-09-14 07:01:54 -070093 if (!pPage)
94 return;
95
dsinclair521b7502016-11-02 13:02:28 -070096 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -070097 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -070098 return;
99
100 CFX_FloatRect rcCaret = CFX_FloatRect::FromCFXRectF(*pRtAnchor);
Lei Zhang671630e2017-05-19 19:25:16 -0700101 pFormFillEnv->DisplayCaret(pPage.Get(), bVisible, rcCaret.left, rcCaret.top,
102 rcCaret.right, rcCaret.bottom);
dsinclaira440bb32016-09-14 07:01:54 -0700103}
104
tsepez4cf55152016-11-02 14:37:54 -0700105bool CPDFXFA_DocEnvironment::GetPopupPos(CXFA_FFWidget* hWidget,
Dan Sinclair05df0752017-03-14 14:43:42 -0400106 float fMinPopup,
107 float fMaxPopup,
tsepez4cf55152016-11-02 14:37:54 -0700108 const CFX_RectF& rtAnchor,
109 CFX_RectF& rtPopup) {
dsinclaira440bb32016-09-14 07:01:54 -0700110 if (!hWidget)
tsepez4cf55152016-11-02 14:37:54 -0700111 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700112
113 CXFA_FFPageView* pXFAPageView = hWidget->GetPageView();
114 if (!pXFAPageView)
tsepez4cf55152016-11-02 14:37:54 -0700115 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700116
Tom Sepez9792f162017-05-16 14:11:30 -0700117 CFX_RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pXFAPageView);
dsinclaira440bb32016-09-14 07:01:54 -0700118 if (!pPage)
tsepez4cf55152016-11-02 14:37:54 -0700119 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700120
dsinclair521b7502016-11-02 13:02:28 -0700121 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700122 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700123 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700124
125 FS_RECTF pageViewRect = {0.0f, 0.0f, 0.0f, 0.0f};
Tom Sepez9792f162017-05-16 14:11:30 -0700126 pFormFillEnv->GetPageViewRect(pPage.Get(), pageViewRect);
dsinclaira440bb32016-09-14 07:01:54 -0700127
128 int t1;
129 int t2;
130 CFX_FloatRect rcAnchor = CFX_FloatRect::FromCFXRectF(rtAnchor);
Tom Sepez9792f162017-05-16 14:11:30 -0700131 int nRotate = hWidget->GetDataAcc()->GetRotate();
dsinclaira440bb32016-09-14 07:01:54 -0700132 switch (nRotate) {
133 case 90: {
134 t1 = (int)(pageViewRect.right - rcAnchor.right);
135 t2 = (int)(rcAnchor.left - pageViewRect.left);
136 if (rcAnchor.bottom < pageViewRect.bottom)
137 rtPopup.left += rcAnchor.bottom - pageViewRect.bottom;
138 break;
139 }
140 case 180: {
141 t2 = (int)(pageViewRect.top - rcAnchor.top);
142 t1 = (int)(rcAnchor.bottom - pageViewRect.bottom);
143 if (rcAnchor.left < pageViewRect.left)
144 rtPopup.left += rcAnchor.left - pageViewRect.left;
145 break;
146 }
147 case 270: {
148 t1 = (int)(rcAnchor.left - pageViewRect.left);
149 t2 = (int)(pageViewRect.right - rcAnchor.right);
150 if (rcAnchor.top > pageViewRect.top)
151 rtPopup.left -= rcAnchor.top - pageViewRect.top;
152 break;
153 }
154 case 0:
155 default: {
156 t1 = (int)(pageViewRect.top - rcAnchor.top);
157 t2 = (int)(rcAnchor.bottom - pageViewRect.bottom);
158 if (rcAnchor.right > pageViewRect.right)
159 rtPopup.left -= rcAnchor.right - pageViewRect.right;
160 break;
161 }
162 }
163
164 int t;
165 uint32_t dwPos;
166 if (t1 <= 0 && t2 <= 0)
tsepez4cf55152016-11-02 14:37:54 -0700167 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700168 if (t1 <= 0) {
169 t = t2;
170 dwPos = 1;
171 } else if (t2 <= 0) {
172 t = t1;
173 dwPos = 0;
174 } else if (t1 > t2) {
175 t = t1;
176 dwPos = 0;
177 } else {
178 t = t2;
179 dwPos = 1;
180 }
181
Dan Sinclair05df0752017-03-14 14:43:42 -0400182 float fPopupHeight;
dsinclaira440bb32016-09-14 07:01:54 -0700183 if (t < fMinPopup)
184 fPopupHeight = fMinPopup;
185 else if (t > fMaxPopup)
186 fPopupHeight = fMaxPopup;
187 else
Dan Sinclair05df0752017-03-14 14:43:42 -0400188 fPopupHeight = static_cast<float>(t);
dsinclaira440bb32016-09-14 07:01:54 -0700189
190 switch (nRotate) {
191 case 0:
192 case 180: {
193 if (dwPos == 0) {
194 rtPopup.top = rtAnchor.height;
195 rtPopup.height = fPopupHeight;
196 } else {
197 rtPopup.top = -fPopupHeight;
198 rtPopup.height = fPopupHeight;
199 }
200 break;
201 }
202 case 90:
203 case 270: {
204 if (dwPos == 0) {
205 rtPopup.top = rtAnchor.width;
206 rtPopup.height = fPopupHeight;
207 } else {
208 rtPopup.top = -fPopupHeight;
209 rtPopup.height = fPopupHeight;
210 }
211 break;
212 }
213 default:
214 break;
215 }
216
tsepez4cf55152016-11-02 14:37:54 -0700217 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700218}
219
tsepez4cf55152016-11-02 14:37:54 -0700220bool CPDFXFA_DocEnvironment::PopupMenu(CXFA_FFWidget* hWidget,
221 CFX_PointF ptPopup) {
dsinclaira440bb32016-09-14 07:01:54 -0700222 if (!hWidget)
tsepez4cf55152016-11-02 14:37:54 -0700223 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700224
225 CXFA_FFPageView* pXFAPageView = hWidget->GetPageView();
226 if (!pXFAPageView)
tsepez4cf55152016-11-02 14:37:54 -0700227 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700228
Tom Sepez9792f162017-05-16 14:11:30 -0700229 CFX_RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pXFAPageView);
dsinclaira440bb32016-09-14 07:01:54 -0700230 if (!pPage)
tsepez4cf55152016-11-02 14:37:54 -0700231 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700232
dsinclair521b7502016-11-02 13:02:28 -0700233 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700234 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700235 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700236
237 int menuFlag = 0;
238 if (hWidget->CanUndo())
239 menuFlag |= FXFA_MENU_UNDO;
240 if (hWidget->CanRedo())
241 menuFlag |= FXFA_MENU_REDO;
242 if (hWidget->CanPaste())
243 menuFlag |= FXFA_MENU_PASTE;
244 if (hWidget->CanCopy())
245 menuFlag |= FXFA_MENU_COPY;
246 if (hWidget->CanCut())
247 menuFlag |= FXFA_MENU_CUT;
248 if (hWidget->CanSelectAll())
249 menuFlag |= FXFA_MENU_SELECTALL;
250
Tom Sepez9792f162017-05-16 14:11:30 -0700251 return pFormFillEnv->PopupMenu(pPage.Get(), hWidget, menuFlag, ptPopup);
dsinclaira440bb32016-09-14 07:01:54 -0700252}
253
254void CPDFXFA_DocEnvironment::PageViewEvent(CXFA_FFPageView* pPageView,
255 uint32_t dwFlags) {
dsinclair521b7502016-11-02 13:02:28 -0700256 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700257 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -0700258 return;
259
dsinclair521b7502016-11-02 13:02:28 -0700260 if (m_pContext->GetLoadStatus() == FXFA_LOADSTATUS_LOADING ||
261 m_pContext->GetLoadStatus() == FXFA_LOADSTATUS_CLOSING ||
dsinclaira440bb32016-09-14 07:01:54 -0700262 XFA_PAGEVIEWEVENT_StopLayout != dwFlags)
263 return;
264
dsinclair521b7502016-11-02 13:02:28 -0700265 int nNewCount = m_pContext->GetPageCount();
266 if (nNewCount == m_pContext->GetOriginalPageCount())
dsinclaira440bb32016-09-14 07:01:54 -0700267 return;
268
dsinclair521b7502016-11-02 13:02:28 -0700269 CXFA_FFDocView* pXFADocView = m_pContext->GetXFADocView();
dsinclaira440bb32016-09-14 07:01:54 -0700270 if (!pXFADocView)
271 return;
272
dsinclair521b7502016-11-02 13:02:28 -0700273 for (int iPageIter = 0; iPageIter < m_pContext->GetOriginalPageCount();
dsinclaira440bb32016-09-14 07:01:54 -0700274 iPageIter++) {
Tom Sepez9792f162017-05-16 14:11:30 -0700275 CFX_RetainPtr<CPDFXFA_Page> pPage =
276 (*m_pContext->GetXFAPageList())[iPageIter];
dsinclaira440bb32016-09-14 07:01:54 -0700277 if (!pPage)
278 continue;
279
Tom Sepez9792f162017-05-16 14:11:30 -0700280 m_pContext->GetFormFillEnv()->RemovePageView(pPage.Get());
dsinclaira440bb32016-09-14 07:01:54 -0700281 pPage->SetXFAPageView(pXFADocView->GetPageView(iPageIter));
282 }
283
dsinclair521b7502016-11-02 13:02:28 -0700284 int flag = (nNewCount < m_pContext->GetOriginalPageCount())
dsinclaira440bb32016-09-14 07:01:54 -0700285 ? FXFA_PAGEVIEWEVENT_POSTREMOVED
286 : FXFA_PAGEVIEWEVENT_POSTADDED;
Dan Sinclair669a4182017-04-03 14:51:45 -0400287 int count = abs(nNewCount - m_pContext->GetOriginalPageCount());
dsinclair521b7502016-11-02 13:02:28 -0700288 m_pContext->SetOriginalPageCount(nNewCount);
dsinclair655fcca2016-10-11 13:53:37 -0700289 pFormFillEnv->PageEvent(count, flag);
dsinclaira440bb32016-09-14 07:01:54 -0700290}
291
292void CPDFXFA_DocEnvironment::WidgetPostAdd(CXFA_FFWidget* hWidget,
293 CXFA_WidgetAcc* pWidgetData) {
Dan Sinclaircdba7472017-03-23 09:17:10 -0400294 if (m_pContext->GetDocType() != XFA_DocType::Dynamic || !hWidget)
dsinclaira440bb32016-09-14 07:01:54 -0700295 return;
296
297 CXFA_FFPageView* pPageView = hWidget->GetPageView();
298 if (!pPageView)
299 return;
300
Tom Sepez9792f162017-05-16 14:11:30 -0700301 CFX_RetainPtr<CPDFXFA_Page> pXFAPage = m_pContext->GetXFAPage(pPageView);
dsinclaira440bb32016-09-14 07:01:54 -0700302 if (!pXFAPage)
303 return;
304
Tom Sepez9792f162017-05-16 14:11:30 -0700305 m_pContext->GetFormFillEnv()
306 ->GetPageView(pXFAPage.Get(), true)
307 ->AddAnnot(hWidget);
dsinclaira440bb32016-09-14 07:01:54 -0700308}
309
310void CPDFXFA_DocEnvironment::WidgetPreRemove(CXFA_FFWidget* hWidget,
311 CXFA_WidgetAcc* pWidgetData) {
Dan Sinclaircdba7472017-03-23 09:17:10 -0400312 if (m_pContext->GetDocType() != XFA_DocType::Dynamic || !hWidget)
dsinclaira440bb32016-09-14 07:01:54 -0700313 return;
314
315 CXFA_FFPageView* pPageView = hWidget->GetPageView();
316 if (!pPageView)
317 return;
318
Tom Sepez9792f162017-05-16 14:11:30 -0700319 CFX_RetainPtr<CPDFXFA_Page> pXFAPage = m_pContext->GetXFAPage(pPageView);
dsinclaira440bb32016-09-14 07:01:54 -0700320 if (!pXFAPage)
321 return;
322
323 CPDFSDK_PageView* pSdkPageView =
Tom Sepez9792f162017-05-16 14:11:30 -0700324 m_pContext->GetFormFillEnv()->GetPageView(pXFAPage.Get(), true);
325 CPDFSDK_Annot* pAnnot = pSdkPageView->GetAnnotByXFAWidget(hWidget);
326 if (pAnnot)
dsinclaira440bb32016-09-14 07:01:54 -0700327 pSdkPageView->DeleteAnnot(pAnnot);
328}
329
330int32_t CPDFXFA_DocEnvironment::CountPages(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -0700331 if (hDoc == m_pContext->GetXFADoc() && m_pContext->GetFormFillEnv())
332 return m_pContext->GetPageCount();
dsinclaira440bb32016-09-14 07:01:54 -0700333 return 0;
334}
335
336int32_t CPDFXFA_DocEnvironment::GetCurrentPage(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -0700337 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -0700338 return -1;
Dan Sinclaircdba7472017-03-23 09:17:10 -0400339 if (m_pContext->GetDocType() != XFA_DocType::Dynamic)
dsinclaira440bb32016-09-14 07:01:54 -0700340 return -1;
341
dsinclair521b7502016-11-02 13:02:28 -0700342 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700343 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -0700344 return -1;
345
Lei Zhang671630e2017-05-19 19:25:16 -0700346 return pFormFillEnv->GetCurrentPageIndex(m_pContext.Get());
dsinclaira440bb32016-09-14 07:01:54 -0700347}
348
349void CPDFXFA_DocEnvironment::SetCurrentPage(CXFA_FFDoc* hDoc,
350 int32_t iCurPage) {
dsinclair521b7502016-11-02 13:02:28 -0700351 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv() ||
Dan Sinclaircdba7472017-03-23 09:17:10 -0400352 m_pContext->GetDocType() != XFA_DocType::Dynamic || iCurPage < 0 ||
dsinclair521b7502016-11-02 13:02:28 -0700353 iCurPage >= m_pContext->GetFormFillEnv()->GetPageCount()) {
dsinclaira440bb32016-09-14 07:01:54 -0700354 return;
355 }
356
dsinclair521b7502016-11-02 13:02:28 -0700357 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700358 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -0700359 return;
Lei Zhang671630e2017-05-19 19:25:16 -0700360 pFormFillEnv->SetCurrentPage(m_pContext.Get(), iCurPage);
dsinclaira440bb32016-09-14 07:01:54 -0700361}
362
tsepez4cf55152016-11-02 14:37:54 -0700363bool CPDFXFA_DocEnvironment::IsCalculationsEnabled(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -0700364 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
tsepez4cf55152016-11-02 14:37:54 -0700365 return false;
dsinclair521b7502016-11-02 13:02:28 -0700366 if (m_pContext->GetFormFillEnv()->GetInterForm()) {
367 return m_pContext->GetFormFillEnv()
dsinclair655fcca2016-10-11 13:53:37 -0700368 ->GetInterForm()
369 ->IsXfaCalculateEnabled();
dsinclair7cbe68e2016-10-12 11:56:23 -0700370 }
tsepez4cf55152016-11-02 14:37:54 -0700371 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700372}
373
374void CPDFXFA_DocEnvironment::SetCalculationsEnabled(CXFA_FFDoc* hDoc,
tsepez4cf55152016-11-02 14:37:54 -0700375 bool bEnabled) {
dsinclair521b7502016-11-02 13:02:28 -0700376 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -0700377 return;
dsinclair521b7502016-11-02 13:02:28 -0700378 if (m_pContext->GetFormFillEnv()->GetInterForm()) {
379 m_pContext->GetFormFillEnv()->GetInterForm()->XfaEnableCalculate(bEnabled);
dsinclair7cbe68e2016-10-12 11:56:23 -0700380 }
dsinclaira440bb32016-09-14 07:01:54 -0700381}
382
383void CPDFXFA_DocEnvironment::GetTitle(CXFA_FFDoc* hDoc,
384 CFX_WideString& wsTitle) {
dsinclair521b7502016-11-02 13:02:28 -0700385 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetPDFDoc())
dsinclaira440bb32016-09-14 07:01:54 -0700386 return;
387
dsinclair521b7502016-11-02 13:02:28 -0700388 CPDF_Dictionary* pInfoDict = m_pContext->GetPDFDoc()->GetInfo();
dsinclaira440bb32016-09-14 07:01:54 -0700389 if (!pInfoDict)
390 return;
391
dsinclair38fd8442016-09-15 10:15:32 -0700392 CFX_ByteString csTitle = pInfoDict->GetStringFor("Title");
dsinclaira440bb32016-09-14 07:01:54 -0700393 wsTitle = wsTitle.FromLocal(csTitle.GetBuffer(csTitle.GetLength()));
394 csTitle.ReleaseBuffer(csTitle.GetLength());
395}
396
397void CPDFXFA_DocEnvironment::SetTitle(CXFA_FFDoc* hDoc,
398 const CFX_WideString& wsTitle) {
dsinclair521b7502016-11-02 13:02:28 -0700399 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetPDFDoc())
dsinclaira440bb32016-09-14 07:01:54 -0700400 return;
401
dsinclair521b7502016-11-02 13:02:28 -0700402 if (CPDF_Dictionary* pInfoDict = m_pContext->GetPDFDoc()->GetInfo())
tsepez0e606b52016-11-18 16:22:41 -0800403 pInfoDict->SetNewFor<CPDF_String>("Title", wsTitle);
dsinclaira440bb32016-09-14 07:01:54 -0700404}
405
406void CPDFXFA_DocEnvironment::ExportData(CXFA_FFDoc* hDoc,
407 const CFX_WideString& wsFilePath,
tsepez4cf55152016-11-02 14:37:54 -0700408 bool bXDP) {
dsinclair521b7502016-11-02 13:02:28 -0700409 if (hDoc != m_pContext->GetXFADoc())
dsinclaira440bb32016-09-14 07:01:54 -0700410 return;
411
Dan Sinclaircdba7472017-03-23 09:17:10 -0400412 if (m_pContext->GetDocType() != XFA_DocType::Dynamic &&
413 m_pContext->GetDocType() != XFA_DocType::Static) {
dsinclaira440bb32016-09-14 07:01:54 -0700414 return;
dsinclair7cbe68e2016-10-12 11:56:23 -0700415 }
dsinclaira440bb32016-09-14 07:01:54 -0700416
dsinclair521b7502016-11-02 13:02:28 -0700417 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700418 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -0700419 return;
420
421 int fileType = bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML;
422 CFX_ByteString bs = wsFilePath.UTF16LE_Encode();
423 if (wsFilePath.IsEmpty()) {
dsinclair655fcca2016-10-11 13:53:37 -0700424 if (!pFormFillEnv->GetFormFillInfo() ||
dsinclair7cbe68e2016-10-12 11:56:23 -0700425 !pFormFillEnv->GetFormFillInfo()->m_pJsPlatform) {
dsinclaira440bb32016-09-14 07:01:54 -0700426 return;
dsinclair7cbe68e2016-10-12 11:56:23 -0700427 }
dsinclaira440bb32016-09-14 07:01:54 -0700428
dsinclair655fcca2016-10-11 13:53:37 -0700429 CFX_WideString filepath = pFormFillEnv->JS_fieldBrowse();
dsinclaira440bb32016-09-14 07:01:54 -0700430 bs = filepath.UTF16LE_Encode();
431 }
432 int len = bs.GetLength();
433 FPDF_FILEHANDLER* pFileHandler =
dsinclair655fcca2016-10-11 13:53:37 -0700434 pFormFillEnv->OpenFile(bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML,
435 (FPDF_WIDESTRING)bs.GetBuffer(len), "wb");
dsinclaira440bb32016-09-14 07:01:54 -0700436 bs.ReleaseBuffer(len);
437 if (!pFileHandler)
438 return;
439
tsepez833619b2016-12-07 09:21:17 -0800440 CFX_RetainPtr<IFX_SeekableStream> fileWrite =
441 MakeSeekableStream(pFileHandler);
dsinclaira440bb32016-09-14 07:01:54 -0700442 CFX_ByteString content;
443 if (fileType == FXFA_SAVEAS_XML) {
444 content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
tsepezfa89a202016-12-02 09:48:30 -0800445 fileWrite->WriteBlock(content.c_str(), fileWrite->GetSize(),
446 content.GetLength());
tsepez833619b2016-12-07 09:21:17 -0800447 m_pContext->GetXFADocView()->GetDoc()->SavePackage(XFA_HASHCODE_Data,
448 fileWrite, nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700449 } else if (fileType == FXFA_SAVEAS_XDP) {
dsinclair521b7502016-11-02 13:02:28 -0700450 if (!m_pContext->GetPDFDoc())
dsinclaira440bb32016-09-14 07:01:54 -0700451 return;
452
dsinclair521b7502016-11-02 13:02:28 -0700453 CPDF_Dictionary* pRoot = m_pContext->GetPDFDoc()->GetRoot();
dsinclaira440bb32016-09-14 07:01:54 -0700454 if (!pRoot)
455 return;
456
dsinclair38fd8442016-09-15 10:15:32 -0700457 CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm");
dsinclaira440bb32016-09-14 07:01:54 -0700458 if (!pAcroForm)
459 return;
460
dsinclair38fd8442016-09-15 10:15:32 -0700461 CPDF_Array* pArray = ToArray(pAcroForm->GetObjectFor("XFA"));
dsinclaira440bb32016-09-14 07:01:54 -0700462 if (!pArray)
463 return;
464
465 int size = pArray->GetCount();
466 for (int i = 1; i < size; i += 2) {
467 CPDF_Object* pPDFObj = pArray->GetObjectAt(i);
468 CPDF_Object* pPrePDFObj = pArray->GetObjectAt(i - 1);
469 if (!pPrePDFObj->IsString())
470 continue;
471 if (!pPDFObj->IsReference())
472 continue;
473
474 CPDF_Stream* pStream = ToStream(pPDFObj->GetDirect());
475 if (!pStream)
476 continue;
477 if (pPrePDFObj->GetString() == "form") {
tsepez833619b2016-12-07 09:21:17 -0800478 m_pContext->GetXFADocView()->GetDoc()->SavePackage(XFA_HASHCODE_Form,
479 fileWrite, nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700480 continue;
481 }
482 if (pPrePDFObj->GetString() == "datasets") {
dsinclair521b7502016-11-02 13:02:28 -0700483 m_pContext->GetXFADocView()->GetDoc()->SavePackage(
tsepez833619b2016-12-07 09:21:17 -0800484 XFA_HASHCODE_Datasets, fileWrite, nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700485 continue;
486 }
487 if (i == size - 1) {
488 CFX_WideString wPath = CFX_WideString::FromUTF16LE(
489 reinterpret_cast<const unsigned short*>(bs.c_str()),
490 bs.GetLength() / sizeof(unsigned short));
491 CFX_ByteString bPath = wPath.UTF8Encode();
492 const char* szFormat =
493 "\n<pdf href=\"%s\" xmlns=\"http://ns.adobe.com/xdp/pdf/\"/>";
494 content.Format(szFormat, bPath.c_str());
tsepezfa89a202016-12-02 09:48:30 -0800495 fileWrite->WriteBlock(content.c_str(), fileWrite->GetSize(),
496 content.GetLength());
dsinclaira440bb32016-09-14 07:01:54 -0700497 }
Tom Sepezafd0d1f2017-04-04 14:37:18 -0700498 auto pAcc = pdfium::MakeRetain<CPDF_StreamAcc>(pStream);
499 pAcc->LoadAllData();
tsepezfa89a202016-12-02 09:48:30 -0800500 fileWrite->WriteBlock(pAcc->GetData(), fileWrite->GetSize(),
501 pAcc->GetSize());
dsinclaira440bb32016-09-14 07:01:54 -0700502 }
503 }
tsepezfa89a202016-12-02 09:48:30 -0800504 fileWrite->Flush();
dsinclaira440bb32016-09-14 07:01:54 -0700505}
506
507void CPDFXFA_DocEnvironment::GotoURL(CXFA_FFDoc* hDoc,
dsinclair577ad2c2016-09-22 10:20:43 -0700508 const CFX_WideString& bsURL) {
dsinclair521b7502016-11-02 13:02:28 -0700509 if (hDoc != m_pContext->GetXFADoc())
dsinclaira440bb32016-09-14 07:01:54 -0700510 return;
511
Dan Sinclaircdba7472017-03-23 09:17:10 -0400512 if (m_pContext->GetDocType() != XFA_DocType::Dynamic)
dsinclaira440bb32016-09-14 07:01:54 -0700513 return;
514
dsinclair521b7502016-11-02 13:02:28 -0700515 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700516 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -0700517 return;
518
519 CFX_WideStringC str(bsURL.c_str());
Lei Zhang671630e2017-05-19 19:25:16 -0700520 pFormFillEnv->GotoURL(m_pContext.Get(), str);
dsinclaira440bb32016-09-14 07:01:54 -0700521}
522
tsepez4cf55152016-11-02 14:37:54 -0700523bool CPDFXFA_DocEnvironment::IsValidationsEnabled(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -0700524 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
tsepez4cf55152016-11-02 14:37:54 -0700525 return false;
dsinclair521b7502016-11-02 13:02:28 -0700526 if (m_pContext->GetFormFillEnv()->GetInterForm()) {
527 return m_pContext->GetFormFillEnv()
dsinclair655fcca2016-10-11 13:53:37 -0700528 ->GetInterForm()
529 ->IsXfaValidationsEnabled();
dsinclair7cbe68e2016-10-12 11:56:23 -0700530 }
tsepez4cf55152016-11-02 14:37:54 -0700531 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700532}
533
534void CPDFXFA_DocEnvironment::SetValidationsEnabled(CXFA_FFDoc* hDoc,
tsepez4cf55152016-11-02 14:37:54 -0700535 bool bEnabled) {
dsinclair521b7502016-11-02 13:02:28 -0700536 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -0700537 return;
dsinclair521b7502016-11-02 13:02:28 -0700538 if (m_pContext->GetFormFillEnv()->GetInterForm()) {
539 m_pContext->GetFormFillEnv()->GetInterForm()->XfaSetValidationsEnabled(
540 bEnabled);
dsinclair7cbe68e2016-10-12 11:56:23 -0700541 }
dsinclaira440bb32016-09-14 07:01:54 -0700542}
543
544void CPDFXFA_DocEnvironment::SetFocusWidget(CXFA_FFDoc* hDoc,
545 CXFA_FFWidget* hWidget) {
dsinclair521b7502016-11-02 13:02:28 -0700546 if (hDoc != m_pContext->GetXFADoc())
dsinclaira440bb32016-09-14 07:01:54 -0700547 return;
548
549 if (!hWidget) {
tsepezf8074ce2016-09-27 14:29:57 -0700550 CPDFSDK_Annot::ObservedPtr pNull;
dsinclair521b7502016-11-02 13:02:28 -0700551 m_pContext->GetFormFillEnv()->SetFocusAnnot(&pNull);
dsinclaira440bb32016-09-14 07:01:54 -0700552 return;
553 }
554
dsinclair521b7502016-11-02 13:02:28 -0700555 int pageViewCount = m_pContext->GetFormFillEnv()->GetPageViewCount();
dsinclaira440bb32016-09-14 07:01:54 -0700556 for (int i = 0; i < pageViewCount; i++) {
dsinclair521b7502016-11-02 13:02:28 -0700557 CPDFSDK_PageView* pPageView = m_pContext->GetFormFillEnv()->GetPageView(i);
dsinclaira440bb32016-09-14 07:01:54 -0700558 if (!pPageView)
559 continue;
560
tsepezf8074ce2016-09-27 14:29:57 -0700561 CPDFSDK_Annot::ObservedPtr pAnnot(pPageView->GetAnnotByXFAWidget(hWidget));
dsinclaira440bb32016-09-14 07:01:54 -0700562 if (pAnnot) {
dsinclair521b7502016-11-02 13:02:28 -0700563 m_pContext->GetFormFillEnv()->SetFocusAnnot(&pAnnot);
dsinclaira440bb32016-09-14 07:01:54 -0700564 break;
565 }
566 }
567}
568
569void CPDFXFA_DocEnvironment::Print(CXFA_FFDoc* hDoc,
570 int32_t nStartPage,
571 int32_t nEndPage,
572 uint32_t dwOptions) {
dsinclair521b7502016-11-02 13:02:28 -0700573 if (hDoc != m_pContext->GetXFADoc())
dsinclaira440bb32016-09-14 07:01:54 -0700574 return;
575
dsinclair521b7502016-11-02 13:02:28 -0700576 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700577 if (!pFormFillEnv || !pFormFillEnv->GetFormFillInfo() ||
578 !pFormFillEnv->GetFormFillInfo()->m_pJsPlatform ||
579 !pFormFillEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print) {
dsinclaira440bb32016-09-14 07:01:54 -0700580 return;
581 }
582
dsinclair655fcca2016-10-11 13:53:37 -0700583 pFormFillEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print(
584 pFormFillEnv->GetFormFillInfo()->m_pJsPlatform,
dsinclaira440bb32016-09-14 07:01:54 -0700585 dwOptions & XFA_PRINTOPT_ShowDialog, nStartPage, nEndPage,
586 dwOptions & XFA_PRINTOPT_CanCancel, dwOptions & XFA_PRINTOPT_ShrinkPage,
587 dwOptions & XFA_PRINTOPT_AsImage, dwOptions & XFA_PRINTOPT_ReverseOrder,
588 dwOptions & XFA_PRINTOPT_PrintAnnot);
589}
590
591FX_ARGB CPDFXFA_DocEnvironment::GetHighlightColor(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -0700592 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -0700593 return 0;
594
dsinclair521b7502016-11-02 13:02:28 -0700595 CPDFSDK_InterForm* pInterForm = m_pContext->GetFormFillEnv()->GetInterForm();
dsinclaira440bb32016-09-14 07:01:54 -0700596 if (!pInterForm)
597 return 0;
598
599 return ArgbEncode(pInterForm->GetHighlightAlpha(),
600 pInterForm->GetHighlightColor(FPDF_FORMFIELD_XFA));
601}
602
tsepez4cf55152016-11-02 14:37:54 -0700603bool CPDFXFA_DocEnvironment::NotifySubmit(bool bPrevOrPost) {
dsinclaira440bb32016-09-14 07:01:54 -0700604 if (bPrevOrPost)
605 return OnBeforeNotifySubmit();
606
607 OnAfterNotifySubmit();
tsepez4cf55152016-11-02 14:37:54 -0700608 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700609}
610
tsepez4cf55152016-11-02 14:37:54 -0700611bool CPDFXFA_DocEnvironment::OnBeforeNotifySubmit() {
Dan Sinclaircdba7472017-03-23 09:17:10 -0400612 if (m_pContext->GetDocType() != XFA_DocType::Dynamic &&
613 m_pContext->GetDocType() != XFA_DocType::Static) {
tsepez4cf55152016-11-02 14:37:54 -0700614 return true;
dsinclair7cbe68e2016-10-12 11:56:23 -0700615 }
dsinclaira440bb32016-09-14 07:01:54 -0700616
dsinclair521b7502016-11-02 13:02:28 -0700617 if (!m_pContext->GetXFADocView())
tsepez4cf55152016-11-02 14:37:54 -0700618 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700619
620 CXFA_FFWidgetHandler* pWidgetHandler =
dsinclair521b7502016-11-02 13:02:28 -0700621 m_pContext->GetXFADocView()->GetWidgetHandler();
dsinclaira440bb32016-09-14 07:01:54 -0700622 if (!pWidgetHandler)
tsepez4cf55152016-11-02 14:37:54 -0700623 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700624
Tom Sepez40badde2017-05-01 13:21:39 -0700625 std::unique_ptr<CXFA_WidgetAccIterator> pWidgetAccIterator =
626 m_pContext->GetXFADocView()->CreateWidgetAccIterator();
dsinclaira440bb32016-09-14 07:01:54 -0700627 if (pWidgetAccIterator) {
628 CXFA_EventParam Param;
629 Param.m_eType = XFA_EVENT_PreSubmit;
630 while (CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext())
631 pWidgetHandler->ProcessEvent(pWidgetAcc, &Param);
632 }
633
Tom Sepez40badde2017-05-01 13:21:39 -0700634 pWidgetAccIterator = m_pContext->GetXFADocView()->CreateWidgetAccIterator();
dsinclaira440bb32016-09-14 07:01:54 -0700635 if (!pWidgetAccIterator)
tsepez4cf55152016-11-02 14:37:54 -0700636 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700637
638 CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();
639 pWidgetAcc = pWidgetAccIterator->MoveToNext();
640 while (pWidgetAcc) {
641 int fRet = pWidgetAcc->ProcessValidate(-1);
642 if (fRet == XFA_EVENTERROR_Error) {
dsinclair521b7502016-11-02 13:02:28 -0700643 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700644 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700645 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700646
647 CFX_WideString ws;
648 ws.FromLocal(IDS_XFA_Validate_Input);
649 CFX_ByteString bs = ws.UTF16LE_Encode();
650 int len = bs.GetLength();
dsinclair655fcca2016-10-11 13:53:37 -0700651 pFormFillEnv->Alert((FPDF_WIDESTRING)bs.GetBuffer(len),
652 (FPDF_WIDESTRING)L"", 0, 1);
dsinclaira440bb32016-09-14 07:01:54 -0700653 bs.ReleaseBuffer(len);
tsepez4cf55152016-11-02 14:37:54 -0700654 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700655 }
656 pWidgetAcc = pWidgetAccIterator->MoveToNext();
657 }
dsinclair521b7502016-11-02 13:02:28 -0700658 m_pContext->GetXFADocView()->UpdateDocView();
dsinclaira440bb32016-09-14 07:01:54 -0700659
tsepez4cf55152016-11-02 14:37:54 -0700660 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700661}
662
663void CPDFXFA_DocEnvironment::OnAfterNotifySubmit() {
Dan Sinclaircdba7472017-03-23 09:17:10 -0400664 if (m_pContext->GetDocType() != XFA_DocType::Dynamic &&
665 m_pContext->GetDocType() != XFA_DocType::Static)
dsinclaira440bb32016-09-14 07:01:54 -0700666 return;
667
dsinclair521b7502016-11-02 13:02:28 -0700668 if (!m_pContext->GetXFADocView())
dsinclaira440bb32016-09-14 07:01:54 -0700669 return;
670
671 CXFA_FFWidgetHandler* pWidgetHandler =
dsinclair521b7502016-11-02 13:02:28 -0700672 m_pContext->GetXFADocView()->GetWidgetHandler();
dsinclaira440bb32016-09-14 07:01:54 -0700673 if (!pWidgetHandler)
674 return;
675
Tom Sepez40badde2017-05-01 13:21:39 -0700676 std::unique_ptr<CXFA_WidgetAccIterator> pWidgetAccIterator =
677 m_pContext->GetXFADocView()->CreateWidgetAccIterator();
dsinclaira440bb32016-09-14 07:01:54 -0700678 if (!pWidgetAccIterator)
679 return;
680
681 CXFA_EventParam Param;
682 Param.m_eType = XFA_EVENT_PostSubmit;
683 CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();
684 while (pWidgetAcc) {
685 pWidgetHandler->ProcessEvent(pWidgetAcc, &Param);
686 pWidgetAcc = pWidgetAccIterator->MoveToNext();
687 }
dsinclair521b7502016-11-02 13:02:28 -0700688 m_pContext->GetXFADocView()->UpdateDocView();
dsinclaira440bb32016-09-14 07:01:54 -0700689}
690
tsepez4cf55152016-11-02 14:37:54 -0700691bool CPDFXFA_DocEnvironment::SubmitData(CXFA_FFDoc* hDoc, CXFA_Submit submit) {
692 if (!NotifySubmit(true) || !m_pContext->GetXFADocView())
693 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700694
dsinclair521b7502016-11-02 13:02:28 -0700695 m_pContext->GetXFADocView()->UpdateDocView();
tsepez4cf55152016-11-02 14:37:54 -0700696 bool ret = SubmitDataInternal(hDoc, submit);
697 NotifySubmit(false);
dsinclaira440bb32016-09-14 07:01:54 -0700698 return ret;
699}
700
tsepez833619b2016-12-07 09:21:17 -0800701CFX_RetainPtr<IFX_SeekableReadStream> CPDFXFA_DocEnvironment::OpenLinkedFile(
dsinclaira440bb32016-09-14 07:01:54 -0700702 CXFA_FFDoc* hDoc,
703 const CFX_WideString& wsLink) {
dsinclair521b7502016-11-02 13:02:28 -0700704 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700705 if (!pFormFillEnv)
tsepez04c10092016-10-25 15:16:40 -0700706 return nullptr;
dsinclaira440bb32016-09-14 07:01:54 -0700707
708 CFX_ByteString bs = wsLink.UTF16LE_Encode();
709 int len = bs.GetLength();
710 FPDF_FILEHANDLER* pFileHandler =
dsinclair655fcca2016-10-11 13:53:37 -0700711 pFormFillEnv->OpenFile(0, (FPDF_WIDESTRING)bs.GetBuffer(len), "rb");
dsinclaira440bb32016-09-14 07:01:54 -0700712 bs.ReleaseBuffer(len);
dsinclaira440bb32016-09-14 07:01:54 -0700713 if (!pFileHandler)
714 return nullptr;
tsepez04c10092016-10-25 15:16:40 -0700715
tsepezfa89a202016-12-02 09:48:30 -0800716 return MakeSeekableStream(pFileHandler);
dsinclaira440bb32016-09-14 07:01:54 -0700717}
718
tsepez4cf55152016-11-02 14:37:54 -0700719bool CPDFXFA_DocEnvironment::ExportSubmitFile(FPDF_FILEHANDLER* pFileHandler,
720 int fileType,
721 FPDF_DWORD encodeType,
722 FPDF_DWORD flag) {
dsinclair521b7502016-11-02 13:02:28 -0700723 if (!m_pContext->GetXFADocView())
tsepez4cf55152016-11-02 14:37:54 -0700724 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700725
726 CFX_ByteString content;
dsinclair521b7502016-11-02 13:02:28 -0700727 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700728 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700729 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700730
tsepez833619b2016-12-07 09:21:17 -0800731 CFX_RetainPtr<IFX_SeekableStream> fileStream =
732 MakeSeekableStream(pFileHandler);
tsepezfa89a202016-12-02 09:48:30 -0800733
dsinclaira440bb32016-09-14 07:01:54 -0700734 if (fileType == FXFA_SAVEAS_XML) {
735 const char kContent[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
tsepezfa89a202016-12-02 09:48:30 -0800736 fileStream->WriteBlock(kContent, 0, strlen(kContent));
tsepez833619b2016-12-07 09:21:17 -0800737 m_pContext->GetXFADoc()->SavePackage(XFA_HASHCODE_Data, fileStream,
dsinclair521b7502016-11-02 13:02:28 -0700738 nullptr);
tsepez4cf55152016-11-02 14:37:54 -0700739 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700740 }
741
742 if (fileType != FXFA_SAVEAS_XDP)
tsepez4cf55152016-11-02 14:37:54 -0700743 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700744
745 if (!flag) {
746 flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS |
747 FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM;
748 }
dsinclair521b7502016-11-02 13:02:28 -0700749 if (!m_pContext->GetPDFDoc()) {
tsepezfa89a202016-12-02 09:48:30 -0800750 fileStream->Flush();
tsepez4cf55152016-11-02 14:37:54 -0700751 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700752 }
753
dsinclair521b7502016-11-02 13:02:28 -0700754 CPDF_Dictionary* pRoot = m_pContext->GetPDFDoc()->GetRoot();
dsinclaira440bb32016-09-14 07:01:54 -0700755 if (!pRoot) {
tsepezfa89a202016-12-02 09:48:30 -0800756 fileStream->Flush();
tsepez4cf55152016-11-02 14:37:54 -0700757 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700758 }
759
dsinclair38fd8442016-09-15 10:15:32 -0700760 CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm");
dsinclaira440bb32016-09-14 07:01:54 -0700761 if (!pAcroForm) {
tsepezfa89a202016-12-02 09:48:30 -0800762 fileStream->Flush();
tsepez4cf55152016-11-02 14:37:54 -0700763 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700764 }
765
dsinclair38fd8442016-09-15 10:15:32 -0700766 CPDF_Array* pArray = ToArray(pAcroForm->GetObjectFor("XFA"));
dsinclaira440bb32016-09-14 07:01:54 -0700767 if (!pArray) {
tsepezfa89a202016-12-02 09:48:30 -0800768 fileStream->Flush();
tsepez4cf55152016-11-02 14:37:54 -0700769 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700770 }
771
772 int size = pArray->GetCount();
773 for (int i = 1; i < size; i += 2) {
774 CPDF_Object* pPDFObj = pArray->GetObjectAt(i);
775 CPDF_Object* pPrePDFObj = pArray->GetObjectAt(i - 1);
776 if (!pPrePDFObj->IsString())
777 continue;
778 if (!pPDFObj->IsReference())
779 continue;
780
781 CPDF_Object* pDirectObj = pPDFObj->GetDirect();
782 if (!pDirectObj->IsStream())
783 continue;
784 if (pPrePDFObj->GetString() == "config" && !(flag & FXFA_CONFIG))
785 continue;
786 if (pPrePDFObj->GetString() == "template" && !(flag & FXFA_TEMPLATE))
787 continue;
788 if (pPrePDFObj->GetString() == "localeSet" && !(flag & FXFA_LOCALESET))
789 continue;
790 if (pPrePDFObj->GetString() == "datasets" && !(flag & FXFA_DATASETS))
791 continue;
792 if (pPrePDFObj->GetString() == "xmpmeta" && !(flag & FXFA_XMPMETA))
793 continue;
794 if (pPrePDFObj->GetString() == "xfdf" && !(flag & FXFA_XFDF))
795 continue;
796 if (pPrePDFObj->GetString() == "form" && !(flag & FXFA_FORM))
797 continue;
798 if (pPrePDFObj->GetString() == "form") {
tsepez833619b2016-12-07 09:21:17 -0800799 m_pContext->GetXFADoc()->SavePackage(XFA_HASHCODE_Form, fileStream,
dsinclair521b7502016-11-02 13:02:28 -0700800 nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700801 } else if (pPrePDFObj->GetString() == "datasets") {
tsepez833619b2016-12-07 09:21:17 -0800802 m_pContext->GetXFADoc()->SavePackage(XFA_HASHCODE_Datasets, fileStream,
803 nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700804 } else {
805 // PDF,creator.
806 }
807 }
tsepez4cf55152016-11-02 14:37:54 -0700808 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700809}
810
811void CPDFXFA_DocEnvironment::ToXFAContentFlags(CFX_WideString csSrcContent,
812 FPDF_DWORD& flag) {
813 if (csSrcContent.Find(L" config ", 0) != -1)
814 flag |= FXFA_CONFIG;
815 if (csSrcContent.Find(L" template ", 0) != -1)
816 flag |= FXFA_TEMPLATE;
817 if (csSrcContent.Find(L" localeSet ", 0) != -1)
818 flag |= FXFA_LOCALESET;
819 if (csSrcContent.Find(L" datasets ", 0) != -1)
820 flag |= FXFA_DATASETS;
821 if (csSrcContent.Find(L" xmpmeta ", 0) != -1)
822 flag |= FXFA_XMPMETA;
823 if (csSrcContent.Find(L" xfdf ", 0) != -1)
824 flag |= FXFA_XFDF;
825 if (csSrcContent.Find(L" form ", 0) != -1)
826 flag |= FXFA_FORM;
827 if (flag == 0) {
828 flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS |
829 FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM;
830 }
831}
832
tsepez4cf55152016-11-02 14:37:54 -0700833bool CPDFXFA_DocEnvironment::MailToInfo(CFX_WideString& csURL,
834 CFX_WideString& csToAddress,
835 CFX_WideString& csCCAddress,
836 CFX_WideString& csBCCAddress,
837 CFX_WideString& csSubject,
838 CFX_WideString& csMsg) {
dsinclaira440bb32016-09-14 07:01:54 -0700839 CFX_WideString srcURL = csURL;
840 srcURL.TrimLeft();
841 if (srcURL.Left(7).CompareNoCase(L"mailto:") != 0)
tsepez4cf55152016-11-02 14:37:54 -0700842 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700843
844 int pos = srcURL.Find(L'?', 0);
845 CFX_WideString tmp;
846 if (pos == -1) {
847 pos = srcURL.Find(L'@', 0);
848 if (pos == -1)
tsepez4cf55152016-11-02 14:37:54 -0700849 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700850
851 tmp = srcURL.Right(csURL.GetLength() - 7);
852 } else {
853 tmp = srcURL.Left(pos);
854 tmp = tmp.Right(tmp.GetLength() - 7);
855 }
856 tmp.TrimLeft();
857 tmp.TrimRight();
858
859 csToAddress = tmp;
860
861 srcURL = srcURL.Right(srcURL.GetLength() - (pos + 1));
862 while (!srcURL.IsEmpty()) {
863 srcURL.TrimLeft();
864 srcURL.TrimRight();
865 pos = srcURL.Find(L'&', 0);
866
867 tmp = (pos == -1) ? srcURL : srcURL.Left(pos);
868 tmp.TrimLeft();
869 tmp.TrimRight();
870 if (tmp.GetLength() >= 3 && tmp.Left(3).CompareNoCase(L"cc=") == 0) {
871 tmp = tmp.Right(tmp.GetLength() - 3);
872 if (!csCCAddress.IsEmpty())
873 csCCAddress += L';';
874 csCCAddress += tmp;
875 } else if (tmp.GetLength() >= 4 &&
876 tmp.Left(4).CompareNoCase(L"bcc=") == 0) {
877 tmp = tmp.Right(tmp.GetLength() - 4);
878 if (!csBCCAddress.IsEmpty())
879 csBCCAddress += L';';
880 csBCCAddress += tmp;
881 } else if (tmp.GetLength() >= 8 &&
882 tmp.Left(8).CompareNoCase(L"subject=") == 0) {
883 tmp = tmp.Right(tmp.GetLength() - 8);
884 csSubject += tmp;
885 } else if (tmp.GetLength() >= 5 &&
886 tmp.Left(5).CompareNoCase(L"body=") == 0) {
887 tmp = tmp.Right(tmp.GetLength() - 5);
888 csMsg += tmp;
889 }
890 srcURL = (pos == -1) ? L"" : srcURL.Right(csURL.GetLength() - (pos + 1));
891 }
892 csToAddress.Replace(L",", L";");
893 csCCAddress.Replace(L",", L";");
894 csBCCAddress.Replace(L",", L";");
tsepez4cf55152016-11-02 14:37:54 -0700895 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700896}
897
tsepez4cf55152016-11-02 14:37:54 -0700898bool CPDFXFA_DocEnvironment::SubmitDataInternal(CXFA_FFDoc* hDoc,
899 CXFA_Submit submit) {
dsinclair521b7502016-11-02 13:02:28 -0700900 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700901 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700902 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700903
904 CFX_WideStringC csURLC;
905 submit.GetSubmitTarget(csURLC);
906 CFX_WideString csURL(csURLC);
907 if (csURL.IsEmpty()) {
908 CFX_WideString ws;
909 ws.FromLocal("Submit cancelled.");
910 CFX_ByteString bs = ws.UTF16LE_Encode();
911 int len = bs.GetLength();
dsinclair655fcca2016-10-11 13:53:37 -0700912 pFormFillEnv->Alert((FPDF_WIDESTRING)bs.GetBuffer(len),
913 (FPDF_WIDESTRING)L"", 0, 4);
dsinclaira440bb32016-09-14 07:01:54 -0700914 bs.ReleaseBuffer(len);
tsepez4cf55152016-11-02 14:37:54 -0700915 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700916 }
917
dsinclaira440bb32016-09-14 07:01:54 -0700918 FPDF_FILEHANDLER* pFileHandler = nullptr;
919 int fileFlag = -1;
920 switch (submit.GetSubmitFormat()) {
921 case XFA_ATTRIBUTEENUM_Xdp: {
922 CFX_WideStringC csContentC;
923 submit.GetSubmitXDPContent(csContentC);
924 CFX_WideString csContent;
925 csContent = csContentC;
926 csContent.TrimLeft();
927 csContent.TrimRight();
928 CFX_WideString space;
929 space.FromLocal(" ");
930 csContent = space + csContent + space;
931 FPDF_DWORD flag = 0;
932 if (submit.IsSubmitEmbedPDF())
933 flag |= FXFA_PDF;
934
935 ToXFAContentFlags(csContent, flag);
dsinclair655fcca2016-10-11 13:53:37 -0700936 pFileHandler = pFormFillEnv->OpenFile(FXFA_SAVEAS_XDP, nullptr, "wb");
dsinclaira440bb32016-09-14 07:01:54 -0700937 fileFlag = FXFA_SAVEAS_XDP;
938 ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XDP, 0, flag);
939 break;
940 }
941 case XFA_ATTRIBUTEENUM_Xml:
dsinclair655fcca2016-10-11 13:53:37 -0700942 pFileHandler = pFormFillEnv->OpenFile(FXFA_SAVEAS_XML, nullptr, "wb");
dsinclaira440bb32016-09-14 07:01:54 -0700943 fileFlag = FXFA_SAVEAS_XML;
944 ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0, FXFA_XFA_ALL);
945 break;
946 case XFA_ATTRIBUTEENUM_Pdf:
947 break;
948 case XFA_ATTRIBUTEENUM_Urlencoded:
dsinclair655fcca2016-10-11 13:53:37 -0700949 pFileHandler = pFormFillEnv->OpenFile(FXFA_SAVEAS_XML, nullptr, "wb");
dsinclaira440bb32016-09-14 07:01:54 -0700950 fileFlag = FXFA_SAVEAS_XML;
951 ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0, FXFA_XFA_ALL);
952 break;
953 default:
954 return false;
955 }
956 if (!pFileHandler)
tsepez4cf55152016-11-02 14:37:54 -0700957 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700958 if (csURL.Left(7).CompareNoCase(L"mailto:") == 0) {
959 CFX_WideString csToAddress;
960 CFX_WideString csCCAddress;
961 CFX_WideString csBCCAddress;
962 CFX_WideString csSubject;
963 CFX_WideString csMsg;
tsepez16b703c2016-10-26 08:45:31 -0700964 if (!MailToInfo(csURL, csToAddress, csCCAddress, csBCCAddress, csSubject,
965 csMsg)) {
tsepez4cf55152016-11-02 14:37:54 -0700966 return false;
tsepez16b703c2016-10-26 08:45:31 -0700967 }
dsinclaira440bb32016-09-14 07:01:54 -0700968 CFX_ByteString bsTo = CFX_WideString(csToAddress).UTF16LE_Encode();
969 CFX_ByteString bsCC = CFX_WideString(csCCAddress).UTF16LE_Encode();
970 CFX_ByteString bsBcc = CFX_WideString(csBCCAddress).UTF16LE_Encode();
971 CFX_ByteString bsSubject = CFX_WideString(csSubject).UTF16LE_Encode();
972 CFX_ByteString bsMsg = CFX_WideString(csMsg).UTF16LE_Encode();
973 FPDF_WIDESTRING pTo = (FPDF_WIDESTRING)bsTo.GetBuffer(bsTo.GetLength());
974 FPDF_WIDESTRING pCC = (FPDF_WIDESTRING)bsCC.GetBuffer(bsCC.GetLength());
975 FPDF_WIDESTRING pBcc = (FPDF_WIDESTRING)bsBcc.GetBuffer(bsBcc.GetLength());
976 FPDF_WIDESTRING pSubject =
977 (FPDF_WIDESTRING)bsSubject.GetBuffer(bsSubject.GetLength());
978 FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength());
dsinclair655fcca2016-10-11 13:53:37 -0700979 pFormFillEnv->EmailTo(pFileHandler, pTo, pSubject, pCC, pBcc, pMsg);
dsinclaira440bb32016-09-14 07:01:54 -0700980 bsTo.ReleaseBuffer();
981 bsCC.ReleaseBuffer();
982 bsBcc.ReleaseBuffer();
983 bsSubject.ReleaseBuffer();
984 bsMsg.ReleaseBuffer();
985 } else {
986 // HTTP or FTP
987 CFX_WideString ws;
988 CFX_ByteString bs = csURL.UTF16LE_Encode();
989 int len = bs.GetLength();
dsinclair655fcca2016-10-11 13:53:37 -0700990 pFormFillEnv->UploadTo(pFileHandler, fileFlag,
991 (FPDF_WIDESTRING)bs.GetBuffer(len));
dsinclaira440bb32016-09-14 07:01:54 -0700992 bs.ReleaseBuffer(len);
993 }
tsepez4cf55152016-11-02 14:37:54 -0700994 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700995}
996
tsepez4cf55152016-11-02 14:37:54 -0700997bool CPDFXFA_DocEnvironment::SetGlobalProperty(
dsinclaira440bb32016-09-14 07:01:54 -0700998 CXFA_FFDoc* hDoc,
999 const CFX_ByteStringC& szPropName,
1000 CFXJSE_Value* pValue) {
dsinclair521b7502016-11-02 13:02:28 -07001001 if (hDoc != m_pContext->GetXFADoc())
tsepez4cf55152016-11-02 14:37:54 -07001002 return false;
Tom Sepez7dc9fe52017-05-18 09:51:57 -07001003 if (!m_pContext->GetFormFillEnv() ||
1004 !m_pContext->GetFormFillEnv()->GetJSRuntime()) {
1005 return false;
dsinclair655fcca2016-10-11 13:53:37 -07001006 }
Tom Sepez7dc9fe52017-05-18 09:51:57 -07001007 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
1008 IJS_EventContext* pContext = pFormFillEnv->GetJSRuntime()->NewEventContext();
1009 bool bRet = pFormFillEnv->GetJSRuntime()->SetValueByName(szPropName, pValue);
1010 pFormFillEnv->GetJSRuntime()->ReleaseEventContext(pContext);
1011 return bRet;
dsinclaira440bb32016-09-14 07:01:54 -07001012}
1013
tsepez4cf55152016-11-02 14:37:54 -07001014bool CPDFXFA_DocEnvironment::GetGlobalProperty(
dsinclaira440bb32016-09-14 07:01:54 -07001015 CXFA_FFDoc* hDoc,
1016 const CFX_ByteStringC& szPropName,
1017 CFXJSE_Value* pValue) {
dsinclair521b7502016-11-02 13:02:28 -07001018 if (hDoc != m_pContext->GetXFADoc())
tsepez4cf55152016-11-02 14:37:54 -07001019 return false;
dsinclair521b7502016-11-02 13:02:28 -07001020 if (!m_pContext->GetFormFillEnv() ||
1021 !m_pContext->GetFormFillEnv()->GetJSRuntime()) {
tsepez4cf55152016-11-02 14:37:54 -07001022 return false;
dsinclair655fcca2016-10-11 13:53:37 -07001023 }
dsinclair521b7502016-11-02 13:02:28 -07001024 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
Tom Sepez7dc9fe52017-05-18 09:51:57 -07001025 IJS_EventContext* pContext = pFormFillEnv->GetJSRuntime()->NewEventContext();
1026 bool bRet = pFormFillEnv->GetJSRuntime()->GetValueByName(szPropName, pValue);
1027 pFormFillEnv->GetJSRuntime()->ReleaseEventContext(pContext);
1028 return bRet;
dsinclaira440bb32016-09-14 07:01:54 -07001029}