Commit fdb25af6 authored by Elen.Subbotina's avatar Elen.Subbotina Committed by Alexander Trofimov

XlsFile2 правка по результатам тестирования

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@64306 954022d7-b5bf-4e40-9824-e11837661b57
parent 077bd7e0
...@@ -69,12 +69,14 @@ void SST::readFields(CFRecord& record) ...@@ -69,12 +69,14 @@ void SST::readFields(CFRecord& record)
{ {
XLUnicodeRichExtendedStringPtr element(new XLUnicodeRichExtendedString(recs)); XLUnicodeRichExtendedStringPtr element(new XLUnicodeRichExtendedString(recs));
element->set_code_page(code_page_); if (record.getRdPtr() + 3 > record.getDataSize()) // If the break is at the XLUnicodeRichExtendedString boundary
if(record.isEOF()) // If the break is at the XLUnicodeRichExtendedString boundary
{ {
element->appendNextContinue(record, false); element->appendNextContinue(record, false);
} }
if (record.getRdPtr() + 3 > record.getDataSize())
break;
record >> *element; record >> *element;
rgb.push_back(element); rgb.push_back(element);
count++; count++;
...@@ -93,22 +95,31 @@ int SST::serialize(std::wostream & stream) ...@@ -93,22 +95,31 @@ int SST::serialize(std::wostream & stream)
for (int i=0; i < rgb.size(); i++) for (int i=0; i < rgb.size(); i++)
{ {
CP_XML_NODE(L"si") XLUnicodeRichExtendedString *richText = dynamic_cast<XLUnicodeRichExtendedString *>(rgb[i].get());
{
XLUnicodeRichExtendedString *richText = dynamic_cast<XLUnicodeRichExtendedString *>(rgb[i].get());
// - r-rPr-t t
if (richText->rgRun.size() >0) if (richText == NULL) continue;
{
richText->serialize(CP_XML_STREAM()); CP_XML_NODE(L"si")
} {
else try
{ {
CP_XML_NODE(L"t") // - r-rPr-t t
{ if (richText->rgRun.size() >0)
CP_XML_STREAM() << STR::escape_ST_Xstring(xml::utils::replace_text_to_xml(richText->str_)); {
richText->serialize(CP_XML_STREAM());
}
else
{
CP_XML_NODE(L"t")
{
CP_XML_STREAM() << STR::escape_ST_Xstring(xml::utils::replace_text_to_xml(richText->str_));
}
} }
} }
catch(...)
{
CP_XML_NODE(L"t");
}
} }
} }
} }
......
...@@ -69,28 +69,35 @@ void BiffString::load(CFRecord& record) ...@@ -69,28 +69,35 @@ void BiffString::load(CFRecord& record)
void BiffString::load(CFRecord& record, const size_t cch1, const bool is_wide1) void BiffString::load(CFRecord& record, const size_t cch1, const bool is_wide1)
{ {
bool is_wide = is_wide1; bool is_wide = is_wide1;
size_t cch = cch1;
size_t cch = cch1;
if ((cch_) && (*cch_ != cch1) && cch1 < 1)
{
cch = cch_.get();
}
size_t raw_length = cch << (is_wide ? 1 : 0); size_t raw_length = cch << (is_wide ? 1 : 0);
if (record.checkFitRead(raw_length)) if (record.checkFitRead(raw_length)==false)
{ {
if(is_wide) // - Continue records -
{ return;
#if defined(_WIN32) || defined(_WIN64) }
std::wstring int_str(record.getCurData<wchar_t>(), cch);
str_ = int_str.c_str(); if(is_wide)
#else {
str_= convertUtf16ToWString(record.getCurData<UTF16>(), cch); #if defined(_WIN32) || defined(_WIN64)
#endif std::wstring int_str(record.getCurData<wchar_t>(), cch);
} str_ = int_str.c_str();
else #else
{ str_= convertUtf16ToWString(record.getCurData<UTF16>(), cch);
std::string int_str(record.getCurData<char>(), cch); #endif
str_ = STR::toStdWString(int_str, record.getGlobalWorkbookInfo()->CodePage).c_str(); }
} else
record.skipNunBytes(raw_length); {
std::string int_str(record.getCurData<char>(), cch);
str_ = STR::toStdWString(int_str, record.getGlobalWorkbookInfo()->CodePage).c_str();
} }
record.skipNunBytes(raw_length);
} }
......
...@@ -17,6 +17,10 @@ void ExtRst::store(CFRecord& record) ...@@ -17,6 +17,10 @@ void ExtRst::store(CFRecord& record)
// record << reserved << cb << phs << rphssub << rgphruns; // record << reserved << cb << phs << rphssub << rgphruns;
} }
ExtRst::ExtRst(std::list<CFRecordPtr>& cont_recs) : cont_recs_(cont_recs)
{
}
void ExtRst::load(CFRecord& record) void ExtRst::load(CFRecord& record)
{ {
...@@ -33,11 +37,16 @@ void ExtRst::load(CFRecord& record) ...@@ -33,11 +37,16 @@ void ExtRst::load(CFRecord& record)
PhRuns run; PhRuns run;
record >> run; record >> run;
rgphruns.push_back(run); rgphruns.push_back(run);
} }
size_t data_end = record.getRdPtr(); size_t data_end = record.getRdPtr();
if(data_end - data_start < cb) if(data_end - data_start != cb)
{ {
record.skipNunBytes(cb - (data_end - data_start)); // trash for unknown reason // - Continue records -
if ((data_end - data_start) < cb )
record.skipNunBytes( cb - (data_end - data_start)); // trash for unknown reason
else
record.RollRdPtrBack((data_end - data_start) - cb);
} }
} }
......
...@@ -16,6 +16,8 @@ class ExtRst : public BiffStructure ...@@ -16,6 +16,8 @@ class ExtRst : public BiffStructure
public: public:
BiffStructurePtr clone(); BiffStructurePtr clone();
ExtRst(std::list<CFRecordPtr>& cont_recs);
static const ElementType type = typeExtRst; static const ElementType type = typeExtRst;
virtual void load(CFRecord& record); virtual void load(CFRecord& record);
...@@ -27,6 +29,8 @@ public: ...@@ -27,6 +29,8 @@ public:
Phs phs; Phs phs;
RPHSSub rphssub; RPHSSub rphssub;
std::vector<PhRuns> rgphruns; std::vector<PhRuns> rgphruns;
std::list<CFRecordPtr>& cont_recs_;
}; };
} // namespace XLS } // namespace XLS
...@@ -552,8 +552,8 @@ void MSOPOINT::load(XLS::CFRecord& record) ...@@ -552,8 +552,8 @@ void MSOPOINT::load(XLS::CFRecord& record)
{ {
unsigned char x_; unsigned char x_;
record >> x_; record >> x_;
y = GETBITS(x_,0 , 3) << 8; x = GETBITS(x_,0 , 3) << 8;
x = GETBITS(x_,4 , 8) << 8; y = GETBITS(x_,4 , 8) << 8;
} }
} }
......
...@@ -11,22 +11,6 @@ BiffStructurePtr PhRuns::clone() ...@@ -11,22 +11,6 @@ BiffStructurePtr PhRuns::clone()
return BiffStructurePtr(new PhRuns(*this)); return BiffStructurePtr(new PhRuns(*this));
} }
//
//void PhRuns::setXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
// xml_tag->setAttribute(L"ichFirst", ichFirst);
// xml_tag->setAttribute(L"ichFirst", ichMom);
// xml_tag->setAttribute(L"ichFirst", cchMom);
//}
//
//void PhRuns::getXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
// ichFirst = getStructAttribute(xml_tag, L"ichFirst");
// ichMom = getStructAttribute(xml_tag, L"ichFirst");
// cchMom = getStructAttribute(xml_tag, L"ichFirst");
//}
void PhRuns::store(CFRecord& record) void PhRuns::store(CFRecord& record)
{ {
record << ichFirst << ichMom << cchMom; record << ichFirst << ichMom << cchMom;
......
...@@ -12,23 +12,6 @@ BiffStructurePtr Phs::clone() ...@@ -12,23 +12,6 @@ BiffStructurePtr Phs::clone()
} }
//void Phs::setXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
// xml_tag->setAttribute(L"ifnt", ifnt);
// xml_tag->setAttribute(L"phType", data.phType);
// xml_tag->setAttribute(L"alcH", data.alcH);
//}
//
//void Phs::getXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
// ifnt = getStructAttribute(xml_tag, L"ifnt");
// data.phType = getStructAttribute(xml_tag, L"phType");
// data.alcH = getStructAttribute(xml_tag, L"alcH");
// data.unused = 0;
// data.set_one = 0xff;
//}
void Phs::store(CFRecord& record) void Phs::store(CFRecord& record)
{ {
record << ifnt; record << ifnt;
......
...@@ -12,19 +12,6 @@ BiffStructurePtr RPHSSub::clone() ...@@ -12,19 +12,6 @@ BiffStructurePtr RPHSSub::clone()
} }
//void RPHSSub::setXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
// xml_tag->setAttribute(L"crun", crun);
// xml_tag->setAttribute(L"st", st);
//}
//
//void RPHSSub::getXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
// crun = getStructAttribute(xml_tag, L"crun");
// st = static_cast<std::wstring >(getStructAttribute(xml_tag, L"st"));
//}
void RPHSSub::store(CFRecord& record) void RPHSSub::store(CFRecord& record)
{ {
unsigned short cch = st.getSize(); unsigned short cch = st.getSize();
...@@ -37,6 +24,8 @@ void RPHSSub::load(CFRecord& record) ...@@ -37,6 +24,8 @@ void RPHSSub::load(CFRecord& record)
unsigned short cch; unsigned short cch;
record >> crun >> cch; record >> crun >> cch;
st.setSize(cch);
record >> st; record >> st;
} }
......
...@@ -20,7 +20,7 @@ XLUnicodeRichExtendedString XLUnicodeRichExtendedString::operator=(const XLUnico ...@@ -20,7 +20,7 @@ XLUnicodeRichExtendedString XLUnicodeRichExtendedString::operator=(const XLUnico
XLUnicodeRichExtendedString::XLUnicodeRichExtendedString(std::list<CFRecordPtr>& cont_recs) XLUnicodeRichExtendedString::XLUnicodeRichExtendedString(std::list<CFRecordPtr>& cont_recs)
: cont_recs_(cont_recs), : cont_recs_(cont_recs),
fHighByte(true), fHighByte(true),
code_page_(0) extRst(cont_recs)
{ {
} }
...@@ -30,16 +30,31 @@ const bool XLUnicodeRichExtendedString::appendNextContinue(CFRecord& record, con ...@@ -30,16 +30,31 @@ const bool XLUnicodeRichExtendedString::appendNextContinue(CFRecord& record, con
{ {
return false; return false;
} }
if(read_high_byte)
{ RecordType type = (RecordType)cont_recs_.front()->getTypeId();
fHighByte = 0x01 == cont_recs_.front()->getData()[0];
record.appendRawData(cont_recs_.front()->getData() + 1, cont_recs_.front()->getDataSize() - 1); while(!cont_recs_.empty())
}
else
{ {
record.appendRawData(cont_recs_.front()); type = (RecordType)cont_recs_.front()->getTypeId();
if (type == rt_SST || type == rt_Continue)
{
if(read_high_byte)
{
fHighByte = (0x01 == cont_recs_.front()->getData()[0]);
record.appendRawData(cont_recs_.front()->getData() + 1, cont_recs_.front()->getDataSize() - 1);
}
else
{
record.appendRawData(cont_recs_.front());
}
cont_recs_.pop_front();
break;
}
else
cont_recs_.pop_front();
} }
cont_recs_.pop_front();
return true; return true;
} }
...@@ -180,7 +195,7 @@ void XLUnicodeRichExtendedString::store(CFRecord& record) ...@@ -180,7 +195,7 @@ void XLUnicodeRichExtendedString::store(CFRecord& record)
if(fExtSt) if(fExtSt)
{ {
record << extRst; extRst.store(record);
} }
} }
...@@ -192,18 +207,27 @@ void XLUnicodeRichExtendedString::load(CFRecord& record) ...@@ -192,18 +207,27 @@ void XLUnicodeRichExtendedString::load(CFRecord& record)
if (code_page_== 0) if (code_page_== 0)
code_page_ = pGlobalWorkbookInfoPtr ->CodePage; code_page_ = pGlobalWorkbookInfoPtr ->CodePage;
unsigned short cch; unsigned short cch = 0;
unsigned char flags; unsigned char flags = 0;
record >> cch >> flags; record >> cch >> flags;
fHighByte = GETBIT(flags, 0);
fExtSt = GETBIT(flags, 2); if (record.getDataSize() == record.getRdPtr())
fRichSt = GETBIT(flags, 3); {
if (appendNextContinue(record,false) == false)
return;
}
fHighByte = GETBIT(flags, 0);
fExtSt = GETBIT(flags, 2);
fRichSt = GETBIT(flags, 3);
unsigned short cRun = 0; unsigned short cRun = 0;
if(fRichSt) if(fRichSt)
{ {
record >> cRun; record >> cRun;
} }
int cbExtRst = 0; int cbExtRst = 0;
if(fExtSt) if(fExtSt)
{ {
record >> cbExtRst; record >> cbExtRst;
...@@ -217,21 +241,24 @@ void XLUnicodeRichExtendedString::load(CFRecord& record) ...@@ -217,21 +241,24 @@ void XLUnicodeRichExtendedString::load(CFRecord& record)
record >> cRun; record >> cRun;
} }
} }
if(!record.checkFitReadSafe(static_cast<size_t>(cch) << (fHighByte ? 1 : 0))) if(!record.checkFitReadSafe(static_cast<size_t>(cch) << (fHighByte ? 1 : 0)))
{ {
size_t num_symbols = (std::min)(static_cast<size_t>(cch), (record.getDataSize() - record.getRdPtr()) >> (fHighByte ? 1 : 0)); size_t num_symbols = (std::min)(static_cast<size_t>(cch), (record.getDataSize() - record.getRdPtr()) >> (fHighByte ? 1 : 0));
loadSymbols(record, num_symbols, fHighByte); loadSymbols(record, num_symbols, fHighByte);
size_t str_sz = num_symbols;
std::wstring str_full(str_); std::wstring str_full(str_);
do do
{ {
if (appendNextContinue(record, true) == false) // fHighByte changes here if (appendNextContinue(record, true) == false) // fHighByte changes here
break; //dicionario de kanji.xls break; //dicionario de kanji.xls
num_symbols = (std::min)(cch - str_full.length(), (record.getDataSize() - record.getRdPtr()) >> (fHighByte ? 1 : 0)); num_symbols = (std::min)(cch - str_full.length(), (record.getDataSize() - record.getRdPtr()) >> (fHighByte ? 1 : 0));
loadSymbols(record, num_symbols, fHighByte); // cch has changed, fHighByte has changed loadSymbols(record, num_symbols, fHighByte); // cch has changed, fHighByte has changed
str_full += str_; str_full += str_;
str_sz += num_symbols;
} }
while(str_full.length() < cch); while(str_sz < cch);
std::swap(str_full, str_); // Thus we avoid additional copy in operator= std::swap(str_full, str_); // Thus we avoid additional copy in operator=
} }
...@@ -239,7 +266,11 @@ void XLUnicodeRichExtendedString::load(CFRecord& record) ...@@ -239,7 +266,11 @@ void XLUnicodeRichExtendedString::load(CFRecord& record)
{ {
loadSymbols(record, cch, fHighByte); loadSymbols(record, cch, fHighByte);
} }
if (record.getRdPtr() + cRun * 4 > record.getDataSize() && !cont_recs_.empty())
{
record.appendRawData(cont_recs_.front());
cont_recs_.pop_front();
}
for(size_t i = 0; i < cRun; ++i) for(size_t i = 0; i < cRun; ++i)
{ {
FormatRun format; FormatRun format;
...@@ -249,7 +280,12 @@ void XLUnicodeRichExtendedString::load(CFRecord& record) ...@@ -249,7 +280,12 @@ void XLUnicodeRichExtendedString::load(CFRecord& record)
if(fExtSt && cbExtRst > 0) if(fExtSt && cbExtRst > 0)
{ {
record >> extRst; if (record.getRdPtr() + cbExtRst > record.getDataSize() && !cont_recs_.empty())
{
record.appendRawData(cont_recs_.front());
cont_recs_.pop_front();
}
extRst.load(record);
} }
} }
......
...@@ -134,7 +134,14 @@ int CELL_GROUP::serialize(std::wostream & stream) ...@@ -134,7 +134,14 @@ int CELL_GROUP::serialize(std::wostream & stream)
if (row->ixfe_val.value() && xf_set) if (row->ixfe_val.value() && xf_set)
{ {
CP_XML_ATTR(L"s", row->ixfe_val - cellStyleXfs_count); if (row->ixfe_val > cellStyleXfs_count)
{
CP_XML_ATTR(L"s", row->ixfe_val - cellStyleXfs_count);
}
else
{
CP_XML_ATTR(L"s", row->ixfe_val);
}
CP_XML_ATTR(L"customFormat", true); CP_XML_ATTR(L"customFormat", true);
} }
if (row->miyRw.value())// 255 twips(1/20 pt) if (row->miyRw.value())// 255 twips(1/20 pt)
...@@ -204,7 +211,14 @@ int CELL_GROUP::serialize(std::wostream & stream) ...@@ -204,7 +211,14 @@ int CELL_GROUP::serialize(std::wostream & stream)
if (row->ixfe_val.value() && xf_set) if (row->ixfe_val.value() && xf_set)
{ {
CP_XML_ATTR(L"s", row->ixfe_val - cellStyleXfs_count); if (row->ixfe_val > cellStyleXfs_count)
{
CP_XML_ATTR(L"s", row->ixfe_val - cellStyleXfs_count);
}
else
{
CP_XML_ATTR(L"s", row->ixfe_val);
}
CP_XML_ATTR(L"customFormat", true); CP_XML_ATTR(L"customFormat", true);
} }
......
...@@ -114,9 +114,13 @@ int FORMULA::serialize(std::wostream & stream) ...@@ -114,9 +114,13 @@ int FORMULA::serialize(std::wostream & stream)
case 1: CP_XML_ATTR(L"t", L"b"); break; case 1: CP_XML_ATTR(L"t", L"b"); break;
case 2: CP_XML_ATTR(L"t", L"e"); break; case 2: CP_XML_ATTR(L"t", L"e"); break;
} }
CP_XML_NODE(L"f") const std::wstring & f_ = formula->formula.getAssembledFormula();
if (!f_.empty())
{ {
CP_XML_STREAM() << xml::utils::replace_text_to_xml(formula->formula.getAssembledFormula()); CP_XML_NODE(L"f")
{
CP_XML_STREAM() << xml::utils::replace_text_to_xml(f_);
}
} }
std::wstring str_val = formula->val.getValue(); std::wstring str_val = formula->val.getValue();
if (!str_val.empty()) if (!str_val.empty())
......
...@@ -799,6 +799,9 @@ void XlsConverter::convert_geometry(std::vector<ODRAW::OfficeArtFOPTEPtr> & prop ...@@ -799,6 +799,9 @@ void XlsConverter::convert_geometry(std::vector<ODRAW::OfficeArtFOPTEPtr> & prop
int count_point[] = { 1, 3, 1, 0}; int count_point[] = { 1, 3, 1, 0};
for (int i = 0 ; i < command.size(); i++) for (int i = 0 ; i < command.size(); i++)
{ {
if (ind_point >= points.size())
break;
//if (command[i].typeSegment == ODRAW::msopathEnd) break; //if (command[i].typeSegment == ODRAW::msopathEnd) break;
if (command[i].typeSegment > 3) continue; if (command[i].typeSegment > 3) continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment