From 8e010177ef4bd604155768030c9b222731f2b821 Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Thu, 18 Jun 2009 21:01:13 +0000 Subject: [PATCH] Bugzilla 47384 - Fixed ExternalNameRecord to handle unicode names git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@786267 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../poi/hssf/record/ExternalNameRecord.java | 9 +++++-- .../hssf/record/TestExternalNameRecord.java | 24 +++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 3157a8418..fd3c33004 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -33,6 +33,7 @@ + 47384 - Fixed ExternalNameRecord to handle unicode names 47372 - Fixed locale-sensitive unit tests to pass when running on non-US locale diff --git a/src/java/org/apache/poi/hssf/record/ExternalNameRecord.java b/src/java/org/apache/poi/hssf/record/ExternalNameRecord.java index 0ac34880d..3c7d94354 100755 --- a/src/java/org/apache/poi/hssf/record/ExternalNameRecord.java +++ b/src/java/org/apache/poi/hssf/record/ExternalNameRecord.java @@ -135,8 +135,13 @@ public final class ExternalNameRecord extends StandardRecord { field_1_option_flag = in.readShort(); field_2_index = in.readShort(); field_3_not_used = in.readShort(); - short nameLength = in.readShort(); - field_4_name = in.readCompressedUnicode(nameLength); + int nameLength = in.readUByte(); + int multibyteFlag = in.readUByte(); + if (multibyteFlag == 0) { + field_4_name = in.readCompressedUnicode(nameLength); + } else { + field_4_name = in.readUnicodeLEString(nameLength); + } if(!hasFormula()) { if (!isStdDocumentNameIdentifier() && !isOLELink() && isAutomaticLink()) { // both need to be incremented diff --git a/src/testcases/org/apache/poi/hssf/record/TestExternalNameRecord.java b/src/testcases/org/apache/poi/hssf/record/TestExternalNameRecord.java index 5c693d36c..8831f02be 100644 --- a/src/testcases/org/apache/poi/hssf/record/TestExternalNameRecord.java +++ b/src/testcases/org/apache/poi/hssf/record/TestExternalNameRecord.java @@ -135,4 +135,28 @@ public final class TestExternalNameRecord extends TestCase { TestcaseRecordInputStream.confirmRecordEncoding(0x0023, dataDDE, enr.serialize()); } + + public void testUnicodeName_bug47384() { + // 0x13A0 + byte[] dataUN = HexRead.readFromString( + "23 00 22 00" + + "00 00 00 00 00 00 " + + "0C 01 " + + "59 01 61 00 7A 00 65 00 6E 00 ED 00 5F 00 42 00 69 00 6C 00 6C 00 61 00" + + "00 00"); + + RecordInputStream in = TestcaseRecordInputStream.create(dataUN); + ExternalNameRecord enr; + try { + enr = new ExternalNameRecord(in); + } catch (RecordFormatException e) { + // actual msg reported in bugzilla 47229 is different + // because that seems to be using a version from before svn r646666 + if (e.getMessage().startsWith("Expected to find a ContinueRecord in order to read remaining 242 of 268 chars")) { + throw new AssertionFailedError("Identified bug 47384 - failed to read ENR with unicode name"); + } + throw e; + } + assertEquals("\u0159azen\u00ED_Billa", enr.getText()); + } }