Compare commits

...

3 Commits

44 changed files with 413 additions and 192 deletions

View File

@ -6400,6 +6400,7 @@ namespace BinDocxRW
for(int i = 0, length = Content.size(); i < length; i++)
{
OOX::WritingElement* item = Content[i];
if(OOX::et_w_tc == item->getType())
{
OOX::Logic::CTc* tc = static_cast<OOX::Logic::CTc*>(item);

View File

@ -117,7 +117,10 @@ public:
class RtfFieldInst : public IDocumentElement
{
public:
RtfFieldInst()
{
SetDefault();
}
void SetDefaultRtf()
{
SetDefault();

View File

@ -55,7 +55,7 @@ int _tmain(int argc, _TCHAR* argv[])
std::wstring outputDir = FileSystem::Directory::GetFolderPath(dstPath);
std::wstring dstTempPath = FileSystem::Directory::CreateDirectoryWithUniqueName(outputDir);
hr = ConvertXls2Xlsx(srcFileName, dstTempPath, L"", L"C:\\Windows\\Fonts", NULL);
hr = ConvertXls2Xlsx(srcFileName, dstTempPath, L"password", L"C:\\Windows\\Fonts", NULL);
if (hr == S_OK)
{

View File

@ -37,11 +37,11 @@
namespace CRYPT
{
RC4Decryptor::RC4Decryptor(CryptRC4Data & header, std::wstring password, int type) :
crypt (new RC4Crypt(header, password, type)),
type (Crypt::RC4)
RC4Decryptor::RC4Decryptor(CryptRC4Data & header, std::wstring _password, int _type) :
crypt(new RC4Crypt(header, _password, _type))
{
crypt_data = header;
crypt_data = header;
type = _type;
}
void RC4Decryptor::Decrypt(char* data, const size_t size, const unsigned long stream_pos)
@ -54,7 +54,7 @@ namespace CRYPT
return crypt->IsVerify();
}
bool RC4Decryptor::SetPassword(std::wstring password, int type)
bool RC4Decryptor::SetPassword(std::wstring password)
{
crypt.reset();
crypt = CryptPtr(new RC4Crypt(crypt_data, password, type));

View File

@ -43,18 +43,16 @@ namespace CRYPT
RC4Decryptor(CryptRC4Data & header, std::wstring password, int type);
virtual void Decrypt(char* data, const size_t size, const unsigned long stream_pos);
virtual bool SetPassword(std::wstring password);
bool IsVerify();
bool SetPassword(std::wstring password, int type = 1);
virtual bool IsVerify();
private:
int type;
CryptPtr crypt;
Crypt::crypt_type type;
CryptRC4Data crypt_data;
};
typedef boost::shared_ptr<RC4Decryptor> RC4DecryptorPtr;
} // namespace CRYPT

View File

@ -61,7 +61,7 @@ BaseObjectPtr CF::clone()
void CF::readFields(CFRecord& record)
{
GlobalWorkbookInfoPtr global_info = record.getGlobalWorkbookInfo();
global_info_ = record.getGlobalWorkbookInfo();
unsigned short cce1;
unsigned short cce2;
@ -72,10 +72,11 @@ void CF::readFields(CFRecord& record)
rgce1.load(record, cce1);
rgce2.load(record, cce2);
ipriority_ = ++record.getGlobalWorkbookInfo()->cmt_rules;
rgbdxf.serialize(record.getGlobalWorkbookInfo()->users_Dxfs_stream);
dxfId_ = global_info->cellStyleDxfs_count++;
ipriority_ = ++global_info_->cmt_rules;
rgbdxf.serialize(global_info_->users_Dxfs_stream);
dxfId_ = global_info_->cellStyleDxfs_count++;
}
int CF::serialize(std::wostream & stream)
@ -84,9 +85,6 @@ int CF::serialize(std::wostream & stream)
return 0;
CFEx * cfEx = dynamic_cast<CFEx *>(m_CFEx.get());
if (cfEx)
{
}
CP_XML_WRITER(stream)
{
@ -120,22 +118,31 @@ int CF::serialize(std::wostream & stream)
if ((cfEx) && (cfEx->content.fHasDXF))
{
cfEx->content.dxf.serialize(CP_XML_STREAM());
//cfEx->content.dxf.serialize(CP_XML_STREAM()); - вложенный формат низя?
if (cfEx->dxfId_ >= 0 )
dxfId_ = cfEx->dxfId_;
}
else
{
if (dxfId_ >= 0)
CP_XML_ATTR(L"dxfId", dxfId_);
}
std::wstring s1 = rgce1.getAssembledFormula();
std::wstring s2 = rgce2.getAssembledFormula();
CP_XML_NODE(L"formula")
if (!s1.empty())
{
if (!s1.empty())
CP_XML_NODE(L"formula")
{
CP_XML_STREAM() << xml::utils::replace_text_to_xml(s1);
else if(!s2.empty())
}
}
if(!s2.empty())
{
CP_XML_NODE(L"formula")
{
CP_XML_STREAM() << xml::utils::replace_text_to_xml(s2);
}
}
}
}

View File

@ -69,6 +69,8 @@ public:
CFParsedFormulaNoCCE rgce2;
BaseObjectPtr m_CFEx;
GlobalWorkbookInfoPtr global_info_;
};
typedef boost::shared_ptr<CF> CFPtr;

View File

@ -37,6 +37,7 @@ namespace XLS
CFEx::CFEx()
{
dxfId_ = -1;
}
@ -57,6 +58,11 @@ void CFEx::readFields(CFRecord& record)
if(!fIsCF12)
{
record >> content;
if (content.dxf.serialize(record.getGlobalWorkbookInfo()->users_Dxfs_stream) >= 0)
{
dxfId_ = record.getGlobalWorkbookInfo()->cellStyleDxfs_count++;
}
}
}

View File

@ -49,17 +49,17 @@ public:
~CFEx();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeCFEx;
//-----------------------------
FrtRefHeaderU frtRefHeaderU;
unsigned int fIsCF12;
_UINT16 nID;
CFExNonCF12 content;
//-----------------------------
int dxfId_;
};
} // namespace XLS

