Compare commits

...

38 Commits

Author SHA1 Message Date
77f8ab6875 . 2017-06-14 19:04:46 +03:00
6fc6f9ead3 Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2017-06-14 18:50:53 +03:00
270c1fa2ac . 2017-06-14 18:39:13 +03:00
f76a03fab8 openssl signing bugs 2017-06-14 18:09:28 +03:00
09e6d3f760 XlsFormat - read pivot table records 2017-06-14 17:31:57 +03:00
90d8055bcb up 2017-06-14 15:30:30 +03:00
01ba3b4182 openssl signing bugs 2017-06-14 15:13:44 +03:00
ddb67584b8 . 2017-06-14 12:14:10 +03:00
38ce5586bb ooxml signing developing... 2017-06-13 18:25:58 +03:00
f6d9ce83f0 . 2017-06-13 17:29:31 +03:00
03edd40850 Pptx binary - write notes & master notes 2017-06-13 15:38:13 +03:00
9ff87b3c6b Merge tag 'v4.3.6' into develop
v4.3.6 v4.3.6
2017-06-13 15:28:45 +03:00
645cbef1ef . 2017-06-09 17:46:00 +03:00
02238f7eea Fixed bug with drawing a char with negative size of the font. 2017-06-09 15:11:47 +03:00
907e00a3ac . 2017-06-09 12:19:35 +03:00
2470bfd335 Fixed bug with caching fonts for different pages. Fixed bug with drawing a text. 2017-06-09 11:25:56 +03:00
3ae52bd221 . 2017-06-08 18:15:43 +03:00
227d4f18d6 . 2017-06-08 17:24:17 +03:00
36bdbad685 for bug 27765
external OleLink/DdeLink
2017-06-08 17:08:08 +03:00
525b828540 Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop
* 'develop' of https://github.com/ONLYOFFICE/core:
  TextParagraphPr swap marR/marL
  .
  .
  .
  Use `uname -m` for determine linux x64\x686
  Add travis example config
  .
2017-06-08 15:48:04 +03:00
f64ee80a1a add event 2017-06-08 15:47:56 +03:00
f6402813c4 TextParagraphPr swap marR/marL 2017-06-08 13:19:53 +03:00
224ac7d6e2 . 2017-06-07 18:53:35 +03:00
2e2bd8989d . 2017-06-07 18:39:24 +03:00
8f434efb95 . 2017-06-07 18:36:40 +03:00
244dafb02b Merge pull request #31 from ONLYOFFICE/ShockwaveNN-patch-1
Use `uname -m` for determine linux x64\x686
2017-06-07 18:35:57 +03:00
149a1bdbd5 Use uname -m for determine linux x64\x686
`uname -p` return `unknown` on several system (including debian, but not including ubuntu)
2017-06-07 18:34:18 +03:00
a79d9041bc Merge pull request #30 from ONLYOFFICE/fix/travis-status-green
Add travis example config
2017-06-07 17:26:08 +03:00
3954c42602 Add travis example config 2017-06-07 17:16:51 +03:00
29dc0aee32 . 2017-06-06 16:50:39 +03:00
d805972d6d Merge pull request #28 from ONLYOFFICE/hotfix/v4.3.5
Hotfix/v4.3.5
2017-06-05 17:19:24 +03:00
549d5a46a6 Merge branch 'develop' into hotfix/v4.3.5 2017-06-05 17:12:36 +03:00
9e867be756 Merge branch 'hotfix/v4.3.5' 2017-06-05 16:48:24 +03:00
771bf2d55c for bug 27765
EncodeXml
2017-06-05 15:03:29 +03:00
3c58cd96fc for bug 27765 2017-06-05 14:36:34 +03:00
ec4f4fe476 Fix for cross compiling 2017-05-23 15:04:53 +03:00
634509ae28 Fix for cross compilation 2017-05-23 14:50:07 +03:00
8197fb8900 do not read theme.xml if there is rels file but there is no xml file 2017-05-16 18:18:55 +03:00
155 changed files with 4524 additions and 1840 deletions

1
.gitignore vendored
View File

@ -20,6 +20,7 @@ Common/3dParty/v8/win_32
Common/3dParty/v8/linux_64
Common/3dParty/v8/linux_32
Common/3dParty/v8/mac_64
Common/3dParty/openssl/openssl
**/core_build
**/Release
**/Debug

View File

@ -1 +1,14 @@
language: cpp
language: cpp
compiler: gcc
dist: trusty
addons:
apt:
packages:
- p7zip-full
script:
- exit 0
# Build fails anyway. See explanation in
# https://github.com/ONLYOFFICE/core/pull/29#issuecomment-306773327
- cd Common/3dParty && ./make.sh
- cd ../../
- make

View File

