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

XlsFile2 фиксы ошибок

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@64225 954022d7-b5bf-4e40-9824-e11837661b57
parent 771ce7b1
......@@ -160,17 +160,22 @@ void CFRecord::appendRawData(const char* raw_data, const size_t size)
}
void CFRecord::loadAnyData(wchar_t & val)
bool CFRecord::loadAnyData(wchar_t & val)
{
checkFitRead(2);
#if defined(_WIN32) || defined(_WIN64)
val = * getCurData<wchar_t>();
#else
unsigned short val_utf16 = * getCurData<unsigned short>();
if (checkFitRead(2))
{
#if defined(_WIN32) || defined(_WIN64)
val = * getCurData<wchar_t>();
#else
unsigned short val_utf16 = * getCurData<unsigned short>();
val = val_utf16;
#endif
rdPtr += 2;
val = val_utf16;
#endif
rdPtr += 2;
return true;
}
return false;
}
void CFRecord::insertDataFromRecordToBeginning(CFRecordPtr where_from)
......@@ -214,12 +219,13 @@ const bool CFRecord::checkFitReadSafe(const size_t size) const
// Checks whether the specified number of unsigned chars present in the non-read part of the buffer
// Generates an exception
void CFRecord::checkFitRead(const size_t size) const
bool CFRecord::checkFitRead(const size_t size) const
{
if(!checkFitReadSafe(size))
{
throw;// EXCEPT::RT::WrongBiffRecord("Wrong record size.", getTypeString());
return false;// EXCEPT::RT::WrongBiffRecord("Wrong record size.", getTypeString());
}
return true;
}
......@@ -246,8 +252,10 @@ void CFRecord::checkFitWrite(const size_t size) const
void CFRecord::skipNunBytes(const size_t n)
{
//ASSERT(data_); // This throws if we use skipNunBytes instead of reserveNunBytes
checkFitRead(n);
rdPtr += n;
if (checkFitRead(n))
{
rdPtr += n;
}
}
......@@ -361,7 +369,7 @@ CFRecord& operator>>(CFRecord & record, std::string & str)
char symbol;
do
{
record.loadAnyData(symbol);
if (record.loadAnyData(symbol) == false) break;
str += symbol;
} while (symbol);
return record;
......@@ -374,7 +382,7 @@ CFRecord& operator>>(CFRecord & record, std::wstring & str)
unsigned short symbol;
do
{
record.loadAnyData(symbol);
if (record.loadAnyData(symbol) == false) break;
utf16.push_back(symbol);
} while (symbol);
......
......@@ -71,7 +71,7 @@ public:
const bool checkFitReadSafe(const size_t size) const;
// Checks whether the specified number of unsigned chars present in the non-read part of the buffer
// Generates an exception
void checkFitRead(const size_t size) const;
bool checkFitRead(const size_t size) const;
// Checks whether the specified number of unsigned chars fits in max size of the buffer
// Doesn't generate an exception
const bool checkFitWriteSafe(const size_t size) const;
......@@ -121,15 +121,19 @@ public:
const size_t getRdPtr() const;
template<class T>
void loadAnyData(T& val)
bool loadAnyData(T& val)
{
////ASSERT(data_); // This throws if we use >> instead of <<
checkFitRead(sizeof(T));
val = * getCurData<T>();
rdPtr += sizeof(T);
if (checkFitRead(sizeof(T)))
{
val = * getCurData<T>();
rdPtr += sizeof(T);
return true;
}
return false;
}
void loadAnyData(wchar_t & val);
bool loadAnyData(wchar_t & val);
template<class T>
void storeAnyData(const T& val)
......@@ -215,7 +219,8 @@ CFRecord& operator<<(CFRecord& record, std::vector<T>& vec)
T symbol;
do
{
record.loadAnyData(symbol);
if (record.loadAnyData(symbol) == false)
break;
str += symbol;
} while (symbol);
return record;
......@@ -241,8 +246,10 @@ template<class T>
CFRecord& operator>>(CFRecord & record, _CP_OPT(T)& val)
{
T temp_val;
record.loadAnyData(temp_val);
val = temp_val;
if (record.loadAnyData(temp_val))
{
val = temp_val;
}
return record;
}
......@@ -251,6 +258,8 @@ CFRecord& operator>>(CFRecord & record, _CP_OPT(T)& val)
template<class T>
CFRecord& operator<<(CFRecord & record, _CP_OPT(T)& val)
{
if (!val) return record;
T temp_val(*val);
record.storeAnyData(temp_val);
return record;
......
......@@ -52,17 +52,20 @@ void BookExt::readFields(CFRecord& record)
record >> cb;
unsigned int flags;
record.loadAnyData(flags);
fDontAutoRecover = GETBIT(flags, 0);
fHidePivotList = GETBIT(flags, 1);
fFilterPrivacy = GETBIT(flags, 2);
fEmbedFactoids = GETBIT(flags, 3);
mdFactoidDisplay = static_cast<unsigned char>(GETBITS(flags, 4, 5));
fSavedDuringRecovery = GETBIT(flags, 6);
fCreatedViaMinimalSave = GETBIT(flags, 7);
fOpenedViaDataRecovery = GETBIT(flags, 8);
fOpenedViaSafeLoad = GETBIT(flags, 9);
if (record.loadAnyData(flags))
{
fDontAutoRecover = GETBIT(flags, 0);
fHidePivotList = GETBIT(flags, 1);
fFilterPrivacy = GETBIT(flags, 2);
fEmbedFactoids = GETBIT(flags, 3);
mdFactoidDisplay = static_cast<unsigned char>(GETBITS(flags, 4, 5));
fSavedDuringRecovery = GETBIT(flags, 6);
fCreatedViaMinimalSave = GETBIT(flags, 7);
fOpenedViaDataRecovery = GETBIT(flags, 8);
fOpenedViaSafeLoad = GETBIT(flags, 9);
}
else return;
if(cb > 20)
......
......@@ -60,7 +60,8 @@ void Pls::writeFields(CFRecord& record)
void Pls::readFields(CFRecord& record)
{
record.skipNunBytes(2); // reserved
record.loadAnyData(rgb);
if (record.loadAnyData(rgb) == false) return;
int size = record.getDataSize() - 2;
const char* data = record.getData() + 2;
......
......@@ -72,29 +72,25 @@ void BiffString::load(CFRecord& record, const size_t cch1, const bool is_wide1)
size_t cch = cch1;
size_t raw_length = cch << (is_wide ? 1 : 0);
//record.checkFitRead(raw_length);
if (record.getDataSize() - record.getRdPtr() < raw_length)
{
raw_length = record.getDataSize() - record.getRdPtr();
cch = is_wide ? raw_length/2 : raw_length ;
}
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
if (record.checkFitRead(raw_length))
{
std::string int_str(record.getCurData<char>(), cch);
str_ = STR::toStdWString(int_str, record.getGlobalWorkbookInfo()->CodePage).c_str();
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);
}
record.skipNunBytes(raw_length);
}
......
......@@ -136,6 +136,10 @@ CFRecord& operator>>(CFRecord& record, XLUnicodeString_T<cchType, det_id, cch_wh
{
size_t cch;
size_t struct_size = 0;
if (record.getRdPtr() >= record.getDataSize())
return record;
switch(cch_where)
{
case cch_READ_FROM_RECORD:
......
......@@ -46,7 +46,8 @@ void ExtProp::load(CFRecord& record)
record >> extPropData.indent_level;
break;
default:
throw;// EXCEPT::RT::WrongBiffRecord("Unsupported type of the extension.", record.getTypeString());
//throw EXCEPT::RT::WrongBiffRecord("Unsupported type of the extension.", record.getTypeString());
break;
}
}
......
......@@ -83,6 +83,9 @@ void Feat11FieldDataItem::load(CFRecord& record)
record >> strFieldName;
record >> strCaption;
if (record.getRdPtr() >= record.getDataSize())
return;//125 Planilhas de Excel.xls
if (cbFmtAgg > 0)
record >> dxfFmtAgg;
if (cbFmtInsertRow > 0)
......
......@@ -137,8 +137,12 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record)
}
else if(record.getRdPtr() > child_beginning_ptr + rh_child.recLen)
{
throw;// EXCEPT::RT::WrongBiffRecord("Wrong data parsed in OfficeArt record of type 0x" +
//throw EXCEPT::RT::WrongBiffRecord("Wrong data parsed in OfficeArt record of type 0x" +
//STR::int2hex_wstr(rh_child.recType, sizeof(rh_child.recType)), record.getTypeString());
Log::warning(std::wstring(L"Wrong data parsed in OfficeArt record of type 0x") +
STR::int2hex_wstr(rh_child.recType, sizeof(rh_child.recType)));
record.RollRdPtrBack( record.getRdPtr() - child_beginning_ptr + rh_child.recLen);
}
}
}
......
......@@ -23,8 +23,9 @@ void OfficeArtMetafileHeader::store(XLS::CFRecord& record)
void OfficeArtMetafileHeader::load(XLS::CFRecord& record)
{
record >> cbSize;
record.loadAnyData(rcBounds);
record.loadAnyData(ptSize);
if (record.loadAnyData(rcBounds) == false) return;
if (record.loadAnyData(ptSize) == false) return;
record >> cbSave >> compression >> filter;
}
......
......@@ -141,6 +141,8 @@ void TableFeatureType::load(CFRecord& record)
record >> rgbName;
record >> cFieldData;
int r = cFieldData;
if (fLoadCSPName)
record >> cSPName;
......@@ -149,6 +151,9 @@ void TableFeatureType::load(CFRecord& record)
for (size_t i = 0; i < cFieldData; i++)
{
if (record.getRdPtr() >= record.getDataSize())
return;
Feat11FieldDataItemPtr item(new Feat11FieldDataItem);
item->load(record);
fieldData.push_back(item);
......
......@@ -40,12 +40,12 @@ void URLMoniker::load(XLS::CFRecord& record)
{
}
if(!record.isEOF())
{
_GUID_ guid;
record >> guid >> serialVersion >> uriFlags;
serialGUID = STR::guid2bstr(guid);
}
//if(!record.isEOF())
//{
// _GUID_ guid;
// record >> guid >> serialVersion >> uriFlags;
// serialGUID = STR::guid2bstr(guid);
//}
}
......
......@@ -256,23 +256,24 @@ void XLUnicodeRichExtendedString::load(CFRecord& record)
void XLUnicodeRichExtendedString::loadSymbols(CFRecord& record, const size_t cch, const bool is_wide)
{
size_t raw_length = cch << (is_wide ? 1 : 0);
record.checkFitRead(raw_length);
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
if (record.checkFitRead(raw_length))
{
std::string int_str(record.getCurData<char>(), cch);
str_ = STR::toStdWString(int_str, record.getGlobalWorkbookInfo()->CodePage).c_str();
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);
}
record.skipNunBytes(raw_length);
}
......
......@@ -103,7 +103,7 @@ const bool WorkbookStreamObject::loadContent(BinProcessor& proc)
if ((proc.mandatory<ChartSheetSubstream>()) && (elements_.size() > 0))
{
WorksheetSubstream_found = true;
m_ChartSheetSubstream.push_back(elements_.back());
m_WorksheetSubstream.push_back(elements_.back());
elements_.pop_back();
}
}
......
......@@ -30,7 +30,6 @@ public:
BaseObjectPtr m_GlobalsSubstream;
std::vector<BaseObjectPtr> m_WorksheetSubstream;
std::vector<BaseObjectPtr> m_ChartSheetSubstream;
std::vector<BaseObjectPtr> m_MacroSheetSubstream;
unsigned short code_page_;
......
......@@ -231,7 +231,17 @@ void XlsConverter::convert(XLS::WorkbookStreamObject* woorkbook)
for (int i=0 ; i < woorkbook->m_WorksheetSubstream.size(); i++)
{
xlsx_context->start_table(xls_global_info->sheets_names[i]);
convert((XLS::WorksheetSubstream*)woorkbook->m_WorksheetSubstream[i].get());
if (woorkbook->m_WorksheetSubstream[i]->get_type() == XLS::typeWorksheetSubstream)
{
convert(dynamic_cast<XLS::WorksheetSubstream*>(woorkbook->m_WorksheetSubstream[i].get()));
}
else if (woorkbook->m_WorksheetSubstream[i]->get_type() == XLS::typeChartSheetSubstream)
{
//в xl\chartsheets
convert(dynamic_cast<XLS::ChartSheetSubstream*>(woorkbook->m_WorksheetSubstream[i].get()));
}
xlsx_context->end_table();
}
......@@ -505,81 +515,12 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
if (objects == NULL) return;
ODRAW::OfficeArtSpgrContainer *spgr = dynamic_cast<ODRAW::OfficeArtSpgrContainer*>(objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpgrContainer.get());
/*
for (int i = 0 ; i < objects->m_OBJs.size(); i++)
{
int ind = objects->m_OBJs[i].second;
XLS::OBJ* OBJ = dynamic_cast<XLS::OBJ*>(objects->m_OBJs[i].first.get());
XLS::Obj *obj = dynamic_cast<XLS::Obj*>(OBJ->m_Obj.get());
ODRAW::OfficeArtSpContainer *sp = NULL;
if (obj->m_OfficeArtSpContainer)
{
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(obj->m_OfficeArtSpContainer.get());
}
else if ( (spgr) && (ind < spgr->child_records.size()))
{
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get());
}
//else continue;
if (xlsx_context->get_drawing_context().start_drawing(obj->cmo.ot))//тут тип шейпа ВРАНЬЕ !!! пример - 7.SINIF I.DÖNEM III.YAZILI SINAV.xls
{
convert(sp);
xlsx_context->get_drawing_context().end_drawing();
}
}
for (int i = 0; i <objects->m_TEXTOBJECTs.size(); i++)
{
int ind = objects->m_OBJs[i].second;
XLS::TEXTOBJECT* textObject = dynamic_cast<XLS::TEXTOBJECT*>(objects->m_TEXTOBJECTs[i].first.get());
if (textObject == NULL) continue;
XLS::TxO * txO = dynamic_cast<XLS::TxO *>(textObject->m_TxO.get());
if (txO == NULL) continue;
ODRAW::OfficeArtSpContainer *sp = NULL;
if (txO->m_OfficeArtSpContainer)
{
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(txO->m_OfficeArtSpContainer.get());
}
else if ( (spgr) && (ind < spgr->child_records.size()))
{
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get());
}
if (xlsx_context->get_drawing_context().start_drawing(0x0006))
{
convert(sp);
std::wstringstream strm;
txO->serialize(strm);
xlsx_context->get_drawing_context().set_text(strm.str());
xlsx_context->get_drawing_context().end_drawing();
}
}
for (int i = 0 ; i < objects->m_CHARTs.size(); i++)
{
int ind = objects->m_OBJs[i].second;
//xlsx_context->get_chart_context().start_drawing();
//xlsx_context->get_chart_context().end_drawing();
}
*/
bool note = false;
int ind = 0;
for ( std::list<XLS::BaseObjectPtr>::iterator elem = objects->elements_.begin(); elem != objects->elements_.end(); elem++)
{
short type_object = 0;
short type_object = -1;
ODRAW::OfficeArtSpContainer *sp = NULL;
ODRAW::OfficeArtSpContainer *sp_common = NULL;
......@@ -609,7 +550,9 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
type_object = 0x0006;
if (text_obj->m_OfficeArtSpContainer)
{
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(text_obj->m_OfficeArtSpContainer.get());
}
}
if (chart)
{
......@@ -618,7 +561,18 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
//-----------------------------------------------------------------------------
if ( (spgr) && (ind+1< spgr->child_records.size()))
{
sp_common = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get());
ODRAW::OfficeArtClientData* client_data = NULL;
sp_common = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get());
client_data = dynamic_cast<ODRAW::OfficeArtClientData*>(spgr->child_records[ind+1].get());
if (sp_common == NULL && client_data)
{
ind++;
if (ind+1< spgr->child_records.size())
sp_common = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get());
}
}
if (note && text_obj)
......@@ -629,6 +583,8 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
}
note = false;
if (type_object < 0)continue;
if (xlsx_context->get_drawing_context().start_drawing(type_object))
{
convert(sp);
......@@ -651,7 +607,26 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
note = true;
}
}
if (sp == NULL) ind++;
if (sp == NULL)
{
ind++;
if ( spgr )
{
while (ind+1 < spgr->child_records.size())
{
ODRAW::OfficeArtClientData* client_data = NULL;
ODRAW::OfficeArtClientTextbox* text_client_data = NULL;
client_data = dynamic_cast<ODRAW::OfficeArtClientData*> (spgr->child_records[ind+1].get());
text_client_data = dynamic_cast<ODRAW::OfficeArtClientTextbox*> (spgr->child_records[ind+1].get());
if (client_data || text_client_data)
{
ind++;
}else break;
}
}
}
}
}
......
......@@ -171,11 +171,11 @@ void xlsx_drawing_context::end_drawing()
{
if (drawing_state.size() < 1 )return;
if (drawing_state.back().anchor.empty())
{
drawing_state.pop_back();
return;
}
//if (drawing_state.back().anchor.empty())
//{
// drawing_state.pop_back();
// return;
//}
std::wstringstream strm;
......@@ -540,7 +540,9 @@ void xlsx_drawing_context::set_description(const std::wstring & str)
}
void xlsx_drawing_context::set_anchor(const std::wstring & str)
{
if (drawing_state.size() < 1 )return;
if (str.empty()) return;
if (drawing_state.size() < 1 ) return;
drawing_state.back().anchor = str;
}
void xlsx_drawing_context::set_image(const std::wstring & str)
......
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