View File

@ -53,7 +53,9 @@ BaseObjectPtr DVal::clone()
void DVal::readFields(CFRecord& record)
{
unsigned short flags;
record >> flags >> xLeft >> yTop >> idObj >> idvMac;
fWnClosed = GETBIT(flags, 0);
}

View File

@ -32,8 +32,33 @@
#include "Dv.h"
#include <utils.h>
#include <boost/algorithm/string.hpp>
namespace XLS
{
static std::wstring replace_zero (const std::wstring &str, const std::wstring &delimetr)
{
if (str.empty()) return L"";
std::wstring out;
int pos = 0;
while(true)
{
if (pos >= str.size()) break;
if (str[pos] == '\0')
{
out += delimetr;
}
else
{
out += str[pos];
}
pos++;
}
return out;
}
BaseObjectPtr Dv::clone()
{
@ -45,22 +70,91 @@ void Dv::readFields(CFRecord& record)
_UINT32 flags;
record >> flags;
valType = static_cast<unsigned char>(GETBITS(flags, 0, 3));
errStyle = static_cast<unsigned char>(GETBITS(flags, 4, 6));
valType = static_cast<_valTypeDv>(GETBITS(flags, 0, 3));
errStyle = static_cast<unsigned char>(GETBITS(flags, 4, 6));
fStrLookup = GETBIT(flags, 7);
fAllowBlank = GETBIT(flags, 8);
fSuppressCombo = GETBIT(flags, 9);
mdImeMode = static_cast<unsigned char>(GETBITS(flags, 10, 17));
fShowInputMsg = GETBIT(flags, 18);
fShowErrorMsg = GETBIT(flags, 19);
typOperator = static_cast<unsigned char>(GETBITS(flags, 20, 23));
fStrLookup = GETBIT(flags, 7);
fAllowBlank = GETBIT(flags, 8);
fSuppressCombo = GETBIT(flags, 9);
mdImeMode = static_cast<unsigned char>(GETBITS(flags, 10, 17));
fShowInputMsg = GETBIT(flags, 18);
fShowErrorMsg = GETBIT(flags, 19);
typOperator = static_cast<_typOperatorDv>(GETBITS(flags, 20, 23));
record >> PromptTitle >> ErrorTitle >> Prompt >> Error;
formula1.load(record);
formula2.load(record);
record >> sqref;
}
int Dv::serialize(std::wostream & stream)
{
CP_XML_WRITER(stream)
{
CP_XML_NODE(L"dataValidation")
{
CP_XML_ATTR(L"sqref", sqref.strValue);
CP_XML_ATTR(L"showErrorMessage", fShowErrorMsg);
CP_XML_ATTR(L"showInputMessage", fShowInputMsg);
CP_XML_ATTR(L"allowBlank", fAllowBlank);
switch(typOperator)
{
case operatorDvBetween: CP_XML_ATTR(L"operator", L"between"); break;
case operatorDvNotBetween: CP_XML_ATTR(L"operator", L"notBetween"); break;
case operatorDvEquals: CP_XML_ATTR(L"operator", L"equal"); break;
case operatorDvNotEquals: CP_XML_ATTR(L"operator", L"notEqual"); break;
case operatorDvGreaterThan: CP_XML_ATTR(L"operator", L"greaterThan"); break;
case operatorDvLessThan: CP_XML_ATTR(L"operator", L"lessThan"); break;
case operatorDvGreaterThanOrEqual: CP_XML_ATTR(L"operator", L"greaterThanOrEqual");break;
case operatorDvLessThanOrEqual: CP_XML_ATTR(L"operator", L"lessThanOrEqual"); break;
}
switch(valType)
{
case typeDvCustom: CP_XML_ATTR(L"type", L"custom"); break;
case typeDvDate: CP_XML_ATTR(L"type", L"date"); break;
case typeDvDecimal: CP_XML_ATTR(L"type", L"decimal"); break;
case typeDvList: CP_XML_ATTR(L"type", L"list"); break;
case typeDvNone: CP_XML_ATTR(L"type", L"none"); break;
case typeDvTextLength: CP_XML_ATTR(L"type", L"textLength");break;
case typeDvTime: CP_XML_ATTR(L"type", L"time"); break;
case typeDvWhole: CP_XML_ATTR(L"type", L"whole"); break;
}
if (!PromptTitle.value().empty())
{
CP_XML_ATTR(L"promtTitle", PromptTitle.value());
}
if (!Prompt.value().empty())
{
CP_XML_ATTR(L"promt", Prompt.value());
}
if (!ErrorTitle.value().empty())
{
CP_XML_ATTR(L"errorTitle", ErrorTitle.value());
}
if (!Error.value().empty())
{
CP_XML_ATTR(L"error", Error.value());
}
std::wstring sFormula1 = replace_zero(formula1.getAssembledFormula(), L",");
std::wstring sFormula2 = replace_zero(formula2.getAssembledFormula(), L",");
if (!sFormula1.empty())
{
//boost::algorithm::replace_all(sFormula1 , "\0", L",");
CP_XML_NODE(L"formula1") {CP_XML_STREAM() << xml::utils::replace_text_to_xml(sFormula1);}
}
if (!sFormula2.empty())
{
//boost::algorithm::replace_all(sFormula2 , "\0", L",");
CP_XML_NODE(L"formula2") {CP_XML_STREAM() << xml::utils::replace_text_to_xml(sFormula2);}
}
}
}
return 0;
}
} // namespace XLS

View File

@ -38,39 +38,62 @@
namespace XLS
{
// Logical representation of Dv record in BIFF8
enum _typOperatorDv
{
operatorDvBetween = 0,
operatorDvNotBetween,
operatorDvEquals,
operatorDvNotEquals,
operatorDvGreaterThan,
operatorDvLessThan,
operatorDvGreaterThanOrEqual,
operatorDvLessThanOrEqual
};
enum _valTypeDv
{
typeDvCustom = 0,
typeDvDate,
typeDvDecimal,
typeDvList,
typeDvNone,
typeDvTextLength,
typeDvTime,
typeDvWhole
};
class Dv: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(Dv)
BASE_OBJECT_DEFINE_CLASS_NAME(Dv)
public:
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeDv;
int serialize(std::wostream & stream);
//-----------------------------
unsigned char valType;
_valTypeDv valType;
unsigned char errStyle;
bool fStrLookup;
bool fAllowBlank;
bool fSuppressCombo;
bool fStrLookup;
bool fAllowBlank;
bool fSuppressCombo;
unsigned char mdImeMode;
bool fShowInputMsg;
bool fShowErrorMsg;
unsigned char typOperator;
bool fShowInputMsg;
bool fShowErrorMsg;
_typOperatorDv typOperator;
XLUnicodeString PromptTitle;
XLUnicodeString ErrorTitle;
XLUnicodeString Prompt;
XLUnicodeString Error;
DVParsedFormula formula1;
DVParsedFormula formula2;
SqRefU sqref;
SqRefU sqref;
};

View File

@ -69,28 +69,27 @@ void FilePass::readFields(CFRecord& record)
bEnabled = true;
majorVer = *record.getCurData<unsigned short>();
cryptHeaderPtr = CRYPTO::RC4EncryptionHeaderPtr(new CRYPTO::RC4EncryptionHeader());
cryptHeaderPtr->bStandard = 0x0001 == majorVer ? true : false; // _S2dvT1xU_R3bOPwre4_.xls
cryptHeaderPtr->load (record);
rc4HeaderPtr = CRYPTO::RC4EncryptionHeaderPtr(new CRYPTO::RC4EncryptionHeader());
rc4HeaderPtr->bStandard = 0x0001 == majorVer ? true : false; // _S2dvT1xU_R3bOPwre4_.xls
rc4HeaderPtr->load (record);
if (rc4HeaderPtr->bStandard)
if (cryptHeaderPtr->bStandard)
{
record.getGlobalWorkbookInfo()->decryptor =
CRYPT::RC4DecryptorPtr(new CRYPT::RC4Decryptor(rc4HeaderPtr->crypt_data_rc4, record.getGlobalWorkbookInfo()->password, 2));
CRYPT::DecryptorPtr(new CRYPT::RC4Decryptor(cryptHeaderPtr->crypt_data_rc4, record.getGlobalWorkbookInfo()->password, 2));
}
else
{
//CRYPT::ECMADecryptor Decryptor;
record.getGlobalWorkbookInfo()->decryptor =
CRYPT::DecryptorPtr(new CRYPT::ECMADecryptor());
CRYPT::ECMADecryptor *crypter = dynamic_cast<CRYPT::ECMADecryptor *>(record.getGlobalWorkbookInfo()->decryptor.get());
//Decryptor.SetCryptData(rc4HeaderPtr->crypt_data_aes);
//if (Decryptor.SetPassword(L"VelvetSweatshop") == false)
//{
//}
// //record.getGlobalWorkbookInfo()->decryptor =
// //CRYPT::ECMADecryptor(new CRYPT::RC4Decryptor(rc4HeaderPtr->crypt_data_rc4, record.getGlobalWorkbookInfo()->password, 2));
crypter->SetCryptData(cryptHeaderPtr->crypt_data_aes);
crypter->SetPassword(record.getGlobalWorkbookInfo()->password);
}
}

View File