@ -1115,6 +1115,16 @@ namespace NSBinPptxRW
m_pWriter->WriteString(str);
}
std::wstring s = L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"../theme/theme" +
std::to_wstring(nIndexTheme + 1) + L".xml\"/>";
m_pWriter->WriteString(s);
}
void CRelsGenerator::StartNotesMaster(int nIndexTheme)
{
m_pWriter->WriteString(_T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"));
m_pWriter->WriteString(_T("<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">"));
std::wstring s = L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"../theme/theme" +
std::to_wstring(nIndexTheme + 1) + L".xml\"/>";
@ -1130,7 +1140,7 @@ namespace NSBinPptxRW
std::to_wstring(nIndexTheme + 1) + L".xml\"/>";
m_pWriter->WriteString(str);
}
void CRelsGenerator::StartSlide(int nIndexSlide, int nIndexLayout)
void CRelsGenerator::StartSlide(int nIndexSlide, int nIndexLayout, int nIndexNotes)
{
m_pWriter->WriteString(_T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"));
m_pWriter->WriteString(_T("<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">"));
@ -1140,12 +1150,15 @@ namespace NSBinPptxRW
std::to_wstring(nIndexLayout + 1) + L".xml\"/>";
m_pWriter->WriteString(str);
str = L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide\" Target=\"../notesSlides/notesSlide" +
std::to_wstring(nIndexSlide + 1) + L".xml\"/>";
if (nIndexNotes >= 0)
{
str = L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide\" Target=\"../notesSlides/notesSlide" +
std::to_wstring(nIndexNotes + 1) + L".xml\"/>";
}
m_pWriter->WriteString(str);
}
void CRelsGenerator::StartNote(int nIndexSlide)
void CRelsGenerator::StartNotes(int nIndexSlide)
{
m_pWriter->WriteString(L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>");
m_pWriter->WriteString(L"<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">");

View File

@ -407,8 +407,9 @@ namespace NSBinPptxRW
void StartMaster (int nIndexTheme, const _slideMasterInfo& oInfo);
void StartLayout (int nIndexTheme);
void StartSlide (int nIndexSlide, int nIndexLayout);
void StartNote (int nIndexSlide);
void StartSlide (int nIndexSlide, int nIndexLayout, int nIndexNotes);
void StartNotes (int nIndexSlide);
void StartNotesMaster(int nIndexTheme);
void WriteMasters (int nCount);
void WriteThemes (int nCount);

View File

@ -162,8 +162,7 @@ namespace PPTX2EditorAdvanced
}
// записываем все слайды
size_t nCount = presentation->sldIdLst.size();
for (size_t i = 0; i < nCount; ++i)
for (size_t i = 0; i < presentation->sldIdLst.size(); ++i)
{
std::wstring rId = presentation->sldIdLst[i].rid.get();
smart_ptr<PPTX::Slide> slide = ((*presentation)[rId]).smart_dynamic_cast<PPTX::Slide>();

View File

@ -58,10 +58,12 @@ namespace NSBinPptxRW
std::vector<PPTX::Slide> m_arSlides;
std::vector<LONG> m_arSlides_Layout;
std::vector<LONG> m_arSlides_Notes;
std::vector<PPTX::NotesMaster> m_arNotesMasters;
std::vector<PPTX::NotesSlide> m_arNotesSlides;
std::vector<LONG> m_arNotesSlides_Master;
std::vector<LONG> m_arNotesMasters_Theme;
PPTX::Presentation m_oPresentation;
PPTX::TableStyles m_oTableStyles;
@ -175,10 +177,9 @@ namespace NSBinPptxRW
std::map<BYTE, LONG>::iterator pPair;
// writer
CXmlWriter oXmlWriter;
// первым делом определим количество необходимого. если хоть одно из этих чисел - ноль, то ппту не корректный
// первым делом определим количество необходимого. если хоть одно из этих чисел - ноль, то ппту не корректный
LONG nCountThemes = 0;
LONG nCountMasters = 0;
LONG nCountLayouts = 0;
@ -214,7 +215,7 @@ namespace NSBinPptxRW
return;
}
// теперь создадим массивы для рельсов
// теперь создадим массивы для рельсов
for (LONG i = 0; i < nCountMasters; ++i)
{
_slideMasterInfo elm;
@ -226,8 +227,11 @@ namespace NSBinPptxRW
}
for (LONG i = 0; i < nCountSlides; ++i)
m_arSlides_Layout.push_back(0);
for (LONG i = 0; i < nCountSlides; ++i)
m_arSlides_Notes.push_back(-1);
// ThemeRels
// ThemeRels
pPair = m_mainTables.find(NSMainTables::ThemeRels);
if (m_mainTables.end() != pPair)
{
@ -242,7 +246,7 @@ namespace NSBinPptxRW
}
}
// нужно проставить всем шаблонам мастер.
// нужно проставить всем шаблонам мастер.
for (LONG i = 0; i < nCountMasters; ++i)
{
size_t _countL = m_arSlideMasters_Theme[i].m_arLayouts.size();
@ -252,7 +256,7 @@ namespace NSBinPptxRW
}
}
// готово, теперь нужно слайдам проставить шаблоны
// готово, теперь нужно слайдам проставить шаблоны
pPair = m_mainTables.find(NSMainTables::SlideRels);
if (m_mainTables.end() != pPair)
{
@ -271,11 +275,46 @@ namespace NSBinPptxRW
m_arSlides_Layout[index++] = m_oReader.GetULong();
}
}
pPair = m_mainTables.find(NSMainTables::SlideNotesRels);
if (m_mainTables.end() != pPair)
{
m_oReader.Seek(pPair->second);
m_oReader.Skip(6); // type + len + start attr
// теперь нужно удалить все themes, которые не ведут на мастерслайд
size_t index =0;
while (true)
{
BYTE _at = m_oReader.GetUChar_TypeNode();
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
break;
//m_arSlides_Layout[_at] = m_oReader.GetULong(); тут прописан не индекс, а тип - смотри - oBinaryWriter.WriteInt1(0, oBinaryWriter.m_pCommon->m_oSlide_Layout_Rels[i]);
if (index < m_arSlides_Notes.size())
m_arSlides_Notes[index++] = m_oReader.GetULong();
}
}
pPair = m_mainTables.find(NSMainTables::NotesMastersRels);
if (m_mainTables.end() != pPair)
{
m_oReader.Seek(pPair->second);
m_oReader.Skip(6); // type + len + start attr
size_t index =0;
while (true)
{
BYTE _at = m_oReader.GetUChar_TypeNode();
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
break;
m_arNotesMasters_Theme.push_back( m_oReader.GetULong());
}
}
// теперь нужно удалить все themes, которые не ведут на мастерслайды
std::vector<LONG> arThemes;
std::vector<LONG> arThemesDst;
std::vector<bool> arThemesSave;
for (LONG i = 0; i < nCountThemes; ++i)
{
arThemes.push_back(i);
@ -286,6 +325,11 @@ namespace NSBinPptxRW
{
arThemesSave[m_arSlideMasters_Theme[i].m_lThemeIndex] = true;
}
for (size_t i = 0; i < m_arNotesMasters_Theme.size(); i++)
{
arThemesSave[m_arNotesMasters_Theme[i]] = true;
}
LONG lCurrectTheme = 0;
for (LONG i = 0; i < nCountMasters; ++i)
{
@ -298,9 +342,8 @@ namespace NSBinPptxRW
for (LONG i = 0; i < nCountMasters; ++i)
{
m_arSlideMasters_Theme[i].m_lThemeIndex = arThemesDst[i];
}
// themes
}
// themes
pPair = m_mainTables.find(NSMainTables::Themes);
if (m_mainTables.end() != pPair)
{
@ -343,7 +386,7 @@ namespace NSBinPptxRW
}
}
// slideMasters
// slideMasters
pPair = m_mainTables.find(NSMainTables::SlideMasters);
if (m_mainTables.end() != pPair)
{
@ -396,7 +439,7 @@ namespace NSBinPptxRW
}
}
// slideLayouts
// slideLayouts
pPair = m_mainTables.find(NSMainTables::SlideLayouts);
if (m_mainTables.end() != pPair)
{
@ -431,8 +474,99 @@ namespace NSBinPptxRW
m_oReader.m_pRels->SaveRels(pathFileRels.GetPath());
}
}
// notes
pPair = m_mainTables.find(NSMainTables::NotesSlides);
if (m_mainTables.end() != pPair)
{
m_oReader.Seek(pPair->second);
LONG lCount = m_oReader.GetLong();
// slides
if ( lCount > 0 )
{
OOX::CPath pathFolder = m_strDstFolder + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("notesSlides");
OOX::CPath pathFolderRels = pathFolder + FILE_SEPARATOR_STR + _T("_rels");
NSDirectory::CreateDirectory (pathFolder.GetPath());
NSDirectory::CreateDirectory (pathFolderRels.GetPath());
for (LONG i = 0; i < lCount; ++i)
{
PPTX::NotesSlide elm;
m_arNotesSlides.push_back(elm);
m_oReader.m_pRels->Clear();
size_t indexSlide = 0;
for (indexSlide = 0; indexSlide < m_arSlides_Notes.size(); indexSlide++)
{//todooo -> make map
if (m_arSlides_Notes[indexSlide] == i)
{
break;
}
}
m_oReader.m_pRels->StartNotes(indexSlide);
m_arNotesSlides[i].fromPPTY(&m_oReader);
m_oReader.m_pRels->CloseRels();
std::wstring strNotesXml = L"notesSlide" + std::to_wstring(i + 1) + L".xml";
oXmlWriter.ClearNoAttack();
m_arNotesSlides[i].toXmlWriter(&oXmlWriter);
OOX::CPath pathFile = pathFolder + FILE_SEPARATOR_STR + strNotesXml;
oXmlWriter.SaveToFile(pathFile.GetPath());
OOX::CPath pathFileRels = pathFolderRels + FILE_SEPARATOR_STR + strNotesXml + _T(".rels");
m_oReader.m_pRels->SaveRels(pathFileRels.GetPath());
}
}
}
// noteMasters
pPair = m_mainTables.find(NSMainTables::NotesMasters);
if (m_mainTables.end() != pPair)
{
m_oReader.Seek(pPair->second);
LONG lCount = m_oReader.GetLong();
if (lCount > 0 || m_arNotesSlides.size() > 0)//один элемент
{
OOX::CPath pathFolder = m_strDstFolder + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("notesMasters");
OOX::CPath pathFolderRels = pathFolder + FILE_SEPARATOR_STR + _T("_rels");
NSDirectory::CreateDirectory(pathFolder.GetPath());
NSDirectory::CreateDirectory(pathFolderRels.GetPath());
PPTX::NotesMaster elm;
m_arNotesMasters.push_back(elm);
m_oReader.m_pRels->Clear();
m_oReader.m_pRels->StartNotesMaster(m_arSlideMasters_Theme.size());
if (lCount > 0)
{
m_arNotesMasters.back().fromPPTY(&m_oReader);
m_oReader.m_pRels->CloseRels();
std::wstring strMasterNotesXml = L"notesMaster1.xml";
oXmlWriter.ClearNoAttack();
m_arNotesMasters.back().toXmlWriter(&oXmlWriter);
OOX::CPath pathFile = pathFolder + FILE_SEPARATOR_STR + strMasterNotesXml;
oXmlWriter.SaveToFile(pathFile.GetPath());
OOX::CPath pathFileRels = pathFolderRels + FILE_SEPARATOR_STR + strMasterNotesXml + _T(".rels");
m_oReader.m_pRels->SaveRels(pathFileRels.GetPath());
}
else
{
CreateDefaultNotesMasters(m_arSlideMasters_Theme.size());
}
}
}
// slides
int nComment = 1;
pPair = m_mainTables.find(NSMainTables::Slides);
if (m_mainTables.end() != pPair)
@ -452,7 +586,7 @@ namespace NSBinPptxRW
m_arSlides.push_back(elm);
m_oReader.m_pRels->Clear();
m_oReader.m_pRels->StartSlide(i, m_arSlides_Layout[i]);
m_oReader.m_pRels->StartSlide(i, m_arSlides_Layout[i], m_arSlides_Notes[i]);
m_arSlides[i].fromPPTY(&m_oReader);
if (m_arSlides[i].comments.is_init())
@ -488,71 +622,6 @@ namespace NSBinPptxRW
m_oReader.m_pRels->SaveRels(pathFileRels.GetPath());
}
}
if (false)
{
// noteMasters
pPair = m_mainTables.find(NSMainTables::NotesMasters);
if (m_mainTables.end() != pPair)
{
m_oReader.Seek(pPair->second);
LONG lCount = m_oReader.GetLong();
for (LONG i = 0; i < lCount; ++i)
{
PPTX::NotesMaster elm;
m_arNotesMasters.push_back(elm);
m_arNotesMasters[i].fromPPTY(&m_oReader);
}
}
// notes
pPair = m_mainTables.find(NSMainTables::NotesSlides);
if (m_mainTables.end() != pPair)
{
m_oReader.Seek(pPair->second);
LONG lCount = m_oReader.GetLong();
for (LONG i = 0; i < lCount; ++i)
{
PPTX::NotesSlide elm;
m_arNotesSlides.push_back(elm);
m_arNotesSlides[i].fromPPTY(&m_oReader);
}
}
}
else
{
// create default
CreateDefaultNotesMasters((int)m_arThemes.size() + 1);
CreateDefaultNote();
OOX::CPath pathFolder = m_strDstFolder + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("notesSlides");
OOX::CPath pathFolderRels = pathFolder + FILE_SEPARATOR_STR + _T("_rels");
NSDirectory::CreateDirectory (pathFolder.GetPath());
NSDirectory::CreateDirectory (pathFolderRels.GetPath());
LONG lCount = (LONG)m_arSlides.size();
for (LONG i = 0; i < lCount; ++i)
{
m_oReader.m_pRels->Clear();
m_oReader.m_pRels->StartNote(i);
m_oReader.m_pRels->CloseRels();
std::wstring strMasterXml = L"notesSlide" + std::to_wstring(i + 1) + L".xml";
oXmlWriter.ClearNoAttack();
m_oDefaultNote.toXmlWriter(&oXmlWriter);
OOX::CPath pathFile = pathFolder + FILE_SEPARATOR_STR + strMasterXml;
oXmlWriter.SaveToFile(pathFile.GetPath());
OOX::CPath pathFileRels = pathFolderRels + FILE_SEPARATOR_STR + strMasterXml + _T(".rels");
m_oReader.m_pRels->SaveRels(pathFileRels.GetPath());
}
}
if (false)
{
// app
@ -595,15 +664,13 @@ namespace NSBinPptxRW
m_oViewProps.fromPPTY(&m_oReader);
}
//CreateDefaultPresProps();
}
else
{
// create default
CreateDefaultApp();
CreateDefaultCore();
//CreateDefaultPresProps();
//CreateDefaultTableStyles();
CreateDefaultViewProps();
// presProps
@ -760,15 +827,13 @@ namespace NSBinPptxRW
pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.extended-properties+xml", L"/docProps", L"app.xml");
// themes
for (LONG i = 0; i < (LONG)m_arThemes.size(); ++i)
for (size_t i = 0; i < m_arThemes.size(); ++i)
{
pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.theme+xml", L"/ppt/theme", L"theme" + std::to_wstring(i + 1) + L".xml");
}
if (true)
{
// notes theme
pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.theme+xml", L"/ppt/theme", L"theme" + std::to_wstring((int)m_arThemes.size() + 1) + L".xml");
// notes master
if (!m_arNotesMasters.empty())
{
pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml", L"/ppt/notesMasters", L"notesMaster1.xml");
}
@ -785,13 +850,13 @@ namespace NSBinPptxRW
}
// slides
for (LONG i = 0; i < nCountSlides; ++i)
for (size_t i = 0; i < m_arSlides.size(); ++i)
{
pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.presentationml.slide+xml", L"/ppt/slides", L"slide" + std::to_wstring(i + 1) + L".xml");
}
// notes
for (LONG i = 0; i < nCountSlides; ++i)
for (size_t i = 0; i < m_arNotesSlides.size(); ++i)
{
pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml", L"/ppt/notesSlides", L"notesSlide" + std::to_wstring(i + 1) + L".xml");
}

View File

@ -44,7 +44,11 @@ namespace PPTX
{
public:
WritingElement_AdditionConstructors(ClrMap)
PPTX_LOGIC_BASE2(ClrMap)
ClrMap(std::wstring name = L"p:clrMap")
{
m_name = name;
}
virtual OOX::EElementType getType() const
{

View File

@ -137,7 +137,7 @@ namespace PPTX
pWriter->WriteLimit2(4, m_oDrawAspect);
pWriter->WriteLimit2(5, m_oType);
pWriter->WriteLimit2(6, m_oUpdateMode);
if (ole_file.IsInit() == false || ole_file->isMsPackage() == false)
if (ole_file.IsInit() && ole_file->isMsPackage() == false)
{
std::wstring sExt = ole_file->filename().GetExtention(false);
if (!sExt.empty())

View File

@ -46,9 +46,9 @@ namespace PPTX
public:
WritingElement_AdditionConstructors(TextListStyle)
TextListStyle()
TextListStyle(std::wstring name = L"a:lstStyle")
{
m_name = L"a:lstStyle";
m_name = name;
}
virtual void fromXML(XmlUtils::CXmlNode& node)

View File

@ -189,8 +189,8 @@ namespace PPTX
WritingElement_ReadAttributes_Read_else_if( oReader, _T("lvl"), lvl)
WritingElement_ReadAttributes_Read_else_if( oReader, _T("algn"), algn)
WritingElement_ReadAttributes_Read_else_if( oReader, _T("fontAlgn"),fontAlgn)
WritingElement_ReadAttributes_Read_else_if( oReader, _T("marL"), marR)
WritingElement_ReadAttributes_Read_else_if( oReader, _T("marR"), marL)
WritingElement_ReadAttributes_Read_else_if( oReader, _T("marL"), marL)
WritingElement_ReadAttributes_Read_else_if( oReader, _T("marR"), marR)
WritingElement_ReadAttributes_Read_else_if( oReader, _T("indent"), indent)
WritingElement_ReadAttributes_Read_else_if( oReader, _T("defTabSz"),defTabSz)
WritingElement_ReadAttributes_End ( oReader )
@ -541,4 +541,4 @@ namespace PPTX
} // namespace Logic
} // namespace PPTX
#endif // PPTX_LOGIC_TEXTPARAGRAPHPR_INCLUDE_H_
#endif // PPTX_LOGIC_TEXTPARAGRAPHPR_INCLUDE_H_

View File

@ -131,11 +131,11 @@ namespace PPTX
pWriter->StartAttributes();
pWriter->WriteAttribute(_T("xmlns:a"), PPTX::g_Namespaces.a.m_strLink);
pWriter->WriteAttribute(_T("xmlns:r"), PPTX::g_Namespaces.r.m_strLink);
pWriter->WriteAttribute(_T("xmlns:m"), PPTX::g_Namespaces.m.m_strLink);
pWriter->WriteAttribute(_T("xmlns:w"), PPTX::g_Namespaces.w.m_strLink);
pWriter->WriteAttribute(_T("xmlns:p"), PPTX::g_Namespaces.p.m_strLink);
pWriter->EndAttributes();
cSld.toXmlWriter(pWriter);
clrMap.toXmlWriter(pWriter);
pWriter->Write(hf);
pWriter->Write(notesStyle);
@ -172,7 +172,7 @@ namespace PPTX
}
case 3:
{
notesStyle = new Logic::TextListStyle();
notesStyle = new Logic::TextListStyle(L"p:notesStyle");
notesStyle->fromPPTY(pReader);
break;
}

View File

@ -48,7 +48,6 @@ public:
~AutoFilter();
BaseObjectPtr clone();
void readFields(CFRecord& record);

View File

@ -31,7 +31,7 @@
*/
#include "ChartFrtInfo.h"
#include <Logic/Biff_structures/FrtHeaderOld.h>
#include "../Biff_structures/FrtHeaderOld.h"
namespace XLS
{

View File

@ -37,6 +37,8 @@ namespace XLS
DConRef::DConRef()
{
bFilePath = false;
bSheetName = false;
}
@ -52,10 +54,33 @@ BaseObjectPtr DConRef::clone()
void DConRef::readFields(CFRecord& record)
{
#pragma message("####################### DConRef record is not implemented")
Log::error("DConRef record is not implemented.");
record >> ref >> cchFile;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
if (cchFile > 1)
{
XLUnicodeStringNoCch stFile_;
stFile_.setSize(cchFile);
record >> stFile_;
//dcon-file = external-virt-path / self-reference
//external-virt-path = volume / unc-volume / rel-volume / transfer-protocol / startup / alt-startup / library / simple-file-path-dcon
//simple-file-path-dcon = %x0001 file-path
//self-reference = %x0002 sheet-name
stFile = stFile_.value();
if (stFile.substr(0, 1) == L"\x0001")
{
bFilePath = true;
stFile = stFile.substr(1);
}
else if (stFile.substr(0, 1) == L"\x0002")
{
bSheetName = true;
stFile = stFile.substr(1);
}
}
int unused = record.getDataSize() - record.getRdPtr();
record.skipNunBytes(unused);
}
} // namespace XLS

View File

@ -33,11 +33,12 @@
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
#include "../Biff_structures/CellRangeRef.h"
namespace XLS
{
// Logical representation of DConRef record in BIFF8
class DConRef: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(DConRef)
@ -47,12 +48,17 @@ public:
~DConRef();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeDConRef;
static const ElementType type = typeDConRef;
RefU ref;
unsigned short cchFile;
std::wstring stFile;
bool bFilePath;
bool bSheetName;
};

View File

@ -31,7 +31,7 @@
*/
#include "EndObject.h"
#include <Logic/Biff_structures/FrtHeaderOld.h>
#include "../Biff_structures/FrtHeaderOld.h"
namespace XLS
{

View File

@ -54,7 +54,7 @@ void MTRSettings::readFields(CFRecord& record)
{
record.skipNunBytes(12);
_UINT32 temp1, temp2;
#pragma message("############################ frtHeader skipped here")
record >> temp1 >> temp2 >> cUserThreadCount;
fMTREnabled = temp1;

View File

@ -52,9 +52,9 @@ BaseObjectPtr OleDbConn::clone()
void OleDbConn::readFields(CFRecord& record)
{
#pragma message("####################### OleDbConn record is not implemented")
Log::error("OleDbConn record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}
} // namespace XLS

View File

@ -53,9 +53,8 @@ BaseObjectPtr PicF::clone()
void PicF::readFields(CFRecord& record)
{
#pragma message("####################### PicF record is not implemented")
Log::error("PicF record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}
} // namespace XLS

View File

@ -52,9 +52,8 @@ BaseObjectPtr PivotChartBits::clone()
void PivotChartBits::readFields(CFRecord& record)
{
#pragma message("####################### PivotChartBits record is not implemented")
Log::error("PivotChartBits record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}
} // namespace XLS

View File

@ -52,9 +52,9 @@ BaseObjectPtr Qsi::clone()
void Qsi::readFields(CFRecord& record)
{
#pragma message("####################### Qsi record is not implemented")
Log::error("Qsi record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}
} // namespace XLS

View File

@ -52,9 +52,22 @@ BaseObjectPtr QsiSXTag::clone()
void QsiSXTag::readFields(CFRecord& record)
{
#pragma message("####################### QsiSXTag record is not implemented")
Log::error("QsiSXTag record is not implemented.");
//record >> some_value;
unsigned char reserved1;
unsigned short flags, reserved2;
record >> frtHeaderOld >> fSx >> flags;
fEnableRefresh = GETBIT(flags, 0);
fInvalid = GETBIT(flags, 1);
fTensorEx = GETBIT(flags, 2);
record >> dwQsiFuture >> verSxLastUpdated >> verSxUpdatableMin >> obCchName >> reserved1;
record >> stName;
record >> reserved2;
int skip = record.getDataSize() - record.getRdPtr();
record.skipNunBytes(skip);
}
} // namespace XLS

View File

@ -32,12 +32,12 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
#include "../Biff_structures/FrtHeaderOld.h"
namespace XLS
{
// Logical representation of QsiSXTag record in BIFF8
class QsiSXTag: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(QsiSXTag)
@ -47,12 +47,24 @@ public:
~QsiSXTag();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeQsiSXTag;
static const ElementType type = typeQsiSXTag;
FrtHeaderOld frtHeaderOld;
unsigned short fSx;
bool fEnableRefresh;
bool fInvalid;
bool fTensorEx;
_UINT32 dwQsiFuture;
unsigned char verSxLastUpdated;
unsigned char verSxUpdatableMin;
unsigned char obCchName;
XLUnicodeString stName;
};
} // namespace XLS

View File

@ -52,9 +52,8 @@ BaseObjectPtr Qsif::clone()
void Qsif::readFields(CFRecord& record)
{
#pragma message("####################### Qsif record is not implemented")
Log::error("Qsif record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}
} // namespace XLS

View File

@ -53,9 +53,9 @@ BaseObjectPtr RRSort::clone()
void RRSort::readFields(CFRecord& record)
{
#pragma message("####################### RRSort record is not implemented")
Log::error("RRSort record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}
} // namespace XLS

View File

@ -83,7 +83,7 @@ int SST::serialize(std::wostream & stream)
{
CP_XML_WRITER(stream)
{
for (int i=0; i < rgb.size(); i++)
for (size_t i=0; i < rgb.size(); i++)
{
XLUnicodeRichExtendedString *richText = dynamic_cast<XLUnicodeRichExtendedString *>(rgb[i].get());

View File

@ -52,11 +52,66 @@ BaseObjectPtr SXAddl::clone()
void SXAddl::readFields(CFRecord& record)
{
#pragma message("####################### SXAddl record is not implemented")
//Log::error("SXAddl record is not implemented.");
//record >> some_value;
m_SXAddlHdr.load(record);
Log::error("SXAddl record is not implemented.");
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}
//-------------------------------------------------------------------------------------------------------
void SXAddl_SXCCache_SXDId::readFields(CFRecord& record)
{
m_SXAddlHdr.load(record);
short reserved;
record >> idCache >> reserved;
}
void SXAddl_SXCCache_SXDEnd::readFields(CFRecord& record)
{
m_SXAddlHdr.load(record);
_UINT32 reserved1;
short reserved2;
record >> reserved1 >> reserved2;
}
void SXAddl_SXCCache_SXDVer10Info::readFields(CFRecord& record)
{
m_SXAddlHdr.load(record);
_UINT32 reserved1;
short reserved2;
record >> reserved1 >> reserved2;
record >> citmGhostMax >> bVerCacheLastRefresh >> bVerCacheRefreshableMin;
for (int i = 0; i < 8; i++)
record >> numDateCopy[i];
record >> reserved2;
}
void SXAddl_SXCCache_SXDInfo12::readFields(CFRecord& record)
{
m_SXAddlHdr.load(record);
_UINT32 flags;
short reserved;
record >> flags >> reserved;
fSheetData = GETBIT(flags, 0);
fSrvSupportAttribDrill = GETBIT(flags, 1);
fSrvSupportSubQuery = GETBIT(flags, 2);
}
void SXAddl_SXCCache_SXDVerSXMacro::readFields(CFRecord& record)
{
m_SXAddlHdr.load(record);
unsigned char reserved1;
short reserved2, reserved3;
record >> dwVer >> reserved1 >> reserved2 >> reserved3;
}
} // namespace XLS

View File

@ -43,129 +43,188 @@ class SXAddl: public BiffRecord
BIFF_RECORD_DEFINE_TYPE_INFO(SXAddl)
BASE_OBJECT_DEFINE_CLASS_NAME(SXAddl)
public:
struct _SXAddlHdr
{
_UINT32 frtHeaderOld;
unsigned char sxc;
unsigned char sxd;
void load(CFRecord& record)
{
record >> frtHeaderOld >> sxc >> sxd;
}
}m_SXAddlHdr;
SXAddl();
~SXAddl();
BaseObjectPtr clone();
void readFields(CFRecord& record);
virtual void readFields(CFRecord& record);
static const ElementType type = typeSXAddl;
};
class Continue_SxaddlSxString : public SXAddl
{
public:
//virtual void readFields(CFRecord& record);
};
class SXAddl_SXCAutoSort_SXDEnd : public SXAddl {};
class SXAddl_SXCAutoSort_SXDId : public SXAddl {};
class SXAddl_SXCCache_SXDEnd : public SXAddl
{
public:
virtual void readFields(CFRecord& record);
};
class SXAddl_SXCCache_SXDId : public SXAddl
{
public:
virtual void readFields(CFRecord& record);
_UINT32 idCache;
};
class SXAddl_SXCCache_SXDInfo12 : public SXAddl
{
public:
virtual void readFields(CFRecord& record);
bool fSheetData;
bool fSrvSupportAttribDrill;
bool fSrvSupportSubQuery;
};
// The following classes are not implemented and most probably won't be.
// So we save some compilation and link time and resulting dll size
class Continue_SxaddlSxString : public SXAddl {};
class SXAddl_SXCAutoSort_SXDEnd : public SXAddl {};
class SXAddl_SXCAutoSort_SXDId : public SXAddl {};
class SXAddl_SXCCache_SXDEnd : public SXAddl {};
class SXAddl_SXCCache_SXDId : public SXAddl {};
class SXAddl_SXCCache_SXDInfo12 : public SXAddl {};
class SXAddl_SXCCache_SXDInvRefreshReal : public SXAddl {};
class SXAddl_SXCCache_SXDVer10Info : public SXAddl {};
class SXAddl_SXCCache_SXDVerSXMacro : public SXAddl {};
class SXAddl_SXCCache_SXDVerUpdInv : public SXAddl {};
class SXAddl_SXCCacheField_SXDCaption : public SXAddl {};
class SXAddl_SXCCacheField_SXDEnd : public SXAddl {};
class SXAddl_SXCCacheField_SXDId : public SXAddl {};
class SXAddl_SXCCacheField_SXDIfdbMempropMap : public SXAddl {};
class SXAddl_SXCCacheField_SXDIfdbMpMapCount : public SXAddl {};
class SXAddl_SXCCacheField_SXDProperty : public SXAddl {};
class SXAddl_SXCCacheField_SXDPropName : public SXAddl {};
class SXAddl_SXCCacheField_SXDSxrmitmCount : public SXAddl {};
class SXAddl_SXCCacheItem_SXDEnd : public SXAddl {};
class SXAddl_SXCCacheItem_SXDId : public SXAddl {};
class SXAddl_SXCCacheItem_SXDItmMpMapCount : public SXAddl {};
class SXAddl_SXCCacheItem_SXDItmMpropMap : public SXAddl {};
class SXAddl_SXCCacheItem_SXDSxrmitmDisp : public SXAddl {};
class SXAddl_SXCField12_SXDAutoshow : public SXAddl {};
class SXAddl_SXCField12_SXDEnd : public SXAddl {};
class SXAddl_SXCField12_SXDId : public SXAddl {};
class SXAddl_SXCField12_SXDISXTH : public SXAddl {};
class SXAddl_SXCField12_SXDMemberCaption : public SXAddl {};
class SXAddl_SXCField12_SXDVer12Info : public SXAddl {};
class SXAddl_SXCField12_SXDVerUpdInv : public SXAddl {};
class SXAddl_SXCField_SXDEnd : public SXAddl {};
class SXAddl_SXCField_SXDId : public SXAddl {};
class SXAddl_SXCField_SXDVer10Info : public SXAddl {};
class SXAddl_SXCGroup_SXDEnd : public SXAddl {};
class SXAddl_SXCGroup_SXDGrpInfo : public SXAddl {};
class SXAddl_SXCGroup_SXDId : public SXAddl {};
class SXAddl_SXCGroup_SXDMember : public SXAddl {};
class SXAddl_SXCGrpLevel_SXDEnd : public SXAddl {};
class SXAddl_SXCGrpLevel_SXDGrpLevelInfo : public SXAddl {};
class SXAddl_SXCGrpLevel_SXDId : public SXAddl {};
class SXAddl_SXCHierarchy_SXDDisplayFolder : public SXAddl {};
class SXAddl_SXCHierarchy_SXDEnd : public SXAddl {};
class SXAddl_SXCHierarchy_SXDFilterMember : public SXAddl {};
class SXAddl_SXCHierarchy_SXDFilterMember12 : public SXAddl {};
class SXAddl_SXCHierarchy_SXDIconSet : public SXAddl {};
class SXAddl_SXCHierarchy_SXDId : public SXAddl {};
class SXAddl_SXCHierarchy_SXDInfo12 : public SXAddl {};
class SXAddl_SXCHierarchy_SXDKPIGoal : public SXAddl {};
class SXAddl_SXCHierarchy_SXDKPIStatus : public SXAddl {};
class SXAddl_SXCHierarchy_SXDKPITime : public SXAddl {};
class SXAddl_SXCHierarchy_SXDKPITrend : public SXAddl {};
class SXAddl_SXCHierarchy_SXDKPIValue : public SXAddl {};
class SXAddl_SXCHierarchy_SXDKPIWeight : public SXAddl {};
class SXAddl_SXCHierarchy_SXDMeasureGrp : public SXAddl {};
class SXAddl_SXCHierarchy_SXDParentKPI : public SXAddl {};
class SXAddl_SXCHierarchy_SXDProperty : public SXAddl {};
class SXAddl_SXCHierarchy_SXDSXSetParentUnique : public SXAddl {};
class SXAddl_SXCHierarchy_SXDUserCaption : public SXAddl {};
class SXAddl_SXCHierarchy_SXDVerUpdInv : public SXAddl {};
class SXAddl_SXCQsi_SXDEnd : public SXAddl {};
class SXAddl_SXCQsi_SXDId : public SXAddl {};
class SXAddl_SXCQuery_SXDEnd : public SXAddl {};
class SXAddl_SXCQuery_SXDReconnCond : public SXAddl {};
class SXAddl_SXCQuery_SXDSrcConnFile : public SXAddl {};
class SXAddl_SXCQuery_SXDSrcDataFile : public SXAddl {};
class SXAddl_SXCQuery_SXDXMLSource : public SXAddl {};
class SXAddl_SXCSXCondFmt_SXDEnd : public SXAddl {};
class SXAddl_SXCSXCondFmt_SXDSXCondFmt : public SXAddl {};
class SXAddl_SXCSXCondFmts_SXDEnd : public SXAddl {};
class SXAddl_SXCSXCondFmts_SXDId : public SXAddl {};
class SXAddl_SXCSXDH_SXDEnd : public SXAddl {};
class SXAddl_SXCSXDH_SXDId : public SXAddl {};
class SXAddl_SXCSXDH_SXDSxdh : public SXAddl {};
class SXAddl_SXCSXfilt_SXDEnd : public SXAddl {};
class SXAddl_SXCSXfilt_SXDId : public SXAddl {};
class SXAddl_SXCSXfilt_SXDSXfilt : public SXAddl {};
class SXAddl_SXCSXfilt_SXDSXItm : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDCaption : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDEnd : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDId : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDSXFilter : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDSXFilterDesc : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDSXFilterValue1 : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDSXFilterValue2 : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDXlsFilter : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDXlsFilterValue1 : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDXlsFilterValue2 : public SXAddl {};
class SXAddl_SXCSXFilters12_SXDEnd : public SXAddl {};
class SXAddl_SXCSXFilters12_SXDId : public SXAddl {};
class SXAddl_SXCSXMg_SXDEnd : public SXAddl {};
class SXAddl_SXCSXMg_SXDId : public SXAddl {};
class SXAddl_SXCSXMg_SXDUserCaption : public SXAddl {};
class SXAddl_SXCSXMgs_SXDEnd : public SXAddl {};
class SXAddl_SXCSXMgs_SXDId : public SXAddl {};
class SXAddl_SXCSXMgs_SXDMGrpSXDHMap : public SXAddl {};
class SXAddl_SXCSXrule_SXDEnd : public SXAddl {};
class SXAddl_SXCSXrule_SXDId : public SXAddl {};
class SXAddl_SXCSXrule_SXDSXrule : public SXAddl {};
class SXAddl_SXCView_SXDCalcMember : public SXAddl {};
class SXAddl_SXCView_SXDCalcMemString : public SXAddl {};
class SXAddl_SXCView_SXDCompactColHdr : public SXAddl {};
class SXAddl_SXCView_SXDCompactRwHdr : public SXAddl {};
class SXAddl_SXCView_SXDEnd : public SXAddl {};
class SXAddl_SXCView_SXDId : public SXAddl {};
class SXAddl_SXCView_SXDSXPIIvmb : public SXAddl {};
class SXAddl_SXCView_SXDTableStyleClient : public SXAddl {};
class SXAddl_SXCView_SXDVer10Info : public SXAddl {};
class SXAddl_SXCView_SXDVer12Info : public SXAddl {};
class SXAddl_SXCView_SXDVerUpdInv : public SXAddl {};
class SXAddl_SXCCache_SXDInvRefreshReal : public SXAddl
{
};
class SXAddl_SXCCache_SXDVer10Info : public SXAddl
{
public:
virtual void readFields(CFRecord& record);
_INT32 citmGhostMax;
unsigned char bVerCacheLastRefresh;
unsigned char bVerCacheRefreshableMin;
unsigned char numDateCopy[8];
};
class SXAddl_SXCCache_SXDVerSXMacro : public SXAddl
{
public:
virtual void readFields(CFRecord& record);
unsigned char dwVer;
};
class SXAddl_SXCCache_SXDVerUpdInv : public SXAddl {};
class SXAddl_SXCCacheField_SXDCaption : public SXAddl {};
class SXAddl_SXCCacheField_SXDEnd : public SXAddl {};
class SXAddl_SXCCacheField_SXDId : public SXAddl {};
class SXAddl_SXCCacheField_SXDIfdbMempropMap: public SXAddl {};
class SXAddl_SXCCacheField_SXDIfdbMpMapCount: public SXAddl {};
class SXAddl_SXCCacheField_SXDProperty : public SXAddl {};
class SXAddl_SXCCacheField_SXDPropName : public SXAddl {};
class SXAddl_SXCCacheField_SXDSxrmitmCount : public SXAddl {};
class SXAddl_SXCCacheItem_SXDEnd : public SXAddl {};
class SXAddl_SXCCacheItem_SXDId : public SXAddl {};
class SXAddl_SXCCacheItem_SXDItmMpMapCount : public SXAddl {};
class SXAddl_SXCCacheItem_SXDItmMpropMap : public SXAddl {};
class SXAddl_SXCCacheItem_SXDSxrmitmDisp : public SXAddl {};
class SXAddl_SXCField12_SXDAutoshow : public SXAddl {};
class SXAddl_SXCField12_SXDEnd : public SXAddl {};
class SXAddl_SXCField12_SXDId : public SXAddl {};
class SXAddl_SXCField12_SXDISXTH : public SXAddl {};
class SXAddl_SXCField12_SXDMemberCaption : public SXAddl {};
class SXAddl_SXCField12_SXDVer12Info : public SXAddl {};
class SXAddl_SXCField12_SXDVerUpdInv : public SXAddl {};
class SXAddl_SXCField_SXDEnd : public SXAddl {};
class SXAddl_SXCField_SXDId : public SXAddl {};
class SXAddl_SXCField_SXDVer10Info : public SXAddl {};
class SXAddl_SXCGroup_SXDEnd : public SXAddl {};
class SXAddl_SXCGroup_SXDGrpInfo : public SXAddl {};
class SXAddl_SXCGroup_SXDId : public SXAddl {};
class SXAddl_SXCGroup_SXDMember : public SXAddl {};
class SXAddl_SXCGrpLevel_SXDEnd : public SXAddl {};
class SXAddl_SXCGrpLevel_SXDGrpLevelInfo : public SXAddl {};
class SXAddl_SXCGrpLevel_SXDId : public SXAddl {};
class SXAddl_SXCHierarchy_SXDDisplayFolder : public SXAddl {};
class SXAddl_SXCHierarchy_SXDEnd : public SXAddl {};
class SXAddl_SXCHierarchy_SXDFilterMember : public SXAddl {};
class SXAddl_SXCHierarchy_SXDFilterMember12 : public SXAddl {};
class SXAddl_SXCHierarchy_SXDIconSet : public SXAddl {};
class SXAddl_SXCHierarchy_SXDId : public SXAddl {};
class SXAddl_SXCHierarchy_SXDInfo12 : public SXAddl {};
class SXAddl_SXCHierarchy_SXDKPIGoal : public SXAddl {};
class SXAddl_SXCHierarchy_SXDKPIStatus : public SXAddl {};
class SXAddl_SXCHierarchy_SXDKPITime : public SXAddl {};
class SXAddl_SXCHierarchy_SXDKPITrend : public SXAddl {};
class SXAddl_SXCHierarchy_SXDKPIValue : public SXAddl {};
class SXAddl_SXCHierarchy_SXDKPIWeight : public SXAddl {};
class SXAddl_SXCHierarchy_SXDMeasureGrp : public SXAddl {};
class SXAddl_SXCHierarchy_SXDParentKPI : public SXAddl {};
class SXAddl_SXCHierarchy_SXDProperty : public SXAddl {};
class SXAddl_SXCHierarchy_SXDSXSetParentUnique : public SXAddl {};
class SXAddl_SXCHierarchy_SXDUserCaption : public SXAddl {};
class SXAddl_SXCHierarchy_SXDVerUpdInv : public SXAddl {};
class SXAddl_SXCQsi_SXDEnd : public SXAddl {};
class SXAddl_SXCQsi_SXDId : public SXAddl {};
class SXAddl_SXCQuery_SXDEnd : public SXAddl {};
class SXAddl_SXCQuery_SXDReconnCond : public SXAddl {};
class SXAddl_SXCQuery_SXDSrcConnFile : public SXAddl {};
class SXAddl_SXCQuery_SXDSrcDataFile : public SXAddl {};
class SXAddl_SXCQuery_SXDXMLSource : public SXAddl {};
class SXAddl_SXCSXCondFmt_SXDEnd : public SXAddl {};
class SXAddl_SXCSXCondFmt_SXDSXCondFmt : public SXAddl {};
class SXAddl_SXCSXCondFmts_SXDEnd : public SXAddl {};
class SXAddl_SXCSXCondFmts_SXDId : public SXAddl {};
class SXAddl_SXCSXDH_SXDEnd : public SXAddl {};
class SXAddl_SXCSXDH_SXDId : public SXAddl {};
class SXAddl_SXCSXDH_SXDSxdh : public SXAddl {};
class SXAddl_SXCSXfilt_SXDEnd : public SXAddl {};
class SXAddl_SXCSXfilt_SXDId : public SXAddl {};
class SXAddl_SXCSXfilt_SXDSXfilt : public SXAddl {};
class SXAddl_SXCSXfilt_SXDSXItm : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDCaption : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDEnd : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDId : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDSXFilter : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDSXFilterDesc : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDSXFilterValue1: public SXAddl {};
class SXAddl_SXCSXFilter12_SXDSXFilterValue2: public SXAddl {};
class SXAddl_SXCSXFilter12_SXDXlsFilter : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDXlsFilterValue1: public SXAddl {};
class SXAddl_SXCSXFilter12_SXDXlsFilterValue2: public SXAddl {};
class SXAddl_SXCSXFilters12_SXDEnd : public SXAddl {};
class SXAddl_SXCSXFilters12_SXDId : public SXAddl {};
class SXAddl_SXCSXMg_SXDEnd : public SXAddl {};
class SXAddl_SXCSXMg_SXDId : public SXAddl {};
class SXAddl_SXCSXMg_SXDUserCaption : public SXAddl {};
class SXAddl_SXCSXMgs_SXDEnd : public SXAddl {};
class SXAddl_SXCSXMgs_SXDId : public SXAddl {};
class SXAddl_SXCSXMgs_SXDMGrpSXDHMap : public SXAddl {};
class SXAddl_SXCSXrule_SXDEnd : public SXAddl {};
class SXAddl_SXCSXrule_SXDId : public SXAddl {};
class SXAddl_SXCSXrule_SXDSXrule : public SXAddl {};
class SXAddl_SXCView_SXDCalcMember : public SXAddl {};
class SXAddl_SXCView_SXDCalcMemString : public SXAddl {};
class SXAddl_SXCView_SXDCompactColHdr : public SXAddl {};
class SXAddl_SXCView_SXDCompactRwHdr : public SXAddl {};
class SXAddl_SXCView_SXDEnd : public SXAddl {};
class SXAddl_SXCView_SXDId : public SXAddl {};
class SXAddl_SXCView_SXDSXPIIvmb : public SXAddl {};
class SXAddl_SXCView_SXDTableStyleClient : public SXAddl {};
class SXAddl_SXCView_SXDVer10Info : public SXAddl {};
class SXAddl_SXCView_SXDVer12Info : public SXAddl {};
class SXAddl_SXCView_SXDVerUpdInv : public SXAddl {};
} // namespace XLS

View File

@ -52,9 +52,8 @@ BaseObjectPtr SXDI::clone()
void SXDI::readFields(CFRecord& record)
{
#pragma message("####################### SXDI record is not implemented")
Log::error("SXDI record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -52,9 +52,57 @@ BaseObjectPtr SXEx::clone()
void SXEx::readFields(CFRecord& record)
{
#pragma message("####################### SXEx record is not implemented")
Log::error("SXEx record is not implemented.");
//record >> some_value;
record >> csxformat >> cchErrorString >> cchNullString >> cchTag >> csxselect;
_UINT32 flags;
record >> crwPage >> ccolPage >> flags;
fAcrossPageLay = GETBIT(flags, 0);
cWrapPage = GETBITS(flags, 1, 9);
fEnableWizard = GETBIT(flags, 16);
fEnableDrilldown = GETBIT(flags, 17);
fEnableFieldDialog = GETBIT(flags, 18);
fPreserveFormatting = GETBIT(flags, 19);
fMergeLabels = GETBIT(flags, 20);
fDisplayErrorString = GETBIT(flags, 21);
fDisplayNullString = GETBIT(flags, 22);
fSubtotalHiddenPageItems = GETBIT(flags, 23);
record >> cchPageFieldStyle >> cchTableStyle >> cchVacateStyle;
if (cchErrorString > 0 && cchErrorString != 0xffff)
{
stError.setSize(cchErrorString);
record >> stError;
}
if (cchNullString > 0 && cchNullString != 0xffff)
{
stDisplayNull.setSize(cchNullString);
record >> stDisplayNull;
}
if (cchTag > 0 && cchTag != 0xffff)
{
stTag.setSize(cchTag);
record >> stTag;
}
if (cchPageFieldStyle > 0 && cchPageFieldStyle != 0xffff)
{
stPageFieldStyle.setSize(cchPageFieldStyle);
record >> stPageFieldStyle;
}
if (cchTableStyle > 0 && cchTableStyle != 0xffff)
{
stTableStyle.setSize(cchTableStyle);
record >> cchTableStyle;
}
if (cchVacateStyle > 0 && cchVacateStyle != 0xffff)
{
stVacateStyle.setSize(cchVacateStyle);
record >> cchVacateStyle;
}
int skip = record.getDataSize() - record.getRdPtr();
record.skipNunBytes(skip);
}
} // namespace XLS

View File

@ -32,12 +32,12 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
#include "../Biff_structures/CellRangeRef.h"
namespace XLS
{
// Logical representation of SXEx record in BIFF8
class SXEx: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXEx)
@ -47,13 +47,41 @@ public:
~SXEx();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXEx;
static const ElementType type = typeSXEx;
unsigned short csxformat;
unsigned short cchErrorString;
unsigned short cchNullString;
unsigned short cchTag;
unsigned short csxselect;
DRw crwPage;
ColU ccolPage;
bool fAcrossPageLay;
unsigned char cWrapPage;
bool fEnableWizard;
bool fEnableDrilldown;
bool fEnableFieldDialog;
bool fPreserveFormatting;
bool fMergeLabels;
bool fDisplayErrorString;
bool fDisplayNullString;
bool fSubtotalHiddenPageItems;
unsigned short cchPageFieldStyle;
unsigned short cchTableStyle;
unsigned short cchVacateStyle;
XLUnicodeStringNoCch stError;
XLUnicodeStringNoCch stDisplayNull;
XLUnicodeStringNoCch stTag;
XLUnicodeStringNoCch stPageFieldStyle;
XLUnicodeStringNoCch stTableStyle;
XLUnicodeStringNoCch stVacateStyle;
};
} // namespace XLS

View File

@ -52,9 +52,8 @@ BaseObjectPtr SXLI::clone()
void SXLI::readFields(CFRecord& record)
{
#pragma message("####################### SXLI record is not implemented")
Log::error("SXLI record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -52,9 +52,8 @@ BaseObjectPtr SXPI::clone()
void SXPI::readFields(CFRecord& record)
{
#pragma message("####################### SXPI record is not implemented")
Log::error("SXPI record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -52,9 +52,8 @@ BaseObjectPtr SXPIEx::clone()
void SXPIEx::readFields(CFRecord& record)
{
#pragma message("####################### SXPIEx record is not implemented")
Log::error("SXPIEx record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -53,10 +53,7 @@ BaseObjectPtr SXStreamID::clone()
void SXStreamID::readFields(CFRecord& record)
{
#pragma message("####################### SXStreamID record is not implemented")
Log::error("SXStreamID record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
record >> idStm;
}
} // namespace XLS

View File

@ -53,8 +53,7 @@ public:
static const ElementType type = typeSXStreamID;
short idStm;
};
} // namespace XLS

View File

@ -53,9 +53,8 @@ BaseObjectPtr SXString::clone()
void SXString::readFields(CFRecord& record)
{
#pragma message("####################### SXString record is not implemented")
Log::error("SXString record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -53,9 +53,8 @@ BaseObjectPtr SXTBRGIITM::clone()
void SXTBRGIITM::readFields(CFRecord& record)
{
#pragma message("####################### SXTBRGIITM record is not implemented")
Log::error("SXTBRGIITM record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -53,9 +53,8 @@ BaseObjectPtr SXTH::clone()
void SXTH::readFields(CFRecord& record)
{
#pragma message("####################### SXTH record is not implemented")
Log::error("SXTH record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -52,9 +52,8 @@ BaseObjectPtr SXTbl::clone()
void SXTbl::readFields(CFRecord& record)
{
#pragma message("####################### SXTbl record is not implemented")
Log::error("SXTbl record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -53,9 +53,8 @@ BaseObjectPtr SXVDEx::clone()
void SXVDEx::readFields(CFRecord& record)
{
#pragma message("####################### SXVDEx record is not implemented")
//Log::error("SXVDEx record is not implemented.");
//record >> some_value;
Log::error("SXVDEx record is not implemented.");
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -52,9 +52,8 @@ BaseObjectPtr SXVDTEx::clone()
void SXVDTEx::readFields(CFRecord& record)
{
#pragma message("####################### SXVDTEx record is not implemented")
Log::error("SXVDTEx record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -52,9 +52,8 @@ BaseObjectPtr SXVI::clone()
void SXVI::readFields(CFRecord& record)
{
#pragma message("####################### SXVI record is not implemented")
//Log::error("SXVI record is not implemented.");
//record >> some_value;
Log::error("SXVI record is not implemented.");
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -52,12 +52,7 @@ BaseObjectPtr SXVS::clone()
void SXVS::readFields(CFRecord& record)
{
#pragma message("####################### SXVS record is not implemented")
Log::error("SXVS record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
record >> sxvs;
}
} // namespace XLS

View File

@ -47,13 +47,18 @@ public:
~SXVS();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXVS;
short sxvs;
//enum
//SHEET 0x0001
//EXTERNAL 0x0002
//CONSOLIDATION 0x0004
//SCENARIO 0x0010
};
} // namespace XLS

View File

@ -35,16 +35,6 @@
namespace XLS
{
SXViewEx::SXViewEx()
{
}
SXViewEx::~SXViewEx()
{
}
BaseObjectPtr SXViewEx::clone()
{
return BaseObjectPtr(new SXViewEx(*this));
@ -52,9 +42,11 @@ BaseObjectPtr SXViewEx::clone()
void SXViewEx::readFields(CFRecord& record)
{
#pragma message("####################### SXViewEx record is not implemented")
Log::error("SXViewEx record is not implemented.");
//record >> some_value;
record >> frtHeaderOld >> csxth >> csxpi >> csxvdtex >> cbFuture;
if (cbFuture)
rgbFuture = std::string(record.getCurData<char>(), cbFuture);
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -32,6 +32,7 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/FrtHeaderOld.h"
namespace XLS
{
@ -43,16 +44,22 @@ class SXViewEx: public BiffRecord
BIFF_RECORD_DEFINE_TYPE_INFO(SXViewEx)
BASE_OBJECT_DEFINE_CLASS_NAME(SXViewEx)
public:
SXViewEx();
~SXViewEx();
SXViewEx() {}
~SXViewEx(){}
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXViewEx;
static const ElementType type = typeSXViewEx;
FrtHeaderOld frtHeaderOld;
_INT32 csxth;
_INT32 csxpi;
_INT32 csxvdtex;
_UINT32 cbFuture;
std::string rgbFuture;
};
} // namespace XLS

View File

@ -53,9 +53,8 @@ BaseObjectPtr SXViewEx9::clone()
void SXViewEx9::readFields(CFRecord& record)
{
#pragma message("####################### SXViewEx9 record is not implemented")
Log::error("SXViewEx9 record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -52,9 +52,8 @@ BaseObjectPtr SXViewLink::clone()
void SXViewLink::readFields(CFRecord& record)
{
#pragma message("####################### SXViewLink record is not implemented")
Log::error("SXViewLink record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -55,13 +55,14 @@ void Sort::readFields(CFRecord& record)
{
unsigned short flags;
record >> flags;
fCol = GETBIT(flags, 0);
fKey1Dsc = GETBIT(flags, 1);
fKey2Dsc = GETBIT(flags, 2);
fKey3Dsc = GETBIT(flags, 3);
fCol = GETBIT(flags, 0);
fKey1Dsc = GETBIT(flags, 1);
fKey2Dsc = GETBIT(flags, 2);
fKey3Dsc = GETBIT(flags, 3);
fCaseSensitive = GETBIT(flags, 4);
iOrder = GETBITS(flags, 5, 9);
fAltMethod = GETBIT(flags, 10);
iOrder = GETBITS(flags, 5, 9);
fAltMethod = GETBIT(flags, 10);
unsigned char cchKey1;
unsigned char cchKey2;

View File

@ -48,7 +48,6 @@ public:
~Sort();
BaseObjectPtr clone();
void readFields(CFRecord& record);

View File

@ -31,7 +31,7 @@
*/
#include "StartObject.h"
#include <Logic/Biff_structures/FrtHeaderOld.h>
#include "../Biff_structures/FrtHeaderOld.h"
namespace XLS
{

View File

@ -52,9 +52,8 @@ BaseObjectPtr SxDXF::clone()
void SxDXF::readFields(CFRecord& record)
{
#pragma message("####################### SxDXF record is not implemented")
Log::error("SxDXF record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -53,9 +53,8 @@ BaseObjectPtr SxFilt::clone()
void SxFilt::readFields(CFRecord& record)
{
#pragma message("####################### SxFilt record is not implemented")
Log::error("SxFilt record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -47,7 +47,6 @@ public:
~SxFilt();
BaseObjectPtr clone();
void readFields(CFRecord& record);

View File

@ -53,9 +53,8 @@ BaseObjectPtr SxFormat::clone()
void SxFormat::readFields(CFRecord& record)
{
#pragma message("####################### SxFormat record is not implemented")
Log::error("SxFormat record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -52,9 +52,8 @@ BaseObjectPtr SxItm::clone()
void SxItm::readFields(CFRecord& record)
{
#pragma message("####################### SxItm record is not implemented")
Log::error("SxItm record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -35,16 +35,6 @@
namespace XLS
{
SxIvd::SxIvd()
{
}
SxIvd::~SxIvd()
{
}
BaseObjectPtr SxIvd::clone()
{
return BaseObjectPtr(new SxIvd(*this));
@ -53,10 +43,17 @@ BaseObjectPtr SxIvd::clone()
void SxIvd::readFields(CFRecord& record)
{
#pragma message("####################### SxIvd record is not implemented")
Log::error("SxIvd record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
int rgSize = record.getDataSize() / 2;
for (int i = 0; i < rgSize; i++)
{
short val;
record >> val;
rgSxivd.push_back(val);
}
int skip = record.getDataSize() - record.getRdPtr();
record.skipNunBytes(skip);
}
} // namespace XLS

View File

@ -36,22 +36,21 @@
namespace XLS
{
// Logical representation of SxIvd record in BIFF8
class SxIvd: public BiffRecordContinued
{
BIFF_RECORD_DEFINE_TYPE_INFO(SxIvd)
BASE_OBJECT_DEFINE_CLASS_NAME(SxIvd)
public:
SxIvd();
~SxIvd();
SxIvd() {}
~SxIvd(){}
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSxIvd;
static const ElementType type = typeSxIvd;
std::vector<short> rgSxivd;
};

View File

@ -53,9 +53,8 @@ BaseObjectPtr SxRule::clone()
void SxRule::readFields(CFRecord& record)
{
#pragma message("####################### SxRule record is not implemented")
Log::error("SxRule record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -47,13 +47,10 @@ public:
~SxRule();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSxRule;
};
} // namespace XLS

View File

@ -53,9 +53,8 @@ BaseObjectPtr SxSelect::clone()
void SxSelect::readFields(CFRecord& record)
{
#pragma message("####################### SxSelect record is not implemented")
Log::error("SxSelect record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -47,7 +47,6 @@ public:
~SxSelect();
BaseObjectPtr clone();
void readFields(CFRecord& record);

View File

@ -53,9 +53,7 @@ BaseObjectPtr SxTbpg::clone()
void SxTbpg::readFields(CFRecord& record)
{
#pragma message("####################### SxTbpg record is not implemented")
Log::error("SxTbpg record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());

View File

@ -35,16 +35,20 @@
namespace XLS
{
SxView::SxView()
BiffStructurePtr SXAxis::clone()
{
return BiffStructurePtr(new SXAxis(*this));
}
SxView::~SxView()
void SXAxis::load(CFRecord& record)
{
}
unsigned short flags;
record >> flags;
bRw = GETBIT(flags, 0);
bCol = GETBIT(flags, 1);
bPage = GETBIT(flags, 2);
bData = GETBIT(flags, 3);
}
BaseObjectPtr SxView::clone()
{
return BaseObjectPtr(new SxView(*this));
@ -52,10 +56,36 @@ BaseObjectPtr SxView::clone()
void SxView::readFields(CFRecord& record)
{
#pragma message("####################### SxView record is not implemented")
Log::error("SxView record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
short reserved, flags;
record >> ref >> rwFirstHead >> rwFirstData >> colFirstData >> iCache >> reserved;
record >> sxaxis4Data >> ipos4Data;
record >> cDim >> cDimRw >> cDimCol >> cDimPg >> cDimData >> cRw >> cCol;
record >> flags;
fRwGrand = GETBIT(flags, 0);
fColGrand = GETBIT(flags, 1);
fAutoFormat = GETBIT(flags, 3);
fAtrNum = GETBIT(flags, 4);
fAtrFnt = GETBIT(flags, 5);
fAtrAlc = GETBIT(flags, 6);
fAtrBdr = GETBIT(flags, 7);
fAtrPat = GETBIT(flags, 8);
fAtrProc = GETBIT(flags, 9);
record >> itblAutoFmt >> cchTableName >> cchDataName;
if(cchTableName && cchTableName <= 0x00FF)
{
stTable.setSize(cchTableName);
record >> stTable;
}
if(cchDataName > 0 && cchDataName <= 0x00FE)
{
stData.setSize(cchDataName);
record >> stData;
}
int skip = record.getDataSize() - record.getRdPtr();
record.skipNunBytes(skip);
}
} // namespace XLS

View File

@ -32,27 +32,78 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
#include "../Biff_structures/CellRangeRef.h"
namespace XLS
{
class SXAxis : public BiffStructure
{
BASE_STRUCTURE_DEFINE_CLASS_NAME(SXAxis)
public:
SXAxis(){}
~SXAxis(){}
BiffStructurePtr clone();
virtual void load(CFRecord& record);
static const ElementType type = typeSXAxis;
bool bRw;
bool bCol;
bool bPage;
bool bData;
};
// Logical representation of SxView record in BIFF8
class SxView: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SxView)
BASE_OBJECT_DEFINE_CLASS_NAME(SxView)
public:
SxView();
~SxView();
SxView() {cchTableName = cchDataName = 0;}
~SxView() {}
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSxView;
static const ElementType type = typeSxView;
Ref8U ref;
RwU rwFirstHead;
RwU rwFirstData;
ColU colFirstData;
short iCache;
short reserved;
SXAxis sxaxis4Data;
short ipos4Data;
short cDim;
unsigned short cDimRw;
unsigned short cDimCol;
unsigned short cDimPg;
short cDimData;
unsigned short cRw;
unsigned short cCol;
bool fRwGrand;
bool fColGrand;
bool fAutoFormat;
bool fAtrNum;
bool fAtrFnt;
bool fAtrAlc;
bool fAtrBdr;
bool fAtrPat;
bool fAtrProc;
unsigned short itblAutoFmt; //enum AutoFmt8
unsigned short cchTableName;
unsigned short cchDataName;
XLUnicodeStringNoCch stTable;
XLUnicodeStringNoCch stData;
};
} // namespace XLS

View File

@ -37,6 +37,7 @@ namespace XLS
Sxvd::Sxvd()
{
cchName = 0;
}
@ -52,12 +53,31 @@ BaseObjectPtr Sxvd::clone()
void Sxvd::readFields(CFRecord& record)
{
#pragma message("####################### Sxvd record is not implemented")
//Log::error("Sxvd record is not implemented.");
//record >> some_value;
short flags;
record >> sxaxis >> cSub >> flags;
fDefault = GETBIT(flags, 0);
fSum = GETBIT(flags, 1);
fCounta = GETBIT(flags, 2);
fAverage = GETBIT(flags, 3);
fMax = GETBIT(flags, 4);
fMin = GETBIT(flags, 5);
fProduct = GETBIT(flags, 6);
fCount = GETBIT(flags, 7);
fStdev = GETBIT(flags, 8);
fStdevp = GETBIT(flags, 9);
fVariance = GETBIT(flags, 10);
fVariancep = GETBIT(flags, 11);
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}
record >> cItm >> cchName;
if(cchName && cchName != 0xffff)
{
stName.setSize(cchName);
record >> stName;
}
int skip = record.getDataSize() - record.getRdPtr();
record.skipNunBytes(skip);}
} // namespace XLS

View File

@ -31,13 +31,11 @@
*/
#pragma once
#include "BiffRecord.h"
#include "SxView.h"
namespace XLS
{
// Logical representation of Sxvd record in BIFF8
class Sxvd: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(Sxvd)
@ -47,12 +45,31 @@ public:
~Sxvd();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSxvd;
SXAxis sxaxis;
unsigned short cSub;
bool fDefault;
bool fSum;
bool fCounta;
bool fAverage;
bool fMax;
bool fMin;
bool fProduct;
bool fCount;
bool fStdev;
bool fStdevp;
bool fVariance;
bool fVariancep;
short cItm;
unsigned short cchName;
XLUnicodeStringNoCch stName;
};
} // namespace XLS

View File

@ -43,18 +43,15 @@ class Bes : public BiffStructure
public:
BiffStructurePtr clone();
static const ElementType type = typeBes;
static const ElementType type = typeBes;
virtual void load(CFRecord& record);
const std::wstring toString();
void fromString(const std::wstring str);
private:
unsigned char bBoolErr;
Boolean<unsigned char> fError;
unsigned char bBoolErr;
Boolean<unsigned char> fError;
};
} // namespace XLS

View File

@ -57,8 +57,8 @@ void ExtPtgArea3D::load(CFRecord& record)
void ExtPtgArea3D::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref)
{
#pragma message("####################### ExtPtgArea3D record is not implemented")
Log::info("ExtPtgArea3D record is not implemented.");
ptg_stack.push(L"#REF!");
}

View File

@ -52,8 +52,8 @@ void ExtPtgAreaErr3D::load(CFRecord& record)
void ExtPtgAreaErr3D::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref)
{
#pragma message("####################### ExtPtgAreaErr3D record is not implemented")
Log::info("ExtPtgAreaErr3D record is not implemented.");
ptg_stack.push(L"#REF!");
}

View File

@ -57,8 +57,8 @@ void ExtPtgRef3D::load(CFRecord& record)
void ExtPtgRef3D::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref )
{
#pragma message("####################### ExtPtgRef3D record is not implemented")
Log::info("ExtPtgRef3D record is not implemented.");
ptg_stack.push(L"#REF!");
}

View File

@ -51,8 +51,8 @@ void ExtPtgRefErr3D::load(CFRecord& record)
void ExtPtgRefErr3D::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref)
{
#pragma message("####################### ExtPtgRefErr3D record is not implemented")
Log::info("ExtPtgRefErr3D record is not implemented.");
ptg_stack.push(L"#REF!");
}

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of AXES union of records
class AXES: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(AXES)

View File

@ -47,39 +47,9 @@ PIVOTADDL::PIVOTADDL()
{
}
PIVOTADDL::~PIVOTADDL()
{
}
/*
int b = 5;
boost::shared_ptr<int> by;
void raw_ptr(const int* ptr) // указатель на константный объект.
{
ptr = &b; // компилится, потому что указатель не константный
*ptr = 4; // не компилится, потому что объект константный
}
// то же самое для shared_ptr
void raw_ptr(boost::shared_ptr<const int> ptr) // указатель на константный объект.
{
ptr = by; // компилится, потому что указатель не константный
*ptr = 4; // не компилится, потому что объект константный
}
// ===================== теперь наоборот
void raw_ptr2(int* const ptr) // константный указатель на неконстантный объект.
{
ptr = &b; // не компилится, потому что указатель - константный
*ptr = 4; // компилится, потому что объект не константный
}
// то же самое для shared_ptr
void raw_ptr2(const boost::shared_ptr<int> ptr) // константный указатель на не константный объект.
{
ptr = by; // не компилится, потому что указатель - константный
*ptr = 4; // компилится, потому что объект не константный
}
*/
BaseObjectPtr PIVOTADDL::clone()
{
@ -101,31 +71,51 @@ const bool PIVOTADDL::loadContent(BinProcessor& proc)
{
return false;
}
proc.repeated<Continue_SxaddlSxString>(0, 0);
proc.optional<SXAddl_SXCView_SXDVer10Info>();
proc.optional<SXAddl_SXCView_SXDVer12Info>();
proc.repeated<SXADDLCALCMEMBER>(0, 0);
proc.repeated<SXADDLHIERARCHY>(0, 0);
proc.repeated<SXADDLFIELD>(0, 0);
proc.repeated<UNKNOWNFRT>(0, 0);
proc.optional<SXAddl_SXCView_SXDTableStyleClient>();
int count = 0;
count = proc.repeated<Continue_SxaddlSxString>(0, 0);
if (proc.optional<SXAddl_SXCView_SXDVer10Info>())
{
}
if (proc.optional<SXAddl_SXCView_SXDVer12Info>())
{
}
count = proc.repeated<SXADDLCALCMEMBER>(0, 0);
count = proc.repeated<SXADDLHIERARCHY>(0, 0);
count = proc.repeated<SXADDLFIELD>(0, 0);
count = proc.repeated<UNKNOWNFRT>(0, 0);
if (proc.optional<SXAddl_SXCView_SXDTableStyleClient>())
{
}
if(proc.optional<SXAddl_SXCView_SXDCompactRwHdr>())
{
proc.repeated<Continue_SxaddlSxString>(0, 0);
count = proc.repeated<Continue_SxaddlSxString>(0, 0);
}
if(proc.optional<SXAddl_SXCView_SXDCompactColHdr>())
{
proc.repeated<Continue_SxaddlSxString>(0, 0);
count = proc.repeated<Continue_SxaddlSxString>(0, 0);
}
proc.optional<SXAddl_SXCView_SXDVerUpdInv>();
proc.optional<SXADDLCONDFMTS>();
proc.optional<SXADDLSXFILTERS12>();
proc.repeated<SXAddl_SXCView_SXDVerUpdInv>(0, 0);
proc.repeated<SXAddl_SXCView_SXDSXPIIvmb>(0, 0);
proc.optional<SXAddl_SXCView_SXDVerUpdInv>();
proc.mandatory<SXAddl_SXCView_SXDEnd>();
if (proc.optional<SXAddl_SXCView_SXDVerUpdInv>())
{
}
if (proc.optional<SXADDLCONDFMTS>())
{
}
if (proc.optional<SXADDLSXFILTERS12>())
{
}
count = proc.repeated<SXAddl_SXCView_SXDVerUpdInv>(0, 0);
count = proc.repeated<SXAddl_SXCView_SXDSXPIIvmb>(0, 0);
if (proc.optional<SXAddl_SXCView_SXDVerUpdInv>())
{
}
if (proc.mandatory<SXAddl_SXCView_SXDEnd>())
{
}
return true;
}

View File

@ -63,11 +63,24 @@ const bool PIVOTCACHEDEFINITION::loadContent(BinProcessor& proc)
{
return false;
}
#pragma message("####################### PIVOTCACHEDEFINITION union is not implemented")
Log::info("PIVOTCACHEDEFINITION union is not implemented!!!!!!!!!!!!!!!");
proc.mandatory<SXVS>();
proc.optional<SXSRC>();
proc.optional<SXADDLCACHE>();
m_SXStreamID = elements_.back();
elements_.pop_back();
if (proc.mandatory<SXVS>())
{
m_SXVS = elements_.back();
elements_.pop_back();
}
if (proc.optional<SXSRC>())
{
m_SXSRC = elements_.back();
elements_.pop_back();
}
if (proc.optional<SXADDLCACHE>())
{
m_SXADDLCACHE = elements_.back();
elements_.pop_back();
}
return true;
}

View File

@ -50,6 +50,11 @@ public:
virtual const bool loadContent(BinProcessor& proc);
static const ElementType type = typePIVOTCACHEDEFINITION;
BaseObjectPtr m_SXStreamID;
BaseObjectPtr m_SXVS;
BaseObjectPtr m_SXSRC;
BaseObjectPtr m_SXADDLCACHE;
};
} // namespace XLS

View File

@ -66,12 +66,45 @@ const bool PIVOTCORE::loadContent(BinProcessor& proc)
{
return false;
}
proc.repeated<PIVOTVD>(0, 0);
proc.repeated<PIVOTIVD>(0, 2);
proc.optional<PIVOTPI>();
proc.repeated<SXDI>(0, 0);
proc.repeated<PIVOTLI>(0, 0);
proc.mandatory<PIVOTEX>();
m_SxView = elements_.back();
elements_.pop_back();
int count = 0;
count = proc.repeated<PIVOTVD>(0, 0);
while(count--)
{
m_arPIVOTVD.push_back(elements_.front()); elements_.pop_front();
}
count = proc.repeated<PIVOTIVD>(0, 2);
while(count--)
{
m_arPIVOTIVD.push_back(elements_.front()); elements_.pop_front();
}
if (proc.optional<PIVOTPI>())
{
m_PIVOTPI= elements_.back();
elements_.pop_back();
}
count = proc.repeated<SXDI>(0, 0);
while(count--)
{
m_arSXDI.push_back(elements_.front()); elements_.pop_front();
}
count = proc.repeated<PIVOTLI>(0, 0);
while(count--)
{
m_arPIVOTLI.push_back(elements_.front()); elements_.pop_front();
}
if (proc.mandatory<PIVOTEX>())
{
m_PIVOTEX = elements_.back();
elements_.pop_back();
}
return true;
}

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of PIVOTCORE union of records
class PIVOTCORE: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(PIVOTCORE)
@ -50,6 +48,15 @@ public:
virtual const bool loadContent(BinProcessor& proc);
static const ElementType type = typePIVOTCORE;
BaseObjectPtr m_SxView;
std::vector<BaseObjectPtr> m_arPIVOTVD;
std::vector<BaseObjectPtr> m_arPIVOTIVD;
BaseObjectPtr m_PIVOTPI;
std::vector<BaseObjectPtr> m_arSXDI;
std::vector<BaseObjectPtr> m_arPIVOTLI;
BaseObjectPtr m_PIVOTEX;
};
} // namespace XLS

View File

@ -62,8 +62,9 @@ const bool PIVOTEX::loadContent(BinProcessor& proc)
{
return false;
}
proc.repeated<PIVOTSELECT>(0, 0);
proc.repeated<PIVOTFORMAT>(0, 0);
int count = 0;
count = proc.repeated<PIVOTSELECT>(0, 0);
count = proc.repeated<PIVOTFORMAT>(0, 0);
return true;
}

View File

@ -62,8 +62,12 @@ const bool PIVOTFORMAT::loadContent(BinProcessor& proc)
{
return false;
}
proc.mandatory<PIVOTRULE>();
proc.optional<SxDXF>();
if (proc.mandatory<PIVOTRULE>())
{
}
if (proc.optional<SxDXF>())
{
}
return true;
}

View File

@ -57,14 +57,14 @@ BaseObjectPtr PIVOTFRT::clone()
// PIVOTFRT = PIVOTFRT9 [PIVOTADDL]
const bool PIVOTFRT::loadContent(BinProcessor& proc)
{
if(!proc.mandatory<PIVOTFRT9>())
{
return false;
}
#pragma message("####################### PIVOTFRT union is not implemented")
Log::info("PIVOTFRT union is not implemented!!!!!!!!!!!!!!!");
proc.optional<PIVOTADDL>();
if (proc.optional<PIVOTADDL>())
{
}
return true;
}

View File

@ -63,9 +63,26 @@ const bool PIVOTFRT9::loadContent(BinProcessor& proc)
{
return false;
}
proc.optional<DBQUERYEXT>();
proc.optional<PIVOTVIEWEX>();
proc.mandatory<SXViewEx9>();
m_QsiSXTag = elements_.back();
elements_.pop_back();
if (proc.optional<DBQUERYEXT>())
{
m_DBQUERYEXT = elements_.back();
elements_.pop_back();
}
if (proc.optional<PIVOTVIEWEX>())
{
m_PIVOTVIEWEX = elements_.back();
elements_.pop_back();
}
if (proc.mandatory<SXViewEx9>())
{
m_SXViewEx9 = elements_.back();
elements_.pop_back();
}
else
return false;
return true;
}

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of PIVOTFRT9 union of records
class PIVOTFRT9: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(PIVOTFRT9)
@ -49,7 +47,12 @@ public:
virtual const bool loadContent(BinProcessor& proc);
static const ElementType type = typePIVOTFRT9;
static const ElementType type = typePIVOTFRT9;
BaseObjectPtr m_QsiSXTag;
BaseObjectPtr m_SXViewEx9;
BaseObjectPtr m_DBQUERYEXT;
BaseObjectPtr m_PIVOTVIEWEX;
};
} // namespace XLS

View File

@ -61,7 +61,10 @@ const bool PIVOTIVD::loadContent(BinProcessor& proc)
{
return false;
}
proc.repeated<Continue>(0, 0);
m_SxIvd = elements_.back();
elements_.pop_back();
int count = proc.repeated<Continue>(0, 0);
return true;
}

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of PIVOTIVD union of records
class PIVOTIVD: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(PIVOTIVD)
@ -49,7 +47,9 @@ public:
virtual const bool loadContent(BinProcessor& proc);
static const ElementType type = typePIVOTIVD;
static const ElementType type = typePIVOTIVD;
BaseObjectPtr m_SxIvd;
};
} // namespace XLS

View File

@ -61,7 +61,7 @@ const bool PIVOTRULE::loadContent(BinProcessor& proc)
{
return false;
}
proc.repeated<PRFILTER>(0, 0);
int count = proc.repeated<PRFILTER>(0, 0);
return true;
}

View File

@ -61,7 +61,9 @@ const bool PIVOTSELECT::loadContent(BinProcessor& proc)
{
return false;
}
proc.mandatory<PIVOTRULE>();
if (proc.mandatory<PIVOTRULE>())
{
}
return true;
}

View File

@ -62,8 +62,20 @@ const bool PIVOTVD::loadContent(BinProcessor& proc)
{
return false;
}
proc.repeated<SXVI>(0, 0);
proc.mandatory<SXVDEx>();
m_Sxvd = elements_.back();
elements_.pop_back();
int count = proc.repeated<SXVI>(0, 0);
while(count--)
{
m_arSXVI.push_back(elements_.front()); elements_.pop_front();
}
if (proc.mandatory<SXVDEx>())
{
m_SXVDEx = elements_.back();
elements_.pop_back();
}
return true;
}

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of PIVOTVD union of records
class PIVOTVD: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(PIVOTVD)
@ -49,7 +47,11 @@ public:
virtual const bool loadContent(BinProcessor& proc);
static const ElementType type = typePIVOTVD;
static const ElementType type = typePIVOTVD;
BaseObjectPtr m_Sxvd;
std::vector<BaseObjectPtr> m_arSXVI;
BaseObjectPtr m_SXVDEx;
};
} // namespace XLS

View File

@ -61,7 +61,14 @@ const bool PIVOTVIEW::loadContent(BinProcessor& proc)
{
return false;
}
proc.optional<PIVOTFRT>();
m_PIVOTCORE = elements_.back();
elements_.pop_back();
if (proc.optional<PIVOTFRT>())
{
m_PIVOTFRT = elements_.back();
elements_.pop_back();
}
return true;
}

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of PIVOTVIEW union of records
class PIVOTVIEW: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(PIVOTVIEW)
@ -49,7 +47,10 @@ public:
virtual const bool loadContent(BinProcessor& proc);
static const ElementType type = typePIVOTVIEW;
static const ElementType type = typePIVOTVIEW;
BaseObjectPtr m_PIVOTCORE;
BaseObjectPtr m_PIVOTFRT;
};
} // namespace XLS

View File

@ -63,9 +63,27 @@ const bool PIVOTVIEWEX::loadContent(BinProcessor& proc)
{
return false;
}
proc.repeated<PIVOTTH>(0, 0);
proc.repeated<SXPIEx>(0, 0);
proc.repeated<PIVOTVDTEX>(0, 0);
m_SXViewEx = elements_.back();
elements_.pop_back();
int count = 0;
count = proc.repeated<PIVOTTH>(0, 0);
while(count--)
{
m_arPIVOTTH.push_back(elements_.front()); elements_.pop_front();
}
count = proc.repeated<SXPIEx>(0, 0);
while(count--)
{
m_arSXPIEx.push_back(elements_.front()); elements_.pop_front();
}
count = proc.repeated<PIVOTVDTEX>(0, 0);
while(count--)
{
m_arPIVOTVDTEX.push_back(elements_.front()); elements_.pop_front();
}
return true;
}

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of PIVOTVIEWEX union of records
class PIVOTVIEWEX: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(PIVOTVIEWEX)
@ -49,7 +47,12 @@ public:
virtual const bool loadContent(BinProcessor& proc);
static const ElementType type = typePIVOTVIEWEX;
static const ElementType type = typePIVOTVIEWEX;
BaseObjectPtr m_SXViewEx;
std::vector<BaseObjectPtr> m_arPIVOTTH;
std::vector<BaseObjectPtr> m_arSXPIEx;
std::vector<BaseObjectPtr> m_arPIVOTVDTEX;
};
} // namespace XLS

View File

@ -64,7 +64,7 @@ const bool PRFILTER::loadContent(BinProcessor& proc)
}
if(proc.optional<SxItm>())
{
proc.repeated<Continue>(0, 0);
int count = proc.repeated<Continue>(0, 0);
}
return true;

View File

@ -57,19 +57,38 @@ BaseObjectPtr SXADDLCACHE::clone()
}
// [SXADDLCACHE12] [SXADDLDBQUERY] *UNKNOWNFRT SXAddl_SXCCache_SXDEnd
//[SXADDLCACHE12] [SXADDLDBQUERY] *UNKNOWNFRT SXAddl_SXCCache_SXDEnd
const bool SXADDLCACHE::loadContent(BinProcessor& proc)
{
if(!proc.mandatory<SXAddl_SXCCache_SXDId>())
{
return false;
}
proc.mandatory<SXAddl_SXCCache_SXDVer10Info>();
proc.optional<SXAddl_SXCCache_SXDVerSXMacro>();
proc.optional<SXADDLCACHE12>();
proc.optional<SXADDLDBQUERY>();
proc.repeated<UNKNOWNFRT>(0, 0);
proc.mandatory<SXAddl_SXCCache_SXDEnd>();
m_SXCCache_SXDId = elements_.back();
elements_.pop_back();
if (proc.mandatory<SXAddl_SXCCache_SXDVer10Info>())
{
m_SXDVer10Info = elements_.back();
elements_.pop_back();
}
if (proc.optional<SXAddl_SXCCache_SXDVerSXMacro>())
{
m_SXDVerSXMacro = elements_.back();
elements_.pop_back();
}
if (proc.optional<SXADDLCACHE12>())
{
}
if (proc.optional<SXADDLDBQUERY>())
{
}
int count = proc.repeated<UNKNOWNFRT>(0, 0);
if (proc.mandatory<SXAddl_SXCCache_SXDEnd>())
{
elements_.pop_back();
}
return true;
}

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of SXADDLCACHE union of records
class SXADDLCACHE: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(SXADDLCACHE)
@ -50,6 +48,10 @@ public:
virtual const bool loadContent(BinProcessor& proc);
static const ElementType type = typeSXADDLCACHE;
BaseObjectPtr m_SXCCache_SXDId;
BaseObjectPtr m_SXDVer10Info;
BaseObjectPtr m_SXDVerSXMacro;
};

View File

@ -57,7 +57,7 @@ BaseObjectPtr SXADDLCACHE12::clone()
}
// *SXADDLCACHEFIELD [SXADDLSXDH] [SXADDLSXMGS] SXAddl_SXCCache_SXDVerUpdInv
// *SXADDLCACHEFIELD [SXADDLSXDH] [SXADDLSXMGS] SXAddl_SXCCache_SXDVerUpdInv
const bool SXADDLCACHE12::loadContent(BinProcessor& proc)
{
@ -65,12 +65,24 @@ const bool SXADDLCACHE12::loadContent(BinProcessor& proc)
{
return false;
}
proc.mandatory<SXAddl_SXCCache_SXDInfo12>();
proc.mandatory<SXAddl_SXCCache_SXDInvRefreshReal>();
proc.repeated<SXADDLCACHEFIELD>(0, 0);
proc.optional<SXADDLSXDH>();
proc.optional<SXADDLSXMGS>();
proc.mandatory<SXAddl_SXCCache_SXDVerUpdInv>();
if (proc.mandatory<SXAddl_SXCCache_SXDInfo12>())
{
}
if (proc.mandatory<SXAddl_SXCCache_SXDInvRefreshReal>())
{
}
int count = proc.repeated<SXADDLCACHEFIELD>(0, 0);
if (proc.optional<SXADDLSXDH>())
{
}
if (proc.optional<SXADDLSXMGS>())
{
}
if (proc.mandatory<SXAddl_SXCCache_SXDVerUpdInv>())
{
}
return true;
}

View File

@ -60,15 +60,21 @@ SXADDLFIELD = [SXAddl_SXCField_SXDId *Continue_SxaddlSxString SXAddl_SXCField_SX
*/
const bool SXADDLFIELD::loadContent(BinProcessor& proc)
{
if(proc.optional<SXAddl_SXCField_SXDId>())
{
proc.repeated<Continue_SxaddlSxString>(0, 0);
proc.mandatory<SXAddl_SXCField_SXDVer10Info>();
proc.mandatory<SXAddl_SXCField_SXDEnd>();
proc.optional<SXADDLFIELD12>();
int count = proc.repeated<Continue_SxaddlSxString>(0, 0);
if (proc.mandatory<SXAddl_SXCField_SXDVer10Info>())
{
}
if (proc.mandatory<SXAddl_SXCField_SXDEnd>())
{
}
if (proc.optional<SXADDLFIELD12>())
{
}
return true;
}
return proc.optional<SXADDLFIELD12>();
}

View File

@ -68,6 +68,8 @@ const bool SXSRC::loadContent(BinProcessor& proc)
}
}
}
m_source = elements_.back();
elements_.pop_back();
return true;
}

Some files were not shown because too many files have changed in this diff Show More