diff options
-rw-r--r-- | BUILD.gn | 1 | ||||
-rw-r--r-- | core/include/fxcrt/fx_string.h | 2 | ||||
-rw-r--r-- | core/src/fxcrt/fx_basic_wstring.cpp | 16 | ||||
-rw-r--r-- | core/src/fxcrt/fx_basic_wstring_unittest.cpp | 29 | ||||
-rw-r--r-- | fpdfsdk/src/fpdfdoc.cpp | 15 | ||||
-rw-r--r-- | fpdfsdk/src/fpdfview.cpp | 6 | ||||
-rw-r--r-- | pdfium.gyp | 1 |
7 files changed, 45 insertions, 25 deletions
@@ -1546,6 +1546,7 @@ static_library("xfa") { test("pdfium_unittests") { sources = [ "core/src/fxcrt/fx_basic_bstring_unittest.cpp", + "core/src/fxcrt/fx_basic_wstring_unittest.cpp", "testing/fx_string_testhelpers.cpp", "testing/fx_string_testhelpers.h", "xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp", diff --git a/core/include/fxcrt/fx_string.h b/core/include/fxcrt/fx_string.h index eae1c15a04..33634f8379 100644 --- a/core/include/fxcrt/fx_string.h +++ b/core/include/fxcrt/fx_string.h @@ -774,7 +774,7 @@ public: CFX_ByteString UTF8Encode() const; - CFX_ByteString UTF16LE_Encode(FX_BOOL bTerminate = TRUE) const; + CFX_ByteString UTF16LE_Encode() const; void ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL); protected: diff --git a/core/src/fxcrt/fx_basic_wstring.cpp b/core/src/fxcrt/fx_basic_wstring.cpp index 0827fb6f34..0945d2f1c5 100644 --- a/core/src/fxcrt/fx_basic_wstring.cpp +++ b/core/src/fxcrt/fx_basic_wstring.cpp @@ -323,25 +323,21 @@ CFX_ByteString CFX_WideString::UTF8Encode() const { return FX_UTF8Encode(*this); } -CFX_ByteString CFX_WideString::UTF16LE_Encode(FX_BOOL bTerminate) const +CFX_ByteString CFX_WideString::UTF16LE_Encode() const { if (m_pData == NULL) { - return bTerminate ? CFX_ByteString(FX_BSTRC("\0\0")) : CFX_ByteString(); + return CFX_ByteString(FX_BSTRC("\0\0")); } int len = m_pData->m_nDataLength; CFX_ByteString result; - FX_LPSTR buffer = result.GetBuffer(len * 2 + (bTerminate ? 2 : 0)); + FX_LPSTR buffer = result.GetBuffer(len * 2 + 2); for (int i = 0; i < len; i ++) { buffer[i * 2] = m_pData->m_String[i] & 0xff; buffer[i * 2 + 1] = m_pData->m_String[i] >> 8; } - if (bTerminate) { - buffer[len * 2] = 0; - buffer[len * 2 + 1] = 0; - result.ReleaseBuffer(len * 2 + 2); - } else { - result.ReleaseBuffer(len * 2); - } + buffer[len * 2] = 0; + buffer[len * 2 + 1] = 0; + result.ReleaseBuffer(len * 2 + 2); return result; } void CFX_WideString::ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap) diff --git a/core/src/fxcrt/fx_basic_wstring_unittest.cpp b/core/src/fxcrt/fx_basic_wstring_unittest.cpp new file mode 100644 index 0000000000..c6e5c2f3d0 --- /dev/null +++ b/core/src/fxcrt/fx_basic_wstring_unittest.cpp @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "../../../testing/fx_string_testhelpers.h"
+#include "../../include/fxcrt/fx_basic.h"
+
+#define ByteStringLiteral(str) CFX_ByteString(FX_BSTRC(str))
+
+TEST(fxcrt, WideStringUTF16LE_Encode) {
+ struct UTF16LEEncodeCase {
+ CFX_WideString ws;
+ CFX_ByteString bs;
+ } utf16le_encode_cases[] = {
+ { L"", ByteStringLiteral("\0\0") },
+ { L"abc", ByteStringLiteral("a\0b\0c\0\0\0") },
+ { L"abcdef", ByteStringLiteral("a\0b\0c\0d\0e\0f\0\0\0") },
+ { L"abc\0def", ByteStringLiteral("a\0b\0c\0\0\0") },
+ { L"\xaabb\xccdd", ByteStringLiteral("\xbb\xaa\xdd\xcc\0\0") },
+ { L"\x3132\x6162", ByteStringLiteral("\x32\x31\x62\x61\0\0") },
+ };
+
+ for (size_t i = 0; i < FX_ArraySize(utf16le_encode_cases); ++i) {
+ EXPECT_EQ(utf16le_encode_cases[i].bs,
+ utf16le_encode_cases[i].ws.UTF16LE_Encode())
+ << " for case number " << i;
+ }
+}
diff --git a/fpdfsdk/src/fpdfdoc.cpp b/fpdfsdk/src/fpdfdoc.cpp index 23c3c2e713..19b4581829 100644 --- a/fpdfsdk/src/fpdfdoc.cpp +++ b/fpdfsdk/src/fpdfdoc.cpp @@ -55,14 +55,12 @@ DLLEXPORT unsigned long STDCALL FPDFBookmark_GetTitle(FPDF_BOOKMARK pDict, void* return 0; CPDF_Bookmark bookmark((CPDF_Dictionary*)pDict); CFX_WideString title = bookmark.GetTitle(); - CFX_ByteString encodedTitle = title.UTF16LE_Encode(FALSE); + CFX_ByteString encodedTitle = title.UTF16LE_Encode(); unsigned long len = encodedTitle.GetLength(); - if (buffer && buflen >= len + 2) { + if (buffer && buflen >= len) { FXSYS_memcpy(buffer, encodedTitle.c_str(), len); - ((FX_BYTE*)buffer)[len] = 0; - ((FX_BYTE*)buffer)[len + 1] = 0; } - return len + 2; + return len; } DLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, FPDF_WIDESTRING title) @@ -296,11 +294,8 @@ DLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT doc, FPDF_BYTESTR // Use UTF-16LE encoding CFX_ByteString encodedText = text.UTF16LE_Encode(); unsigned long len = encodedText.GetLength(); - if (buffer && buflen >= len + 2) { + if (buffer && buflen >= len) { FXSYS_memcpy(buffer, encodedText.c_str(), len); - // use double zero as trailer - ((FX_BYTE*)buffer)[len] = 0; - ((FX_BYTE*)buffer)[len + 1] = 0; } - return len+2; + return len; } diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp index 291b9f6d94..f084ce0da7 100644 --- a/fpdfsdk/src/fpdfview.cpp +++ b/fpdfsdk/src/fpdfview.cpp @@ -1055,11 +1055,9 @@ DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDest(FPDF_DOCUMENT document, int index, CFX_ByteString utf16Name = wsName.UTF16LE_Encode(); unsigned int len = utf16Name.GetLength(); if (!buffer) { - buflen = len + 2; - } else if (buflen >= len + 2) { + buflen = len; + } else if (buflen >= len) { memcpy(buffer, utf16Name.c_str(), len); - ((FX_BYTE*)buffer)[len] = 0; - ((FX_BYTE*)buffer)[len + 1] = 0; } else { len = -1; } diff --git a/pdfium.gyp b/pdfium.gyp index 6b8214e18c..3fba4ec1e9 100644 --- a/pdfium.gyp +++ b/pdfium.gyp @@ -905,6 +905,7 @@ 'testing/fx_string_testhelpers.h', 'testing/fx_string_testhelpers.cpp', 'core/src/fxcrt/fx_basic_bstring_unittest.cpp', + 'core/src/fxcrt/fx_basic_wstring_unittest.cpp', 'xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp', ], }, |