@ -60,8 +60,7 @@ public:
XORObfuscation key;
_UINT16 majorVer;
CRYPTO::RC4EncryptionHeaderPtr rc4HeaderPtr;
CRYPTO::RC4CryptoAPIEncryptionHeader rc4CryptoAPIHeader;
CRYPTO::RC4EncryptionHeaderPtr cryptHeaderPtr;
};
} // namespace XLS

View File

@ -40,7 +40,8 @@ namespace XLS
Pos::Pos()
{
m_iLinkObject = -1;
m_iLinkObject = -1;
m_iLayoutTarget = 0; //not set, 1 - outer, 2 -inner
}
@ -98,9 +99,14 @@ int Pos::serialize(std::wostream & _stream)
{
CP_XML_NODE(L"c:manualLayout")
{
//if (m_iLinkObject == 1) x += 0.5 + (w > 0 ? w : 0);
if (m_iLayoutTarget > 0)
{
CP_XML_NODE(L"c:layoutTarget"){CP_XML_ATTR(L"val", m_iLayoutTarget == 1 ? L"outer" : L"inner");}
}
if (m_iLinkObject == 1 && mdTopLt == 2 && mdBotRt == 2)
x += 0.5 + (w > 0 ? w : 0);
//if (m_iLinkObject == 2) x += 0.5 + (w > 0 ? w : 0);
if (m_iLinkObject == 3) y += 0 + (h > 0 ? h : 0);
//if (m_iLinkObject == 3) y += 0 + (h > 0 ? h : 0);
CP_XML_NODE(L"c:xMode") {CP_XML_ATTR(L"val", L"edge");}
CP_XML_NODE(L"c:yMode") {CP_XML_ATTR(L"val", L"edge");}

View File

@ -67,6 +67,7 @@ public:
//-----------------------------
int m_iLayoutTarget;
short m_iLinkObject;
BaseObjectPtr m_Frame;

View File

@ -37,8 +37,7 @@ namespace XLS
{
DVParsedFormula::DVParsedFormula()
: ParsedFormula(CellRef())
DVParsedFormula::DVParsedFormula() : ParsedFormula(CellRef())
{
}

View File

@ -45,8 +45,6 @@ public:
DVParsedFormula();
BiffStructurePtr clone();
virtual void load(CFRecord& record);
};
} // namespace XLS

View File

@ -49,13 +49,12 @@ public:
virtual void load(XLS::CFRecord& record);
EncryptionHeaderFlags Flags;
_INT32 AlgID;
_INT32 AlgIDHash;
_UINT32 KeySize;
_UINT32 ProviderType;
std::wstring CSPName;
EncryptionHeaderFlags Flags;
_INT32 AlgID;
_INT32 AlgIDHash;
_UINT32 KeySize;
_UINT32 ProviderType;
std::wstring CSPName;
};
} // namespace CRYPTO

View File

@ -50,7 +50,6 @@ public:
virtual void load(XLS::CFRecord& record);
bool fCryptoAPI;
bool fDocProps;
bool fExternal;

View File

@ -48,7 +48,6 @@ public:
virtual void load(XLS::CFRecord& record);
_UINT32 SaltSize;
struct SALT_TAG
{

View File

@ -59,13 +59,26 @@ BiffStructurePtr PtgStr::clone()
void PtgStr::loadFields(CFRecord& record)
{
record >> string_;
ShortXLUnicodeString s;
record >> s;
string_ = s;
int pos1 = string_.find(L"\"");
int pos2 = string_.rfind(L"\"");
if (pos1 == 0 && pos2 >= string_.length() - 1)
{
string_ = string_.substr(1, string_.length() - 2);
}
string_ = L"\"" + string_ + L"\"";
}
void PtgStr::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref)
{
ptg_stack.push(L"\"" + boost::algorithm::replace_all_copy(std::wstring(string_), L"\"", L"\"\"") + L"\"");
ptg_stack.push(string_);
}

View File

@ -47,7 +47,6 @@ public:
PtgStr(const std::wstring & str);
BiffStructurePtr clone();
virtual void loadFields(CFRecord& record);
@ -56,7 +55,7 @@ public:
static const unsigned short fixed_id = 0x17;
private:
ShortXLUnicodeString string_;
std::wstring string_;
};
} // namespace XLS

View File

