summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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',
],
},