OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "fpdfsdk/include/fsdk_mgr.h" | 10 #include "fpdfsdk/include/fsdk_mgr.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h" | 21 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h" |
22 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" | 22 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" |
23 #endif // PDF_ENABLE_XFA | 23 #endif // PDF_ENABLE_XFA |
24 | 24 |
25 #if _FX_OS_ == _FX_ANDROID_ | 25 #if _FX_OS_ == _FX_ANDROID_ |
26 #include "time.h" | 26 #include "time.h" |
27 #else | 27 #else |
28 #include <ctime> | 28 #include <ctime> |
29 #endif | 29 #endif |
30 | 30 |
| 31 namespace { |
| 32 |
| 33 int CharSet2CP(int charset) { |
| 34 if (charset == 128) |
| 35 return 932; |
| 36 if (charset == 134) |
| 37 return 936; |
| 38 if (charset == 129) |
| 39 return 949; |
| 40 if (charset == 136) |
| 41 return 950; |
| 42 return 0; |
| 43 } |
| 44 |
| 45 } // namespace |
| 46 |
| 47 FPDF_WIDESTRING AsFPDFWideString(CFX_ByteString* bsUTF16LE) { |
| 48 return reinterpret_cast<FPDF_WIDESTRING>( |
| 49 bsUTF16LE->GetBuffer(bsUTF16LE->GetLength())); |
| 50 } |
| 51 |
31 class CFX_SystemHandler : public IFX_SystemHandler { | 52 class CFX_SystemHandler : public IFX_SystemHandler { |
32 public: | 53 public: |
33 explicit CFX_SystemHandler(CPDFDoc_Environment* pEnv) | 54 explicit CFX_SystemHandler(CPDFDoc_Environment* pEnv) |
34 : m_pEnv(pEnv), m_nCharSet(-1) {} | 55 : m_pEnv(pEnv), m_nCharSet(-1) {} |
35 ~CFX_SystemHandler() override {} | 56 ~CFX_SystemHandler() override {} |
36 | 57 |
37 public: | 58 public: |
38 // IFX_SystemHandler | 59 // IFX_SystemHandler |
39 void InvalidateRect(FX_HWND hWnd, FX_RECT rect) override; | 60 void InvalidateRect(FX_HWND hWnd, FX_RECT rect) override; |
40 void OutputSelectedRect(void* pFormFiller, CPDF_Rect& rect) override; | 61 void OutputSelectedRect(void* pFormFiller, CPDF_Rect& rect) override; |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 } | 183 } |
163 | 184 |
164 for (int i = 0; i < nSize; ++i) { | 185 for (int i = 0; i < nSize; ++i) { |
165 if (pFontMapper->m_InstalledTTFonts[i].Compare(sFontFaceName)) | 186 if (pFontMapper->m_InstalledTTFonts[i].Compare(sFontFaceName)) |
166 return TRUE; | 187 return TRUE; |
167 } | 188 } |
168 | 189 |
169 return FALSE; | 190 return FALSE; |
170 } | 191 } |
171 | 192 |
172 static int CharSet2CP(int charset) { | |
173 if (charset == 128) | |
174 return 932; | |
175 if (charset == 134) | |
176 return 936; | |
177 if (charset == 129) | |
178 return 949; | |
179 if (charset == 136) | |
180 return 950; | |
181 return 0; | |
182 } | |
183 CPDF_Font* CFX_SystemHandler::AddNativeTrueTypeFontToPDF( | 193 CPDF_Font* CFX_SystemHandler::AddNativeTrueTypeFontToPDF( |
184 CPDF_Document* pDoc, | 194 CPDF_Document* pDoc, |
185 CFX_ByteString sFontFaceName, | 195 CFX_ByteString sFontFaceName, |
186 uint8_t nCharset) { | 196 uint8_t nCharset) { |
187 if (pDoc) { | 197 if (pDoc) { |
188 CFX_Font* pFXFont = new CFX_Font(); | 198 CFX_Font* pFXFont = new CFX_Font(); |
189 pFXFont->LoadSubst(sFontFaceName, TRUE, 0, 0, 0, CharSet2CP(nCharset), | 199 pFXFont->LoadSubst(sFontFaceName, TRUE, 0, 0, 0, CharSet2CP(nCharset), |
190 FALSE); | 200 FALSE); |
191 CPDF_Font* pFont = pDoc->AddFont(pFXFont, nCharset, FALSE); | 201 CPDF_Font* pFont = pDoc->AddFont(pFXFont, nCharset, FALSE); |
192 delete pFXFont; | 202 delete pFXFont; |
(...skipping 26 matching lines...) Expand all Loading... |
219 CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance(); | 229 CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance(); |
220 if (pProvider->m_pEnvList.GetSize() == 0) | 230 if (pProvider->m_pEnvList.GetSize() == 0) |
221 pProvider->SetJavaScriptInitialized(FALSE); | 231 pProvider->SetJavaScriptInitialized(FALSE); |
222 #endif // PDF_ENABLE_XFA | 232 #endif // PDF_ENABLE_XFA |
223 } | 233 } |
224 | 234 |
225 int CPDFDoc_Environment::JS_appAlert(const FX_WCHAR* Msg, | 235 int CPDFDoc_Environment::JS_appAlert(const FX_WCHAR* Msg, |
226 const FX_WCHAR* Title, | 236 const FX_WCHAR* Title, |
227 FX_UINT Type, | 237 FX_UINT Type, |
228 FX_UINT Icon) { | 238 FX_UINT Icon) { |
229 if (m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_alert) { | 239 if (!m_pInfo || !m_pInfo->m_pJsPlatform || |
230 CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode(); | 240 !m_pInfo->m_pJsPlatform->app_alert) { |
231 CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode(); | 241 return -1; |
232 FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength()); | |
233 FPDF_WIDESTRING pTitle = | |
234 (FPDF_WIDESTRING)bsTitle.GetBuffer(bsTitle.GetLength()); | |
235 int ret = m_pInfo->m_pJsPlatform->app_alert(m_pInfo->m_pJsPlatform, pMsg, | |
236 pTitle, Type, Icon); | |
237 bsMsg.ReleaseBuffer(); | |
238 bsTitle.ReleaseBuffer(); | |
239 return ret; | |
240 } | 242 } |
241 return -1; | 243 CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode(); |
| 244 CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode(); |
| 245 return m_pInfo->m_pJsPlatform->app_alert( |
| 246 m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsMsg), |
| 247 AsFPDFWideString(&bsTitle), Type, Icon); |
242 } | 248 } |
243 | 249 |
244 int CPDFDoc_Environment::JS_appResponse(const FX_WCHAR* Question, | 250 int CPDFDoc_Environment::JS_appResponse(const FX_WCHAR* Question, |
245 const FX_WCHAR* Title, | 251 const FX_WCHAR* Title, |
246 const FX_WCHAR* Default, | 252 const FX_WCHAR* Default, |
247 const FX_WCHAR* cLabel, | 253 const FX_WCHAR* cLabel, |
248 FPDF_BOOL bPassword, | 254 FPDF_BOOL bPassword, |
249 void* response, | 255 void* response, |
250 int length) { | 256 int length) { |
251 if (m_pInfo && m_pInfo->m_pJsPlatform && | 257 if (!m_pInfo || !m_pInfo->m_pJsPlatform || |
252 m_pInfo->m_pJsPlatform->app_response) { | 258 !m_pInfo->m_pJsPlatform->app_response) { |
253 CFX_ByteString bsQuestion = CFX_WideString(Question).UTF16LE_Encode(); | 259 return -1; |
254 CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode(); | |
255 CFX_ByteString bsDefault = CFX_WideString(Default).UTF16LE_Encode(); | |
256 CFX_ByteString bsLabel = CFX_WideString(cLabel).UTF16LE_Encode(); | |
257 FPDF_WIDESTRING pQuestion = | |
258 (FPDF_WIDESTRING)bsQuestion.GetBuffer(bsQuestion.GetLength()); | |
259 FPDF_WIDESTRING pTitle = | |
260 (FPDF_WIDESTRING)bsTitle.GetBuffer(bsTitle.GetLength()); | |
261 FPDF_WIDESTRING pDefault = | |
262 (FPDF_WIDESTRING)bsDefault.GetBuffer(bsDefault.GetLength()); | |
263 FPDF_WIDESTRING pLabel = | |
264 (FPDF_WIDESTRING)bsLabel.GetBuffer(bsLabel.GetLength()); | |
265 int ret = m_pInfo->m_pJsPlatform->app_response( | |
266 m_pInfo->m_pJsPlatform, pQuestion, pTitle, pDefault, pLabel, bPassword, | |
267 response, length); | |
268 bsQuestion.ReleaseBuffer(); | |
269 bsTitle.ReleaseBuffer(); | |
270 bsDefault.ReleaseBuffer(); | |
271 bsLabel.ReleaseBuffer(); | |
272 return ret; | |
273 } | 260 } |
274 return -1; | 261 CFX_ByteString bsQuestion = CFX_WideString(Question).UTF16LE_Encode(); |
| 262 CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode(); |
| 263 CFX_ByteString bsDefault = CFX_WideString(Default).UTF16LE_Encode(); |
| 264 CFX_ByteString bsLabel = CFX_WideString(cLabel).UTF16LE_Encode(); |
| 265 return m_pInfo->m_pJsPlatform->app_response( |
| 266 m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsQuestion), |
| 267 AsFPDFWideString(&bsTitle), AsFPDFWideString(&bsDefault), |
| 268 AsFPDFWideString(&bsLabel), bPassword, response, length); |
| 269 } |
| 270 |
| 271 void CPDFDoc_Environment::JS_appBeep(int nType) { |
| 272 if (!m_pInfo || !m_pInfo->m_pJsPlatform || |
| 273 !m_pInfo->m_pJsPlatform->app_beep) { |
| 274 return; |
| 275 } |
| 276 m_pInfo->m_pJsPlatform->app_beep(m_pInfo->m_pJsPlatform, nType); |
275 } | 277 } |
276 | 278 |
277 CFX_WideString CPDFDoc_Environment::JS_fieldBrowse() { | 279 CFX_WideString CPDFDoc_Environment::JS_fieldBrowse() { |
278 if (!m_pInfo || !m_pInfo->m_pJsPlatform || | 280 if (!m_pInfo || !m_pInfo->m_pJsPlatform || |
279 !m_pInfo->m_pJsPlatform->Field_browse) { | 281 !m_pInfo->m_pJsPlatform->Field_browse) { |
280 return L""; | 282 return CFX_WideString(); |
281 } | 283 } |
282 | |
283 const int nRequiredLen = | 284 const int nRequiredLen = |
284 m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, nullptr, 0); | 285 m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, nullptr, 0); |
285 if (nRequiredLen <= 0) | 286 if (nRequiredLen <= 0) |
286 return L""; | 287 return CFX_WideString(); |
287 | 288 |
288 std::unique_ptr<char[]> pBuff(new char[nRequiredLen]); | 289 std::unique_ptr<char[]> pBuff(new char[nRequiredLen]); |
289 memset(pBuff.get(), 0, nRequiredLen); | 290 memset(pBuff.get(), 0, nRequiredLen); |
290 const int nActualLen = m_pInfo->m_pJsPlatform->Field_browse( | 291 const int nActualLen = m_pInfo->m_pJsPlatform->Field_browse( |
291 m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen); | 292 m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen); |
292 if (nActualLen <= 0 || nActualLen > nRequiredLen) | 293 if (nActualLen <= 0 || nActualLen > nRequiredLen) |
293 return L""; | 294 return CFX_WideString(); |
294 | 295 |
295 CFX_ByteString bsRet = CFX_ByteString(pBuff.get(), nActualLen); | 296 return CFX_WideString::FromLocal(CFX_ByteString(pBuff.get(), nActualLen)); |
296 CFX_WideString wsRet = CFX_WideString::FromLocal(bsRet); | |
297 return wsRet; | |
298 } | 297 } |
299 | 298 |
300 CFX_WideString CPDFDoc_Environment::JS_docGetFilePath() { | 299 CFX_WideString CPDFDoc_Environment::JS_docGetFilePath() { |
301 if (!m_pInfo || !m_pInfo->m_pJsPlatform || | 300 if (!m_pInfo || !m_pInfo->m_pJsPlatform || |
302 !m_pInfo->m_pJsPlatform->Doc_getFilePath) { | 301 !m_pInfo->m_pJsPlatform->Doc_getFilePath) { |
303 return L""; | 302 return CFX_WideString(); |
304 } | 303 } |
305 | |
306 const int nRequiredLen = m_pInfo->m_pJsPlatform->Doc_getFilePath( | 304 const int nRequiredLen = m_pInfo->m_pJsPlatform->Doc_getFilePath( |
307 m_pInfo->m_pJsPlatform, nullptr, 0); | 305 m_pInfo->m_pJsPlatform, nullptr, 0); |
308 if (nRequiredLen <= 0) | 306 if (nRequiredLen <= 0) |
309 return L""; | 307 return CFX_WideString(); |
310 | 308 |
311 std::unique_ptr<char[]> pBuff(new char[nRequiredLen]); | 309 std::unique_ptr<char[]> pBuff(new char[nRequiredLen]); |
312 memset(pBuff.get(), 0, nRequiredLen); | 310 memset(pBuff.get(), 0, nRequiredLen); |
313 const int nActualLen = m_pInfo->m_pJsPlatform->Doc_getFilePath( | 311 const int nActualLen = m_pInfo->m_pJsPlatform->Doc_getFilePath( |
314 m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen); | 312 m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen); |
315 if (nActualLen <= 0 || nActualLen > nRequiredLen) | 313 if (nActualLen <= 0 || nActualLen > nRequiredLen) |
316 return L""; | 314 return CFX_WideString(); |
317 | 315 |
318 CFX_ByteString bsRet = CFX_ByteString(pBuff.get(), nActualLen); | 316 return CFX_WideString::FromLocal(CFX_ByteString(pBuff.get(), nActualLen)); |
319 CFX_WideString wsRet = CFX_WideString::FromLocal(bsRet); | |
320 return wsRet; | |
321 } | 317 } |
322 | 318 |
323 void CPDFDoc_Environment::JS_docSubmitForm(void* formData, | 319 void CPDFDoc_Environment::JS_docSubmitForm(void* formData, |
324 int length, | 320 int length, |
325 const FX_WCHAR* URL) { | 321 const FX_WCHAR* URL) { |
326 if (m_pInfo && m_pInfo->m_pJsPlatform && | 322 if (!m_pInfo || !m_pInfo->m_pJsPlatform || |
327 m_pInfo->m_pJsPlatform->Doc_submitForm) { | 323 !m_pInfo->m_pJsPlatform->Doc_submitForm) { |
328 CFX_ByteString bsDestination = CFX_WideString(URL).UTF16LE_Encode(); | 324 return; |
329 FPDF_WIDESTRING pDestination = | |
330 (FPDF_WIDESTRING)bsDestination.GetBuffer(bsDestination.GetLength()); | |
331 m_pInfo->m_pJsPlatform->Doc_submitForm(m_pInfo->m_pJsPlatform, formData, | |
332 length, pDestination); | |
333 bsDestination.ReleaseBuffer(); | |
334 } | 325 } |
| 326 CFX_ByteString bsDestination = CFX_WideString(URL).UTF16LE_Encode(); |
| 327 m_pInfo->m_pJsPlatform->Doc_submitForm(m_pInfo->m_pJsPlatform, formData, |
| 328 length, |
| 329 AsFPDFWideString(&bsDestination)); |
335 } | 330 } |
336 | 331 |
337 void CPDFDoc_Environment::JS_docmailForm(void* mailData, | 332 void CPDFDoc_Environment::JS_docmailForm(void* mailData, |
338 int length, | 333 int length, |
339 FPDF_BOOL bUI, | 334 FPDF_BOOL bUI, |
340 const FX_WCHAR* To, | 335 const FX_WCHAR* To, |
341 const FX_WCHAR* Subject, | 336 const FX_WCHAR* Subject, |
342 const FX_WCHAR* CC, | 337 const FX_WCHAR* CC, |
343 const FX_WCHAR* BCC, | 338 const FX_WCHAR* BCC, |
344 const FX_WCHAR* Msg) { | 339 const FX_WCHAR* Msg) { |
345 if (m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_mail) { | 340 if (!m_pInfo || !m_pInfo->m_pJsPlatform || |
346 CFX_ByteString bsTo = CFX_WideString(To).UTF16LE_Encode(); | 341 !m_pInfo->m_pJsPlatform->Doc_mail) { |
347 CFX_ByteString bsSubject = CFX_WideString(Subject).UTF16LE_Encode(); | 342 return; |
348 CFX_ByteString bsCC = CFX_WideString(CC).UTF16LE_Encode(); | |
349 CFX_ByteString bsBcc = CFX_WideString(BCC).UTF16LE_Encode(); | |
350 CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode(); | |
351 FPDF_WIDESTRING pTo = (FPDF_WIDESTRING)bsTo.GetBuffer(bsTo.GetLength()); | |
352 FPDF_WIDESTRING pCC = (FPDF_WIDESTRING)bsCC.GetBuffer(bsCC.GetLength()); | |
353 FPDF_WIDESTRING pBcc = (FPDF_WIDESTRING)bsBcc.GetBuffer(bsBcc.GetLength()); | |
354 FPDF_WIDESTRING pSubject = | |
355 (FPDF_WIDESTRING)bsSubject.GetBuffer(bsSubject.GetLength()); | |
356 FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength()); | |
357 m_pInfo->m_pJsPlatform->Doc_mail(m_pInfo->m_pJsPlatform, mailData, length, | |
358 bUI, pTo, pSubject, pCC, pBcc, pMsg); | |
359 bsTo.ReleaseBuffer(); | |
360 bsCC.ReleaseBuffer(); | |
361 bsBcc.ReleaseBuffer(); | |
362 bsSubject.ReleaseBuffer(); | |
363 bsMsg.ReleaseBuffer(); | |
364 } | 343 } |
| 344 CFX_ByteString bsTo = CFX_WideString(To).UTF16LE_Encode(); |
| 345 CFX_ByteString bsSubject = CFX_WideString(Subject).UTF16LE_Encode(); |
| 346 CFX_ByteString bsCC = CFX_WideString(CC).UTF16LE_Encode(); |
| 347 CFX_ByteString bsBcc = CFX_WideString(BCC).UTF16LE_Encode(); |
| 348 CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode(); |
| 349 m_pInfo->m_pJsPlatform->Doc_mail( |
| 350 m_pInfo->m_pJsPlatform, mailData, length, bUI, AsFPDFWideString(&bsTo), |
| 351 AsFPDFWideString(&bsSubject), AsFPDFWideString(&bsCC), |
| 352 AsFPDFWideString(&bsBcc), AsFPDFWideString(&bsMsg)); |
| 353 } |
| 354 |
| 355 void CPDFDoc_Environment::JS_docprint(FPDF_BOOL bUI, |
| 356 int nStart, |
| 357 int nEnd, |
| 358 FPDF_BOOL bSilent, |
| 359 FPDF_BOOL bShrinkToFit, |
| 360 FPDF_BOOL bPrintAsImage, |
| 361 FPDF_BOOL bReverse, |
| 362 FPDF_BOOL bAnnotations) { |
| 363 if (!m_pInfo || !m_pInfo->m_pJsPlatform || |
| 364 !m_pInfo->m_pJsPlatform->Doc_print) { |
| 365 return; |
| 366 } |
| 367 m_pInfo->m_pJsPlatform->Doc_print(m_pInfo->m_pJsPlatform, bUI, nStart, nEnd, |
| 368 bSilent, bShrinkToFit, bPrintAsImage, |
| 369 bReverse, bAnnotations); |
| 370 } |
| 371 |
| 372 void CPDFDoc_Environment::JS_docgotoPage(int nPageNum) { |
| 373 if (!m_pInfo || !m_pInfo->m_pJsPlatform || |
| 374 !m_pInfo->m_pJsPlatform->Doc_gotoPage) { |
| 375 return; |
| 376 } |
| 377 m_pInfo->m_pJsPlatform->Doc_gotoPage(m_pInfo->m_pJsPlatform, nPageNum); |
365 } | 378 } |
366 | 379 |
367 IJS_Runtime* CPDFDoc_Environment::GetJSRuntime() { | 380 IJS_Runtime* CPDFDoc_Environment::GetJSRuntime() { |
368 if (!IsJSInitiated()) | 381 if (!IsJSInitiated()) |
369 return NULL; | 382 return NULL; |
370 if (!m_pJSRuntime) | 383 if (!m_pJSRuntime) |
371 m_pJSRuntime.reset(IJS_Runtime::Create(this)); | 384 m_pJSRuntime.reset(IJS_Runtime::Create(this)); |
372 return m_pJSRuntime.get(); | 385 return m_pJSRuntime.get(); |
373 } | 386 } |
374 | 387 |
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1179 CPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot(); | 1192 CPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot(); |
1180 if (!pFocusAnnot) | 1193 if (!pFocusAnnot) |
1181 return nullptr; | 1194 return nullptr; |
1182 | 1195 |
1183 for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) { | 1196 for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) { |
1184 if (pAnnot == pFocusAnnot) | 1197 if (pAnnot == pFocusAnnot) |
1185 return pAnnot; | 1198 return pAnnot; |
1186 } | 1199 } |
1187 return nullptr; | 1200 return nullptr; |
1188 } | 1201 } |
OLD | NEW |