fix for bug 9908, gracefully warn and write back for unknown ptg in namerecord
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352704 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
c5285fb57e
commit
70c6ad8bce
@ -89,6 +89,7 @@ public class NameRecord extends Record {
|
|||||||
private byte field_11_compressed_unicode_flag; // not documented
|
private byte field_11_compressed_unicode_flag; // not documented
|
||||||
private String field_12_name_text;
|
private String field_12_name_text;
|
||||||
private Stack field_13_name_definition;
|
private Stack field_13_name_definition;
|
||||||
|
private byte[] field_13_raw_name_definition = null; // raw data
|
||||||
private String field_14_custom_menu_text;
|
private String field_14_custom_menu_text;
|
||||||
private String field_15_description_text;
|
private String field_15_description_text;
|
||||||
private String field_16_help_topic_text;
|
private String field_16_help_topic_text;
|
||||||
@ -319,9 +320,9 @@ public class NameRecord extends Record {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** gets the definition, reference (Formula)
|
/** gets the definition, reference (Formula)
|
||||||
* @return definition
|
* @return definition -- can be null if we cant parse ptgs
|
||||||
*/
|
*/
|
||||||
public List getNameDefinition() {
|
protected List getNameDefinition() {
|
||||||
return ( List ) field_13_name_definition;
|
return ( List ) field_13_name_definition;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -392,7 +393,12 @@ public class NameRecord extends Record {
|
|||||||
StringUtil.putCompressedUnicode(getNameText(), data , 19 + offset);
|
StringUtil.putCompressedUnicode(getNameText(), data , 19 + offset);
|
||||||
|
|
||||||
int start_of_name_definition = 19 + field_3_length_name_text;
|
int start_of_name_definition = 19 + field_3_length_name_text;
|
||||||
serializePtgs(data, start_of_name_definition + offset);
|
if (this.field_13_name_definition != null) {
|
||||||
|
serializePtgs(data, start_of_name_definition + offset);
|
||||||
|
} else {
|
||||||
|
System.arraycopy(field_13_raw_name_definition,0,data
|
||||||
|
,start_of_name_definition + offset,field_13_raw_name_definition.length);
|
||||||
|
}
|
||||||
|
|
||||||
int start_of_custom_menu_text = start_of_name_definition + field_4_length_name_definition;
|
int start_of_custom_menu_text = start_of_name_definition + field_4_length_name_definition;
|
||||||
StringUtil.putCompressedUnicode(getCustomMenuText(), data , start_of_custom_menu_text + offset);
|
StringUtil.putCompressedUnicode(getCustomMenuText(), data , start_of_custom_menu_text + offset);
|
||||||
@ -449,6 +455,7 @@ public class NameRecord extends Record {
|
|||||||
* @return extern sheet index
|
* @return extern sheet index
|
||||||
*/
|
*/
|
||||||
public short getExternSheetNumber(){
|
public short getExternSheetNumber(){
|
||||||
|
if (field_13_name_definition == null) return 0;
|
||||||
Ptg ptg = (Ptg) field_13_name_definition.peek();
|
Ptg ptg = (Ptg) field_13_name_definition.peek();
|
||||||
short result = 0;
|
short result = 0;
|
||||||
|
|
||||||
@ -468,7 +475,8 @@ public class NameRecord extends Record {
|
|||||||
public void setExternSheetNumber(short externSheetNumber){
|
public void setExternSheetNumber(short externSheetNumber){
|
||||||
Ptg ptg;
|
Ptg ptg;
|
||||||
|
|
||||||
if (field_13_name_definition.isEmpty()){
|
if (field_13_name_definition == null || field_13_name_definition.isEmpty()){
|
||||||
|
field_13_name_definition = new Stack();
|
||||||
ptg = createNewPtg();
|
ptg = createNewPtg();
|
||||||
} else {
|
} else {
|
||||||
ptg = (Ptg) field_13_name_definition.peek();
|
ptg = (Ptg) field_13_name_definition.peek();
|
||||||
@ -494,6 +502,7 @@ public class NameRecord extends Record {
|
|||||||
* @return area reference
|
* @return area reference
|
||||||
*/
|
*/
|
||||||
public String getAreaReference(){
|
public String getAreaReference(){
|
||||||
|
if (field_13_name_definition == null) return "#REF!";
|
||||||
Ptg ptg = (Ptg) field_13_name_definition.peek();
|
Ptg ptg = (Ptg) field_13_name_definition.peek();
|
||||||
String result = "";
|
String result = "";
|
||||||
|
|
||||||
@ -516,7 +525,8 @@ public class NameRecord extends Record {
|
|||||||
Ptg oldPtg;
|
Ptg oldPtg;
|
||||||
Ptg ptg;
|
Ptg ptg;
|
||||||
|
|
||||||
if (field_13_name_definition.isEmpty()){
|
if (field_13_name_definition==null ||field_13_name_definition.isEmpty()){
|
||||||
|
field_13_name_definition = new Stack();
|
||||||
oldPtg = createNewPtg();
|
oldPtg = createNewPtg();
|
||||||
} else {
|
} else {
|
||||||
//Trying to find extern sheet index
|
//Trying to find extern sheet index
|
||||||
@ -599,13 +609,20 @@ public class NameRecord extends Record {
|
|||||||
Stack stack = new Stack();
|
Stack stack = new Stack();
|
||||||
int pos = start_of_expression + offset;
|
int pos = start_of_expression + offset;
|
||||||
int sizeCounter = 0;
|
int sizeCounter = 0;
|
||||||
|
try {
|
||||||
|
while (sizeCounter < size) {
|
||||||
|
Ptg ptg = Ptg.createPtg(data, pos);
|
||||||
|
|
||||||
while (sizeCounter < size) {
|
pos += ptg.getSize();
|
||||||
Ptg ptg = Ptg.createPtg(data, pos);
|
sizeCounter += ptg.getSize();
|
||||||
|
stack.push(ptg);
|
||||||
pos += ptg.getSize();
|
}
|
||||||
sizeCounter += ptg.getSize();
|
} catch (java.lang.UnsupportedOperationException uoe) {
|
||||||
stack.push(ptg);
|
System.err.println("[WARNING] Unknown Ptg "
|
||||||
|
+ uoe.getMessage() );
|
||||||
|
field_13_raw_name_definition=new byte[size];
|
||||||
|
System.arraycopy(data,offset,field_13_raw_name_definition,0,size);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
return stack;
|
return stack;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user