@ -65,8 +65,9 @@ void RC4EncryptionHeader::load(XLS::CFRecord& record)
bool fExternal = GETBIT(flags, 3);
bool fAES = GETBIT(flags, 4);
record >> flags;
//EncryptionHeader
unsigned short Reserved3;
record >> Reserved3;
_UINT32 HeaderSize; record >> HeaderSize;
_UINT32 Flags; record >> Flags;
_UINT32 SizeExtra; record >> SizeExtra;
@ -80,19 +81,9 @@ void RC4EncryptionHeader::load(XLS::CFRecord& record)
int pos = record.getRdPtr();
int size = record.getDataSize();
std::vector<char> dataCSPName;
while(pos < size - 1)
{
char s;
record >> s; dataCSPName.push_back(s);
record >> s; dataCSPName.push_back(s);
if (dataCSPName[dataCSPName.size() - 1] == 0 && dataCSPName[dataCSPName.size() - 2] == 0)
{
break;
}
pos+=2;//unicode null-terminate string
}
std::wstring providerName;
record >> providerName;
//EncryptionVerifier
record >> crypt_data_aes.saltSize;
@ -134,7 +125,7 @@ void RC4EncryptionHeader::load(XLS::CFRecord& record)
pos = record.getRdPtr();
//------------------------------------------------------------------------------------------
crypt_data_aes.hashAlgorithm = CRYPT_METHOD::SHA1; //by AlgIDHash -> 0x0000 || 0x8004
crypt_data_aes.hashAlgorithm = CRYPT_METHOD::SHA1; //by AlgIDHash -> 0x0000(reserved ??) || 0x8004(sha1)
crypt_data_aes.spinCount = 50000;
switch(AlgID)
@ -162,15 +153,6 @@ void RC4EncryptionHeader::load(XLS::CFRecord& record)
case 0x0001: crypt_data_aes.cipherAlgorithm = CRYPT_METHOD::RC4; break;
case 0x0018: crypt_data_aes.cipherAlgorithm = CRYPT_METHOD::AES_ECB; break;
}
if (crypt_data_aes.cipherAlgorithm == CRYPT_METHOD::RC4)
{
bStandard = true;
memcpy(&crypt_data_rc4.Salt, crypt_data_aes.saltValue.c_str(), 16);
memcpy(&crypt_data_rc4.EncryptedVerifier, crypt_data_aes.encryptedVerifierValue.c_str(), 16);
memcpy(&crypt_data_rc4.EncryptedVerifierHash, crypt_data_aes.encryptedVerifierInput.c_str(), 16);
}
}
}

View File

@ -48,21 +48,22 @@ void SqRefU::load(CFRecord& record)
{
unsigned short cref;
record >> cref;
std::wstring sqref_str;
for (size_t i = 0; i < cref ; ++i)
{
Ref8U ref8;
record >> ref8;
sqref_str += std::wstring (ref8.toString(false).c_str()) + ((i == cref - 1) ? L"" : L" ");
strValue += std::wstring (ref8.toString(false).c_str()) + ((i == cref - 1) ? L"" : L" ");
}
sqref = sqref_str;
}
const CellRef SqRefU::getLocationFirstCell() const
{
std::vector<CellRangeRef> refs;
AUX::str2refs(sqref, refs);
AUX::str2refs(strValue, refs);
if(!refs.size())
{
return CellRef();

View File

@ -49,10 +49,9 @@ public:
virtual void load(CFRecord& record);
const CellRef getLocationFirstCell() const;
std::wstring sqref;
std::wstring strValue;
};
} // namespace XLS

View File

@ -107,7 +107,7 @@ int CONDFMT12::serialize(std::wostream & stream)
{
CondFmt12 * condFmt = dynamic_cast<CondFmt12*>(m_CondFmt12.get());
CP_XML_ATTR(L"sqref", condFmt->mainCF.sqref.sqref);
CP_XML_ATTR(L"sqref", condFmt->mainCF.sqref.strValue);
//condition_id
//condition_pos
for (int i = 0; i < m_arCF12.size(); i++)

View File

@ -162,7 +162,6 @@ const bool CONDFMTS::loadContent(BinProcessor& proc)
return res;
}
int CONDFMTS::serialize(std::wostream & stream)
{
if (m_arCONDFMT.empty()) return 0;

View File

@ -109,7 +109,7 @@ int CONDFMT::serialize(std::wostream & stream)
{
CondFmt * condFmt = dynamic_cast<CondFmt*>(m_CondFmt.get());
CP_XML_ATTR(L"sqref", condFmt->sqref.sqref);
CP_XML_ATTR(L"sqref", condFmt->sqref.strValue);
//condition_id
//condition_pos
for (int i = 0; i < m_arCF.size(); i++)

View File

@ -50,6 +50,11 @@ public:
virtual const bool loadContent(BinProcessor& proc);
static const ElementType type = typeDVAL;
int serialize(std::wostream & stream);
BaseObjectPtr m_DVal;
std::vector<BaseObjectPtr> m_arDv;
};
} // namespace XLS

View File

@ -61,10 +61,44 @@ const bool DVAL::loadContent(BinProcessor& proc)
{
return false;
}
proc.repeated<Dv>(0, 65534);
m_DVal = elements_.back(); elements_.pop_back();
int count = proc.repeated<Dv>(0, 65534);
while (count > 0)
{
m_arDv.insert(m_arDv.begin(), elements_.back());
elements_.pop_back();
count--;
}
return true;
}
int DVAL::serialize(std::wostream & stream)
{
if (!m_DVal) return 0;
if (m_arDv.empty()) return 0;
CP_XML_WRITER(stream)
{
CP_XML_NODE(L"dataValidations")
{
CP_XML_ATTR(L"count", m_arDv.size());
DVal * dval = dynamic_cast<DVal*>(m_DVal.get());
for (int i = 0 ; i < m_arDv.size(); i++)
{
if (!m_arDv[i]) continue;
m_arDv[i]->serialize(CP_XML_STREAM());
}
}
}
return 0;
}
} // namespace XLS

View File

