summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBo Xu <bo_xu@foxitsoftware.com>2015-01-21 12:17:23 -0800
committerBo Xu <bo_xu@foxitsoftware.com>2015-01-21 12:59:54 -0800
commita6f95eb2eb735e593f201a3ff9daad77c765cce0 (patch)
tree6d6e7bf325e782db19e00cc5c2b290206cec0e75
parent96d1334cb605aab143d3135da4d4550920735e91 (diff)
downloadpdfium-a6f95eb2eb735e593f201a3ff9daad77c765cce0.tar.xz
Merge to XFA: Simplify UTF16LE_Encode and add unittest.
Previously, UTF16LE_Encode take an optional flag to indicate if the returned byte string has trailing zeros. In fact, no where needs the flag to be false. So just get rid of it so callers won't misuse. The bug is found by https://codereview.chromium.org/837723009 R=tsepez@chromium.org Review URL: https://codereview.chromium.org/860973002
-rw-r--r--BUILD.gn1
-rw-r--r--core/include/fxcrt/fx_string.h2
-rw-r--r--core/src/fxcrt/fx_basic_wstring.cpp16
-rw-r--r--core/src/fxcrt/fx_basic_wstring_unittest.cpp29
-rw-r--r--fpdfsdk/src/fpdfdoc.cpp15
-rw-r--r--fpdfsdk/src/fpdfview.cpp6
-rw-r--r--pdfium.gyp1
7 files changed, 45 insertions, 25 deletions
diff --git a/BUILD.gn b/BUILD.gn
index 6324e85112..bd3d3bc104 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -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',
],
},