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

XlsFile2 fix errors

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@64259 954022d7-b5bf-4e40-9824-e11837661b57
parent f2fe81de
......@@ -189,11 +189,11 @@ const std::string int2str(const int val, const int radix)
const std::wstring int2wstr(const int val, const int radix)
{
#if defined(_WIN32) || defined(_WIN64)
static wchar_t num_buf[10]={};
_itow_s(val, num_buf, 9, radix);
static wchar_t num_buf[20]={};
_itow_s(val, num_buf, 19, radix);
return std::wstring(num_buf);
#else
static char num_buf[10]={};
static char num_buf[20]={};
sprintf( num_buf, "%d", val);
std::string a_str(num_buf);
return std::wstring(a_str.begin(), a_str.end());
......@@ -379,6 +379,11 @@ const std::wstring toARGB(const unsigned int rgba)
static_cast<unsigned char>((rgba >> 16) & 0xff), static_cast<unsigned char>((rgba >> 24) & 0xff));
}
const std::wstring toRGB(const unsigned int rgba)
{
return toRGB(static_cast<unsigned char>(rgba & 0xff), static_cast<unsigned char>((rgba >> 8) & 0xff),
static_cast<unsigned char>((rgba >> 16) & 0xff));
}
const std::wstring toARGB(const unsigned char red, const unsigned char green, const unsigned char blue, const unsigned char alpha)
{
......
......@@ -45,6 +45,7 @@ namespace STR
const std::wstring unescape_ST_Xstring(const std::wstring& str);
const std::wstring toARGB(const unsigned int rgba);
const std::wstring toARGB(const unsigned char red, const unsigned char green, const unsigned char blue, const unsigned char alpha);
const std::wstring toRGB(const unsigned int rgba);
const std::wstring toRGB(const unsigned char red, const unsigned char green, const unsigned char blue);
const bool fromARGB(const std::wstring& argb, unsigned char& red, unsigned char& green, unsigned char& blue, unsigned char& alpha);
const size_t hex_str2int(const std::wstring& hex);
......
......@@ -29,13 +29,19 @@ CompoundFile::CompoundFile(const std::wstring & file_path, const ReadWriteMode m
case cf_ReadMode:
{
if (storage_->open(false, false) == false)
throw;
{
delete storage_;
storage_ = NULL;
}
}break;
case cf_WriteMode:
{
if (storage_->open(true, true) == false)
throw;
{
delete storage_;
storage_ = NULL;
}
}break;
}
}
......@@ -133,10 +139,12 @@ void CompoundFile::closeNamedStream(const std::string& name)
// Opens a stream in the storage (shall be called not more than once per stream)
POLE::Stream* CompoundFile::openStream(const std::string & stream_name)
{
if (storage_ == NULL) return NULL;
POLE::Stream* pStream = new POLE::Stream(storage_, stream_name);
if(pStream == NULL)
{
throw;// EXCEPT::RT::CompoundFileFormatError(std::string("Error opening \"") + static_cast<char*>(stream_name) + "\" stream", hres);
return NULL;
}
if ((pStream) && (pStream->size() > 0))
return pStream;
......@@ -147,10 +155,12 @@ POLE::Stream* CompoundFile::openStream(const std::string & stream_name)
// Creates a new stream in the storage
POLE::Stream* CompoundFile::createStream(const std::string & stream_name)
{
if (storage_ == NULL) return NULL;
POLE::Stream* pStream = new POLE::Stream(storage_, stream_name, true);
if(pStream == NULL)
{
throw;// EXCEPT::RT::CompoundFileFormatError(std::string("Error creating \"") + static_cast<char*>(stream_name) + "\" stream", hres);
return NULL;
}
return pStream;
}
......
......@@ -142,7 +142,7 @@ int Font::serialize_rPr(std::wostream & stream)
case 2://rgb
CP_XML_NODE(L"a:srgbClr")
{
CP_XML_ATTR(L"val", STR::toARGB(color_ext.xclrValue));
CP_XML_ATTR(L"val", STR::toRGB(color_ext.xclrValue));
}break;
case 3://theme color
CP_XML_NODE(L"a:schemeClr")
......
......@@ -191,6 +191,13 @@ void Obj::readFields(CFRecord& record)
m_OfficeArtSpContainer = ODRAW::OfficeArtRecordPtr(new ODRAW::OfficeArtSpContainer(ODRAW::OfficeArtRecord::CA_Sheet));
record >> *m_OfficeArtSpContainer;
}
int sz_skip = record.getDataSize() - record.getRdPtr();
if (sz_skip > 0)
{
record.skipNunBytes(sz_skip);
}
}
// unsigned char* Add = NULL;
//int size = 0;
......
......@@ -33,6 +33,16 @@ void Palette::writeFields(CFRecord& record)
}
}
const std::wstring standart_color[8] = {
L"00000000",
L"00FFFFFF",
L"00FF0000",
L"0000FF00",
L"000000FF",
L"00FFFF00",
L"00FF00FF",
L"0000FFFF"};
void Palette::readFields(CFRecord& record)
{
......@@ -41,25 +51,24 @@ void Palette::readFields(CFRecord& record)
unsigned short ccv;
record >> ccv;
for(int i = 0; i < 8; ++i)
{
global_info->RegisterPaletteColor(i, standart_color[i].substr(2,6));
}
for(int i = 0; i < ccv; ++i)
{
LongRGBPtr rgb(new LongRGB);
record >> *rgb;
rgColor.push_back(rgb);
global_info->RegisterPaletteColor(i, rgb->argb);
std::wstring rgb_color = STR::toRGB(rgb->red, rgb->green, rgb->blue);
global_info->RegisterPaletteColor(i+8, rgb_color);
}
}
const std::wstring standart_color[8] = {
L"00000000",
L"00FFFFFF",
L"00FF0000",
L"0000FF00",
L"000000FF",
L"00FFFF00",
L"00FF00FF",
L"0000FFFF"};
int Palette::serialize(std::wostream & stream)
{
......
......@@ -106,7 +106,7 @@ int SST::serialize(std::wostream & stream)
{
CP_XML_NODE(L"t")
{
CP_XML_STREAM() << xml::utils::replace_text_to_xml(richText->str_);
CP_XML_STREAM() << STR::escape_ST_Xstring(xml::utils::replace_text_to_xml(richText->str_));
}
}
}
......
......@@ -36,7 +36,7 @@ void ExtNameParsedFormula::load(CFRecord& record) // Maybe this class shouldn't
{
unsigned short cb;
record >> cb;
if(cb)
if(cb && record.getDataSize() > record.getRdPtr())
{
unsigned char extPtg;
record >> extPtg;
......
......@@ -27,7 +27,7 @@ public:
record >> nElems >> nElemsAlloc >> cbElem;
while(nElems--)
{
Type element;
Type element(cbElem);
record >> element;
data.push_back(element);
}
......
......@@ -7,8 +7,15 @@ namespace ODRAW
MSOSHADECOLOR::MSOSHADECOLOR()
{
cbElement = 4;
}
MSOSHADECOLOR::MSOSHADECOLOR(unsigned short cbElement_)
{
if (cbElement_ == 0xFFF0)
{
cbElement = 2;
}
}
XLS::BiffStructurePtr MSOSHADECOLOR::clone()
{
return XLS::BiffStructurePtr(new MSOSHADECOLOR(*this));
......
......@@ -18,6 +18,8 @@ class MSOSHADECOLOR : public XLS::BiffStructure
BASE_STRUCTURE_DEFINE_CLASS_NAME(MSOSHADECOLOR)
public:
MSOSHADECOLOR();
MSOSHADECOLOR(unsigned short cbElement_);
XLS::BiffStructurePtr clone();
static const XLS::ElementType type = XLS::typeMSOSHADECOLOR;
......@@ -25,7 +27,8 @@ public:
virtual void load(XLS::CFRecord& record);
virtual void store(XLS::CFRecord& record);
OfficeArtCOLORREF color;
unsigned short cbElement;
OfficeArtCOLORREF color;
OSHARED::FixedPoint position;
};
......
......@@ -121,4 +121,92 @@ void OfficeArtClientAnchorSheet::loadFields(XLS::CFRecord& record)
}
//-------------------------------------------------------------------------------------
OfficeArtChildAnchor::OfficeArtChildAnchor()
: OfficeArtRecord(0x00, ChildAnchor)
{
}
XLS::BiffStructurePtr OfficeArtChildAnchor::clone()
{
return XLS::BiffStructurePtr(new OfficeArtChildAnchor(*this));
}
int OfficeArtChildAnchor::serialize(std::wostream &stream)
{
//-------------------------------------------------
CP_XML_WRITER(stream)
{
CP_XML_NODE(L"xdr:from")
{
CP_XML_NODE(L"xdr:colOff")
{
CP_XML_STREAM() << boost::lexical_cast<std::wstring>(_dxL );
}
CP_XML_NODE(L"xdr:rowOff")
{
CP_XML_STREAM() << boost::lexical_cast<std::wstring>(_dyT);
}
}
CP_XML_NODE(L"xdr:to")
{
CP_XML_NODE(L"xdr:colOff")
{
CP_XML_STREAM() << boost::lexical_cast<std::wstring>(_dxR );
}
CP_XML_NODE(L"xdr:rowOff")
{
CP_XML_STREAM() << boost::lexical_cast<std::wstring>(_dyB);
}
}
}
return 0;
}
void OfficeArtChildAnchor::loadFields(XLS::CFRecord& record)
{
XLS::GlobalWorkbookInfoPtr global_info = record.getGlobalWorkbookInfo();
record >> dxL >> dyT >> dxR >> dyB;
//----------------------------------------------------------------------------------------------------
double kfCol = 17640 / 256.;
double kfRow = ( 360000 * 2.54 / 72) / 256. ;
//if (global_info->customColumnsWidth.find(colL) != global_info->customColumnsWidth.end())
//{
// _dxL = dxL * kfCol * global_info->customColumnsWidth[colL];
//}
//else
_dxL = dxL * kfCol * global_info->defaultColumnWidth;
//if (global_info->customColumnsWidth.find(colR) != global_info->customColumnsWidth.end())
//{
// _dxR = dxR * kfCol * global_info->customColumnsWidth[colR];
//}
//else
_dxR = dxR * kfCol * global_info->defaultColumnWidth;
//---------------------------------------------------------------------------------------------------
//if (global_info->customRowsHeight.find(rwT) != global_info->customRowsHeight.end())
//{
// _dyT = dyT * kfRow * global_info->customRowsHeight[rwT];
//}
//else
_dyT = dyT * kfRow * global_info->defaultRowHeight;
//if (global_info->customRowsHeight.find(rwB) != global_info->customRowsHeight.end())
//{
// _dyB = dyB * kfRow * global_info->customRowsHeight[rwB];
//}
//else
_dyB = dyB * kfRow * global_info->defaultRowHeight;
}
} // namespace XLS
......@@ -46,5 +46,30 @@ public:
typedef boost::shared_ptr<OfficeArtClientAnchorSheet> OfficeArtClientAnchorSheetPtr;
class OfficeArtChildAnchor : public OfficeArtRecord
{
BASE_STRUCTURE_DEFINE_CLASS_NAME(OfficeArtChildAnchor)
public:
OfficeArtChildAnchor();
XLS::BiffStructurePtr clone();
static const XLS::ElementType type = XLS::typeOfficeArtChildAnchor;
virtual void loadFields(XLS::CFRecord& record);
virtual void storeFields(XLS::CFRecord& record){}
int serialize(std::wostream & stream);
short dxL;
short dyT;
short dxR;
short dyB;
unsigned int _dxL;
unsigned int _dyT;
unsigned int _dxR;
unsigned int _dyB;
};
typedef boost::shared_ptr<OfficeArtChildAnchor> OfficeArtChildAnchorPtr;
} // namespace XLS
......@@ -74,6 +74,10 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record)
art_record = OfficeArtRecordPtr(new OfficeArtFOPT);
break;
case ChildAnchor:
art_record = OfficeArtRecordPtr(new OfficeArtChildAnchor);
break;
case ClientAnchor:
switch(anchor_type_)
{
......@@ -143,7 +147,7 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record)
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);
record.RollRdPtrBack( record.getRdPtr() - (child_beginning_ptr + rh_child.recLen));
}
}
}
......
......@@ -522,6 +522,21 @@ void pihlShape::ReadComplexData(XLS::CFRecord& record)
record >> IHlink_complex;
}
MSOPOINT::MSOPOINT()
{
cbElement = 4;
}
MSOPOINT::MSOPOINT(unsigned short cbElement_)
{
cbElement = 4;
if (cbElement_ == 0xfff0)
{
cbElement = 2;
}
}
XLS::BiffStructurePtr MSOPOINT::clone()
{
return XLS::BiffStructurePtr(new MSOPOINT(*this));
......@@ -529,7 +544,29 @@ XLS::BiffStructurePtr MSOPOINT::clone()
void MSOPOINT::load(XLS::CFRecord& record)
{
record >> x >> y;
if (cbElement == 4)
{
record >> x >> y;
}
else
{
unsigned char x_;
record >> x_;
y = GETBITS(x_,0 , 3) << 8;
x = GETBITS(x_,4 , 8) << 8;
}
}
MSOPATHINFO::MSOPATHINFO()
{
cbElement = 4;
}
MSOPATHINFO::MSOPATHINFO(unsigned short cbElement_)
{
cbElement = 4;
if (cbElement_ == 0xfff0)
cbElement = 2;
}
XLS::BiffStructurePtr MSOPATHINFO::clone()
......@@ -546,15 +583,16 @@ void MSOPATHINFO::load(XLS::CFRecord& record)
EscapeCode = msopathEscapeExtension;
VertexCount = 0;
Segments = 0;
if (msopathEscape == typeSegment)
if (msopathEscape == typeSegment || msopathClientEscape == typeSegment)
{
EscapeCode = (MSOPATHESCAPE) BitmaskToInt (val, 0x1F00);
VertexCount = BitmaskToInt (val, 0x00FF);
VertexCount = BitmaskToInt (val, 0x00FF);
}
else
{
Segments = BitmaskToInt (val, 0x1FFF);
Segments = BitmaskToInt (val, 0x1FFF);
}
}
......
......@@ -507,7 +507,9 @@ class MSOPOINT : public XLS::BiffStructure
{
BASE_STRUCTURE_DEFINE_CLASS_NAME(MSOPOINT)
MSOPOINT(){}
MSOPOINT(unsigned short cbElement_);
MSOPOINT();
XLS::BiffStructurePtr clone();
virtual void load(XLS::CFRecord& record);
......@@ -517,13 +519,17 @@ class MSOPOINT : public XLS::BiffStructure
int x;
int y;
int cbElement;
};
class MSOPATHINFO : public XLS::BiffStructure
{
BASE_STRUCTURE_DEFINE_CLASS_NAME(MSOPATHINFO)
MSOPATHINFO(){}
MSOPATHINFO();
MSOPATHINFO(unsigned short cbElement_);
XLS::BiffStructurePtr clone();
virtual void load(XLS::CFRecord& record);
......@@ -541,6 +547,7 @@ class MSOPATHINFO : public XLS::BiffStructure
// msopathEscape,
// msopathClientEscape
//};
unsigned short cbElement;
MSOPATHTYPE typeSegment;
short Segments;
......
......@@ -50,7 +50,7 @@ public:
ClientTextbox = 0xF00D, // Implemented
ChildAnchor = 0xF00F,
ChildAnchor = 0xF00F, // Implemented
ClientAnchor = 0xF010, // Implemented
ClientData = 0xF011, // Implemented
FConnectorRule = 0xF012,
......
......@@ -46,6 +46,8 @@ void PtgExtraArray::load(CFRecord& record)
record >> cols >> rows;
for(int i = 0; i < (cols + 1) * (rows + 1); ++i)
{
if (record.getRdPtr() >= record.getDataSize())
break;
unsigned char rec_type;
record >> rec_type;
SerArPtr ser(SerAr::createSerAr(rec_type));
......
......@@ -75,7 +75,7 @@ int XLUnicodeRichExtendedString::serialize (std::wostream & _stream)
std::wstring str_part = str_.substr( start_string, rgRun[i].ich - start_string );
start_string = rgRun[i].ich;
CP_XML_STREAM() << xml::utils::replace_text_to_xml(str_part);
CP_XML_STREAM() << STR::escape_ST_Xstring(xml::utils::replace_text_to_xml(str_part));
}
}
}
......
......@@ -40,7 +40,10 @@ const bool LBL::loadContent(BinProcessor& proc)
Lbl *lbl = dynamic_cast<Lbl*>(m_Lbl.get());
XLUnicodeStringNoCch name = lbl->getName();
std::wstring name;
if (lbl->fBuiltin) name = lbl->Name.value().get_value_or(L"");
if (name.empty()) name = lbl->Name_bin.value();
NameCmt namecmt(name);
if (proc.optional(namecmt))
......
......@@ -626,6 +626,7 @@ enum ElementType
typeOfficeArtClientAnchorChart,
typeOfficeArtClientAnchorHF,
typeOfficeArtClientAnchorSheet,
typeOfficeArtChildAnchor,
typeOfficeArtColorMRUContainer,
typeOfficeArtContainer,
typeOfficeArtFDG,
......
......@@ -799,14 +799,14 @@ 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 (command[i].typeSegment == ODRAW::msopathEnd) break;
if (command[i].typeSegment > 4) continue;
//if (command[i].typeSegment == ODRAW::msopathEnd) break;
if (command[i].typeSegment > 3) continue;
CP_XML_NODE(comm[command[i].typeSegment])
{
for (int j=0 ; j < count_point[command[i].typeSegment]; j ++)
{
if (ind_point > points.size())
if (ind_point >= points.size())
break;
CP_XML_NODE(L"a:pt")
{
......
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