@ -715,8 +715,18 @@ int ChartSheetSubstream::serialize_plot_area (std::wostream & _stream)
{
PlotAreaFRAME = dynamic_cast<FRAME*> (axes->m_PlotArea_FRAME.get());
PlotAreaPos = dynamic_cast<Pos*> (parent0->m_Pos.get());
if (PlotAreaPos && !parent0->m_arCRT.empty())
{
CRT * crt = dynamic_cast<CRT*>(parent0->m_arCRT[0].get());
if ((crt) && ( crt->m_iChartType == CHART_TYPE_Radar ||
crt->m_iChartType == CHART_TYPE_RadarArea))//еще?
{
PlotAreaPos->m_iLayoutTarget = 2; //inner
}
}
if (PlotAreaFRAME && PlotAreaPos)
if (PlotAreaPos && PlotAreaFRAME)
{
PlotAreaPos->m_Frame = PlotAreaFRAME->m_Frame;
}
@ -750,7 +760,6 @@ int ChartSheetSubstream::serialize_plot_area (std::wostream & _stream)
if (PlotAreaPos && (sht_props) && (sht_props->fAlwaysAutoPlotArea != false))
{
PlotAreaPos->serialize(CP_XML_STREAM());
}

View File

@ -77,7 +77,7 @@ public:
unsigned short CodePage;
CRYPT::RC4DecryptorPtr decryptor;
CRYPT::DecryptorPtr decryptor;
std::wstring password;
std::vector<std::wstring> sheets_state;

View File

@ -151,37 +151,6 @@ BaseObjectPtr GlobalsSubstream::clone()
return BaseObjectPtr(new GlobalsSubstream(*this));
}
// class Parenthesis_Window1_Backup_HideObj_Date1904 : public ABNFParenthesis
// {
// public:
// BaseObjectPtr clone()
// {
// return BaseObjectPtr(new Parenthesis_OO_order_workaround_1(*this));
// }
//
// const bool loadContent(BinProcessor& proc)
// {
// if(!proc.mandatory<SXAddl_SXCCacheField_SXDCaption>())
// {
// return false;
// }
// proc.repeated<Continue_SxaddlSxString>(0, 0);
// return true;
// };
// };
//
/*
WORKBOOKCONTENT = [WriteProtect] [FilePass] [Template] INTERFACE WriteAccess [FileSharing] CodePage
*2047Lel DSF [Excel9File] RRTabId [ObProj] [ObNoMacros] [CodeName [FNGROUPS] *Lbl
[OleObjectSize] PROTECTION 1*Window1 Backup HideObj Date1904 CalcPrecision RefreshAll
BookBool FORMATTING *(PIVOTCACHEDEFINITION) [DOCROUTE] *UserBView UsesELFs 1*BUNDLESHEET
METADATA [MTRSettings] [ForceFullCalculation] Country *SUPBOOK *LBL *RTD [RecalcId]
*HFPicture *MSODRAWINGGROUP [SHAREDSTRINGS] ExtSST *WebPub [WOpt] [CrErr] [BookExt]
*FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] EOF
WORKBOOK = BOF WORKBOOKCONTENT
*/
const bool GlobalsSubstream::loadContent(BinProcessor& proc)
{
int count = 0;
@ -229,7 +198,7 @@ const bool GlobalsSubstream::loadContent(BinProcessor& proc)
if (( proc.getGlobalWorkbookInfo()->decryptor) &&
( proc.getGlobalWorkbookInfo()->decryptor->IsVerify() == false))
{
if (!proc.getGlobalWorkbookInfo()->decryptor->SetPassword(L"VelvetSweatshop", 2))
if (!proc.getGlobalWorkbookInfo()->decryptor->SetPassword(L"VelvetSweatshop"))
return false;
}
}

View File

@ -105,6 +105,7 @@ const bool WorkbookStreamObject::loadContent(BinProcessor& proc)
m_GlobalsSubstream = elements_.back();
elements_.pop_back();
}
if (!GlobalsSubstream_found) return false;
}
break;
case BOF::st_Worksheet:

View File

