| OLD | NEW |
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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 #include "core/fpdfapi/parser/cpdf_array.h" | 5 #include "core/fpdfapi/parser/cpdf_array.h" |
| 6 #include "core/fpdfapi/parser/cpdf_boolean.h" | 6 #include "core/fpdfapi/parser/cpdf_boolean.h" |
| 7 #include "core/fpdfapi/parser/cpdf_dictionary.h" | 7 #include "core/fpdfapi/parser/cpdf_dictionary.h" |
| 8 #include "core/fpdfapi/parser/cpdf_name.h" | 8 #include "core/fpdfapi/parser/cpdf_name.h" |
| 9 #include "core/fpdfapi/parser/cpdf_null.h" | 9 #include "core/fpdfapi/parser/cpdf_null.h" |
| 10 #include "core/fpdfapi/parser/cpdf_number.h" | 10 #include "core/fpdfapi/parser/cpdf_number.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 m_ArrayObj->InsertNewAt<CPDF_Name>(1, "address"); | 64 m_ArrayObj->InsertNewAt<CPDF_Name>(1, "address"); |
| 65 // Dictionary object. | 65 // Dictionary object. |
| 66 m_DictObj = new CPDF_Dictionary(); | 66 m_DictObj = new CPDF_Dictionary(); |
| 67 m_DictObj->SetNewFor<CPDF_Boolean>("bool", false); | 67 m_DictObj->SetNewFor<CPDF_Boolean>("bool", false); |
| 68 m_DictObj->SetNewFor<CPDF_Number>("num", 0.23f); | 68 m_DictObj->SetNewFor<CPDF_Number>("num", 0.23f); |
| 69 // Stream object. | 69 // Stream object. |
| 70 const char content[] = "abcdefghijklmnopqrstuvwxyz"; | 70 const char content[] = "abcdefghijklmnopqrstuvwxyz"; |
| 71 size_t buf_len = FX_ArraySize(content); | 71 size_t buf_len = FX_ArraySize(content); |
| 72 uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_len)); | 72 uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_len)); |
| 73 memcpy(buf, content, buf_len); | 73 memcpy(buf, content, buf_len); |
| 74 m_StreamDictObj = new CPDF_Dictionary(); | 74 auto pNewDict = pdfium::MakeUnique<CPDF_Dictionary>(); |
| 75 m_StreamDictObj = pNewDict.get(); |
| 75 m_StreamDictObj->SetNewFor<CPDF_String>("key1", L" test dict"); | 76 m_StreamDictObj->SetNewFor<CPDF_String>("key1", L" test dict"); |
| 76 m_StreamDictObj->SetNewFor<CPDF_Number>("key2", -1); | 77 m_StreamDictObj->SetNewFor<CPDF_Number>("key2", -1); |
| 77 CPDF_Stream* stream_obj = new CPDF_Stream(buf, buf_len, m_StreamDictObj); | 78 CPDF_Stream* stream_obj = |
| 79 new CPDF_Stream(buf, buf_len, std::move(pNewDict)); |
| 78 // Null Object. | 80 // Null Object. |
| 79 CPDF_Null* null_obj = new CPDF_Null; | 81 CPDF_Null* null_obj = new CPDF_Null; |
| 80 // All direct objects. | 82 // All direct objects. |
| 81 CPDF_Object* objs[] = {boolean_false_obj, boolean_true_obj, number_int_obj, | 83 CPDF_Object* objs[] = {boolean_false_obj, boolean_true_obj, number_int_obj, |
| 82 number_float_obj, str_reg_obj, str_spec_obj, | 84 number_float_obj, str_reg_obj, str_spec_obj, |
| 83 name_obj, m_ArrayObj, m_DictObj, | 85 name_obj, m_ArrayObj, m_DictObj, |
| 84 stream_obj, null_obj}; | 86 stream_obj, null_obj}; |
| 85 m_DirectObjTypes = { | 87 m_DirectObjTypes = { |
| 86 CPDF_Object::BOOLEAN, CPDF_Object::BOOLEAN, CPDF_Object::NUMBER, | 88 CPDF_Object::BOOLEAN, CPDF_Object::BOOLEAN, CPDF_Object::NUMBER, |
| 87 CPDF_Object::NUMBER, CPDF_Object::STRING, CPDF_Object::STRING, | 89 CPDF_Object::NUMBER, CPDF_Object::STRING, CPDF_Object::STRING, |
| (...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 std::string key("key"); | 583 std::string key("key"); |
| 582 char buf[33]; | 584 char buf[33]; |
| 583 key.append(FXSYS_itoa(j, buf, 10)); | 585 key.append(FXSYS_itoa(j, buf, 10)); |
| 584 int value = j + 200; | 586 int value = j + 200; |
| 585 vals[i]->SetNewFor<CPDF_Number>(key.c_str(), value); | 587 vals[i]->SetNewFor<CPDF_Number>(key.c_str(), value); |
| 586 } | 588 } |
| 587 uint8_t content[] = "content: this is a stream"; | 589 uint8_t content[] = "content: this is a stream"; |
| 588 size_t data_size = FX_ArraySize(content); | 590 size_t data_size = FX_ArraySize(content); |
| 589 uint8_t* data = reinterpret_cast<uint8_t*>(malloc(data_size)); | 591 uint8_t* data = reinterpret_cast<uint8_t*>(malloc(data_size)); |
| 590 memcpy(data, content, data_size); | 592 memcpy(data, content, data_size); |
| 591 stream_vals[i] = arr->AddNew<CPDF_Stream>(data, data_size, vals[i]); | 593 stream_vals[i] = arr->AddNew<CPDF_Stream>(data, data_size, |
| 594 pdfium::WrapUnique(vals[i])); |
| 592 } | 595 } |
| 593 for (size_t i = 0; i < 3; ++i) { | 596 for (size_t i = 0; i < 3; ++i) { |
| 594 TestArrayAccessors(arr.get(), i, // Array and index. | 597 TestArrayAccessors(arr.get(), i, // Array and index. |
| 595 "", // String value. | 598 "", // String value. |
| 596 nullptr, // Const string value. | 599 nullptr, // Const string value. |
| 597 0, // Integer value. | 600 0, // Integer value. |
| 598 0, // Float value. | 601 0, // Float value. |
| 599 nullptr, // Array value. | 602 nullptr, // Array value. |
| 600 vals[i], // Dictionary value. | 603 vals[i], // Dictionary value. |
| 601 stream_vals[i]); // Stream value. | 604 stream_vals[i]); // Stream value. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 626 | 629 |
| 627 CPDF_Dictionary* stream_dict = new CPDF_Dictionary(); | 630 CPDF_Dictionary* stream_dict = new CPDF_Dictionary(); |
| 628 stream_dict->SetNewFor<CPDF_String>("key1", "John", false); | 631 stream_dict->SetNewFor<CPDF_String>("key1", "John", false); |
| 629 stream_dict->SetNewFor<CPDF_String>("key2", "King", false); | 632 stream_dict->SetNewFor<CPDF_String>("key2", "King", false); |
| 630 uint8_t data[] = "A stream for test"; | 633 uint8_t data[] = "A stream for test"; |
| 631 // The data buffer will be owned by stream object, so it needs to be | 634 // The data buffer will be owned by stream object, so it needs to be |
| 632 // dynamically allocated. | 635 // dynamically allocated. |
| 633 size_t buf_size = sizeof(data); | 636 size_t buf_size = sizeof(data); |
| 634 uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_size)); | 637 uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_size)); |
| 635 memcpy(buf, data, buf_size); | 638 memcpy(buf, data, buf_size); |
| 636 CPDF_Stream* stream_val = | 639 CPDF_Stream* stream_val = arr->InsertNewAt<CPDF_Stream>( |
| 637 arr->InsertNewAt<CPDF_Stream>(13, buf, buf_size, stream_dict); | 640 13, buf, buf_size, pdfium::WrapUnique(stream_dict)); |
| 638 const char* const expected_str[] = { | 641 const char* const expected_str[] = { |
| 639 "true", "false", "0", "-1234", "2345", "0.05", "", | 642 "true", "false", "0", "-1234", "2345", "0.05", "", |
| 640 "It is a test!", "NAME", "test", "", "", "", ""}; | 643 "It is a test!", "NAME", "test", "", "", "", ""}; |
| 641 const int expected_int[] = {1, 0, 0, -1234, 2345, 0, 0, | 644 const int expected_int[] = {1, 0, 0, -1234, 2345, 0, 0, |
| 642 0, 0, 0, 0, 0, 0, 0}; | 645 0, 0, 0, 0, 0, 0, 0}; |
| 643 const float expected_float[] = {0, 0, 0, -1234, 2345, 0.05f, 0, | 646 const float expected_float[] = {0, 0, 0, -1234, 2345, 0.05f, 0, |
| 644 0, 0, 0, 0, 0, 0, 0}; | 647 0, 0, 0, 0, 0, 0, 0}; |
| 645 for (size_t i = 0; i < arr->GetCount(); ++i) { | 648 for (size_t i = 0; i < arr->GetCount(); ++i) { |
| 646 EXPECT_STREQ(expected_str[i], arr->GetStringAt(i).c_str()); | 649 EXPECT_STREQ(expected_str[i], arr->GetStringAt(i).c_str()); |
| 647 EXPECT_EQ(expected_int[i], arr->GetIntegerAt(i)); | 650 EXPECT_EQ(expected_int[i], arr->GetIntegerAt(i)); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 // Cloned object should be the same as the original. | 812 // Cloned object should be the same as the original. |
| 810 ASSERT_TRUE(cloned_array); | 813 ASSERT_TRUE(cloned_array); |
| 811 EXPECT_EQ(1u, cloned_array->GetCount()); | 814 EXPECT_EQ(1u, cloned_array->GetCount()); |
| 812 CPDF_Object* cloned_dict = cloned_array->GetObjectAt(0); | 815 CPDF_Object* cloned_dict = cloned_array->GetObjectAt(0); |
| 813 ASSERT_TRUE(cloned_dict); | 816 ASSERT_TRUE(cloned_dict); |
| 814 ASSERT_TRUE(cloned_dict->IsDictionary()); | 817 ASSERT_TRUE(cloned_dict->IsDictionary()); |
| 815 // Recursively referenced object is not cloned. | 818 // Recursively referenced object is not cloned. |
| 816 EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("arr")); | 819 EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("arr")); |
| 817 } | 820 } |
| 818 { | 821 { |
| 819 // Create a dictionary/stream pair with a reference loop. | 822 // Create a dictionary/stream pair with a reference loop. It takes |
| 823 // some work to do this nowadays, in particular we need the |
| 824 // anti-pattern pdfium::WrapUnique(dict.get()). |
| 820 auto dict_obj = pdfium::MakeUnique<CPDF_Dictionary>(); | 825 auto dict_obj = pdfium::MakeUnique<CPDF_Dictionary>(); |
| 821 CPDF_Stream* stream_obj = | 826 CPDF_Stream* stream_obj = dict_obj->SetNewFor<CPDF_Stream>( |
| 822 dict_obj->SetNewFor<CPDF_Stream>("stream", nullptr, 0, dict_obj.get()); | 827 "stream", nullptr, 0, pdfium::WrapUnique(dict_obj.get())); |
| 823 // Clone this object to see whether stack overflow will be triggered. | 828 // Clone this object to see whether stack overflow will be triggered. |
| 824 std::unique_ptr<CPDF_Stream> cloned_stream = ToStream(stream_obj->Clone()); | 829 std::unique_ptr<CPDF_Stream> cloned_stream = ToStream(stream_obj->Clone()); |
| 825 // Cloned object should be the same as the original. | 830 // Cloned object should be the same as the original. |
| 826 ASSERT_TRUE(cloned_stream); | 831 ASSERT_TRUE(cloned_stream); |
| 827 CPDF_Object* cloned_dict = cloned_stream->GetDict(); | 832 CPDF_Object* cloned_dict = cloned_stream->GetDict(); |
| 828 ASSERT_TRUE(cloned_dict); | 833 ASSERT_TRUE(cloned_dict); |
| 829 ASSERT_TRUE(cloned_dict->IsDictionary()); | 834 ASSERT_TRUE(cloned_dict->IsDictionary()); |
| 830 // Recursively referenced object is not cloned. | 835 // Recursively referenced object is not cloned. |
| 831 EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("stream")); | 836 EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("stream")); |
| 832 } | 837 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 CPDF_Object* pObj = dict->SetNewFor<CPDF_Number>("clams", 42); | 870 CPDF_Object* pObj = dict->SetNewFor<CPDF_Number>("clams", 42); |
| 866 dict->ConvertToIndirectObjectFor("clams", &objects_holder); | 871 dict->ConvertToIndirectObjectFor("clams", &objects_holder); |
| 867 CPDF_Object* pRef = dict->GetObjectFor("clams"); | 872 CPDF_Object* pRef = dict->GetObjectFor("clams"); |
| 868 CPDF_Object* pNum = dict->GetDirectObjectFor("clams"); | 873 CPDF_Object* pNum = dict->GetDirectObjectFor("clams"); |
| 869 EXPECT_TRUE(pRef->IsReference()); | 874 EXPECT_TRUE(pRef->IsReference()); |
| 870 EXPECT_TRUE(pNum->IsNumber()); | 875 EXPECT_TRUE(pNum->IsNumber()); |
| 871 EXPECT_NE(pObj, pRef); | 876 EXPECT_NE(pObj, pRef); |
| 872 EXPECT_EQ(pObj, pNum); | 877 EXPECT_EQ(pObj, pNum); |
| 873 EXPECT_EQ(42, dict->GetIntegerFor("clams")); | 878 EXPECT_EQ(42, dict->GetIntegerFor("clams")); |
| 874 } | 879 } |
| OLD | NEW |