Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Side by Side Diff: samples/pdfium_test.cc

Issue 1367633004: Merge to XFA: Fix a couple potential file handle leaks in pdfium_test. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: more nits Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium 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 #include <limits.h> 5 #include <limits.h>
6 #include <stdio.h> 6 #include <stdio.h>
7 #include <stdlib.h> 7 #include <stdlib.h>
8 #include <string.h> 8 #include <string.h>
9 #include <wchar.h> 9 #include <wchar.h>
10 10
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 std::string scale_factor_as_string; 48 std::string scale_factor_as_string;
49 std::string exe_path; 49 std::string exe_path;
50 std::string bin_directory; 50 std::string bin_directory;
51 }; 51 };
52 52
53 // Reads the entire contents of a file into a newly malloc'd buffer. 53 // Reads the entire contents of a file into a newly malloc'd buffer.
54 static char* GetFileContents(const char* filename, size_t* retlen) { 54 static char* GetFileContents(const char* filename, size_t* retlen) {
55 FILE* file = fopen(filename, "rb"); 55 FILE* file = fopen(filename, "rb");
56 if (!file) { 56 if (!file) {
57 fprintf(stderr, "Failed to open: %s\n", filename); 57 fprintf(stderr, "Failed to open: %s\n", filename);
58 return NULL; 58 return nullptr;
59 } 59 }
60 (void) fseek(file, 0, SEEK_END); 60 (void)fseek(file, 0, SEEK_END);
61 size_t file_length = ftell(file); 61 size_t file_length = ftell(file);
62 if (!file_length) { 62 if (!file_length) {
63 return NULL; 63 (void)fclose(file);
64 return nullptr;
64 } 65 }
65 (void) fseek(file, 0, SEEK_SET); 66 (void)fseek(file, 0, SEEK_SET);
66 char* buffer = (char*) malloc(file_length); 67 char* buffer = static_cast<char*>(malloc(file_length));
67 if (!buffer) { 68 if (!buffer) {
68 return NULL; 69 (void)fclose(file);
70 return nullptr;
69 } 71 }
70 size_t bytes_read = fread(buffer, 1, file_length, file); 72 size_t bytes_read = fread(buffer, 1, file_length, file);
71 (void) fclose(file); 73 (void)fclose(file);
72 if (bytes_read != file_length) { 74 if (bytes_read != file_length) {
73 fprintf(stderr, "Failed to read: %s\n", filename); 75 fprintf(stderr, "Failed to read: %s\n", filename);
74 free(buffer); 76 free(buffer);
75 return NULL; 77 return nullptr;
76 } 78 }
77 *retlen = bytes_read; 79 *retlen = bytes_read;
78 return buffer; 80 return buffer;
79 } 81 }
80 82
81 #ifdef V8_USE_EXTERNAL_STARTUP_DATA 83 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
82 // Returns the full path for an external V8 data file based on either 84 // Returns the full path for an external V8 data file based on either
83 // the currect exectuable path or an explicit override. 85 // the currect exectuable path or an explicit override.
84 static std::string GetFullPathForSnapshotFile(const Options& options, 86 static std::string GetFullPathForSnapshotFile(const Options& options,
85 const std::string& filename) { 87 const std::string& filename) {
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 if (!fp) { 190 if (!fp) {
189 fprintf(stderr, "Failed to open %s for output\n", filename); 191 fprintf(stderr, "Failed to open %s for output\n", filename);
190 return; 192 return;
191 } 193 }
192 194
193 size_t bytes_written = fwrite( 195 size_t bytes_written = fwrite(
194 &png_encoding.front(), 1, png_encoding.size(), fp); 196 &png_encoding.front(), 1, png_encoding.size(), fp);
195 if (bytes_written != png_encoding.size()) 197 if (bytes_written != png_encoding.size())
196 fprintf(stderr, "Failed to write to %s\n", filename); 198 fprintf(stderr, "Failed to write to %s\n", filename);
197 199
198 (void) fclose(fp); 200 (void)fclose(fp);
199 } 201 }
200 202
201 #ifdef _WIN32 203 #ifdef _WIN32
202 static void WriteBmp(const char* pdf_name, int num, const void* buffer, 204 static void WriteBmp(const char* pdf_name, int num, const void* buffer,
203 int stride, int width, int height) { 205 int stride, int width, int height) {
204 if (!CheckDimensions(stride, width, height)) 206 if (!CheckDimensions(stride, width, height))
205 return; 207 return;
206 208
207 int out_len = stride * height; 209 int out_len = stride * height;
208 if (out_len > INT_MAX / 3) 210 if (out_len > INT_MAX / 3)
(...skipping 25 matching lines...) Expand all
234 fclose(fp); 236 fclose(fp);
235 } 237 }
236 238
237 void WriteEmf(FPDF_PAGE page, const char* pdf_name, int num) { 239 void WriteEmf(FPDF_PAGE page, const char* pdf_name, int num) {
238 int width = static_cast<int>(FPDF_GetPageWidth(page)); 240 int width = static_cast<int>(FPDF_GetPageWidth(page));
239 int height = static_cast<int>(FPDF_GetPageHeight(page)); 241 int height = static_cast<int>(FPDF_GetPageHeight(page));
240 242
241 char filename[256]; 243 char filename[256];
242 snprintf(filename, sizeof(filename), "%s.%d.emf", pdf_name, num); 244 snprintf(filename, sizeof(filename), "%s.%d.emf", pdf_name, num);
243 245
244 HDC dc = CreateEnhMetaFileA(NULL, filename, NULL, NULL); 246 HDC dc = CreateEnhMetaFileA(nullptr, filename, nullptr, nullptr);
245 247
246 HRGN rgn = CreateRectRgn(0, 0, width, height); 248 HRGN rgn = CreateRectRgn(0, 0, width, height);
247 SelectClipRgn(dc, rgn); 249 SelectClipRgn(dc, rgn);
248 DeleteObject(rgn); 250 DeleteObject(rgn);
249 251
250 SelectObject(dc, GetStockObject(NULL_PEN)); 252 SelectObject(dc, GetStockObject(NULL_PEN));
251 SelectObject(dc, GetStockObject(WHITE_BRUSH)); 253 SelectObject(dc, GetStockObject(WHITE_BRUSH));
252 // If a PS_NULL pen is used, the dimensions of the rectangle are 1 pixel less. 254 // If a PS_NULL pen is used, the dimensions of the rectangle are 1 pixel less.
253 Rectangle(dc, 0, 0, width + 1, height + 1); 255 Rectangle(dc, 0, 0, width + 1, height + 1);
254 256
255 FPDF_RenderPage(dc, page, 0, 0, width, height, 0, 257 FPDF_RenderPage(dc, page, 0, 0, width, height, 0,
256 FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); 258 FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH);
257 259
258 DeleteEnhMetaFile(CloseEnhMetaFile(dc)); 260 DeleteEnhMetaFile(CloseEnhMetaFile(dc));
259 } 261 }
260 #endif 262 #endif
261 263
262 int ExampleAppAlert(IPDF_JSPLATFORM*, FPDF_WIDESTRING msg, FPDF_WIDESTRING, 264 int ExampleAppAlert(IPDF_JSPLATFORM*, FPDF_WIDESTRING msg, FPDF_WIDESTRING,
263 int, int) { 265 int, int) {
264 // Deal with differences between UTF16LE and wchar_t on this platform. 266 // Deal with differences between UTF16LE and wchar_t on this platform.
265 size_t characters = 0; 267 size_t characters = 0;
266 while (msg[characters]) { 268 while (msg[characters]) {
267 ++characters; 269 ++characters;
268 } 270 }
269 wchar_t* platform_string = 271 wchar_t* platform_string =
270 (wchar_t*)malloc((characters + 1) * sizeof(wchar_t)); 272 static_cast<wchar_t*>(malloc((characters + 1) * sizeof(wchar_t)));
271 for (size_t i = 0; i < characters + 1; ++i) { 273 for (size_t i = 0; i < characters + 1; ++i) {
272 unsigned char* ptr = (unsigned char*)&msg[i]; 274 unsigned char* ptr = (unsigned char*)&msg[i];
273 platform_string[i] = ptr[0] + 256 * ptr[1]; 275 platform_string[i] = ptr[0] + 256 * ptr[1];
274 } 276 }
275 printf("Alert: %ls\n", platform_string); 277 printf("Alert: %ls\n", platform_string);
276 free(platform_string); 278 free(platform_string);
277 return 0; 279 return 0;
278 } 280 }
279 281
280 void ExampleDocGotoPage(IPDF_JSPLATFORM*, int pageNumber) { 282 void ExampleDocGotoPage(IPDF_JSPLATFORM*, int pageNumber) {
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 TestLoader(const char* pBuf, size_t len); 399 TestLoader(const char* pBuf, size_t len);
398 400
399 const char* m_pBuf; 401 const char* m_pBuf;
400 size_t m_Len; 402 size_t m_Len;
401 }; 403 };
402 404
403 TestLoader::TestLoader(const char* pBuf, size_t len) 405 TestLoader::TestLoader(const char* pBuf, size_t len)
404 : m_pBuf(pBuf), m_Len(len) { 406 : m_pBuf(pBuf), m_Len(len) {
405 } 407 }
406 408
407 int Get_Block(void* param, unsigned long pos, unsigned char* pBuf, 409 int GetBlock(void* param,
408 unsigned long size) { 410 unsigned long pos,
409 TestLoader* pLoader = (TestLoader*) param; 411 unsigned char* pBuf,
412 unsigned long size) {
413 TestLoader* pLoader = static_cast<TestLoader*>(param);
410 if (pos + size < pos || pos + size > pLoader->m_Len) return 0; 414 if (pos + size < pos || pos + size > pLoader->m_Len) return 0;
411 memcpy(pBuf, pLoader->m_pBuf + pos, size); 415 memcpy(pBuf, pLoader->m_pBuf + pos, size);
412 return 1; 416 return 1;
413 } 417 }
414 418
415 FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { 419 FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) {
416 return true; 420 return true;
417 } 421 }
418 422
419 void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) { 423 void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {
(...skipping 12 matching lines...) Expand all
432 FPDF_FORMFILLINFO form_callbacks; 436 FPDF_FORMFILLINFO form_callbacks;
433 memset(&form_callbacks, '\0', sizeof(form_callbacks)); 437 memset(&form_callbacks, '\0', sizeof(form_callbacks));
434 form_callbacks.version = 2; 438 form_callbacks.version = 2;
435 form_callbacks.m_pJsPlatform = &platform_callbacks; 439 form_callbacks.m_pJsPlatform = &platform_callbacks;
436 440
437 TestLoader loader(pBuf, len); 441 TestLoader loader(pBuf, len);
438 442
439 FPDF_FILEACCESS file_access; 443 FPDF_FILEACCESS file_access;
440 memset(&file_access, '\0', sizeof(file_access)); 444 memset(&file_access, '\0', sizeof(file_access));
441 file_access.m_FileLen = static_cast<unsigned long>(len); 445 file_access.m_FileLen = static_cast<unsigned long>(len);
442 file_access.m_GetBlock = Get_Block; 446 file_access.m_GetBlock = GetBlock;
443 file_access.m_Param = &loader; 447 file_access.m_Param = &loader;
444 448
445 FX_FILEAVAIL file_avail; 449 FX_FILEAVAIL file_avail;
446 memset(&file_avail, '\0', sizeof(file_avail)); 450 memset(&file_avail, '\0', sizeof(file_avail));
447 file_avail.version = 1; 451 file_avail.version = 1;
448 file_avail.IsDataAvail = Is_Data_Avail; 452 file_avail.IsDataAvail = Is_Data_Avail;
449 453
450 FX_DOWNLOADHINTS hints; 454 FX_DOWNLOADHINTS hints;
451 memset(&hints, '\0', sizeof(hints)); 455 memset(&hints, '\0', sizeof(hints));
452 hints.version = 1; 456 hints.version = 1;
453 hints.AddSegment = Add_Segment; 457 hints.AddSegment = Add_Segment;
454 458
455 FPDF_DOCUMENT doc; 459 FPDF_DOCUMENT doc;
456 FPDF_AVAIL pdf_avail = FPDFAvail_Create(&file_avail, &file_access); 460 FPDF_AVAIL pdf_avail = FPDFAvail_Create(&file_avail, &file_access);
457 461
458 (void) FPDFAvail_IsDocAvail(pdf_avail, &hints); 462 (void)FPDFAvail_IsDocAvail(pdf_avail, &hints);
459 463
460 if (!FPDFAvail_IsLinearized(pdf_avail)) { 464 if (!FPDFAvail_IsLinearized(pdf_avail)) {
461 fprintf(stderr, "Non-linearized path...\n"); 465 fprintf(stderr, "Non-linearized path...\n");
462 doc = FPDF_LoadCustomDocument(&file_access, NULL); 466 doc = FPDF_LoadCustomDocument(&file_access, nullptr);
463 } else { 467 } else {
464 fprintf(stderr, "Linearized path...\n"); 468 fprintf(stderr, "Linearized path...\n");
465 doc = FPDFAvail_GetDocument(pdf_avail, NULL); 469 doc = FPDFAvail_GetDocument(pdf_avail, nullptr);
466 } 470 }
467 471
468 if (!doc) 472 if (!doc) {
469 {
470 fprintf(stderr, "Load pdf docs unsuccessful.\n"); 473 fprintf(stderr, "Load pdf docs unsuccessful.\n");
471 return; 474 return;
472 } 475 }
473 476
474 (void) FPDF_GetDocPermissions(doc); 477 (void)FPDF_GetDocPermissions(doc);
475 (void) FPDFAvail_IsFormAvail(pdf_avail, &hints); 478 (void)FPDFAvail_IsFormAvail(pdf_avail, &hints);
476 479
477 FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks); 480 FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks);
478 int docType = DOCTYPE_PDF; 481 int docType = DOCTYPE_PDF;
479 if (FPDF_HasXFAField(doc, &docType)) 482 if (FPDF_HasXFAField(doc, &docType) && docType != DOCTYPE_PDF &&
480 { 483 !FPDF_LoadXFA(doc)) {
481 if (docType != DOCTYPE_PDF && !FPDF_LoadXFA(doc)) 484 fprintf(stderr, "LoadXFA unsuccessful, continuing anyway.\n");
482 fprintf(stderr, "LoadXFA unsuccessful, continuing anyway.\n");
483 } 485 }
484 FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD); 486 FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD);
485 FPDF_SetFormFieldHighlightAlpha(form, 100); 487 FPDF_SetFormFieldHighlightAlpha(form, 100);
486 488
487 int first_page = FPDFAvail_GetFirstPageNum(doc); 489 int first_page = FPDFAvail_GetFirstPageNum(doc);
488 (void) FPDFAvail_IsPageAvail(pdf_avail, first_page, &hints); 490 (void)FPDFAvail_IsPageAvail(pdf_avail, first_page, &hints);
489 491
490 int page_count = FPDF_GetPageCount(doc); 492 int page_count = FPDF_GetPageCount(doc);
491 for (int i = 0; i < page_count; ++i) { 493 for (int i = 0; i < page_count; ++i) {
492 (void) FPDFAvail_IsPageAvail(pdf_avail, i, &hints); 494 (void)FPDFAvail_IsPageAvail(pdf_avail, i, &hints);
493 } 495 }
494 496
495 FORM_DoDocumentJSAction(form); 497 FORM_DoDocumentJSAction(form);
496 FORM_DoDocumentOpenAction(form); 498 FORM_DoDocumentOpenAction(form);
497 499
498 int rendered_pages = 0; 500 int rendered_pages = 0;
499 int bad_pages = 0; 501 int bad_pages = 0;
500 for (int i = 0; i < page_count; ++i) { 502 for (int i = 0; i < page_count; ++i) {
501 FPDF_PAGE page = FPDF_LoadPage(doc, i); 503 FPDF_PAGE page = FPDF_LoadPage(doc, i);
502 if (!page) { 504 if (!page) {
503 bad_pages ++; 505 ++bad_pages;
504 continue; 506 continue;
505 } 507 }
506 FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page); 508 FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);
507 FORM_OnAfterLoadPage(page, form); 509 FORM_OnAfterLoadPage(page, form);
508 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN); 510 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN);
509 511
510 double scale = 1.0; 512 double scale = 1.0;
511 if (!options.scale_factor_as_string.empty()) { 513 if (!options.scale_factor_as_string.empty()) {
512 std::stringstream(options.scale_factor_as_string) >> scale; 514 std::stringstream(options.scale_factor_as_string) >> scale;
513 } 515 }
514 int width = static_cast<int>(FPDF_GetPageWidth(page) * scale); 516 int width = static_cast<int>(FPDF_GetPageWidth(page) * scale);
515 int height = static_cast<int>(FPDF_GetPageHeight(page) * scale); 517 int height = static_cast<int>(FPDF_GetPageHeight(page) * scale);
516 518
517 FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0); 519 FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0);
518 if (!bitmap) { 520 if (!bitmap) {
519 fprintf(stderr, "Page was too large to be rendered.\n"); 521 fprintf(stderr, "Page was too large to be rendered.\n");
520 bad_pages++; 522 bad_pages++;
521 continue; 523 continue;
522 } 524 }
523 525
524 FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF); 526 FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF);
525 FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0); 527 FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0);
526 rendered_pages ++; 528 ++rendered_pages;
527 529
528 FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, 0); 530 FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, 0);
529 int stride = FPDFBitmap_GetStride(bitmap); 531 int stride = FPDFBitmap_GetStride(bitmap);
530 const char* buffer = 532 const char* buffer =
531 reinterpret_cast<const char*>(FPDFBitmap_GetBuffer(bitmap)); 533 reinterpret_cast<const char*>(FPDFBitmap_GetBuffer(bitmap));
532 534
533 switch (options.output_format) { 535 switch (options.output_format) {
534 #ifdef _WIN32 536 #ifdef _WIN32
535 case OUTPUT_BMP: 537 case OUTPUT_BMP:
536 WriteBmp(name.c_str(), i, buffer, stride, width, height); 538 WriteBmp(name.c_str(), i, buffer, stride, width, height);
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 RenderPdf(filename, file_contents, file_length, options); 631 RenderPdf(filename, file_contents, file_length, options);
630 free(file_contents); 632 free(file_contents);
631 } 633 }
632 634
633 FPDF_DestroyLibrary(); 635 FPDF_DestroyLibrary();
634 v8::V8::ShutdownPlatform(); 636 v8::V8::ShutdownPlatform();
635 delete platform; 637 delete platform;
636 638
637 return 0; 639 return 0;
638 } 640 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698