@ -354,7 +354,14 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc)
count--;
}
}break;
case rt_DVal: proc.optional<DVAL>(); break;
case rt_DVal:
{
if (proc.optional<DVAL>())
{
m_DVAL = elements_.back();
elements_.pop_back();
}
}break;
case rt_CodeName:
{
if (proc.optional<CodeName> ())

View File

@ -70,6 +70,7 @@ public:
BaseObjectPtr m_CodeName;
BaseObjectPtr m_SheetExt;
BaseObjectPtr m_DxGCol;
BaseObjectPtr m_DVAL;
std::vector<BaseObjectPtr> m_arMergeCells;
std::vector<BaseObjectPtr> m_arWINDOW;

View File

@ -120,9 +120,9 @@ typedef struct tagBITMAPCOREHEADER {
XlsConverter::XlsConverter(const std::wstring & xls_file, const std::wstring & _xlsx_path, const std::wstring & password, const std::wstring & fontsPath, const ProgressCallback* CallBack)
{
xlsx_path = _xlsx_path;
output_document = NULL;
xlsx_context = NULL;
xlsx_path = _xlsx_path;
output_document = NULL;
xlsx_context = NULL;
pCallBack = CallBack;
bUserStopConvert = false;
@ -202,8 +202,7 @@ XlsConverter::XlsConverter(const std::wstring & xls_file, const std::wstring & _
XLS::CFStreamCacheReader stream_reader(cfile.getWorkbookStream(), xls_global_info);
xls_document = boost::shared_ptr<XLS::WorkbookStreamObject>(new XLS::WorkbookStreamObject(workbook_code_page));
XLS::BinReaderProcessor proc(stream_reader , xls_document.get() , true);
proc.mandatory(*xls_document.get());
@ -211,7 +210,6 @@ XlsConverter::XlsConverter(const std::wstring & xls_file, const std::wstring & _
{
is_encrypted = true;
if (xls_global_info->decryptor->IsVerify() == false) return;
}
}
catch(...)
@ -225,10 +223,7 @@ XlsConverter::XlsConverter(const std::wstring & xls_file, const std::wstring & _
std::wstring sVer = STR::int2hex_wstr(xls_global_info->Version);
Log::error("Version xls is old !!! - " + std::string(sVer.begin(), sVer.end()));
is_older_version = true;
//return;
}
}
output_document = new oox::package::xlsx_document();
xlsx_context = new oox::xlsx_conversion_context(output_document);
}
@ -433,6 +428,11 @@ void XlsConverter::convert(XLS::WorksheetSubstream* sheet)
sheet->m_CONDFMTS->serialize(xlsx_context->current_sheet().conditionalFormatting());
}
if (sheet->m_DVAL)
{
sheet->m_DVAL->serialize(xlsx_context->current_sheet().dataValidations());
}
convert((XLS::OBJECTS*)sheet->m_OBJECTS.get(), sheet);
if (sheet->m_arNote.size() > 0 && xls_global_info->Version < 0x0600)

View File

@ -64,6 +64,7 @@ public:
std::wstringstream customViews_;
std::wstringstream conditionalFormatting_;
std::wstringstream picture_background_;
std::wstringstream dataValidations_;
rels rels_;
@ -164,7 +165,10 @@ std::wostream & xlsx_xml_worksheet::picture_background()
{
return impl_->picture_background_;
}
std::wostream & xlsx_xml_worksheet::dataValidations()
{
return impl_->dataValidations_;
}
//-----------------------------------------------------------------
rels & xlsx_xml_worksheet::sheet_rels()
{
@ -204,6 +208,8 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm)
CP_XML_STREAM() << impl_->conditionalFormatting_.str();
CP_XML_STREAM() << impl_->dataValidations_.str();
CP_XML_STREAM() << impl_->hyperlinks_.str();
CP_XML_STREAM() << impl_->pageProperties_.str();

View File

@ -69,6 +69,7 @@ public:
std::wostream & customViews();
std::wostream & conditionalFormatting();
std::wostream & picture_background();
std::wostream & dataValidations();
rels & sheet_rels();//hyperlink, background image, external, media ...

View File

@ -288,10 +288,6 @@
RelativePath="..\common\simple_xml_writer.h"
>
</File>
<File
RelativePath="..\..\..\Common\DocxFormat\Source\XML\stringcommon.cpp"
>
</File>
<File
RelativePath="..\common\utils.cpp"
>

View File

@ -38,8 +38,14 @@
#include "../../Common/3dParty/cryptopp/aes.h"
#include "../../Common/3dParty/cryptopp/sha.h"
#include "../../Common/3dParty/cryptopp/md5.h"
#include "../../Common/3dParty/cryptopp/rsa.h"
#include "../../Common/3dParty/cryptopp/rc2.h"
#include "../../Common/3dParty/cryptopp/arc4.h"
#include "../../Common/3dParty/cryptopp/rc5.h"
#include "../../Common/3dParty/cryptopp/pwdbased.h"
#include "../../Common/3dParty/cryptopp/filters.h"
#include "../../Common/3dParty/cryptopp/osrng.h"
#include "../../Common/3dParty/cryptopp/hex.h"
#include "../../Common/DocxFormat/Source/Base/unicode_util.h"
@ -263,14 +269,50 @@ _buf GenerateHashKey(_buf & salt, _buf & password, int hashSize, int spin, CRYPT
}
bool DecryptCipher(_buf & key, _buf & iv, _buf & data_inp, _buf & data_out, CRYPT_METHOD::_cipherAlgorithm algorithm)
{
{
if (algorithm == CRYPT_METHOD::RC4)
{
//CryptoPP::ARC4 rc4(key.ptr, key.size);
//data_out.ptr = new unsigned char[data_inp.size];
//data_out.size = data_inp.size;
//rc4.ProcessData(data_out.ptr, data_inp.ptr, data_inp.size);
//CryptoPP::RC2::Decryption rc2Decryption(key.ptr, key.size);
//modeDecryption = new CryptoPP::ECB_Mode_ExternalCipher::Decryption(rc2Decryption, iv.ptr );
//CryptoPP::RC5::Decryption rc5Decryption(key.ptr, key.size);
//modeDecryption = new CryptoPPp::ECB_Mode_ExternalCipher::Decryption(rc5Decryption, iv.ptr );
//rsa aes
//CryptoPP::HexDecoder buffer;
//buffer.Put(key.ptr, key.size);
//
////CryptoPP::StringSource buffer(key.ptr, key.size, true);
//CryptoPP::RSA::PrivateKey priv;
//priv.Load(buffer);
//CryptoPP::AutoSeededRandomPool rng;
//if(!priv.Validate(rng, 3))
// throw std::runtime_error("Rsa private key validation failed");
//if(!priv.Validate(rng, 3))
// throw std::runtime_error("Dsa private key validation failed");
//CryptoPP::RSAES_PKCS1v15_Decryptor rsaDecryption(priv);
//std::string data((char*)data_inp.ptr, data_inp.size);
//std::string decrypted;
// CryptoPP::StringSource ss(data, true,
// new CryptoPP::PK_DecryptorFilter(rng, rsaDecryption,
// new CryptoPP::StringSink(decrypted)) );
// data_out = decrypted;
//return true;
return false;
}
else
{
CryptoPP::AES::Decryption aesDecryption(key.ptr, key.size);
CryptoPP::StreamTransformation *modeDecryption = NULL;
CryptoPP::AES::Decryption aesDecryption(key.ptr, key.size);
switch(algorithm)
{
@ -281,8 +323,9 @@ bool DecryptCipher(_buf & key, _buf & iv, _buf & data_inp, _buf & data_out, CRYP
modeDecryption = new CryptoPP::CBC_Mode_ExternalCipher::Decryption(aesDecryption, iv.ptr );
break;
}
if (!modeDecryption) return false;
if (!data_out.ptr)
{
data_out = _buf(data_inp.size);
@ -303,12 +346,16 @@ namespace CRYPT
ECMADecryptor::ECMADecryptor()
{
bVerify = false;
}
bool ECMADecryptor::SetPassword(std::wstring password_)
bool ECMADecryptor::SetPassword(std::wstring _password)
{
password = password_;
bVerify = false;
password = _password;
if (password.empty()) return false;
if (cryptData.bAgile)
{
_buf pPassword (password);
@ -334,7 +381,7 @@ bool ECMADecryptor::SetPassword(std::wstring password_)
_buf verifierHashKey = GenerateAgileKey(pSalt, pPassword, pValueBlockKey, cryptData.keySize, cryptData.spinCount, cryptData.hashAlgorithm);
DecryptCipher(verifierHashKey, pSalt, pEncVerValue, decryptedVerifierHashBytes, cryptData.cipherAlgorithm);
return (decryptedVerifierHashBytes==hashBuf);
bVerify = (decryptedVerifierHashBytes==hashBuf);
}
else
{
@ -359,8 +406,14 @@ bool ECMADecryptor::SetPassword(std::wstring password_)
DecryptCipher(hashKey, empty, pEncVerValue, decryptedVerifierHashBytes, cryptData.cipherAlgorithm);
return (decryptedVerifierHashBytes==hashBuf);
bVerify = (decryptedVerifierHashBytes==hashBuf);
}
return bVerify;
}
bool ECMADecryptor::IsVerify()
{
return bVerify;
}
void ECMADecryptor::SetCryptData(_cryptData &data)
@ -369,13 +422,16 @@ void ECMADecryptor::SetCryptData(_cryptData &data)
}
void ECMADecryptor::Decrypt(char* data , const size_t size, const unsigned long stream_pos)
{
unsigned char* data_out = NULL;
Decrypt((unsigned char*)data, size, data_out);
if (data_out)
if (bVerify)
{
delete []data;
data = (char*)data_out;
unsigned char* data_out = NULL;
Decrypt((unsigned char*)data, size, data_out);
if (data_out)
{
delete []data;
data = (char*)data_out;
}
}
}
void ECMADecryptor::Decrypt(unsigned char* data_inp, int size, unsigned char*& data_out)

View File

@ -34,6 +34,8 @@
#include <string>
#include <vector>
#include <boost/shared_ptr.hpp>
namespace CRYPT_METHOD
{
enum _hashAlgorithm
@ -60,7 +62,11 @@ class Decryptor
{
public:
virtual void Decrypt(char* data, const size_t size, const unsigned long stream_pos) = 0;
virtual bool SetPassword(std::wstring password) = 0;
virtual bool IsVerify() = 0;
};
typedef boost::shared_ptr<Decryptor> DecryptorPtr;
class ECMADecryptor : public Decryptor
{
@ -102,16 +108,18 @@ public:
ECMADecryptor();
virtual ~ECMADecryptor(){}
void Decrypt(unsigned char* data, int size, unsigned char*& data_out);
virtual void Decrypt(char* data , const size_t size, const unsigned long stream_pos);
bool SetPassword(std::wstring password);
void Decrypt (unsigned char* data, int size, unsigned char*& data_out);
virtual void Decrypt (char* data , const size_t size, const unsigned long stream_pos);
virtual bool SetPassword (std::wstring password);
virtual bool IsVerify();
void SetCryptData(_cryptData &data);
private:
_cryptData cryptData;
std::wstring password;
_cryptData cryptData;
bool bVerify;
};
}

View File

@ -7,7 +7,7 @@
QT -= core
QT -= gui
VERSION = 2.0.2.424
VERSION = 2.0.2.425
DEFINES += INTVER=$$VERSION
TARGET = x2t