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)
{
XLUnicodeRichExtendedStringPtr element(new XLUnicodeRichExtendedString(recs));
element->set_code_page(code_page_);
if(record.isEOF()) // If the break is at the XLUnicodeRichExtendedString boundary
if (record.getRdPtr() + 3 > record.getDataSize()) // If the break is at the XLUnicodeRichExtendedString boundary
{
element->appendNextContinue(record, false);
}
if (record.getRdPtr() + 3 > record.getDataSize())
break;
record >> *element;
rgb.push_back(element);
count++;
......@@ -93,22 +95,31 @@ int SST::serialize(std::wostream & stream)
for (int i=0; i < rgb.size(); i++)
{
CP_XML_NODE(L"si")
{
XLUnicodeRichExtendedString *richText = dynamic_cast<XLUnicodeRichExtendedString *>(rgb[i].get());
// - r-rPr-t t
XLUnicodeRichExtendedString *richText = dynamic_cast<XLUnicodeRichExtendedString *>(rgb[i].get());
if (richText->rgRun.size() >0)
{
richText->serialize(CP_XML_STREAM());
}
else
if (richText == NULL) continue;
CP_XML_NODE(L"si")
{
try
{
CP_XML_NODE(L"t")
{
CP_XML_STREAM() << STR::escape_ST_Xstring(xml::utils::replace_text_to_xml(richText->str_));
// - r-rPr-t t
if (richText->rgRun.size() >0)
{
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)
void BiffString::load(CFRecord& record, const size_t cch1, const bool 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);
if (record.checkFitRead(raw_length))
if (record.checkFitRead(raw_length)==false)
{
if(is_wide)
{
#if defined(_WIN32) || defined(_WIN64)
std::wstring int_str(record.getCurData<wchar_t>(), cch);
str_ = int_str.c_str();
#else
str_= convertUtf16ToWString(record.getCurData<UTF16>(), cch);
#endif
}
else
{
std::string int_str(record.getCurData<char>(), cch);
str_ = STR::toStdWString(int_str, record.getGlobalWorkbookInfo()->CodePage).c_str();
}
record.skipNunBytes(raw_length);
// - Continue records -
return;
}
if(is_wide)
{
#if defined(_WIN32) || defined(_WIN64)
std::wstring int_str(record.getCurData<wchar_t>(), cch);
str_ = int_str.c_str();
#else
str_= convertUtf16ToWString(record.getCurData<UTF16>(), cch);
#endif
}
else
{
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)
// record << reserved << cb << phs << rphssub << rgphruns;
}
ExtRst::ExtRst(std::list<CFRecordPtr>& cont_recs) : cont_recs_(cont_recs)
{
}
void ExtRst::load(CFRecord& record)
{
......@@ -33,11 +37,16 @@ void ExtRst::load(CFRecord& record)
PhRuns run;
record >> run;
rgphruns.push_back(run);
}
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
public:
BiffStructurePtr clone();
ExtRst(std::list<CFRecordPtr>& cont_recs);
static const ElementType type = typeExtRst;
virtual void load(CFRecord& record);
......@@ -27,6 +29,8 @@ public:
Phs phs;
RPHSSub rphssub;
std::vector<PhRuns> rgphruns;
std::list<CFRecordPtr>& cont_recs_;
};
} // namespace XLS
......@@ -552,8 +552,8 @@ void MSOPOINT::load(XLS::CFRecord& record)
{
unsigned char x_;
record >> x_;
y = GETBITS(x_,0 , 3) << 8;
x = GETBITS(x_,4 , 8) << 8;
x = GETBITS(x_,0 , 3) << 8;
y = GETBITS(x_,4 , 8) << 8;
}
}
......
......@@ -11,22 +11,6 @@ BiffStructurePtr PhRuns::clone()
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)
{
record << ichFirst << ichMom << cchMom;
......
......@@ -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)
{
record << ifnt;
......
......@@ -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)
{
unsigned short cch = st.getSize();
......@@ -37,6 +24,8 @@ void RPHSSub::load(CFRecord& record)
unsigned short cch;
record >> crun >> cch;
st.setSize(cch);
record >> st;
}
......
......@@ -20,7 +20,7 @@ XLUnicodeRichExtendedString XLUnicodeRichExtendedString::operator=(const XLUnico
XLUnicodeRichExtendedString::XLUnicodeRichExtendedString(std::list<CFRecordPtr>& cont_recs)
: cont_recs_(cont_recs),
fHighByte(true),
code_page_(0)
extRst(cont_recs)
{
}
......@@ -30,16 +30,31 @@ const bool XLUnicodeRichExtendedString::appendNextContinue(CFRecord& record, con
{
return false;
}
if(read_high_byte)
{
fHighByte = 0x01 == cont_recs_.front()->getData()[0];
record.appendRawData(cont_recs_.front()->getData() + 1, cont_recs_.front()->getDataSize() - 1);
}
else
RecordType type = (RecordType)cont_recs_.front()->getTypeId();
while(!cont_recs_.empty())
{
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;
}
......@@ -180,7 +195,7 @@ void XLUnicodeRichExtendedString::store(CFRecord& record)
if(fExtSt)
{
record << extRst;
extRst.store(record);
}
}
......@@ -192,18 +207,27 @@ void XLUnicodeRichExtendedString::load(CFRecord& record)
if (code_page_== 0)
code_page_ = pGlobalWorkbookInfoPtr ->CodePage;
unsigned short cch;
unsigned char flags;
unsigned short cch = 0;
unsigned char flags = 0;
record >> cch >> flags;
fHighByte = GETBIT(flags, 0);
fExtSt = GETBIT(flags, 2);
fRichSt = GETBIT(flags, 3);
if (record.getDataSize() == record.getRdPtr())
{
if (appendNextContinue(record,false) == false)
return;
}
fHighByte = GETBIT(flags, 0);
fExtSt = GETBIT(flags, 2);
fRichSt = GETBIT(flags, 3);
unsigned short cRun = 0;
if(fRichSt)
{
record >> cRun;
}
int cbExtRst = 0;
if(fExtSt)
{
record >> cbExtRst;
......@@ -217,21 +241,24 @@ void XLUnicodeRichExtendedString::load(CFRecord& record)
record >> cRun;
}
}
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);
size_t str_sz = num_symbols;
std::wstring str_full(str_);
do
{
if (appendNextContinue(record, true) == false) // fHighByte changes here
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
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=
}
......@@ -239,7 +266,11 @@ void XLUnicodeRichExtendedString::load(CFRecord& record)
{
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)
{
FormatRun format;
......@@ -249,7 +280,12 @@ void XLUnicodeRichExtendedString::load(CFRecord& record)
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)
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);
}
if (row->miyRw.value())// 255 twips(1/20 pt)
......@@ -204,7 +211,14 @@ int CELL_GROUP::serialize(std::wostream & stream)
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);
}
......
......@@ -114,9 +114,13 @@ int FORMULA::serialize(std::wostream & stream)
case 1: CP_XML_ATTR(L"t", L"b"); 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();
if (!str_val.empty())
......
......@@ -799,6 +799,9 @@ void XlsConverter::convert_geometry(std::vector<ODRAW::OfficeArtFOPTEPtr> & prop
int count_point[] = { 1, 3, 1, 0};
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 > 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