diff --git a/3DPARTY.md b/3DPARTY.md new file mode 100644 index 0000000000..c4fb68308e --- /dev/null +++ b/3DPARTY.md @@ -0,0 +1,18 @@ + +## Third-party + +- boost ([BSL](https://raw.githubusercontent.com/boostorg/boost/master/LICENSE_1_0.txt)) +- icu ([UNICODE LICENSE V3](https://raw.githubusercontent.com/unicode-org/icu/main/LICENSE)) +- freetype ([FTL](https://raw.githubusercontent.com/freetype/freetype/master/docs/FTL.TXT)) +- harfbuzz ([MIT](https://raw.githubusercontent.com/harfbuzz/harfbuzz/main/COPYING)) +- hyphen ([MPL](https://raw.githubusercontent.com/hunspell/hyphen/master/COPYING)) +- hunspell ([MPL](https://raw.githubusercontent.com/hunspell/hunspell/master/COPYING.MPL)) +- gumbo ([Apache-2.0](https://raw.githubusercontent.com/google/gumbo-parser/master/COPYING)) +- katana ([MIT](https://raw.githubusercontent.com/jasenhuang/katana-parser/master/LICENSE)) +- cximage ([CXIMAGE LICENCE](https://raw.githubusercontent.com/movableink/cximage/master/license.txt)) +- openjpeg ([2-clause BSD License](https://raw.githubusercontent.com/uclouvain/openjpeg/master/LICENSE)) +- socket.io-client-cpp ([MIT](https://raw.githubusercontent.com/socketio/socket.io-client-cpp/master/LICENSE)) +- curl ([CURL LICENCE](https://raw.githubusercontent.com/curl/curl/master/COPYING)) +- cryptopp ([BSL](https://raw.githubusercontent.com/weidai11/cryptopp/master/License.txt)) +- openssl ([Apache-2.0](https://raw.githubusercontent.com/openssl/openssl/master/LICENSE.txt)) +- v8 ([3-clause BSD License](https://raw.githubusercontent.com/v8/v8/main/LICENSE)) diff --git a/Common/OfficeFileFormatChecker2.cpp b/Common/OfficeFileFormatChecker2.cpp index bfaba2dbdc..1fdb6b6f34 100644 --- a/Common/OfficeFileFormatChecker2.cpp +++ b/Common/OfficeFileFormatChecker2.cpp @@ -900,12 +900,12 @@ bool COfficeFileFormatChecker::isOOXFormatFile(const std::wstring &fileName, boo const char *ppsmFormatLine = "application/vnd.ms-powerpoint.slideshow.macroEnabled.main+xml"; const char *potmFormatLine = "application/vnd.ms-powerpoint.template.macroEnabled.main+xml"; - const char *vsdxFormatLine = "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"; - const char *vssxFormatLine = "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml"; - const char *vstxFormatLine = "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml"; - const char *vsdmFormatLine = "application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml"; - const char *vssmFormatLine = "application/vnd.ms-powerpoint.slideshow.macroEnabled.main+xml"; - const char *vstmFormatLine = "application/vnd.ms-powerpoint.template.macroEnabled.main+xml"; + const char *vsdxFormatLine = "application/vnd.ms-visio.drawing.main+xml"; + const char *vssxFormatLine = "application/vnd.ms-visio.stencil.main+xml"; + const char *vstxFormatLine = "application/vnd.ms-visio.template.main+xml"; + const char *vsdmFormatLine = "application/vnd.ms-visio.drawing.macroEnabled.main+xml"; + const char *vssmFormatLine = "application/vnd.ms-visio.stencil.macroEnabled.main+xml"; + const char *vstmFormatLine = "application/vnd.ms-visio.template.macroEnabled.main+xml"; std::string strContentTypes((char*)pBuffer, nBufferSize); diff --git a/DesktopEditor/common/Directory.cpp b/DesktopEditor/common/Directory.cpp index 66442dbb01..338a52f75a 100644 --- a/DesktopEditor/common/Directory.cpp +++ b/DesktopEditor/common/Directory.cpp @@ -586,11 +586,7 @@ namespace NSDirectory int GetFilesCount(const std::wstring& path, const bool& recursive) { std::vector arrFiles = NSDirectory::GetFiles(path, recursive); -#if defined(_WIN32) || defined (_WIN64) return (int)arrFiles.size(); -#endif - return (int)arrFiles.size() + 1; - // ??? } bool PathIsDirectory(const std::wstring& pathName) { diff --git a/DesktopEditor/common/File.cpp b/DesktopEditor/common/File.cpp index 87db1ec14c..8303dc2165 100644 --- a/DesktopEditor/common/File.cpp +++ b/DesktopEditor/common/File.cpp @@ -43,12 +43,20 @@ #include #include #include +#include +#include #endif #ifdef _MAC #include #endif +#if defined(__APPLE__) || defined(__NetBSD__) +#define st_atim st_atimespec +#define st_ctim st_ctimespec +#define st_mtim st_mtimespec +#endif + #ifndef MAX_PATH #define MAX_PATH 1024 #endif @@ -1690,38 +1698,161 @@ namespace NSFile g_overrideTmpPath = strTempPath; } - unsigned long CFileBinary::GetDateTime(const std::wstring & inputFile) + bool CFileBinary::GetTime(const std::wstring& sFilename, struct tm* ptmLastWrite, struct tm* ptmLastAccess) { - unsigned long result = 0; -#if defined(_WIN32) || defined (_WIN64) + bool result = true; + + if (ptmLastWrite) memset(ptmLastWrite, 0, sizeof(struct tm)); + if (ptmLastAccess) memset(ptmLastAccess, 0, sizeof(struct tm)); + +#if defined(_WIN32) || defined (_WIN64) // windows + HANDLE hFile; - hFile = ::CreateFileW(inputFile.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + hFile = ::CreateFileW(sFilename.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile) { - FILETIME ft; ft.dwLowDateTime = ft.dwHighDateTime = 0; - if (GetFileTime(hFile, NULL, NULL, &ft)) + FILETIME ftLastWrite{}, ftLastAccess{}; + if (::GetFileTime(hFile, NULL, &ftLastAccess, &ftLastWrite)) { - WORD fatDate = 0, fatTime = 0; - if (FileTimeToDosDateTime(&ft, &fatDate, &fatTime)) + FILETIME ftLastWriteLocal{}, ftLastAccessLocal{}; + result = result && ::FileTimeToLocalFileTime(&ftLastWrite, &ftLastWriteLocal); + result = result && ::FileTimeToLocalFileTime(&ftLastAccess, &ftLastAccessLocal); + + SYSTEMTIME stLastWrite{}, stLastAccess{}; + result = result && ::FileTimeToSystemTime(&ftLastWriteLocal, &stLastWrite); + result = result && ::FileTimeToSystemTime(&ftLastAccessLocal, &stLastAccess); + + auto set_tm_by_st = [] (struct tm* time_tm, SYSTEMTIME* time_st) { + time_tm->tm_sec = static_cast(time_st->wSecond); + time_tm->tm_min = static_cast(time_st->wMinute); + time_tm->tm_hour = static_cast(time_st->wHour); + time_tm->tm_mday = static_cast(time_st->wDay); + time_tm->tm_mon = static_cast(time_st->wMonth); + time_tm->tm_year = static_cast(time_st->wYear); + }; + + if (result) { - result = (fatDate << 16) + fatTime; + if (ptmLastWrite) set_tm_by_st(ptmLastWrite, &stLastWrite); + if (ptmLastAccess) set_tm_by_st(ptmLastAccess, &stLastAccess); } } + else + result = false; + CloseHandle(hFile); } -#else - std::string inputFileA = U_TO_UTF8(inputFile); -#if defined(__linux__) && !defined(_MAC) - struct stat attrib; - stat(inputFileA.c_str(), &attrib); - result = attrib.st_mtim.tv_nsec; -#else - struct stat attrib; - stat(inputFileA.c_str(), &attrib); - result = (unsigned long)attrib.st_mtimespec.tv_nsec; -#endif -#endif + else + result = false; + + +#else // linux or macOS + struct stat attr; + result = (0 == stat(U_TO_UTF8(sFilename).c_str(), &attr)); + + if (result) + { + auto set_tm_by_secs = [] (struct tm* time_tm, time_t time_secs) { + struct tm* ltime = localtime(&time_secs); + *time_tm = *ltime; + time_tm->tm_year += 1900; + time_tm->tm_mon += 1; + }; + + time_t m_secs = attr.st_mtim.tv_sec; // edit + time_t a_secs = attr.st_atim.tv_sec; // access + + if (ptmLastWrite) set_tm_by_secs(ptmLastWrite, m_secs); + if (ptmLastAccess) set_tm_by_secs(ptmLastAccess, a_secs); + } + +#endif // defined(_WIN32) || defined (_WIN64) + return result; + } + + bool CFileBinary::SetTime(const std::wstring& sFilename, struct tm* ptmLastWrite, struct tm* ptmLastAccess) + { + bool result = true; + +#if defined(_WIN32) || defined (_WIN64) // windows + + auto set_st_by_tm = [] (SYSTEMTIME* time_st, struct tm* time_tm) { + time_st->wSecond = static_cast(time_tm->tm_sec); + time_st->wMinute = static_cast(time_tm->tm_min); + time_st->wHour = static_cast(time_tm->tm_hour); + time_st->wDay = static_cast(time_tm->tm_mday); + time_st->wMonth = static_cast(time_tm->tm_mon); + time_st->wYear = static_cast(time_tm->tm_year); + }; + + SYSTEMTIME stLastWrite{}, stLastAccess{}; + if (ptmLastWrite) set_st_by_tm(&stLastWrite, ptmLastWrite); + if (ptmLastAccess) set_st_by_tm(&stLastAccess, ptmLastAccess); + + FILETIME ftLastWriteLocal{}, ftLastAccessLocal{}; + if (ptmLastWrite) result = result && ::SystemTimeToFileTime(&stLastWrite, &ftLastWriteLocal); + if (ptmLastAccess) result = result && ::SystemTimeToFileTime(&stLastAccess, &ftLastAccessLocal); + + FILETIME ftLastWrite{}, ftLastAccess{}; + if (ptmLastWrite) result = result && ::LocalFileTimeToFileTime(&ftLastWriteLocal, &ftLastWrite); + if (ptmLastAccess) result = result && ::LocalFileTimeToFileTime(&ftLastAccessLocal, &ftLastAccess); + + if (result) + { + HANDLE hFile; + hFile = ::CreateFileW(sFilename.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile) + { + FILETIME* pftLastWrite = NULL; + FILETIME* pftLastAccess = NULL; + + if (ptmLastWrite) pftLastWrite = &ftLastWrite; + if (ptmLastAccess) pftLastAccess = &ftLastAccess; + + result = SetFileTime(hFile, NULL, pftLastAccess, pftLastWrite); + } + else + result = false; + + CloseHandle(hFile); + } + + +#else // linux or macOS + struct stat attr; + std::string sFilenameA = U_TO_UTF8(sFilename); + result = (0 == stat(sFilenameA.c_str(), &attr)); + + if (result) + { + time_t m_secs = attr.st_mtim.tv_sec; // edit + time_t a_secs = attr.st_atim.tv_sec; // access + + time_t new_m_secs = m_secs; + time_t new_a_secs = a_secs; + + if (ptmLastWrite) + { + struct tm tmLastWriteUnix = *ptmLastWrite; + tmLastWriteUnix.tm_year -= 1900; + tmLastWriteUnix.tm_mon -= 1; + new_m_secs = mktime(&tmLastWriteUnix); + } + if (ptmLastAccess) + { + struct tm tmLastAccessUnix = *ptmLastAccess; + tmLastAccessUnix.tm_year -= 1900; + tmLastAccessUnix.tm_mon -= 1; + new_a_secs = mktime(&tmLastAccessUnix); + } + + utimbuf new_time{}; + new_time.actime = new_a_secs; + new_time.modtime = new_m_secs; + utime(sFilenameA.c_str(), &new_time); + } +#endif // defined(_WIN32) || defined (_WIN64) return result; } } diff --git a/DesktopEditor/common/File.h b/DesktopEditor/common/File.h index dfe3ac4170..b8ce97b3f8 100644 --- a/DesktopEditor/common/File.h +++ b/DesktopEditor/common/File.h @@ -194,7 +194,18 @@ namespace NSFile static bool OpenTempFile(std::wstring *pwsName, FILE **ppFile, wchar_t *wsMode, wchar_t *wsExt, wchar_t *wsFolder, wchar_t* wsName = NULL); static FILE* OpenFileNative(const std::wstring& sFileName, const std::wstring& sMode); - static unsigned long GetDateTime(const std::wstring & strFileName); + // returns true if everything is OK; + // you can set ptmLastWrite / ptmLastAccess to nullptr if you are not going to use them; + // tm_wday && tm_yday && tm_isdst is unused on windows + static bool GetTime(const std::wstring& sFilename, + struct tm* ptmLastWrite = nullptr, + struct tm* ptmLastAccess = nullptr); + + // returns true if everything is OK; + // you can set ptmLastWrite / ptmLastAccess to nullptr if you are not going to change them + static bool SetTime(const std::wstring& sFilename, + struct tm* ptmLastWrite = nullptr, + struct tm* ptmLastAccess = nullptr); }; class KERNEL_DECL CBase64Converter diff --git a/DesktopEditor/graphics/pro/Image.h b/DesktopEditor/graphics/pro/Image.h index 9bb1f8d776..38606d11d6 100644 --- a/DesktopEditor/graphics/pro/Image.h +++ b/DesktopEditor/graphics/pro/Image.h @@ -121,7 +121,8 @@ namespace MetaFile IMetaFile(NSFonts::IApplicationFonts *pAppFonts) {} virtual ~IMetaFile() {} - virtual bool LoadFromFile(const wchar_t* wsFilePath) = 0; + virtual void SetImageSize(int nWidth, int nHeight) = 0; + virtual bool LoadFromFile(const wchar_t* wsFilePath) = 0; virtual bool LoadFromBuffer(BYTE* pBuffer, unsigned int unSize) = 0; virtual bool DrawOnRenderer(IRenderer* pRenderer, double dX, double dY, double dWidth, double dHeight) = 0; virtual void Close() = 0; diff --git a/DesktopEditor/raster/Metafile/MetaFile.cpp b/DesktopEditor/raster/Metafile/MetaFile.cpp index c482571d39..2ed522173d 100644 --- a/DesktopEditor/raster/Metafile/MetaFile.cpp +++ b/DesktopEditor/raster/Metafile/MetaFile.cpp @@ -81,6 +81,10 @@ namespace MetaFile Close(); RELEASEINTERFACE(m_pFontManager); } + void CMetaFile::SetImageSize(int nWidth, int nHeight) + { + // for meta with empty size + } std::wstring CMetaFile::ConvertToSvg(unsigned int unWidth, unsigned int unHeight) { diff --git a/DesktopEditor/raster/Metafile/MetaFile.h b/DesktopEditor/raster/Metafile/MetaFile.h index 74738c1251..94bcf37823 100644 --- a/DesktopEditor/raster/Metafile/MetaFile.h +++ b/DesktopEditor/raster/Metafile/MetaFile.h @@ -62,6 +62,7 @@ namespace MetaFile CMetaFile(NSFonts::IApplicationFonts *pAppFonts); virtual ~CMetaFile(); + void SetImageSize(int nWidth, int nHeight); bool LoadFromFile(const wchar_t* wsFilePath); bool LoadFromBuffer(BYTE* pBuffer, unsigned int unSize); bool DrawOnRenderer(IRenderer* pRenderer, double dX, double dY, double dWidth, double dHeight); diff --git a/MsBinaryFile/DocFile/TableRowPropertiesMapping.cpp b/MsBinaryFile/DocFile/TableRowPropertiesMapping.cpp index a74ba36dda..e322590c9f 100644 --- a/MsBinaryFile/DocFile/TableRowPropertiesMapping.cpp +++ b/MsBinaryFile/DocFile/TableRowPropertiesMapping.cpp @@ -60,7 +60,9 @@ namespace DocFileFormat std::shared_ptr brcHorz; std::shared_ptr brcVert; - //delete infos + XMLTools::XMLElement* _tcMar = NULL; + + //delete infos RevisionData rev( _rowEndChpx ); if ( ( _rowEndChpx != NULL ) && ( rev.Type == Deleted ) ) @@ -72,133 +74,162 @@ namespace DocFileFormat XMLTools::XMLElement rowHeight(L"w:trHeight"); for ( std::vector::iterator iter = tapx->grpprl->begin(); iter != tapx->grpprl->end(); iter++ ) { - switch ( iter->OpCode ) + switch (iter->OpCode) { - case sprmOldTDefTable: - case sprmTDefTable: + case sprmOldTDefTable: + case sprmTDefTable: + { + //SprmTDefTable tdef = new SprmTDefTable(sprm.Arguments); + }break; + case sprmOldTTableHeader: + case sprmTTableHeader: + { //header row + + bool fHeader = (iter->Arguments[0] != 0) ? (true) : (false); + + if (fHeader) { - //SprmTDefTable tdef = new SprmTDefTable(sprm.Arguments); - }break; - case sprmOldTTableHeader: - case sprmTTableHeader: - { //header row - - bool fHeader = ( iter->Arguments[0] != 0 ) ? (true) : (false); - - if ( fHeader ) - { - XMLTools::XMLElement header( L"w:tblHeader" ); - _trPr->AppendChild( header ); - } - }break; - case sprmTWidthAfter: - { //width after - XMLTools::XMLElement wAfter( L"w:wAfter" ); - XMLTools::XMLAttribute wAfterValue( L"w:w", FormatUtils::IntToWideString( FormatUtils::BytesToInt16( iter->Arguments, 1, iter->argumentsSize ) ) ); - wAfter.AppendAttribute( wAfterValue ); - - XMLTools::XMLAttribute wAfterType( L"w:type", L"dxa" ); - wAfter.AppendAttribute( wAfterType ); - _trPr->AppendChild( wAfter, true ); - }break; - case sprmTWidthBefore: - { //width before - short before = FormatUtils::BytesToInt16( iter->Arguments, 1, iter->argumentsSize ); - - if ( before != 0 ) - { - XMLTools::XMLElement wBefore( L"w:wBefore" ); - XMLTools::XMLAttribute wBeforeValue( L"w:w", FormatUtils::IntToWideString( before ) ); - wBefore.AppendAttribute( wBeforeValue ); - - XMLTools::XMLAttribute wBeforeType( L"w:type", L"dxa" ); - wBefore.AppendAttribute( wBeforeType ); - _trPr->AppendChild( wBefore, true ); - } - }break; - case sprmOldTDyaRowHeight: - case sprmTDyaRowHeight: - { //row height - XMLTools::XMLAttribute rowHeightVal( L"w:val" ); - XMLTools::XMLAttribute rowHeightRule( L"w:hRule" ); - - short rH = FormatUtils::BytesToInt16( iter->Arguments, 0, iter->argumentsSize ); - - if ( rH > 0 ) - { - rowHeightRule.SetValue( L"atLeast" ); - rowHeightVal.SetValue( FormatUtils::IntToWideString( rH ) ); - rowHeight.AppendAttribute( rowHeightVal ); - } - else if( rH == 0 ) - { - rowHeightRule.SetValue( L"auto" ); - } - else - { - rowHeightRule.SetValue( L"exact" ); - rH *= -1; - rowHeightVal.SetValue( FormatUtils::IntToWideString( rH ) ); - rowHeight.AppendAttribute( rowHeightVal ); - } - rowHeight.AppendAttribute( rowHeightRule ); + XMLTools::XMLElement header(L"w:tblHeader"); + _trPr->AppendChild(header); } + }break; + case sprmTWidthAfter: + { //width after + XMLTools::XMLElement wAfter(L"w:wAfter"); + XMLTools::XMLAttribute wAfterValue(L"w:w", FormatUtils::IntToWideString(FormatUtils::BytesToInt16(iter->Arguments, 1, iter->argumentsSize))); + wAfter.AppendAttribute(wAfterValue); + + XMLTools::XMLAttribute wAfterType(L"w:type", L"dxa"); + wAfter.AppendAttribute(wAfterType); + _trPr->AppendChild(wAfter, true); + }break; + case sprmTWidthBefore: + { //width before + short before = FormatUtils::BytesToInt16(iter->Arguments, 1, iter->argumentsSize); + + if (before != 0) + { + XMLTools::XMLElement wBefore(L"w:wBefore"); + XMLTools::XMLAttribute wBeforeValue(L"w:w", FormatUtils::IntToWideString(before)); + wBefore.AppendAttribute(wBeforeValue); + + XMLTools::XMLAttribute wBeforeType(L"w:type", L"dxa"); + wBefore.AppendAttribute(wBeforeType); + _trPr->AppendChild(wBefore, true); + } + }break; + case sprmOldTDyaRowHeight: + case sprmTDyaRowHeight: + { //row height + XMLTools::XMLAttribute rowHeightVal(L"w:val"); + XMLTools::XMLAttribute rowHeightRule(L"w:hRule"); + + short rH = FormatUtils::BytesToInt16(iter->Arguments, 0, iter->argumentsSize); + + if (rH > 0) + { + rowHeightRule.SetValue(L"atLeast"); + rowHeightVal.SetValue(FormatUtils::IntToWideString(rH)); + rowHeight.AppendAttribute(rowHeightVal); + } + else if (rH == 0) + { + rowHeightRule.SetValue(L"auto"); + } + else + { + rowHeightRule.SetValue(L"exact"); + rH *= -1; + rowHeightVal.SetValue(FormatUtils::IntToWideString(rH)); + rowHeight.AppendAttribute(rowHeightVal); + } + rowHeight.AppendAttribute(rowHeightRule); + } + break; + case sprmOldTFCantSplit: + case sprmTFCantSplit: break; - case sprmOldTFCantSplit: - case sprmTFCantSplit: - break; - case sprmTFCantSplit90: - { //can't split - if (iter->argumentsSize > 0 && iter->Arguments[0] != 0) - appendFlagElement( _trPr, *iter, L"cantSplit", true ); - }break; - case sprmTIpgp:// = PGPInfo.ipgpSelf (PGPInfo structure describes the border and margin properties) - { //div id - }break; - case sprmTCellSpacing: - case sprmTCellSpacingDefault: + case sprmTFCantSplit90: + { //can't split + if (iter->argumentsSize > 0 && iter->Arguments[0] != 0) + appendFlagElement(_trPr, *iter, L"cantSplit", true); + }break; + case sprmTIpgp:// = PGPInfo.ipgpSelf (PGPInfo structure describes the border and margin properties) + { //div id + }break; + case sprmTCellSpacing: + case sprmTCellSpacingDefault: + { + unsigned char grfbrc = iter->Arguments[2]; + short wSpc = FormatUtils::BytesToInt16(iter->Arguments, 4, iter->argumentsSize); + std::wstring strValue = FormatUtils::IntToWideString(wSpc); + if (FormatUtils::BitmaskToBool((int)grfbrc, 0x01)) { - unsigned char grfbrc = iter->Arguments[2]; - short wSpc = FormatUtils::BytesToInt16(iter->Arguments, 4, iter->argumentsSize); - std::wstring strValue = FormatUtils::IntToWideString(wSpc); - if (FormatUtils::BitmaskToBool((int)grfbrc, 0x01)) - { - appendDxaElement(_trPr, L"tblCellSpacing", strValue, true); - } - }break; - case sprmTTableBorders80: + appendDxaElement(_trPr, L"tblCellSpacing", strValue, true); + } + }break; + case sprmTTableBorders80: + { + const int size = 4; + unsigned char brc80[size]; + + memcpy(brc80, iter->Arguments, size); + brcTop = std::shared_ptr(new BorderCode(brc80, size)); + + memcpy(brc80, (iter->Arguments + 4), size); + brcLeft = std::shared_ptr(new BorderCode(brc80, size)); + + memcpy(brc80, (iter->Arguments + 8), size); + brcBottom = std::shared_ptr(new BorderCode(brc80, size)); + + memcpy(brc80, (iter->Arguments + 12), size); + brcRight = std::shared_ptr(new BorderCode(brc80, size)); + + memcpy(brc80, (iter->Arguments + 16), size); + brcHorz = std::shared_ptr(new BorderCode(brc80, size)); + + memcpy(brc80, (iter->Arguments + 20), size); + brcVert = std::shared_ptr(new BorderCode(brc80, size)); + }break; + case sprmTCellPaddingDefault: + case sprmTCellPadding: + case sprmTCellPaddingOuter: + { + unsigned char first = iter->Arguments[0]; + unsigned char lim = iter->Arguments[1]; + unsigned char ftsMargin = iter->Arguments[3]; + short wMargin = FormatUtils::BytesToInt16(iter->Arguments, 4, iter->argumentsSize); + + if (!_tcMar) _tcMar = new XMLTools::XMLElement(L"w:tblCellMar"); + if (FormatUtils::GetBitFromInt(iter->Arguments[2], 0) == true) { - const int size = 4; - unsigned char brc80[size]; + appendDxaElement(_tcMar, L"top", FormatUtils::IntToWideString(wMargin), true); + } - memcpy(brc80, iter->Arguments, size); - brcTop = std::shared_ptr(new BorderCode(brc80, size)); + if (FormatUtils::GetBitFromInt(iter->Arguments[2], 1) == true) + { + appendDxaElement(_tcMar, L"left", FormatUtils::IntToWideString(wMargin), true); + } - memcpy(brc80, (iter->Arguments + 4), size); - brcLeft = std::shared_ptr(new BorderCode(brc80, size)); + if (FormatUtils::GetBitFromInt(iter->Arguments[2], 2) == true) + { + appendDxaElement(_tcMar, L"bottom", FormatUtils::IntToWideString(wMargin), true); + } - memcpy(brc80, (iter->Arguments + 8), size); - brcBottom = std::shared_ptr(new BorderCode(brc80, size)); - - memcpy(brc80, (iter->Arguments + 12), size); - brcRight = std::shared_ptr(new BorderCode(brc80, size)); - - memcpy(brc80, (iter->Arguments + 16), size); - brcHorz = std::shared_ptr(new BorderCode(brc80, size)); - - memcpy(brc80, (iter->Arguments + 20), size); - brcVert = std::shared_ptr(new BorderCode(brc80, size)); - }break; - default: - break; + if (FormatUtils::GetBitFromInt(iter->Arguments[2], 3) == true) + { + appendDxaElement(_tcMar, L"right", FormatUtils::IntToWideString(wMargin), true); + } + } + default: + break; } } if (rowHeight.GetAttributeCount() > 0) { _trPr->AppendChild(rowHeight); } - - //set borders + //set borders XMLTools::XMLElement* _tblBorders = new XMLTools::XMLElement(L"w:tblBorders"); if (brcTop) { @@ -240,6 +271,10 @@ namespace DocFileFormat { _tblPrEx->AppendChild(*_tblBorders); } + if (_tcMar && _tcMar->GetChildCount() > 0) + { + _tblPrEx->AppendChild(*(_tcMar)); + } //--------------------------------------------------------------------------- if ( _tblPrEx->GetChildCount() > 0 ) { @@ -249,5 +284,7 @@ namespace DocFileFormat { m_pXmlWriter->WriteString( _trPr->GetXMLString() ); } + + RELEASEOBJECT(_tcMar); } } diff --git a/MsBinaryFile/PptFile/Drawing/Attributes.h b/MsBinaryFile/PptFile/Drawing/Attributes.h index f504f1be85..701ef71cf0 100644 --- a/MsBinaryFile/PptFile/Drawing/Attributes.h +++ b/MsBinaryFile/PptFile/Drawing/Attributes.h @@ -83,22 +83,26 @@ namespace PPT eftHyperlink = 3, eftObject = 4, eftSlide = 5, - eftFile = 6 + eftFile = 6, + eftOleObject = 7 }; - ExFilesType m_type = eftNone; - _UINT32 m_dwID = 0; - std::wstring m_strFilePath = L""; - std::wstring m_name; + ExFilesType m_type = ExFilesType::eftNone; + + _UINT32 m_dwID = 0; + std::wstring m_strFilePath; + + std::wstring m_name; + std::wstring m_progName; // clip - double m_dStartTime = 0.0; - double m_dEndTime = 1.0; + double m_dStartTime = 0.0; + double m_dEndTime = 1.0; // loop - bool m_bLoop = false; - bool m_fNarration = false; // isNarration pptx - bool m_fRewind = false; + bool m_bLoop = false; + bool m_fNarration = false; // isNarration pptx + bool m_fRewind = false; CExFilesInfo() { @@ -168,6 +172,7 @@ namespace PPT std::vector m_arHyperlinks; std::vector m_arSlides; std::vector m_arFiles; + std::vector m_arOleObjects; std::vector m_arAudioCollection; @@ -177,9 +182,10 @@ namespace PPT m_arImages.clear(); m_arAudios.clear(); m_arAudioCollection.clear(); + m_arOleObjects.clear(); } - CExMedia() : m_arVideos(), m_arImages(), m_arAudios() + CExMedia() { } @@ -198,6 +204,8 @@ namespace PPT m_arImages.push_back(oSrc.m_arImages[i]); for (size_t i = 0; i < oSrc.m_arVideos.size(); i++) m_arAudios.push_back(oSrc.m_arAudios[i]); + for (size_t i = 0; i < oSrc.m_arOleObjects.size(); i++) + m_arOleObjects.push_back(oSrc.m_arOleObjects[i]); return *this; } @@ -266,6 +274,19 @@ namespace PPT return NULL; } + CExFilesInfo* LockOleObject(_UINT32 dwID) + { + size_t nCount = m_arOleObjects.size(); + for (size_t i = 0; i < nCount; ++i) + { + if (dwID == m_arOleObjects[i].m_dwID) + { + return &m_arOleObjects[i]; + } + } + + return NULL; + } CExFilesInfo* LockAudioFromCollection(_UINT32 dwID) { size_t nCount = m_arAudioCollection.size(); @@ -302,6 +323,12 @@ namespace PPT eType = CExFilesInfo::eftAudio; return pInfo; } + pInfo = LockOleObject(dwID); + if (NULL != pInfo) + { + eType = CExFilesInfo::eftOleObject; + return pInfo; + } pInfo = LockSlide(dwID); if (NULL != pInfo) { diff --git a/MsBinaryFile/PptFile/Drawing/Element.h b/MsBinaryFile/PptFile/Drawing/Element.h index a36fc9c275..3ca24b614a 100644 --- a/MsBinaryFile/PptFile/Drawing/Element.h +++ b/MsBinaryFile/PptFile/Drawing/Element.h @@ -38,13 +38,14 @@ namespace PPT { enum ElementType { - etGroup = 0, - etVideo = 1, - etAudio = 2, - etPicture = 3, - etShape = 4, - etText = 5, - etTable = 6 + etGroup = 0, + etVideo = 1, + etAudio = 2, + etPicture = 3, + etShape = 4, + etText = 5, + etTable = 6, + etOleObject = 7 }; class CTheme; diff --git a/MsBinaryFile/PptFile/Drawing/Elements.cpp b/MsBinaryFile/PptFile/Drawing/Elements.cpp index 4c8bfa4ecf..bcbae43ce2 100644 --- a/MsBinaryFile/PptFile/Drawing/Elements.cpp +++ b/MsBinaryFile/PptFile/Drawing/Elements.cpp @@ -490,7 +490,24 @@ namespace PPT strXmlPPTX += L""; return strXmlPPTX; } + COleObjectElement::COleObjectElement() : CImageElement() + { + m_etType = etOleObject; + } + COleObjectElement::~COleObjectElement() + { + } + CElementPtr COleObjectElement::CreateDublicate() + { + COleObjectElement* pOleObjectElement = new COleObjectElement(); + CElementPtr pElement = CElementPtr(pOleObjectElement); + SetProperiesToDublicate(pElement); + + pOleObjectElement->m_strOleName = m_strOleName; + pOleObjectElement->m_strProgId = m_strProgId; + return pElement; + } CAudioElement::CAudioElement() : CImageElement() { m_etType = etAudio; diff --git a/MsBinaryFile/PptFile/Drawing/Elements.h b/MsBinaryFile/PptFile/Drawing/Elements.h index 3e813fd677..34e4bdd5cd 100644 --- a/MsBinaryFile/PptFile/Drawing/Elements.h +++ b/MsBinaryFile/PptFile/Drawing/Elements.h @@ -101,7 +101,19 @@ public: std::wstring ConvertPPTShapeToPPTX(bool bIsNamespace = false); std::wstring ConvertPPTtoPPTX(CPPTShape* pPPTShape, const NSGuidesVML::CFormParam& pCoef, bool bIsNamespace = false); }; +class COleObjectElement : public CImageElement +{ +public: + std::wstring m_strBinFileName; + std::wstring m_strOleName; + std::wstring m_strProgId; + + COleObjectElement(); + virtual ~COleObjectElement(); + + virtual CElementPtr CreateDublicate(); +}; class CAudioElement : public CImageElement { public: diff --git a/MsBinaryFile/PptFile/PPTXWriter/Converter.cpp b/MsBinaryFile/PptFile/PPTXWriter/Converter.cpp index a2b6a03c20..f68adec4da 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/Converter.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/Converter.cpp @@ -118,6 +118,8 @@ namespace PPT m_oManager.Clear(); m_oManager.SetDstMedia(m_strDestPath + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"media" + FILE_SEPARATOR_STR); + m_oManager.SetDstEmbeddings(m_strDestPath + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"embeddings" + FILE_SEPARATOR_STR); + m_oManager.SetTempMedia(m_pUserInfo->m_pDocumentInfo->m_pCommonInfo->tempPath); m_pShapeWriter->InitNextId(); @@ -164,6 +166,7 @@ namespace PPT m_pDocument = pDocument; m_oManager.Clear(); m_oManager.SetDstMedia(m_strDestPath + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"media" + FILE_SEPARATOR_STR); + m_oManager.SetDstEmbeddings(m_strDestPath + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"embeddings" + FILE_SEPARATOR_STR); m_pShapeWriter->InitNextId(); @@ -589,7 +592,6 @@ namespace PPT { std::wstring strPptDirectory = m_strDestPath + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR; - NSDirectory::CreateDirectory(strPptDirectory + L"media"); NSDirectory::CreateDirectory(strPptDirectory + L"theme"); NSDirectory::CreateDirectory(strPptDirectory + L"slideMasters"); NSDirectory::CreateDirectory(strPptDirectory + L"slideMasters" + FILE_SEPARATOR_STR + L"_rels"); @@ -1544,7 +1546,14 @@ namespace PPT } oWriter.WriteString(std::wstring(L"")); - oWriter.WriteString(std::wstring(L"m_bShowMasterShapes) oWriter.WriteString(std::wstring(L" showMasterSp=\"0\"")); if (pSlide->m_bHidden) diff --git a/MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp b/MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp index b8a2601462..6bee2915ff 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp @@ -32,8 +32,9 @@ #include "ImageManager.h" #include #include "../../../OOXML/SystemUtility/SystemUtility.h" +#include "../../../DesktopEditor/common/Directory.h" -CMediaManager::CMediaManager() : m_lIndexNextImage(0), m_lIndexNextAudio(0), m_lIndexNextVideo(0) +CMediaManager::CMediaManager() : m_lIndexNextImage(0), m_lIndexNextAudio(0), m_lIndexNextVideo(0), m_lIndexNextOleObject(0) { } CMediaManager::~CMediaManager() @@ -46,6 +47,7 @@ void CMediaManager::Clear() m_lIndexNextImage = 0; m_lIndexNextAudio = 0; m_lIndexNextVideo = 0; + m_lIndexNextOleObject = 0; } std::wstring CMediaManager::FindMedia(const std::wstring &strInput) @@ -57,6 +59,10 @@ std::wstring CMediaManager::FindMedia(const std::wstring &strInput) } return L""; } +void CMediaManager::SetDstEmbeddings(const std::wstring& strDst) +{ + m_strDstEmbeddings = strDst; +} void CMediaManager::SetDstMedia(const std::wstring &strDst) { m_strDstMedia = strDst; @@ -80,13 +86,69 @@ std::wstring CMediaManager::GenerateImage(const std::wstring &strInput) { return GenerateMedia(strInput, L"image", m_lIndexNextImage, L".png"); } - +std::wstring CMediaManager::GenerateOleObject(const std::wstring& strInput) +{ + return GenerateEmbedding(strInput, L"oleObject", m_lIndexNextOleObject, L".bin"); +} std::wstring CMediaManager::GenerateImageJPEG(const std::wstring &strInput) { return GenerateMedia(strInput, L"image", m_lIndexNextImage, L".jpeg"); } -std::wstring CMediaManager::GenerateMedia(const std::wstring &strInput, const std::wstring &Template, long &Indexer, const std::wstring &strDefaultExt) +std::wstring CMediaManager::GenerateEmbedding(const std::wstring &strInput, const std::wstring &Template, long &Indexer, const std::wstring &strDefaultExt) +{ + std::map::iterator pPair = m_mapMedia.find(strInput); + if (m_mapMedia.end() != pPair) + { + return pPair->second; + } + +// if (IsNeedDownload(strInput)) +// { +//#ifndef DISABLE_FILE_DOWNLOADER +// NSNetwork::NSFileTransport::CFileDownloader oDownloader(strInput, TRUE); +// if ( oDownloader.DownloadSync() ) +// { +// std::wstring file_name = oDownloader.GetFilePath(); +// +// //todooo - check media file +// return GenerateEmbedding(file_name , Template, Indexer, strDefaultExt); +// } +//#endif +// } + + std::wstring strExts = strDefaultExt; + int nIndexExt = strInput.rfind(wchar_t('.')); + if (-1 != nIndexExt) + strExts = strInput.substr(nIndexExt); + + if (strExts == L".tmp" || strExts.empty()) strExts = strDefaultExt; + + std::wstring strMediaName = Template + std::to_wstring(++Indexer); + + std::wstring strOutput = m_strDstEmbeddings + strMediaName + strExts; + strMediaName = L"../embeddings/" + strMediaName + strExts; + + OOX::CPath pathInput(strInput); + std::wstring strPathInput = pathInput.GetPath(); + + if (std::wstring::npos == strPathInput.find(m_strTempMedia)) + { + return L""; + } + if (strOutput != strInput) + { + NSDirectory::CreateDirectory(m_strDstEmbeddings); + + if (NSFile::CFileBinary::Copy(strInput, strOutput) == false) + { + return L""; + } + } + m_mapMedia[strInput] = strMediaName; + return strMediaName; +} +std::wstring CMediaManager::GenerateMedia(const std::wstring& strInput, const std::wstring& Template, long& Indexer, const std::wstring& strDefaultExt) { std::map::iterator pPair = m_mapMedia.find(strInput); if (m_mapMedia.end() != pPair) @@ -98,12 +160,12 @@ std::wstring CMediaManager::GenerateMedia(const std::wstring &strInput, const st { #ifndef DISABLE_FILE_DOWNLOADER NSNetwork::NSFileTransport::CFileDownloader oDownloader(strInput, TRUE); - if ( oDownloader.DownloadSync() ) + if (oDownloader.DownloadSync()) { std::wstring file_name = oDownloader.GetFilePath(); //todooo - check media file - return GenerateMedia(file_name , Template, Indexer, strDefaultExt); + return GenerateMedia(file_name, Template, Indexer, strDefaultExt); } #endif } @@ -117,24 +179,26 @@ std::wstring CMediaManager::GenerateMedia(const std::wstring &strInput, const st { std::wstring strInput1 = strInput.substr(0, nIndexExt); nIndexExt = strInput1.rfind(wchar_t('.')); - strExts = nIndexExt < 0 ? L"" : strInput1.substr(nIndexExt); + strExts = nIndexExt < 0 ? L"" : strInput1.substr(nIndexExt); } if (strExts == L".tmp" || strExts.empty()) strExts = strDefaultExt; std::wstring strMediaName = Template + std::to_wstring(++Indexer); std::wstring strOutput = m_strDstMedia + strMediaName + strExts; - strMediaName = L"../media/" + strMediaName + strExts; + strMediaName = L"../media/" + strMediaName + strExts; - OOX::CPath pathInput(strInput); + OOX::CPath pathInput(strInput); std::wstring strPathInput = pathInput.GetPath(); - + if (std::wstring::npos == strPathInput.find(m_strTempMedia)) { return L""; } if (strOutput != strInput) { + NSDirectory::CreateDirectory(m_strDstMedia); + if (NSFile::CFileBinary::Copy(strInput, strOutput) == false) { return L""; @@ -359,19 +423,24 @@ std::wstring CRelsGenerator::WriteHyperlinkMedia(const std::wstring &strMedia, b return strRid; } -std::wstring CRelsGenerator::WriteHyperlinkImage(const std::wstring &strImage, bool bExternal) +std::wstring CRelsGenerator::WriteHyperlinkImage(const std::wstring & strFileName, bool bExternal) { - return WriteHyperlinkMedia(strImage, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"); + return WriteHyperlinkMedia(strFileName, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"); } -std::wstring CRelsGenerator::WriteHyperlinkAudio(const std::wstring &strImage, bool bExternal) +std::wstring CRelsGenerator::WriteHyperlinkAudio(const std::wstring & strFileName, bool bExternal) { - return WriteHyperlinkMedia(strImage, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio"); + return WriteHyperlinkMedia(strFileName, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio"); } -std::wstring CRelsGenerator::WriteHyperlinkVideo(const std::wstring &strImage, bool bExternal) +std::wstring CRelsGenerator::WriteHyperlinkVideo(const std::wstring & strFileName, bool bExternal) { - return WriteHyperlinkMedia(strImage, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/video"); + return WriteHyperlinkMedia(strFileName, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/video"); +} + +std::wstring CRelsGenerator::WriteHyperlinkOleObject(const std::wstring &strFileName, bool bExternal) +{ + return WriteHyperlinkMedia(strFileName, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject"); } std::wstring CRelsGenerator::WriteMedia(const std::wstring &strMediaPath) @@ -389,7 +458,14 @@ std::wstring CRelsGenerator::WriteImage(const std::wstring &strImagePath) if (strImage.empty()) return WriteHyperlinkImage(CorrectXmlString3(strImagePath), true); return WriteHyperlinkImage(strImage, false); } +std::wstring CRelsGenerator::WriteOleObject(const std::wstring& strOleObjectPath) +{ + std::wstring strOleObject = m_pManager->GenerateOleObject(strOleObjectPath); + if (strOleObject.empty()) + return WriteHyperlinkOleObject(CorrectXmlString3(strOleObjectPath), true); + return WriteHyperlinkOleObject(strOleObject, false); +} std::wstring CRelsGenerator::WriteSlideRef(const std::wstring &strLocation) { int sldNum = PPT::CExFilesInfo::GetSlideNumber(strLocation); diff --git a/MsBinaryFile/PptFile/PPTXWriter/ImageManager.h b/MsBinaryFile/PptFile/PPTXWriter/ImageManager.h index bcb71b8a8d..bf0bcae024 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/ImageManager.h +++ b/MsBinaryFile/PptFile/PPTXWriter/ImageManager.h @@ -43,27 +43,36 @@ class CMediaManager { private: - std::map m_mapMedia; + std::map m_mapMedia; - long m_lIndexNextAudio; - long m_lIndexNextVideo; - long m_lIndexNextImage; + long m_lIndexNextAudio; + long m_lIndexNextVideo; + long m_lIndexNextImage; + long m_lIndexNextOleObject; - std::wstring m_strDstMedia; + std::wstring m_strDstMedia; std::wstring m_strTempMedia; + std::wstring m_strDstEmbeddings; public: CMediaManager(); ~CMediaManager(); void Clear(); std::wstring FindMedia(const std::wstring& strInput); + + void SetDstEmbeddings(const std::wstring& strDst); void SetDstMedia(const std::wstring& strDst); void SetTempMedia(const std::wstring& strSrc); + std::wstring GenerateVideo(const std::wstring& strInput); std::wstring GenerateAudio(const std::wstring& strInput); + std::wstring GenerateOleObject(const std::wstring& strInput); std::wstring GenerateImage(const std::wstring& strInput); std::wstring GenerateImageJPEG(const std::wstring& strInput); - std::wstring GenerateMedia(const std::wstring& strInput, const std::wstring& Template, long & Indexer, const std::wstring& strDefaultExt); + + std::wstring GenerateMedia(const std::wstring& strInput, const std::wstring& Template, long& Indexer, const std::wstring& strDefaultExt); + std::wstring GenerateEmbedding(const std::wstring& strInput, const std::wstring& Template, long& Indexer, const std::wstring& strDefaultExt); + void WriteAudioCollection(const std::vector& audioCont); bool IsNeedDownload(const std::wstring& strFile); }; @@ -72,11 +81,11 @@ std::wstring CorrectXmlString3(const std::wstring & str); class CRelsGenerator { private: - PPT::CStringWriter m_oWriter; - int m_lNextRelsID; - std::map m_mapMediaRelsID; - CMediaManager* m_pManager; - std::map m_mapHyperlinks; + PPT::CStringWriter m_oWriter; + int m_lNextRelsID; + std::map m_mapMediaRelsID; + CMediaManager* m_pManager; + std::map m_mapHyperlinks; public: CRelsGenerator(CMediaManager* pManager); @@ -90,20 +99,21 @@ public: void StartNotes(int nIndexSlide, bool bMaster); void StartSlide(int nIndexLayout, int nIndexNotes); void CloseRels(); - void SaveRels(const std::wstring &strFile); - std::wstring WriteHyperlink(const std::wstring &strHyperlink, bool isExternal = false); + void SaveRels(const std::wstring& strFile); + std::wstring WriteHyperlink(const std::wstring& strHyperlink, bool isExternal = false); void StartLayout(int nIndexTheme); - std::wstring WriteHyperlinkMedia(const std::wstring& strMedia, bool bExternal = true, bool newRIdAlways = false, std::wstring strRelsType = L"http://schemas.microsoft.com/office/2007/relationships/media"); std::wstring WriteHyperlinkImage(const std::wstring& strImage, bool bExternal = true); std::wstring WriteHyperlinkAudio(const std::wstring& strImage, bool bExternal = true); std::wstring WriteHyperlinkVideo(const std::wstring& strImage, bool bExternal = true); + std::wstring WriteHyperlinkOleObject(const std::wstring& strImage, bool bExternal = true); std::wstring WriteMedia(const std::wstring& strMediaPath); std::wstring WriteImage(const std::wstring& strImagePath); std::wstring WriteSlideRef(const std::wstring& strLocation); - std::wstring WriteAudio(const std::wstring& strAudioPath, bool & bExternal); - std::wstring WriteVideo(const std::wstring& strVideoPath, bool & bExternal); + std::wstring WriteAudio(const std::wstring& strAudioPath, bool& bExternal); + std::wstring WriteVideo(const std::wstring& strVideoPath, bool& bExternal); + std::wstring WriteOleObject(const std::wstring& strOleObjectPath); int getRId()const { return m_lNextRelsID; } }; diff --git a/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.cpp b/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.cpp index f9b19860a2..c22e19b8f0 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.cpp @@ -552,7 +552,8 @@ void PPT::CShapeWriter::WriteImageInfo() if (pImageElement->m_lID < 0) pImageElement->m_lID = m_lNextShapeID; - std::wstring strShapeID = std::to_wstring(pImageElement->m_lID); + COleObjectElement* pOleObjectElement = dynamic_cast(m_pElement.get()); + std::wstring strShapeID = std::to_wstring(pOleObjectElement ? 0 : pImageElement->m_lID); m_oWriter.WriteString(std::wstring(L"")); - WriteHyperlink(m_pElement->m_arrActions); m_oWriter.WriteString(std::wstring(L""; m_oWriter.WriteString(str2); } +void PPT::CShapeWriter::WriteOleObjectInfo(const std::wstring& strRid, const std::wstring& xfrm) +{ + COleObjectElement* pOleObjectElement = dynamic_cast(m_pElement.get()); + if (!pOleObjectElement) return; + m_oWriter.WriteString(std::wstring(L"")); + + m_oWriter.WriteString(std::wstring(L"")); + + if (pOleObjectElement->m_lID < 0) + pOleObjectElement->m_lID = m_lNextShapeID; + + std::wstring strTableID = std::to_wstring(pOleObjectElement->m_lID); + + m_oWriter.WriteString(std::wstring(L"m_sName.empty()) pOleObjectElement->m_sName = std::wstring(L"Group ") + strTableID; + + if (pOleObjectElement->m_bHidden) m_oWriter.WriteString(std::wstring(L" hidden=\"1\"")); + + m_oWriter.WriteString(std::wstring(L" name=\"")); + m_oWriter.WriteStringXML(pOleObjectElement->m_sName); + m_oWriter.WriteString(std::wstring(L"\"")); + + if (!pOleObjectElement->m_sDescription.empty()) + { + m_oWriter.WriteString(std::wstring(L" descr=\"")); + m_oWriter.WriteStringXML(XmlUtils::EncodeXmlStringExtend(pOleObjectElement->m_sDescription)); + m_oWriter.WriteString(std::wstring(L"\"")); + } + m_oWriter.WriteString(std::wstring(L">")); + if (!pOleObjectElement->m_sHyperlink.empty()) + { + std::wstring rId = m_pRels->WriteHyperlink(pOleObjectElement->m_sHyperlink); + + if (false == rId.empty()) + { + m_oWriter.WriteString(std::wstring(L"")); + } + } + m_oWriter.WriteString(std::wstring(L"")); + + m_oWriter.WriteString(std::wstring(L"")); + + ++m_lNextShapeID; + + m_oWriter.WriteString(std::wstring(L"")); + + m_oWriter.WriteString(std::wstring(L"")); + + if (pOleObjectElement->m_bChildAnchorEnabled || pOleObjectElement->m_bAnchorEnabled) + { + m_oWriter.WriteString(std::wstring(L"")); + } + + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"m_strOleName.empty()) + { + m_oWriter.WriteString(std::wstring(L" name=\"") + pOleObjectElement->m_strOleName + L"\""); + } + m_oWriter.WriteString(std::wstring(L" r:id=\"") + strRid + L"\""); + + _INT64 width = (_INT64)(pOleObjectElement->m_bChildAnchorEnabled ? pOleObjectElement->m_rcChildAnchor.GetWidth() : pOleObjectElement->m_rcAnchor.GetWidth()) / 1.78; + _INT64 height = (_INT64)(pOleObjectElement->m_bChildAnchorEnabled ? pOleObjectElement->m_rcChildAnchor.GetHeight() : pOleObjectElement->m_rcAnchor.GetHeight()) / 1.78; + + m_oWriter.WriteString(std::wstring(L" imgW=\"") + std::to_wstring(width) + L"\""); + m_oWriter.WriteString(std::wstring(L" imgH=\"") + std::to_wstring(height) + L"\""); + + if (false == pOleObjectElement->m_strProgId.empty()) + { + m_oWriter.WriteString(std::wstring(L" progId=\"") + pOleObjectElement->m_strProgId + L"\""); + } + m_oWriter.WriteString(std::wstring(L">")); +} void PPT::CShapeWriter::WriteTableInfo() { CGroupElement* pGroupElement = dynamic_cast(m_pElement.get()); @@ -1725,7 +1804,7 @@ std::vector CShapeWriter::getActionsByNum(const int num) } // TODO! Not work correct -std::wstring PPT::CShapeWriter::ConvertTable () +std::wstring PPT::CShapeWriter::ConvertTable() { CGroupElement* pGroupElement = dynamic_cast(m_pElement.get()); if (!pGroupElement) return L""; @@ -2001,12 +2080,11 @@ void PPT::CShapeWriter::ParseXmlAlternative(const std::wstring & xml) } } - std::wstring PPT::CShapeWriter::ConvertImage() -{ +{ CImageElement* pImageElement = dynamic_cast(m_pElement.get()); if (!pImageElement) return L""; - + if (pImageElement->m_bImagePresent == false) { if (pImageElement->m_sName.empty()) return L""; @@ -2027,21 +2105,69 @@ std::wstring PPT::CShapeWriter::ConvertImage() if (strRid.empty()) return L""; - m_oWriter.WriteString(std::wstring(L"")); - - WriteImageInfo(); + std::wstring strAnchor; CGeomShapeInfo oInfo; - oInfo.m_lOriginalWidth = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetWidth() : (LONG)m_pElement->m_rcAnchor.GetWidth(); - oInfo.m_lOriginalHeight = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetHeight() : (LONG)m_pElement->m_rcAnchor.GetHeight(); + oInfo.m_lOriginalWidth = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetWidth() : (LONG)m_pElement->m_rcAnchor.GetWidth(); + oInfo.m_lOriginalHeight = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetHeight() : (LONG)m_pElement->m_rcAnchor.GetHeight(); m_pElement->NormalizeCoordsByMetric(); oInfo.SetBounds(m_pElement->m_bChildAnchorEnabled ? m_pElement->m_rcChildAnchor : m_pElement->m_rcAnchor); oInfo.m_dRotate = pImageElement->m_dRotate; - oInfo.m_bFlipH = pImageElement->m_bFlipH; - oInfo.m_bFlipV = pImageElement->m_bFlipV; + oInfo.m_bFlipH = pImageElement->m_bFlipH; + oInfo.m_bFlipV = pImageElement->m_bFlipV; + + if (pImageElement->m_bChildAnchorEnabled || pImageElement->m_bAnchorEnabled) + { + if (0 != pImageElement->m_dRotate) + { + strAnchor += L" rot=\"" + std::to_wstring((int)(pImageElement->m_dRotate * 60000)) + L"\""; + } + if (pImageElement->m_bFlipH) + { + strAnchor += L" flipH=\"1\""; + } + if (pImageElement->m_bFlipV) + { + strAnchor += L" flipV=\"1\""; + } + strAnchor += L">"; + + strAnchor += L"m_bChildAnchorEnabled ? (int)pImageElement->m_rcChildAnchor.left : (int)pImageElement->m_rcAnchor.left) + + L"\" y=\"" + + std::to_wstring(pImageElement->m_bChildAnchorEnabled ? (int)pImageElement->m_rcChildAnchor.top : (int)pImageElement->m_rcAnchor.top) + + L"\"/>"; + + _INT64 width = (_INT64)(pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetWidth() : pImageElement->m_rcAnchor.GetWidth()); + _INT64 height = (_INT64)(pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetHeight() : pImageElement->m_rcAnchor.GetHeight()); + + if ((width > 0 && height > 0) && ((_UINT64)width) < 0xffffffffffff && ((_UINT64)height) < 0xffffffffffff) + { + strAnchor += L""; + } + else + { + strAnchor += L""; + } + } + + COleObjectElement* pOleObjectElement = dynamic_cast(m_pElement.get()); + if (pOleObjectElement) + { + std::wstring strRidOleObject = m_pRels->WriteOleObject(pOleObjectElement->m_strBinFileName); + if (false == strRidOleObject.empty()) + { + WriteOleObjectInfo(strRidOleObject, strAnchor); + } + else pOleObjectElement = NULL; + } + + m_oWriter.WriteString(std::wstring(L"")); + + WriteImageInfo(); m_oWriter.WriteString(std::wstring(L"")); @@ -2107,41 +2233,7 @@ std::wstring PPT::CShapeWriter::ConvertImage() if (pImageElement->m_bChildAnchorEnabled || pImageElement->m_bAnchorEnabled) { - std::wstring str; - - m_oWriter.WriteString(std::wstring(L"m_dRotate) - { - m_oWriter.WriteString(L" rot=\"" + std::to_wstring((int)(pImageElement->m_dRotate * 60000)) + L"\""); - } - if (pImageElement->m_bFlipH) - { - m_oWriter.WriteString(std::wstring(L" flipH=\"1\"")); - } - if (pImageElement->m_bFlipV) - { - m_oWriter.WriteString(std::wstring(L" flipV=\"1\"")); - } - m_oWriter.WriteString(std::wstring(L">")); - - m_oWriter.WriteString(L"m_bChildAnchorEnabled ? (int)pImageElement->m_rcChildAnchor.left : (int)pImageElement->m_rcAnchor.left) - + L"\" y=\"" + - std::to_wstring(pImageElement->m_bChildAnchorEnabled ? (int)pImageElement->m_rcChildAnchor.top : (int)pImageElement->m_rcAnchor.top) + - L"\"/>"); - - _INT64 width = (_INT64)(pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetWidth() : pImageElement->m_rcAnchor.GetWidth()); - _INT64 height = (_INT64)(pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetHeight() : pImageElement->m_rcAnchor.GetHeight()); - - if (( width > 0 && height > 0 ) && ((_UINT64)width) < 0xffffffffffff && ((_UINT64)height) < 0xffffffffffff) - { - m_oWriter.WriteString(L""); - } - else - { - m_oWriter.WriteString(L""); - } - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); } m_oWriter.WriteString(std::wstring(L"")); @@ -2155,6 +2247,14 @@ std::wstring PPT::CShapeWriter::ConvertImage() m_oWriter.WriteString(std::wstring(L"")); m_oWriter.WriteString(std::wstring(L"")); + + if (pOleObjectElement) + { + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); + } pImageElement = NULL; return m_oWriter.GetData(); diff --git a/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.h b/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.h index f97df3fe0e..76cebf1e0f 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.h +++ b/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.h @@ -457,7 +457,8 @@ namespace PPT std::wstring ConvertTableCell(); void WriteShapeInfo(); void WriteImageInfo(); - void WriteTextInfo(CTextCFRun *pLastCF = nullptr); + void WriteOleObjectInfo(const std::wstring& strRid, const std::wstring& xfrm); + void WriteTextInfo(CTextCFRun *pLastCF = nullptr); static std::wstring WriteBullets(CTextPFRun* pPF, CRelsGenerator *pRels); void Write3dShape(); std::wstring getOWriterStr() const; diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp index 408ff9eb5e..54e0eb5f52 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp @@ -33,7 +33,7 @@ using namespace PPT; -CPPTDocumentInfo::CPPTDocumentInfo() : m_oCurrentUser(), m_bMacros(true) +CPPTDocumentInfo::CPPTDocumentInfo() : m_oCurrentUser(), m_bMacros(true), m_pStream(NULL) { } @@ -57,6 +57,7 @@ void CPPTDocumentInfo::Clear() bool CPPTDocumentInfo::ReadFromStream(CRecordCurrentUserAtom *pCurrentUser, POLE::Stream *pStream) { + m_pStream = pStream; m_oCurrentUser.FromAtom(pCurrentUser); _UINT32 offsetToEdit = m_oCurrentUser.m_nOffsetToCurrentEdit; diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h index bc29978a11..880447f4ee 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h @@ -39,6 +39,8 @@ namespace PPT class CPPTDocumentInfo { public: + friend class CPPTUserInfo; + _commonInfo* m_pCommonInfo = NULL; CCurrentUser m_oCurrentUser; @@ -57,5 +59,8 @@ public: bool ReadFromStream(CRecordCurrentUserAtom* pCurrentUser, POLE::Stream* pStream); bool LoadDocument(); + +private: + POLE::Stream* m_pStream; }; } diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp index 7efa111bd3..39c18081a2 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp @@ -55,7 +55,6 @@ m_pStorageDecrypt(NULL), m_pDecryptor(NULL), m_arOffsetPictures() { - m_VbaProjectStg = NULL; m_pDocumentInfo = NULL; m_lIndexThisUser = -1; @@ -90,7 +89,6 @@ void CPPTUserInfo::Clear() RELEASEOBJECT(m_pDecryptor); RELEASEOBJECT(m_pStorageDecrypt); - RELEASEOBJECT(m_VbaProjectStg); for (std::map<_UINT32, CRecordSlide*>::iterator pPair = m_mapSlides.begin(); pPair != m_mapSlides.end(); ++pPair) { @@ -425,39 +423,47 @@ bool CPPTUserInfo::ReadDocumentPersists(POLE::Stream* pStream) { if (pVbaAtom->m_nHasMacros) { - nIndexPsrRef = m_mapOffsetInPIDs.find(pVbaAtom->m_nObjStgDataRef); - - if (m_mapOffsetInPIDs.end() != nIndexPsrRef) - { - offset_stream = nIndexPsrRef->second; - StreamUtils::StreamSeek(offset_stream, pStream); - - POLE::Stream* pStreamTmp = pStream; - if (m_pDecryptor) - { - DecryptStream(pStream, pVbaAtom->m_nObjStgDataRef); - pStreamTmp = m_arStreamDecrypt.back()->stream_; - } - oHeader.ReadFromStream(pStreamTmp); - - m_VbaProjectStg = new CRecordVbaProjectStg(m_pDocumentInfo->m_pCommonInfo->tempPath); - m_VbaProjectStg->ReadFromStream(oHeader, pStreamTmp); - - if (m_VbaProjectStg->m_sFileName.empty()) - { - RELEASEOBJECT(m_VbaProjectStg); - } - else - { - m_sVbaProjectFile = m_VbaProjectStg->m_sFileName; - m_bMacros = true; - } - } + m_sVbaProjectFile = GetBinFromStg(L"vbaProject.bin", pVbaAtom->m_nObjStgDataRef); + + m_bMacros = (false == m_sVbaProjectFile.empty()); } } } return true; } +std::wstring CPPTUserInfo::GetBinFromStg(const std::wstring& name, _UINT32 nRef) +{ + POLE::Stream* pStream = m_pDocumentInfo->m_pStream; + + std::map<_UINT32, _UINT32>::iterator nIndexPsrRef = m_mapOffsetInPIDs.find(nRef); + + std::wstring result; + if (m_mapOffsetInPIDs.end() != nIndexPsrRef) + { + _UINT32 offset_stream = nIndexPsrRef->second; + StreamUtils::StreamSeek(offset_stream, pStream); + + POLE::Stream* pStreamTmp = pStream; + if (m_pDecryptor) + { + DecryptStream(pStream, nRef); + pStreamTmp = m_arStreamDecrypt.back()->stream_; + } + SRecordHeader oHeader; + oHeader.ReadFromStream(pStreamTmp); + + CRecordExObjStg *pExObjStg = new CRecordExObjStg(name, m_pDocumentInfo->m_pCommonInfo->tempPath); + + if (pExObjStg) + { + pExObjStg->ReadFromStream(oHeader, pStreamTmp); + result = pExObjStg->m_sFileName; + + RELEASEOBJECT(pExObjStg); + } + } + return result; +} //-------------------------------------------------------------------------------------------- void CPPTUserInfo::ReadExtenalObjects() { @@ -2394,15 +2400,22 @@ void CPPTUserInfo::LoadExternal(CRecordExObjListContainer* pExObjects) return; // читаем видео ---------------------------------------------- - std::vector oArray; - pExObjects->GetRecordsByType(&oArray, true); + std::vector oArrayVideo; + pExObjects->GetRecordsByType(&oArrayVideo, true); - for (size_t nIndex = 0; nIndex < oArray.size(); ++nIndex) + for (size_t nIndex = 0; nIndex < oArrayVideo.size(); ++nIndex) { - LoadExVideo(oArray[nIndex]); + LoadExVideo(oArrayVideo[nIndex]); } + // читаем ole ---------------------------------------------- + std::vector oArrayObj; + pExObjects->GetRecordsByType(&oArrayObj, true); - oArray.clear(); + for (size_t nIndex = 0; nIndex < oArrayObj.size(); ++nIndex) + { + LoadExOleObject(oArrayObj[nIndex]); + } + oArrayObj.clear(); // ----------------------------------------------------------- // читаем аудио ---------------------------------------------- @@ -2528,8 +2541,44 @@ void CPPTUserInfo::LoadExternal(CRecordExObjListContainer* pExObjects) } } +void CPPTUserInfo::LoadExOleObject(CRecordsContainer* pExObject) +{ + //exOleEmbedAtom + //exOleObjAtom + //menuNameAtom + //progIdAtom + //clipboardNameAtom + //metafile(variable) + std::vector oArrayExOleEmbed; + std::vector oArrayExOleObj; + std::vector oArrayCString; + pExObject->GetRecordsByType(&oArrayExOleEmbed, false); + pExObject->GetRecordsByType(&oArrayExOleObj, false); + pExObject->GetRecordsByType(&oArrayCString, false); + + if (1 == oArrayExOleObj.size()) + { + PPT::CExFilesInfo oInfo; + + oInfo.m_dwID = oArrayExOleObj[0]->m_nExObjID; + + if (oArrayCString.size() > 0) + oInfo.m_name = oArrayCString[0]->m_strText; + + if (oArrayCString.size() > 1) + oInfo.m_progName = oArrayCString[1]->m_strText; + + oInfo.m_strFilePath = GetBinFromStg(L"", oArrayExOleObj[0]->m_nPersistID); // ExOleObjStg || ExControlStg + + m_oExMedia.m_arOleObjects.push_back(oInfo); + } + + oArrayExOleEmbed.clear(); + oArrayExOleObj.clear(); + oArrayCString.clear(); +} void CPPTUserInfo::LoadExVideo(CRecordsContainer* pExObject) { diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h index 18221edeef..d8c584403a 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h @@ -100,8 +100,7 @@ public: bool m_bHasFooter; int m_nFormatDate; - CRecordVbaProjectStg* m_VbaProjectStg; - int m_lIndexThisUser; + int m_lIndexThisUser; double m_nWriteSlideTimeOffset; double m_nWriteSlideTime; @@ -133,6 +132,8 @@ public: bool ReadDocumentPersists(POLE::Stream* pStream); void ReadExtenalObjects(); + std::wstring GetBinFromStg(const std::wstring& name, _UINT32 nRef); + void DecryptStream(POLE::Stream *pStream, int block); void FromDocument(); @@ -161,6 +162,7 @@ public: void LoadExVideo(CRecordsContainer* pExObject); void LoadExAudio(CRecordsContainer* pExObject); + void LoadExOleObject(CRecordsContainer* pExObject); void LoadAutoNumbering(CRecordGroupShapeContainer* pGroupContainer, CTheme* pTheme); void LoadBulletBlip(CShapeElement* pShape); diff --git a/MsBinaryFile/PptFile/Reader/Records.cpp b/MsBinaryFile/PptFile/Reader/Records.cpp index b8769b8018..c8cf143fa5 100644 --- a/MsBinaryFile/PptFile/Reader/Records.cpp +++ b/MsBinaryFile/PptFile/Reader/Records.cpp @@ -624,8 +624,10 @@ IRecord* CreateByType(SRecordHeader oHeader, _commonInfo* commonInfo) //CREATE_BY_TYPE(RECORD_TYPE_METAFILE , CRecordMetafileBlob) CREATE_BY_TYPE(RT_CString, CRecordCString) CREATE_BY_TYPE(RT_SoundCollectionAtom, CRecordSoundCollAtom) + CREATE_BY_TYPE(RT_ExternalOleObjectAtom, CRecordExOleObjAtom) CREATE_BY_TYPE(RT_ExternalOleEmbedAtom, CRecordExOleEmbedAtom) + CREATE_BY_TYPE(RT_ExternalOleEmbed, CRecordExOleEmbedContainer) //CREATE_BY_TYPE(RECORD_TYPE_BOOKMARK_ENTITY_ATOM , CRecordBookmarkEntityAtom) //CREATE_BY_TYPE(RECORD_TYPE_EXLINK_ATOM , CRecordExOleLinkAtom) @@ -672,7 +674,6 @@ IRecord* CreateByType(SRecordHeader oHeader, _commonInfo* commonInfo) CREATE_BY_TYPE(RTE_CLIENTDATA, CRecordOfficeArtClientData) CREATE_BY_TYPE(RTE_CLIENTTEXTBOX, CRecordOfficeArtClientTextbox) - CREATE_BY_TYPE(RT_ExternalCdAudio, CRecordExCDAudioContainer) CREATE_BY_TYPE(RT_ExternalWavAudioLink, CRecordWAVAudioLinkContainer) CREATE_BY_TYPE(RT_ExternalWavAudioEmbedded, CRecordWAVAudioEmbeddedContainer) diff --git a/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp b/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp index 7a4728febc..ba8932f0f3 100644 --- a/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp +++ b/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp @@ -222,22 +222,29 @@ void CPPTElement::SetUpProperties(CElementPtr pElement, CTheme* pTheme, CSlideIn for (size_t i = 0; i < lCount; ++i) { SetUpPropertyVideo(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); - } - break; - } + } + }break; case PPT::etPicture: + case PPT::etOleObject: { if (reset_default) { - pElement->m_oBrush.Type = c_BrushTypeTexture; + pElement->m_oBrush.Type = c_BrushTypeTexture; // or 3000 set ??? pElement->m_bLine = false; } for (size_t i = 0; i < lCount; ++i) { SetUpPropertyImage(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); } - break; - } + if (false == pElement->m_bIsFilled) + { + pElement->m_oBrush.Type = c_BrushTypeNoFill; + } + else if (pElement->m_oBrush.Type == c_BrushTypeTexture) + { + pElement->m_oBrush.Type = c_BrushTypeSolid; + } + }break; case PPT::etAudio: { if (reset_default) @@ -247,9 +254,8 @@ void CPPTElement::SetUpProperties(CElementPtr pElement, CTheme* pTheme, CSlideIn for (size_t i = 0; i < lCount; ++i) { SetUpPropertyAudio(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); - } - break; - } + } + }break; case PPT::etGroup: { if (reset_default) @@ -282,7 +288,7 @@ void CPPTElement::SetUpProperties(CElementPtr pElement, CTheme* pTheme, CSlideIn pElement->m_oBrush.Type = c_BrushTypeNoFill; } else if (pElement->m_oBrush.Type == c_BrushTypeNotSet && - (pElement->m_lPlaceholderType == 0 && pElement->m_lPlaceholderID < 0 )) + (pElement->m_lPlaceholderType == 0 && pElement->m_lPlaceholderID < 0)) { pElement->m_oBrush.Type = c_BrushTypeSolid; } @@ -292,8 +298,7 @@ void CPPTElement::SetUpProperties(CElementPtr pElement, CTheme* pTheme, CSlideIn pPPTShape->m_oCustomVML.ToCustomShape(pPPTShape, pPPTShape->m_oManager); pPPTShape->ReCalculate(); } - break; - } + }break; default: break; } @@ -1641,10 +1646,10 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, if (CExFilesInfo::eftVideo == exType) { - CVideoElement* pVideoElem = new CVideoElement(); + CVideoElement* pVideoElem = new CVideoElement(); - pVideoElem->m_strVideoFileName = oInfo.m_strFilePath ; - pVideoElem->m_strImageFileName = oInfoDefault.m_strFilePath + FILE_SEPARATOR_STR; + pVideoElem->m_strVideoFileName = oInfo.m_strFilePath ; + pVideoElem->m_strImageFileName = oInfoDefault.m_strFilePath + FILE_SEPARATOR_STR; pElement = CElementPtr(pVideoElem); } @@ -1674,9 +1679,20 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, } } + else if (CExFilesInfo::eftOleObject == exType) + { + COleObjectElement* pOleObjectElem = new COleObjectElement(); + pOleObjectElem->m_strBinFileName = oInfo.m_strFilePath; + pOleObjectElem->m_strImageFileName = oInfoDefault.m_strFilePath + FILE_SEPARATOR_STR; + + pOleObjectElem->m_strProgId = oInfo.m_progName; + pOleObjectElem->m_strOleName = oInfo.m_name; + + pElement = CElementPtr(pOleObjectElem); + } else { - CImageElement* pImageElem = new CImageElement(); + CImageElement* pImageElem = new CImageElement(); pImageElem->m_strImageFileName = oInfo.m_strFilePath + FILE_SEPARATOR_STR; pElement = CElementPtr(pImageElem); @@ -1778,7 +1794,7 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, GetRecordsByType(&oArrayFooterMeta, true, true); if (0 < oArrayFooterMeta.size()) { - pElement->m_lPlaceholderType = PT_MasterFooter; + pElement->m_lPlaceholderType = PT_MasterFooter; pElement->m_lPlaceholderUserStr = oArrayFooterMeta[0]->m_nPosition; } std::vector oArraySlideNumberMeta; diff --git a/MsBinaryFile/PptFile/Records/ExObjListContainer.cpp b/MsBinaryFile/PptFile/Records/ExObjListContainer.cpp index a104ea3a11..cb00e75544 100644 --- a/MsBinaryFile/PptFile/Records/ExObjListContainer.cpp +++ b/MsBinaryFile/PptFile/Records/ExObjListContainer.cpp @@ -37,3 +37,63 @@ void CRecordExObjListContainer::ReadFromStream(SRecordHeader &oHeader, POLE::Str { CRecordsContainer::ReadFromStream(oHeader, pStream); } + +CRecordExObjStg::CRecordExObjStg(const std::wstring& name, const std::wstring& tempPath) +{ + if (name.empty()) + { + m_sFileName = NSFile::CFileBinary::CreateTempFileWithUniqueName(tempPath, L"bin"); + } + else + { + m_sFileName = tempPath + FILE_SEPARATOR_STR + name; + } +} + +CRecordExObjStg::~CRecordExObjStg() +{ +} + +void CRecordExObjStg::ReadFromStream(SRecordHeader& oHeader, POLE::Stream* pStream) +{ + m_oHeader = oHeader; + + ULONG decompressedSize = m_oHeader.RecLen, compressedSize = m_oHeader.RecLen; + + BYTE* pData = new BYTE[compressedSize]; + if (!pData) return; + + if (m_oHeader.RecInstance == 0x01) + { + decompressedSize = StreamUtils::ReadDWORD(pStream) + 64; + compressedSize -= 4; + } + pStream->read(pData, compressedSize); + + //if (pDecryptor) + //{ + // pDecryptor->Decrypt((char*)pData, compressedSize, 0); + //} + + if (m_oHeader.RecInstance == 0x01) + { + BYTE* pDataUncompress = new BYTE[decompressedSize]; + NSZip::Decompress(pData, compressedSize, pDataUncompress, decompressedSize); + + delete[]pData; + pData = pDataUncompress; + } + + NSFile::CFileBinary file; + if (file.CreateFileW(m_sFileName)) + { + file.WriteFile(pData, decompressedSize); + file.CloseFile(); + } + else + { + m_sFileName.clear(); + } + delete[] pData; + pData = NULL; +} diff --git a/MsBinaryFile/PptFile/Records/ExObjListContainer.h b/MsBinaryFile/PptFile/Records/ExObjListContainer.h index c7194504d5..03ebd9bd36 100644 --- a/MsBinaryFile/PptFile/Records/ExObjListContainer.h +++ b/MsBinaryFile/PptFile/Records/ExObjListContainer.h @@ -39,4 +39,16 @@ class CRecordExObjListContainer : public CRecordsContainer public: virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) override; }; + + +class CRecordExObjStg : public CUnknownRecord +{ +public: + std::wstring m_sFileName; + + CRecordExObjStg(const std::wstring& name, const std::wstring& tempPath); + ~CRecordExObjStg(); + + virtual void ReadFromStream(SRecordHeader& oHeader, POLE::Stream* pStream) override; +}; } diff --git a/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.cpp b/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.cpp index 5f84e0ab3a..db9d45029c 100644 --- a/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.cpp +++ b/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.cpp @@ -43,3 +43,8 @@ void CRecordExOleEmbedAtom::ReadFromStream(SRecordHeader &oHeader, POLE::Stream m_nIsTable = StreamUtils::ReadBYTE(pStream); StreamUtils::StreamSkip(1, pStream); } + +void CRecordExOleEmbedContainer::ReadFromStream(SRecordHeader& oHeader, POLE::Stream* pStream) +{ + CRecordsContainer::ReadFromStream(oHeader, pStream); +} \ No newline at end of file diff --git a/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.h b/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.h index 683e56c590..ec5d5bcea8 100644 --- a/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.h +++ b/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.h @@ -41,8 +41,12 @@ public: BOOL1 m_nCantLockServer; BOOL1 m_nNoSizeToServer; BOOL1 m_nIsTable; - - virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) override; }; + +class CRecordExOleEmbedContainer : public CRecordsContainer +{ +public: + virtual void ReadFromStream(SRecordHeader& oHeader, POLE::Stream* pStream) override; +}; } diff --git a/MsBinaryFile/PptFile/Records/VBAInfoAtom.cpp b/MsBinaryFile/PptFile/Records/VBAInfoAtom.cpp index 28139b6b77..31f73d3b40 100644 --- a/MsBinaryFile/PptFile/Records/VBAInfoAtom.cpp +++ b/MsBinaryFile/PptFile/Records/VBAInfoAtom.cpp @@ -61,53 +61,3 @@ void CRecordVBAInfoContainer::ReadFromStream(SRecordHeader &oHeader, POLE::Strea m_oHeader = oHeader; CRecordsContainer::ReadFromStream(oHeader, pStream); } - -CRecordVbaProjectStg::CRecordVbaProjectStg(std::wstring strTemp) : m_strTmpDirectory(strTemp) -{ -} - -CRecordVbaProjectStg::~CRecordVbaProjectStg() -{ -} - -void CRecordVbaProjectStg::ReadFromStream(SRecordHeader &oHeader, POLE::Stream *pStream) -{ - m_oHeader = oHeader; - - ULONG decompressedSize = m_oHeader.RecLen, compressedSize = m_oHeader.RecLen; - - BYTE* pData = new BYTE[compressedSize]; - if (!pData) return; - - if (m_oHeader.RecInstance == 0x01) - { - decompressedSize = StreamUtils::ReadDWORD(pStream) + 64; - compressedSize -= 4; - } - pStream->read(pData, compressedSize); - - //if (pDecryptor) - //{ - // pDecryptor->Decrypt((char*)pData, compressedSize, 0); - //} - - if (m_oHeader.RecInstance == 0x01) - { - BYTE* pDataUncompress = new BYTE[decompressedSize]; - NSZip::Decompress(pData, compressedSize, pDataUncompress, decompressedSize); - - delete []pData; - pData = pDataUncompress; - } - - m_sFileName = m_strTmpDirectory + FILE_SEPARATOR_STR + L"vbaProject.bin"; - - NSFile::CFileBinary file; - if (file.CreateFileW(m_sFileName)) - { - file.WriteFile(pData, decompressedSize); - file.CloseFile(); - } - delete[] pData; - pData = NULL; -} diff --git a/MsBinaryFile/PptFile/Records/VBAInfoAtom.h b/MsBinaryFile/PptFile/Records/VBAInfoAtom.h index 68c477b2d8..b71d2dea60 100644 --- a/MsBinaryFile/PptFile/Records/VBAInfoAtom.h +++ b/MsBinaryFile/PptFile/Records/VBAInfoAtom.h @@ -57,16 +57,4 @@ public: virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream); }; -class CRecordVbaProjectStg : public CUnknownRecord -{ -public: - std::wstring m_sFileName; - std::wstring m_strTmpDirectory; - - - CRecordVbaProjectStg(std::wstring strTemp); - ~CRecordVbaProjectStg(); - - virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) override; -}; } diff --git a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp index 88bfd184ea..d1b3cbb4e7 100644 --- a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp +++ b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp @@ -736,6 +736,20 @@ bool isColumn(const std::wstring& columnName, _UINT32 listIndex, _UINT16& indexC } return false; } - +unsigned int getColumnsCount(_UINT32 listIndex) +{ + auto arrColumn = XLS::GlobalWorkbookInfo::mapTableColumnNames_static.find(listIndex); + if(arrColumn != XLS::GlobalWorkbookInfo::mapTableColumnNames_static.end()) + { + auto counter = 0; + for(auto i:arrColumn->second) + { + if(!i.empty()) + counter++; + } + return counter; + } + return 0; +} } //namespace XMLSTUFF diff --git a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h index e1d902b868..a7a06f1e93 100644 --- a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h +++ b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h @@ -95,5 +95,6 @@ unsigned short sheetsnames2ixti(std::wstring name); unsigned int definenames2index(std::wstring name); bool isTableFmla(const std::wstring& tableName, _UINT32& listIndex); bool isColumn(const std::wstring& columnName, _UINT32 listIndex, _UINT16& indexColumn); +unsigned int getColumnsCount(_UINT32 listIndex); } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h index 0be5d56720..03443bef33 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h @@ -116,6 +116,11 @@ public: cch_ = str.length(); return *this; } + XLUnicodeString_T operator=(const bool& boolVal) + { + cch_ = 0; + return *this; + } const size_t getStructSizeWouldWritten() const // Number of unsigned chars that would be written { return recalculateStructSize(); diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFParsedFormula.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFParsedFormula.cpp index ec714649e1..c64c045e87 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFParsedFormula.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFParsedFormula.cpp @@ -42,7 +42,7 @@ CFParsedFormula::CFParsedFormula(const CellRef& cell_base_ref) : ParsedFormula(c CFParsedFormula& CFParsedFormula::operator=(const std::wstring& value) { - ParsedFormula::operator = (value); + parseStringFormula(value, L"CFParsedFormulaNoCCE"); return *this; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.h index 9d9605b83f..a1ecbcab55 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.h @@ -185,24 +185,44 @@ public: void save(CFRecord& record) override { - RwType rwFirst; - RwType rwLast; - ColType colFirst; - ColType colLast; + RwType rwFirst = rowFirst; + RwType rwLast = rowLast; + ColType colFirst = 0; + ColType colLast = 0; + + auto version = record.getGlobalWorkbookInfo()->Version; - rwFirst = rowFirst; - rwLast = rowLast; - - switch (rel_info) + if (version < 0x0800) { - case rel_Present: - colFirst = (columnFirst >> 2) << 2; - colLast = (columnLast >> 2) << 2; - break; - case rel_Absent: - colFirst = columnFirst; - colLast = columnLast; - break; + switch (rel_info) + { + case rel_Present: + colFirst = (columnFirst >> 2) << 2; + colLast = (columnLast >> 2) << 2; + break; + case rel_Absent: + colFirst = columnFirst; + colLast = columnLast; + break; + } + } + else + { + if(rel_info == rel_Present) + { + SETBITS(colFirst, 0, 13, columnFirst); + SETBIT(colFirst, 14, columnFirstRelative); + SETBIT(colFirst, 15, rowFirstRelative); + + SETBITS(colLast, 0, 13, columnLast); + SETBIT(colLast, 14, columnLastRelative); + SETBIT(colLast, 15, rowLastRelative); + } + else if(rel_info == rel_Absent) + { + colFirst = columnFirst; + colLast = columnLast; + } } record << rwFirst << rwLast << colFirst << colLast; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h index ba50316040..f2d617a035 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h @@ -180,10 +180,20 @@ public: void save(CFRecord& record) override { RwType rw; - ColType col; - + ColType col = 0; rw = row; - col = column; + auto version = record.getGlobalWorkbookInfo()->Version; + + if (version < 0x0800) + { + col = column; + } + else + { + SETBITS(col, 0, 13, column); + SETBIT(col, 14, colRelative); + SETBIT(col, 15, rowRelative); + } record << rw << col; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.cpp index ebf02c6989..48691468f2 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.cpp @@ -57,6 +57,10 @@ void PtgErr::loadFields(CFRecord& record) record >> err; } +void PtgErr::writeFields(CFRecord& record) +{ + record << err; +} void PtgErr::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref) { diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.h index b83569a1a6..4abd32527d 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.h @@ -49,6 +49,7 @@ public: virtual void loadFields(CFRecord& record); + void writeFields(CFRecord& record) override; virtual void assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref = false); diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExp.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExp.h index ef52ce5860..affb820df7 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExp.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExp.h @@ -53,7 +53,6 @@ public: static const unsigned short fixed_id = 0x01; -private: unsigned short row; unsigned short col; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExtraCol.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExtraCol.h index 7f9325f4a5..64cce73f71 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExtraCol.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExtraCol.h @@ -52,7 +52,7 @@ public: // No type info const std::wstring toString() const; -private: + _INT32 col; }; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef.h index a10b730b56..fae265d364 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef.h @@ -56,7 +56,7 @@ public: static const unsigned short fixed_id = 0x04; -private: + RgceLoc loc; XLSB::RgceLoc loc_xlsb; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRefN.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRefN.cpp index 1bf92087bd..c673267f0e 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRefN.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRefN.cpp @@ -48,6 +48,7 @@ PtgRefN::PtgRefN(const std::wstring& word, const PtgDataType data_type, const Ce cell_base_ref(cell_base_ref_init) { loc -= cell_base_ref; + loc_xlsb -= cell_base_ref; bUseLocInit = true; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 08f56fb64e..1245cd1c0f 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -265,7 +265,8 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R } if(!ptg_stack.size() || !left_p) { - // EXCEPT::RT::WrongParenthesisSequence(assembled_formula); + operand_expected = true; + continue;// EXCEPT::RT::WrongParenthesisSequence(assembled_formula); } left_p->incrementParametersNum(); // The count of parameters will be transferred to PtgFuncVar last_ptg = left_p; // PtgParen. Mostly to differ unary and binary minuses and pluses @@ -301,7 +302,7 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R { if(SyntaxPtg::extract_PtgArea(it, itEnd, operand_str)) { - rgce.addPtg(found_operand = OperandPtgPtr(new PtgArea3d(ixti, operand_str, OperandPtg::ptg_VALUE, rgce.getLocation()))); + rgce.addPtg(found_operand = OperandPtgPtr(new PtgArea3d(ixti, operand_str, OperandPtg::ptg_REFERENCE, rgce.getLocation()))); } else if(SyntaxPtg::extract_PtgRef(it, itEnd, operand_str)) { @@ -340,7 +341,7 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R } else { - found_operand = OperandPtgPtr(new PtgArea(operand_str, OperandPtg::ptg_VALUE)); + found_operand = OperandPtgPtr(new PtgArea(operand_str, OperandPtg::ptg_REFERENCE)); } rgce.addPtg(found_operand); } @@ -364,17 +365,6 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R { rgce.addPtg(found_operand = OperandPtgPtr(new PtgNum(operand_str))); } - - else if(SyntaxPtg::extract_UndefinedName(it, itEnd)) // Shall be placed strongly after extract_PtgName - { - rgce.addPtg(found_operand = OperandPtgPtr(new PtgErr(L"#REF!"))); - } - - else if(SyntaxPtg::extract_PtgArray(it, itEnd, operand_str)) - { - rgce.addPtg(found_operand = OperandPtgPtr(new PtgArray(OperandPtg::ptg_ARRAY))); - rgb.addPtg(PtgPtr(new PtgExtraArray(operand_str))); - } else if(SyntaxPtg::extract_PtgFunc(it, itEnd, operand_str)) { PtgPtr func; @@ -394,6 +384,17 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R rgce.addPtg(PtgPtr(new PtgNameX(operand_str, OperandPtg::ptg_VALUE))); } } + else if(SyntaxPtg::extract_UndefinedName(it, itEnd)) // Shall be placed strongly after extract_PtgName + { + rgce.addPtg(found_operand = OperandPtgPtr(new PtgErr(L"#REF!"))); + } + + else if(SyntaxPtg::extract_PtgArray(it, itEnd, operand_str)) + { + rgce.addPtg(found_operand = OperandPtgPtr(new PtgArray(OperandPtg::ptg_ARRAY))); + rgb.addPtg(PtgPtr(new PtgExtraArray(operand_str))); + } + else { // EXCEPT::RT::WrongFormulaString("Unknown operand format in formula.", assembled_formula); diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp index 8dc53e4695..fdd9920eec 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp @@ -467,6 +467,9 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: static boost::wregex reg_inside_table1(L"\\[#?[\\s\\w\\d.]+\\]"); static boost::wregex reg_inside_table2(L"\\[#\\w[\\s\\w\\d.]*\\],\\[#\\w[\\s\\w\\d.]*\\]"); static boost::wregex reg_inside_table3(L"^[,;:]?\\[#?[\\s\\w\\d.]+\\]"); + static boost::wregex reg_inside_table4(L"\\[#?(\\[.+?\\]\\,)?(\\[.+?\\])?.+?\\]"); + static boost::wregex reg_inside_table5(L"^[,;:]?\\[.+?\\]"); + static boost::wregex reg_inside_table6(L"\\[\\]"); first = results[1].second; @@ -481,6 +484,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: insider = results_1.str(0); + insider = boost::algorithm::erase_all_copy(insider, L"\n"); if (insider == L"[#Data]") { if (boost::regex_search(first, last, results_1, reg_inside_table2)) @@ -518,7 +522,6 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: { ptgList.rowType = 0x10; } - else if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) { ptgList.rowType = 0x00; @@ -532,6 +535,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: if (boost::regex_search(first, last, results_1, reg_inside_table3)) { insider = results_1.str(0); + insider = boost::algorithm::erase_all_copy(insider, L"\n"); if (!insider.empty() && insider[0] != '[') insider.erase(0, 1); @@ -548,6 +552,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: if (boost::regex_search(first, last, results_1, reg_inside_table3)) { insider = results_1.str(0); + insider = boost::algorithm::erase_all_copy(insider, L"\n"); if (!insider.empty() && insider[0] != '[') insider.erase(0, 1); @@ -559,6 +564,19 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: first = results_1[0].second; } } + else if(boost::regex_search(first, last, results_1, reg_inside_table5)) + { + insider = results_1.str(0); + insider = boost::algorithm::erase_all_copy(insider, L"\n"); + insider = boost::algorithm::erase_first_copy(insider, L":"); + + if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) + { + ptgList.columns = 0x02; + ptgList.colLast = indexColumn; + } + first = results_1[0].second; + } } else { @@ -567,6 +585,22 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: } } } + else if(boost::regex_search(first, last, results_1, reg_inside_table5)) + { + insider = results_1.str(0); + insider = boost::algorithm::erase_first_copy(insider, L","); + insider = boost::algorithm::erase_all_copy(insider, L"\n"); + + if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) + { + if (ptgList.colFirst == 65535) + { + ptgList.columns = 0x01; + ptgList.colFirst = indexColumn; + } + } + first = results_1[0].second; + } if (first != last && *first == ']') ++first; @@ -574,6 +608,40 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: return true; } + else if (boost::regex_search(first, last, results_1, reg_inside_table6)) + { + auto colCount = XMLSTUFF::getColumnsCount(indexTable); + if(colCount>1) + { + ptgList.columns = 0x02; + ptgList.colFirst = 0; + ptgList.colLast = colCount-1; + first = results_1[0].second; + } + else + { + ptgList.columns = 0x01; + ptgList.colFirst = 0; + first = results_1[0].second; + } + return true; + } + else if(boost::regex_search(first, last, results_1, reg_inside_table4)) + { + _UINT16 indexColumn = -1; + auto insider = boost::algorithm::erase_all_copy(results_1.str(0), L"\n"); + + if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) + { + ptgList.columns = 0x01; + ptgList.colFirst = indexColumn; + first = results_1[0].second; + return true; + } + + if (first != last && *first == ']') + ++first; + } } } return false; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp index 9a7f8e38cd..4fa7de73c5 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp @@ -143,8 +143,77 @@ void XFProp::save(CFRecord& record) { if (xfPropDataBlob) { - cb = sizeof(cb) + sizeof(xfPropType) + sizeof(*xfPropDataBlob.get()); + cb = sizeof(cb) + sizeof(xfPropType); + auto blobSize = 0; + switch(xfPropType) + { + case 0x000D: + case 0x000E: + case 0x000F: + case 0x0010: + case 0x0011: // XFPropTextRotation + case 0x0012: // indent + case 0x0013: // ReadingOrder + case 0x0014: + case 0x0015: + case 0x0016: + case 0x0017: + case 0x001C: + case 0x001D: + case 0x001E: + case 0x001F: + case 0x0020: + case 0x0021: + case 0x0022: + case 0x0023: + case 0x0025: + case 0x002B: + case 0x002C: + case 0x0000: + blobSize = 1; + break; + case 0x0001: + case 0x0002: + case 0x0005: + blobSize = 8; + break; + case 0x0003: + blobSize = 44; + break; + case 0x0004: + blobSize = 18; + break; + case 0x0006: + case 0x0007: + case 0x0008: + case 0x0009: + case 0x000A: + case 0x000B: + case 0x000C: + blobSize = 10; + break; + case 0x0026: + case 0x0018: + { + blobSize = sizeof(*xfPropDataBlob.get()); + } + break; + case 0x0019: + case 0x001A: + case 0x001B: + case 0x0029: + case 0x002A: + blobSize = 2; + break; + case 0x0024: + blobSize = 4; + break; + default: + // EXCEPT::RT::WrongBiffRecord("Unsupported type of XFProp.", record.getTypeString()); + break; + } + cb += blobSize; record << xfPropType << cb; if (xfPropType == 0x0026 || xfPropType == 0x0018) @@ -552,6 +621,9 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) xfPropDataBlob.reset(new BIFF_WORD(XmlUtils::GetInteger(oReader.GetText()))); break; case 0x0019: + xfPropDataBlob.reset(new BIFF_WORD(0x02BC1)); + deserialize_val_prop(oReader, L"BIFF_WORD", xfPropDataBlob); + break; case 0x001A: xfPropDataBlob.reset(new BIFF_WORD(1)); case 0x001B: diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp index d2630dc0c0..2d4075c68f 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp @@ -99,6 +99,7 @@ int XFPropColor::deserialize(XmlUtils::CXmlLiteReader& oReader) { std::wstring wsPropName = oReader.GetName(); nTintShade = 0; + fValidRGBA = false; while (!wsPropName.empty()) { if (wsPropName == L"auto" && oReader.GetText() == L"1") @@ -117,10 +118,11 @@ int XFPropColor::deserialize(XmlUtils::CXmlLiteReader& oReader) { xclrType = 2; dwRgba.Parse(oReader.GetText()); + fValidRGBA = true; } else if (wsPropName == L"tint") { - nTintShade = XmlUtils::GetInteger(oReader.GetText()) * 32767.0; + nTintShade = XmlUtils::GetDouble(oReader.GetText()) * 32767.0; } if (!oReader.MoveToNextAttribute()) diff --git a/OOXML/Binary/Document/BinReader/ReaderClasses.cpp b/OOXML/Binary/Document/BinReader/ReaderClasses.cpp index cb770c5835..b7821ba0f7 100644 --- a/OOXML/Binary/Document/BinReader/ReaderClasses.cpp +++ b/OOXML/Binary/Document/BinReader/ReaderClasses.cpp @@ -681,7 +681,7 @@ namespace BinDocxRW { { std::wstring sUserName = XmlUtils::EncodeXmlString(pComment->UserName); sRes += L" w:author=\""; - sRes += (sUserName); + sRes += XmlUtils::EncodeXmlString(sUserName); sRes += L"\""; } if (false == pComment->Date.empty()) diff --git a/OOXML/Binary/Document/BinReader/Readers.cpp b/OOXML/Binary/Document/BinReader/Readers.cpp index 297b16a8ea..fda1072622 100644 --- a/OOXML/Binary/Document/BinReader/Readers.cpp +++ b/OOXML/Binary/Document/BinReader/Readers.cpp @@ -1036,6 +1036,11 @@ int Binary_pPrReader::ReadContent(BYTE type, long length, void* poResult) pPPr->m_oCnfStyle.Init(); READ1_DEF(length, res, this->ReadCnfStyle, pPPr->m_oCnfStyle.GetPointer()); }break; + case c_oSerProp_pPrType::SnapToGrid: + { + pPPr->m_oSnapToGrid.Init(); + pPPr->m_oSnapToGrid->m_oVal.FromBool(m_oBufferedStream.GetBool()); + }break; default: res = c_oSerConstants::ReadUnknown; break; diff --git a/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h b/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h index fa5219571e..ba1246ee42 100644 --- a/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h +++ b/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h @@ -356,7 +356,8 @@ extern int g_nCurFormatVersion; Tab_Item_PosTwips = 42, Tab_Item_Val = 43, SuppressLineNumbers = 44, - CnfStyle = 45 + CnfStyle = 45, + SnapToGrid = 46 };} namespace c_oSerProp_rPrType{enum c_oSerProp_rPrType { diff --git a/OOXML/Binary/Document/BinWriter/BinWriters.cpp b/OOXML/Binary/Document/BinWriter/BinWriters.cpp index de701a62a3..e4f0b698e4 100644 --- a/OOXML/Binary/Document/BinWriter/BinWriters.cpp +++ b/OOXML/Binary/Document/BinWriter/BinWriters.cpp @@ -1132,6 +1132,12 @@ void Binary_pPrWriter::Write_pPr(const OOX::Logic::CParagraphProperty& pPr) WriteCnfStyle(pPr.m_oCnfStyle.GetPointer()); m_oBcw.WriteItemWithLengthEnd(nCurPos2); } + if (pPr.m_oSnapToGrid.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::SnapToGrid); + m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte); + m_oBcw.m_oStream.WriteBOOL(pPr.m_oSnapToGrid->m_oVal.ToBool()); + } } void Binary_pPrWriter::WritePPrChange(const OOX::Logic::CPPrChange& pPrChange) { @@ -6619,6 +6625,8 @@ void BinaryDocumentTableWriter::WriteDrawing(std::wstring* pXml, OOX::Logic::CDr int nCurPos = 0; bool bDeleteDrawing = false; + + m_oBcw.m_oStream.m_dCxCurShape = m_oBcw.m_oStream.m_dCyCurShape = 0; //pptxdata if (pXml) { @@ -6651,6 +6659,28 @@ void BinaryDocumentTableWriter::WriteDrawing(std::wstring* pXml, OOX::Logic::CDr } else if (pGraphic) { + if (NULL != pDrawing) + { + OOX::Logic::CDrawing& img = *pDrawing; + if (img.m_oInline.IsInit()) + { + const OOX::Drawing::CInline& pInline = img.m_oInline.get(); + if (pInline.m_oExtent.IsInit()) + { + m_oBcw.m_oStream.m_dCxCurShape = pInline.m_oExtent->m_oCx.GetValue(); + m_oBcw.m_oStream.m_dCyCurShape = pInline.m_oExtent->m_oCy.GetValue(); + } + } + else if (img.m_oAnchor.IsInit()) + { + const OOX::Drawing::CAnchor& pAnchor = img.m_oAnchor.get(); + if (pAnchor.m_oExtent.IsInit()) + { + m_oBcw.m_oStream.m_dCxCurShape = pAnchor.m_oExtent->m_oCx.GetValue(); + m_oBcw.m_oStream.m_dCyCurShape = pAnchor.m_oExtent->m_oCy.GetValue(); + } + } + } if (pGraphic->chartRec.IsInit() && pGraphic->chartRec->id_data.IsInit() ) { m_oBcw.m_oStream.WriteBYTE(pGraphic->chartRec->m_bChartEx ? c_oSerImageType2::ChartEx : c_oSerImageType2::Chart); diff --git a/OOXML/Binary/Document/DocWrapper/DocxSerializer.cpp b/OOXML/Binary/Document/DocWrapper/DocxSerializer.cpp index 0f48a2e1e7..b4d887a3e6 100644 --- a/OOXML/Binary/Document/DocWrapper/DocxSerializer.cpp +++ b/OOXML/Binary/Document/DocWrapper/DocxSerializer.cpp @@ -623,9 +623,12 @@ bool BinDocxRW::CDocxSerializer::unpackageFile(const std::wstring& sSrcFileName, return file.unpackage(sSrcFileName, sDstPath); } -bool BinDocxRW::CDocxSerializer::convertFlat(const std::wstring& sSrcFileName, const std::wstring& sDstPath) +bool BinDocxRW::CDocxSerializer::convertFlat(const std::wstring& sSrcFileName, const std::wstring& sDstPath, bool &bMacro, const std::wstring& sTempPath) { - OOX::CDocxFlat docxflat(sSrcFileName); + OOX::CDocxFlat docxflat; + + docxflat.m_sTempPath = sTempPath; + docxflat.read(sSrcFileName); if (false == docxflat.m_pDocument.IsInit()) return false; @@ -637,6 +640,8 @@ bool BinDocxRW::CDocxSerializer::convertFlat(const std::wstring& sSrcFileName, c NSCommon::smart_ptr file = docxflat.m_pDocument.GetPointer(); file.AddRef(); docx.Add(file); docx.m_oMain.document = docxflat.m_pDocument.GetPointer(); + + bMacro = bMacro && docxflat.m_pDocument->m_bMacroEnabled; } if (docxflat.m_pApp.IsInit()) { @@ -648,6 +653,7 @@ bool BinDocxRW::CDocxSerializer::convertFlat(const std::wstring& sSrcFileName, c NSCommon::smart_ptr file(docxflat.m_pCore.GetPointer()); file.AddRef(); docx.Add(file); } + //docxflat.m_oBgPict.GetPointer(); return docx.Write(sDstPath); diff --git a/OOXML/Binary/Document/DocWrapper/DocxSerializer.h b/OOXML/Binary/Document/DocWrapper/DocxSerializer.h index 9f0223cec6..57d7935976 100644 --- a/OOXML/Binary/Document/DocWrapper/DocxSerializer.h +++ b/OOXML/Binary/Document/DocWrapper/DocxSerializer.h @@ -67,7 +67,7 @@ namespace BinDocxRW bool saveToFile (const std::wstring& sSrcFileName, const std::wstring& sDstPath, const std::wstring& sXMLOptions, const std::wstring& sTempPath); bool unpackageFile(const std::wstring& sSrcFileName, const std::wstring& sDstPath); - bool convertFlat(const std::wstring& sSrcFileName, const std::wstring& sDstPath); + bool convertFlat(const std::wstring& sSrcFileName, const std::wstring& sDstPath, bool& bMacro, const std::wstring& sTempPath); bool CreateDocxFolders(std::wstring strDirectory, std::wstring& sThemePath, std::wstring& sMediaPath, std::wstring& sEmbedPath); diff --git a/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp b/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp index 1c8ac5ae10..bbc786c582 100644 --- a/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp +++ b/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp @@ -231,7 +231,7 @@ namespace NSBinPptxRW if (IsNeedDownload(strInput)) return DownloadImage(strInput); - std::map::const_iterator pPair = m_mapImages.find ((strBase64Image.empty()) ? strInput : strBase64Image); + std::map::const_iterator pPair = m_mapImages.find ((strBase64Image.empty()) ? strInput + oleData : strBase64Image + oleData); if (pPair != m_mapImages.end()) { @@ -386,9 +386,9 @@ namespace NSBinPptxRW } if (strBase64Image.empty()) - m_mapImages[strInput] = oImageManagerInfo; + m_mapImages[strInput + oleData] = oImageManagerInfo; else - m_mapImages [strBase64Image] = oImageManagerInfo; + m_mapImages [strBase64Image + oleData] = oImageManagerInfo; return oImageManagerInfo; } bool CImageManager2::WriteOleData(const std::wstring& sFilePath, const std::wstring& sData) @@ -695,31 +695,33 @@ namespace NSBinPptxRW } double CBinaryFileWriter::GetShapeHeight() { - if (m_lCyCurShape == 0) + if (m_dCyCurShape < 0.001) return -1; - return (double)m_lCyCurShape / 36000; //mm + return m_dCyCurShape / 36000; //mm } double CBinaryFileWriter::GetShapeWidth() { - if (m_lCyCurShape == 0) + if (m_dCyCurShape < 0.001) return -1; - return (double)m_lCxCurShape / 36000; + return m_dCxCurShape / 36000; } double CBinaryFileWriter::GetShapeY() { - return (double)m_lYCurShape / 36000; + return m_dYCurShape / 36000; } double CBinaryFileWriter::GetShapeX() { - return (double)m_lXCurShape / 36000; //mm + return m_dXCurShape / 36000; //mm } void CBinaryFileWriter::ClearCurShapePositionAndSizes() { - m_lXCurShape = 0; - m_lYCurShape = 0; + m_dXCurShape = 0; + m_dYCurShape = 0; - m_lCxCurShape = 0; - m_lCyCurShape = 0; + m_dCxCurShape = 0; + m_dCyCurShape = 0; + + m_bInGroup = false; } void CBinaryFileWriter::Clear() { @@ -732,11 +734,13 @@ namespace NSBinPptxRW m_lStackPosition = 0; memset(m_arStack, 0, MAX_STACK_SIZE * sizeof(_UINT32)); - m_lCxCurShape = 0; - m_lCyCurShape = 0; + m_dCxCurShape = 0; + m_dCyCurShape = 0; - m_lXCurShape = 0; - m_lYCurShape = 0; + m_dXCurShape = 0; + m_dYCurShape = 0; + + m_bInGroup = false; } void CBinaryFileWriter::SetMainDocument(BinDocxRW::CDocxSerializer* pMainDoc) @@ -1399,7 +1403,7 @@ namespace NSBinPptxRW } - CRelsGenerator::CRelsGenerator(CImageManager2* pManager) : m_lNextRelsID(1), m_mapImages() + CRelsGenerator::CRelsGenerator(CImageManager2* pManager) : m_lNextRelsID(1), m_mapRelsImages() { m_pManager = pManager; m_pWriter = new NSStringUtils::CStringBuilder(); @@ -1412,7 +1416,7 @@ namespace NSBinPptxRW { m_pWriter->ClearNoAttack(); m_lNextRelsID = 1; - m_mapImages.clear(); + m_mapRelsImages.clear(); m_mapLinks.clear(); } @@ -1614,20 +1618,20 @@ namespace NSBinPptxRW { _imageManager2Info oImageManagerInfo = m_pManager->GenerateMedia(strImage); - std::wstring strImageRelsPath; + std::wstring strMediaRelsPath; - if (m_pManager->m_nDocumentType == XMLWRITER_DOC_TYPE_DOCX) strImageRelsPath = L"media/"; - else strImageRelsPath = L"../media/"; + if (m_pManager->m_nDocumentType == XMLWRITER_DOC_TYPE_DOCX) strMediaRelsPath = L"media/"; + else strMediaRelsPath = L"../media/"; _relsGeneratorInfo oRelsGeneratorInfo; if (!oImageManagerInfo.sFilepathImage.empty()) { - strImageRelsPath += OOX::CPath(oImageManagerInfo.sFilepathImage).GetFilename(); + strMediaRelsPath += OOX::CPath(oImageManagerInfo.sFilepathImage).GetFilename(); - std::map::iterator pPair = m_mapImages.find(strImageRelsPath); + std::map::iterator pPair = m_mapRelsImages.find(strMediaRelsPath); - if (m_mapImages.end() != pPair) + if (m_mapRelsImages.end() != pPair) { return pPair->second; } @@ -1640,16 +1644,16 @@ namespace NSBinPptxRW if (type == 0) { m_pWriter->WriteString( L""); + L"\" Type=\"http://schemas.microsoft.com/office/2007/relationships/media\" Target=\"" + strMediaRelsPath + L"\"/>"); } else if (type == 1) { m_pWriter->WriteString( L""); + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio\" Target=\"" + strMediaRelsPath + L"\"/>"); } } - m_mapImages.insert(std::pair(strImageRelsPath, oRelsGeneratorInfo)); + m_mapRelsImages.insert(std::pair(strMediaRelsPath, oRelsGeneratorInfo)); return oRelsGeneratorInfo; } @@ -1668,9 +1672,9 @@ namespace NSBinPptxRW { strImageRelsPath += OOX::CPath(oImageManagerInfo.sFilepathImage).GetFilename(); - std::map::iterator pPair = m_mapImages.find(strImageRelsPath); + std::map::iterator pPair = m_mapRelsImages.find(strImageRelsPath); - if (m_mapImages.end() != pPair) + if (m_mapRelsImages.end() != pPair) { return pPair->second; } @@ -1756,7 +1760,7 @@ namespace NSBinPptxRW } } } - m_mapImages.insert(std::pair(strImageRelsPath, oRelsGeneratorInfo)); + m_mapRelsImages.insert(std::pair(strImageRelsPath, oRelsGeneratorInfo)); return oRelsGeneratorInfo; } diff --git a/OOXML/Binary/Presentation/BinaryFileReaderWriter.h b/OOXML/Binary/Presentation/BinaryFileReaderWriter.h index 8d4338d794..3c52744369 100644 --- a/OOXML/Binary/Presentation/BinaryFileReaderWriter.h +++ b/OOXML/Binary/Presentation/BinaryFileReaderWriter.h @@ -273,11 +273,13 @@ namespace NSBinPptxRW std::vector m_arMainTables; public: - _INT32 m_lCxCurShape; //emu - _INT32 m_lCyCurShape; + double m_dCxCurShape; //emu + double m_dCyCurShape; - _INT32 m_lXCurShape; - _INT32 m_lYCurShape; + double m_dXCurShape; + double m_dYCurShape; + + bool m_bInGroup = false; BYTE* GetBuffer(); virtual _UINT32 GetPosition(); @@ -468,7 +470,7 @@ namespace NSBinPptxRW { private: NSStringUtils::CStringBuilder* m_pWriter; - std::map m_mapImages; + std::map m_mapRelsImages; std::map m_mapLinks; public: unsigned int m_lNextRelsID; diff --git a/OOXML/Binary/Presentation/imagemanager.cpp b/OOXML/Binary/Presentation/imagemanager.cpp index b058280f4a..b450431349 100644 --- a/OOXML/Binary/Presentation/imagemanager.cpp +++ b/OOXML/Binary/Presentation/imagemanager.cpp @@ -527,10 +527,12 @@ namespace NSShapeImageGen CDirectory::CopyFile(strFileName, pathSaveItem.GetPath()); ::MetaFile::IMetaFile* pMetafile = MetaFile::Create(m_pFontManager->GetApplication()); + + pMetafile->SetImageSize(lWidth, lHeight); if (pMetafile->LoadFromFile(strFileName.c_str())) { // пробуем сохранить в svg напрямую из метафайлов - std::wstring sInternalSvg = pMetafile->ConvertToSvg(); + std::wstring sInternalSvg = pMetafile->ConvertToSvg(/*lWidth, lHeight*/); if (!sInternalSvg.empty()) { diff --git a/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h b/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h index f7469f9bac..b83bf9c7ea 100644 --- a/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h +++ b/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h @@ -47,9 +47,9 @@ namespace BinXlsxRW namespace c_oFileTypes{enum c_oFileTypes { XLSX = 1, - CSV = 2, - JSON = 3, - XLSB = 4 + CSV = 2, + JSON = 3, + XLSB = 4 };} @@ -238,6 +238,7 @@ namespace BinXlsxRW ExternalLinksAutoRefresh = 26, TimelineCaches = 27, TimelineCache = 28, + Metadata = 29 };} namespace c_oSerWorkbookProtection {enum c_oSerWorkbookProtection{ AlgorithmName = 0, @@ -662,6 +663,7 @@ namespace BinXlsxRW ChildChain = 5, NewThread = 6 };} +//------------------------------------------------------------------------------------------------------------------------------ namespace c_oSer_Timeline {enum c_oSer_Timeline { Name = 0, @@ -717,6 +719,116 @@ namespace BinXlsxRW Name = 0, TabId = 1 };} +//------------------------------------------------------------------------------------------------------------------------------ + namespace c_oSer_Metadata { enum c_oSer_Metadata + { + MetadataTypes = 0, + MetadataStrings = 1, + MdxMetadata = 2, + CellMetadata = 3, + ValueMetadata = 4, + FutureMetadata = 5, + };} + namespace c_oSer_MetadataType { enum c_oSer_MetadataType + { + MetadataType = 0, + Name = 1, + MinSupportedVersion = 2, + GhostRow = 3, + GhostCol = 4, + Edit = 5, + Delete = 6, + Copy = 7, + PasteAll = 8, + PasteFormulas = 9, + PasteValues = 10, + PasteFormats = 11, + PasteComments = 12, + PasteDataValidation = 13, + PasteBorders = 14, + PasteColWidths = 15, + PasteNumberFormats = 16, + Merge = 17, + SplitFirst = 18, + SplitAll = 19, + RowColShift = 30, + ClearAll = 21, + ClearFormats = 22, + ClearContents = 23, + ClearComments = 24, + Assign = 25, + Coerce = 26, + CellMeta = 27, + };} + namespace c_oSer_MetadataString {enum c_oSer_MetadataString + { + MetadataString = 0, + + };} + namespace c_oSer_MetadataBlock {enum c_oSer_MetadataBlock + { + MetadataBlock = 0, + MetadataRecord = 1, + MetadataRecordType = 2, + MetadataRecordValue = 3, + };} + namespace c_oSer_FutureMetadataBlock {enum c_oSer_FutureMetadataBlock + { + Name = 0, + FutureMetadataBlock = 1, + RichValueBlock = 2, + DynamicArrayProperties = 3, + DynamicArray = 4, + CollapsedArray = 5 + };} + namespace c_oSer_MdxMetadata {enum c_oSer_MdxMetadata + { + Mdx = 0, + NameIndex = 1, + FunctionTag = 2, + MdxTuple = 3, + MdxSet = 4, + MdxKPI = 5, + MdxMemeberProp = 6 + };} + namespace c_oSer_MetadataMdxTuple { enum c_oSer_MetadataMdxTuple + { + IndexCount = 0, + CultureCurrency = 1, + StringIndex = 2, + NumFmtIndex = 3, + BackColor = 4, + ForeColor = 5, + Italic = 6, + Underline = 7, + Strike = 8, + Bold = 9, + MetadataStringIndex = 10 + };} + namespace c_oSer_MetadataStringIndex {enum c_oSer_MetadataStringIndex + { + StringIsSet = 0, + IndexValue = 1 + };} + namespace c_oSer_MetadataMdxSet {enum c_oSer_MetadataMdxSet + { + Count = 0, + Index = 1, + SortOrder = 2, + MetadataStringIndex = 3 + };} + namespace c_oSer_MetadataMdxKPI {enum c_oSer_MetadataMdxKPI + { + NameIndex = 0, + Index = 1, + Property = 2 + };} + namespace c_oSer_MetadataMemberProperty {enum c_oSer_MetadataMemberProperty + { + NameIndex = 0, + Index = 1 + };} +//------------------------------------------------------------------------------------------------------------------------------ namespace c_oSerCustoms {enum c_oSerCustoms { Custom = 0, @@ -1241,12 +1353,14 @@ namespace BinXlsxRW Name = 2, Text = 3, User = 4, - UsersGroup = 5 + UsersGroup = 5, + Type = 6 };} namespace c_oSer_UserProtectedRangeDesc {enum c_oSer_UserProtectedRangeDesc { Id = 0, - Name = 1 + Name = 1, + Type = 2 };} namespace c_oSer_DataValidation{enum c_oSer_DataValidation { diff --git a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp index ba79f56c67..71ec17e991 100644 --- a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp +++ b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp @@ -71,6 +71,7 @@ #include "../../../XlsxFormat/Styles/dxf.h" #include "../../../XlsxFormat/Styles/TableStyles.h" #include "../../../XlsxFormat/Timelines/Timeline.h" +#include "../../../XlsxFormat/Workbook/Metadata.h" #include "../../../../DesktopEditor/common/Directory.h" @@ -2263,6 +2264,14 @@ void BinaryWorkbookTableWriter::WriteWorkbook(OOX::Spreadsheet::CWorkbook& workb m_oBcw.m_oStream.WriteStringW3(*workbook.m_oOleSize); m_oBcw.WriteItemWithLengthEnd(nCurPos); } + pFile = workbook.Find(OOX::Spreadsheet::FileTypes::Metadata); + OOX::Spreadsheet::CMetadataFile* pMetadataFile = dynamic_cast(pFile.GetPointer()); + if ((pMetadataFile) && (pMetadataFile->m_oMetadata.IsInit())) + { + nCurPos = m_oBcw.WriteItemStart(c_oSerWorkbookTypes::Metadata); + WriteMetadata(pMetadataFile->m_oMetadata.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } } void BinaryWorkbookTableWriter::WriteFileSharing(const OOX::Spreadsheet::CFileSharing& fileSharing) { @@ -3022,8 +3031,11 @@ void BinaryWorkbookTableWriter::WriteExternalReferences(const OOX::Spreadsheet:: smart_ptr pFile = pExternalLink->Find(OOX::RId(pExternalLink->m_oOleLink->m_oRid.get().GetValue())); if (pFile.IsInit() && OOX::FileTypes::OleObject == pFile->type()) { - OOX::OleObject* pLinkFile = static_cast(pFile.operator ->()); - sLink = pLinkFile->filename().GetPath(); + smart_ptr pLinkFile = pFile.smart_dynamic_cast(); + if (pLinkFile.IsInit()) + { + sLink = pLinkFile->filename().GetPath(); + } } } if (!sLink.empty()) @@ -3538,6 +3550,556 @@ void BinaryWorkbookTableWriter::WriteTimelineState(OOX::Spreadsheet::CTimelineSt m_oBcw.WriteItemWithLengthEnd(nCurPos); } } +void BinaryWorkbookTableWriter::WriteMetadata(OOX::Spreadsheet::CMetadata* pMetadata) +{ + if (!pMetadata) return; + + int nCurPos = 0; + if (pMetadata->m_oMetadataTypes.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_Metadata::MetadataTypes); + WriteMetadataTypes(pMetadata->m_oMetadataTypes.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadata->m_oMetadataTypes.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_Metadata::MetadataStrings); + WriteMetadataStrings(pMetadata->m_oMetadataStrings.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadata->m_oMdxMetadata.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_Metadata::MdxMetadata); + WriteMdxMetadata(pMetadata->m_oMdxMetadata.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadata->m_oCellMetadata.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_Metadata::CellMetadata); + WriteMetadataBlocks(pMetadata->m_oCellMetadata.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadata->m_oValueMetadata.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_Metadata::ValueMetadata); + WriteMetadataBlocks(pMetadata->m_oValueMetadata.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + for (size_t i = 0; i < pMetadata->m_arFutureMetadata.size(); ++i) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_Metadata::FutureMetadata); + WriteFutureMetadata(pMetadata->m_arFutureMetadata[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataTypes(OOX::Spreadsheet::CMetadataTypes* pMetadataTypes) +{ + if (!pMetadataTypes) return; + + for (size_t i = 0; i < pMetadataTypes->m_arrItems.size(); ++i) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::MetadataType); + WriteMetadataType(pMetadataTypes->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataType(OOX::Spreadsheet::CMetadataType* pMetadataType) +{ + if (!pMetadataType) return; + + if (pMetadataType->m_oName.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Name); + m_oBcw.m_oStream.WriteStringW3(*pMetadataType->m_oName); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oMinSupportedVersion.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::MinSupportedVersion); + m_oBcw.m_oStream.WriteULONG(*pMetadataType->m_oMinSupportedVersion); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oGhostRow.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::GhostRow); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oGhostRow); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oGhostCol.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::GhostCol); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oGhostCol); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oEdit.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Edit); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oEdit); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oDelete.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Delete); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oDelete); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oCopy.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Copy); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oCopy); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteAll.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteAll); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteAll); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteFormulas.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteFormulas); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteFormulas); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteValues.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteValues); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteValues); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteFormats.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteFormats); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteFormats); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteComments.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteComments); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteComments); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteDataValidation.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteDataValidation); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteDataValidation); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteBorders.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteBorders); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteBorders); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteColWidths.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteColWidths); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteColWidths); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteNumberFormats.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteNumberFormats); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteNumberFormats); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oMerge.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Merge); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oMerge); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oSplitFirst.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::SplitFirst); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oSplitFirst); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oSplitAll.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::SplitAll); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oSplitAll); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oRowColShift.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::RowColShift); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oRowColShift); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oClearAll.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::ClearAll); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oClearAll); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oClearFormats.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::ClearFormats); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oClearFormats); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oClearContents.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::ClearContents); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oClearContents); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oClearComments.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::ClearComments); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oClearComments); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oAssign.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Assign); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oAssign); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oCoerce.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Coerce); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oCoerce); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oCellMeta.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::CellMeta); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oCellMeta); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataStrings(OOX::Spreadsheet::CMetadataStrings* pMetadataStrings) +{ + if (!pMetadataStrings) return; + + for (size_t i = 0; i < pMetadataStrings->m_arrItems.size(); ++i) + { + if ((pMetadataStrings->m_arrItems[i]) && (pMetadataStrings->m_arrItems[i]->m_oV.IsInit())) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataString::MetadataString); + m_oBcw.m_oStream.WriteStringW3(pMetadataStrings->m_arrItems[i]->m_oV.get()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + } +} +void BinaryWorkbookTableWriter::WriteMdxMetadata(OOX::Spreadsheet::CMdxMetadata* pMdxMetadata) +{ + if (!pMdxMetadata) return; + + for (size_t i = 0; i < pMdxMetadata->m_arrItems.size(); ++i) + { + if (!pMdxMetadata->m_arrItems[i]) continue; + + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::Mdx); + WriteMdx(pMdxMetadata->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMdx(OOX::Spreadsheet::CMdx* pMdx) +{ + if (!pMdx) return; + + if (pMdx->m_oN.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::NameIndex); + m_oBcw.m_oStream.WriteULONG(*pMdx->m_oN); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdx->m_oF.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::FunctionTag); + m_oBcw.m_oStream.WriteBYTE(pMdx->m_oF->GetValue()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdx->m_oMdxTuple.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::MdxTuple); + WriteMdxTuple(pMdx->m_oMdxTuple.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdx->m_oMdxSet.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::MdxSet); + WriteMdxSet(pMdx->m_oMdxSet.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdx->m_oCMdxKPI.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::MdxKPI); + WriteMdxKPI(pMdx->m_oCMdxKPI.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdx->m_oMdxMemeberProp.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::MdxMemeberProp); + WriteMdxMemeberProp(pMdx->m_oMdxMemeberProp.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMdxTuple(OOX::Spreadsheet::CMdxTuple* pMdxTuple) +{ + if (!pMdxTuple) return; + + if (pMdxTuple->m_oC.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::IndexCount); + m_oBcw.m_oStream.WriteULONG(*pMdxTuple->m_oC); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oCt.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::CultureCurrency); + m_oBcw.m_oStream.WriteStringW3(*pMdxTuple->m_oCt); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oSi.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::StringIndex); + m_oBcw.m_oStream.WriteULONG(*pMdxTuple->m_oSi); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oFi.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::NumFmtIndex); + m_oBcw.m_oStream.WriteULONG(*pMdxTuple->m_oFi); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oBc.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::BackColor); + m_oBcw.m_oStream.WriteULONG(*pMdxTuple->m_oBc); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oFc.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::ForeColor); + m_oBcw.m_oStream.WriteULONG(*pMdxTuple->m_oFc); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oI.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::Italic); + m_oBcw.m_oStream.WriteBOOL(*pMdxTuple->m_oI); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oB.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::Bold); + m_oBcw.m_oStream.WriteBOOL(*pMdxTuple->m_oB); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oU.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::Underline); + m_oBcw.m_oStream.WriteBOOL(*pMdxTuple->m_oU); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oSt.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::Strike); + m_oBcw.m_oStream.WriteBOOL(*pMdxTuple->m_oSt); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + for (size_t i = 0; i < pMdxTuple->m_arrItems.size(); ++i) + { + if (!pMdxTuple->m_arrItems[i]) continue; + + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::MetadataStringIndex); + WriteMetadataStringIndex(pMdxTuple->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataStringIndex(OOX::Spreadsheet::CMetadataStringIndex* pStringIndex) +{ + if (!pStringIndex) return; + + if (pStringIndex->m_oX.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataStringIndex::IndexValue); + m_oBcw.m_oStream.WriteULONG(*pStringIndex->m_oX); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pStringIndex->m_oS.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataStringIndex::StringIsSet); + m_oBcw.m_oStream.WriteULONG(*pStringIndex->m_oS); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMdxSet(OOX::Spreadsheet::CMdxSet* pMdxSet) +{ + if (!pMdxSet) return; + + if (pMdxSet->m_oC.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxSet::Count); + m_oBcw.m_oStream.WriteULONG(*pMdxSet->m_oC); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxSet->m_oNs.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxSet::Index); + m_oBcw.m_oStream.WriteULONG(*pMdxSet->m_oNs); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxSet->m_oO.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxSet::SortOrder); + m_oBcw.m_oStream.WriteBYTE(pMdxSet->m_oO->GetValue()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + for (size_t i = 0; i < pMdxSet->m_arrItems.size(); ++i) + { + if (!pMdxSet->m_arrItems[i]) continue; + + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxSet::MetadataStringIndex); + WriteMetadataStringIndex(pMdxSet->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMdxKPI(OOX::Spreadsheet::CMdxKPI* pMdxKPI) +{ + if (!pMdxKPI) return; + + if (pMdxKPI->m_oN.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxKPI::NameIndex); + m_oBcw.m_oStream.WriteULONG(*pMdxKPI->m_oN); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxKPI->m_oNp.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxKPI::Index); + m_oBcw.m_oStream.WriteULONG(*pMdxKPI->m_oNp); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxKPI->m_oP.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxKPI::Property); + m_oBcw.m_oStream.WriteBYTE(pMdxKPI->m_oP->GetValue()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMdxMemeberProp(OOX::Spreadsheet::CMdxMemeberProp* pMdxMemeberProp) +{ + if (!pMdxMemeberProp) return; + + if (pMdxMemeberProp->m_oN.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMemberProperty::NameIndex); + m_oBcw.m_oStream.WriteULONG(*pMdxMemeberProp->m_oN); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxMemeberProp->m_oNp.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMemberProperty::Index); + m_oBcw.m_oStream.WriteULONG(*pMdxMemeberProp->m_oNp); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataBlocks(OOX::Spreadsheet::CMetadataBlocks* pMetadataBlocks) +{ + if (!pMetadataBlocks) return; + + for (size_t i = 0; i < pMetadataBlocks->m_arrItems.size(); ++i) + { + if (!pMetadataBlocks->m_arrItems[i]) continue; + + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataBlock::MetadataBlock); + WriteMetadataBlock(pMetadataBlocks->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataBlock(OOX::Spreadsheet::CMetadataBlock* pMetadataBlock) +{ + if (!pMetadataBlock) return; + + for (size_t i = 0; i < pMetadataBlock->m_arrItems.size(); ++i) + { + if (!pMetadataBlock->m_arrItems[i]) continue; + + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataBlock::MetadataRecord); + WriteMetadataRecord(pMetadataBlock->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataRecord(OOX::Spreadsheet::CMetadataRecord* pMetadataRecord) +{ + if (!pMetadataRecord) return; + + if (pMetadataRecord->m_oT.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataBlock::MetadataRecordType); + m_oBcw.m_oStream.WriteULONG(*pMetadataRecord->m_oT); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataRecord->m_oV.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataBlock::MetadataRecordValue); + m_oBcw.m_oStream.WriteULONG(*pMetadataRecord->m_oV); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteFutureMetadataBlock(OOX::Spreadsheet::CFutureMetadataBlock* pFutureMetadataBlock) +{ + if (!pFutureMetadataBlock) return; + if (false == pFutureMetadataBlock->m_oExtLst.IsInit()) return; + + for (size_t i = 0; i < pFutureMetadataBlock->m_oExtLst->m_arrExt.size(); ++i) + { + if (!pFutureMetadataBlock->m_oExtLst->m_arrExt[i]) continue; + + if (pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oDynamicArrayProperties.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_FutureMetadataBlock::DynamicArrayProperties); + { + if (pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oDynamicArrayProperties->m_oFDynamic.IsInit()) + { + int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_FutureMetadataBlock::DynamicArray); + m_oBcw.m_oStream.WriteBOOL(*pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oDynamicArrayProperties->m_oFDynamic); + m_oBcw.WriteItemWithLengthEnd(nCurPos2); + + } + if (pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oDynamicArrayProperties->m_oFCollapsed.IsInit()) + { + int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_FutureMetadataBlock::CollapsedArray); + m_oBcw.m_oStream.WriteBOOL(*pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oDynamicArrayProperties->m_oFCollapsed); + m_oBcw.WriteItemWithLengthEnd(nCurPos2); + } + } + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if ((pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oRichValueBlock.IsInit()) && + (pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oRichValueBlock->m_oI.IsInit())) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_FutureMetadataBlock::RichValueBlock); + m_oBcw.m_oStream.WriteULONG(*pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oRichValueBlock->m_oI); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + } +} +void BinaryWorkbookTableWriter::WriteFutureMetadata(OOX::Spreadsheet::CFutureMetadata* pFutureMetadata) +{ + if (!pFutureMetadata) return; + + if (pFutureMetadata->m_oName.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_FutureMetadataBlock::Name); + m_oBcw.m_oStream.WriteStringW3(*pFutureMetadata->m_oName); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + for (size_t i = 0; i < pFutureMetadata->m_arrItems.size(); ++i) + { + if (!pFutureMetadata->m_arrItems[i]) continue; + + int nCurPos = m_oBcw.WriteItemStart(c_oSer_FutureMetadataBlock::FutureMetadataBlock); + WriteFutureMetadataBlock(pFutureMetadata->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} + void BinaryWorkbookTableWriter::WriteTimelineRange(OOX::Spreadsheet::CTimelineRange* pTimelineRange) { if (!pTimelineRange) return; @@ -4014,18 +4576,21 @@ void BinaryWorksheetTableWriter::WriteWorksheet(OOX::Spreadsheet::CSheet* pSheet smart_ptr pFile = oWorksheet.Find(oWorksheet.m_oPicture->m_oId->GetValue()); if (pFile.IsInit() && ( OOX::FileTypes::Image == pFile->type())) { - OOX::Image* pImageFileCache = static_cast(pFile.GetPointer()); - OOX::CPath pathImage = pImageFileCache->filename(); - std::wstring additionalPath; - int additionalType = 0; - double dX = -1.0; //mm - double dY = -1.0; - double dW = -1.0; //mm - double dH = -1.0; - NSShapeImageGen::CMediaInfo oId = m_pOfficeDrawingConverter->m_pBinaryWriter->m_pCommon->m_pMediaManager->WriteImage(pathImage.GetPath(), dX, dY, dW, dH, additionalPath, additionalType); - nCurPos = m_oBcw.WriteItemStart(c_oSerWorksheetsTypes::Picture); - m_oBcw.m_oStream.WriteStringW3(oId.GetPath2()); - m_oBcw.WriteItemEnd(nCurPos); + smart_ptr pImageFileCache = pFile.smart_dynamic_cast(); + if (pImageFileCache.IsInit()) + { + OOX::CPath pathImage = pImageFileCache->filename(); + std::wstring additionalPath; + int additionalType = 0; + double dX = -1.0; //mm + double dY = -1.0; + double dW = -1.0; //mm + double dH = -1.0; + NSShapeImageGen::CMediaInfo oId = m_pOfficeDrawingConverter->m_pBinaryWriter->m_pCommon->m_pMediaManager->WriteImage(pathImage.GetPath(), dX, dY, dW, dH, additionalPath, additionalType); + nCurPos = m_oBcw.WriteItemStart(c_oSerWorksheetsTypes::Picture); + m_oBcw.m_oStream.WriteStringW3(oId.GetPath2()); + m_oBcw.WriteItemEnd(nCurPos); + } } } if (oWorksheet.m_oSortState.IsInit()) @@ -5264,7 +5829,8 @@ void BinaryWorksheetTableWriter::WriteOleObjects(const OOX::Spreadsheet::CWorksh olePic->blipFill.blip->oleFilepathBin = olePic->oleObject->m_OleObjectFile->filename().GetPath(); } - OOX::Image* pImageFileCache = NULL; + smart_ptr pImageFileCache; + std::wstring sIdImageFileCache; if ((NULL != pShapeElem) && (OOX::et_v_shapetype != pShapeElem->getType())) { @@ -5295,23 +5861,23 @@ void BinaryWorksheetTableWriter::WriteOleObjects(const OOX::Spreadsheet::CWorksh if (pFile.IsInit() && (OOX::FileTypes::Image == pFile->type())) { - pImageFileCache = static_cast(pFile.GetPointer()); + pImageFileCache = pFile.smart_dynamic_cast(); } } } } } - if (pImageFileCache == NULL && pOleObject->m_oObjectPr.IsInit() && pOleObject->m_oObjectPr->m_oRid.IsInit()) + if (pImageFileCache.IsInit() && pOleObject->m_oObjectPr.IsInit() && pOleObject->m_oObjectPr->m_oRid.IsInit()) { sIdImageFileCache = pOleObject->m_oObjectPr->m_oRid->GetValue(); smart_ptr pFile = oWorksheet.Find(sIdImageFileCache); if (pFile.IsInit() && (OOX::FileTypes::Image == pFile->type())) { - pImageFileCache = static_cast(pFile.GetPointer()); + pImageFileCache = pFile.smart_dynamic_cast(); } } - if (pImageFileCache) + if (pImageFileCache.IsInit()) { OOX::CPath pathImage = pImageFileCache->filename(); @@ -5884,6 +6450,11 @@ void BinaryWorksheetTableWriter::WriteDrawing(const OOX::Spreadsheet::CWorksheet WriteCellAnchor(pCellAnchor); + if (pCellAnchor->m_oExt.IsInit()) + { + m_oBcw.m_oStream.m_dCxCurShape = pCellAnchor->m_oExt->m_oCx.IsInit() ? pCellAnchor->m_oExt->m_oCx->GetValue() : 0; + m_oBcw.m_oStream.m_dCyCurShape = pCellAnchor->m_oExt->m_oCy.IsInit() ? pCellAnchor->m_oExt->m_oCy->GetValue() : 0; + } if (pCellAnchor->m_sVmlSpId.IsInit() && pVmlDrawing) { std::map::iterator pFind = pVmlDrawing->m_mapShapes.find(pCellAnchor->m_sVmlSpId.get2()); @@ -7437,6 +8008,12 @@ void BinaryWorksheetTableWriter::WriteUserProtectedRangeDesc(const OOX::Spreadsh m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable); m_oBcw.m_oStream.WriteStringW(*desc.name); } + if (desc.type.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_UserProtectedRangeDesc::Type); + m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte); + m_oBcw.m_oStream.WriteBYTE(desc.type->GetValue()); + } } void BinaryWorksheetTableWriter::WriteUserProtectedRange(const OOX::Spreadsheet::CUserProtectedRange& oUserProtectedRange) { @@ -7458,6 +8035,12 @@ void BinaryWorksheetTableWriter::WriteUserProtectedRange(const OOX::Spreadsheet: m_oBcw.m_oStream.WriteStringW(*oUserProtectedRange.m_oText); m_oBcw.WriteItemEnd(nCurPos); } + if (oUserProtectedRange.m_oType.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_UserProtectedRange::Type); + m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte); + m_oBcw.m_oStream.WriteBYTE(oUserProtectedRange.m_oType->GetValue()); + } for (size_t i = 0; i < oUserProtectedRange.m_arUsers.size(); ++i) { int nCurPos = m_oBcw.WriteItemStart(c_oSer_UserProtectedRange::User); diff --git a/OOXML/Binary/Sheets/Reader/BinaryWriter.h b/OOXML/Binary/Sheets/Reader/BinaryWriter.h index bead4217d9..f07dd9d740 100644 --- a/OOXML/Binary/Sheets/Reader/BinaryWriter.h +++ b/OOXML/Binary/Sheets/Reader/BinaryWriter.h @@ -84,6 +84,23 @@ namespace OOX class CTimelineStyle; class CTimelineStyles; class CTimelineStyleElement; + + class CMetadata; + class CFutureMetadata; + class CFutureMetadataBlock; + class CMetadataBlocks; + class CMetadataBlock; + class CMetadataRecord; + class CMetadataTypes; + class CMetadataType; + class CMdxMetadata; + class CMdxKPI; + class CMdxMemeberProp; + class CMdxTuple; + class CMdx; + class CMdxSet; + class CMetadataStrings; + class CMetadataStringIndex; } } @@ -188,6 +205,7 @@ namespace BinXlsxRW void WriteWorkbookView(const OOX::Spreadsheet::CWorkbookView& workbookView); void WriteDefinedNames(const OOX::Spreadsheet::CDefinedNames& definedNames); void WriteCalcPr(const OOX::Spreadsheet::CCalcPr& CCalcPr); + void WriteConnections(const OOX::Spreadsheet::CConnections& connections); void WriteConnection(const OOX::Spreadsheet::CConnection& connection); void WriteConnectionDbPr(const OOX::Spreadsheet::CDbPr& dbPr); @@ -197,6 +215,7 @@ namespace BinXlsxRW void WriteConnectionTextField(const OOX::Spreadsheet::CTextField& textField); void WriteConnectionWebPr(const OOX::Spreadsheet::CWebPr& webPr); void WriteConnectionRangePr(const OOX::Spreadsheet::CRangePr& rangePr); + void WriteExternalReferences(const OOX::Spreadsheet::CExternalReferences& externalReferences, OOX::Spreadsheet::CWorkbook& workbook); void WriteExternalBook(const OOX::Spreadsheet::CExternalBook& externalBook, OOX::Spreadsheet::CExternalLink* pExternalLink); void WriteExternalAlternateUrls(const OOX::Spreadsheet::CAlternateUrls& alternateUrls, OOX::Spreadsheet::CExternalLink* pExternalLink); @@ -207,6 +226,7 @@ namespace BinXlsxRW void WriteExternalSheetData(const OOX::Spreadsheet::CExternalSheetData& sheetData); void WriteExternalRow(const OOX::Spreadsheet::CExternalRow& row); void WriteExternalCell(const OOX::Spreadsheet::CExternalCell& cell); + void WriteOleLink(const OOX::Spreadsheet::COleLink& oleLink, const std::wstring& sLink); void WriteOleItem(const OOX::Spreadsheet::COleItem& oleItem); void WriteDdeLink(const OOX::Spreadsheet::CDdeLink& ddeLink); @@ -216,6 +236,7 @@ namespace BinXlsxRW void WriteDefinedName(const OOX::Spreadsheet::CDefinedName& definedName); void WriteSlicerCaches(OOX::Spreadsheet::CWorkbook& workbook, const OOX::Spreadsheet::CSlicerCaches& oSlicerCaches); void WriteFileSharing(const OOX::Spreadsheet::CFileSharing& fileSharing); + void WriteTimelineCaches(OOX::Spreadsheet::CWorkbook& workbook, const OOX::Spreadsheet::CTimelineCacheRefs& oTimelineCacheRefs); void WriteTimelineCache(OOX::Spreadsheet::CTimelineCacheDefinition* pTimelineCache); void WriteTimelineState(OOX::Spreadsheet::CTimelineState* pState); @@ -224,6 +245,22 @@ namespace BinXlsxRW void WriteTimelineCachePivotTable(OOX::Spreadsheet::CTimelineCachePivotTable* pPivotTable); void WriteTimelineRange(OOX::Spreadsheet::CTimelineRange* pTimelineRange); + void WriteMetadata(OOX::Spreadsheet::CMetadata* pMetadata); + void WriteMetadataTypes(OOX::Spreadsheet::CMetadataTypes* pMetadataTypes); + void WriteMetadataType(OOX::Spreadsheet::CMetadataType* pMetadataType); + void WriteMetadataStrings(OOX::Spreadsheet::CMetadataStrings* pMetadataStrings); + void WriteMdxMetadata(OOX::Spreadsheet::CMdxMetadata* pMdxMetadata); + void WriteMdx(OOX::Spreadsheet::CMdx* pMdx); + void WriteMetadataBlocks(OOX::Spreadsheet::CMetadataBlocks* pMetadataBlocks); + void WriteMetadataBlock(OOX::Spreadsheet::CMetadataBlock* pMetadataBlock); + void WriteMetadataRecord(OOX::Spreadsheet::CMetadataRecord* pMetadataRecord); + void WriteFutureMetadata(OOX::Spreadsheet::CFutureMetadata* pMetadata); + void WriteFutureMetadataBlock(OOX::Spreadsheet::CFutureMetadataBlock* pMetadataBlock); + void WriteMdxTuple(OOX::Spreadsheet::CMdxTuple* pMdxTuple); + void WriteMdxSet(OOX::Spreadsheet::CMdxSet* pMdxSet); + void WriteMdxKPI(OOX::Spreadsheet::CMdxKPI* pMdxKPI); + void WriteMdxMemeberProp(OOX::Spreadsheet::CMdxMemeberProp* pMdxMemeberProp); + void WriteMetadataStringIndex(OOX::Spreadsheet::CMetadataStringIndex* pStringIndex); }; class BinaryPersonTableWriter { diff --git a/OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp b/OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp index 67eb2a9217..d3c8a75654 100644 --- a/OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp +++ b/OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp @@ -7033,11 +7033,13 @@ namespace BinXlsxRW if (c_oserct_chartExBinningBINSIZE == type) { - pBinning->m_binSize = m_oBufferedStream.GetDoubleReal(); + pBinning->m_binSize.Init(); + pBinning->m_binSize->m_oVal = m_oBufferedStream.GetDoubleReal(); } else if (c_oserct_chartExBinningBINCOUNT == type) { - pBinning->m_binCount = m_oBufferedStream.GetLong(); + pBinning->m_binCount.Init(); + pBinning->m_binCount->m_oVal = m_oBufferedStream.GetLong(); } else if (c_oserct_chartExBinningINTERVAL == type) { @@ -12604,16 +12606,16 @@ namespace BinXlsxRW } void BinaryChartWriter::WriteCT_ChartExBinning(OOX::Spreadsheet::ChartEx::CBinning *pVal) { - if (pVal->m_binSize.IsInit()) + if ((pVal->m_binSize.IsInit()) && (pVal->m_binSize->m_oVal.IsInit())) { int nCurPos = m_oBcw.WriteItemStart(c_oserct_chartExBinningBINSIZE); - m_oBcw.m_oStream.WriteDoubleReal(*pVal->m_binSize); + m_oBcw.m_oStream.WriteDoubleReal(pVal->m_binSize->m_oVal->GetValue()); m_oBcw.WriteItemEnd(nCurPos); } - if (pVal->m_binCount.IsInit()) + if ((pVal->m_binCount.IsInit()) && (pVal->m_binCount->m_oVal.IsInit())) { int nCurPos = m_oBcw.WriteItemStart(c_oserct_chartExBinningBINCOUNT); - m_oBcw.m_oStream.WriteLONG(*pVal->m_binCount); + m_oBcw.m_oStream.WriteLONG(*pVal->m_binCount->m_oVal); m_oBcw.WriteItemEnd(nCurPos); } if (pVal->m_intervalClosed.IsInit()) diff --git a/OOXML/Binary/Sheets/Writer/BinaryReader.cpp b/OOXML/Binary/Sheets/Writer/BinaryReader.cpp index 97367b858f..95fb29a792 100644 --- a/OOXML/Binary/Sheets/Writer/BinaryReader.cpp +++ b/OOXML/Binary/Sheets/Writer/BinaryReader.cpp @@ -73,6 +73,7 @@ #include "../../../XlsxFormat/Table/Connections.h" #include "../../../XlsxFormat/Controls/Controls.h" #include "../../../XlsxFormat/Timelines/Timeline.h" +#include "../../../XlsxFormat/Workbook/Metadata.h" #include "../../../DocxFormat/Media/VbaProject.h" #include "../../../DocxFormat/Media/JsaProject.h" @@ -2324,6 +2325,15 @@ int BinaryWorkbookTableReader::ReadWorkbookTableContent(BYTE type, long length, m_oWorkbook.m_oExtLst.Init(); m_oWorkbook.m_oExtLst->m_arrExt.push_back(pOfficeArtExtension); } + else if (c_oSerWorkbookTypes::Metadata == type) + { + smart_ptr oMetadataFile(new OOX::Spreadsheet::CMetadataFile(NULL)); + oMetadataFile->m_oMetadata.Init(); + READ1_DEF(length, res, this->ReadMetadata, oMetadataFile->m_oMetadata.GetPointer()); + + smart_ptr oFile = oMetadataFile.smart_dynamic_cast(); + m_oWorkbook.Add(oFile); + } else res = c_oSerConstants::ReadUnknown; return res; @@ -6834,6 +6844,11 @@ int BinaryWorksheetsTableReader::ReadUserProtectedRangeDesc(BYTE type, long leng { desc->id = m_oBufferedStream.GetString4(length); } + else if (c_oSer_UserProtectedRangeDesc::Type == type) + { + desc->type.Init(); + desc->type->SetValueFromByte(m_oBufferedStream.GetUChar()); + } else res = c_oSerConstants::ReadUnknown; return res; @@ -6854,6 +6869,11 @@ int BinaryWorksheetsTableReader::ReadUserProtectedRange(BYTE type, long length, { pUserProtectedRange->m_oText = m_oBufferedStream.GetString4(length); } + else if (c_oSer_UserProtectedRange::Type == type) + { + pUserProtectedRange->m_oType.Init(); + pUserProtectedRange->m_oType->SetValueFromByte(m_oBufferedStream.GetUChar()); + } else if (c_oSer_UserProtectedRange::User == type) { OOX::Spreadsheet::CUserProtectedRange::_UsersGroupsDesc desc; @@ -7916,6 +7936,501 @@ int BinaryCustomsReader::ReadCustomContent(BYTE type, long length, void* poResul res = c_oSerConstants::ReadUnknown; return res; } +int BinaryWorkbookTableReader::ReadMetadata(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadata* pMetadata = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_Metadata::MetadataTypes == type) + { + pMetadata->m_oMetadataTypes.Init(); + READ1_DEF(length, res, this->ReadMetadataTypes, pMetadata->m_oMetadataTypes.GetPointer()); + } + else if (c_oSer_Metadata::MetadataStrings == type) + { + pMetadata->m_oMetadataStrings.Init(); + READ1_DEF(length, res, this->ReadMetadataStrings, pMetadata->m_oMetadataStrings.GetPointer()); + } + else if (c_oSer_Metadata::MdxMetadata == type) + { + pMetadata->m_oMdxMetadata.Init(); + READ1_DEF(length, res, this->ReadMdxMetadata, pMetadata->m_oMdxMetadata.GetPointer()); + } + else if (c_oSer_Metadata::CellMetadata == type) + { + pMetadata->m_oCellMetadata.Init(); + READ1_DEF(length, res, this->ReadMetadataBlocks, pMetadata->m_oCellMetadata.GetPointer()); + } + else if (c_oSer_Metadata::ValueMetadata == type) + { + pMetadata->m_oValueMetadata.Init(); + READ1_DEF(length, res, this->ReadMetadataBlocks, pMetadata->m_oValueMetadata.GetPointer()); + } + else if (c_oSer_Metadata::FutureMetadata == type) + { + OOX::Spreadsheet::CFutureMetadata* pFutureMetadata = new OOX::Spreadsheet::CFutureMetadata(); + READ1_DEF(length, res, this->ReadFutureMetadata, pFutureMetadata); + pMetadata->m_arFutureMetadata.push_back(pFutureMetadata); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataTypes(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadataTypes* pMetadataTypes = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataType::MetadataType == type) + { + OOX::Spreadsheet::CMetadataType* pMetadataType = new OOX::Spreadsheet::CMetadataType(); + READ1_DEF(length, res, this->ReadMetadataType, pMetadataType); + pMetadataTypes->m_arrItems.push_back(pMetadataType); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataType(BYTE type, long length, void* poResult) +{ + int res = c_oSerConstants::ReadOk; + OOX::Spreadsheet::CMetadataType* pMetadataType = static_cast(poResult); + + if (c_oSer_MetadataType::Name == type) + { + pMetadataType->m_oName = m_oBufferedStream.GetString3(length); + } + else if (c_oSer_MetadataType::MinSupportedVersion == type) + { + pMetadataType->m_oMinSupportedVersion = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataType::GhostRow == type) + { + pMetadataType->m_oGhostRow = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::GhostCol == type) + { + pMetadataType->m_oGhostCol = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::Edit == type) + { + pMetadataType->m_oEdit = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::Delete == type) + { + pMetadataType->m_oDelete = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::Copy == type) + { + pMetadataType->m_oCopy = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteAll == type) + { + pMetadataType->m_oPasteAll = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteFormulas == type) + { + pMetadataType->m_oPasteFormulas = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteValues == type) + { + pMetadataType->m_oPasteValues = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteFormats == type) + { + pMetadataType->m_oPasteFormats = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteComments == type) + { + pMetadataType->m_oPasteComments = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteDataValidation == type) + { + pMetadataType->m_oPasteDataValidation = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteBorders == type) + { + pMetadataType->m_oPasteBorders = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteColWidths == type) + { + pMetadataType->m_oPasteColWidths = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteNumberFormats == type) + { + pMetadataType->m_oPasteNumberFormats = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::Merge == type) + { + pMetadataType->m_oMerge = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::SplitFirst == type) + { + pMetadataType->m_oSplitFirst = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::SplitAll == type) + { + pMetadataType->m_oSplitAll = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::RowColShift == type) + { + pMetadataType->m_oRowColShift = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::ClearAll == type) + { + pMetadataType->m_oClearAll = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::ClearFormats == type) + { + pMetadataType->m_oClearFormats = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::ClearContents == type) + { + pMetadataType->m_oClearContents = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::ClearComments == type) + { + pMetadataType->m_oClearComments = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::Assign == type) + { + pMetadataType->m_oAssign = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::Coerce == type) + { + pMetadataType->m_oCoerce = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::CellMeta == type) + { + pMetadataType->m_oCellMeta = m_oBufferedStream.GetBool(); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataStrings(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadataStrings* pMetadataStrings = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataString::MetadataString == type) + { + OOX::Spreadsheet::CMetadataString* pMetadataString = new OOX::Spreadsheet::CMetadataString(); + pMetadataString->m_oV = m_oBufferedStream.GetString3(length); + pMetadataStrings->m_arrItems.push_back(pMetadataString); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMdxMetadata(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMdxMetadata* pMdxMetadata = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MdxMetadata::Mdx == type) + { + OOX::Spreadsheet::CMdx* pMdx = new OOX::Spreadsheet::CMdx(); + READ1_DEF(length, res, this->ReadMdx, pMdx); + pMdxMetadata->m_arrItems.push_back(pMdx); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMdx(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMdx* pMdx = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MdxMetadata::NameIndex == type) + { + pMdx->m_oN = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MdxMetadata::FunctionTag == type) + { + pMdx->m_oF.Init(); + pMdx->m_oF->SetValueFromByte(m_oBufferedStream.GetUChar()); + } + else if (c_oSer_MdxMetadata::MdxTuple == type) + { + pMdx->m_oMdxTuple.Init(); + READ1_DEF(length, res, this->ReadMdxTuple, pMdx->m_oMdxTuple.GetPointer()); + } + else if (c_oSer_MdxMetadata::MdxSet == type) + { + pMdx->m_oMdxSet.Init(); + READ1_DEF(length, res, this->ReadMdxSet, pMdx->m_oMdxSet.GetPointer()); + } + else if (c_oSer_MdxMetadata::MdxKPI == type) + { + pMdx->m_oCMdxKPI.Init(); + READ1_DEF(length, res, this->ReadMdxKPI, pMdx->m_oCMdxKPI.GetPointer()); + } + else if (c_oSer_MdxMetadata::MdxMemeberProp == type) + { + pMdx->m_oMdxMemeberProp.Init(); + READ1_DEF(length, res, this->ReadMdxMemeberProp, pMdx->m_oMdxMemeberProp.GetPointer()); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataBlocks(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadataBlocks* pMetadataBlocks = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataBlock::MetadataBlock == type) + { + OOX::Spreadsheet::CMetadataBlock* pMetadataBlock = new OOX::Spreadsheet::CMetadataBlock(); + READ1_DEF(length, res, this->ReadMetadataBlock, pMetadataBlock); + pMetadataBlocks->m_arrItems.push_back(pMetadataBlock); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataBlock(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadataBlock* pMetadataBlock = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataBlock::MetadataRecord == type) + { + OOX::Spreadsheet::CMetadataRecord* pMetadataRecord = new OOX::Spreadsheet::CMetadataRecord(); + READ1_DEF(length, res, this->ReadMetadataRecord, pMetadataRecord); + pMetadataBlock->m_arrItems.push_back(pMetadataRecord); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataRecord(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadataRecord* pMetadataRecord = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataBlock::MetadataRecordType == type) + { + pMetadataRecord->m_oT = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataBlock::MetadataRecordValue == type) + { + pMetadataRecord->m_oV = m_oBufferedStream.GetULong(); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadDynamicArrayProperties(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CDynamicArrayProperties* pDynamicArrayProperties = static_cast(poResult); + int res = c_oSerConstants::ReadOk; + + if (c_oSer_FutureMetadataBlock::DynamicArray == type) + { + pDynamicArrayProperties->m_oFDynamic = m_oBufferedStream.GetBool(); + } + else if (c_oSer_FutureMetadataBlock::CollapsedArray == type) + { + pDynamicArrayProperties->m_oFCollapsed = m_oBufferedStream.GetBool(); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataStringIndex(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadataStringIndex* pStringIndex = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataStringIndex::StringIsSet == type) + { + pStringIndex->m_oS = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataStringIndex::IndexValue == type) + { + pStringIndex->m_oX = m_oBufferedStream.GetULong(); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMdxMemeberProp(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMdxMemeberProp* pMdxMemeberProp = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataMemberProperty::NameIndex == type) + { + pMdxMemeberProp->m_oN = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMemberProperty::Index == type) + { + pMdxMemeberProp->m_oNp = m_oBufferedStream.GetULong(); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMdxKPI(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMdxKPI* pMdxKPI = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataMdxKPI::NameIndex == type) + { + pMdxKPI->m_oN = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxKPI::Index == type) + { + pMdxKPI->m_oNp = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxKPI::Property == type) + { + pMdxKPI->m_oP.Init(); + pMdxKPI->m_oP->SetValueFromByte(m_oBufferedStream.GetUChar()); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMdxSet(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMdxSet* pMdxSet = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataMdxSet::Count == type) + { + pMdxSet->m_oC = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxSet::Index == type) + { + pMdxSet->m_oNs = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxSet::SortOrder == type) + { + pMdxSet->m_oO.Init(); + pMdxSet->m_oO->SetValueFromByte(m_oBufferedStream.GetUChar()); + } + else if (c_oSer_MetadataMdxSet::MetadataStringIndex == type) + { + OOX::Spreadsheet::CMetadataStringIndex* pMetadataStringIndex = new OOX::Spreadsheet::CMetadataStringIndex(); + READ1_DEF(length, res, this->ReadMetadataStringIndex, pMetadataStringIndex); + pMdxSet->m_arrItems.push_back(pMetadataStringIndex); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMdxTuple(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMdxTuple* pMdxTuple = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataMdxTuple::IndexCount == type) + { + pMdxTuple->m_oC = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxTuple::StringIndex == type) + { + pMdxTuple->m_oSi = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxTuple::CultureCurrency == type) + { + pMdxTuple->m_oCt = m_oBufferedStream.GetString3(length); + } + else if (c_oSer_MetadataMdxTuple::NumFmtIndex == type) + { + pMdxTuple->m_oFi = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxTuple::BackColor == type) + { + pMdxTuple->m_oBc = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxTuple::ForeColor == type) + { + pMdxTuple->m_oFc = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxTuple::Italic == type) + { + pMdxTuple->m_oI = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataMdxTuple::Bold == type) + { + pMdxTuple->m_oB = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataMdxTuple::Underline == type) + { + pMdxTuple->m_oU = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataMdxTuple::Strike == type) + { + pMdxTuple->m_oSt = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataMdxTuple::MetadataStringIndex == type) + { + OOX::Spreadsheet::CMetadataStringIndex* pMetadataStringIndex = new OOX::Spreadsheet::CMetadataStringIndex(); + READ1_DEF(length, res, this->ReadMetadataStringIndex, pMetadataStringIndex); + pMdxTuple->m_arrItems.push_back(pMetadataStringIndex); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadFutureMetadata(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CFutureMetadata* pCFutureMetadata = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + + if (c_oSer_FutureMetadataBlock::Name == type) + { + pCFutureMetadata->m_oName = m_oBufferedStream.GetString3(length); + } + else if (c_oSer_FutureMetadataBlock::FutureMetadataBlock == type) + { + OOX::Spreadsheet::CFutureMetadataBlock* pFutureMetadataBlock = new OOX::Spreadsheet::CFutureMetadataBlock(); + READ1_DEF(length, res, this->ReadFutureMetadataBlock, pFutureMetadataBlock); + pCFutureMetadata->m_arrItems.push_back(pFutureMetadataBlock); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadFutureMetadataBlock(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CFutureMetadataBlock* pFutureMetadataBlock = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_FutureMetadataBlock::RichValueBlock == type) + { + if (false == pFutureMetadataBlock->m_oExtLst.IsInit()) pFutureMetadataBlock->m_oExtLst.Init(); + + OOX::Drawing::COfficeArtExtension* pExt = new OOX::Drawing::COfficeArtExtension(); + pExt->m_sUri = L"{3e2802c4-a4d2-4d8b-9148-e3be6c30e623}"; + pExt->m_oRichValueBlock.Init(); + pExt->m_oRichValueBlock->m_oI = m_oBufferedStream.GetULong(); + + pFutureMetadataBlock->m_oExtLst->m_arrExt.push_back(pExt); + } + else if (c_oSer_FutureMetadataBlock::DynamicArrayProperties == type) + { + if (false == pFutureMetadataBlock->m_oExtLst.IsInit()) pFutureMetadataBlock->m_oExtLst.Init(); + + OOX::Drawing::COfficeArtExtension* pExt = new OOX::Drawing::COfficeArtExtension(); + pExt->m_sUri = L"{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}"; + pExt->m_oDynamicArrayProperties.Init(); + + READ1_DEF(length, res, this->ReadDynamicArrayProperties, pExt->m_oDynamicArrayProperties.GetPointer()); + pFutureMetadataBlock->m_oExtLst->m_arrExt.push_back(pExt); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} + //------------------------------------------------------------------------------------------------------------------------------------ BinaryFileReader::BinaryFileReader() { @@ -8119,7 +8634,7 @@ int BinaryFileReader::ReadFile(const std::wstring& sSrcFileName, std::wstring sD if (NULL != pData) { - // File Type + // File Type std::wstring sDstPathCSV = sDstPath; BYTE fileType; UINT nCodePage; @@ -8127,8 +8642,8 @@ int BinaryFileReader::ReadFile(const std::wstring& sSrcFileName, std::wstring sD BYTE saveFileType; SerializeCommon::ReadFileType(sXMLOptions, fileType, nCodePage, sDelimiter, saveFileType); - // Делаем для CSV перебивку пути, иначе создается папка с одинаковым имеем (для rels) и файл не создается. - + // Делаем для CSV перебивку пути, иначе создается папка с одинаковым имеем (для rels) и файл не создается. + if (BinXlsxRW::c_oFileTypes::CSV == fileType) { sDstPath = pOfficeDrawingConverter->GetTempPath(); @@ -8137,36 +8652,55 @@ int BinaryFileReader::ReadFile(const std::wstring& sSrcFileName, std::wstring sD sDstPath = NSDirectory::CreateDirectoryWithUniqueName(sDstPath); } - - OOX::Spreadsheet::CXlsx oXlsx; - + std::wstring themePath = sDstPath + FILE_SEPARATOR_STR + OOX::Spreadsheet::FileTypes::Workbook.DefaultDirectory().GetPath() + FILE_SEPARATOR_STR + OOX::FileTypes::Theme.DefaultDirectory().GetPath(); std::wstring drawingsPath = sDstPath + FILE_SEPARATOR_STR + OOX::Spreadsheet::FileTypes::Workbook.DefaultDirectory().GetPath() + FILE_SEPARATOR_STR + OOX::Spreadsheet::FileTypes::Drawings.DefaultDirectory().GetPath(); std::wstring embeddingsPath = sDstPath + FILE_SEPARATOR_STR + OOX::Spreadsheet::FileTypes::Workbook.DefaultDirectory().GetPath() + FILE_SEPARATOR_STR + OOX::FileTypes::MicrosoftOfficeUnknown.DefaultDirectory().GetPath(); std::wstring chartsPath = sDstPath + FILE_SEPARATOR_STR + OOX::Spreadsheet::FileTypes::Workbook.DefaultDirectory().GetPath() + FILE_SEPARATOR_STR + OOX::FileTypes::Chart.DefaultDirectory().GetPath(); oBufferedStream.m_pRels->m_pManager->SetDstCharts(chartsPath); - + bResultOk = true; - + if (BinXlsxRW::c_oFileTypes::XLSX == fileType) { + OOX::Spreadsheet::CXlsx oXlsx; SaveParams oSaveParams(drawingsPath, embeddingsPath, themePath, pOfficeDrawingConverter->GetContentTypes(), NULL, bMacro); - + try { ReadMainTable(oXlsx, oBufferedStream, OOX::CPath(sSrcFileName).GetDirectory(), sDstPath, oSaveParams, pOfficeDrawingConverter); } - catch(...) + catch (...) { bResultOk = false; } - + oXlsx.PrepareToWrite(); oXlsx.Write(sDstPath, *oSaveParams.pContentTypes); } + else if (BinXlsxRW::c_oFileTypes::XLSB == fileType) + { + OOX::Spreadsheet::CXlsb oXlsb; + oXlsb.m_bWriteToXlsb = true; + + SaveParams oSaveParams(drawingsPath, embeddingsPath, themePath, pOfficeDrawingConverter->GetContentTypes(), NULL, bMacro); + + try + { + ReadMainTable(oXlsb, oBufferedStream, OOX::CPath(sSrcFileName).GetDirectory(), sDstPath, oSaveParams, pOfficeDrawingConverter); + } + catch (...) + { + bResultOk = false; + } + + oXlsb.PrepareToWrite(); + oXlsb.WriteBin(sDstPath, *oSaveParams.pContentTypes); + } else { + OOX::Spreadsheet::CXlsx oXlsx; CSVWriter oCSVWriter; oCSVWriter.Init(oXlsx, nCodePage, sDelimiter, false); diff --git a/OOXML/Binary/Sheets/Writer/BinaryReader.h b/OOXML/Binary/Sheets/Writer/BinaryReader.h index 3ad6d9a7a9..17ede45e95 100644 --- a/OOXML/Binary/Sheets/Writer/BinaryReader.h +++ b/OOXML/Binary/Sheets/Writer/BinaryReader.h @@ -219,6 +219,7 @@ namespace BinXlsxRW int ReadDefinedNames(BYTE type, long length, void* poResult); int ReadDefinedName(BYTE type, long length, void* poResult); int ReadCalcPr(BYTE type, long length, void* poResult); + int ReadExternalBook(BYTE type, long length, void* poResult); int ReadExternalSheetNames(BYTE type, long length, void* poResult); int ReadExternalDefinedNames(BYTE type, long length, void* poResult); @@ -228,6 +229,7 @@ namespace BinXlsxRW int ReadExternalRow(BYTE type, long length, void* poResult); int ReadExternalCell(BYTE type, long length, void* poResult); int ReadExternalAlternateUrls(BYTE type, long length, void* poResult); + int ReadOleLink(BYTE type, long length, void* poResult); int ReadOleItem(BYTE type, long length, void* poResult); int ReadDdeLink(BYTE type, long length, void* poResult); @@ -236,6 +238,7 @@ namespace BinXlsxRW int ReadDdeValue(BYTE type, long length, void* poResult); int ReadPivotCaches(BYTE type, long length, void* poResult); int ReadPivotCache(BYTE type, long length, void* poResult); + int ReadConnections(BYTE type, long length, void* poResult); int ReadConnection(BYTE type, long length, void* poResult); int ReadConnectionDbPr(BYTE type, long length, void* poResult); @@ -245,7 +248,9 @@ namespace BinXlsxRW int ReadConnectionRangePr(BYTE type, long length, void* poResult); int ReadConnectionTextFields(BYTE type, long length, void* poResult); int ReadConnectionTextField(BYTE type, long length, void* poResult); + int ReadSlicerCaches(BYTE type, long length, void* poResult); + int ReadTimelineCaches(BYTE type, long length, void* poResult); int ReadTimelineCache(BYTE type, long length, void* poResult); int ReadTimelineState(BYTE type, long length, void* poResult); @@ -253,6 +258,24 @@ namespace BinXlsxRW int ReadTimelineCachePivotTables(BYTE type, long length, void* poResult); int ReadTimelineCachePivotTable(BYTE type, long length, void* poResult); int ReadTimelineRange(BYTE type, long length, void* poResult); + + int ReadMetadata(BYTE type, long length, void* poResult); + int ReadMetadataTypes(BYTE type, long length, void* poResult); + int ReadMetadataType(BYTE type, long length, void* poResult); + int ReadMetadataStrings(BYTE type, long length, void* poResult); + int ReadMdxMetadata(BYTE type, long length, void* poResult); + int ReadMdx(BYTE type, long length, void* poResult); + int ReadMetadataBlocks(BYTE type, long length, void* poResult); + int ReadMetadataBlock(BYTE type, long length, void* poResult); + int ReadMetadataRecord(BYTE type, long length, void* poResult); + int ReadFutureMetadata(BYTE type, long length, void* poResult); + int ReadFutureMetadataBlock(BYTE type, long length, void* poResult); + int ReadMdxTuple(BYTE type, long length, void* poResult); + int ReadMdxSet(BYTE type, long length, void* poResult); + int ReadMdxKPI(BYTE type, long length, void* poResult); + int ReadMdxMemeberProp(BYTE type, long length, void* poResult); + int ReadMetadataStringIndex(BYTE type, long length, void* poResult); + int ReadDynamicArrayProperties(BYTE type, long length, void* poResult); }; class BinaryCommentReader : public Binary_CommonReader { diff --git a/OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h b/OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h index e6e53f35b3..f52d79a2ec 100644 --- a/OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h +++ b/OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h @@ -31,7 +31,7 @@ */ #pragma once -#include "../DocxFormat/FileType.h" +#include "../../DocxFormat/FileType.h" namespace OOX @@ -39,10 +39,10 @@ namespace OOX namespace SpreadsheetBin { namespace FileTypes - { + { const FileType WorkbookBin (L"xl", L"workbook.bin", - L"application/vnd.ms-excel.main", + L"application/vnd.ms-excel.sheet.binary.macroEnabled.main", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"); const FileType SharedStringsBin (L"", L"sharedStrings.bin", diff --git a/OOXML/Common/SimpleTypes_Drawing.cpp b/OOXML/Common/SimpleTypes_Drawing.cpp index f30ec34625..64d8902a90 100644 --- a/OOXML/Common/SimpleTypes_Drawing.cpp +++ b/OOXML/Common/SimpleTypes_Drawing.cpp @@ -5324,7 +5324,7 @@ namespace SimpleTypes EHierBranch CHierBranch::FromString(const std::wstring &sValue) { - if (L"none" == sValue) this->m_eValue = hierBranch_hang; + if (L"hang" == sValue) this->m_eValue = hierBranch_hang; else if (L"init" == sValue) this->m_eValue = hierBranch_init; else if (L"l" == sValue) this->m_eValue = hierBranch_l; else if (L"r" == sValue) this->m_eValue = hierBranch_r; diff --git a/OOXML/Common/SimpleTypes_Spreadsheet.cpp b/OOXML/Common/SimpleTypes_Spreadsheet.cpp index 9373dd4aa6..24d91f3e28 100644 --- a/OOXML/Common/SimpleTypes_Spreadsheet.cpp +++ b/OOXML/Common/SimpleTypes_Spreadsheet.cpp @@ -3291,5 +3291,129 @@ namespace SimpleTypes } return L"unselectedItemWithData"; } + + EMdxKPIProperty CMdxKPIProperty::FromString(const std::wstring& sValue) + { + if (L"v" == sValue) + this->m_eValue = mdxKPIProperty_v; + else if (L"g" == sValue) + this->m_eValue = mdxKPIProperty_g; + else if (L"s" == sValue) + this->m_eValue = mdxKPIProperty_s; + else if (L"t" == sValue) + this->m_eValue = mdxKPIProperty_t; + else if (L"w" == sValue) + this->m_eValue = mdxKPIProperty_w; + else if (L"m" == sValue) + this->m_eValue = mdxKPIProperty_m; + else + this->m_eValue = mdxKPIProperty_v; + return this->m_eValue; + } + std::wstring CMdxKPIProperty::ToString() const + { + switch (this->m_eValue) + { + case mdxKPIProperty_v: return L"v"; break; + case mdxKPIProperty_g: return L"g"; break; + case mdxKPIProperty_s: return L"s"; break; + case mdxKPIProperty_t: return L"t"; break; + case mdxKPIProperty_w: return L"w"; break; + case mdxKPIProperty_m: return L"m"; break; + } + return L"v"; + } + + EMdxSetOrder CMdxSetOrder::FromString(const std::wstring& sValue) + { + if (L"u" == sValue) + this->m_eValue = mdxSetOrder_u; + else if (L"a" == sValue) + this->m_eValue = mdxSetOrder_a; + else if (L"d" == sValue) + this->m_eValue = mdxSetOrder_d; + else if (L"aa" == sValue) + this->m_eValue = mdxSetOrder_aa; + else if (L"ad" == sValue) + this->m_eValue = mdxSetOrder_ad; + else if (L"na" == sValue) + this->m_eValue = mdxSetOrder_na; + else if (L"nd" == sValue) + this->m_eValue = mdxSetOrder_nd; + else + this->m_eValue = mdxSetOrder_u; + return this->m_eValue; + } + std::wstring CMdxSetOrder::ToString() const + { + switch (this->m_eValue) + { + case mdxSetOrder_u: return L"u"; break; + case mdxSetOrder_a: return L"a"; break; + case mdxSetOrder_d: return L"d"; break; + case mdxSetOrder_aa: return L"aa"; break; + case mdxSetOrder_ad: return L"ad"; break; + case mdxSetOrder_na: return L"na"; break; + case mdxSetOrder_nd: return L"nd"; break; + } + return L"v"; + } + + EMdxFunctionType CMdxFunctionType::FromString(const std::wstring& sValue) + { + if (L"m" == sValue) + this->m_eValue = mdxFunctionType_m; + else if (L"v" == sValue) + this->m_eValue = mdxFunctionType_v; + else if (L"s" == sValue) + this->m_eValue = mdxFunctionType_s; + else if (L"c" == sValue) + this->m_eValue = mdxFunctionType_c; + else if (L"r" == sValue) + this->m_eValue = mdxFunctionType_r; + else if (L"p" == sValue) + this->m_eValue = mdxFunctionType_p; + else if (L"k" == sValue) + this->m_eValue = mdxFunctionType_k; + else + this->m_eValue = mdxFunctionType_m; + return this->m_eValue; + } + std::wstring CMdxFunctionType::ToString() const + { + switch (this->m_eValue) + { + case mdxFunctionType_m: return L"m"; break; + case mdxFunctionType_v: return L"v"; break; + case mdxFunctionType_s: return L"s"; break; + case mdxFunctionType_c: return L"c"; break; + case mdxFunctionType_r: return L"r"; break; + case mdxFunctionType_p: return L"p"; break; + case mdxFunctionType_k: return L"k"; break; + } + return L"v"; + } + EUserProtectedRangeType CUserProtectedRangeType::FromString(const std::wstring& sValue) + { + if (L"notView" == sValue) + this->m_eValue = typeNotView; + else if (L"view" == sValue) + this->m_eValue = typeView; + else if (L"edit" == sValue) + this->m_eValue = typeEdit; + else + this->m_eValue = typeEdit; + return this->m_eValue; + } + std::wstring CUserProtectedRangeType::ToString() const + { + switch (this->m_eValue) + { + case typeNotView: return L"notView"; break; + case typeView: return L"view"; break; + case typeEdit: return L"edit"; break; + } + return L"edit"; + } }// Spreadsheet } // SimpleTypes diff --git a/OOXML/Common/SimpleTypes_Spreadsheet.h b/OOXML/Common/SimpleTypes_Spreadsheet.h index ba71925b99..97c7808f93 100644 --- a/OOXML/Common/SimpleTypes_Spreadsheet.h +++ b/OOXML/Common/SimpleTypes_Spreadsheet.h @@ -1406,5 +1406,48 @@ namespace SimpleTypes DEFINE_SIMPLE_TYPE(CTimelineStyleType, ETimelineStyleType, timelineStyle_selectionLabel) + enum EMdxKPIProperty + { + mdxKPIProperty_v = 0, + mdxKPIProperty_g = 1, + mdxKPIProperty_s = 2, + mdxKPIProperty_t = 3, + mdxKPIProperty_w = 4, + mdxKPIProperty_m = 5 + }; + DEFINE_SIMPLE_TYPE(CMdxKPIProperty, EMdxKPIProperty, mdxKPIProperty_v) + + enum EMdxSetOrder + { + mdxSetOrder_u = 0, + mdxSetOrder_a = 1, + mdxSetOrder_d = 2, + mdxSetOrder_aa = 3, + mdxSetOrder_ad = 4, + mdxSetOrder_na = 5, + mdxSetOrder_nd = 6 + }; + DEFINE_SIMPLE_TYPE(CMdxSetOrder, EMdxSetOrder, mdxSetOrder_u) + + enum EMdxFunctionType + { + mdxFunctionType_m = 0, + mdxFunctionType_v = 1, + mdxFunctionType_s = 2, + mdxFunctionType_c = 3, + mdxFunctionType_r = 4, + mdxFunctionType_p = 5, + mdxFunctionType_k = 6 + }; + DEFINE_SIMPLE_TYPE(CMdxFunctionType, EMdxFunctionType, mdxFunctionType_m) + + enum EUserProtectedRangeType + { + typeNotView = 0, + typeView = 1, + typeEdit = 2 + }; + DEFINE_SIMPLE_TYPE(CUserProtectedRangeType, EUserProtectedRangeType, typeView) + }// Spreadsheet } // SimpleTypes diff --git a/OOXML/Common/SimpleTypes_Vml.cpp b/OOXML/Common/SimpleTypes_Vml.cpp index 7c530164e8..a88d23fd14 100644 --- a/OOXML/Common/SimpleTypes_Vml.cpp +++ b/OOXML/Common/SimpleTypes_Vml.cpp @@ -1224,9 +1224,9 @@ namespace SimpleTypes { switch (this->m_eValue) { - case oletypeEmbed : return L"embed"; - case oletypeLink : return L"link"; - default : return L"embed"; + case oletypeEmbed : return L"Embed"; + case oletypeLink : return L"Link"; + default : return L"Embed"; } } diff --git a/OOXML/DocxFormat/CustomXml.cpp b/OOXML/DocxFormat/CustomXml.cpp index 49f96d5e5c..0abb012daf 100644 --- a/OOXML/DocxFormat/CustomXml.cpp +++ b/OOXML/DocxFormat/CustomXml.cpp @@ -155,7 +155,7 @@ namespace OOX CCustomXMLProps::CCustomXMLProps(OOX::Document *pMain) : OOX::FileGlobalEnumerated(pMain) { } - CCustomXMLProps::CCustomXMLProps(OOX::Document *pMain, const OOX::CPath& oFilePath): OOX::FileGlobalEnumerated(pMain) + CCustomXMLProps::CCustomXMLProps(OOX::Document *pMain, const OOX::CPath& oFilePath) : OOX::FileGlobalEnumerated(pMain) { read( oFilePath ); } diff --git a/OOXML/DocxFormat/Document.cpp b/OOXML/DocxFormat/Document.cpp index 588a809522..d887148c67 100644 --- a/OOXML/DocxFormat/Document.cpp +++ b/OOXML/DocxFormat/Document.cpp @@ -144,7 +144,42 @@ namespace OOX WritingElement_ReadAttributes_Read_else_if(oReader, L"w:themeTint", m_oThemeTint) WritingElement_ReadAttributes_End(oReader) } +//------------------------------------------------------------------------------------------------------------------------------------------------ + CDocSuppData::CDocSuppData(OOX::Document* pMain) : WritingElement(pMain) + { + } + CDocSuppData::~CDocSuppData() + { + } + void CDocSuppData::fromXML(XmlUtils::CXmlNode& oNode) + { + } + std::wstring CDocSuppData::toXML() const + { + return L""; + } + EElementType CDocSuppData::getType() const + { + return et_w_docSuppData; + } + void CDocSuppData::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"binData" == sName) + m_oBinData = oReader; + } + } + void CDocSuppData::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + } +//------------------------------------------------------------------------------------------------------------------------------------------------ CBgPict::CBgPict(OOX::Document *pMain) : WritingElement(pMain) { } @@ -401,7 +436,6 @@ namespace OOX pItem->fromXML(oReader); m_arrItems.push_back(pItem); } - if ( pItem ) { pItem->fromXML(oReader); diff --git a/OOXML/DocxFormat/Document.h b/OOXML/DocxFormat/Document.h index 206ac8e45e..bc804c04c5 100644 --- a/OOXML/DocxFormat/Document.h +++ b/OOXML/DocxFormat/Document.h @@ -80,10 +80,28 @@ namespace OOX nullable m_oDrawing; nullable m_oBackground; }; + + class CDocSuppData : public WritingElement + {//Word 2003 XML Reference + public: + WritingElement_AdditionMethods(CDocSuppData) + CDocSuppData(OOX::Document* pMain = NULL); + virtual ~CDocSuppData(); - //Word 2003 XML Reference + virtual void fromXML(XmlUtils::CXmlNode& oNode); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual std::wstring toXML() const; + virtual EElementType getType() const; + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + + public: + nullable m_oBinData; + }; class CBgPict : public WritingElement - { + {//Word 2003 XML Reference public: WritingElement_AdditionMethods(CBgPict) CBgPict(OOX::Document *pMain = NULL); @@ -104,7 +122,6 @@ namespace OOX nullable_string m_oBackgroundType; nullable m_oBackground; }; - } //-------------------------------------------------------------------------------- diff --git a/OOXML/DocxFormat/DocxFlat.cpp b/OOXML/DocxFormat/DocxFlat.cpp index 75037c6a83..9496e53909 100644 --- a/OOXML/DocxFormat/DocxFlat.cpp +++ b/OOXML/DocxFormat/DocxFlat.cpp @@ -46,6 +46,8 @@ #include "Settings/Settings.h" #include "Logic/SectionProperty.h" +#include "../../OfficeUtils/src/OfficeUtils.h" + namespace OOX { CDocxFlat::CDocxFlat() : File(dynamic_cast(this)) @@ -53,19 +55,21 @@ namespace OOX } CDocxFlat::CDocxFlat(const CPath& oFilePath) : File(dynamic_cast(this)) { - read( oFilePath ); + read(oFilePath); } CDocxFlat::~CDocxFlat() { } void CDocxFlat::read(const CPath& oFilePath) { + m_sDocumentPath = oFilePath.GetPath(); + XmlUtils::CXmlLiteReader oReader; - if ( !oReader.FromFile( oFilePath.GetPath() ) ) + if (!oReader.FromFile(oFilePath.GetPath())) return; - if ( !oReader.ReadNextNode() ) + if (!oReader.ReadNextNode()) return; fromXML(oReader); @@ -96,15 +100,15 @@ namespace OOX } void CDocxFlat::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if ( oReader, L"xml:space", m_oSpace ) - WritingElement_ReadAttributes_End( oReader ) + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"xml:space", m_oSpace) + WritingElement_ReadAttributes_End(oReader) } void CDocxFlat::fromXML(XmlUtils::CXmlLiteReader& oReader) { - ReadAttributes( oReader ); + ReadAttributes(oReader); - if ( oReader.IsEmptyNode() ) + if (oReader.IsEmptyNode()) return; m_pComments = new OOX::CComments(this); @@ -112,24 +116,25 @@ namespace OOX m_pEndnotes = new OOX::CEndnotes(this); int nDepth = oReader.GetDepth(); - while ( oReader.ReadNextSiblingNode(nDepth) ) + while (oReader.ReadNextSiblingNode(nDepth)) { std::wstring sName = oReader.GetName(); - if ( L"w:body" == sName ) + if (L"w:body" == sName) { m_pDocument = new CDocument(dynamic_cast(this)); m_currentContainer = dynamic_cast(m_pDocument.GetPointer()); m_pDocument->fromXML(oReader); + m_pDocument->m_bMacroEnabled = false; } - else if ( L"w:fonts" == sName ) + else if (L"w:fonts" == sName) m_pFontTable = oReader; else if (L"w:lists" == sName) { m_pNumbering = new CNumbering(dynamic_cast(this)); m_pNumbering->fromXML(oReader); } - else if ( L"w:styles" == sName ) + else if (L"w:styles" == sName) m_pStyles = oReader; else if (L"w:docPr" == sName) { @@ -145,8 +150,39 @@ namespace OOX { ReadDocumentProperties(oReader); } + else if (L"w:docOleData" == sName && !oReader.IsEmptyNode()) + { + m_oDocOleData = new OOX::Logic::CDocSuppData(WritingElement::m_pMainDocument); + m_oDocOleData->fromXML(oReader); + + ParsingOleData(); + } + else if (L"w:docSuppData" == sName && !oReader.IsEmptyNode()) + { + //m_oDocSuppData = new OOX::Logic::CDocSuppData(WritingElement::m_pMainDocument); + //m_oDocSuppData->fromXML(oReader); + // + //ParsingSuppData(); + } + //CustomDocumentProperties } + if (!m_sCompatibilityMode.IsInit() && m_pCore.IsInit() && (m_pCore->m_sVersion.IsInit())) + { + if (false == m_pSettings.IsInit()) m_pSettings = new CSettings(this); + if (m_pSettings->m_oCompat.IsInit()) m_pSettings->m_oCompat.Init(); + + Settings::CCompatSetting* pSett = new Settings::CCompatSetting(); + pSett->m_sName = L"compatibilityMode"; + pSett->m_sUri = L"http://schemas.microsoft.com/office/word"; + pSett->m_sVal = m_pCore->m_sVersion; + m_pSettings->m_oCompat->m_arrCompatSettings.push_back(pSett); + } + + if ((m_oDocSuppData.IsInit()) && (m_oDocSuppData->m_oBinData.IsInit()) && (m_pDocument.IsInit())) + { + m_pDocument->m_bMacroEnabled = true; + } if (false == m_pStyles->m_oDocDefaults.IsInit()) m_pStyles->m_oDocDefaults.Init(); @@ -211,7 +247,7 @@ namespace OOX { if (oReader.IsEmptyNode()) return; - + m_pApp = new OOX::CApp(this); m_pCore = new OOX::CCore(this); @@ -296,7 +332,7 @@ namespace OOX m_pApp->m_nWords = oReader.GetText2(); } } - OOX::CHdrFtr *CDocxFlat::GetHeaderOrFooter(const OOX::RId& rId) const + OOX::CHdrFtr* CDocxFlat::GetHeaderOrFooter(const OOX::RId& rId) const { OOX::IFileContainer* pDocumentContainer = (OOX::IFileContainer*)m_pDocument.GetPointer(); @@ -307,4 +343,68 @@ namespace OOX return NULL; } + void CDocxFlat::ParsingOleData() + { + if (false == m_oDocOleData.IsInit()) return; + if (false == m_oDocOleData->m_oBinData.IsInit()) return; + + std::vector pData = m_oDocOleData->m_oBinData->GetBytes(); + + NSFile::CFileBinary fileTest; + + std::wstring tempOleData = m_sTempPath + FILE_SEPARATOR_STR + L"DocOleData.bin"; + + if (false == fileTest.CreateFileW(tempOleData)) return; + + fileTest.WriteFile(pData.data(), pData.size()); + fileTest.CloseFile(); + + POLE::Storage storage(tempOleData.c_str()); + if (false == storage.open()) return; + + std::list msoStores = storage.entries(); + + int index = 0; + for (std::list::iterator it = msoStores.begin(); it != msoStores.end(); ++it) + { + POLE::Stream stream(&storage, *it); + if (stream.fail()) continue; + + smart_ptr pOleObjectFile = smart_ptr(new OOX::OleObject(this, false, true)); + OOX::CPath filename(L"oleObject.bin"); + pOleObjectFile->set_filename(filename, false, true); + + pOleObjectFile->m_Data.resize(stream.size()); + _UINT64 size = stream.read(pOleObjectFile->m_Data.data(), stream.size()); + pOleObjectFile->m_Data.resize(size); + + COfficeUtils oCOfficeUtils(NULL); + if (oCOfficeUtils.IsArchive(pOleObjectFile->m_Data.data(), pOleObjectFile->m_Data.size())) + {//gzip + ULONG nBytesUncompress = (std::max)((_UINT32)pOleObjectFile->m_Data.size() * 10, ((_UINT32*)pOleObjectFile->m_Data.data())[0]); + BYTE* pDataUncompress = new BYTE[nBytesUncompress]; + + if (S_OK == oCOfficeUtils.Uncompress(pDataUncompress, &nBytesUncompress, pOleObjectFile->m_Data.data() + 4, pOleObjectFile->m_Data.size() - 4)) + { + pOleObjectFile->m_Data.resize(nBytesUncompress); + memcpy(pOleObjectFile->m_Data.data(), pDataUncompress, nBytesUncompress); + delete[]pDataUncompress; + } + } + + NSCommon::smart_ptr file = pOleObjectFile.smart_dynamic_cast(); + m_mapOleData[*it] = file; + } + + } + void CDocxFlat::ParsingSuppData() + { + if (false == m_oDocSuppData.IsInit()) return; + if (false == m_oDocSuppData->m_oBinData.IsInit()) return; + + std::vector pData = m_oDocSuppData->m_oBinData->GetBytes(); + //COfficeUtils oCOfficeUtils(NULL); + + + } } diff --git a/OOXML/DocxFormat/DocxFlat.h b/OOXML/DocxFormat/DocxFlat.h index aaa04e5bc7..2bc52d14cf 100644 --- a/OOXML/DocxFormat/DocxFlat.h +++ b/OOXML/DocxFormat/DocxFlat.h @@ -52,12 +52,12 @@ namespace OOX namespace Logic { class CBgPict; + class CDocSuppData; } class CDocxFlat : public Document, public File, public WritingElement { public: - CDocxFlat(); CDocxFlat(const CPath& oFilePath); virtual ~CDocxFlat(); @@ -89,6 +89,8 @@ namespace OOX nullable m_pNumbering; nullable m_pSettings; nullable m_pBgPict; + nullable m_oDocSuppData; + nullable m_oDocOleData; nullable m_pComments; nullable m_pFootnotes; @@ -96,9 +98,15 @@ namespace OOX nullable m_pApp; nullable m_pCore; //----------------------------------------------------------- + nullable_string m_sCompatibilityMode; + std::map> m_mapImages; + std::map> m_mapOleData; OOX::IFileContainer *m_currentContainer = NULL; + private: + void ParsingOleData(); + void ParsingSuppData(); }; diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index ea3e04725c..a8a2bfb952 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -47,6 +47,7 @@ #include "../../XlsxFormat/Chart/ChartSerialize.h" #include "../../XlsxFormat/Worksheets/WorksheetChildOther.h" #include "../../XlsxFormat/Timelines/Timeline.h" +#include "../../XlsxFormat/Workbook/Metadata.h" #include "../Comments.h" @@ -68,6 +69,7 @@ #include "../../XlsbFormat/Biff12_unions/TABLESLICERSEX.h" #include "../../XlsbFormat/Biff12_unions/FRTWORKBOOK.h" #include "../../XlsbFormat/Biff12_unions/FRTPIVOTCACHEDEF.h" +#include "../../XlsbFormat/Biff12_records/FRTBegin.h" namespace OOX { @@ -224,6 +226,8 @@ namespace OOX *m_sUri == L"{7E03D99C-DC04-49d9-9315-930204A7B6E9}" || *m_sUri == L"{D0CA8CA8-9F24-4464-BF8E-62219DCF47F9}" || *m_sUri == L"{9260A510-F301-46a8-8635-F512D64BE5F5}" || + *m_sUri == L"{3e2802c4-a4d2-4d8b-9148-e3be6c30e623}" || + *m_sUri == L"{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}" || *m_sUri == L"http://schemas.microsoft.com/office/drawing/2008/diagram")) { int nCurDepth = oReader.GetDepth(); @@ -367,6 +371,14 @@ namespace OOX } } } + else if (sName == L"dynamicArrayProperties") + { + m_oDynamicArrayProperties = oReader; + } + else if (sName == L"rvb") + { + m_oRichValueBlock = oReader; + } } } else @@ -590,6 +602,18 @@ namespace OOX writer.EndNode(L"c16r3:dataDisplayOptions16"); sResult += writer.GetData().c_str(); } + if (m_oDynamicArrayProperties.IsInit()) + { + NSStringUtils::CStringBuilder writer; + m_oDynamicArrayProperties->toXML(writer); + sResult += writer.GetData().c_str(); + } + if (m_oRichValueBlock.IsInit()) + { + NSStringUtils::CStringBuilder writer; + m_oRichValueBlock->toXML(writer); + sResult += writer.GetData().c_str(); + } sResult += L""; return sResult; @@ -681,6 +705,209 @@ namespace OOX return sResult; } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinConnections() + { + auto ptr(new XLSB::FRTEXTCONNECTIONS); + for(auto i:m_arrExt) + { + if(i->m_sUri == L"{DE250136-89BD-433C-8126-D09CA5730AF9}") + { + ptr->m_EXTCONN15 = i->m_oConnection->toBin(); + } + } + return XLS::BaseObjectPtr{ptr}; + } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinWorkBook() + { + auto ptr(new XLSB::FRTWORKBOOK); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_arrExt.empty()) + return objectPtr; + for(auto i:m_arrExt) + { + + if(i->m_sUri == L"{46BE6895-7355-4a93-B00E-2C351335B9C9}") + { + ptr->m_TABLESLICERCACHEIDS = i->m_oSlicerCachesExt->toBinTable(); + } + else if(i->m_sUri == L"{BBE1A952-AA13-448e-AADC-164F8A28A991}") + { + ptr->m_SLICERCACHEIDS = i->m_oSlicerCaches->toBin(); + } + } + return objectPtr; + } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinStyles() + { + auto ptr(new XLSB::FRTSTYLESHEET); + XLS::BaseObjectPtr objectPtr(ptr); + + if (!m_arrExt.empty()) + { + + for(auto i:m_arrExt) + { + + if(i->m_sUri == L"{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}") + { + ptr->m_STYLESHEET14 = i->m_oSlicerStyles->toBin(); + } + else if(i->m_sUri == L"{46F421CA-312F-682F-3DD2-61675219B42D}") + { + ptr->m_DXF14S = i->m_oDxfs->toBin(); + } + } + + } + return objectPtr; + } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinPivotCache() + { + auto ptr(new XLSB::FRTPIVOTCACHEDEF); + + auto ptr1(new XLSB::FRTBegin); + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0x0F03; + ptr1->productVersion = version; + ptr->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr1}; + + XLS::BaseObjectPtr objectPtr(ptr); + + if (!m_arrExt.empty()) + { + for(auto i:m_arrExt) + { + + if(i->m_sUri == L"{725AE2AE-9491-48be-B2B4-4EB974FC3084}") + { + ptr->m_PCD14 = i->m_oPivotCacheDefinitionExt->toBin(); + } + + } + } + return objectPtr; + } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinSlicerCache() + { + auto ptr(new XLSB::FRTSLICERCACHE); + XLS::BaseObjectPtr objectPtr(ptr); + if (!m_arrExt.empty()) + { + for(auto i:m_arrExt) + { + if(i->m_sUri == L"{03082B11-2C62-411c-B77F-237D8FCFBE4C}") + { + auto ptr1(new XLSB::SLICERCACHEBOOKPIVOTTABLES); + ptr->m_SLICERCACHEBOOKPIVOTTABLES = XLS::BaseObjectPtr{ptr1}; + auto ptr2(new XLSB::SlicerCacheBookPivotTables); + ptr1->m_BrtSlicerCacheBookPivotTables = XLS::BaseObjectPtr{ptr2}; + + auto ptr3(new XLSB::FRTBegin); + ptr1->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr3}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0x0F03; + ptr3->productVersion = version; + + + + for(auto j:i->m_oSlicerCachePivotTables) + { + XLSB::SlicerCachePivotTable table; + j->toBin(&table); + ptr2->pivotTables.push_back(table); + } + } + if(i->m_sUri == L"{2F2917AC-EB37-4324-AD4E-5DD8C200BD13}") + { + auto ptr1(new XLSB::TABLESLICERCACHE); + + auto ptr2(new XLSB::FRTBegin); + ptr1->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr2}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0x0F03; + ptr2->productVersion = version; + + ptr->m_TABLESLICERCACHE = XLS::BaseObjectPtr{ptr1}; + ptr1->m_BrtBeginTableSlicerCache = i->m_oTableSlicerCache->toBin(); + } + if(i->m_sUri == L"{470722E0-AACD-4C17-9CDC-17EF765DBC7E}") + { + auto ptr1(new XLSB::SLICERCACHECROSSFILTEREXT); + + auto ptr2(new XLSB::FRTBegin); + ptr1->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr2}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0; + ptr2->productVersion = version; + + ptr->m_SLICERCACHECROSSFILTEREXT = XLS::BaseObjectPtr{ptr1}; + ptr1->m_BrtSlicerCacheHideItemsWithNoData = i->m_oSlicerCacheHideItemsWithNoData->toBin(); + } + } + } + return objectPtr; + } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinTable() + { + auto ptr(new XLSB::FRTTABLE); + XLS::BaseObjectPtr objectPtr(ptr); + auto frtBegin(new XLSB::FRTBegin); + ptr->m_BrtFRTBegin = XLS::BaseObjectPtr{frtBegin}; + if (!m_arrExt.empty()) + { + for(auto i:m_arrExt) + { + + if(i->m_sUri == L"{504A1905-F514-4f6f-8877-14C23A59335A}") + { + ptr->m_BrtList14 = i->m_oAltTextTable->toBin(); + } + + } + } + return objectPtr; + } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinWorksheet() + { + auto ptr(new XLSB::FRTWORKSHEET); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_arrExt.empty()) + return objectPtr; + for(auto i:m_arrExt) + { + if(i->m_sUri == L"{78C0D931-6437-407d-A8EE-F0AAD7539E65}") + { + auto formatPtr(new XLSB::CONDITIONALFORMATTINGS); + ptr->m_CONDITIONALFORMATTINGS = XLS::BaseObjectPtr{formatPtr}; + for(auto j:i->m_arrConditionalFormatting) + { + formatPtr->m_arCONDITIONALFORMATTING14.push_back(j->toBin()); + } + } + else if(i->m_sUri == L"{CCE6A557-97BC-4B89-ADB6-D9C93CAAB3DF}") + { + ptr->m_DVALS14 = i->m_oDataValidations->toBin(); + } + else if(i->m_sUri == L"{05C60535-1F16-4fd2-B633-F4F36F0B64E0}") + { + ptr->m_SPARKLINEGROUPS = i->m_oSparklineGroups->toBin(); + } + else if(i->m_sUri == L"{A8765BA9-456A-4dab-B4F3-ACF838C121DE}") + { + ptr->m_SLICERSEX = i->m_oSlicerList->toBin(); + } + else if(i->m_sUri == L"{3A4CF648-6AED-40f4-86FF-DC5316D8AED3}") + { + if(i->m_oSlicerListExt.IsInit()) + ptr->m_TABLESLICERSEX = i->m_oSlicerListExt->toBinTable(); + } + } + return objectPtr; + } void COfficeArtExtensionList::fromBin(XLS::BaseObjectPtr& obj) { if (obj->get_type() == XLS::typeFRTWORKBOOK) @@ -694,6 +921,7 @@ namespace OOX OOX::Drawing::COfficeArtExtension *oExt = new OOX::Drawing::COfficeArtExtension(); oExt->m_sUri = L"{46BE6895-7355-4a93-B00E-2C351335B9C9}"; oExt->m_oSlicerCachesExt = ptr->m_TABLESLICERCACHEIDS; + oExt->m_sAdditionalNamespace = L"xmlns:x15=\"http://schemas.microsoft.com/office/spreadsheetml/2010/11/main\""; if (oExt) m_arrExt.push_back( oExt ); diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.h b/OOXML/DocxFormat/Drawing/DrawingExt.h index 0ddb4dad19..44ce87b907 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.h +++ b/OOXML/DocxFormat/Drawing/DrawingExt.h @@ -60,6 +60,8 @@ namespace OOX class CTimelineRefs; class CTimelineCacheRefs; class CTimelineStyles; + class CDynamicArrayProperties; + class CRichValueBlock; } namespace Drawing @@ -108,7 +110,7 @@ namespace OOX //-------------------------------------------------------------------------------- // COfficeArtExtension 20.1.2.2.14 (Part 1) - //-------------------------------------------------------------------------------- + //-------------------------------------------------------------------------------- class COfficeArtExtension : public WritingElement { @@ -157,9 +159,12 @@ namespace OOX std::vector m_oSlicerCachePivotTables; nullable m_oTableSlicerCache; nullable m_oSlicerCacheHideItemsWithNoData; - + std::vector m_arrConditionalFormatting; + nullable < OOX::Spreadsheet::CDynamicArrayProperties> m_oDynamicArrayProperties; + nullable < OOX::Spreadsheet::CRichValueBlock> m_oRichValueBlock; + nullable m_oPresenceInfo; nullable_string m_oFileKey; @@ -176,7 +181,7 @@ namespace OOX //-------------------------------------------------------------------------------- // COfficeArtExtensionList 20.1.2.2.15 (Part 1) - //-------------------------------------------------------------------------------- + //-------------------------------------------------------------------------------- class COfficeArtExtensionList : public WritingElement { @@ -194,6 +199,13 @@ namespace OOX virtual std::wstring toXML() const; std::wstring toXMLWithNS(const std::wstring& sNamespace) const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBinWorksheet(); + XLS::BaseObjectPtr toBinWorkBook(); + XLS::BaseObjectPtr toBinStyles(); + XLS::BaseObjectPtr toBinTable(); + XLS::BaseObjectPtr toBinSlicerCache(); + XLS::BaseObjectPtr toBinPivotCache(); + XLS::BaseObjectPtr toBinConnections(); virtual EElementType getType() const; std::vector m_arrExt; diff --git a/OOXML/DocxFormat/FileTypes.cpp b/OOXML/DocxFormat/FileTypes.cpp index 6edef1f661..103b3fc628 100644 --- a/OOXML/DocxFormat/FileTypes.cpp +++ b/OOXML/DocxFormat/FileTypes.cpp @@ -167,23 +167,23 @@ namespace OOX const FileType Image (L"media", L"image", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", L"image", true); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", L"image", true, true); const FileType Audio (L"media", L"audio", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio", L"audio", true); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio", L"audio", true, true); const FileType Video (L"media", L"video", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/video", L"video", true); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/video", L"video", true, true); const FileType Media (L"media", L"media", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/media", L"media", true); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/media", L"media", true, true); const FileType SvgBlip (L"media", L"image", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", L"image", true); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", L"image", true, true); const FileType DiagramData (L"diagrams", L"data.xml", @@ -279,7 +279,7 @@ namespace OOX const FileType MicrosoftOfficeUnknown(L"embeddings", L"", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/package", L"embeddings/package", true, true); const FileType MicrosoftOfficeExcelWorksheet(L"embeddings", L"Microsoft_Office_Excel_Worksheet.xlsx", L"", @@ -346,7 +346,7 @@ namespace OOX const FileType OleObject (L"embeddings", L"oleObject.bin", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject"); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject", L"embeddings/oleObject", true, true); const FileType VmlDrawing (L"drawings", L"vmlDrawing.vml", L"application/vnd.openxmlformats-officedocument.vmlDrawing", diff --git a/OOXML/DocxFormat/Logic/ParagraphProperty.cpp b/OOXML/DocxFormat/Logic/ParagraphProperty.cpp index f278206127..5f4d01af35 100644 --- a/OOXML/DocxFormat/Logic/ParagraphProperty.cpp +++ b/OOXML/DocxFormat/Logic/ParagraphProperty.cpp @@ -310,7 +310,7 @@ namespace OOX if ( m_sAuthor.IsInit() ) { sResult += L"w:author=\""; - sResult += m_sAuthor.get2(); + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); sResult += L"\" "; } diff --git a/OOXML/DocxFormat/Logic/Pict.cpp b/OOXML/DocxFormat/Logic/Pict.cpp index 6280d49362..11368b1881 100644 --- a/OOXML/DocxFormat/Logic/Pict.cpp +++ b/OOXML/DocxFormat/Logic/Pict.cpp @@ -37,6 +37,7 @@ //#include "Vml.h" #include "VmlOfficeDrawing.h" +#include "../../../OfficeUtils/src/OfficeUtils.h" #include "../../../DesktopEditor/raster/ImageFileFormatChecker.h" #include "../../../OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.h" @@ -104,6 +105,31 @@ namespace OOX oReader.MoveToElement(); } + std::vector CBinData::GetBytes() + { + std::vector result; + if (!m_sData.IsInit()) return result; + + int dstLen = Base64::Base64DecodeGetRequiredLength((int)m_sData->size()); + result.resize(dstLen); + Base64::Base64Decode(m_sData->c_str(), (int)m_sData->size(), result.data(), &dstLen); + result.resize(dstLen); + + //COfficeUtils oCOfficeUtils(NULL); + //if (oCOfficeUtils.IsArchive(result.data(), result.size())) + //{//gzip + // ULONG nBytesUncompress = result.size() * 10; + // BYTE* pDataUncompress = new BYTE[nBytesUncompress]; + // if (S_OK == oCOfficeUtils.Uncompress(pDataUncompress, &nBytesUncompress, result.data(), result.size())) + // { + // result.resize(nBytesUncompress); + // memcpy(result.data(), pDataUncompress, nBytesUncompress); + // delete[]pDataUncompress; + // } + //} + + return result; + } CControl::CControl(OOX::Document *pMain) : WritingElement(pMain) {} CControl::~CControl() {} @@ -206,84 +232,84 @@ namespace OOX switch (wChar2) { case 'b': - if (_T("o:bottom") == sName) + if (L"o:bottom" == sName) pItem = new OOX::VmlOffice::CStrokeChild(m_pMainDocument); break; case 'c': - if (_T("o:callout") == sName) + if (L"o:callout" == sName) pItem = new OOX::VmlOffice::CCallout(m_pMainDocument); - else if (_T("o:clippath") == sName) + else if (L"o:clippath" == sName) pItem = new OOX::VmlOffice::CClipPath(m_pMainDocument); - else if (_T("o:column") == sName) + else if (L"o:column" == sName) pItem = new OOX::VmlOffice::CStrokeChild(m_pMainDocument); - else if (_T("o:complex") == sName) + else if (L"o:complex" == sName) pItem = new OOX::VmlOffice::CComplex(m_pMainDocument); break; case 'd': - if (_T("o:diagram") == sName) + if (L"o:diagram" == sName) pItem = new OOX::VmlOffice::CDiagram(m_pMainDocument); break; case 'e': - if (_T("o:equationxml") == sName) + if (L"o:equationxml" == sName) pItem = new OOX::VmlOffice::CEquationXml(m_pMainDocument); - else if (_T("o:extrusion") == sName) + else if (L"o:extrusion" == sName) pItem = new OOX::VmlOffice::CExtrusion(m_pMainDocument); break; case 'f': - if (_T("o:fill") == sName) + if (L"o:fill" == sName) pItem = new OOX::VmlOffice::CFill(m_pMainDocument); break; case 'i': - if (_T("o:ink") == sName) + if (L"o:ink" == sName) pItem = new OOX::VmlOffice::CInk(m_pMainDocument); break; case 'l': - if (_T("o:left") == sName) + if (L"o:left" == sName) pItem = new OOX::VmlOffice::CStrokeChild(m_pMainDocument); - else if (_T("o:lock") == sName) + else if (L"o:lock" == sName) pItem = new OOX::VmlOffice::CLock(m_pMainDocument); break; case 'O': - if (_T("o:OLEObject") == sName) + if (L"o:OLEObject" == sName) { m_oOLEObject = new OOX::VmlOffice::COLEObject(m_pMainDocument); m_oOLEObject->fromXML(oSubReader); }break; case 'r': - if (_T("o:right") == sName) + if (L"o:right" == sName) pItem = new OOX::VmlOffice::CStrokeChild(m_pMainDocument); break; case 's': - if (_T("o:shapedefaults") == sName) + if (L"o:shapedefaults" == sName) pItem = new OOX::VmlOffice::CShapeDefaults(m_pMainDocument); - else if (_T("o:shapelayout") == sName) + else if (L"o:shapelayout" == sName) pItem = new OOX::VmlOffice::CShapeLayout(m_pMainDocument); - else if (_T("o:signatureline") == sName) + else if (L"o:signatureline" == sName) pItem = new OOX::VmlOffice::CSignatureLine(m_pMainDocument); - else if (_T("o:skew") == sName) + else if (L"o:skew" == sName) pItem = new OOX::VmlOffice::CSkew(m_pMainDocument); break; case 't': - if (_T("o:top") == sName) + if (L"o:top" == sName) pItem = new OOX::VmlOffice::CStrokeChild(m_pMainDocument); break; @@ -298,59 +324,59 @@ namespace OOX switch (wChar2) { case 'a': - if (_T("v:arc") == sName) + if (L"v:arc" == sName) { m_oShapeElement = new OOX::Vml::CArc(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); }break; case 'b': - if (_T("v:background") == sName) + if (L"v:background" == sName) pItem = new OOX::Vml::CBackground(m_pMainDocument); break; case 'c': - if (_T("v:curve") == sName) + if (L"v:curve" == sName) { m_oShapeElement = new OOX::Vml::CCurve(m_pMainDocument);//??? m_oShapeElement->fromXML(oSubReader); }break; case 'f': - if (_T("v:fill") == sName) + if (L"v:fill" == sName) pItem = new OOX::Vml::CFill(m_pMainDocument); - else if (_T("v:formulas") == sName) + else if (L"v:formulas" == sName) pItem = new OOX::Vml::CFormulas(m_pMainDocument); break; case 'g': - if (_T("v:group") == sName) + if (L"v:group" == sName) { m_oShapeElement = new OOX::Vml::CGroup(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); }break; case 'h': - if (_T("v:handles") == sName) + if (L"v:handles" == sName) pItem = new OOX::Vml::CHandles(m_pMainDocument); break; case 'i': - if (_T("v:image") == sName) + if (L"v:image" == sName) { m_oShapeElement = new OOX::Vml::CImage(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); } - else if (_T("v:imagedata") == sName) + else if (L"v:imagedata" == sName) { pItem = pImageData = new OOX::Vml::CImageData(m_pMainDocument); } break; case 'l': - if (_T("v:line") == sName) + if (L"v:line" == sName) { m_oShapeElement = new OOX::Vml::CLine(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); @@ -358,7 +384,7 @@ namespace OOX break; case 'o': - if (_T("v:oval") == sName) + if (L"v:oval" == sName) { m_oShapeElement = new OOX::Vml::COval(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); @@ -366,9 +392,9 @@ namespace OOX break; case 'p': - if (_T("v:path") == sName) + if (L"v:path" == sName) pItem = new OOX::Vml::CPath(m_pMainDocument); - else if (_T("v:polyline") == sName) + else if (L"v:polyline" == sName) { m_oShapeElement = new OOX::Vml::CPolyLine(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); @@ -377,12 +403,12 @@ namespace OOX break; case 'r': - if (_T("v:rect") == sName) + if (L"v:rect" == sName) { m_oShapeElement = new OOX::Vml::CRect(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); } - else if (_T("v:roundrect") == sName) + else if (L"v:roundrect" == sName) { m_oShapeElement = new OOX::Vml::CRoundRect(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); @@ -390,27 +416,27 @@ namespace OOX break; case 's': - if (_T("v:shadow") == sName) + if (L"v:shadow" == sName) pItem = new OOX::Vml::CShadow(m_pMainDocument); - else if (_T("v:shape") == sName) + else if (L"v:shape" == sName) { m_oShapeElement = new OOX::Vml::CShape(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); } - else if (_T("v:shapetype") == sName) + else if (L"v:shapetype" == sName) { m_oShapeType = new OOX::Vml::CShapeType(m_pMainDocument); m_oShapeType->fromXML(oSubReader); } - else if (_T("v:stroke") == sName) + else if (L"v:stroke" == sName) pItem = new OOX::Vml::CStroke(m_pMainDocument); break; case 't': - if (_T("v:textbox") == sName) + if (L"v:textbox" == sName) pItem = new OOX::Vml::CTextbox(m_pMainDocument); - else if (_T("v:textpath") == sName) + else if (L"v:textpath" == sName) pItem = new OOX::Vml::CTextPath(m_pMainDocument); break; @@ -434,19 +460,36 @@ namespace OOX if (docx_flat) { smart_ptr pImageFile = smart_ptr(new OOX::Image(m_pMainDocument, true)); - - int dstLen = Base64::Base64DecodeGetRequiredLength((int)m_oBinData->m_sData->size()); - pImageFile->m_Data.resize(dstLen); - Base64::Base64Decode(m_oBinData->m_sData->c_str(), (int)m_oBinData->m_sData->size(), pImageFile->m_Data.data(), &dstLen); - pImageFile->m_Data.resize(dstLen); + pImageFile->m_Data = m_oBinData->GetBytes(); CImageFileFormatChecker fileChecker; - std::wstring ext = fileChecker.DetectFormatByData(pImageFile->m_Data.data(), dstLen); + std::wstring ext = fileChecker.DetectFormatByData(pImageFile->m_Data.data(), pImageFile->m_Data.size()); + + if (ext.empty()) + { + COfficeUtils oCOfficeUtils(NULL); + if (oCOfficeUtils.IsArchive(pImageFile->m_Data.data(), pImageFile->m_Data.size())) + {//gzip + ULONG nBytesUncompress = pImageFile->m_Data.size() * 10; + BYTE* pDataUncompress = new BYTE[nBytesUncompress]; + if (S_OK == oCOfficeUtils.Uncompress(pDataUncompress, &nBytesUncompress, pImageFile->m_Data.data(), pImageFile->m_Data.size())) + { + ext = fileChecker.DetectFormatByData(pDataUncompress, nBytesUncompress); + + if (false == ext.empty()) + { + pImageFile->m_Data.resize(nBytesUncompress); + memcpy(pImageFile->m_Data.data(), pDataUncompress, nBytesUncompress); + delete []pDataUncompress; + } + } + } + } if (false == ext.empty()) { OOX::CPath filename(L"image." + ext); pImageFile->set_filename(filename, false, true); - + NSCommon::smart_ptr file = pImageFile.smart_dynamic_cast(); const OOX::RId rId = docx_flat->m_currentContainer->Add(file); @@ -458,7 +501,6 @@ namespace OOX } } } - break; } @@ -471,7 +513,7 @@ namespace OOX } std::wstring CPicture::toXML() const { - std::wstring sResult = _T(""); + std::wstring sResult = m_oOLEObject.IsInit() ? L"" : L""; for (size_t i = 0; i < m_arrItems.size(); ++i) { @@ -489,10 +531,12 @@ namespace OOX if (m_oControl.IsInit()) sResult += m_oControl->toXML(); - //if (m_oBinData.IsInit()) - // sResult += m_oBinData->toXML(); + if (m_oOLEObject.IsInit()) + { + sResult += m_oOLEObject->toXML(); + } - sResult += _T(""); + sResult += m_oOLEObject.IsInit() ? L"" : L""; return sResult; } @@ -518,9 +562,24 @@ namespace OOX //альтернатива pptx std::wstring sXml; //??? + ole наверно что то (лень ...) - sXml += _T(""); + sXml += L""; sXml += m_sXml.get(); - sXml += _T(""); + sXml += L""; XmlUtils::CXmlLiteReader oSubReader; oSubReader.FromString(sXml); @@ -545,79 +604,79 @@ namespace OOX switch (wChar2) { case 'b': - if (_T("o:bottom") == sName) + if (L"o:bottom" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CStrokeChild, oSubReader) break; case 'c': - if (_T("o:callout") == sName) + if (L"o:callout" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CCallout, oSubReader) - else if (_T("o:clippath") == sName) + else if (L"o:clippath" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CClipPath, oSubReader) - else if (_T("o:column") == sName) + else if (L"o:column" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CStrokeChild, oSubReader) - else if (_T("o:complex") == sName) + else if (L"o:complex" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CComplex, oSubReader) break; case 'd': - if (_T("o:diagram") == sName) + if (L"o:diagram" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CDiagram, oSubReader) break; case 'e': - if (_T("o:equationxml") == sName) + if (L"o:equationxml" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CEquationXml, oSubReader) - else if (_T("o:extrusion") == sName) + else if (L"o:extrusion" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CExtrusion, oSubReader) break; case 'f': - if (_T("o:fill") == sName) + if (L"o:fill" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CFill, oSubReader) break; case 'i': - if (_T("o:ink") == sName) + if (L"o:ink" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CInk, oSubReader) break; case 'l': - if (_T("o:left") == sName) + if (L"o:left" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CStrokeChild, oSubReader) - else if (_T("o:lock") == sName) + else if (L"o:lock" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CLock, oSubReader) break; case 'O':// собственно это и есть самый главный под-объект - if (_T("o:OLEObject") == sName) + if (L"o:OLEObject" == sName) m_oOleObject = oSubReader; break; case 'r': - if (_T("o:right") == sName) + if (L"o:right" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CStrokeChild, oSubReader) break; case 's': - if (_T("o:shapedefaults") == sName) + if (L"o:shapedefaults" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CShapeDefaults, oSubReader) - else if (_T("o:shapelayout") == sName) + else if (L"o:shapelayout" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CShapeLayout, oSubReader) - else if (_T("o:signatureline") == sName) + else if (L"o:signatureline" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CSignatureLine, oSubReader) - else if (_T("o:skew") == sName) + else if (L"o:skew" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CSkew, oSubReader) break; case 't': - if (_T("o:top") == sName) + if (L"o:top" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CStrokeChild, oSubReader) break; } @@ -631,51 +690,51 @@ namespace OOX switch (wChar2) { case 'b': - if (_T("v:background") == sName) + if (L"v:background" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CBackground, oSubReader) break; case 'f': - if (_T("v:fill") == sName) + if (L"v:fill" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CFill, oSubReader) - else if (_T("v:formulas") == sName) + else if (L"v:formulas" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CFormulas, oSubReader) break; case 'h': - if (_T("v:handles") == sName) + if (L"v:handles" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CHandles, oSubReader) break; case 'i': - if (_T("v:image") == sName) + if (L"v:image" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CImage, oSubReader) - else if (_T("v:imagedata") == sName) + else if (L"v:imagedata" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CImageData, oSubReader) break; case 'p': - if (_T("v:path") == sName) + if (L"v:path" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CPath, oSubReader) break; case 'r': - if (_T("v:rect") == sName) + if (L"v:rect" == sName) m_oShape = oSubReader; break; case 's': - if (_T("v:shadow") == sName) + if (L"v:shadow" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CShadow, oSubReader) - else if (_T("v:shape") == sName) + else if (L"v:shape" == sName) m_oShape = oSubReader; - else if (_T("v:shapetype") == sName) + else if (L"v:shapetype" == sName) m_oShapeType = oSubReader; - else if (_T("v:stroke") == sName) + else if (L"v:stroke" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CStroke, oSubReader) break; case 't': - if (_T("v:textbox") == sName) + if (L"v:textbox" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CTextbox, oSubReader) - else if (_T("v:textpath") == sName) + else if (L"v:textpath" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CTextPath, oSubReader) break; } @@ -700,7 +759,7 @@ namespace OOX } std::wstring CObject::toXML() const { - return _T(""); + return L""; } EElementType CObject::getType() const { diff --git a/OOXML/DocxFormat/Logic/Pict.h b/OOXML/DocxFormat/Logic/Pict.h index 44f4c367e4..a0973e18fe 100644 --- a/OOXML/DocxFormat/Logic/Pict.h +++ b/OOXML/DocxFormat/Logic/Pict.h @@ -62,9 +62,9 @@ namespace OOX virtual std::wstring toXML() const; virtual EElementType getType() const; + std::vector GetBytes(); private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - public: nullable m_sName; nullable m_sData; diff --git a/OOXML/DocxFormat/Logic/RunProperty.cpp b/OOXML/DocxFormat/Logic/RunProperty.cpp index fbee069b42..aa1fac8740 100644 --- a/OOXML/DocxFormat/Logic/RunProperty.cpp +++ b/OOXML/DocxFormat/Logic/RunProperty.cpp @@ -170,7 +170,7 @@ namespace OOX if ( m_sAuthor.IsInit() ) { sResult += L"w:author=\""; - sResult += m_sAuthor.get2(); + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); sResult += L"\" "; } if ( m_oDate.IsInit() ) diff --git a/OOXML/DocxFormat/Logic/SectionProperty.cpp b/OOXML/DocxFormat/Logic/SectionProperty.cpp index 9c8e661353..7b285e12f0 100644 --- a/OOXML/DocxFormat/Logic/SectionProperty.cpp +++ b/OOXML/DocxFormat/Logic/SectionProperty.cpp @@ -1438,9 +1438,9 @@ namespace OOX if ( m_sAuthor.IsInit() ) { - sResult += _T("w:author=\""); - sResult += m_sAuthor.get2(); - sResult += _T("\" "); + sResult += L"w:author=\""; + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); + sResult += L"\" "; } if ( m_oDate.IsInit() ) diff --git a/OOXML/DocxFormat/Logic/Table.cpp b/OOXML/DocxFormat/Logic/Table.cpp index 3928acf049..0ffabd11e5 100644 --- a/OOXML/DocxFormat/Logic/Table.cpp +++ b/OOXML/DocxFormat/Logic/Table.cpp @@ -228,9 +228,9 @@ namespace OOX if ( m_sAuthor.IsInit() ) { - sResult += _T("w:author=\""); - sResult += m_sAuthor.get2(); - sResult += _T("\" "); + sResult += L"w:author=\""; + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); + sResult += L"\" "; } if ( m_oDate.IsInit() ) diff --git a/OOXML/DocxFormat/Logic/TableProperty.cpp b/OOXML/DocxFormat/Logic/TableProperty.cpp index a9ea47665f..5ee91e757f 100644 --- a/OOXML/DocxFormat/Logic/TableProperty.cpp +++ b/OOXML/DocxFormat/Logic/TableProperty.cpp @@ -68,7 +68,7 @@ namespace ComplexTypes if ( m_sAuthor.IsInit() ) { sResult += L"w:author=\""; - sResult += m_sAuthor.get2(); + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); sResult += L"\" "; } @@ -1004,7 +1004,7 @@ namespace OOX if ( m_sAuthor.IsInit() ) { sResult += _T("w:author=\""); - sResult += m_sAuthor.get2(); + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); sResult += _T("\" "); } @@ -1263,9 +1263,9 @@ namespace OOX if ( m_sAuthor.IsInit() ) { - sResult += _T("w:author=\""); - sResult += m_sAuthor.get2(); - sResult += _T("\" "); + sResult += L"w:author=\""; + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); + sResult += L"\" "; } if ( m_oDate.IsInit() ) @@ -1742,9 +1742,9 @@ namespace OOX if ( m_sAuthor.IsInit() ) { - sResult += _T("w:author=\""); - sResult += m_sAuthor.get2(); - sResult += _T("\" "); + sResult += L"w:author=\""; + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); + sResult += L"\" "; } if ( m_oDate.IsInit() ) diff --git a/OOXML/DocxFormat/Logic/Vml.cpp b/OOXML/DocxFormat/Logic/Vml.cpp index 1e22b501d4..01aa049fc4 100644 --- a/OOXML/DocxFormat/Logic/Vml.cpp +++ b/OOXML/DocxFormat/Logic/Vml.cpp @@ -195,14 +195,10 @@ namespace OOX if (docx_flat) { smart_ptr pImageFile = smart_ptr(new OOX::Image(document, true)); - - int dstLen = Base64::Base64DecodeGetRequiredLength((int)oBinData.m_sData->size()); - pImageFile->m_Data.resize(dstLen); - Base64::Base64Decode(oBinData.m_sData->c_str(), (int)oBinData.m_sData->size(), pImageFile->m_Data.data(), &dstLen); - pImageFile->m_Data.resize(dstLen); + pImageFile->m_Data = oBinData.GetBytes(); CImageFileFormatChecker fileChecker; - std::wstring ext = fileChecker.DetectFormatByData(pImageFile->m_Data.data(), dstLen); + std::wstring ext = fileChecker.DetectFormatByData(pImageFile->m_Data.data(), pImageFile->m_Data.size()); if (false == ext.empty()) { OOX::CPath filename(L"image." + ext); @@ -557,7 +553,7 @@ namespace OOX if (m_oOleIcon.get_value_or(false)) sResult += L"o:oleicon=\"t\" "; - if (m_oOle.get_value_or(false)) + if (m_oOle.IsInit()) sResult += L"o:ole=\"t\" "; if (m_oPreferRelative.get_value_or(false)) diff --git a/OOXML/DocxFormat/Logic/VmlOfficeDrawing.cpp b/OOXML/DocxFormat/Logic/VmlOfficeDrawing.cpp index 96ba90ad76..7434f5faf8 100644 --- a/OOXML/DocxFormat/Logic/VmlOfficeDrawing.cpp +++ b/OOXML/DocxFormat/Logic/VmlOfficeDrawing.cpp @@ -30,6 +30,7 @@ * */ +#include "../DocxFlat.h" #include "VmlOfficeDrawing.h" namespace OOX @@ -1268,19 +1269,32 @@ namespace OOX { ReadAttributes( oReader ); - if ( oReader.IsEmptyNode() ) - return; - - int nCurDepth = oReader.GetDepth(); - while ( oReader.ReadNextSiblingNode( nCurDepth ) ) + if (false == oReader.IsEmptyNode()) { - std::wstring sName = oReader.GetName(); - if ( L"o:FieldCodes" == sName ) - m_oFieldCodes = oReader; - else if ( L"o:LinkType" == sName ) - m_oLinkType = oReader; - else if ( L"o:LockedField" == sName ) - m_oLockedField = oReader; + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + if (L"o:FieldCodes" == sName) + m_oFieldCodes = oReader; + else if (L"o:LinkType" == sName) + m_oLinkType = oReader; + else if (L"o:LockedField" == sName) + m_oLockedField = oReader; + } + } + + OOX::CDocxFlat* docx_flat = dynamic_cast(m_pMainDocument); + if (docx_flat && false == m_oId.IsInit() && m_sObjectId.IsInit()) + { + std::map>::iterator pFind = docx_flat->m_mapOleData.find(*m_sObjectId); + + if (pFind != docx_flat->m_mapOleData.end()) + { + const OOX::RId rId = docx_flat->m_currentContainer->Add(pFind->second); + m_oId.Init(); + m_oId->SetValue(rId.get()); + } } } std::wstring COLEObject::toXML() const diff --git a/OOXML/DocxFormat/Settings/Settings.cpp b/OOXML/DocxFormat/Settings/Settings.cpp index 26f088d2b1..91072ee0d0 100644 --- a/OOXML/DocxFormat/Settings/Settings.cpp +++ b/OOXML/DocxFormat/Settings/Settings.cpp @@ -516,7 +516,6 @@ namespace Settings } void CCompatSetting::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { - // Читаем атрибуты if ( oReader.GetAttributesCount() <= 0 ) return; @@ -554,6 +553,15 @@ namespace Settings wsName = oReader.GetName(); } oReader.MoveToElement(); + + if (m_sName.IsInit() && (*m_sName == L"compatibilityMode") && m_sVal.IsInit()) + { + CDocxFlat* flat_docx = dynamic_cast(m_pMainDocument); + if (flat_docx) + { + flat_docx->m_sCompatibilityMode = *m_sVal; + } + } } //-------------------------------------------------------------------------------- @@ -669,24 +677,49 @@ namespace Settings m_oLayoutRawTableWidth = oReader; else if ( L"w:layoutTableRowsApart" == sName ) m_oLayoutTableRowsApart = oReader; - else if ( L"w:useWord97LineBreakRules" == sName ) + else if ( L"w:useWord97LineBreakRules" == sName ) m_oUseWord97LineBreakRules = oReader; + else if (L"w:breakWrappedTables" == sName) + { + m_oDoNotBreakWrappedTables = oReader; + m_oDoNotBreakWrappedTables->m_oVal.FromBool(!m_oDoNotBreakWrappedTables->m_oVal.ToBool()); + } else if ( L"w:doNotBreakWrappedTables" == sName ) m_oDoNotBreakWrappedTables = oReader; + else if (L"w:snapToGridInCell" == sName) + { + m_oDoNotSnapToGridInCell = oReader; + m_oDoNotSnapToGridInCell->m_oVal.FromBool(!m_oDoNotSnapToGridInCell->m_oVal.ToBool()); + } else if ( L"w:doNotSnapToGridInCell" == sName ) m_oDoNotSnapToGridInCell = oReader; else if ( L"w:selectFldWithFirstOrLastChar" == sName ) m_oSelectFldWithFirstOrLastChar = oReader; else if ( L"w:applyBreakingRules" == sName ) m_oApplyBreakingRules = oReader; + else if (L"w:wrapTextWithPunct" == sName) + { + m_oDoNotWrapTextWithPunct = oReader; + m_oDoNotWrapTextWithPunct->m_oVal.FromBool(!m_oDoNotWrapTextWithPunct->m_oVal.ToBool()); + } else if ( L"w:doNotWrapTextWithPunct" == sName ) m_oDoNotWrapTextWithPunct = oReader; + else if (L"w:useAsianBreakRules" == sName) + { + m_oDoNotUseEastAsianBreakRules = oReader; + m_oDoNotUseEastAsianBreakRules->m_oVal.FromBool(!m_oDoNotUseEastAsianBreakRules->m_oVal.ToBool()); + } else if ( L"w:doNotUseEastAsianBreakRules" == sName ) m_oDoNotUseEastAsianBreakRules = oReader; else if ( L"w:useWord2002TableStyleRules" == sName ) m_oUseWord2002TableStyleRules = oReader; else if ( L"w:growAutofit" == sName ) m_oGrowAutofit = oReader; + else if (L"w:dontGrowAutofit" == sName) + { + m_oGrowAutofit = oReader; + m_oGrowAutofit->m_oVal.FromBool(!m_oGrowAutofit->m_oVal.ToBool()); + } else if ( L"w:useFELayout" == sName ) m_oUseFELayout = oReader; else if ( L"w:useNormalStyleForList" == sName ) @@ -724,7 +757,7 @@ namespace Settings OOX::Settings::CCompatSetting *oCS = new OOX::Settings::CCompatSetting(); *oCS = oReader; - if (oCS)m_arrCompatSettings.push_back( oCS ); + if (oCS) m_arrCompatSettings.push_back( oCS ); } } } diff --git a/OOXML/DocxFormat/WritingElement.h b/OOXML/DocxFormat/WritingElement.h index 1a44d49029..9a941aeeae 100644 --- a/OOXML/DocxFormat/WritingElement.h +++ b/OOXML/DocxFormat/WritingElement.h @@ -788,6 +788,7 @@ namespace OOX et_w_bdo, // et_w_binData, // et_w_bgPict, // + et_w_docSuppData, // et_w_bookmarkEnd, // et_w_bookmarkStart, // et_w_br, // @@ -1514,7 +1515,28 @@ namespace OOX et_x_Timeslicer, et_x_TimelineStyles, et_x_TimelineStyle, - et_x_TimelineStyleElement + et_x_TimelineStyleElement, + + et_x_Metadata, + et_x_FutureMetadata, + et_x_FutureMetadataBlock, + et_x_MetadataType, + et_x_MetadataTypes, + et_x_MetadataBlocks, + et_x_MetadataBlock, + et_x_MetadataRecord, + et_x_MetadataString, + et_x_MetadataStrings, + et_x_MdxMetadata, + et_x_Mdx, + et_x_MdxTuple, + et_x_MetadataStringIndex, + et_x_MdxSet, + et_x_MdxMemeberProp, + et_x_MdxKPI, + + et_x_DynamicArrayProperties, + et_x_RichValueBlock }; class File; @@ -1526,6 +1548,7 @@ namespace OOX virtual ~Document(); std::wstring m_sDocumentPath; + std::wstring m_sTempPath; std::map> m_mapContent; }; diff --git a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp index bb27d86df0..6fd1940e89 100644 --- a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp +++ b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp @@ -2074,10 +2074,16 @@ bool CDrawingConverter::ParceObject(const std::wstring& strXml, std::wstring** p pPicture->spPr.Fill = PPTX::Logic::UniFill(); pShape = NULL; - pElem->InitElem(pPicture); + pElem->InitElem(pPicture); + } if ((pPicture) && (pPicture->blipFill.blip.IsInit())) { + if (pPicture->spPr.xfrm.IsInit()) + {// for bad replacemant image for ole + m_pBinaryWriter->m_dCxCurShape = pPicture->spPr.xfrm->extX.get_value_or(0); + m_pBinaryWriter->m_dCyCurShape = pPicture->spPr.xfrm->extY.get_value_or(0); + } if (pOle->m_OleObjectFile.IsInit()) { pPicture->blipFill.blip->oleFilepathBin = pOle->m_OleObjectFile->filename().GetPath(); @@ -2200,26 +2206,26 @@ void CDrawingConverter::ConvertDiagram(PPTX::Logic::SpTreeElem *result, XmlUtils { _pElem.grpSpPr.xfrm = new PPTX::Logic::Xfrm(); - _pElem.grpSpPr.xfrm->offX = m_pBinaryWriter->m_lXCurShape; - _pElem.grpSpPr.xfrm->offY = m_pBinaryWriter->m_lYCurShape; - _pElem.grpSpPr.xfrm->extX = m_pBinaryWriter->m_lCxCurShape; - _pElem.grpSpPr.xfrm->extY = m_pBinaryWriter->m_lCyCurShape; + _pElem.grpSpPr.xfrm->offX = m_pBinaryWriter->m_dXCurShape; + _pElem.grpSpPr.xfrm->offY = m_pBinaryWriter->m_dYCurShape; + _pElem.grpSpPr.xfrm->extX = m_pBinaryWriter->m_dCxCurShape; + _pElem.grpSpPr.xfrm->extY = m_pBinaryWriter->m_dCyCurShape; _pElem.grpSpPr.xfrm->chOffX = (int)0; _pElem.grpSpPr.xfrm->chOffY = (int)0; - _pElem.grpSpPr.xfrm->chExtX = m_pBinaryWriter->m_lCxCurShape; - _pElem.grpSpPr.xfrm->chExtY = m_pBinaryWriter->m_lCyCurShape; + _pElem.grpSpPr.xfrm->chExtX = m_pBinaryWriter->m_dCxCurShape; + _pElem.grpSpPr.xfrm->chExtY = m_pBinaryWriter->m_dCyCurShape; } else { - if (!_pElem.grpSpPr.xfrm->offX.is_init()) _pElem.grpSpPr.xfrm->offX = m_pBinaryWriter->m_lXCurShape; - if (!_pElem.grpSpPr.xfrm->offY.is_init()) _pElem.grpSpPr.xfrm->offY = m_pBinaryWriter->m_lYCurShape; - if (!_pElem.grpSpPr.xfrm->extX.is_init()) _pElem.grpSpPr.xfrm->extX = m_pBinaryWriter->m_lCxCurShape; - if (!_pElem.grpSpPr.xfrm->extY.is_init()) _pElem.grpSpPr.xfrm->extY = m_pBinaryWriter->m_lCyCurShape; + if (!_pElem.grpSpPr.xfrm->offX.is_init()) _pElem.grpSpPr.xfrm->offX = m_pBinaryWriter->m_dXCurShape; + if (!_pElem.grpSpPr.xfrm->offY.is_init()) _pElem.grpSpPr.xfrm->offY = m_pBinaryWriter->m_dYCurShape; + if (!_pElem.grpSpPr.xfrm->extX.is_init()) _pElem.grpSpPr.xfrm->extX = m_pBinaryWriter->m_dCxCurShape; + if (!_pElem.grpSpPr.xfrm->extY.is_init()) _pElem.grpSpPr.xfrm->extY = m_pBinaryWriter->m_dCyCurShape; if (!_pElem.grpSpPr.xfrm->chOffX.is_init()) _pElem.grpSpPr.xfrm->chOffX = (int)0; if (!_pElem.grpSpPr.xfrm->chOffY.is_init()) _pElem.grpSpPr.xfrm->chOffY = (int)0; - if (!_pElem.grpSpPr.xfrm->chExtX.is_init()) _pElem.grpSpPr.xfrm->chExtX = m_pBinaryWriter->m_lCxCurShape; - if (!_pElem.grpSpPr.xfrm->chExtY.is_init()) _pElem.grpSpPr.xfrm->chExtY = m_pBinaryWriter->m_lCyCurShape; + if (!_pElem.grpSpPr.xfrm->chExtX.is_init()) _pElem.grpSpPr.xfrm->chExtX = m_pBinaryWriter->m_dCxCurShape; + if (!_pElem.grpSpPr.xfrm->chExtY.is_init()) _pElem.grpSpPr.xfrm->chExtY = m_pBinaryWriter->m_dCyCurShape; } } @@ -2238,13 +2244,13 @@ void CDrawingConverter::ConvertDrawing(PPTX::Logic::SpTreeElem *elem, XmlUtils:: { XmlUtils::CXmlNode oNodeExt; - m_pBinaryWriter->m_lXCurShape = 0; - m_pBinaryWriter->m_lYCurShape = 0; + m_pBinaryWriter->m_dXCurShape = 0; + m_pBinaryWriter->m_dYCurShape = 0; if (oNodeAnchorInline.GetNode(L"wp:extent", oNodeExt)) { - m_pBinaryWriter->m_lCxCurShape = oNodeExt.ReadAttributeInt(L"cx"); - m_pBinaryWriter->m_lCyCurShape = oNodeExt.ReadAttributeInt(L"cy"); + m_pBinaryWriter->m_dCxCurShape = oNodeExt.ReadAttributeInt(L"cx"); + m_pBinaryWriter->m_dCyCurShape = oNodeExt.ReadAttributeInt(L"cy"); } XmlUtils::CXmlNode oNodeDocPr; if (oNodeAnchorInline.GetNode(L"wp:docPr", oNodeDocPr)) @@ -2275,10 +2281,10 @@ void CDrawingConverter::ConvertDrawing(PPTX::Logic::SpTreeElem *elem, XmlUtils:: PPTX::Logic::SpTree* pTree = new PPTX::Logic::SpTree(); pTree->grpSpPr.xfrm = new PPTX::Logic::Xfrm(); - pTree->grpSpPr.xfrm->offX = m_pBinaryWriter->m_lXCurShape; - pTree->grpSpPr.xfrm->offY = m_pBinaryWriter->m_lYCurShape; - pTree->grpSpPr.xfrm->extX = m_pBinaryWriter->m_lCxCurShape; - pTree->grpSpPr.xfrm->extY = m_pBinaryWriter->m_lCyCurShape; + pTree->grpSpPr.xfrm->offX = m_pBinaryWriter->m_dXCurShape; + pTree->grpSpPr.xfrm->offY = m_pBinaryWriter->m_dYCurShape; + pTree->grpSpPr.xfrm->extX = m_pBinaryWriter->m_dCxCurShape; + pTree->grpSpPr.xfrm->extY = m_pBinaryWriter->m_dCyCurShape; pTree->fromXML(oNodeContent); elem->InitElem(pTree); @@ -2922,11 +2928,11 @@ void CDrawingConverter::ConvertShape(PPTX::Logic::SpTreeElem *elem, XmlUtils::CX } else { - m_pBinaryWriter->m_lXCurShape = 0; - m_pBinaryWriter->m_lYCurShape = 0; + m_pBinaryWriter->m_dXCurShape = 0; + m_pBinaryWriter->m_dYCurShape = 0; - m_pBinaryWriter->m_lCxCurShape = 0; - m_pBinaryWriter->m_lCyCurShape = 0; + m_pBinaryWriter->m_dCxCurShape = 0; + m_pBinaryWriter->m_dCyCurShape = 0; pSpPr->xfrm = new PPTX::Logic::Xfrm(); pSpPr->xfrm->offX = oProps.X; @@ -4122,11 +4128,11 @@ std::wstring CDrawingConverter::GetDrawingMainProps(XmlUtils::CXmlNode& oNode, P oProps.Width = width; oProps.Height = height; - m_pBinaryWriter->m_lXCurShape = left; - m_pBinaryWriter->m_lYCurShape = top; + m_pBinaryWriter->m_dXCurShape = left; + m_pBinaryWriter->m_dYCurShape = top; - m_pBinaryWriter->m_lCxCurShape = width; - m_pBinaryWriter->m_lCyCurShape = height; + m_pBinaryWriter->m_dCxCurShape = width; + m_pBinaryWriter->m_dCyCurShape = height; bool bExtendedSize = false; XmlUtils::CXmlNode oNodeShadow = oNode.ReadNode(L"v:shadow"); diff --git a/OOXML/PPTXFormat/Logic/GrpSpPr.cpp b/OOXML/PPTXFormat/Logic/GrpSpPr.cpp index 7354751380..4066a8e098 100644 --- a/OOXML/PPTXFormat/Logic/GrpSpPr.cpp +++ b/OOXML/PPTXFormat/Logic/GrpSpPr.cpp @@ -184,6 +184,9 @@ namespace PPTX pWriter->WriteLimit2(0, bwMode); pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); + pWriter->m_dCxCurShape = pWriter->m_dCyCurShape = 1; + pWriter->m_bInGroup = true; + pWriter->WriteRecord2(0, xfrm); pWriter->WriteRecord1(1, Fill); pWriter->WriteRecord1(2, EffectList); diff --git a/OOXML/PPTXFormat/Logic/Pic.cpp b/OOXML/PPTXFormat/Logic/Pic.cpp index 63eb8f616f..225dc85395 100644 --- a/OOXML/PPTXFormat/Logic/Pic.cpp +++ b/OOXML/PPTXFormat/Logic/Pic.cpp @@ -865,8 +865,8 @@ namespace PPTX pWriter->WriteRecord2(4, oleObject); pWriter->WriteRecord1(0, nvPicPr); - pWriter->WriteRecord1(1, blipFill); pWriter->WriteRecord1(2, spPr); + pWriter->WriteRecord1(1, blipFill); pWriter->WriteRecord2(3, style); if (macro.IsInit()) diff --git a/OOXML/PPTXFormat/Logic/SpTree.cpp b/OOXML/PPTXFormat/Logic/SpTree.cpp index 6c4078b804..16178058be 100644 --- a/OOXML/PPTXFormat/Logic/SpTree.cpp +++ b/OOXML/PPTXFormat/Logic/SpTree.cpp @@ -400,8 +400,25 @@ namespace PPTX pWriter->WriteRecord1(0, nvGrpSpPr); pWriter->WriteRecord1(1, grpSpPr); - pWriter->WriteRecordArray(2, 0, SpTreeElems); +//--------------------------------------------------------------------------------------- + //pWriter->WriteRecordArray(2, 0, SpTreeElems); + pWriter->StartRecord(2); + _UINT32 len = (_UINT32)SpTreeElems.size(); + pWriter->WriteULONG(len); + + double oldCxCurShape = pWriter->m_dCxCurShape; + double oldCyCurShape = pWriter->m_dCyCurShape; + + for (_UINT32 i = 0; i < len; ++i) + { + pWriter->WriteRecord1(0, SpTreeElems[i]); + + pWriter->m_dCxCurShape = oldCxCurShape; + pWriter->m_dCyCurShape = oldCyCurShape; + } + pWriter->EndRecord(); +//--------------------------------------------------------------------------------------- pWriter->EndRecord(); } void SpTree::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) diff --git a/OOXML/PPTXFormat/Logic/Xfrm.cpp b/OOXML/PPTXFormat/Logic/Xfrm.cpp index 7370e76518..c45f861ad6 100644 --- a/OOXML/PPTXFormat/Logic/Xfrm.cpp +++ b/OOXML/PPTXFormat/Logic/Xfrm.cpp @@ -291,6 +291,16 @@ namespace PPTX } void Xfrm::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const { + if (chExtX.IsInit() && extX.IsInit()) + pWriter->m_dCxCurShape = pWriter->m_dCyCurShape * (double)*extX / (double)*chExtX; + else if (extX.IsInit()) + pWriter->m_dCxCurShape = (pWriter->m_bInGroup ? pWriter->m_dCxCurShape : 1) * *extX; + + if (chExtY.IsInit() && extY.IsInit()) + pWriter->m_dCyCurShape = pWriter->m_dCyCurShape * (double)*extY / (double)*chExtY; + else if (extY.IsInit()) + pWriter->m_dCyCurShape = (pWriter->m_bInGroup ? pWriter->m_dCyCurShape : 1) * *extY; + pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); pWriter->WriteInt2(0, offX); pWriter->WriteInt2(1, offY); diff --git a/OOXML/Projects/Linux/DocxFormatLib/DocxFormatLib.pro b/OOXML/Projects/Linux/DocxFormatLib/DocxFormatLib.pro index 4ce6ae9f76..e5e719c510 100644 --- a/OOXML/Projects/Linux/DocxFormatLib/DocxFormatLib.pro +++ b/OOXML/Projects/Linux/DocxFormatLib/DocxFormatLib.pro @@ -183,7 +183,9 @@ SOURCES += \ ../../../XlsxFormat/Drawing/Pos.cpp \ ../../../XlsxFormat/ExternalLinks/ExternalLinkPath.cpp \ ../../../XlsxFormat/ExternalLinks/ExternalLinks.cpp \ - ../../../XlsxFormat/Ole/OleObjects.cpp + ../../../XlsxFormat/Workbook/Metadata.cpp \ + ../../../XlsxFormat/RichData/RdRichValue.cpp \ + ../../../XlsxFormat/Ole/OleObjects.cpp } @@ -375,4 +377,6 @@ HEADERS += \ ../../../XlsxFormat/Slicer/SlicerCacheExt.h \ ../../../XlsxFormat/Slicer/Slicer.h \ ../../../XlsxFormat/NamedSheetViews/NamedSheetViews.h \ - docx_format.h + ../../../XlsxFormat/Workbook/Metadata.h \ + ../../../XlsxFormat/RichData/RdRichValue.h \ + docx_format.h diff --git a/OOXML/Projects/Linux/DocxFormatLib/xlsx_format_logic.cpp b/OOXML/Projects/Linux/DocxFormatLib/xlsx_format_logic.cpp index 0249679a97..a661caff6a 100644 --- a/OOXML/Projects/Linux/DocxFormatLib/xlsx_format_logic.cpp +++ b/OOXML/Projects/Linux/DocxFormatLib/xlsx_format_logic.cpp @@ -95,3 +95,5 @@ #include "../../../XlsxFormat/SharedStrings/XlsxRun.cpp" #include "../../../XlsxFormat/SharedStrings/SharedStrings.cpp" #include "../../../XlsxFormat/Timelines/Timeline.cpp" +#include "../../../XlsxFormat/Workbook/Metadata.cpp" +#include "../../../XlsxFormat/RichData/RdRichValue.cpp" diff --git a/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj b/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj index d1bea1396c..203228103c 100644 --- a/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj +++ b/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj @@ -354,6 +354,7 @@ + @@ -383,6 +384,7 @@ + @@ -513,6 +515,7 @@ + @@ -540,6 +543,7 @@ + diff --git a/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj.filters b/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj.filters index 92b050244f..0320b64eca 100644 --- a/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj.filters +++ b/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj.filters @@ -85,6 +85,9 @@ {34deda6e-7347-49f2-be67-d088cdd469db} + + {db25162b-705e-4c13-b6c5-f7c018c6f39a} + @@ -538,6 +541,12 @@ XlsxFormat\Timelines + + XlsxFormat\RichData + + + XlsxFormat\Workbook + @@ -948,5 +957,11 @@ XlsxFormat\Timelines + + XlsxFormat\RichData + + + XlsxFormat\Workbook + \ No newline at end of file diff --git a/OOXML/SystemUtility/SystemUtility.cpp b/OOXML/SystemUtility/SystemUtility.cpp index 03280da835..ac6d93af75 100644 --- a/OOXML/SystemUtility/SystemUtility.cpp +++ b/OOXML/SystemUtility/SystemUtility.cpp @@ -242,8 +242,8 @@ namespace OOX } std::wstring CPath::GetExtention(bool bIsPoint) const { - int nFind = (int)m_strFilename.rfind('.'); - if (-1 == nFind) + size_t nFind = m_strFilename.rfind('.'); + if (std::wstring::npos == nFind) return L""; if (!bIsPoint) @@ -251,6 +251,19 @@ namespace OOX return m_strFilename.substr(nFind); } + void CPath::SetExtention(const std::wstring& ext) + { + size_t nFind = m_strFilename.rfind('.'); + if (std::wstring::npos == nFind) + { + m_strFilename += L"." + ext; + } + else + { + m_strFilename = m_strFilename.substr(0, nFind + 1) + ext; + } + + } std::wstring CPath::GetDirectory(bool bIsSlash) const { int nPos = (int)m_strFilename.rfind(FILE_SEPARATOR_CHAR); diff --git a/OOXML/SystemUtility/SystemUtility.h b/OOXML/SystemUtility/SystemUtility.h index 279e113a4c..ad13efc14a 100644 --- a/OOXML/SystemUtility/SystemUtility.h +++ b/OOXML/SystemUtility/SystemUtility.h @@ -42,7 +42,6 @@ namespace OOX //флаг введен, чтобы отличать относительные и абсолютные пути в rels bool m_bIsRoot; - public: CPath(); CPath(const std::wstring& sName, bool bIsNorm = true); CPath(const char*& sName, bool bIsNorm = true); @@ -70,6 +69,8 @@ namespace OOX std::wstring GetPath() const; std::wstring GetFilename() const; + void SetExtention(const std::wstring & ext); + void Normalize(); void SetName(std::wstring sName, bool bNormalize); diff --git a/OOXML/XlsbFormat/Biff12_records/BeginComment.cpp b/OOXML/XlsbFormat/Biff12_records/BeginComment.cpp index 0d3f298110..9999b924d1 100644 --- a/OOXML/XlsbFormat/Biff12_records/BeginComment.cpp +++ b/OOXML/XlsbFormat/Biff12_records/BeginComment.cpp @@ -59,10 +59,18 @@ namespace XLSB void BeginComment::writeFields(XLS::CFRecord& record) { + if(!guid.empty()) + { _GUID_ guid_; STR::bstr2guid(guid, guid_); record << iauthor << rfx << guid_; + } + else + { + record << iauthor << rfx; + record.reserveNunBytes(16); + } } } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_records/SupTabs.h b/OOXML/XlsbFormat/Biff12_records/SupTabs.h index a8691072ef..e9f0e02d52 100644 --- a/OOXML/XlsbFormat/Biff12_records/SupTabs.h +++ b/OOXML/XlsbFormat/Biff12_records/SupTabs.h @@ -53,8 +53,7 @@ namespace XLSB _UINT32 cTab; std::vector sheetNames; - }; - + typedef boost::shared_ptr SupTabsPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEM.h b/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEM.h index a439c49784..2d6d18f3d0 100644 --- a/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEM.h +++ b/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEM.h @@ -56,6 +56,6 @@ namespace XLSB ExternalReferenceType sbt; }; - + typedef boost::shared_ptr DDEOLEITEMPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUE.h b/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUE.h index 4e0dad286c..6e82c2e139 100644 --- a/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUE.h +++ b/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUE.h @@ -51,6 +51,6 @@ namespace XLSB XLS::BaseObjectPtr m_source; }; - + typedef boost::shared_ptr DDEOLEITEMVALUEPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUES.h b/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUES.h index b470e5b9da..3a507facd3 100644 --- a/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUES.h +++ b/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUES.h @@ -55,6 +55,6 @@ namespace XLSB bool m_bBrtSupNameValueEnd; }; - + typedef boost::shared_ptr DDEOLEITEMVALUESPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_unions/DDEOLELINK.h b/OOXML/XlsbFormat/Biff12_unions/DDEOLELINK.h index d58ea61a01..1d21a1c8c4 100644 --- a/OOXML/XlsbFormat/Biff12_unions/DDEOLELINK.h +++ b/OOXML/XlsbFormat/Biff12_unions/DDEOLELINK.h @@ -55,6 +55,7 @@ namespace XLSB ExternalReferenceType sbt; }; + typedef boost::shared_ptr DDEOLELINKPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_unions/EXTERNALBOOK.h b/OOXML/XlsbFormat/Biff12_unions/EXTERNALBOOK.h index 90c3546f02..a301bb27ae 100644 --- a/OOXML/XlsbFormat/Biff12_unions/EXTERNALBOOK.h +++ b/OOXML/XlsbFormat/Biff12_unions/EXTERNALBOOK.h @@ -57,6 +57,7 @@ namespace XLSB ExternalReferenceType sbt; }; + typedef boost::shared_ptr EXTERNALBOOKPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_unions/EXTERNALLINK.h b/OOXML/XlsbFormat/Biff12_unions/EXTERNALLINK.h index d97dd76eea..0498a8ac6a 100644 --- a/OOXML/XlsbFormat/Biff12_unions/EXTERNALLINK.h +++ b/OOXML/XlsbFormat/Biff12_unions/EXTERNALLINK.h @@ -56,8 +56,8 @@ namespace XLSB XLS::BaseObjectPtr m_DDEOLELINK; std::vector m_arFRT; bool m_bBrtEndSupBook; - }; + typedef boost::shared_ptr EXTERNALLINKPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/PivotTableStream.cpp b/OOXML/XlsbFormat/PivotTableStream.cpp index 59a7b082e6..98b716a6ce 100644 --- a/OOXML/XlsbFormat/PivotTableStream.cpp +++ b/OOXML/XlsbFormat/PivotTableStream.cpp @@ -74,7 +74,7 @@ BaseObjectPtr PivotTableStream::clone() } const bool PivotTableStream::loadContent(BinProcessor& proc) -{ +{ while (true) { CFRecordType::TypeId type = proc.getNextRecordType(); @@ -331,6 +331,7 @@ const bool PivotTableStream::saveContent(XLS::BinProcessor & proc) if (m_FRTSXVIEW != nullptr) proc.mandatory(*m_FRTSXVIEW); + proc.mandatory(); return true; } diff --git a/OOXML/XlsbFormat/SlicerCachesStream.cpp b/OOXML/XlsbFormat/SlicerCachesStream.cpp index 82415305ff..e2ae61c71c 100644 --- a/OOXML/XlsbFormat/SlicerCachesStream.cpp +++ b/OOXML/XlsbFormat/SlicerCachesStream.cpp @@ -76,7 +76,7 @@ const bool SlicerCachesStream::loadContent(BinProcessor& proc) proc.SkipRecord(); }break; } - } + } return true; } diff --git a/OOXML/XlsbFormat/WorkSheetStream.cpp b/OOXML/XlsbFormat/WorkSheetStream.cpp index b9d929134d..410b7de2ca 100644 --- a/OOXML/XlsbFormat/WorkSheetStream.cpp +++ b/OOXML/XlsbFormat/WorkSheetStream.cpp @@ -453,13 +453,82 @@ const bool WorkSheetStream::saveContent(XLS::BinProcessor & proc) { proc.mandatory(); + if (m_BrtWsProp != nullptr) + proc.mandatory(*m_BrtWsProp); + + if (m_BrtWsDim != nullptr) + proc.mandatory(*m_BrtWsDim); + + if (m_WSVIEWS2 != nullptr) + proc.mandatory(*m_WSVIEWS2); + + if (m_BrtWsFmtInfo != nullptr) + proc.mandatory(*m_BrtWsFmtInfo); + for (auto &item : m_arCOLINFOS) { proc.mandatory(*item); } - if (m_BrtWsDim != nullptr) - proc.mandatory(*m_BrtWsDim); + if (m_CELLTABLE != nullptr) + proc.mandatory(*m_CELLTABLE); + + if (m_BrtSheetProtectionIso != nullptr) + proc.mandatory(*m_BrtSheetProtectionIso); + + if (m_BrtSheetProtection != nullptr) + proc.mandatory(*m_BrtSheetProtection); + + for (auto &item : m_arBrtRangeProtectionIso) + { + proc.mandatory(*item); + } + + for (auto &item : m_arBrtRangeProtection) + { + proc.mandatory(*item); + } + + if (m_AUTOFILTER != nullptr) + proc.mandatory(*m_AUTOFILTER); + + if (m_SORTSTATE != nullptr) + proc.mandatory(*m_SORTSTATE); + + if (m_DCON != nullptr) + proc.mandatory(*m_DCON); + + if (m_MERGECELLS != nullptr) + proc.mandatory(*m_MERGECELLS); + + for (auto &item : m_arCONDITIONALFORMATTING) + { + proc.mandatory(*item); + } + + if (m_DVALS != nullptr) + proc.mandatory(*m_DVALS); + + if (m_HLINKS != nullptr) + proc.mandatory(*m_HLINKS); + + if (m_BrtPrintOptions != nullptr) + proc.mandatory(*m_BrtPrintOptions); + + if (m_BrtMargins != nullptr) + proc.mandatory(*m_BrtMargins); + + if (m_BrtPageSetup != nullptr) + proc.mandatory(*m_BrtPageSetup); + + if (m_HEADERFOOTER != nullptr) + proc.mandatory(*m_HEADERFOOTER); + + if (m_RWBRK != nullptr) + proc.mandatory(*m_RWBRK); + + if (m_COLBRK != nullptr) + proc.mandatory(*m_COLBRK); if (m_BrtDrawing != nullptr) proc.mandatory(*m_BrtDrawing); @@ -470,87 +539,18 @@ const bool WorkSheetStream::saveContent(XLS::BinProcessor & proc) if (m_BrtLegacyDrawingHF != nullptr) proc.mandatory(*m_BrtLegacyDrawingHF); - if (m_HLINKS != nullptr) - proc.mandatory(*m_HLINKS); + if (m_BrtBkHim != nullptr) + proc.mandatory(*m_BrtBkHim); - if (m_MERGECELLS != nullptr) - proc.mandatory(*m_MERGECELLS); + if (m_OLEOBJECTS != nullptr) + proc.mandatory(*m_OLEOBJECTS); - if (m_CELLTABLE != nullptr) - proc.mandatory(*m_CELLTABLE); - - if (m_BrtWsFmtInfo != nullptr) - proc.mandatory(*m_BrtWsFmtInfo); - - if (m_WSVIEWS2 != nullptr) - proc.mandatory(*m_WSVIEWS2); - - if (m_BrtMargins != nullptr) - proc.mandatory(*m_BrtMargins); - - if (m_BrtPageSetup != nullptr) - proc.mandatory(*m_BrtPageSetup); - - if (m_BrtPrintOptions != nullptr) - proc.mandatory(*m_BrtPrintOptions); - - if (m_HEADERFOOTER != nullptr) - proc.mandatory(*m_HEADERFOOTER); - - if (m_BrtSheetProtectionIso != nullptr) - proc.mandatory(*m_BrtSheetProtectionIso); - - if (m_BrtSheetProtection != nullptr) - proc.mandatory(*m_BrtSheetProtection); + if (m_ACTIVEXCONTROLS != nullptr) + proc.mandatory(*m_ACTIVEXCONTROLS); if (m_LISTPARTS != nullptr) proc.mandatory(*m_LISTPARTS); - if (m_AUTOFILTER != nullptr) - proc.mandatory(*m_AUTOFILTER); - - if (m_SORTSTATE != nullptr) - proc.mandatory(*m_SORTSTATE); - - for (auto &item : m_arCONDITIONALFORMATTING) - { - proc.mandatory(*item); - } - - if (m_DVALS != nullptr) - proc.mandatory(*m_DVALS); - - if (m_OLEOBJECTS != nullptr) - proc.mandatory(*m_OLEOBJECTS); - - if (m_ACTIVEXCONTROLS != nullptr) - proc.mandatory(*m_ACTIVEXCONTROLS); - - if (m_BrtWsProp != nullptr) - proc.mandatory(*m_BrtWsProp); - - if (m_BrtBkHim != nullptr) - proc.mandatory(*m_BrtBkHim); - - if (m_RWBRK != nullptr) - proc.mandatory(*m_RWBRK); - - if (m_COLBRK != nullptr) - proc.mandatory(*m_COLBRK); - - for (auto &item : m_arBrtRangeProtectionIso) - { - proc.mandatory(*item); - } - - for (auto &item : m_arBrtRangeProtection) - { - proc.mandatory(*item); - } - - if (m_DCON != nullptr) - proc.mandatory(*m_DCON); - if (m_FRTWORKSHEET != nullptr) proc.mandatory(*m_FRTWORKSHEET); diff --git a/OOXML/XlsbFormat/Xlsb.cpp b/OOXML/XlsbFormat/Xlsb.cpp index 32a2ae4c92..74a9c26ce7 100644 --- a/OOXML/XlsbFormat/Xlsb.cpp +++ b/OOXML/XlsbFormat/Xlsb.cpp @@ -30,6 +30,8 @@ * */ #include "Xlsb.h" +#include "../DocxFormat/App.h" +#include "../DocxFormat/Core.h" #include "../XlsxFormat/Workbook/Workbook.h" #include "../XlsxFormat/SharedStrings/SharedStrings.h" @@ -60,12 +62,12 @@ using namespace XLS; OOX::Spreadsheet::CXlsb::~CXlsb() { -} +} void OOX::Spreadsheet::CXlsb::init() { workbook_code_page = XLS::WorkbookStreamObject::DefaultCodePage; xls_global_info = boost::shared_ptr(new XLS::GlobalWorkbookInfo(workbook_code_page, nullptr)); - xls_global_info->Version = 0x0800; + xls_global_info->Version = 0x0800; m_binaryReader = boost::shared_ptr(new NSBinPptxRW::CBinaryFileReader); m_binaryWriter = boost::shared_ptr(new NSBinPptxRW::CXlsbBinaryWriter); m_bWriteToXlsx = false; @@ -93,7 +95,18 @@ bool OOX::Spreadsheet::CXlsb::ReadBin(const CPath& oFilePath, XLS::BaseObject* o return true; } +bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oDirPath, OOX::CContentTypes& oContentTypes) +{ + if (NULL == m_pWorkbook) + return false; + m_bWriteToXlsb = true; + + IFileContainer::Write(oDirPath / L"", OOX::CPath(_T("")), oContentTypes); + + oContentTypes.Write(oDirPath); + return true; +} bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oFilePath, XLS::BaseObject* objStream) { if (m_binaryWriter->CreateFileW(oFilePath.GetPath()) == false) @@ -102,7 +115,8 @@ bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oFilePath, XLS::BaseObject* XLS::StreamCacheWriterPtr writer(new XLS::BinaryStreamCacheWriter(m_binaryWriter, xls_global_info)); XLS::BinWriterProcessor proc(writer, objStream); proc.mandatory(*objStream); - m_binaryWriter->WriteFile(m_binaryWriter->GetBuffer(), (static_cast(m_binaryWriter.get()))->GetPosition()); + + m_binaryWriter->WriteFile(m_binaryWriter->GetBuffer(), (static_cast(m_binaryWriter.get()))->GetPosition()); m_binaryWriter->CloseFile(); return true; @@ -168,7 +182,7 @@ void OOX::Spreadsheet::CXlsb::ReadSheetData() if(dataFindPair != m_mapSheetNameSheetData.end()) dataPosition = dataFindPair->second; - else + else continue; NSFile::CFileBinary oFile; @@ -273,10 +287,10 @@ void OOX::Spreadsheet::CXlsb::PrepareTableFormula() for(size_t i = 0, length = oTableColumns->m_arrItems.size(); i < length; ++i) { - auto& oTableColumn = oTableColumns->m_arrItems[i]; + auto& oTableColumn = oTableColumns->m_arrItems[i]; if(oTableColumn->m_oCalculatedColumnFormula.IsInit()) - { + { lambdaFormula(oTableColumn->m_oCalculatedColumnFormula.get()); } if(oTableColumn->m_oTotalsRowFormula.IsInit()) diff --git a/OOXML/XlsbFormat/Xlsb.h b/OOXML/XlsbFormat/Xlsb.h index 0757d40c05..065dc60d28 100644 --- a/OOXML/XlsbFormat/Xlsb.h +++ b/OOXML/XlsbFormat/Xlsb.h @@ -60,9 +60,12 @@ namespace OOX init(); } ~CXlsb(); - + bool ReadBin(const CPath& oFilePath, XLS::BaseObject* objStream); bool WriteBin(const CPath& oFilePath, XLS::BaseObject* objStream); + + bool WriteBin(const CPath& oDirPath, OOX::CContentTypes& oContentTypes); + XLS::GlobalWorkbookInfo* GetGlobalinfo(); void PrepareSi(); void PrepareTableFormula(); @@ -72,8 +75,10 @@ namespace OOX bool IsWriteToXlsx(); void WriteToXlsx(bool isXlsx); - + std::unordered_map m_mapSheetNameSheetData; + + bool m_bWriteToXlsb = false; private: void init(); @@ -85,8 +90,7 @@ namespace OOX std::wstring m_sPath; OOX::CContentTypes m_oContentTypes; - bool m_bWriteToXlsx; - + bool m_bWriteToXlsx = false; }; } //Spreadsheet diff --git a/OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp b/OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp index 38f50909c2..e02622249f 100644 --- a/OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp +++ b/OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp @@ -657,11 +657,11 @@ xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"" { m_title = oReader; } - //else if(_T("numFmt") == sName) - //{ - // m_numFmt = new CT_NumFmt; - // m_numFmt->fromXML(oReader); - //} + else if(_T("numFmt") == sName) + { + m_numFmt = new CNumberFormat; + m_numFmt->fromXML(oReader); + } else if(_T("majorTickMark") == sName) { m_majorTickMarks = new CTickMarks; @@ -1405,13 +1405,11 @@ xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"" std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); if( L"binSize" == sName) { - std::wstring s = oReader.GetText3(); - m_binSize = XmlUtils::GetDouble(s); + m_binSize = oReader; } else if( L"binCount" == sName) { - std::wstring s = oReader.GetText3(); - m_binCount = XmlUtils::GetInteger(s); + m_binCount = oReader; } } } @@ -1432,15 +1430,15 @@ xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"" writer.WriteString(L">"); if (m_binCount.IsInit()) { - writer.WriteString(L""); - writer.WriteString(XmlUtils::ToString(*m_binCount)); - writer.WriteString(L""); + writer.WriteString(L"ToString()); + writer.WriteString(L"/>"); } else if (m_binSize.IsInit()) { - writer.WriteString(L""); - writer.WriteString(std::to_wstring(*m_binSize)); - writer.WriteString(L""); + writer.WriteString(L"ToString()); + writer.WriteString(L"/>"); } writer.WriteString(L""); } diff --git a/OOXML/XlsxFormat/Chart/ChartSerializeEx.h b/OOXML/XlsxFormat/Chart/ChartSerializeEx.h index 668fae7962..01a7b5401a 100644 --- a/OOXML/XlsxFormat/Chart/ChartSerializeEx.h +++ b/OOXML/XlsxFormat/Chart/ChartSerializeEx.h @@ -60,6 +60,7 @@ namespace ComplexTypes { class CParentLabelLayout; class CRegionLabelLayout; + class CDouble; } } @@ -294,8 +295,8 @@ namespace ChartEx void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - nullable_double m_binSize; - nullable_int m_binCount; + nullable m_binSize; + nullable m_binCount; nullable m_intervalClosed; nullable> m_underflow; diff --git a/OOXML/XlsxFormat/Comments/Comments.h b/OOXML/XlsxFormat/Comments/Comments.h index 9ca4bf5ed1..679287e201 100644 --- a/OOXML/XlsxFormat/Comments/Comments.h +++ b/OOXML/XlsxFormat/Comments/Comments.h @@ -88,6 +88,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -112,6 +113,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -141,6 +143,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -156,6 +159,7 @@ namespace OOX virtual ~CComments(); void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; @@ -191,6 +195,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; diff --git a/OOXML/XlsxFormat/Comments/XlsxComments.cpp b/OOXML/XlsxFormat/Comments/XlsxComments.cpp index ff124aa762..4c0ab99d1a 100644 --- a/OOXML/XlsxFormat/Comments/XlsxComments.cpp +++ b/OOXML/XlsxFormat/Comments/XlsxComments.cpp @@ -49,6 +49,8 @@ #include "../SharedStrings/Si.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -122,6 +124,18 @@ namespace OOX } } } + XLS::BaseObjectPtr CAuthors::toBin() + { + auto ptr(new XLSB::COMMENTAUTHORS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + { + auto author(new XLSB::CommentAuthor); + author->author = i; + ptr->m_arBrtCommentAuthor.push_back(XLS::BaseObjectPtr{author}); + } + return objectPtr; + } EElementType CAuthors::getType () const { return et_x_Authors; @@ -194,6 +208,50 @@ namespace OOX } } } + XLS::BaseObjectPtr CComment::toBin() + { + auto ptr(new XLSB::COMMENT); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginComment); + ptr->m_BrtBeginComment = XLS::BaseObjectPtr{ptr1}; + + if(m_oRef.IsInit()) + ptr1->rfx = m_oRef->GetValue(); + if(m_oAuthorId.IsInit()) + ptr1->iauthor = m_oAuthorId->GetValue(); + else + ptr1->iauthor = 0; + if(m_oUid.IsInit()) + ptr1->guid = m_oUid->ToString(); + else + ptr1->guid = L""; + if(m_oText.IsInit()) + { + auto type = m_oText->getType(); + auto text(new XLSB::CommentText); + if(type == OOX::et_x_Si) + { + text->text.fExtStr = false; + text->text.fRichStr = false; + text->text.str = m_oText->ToString(); + } + else if(type == OOX::et_x_rPh) + { + text->text.fExtStr = true; + text->text.fRichStr = false; + text->text.phoneticStr = m_oText->ToString(); + } + else if(type == OOX::et_x_rPr) + { + text->text.fExtStr = false; + text->text.fRichStr = true; + } + text->text.str = m_oText->ToString(); + ptr->m_BrtCommentText = XLS::BaseObjectPtr{text}; + } + + return objectPtr; + } EElementType CComment::getType () const { return et_x_Comment; @@ -275,6 +333,14 @@ namespace OOX } } } + XLS::BaseObjectPtr CCommentList::toBin() + { + auto ptr(new XLSB::COMMENTLIST); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arCOMMENT.push_back(i->toBin()); + return objectPtr; + } EElementType CCommentList::getType () const { return et_x_CommentList; @@ -332,6 +398,20 @@ namespace OOX //commentsStream.reset(); } } + XLS::BaseObjectPtr CComments::WriteBin() const + { + XLSB::CommentsStreamPtr commentsStream(new XLSB::CommentsStream); + auto ptr(new XLSB::COMMENTS); + commentsStream->m_COMMENTS = XLS::BaseObjectPtr{ptr}; + + if(m_oAuthors.IsInit()) + ptr->m_COMMENTAUTHORS = m_oAuthors->toBin(); + + if(m_oCommentList.IsInit()) + ptr->m_COMMENTLIST = m_oCommentList->toBin(); + + return XLS::BaseObjectPtr{commentsStream}; + } void CComments::read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -379,6 +459,14 @@ namespace OOX } void CComments::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { NSStringUtils::CStringBuilder sXml; sXml.WriteString(L"\ "); std::wstring sPath = oPath.GetPath(); NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); - + } oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); IFileContainer::Write(oPath, oDirectory, oContent); } const OOX::FileType CComments::type() const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::CommentsBin; + } return OOX::Spreadsheet::FileTypes::Comments; } const CPath CComments::DefaultDirectory() const @@ -451,6 +544,14 @@ mc:Ignorable=\"xr\">"); { ReadAttributes(obj); } + XLS::BaseObjectPtr CLegacyDrawingWorksheet::toBin() + { + auto castedPtr(new XLSB::LegacyDrawing); + XLS::BaseObjectPtr ptr(castedPtr); + if(m_oId.IsInit()) + castedPtr->stRelId.value = m_oId->GetValue(); + return ptr; + } EElementType CLegacyDrawingWorksheet::getType () const { return et_x_LegacyDrawingWorksheet; diff --git a/OOXML/XlsxFormat/Controls/Controls.cpp b/OOXML/XlsxFormat/Controls/Controls.cpp index c3ac52b8c8..9e48da5966 100644 --- a/OOXML/XlsxFormat/Controls/Controls.cpp +++ b/OOXML/XlsxFormat/Controls/Controls.cpp @@ -202,6 +202,20 @@ namespace OOX } } } + XLS::BaseObjectPtr CControl::toBin() + { + auto ptr(new XLSB::ActiveX); + XLS::BaseObjectPtr objectPtr(ptr); + if (m_oShapeId.IsInit()) + ptr->shapeId = m_oShapeId->GetValue(); + + if (!m_oName.IsInit()) + ptr->strName = m_oName.get(); + + if (!m_oRid.IsInit()) + ptr->strRelID.value = m_oRid->GetValue(); + return objectPtr; + } void CControl::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -335,6 +349,18 @@ namespace OOX } } + XLS::BaseObjectPtr CControls::toBin() + { + auto ptr(new XLSB::ACTIVEXCONTROLS); + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto i:m_mapControls) + { + ptr->m_arBrtActiveX.push_back(i.second->toBin()); + } + + return objectPtr; + } CListItem::CListItem() {} CListItem::~CListItem() {} diff --git a/OOXML/XlsxFormat/Controls/Controls.h b/OOXML/XlsxFormat/Controls/Controls.h index cee8bba539..a721d54c38 100644 --- a/OOXML/XlsxFormat/Controls/Controls.h +++ b/OOXML/XlsxFormat/Controls/Controls.h @@ -67,10 +67,10 @@ namespace OOX { public: WritingElement_AdditionMethods(CListItem) - + CListItem(); virtual ~CListItem(); - + virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -80,7 +80,7 @@ namespace OOX virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable_string m_oVal; }; //----------------------------------------------------------------------------------------------------------------------------- @@ -88,10 +88,10 @@ namespace OOX { public: WritingElement_AdditionMethods(CListItems) - + CListItems(); virtual ~CListItems(); - + virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -101,7 +101,7 @@ namespace OOX virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader){} - + std::vector> m_arrItems; nullable m_oExtLst; }; @@ -122,7 +122,7 @@ namespace OOX virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable m_oDropLines; nullable m_oObjectType; nullable m_oChecked; @@ -142,7 +142,7 @@ namespace OOX nullable_string m_oFmlaGroup; nullable_string m_oFmlaLink; nullable_string m_oFmlaRange; - nullable_string m_oFmlaTxbx; + nullable_string m_oFmlaTxbx; nullable_bool m_oColored; nullable_bool m_oFirstButton; nullable_bool m_oHoriz; @@ -215,9 +215,10 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void toXML2(NSStringUtils::CStringBuilder& writer, bool bControlPr) const; - + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); - void fromBin(XLS::BaseObjectPtr& obj); + void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -252,9 +253,10 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); - + void read(XmlUtils::CXmlLiteReader& oReader, bool bOldVersion = false); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; diff --git a/OOXML/XlsxFormat/Drawing/Drawing.h b/OOXML/XlsxFormat/Drawing/Drawing.h index 56f197f22c..c615372ba5 100644 --- a/OOXML/XlsxFormat/Drawing/Drawing.h +++ b/OOXML/XlsxFormat/Drawing/Drawing.h @@ -62,6 +62,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp b/OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp index e52a6e2cff..22bcdbdceb 100644 --- a/OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp +++ b/OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp @@ -72,6 +72,17 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CDrawingWorksheet::toBin() + { + auto castedPtr(new XLSB::Drawing); + XLS::BaseObjectPtr ptr(castedPtr); + if(m_oId.IsInit()) + { + if(!m_oId->GetValue().empty()) + castedPtr->stRelId.value = m_oId->GetValue(); + } + return ptr; + } EElementType CDrawingWorksheet::getType () const { return et_x_FromTo; diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp index a7a1f11a16..4a4d30d6e1 100644 --- a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp @@ -65,6 +65,8 @@ #include "../../XlsbFormat/Biff12_records/SupName.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/GlobalWorkbookInfo.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include namespace OOX { @@ -118,6 +120,16 @@ namespace Spreadsheet toXML(writer); return writer.GetData().c_str(); } + XLS::BaseObjectPtr CExternalSheetNames::toBin() + { + XLSB::SupTabsPtr supTabs(new XLSB::SupTabs); + for (auto& item : m_arrItems) + { + XLSB::XLWideString str = *item->m_sVal; + supTabs->sheetNames.push_back(str); + } + return supTabs; + } void CExternalSheetNames::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -697,6 +709,21 @@ namespace Spreadsheet toXML(writer); return writer.GetData().c_str(); } + XLS::BaseObjectPtr CExternalBook::toBin() + { + XLSB::EXTERNALLINKPtr externalLINK(new XLSB::EXTERNALLINK()); + + XLSB::ExternalReferenceType type; + XLSB::EXTERNALBOOKPtr externalBOOK(new XLSB::EXTERNALBOOK(type)); + + externalLINK->m_EXTERNALBOOK = externalBOOK; + if (externalBOOK != nullptr) + { + if (m_oSheetNames.IsInit()) + externalBOOK->m_BrtSupTabs = m_oSheetNames->toBin(); + } + return externalLINK; + } void CExternalBook::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -786,6 +813,77 @@ namespace Spreadsheet toXML(writer); return writer.GetData().c_str(); } + XLS::BaseObjectPtr CDdeValue::toBin() + { + XLSB::DDEOLEITEMVALUEPtr ptr(new XLSB::DDEOLEITEMVALUE); + if(!m_oType.IsInit()) + return ptr; + auto type = m_oType->GetValue(); + switch(type) + { + case XLSB::rt_SupNameNum: + { + ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameNum}; + if(!m_arrItems.empty()) + { + auto castedSource = reinterpret_cast(ptr->m_source.get()); + castedSource->value.data.value = std::stod(m_arrItems.back()->m_sText); + m_arrItems.pop_back(); + } + } + break; + case XLSB::rt_SupNameBool: + { + ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameBool}; + if(!m_arrItems.empty()) + { + auto castedSource = reinterpret_cast(ptr->m_source.get()); + castedSource->value = std::stoi(m_arrItems.back()->m_sText); + m_arrItems.pop_back(); + } + + } + break; + case XLSB::rt_SupNameErr: + { + ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameErr}; + if(!m_arrItems.empty()) + { + auto castedSource = reinterpret_cast(ptr->m_source.get()); + auto error = m_arrItems.back()->m_sText.c_str(); + + if(error == L"#NULL!"){ castedSource->value = 0x00;} + else if(error == L"#DIV/0!"){castedSource->value = 0x07;} + else if(error == L"#VALUE!"){ castedSource->value = 0x0F;} + else if(error == L"#REF!"){ castedSource->value = 0x17;} + else if(error == L"#NAME?"){ castedSource->value = 0x1D;} + else if(error == L"#NUM!"){castedSource->value = 0x24;} + else if(error == L"#N/A"){castedSource->value = 0x2A;} + else if(error == L"#GETTING_DATA"){castedSource->value = 0x2B;} + + m_arrItems.pop_back(); + } + } + break; + case XLSB::rt_SupNameSt: + { + ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameSt}; + if(!m_arrItems.empty()) + { + auto castedSource = reinterpret_cast(ptr->m_source.get()); + castedSource->value = m_arrItems.back()->m_sText; + m_arrItems.pop_back(); + } + } + break; + case XLSB::rt_SupNameNil: + { + ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameNil}; + } + break; + } + return ptr; + } void CDdeValue::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -943,6 +1041,18 @@ namespace Spreadsheet m_arrItems.push_back(new CDdeValue(item)); } } + XLS::BaseObjectPtr CDdeValues::toBin() + { + XLSB::DDEOLEITEMVALUESPtr ptr(new XLSB::DDEOLEITEMVALUES); + auto castedPtr = static_cast(ptr->m_BrtSupNameValueStart.get()); + if(m_oRows.IsInit()) + castedPtr->cRw = m_oRows->GetValue(); + if(m_oCols.IsInit()) + castedPtr->cCol = m_oCols->GetValue(); + for (auto &item : m_arrItems) + ptr->m_arDDEOLEITEMVALUE.push_back(item->toBin()); + return ptr; + } void CDdeValues::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1011,6 +1121,31 @@ namespace Spreadsheet toXML(writer); return writer.GetData().c_str(); } + XLS::BaseObjectPtr CDdeItem::toBin() + { + XLSB::ExternalReferenceType type; + XLSB::DDEOLEITEMPtr ptr(new XLSB::DDEOLEITEM(type)); + if (m_oDdeValues.IsInit()) + ptr->m_DDEOLEITEMVALUES = m_oDdeValues->toBin(); + if(m_oName.IsInit()) + { + ptr->m_BrtSupNameStart = XLS::BaseObjectPtr{new XLSB::SupNameStart}; + auto ptrSupNameStart = static_cast(ptr->m_BrtSupNameStart.get()); + ptrSupNameStart->name = m_oName.get(); + } + if(m_oOle.IsInit() || m_oAdvise.IsInit() || m_oPreferPic.IsInit()) + { + ptr->m_BrtSupNameBits = XLS::BaseObjectPtr{new XLSB::SupNameBits(type)}; + auto ptrSupNameBits = static_cast(ptr->m_BrtSupNameBits.get()); + if(m_oOle.IsInit()) + ptrSupNameBits->contentsDDE.fOLE = m_oOle->ToBool(); + if(m_oAdvise.IsInit()) + ptrSupNameBits->contentsDDE.fWantAdvise = m_oAdvise->ToBool(); + if(m_oPreferPic.IsInit()) + ptrSupNameBits->contentsDDE.fWantPict = m_oPreferPic->ToBool(); + } + return ptr; + } void CDdeItem::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -1108,6 +1243,15 @@ namespace Spreadsheet } } + XLS::BaseObjectPtr CDdeItems::toBin() + { + XLSB::ExternalReferenceType type; + XLSB::DDEOLELINKPtr ptr(new XLSB::DDEOLELINK(type)); + for (auto item : m_arrItems) + ptr->m_arDDEOLEITEM.push_back(item->toBin()); + return ptr; + } + void CDdeLink::fromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); @@ -1155,6 +1299,18 @@ namespace Spreadsheet m_oDdeItems = ptr->m_DDEOLELINK; } } + XLS::BaseObjectPtr CDdeLink::toBin() + { + XLSB::EXTERNALLINKPtr ptr(new XLSB::EXTERNALLINK); + ptr->m_BrtBeginSupBook = XLS::BaseObjectPtr{new XLSB::BeginSupBook}; + auto castedBook = static_cast(ptr->m_BrtBeginSupBook.get()); + if (m_oDdeService.IsInit()) + castedBook->string1 = m_oDdeService.get(); + if (m_oDdeTopic.IsInit()) + castedBook->string2 = m_oDdeTopic.get(); + ptr->m_DDEOLELINK = m_oDdeItems->toBin(); + return ptr; + } CDdeLink::CDdeLink() { @@ -1223,6 +1379,29 @@ namespace Spreadsheet toXML(writer); return writer.GetData().c_str(); } + XLS::BaseObjectPtr COleItem::toBin() + { + XLSB::ExternalReferenceType type; + XLSB::DDEOLEITEMPtr coleItem(new XLSB::DDEOLEITEM(type)); + if(m_oName.IsInit()) + { + coleItem->m_BrtSupNameStart = XLS::BaseObjectPtr{new XLSB::SupNameStart}; + auto castedName = static_cast(coleItem->m_BrtSupNameStart.get()); + castedName->name = m_oName.get(); + } + if(m_oIcon.IsInit() || m_oAdvise.IsInit() || m_oPreferPic.IsInit()) + { + coleItem->m_BrtSupNameBits = XLS::BaseObjectPtr{new XLSB::SupNameBits(type)}; + auto ptrSupNameBits = static_cast(coleItem->m_BrtSupNameBits.get()); + if(m_oIcon.IsInit()) + ptrSupNameBits->contentsOLE.fIcon = m_oIcon->ToBool(); + if(m_oAdvise.IsInit()) + ptrSupNameBits->contentsOLE.fWantAdvise = m_oAdvise->ToBool(); + if(m_oPreferPic.IsInit()) + ptrSupNameBits->contentsOLE.fWantPict = m_oPreferPic->ToBool(); + } + return coleItem; + } void COleItem::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -1316,6 +1495,17 @@ namespace Spreadsheet m_arrItems.push_back(new COleItem(item)); } } + XLS::BaseObjectPtr COleItems::toBin() + { + XLSB::ExternalReferenceType type; + XLSB::DDEOLELINKPtr ptr(new XLSB::DDEOLELINK(type)); + + for(auto i: m_arrItems) + { + ptr->m_arDDEOLEITEM.push_back(i->toBin()); + } + return ptr; + } COleLink::COleLink() { @@ -1377,6 +1567,20 @@ namespace Spreadsheet m_oOleItems = ptr->m_DDEOLELINK; } } + XLS::BaseObjectPtr COleLink::toBin() + { + XLSB::EXTERNALLINKPtr COleLink(new XLSB::EXTERNALLINK); + COleLink->m_BrtBeginSupBook = XLS::BaseObjectPtr{new XLSB::BeginSupBook}; + auto castedBook = static_cast(COleLink->m_BrtBeginSupBook.get()); + + if(m_oRid.IsInit()) + castedBook->string1 = m_oRid->ToString(); + if(m_oProgId.IsInit()) + castedBook->string2 = m_oProgId.get(); + + COleLink->m_DDEOLELINK = m_oOleItems->toBin(); + return COleLink; + } void COleLink::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1481,6 +1685,21 @@ namespace Spreadsheet CExternalLink::~CExternalLink() { } + XLS::BaseObjectPtr CExternalLink::writeBin() const + { + XLSB::ExternalLinkStreamPtr externalLinkStreamStream(new XLSB::ExternalLinkStream); + + if (externalLinkStreamStream != nullptr) + { + if (m_oExternalBook.IsInit()) + externalLinkStreamStream->m_EXTERNALLINK = m_oExternalBook->toBin(); + if (m_oDdeLink.IsInit()) + externalLinkStreamStream->m_EXTERNALLINK = m_oDdeLink->toBin(); + if (m_oOleLink.IsInit()) + externalLinkStreamStream->m_EXTERNALLINK = m_oOleLink->toBin(); + } + return externalLinkStreamStream; + } void CExternalLink::readBin(const CPath& oPath) { CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); @@ -1593,6 +1812,14 @@ namespace Spreadsheet } void CExternalLink::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = writeBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { NSStringUtils::CStringBuilder sXml; sXml.WriteString(L""); sXml.WriteString(L"(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::ExternalLinksBin; + } return OOX::Spreadsheet::FileTypes::ExternalLinks; } const CPath CExternalLink::DefaultDirectory() const diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h index 358ee01686..cfb69a2ac5 100644 --- a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h @@ -67,17 +67,18 @@ namespace OOX public: WritingElement_AdditionMethods(CExternalSheetNames) WritingElement_XlsbConstructors(CExternalSheetNames) - + CExternalSheetNames(); virtual ~CExternalSheetNames(); virtual void fromXML(XmlUtils::CXmlNode& oNode); virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); - + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual std::wstring toXML() const; - void fromBin(XLS::BaseObjectPtr& obj); + void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; }; class CAlternateUrls : public WritingElement @@ -103,7 +104,7 @@ namespace OOX nullable m_oAbsoluteUrlRid; nullable m_oRelativeUrlRid; - + nullable_string m_oDriveId; nullable_string m_oItemId; }; @@ -166,7 +167,7 @@ namespace OOX virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable m_oRef; nullable m_oType; nullable m_oValueMetadata; @@ -251,6 +252,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -278,6 +280,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -301,6 +304,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -324,6 +328,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -353,6 +358,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; }; @@ -371,6 +377,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -396,6 +403,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -420,6 +428,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; }; @@ -437,6 +446,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -454,7 +464,9 @@ namespace OOX CExternalLink(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath, const std::wstring & rId); virtual ~CExternalLink(); + XLS::BaseObjectPtr writeBin() const; void readBin(const CPath& oPath); + virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; diff --git a/OOXML/XlsxFormat/FileFactory_Spreadsheet.cpp b/OOXML/XlsxFormat/FileFactory_Spreadsheet.cpp index fba046b261..8b692b6291 100644 --- a/OOXML/XlsxFormat/FileFactory_Spreadsheet.cpp +++ b/OOXML/XlsxFormat/FileFactory_Spreadsheet.cpp @@ -58,6 +58,8 @@ #include "Slicer/Slicer.h" #include "NamedSheetViews/NamedSheetViews.h" #include "Timelines/Timeline.h" +#include "RichData/RdRichValue.h" +#include "Workbook/Metadata.h" #include "Table/Table.h" #include "Table/QueryTable.h" @@ -181,6 +183,14 @@ namespace OOX return smart_ptr(new CTimelineFile(pMain, oRootPath, oFileName)); else if ( oRelation.Type() == FileTypes::TimelineCache) return smart_ptr(new CTimelineCacheFile(pMain, oRootPath, oFileName)); + else if (oRelation.Type() == FileTypes::Metadata) + return smart_ptr(new CMetadataFile(pMain, oRootPath, oFileName)); + else if (oRelation.Type() == FileTypes::RdRichValueStructure) + return smart_ptr(new CRdRichValueStructureFile(pMain, oRootPath, oFileName)); + else if (oRelation.Type() == FileTypes::RdRichValue) + return smart_ptr(new CRdRichValueFile(pMain, oRootPath, oFileName)); + else if (oRelation.Type() == FileTypes::RdRichValueTypes) + return smart_ptr(new CRdRichValueTypesFile(pMain, oRootPath, oFileName)); return smart_ptr( new UnknowTypeFile(pMain) ); } @@ -313,6 +323,14 @@ namespace OOX return smart_ptr(new CTimelineFile(pMain, oRootPath, oFileName)); else if (pRelation->Type() == FileTypes::TimelineCache) return smart_ptr(new CTimelineCacheFile(pMain, oRootPath, oFileName)); + else if (pRelation->Type() == FileTypes::Metadata) + return smart_ptr(new CMetadataFile(pMain, oRootPath, oFileName)); + else if (pRelation->Type() == FileTypes::RdRichValueStructure) + return smart_ptr(new CRdRichValueStructureFile(pMain, oRootPath, oFileName)); + else if (pRelation->Type() == FileTypes::RdRichValue) + return smart_ptr(new CRdRichValueFile(pMain, oRootPath, oFileName)); + else if (pRelation->Type() == FileTypes::RdRichValueTypes) + return smart_ptr(new CRdRichValueTypesFile(pMain, oRootPath, oFileName)); return smart_ptr( new UnknowTypeFile(pMain) ); } diff --git a/OOXML/XlsxFormat/FileTypes_Spreadsheet.cpp b/OOXML/XlsxFormat/FileTypes_Spreadsheet.cpp index 52076231ba..e5c88368de 100644 --- a/OOXML/XlsxFormat/FileTypes_Spreadsheet.cpp +++ b/OOXML/XlsxFormat/FileTypes_Spreadsheet.cpp @@ -155,12 +155,28 @@ namespace OOX L"http://schemas.microsoft.com/office/2011/relationships/timelineCache", L"timelineCaches/timelineCache", true, true); //onlyoffice workbook comments - const FileType WorkbookComments(L"", L"workbookComments.bin", + const FileType WorkbookComments (L"", L"workbookComments.bin", L"", L"http://schemas.onlyoffice.com/workbookComments"); + + const FileType Metadata (L"", L"metadata.xml", + L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml", + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata"); - const FileType SpreadsheetFlat(L"", L"", L"", L""); + const FileType RdRichValue (L"richData", L"rdrichvalue.xml", + L"application/vnd.ms-excel.rdrichvalue+xml", + L"http://schemas.microsoft.com/office/2017/06/relationships/rdRichValue"); + + const FileType RdRichValueStructure(L"richData", L"rdrichvaluestructure.xml", + L"application/vnd.ms-excel.rdrichvaluestructure+xml", + L"http://schemas.microsoft.com/office/2017/06/relationships/rdRichValueStructure"); + + const FileType RdRichValueTypes (L"richData", L"rdRichValueTypes..xml", + L"application/vnd.ms-excel.rdrichvaluetypes+xml", + L"http://schemas.microsoft.com/office/2017/06/relationships/rdRichValueTypes"); + + const FileType SpreadsheetFlat (L"", L"", L"", L""); } // namespace FileTypes } diff --git a/OOXML/XlsxFormat/FileTypes_Spreadsheet.h b/OOXML/XlsxFormat/FileTypes_Spreadsheet.h index e73ba16a92..0204c80566 100644 --- a/OOXML/XlsxFormat/FileTypes_Spreadsheet.h +++ b/OOXML/XlsxFormat/FileTypes_Spreadsheet.h @@ -93,6 +93,13 @@ namespace OOX extern const FileType TimelineCache; + extern const FileType Metadata; + + extern const FileType RdRichValue; + + extern const FileType RdRichValueStructure; + + extern const FileType RdRichValueTypes; } // namespace FileTypes } } // namespace OOX diff --git a/OOXML/XlsxFormat/Ole/OleObjects.cpp b/OOXML/XlsxFormat/Ole/OleObjects.cpp index b6f273cb8a..0db040495e 100644 --- a/OOXML/XlsxFormat/Ole/OleObjects.cpp +++ b/OOXML/XlsxFormat/Ole/OleObjects.cpp @@ -293,6 +293,40 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr COleObject::toBin() + { + auto ptr(new XLSB::OleObject); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oDvAspect.IsInit()) + { + if(m_oDvAspect == SimpleTypes::Spreadsheet::EDvAspect::Content) + ptr->dwAspect = 0x00000001; + else if(m_oDvAspect == SimpleTypes::Spreadsheet::EDvAspect::Icon) + ptr->dwAspect = 0x00000004; + } + if(m_oOleUpdate.IsInit()) + { + if(m_oOleUpdate == SimpleTypes::Spreadsheet::EOleUpdate::Always) + ptr->dwOleUpdate = 0x00000001; + else if(m_oOleUpdate == SimpleTypes::Spreadsheet::EOleUpdate::OnCall) + ptr->dwOleUpdate = 0x00000003; + } + + if(m_oShapeId.IsInit()) + ptr->shapeId = m_oShapeId->GetValue(); + + ptr->fAutoLoad = m_oAutoLoad->GetValue(); + + if(m_oProgId.IsInit()) + ptr->strProgID.value() = m_oProgId.get(); + + if(m_oLink.IsInit()) + ptr->link = m_oLink.get(); + if(m_oRid.IsInit()) + ptr->strRelID.value = m_oRid->GetValue(); + + return objectPtr; + } EElementType COleObject::getType () const { return et_x_OleObject; @@ -455,6 +489,16 @@ namespace OOX } } } + XLS::BaseObjectPtr COleObjects::toBin() + { + auto ptr(new XLSB::OLEOBJECTS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_mapOleObjects) + { + ptr->m_arBrtOleObject.push_back(i.second->toBin()); + } + return objectPtr; + } EElementType COleObjects::getType () const { return et_x_OleObjects; diff --git a/OOXML/XlsxFormat/Ole/OleObjects.h b/OOXML/XlsxFormat/Ole/OleObjects.h index 20c32d0df5..450f1997bc 100644 --- a/OOXML/XlsxFormat/Ole/OleObjects.h +++ b/OOXML/XlsxFormat/Ole/OleObjects.h @@ -136,6 +136,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -171,6 +172,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h b/OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h index 4bd71ff717..114093b2c8 100644 --- a/OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h +++ b/OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h @@ -57,7 +57,7 @@ namespace OOX WritingElement_XlsbConstructors(CSharedItems) CSharedItems(){} virtual ~CSharedItems() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -68,12 +68,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_SharedItems; } void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr writeAttributes(); nullable_bool m_oContainsBlank; nullable_bool m_oContainsDate; @@ -83,7 +85,7 @@ namespace OOX nullable_bool m_oContainsNumber; nullable_bool m_oContainsSemiMixedTypes; nullable_bool m_oContainsString; - + nullable_bool m_oLongText; nullable_double m_oMinValue; nullable_double m_oMaxValue; @@ -98,7 +100,7 @@ namespace OOX WritingElement_XlsbConstructors(COLAPGroupItems) COLAPGroupItems(){} virtual ~COLAPGroupItems() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -109,6 +111,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_OLAPGroupItems; @@ -124,7 +127,7 @@ namespace OOX WritingElement_XlsbConstructors(CDiscreteGroupingProperties) CDiscreteGroupingProperties(){} virtual ~CDiscreteGroupingProperties() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -135,6 +138,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_DiscreteGroupingProperties; @@ -150,7 +154,7 @@ namespace OOX WritingElement_XlsbConstructors(CRangeGroupingProperties) CRangeGroupingProperties(){} virtual ~CRangeGroupingProperties() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -161,6 +165,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_RangeGroupingProperties; @@ -177,9 +182,9 @@ namespace OOX nullable m_oEndDate; nullable_double m_oStartNum; - nullable_double m_oEndNum; + nullable_double m_oEndNum; nullable_double m_oGroupInterval; - + }; class CFieldGroupProperties : public WritingElement { @@ -188,7 +193,7 @@ namespace OOX WritingElement_XlsbConstructors(CFieldGroupProperties) CFieldGroupProperties(){} virtual ~CFieldGroupProperties() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -199,6 +204,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_FieldGroupProperties; @@ -208,7 +214,7 @@ namespace OOX nullable m_oBase; nullable m_oPar; - + nullable m_oDiscretePr; nullable m_oRangePr; nullable m_oGroupItems; @@ -220,7 +226,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotCacheField) CPivotCacheField(){} virtual ~CPivotCacheField() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -230,11 +236,13 @@ namespace OOX } virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const { return et_x_PivotCacheField; } + XLS::BaseObjectPtr writeAttributes(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -252,7 +260,7 @@ namespace OOX nullable m_oLevel; nullable m_oMappingCount; nullable m_oNumFmtId; - + nullable m_oSharedItems; //nullable m_oMpMap; nullable m_oFieldGroup; @@ -265,7 +273,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotCacheFields) CPivotCacheFields(){} virtual ~CPivotCacheFields() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -276,6 +284,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCacheFields; @@ -291,7 +300,7 @@ namespace OOX WritingElement_XlsbConstructors(CRangeSet) CRangeSet(){} virtual ~CRangeSet() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -302,6 +311,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_RangeSet; @@ -325,7 +335,7 @@ namespace OOX WritingElement_XlsbConstructors(CRangeSets) CRangeSets(){} virtual ~CRangeSets() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -336,6 +346,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_RangeSets; @@ -351,7 +362,7 @@ namespace OOX WritingElement_XlsbConstructors(CPageItem) CPageItem(){} virtual ~CPageItem() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -362,6 +373,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PageItem; @@ -378,7 +390,7 @@ namespace OOX WritingElement_XlsbConstructors(CPageItems) CPageItems(){} virtual ~CPageItems() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -389,6 +401,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PageItems; @@ -404,7 +417,7 @@ namespace OOX WritingElement_XlsbConstructors(CPageItemValues) CPageItemValues(){} virtual ~CPageItemValues() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -415,6 +428,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PageItemValues; @@ -447,12 +461,13 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_ConsolidationSource; } void ReadAttributes(XLS::BaseObjectPtr& obj); - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); //---------- nullable_bool m_oAutoPage; @@ -466,7 +481,7 @@ namespace OOX WritingElement_XlsbConstructors(CWorksheetSource) CWorksheetSource(){} virtual ~CWorksheetSource() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -477,6 +492,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_WorksheetSource; @@ -511,12 +527,13 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCacheSource; } void ReadAttributes(XLS::BaseObjectPtr& obj); - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); //---------- nullable m_oConnectionId; nullable m_oType; @@ -524,7 +541,7 @@ namespace OOX nullable m_oConsolidation; nullable m_oWorksheetSource; nullable m_oExtLst; - }; + }; class CPivotCacheDefinition : public WritingElement { public: @@ -547,12 +564,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCacheDefinition; } + XLS::BaseObjectPtr writeAttributes(); void ReadAttributes(XLS::BaseObjectPtr& obj); - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); //---------- nullable_bool m_oBackgroundQuery; nullable_bool m_oEnableRefresh; @@ -591,10 +610,10 @@ namespace OOX CPivotCacheDefinitionFile(OOX::Document* pMain) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain) { m_bSpreadsheets = true; - + m_pData = NULL; m_nDataLength = 0; - + bIsWritten = false; } CPivotCacheDefinitionFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain) @@ -626,9 +645,9 @@ namespace OOX const std::string srIdRecordsA( srIdRecords.begin(), srIdRecords.end() ); std::string rIdAttr = " r:id=\""+ srIdRecordsA +"\""; m_nDataLength = length + (long)rIdAttr.length(); - + m_pData = new BYTE[m_nDataLength]; - + long nTreshold = 220; memcpy(m_pData, pData, nTreshold); memcpy(m_pData + nTreshold, rIdAttr.c_str(), rIdAttr.length()); @@ -642,12 +661,10 @@ namespace OOX } } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::PivotCacheDefinition; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); @@ -664,7 +681,7 @@ namespace OOX nullable m_oPivotCashDefinition; private: CPath m_oReadPath; - + BYTE *m_pData; long m_nDataLength; @@ -678,7 +695,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotCharacterValue) CPivotCharacterValue(){} virtual ~CPivotCharacterValue() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -689,19 +706,20 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCharacterValue; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); - + nullable_string m_oValue; nullable_string m_oCaption; nullable_bool m_oCalculated; nullable_bool m_oUnused; nullable m_oCount; - + nullable_bool m_oBold; nullable_bool m_oItalic; nullable_bool m_oStrike; @@ -711,7 +729,7 @@ namespace OOX nullable m_oFormatIndex; //tpls - }; + }; class CPivotBooleanValue : public WritingElementWithChilds { public: @@ -719,7 +737,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotBooleanValue) CPivotBooleanValue(){} virtual ~CPivotBooleanValue() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -730,6 +748,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotBooleanValue; @@ -742,7 +761,7 @@ namespace OOX nullable_bool m_oCalculated; nullable_bool m_oUnused; nullable m_oCount; - }; + }; class CPivotNumericValue : public WritingElementWithChilds { public: @@ -750,7 +769,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotNumericValue) CPivotNumericValue(){} virtual ~CPivotNumericValue() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -761,19 +780,20 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotNumericValue; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); - + nullable_double m_oValue; nullable_string m_oCaption; nullable_bool m_oCalculated; nullable_bool m_oUnused; nullable m_oCount; - + nullable_bool m_oBold; nullable_bool m_oItalic; nullable_bool m_oStrike; @@ -783,7 +803,7 @@ namespace OOX nullable m_oFormatIndex; //tpls - }; + }; class CPivotDateTimeValue : public WritingElementWithChilds { public: @@ -791,7 +811,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotDateTimeValue) CPivotDateTimeValue(){} virtual ~CPivotDateTimeValue() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -802,13 +822,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotBooleanValue; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); - + nullable m_oValue; nullable_string m_oCaption; nullable_bool m_oCalculated; @@ -822,7 +843,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotErrorValue) CPivotErrorValue(){} virtual ~CPivotErrorValue() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -833,19 +854,20 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotErrorValue; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); - + nullable_string m_oValue; nullable_string m_oCaption; nullable_bool m_oCalculated; nullable_bool m_oUnused; nullable m_oCount; - + nullable_bool m_oBold; nullable_bool m_oItalic; nullable_bool m_oStrike; @@ -855,7 +877,7 @@ namespace OOX nullable m_oFormatIndex; //tpls - }; + }; class CPivotNoValue : public WritingElementWithChilds { public: @@ -863,7 +885,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotNoValue) CPivotNoValue(){} virtual ~CPivotNoValue() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -874,18 +896,19 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotNoValue; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); - + nullable_string m_oCaption; nullable_bool m_oCalculated; nullable_bool m_oUnused; nullable m_oCount; - + nullable_bool m_oBold; nullable_bool m_oItalic; nullable_bool m_oStrike; @@ -895,7 +918,7 @@ namespace OOX nullable m_oFormatIndex; //tpls - }; - + }; + } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp b/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp index 6312d219d5..22d57d25a4 100644 --- a/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp +++ b/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp @@ -54,6 +54,16 @@ void CPivotCacheDefinitionExt::fromXML(XmlUtils::CXmlLiteReader& oReader) return; oReader.ReadTillEnd(); } +XLS::BaseObjectPtr CPivotCacheDefinitionExt::toBin() +{ + auto ptr(new XLSB::PCD14); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPCD14); + ptr->m_BrtBeginPCD14 = XLS::BaseObjectPtr{ptr1}; + if(m_oPivotCacheId.IsInit()) + ptr1->icacheId = m_oPivotCacheId.get(); + return objectPtr; +} void CPivotCacheDefinitionExt::fromBin(XLS::BaseObjectPtr& obj) { if(obj->get_type() == XLS::typePCD14) diff --git a/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.h b/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.h index 2f1c35cdb9..8a3cefbcea 100644 --- a/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.h +++ b/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.h @@ -61,6 +61,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCacheDefinitionExt; diff --git a/OOXML/XlsxFormat/Pivot/PivotCacheRecords.h b/OOXML/XlsxFormat/Pivot/PivotCacheRecords.h index 8f00b1f924..354d07ff75 100644 --- a/OOXML/XlsxFormat/Pivot/PivotCacheRecords.h +++ b/OOXML/XlsxFormat/Pivot/PivotCacheRecords.h @@ -57,7 +57,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotCacheRecord) CPivotCacheRecord(){} virtual ~CPivotCacheRecord() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -68,6 +68,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCacheRecord; @@ -96,11 +97,12 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCacheRecords; } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); nullable m_oCount; nullable m_oExtLst; @@ -114,7 +116,7 @@ namespace OOX CPivotCacheRecordsFile(OOX::Document* pMain) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain) { m_bSpreadsheets = true; - + m_pData = NULL; m_nDataLength = 0; } @@ -145,12 +147,10 @@ namespace OOX memcpy(m_pData, pData, length); } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::PivotCacheRecords; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); @@ -165,11 +165,12 @@ namespace OOX } //--------------------------------------------------------------------- nullable m_oPivotCacheRecords; - //--------- + //--------- BYTE *m_pData = NULL; DWORD m_nDataLength = 0; private: - CPath m_oReadPath; + CPath m_oReadPath; + std::wstring prepareData() const; }; } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Pivot/PivotTable.h b/OOXML/XlsxFormat/Pivot/PivotTable.h index 8c0c732877..f3b94ce4b0 100644 --- a/OOXML/XlsxFormat/Pivot/PivotTable.h +++ b/OOXML/XlsxFormat/Pivot/PivotTable.h @@ -101,6 +101,8 @@ namespace OOX WritingStringNullableAttrInt(L"v", m_oV, m_oV->GetValue()); writer.WriteString(L"/>"); } + XLS::BaseObjectPtr toBinPrfItem(); + XLS::BaseObjectPtr toBinItemIndex(); void fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -176,7 +178,7 @@ namespace OOX CField(){} virtual ~CField() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -204,7 +206,7 @@ namespace OOX WritingElement_ReadAttributes_ReadSingle ( oReader, L"x", m_oX ) WritingElement_ReadAttributes_End( oReader ) } - + nullable_int m_oX; }; class CColumnRowFields : public WritingElementWithChilds @@ -214,7 +216,7 @@ namespace OOX WritingElement_XlsbConstructors(CColumnRowFields) CColumnRowFields(){} virtual ~CColumnRowFields() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -226,6 +228,8 @@ namespace OOX void toXML2(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBinRows(); + XLS::BaseObjectPtr toBinCols(); virtual EElementType getType () const { return et_x_ColumnRowFields; @@ -241,7 +245,7 @@ namespace OOX WritingElement_XlsbConstructors(CDataField) CDataField(){} virtual ~CDataField() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -252,13 +256,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_DataField; } void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable_int m_oBaseField; nullable m_oBaseItem; nullable m_oFld; @@ -276,7 +281,7 @@ namespace OOX WritingElement_XlsbConstructors(CDataFields) CDataFields(){} virtual ~CDataFields() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -287,6 +292,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_DataFields; @@ -302,7 +308,7 @@ namespace OOX WritingElement_XlsbConstructors(CPageField) CPageField(){} virtual ~CPageField() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -313,13 +319,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PageField; } void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable_int m_oFld; nullable_int m_oHier; nullable m_oItem; @@ -335,7 +342,7 @@ namespace OOX WritingElement_XlsbConstructors(CPageFields) CPageFields(){} virtual ~CPageFields() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -346,6 +353,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PageFields; @@ -361,7 +369,7 @@ namespace OOX WritingElement_XlsbConstructors(CFieldItem) CFieldItem(){} virtual ~CFieldItem() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -372,13 +380,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_FieldItem; } void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable_bool m_oChild; nullable_bool m_oExpanded; nullable_bool m_oDrillAcross; @@ -399,7 +408,7 @@ namespace OOX WritingElement_XlsbConstructors(CFieldItems) CFieldItems(){} virtual ~CFieldItems() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -410,12 +419,13 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_FieldItems; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable m_oCount; }; class CReference : public WritingElement @@ -425,7 +435,7 @@ namespace OOX WritingElement_XlsbConstructors(CReference) CReference(){} virtual ~CReference() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -436,13 +446,15 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_Reference; } + XLS::BaseObjectPtr writeAttributes(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable_bool m_oAvgSubtotal; nullable_bool m_oByPosition; nullable_bool m_oCountASubtotal; @@ -471,7 +483,7 @@ namespace OOX WritingElement_XlsbConstructors(CReferences) CReferences(){} virtual ~CReferences() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -482,12 +494,13 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_References; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable m_oCount; }; class CPivotArea : public WritingElement @@ -497,7 +510,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotArea) CPivotArea(){} virtual ~CPivotArea() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -508,10 +521,12 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotArea; } + XLS::BaseObjectPtr writeAttribures(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -538,7 +553,7 @@ namespace OOX WritingElement_XlsbConstructors(CAutoSortScope) CAutoSortScope(){} virtual ~CAutoSortScope() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -549,12 +564,13 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_AutoSortScope; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader){} - + nullable m_oPivotArea; }; class CPivotField : public WritingElement @@ -564,7 +580,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotField) CPivotField(){} virtual ~CPivotField() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -575,13 +591,15 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotField; } void ReadAttributes(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr writeAttributes(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable_bool m_oAllDrilled; nullable_bool m_oAutoShow; nullable_bool m_oAvgSubtotal; @@ -630,7 +648,7 @@ namespace OOX nullable_string m_oUniqueMemberProperty; nullable_bool m_oVarPSubtotal; nullable_bool m_oVarSubtotal; - + nullable m_oAutoSortScope; nullable m_oItems; nullable m_oExtLst; @@ -642,7 +660,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotFields) CPivotFields(){} virtual ~CPivotFields() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -653,6 +671,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotFields; @@ -668,7 +687,7 @@ namespace OOX WritingElement_XlsbConstructors(CColumnRowItem) CColumnRowItem(){} virtual ~CColumnRowItem() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -679,17 +698,18 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_ColumnRowItem; } void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable m_oI; nullable m_oR; nullable m_oT; - }; + }; class CColumnRowItems : public WritingElementWithChilds { public: @@ -697,7 +717,7 @@ namespace OOX WritingElement_XlsbConstructors(CColumnRowItems) CColumnRowItems(){} virtual ~CColumnRowItems() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -709,6 +729,8 @@ namespace OOX void toXML2(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBinRows(); + XLS::BaseObjectPtr toBinCols(); virtual EElementType getType () const { return et_x_ColumnRowItems; @@ -724,7 +746,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotTableFormat) CPivotTableFormat(){} virtual ~CPivotTableFormat() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -735,6 +757,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotTableFormat; @@ -744,7 +767,7 @@ namespace OOX nullable m_oAction; nullable m_oDxfId; - + nullable m_oPivotArea; nullable m_oExtLst; }; @@ -755,7 +778,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotTableFormats) CPivotTableFormats(){} virtual ~CPivotTableFormats() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -766,6 +789,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotTableFormats; @@ -781,7 +805,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotTableStyleInfo) CPivotTableStyleInfo(){} virtual ~CPivotTableStyleInfo() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -797,6 +821,7 @@ namespace OOX if ( oReader.IsEmptyNode() ) return; } + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -823,7 +848,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotTableLocation) CPivotTableLocation(){} virtual ~CPivotTableLocation() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -840,6 +865,7 @@ namespace OOX return; } void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotTableLocation; @@ -876,12 +902,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotTableDefinition; } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr writeAttributes(); //---------- nullable m_oColFields; nullable m_oColItems; @@ -961,11 +989,11 @@ namespace OOX nullable_bool m_oUseAutoFormatting; nullable_string m_oVacatedStyle; nullable_bool m_oVisualTotals; - + nullable m_oCreatedVersion; nullable m_oMinRefreshableVersion; nullable m_oUpdatedVersion; - + nullable m_oDataPosition; nullable m_oAutoFormatId; nullable m_oCacheId; @@ -980,7 +1008,7 @@ namespace OOX CPivotTableFile(OOX::Document* pMain) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain) { m_bSpreadsheets = true; - + m_pData = NULL; m_nDataLength = 0; } @@ -1011,12 +1039,10 @@ namespace OOX memcpy(m_pData, pData, length); } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::PivotTable; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index dcc4ca17f8..684274ac5b 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -38,6 +38,7 @@ #include "../../XlsbFormat/PivotTableStream.h" #include "../../XlsbFormat/PivotCacheDefStream.h" #include "../../XlsbFormat/Biff12_unions/PIVOTCACHERECORDS.h" +#include "../../XlsbFormat/Biff12_records/BeginPivotCacheRecords.h" #include "../../XlsbFormat/Biff12_unions/PIVOTCACHERECORD.h" #include "../../XlsbFormat/Biff12_unions/PIVOTCACHERECORDDT.h" #include "../../XlsbFormat/Biff12_unions/PCDIDT.h" @@ -59,6 +60,7 @@ #include "../../XlsbFormat/Biff12_records/BeginSXLocation.h" #include "../../XlsbFormat/Biff12_unions/SXVDS.h" #include "../../XlsbFormat/Biff12_unions/SXVD.h" +#include "../../XlsbFormat/Biff12_records/BeginSXVDs.h" #include "../../XlsbFormat/Biff12_records/BeginSXVD.h" #include "../../XlsbFormat/Biff12_unions/SXVIS.h" #include "../../XlsbFormat/Biff12_unions/SXVI.h" @@ -76,7 +78,9 @@ #include "../../XlsbFormat/Biff12_records/BeginISXVDRws.h" #include "../../XlsbFormat/Biff12_records/BeginISXVDCols.h" #include "../../XlsbFormat/Biff12_unions/SXLIRWS.h" +#include "../../XlsbFormat/Biff12_records/BeginSXLIRws.h" #include "../../XlsbFormat/Biff12_unions/SXLICOLS.h" +#include "../../XlsbFormat/Biff12_records/BeginSXLICols.h" #include "../../XlsbFormat/Biff12_unions/SXLI.h" #include "../../XlsbFormat/Biff12_unions/ISXVIS.h" #include "../../XlsbFormat/Biff12_records/BeginSXLI.h" @@ -84,6 +88,7 @@ #include "../../XlsbFormat/Biff12_unions/SXDIS.h" #include "../../XlsbFormat/Biff12_unions/SXDI.h" #include "../../XlsbFormat/Biff12_records/BeginSXDI.h" +#include "../../XlsbFormat/Biff12_records/BeginSXDIs.h" #include "../../XlsbFormat/Biff12_unions/SXFORMATS.h" #include "../../XlsbFormat/Biff12_unions/SXFORMAT.h" #include "../../XlsbFormat/Biff12_records/BeginSXFormat.h" @@ -93,6 +98,7 @@ #include "../../XlsbFormat/Biff12_records/BeginSXPI.h" #include "../../XlsbFormat/Biff12_records/BeginPivotCacheDef.h" #include "../../XlsbFormat/Biff12_unions/PCDFIELDS.h" +#include "../../XlsbFormat/Biff12_records/BeginPCDFields.h" #include "../../XlsbFormat/Biff12_unions/PCDFIELD.h" #include "../../XlsbFormat/Biff12_records/BeginPCDField.h" #include "../../XlsbFormat/Biff12_unions/PCDFATBL.h" @@ -121,6 +127,9 @@ #include "../../XlsbFormat/Biff12_unions/PCDSCSET.h" #include "../../XlsbFormat/Biff12_records/BeginPCDSCSet.h" #include "../../XlsbFormat/Biff12_records/PCRRecord.h" +#include "../../XlsbFormat/Biff12_unions/FRTSXVIEW.h" +#include "../../XlsbFormat/Biff12_unions/SXVIEW14.h" +#include "../../XlsbFormat/Biff12_records/BeginSXView14.h" #include "../../XlsbFormat/Biff12_unions/PNAMES.h" #include "../../XlsbFormat/Biff12_unions/PNAME.h" @@ -133,6 +142,9 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../ComplexTypes_Spreadsheet.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + +#include namespace OOX { namespace Spreadsheet @@ -159,6 +171,10 @@ namespace Spreadsheet //pivotTableStream.reset(); } } + XLS::BaseObjectPtr CPivotTableFile::WriteBin() const + { + return m_oPivotTableDefinition->toBin(); + } void CPivotTableFile::read(const CPath& oRootPath, const CPath& oPath) { @@ -183,30 +199,44 @@ namespace Spreadsheet } void CPivotTableFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { - if(m_oPivotTableDefinition.IsInit()) + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) { - NSStringUtils::CStringBuilder sXml; - - sXml.WriteString(L""); - m_oPivotTableDefinition->toXML(sXml); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); - - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); } - else if(m_nDataLength > 0 && m_pData) + else { - NSFile::CFileBinary oFile; - oFile.CreateFileW(oPath.GetPath()); - oFile.WriteFile(m_pData, m_nDataLength); - oFile.CloseFile(); + if(m_oPivotTableDefinition.IsInit()) + { + NSStringUtils::CStringBuilder sXml; - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); + sXml.WriteString(L""); + m_oPivotTableDefinition->toXML(sXml); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } + else if(m_nDataLength > 0 && m_pData) + { + NSFile::CFileBinary oFile; + oFile.CreateFileW(oPath.GetPath()); + oFile.WriteFile(m_pData, m_nDataLength); + oFile.CloseFile(); + } } + oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); + IFileContainer::Write( oPath, oDirectory, oContent ); } + const OOX::FileType CPivotTableFile::type() const + { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::PivotTableBin; + } + return OOX::Spreadsheet::FileTypes::PivotTable; + } //------------------------------------ void CPivotTableDefinition::toXML(NSStringUtils::CStringBuilder& writer) const { @@ -363,6 +393,199 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if (L"extLst" == sName) m_oExtLst = oReader; } } + XLS::BaseObjectPtr CPivotTableDefinition::toBin() + { + auto ptr(new XLSB::PivotTableStream); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_BrtBeginSXView = writeAttributes(); + if(m_oLocation.IsInit()) + ptr->m_SXLOCATION = m_oLocation->toBin(); + if(m_oPivotFields.IsInit()) + ptr->m_SXVDS = m_oPivotFields->toBin(); + if(m_oRowFields.IsInit()) + ptr->m_ISXVDRWS = m_oRowFields->toBinRows(); + if(m_oColFields.IsInit()) + ptr->m_ISXVDCOLS = m_oColFields->toBinCols(); + if(m_oRowItems.IsInit()) + ptr->m_SXLIRWS = m_oRowItems->toBinRows(); + if(m_oColItems.IsInit()) + ptr->m_SXLICOLS = m_oColItems->toBinCols(); + + if(m_oDataFields.IsInit()) + ptr->m_SXDIS = m_oDataFields->toBin(); + if(m_oFormats.IsInit()) + ptr->m_SXFORMATS = m_oFormats->toBin(); + if(m_oPivotTableStyleInfo.IsInit()) + ptr->m_BrtTableStyleClient = m_oPivotTableStyleInfo->toBin(); + if(m_oPageFields.IsInit()) + ptr->m_SXPIS = m_oPageFields->toBin(); + + /*auto frt(new XLSB::FRTSXVIEW); + auto sxview14(new XLSB::SXVIEW14); + auto beginsxview(new XLSB::BeginSXView14); + ptr->m_FRTSXVIEW = XLS::BaseObjectPtr{frt}; + frt->m_SXVIEW14 = XLS::BaseObjectPtr{sxview14}; + sxview14->m_BrtBeginSXView14 = XLS::BaseObjectPtr{beginsxview}; + beginsxview->fAutoApply = false; + beginsxview->fCalcMembersInAdvFilters = false; + beginsxview->fEnableWB = false; + beginsxview->fFillDownLabelsDefault = false; + beginsxview->fShowValuesRow = false; + beginsxview->sxma.value() = 0; + beginsxview->irstAltText = 0xFFFFFFFF; + beginsxview->irstAltTextSummary = 0xFFFFFFFF; + beginsxview->irstWeight = 0xFFFFFFFF;*/ + + return objectPtr; + } + XLS::BaseObjectPtr CPivotTableDefinition::writeAttributes() + { + auto ptr(new XLSB::BeginSXView); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oApplyBorderFormats.IsInit()) + ptr->ibitAtrBdr = m_oApplyBorderFormats.get(); + if (m_oApplyFontFormats.IsInit()) + ptr->ibitAtrFnt = m_oApplyFontFormats.get(); + if (m_oApplyNumberFormats.IsInit()) + ptr->ibitAtrNum = m_oApplyNumberFormats.get(); + if (m_oApplyPatternFormats.IsInit()) + ptr->ibitAtrPat = m_oApplyPatternFormats.get(); + if (m_oApplyWidthHeightFormats.IsInit()) + ptr->ibitAtrProt = m_oApplyWidthHeightFormats.get(); + if (m_oApplyAlignmentFormats.IsInit()) + ptr->ibitAtrAlc = m_oApplyAlignmentFormats.get(); + + if (m_oAsteriskTotals.IsInit()) + ptr->fHideTotAnnotation = m_oAsteriskTotals.get(); + else + ptr->fHideTotAnnotation = false; + if (m_oVisualTotals.IsInit()) + ptr->fNotVisualTotals = m_oVisualTotals.get(); + else + ptr->fNotVisualTotals = false; + if (m_oAutoFormatId.IsInit()) + ptr->itblAutoFmt = m_oAutoFormatId->GetValue(); + else + ptr->itblAutoFmt = 0; + if (m_oCacheId.IsInit()) + ptr->idCache = m_oCacheId->GetValue(); + if (m_oChartFormat.IsInit()) + ptr->dwCrtFmtId = m_oChartFormat->GetValue(); + else + ptr->dwCrtFmtId = 0; + if (m_oColGrandTotals.IsInit()) + ptr->fColGrand = m_oColGrandTotals.get(); + + if (m_oColHeaderCaption.IsInit()) ptr->irstColHdrName = m_oColHeaderCaption.get(); + else + ptr->fUseColHdrName = false; + if (m_oCompact.IsInit()) ptr->fDefaultCompact = m_oCompact.get(); + if (m_oCompactData.IsInit()) ptr->fCompactData = m_oCompactData.get(); + if (m_oCreatedVersion.IsInit()) ptr->bVerSxMacro = m_oCreatedVersion->GetValue(); + if (m_oCustomListSort.IsInit()) ptr->fDontUseCustomLists = !m_oCustomListSort.get(); + else ptr->fDontUseCustomLists = false; + if (m_oDataCaption.IsInit()) ptr->irstData = m_oDataCaption.get(); + else + ptr->irstData = 0xFFFFFFFF; + if (m_oDataOnRows.IsInit()) ptr->fDefaultCompact = m_oDataOnRows.get(); + if (m_oDataPosition.IsInit()) ptr->ipos4Data = m_oDataPosition->GetValue(); + else ptr->ipos4Data = -1; + if (m_oDisableFieldList.IsInit()) ptr->fDisableFList = m_oDisableFieldList.get(); + else ptr->fDisableFList = false; + if (m_oEditData.IsInit()) ptr->fEnableDataEd = m_oEditData.get(); + else + ptr->fEnableDataEd = false; + if (m_oEnableDrill.IsInit()) ptr->fEnableDrilldown = m_oEnableDrill.get(); + if (m_oEnableFieldProperties.IsInit()) ptr->fEnableFieldDialog = m_oEnableFieldProperties.get(); + if (m_oEnableWizard.IsInit()) ptr->fEnableWizard = m_oEnableWizard.get(); + if (m_oErrorCaption.IsInit()) ptr->irstErrorString = m_oErrorCaption.get(); + else + { + ptr->fEmptyDisplayErrorString = true; + ptr->fDisplayErrorString = false; + } + if (m_oFieldListSortAscending.IsInit()) ptr->fNonDefaultSortInFlist = m_oFieldListSortAscending.get(); + else ptr->fNonDefaultSortInFlist = false; + if (m_oFieldPrintTitles.IsInit()) ptr->fPrintTitles = m_oFieldPrintTitles.get(); + else ptr->fPrintTitles = false; + if (m_oGrandTotalCaption.IsInit()) ptr->irstGrand = m_oGrandTotalCaption.get(); + else + ptr->fDisplayGrand = false; + if (m_oGridDropZones.IsInit()) ptr->fNewDropZones = !m_oGridDropZones.get(); + if (m_oImmersive.IsInit()) ptr->fTurnOffImmersive = m_oImmersive.get(); + else ptr->fTurnOffImmersive = false; + if (m_oIndent.IsInit()) ptr->cIndentInc = m_oIndent->GetValue(); + if (m_oItemPrintTitles.IsInit()) ptr->fRepeatItemsOnEachPrintedPage = m_oItemPrintTitles.get(); + if (m_oMdxSubqueries.IsInit()) ptr->fDefaultCompact = m_oMdxSubqueries.get(); + if (m_oMergeItem.IsInit()) ptr->fMergeLabels = m_oMergeItem.get(); + else ptr->fMergeLabels = false; + if (m_oMinRefreshableVersion.IsInit()) ptr->bVerSxUpdateableMin = m_oMinRefreshableVersion->GetValue(); + if (m_oMissingCaption.IsInit()) ptr->irstNullString = m_oMissingCaption.get(); + else + ptr->fEmptyDisplayNullString = true; + if (m_oMultipleFieldFilters.IsInit()) ptr->fSingleFilterPerField = !m_oMultipleFieldFilters.get(); + if (m_oName.IsInit()) ptr->irstName = m_oName.get(); + else + ptr->irstName = 0xFFFFFFFF; + if (m_oOutline.IsInit()) ptr->fDefaultOutline = m_oOutline.get(); + if (m_oOutlineData.IsInit()) ptr->fOutlineData = m_oOutlineData.get(); + if (m_oPageOverThenDown.IsInit()) ptr->fAcrossPageLay = m_oPageOverThenDown.get(); + else ptr->fAcrossPageLay = false; + if (m_oPageStyle.IsInit()) ptr->irstPageFieldStyle = m_oPageStyle.get(); + else + ptr->fDisplayPageFieldStyle = false; + if (m_oPageWrap.IsInit()) ptr->cWrapPage = m_oPageWrap->GetValue(); + else + ptr->cWrapPage = 0; + if (m_oPivotTableStyle.IsInit()) ptr->irstTableStyle = m_oPivotTableStyle.get(); + else + ptr->fDisplayTableStyle = false; + if (m_oPreserveFormatting.IsInit()) ptr->fPreserveFormatting = m_oPreserveFormatting.get(); + if (m_oPrintDrill.IsInit()) ptr->fPrintDrillIndicators = m_oPrintDrill.get(); + else ptr->fPrintDrillIndicators = false; + if (m_oPublished.IsInit()) ptr->fPublished = m_oPublished.get(); + else ptr->fPublished = false; + if (m_oRowGrandTotals.IsInit()) ptr->fRwGrand = m_oRowGrandTotals.get(); + if (m_oRowHeaderCaption.IsInit()) ptr->irstRwHdrName = m_oRowHeaderCaption.get(); + else + ptr->fUseRwHdrName = false; + if (m_oShowCalcMbrs.IsInit()) ptr->fNotViewCalculatedMembers = !m_oShowCalcMbrs.get(); + else ptr->fNotViewCalculatedMembers = false; + if (m_oShowDataDropDown.IsInit()) ptr->fHideDDData = !m_oShowDataDropDown.get(); + else ptr->fHideDDData = false; + if (m_oShowDataTips.IsInit()) ptr->fNoPivotTips = !m_oShowDataTips.get(); + else ptr->fNoPivotTips = false; + if (m_oShowDrill.IsInit()) ptr->fHideDrillIndicators = !m_oShowDrill.get(); + else ptr->fHideDrillIndicators = false; + if (m_oShowDropZones.IsInit()) ptr->fNoStencil = !m_oShowDropZones.get(); + else ptr->fNoStencil = false; + if (m_oShowEmptyCol.IsInit()) ptr->fIncludeEmptyCol = m_oShowEmptyCol.get(); + else ptr->fIncludeEmptyCol = false; + if (m_oShowEmptyRow.IsInit()) ptr->fIncludeEmptyRw = m_oShowEmptyRow.get(); + else ptr->fIncludeEmptyRw = false; + if (m_oShowError.IsInit()) ptr->fDisplayErrorString = m_oShowError.get(); + if (m_oShowHeaders.IsInit()) ptr->fNoHeaders = !m_oShowHeaders.get(); + else ptr->fNoHeaders = false; + if (m_oShowItems.IsInit()) ptr->fDisplayImmediateItems = m_oShowItems.get(); + if (m_oShowMemberPropertyTips.IsInit()) ptr->fMemPropsInTips = m_oShowMemberPropertyTips.get(); + if (m_oShowMissing.IsInit()) ptr->fDisplayNullString = m_oShowMissing.get(); + if (m_oShowMultipleLabel.IsInit()) ptr->fPageMultipleItemLabel = m_oShowMultipleLabel.get(); + if (m_oSubtotalHiddenItems.IsInit()) ptr->fSubtotalHiddenPageItems = m_oSubtotalHiddenItems.get(); + else ptr->fSubtotalHiddenPageItems = false; + if (m_oTag.IsInit()) ptr->irstTag = m_oTag.get(); + else + ptr->fDisplayTag = false; + if (m_oUpdatedVersion.IsInit()) ptr->bVerSxLastUpdated = m_oUpdatedVersion->GetValue(); + if (m_oUseAutoFormatting.IsInit()) ptr->fAutoFormat = m_oUseAutoFormatting.get(); + if (m_oVacatedStyle.IsInit()) ptr->irstVacateStyle = m_oVacatedStyle.get(); + else + ptr->fDisplayVacateStyle = false; + ptr->sxaxis4Data = 2; + ptr->fReenterOnLoadOnce = false; + + return objectPtr; + } void CPivotTableDefinition::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -400,6 +623,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(ptr->m_SXPIS != nullptr) m_oPageFields = ptr->m_SXPIS; + if(ptr->m_FRTSXVIEW) + { + auto result = static_cast(ptr->m_FRTSXVIEW.get()); + auto result2 = static_cast(result->m_SXVIEW14.get()); + auto result3 = static_cast(result2->m_BrtBeginSXView14.get()); + auto result4 = result3; + } } } void CPivotTableDefinition::ReadAttributes(XLS::BaseObjectPtr& obj) @@ -754,6 +984,34 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CColumnRowFields::toBinRows() + { + auto ptr(new XLSB::ISXVDRWS); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginISXVDRws); + ptr->m_BrtBeginISXVDRws = XLS::BaseObjectPtr{ptr1}; + if(m_oCount.IsInit()) + ptr1->cisxvd = m_oCount->GetValue(); + else + ptr1->cisxvd = m_arrItems.size(); + for(auto i:m_arrItems) + ptr1->rgisxvdrws.push_back(i->m_oX.get()); + return objectPtr; + } + XLS::BaseObjectPtr CColumnRowFields::toBinCols() + { + auto ptr(new XLSB::ISXVDCOLS); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginISXVDCols); + ptr->m_BrtBeginISXVDCols = XLS::BaseObjectPtr{ptr1}; + if(m_oCount.IsInit()) + ptr1->cisxvd = m_oCount->GetValue(); + else + ptr1->cisxvd = m_arrItems.size(); + for(auto i:m_arrItems) + ptr1->rgisxvdcols.push_back(i->m_oX.get()); + return objectPtr; + } void CColumnRowFields::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -799,6 +1057,28 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CColumnRowItems::toBinRows() + { + auto ptr(new XLSB::SXLIRWS); + auto ptr1(new XLSB::BeginSXLIRws); + ptr1->csxlis = m_arrItems.size(); + ptr->m_BrtBeginSXLIRws = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXLI.push_back(i->toBin()); + return objectPtr; + } + XLS::BaseObjectPtr CColumnRowItems::toBinCols() + { + auto ptr(new XLSB::SXLICOLS); + auto ptr1(new XLSB::BeginSXLICols); + ptr1->csxlis = m_arrItems.size(); + ptr->m_BrtBeginSXLICols = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXLI.push_back(i->toBin()); + return objectPtr; + } void CColumnRowItems::fromBin(XLS::BaseObjectPtr& obj) { if(obj->get_type() == XLS::typeSXLIRWS) @@ -860,6 +1140,87 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CColumnRowItem::toBin() + { + auto ptr(new XLSB::SXLI); + auto size = 0; + + for(auto i:m_arrItems) + { + if(i->m_oV.IsInit()) + size++; + + } + + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginSXLI); + ptr1->cisxvis = size; + ptr->m_BrtBeginSXLI = XLS::BaseObjectPtr{ptr1}; + if(m_oI.IsInit()) + ptr1->iData = m_oI->GetValue(); + else + ptr1->iData = 0; + if(m_oR.IsInit()) + ptr1->cSic = m_oR->GetValue(); + else + ptr1->cSic = 0; + if(m_oT.IsInit()) + { + if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeData) + ptr1->itmtype = XLSB::PivotItemType::PITDATA; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeDefault) + ptr1->itmtype = XLSB::PivotItemType::PITDEFAULT; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeSum) + ptr1->itmtype = XLSB::PivotItemType::PITSUM; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeCountA) + ptr1->itmtype = XLSB::PivotItemType::PITCOUNTA; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeAverage) + ptr1->itmtype = XLSB::PivotItemType::PITAVG; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeMax) + ptr1->itmtype = XLSB::PivotItemType::PITMAX; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeMin) + ptr1->itmtype = XLSB::PivotItemType::PITMIN; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeProduct) + ptr1->itmtype = XLSB::PivotItemType::PITPRODUCT; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeCount) + ptr1->itmtype = XLSB::PivotItemType::PITCOUNT; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeStdDev) + ptr1->itmtype = XLSB::PivotItemType::PITSTDDEV; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeStdDevP) + ptr1->itmtype = XLSB::PivotItemType::PITSTDDEVP; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeVar) + ptr1->itmtype = XLSB::PivotItemType::PITVAR; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeVarP) + ptr1->itmtype = XLSB::PivotItemType::PITVARP; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeGrandTotalt) + ptr1->itmtype = XLSB::PivotItemType::PITGRAND; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeBlank) + ptr1->itmtype = XLSB::PivotItemType::PITBLANK; + } + else + { + ptr1->itmtype = XLSB::PivotItemType::PITDATA; + } + + if(ptr1->cisxvis > 0) + { + + auto ptr2(new XLSB::ISXVIS(size)); + ptr2->_cisxvis = size; + + ptr->m_ISXVIS = XLS::BaseObjectPtr{ptr2}; + auto ptr3(new XLSB::BeginISXVIs(size)); + ptr3->_cisxvis = size; + ptr2->m_BrtBeginISXVIs = XLS::BaseObjectPtr{ptr3}; + + for(auto i:m_arrItems) + if(i->m_oV.IsInit()) + ptr3->rgisxvis.push_back(i->m_oV->GetValue()); + else + ptr3->rgisxvis.push_back(0); + } + return objectPtr; + } void CColumnRowItem::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1007,6 +1368,17 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CDataFields::toBin() + { + auto ptr(new XLSB::SXDIS); + auto ptr1(new XLSB::BeginSXDIs); + ptr->m_BrtBeginSXDIs = XLS::BaseObjectPtr{ptr1}; + ptr1->csxdis = m_arrItems.size(); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXDI.push_back(i->toBin()); + return objectPtr; + } void CDataFields::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -1042,6 +1414,86 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oExtLst = oReader; } } + XLS::BaseObjectPtr CDataField::toBin() + { + auto ptr1(new XLSB::SXDI); + XLS::BaseObjectPtr objectPtr(ptr1); + auto ptr(new XLSB::BeginSXDI); + ptr1->m_BrtBeginSXDI = XLS::BaseObjectPtr{ptr}; + + if(m_oBaseField.IsInit()) + ptr->isxvd = m_oBaseField.get(); + if(m_oBaseItem.IsInit()) + ptr->isxvi = m_oBaseItem->GetValue(); + if(m_oFld.IsInit()) + ptr->isxvdData = m_oFld->GetValue(); + if(m_oNumFmtId.IsInit()) + ptr->ifmt.ifmt = m_oNumFmtId->GetValue(); + else + ptr->ifmt.ifmt = 0; + if(m_oName.IsInit()) + { + ptr->stDisplayName = m_oName.get(); + ptr->fLoadDisplayName = true; + } + else + ptr->fLoadDisplayName = false; + if(m_oShowDataAs.IsInit()) + { + if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsNormal) + ptr->df = XLSB::ShowDataAs::NORMAL; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsDifference) + ptr->df = XLSB::ShowDataAs::DIFFERENCE_; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsPercentOff) + ptr->df = XLSB::ShowDataAs::PERCENT; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsPercentDiff) + ptr->df = XLSB::ShowDataAs::PERCENTDIFF; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsIndex) + ptr->df = XLSB::ShowDataAs::INDEX; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsPercentOfTotal) + ptr->df = XLSB::ShowDataAs::PERCENTOFTOTAL; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsPercentOfCol) + ptr->df = XLSB::ShowDataAs::PERCENTOFCOL; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsPercentOfRow) + ptr->df = XLSB::ShowDataAs::PERCENTOFROW; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsRunTotal) + ptr->df = XLSB::ShowDataAs::PERCENTOFRUNTOTAL; + } + else + { + ptr->df = XLSB::ShowDataAs::NORMAL; + } + if(m_oSubtotal.IsInit()) + { + if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionSum) + ptr->iiftab = XLSB::DataConsolidationFunction::SUM; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionCount) + ptr->iiftab = XLSB::DataConsolidationFunction::COUNT; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionAverage) + ptr->iiftab = XLSB::DataConsolidationFunction::AVERAGE; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionMaximum) + ptr->iiftab = XLSB::DataConsolidationFunction::MAX; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionMinimum) + ptr->iiftab = XLSB::DataConsolidationFunction::MIN; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionProduct) + ptr->iiftab = XLSB::DataConsolidationFunction::PRODUCT; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionCountNums) + ptr->iiftab = XLSB::DataConsolidationFunction::COUNTNUM; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionStdDev) + ptr->iiftab = XLSB::DataConsolidationFunction::STDDEV; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionStdDevP) + ptr->iiftab = XLSB::DataConsolidationFunction::STDDEVP; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionVariance) + ptr->iiftab = XLSB::DataConsolidationFunction::STDVAR; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionVarP) + ptr->iiftab = XLSB::DataConsolidationFunction::STDVARP; + } + else + { + ptr->iiftab = XLSB::DataConsolidationFunction::SUM; + } + return objectPtr; + } void CDataField::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1203,6 +1655,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CPageFields::toBin() + { + auto ptr(new XLSB::SXPIS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXPI.push_back(i->toBin()); + return objectPtr; + } void CPageFields::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -1236,6 +1696,29 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oExtLst = oReader; } } + XLS::BaseObjectPtr CPageField::toBin() + { + auto ptr1(new XLSB::SXPI); + XLS::BaseObjectPtr objectPtr(ptr1); + auto ptr(new XLSB::BeginSXPI); + ptr1->m_BrtBeginSXPI = XLS::BaseObjectPtr{ptr}; + + if(m_oFld.IsInit()) + ptr->isxvd = m_oFld.get(); + if(m_oItem.IsInit()) + ptr->isxvi = m_oItem->GetValue(); + if(m_oHier.IsInit()) + ptr->isxth = m_oHier.get(); + if(m_oName.IsInit()) + ptr->irstUnique = m_oName.get(); + else + ptr->irstUnique = 0xFFFFFFFF; + if(m_oCap.IsInit()) + ptr->irstDisplay = m_oCap.get(); + else + ptr->irstDisplay = 0xFFFFFFFF; + return objectPtr; + } void CPageField::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1328,6 +1811,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CFieldItems::toBin() + { + auto ptr(new XLSB::SXVIS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXVI.push_back(i->toBin()); + return objectPtr; + } void CFieldItems::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -1358,6 +1849,76 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if ( oReader.IsEmptyNode() ) return; } + XLS::BaseObjectPtr CFieldItem::toBin()// fix name init + { + auto ptr1(new XLSB::SXVI); + XLS::BaseObjectPtr objectPtr(ptr1); + + auto ptr(new XLSB::BeginSXVI); + ptr1->m_BrtBeginSXVI = XLS::BaseObjectPtr{ptr}; + + if(m_oChild.IsInit()) + ptr->fHasChildrenEst = m_oChild.get(); + if(m_oExpanded.IsInit()) + ptr->fDrilledMember = m_oExpanded.get(); + if(m_oDrillAcross.IsInit()) + ptr->fCollapsedMember = m_oDrillAcross.get(); + if(m_oCalculated.IsInit()) + ptr->fFormula = m_oCalculated.get(); + if(m_oHidden.IsInit()) + ptr->fHidden = m_oHidden.get(); + if(m_oMissing.IsInit()) + ptr->fMissing = m_oMissing.get(); + if(m_oUserCaption.IsInit()) + { + ptr->displayName = m_oUserCaption.get(); + ptr->fDisplayName = true; + } + else + { + ptr->fDisplayName = false; + } + if(m_oCharacter.IsInit()) + ptr->fOlapFilterSelected = m_oCharacter.get(); + if(m_oHideDetails.IsInit()) + ptr->fHideDetail = m_oHideDetails.get(); + if(m_oItemIndex.IsInit()) + ptr->iCache = m_oItemIndex->GetValue(); + if(m_oItemType.IsInit()) + { + if(m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeData) + ptr->itmtype = XLSB::PivotItemType::PITDATA; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeDefault) + ptr->itmtype = XLSB::PivotItemType::PITDEFAULT; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeSum) + ptr->itmtype = XLSB::PivotItemType::PITSUM; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeCountA) + ptr->itmtype = XLSB::PivotItemType::PITCOUNTA; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeAverage) + ptr->itmtype = XLSB::PivotItemType::PITAVG; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeMax) + ptr->itmtype = XLSB::PivotItemType::PITMAX; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeMin) + ptr->itmtype = XLSB::PivotItemType::PITMIN; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeProduct) + ptr->itmtype = XLSB::PivotItemType::PITPRODUCT; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeCount) + ptr->itmtype = XLSB::PivotItemType::PITCOUNT; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeStdDev) + ptr->itmtype = XLSB::PivotItemType::PITSTDDEV; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeStdDevP) + ptr->itmtype = XLSB::PivotItemType::PITSTDDEVP; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeVar) + ptr->itmtype = XLSB::PivotItemType::PITVAR; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeVarP) + ptr->itmtype = XLSB::PivotItemType::PITVARP; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeGrandTotalt) + ptr->itmtype = XLSB::PivotItemType::PITGRAND; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeBlank) + ptr->itmtype = XLSB::PivotItemType::PITBLANK; + } + return objectPtr; + } void CFieldItem::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1520,7 +2081,17 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(new CPivotField(item)); } } - + XLS::BaseObjectPtr CPivotFields::toBin() + { + auto ptr(new XLSB::SXVDS); + auto ptr1(new XLSB::BeginSXVDs); + ptr1->csxvds = m_arrItems.size(); + ptr->m_BrtBeginSXVDs = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXVD.push_back(i->toBin()); + return objectPtr; + } void CPivotFields::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -1626,6 +2197,269 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" //m_oExtLst = ptr->m_FRTSXVD; } } + XLS::BaseObjectPtr CPivotField::toBin() + { + auto ptr(new XLSB::SXVD); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_BrtBeginSXVD = writeAttributes(); + if(m_oItems.IsInit()) + ptr->m_SXVIS = m_oItems->toBin(); + if(m_oAutoSortScope.IsInit()) + ptr->m_AUTOSORTSCOPE = m_oAutoSortScope->toBin(); + return objectPtr; + } + XLS::BaseObjectPtr CPivotField::writeAttributes() + { + auto ptr(new XLSB::BeginSXVD); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oAllDrilled.IsInit()) + ptr->fDrilledLevel = m_oAllDrilled.get(); + else + ptr->fDrilledLevel = false; + + if(m_oAutoShow.IsInit()) + ptr->fAutoShow = m_oAutoShow.get(); + else + ptr->fAutoShow = false; + + if(m_oAvgSubtotal.IsInit()) + ptr->fAverage = m_oAvgSubtotal.get(); + else + ptr->fAverage = false; + + ptr->sxaxis.bCol = false; + ptr->sxaxis.bPage = false; + ptr->sxaxis.bRw = false; + ptr->sxaxis.bData = false; + + if(m_oAxis.IsInit()) + { + if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisCol) + ptr->sxaxis.bCol = true; + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisPage) + ptr->sxaxis.bPage = true; + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisRow) + ptr->sxaxis.bRw = true; + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisValues) + ptr->sxaxis.bData = true; + } + else + ptr->sxaxis.bData = true; + if(m_oCompact.IsInit()) + ptr->fCompact = m_oCompact.get(); + else + ptr->fCompact = false; + + if(m_oCountASubtotal.IsInit()) + ptr->fCounta = m_oCountASubtotal.get(); + else + ptr->fCounta = false; + + if(m_oCountSubtotal.IsInit()) + ptr->fCount = m_oCountSubtotal.get(); + else + ptr->fCount = false; + if(m_oDataField.IsInit()) + ptr->fDrilledLevel = m_oDataField.get(); + else + ptr->fDrilledLevel = false; + if(m_oDataSourceSort.IsInit()) + ptr->fTensorSort = m_oDataSourceSort.get(); + else + ptr->fTensorSort = false; + if(m_oDefaultAttributeDrillState.IsInit()) + ptr->fItemsDrilledByDefault = m_oDefaultAttributeDrillState.get(); + else + ptr->fItemsDrilledByDefault = false; + if(m_oDefaultSubtotal.IsInit()) + ptr->fDefault = m_oDefaultSubtotal.get(); + else + ptr->fDefault = false; + if(m_oDragOff.IsInit()) + ptr->fDragToHide = m_oDragOff.get(); + else + ptr->fDragToHide = false; + + if (m_oDragToCol.IsInit()) + ptr->fDragToColumn = m_oDragToCol.get(); + else + ptr->fDragToColumn = false; + if (m_oDragToData.IsInit()) + ptr->fDragToData = m_oDragToData.get(); + else + ptr->fDragToData = false; + if (m_oDragToPage.IsInit()) + ptr->fDragToPage = m_oDragToPage.get(); + else + ptr->fDragToPage = false; + if (m_oDragToRow.IsInit()) + ptr->fDragToRow = m_oDragToRow.get(); + else + ptr->fDragToRow = false; + if (m_oHiddenLevel.IsInit()) + ptr->fHiddenLvl = m_oHiddenLevel.get(); + else + ptr->fHiddenLvl = false; + if (m_oHideNewItems.IsInit()) + ptr->fHideNewItems = m_oHideNewItems.get(); + else + ptr->fHideNewItems = false; + if (m_oIncludeNewItemsInFilter.IsInit()) + ptr->fFilterInclusive = m_oIncludeNewItemsInFilter.get(); + else + ptr->fFilterInclusive = false; + if (m_oInsertBlankRow.IsInit()) + ptr->fInsertBlankRow = m_oInsertBlankRow.get(); + else + ptr->fInsertBlankRow = false; + if (m_oInsertPageBreak.IsInit()) + ptr->fPageBreaksBetweenItems = m_oInsertPageBreak.get(); + else + ptr->fPageBreaksBetweenItems = false; + + if(m_oItemPageCount.IsInit()) + ptr->citmAutoShow = m_oItemPageCount->GetValue(); + else + ptr->citmAutoShow = 0; + + if(m_oMaxSubtotal.IsInit()) + ptr->fMax = m_oMaxSubtotal.get(); + else + ptr->fMax = false; + + if(m_oMeasureFilter.IsInit()) + ptr->fHasAdvFilter = m_oMeasureFilter.get(); + else + ptr->fHasAdvFilter = false; + + if(m_oMinSubtotal.IsInit()) + ptr->fMin = m_oMinSubtotal.get(); + else + ptr->fMin = false; + + if(m_oMultipleItemSelectionAllowed.IsInit()) + ptr->fEnableMultiplePageItems = m_oMultipleItemSelectionAllowed.get(); + else + ptr->fEnableMultiplePageItems = false; + + if(m_oName.IsInit()) + ptr->irstName = m_oName.get(); + else + ptr->fDisplayName = false; + + + if (m_oNonAutoSortDefault.IsInit()) + ptr->fNotAutoSortDft = m_oNonAutoSortDefault.get(); + else + ptr->fNotAutoSortDft = false; + + if (m_oNumFmtId.IsInit()) + ptr->ifmt = m_oNumFmtId->GetValue(); + else + ptr->ifmt = 0; + + if (m_oOutline.IsInit()) + ptr->fOutline = m_oOutline.get(); + else + ptr->fOutline = false; + + if (m_oProductSubtotal.IsInit()) + ptr->fProduct = m_oProductSubtotal.get(); + else + ptr->fProduct = false; + + if (m_oRankBy.IsInit()) + ptr->isxdiAutoShow = m_oRankBy->GetValue(); + else + ptr->isxdiAutoShow = 0; + + if (m_oServerField.IsInit()) + ptr->fServerBased = m_oServerField.get(); + else + ptr->fServerBased = false; + + if (m_oShowAll.IsInit()) + ptr->fShowAllItems = m_oShowAll.get(); + else + ptr->fShowAllItems = false; + + if (m_oShowDropDowns.IsInit()) + ptr->fHideDD = !m_oShowDropDowns.get(); + else + ptr->fHideDD = false; + + if (m_oShowPropAsCaption.IsInit()) + ptr->fMemPropDisplayInCaption = m_oShowPropAsCaption.get(); + else + ptr->fMemPropDisplayInCaption = false; + + if (m_oShowPropCell.IsInit()) + ptr->fMemPropDisplayInReport = m_oShowPropCell.get(); + else + ptr->fMemPropDisplayInReport = false; + + if (m_oShowPropTip.IsInit()) + ptr->fMemPropDisplayInTip = m_oShowPropTip.get(); + else + ptr->fMemPropDisplayInTip = false; + if(m_oSortType.IsInit()) + { + if(m_oSortType->GetValue() != SimpleTypes::Spreadsheet::EFieldSortType::sortManual) + ptr->fAutoSort = true; + if(m_oSortType->GetValue() == SimpleTypes::Spreadsheet::EFieldSortType::sortAscending) + ptr->fAscendSort = true; + else + ptr->fAscendSort = false; + } + + if (m_oStdDevPSubtotal.IsInit()) + ptr->fStdevp = m_oStdDevPSubtotal.get(); + else + ptr->fStdevp = false; + + if (m_oStdDevSubtotal.IsInit()) + ptr->fStdev = m_oStdDevSubtotal.get(); + else + ptr->fStdev = false; + + if (m_oSubtotalCaption.IsInit()) + ptr->irstSub.value() = m_oSubtotalCaption.get(); + else + ptr->fDisplaySub = false; + + if (m_oSubtotalTop.IsInit()) + ptr->fSubtotalAtTop = !m_oSubtotalTop.get(); + else + ptr->fSubtotalAtTop = false; + + if (m_oSumSubtotal.IsInit()) + ptr->fSum = m_oSumSubtotal.get(); + else + ptr->fSum = false; + + if (m_oTopAutoShow.IsInit()) + ptr->fTopAutoShow = !m_oTopAutoShow.get(); + else + ptr->fTopAutoShow = false; + + if (m_oUniqueMemberProperty.IsInit()) + ptr->irstMemberPropertyCaption = m_oUniqueMemberProperty.get(); + else + ptr->fUseMemPropCaption = false; + + if (m_oVarPSubtotal.IsInit()) + ptr->fVarp = m_oVarPSubtotal.get(); + else + ptr->fVarp = false; + + if (m_oVarSubtotal.IsInit()) + ptr->fVar = m_oVarSubtotal.get(); + else + ptr->fVar = false; + + return objectPtr; + } void CPivotField::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1756,7 +2590,6 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else m_oSortType = SimpleTypes::Spreadsheet::EFieldSortType::sortAscending; - if(ptr->fStdevp) m_oStdDevPSubtotal = ptr->fStdevp; @@ -1876,6 +2709,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CReferences::toBin() + { + auto ptr(new XLSB::PRFILTERS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arPRFILTER.push_back(i->toBin()); + return objectPtr; + } void CReferences::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1961,7 +2802,71 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CReference::toBin() + { + auto ptr(new XLSB::PRFILTER); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_BrtBeginPRFilter = writeAttributes(); + ///@todo дописать конветрацию + ptr->m_arPRFITEM.push_back(m_oX->toBinPrfItem()); + return objectPtr; + } + XLS::BaseObjectPtr CReference::writeAttributes() + { + auto ptr(new XLSB::BeginPRFilter); + XLS::BaseObjectPtr objectPtr(ptr); + if (m_oAvgSubtotal.IsInit()) + ptr->prFilter.itmtypeAVERAGE = m_oAvgSubtotal.get(); + if (m_oByPosition.IsInit()) + ptr->prFilter.itmtypeAVERAGE = m_oByPosition.get(); + + if (m_oCountASubtotal.IsInit()) + ptr->prFilter.itmtypeCOUNTA = m_oCountASubtotal.get(); + + if (m_oCountSubtotal.IsInit()) + ptr->prFilter.itmtypeCOUNT = m_oCountSubtotal.get(); + + if (m_oDefaultSubtotal.IsInit()) + ptr->prFilter.itmtypeDEFAULT = m_oDefaultSubtotal.get(); + + if (m_oMaxSubtotal.IsInit()) + ptr->prFilter.itmtypeMAX = m_oMaxSubtotal.get(); + + if (m_oMinSubtotal.IsInit()) + ptr->prFilter.itmtypeMIN = m_oMinSubtotal.get(); + + if (m_oProductSubtotal.IsInit()) + ptr->prFilter.itmtypePRODUCT = m_oProductSubtotal.get(); + + if (m_oRelative.IsInit()) + ptr->prFilter.itmtypeAVERAGE = m_oRelative.get(); + + if (m_oSelected.IsInit()) + ptr->prFilter.fSelected = m_oSelected.get(); + + if (m_oStdDevPSubtotal.IsInit()) + ptr->prFilter.itmtypeSTDEVP = m_oStdDevPSubtotal.get(); + + if (m_oStdDevSubtotal.IsInit()) + ptr->prFilter.itmtypeSTDEV = m_oStdDevSubtotal.get(); + + if (m_oSumSubtotal.IsInit()) + ptr->prFilter.itmtypeSUM = m_oSumSubtotal.get(); + + if (m_oVarPSubtotal.IsInit()) + ptr->prFilter.itmtypeVARP = m_oVarPSubtotal.get(); + + if (m_oVarSubtotal.IsInit()) + ptr->prFilter.itmtypeVAR = m_oVarSubtotal.get(); + + if (m_oField.IsInit()) + ptr->prFilter.isxvd = m_oField->GetValue(); + + if (m_oCount.IsInit()) + ptr->prFilter.cItems = m_oCount->GetValue(); + return objectPtr; + } void CReference::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -2062,6 +2967,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CPivotTableFormats::toBin() + { + auto ptr(new XLSB::SXFORMATS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXFORMAT.push_back(i->toBin()); + return objectPtr; + } void CPivotTableFormats::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -2100,6 +3013,22 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oExtLst = oReader; } } + XLS::BaseObjectPtr CPivotTableFormat::toBin() + { + auto ptr(new XLSB::SXFORMAT); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oDxfId.IsInit()) + { + auto ptr1(new XLSB::BeginSXFormat); + ptr->m_BrtBeginSXFormat = XLS::BaseObjectPtr{ptr1}; + ptr1->dxfid = m_oDxfId->GetValue(); + if(m_oAction.IsInit()) + ptr1->rlType = m_oAction->GetValue(); + } + if(m_oPivotArea.IsInit()) + ptr->m_PIVOTRULE = m_oPivotArea->toBin(); + return objectPtr; + } void CPivotTableFormat::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -2166,6 +3095,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oPivotArea = ptr->m_PIVOTRULE; } } + XLS::BaseObjectPtr CAutoSortScope::toBin() + { + auto ptr(new XLSB::AUTOSORTSCOPE); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_PIVOTRULE = m_oPivotArea->toBin(); + return objectPtr; + } //------------------------------------ void CPivotArea::toXML(NSStringUtils::CStringBuilder& writer) const { @@ -2207,6 +3143,69 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oExtLst = oReader; } } + XLS::BaseObjectPtr CPivotArea::toBin() + { + auto ptr(new XLSB::PIVOTRULE); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_BrtBeginPRule = writeAttribures(); + if(m_oReferences.IsInit()) + ptr->m_PRFILTERS = m_oReferences->toBin(); + return objectPtr; + } + XLS::BaseObjectPtr CPivotArea::writeAttribures() + { + auto ptr(new XLSB::BeginPRule); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oAxis.IsInit()) + { + if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisCol) + ptr->pruleheaderdata.sxaxis.bCol = true; + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisPage) + ptr->pruleheaderdata.sxaxis.bPage = true; + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisRow) + ptr->pruleheaderdata.sxaxis.bRw = true; + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisValues) + ptr->pruleheaderdata.sxaxis.bData = true; + } + if(m_oCacheIndex.IsInit()) + ptr->pruleheaderdata.fCacheBased = m_oCacheIndex.get(); + if(m_oCollapsedLevelsAreSubtotals.IsInit()) + ptr->pruleheaderdata.fFuzzy = m_oCollapsedLevelsAreSubtotals.get(); + if(m_oDataOnly.IsInit()) + ptr->pruleheaderdata.fDataOnly = m_oDataOnly.get(); + if(m_oField.IsInit()) + ptr->pruleheaderdata.isxvd = m_oField.get(); + if(m_oFieldPosition.IsInit()) + ptr->pruleheaderdata.iDim = m_oFieldPosition->GetValue(); + if(m_oGrandCol.IsInit()) + ptr->pruleheaderdata.fGrandCol = m_oGrandCol.get(); + if(m_oGrandRow.IsInit()) + ptr->pruleheaderdata.fGrandRw = m_oGrandRow.get(); + if(m_oLabelOnly.IsInit()) + ptr->pruleheaderdata.fLabelOnly = m_oLabelOnly.get(); + if(m_oOffsetRef.IsInit()) + ptr->pruleheaderdata.rfxLoc = m_oOffsetRef.get(); + if(m_oOutline.IsInit()) + ptr->pruleheaderdata.fLineMode = m_oOutline.get(); + if(m_oType.IsInit()) + { + if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaNone) + ptr->pruleheaderdata.isxrtype = 0x00; + else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaNormal) + ptr->pruleheaderdata.isxrtype = 0x01; + else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaData) + ptr->pruleheaderdata.isxrtype = 0x02; + else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaAll) + ptr->pruleheaderdata.isxrtype = 0x03; + else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaOrigin) + ptr->pruleheaderdata.isxrtype = 0x04; + else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaFieldButton) + ptr->pruleheaderdata.isxrtype = 0x05; + else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaTopEnd) + ptr->pruleheaderdata.isxrtype = 0x06; + } + return objectPtr; + } void CPivotArea::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -2339,6 +3338,32 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } + XLS::BaseObjectPtr CPivotTableLocation::toBin() + { + auto ptr1(new XLSB::SXLOCATION); + XLS::BaseObjectPtr objectPtr(ptr1); + auto ptr(new XLSB::BeginSXLocation); + ptr1->m_BrtBeginSXLocation = XLS::BaseObjectPtr{ptr}; + + if(m_oColPageCount.IsInit()) + ptr->ccolPage = m_oColPageCount->GetValue(); + else + ptr->ccolPage = 0; + if(m_oFirstDataCol.IsInit()) + ptr->colFirstData = m_oFirstDataCol->GetValue(); + if(m_oFirstDataRow.IsInit()) + ptr->rwFirstData = m_oFirstDataRow->GetValue(); + if(m_oFirstHeaderRow.IsInit()) + ptr->rwFirstHead = m_oFirstHeaderRow->GetValue(); + if(m_oRowPageCount.IsInit()) + ptr->crwPage = m_oRowPageCount->GetValue(); + else + ptr->crwPage = 0; + if(m_oRef.IsInit()) + ptr->rfxGeom = m_oRef.get(); + return objectPtr; + } + void CPivotTableLocation::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -2385,6 +3410,31 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oName = ptr->stStyleName.value(); } } + XLS::BaseObjectPtr CPivotTableStyleInfo::toBin() + { + auto ptr(new XLSB::TableStyleClient); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oShowColHeaders.IsInit()) + ptr->fColumnHeaders = m_oShowColHeaders.get(); + if(m_oShowRowHeaders.IsInit()) + ptr->fRowHeaders = m_oShowRowHeaders.get(); + if(m_oShowColStripes.IsInit()) + ptr->fColumnStripes = m_oShowColStripes.get(); + else + ptr->fColumnStripes = false; + if(m_oShowRowStripes.IsInit()) + ptr->fRowStripes = m_oShowRowStripes.get(); + else + ptr->fRowStripes = false; + if(m_oShowLastColumn.IsInit()) + ptr->fLastColumn = m_oShowLastColumn.get(); + if(m_oName.IsInit()) + ptr->stStyleName = m_oName.get(); + else + ptr->stStyleName = 0xFFFFFFFF; + + return objectPtr; + } void CPivotTableStyleInfo::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -2416,7 +3466,12 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" //pivotCacheDefStream.reset(); } } + XLS::BaseObjectPtr CPivotCacheDefinitionFile::WriteBin() const + { + auto pivotCacheDefStream = m_oPivotCashDefinition->toBin(); + return pivotCacheDefStream; + } void CPivotCacheDefinitionFile::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -2445,29 +3500,43 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (bIsWritten) return; bIsWritten = true; - if(m_oPivotCashDefinition.IsInit()) + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) { - NSStringUtils::CStringBuilder sXml; - - sXml.WriteString(L""); - m_oPivotCashDefinition->toXML(sXml); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); - - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); } - else if(m_nDataLength > 0 && m_pData) + else { - NSFile::CFileBinary oFile; - oFile.CreateFileW(oPath.GetPath()); - oFile.WriteFile(m_pData, m_nDataLength); - oFile.CloseFile(); + if(m_oPivotCashDefinition.IsInit()) + { + NSStringUtils::CStringBuilder sXml; - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); + sXml.WriteString(L""); + m_oPivotCashDefinition->toXML(sXml); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } + else if(m_nDataLength > 0 && m_pData) + { + NSFile::CFileBinary oFile; + oFile.CreateFileW(oPath.GetPath()); + oFile.WriteFile(m_pData, m_nDataLength); + oFile.CloseFile(); + } } + oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); + IFileContainer::Write( oPath, oDirectory, oContent ); + } + const OOX::FileType CPivotCacheDefinitionFile::type() const + { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::PivotCacheDefinitionBin; + } + return OOX::Spreadsheet::FileTypes::PivotCacheDefinition; } //------------------------------------ void CPivotCacheDefinition::toXML(NSStringUtils::CStringBuilder& writer) const @@ -2527,6 +3596,102 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if (L"extLst" == sName) m_oExtLst = oReader; } } + XLS::BaseObjectPtr CPivotCacheDefinition::toBin() + { + auto ptr(new XLSB::PivotCacheDefStream); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_BrtBeginPivotCacheDef = writeAttributes(); + if(m_oCacheFields.IsInit()) + ptr->m_PCDFIELDS = m_oCacheFields->toBin(); + if(m_oCacheSource.IsInit()) + ptr->m_PCDSOURCE = m_oCacheSource->toBin(); + if(m_oExtLst.IsInit()) + ptr->m_FRTPIVOTCACHEDEF = m_oExtLst->toBinPivotCache(); + return objectPtr; + } + XLS::BaseObjectPtr CPivotCacheDefinition::writeAttributes() + { + auto ptr(new XLSB::BeginPivotCacheDef); + XLS::BaseObjectPtr objectPtr(ptr); + if (m_oBackgroundQuery.IsInit()) + ptr->fBackgroundQuery = m_oBackgroundQuery.get(); + else + ptr->fBackgroundQuery = false; + + if (m_oEnableRefresh.IsInit()) + ptr->fEnableRefresh = !m_oEnableRefresh.get(); + + if (m_oRid.IsInit()) + ptr->stRelIDRecords.value = m_oRid->GetValue(); + else + ptr->fLoadRelIDRecords = false; + + if (m_oInvalid.IsInit()) + ptr->fInvalid = m_oInvalid.get(); + else + ptr->fInvalid = false; + + if (m_oCreatedVersion.IsInit()) + ptr->bVerCacheCreated = m_oCreatedVersion->GetValue(); + + if (m_oMinRefreshableVersion.IsInit()) + ptr->bVerCacheRefreshableMin = m_oMinRefreshableVersion->GetValue(); + else + ptr->bVerCacheRefreshableMin = 0; + if (m_oMissingItemsLimit.IsInit()) + ptr->citmGhostMax = m_oMissingItemsLimit->GetValue(); + else + ptr->citmGhostMax = -1; + + if (m_oOptimizeMemory.IsInit()) + ptr->fOptimizeCache = m_oOptimizeMemory.get(); + else + ptr->fOptimizeCache = false; + + if (m_oRecordCount.IsInit()) + ptr->cRecords = m_oRecordCount->GetValue(); + + if (m_oRefreshedBy.IsInit()) + ptr->stRefreshedWho = m_oRefreshedBy.get(); + else + ptr->stRefreshedWho = L"Aspose"; + + if (m_oRefreshedDateIso.IsInit()) + ptr->xnumRefreshedDate.data.value = std::stod(m_oRefreshedDateIso->GetValue()); + + if (m_oRefreshedVersion.IsInit()) + ptr->bVerCacheLastRefresh = m_oRefreshedVersion->GetValue(); + + if (m_oRefreshOnLoad.IsInit()) + ptr->fRefreshOnLoad = m_oRefreshOnLoad.get(); + else + ptr->fRefreshOnLoad = false; + + if (m_oSaveData.IsInit()) + ptr->fSaveData = m_oSaveData.get(); + + if (m_oSupportAdvancedDrill.IsInit()) + ptr->fSupportAttribDrill = m_oSupportAdvancedDrill.get(); + else + ptr->fSupportAttribDrill = false; + + if (m_oSupportSubquery.IsInit()) + ptr->fSupportSubquery = m_oSupportSubquery.get(); + else + ptr->fSupportSubquery = false; + + if (m_oTupleCache.IsInit()) + ptr->fSheetData = m_oTupleCache.get(); + else + ptr->fSheetData = false; + + if (m_oUpgradeOnRefresh.IsInit()) + ptr->fUpgradeOnRefresh = m_oUpgradeOnRefresh.get(); + else + ptr->fUpgradeOnRefresh = false; + + return objectPtr; + } void CPivotCacheDefinition::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -2657,7 +3822,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); - if ( L"cacheFields" == sName ) + if ( L"cacheField" == sName ) { CPivotCacheField* pPivotCacheField = new CPivotCacheField(); *pPivotCacheField = oReader; @@ -2665,6 +3830,17 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CPivotCacheFields::toBin() + { + auto ptr(new XLSB::PCDFIELDS); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPCDFields); + ptr1->cFields = m_arrItems.size(); + ptr->m_BrtBeginPCDFields = XLS::BaseObjectPtr{ptr1}; + for(auto i:m_arrItems) + ptr->m_arPCDFIELD.push_back(i->toBin()); + return objectPtr; + } void CPivotCacheFields::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -2751,6 +3927,91 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oExtLst = oReader; } } + XLS::BaseObjectPtr CPivotCacheField::toBin() + { + auto ptr(new XLSB::PCDFIELD); + XLS::BaseObjectPtr objectPtr(ptr); + + ptr->m_BrtBeginPCDField = writeAttributes(); + if(m_oSharedItems.IsInit()) + ptr->m_PCDFATBL = m_oSharedItems->toBin(); + if(m_oFieldGroup.IsInit()) + ptr->m_PCDFGROUP = m_oFieldGroup->toBin(); + return objectPtr; + } + XLS::BaseObjectPtr CPivotCacheField::writeAttributes() + { + auto ptr(new XLSB::BeginPCDField); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oName.IsInit()) + ptr->stFldName = m_oName.get(); + + if (m_oCaption.IsInit()) + ptr->stFldCaption = m_oCaption.get(); + else + ptr->fCaption = false; + + if (m_oDatabaseField.IsInit()) + ptr->fSrcField = m_oDatabaseField.get(); + else + ptr->fSrcField = true; + + if (m_oServerField.IsInit()) + ptr->fServerBased = m_oServerField.get(); + else + ptr->fServerBased = false; + + if (m_oFormula.IsInit()) + ptr->fldFmla = m_oFormula.get(); + else + { + ptr->fLoadFmla = false; + ptr->fldFmla.cSxName = 0; + } + + if (m_oHierarchy.IsInit()) + ptr->ihdb = m_oHierarchy.get(); + else + ptr->ihdb = 0; + + if (m_oMemberPropertyField.IsInit()) + ptr->fOlapMemPropField = m_oMemberPropertyField.get(); + else + ptr->fOlapMemPropField = false; + + if (m_oPropertyName.IsInit()) + ptr->stMemPropName.value() = m_oPropertyName.get(); + else + ptr->fLoadPropName = false; + + if (m_oSqlType.IsInit()) + ptr->wTypeSql = m_oSqlType.get(); + else + ptr->wTypeSql = 0; + + if (m_oUniqueList.IsInit()) + ptr->fCantGetUniqueItems = !m_oUniqueList.get(); + else + ptr->fCantGetUniqueItems = false; + + if (m_oLevel.IsInit()) + ptr->isxtl = m_oLevel->GetValue(); + else + ptr->isxtl = 0; + if(m_oMappingCount.IsInit()) + ptr->cIsxtmps = m_oMappingCount->GetValue(); + else + ptr->cIsxtmps = 0; + if(m_oNumFmtId.IsInit()) + ptr->ifmt = m_oNumFmtId->GetValue(); + else + ptr->ifmt = 0xFFFFFFFF; + + ptr->cbRgisxtmp = 0; + + return objectPtr; + } void CPivotCacheField::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -2923,6 +4184,120 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CSharedItems::toBin() + { + auto ptr(new XLSB::PCDFATBL); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_BrtBeginPCDFAtbl = writeAttributes(); + for(auto i:m_arrItems) + { + + if(i->getType() == et_x_PivotBooleanValue) + { + auto valueBool = static_cast(i); + XLS::BaseObjectPtr element = valueBool->toBin(); + ptr->m_arSource.push_back(element); + continue; + } + else if(i->getType() == et_x_PivotNoValue) + { + auto noVal = static_cast(i); + XLS::BaseObjectPtr element = noVal->toBin(); + ptr->m_arSource.push_back(element); + continue; + } + else if(i->getType() == et_x_PivotNumericValue) + { + auto numVal = static_cast(i); + XLS::BaseObjectPtr element = numVal->toBin(); + ptr->m_arSource.push_back(element); + continue; + } + else if(i->getType() == et_x_PivotCharacterValue) + { + auto charVal = static_cast(i); + XLS::BaseObjectPtr element = charVal->toBin(); + ptr->m_arSource.push_back(element); + continue; + } + else if(i->getType() == et_x_PivotDateTimeValue) + { + auto dateValue = static_cast(i); + XLS::BaseObjectPtr element = dateValue->toBin(); + ptr->m_arSource.push_back(element); + continue; + } + else if(i->getType() == et_x_PivotErrorValue) + { + auto errorVal = static_cast(i); + XLS::BaseObjectPtr element = errorVal->toBin(); + ptr->m_arSource.push_back(element); + continue; + } + } + return objectPtr; + } + + XLS::BaseObjectPtr CSharedItems::writeAttributes() + { + auto ptr(new XLSB::BeginPCDFAtbl); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oContainsBlank.IsInit()) + ptr->fHasBlankItem = m_oContainsBlank.get(); + else + ptr->fHasBlankItem = false; + if(m_oContainsDate.IsInit()) + ptr->fDateInField = m_oContainsDate.get(); + else + ptr->fDateInField = false; + if(m_oContainsInteger.IsInit()) + ptr->fIntField = m_oContainsInteger.get(); + else + ptr->fIntField = false; + if(m_oContainsMixedTypes.IsInit()) + ptr->fMixedTypesIgnoringBlanks = m_oContainsMixedTypes.get(); + else + ptr->fMixedTypesIgnoringBlanks = false; + if(m_oContainsNonDate.IsInit()) + ptr->fNonDates = m_oContainsNonDate.get(); + else + ptr->fNonDates = false; + if(m_oContainsNumber.IsInit()) + ptr->fNumField = m_oContainsNumber.get(); + else + ptr->fNumField = false; + if(m_oContainsSemiMixedTypes.IsInit()) + ptr->fTextEtcField = m_oContainsSemiMixedTypes.get(); + else + ptr->fTextEtcField = false; + if(m_oContainsString.IsInit()) + ptr->fHasTextItem = m_oContainsString.get(); + else + ptr->fHasTextItem = false; + if(m_oLongText.IsInit()) + ptr->fHasLongTextItem = m_oLongText.get(); + else + ptr->fHasLongTextItem = false; + if(m_oCount.IsInit()) + ptr->citems = m_oCount->GetValue(); + else + ptr->citems = 0; + if(m_oMinDate.IsInit() && m_oMaxDate.IsInit()) + { + ptr->xnumMin.data.value = std::stod(m_oMinDate->GetValue()); + ptr->xnumMax.data.value =std::stod(m_oMaxDate->GetValue()); + } + else + { + if(m_oMinValue.IsInit()) + ptr->xnumMin.data.value = m_oMinValue.get(); + if(m_oMaxValue.IsInit()) + ptr->xnumMax.data.value = m_oMaxValue.get(); + } + + return objectPtr; + } void CSharedItems::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -3135,6 +4510,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CDiscreteGroupingProperties::toBin() + { + auto ptr(new XLSB::PCDFGDISCRETE); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arBrtPCDIIndex.push_back(i->toBinItemIndex()); + return objectPtr; + } void CDiscreteGroupingProperties::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -3221,6 +4604,63 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr COLAPGroupItems::toBin() + { + auto ptr(new XLSB::PCDFGITEMS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + { + auto boolVal = static_cast(i); + if(boolVal) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = boolVal->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + continue; + } + auto dataValue = static_cast(i); + if(dataValue) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = dataValue->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + continue; + } + auto errorValue = static_cast(i); + if(errorValue) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = errorValue->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + continue; + } + auto noVal = static_cast(i); + if(noVal) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = noVal->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + continue; + } + auto numericVal = static_cast(i); + if(numericVal) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = numericVal->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + continue; + } + auto charVal = static_cast(i); + if(charVal) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = charVal->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + continue; + } + } + return objectPtr; + } void COLAPGroupItems::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -3348,6 +4788,44 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if ( oReader.IsEmptyNode() ) return; } + XLS::BaseObjectPtr CRangeGroupingProperties::toBin() + { + auto ptr1(new XLSB::PCDFGRANGE); + XLS::BaseObjectPtr objectPtr(ptr1); + auto ptr(new XLSB::BeginPCDFGRange); + ptr1->m_BrtBeginPCDFGRange = XLS::BaseObjectPtr{ptr}; + + if(m_oAutoStart.IsInit()) + ptr->fAutoStart = m_oAutoStart.get(); + if(m_oAutoEnd.IsInit()) + ptr->fAutoEnd = m_oAutoEnd.get(); + if(m_oGroupInterval.IsInit()) + ptr->xnumBy.data.value = m_oGroupInterval.get(); + if(m_oStartDate.IsInit() && m_oEndDate.IsInit()) + { + ptr->xnumStart.data.value = std::stod(m_oStartDate->GetValue()); + ptr->xnumEnd.data.value = std::stod(m_oEndDate->GetValue()); + } + else + { + if(m_oStartNum.IsInit()) + ptr->xnumStart.data.value = m_oStartNum.get(); + if(m_oEndNum.IsInit()) + ptr->xnumEnd.data.value = m_oEndNum.get(); + } + if(m_oGroupBy.IsInit()) + { + if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByNumericRanges) ptr->iByType = 0x00; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupBySeconds) ptr->iByType = 0x01; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByMinutes) ptr->iByType = 0x02; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByHours) ptr->iByType = 0x03; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByDays) ptr->iByType = 0x04; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByMonths) ptr->iByType = 0x05; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByQuarters) ptr->iByType = 0x06; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByYears) ptr->iByType = 0x07; + } + return objectPtr; + } void CRangeGroupingProperties::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -3471,6 +4949,51 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CPivotCharacterValue::toBin() + { + if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) + { + auto ptr(new XLSB::PCDIAString); + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCaption.IsInit()) + ptr->info.stCaption = m_oCaption.get(); + if(m_oCalculated.IsInit()) + ptr->info.fFmla = m_oCalculated.get(); + if(m_oUnused.IsInit()) + ptr->info.fGhost = m_oUnused.get(); + if(m_oCount.IsInit()) + ptr->info.cIMemProps = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr->info.rgIMemProps.push_back(i->m_oV.get()); + return objectPtr; + } + else + { + auto ptr(new XLSB::PCDIString); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); + if(m_oValue.IsInit()) + ptr->st = m_oValue.get(); + if(m_oBold.IsInit()) + ptr->sxvcellextra->fSrvFmtBold = m_oBold.get(); + if(m_oItalic.IsInit()) + ptr->sxvcellextra->fSrvFmtItalic = m_oItalic.get(); + if(m_oStrike.IsInit()) + ptr->sxvcellextra->fSrvFmtStrikethrough = m_oStrike.get(); + if(m_oUnderline.IsInit()) + ptr->sxvcellextra->fSrvFmtUnderline = m_oUnderline.get(); + if(m_oFormatIndex.IsInit()) + ptr->sxvcellextra->isfci = m_oFormatIndex->GetValue(); + if(m_oBackColor.IsInit()) + ptr->sxvcellextra->cvBack.fromHex(m_oBackColor->GetValue()); + if(m_oForeColor.IsInit()) + ptr->sxvcellextra->cvFore.fromHex(m_oForeColor->GetValue()); + return objectPtr; + } + } void CPivotCharacterValue::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -3598,6 +5121,71 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CPivotErrorValue::toBin() + { + if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) + { + auto ptr(new XLSB::PCDIAError); + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); + if(m_oValue.IsInit()) + { + if (m_oValue == L"#NULL!") ptr->err = 0x00; + else if (m_oValue == L"#DIV/0!") ptr->err = 0x07; + else if (m_oValue == L"#VALUE!") ptr->err = 0x0F; + else if (m_oValue == L"#REF!") ptr->err = 0x17; + else if (m_oValue == L"#NAME?") ptr->err = 0x1D; + else if (m_oValue == L"#NUM!") ptr->err = 0x24; + else if (m_oValue == L"#N/A") ptr->err = 0x2A; + else if (m_oValue == L"#GETTING_DATA") ptr->err = 0x2B; + } + if(m_oCaption.IsInit()) + ptr->info.stCaption = m_oCaption.get(); + if(m_oCalculated.IsInit()) + ptr->info.fFmla = m_oCalculated.get(); + if(m_oUnused.IsInit()) + ptr->info.fGhost = m_oUnused.get(); + if(m_oCount.IsInit()) + ptr->info.cIMemProps = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr->info.rgIMemProps.push_back(i->m_oV.get()); + return objectPtr; + } + else + { + auto ptr(new XLSB::PCDIError); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); + if(m_oValue.IsInit()) + { + if (m_oValue == L"#NULL!") ptr->err = 0x00; + else if (m_oValue == L"#DIV/0!") ptr->err = 0x07; + else if (m_oValue == L"#VALUE!") ptr->err = 0x0F; + else if (m_oValue == L"#REF!") ptr->err = 0x17; + else if (m_oValue == L"#NAME?") ptr->err = 0x1D; + else if (m_oValue == L"#NUM!") ptr->err = 0x24; + else if (m_oValue == L"#N/A") ptr->err = 0x2A; + else if (m_oValue == L"#GETTING_DATA") ptr->err = 0x2B; + } + if(m_oBold.IsInit()) + ptr->sxvcellextra->fSrvFmtBold = m_oBold.get(); + if(m_oItalic.IsInit()) + ptr->sxvcellextra->fSrvFmtItalic = m_oItalic.get(); + if(m_oStrike.IsInit()) + ptr->sxvcellextra->fSrvFmtStrikethrough = m_oStrike.get(); + if(m_oUnderline.IsInit()) + ptr->sxvcellextra->fSrvFmtUnderline = m_oUnderline.get(); + if(m_oFormatIndex.IsInit()) + ptr->sxvcellextra->isfci = m_oFormatIndex->GetValue(); + if(m_oBackColor.IsInit()) + ptr->sxvcellextra->cvBack.fromHex(m_oBackColor->GetValue()); + if(m_oForeColor.IsInit()) + ptr->sxvcellextra->cvFore.fromHex(m_oForeColor->GetValue()); + return objectPtr; + } + } void CPivotErrorValue::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -3747,6 +5335,51 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { ReadAttributes(obj); } + XLS::BaseObjectPtr CPivotNumericValue::toBin() + { + if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) + { + auto ptr(new XLSB::PCDIANumber); + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); + if(m_oCaption.IsInit()) + ptr->info.stCaption = m_oCaption.get(); + if(m_oCalculated.IsInit()) + ptr->info.fFmla = m_oCalculated.get(); + if(m_oUnused.IsInit()) + ptr->info.fGhost = m_oUnused.get(); + if(m_oCount.IsInit()) + ptr->info.cIMemProps = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr->info.rgIMemProps.push_back(i->m_oV.get()); + return objectPtr; + } + else + { + auto ptr(new XLSB::PCDINumber); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); + if(m_oValue.IsInit()) + ptr->xnum.data.value = m_oValue.get(); + if(m_oBold.IsInit()) + ptr->sxvcellextra->fSrvFmtBold = m_oBold.get(); + if(m_oItalic.IsInit()) + ptr->sxvcellextra->fSrvFmtItalic = m_oItalic.get(); + if(m_oStrike.IsInit()) + ptr->sxvcellextra->fSrvFmtStrikethrough = m_oStrike.get(); + if(m_oUnderline.IsInit()) + ptr->sxvcellextra->fSrvFmtUnderline = m_oUnderline.get(); + if(m_oFormatIndex.IsInit()) + ptr->sxvcellextra->isfci = m_oFormatIndex->GetValue(); + if(m_oBackColor.IsInit()) + ptr->sxvcellextra->cvBack.fromHex(m_oBackColor->GetValue()); + if(m_oForeColor.IsInit()) + ptr->sxvcellextra->cvFore.fromHex(m_oForeColor->GetValue()); + return objectPtr; + } + } void CPivotNumericValue::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -3856,6 +5489,38 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CPivotDateTimeValue::toBin() + { + if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) + { + auto ptr(new XLSB::PCDIADatetime); + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); + if(m_oCaption.IsInit()) + ptr->info.stCaption = m_oCaption.get(); + if(m_oCalculated.IsInit()) + ptr->info.fFmla = m_oCalculated.get(); + if(m_oUnused.IsInit()) + ptr->info.fGhost = m_oUnused.get(); + if(m_oCount.IsInit()) + ptr->info.cIMemProps = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr->info.rgIMemProps.push_back(i->m_oV.get()); + return objectPtr; + } + else + { + auto ptr(new XLSB::PCDIDatetime); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); + if(m_oValue.IsInit()) + ptr->datetime.fromString(m_oValue->GetValue()); + + return objectPtr; + } + } void CPivotDateTimeValue::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -3944,6 +5609,39 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CPivotBooleanValue::toBin() + { + if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) + { + auto ptr(new XLSB::PCDIABoolean); + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); + if(m_oValue.IsInit()) + ptr->f = m_oValue.get(); + if(m_oCalculated.IsInit()) + ptr->info.fFmla = m_oCalculated.get(); + if(m_oCaption.IsInit()) + ptr->info.stCaption = m_oCaption.get(); + if(m_oUnused.IsInit()) + ptr->info.fGhost = m_oUnused.get(); + if(m_oCount.IsInit()) + ptr->info.cIMemProps = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr->info.rgIMemProps.push_back(i->m_oV.get()); + return objectPtr; + } + else + { + auto ptr(new XLSB::PCDIBoolean); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); + if(m_oValue.IsInit()) + ptr->f = m_oValue.get(); + return objectPtr; + } + } void CPivotBooleanValue::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -4048,7 +5746,50 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { ReadAttributes(obj); } - + XLS::BaseObjectPtr CPivotNoValue::toBin() + { + if(m_arrItems.empty() || m_oBold.IsInit() || m_oItalic.IsInit() || m_oStrike.IsInit() || m_oUnderline.IsInit() || m_oFormatIndex.IsInit() + || m_oBackColor.IsInit() || m_oForeColor.IsInit()) + { + auto ptr(new XLSB::PCDIMissing); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); + if(m_oBold.IsInit()) + ptr->sxvcellextra->fSrvFmtBold = m_oBold.get(); + if(m_oItalic.IsInit()) + ptr->sxvcellextra->fSrvFmtItalic = m_oItalic.get(); + if(m_oStrike.IsInit()) + ptr->sxvcellextra->fSrvFmtStrikethrough = m_oStrike.get(); + if(m_oUnderline.IsInit()) + ptr->sxvcellextra->fSrvFmtUnderline = m_oUnderline.get(); + if(m_oFormatIndex.IsInit()) + ptr->sxvcellextra->isfci = m_oFormatIndex->GetValue(); + if(m_oBackColor.IsInit()) + ptr->sxvcellextra->cvBack.fromHex(m_oBackColor->GetValue()); + if(m_oForeColor.IsInit()) + ptr->sxvcellextra->cvFore.fromHex(m_oForeColor->GetValue()); + return objectPtr; + } + else + { + auto ptr(new XLSB::PCDIAMissing); + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); + if(m_oCaption.IsInit()) + ptr->info.stCaption = m_oCaption.get(); + if(m_oCalculated.IsInit()) + ptr->info.fFmla = m_oCalculated.get(); + if(m_oUnused.IsInit()) + ptr->info.fGhost = m_oUnused.get(); + if(m_oCount.IsInit()) + ptr->info.cIMemProps = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr->info.rgIMemProps.push_back(i->m_oV.get()); + return objectPtr; + } + } void CPivotNoValue::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -4166,6 +5907,34 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oConsolidation = ptr->m_PCDSCONSOL; } } + XLS::BaseObjectPtr CPivotCacheSource::toBin() + { + auto ptr(new XLSB::PCDSOURCE); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPCDSource); + ptr->m_BrtBeginPCDSource = XLS::BaseObjectPtr{ptr1}; + if(m_oType.IsInit()) + { + if(m_oType == SimpleTypes::Spreadsheet::ESourceCacheType::typeSourceWorksheet) + ptr1->iSrcType = 0x00000000; + if(m_oType == SimpleTypes::Spreadsheet::ESourceCacheType::typeSourceExternal) + ptr1->iSrcType = 0x00000001; + if(m_oType == SimpleTypes::Spreadsheet::ESourceCacheType::typeSourceConsolidation) + ptr1->iSrcType = 0x00000002; + if(m_oType == SimpleTypes::Spreadsheet::ESourceCacheType::typeSourceScenario) + ptr1->iSrcType = 0x00000003; + } + if(m_oConnectionId.IsInit()) + ptr1->dwConnID = m_oConnectionId->GetValue(); + else + ptr1->dwConnID = 0; + + if(m_oWorksheetSource.IsInit()) + ptr->m_PCDSRANGE = m_oWorksheetSource->toBin(); + if(m_oConsolidation.IsInit()) + ptr->m_PCDSCONSOL = m_oConsolidation->toBin(); + return objectPtr; + } void CPivotCacheSource::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -4216,6 +5985,29 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if ( oReader.IsEmptyNode() ) return; } + XLS::BaseObjectPtr CWorksheetSource::toBin() + { + auto ptr1(new XLSB::PCDSRANGE); + XLS::BaseObjectPtr objectPtr(ptr1); + auto ptr(new XLSB::BeginPCDSRange); + ptr1->m_BrtBeginPCDSRange = XLS::BaseObjectPtr{ptr}; + + if(m_oSheet.IsInit()) + ptr->sheetName = m_oSheet.get(); + else + ptr->fLoadSheet = false; + if(m_oRef.IsInit()) + ptr->range.fromString(m_oRef.get()); + if(m_oName.IsInit()) + ptr->namedRange = m_oName.get(); + else + ptr->fName = false; + if(m_oRid.IsInit()) + ptr->relId.value = m_oRid->GetValue(); + else + ptr->fLoadRelId = false; + return objectPtr; + } void CWorksheetSource::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -4289,6 +6081,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CPageItemValues::toBin() + { + auto ptr(new XLSB::PCDSCPAGES); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arPCDSCPAGE.push_back(i->toBin()); + return objectPtr; + } void CPageItemValues::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -4345,6 +6145,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CPageItems::toBin() + { + auto ptr(new XLSB::PCDSCPAGE); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arPCDSCPITEM.push_back(i->toBin()); + return objectPtr; + } void CPageItems::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -4379,6 +6187,17 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if ( oReader.IsEmptyNode() ) return; } + XLS::BaseObjectPtr CPageItem::toBin() + { + auto ptr(new XLSB::PCDSCPITEM); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPCDSCPItem); + ptr->m_BrtBeginPCDSCPItem = XLS::BaseObjectPtr{ptr1}; + if(m_oName.IsInit()) + ptr1->stName = m_oName.get(); + + return objectPtr; + } void CPageItem::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -4440,6 +6259,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CRangeSets::toBin() + { + auto ptr(new XLSB::PCDSCSETS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arPCDSCSET.push_back(i->toBin()); + return objectPtr; + } void CRangeSets::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -4481,6 +6308,28 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if ( oReader.IsEmptyNode() ) return; } + XLS::BaseObjectPtr CRangeSet::toBin() + { + auto ptr(new XLSB::BeginPCDSCSet); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oSheet.IsInit()) + ptr->irstSheet = m_oSheet.get(); + if(m_oRef.IsInit()) + ptr->rfx = m_oRef.get(); + if(m_oName.IsInit()) + ptr->irstName = m_oName.get(); + if(m_oRid.IsInit()) + ptr->irstRelId.value = m_oRid->GetValue(); + if(m_oI1.IsInit()) + ptr->rgiItem[0] = m_oI1->GetValue(); + if(m_oI2.IsInit()) + ptr->rgiItem[1] = m_oI2->GetValue(); + if(m_oI3.IsInit()) + ptr->rgiItem[2] = m_oI3->GetValue(); + if(m_oI4.IsInit()) + ptr->rgiItem[3] = m_oI4->GetValue(); + return objectPtr; + } void CRangeSet::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -4561,6 +6410,20 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oRangeSets = oReader; } } + XLS::BaseObjectPtr CConsolidationSource::toBin() + { + auto ptr(new XLSB::PCDSCONSOL); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPCDSConsol); + ptr->m_BrtBeginPCDSConsol = XLS::BaseObjectPtr{ptr1}; + if(m_oAutoPage.IsInit()) + ptr1->fAutoPage = m_oAutoPage.get(); + if(m_oPages.IsInit()) + ptr->m_PCDSCPAGES = m_oPages->toBin(); + if(m_oRangeSets.IsInit()) + ptr->m_PCDSCSETS = m_oRangeSets->toBin(); + return objectPtr; + } void CConsolidationSource::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -4633,6 +6496,26 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oGroupItems = oReader; } } + XLS::BaseObjectPtr CFieldGroupProperties::toBin() + { + auto ptr(new XLSB::PCDFGROUP); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oPar.IsInit() || m_oBase.IsInit()) + { + auto ptr1(new XLSB::BeginPCDFGroup); + if(m_oPar.IsInit()) + ptr1->ifdbParent = m_oPar->GetValue(); + if(m_oBase.IsInit()) + ptr1->ifdbBase = m_oBase->GetValue(); + } + if(m_oDiscretePr.IsInit()) + ptr->m_PCDFGDISCRETE = m_oDiscretePr->toBin(); + if(m_oRangePr.IsInit()) + ptr->m_PCDFGRANGE = m_oRangePr->toBin(); + if(m_oGroupItems.IsInit()) + ptr->m_PCDFGITEMS = m_oGroupItems->toBin(); + return objectPtr; + } void CFieldGroupProperties::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -4687,6 +6570,23 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" //pivotCacheRecordsStream.reset(); } } + XLS::BaseObjectPtr CPivotCacheRecordsFile::WriteBin() const + { + auto pivotCacheRecordsStream(new XLSB::PivotCacheRecordsStream); + if(m_oPivotCacheRecords.IsInit()) + pivotCacheRecordsStream->m_PIVOTCACHERECORDS = m_oPivotCacheRecords->toBin(); + else if(m_nDataLength > 0 && m_pData) + { + CPivotCacheRecords records; + XmlUtils::CXmlLiteReader reader; + auto wstringData = prepareData(); + reader.FromString(wstringData); + reader.ReadNextNode(); + records.fromXML(reader); + pivotCacheRecordsStream->m_PIVOTCACHERECORDS = records.toBin(); + } + return XLS::BaseObjectPtr{pivotCacheRecordsStream}; + } void CPivotCacheRecordsFile::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -4713,34 +6613,59 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } void CPivotCacheRecordsFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { - if(m_oPivotCacheRecords.IsInit()) - { - std::wstring sPath = oPath.GetPath(); - - if (false == m_oPivotCacheRecords->m_strOutputXml.empty()) + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) { - NSFile::CFileBinary::SaveToFile(sPath, m_oPivotCacheRecords->m_strOutputXml); + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); } - else - { - NSStringUtils::CStringBuilder sXml; - sXml.WriteString(L""); - m_oPivotCacheRecords->toXML(sXml); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); - } - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); - } - else if(m_nDataLength > 0 && m_pData) + else { - NSFile::CFileBinary oFile; - oFile.CreateFileW(oPath.GetPath()); - oFile.WriteFile(m_pData, m_nDataLength); - oFile.CloseFile(); + if(m_oPivotCacheRecords.IsInit()) + { + std::wstring sPath = oPath.GetPath(); - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); + if (false == m_oPivotCacheRecords->m_strOutputXml.empty()) + { + NSFile::CFileBinary::SaveToFile(sPath, m_oPivotCacheRecords->m_strOutputXml); + } + else + { + NSStringUtils::CStringBuilder sXml; + sXml.WriteString(L""); + m_oPivotCacheRecords->toXML(sXml); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } + + } + else if(m_nDataLength > 0 && m_pData) + { + NSFile::CFileBinary oFile; + oFile.CreateFileW(oPath.GetPath()); + oFile.WriteFile(m_pData, m_nDataLength); + oFile.CloseFile(); + + } } + oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); + IFileContainer::Write( oPath, oDirectory, oContent ); + } + const OOX::FileType CPivotCacheRecordsFile::type() const + { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::PivotCacheRecordsBin; + } + return OOX::Spreadsheet::FileTypes::PivotCacheRecords; + } + std::wstring CPivotCacheRecordsFile::prepareData() const + { + + std::string stringData(reinterpret_cast(m_pData), m_nDataLength); + std::wstring_convert> converter; + + return converter.from_bytes(stringData); } //------------------------------------ void CPivotCacheRecords::toXML(NSStringUtils::CStringBuilder& writer) const @@ -4820,6 +6745,18 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.Clear(); } } + XLS::BaseObjectPtr CPivotCacheRecords::toBin() + { + auto ptr(new XLSB::PIVOTCACHERECORDS); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPivotCacheRecords); + ptr1->crecords = m_arrItems.size(); + ptr->m_BrtBeginPivotCacheRecords = XLS::BaseObjectPtr{ptr1}; + for(auto i:m_arrItems) + ptr->m_arPIVOTCACHERECORD.push_back(i->toBin()); + + return objectPtr; + } void CPivotCacheRecords::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -4893,6 +6830,75 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CPivotCacheRecord::toBin() + { + auto ptr(new XLSB::PIVOTCACHERECORD); + auto ptr1(new XLSB::PIVOTCACHERECORDDT); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_source = XLS::BaseObjectPtr{ptr1}; + for(auto i:m_arrItems) + { + auto ptrPCDIDT(new XLSB::PCDIDT); + + + if(i->getType() == et_x_PivotBooleanValue) + { + auto boolValue = static_cast(i); + ptrPCDIDT->m_source = boolValue->toBin(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + + else if(i->getType() == et_x_PivotDateTimeValue) + { + auto dataValue = static_cast(i); + ptrPCDIDT->m_source = dataValue->toBin(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + + else if(i->getType() == et_x_PivotErrorValue) + { + auto errorValue = static_cast(i); + ptrPCDIDT->m_source = errorValue->toBin(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + + else if(i->getType() == et_x_PivotNoValue) + { + auto noValue = static_cast(i); + ptrPCDIDT->m_source = noValue->toBin(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + + else if(i->getType() == et_x_PivotNumericValue) + { + auto numValue = static_cast(i); + ptrPCDIDT->m_source = numValue->toBin(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + + else if(i->getType() == et_x_PivotCharacterValue) + { + auto charValue = static_cast(i); + ptrPCDIDT->m_source = charValue->toBin(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + + else if(i->getType() == et_x_SharedItemsIndex) + { + auto itemIndex = static_cast(i); + ptrPCDIDT->m_source = itemIndex->toBinItemIndex(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + } + return objectPtr; + } void CPivotCacheRecord::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -5004,5 +7010,23 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + + XLS::BaseObjectPtr CSharedItemsIndex::toBinItemIndex() + { + auto ptr(new XLSB::PCDIIndex); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oV.IsInit()) + ptr->iitem = m_oV->GetValue(); + return objectPtr; + } + + XLS::BaseObjectPtr CSharedItemsIndex::toBinPrfItem() + { + auto ptr(new XLSB::BeginPRFItem); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oV.IsInit()) + ptr->iitem = m_oV->GetValue(); + return objectPtr; + } } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/RichData/RdRichValue.cpp b/OOXML/XlsxFormat/RichData/RdRichValue.cpp new file mode 100644 index 0000000000..c0a1148493 --- /dev/null +++ b/OOXML/XlsxFormat/RichData/RdRichValue.cpp @@ -0,0 +1,233 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +#include "RdRichValue.h" + +#include "../FileTypes_Spreadsheet.h" + +#include "../../Common/SimpleTypes_Shared.h" +#include "../../Common/SimpleTypes_Spreadsheet.h" + +#include "../../DocxFormat/Drawing/DrawingExt.h" +#include "../../../DesktopEditor/common/File.h" + +#include "../../Binary/Presentation/XmlWriter.h" +#include "../../Binary/Presentation/BinaryFileReaderWriter.h" + +namespace OOX +{ +namespace Spreadsheet +{ + CRdRichValueFile::CRdRichValueFile(OOX::Document* pMain) : OOX::File(pMain) + { + } + CRdRichValueFile::CRdRichValueFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::File(pMain) + { + read(oRootPath, oPath); + } + CRdRichValueFile::~CRdRichValueFile() + { + } + void CRdRichValueFile::read(const CPath& oPath) + { + //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) + CPath oRootPath; + read(oRootPath, oPath); + } + const OOX::FileType CRdRichValueFile::type() const + { + return OOX::Spreadsheet::FileTypes::RdRichValue; + } + const CPath CRdRichValueFile::DefaultDirectory() const + { + return type().DefaultDirectory(); + } + const CPath CRdRichValueFile::DefaultFileName() const + { + return type().DefaultFileName(); + } + const CPath& CRdRichValueFile::GetReadPath() + { + return m_oReadPath; + } + void CRdRichValueFile::read(const CPath& oRootPath, const CPath& oPath) + { + m_oReadPath = oPath; + + XmlUtils::CXmlLiteReader oReader; + + if (!oReader.FromFile(oPath.GetPath())) + return; + + if (!oReader.ReadNextNode()) + return; + + //m_oMetadata = oReader; + } + void CRdRichValueFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const + { + //if (false == m_oMetadata.IsInit()) return; + + NSStringUtils::CStringBuilder sXml; + + sXml.WriteString(L""); + //m_oMetadata->toXML(sXml); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + + oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); + } +//--------------------------------------------------------------------------------------------------------------------------- + CRdRichValueStructureFile::CRdRichValueStructureFile(OOX::Document* pMain) : OOX::File(pMain) + { + } + CRdRichValueStructureFile::CRdRichValueStructureFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::File(pMain) + { + read(oRootPath, oPath); + } + CRdRichValueStructureFile::~CRdRichValueStructureFile() + { + } + void CRdRichValueStructureFile::read(const CPath& oPath) + { + //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) + CPath oRootPath; + read(oRootPath, oPath); + } + const OOX::FileType CRdRichValueStructureFile::type() const + { + return OOX::Spreadsheet::FileTypes::RdRichValueStructure; + } + const CPath CRdRichValueStructureFile::DefaultDirectory() const + { + return type().DefaultDirectory(); + } + const CPath CRdRichValueStructureFile::DefaultFileName() const + { + return type().DefaultFileName(); + } + const CPath& CRdRichValueStructureFile::GetReadPath() + { + return m_oReadPath; + } + void CRdRichValueStructureFile::read(const CPath& oRootPath, const CPath& oPath) + { + m_oReadPath = oPath; + + XmlUtils::CXmlLiteReader oReader; + + if (!oReader.FromFile(oPath.GetPath())) + return; + + if (!oReader.ReadNextNode()) + return; + + //m_oMetadata = oReader; + } + void CRdRichValueStructureFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const + { + //if (false == m_oMetadata.IsInit()) return; + + NSStringUtils::CStringBuilder sXml; + + sXml.WriteString(L""); + //m_oMetadata->toXML(sXml); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + + oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); + } +//--------------------------------------------------------------------------------------------------------------------------- + CRdRichValueTypesFile::CRdRichValueTypesFile(OOX::Document* pMain) : OOX::File(pMain) + { + } + CRdRichValueTypesFile::CRdRichValueTypesFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::File(pMain) + { + read(oRootPath, oPath); + } + CRdRichValueTypesFile::~CRdRichValueTypesFile() + { + } + void CRdRichValueTypesFile::read(const CPath& oPath) + { + //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) + CPath oRootPath; + read(oRootPath, oPath); + } + const OOX::FileType CRdRichValueTypesFile::type() const + { + return OOX::Spreadsheet::FileTypes::RdRichValueTypes; + } + const CPath CRdRichValueTypesFile::DefaultDirectory() const + { + return type().DefaultDirectory(); + } + const CPath CRdRichValueTypesFile::DefaultFileName() const + { + return type().DefaultFileName(); + } + const CPath& CRdRichValueTypesFile::GetReadPath() + { + return m_oReadPath; + } + void CRdRichValueTypesFile::read(const CPath& oRootPath, const CPath& oPath) + { + m_oReadPath = oPath; + + XmlUtils::CXmlLiteReader oReader; + + if (!oReader.FromFile(oPath.GetPath())) + return; + + if (!oReader.ReadNextNode()) + return; + + //m_oMetadata = oReader; + } + void CRdRichValueTypesFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const + { + //if (false == m_oMetadata.IsInit()) return; + + NSStringUtils::CStringBuilder sXml; + + sXml.WriteString(L""); + //m_oMetadata->toXML(sXml); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + + oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); + } +} +} + diff --git a/OOXML/XlsxFormat/RichData/RdRichValue.h b/OOXML/XlsxFormat/RichData/RdRichValue.h new file mode 100644 index 0000000000..1b94966a35 --- /dev/null +++ b/OOXML/XlsxFormat/RichData/RdRichValue.h @@ -0,0 +1,108 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +#pragma once + +#include "../Table/Autofilter.h" +#include "../../DocxFormat/IFileContainer.h" +#include "../../Common/SimpleTypes_Spreadsheet.h" + +namespace OOX +{ + namespace Spreadsheet + { + class CRdRichValueFile : public OOX::File + { + public: + CRdRichValueFile(OOX::Document* pMain); + CRdRichValueFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath); + virtual ~CRdRichValueFile(); + + virtual void read(const CPath& oPath); + virtual void read(const CPath& oRootPath, const CPath& oPath); + + virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; + virtual const OOX::FileType type() const; + + virtual const CPath DefaultDirectory() const; + virtual const CPath DefaultFileName() const; + + const CPath& GetReadPath(); + + //nullable m_oTimelines; + private: + CPath m_oReadPath; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CRdRichValueStructureFile : public OOX::File + { + public: + CRdRichValueStructureFile(OOX::Document* pMain); + CRdRichValueStructureFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath); + virtual ~CRdRichValueStructureFile(); + + virtual void read(const CPath& oPath); + virtual void read(const CPath& oRootPath, const CPath& oPath); + + virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; + virtual const OOX::FileType type() const; + + virtual const CPath DefaultDirectory() const; + virtual const CPath DefaultFileName() const; + + const CPath& GetReadPath(); + + private: + CPath m_oReadPath; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CRdRichValueTypesFile : public OOX::File + { + public: + CRdRichValueTypesFile(OOX::Document* pMain); + CRdRichValueTypesFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath); + virtual ~CRdRichValueTypesFile(); + + virtual void read(const CPath& oPath); + virtual void read(const CPath& oRootPath, const CPath& oPath); + + virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; + virtual const OOX::FileType type() const; + + virtual const CPath DefaultDirectory() const; + virtual const CPath DefaultFileName() const; + + const CPath& GetReadPath(); + private: + CPath m_oReadPath; + }; + } //Spreadsheet +} // namespace OOX diff --git a/OOXML/XlsxFormat/SharedStrings/PhoneticPr.cpp b/OOXML/XlsxFormat/SharedStrings/PhoneticPr.cpp index ec4a8136fd..1f0b6bae30 100644 --- a/OOXML/XlsxFormat/SharedStrings/PhoneticPr.cpp +++ b/OOXML/XlsxFormat/SharedStrings/PhoneticPr.cpp @@ -67,6 +67,53 @@ namespace OOX { ReadAttributes(obj); } + void CPhonetic::toBin(XLS::BiffStructure* obj) + { + auto ptr = static_cast(obj); + if(m_oAlignment.IsInit()) + { + if(m_oAlignment == SimpleTypes::Spreadsheet::phoneticalignmentNoControl) + { + ptr->alcH = 0; + } + else if(m_oAlignment == SimpleTypes::Spreadsheet::phoneticalignmentLeft) + { + ptr->alcH = 1; + } + else if(m_oAlignment == SimpleTypes::Spreadsheet::phoneticalignmentCenter) + { + ptr->alcH = 2; + } + else if(m_oAlignment == SimpleTypes::Spreadsheet::phoneticalignmentDistributed) + { + ptr->alcH = 3; + } + } + if(m_oType.IsInit()) + { + if(m_oType == SimpleTypes::Spreadsheet::phonetictypeHalfwidthKatakana) + { + ptr->phType = 0; + } + else if(m_oType == SimpleTypes::Spreadsheet::phonetictypeFullwidthKatakana) + { + ptr->phType = 1; + } + else if(m_oType == SimpleTypes::Spreadsheet::phonetictypeHiragana) + { + ptr->phType = 2; + } + else if(m_oType == SimpleTypes::Spreadsheet::phonetictypeNoConversion) + { + ptr->phType = 3; + } + } + + if(m_oFontId.IsInit()) + { + ptr->ifnt = m_oFontId->GetValue(); + } + } EElementType CPhonetic::getType () const { return et_x_PhoneticPr; @@ -167,6 +214,20 @@ namespace OOX m_arrItems.push_back(ptr); ReadAttributes(obj); } + std::wstring CRPh::toBin(XLS::BiffStructure* obj) + { + auto ptr = static_cast(obj); + std::wstring result; + if(!m_arrItems.empty()) + { + result = m_arrItems.back()->ToString(); + } + if(m_oEb.IsInit()) + ptr->ichMom = m_oEb->GetValue(); + if(m_oSb.IsInit()) + ptr->ichFirst = m_oSb->GetValue(); + return result; + } EElementType CRPh::getType () const { return et_x_rPh; diff --git a/OOXML/XlsxFormat/SharedStrings/PhoneticPr.h b/OOXML/XlsxFormat/SharedStrings/PhoneticPr.h index 5185461cc1..2c63de3ae1 100644 --- a/OOXML/XlsxFormat/SharedStrings/PhoneticPr.h +++ b/OOXML/XlsxFormat/SharedStrings/PhoneticPr.h @@ -62,6 +62,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure& obj); + void toBin(XLS::BiffStructure* obj); virtual EElementType getType () const; private: @@ -88,6 +89,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure& obj, std::wstring& str); + std::wstring toBin(XLS::BiffStructure* obj); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/SharedStrings/Run.h b/OOXML/XlsxFormat/SharedStrings/Run.h index 3f6e983122..6cd18133c5 100644 --- a/OOXML/XlsxFormat/SharedStrings/Run.h +++ b/OOXML/XlsxFormat/SharedStrings/Run.h @@ -53,6 +53,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::wstring& str, unsigned short fontindex); + std::wstring toBin(unsigned short &fontindex); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp b/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp index a47ea14445..136a189d72 100644 --- a/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp +++ b/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp @@ -38,6 +38,8 @@ #include "../../XlsbFormat/Biff12_unions/SHAREDSTRINGS.h" #include "../../XlsbFormat/Biff12_records/SSTItem.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -102,6 +104,25 @@ namespace OOX } } + XLS::BaseObjectPtr CSharedStrings::WriteBin() const + { + XLSB::SharedStringsStreamPtr sharedStringsStream(new XLSB::SharedStringsStream); + auto ptr(new XLSB::SHAREDSTRINGS); + XLS::BaseObjectPtr objectPtr(ptr); + + auto atribPtr(new XLSB::BeginSst); + ptr->m_BrtBeginSst = XLS::BaseObjectPtr{atribPtr}; + if(m_oCount.IsInit()) + atribPtr->cstTotal = m_oCount->GetValue(); + if(m_oUniqueCount.IsInit()) + atribPtr->cstUnique = m_oUniqueCount->GetValue(); + + for(auto i:m_arrItems) + { + ptr->m_arBrtSSTItem.push_back(i->toBin()); + } + return objectPtr; + } void CSharedStrings::read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -161,25 +182,38 @@ namespace OOX } void CSharedStrings::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { - NSStringUtils::CStringBuilder writer; - writer.WriteString(_T("GetValue()); - WritingStringNullableAttrInt(L"uniqueCount", m_oUniqueCount, m_oUniqueCount->GetValue()); - writer.WriteString(_T(">")); - - for(size_t i = 0; i < m_arrItems.size(); i++) + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) { - m_arrItems[i]->toXML(writer); + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); } + else + { + NSStringUtils::CStringBuilder writer; + writer.WriteString(_T("GetValue()); + WritingStringNullableAttrInt(L"uniqueCount", m_oUniqueCount, m_oUniqueCount->GetValue()); + writer.WriteString(_T(">")); - writer.WriteString(_T("")); - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath.c_str(), writer.GetData()); + for(size_t i = 0; i < m_arrItems.size(); i++) + { + m_arrItems[i]->toXML(writer); + } + writer.WriteString(_T("")); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath.c_str(), writer.GetData()); + } oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); } const OOX::FileType CSharedStrings::type() const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::SharedStringsBin; + } return OOX::Spreadsheet::FileTypes::SharedStrings; } const CPath CSharedStrings::DefaultDirectory() const @@ -188,7 +222,18 @@ namespace OOX } const CPath CSharedStrings::DefaultFileName() const { - return type().DefaultFileName(); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + CPath name = type().DefaultFileName(); + + name.SetExtention(L"bin"); + return name; + } + else + { + return type().DefaultFileName(); + } } const CPath& CSharedStrings::GetReadPath() { diff --git a/OOXML/XlsxFormat/SharedStrings/SharedStrings.h b/OOXML/XlsxFormat/SharedStrings/SharedStrings.h index 19e99b05b7..e8c7b7d513 100644 --- a/OOXML/XlsxFormat/SharedStrings/SharedStrings.h +++ b/OOXML/XlsxFormat/SharedStrings/SharedStrings.h @@ -54,6 +54,7 @@ namespace OOX virtual ~CSharedStrings(); void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; diff --git a/OOXML/XlsxFormat/SharedStrings/Si.cpp b/OOXML/XlsxFormat/SharedStrings/Si.cpp index d41c636df4..e008680be1 100644 --- a/OOXML/XlsxFormat/SharedStrings/Si.cpp +++ b/OOXML/XlsxFormat/SharedStrings/Si.cpp @@ -130,6 +130,60 @@ namespace OOX m_arrItems.push_back( pItem ); } } + XLS::BaseObjectPtr CSi::toBin() const + { + auto sString(new XLSB::SSTItem); + XLS::BaseObjectPtr objectPtr(sString); + auto ptr = &sString->richStr; + ptr->fExtStr = false; + ptr->fRichStr = false; + for(auto i = 0; i < m_arrItems.size(); i++) + { + + + if(m_arrItems[i]->getType() == OOX::et_x_t) + { + auto text = static_cast(m_arrItems[i]); + ptr->str = text->ToString(); + continue; + } + + if(m_arrItems[i]->getType() == OOX::et_x_r) + { + auto crunPtr = static_cast(m_arrItems[i]); + ptr->fRichStr = true; + USHORT ind = 0; + ptr->str = ptr->str.value() + crunPtr->toBin(ind); + XLSB::StrRun run; + run.ifnt = ind; + run.ich = ptr->str.value().size(); + ptr->rgsStrRun.push_back(run); + continue; + } + auto phonPtr = static_cast(m_arrItems[i]); + if(phonPtr) + { + ptr->fExtStr = true; + XLSB::PhRun phRun; + phonPtr->toBin(&phRun); + if(i < m_arrItems.size() - 1) + { + auto ph = static_cast(m_arrItems[i+1]); + if(ph) + { + auto phoneticStr = ph->toBin(&phRun); + if(!phoneticStr.empty()) + ptr->phoneticStr = phoneticStr; + } + i++; + } + + ptr->rgsPhRun.push_back(phRun); + } + } + + return objectPtr; + } void CSi::fromBin(XLS::BiffStructure& obj, bool flagIsComment) { auto ptr = static_cast(&obj); diff --git a/OOXML/XlsxFormat/SharedStrings/Si.h b/OOXML/XlsxFormat/SharedStrings/Si.h index d641677d11..efdc78f6ce 100644 --- a/OOXML/XlsxFormat/SharedStrings/Si.h +++ b/OOXML/XlsxFormat/SharedStrings/Si.h @@ -63,6 +63,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure& obj, bool flagIsComment = false); + XLS::BaseObjectPtr toBin() const; void fromXLSBExt (NSBinPptxRW::CBinaryFileReader& oStream); void toXLSBExt (NSBinPptxRW::CXlsbBinaryWriter& oStream); diff --git a/OOXML/XlsxFormat/SharedStrings/XlsxRun.cpp b/OOXML/XlsxFormat/SharedStrings/XlsxRun.cpp index 53509a026a..f9bfb95c11 100644 --- a/OOXML/XlsxFormat/SharedStrings/XlsxRun.cpp +++ b/OOXML/XlsxFormat/SharedStrings/XlsxRun.cpp @@ -97,6 +97,20 @@ namespace OOX m_oRPr->m_nFontIndex.Init(); m_oRPr->m_nFontIndex = fontindex; } + std::wstring CRun::toBin(unsigned short &fontindex) + { + if(m_oRPr.IsInit()) + { + if(m_oRPr->m_nFontIndex.IsInit()) + fontindex = m_oRPr->m_nFontIndex->GetValue(); + } + if(!m_arrItems.empty()) + { + auto textPtr = m_arrItems.back(); + return textPtr->ToString(); + } + return L""; + } EElementType CRun::getType () const { return et_x_r; diff --git a/OOXML/XlsxFormat/Slicer/Slicer.cpp b/OOXML/XlsxFormat/Slicer/Slicer.cpp index 4ffeb31420..915cd4ad9c 100644 --- a/OOXML/XlsxFormat/Slicer/Slicer.cpp +++ b/OOXML/XlsxFormat/Slicer/Slicer.cpp @@ -38,6 +38,8 @@ #include "../../DocxFormat/Drawing/DrawingExt.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -72,6 +74,14 @@ void CSlicers::fromBin(XLS::BaseObjectPtr& obj) m_oSlicer.push_back(CSlicer(slicer)); } } +XLS::BaseObjectPtr CSlicers::toBin() +{ + auto ptr(new XLSB::SLICERS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_oSlicer) + ptr->m_arSLICER.push_back(i.toBin()); + return objectPtr; +} void CSlicers::toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const { writer.StartNode(sName); @@ -170,6 +180,62 @@ void CSlicer::fromBin(XLS::BaseObjectPtr& obj) ReadAttributes(ptr->m_BrtBeginSlicer); } } +XLS::BaseObjectPtr CSlicer::toBin() +{ + auto ptr1(new XLSB::SLICER); + XLS::BaseObjectPtr objectPtr(ptr1); + auto ptr(new XLSB::BeginSlicer); + ptr1->m_BrtBeginSlicer = XLS::BaseObjectPtr{ptr}; + + if(m_oStartItem.IsInit()) + ptr->dwStartSlicerItem = m_oStartItem.get(); + else + ptr->dwStartSlicerItem = 0; + if(m_oColumnCount.IsInit()) + ptr->dwColumnCount = m_oColumnCount.get(); + else + ptr->dwColumnCount = 1; + if(m_oShowCaption.IsInit()) + ptr->fCaptionVisible = m_oShowCaption.get(); + if(m_oLevel.IsInit()) + ptr->dwLevel = m_oLevel.get(); + else + ptr->dwLevel = 0; + if(m_oLockedPosition.IsInit()) + ptr->fLockedPosition = m_oLockedPosition.get(); + else + ptr->fLockedPosition = false; + if(m_oRowHeight.IsInit()) + ptr->dxRowHeight = m_oRowHeight.get(); + + if(m_oName.IsInit()) + ptr->stName = m_oName.get(); + else if(m_oUid.IsInit()) + ptr->stName = m_oUid.get(); + else + ptr->stName = 0xFFFFFFFF; + if(m_oCache.IsInit()) + ptr->stSlicerCacheName = m_oCache.get(); + else + ptr->stSlicerCacheName = 0xFFFFFFFF; + if(m_oCaption.IsInit()) + ptr->stCaption = m_oCaption.get(); + else + { + ptr->stCaption = 0xFFFFFFFF; + ptr->fCaptionVisible = false; + ptr->fHasCaption = false; + } + + if(m_oStyle.IsInit()) + ptr->stStyle = m_oStyle.get(); + else + { + ptr->stStyle = 0xFFFFFFFF; + ptr->fHasStyle = false; + } + return objectPtr; +} void CSlicer::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -345,6 +411,15 @@ void CSlicerFile::readBin(const CPath& oPath) } } +XLS::BaseObjectPtr CSlicerFile::WriteBin() const +{ + XLSB::SlicersStreamPtr slicersStream(new XLSB::SlicersStream); + XLS::BaseObjectPtr objectPtr(slicersStream); + if(m_oSlicers.IsInit()) + slicersStream->m_SLICERS = m_oSlicers->toBin(); + return objectPtr; +} + void CSlicerFile::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -370,18 +445,35 @@ void CSlicerFile::write(const CPath& oPath, const CPath& oDirectory, CContentTyp { if(!m_oSlicers.IsInit()) return; + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { + NSStringUtils::CStringBuilder sXml; - NSStringUtils::CStringBuilder sXml; - - sXml.WriteString(L""); - m_oSlicers->toXML(sXml, L"slicers"); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + sXml.WriteString(L""); + m_oSlicers->toXML(sXml, L"slicers"); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); IFileContainer::Write( oPath, oDirectory, oContent ); } +const OOX::FileType CSlicerFile::type() const +{ + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::SlicerBin; + } + return OOX::Spreadsheet::FileTypes::Slicer; +} + } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Slicer/Slicer.h b/OOXML/XlsxFormat/Slicer/Slicer.h index ad66ce73e0..b605fd4e60 100644 --- a/OOXML/XlsxFormat/Slicer/Slicer.h +++ b/OOXML/XlsxFormat/Slicer/Slicer.h @@ -59,6 +59,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -96,6 +97,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); @@ -121,6 +123,7 @@ namespace OOX read( oRootPath, oPath ); } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -129,10 +132,7 @@ namespace OOX } virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::Slicer; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); diff --git a/OOXML/XlsxFormat/Slicer/SlicerCache.cpp b/OOXML/XlsxFormat/Slicer/SlicerCache.cpp index 092ffb02e9..34ec92e727 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCache.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCache.cpp @@ -59,6 +59,7 @@ #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" namespace OOX { namespace Spreadsheet @@ -77,6 +78,23 @@ void COlapSlicerCacheItem::fromBin(XLS::BaseObjectPtr& obj) } } } +XLS::BaseObjectPtr COlapSlicerCacheItem::toBin() +{ + auto ptr(new XLSB::SlicerCacheOlapItem); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oNd.IsInit()) + ptr->fNoData = m_oNd.get(); + if(m_oN.IsInit()) + ptr->stName = m_oN.get(); + else + ptr->stName = 0xFFFFFFFF; + if(m_oC.IsInit()) + ptr->stTitle = m_oC.get(); + for(auto i:m_oP) + if(i.m_oN.IsInit()) + ptr->parents.push_back(i.m_oN.get()); + return objectPtr; +} void COlapSlicerCacheItem::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -256,6 +274,19 @@ void COlapSlicerCacheItemParent::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReade } pReader->Seek(_end_rec); } +XLS::BaseObjectPtr COlapSlicerCacheRange::toBin() +{ + auto ptr(new XLSB::SLICERCACHESIRANGE); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oStartItem.IsInit()) + { + auto ptr1(new XLSB::BeginSlicerCacheSiRange); + ptr1->iitemstart = m_oStartItem.get(); + } + for(auto i:m_oI) + ptr->m_arBrtSlicerCacheOlapItem.push_back(i.toBin()); + return objectPtr; +} void COlapSlicerCacheRange::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -372,6 +403,17 @@ void CTabularSlicerCacheItem::fromBin(XLS::BiffStructure& obj) { ReadAttributes(obj); } +void CTabularSlicerCacheItem::toBin(XLS::BiffStructure *obj) +{ + auto ptr = static_cast(obj); + + if(m_oX.IsInit()) + ptr->iCache = m_oX.get(); + if(m_oS.IsInit()) + ptr->fSelected = m_oS.get(); + if(m_oNd.IsInit()) + ptr->fNoData = m_oNd.get(); +} void CTabularSlicerCacheItem::ReadAttributes(XLS::BiffStructure& obj) { auto ptr = static_cast(&obj); @@ -473,6 +515,13 @@ void COlapSlicerCacheSelection::fromBin(XLS::BaseObjectPtr& obj) } } } +XLS::BaseObjectPtr COlapSlicerCacheSelection::toBin() +{ + auto ptr(new XLSB::SlicerCacheSelection); + XLS::BaseObjectPtr objectPtr(ptr); + + return objectPtr; +} void COlapSlicerCacheSelection::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -590,6 +639,38 @@ void COlapSlicerCacheLevelData::fromBin(XLS::BaseObjectPtr& obj) } } } +XLS::BaseObjectPtr COlapSlicerCacheLevelData::toBin() +{ + auto ptr(new XLSB::SLICERCACHELEVELDATA); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginSlicerCacheLevelData); + ptr->m_BrtBeginSlicerCacheLevelData = XLS::BaseObjectPtr{ptr1}; + + if(m_oCount.IsInit()) + ptr1->citem = m_oCount.get(); + if(m_oSortOrder.IsInit()) + ptr1->fSortOrder = m_oSortOrder->GetValue(); + if(m_oUniqueName.IsInit()) + ptr1->stUniqueName = m_oUniqueName.get(); + else + ptr1->stUniqueName = 0xFFFFFFFF; + if(m_oSourceCaption.IsInit()) + ptr1->stSourceCaption = m_oSourceCaption.get(); + else + ptr1->stSourceCaption = 0xFFFFFFFF; + if(m_oCrossFilter.IsInit()) + ptr1->fCrossFilter = m_oCrossFilter->GetValue(); + if(!m_oRanges.empty()) + { + auto ptr2(new XLSB::SLICERCACHESIRANGES); + ptr->m_SLICERCACHESIRANGES = XLS::BaseObjectPtr{ptr2}; + for(auto i:m_oRanges) + { + ptr2->m_arSLICERCACHESIRANGE.push_back(i.toBin()); + } + } + return objectPtr; +} void COlapSlicerCacheLevelData::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -763,7 +844,20 @@ void CTabularSlicerCacheItems::fromBin(XLS::BaseObjectPtr& obj) } } } - +XLS::BaseObjectPtr CTabularSlicerCacheItems::toBin() +{ + auto ptr(new XLSB::SlicerCacheNativeItem); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCount.IsInit()) + ptr->cItems = m_oCount.get(); + for(auto i:m_oI) + { + XLSB::SlicerCacheNativeItemStruct object; + i.toBin(&object); + ptr->rgItems.push_back(object); + } + return objectPtr; +} void CTabularSlicerCacheItems::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_StartChar_No_NS(oReader) @@ -853,7 +947,14 @@ void CTabularSlicerCacheItems::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) } pReader->Seek(_end_rec); } - +XLS::BaseObjectPtr COlapSlicerCacheSelections::toBin() +{ + auto ptr(new XLSB::SLICERCACHESELECTIONS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_oSelection) + ptr->m_arBrtSlicerCacheSelection.push_back(i.toBin()); + return objectPtr; +} void COlapSlicerCacheSelections::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -975,6 +1076,17 @@ void COlapSlicerCacheLevelsData::fromBin(XLS::BaseObjectPtr& obj) } } +XLS::BaseObjectPtr COlapSlicerCacheLevelsData::toBin() +{ + auto ptr(new XLSB::SLICERCACHELEVELSDATA); + XLS::BaseObjectPtr objectPtr(ptr); + if(!m_oLevel.empty()) + { + for(auto i:m_oLevel) + ptr->m_arSLICERCACHELEVELDATA.push_back(i.toBin()); + } + return objectPtr; +} void COlapSlicerCacheLevelsData::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_StartChar_No_NS(oReader) @@ -1075,6 +1187,26 @@ void CTabularSlicerCache::fromBin(XLS::BaseObjectPtr& obj) m_oItems = ptr->m_BrtSlicerCacheNativeItem; } } +XLS::BaseObjectPtr CTabularSlicerCache::toBin() +{ + auto ptr(new XLSB::SLICERCACHENATIVEITEMS); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginSlicerCacheNative); + ptr->m_BrtSlicerCacheNativeItem = XLS::BaseObjectPtr{ptr1}; + if(m_oPivotCacheId.IsInit()) + ptr1->dwcacheId = m_oPivotCacheId.get(); + if(m_oSortOrder.IsInit()) + ptr1->fSortOrder = m_oSortOrder->GetValue() + 1; + if(m_oCustomListSort.IsInit()) + ptr1->fSortUsingCustomLists = m_oCustomListSort.get(); + if(m_oShowMissing.IsInit()) + ptr1->fShowAllItems = m_oShowMissing.get(); + if(m_oCrossFilter.IsInit()) + ptr1->fCrossFilter = m_oCrossFilter->GetValue(); + + ptr->m_BrtSlicerCacheNativeItem = m_oItems->toBin(); + return objectPtr; +} void CTabularSlicerCache::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1227,6 +1359,22 @@ void COlapSlicerCache::fromBin(XLS::BaseObjectPtr& obj) m_oSelections = ptr->m_SLICERCACHESELECTIONS; } } +XLS::BaseObjectPtr COlapSlicerCache::toBin() +{ + auto ptr(new XLSB::SLICERCACHEOLAPIMPL); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oPivotCacheId.IsInit()) + { + auto ptr1(new XLSB::BeginSlicerCacheOlapImpl); + ptr->m_BrtBeginSlicerCacheOlapImpl = XLS::BaseObjectPtr{ptr1}; + ptr1->ipivotcacheid = m_oPivotCacheId.get(); + } + if(m_oLevels.IsInit()) + ptr->m_SLICERCACHELEVELSDATA = m_oLevels->toBin(); + if(m_oSelections.IsInit()) + ptr->m_SLICERCACHESELECTIONS = m_oSelections->toBin(); + return objectPtr; +} void COlapSlicerCache::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1343,6 +1491,15 @@ void CSlicerCacheData::fromBin(XLS::BaseObjectPtr& obj) m_oTabular = obj; } } +XLS::BaseObjectPtr CSlicerCacheData::toBin() +{ + XLS::BaseObjectPtr objectPtr; + if(m_oOlap.IsInit()) + objectPtr = m_oOlap->toBin(); + else if(m_oTabular.IsInit()) + objectPtr = m_oTabular->toBin(); + return objectPtr; +} void CSlicerCacheData::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_StartChar_No_NS(oReader) @@ -1435,7 +1592,16 @@ void CSlicerCachePivotTable::ReadAttributes(XLS::BiffStructure& obj) m_oName = ptr->stPivotTable.value(); } } - +void CSlicerCachePivotTable::toBin(XLS::BiffStructure* obj) +{ + auto ptr = static_cast(obj); + if(m_oTabId.IsInit()) + ptr->iTabId = m_oTabId.get(); + if(m_oName.IsInit()) + ptr->stPivotTable = m_oName.get(); + else + ptr->stPivotTable = 0xFFFFFFFF; +} void CSlicerCachePivotTable::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_StartChar_No_NS(oReader) @@ -1529,6 +1695,38 @@ void CSlicerCacheDefinition::fromBin(XLS::BaseObjectPtr& obj) m_oExtLst = ptr->m_FRTSLICERCACHE; } } +XLS::BaseObjectPtr CSlicerCacheDefinition::toBin() +{ + auto ptr(new XLSB::SLICERCACHE); + auto ptr1(new XLSB::BeginSlicerCacheDef); + ptr->m_BrtBeginSlicerCacheDef = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oName.IsInit()) + ptr1->stName = m_oName.get(); + else + ptr1->stName = 0xFFFFFFFF; + if(m_oSourceName.IsInit()) + ptr1->stHierarchy = m_oSourceName.get(); + else + ptr1->stHierarchy = 0xFFFFFFFF; + if(!m_oPivotTables.empty()) + { + auto ptr2(new XLSB::SlicerCachePivotTables); + ptr->m_BrtSlicerCachePivotTables = XLS::BaseObjectPtr{ptr2}; + for(auto i:m_oPivotTables) + { + XLSB::SlicerCachePivotTable table; + i.toBin(&table); + ptr2->pivotTables.push_back(table); + } + } + if(m_oData.IsInit()) + ptr->m_slicerCacheData = m_oData->toBin(); + if(m_oExtLst.IsInit()) + ptr->m_FRTSLICERCACHE = m_oExtLst->toBinSlicerCache(); + + return objectPtr; +} void CSlicerCacheDefinition::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1769,7 +1967,15 @@ void CSlicerCacheFile::readBin(const CPath& oPath) //slicerCachesStream.reset(); } } +XLS::BaseObjectPtr CSlicerCacheFile::WriteBin() const +{ + XLSB::SlicerCachesStreamPtr slicerCachesStream(new XLSB::SlicerCachesStream); + XLS::BaseObjectPtr objectPtr(slicerCachesStream); + if(m_oSlicerCacheDefinition.IsInit()) + slicerCachesStream->m_SLICERCACHE = m_oSlicerCacheDefinition->toBin(); + return objectPtr; +} void CSlicerCacheFile::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -1796,18 +2002,35 @@ void CSlicerCacheFile::write(const CPath& oPath, const CPath& oDirectory, CConte { if(!m_oSlicerCacheDefinition.IsInit()) return; + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { + NSStringUtils::CStringBuilder sXml; - NSStringUtils::CStringBuilder sXml; - - sXml.WriteString(L""); - m_oSlicerCacheDefinition->toXML(sXml, L"slicerCacheDefinition"); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + sXml.WriteString(L""); + m_oSlicerCacheDefinition->toXML(sXml, L"slicerCacheDefinition"); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); IFileContainer::Write( oPath, oDirectory, oContent ); } +const OOX::FileType CSlicerCacheFile::type() const +{ + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::SlicerCacheBin; + } + return OOX::Spreadsheet::FileTypes::SlicerCache; +} + } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Slicer/SlicerCache.h b/OOXML/XlsxFormat/Slicer/SlicerCache.h index b44b6ceb29..595e0e39cc 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCache.h +++ b/OOXML/XlsxFormat/Slicer/SlicerCache.h @@ -97,6 +97,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -125,6 +126,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -151,6 +153,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure& obj); + void toBin(XLS::BiffStructure* obj); void ReadAttributes(XLS::BiffStructure& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -177,6 +180,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -203,6 +207,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -234,6 +239,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); @@ -260,6 +266,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); @@ -285,6 +292,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const{} virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -312,6 +320,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -344,6 +353,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -373,6 +383,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); @@ -397,6 +408,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure& obj); + void toBin(XLS::BiffStructure* obj); void ReadAttributes(XLS::BiffStructure& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -423,6 +435,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -455,6 +468,7 @@ namespace OOX read( oRootPath, oPath ); } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -463,10 +477,7 @@ namespace OOX } virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::SlicerCache; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp index 492a1591e3..ceb34ce64e 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp @@ -47,6 +47,11 @@ #include "../../XlsbFormat/Biff12_unions/SLICERCACHEIDS.h" #include "../../XlsbFormat/Biff12_unions/SLICERCACHEID.h" #include "../../XlsbFormat/Biff12_records/BeginSlicerCacheID.h" +#include "../../XlsbFormat/Biff12_unions/TABLESLICERCACHEIDS.h" +#include "../../XlsbFormat/Biff12_unions/TABLESLICERCACHEID.h" +#include "../../XlsbFormat/Biff12_records/TableSlicerCacheID.h" +#include "../../XlsbFormat/Biff12_records/FRTBegin.h" +#include "../../XlsbFormat/Biff12_structures/FRTProductVersion.h" #include "../../Binary/Presentation/XmlWriter.h" #include "../../Binary/Presentation/BinReaderWriterDefines.h" @@ -66,6 +71,16 @@ void CSlicerCacheOlapLevelName::fromBin(XLS::BiffStructure& obj) { ReadAttributes(obj); } +void CSlicerCacheOlapLevelName::toBin(XLS::BiffStructure* obj) +{ + auto ptr = static_cast(obj); + if(m_oCount.IsInit()) + ptr->cHiddenItems = m_oCount.get(); + if(m_oUniqueName.IsInit()) + ptr->stUniqueName = m_oUniqueName.get(); + else + ptr->stUniqueName = 0xFFFFFFFF; +} void CSlicerCacheOlapLevelName::ReadAttributes(XLS::BiffStructure& obj) { auto ptr = static_cast(&obj); @@ -161,6 +176,20 @@ void CSlicerCacheHideNoData::fromBin(XLS::BaseObjectPtr &obj) } } +XLS::BaseObjectPtr CSlicerCacheHideNoData::toBin() +{ + auto ptr(new XLSB::SlicerCacheHideItemsWithNoData); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCount.IsInit()) + ptr->cHideItemLevelsCount = m_oCount.get(); + for(auto i:m_oSlicerCacheOlapLevelName) + { + XLSB::SlicerCacheLevelData levelData; + i.toBin(&levelData); + ptr->rgLevels.push_back(levelData); + } + return objectPtr; +} void CSlicerCacheHideNoData::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_StartChar_No_NS(oReader) @@ -254,6 +283,22 @@ void CTableSlicerCache::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); } +XLS::BaseObjectPtr CTableSlicerCache::toBin() +{ + auto ptr(new XLSB::BeginTableSlicerCache); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oTableId.IsInit()) + ptr->dwLstd = m_oTableId.get(); + if(m_oColumn.IsInit()) + ptr->dwColumn = m_oColumn.get(); + if(m_oSortOrder.IsInit()) + ptr->fSortOrder = m_oSortOrder->GetValue() + 1; + if(m_oCustomListSort.IsInit()) + ptr->fSortUsingCustomLists = m_oCustomListSort.get(); + if(m_oCrossFilter.IsInit()) + ptr->iCrossFilter = m_oCrossFilter->GetValue(); + return objectPtr; +} void CTableSlicerCache::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -453,6 +498,35 @@ void CSlicerStyleElement::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) } pReader->Seek(_end_rec); } +XLS::BaseObjectPtr CSlicerStyleElement::toBin() +{ + auto ptr(new XLSB::SlicerStyleElement); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oDxfId.IsInit()); + ptr->dxfId = m_oDxfId.get(); + if( m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeUnselectedItemWithData) + ptr->tseType = 0x0000001C; + if(m_oType.IsInit()) + { + if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeUnselectedItemWithData) + ptr->tseType = 0x0000001C; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeUnselectedItemWithNoData) + ptr->tseType = 0x0000001D; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeSelectedItemWithData) + ptr->tseType = 0x0000001E; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeSelectedItemWithNoData) + ptr->tseType = 0x0000001F; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeHoveredUnselectedItemWithData) + ptr->tseType = 0x00000020; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeHoveredSelectedItemWithData) + ptr->tseType = 0x00000021; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeHoveredUnselectedItemWithNoData) + ptr->tseType = 0x00000022; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeHoveredSelectedItemWithNoData) + ptr->tseType = 0x00000023; + } + return objectPtr; +} void CSlicerStyleElement::fromBin(XLS::BaseObjectPtr &obj) { ReadAttributes(obj); @@ -493,6 +567,30 @@ void CSlicerStyleElement::ReadAttributes(XLS::BaseObjectPtr &obj) } } +XLS::BaseObjectPtr CSlicerCache::toBin() +{ + auto ptr(new XLSB::SLICERCACHEID); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oRId.IsInit()) + { + auto ptr1(new XLSB::BeginSlicerCacheID); + ptr->m_BrtBeginSlicerCacheID = XLS::BaseObjectPtr{ptr1}; + ptr1->FRTheader.relID.relId = m_oRId->GetValue(); + } + return objectPtr; +} +XLS::BaseObjectPtr CSlicerCache::toBinTable() +{ + auto ptr(new XLSB::TABLESLICERCACHEID); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oRId.IsInit()) + { + auto ptr1(new XLSB::TableSlicerCacheID); + ptr->m_BrtTableSlicerCacheID = XLS::BaseObjectPtr{ptr1}; + ptr1->FRTheader.relID.relId = m_oRId->GetValue(); + } + return objectPtr; +} void CSlicerCache::fromBin(XLS::BaseObjectPtr &obj) { ReadAttributes(obj); @@ -540,6 +638,26 @@ void CSlicerCache::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) { pReader->SkipRecord(); } +XLS::BaseObjectPtr CSlicerRef::toBin() +{ + auto ptr(new XLSB::SLICEREX); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginSlicerEx); + ptr1->FRTheader.relID.relId = m_oRId->GetValue(); + ptr->m_BrtBeginSlicerEx = XLS::BaseObjectPtr{ptr1}; + + return objectPtr; +} +XLS::BaseObjectPtr CSlicerRef::toBinTable() +{ + auto ptr(new XLSB::TABLESLICEREX); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginSlicerEx); + ptr1->FRTheader.relID.relId = m_oRId->GetValue(); + ptr->m_BrtBeginSlicerEx = XLS::BaseObjectPtr{ptr1}; + + return objectPtr; +} void CSlicerRef::fromBin(XLS::BaseObjectPtr &obj) { ReadAttributes(obj); @@ -557,7 +675,6 @@ void CSlicerRef::ReadAttributes(XLS::BaseObjectPtr &obj) if(!ptr1->FRTheader.relID.relId.value().empty()) m_oRId = ptr1->FRTheader.relID.relId.value(); } - } } else if(obj->get_type() == XLS::typeTABLESLICEREX) @@ -718,6 +835,24 @@ void CSlicerStyle::fromBin(XLS::BaseObjectPtr &obj) } } +XLS::BaseObjectPtr CSlicerStyle::toBin() +{ + auto ptr(new XLSB::SLICERSTYLE); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oName.IsInit()) + { + auto ptr1(new XLSB::BeginSlicerStyle); + ptr->m_BrtBeginSlicerStyle = XLS::BaseObjectPtr{ptr1}; + ptr1->stName = m_oName.get(); + } + for(auto i: m_oSlicerStyleElements) + { + ptr->m_arBrtSlicerStyleElement.push_back(i.toBin()); + } + + + return objectPtr; +} void CSlicerStyle::ReadAttributes(XLS::BaseObjectPtr &obj) { auto ptr = static_cast(obj.get()); @@ -725,6 +860,34 @@ void CSlicerStyle::ReadAttributes(XLS::BaseObjectPtr &obj) m_oName = ptr->stName.value(); } +XLS::BaseObjectPtr CSlicerCaches::toBin() +{ + auto ptr(new XLSB::SLICERCACHEIDS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_oSlicerCache) + { + ptr->m_arSLICERCACHEID.push_back(i.toBin()); + } + return objectPtr; +} + +XLS::BaseObjectPtr CSlicerCaches::toBinTable() +{ + auto ptr(new XLSB::TABLESLICERCACHEIDS); + auto ptr1(new XLSB::FRTBegin); + ptr->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr1}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0; + ptr1->productVersion = version; + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_oSlicerCache) + { + ptr->m_arTABLESLICERCACHEID.push_back(i.toBinTable()); + } + return objectPtr; +} + void CSlicerCaches::fromBin(XLS::BaseObjectPtr &obj) { auto ptr = static_cast(obj.get()); @@ -778,6 +941,40 @@ void CSlicerCaches::toXML(NSStringUtils::CStringBuilder& writer, const std::wstr } writer.EndNode(sPrefix + sName); } +XLS::BaseObjectPtr CSlicerRefs::toBin() +{ + auto ptr(new XLSB::SLICERSEX); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::FRTBegin); + ptr->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr1}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0; + ptr1->productVersion = version; + + for(auto i:m_oSlicer) + { + ptr->m_arSLICEREX.push_back(i.toBin()); + } + return objectPtr; +} +XLS::BaseObjectPtr CSlicerRefs::toBinTable() +{ + auto ptr(new XLSB::TABLESLICERSEX); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::FRTBegin); + ptr->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr1}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0; + ptr1->productVersion = version; + + for(auto i:m_oSlicer) + { + ptr->m_arTABLESLICEREX.push_back(i.toBinTable()); + } + return objectPtr; +} void CSlicerRefs::fromBin(XLS::BaseObjectPtr &obj) { if(obj->get_type() == XLS::typeSLICERSEX) @@ -949,6 +1146,30 @@ void CSlicerStyles::fromBin(XLS::BaseObjectPtr &obj) } } } +XLS::BaseObjectPtr CSlicerStyles::toBin() +{ + auto ptr(new XLSB::STYLESHEET14); + auto ptr1(new XLSB::FRTBegin); + ptr->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr1}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0; + ptr1->productVersion = version; + XLS::BaseObjectPtr objectPtr(ptr); + auto slicerStyle(new XLSB::SLICERSTYLES); + ptr->m_SLICERSTYLES = XLS::BaseObjectPtr {slicerStyle}; + + auto beginStyles(new XLSB::BeginSlicerStyles); + slicerStyle->m_BrtBeginSlicerStyles = XLS::BaseObjectPtr{beginStyles}; + if(m_oDefaultSlicerStyle.IsInit()) + beginStyles->stDefSlicer = m_oDefaultSlicerStyle.get(); + for(auto i:m_oSlicerStyle) + { + slicerStyle->m_arSLICERSTYLE.push_back(i.toBin()); + } + + return objectPtr; +} void CSlicerStyles::ReadAttributes(XLS::BaseObjectPtr &obj) { auto ptr = static_cast(obj.get()); diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h index a94ddcd7a1..e2992f220c 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h @@ -72,6 +72,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure& obj); + void toBin(XLS::BiffStructure* obj); void ReadAttributes(XLS::BiffStructure& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -98,6 +99,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); @@ -124,6 +126,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -159,6 +162,7 @@ namespace OOX virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const { return et_x_SlicerStyleElement; @@ -181,6 +185,8 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinTable(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -206,6 +212,8 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinTable(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -235,6 +243,7 @@ namespace OOX virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const { return et_x_SlicerStyle; @@ -257,7 +266,10 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const{} virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName, const std::wstring& sPrefix) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinTable(); void fromBin(XLS::BaseObjectPtr& obj); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual EElementType getType() const { @@ -280,6 +292,8 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinTable(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual EElementType getType() const { @@ -306,6 +320,7 @@ namespace OOX virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const { return et_x_SlicerStyles; diff --git a/OOXML/XlsxFormat/Styles/Borders.cpp b/OOXML/XlsxFormat/Styles/Borders.cpp index c3b94bbdf3..5350fe6b44 100644 --- a/OOXML/XlsxFormat/Styles/Borders.cpp +++ b/OOXML/XlsxFormat/Styles/Borders.cpp @@ -36,8 +36,11 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../XlsbFormat/Biff12_records/Border.h" +#include "../../XlsbFormat/Biff12_records/BeginBorders.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" +#include "../../XlsbFormat/Biff12_unions/BORDERS.h" + namespace OOX { namespace Spreadsheet @@ -134,6 +137,53 @@ namespace OOX } } + void CBorderProp::toBin(XLS::BiffStructure* obj) + { + auto ptr = static_cast(obj); + if(m_oColor.IsInit()) + ptr->brtColor = m_oColor->toColor(); + else + { + ptr->brtColor = m_oColor->GetDefaultColor(); + } + + if(!m_oStyle.IsInit()) + { + ptr->dg = 0x00; + return; + } + + if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleNone) + ptr->dg = 0x00; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleThin) + ptr->dg = 0x01; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleMedium) + ptr->dg = 0x02; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleDashed) + ptr->dg = 0x03; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleDotted) + ptr->dg = 0x04; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleThick) + ptr->dg = 0x05; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleDouble) + ptr->dg = 0x06; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleHair) + ptr->dg = 0x07; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleMediumDashed) + ptr->dg = 0x08; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleDashDot) + ptr->dg = 0x09; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleMediumDashDot) + ptr->dg = 0x0A; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleDashDotDot) + ptr->dg = 0x0B; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleMediumDashDotDot) + ptr->dg = 0x0C; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleSlantDashDot) + ptr->dg = 0x0D; + else + ptr->dg = 0x00; + } bool CBorderProp::IsEmpty() { return !(m_oStyle.IsInit() || m_oColor.IsInit()); @@ -302,6 +352,23 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CBorder::toBin() + { + auto ptr(new XLSB::Border); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oBottom.IsInit()) + m_oBottom->toBin(&ptr->blxfBottom); + if(m_oDiagonal.IsInit()) + m_oDiagonal->toBin(&ptr->blxfDiag); + if(m_oTop.IsInit()) + m_oTop->toBin(&ptr->blxfTop); + if(m_oStart.IsInit()) + m_oStart->toBin(&ptr->blxfLeft); + if(m_oEnd.IsInit()) + m_oEnd->toBin(&ptr->blxfRight); + + return objectPtr; + } EElementType CBorder::getType () const { return et_x_Border; @@ -401,6 +468,17 @@ namespace OOX m_mapBorders.insert(std::make_pair(index++, pBorder)); } } + XLS::BaseObjectPtr CBorders::toBin() + { + auto ptr(new XLSB::BORDERS); + auto ptr1(new XLSB::BeginBorders); + ptr->m_BrtBeginBorders = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arBrtBorder.push_back(i->toBin()); + ptr1->cborders = ptr->m_arBrtBorder.size(); + return objectPtr; + } EElementType CBorders::getType () const { return et_x_Borders; diff --git a/OOXML/XlsxFormat/Styles/Borders.h b/OOXML/XlsxFormat/Styles/Borders.h index f8b0ddd017..21f65cc26a 100644 --- a/OOXML/XlsxFormat/Styles/Borders.h +++ b/OOXML/XlsxFormat/Styles/Borders.h @@ -68,6 +68,7 @@ namespace OOX virtual EElementType getType () const; void fromBin(XLS::BiffStructure* obj); + void toBin(XLS::BiffStructure* obj); bool IsEmpty(); private: @@ -98,6 +99,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -135,6 +137,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Styles/CellStyles.cpp b/OOXML/XlsxFormat/Styles/CellStyles.cpp index b8074e2e25..505c043d45 100644 --- a/OOXML/XlsxFormat/Styles/CellStyles.cpp +++ b/OOXML/XlsxFormat/Styles/CellStyles.cpp @@ -34,6 +34,9 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../XlsbFormat/Biff12_records/Style.h" +#include "../../XlsbFormat/Biff12_records/BeginStyles.h" + +#include "../../XlsbFormat/Biff12_unions/STYLES.h" namespace OOX { @@ -71,6 +74,36 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CCellStyle::toBin() + { + auto ptr(new XLSB::Style); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oBuiltinId.IsInit()) + { + ptr->fBuiltIn = true; + ptr->iStyBuiltIn = m_oBuiltinId->GetValue(); + } + else + ptr->fBuiltIn = false; + if (m_oCustomBuiltin.IsInit()) + ptr->fCustom = m_oCustomBuiltin->GetValue(); + else + ptr->fCustom = false; + if (m_oHidden.IsInit()) + ptr->fHidden = m_oHidden->GetValue(); + else + ptr->fHidden = false; + if (m_oILevel.IsInit()) + ptr->iLevel = m_oILevel->GetValue(); + else + ptr->iLevel = 0; + if (m_oName.IsInit()) + ptr->stName = m_oName.get(); + if (m_oXfId.IsInit()) + ptr->ixf = m_oXfId->GetValue(); + + return objectPtr; + } EElementType CCellStyle::getType () const { return et_x_CellStyle; @@ -159,6 +192,18 @@ namespace OOX m_arrItems.push_back(pXfs); } } + XLS::BaseObjectPtr CCellStyles::toBin() + { + auto ptr(new XLSB::STYLES); + auto ptr1(new XLSB::BeginStyles); + ptr->m_BrtBeginStyles = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto i:m_arrItems) + ptr->m_arBrtStyle.push_back(i->toBin()); + ptr1->cstyles = ptr->m_arBrtStyle.size(); + return objectPtr; + } EElementType CCellStyles::getType () const { return et_x_CellStyles; diff --git a/OOXML/XlsxFormat/Styles/CellStyles.h b/OOXML/XlsxFormat/Styles/CellStyles.h index b62b65c3d5..d69e44c085 100644 --- a/OOXML/XlsxFormat/Styles/CellStyles.h +++ b/OOXML/XlsxFormat/Styles/CellStyles.h @@ -60,6 +60,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; @@ -90,6 +91,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(std::vector& obj); virtual EElementType getType () const; diff --git a/OOXML/XlsxFormat/Styles/Colors.cpp b/OOXML/XlsxFormat/Styles/Colors.cpp index 7adcbffdf7..5b9d98cfe0 100644 --- a/OOXML/XlsxFormat/Styles/Colors.cpp +++ b/OOXML/XlsxFormat/Styles/Colors.cpp @@ -98,6 +98,27 @@ namespace OOX } } } + XLS::BaseObjectPtr CColors::toBin() + { + auto ptr(new XLSB::COLORPALETTE); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oIndexedColors.IsInit()) + { + auto indexColors(new XLSB::INDEXEDCOLORS); + ptr->m_INDEXEDCOLORS = XLS::BaseObjectPtr{indexColors}; + indexColors->m_arIndexedColor = m_oIndexedColors->toBin(); + } + + if(m_oMruColors.IsInit()) + { + auto mruColors(new XLSB::MRUCOLORS); + ptr->m_MRUCOLORS = XLS::BaseObjectPtr{mruColors}; + mruColors->m_arMRUColor = m_oMruColors->toBin(); + } + + return objectPtr; + } EElementType CColors::getType () const { return et_x_Colors; diff --git a/OOXML/XlsxFormat/Styles/Colors.h b/OOXML/XlsxFormat/Styles/Colors.h index a8d92c0621..f593ae4fab 100644 --- a/OOXML/XlsxFormat/Styles/Colors.h +++ b/OOXML/XlsxFormat/Styles/Colors.h @@ -52,6 +52,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Styles/Fills.cpp b/OOXML/XlsxFormat/Styles/Fills.cpp index 608dba331f..1d8f16f533 100644 --- a/OOXML/XlsxFormat/Styles/Fills.cpp +++ b/OOXML/XlsxFormat/Styles/Fills.cpp @@ -36,8 +36,11 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../XlsbFormat/Biff12_records/Fill.h" +#include "../../XlsbFormat/Biff12_records/BeginFills.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" +#include "../../XlsbFormat/Biff12_unions/FILLS.h" + namespace OOX { namespace Spreadsheet @@ -75,11 +78,9 @@ namespace OOX else if(m_oFgColor.IsInit()) { m_oFgColor->toXMLWithNS(writer, child_ns, L"fgColor", child_ns); - m_oFgColor->toXMLWithNS(writer, child_ns, L"bgColor", child_ns); } else if(m_oBgColor.IsInit()) { - m_oBgColor->toXMLWithNS(writer, child_ns, L"fgColor", child_ns); m_oBgColor->toXMLWithNS(writer, child_ns, L"bgColor", child_ns); } @@ -110,6 +111,76 @@ namespace OOX { ReadAttributes(obj); } + void CPatternFill::toBin(XLS::BaseObjectPtr obj) + { + auto ptr = static_cast(obj.get()); + if(m_oPatternType.IsInit()) + { + if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeNone) + ptr->fls = 0x00; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeSolid) + ptr->fls = 0x01; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeMediumGray) + ptr->fls = 0x02; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkGray) + ptr->fls = 0x03; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightGray) + ptr->fls = 0x04; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkHorizontal) + ptr->fls = 0x05; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkVertical) + ptr->fls = 0x06; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkDown) + ptr->fls = 0x07; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkUp) + ptr->fls = 0x08; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkGrid) + ptr->fls = 0x09; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkTrellis) + ptr->fls = 0x0A; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightHorizontal) + ptr->fls = 0x0B; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightVertical) + ptr->fls = 0x0C; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightDown) + ptr->fls = 0x0D; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightUp) + ptr->fls = 0x0E; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightGrid) + ptr->fls = 0x0F; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightTrellis) + ptr->fls = 0x10; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeGray125) + ptr->fls = 0x11; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeGray0625) + ptr->fls = 0x12; + } + + if(m_oBgColor.IsInit()) + ptr->brtColorBack = m_oBgColor->toColor(); + else + { + ptr->brtColorBack.bAlpha = 255; + ptr->brtColorBack.bBlue = 0; + ptr->brtColorBack.bGreen = 0; + ptr->brtColorBack.bRed = 0; + ptr->brtColorBack.index = 64; + ptr->brtColorBack.nTintAndShade = 0; + ptr->brtColorBack.xColorType = 0; + } + if(m_oFgColor.IsInit()) + ptr->brtColorFore = m_oFgColor->toColor(); + else + { + ptr->brtColorFore.bAlpha = 255; + ptr->brtColorFore.bBlue = 255; + ptr->brtColorFore.bGreen = 255; + ptr->brtColorFore.bRed = 255; + ptr->brtColorFore.index = 64; + ptr->brtColorFore.nTintAndShade = 0; + ptr->brtColorFore.xColorType = 0; + } + } EElementType CPatternFill::getType () const { return et_x_PatternFill; @@ -230,6 +301,21 @@ namespace OOX m_oColor->fromBin(dynamic_cast(&ptr->brtColor)); } } + void CGradientStop::toBin(XLS::BaseObjectPtr obj) + { + auto ptr = static_cast(obj.get()); + XLSB::GradientStop stop; + if(m_oPosition.IsInit()) + stop.xnumPosition.data.value = m_oPosition->GetValue(); + else + stop.xnumPosition.data.value = 0; + if(m_oColor.IsInit()) + { + stop.brtColor = m_oColor->toColor(); + } + ptr->xfillGradientStop.push_back(stop); + } + EElementType CGradientStop::getType () const { return et_x_GradientStop; @@ -310,6 +396,40 @@ namespace OOX m_arrItems.push_back(ptrGradStop); } } + } + void CGradientFill::toBin(XLS::BaseObjectPtr obj) + { + auto ptr = static_cast(obj.get()); + + if(m_oType.IsInit()) + ptr->iGradientType = m_oType->GetValue(); + else + ptr->iGradientType = 0; + if(m_oDegree.IsInit()) + ptr->xnumDegree.data.value = m_oDegree->GetValue(); + else + ptr->xnumDegree.data.value = 0; + if(m_oLeft.IsInit()) + ptr->xnumFillToLeft.data.value = m_oLeft->GetValue(); + else + ptr->xnumFillToLeft.data.value = 0; + if(m_oRight.IsInit()) + ptr->xnumFillToRight.data.value = m_oRight->GetValue(); + else + ptr->xnumFillToRight.data.value = 0; + if(m_oTop .IsInit()) + ptr->xnumFillToTop.data.value = m_oTop->GetValue(); + else + ptr->xnumFillToTop.data.value = 0; + if(m_oBottom.IsInit()) + ptr->xnumFillToBottom.data.value = m_oBottom->GetValue(); + else + ptr->xnumFillToBottom.data.value = 0; + + for(auto i:m_arrItems) + { + i->toBin(obj); + } } @@ -397,6 +517,27 @@ namespace OOX if ((m_oGradientFill.IsInit()) && (false == m_oGradientFill->m_oType.IsInit())) m_oGradientFill.reset(); } + XLS::BaseObjectPtr CFill::toBin() + { + auto ptr(new XLSB::Fill); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oPatternFill.IsInit()) + { + m_oPatternFill->toBin(objectPtr); + } + + if(m_oGradientFill.IsInit()) + { + m_oGradientFill->toBin(objectPtr); + } + else + { + ptr->iGradientType = 0; + } + ptr->cNumStop = 0; + return objectPtr; + } EElementType CFill::getType () const { return et_x_Fill; @@ -500,6 +641,19 @@ namespace OOX m_mapFills.insert(std::make_pair(index++, pFill)); } } + XLS::BaseObjectPtr CFills::toBin() + { + auto ptr(new XLSB::FILLS); + auto ptr1(new XLSB::BeginFills); + ptr->m_BrtBeginFills = XLS::BaseObjectPtr{ptr1}; + + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i : m_arrItems) + ptr->m_arBrtFill.push_back(i->toBin()); + ptr1->cfills = ptr->m_arBrtFill.size(); + return objectPtr; + + } EElementType CFills::getType () const { return et_x_Fills; diff --git a/OOXML/XlsxFormat/Styles/Fills.h b/OOXML/XlsxFormat/Styles/Fills.h index 7294079c86..278d257681 100644 --- a/OOXML/XlsxFormat/Styles/Fills.h +++ b/OOXML/XlsxFormat/Styles/Fills.h @@ -67,6 +67,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + void toBin(XLS::BaseObjectPtr obj); virtual EElementType getType () const; @@ -95,6 +96,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure* obj); + void toBin(XLS::BaseObjectPtr obj); virtual EElementType getType () const; @@ -122,6 +124,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + void toBin(XLS::BaseObjectPtr obj); virtual EElementType getType () const; @@ -154,6 +157,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -180,6 +184,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Styles/Fonts.cpp b/OOXML/XlsxFormat/Styles/Fonts.cpp index 8a0efa5cab..fd18d078e3 100644 --- a/OOXML/XlsxFormat/Styles/Fonts.cpp +++ b/OOXML/XlsxFormat/Styles/Fonts.cpp @@ -34,6 +34,9 @@ #include "../ComplexTypes_Spreadsheet.h" #include "../../XlsbFormat/Biff12_records/CommonRecords.h" +#include "../../XlsbFormat/Biff12_records/BeginFonts.h" + +#include "../../XlsbFormat/Biff12_unions/FONTS.h" namespace OOX { @@ -179,6 +182,110 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CFont::toBin() + { + auto ptr(new XLSB::Font); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oSz.IsInit()) + ptr->dyHeight = m_oSz->m_oVal->GetValue() * 20; + + if(m_oItalic.IsInit()) + ptr->fItalic = m_oItalic->ToBool(); + else + ptr->fItalic = false; + + if(m_oStrike.IsInit()) + ptr->fStrikeOut = m_oStrike->ToBool(); + else + ptr->fStrikeOut = false; + + if(m_oOutline.IsInit()) + ptr->fOutline = m_oOutline->ToBool(); + else + ptr->fOutline = false; + + if(m_oShadow.IsInit()) + ptr->fShadow = m_oShadow->ToBool(); + else + ptr->fShadow = false; + + if(m_oCondense.IsInit()) + ptr->fCondense = m_oCondense->ToBool(); + else + ptr->fCondense = false; + + if(m_oExtend.IsInit()) + ptr->fExtend = m_oExtend->ToBool(); + else + ptr->fExtend = false; + if(m_oBold.IsInit()) + { + if(m_oBold->ToBool()) + ptr->bls = 0x02BC; + } + + if(m_oUnderline.IsInit()) + { + if(m_oUnderline->m_oUnderline.IsInit()) + { + if(m_oUnderline->m_oUnderline == SimpleTypes::Spreadsheet::EUnderline::underlineNone) + ptr->uls = 0; + else if(m_oUnderline->m_oUnderline == SimpleTypes::Spreadsheet::EUnderline::underlineSingle) + ptr->uls = 1; + else if(m_oUnderline->m_oUnderline == SimpleTypes::Spreadsheet::EUnderline::underlineDouble) + ptr->uls = 2; + else if(m_oUnderline->m_oUnderline == SimpleTypes::Spreadsheet::EUnderline::underlineSingleAccounting) + ptr->uls = 33; + else if(m_oUnderline->m_oUnderline == SimpleTypes::Spreadsheet::EUnderline::underlineDoubleAccounting) + ptr->uls = 34; + } + } + + if(m_oFamily.IsInit()) + ptr->bFamily = m_oFamily->m_oFontFamily->GetValue(); + + if(m_oCharset.IsInit()) + ptr->bCharSet = m_oCharset->m_oCharset->GetValue(); + + if(m_oColor.IsInit()) + ptr->brtColor = m_oColor->toColor(); + else + { + ptr->brtColor = m_oColor->GetDefaultColor(); + } + + if(m_oScheme.IsInit()) + { + if(m_oScheme->m_oFontScheme.IsInit()) + { + if(m_oScheme->m_oFontScheme == SimpleTypes::Spreadsheet::EFontScheme::fontschemeNone) + ptr->bFontScheme = 0; + else if(m_oScheme->m_oFontScheme == SimpleTypes::Spreadsheet::EFontScheme::fontschemeMajor) + ptr->bFontScheme = 1; + else if(m_oScheme->m_oFontScheme == SimpleTypes::Spreadsheet::EFontScheme::fontschemeMinor) + ptr->bFontScheme = 2; + } + } + + + if(m_oRFont.IsInit()) + ptr->fontName = m_oRFont->m_sVal.get(); + if(m_oVertAlign.IsInit()) + { + if(m_oVertAlign->m_oVerticalAlign.IsInit()) + { + if(m_oVertAlign->m_oVerticalAlign->GetValue() == SimpleTypes::EVerticalAlignRun::verticalalignrunBaseline) + ptr->sss = 0; + else if(m_oVertAlign->m_oVerticalAlign->GetValue() == SimpleTypes::EVerticalAlignRun::verticalalignrunSuperscript) + ptr->sss = 1; + else if(m_oVertAlign->m_oVerticalAlign->GetValue() == SimpleTypes::EVerticalAlignRun::verticalalignrunSubscript) + ptr->sss = 2; + } + } + + return objectPtr; + } EElementType CFont::getType () const { return et_x_Font; @@ -406,6 +513,20 @@ namespace OOX m_mapFonts.insert(std::make_pair(index++, pFont)); } } + XLS::BaseObjectPtr CFonts::toBin() + { + auto ptr(new XLSB::FONTS); + auto ptr1(new XLSB::BeginFonts); + ptr->m_BrtBeginFonts = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto i:m_arrItems) + { + ptr->m_arBrtFont.push_back(i->toBin()); + } + ptr1->cfonts = ptr->m_arBrtFont.size(); + return objectPtr; + } EElementType CFonts::getType () const { return et_x_Fonts; diff --git a/OOXML/XlsxFormat/Styles/Fonts.h b/OOXML/XlsxFormat/Styles/Fonts.h index f629aee271..1f8050fcb8 100644 --- a/OOXML/XlsxFormat/Styles/Fonts.h +++ b/OOXML/XlsxFormat/Styles/Fonts.h @@ -55,6 +55,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -95,6 +96,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; void AddFont (CFont* pFont); diff --git a/OOXML/XlsxFormat/Styles/NumFmts.cpp b/OOXML/XlsxFormat/Styles/NumFmts.cpp index 431f9583d6..9109cf6fe9 100644 --- a/OOXML/XlsxFormat/Styles/NumFmts.cpp +++ b/OOXML/XlsxFormat/Styles/NumFmts.cpp @@ -36,6 +36,7 @@ #include "../../XlsbFormat/Biff12_unions/ACFMT.h" #include "../../Common/SimpleTypes_Shared.h" +#include "../../XlsbFormat/Biff12_unions/FMTS.h" namespace OOX { @@ -83,6 +84,17 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CNumFmt::toBin() + { + auto ptr(new XLSB::Fmt); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oFormatCode.IsInit()) + ptr->stFmtCode = m_oFormatCode.get(); + if(m_oNumFmtId.IsInit()) + ptr->ifmt = m_oNumFmtId->GetValue(); + + return objectPtr; + } EElementType CNumFmt::getType () const { return et_x_NumFmt; @@ -187,6 +199,17 @@ namespace OOX } } + XLS::BaseObjectPtr CNumFmts::toBin() + { + auto fmts(new XLSB::FMTS); + XLS::BaseObjectPtr objectPtr(fmts); + std::vector objectVector; + for(auto i:m_arrItems) + { + fmts->m_arBrtFmt.push_back(i->toBin()); + } + return objectPtr; + } EElementType CNumFmts::getType () const { return et_x_NumFmts; diff --git a/OOXML/XlsxFormat/Styles/NumFmts.h b/OOXML/XlsxFormat/Styles/NumFmts.h index 70974a26b4..fa3bc7371b 100644 --- a/OOXML/XlsxFormat/Styles/NumFmts.h +++ b/OOXML/XlsxFormat/Styles/NumFmts.h @@ -61,6 +61,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -90,6 +91,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Styles/Styles.h b/OOXML/XlsxFormat/Styles/Styles.h index e9d94ff37a..83ec20520f 100644 --- a/OOXML/XlsxFormat/Styles/Styles.h +++ b/OOXML/XlsxFormat/Styles/Styles.h @@ -105,6 +105,7 @@ namespace OOX virtual ~CStyles(); void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); diff --git a/OOXML/XlsxFormat/Styles/TableStyles.cpp b/OOXML/XlsxFormat/Styles/TableStyles.cpp index e65ec23663..7e99b76c8f 100644 --- a/OOXML/XlsxFormat/Styles/TableStyles.cpp +++ b/OOXML/XlsxFormat/Styles/TableStyles.cpp @@ -80,6 +80,85 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CTableStyleElement::toBin() + { + auto ptr(new XLSB::TableStyleElement); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oDxfId.IsInit()) + ptr->index = m_oDxfId->GetValue(); + else + ptr->index = 0; + if(m_oSize.IsInit()) + ptr->size = m_oSize->GetValue(); + else + ptr->size = 0; + + if(m_oType.IsInit()) + { + if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeWholeTable) + ptr->tseType = 0; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeHeaderRow) + ptr->tseType = 1; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeTotalRow) + ptr->tseType = 2; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstColumn) + ptr->tseType = 3; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeLastColumn) + ptr->tseType = 4; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstRowStripe) + ptr->tseType = 5; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeSecondRowStripe) + ptr->tseType = 6; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstColumnStripe) + ptr->tseType = 7; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeSecondColumnStripe) + ptr->tseType = 8; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstHeaderCell) + ptr->tseType = 9; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeLastHeaderCell) + ptr->tseType = 10; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstTotalCell) + ptr->tseType = 11; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeLastTotalCell) + ptr->tseType = 12; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstSubtotalColumn) + ptr->tseType = 13; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeSecondSubtotalColumn) + ptr->tseType = 14; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeThirdSubtotalColumn) + ptr->tseType = 15; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstSubtotalRow) + ptr->tseType = 16; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeSecondSubtotalRow) + ptr->tseType = 17; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeThirdSubtotalRow) + ptr->tseType = 18; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeBlankRow) + ptr->tseType = 19; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstColumnSubheading) + ptr->tseType = 20; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeSecondColumnSubheading) + ptr->tseType = 21; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeThirdColumnSubheading) + ptr->tseType = 22; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstRowSubheading) + ptr->tseType = 23; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeSecondRowSubheading) + ptr->tseType = 24; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeThirdRowSubheading) + ptr->tseType = 25; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypePageFieldLabels) + ptr->tseType = 26; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypePageFieldValues) + ptr->tseType = 27; + else + ptr->tseType = 19; + } + else + ptr->tseType = 19; + + return objectPtr; + } EElementType CTableStyleElement::getType () const { return et_x_TableStyleElement; @@ -236,6 +315,31 @@ namespace OOX } } + XLS::BaseObjectPtr CTableStyle::toBin() + { + auto ptr(new XLSB::TABLESTYLE); + XLS::BaseObjectPtr objectPtr(ptr); + auto beginStyle(new XLSB::BeginTableStyle); + ptr->m_BrtBeginTableStyle = XLS::BaseObjectPtr{beginStyle}; + + beginStyle->ctse = m_arrItems.size(); + if(m_oPivot.IsInit()) + beginStyle->fIsPivot = m_oPivot->GetValue(); + else + beginStyle->fIsPivot = false; + if(m_oTable.IsInit()) + beginStyle->fIsTable = m_oTable->GetValue(); + else + beginStyle->fIsTable = false; + if(m_oName.IsInit()) + beginStyle->rgchName = m_oName.get(); + else if(m_oDisplayName.IsInit()) + beginStyle->rgchName = m_oDisplayName.get(); + + for(auto i:m_arrItems) + ptr->m_arBrtTableStyleElement.push_back(i->toBin()); + return objectPtr; + } EElementType CTableStyle::getType () const { return et_x_TableStyle; @@ -333,6 +437,19 @@ namespace OOX } } + XLS::BaseObjectPtr CTableStyles::toBin() + { + auto ptr(new XLSB::TABLESTYLES); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginTableStyles); + ptr->m_BrtBeginTableStyles = XLS::BaseObjectPtr{ptr1}; + for(auto i:m_arrItems) + ptr->m_arTABLESTYLE.push_back(i->toBin()); + ptr1->cts = ptr->m_arTABLESTYLE.size(); + ptr1->rgchDefTableStyle = m_oDefaultTableStyle.get(); + ptr1->rgchDefPivotStyle = m_oDefaultPivotStyle.get(); + return objectPtr; + } EElementType CTableStyles::getType () const { return et_x_TableStyles; diff --git a/OOXML/XlsxFormat/Styles/TableStyles.h b/OOXML/XlsxFormat/Styles/TableStyles.h index 6c618606c7..e5d8900b5a 100644 --- a/OOXML/XlsxFormat/Styles/TableStyles.h +++ b/OOXML/XlsxFormat/Styles/TableStyles.h @@ -63,6 +63,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -89,6 +90,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -118,6 +120,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Styles/Xfs.cpp b/OOXML/XlsxFormat/Styles/Xfs.cpp index 846a31af9f..f771a556c5 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.cpp +++ b/OOXML/XlsxFormat/Styles/Xfs.cpp @@ -36,6 +36,11 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../XlsbFormat/Biff12_records/CommonRecords.h" +#include "../../XlsbFormat/Biff12_records/BeginCellStyleXFs.h" +#include "../../XlsbFormat/Biff12_records/BeginCellXFs.h" + +#include "../../XlsbFormat/Biff12_unions/CELLSTYLEXFS.h" +#include "../../XlsbFormat/Biff12_unions/CELLXFS.h" namespace OOX { @@ -83,6 +88,57 @@ namespace OOX void CAligment::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); + } + void CAligment::toBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if(m_oIndent.IsInit()) + ptr->cIndent = m_oIndent.get(); + if(m_oJustifyLastLine.IsInit()) + ptr->fJustLast = m_oJustifyLastLine->GetValue(); + if(m_oReadingOrder.IsInit()) + ptr->iReadOrder = m_oReadingOrder.get(); + if(m_oRelativeIndent.IsInit()) + ptr->iReadOrder = m_oRelativeIndent.get(); + if(m_oShrinkToFit.IsInit()) + ptr->fShrinkToFit = m_oShrinkToFit->GetValue(); + if(m_oTextRotation.IsInit()) + ptr->trot = m_oTextRotation.get(); + if(m_oWrapText.IsInit()) + ptr->fWrap = m_oWrapText->GetValue(); + + if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentGeneral) + ptr->alc = 0; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentLeft) + ptr->alc = 1; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentCenter) + ptr->alc = 2; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentRight) + ptr->alc = 3; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentFill) + ptr->alc = 4; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentJustify) + ptr->alc = 5; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentCenterContinuous) + ptr->alc = 6; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentDistributed) + ptr->alc = 7; + else + ptr->alc = 0; + + if (m_oVertical == SimpleTypes::Spreadsheet::EVerticalAlignment::verticalalignmentTop) + ptr->alcV = 0; + else if (m_oVertical == SimpleTypes::Spreadsheet::EVerticalAlignment::verticalalignmentCenter) + ptr->alcV = 1; + else if (m_oVertical == SimpleTypes::Spreadsheet::EVerticalAlignment::verticalalignmentBottom) + ptr->alcV = 2; + else if (m_oVertical == SimpleTypes::Spreadsheet::EVerticalAlignment::verticalalignmentJustify) + ptr->alcV = 3; + else if (m_oVertical == SimpleTypes::Spreadsheet::EVerticalAlignment::verticalalignmentDistributed) + ptr->alcV = 4; + else + ptr->alcV = 2; + } EElementType CAligment::getType () const { @@ -220,6 +276,18 @@ namespace OOX { ReadAttributes(obj); } + void CProtection::toBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if(m_oHidden.IsInit()) + ptr->fHidden = m_oHidden->GetValue(); + else + ptr->fHidden = false; + if(m_oLocked.IsInit()) + ptr->fLocked = m_oLocked->GetValue(); + else + ptr->fLocked = true; + } EElementType CProtection::getType () const { return et_x_Protection; @@ -310,6 +378,69 @@ namespace OOX m_oAligment = obj; m_oProtection = obj; } + XLS::BaseObjectPtr CXfs::toBin() + { + size_t id = 0; + auto ptr(new XLSB::XF(id, id)); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oBorderId.IsInit()) + ptr->ixBorder = m_oBorderId->GetValue(); + if(m_oFillId.IsInit()) + ptr->iFill = m_oFillId->GetValue(); + if(m_oFontId.IsInit()) + ptr->font_index = m_oFontId->GetValue(); + if(m_oNumFmtId.IsInit()) + ptr->ifmt = m_oNumFmtId->GetValue(); + if(m_oPivotButton.IsInit()) + ptr->fsxButton = m_oPivotButton->GetValue(); + if(m_oQuotePrefix.IsInit()) + ptr->f123Prefix = m_oQuotePrefix->GetValue(); + + if (m_oXfId.IsInit()) + ptr->ixfParent = m_oXfId->GetValue(); + else + ptr->ixfParent = 65535; + + if(m_oAligment.IsInit()) + { + m_oAligment->toBin(objectPtr); + } + else + { + ptr->alc = 0; + ptr->alcV = 2; + } + if(!m_oProtection.IsInit()) + m_oProtection.Init(); + m_oProtection->toBin(objectPtr); + + if(m_oApplyAlignment.IsInit()) + ptr->fAtrAlc = m_oApplyAlignment->GetValue(); + else + ptr->fAtrAlc = false; + if(m_oApplyBorder.IsInit()) + ptr->fAtrBdr = m_oApplyBorder->GetValue(); + else + ptr->fAtrBdr = false; + if(m_oApplyFill.IsInit()) + ptr->fAtrPat = m_oApplyFill->GetValue(); + else + ptr->fAtrPat = false; + if(m_oApplyFont.IsInit()) + ptr->fAtrFnt = m_oApplyFont->GetValue(); + else + ptr->fAtrFnt = false; + if(m_oApplyNumberFormat.IsInit()) + ptr->fAtrNum = m_oApplyNumberFormat->GetValue(); + else + ptr->fAtrNum = false; + if(m_oApplyProtection.IsInit()) + ptr->fAtrProt = m_oApplyProtection->GetValue(); + else + ptr->fAtrProt = false; + + return objectPtr; + } void CXfs::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -410,6 +541,17 @@ namespace OOX m_arrItems.push_back(pXfs); } } + XLS::BaseObjectPtr CCellXfs::toBin() + { + auto ptr(new XLSB::CELLXFS); + auto ptr1(new XLSB::BeginCellXFs); + ptr->m_BrtBeginCellXFs = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arBrtXF.push_back(i->toBin()); + ptr1->cxfs = ptr->m_arBrtXF.size(); + return objectPtr; + } EElementType CCellXfs::getType () const { return et_x_CellXfs; @@ -491,6 +633,18 @@ namespace OOX m_arrItems.push_back(pXfs); } } + XLS::BaseObjectPtr CCellStyleXfs::toBin() + { + auto ptr(new XLSB::CELLSTYLEXFS); + auto ptr1(new XLSB::BeginCellStyleXFs); + ptr->m_BrtBeginCellStyleXFs = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto i:m_arrItems) + ptr->m_arBrtXF.push_back(i->toBin()); + ptr1->cxfs = ptr->m_arBrtXF.size(); + return objectPtr; + } void CCellStyleXfs::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) diff --git a/OOXML/XlsxFormat/Styles/Xfs.h b/OOXML/XlsxFormat/Styles/Xfs.h index 7ab94d1308..480f460ca7 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.h +++ b/OOXML/XlsxFormat/Styles/Xfs.h @@ -66,6 +66,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + void toBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; @@ -103,6 +104,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + void toBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; @@ -134,6 +136,7 @@ namespace OOX virtual EElementType getType () const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -157,7 +160,7 @@ namespace OOX nullable m_oAligment; nullable m_oProtection; - + }; class CCellXfs : public WritingElementWithChilds @@ -174,6 +177,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -202,6 +206,7 @@ namespace OOX virtual EElementType getType () const; void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); diff --git a/OOXML/XlsxFormat/Styles/XlsxStyles.cpp b/OOXML/XlsxFormat/Styles/XlsxStyles.cpp index c4c32202ba..c9baa4c890 100644 --- a/OOXML/XlsxFormat/Styles/XlsxStyles.cpp +++ b/OOXML/XlsxFormat/Styles/XlsxStyles.cpp @@ -61,6 +61,8 @@ #include "../../XlsbFormat/Biff12_unions/STYLES.h" #include "../../XlsbFormat/Biff12_unions/DXFS.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -210,6 +212,44 @@ namespace OOX } } + XLS::BaseObjectPtr CStyles::WriteBin() const + { + XLSB::StylesStreamPtr stylesStream(new XLSB::StylesStream); + XLS::BaseObjectPtr objectPtr(stylesStream); + if (m_oNumFmts.IsInit()) + stylesStream->m_FMTS = m_oNumFmts->toBin(); + + if (m_oFonts.IsInit()) + stylesStream->m_FONTS = m_oFonts->toBin(); + + if (m_oFills.IsInit()) + stylesStream->m_FILLS = m_oFills->toBin(); + + if (m_oBorders.IsInit()) + stylesStream->m_BORDERS = m_oBorders->toBin(); + + if (m_oCellStyleXfs.IsInit()) + stylesStream->m_CELLSTYLEXFS = m_oCellStyleXfs->toBin(); + + if (m_oCellXfs.IsInit()) + stylesStream->m_CELLXFS = m_oCellXfs->toBin(); + + if (m_oCellStyles.IsInit()) + stylesStream->m_STYLES = m_oCellStyles->toBin(); + + if (m_oDxfs.IsInit()) + stylesStream->m_DXFS = m_oDxfs->toBin(); + + if (m_oTableStyles.IsInit()) + stylesStream->m_TABLESTYLES = m_oTableStyles->toBin(); + + if (m_oColors.IsInit()) + stylesStream->m_COLORPALETTE = m_oColors->toBin(); + + if (m_oExtLst.IsInit()) + stylesStream->m_FRTSTYLESHEET = m_oExtLst->toBinStyles(); + return objectPtr; + } void CStyles::read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -324,6 +364,14 @@ namespace OOX } void CStyles::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { NSStringUtils::CStringBuilder sXml; sXml.WriteString(L"\ @@ -341,7 +389,7 @@ xmlns:x16r2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/02/main\">" std::wstring sPath = oPath.GetPath(); NSFile::CFileBinary::SaveToFile(sPath.c_str(), sXml.GetData()); - + } oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); } void CStyles::AfterRead() @@ -395,7 +443,7 @@ xmlns:x16r2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/02/main\">" cell_style->m_oName = L"Normal"; m_oCellStyles->m_arrItems.push_back(cell_style); - + CXfs *cell_xfs = new CXfs(); cell_xfs->m_oXfId = iXfs; @@ -758,6 +806,11 @@ xmlns:x16r2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/02/main\">" } const OOX::FileType CStyles::type() const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::StylesBin; + } return OOX::Spreadsheet::FileTypes::Styles; } const CPath CStyles::DefaultDirectory() const @@ -766,7 +819,18 @@ xmlns:x16r2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/02/main\">" } const CPath CStyles::DefaultFileName() const { - return type().DefaultFileName(); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + CPath name = type().DefaultFileName(); + + name.SetExtention(L"bin"); + return name; + } + else + { + return type().DefaultFileName(); + } } const CPath& CStyles::GetReadPath() { diff --git a/OOXML/XlsxFormat/Styles/dxf.cpp b/OOXML/XlsxFormat/Styles/dxf.cpp index 7a655abf88..d34afbdcd0 100644 --- a/OOXML/XlsxFormat/Styles/dxf.cpp +++ b/OOXML/XlsxFormat/Styles/dxf.cpp @@ -41,10 +41,13 @@ #include "../../XlsbFormat/Biff12_unions/DXF.h" #include "../../XlsbFormat/Biff12_unions/FRTDXF.h" #include "../../XlsbFormat/Biff12_records/CommonRecords.h" +#include "../../XlsbFormat/Biff12_records/BeginDXFs.h" #include "../../Common/SimpleTypes_Shared.h" #include +#include "../../XlsbFormat/Biff12_unions/DXFS.h" + namespace OOX { namespace Spreadsheet @@ -196,6 +199,23 @@ namespace OOX } } + XLS::BaseObjectPtr CDxf::toBin() + { + auto ptr(new XLSB::DXF); + auto ptr1(new XLSB::FRTDXF); + ptr1->m_BrtDXF = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); + NSStringUtils::CStringBuilder writer; + toXML(writer); + XmlUtils::CXmlLiteReader oReader; + auto stringData = writer.GetData(); + + if ( !oReader.FromString(stringData)) + return objectPtr; + ptr->deserialize(oReader); + + return objectPtr; + } EElementType CDxf::getType () const { return et_x_Dxf; @@ -300,6 +320,21 @@ namespace OOX m_arrItems.push_back(new CDxf(dxf)); } } + XLS::BaseObjectPtr CDxfs::toBin() + { + auto ptr(new XLSB::DXFS); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginDXFs); + ptr->m_BrtBeginDXFs = XLS::BaseObjectPtr{ptr1}; + for(auto i:m_arrItems) + { + auto udxf(new XLSB::uDXF); + udxf->m_BrtFRTDXF = i->toBin(); + ptr->m_aruDXF.push_back(XLS::BaseObjectPtr{udxf}); + } + ptr1->cdxfs = ptr->m_aruDXF.size(); + return objectPtr; + } void CDxfs::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { // Читаем атрибуты diff --git a/OOXML/XlsxFormat/Styles/dxf.h b/OOXML/XlsxFormat/Styles/dxf.h index 62a9d518f2..79b6679a8f 100644 --- a/OOXML/XlsxFormat/Styles/dxf.h +++ b/OOXML/XlsxFormat/Styles/dxf.h @@ -67,6 +67,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -100,6 +101,7 @@ namespace OOX virtual EElementType getType () const; void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); diff --git a/OOXML/XlsxFormat/Styles/rPr.cpp b/OOXML/XlsxFormat/Styles/rPr.cpp index 192199119e..6c99fa3e12 100644 --- a/OOXML/XlsxFormat/Styles/rPr.cpp +++ b/OOXML/XlsxFormat/Styles/rPr.cpp @@ -68,6 +68,18 @@ namespace OOX m_oRgb = SimpleTypes::Spreadsheet::CHexColor(ptr->bRed, ptr->bGreen, ptr->bBlue); } } + XLS::BaseObjectPtr CRgbColor::toBin() + { + auto ptr(new XLSB::IndexedColor); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oRgb.IsInit()) + { + ptr->bRed = m_oRgb->Get_R(); + ptr->bGreen = m_oRgb->Get_G(); + ptr->bBlue = m_oRgb->Get_B(); + } + return objectPtr; + } EElementType CRgbColor::getType () const { return et_x_RgbColor; @@ -136,6 +148,13 @@ namespace OOX m_arrItems.push_back(pRgbColor); } } + std::vector CIndexedColors::toBin() + { + std::vector objectVector; + for(auto i : m_arrItems) + objectVector.push_back(i->toBin()); + return objectVector; + } EElementType CIndexedColors::getType () const { return et_x_IndexedColors; @@ -429,6 +448,105 @@ namespace OOX { ReadAttributes(obj); } + XLSB::Color CColor::GetDefaultColor() + { + XLSB::Color ptr; + + ptr.bAlpha = 0; + ptr.bBlue = 0; + ptr.bGreen = 0; + ptr.bRed = 0; + + ptr.xColorType = 0; + ptr.nTintAndShade = 0; + ptr.index = 0; + ptr.fValidRGB = true; + + return ptr; + } + XLSB::Color CColor::toColor() + { + XLSB::Color ptr; + + ptr.bAlpha = 0; + ptr.bBlue = 0; + ptr.bGreen = 0; + ptr.bRed = 0; + + if(m_oAuto.IsInit()) + { + if(m_oAuto->GetValue()) + ptr.xColorType = 0; + } + else if(m_oIndexed.IsInit()) + { + ptr.index = m_oIndexed->GetValue(); + ptr.xColorType = 1; + } + else if(m_oThemeColor.IsInit()) + { + ptr.index = m_oThemeColor->GetValue(); + ptr.xColorType = 3; + } + else if(m_oRgb.IsInit()) + { + ptr.bAlpha = m_oRgb->Get_A(); + ptr.bBlue = m_oRgb->Get_B(); + ptr.bGreen = m_oRgb->Get_G(); + ptr.bRed = m_oRgb->Get_R(); + } + + + if ( m_oTint.IsInit()) + { + ptr.nTintAndShade = m_oTint->GetValue() * 32767.0; + } + else + ptr.nTintAndShade = 0; + return ptr; + } + XLS::BaseObjectPtr CColor::toBin() + { + auto ptr(new XLSB::Color); + + XLS::BaseObjectPtr objectPtr(ptr); + + ptr->bAlpha = 0; + ptr->bAlpha = 0; + ptr->bAlpha = 0; + ptr->bAlpha = 0; + + if(m_oAuto.IsInit()) + { + if(m_oAuto->GetValue()) + ptr->xColorType = 0; + } + else if(m_oIndexed.IsInit()) + { + ptr->index = m_oIndexed->GetValue(); + ptr->xColorType = 1; + } + else if(m_oThemeColor.IsInit()) + { + ptr->index = m_oThemeColor->GetValue(); + ptr->xColorType = 3; + } + else + { + ptr->bAlpha = m_oRgb->Get_A(); + ptr->bBlue = m_oRgb->Get_B(); + ptr->bGreen = m_oRgb->Get_G(); + ptr->bRed = m_oRgb->Get_R(); + } + + if ( m_oTint.IsInit()) + { + ptr->nTintAndShade = m_oTint->GetValue() * 32767.0; + } + else + ptr->nTintAndShade = 0; + return objectPtr; + } EElementType CColor::getType () const { return et_x_Color; @@ -567,6 +685,13 @@ namespace OOX m_arrItems.push_back(color); } } + std::vector CMruColors::toBin() + { + std::vector objectVector; + for(auto i:m_arrItems) + objectVector.push_back(i->toBin()); + return objectVector; + } EElementType CMruColors::getType () const { return et_x_MruColors; @@ -702,6 +827,10 @@ namespace OOX if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); + if(!m_oUnderline.IsInit()) + { + m_oUnderline.Init(); + } } std::wstring CUnderline::toXML() const { diff --git a/OOXML/XlsxFormat/Styles/rPr.h b/OOXML/XlsxFormat/Styles/rPr.h index f0ec51018a..ddd9a2d7b7 100644 --- a/OOXML/XlsxFormat/Styles/rPr.h +++ b/OOXML/XlsxFormat/Styles/rPr.h @@ -33,6 +33,7 @@ #include "../WritingElement.h" #include "../../Base/Nullable.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BIFF12/Color.h" namespace NSBinPptxRW { @@ -55,7 +56,7 @@ namespace SimpleTypes class CFontCharset; class CFontFamily; class CFontScheme; - class CUnderline; + class CUnderline; } } @@ -65,7 +66,7 @@ namespace ComplexTypes { class COnOff2; class String; - class CDouble; + class CDouble; } } @@ -87,6 +88,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -98,7 +100,7 @@ namespace OOX public: nullable m_oRgb; }; - + class CIndexedColors : public WritingElementWithChilds { public: @@ -114,6 +116,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; static bool GetDefaultRGBAByIndex(int index, unsigned char& unR, unsigned char& unG, unsigned char& unB, unsigned char& unA); @@ -144,6 +147,9 @@ namespace OOX void fromBin(XLS::BaseObjectPtr& obj); void fromBin(XLS::BaseObject* obj); + XLS::BaseObjectPtr toBin(); + XLSB::Color toColor(); + XLSB::Color GetDefaultColor(); virtual EElementType getType () const; @@ -175,6 +181,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Table/Autofilter.cpp b/OOXML/XlsxFormat/Table/Autofilter.cpp index 908052d894..c21590a25e 100644 --- a/OOXML/XlsxFormat/Table/Autofilter.cpp +++ b/OOXML/XlsxFormat/Table/Autofilter.cpp @@ -104,6 +104,47 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CSortCondition::toBin() + { + auto ptr(new XLSB::BeginSortCond); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oDescending.IsInit()) + ptr->fSortDes = m_oDescending->GetValue(); + else + ptr->fSortDes = 0; + if(m_oRef.IsInit()) + ptr->rfx = m_oRef->GetValue(); + if(m_oSortBy.IsInit()) + { + if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyValue) + { + ptr->sortOn = 0; + } + else if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyCellColor) + { + ptr->sortOn = 1; + ptr->condDataValue.condDataValue = m_oDxfId->GetValue(); + } + else if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyFontColor) + { + ptr->sortOn = 2; + ptr->condDataValue.condDataValue = m_oDxfId->GetValue(); + } + else if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyIcon) + { + ptr->sortOn = 3; + } + else + ptr->sortOn = 0; + } + else + ptr->sortOn = 0; + + + ptr->stSslist = L""; + return objectPtr; + } EElementType CSortCondition::getType () const { return et_x_SortCondition; @@ -254,8 +295,38 @@ namespace OOX for(auto &pSORTCOND14 : ptrACSORTCONDS->m_arSORTCOND14) m_arrItems.push_back(new CSortCondition(static_cast(pSORTCOND14.get())->m_BrtBeginSortCond14)); } + } + XLS::BaseObjectPtr CSortState::toBin() + { + auto ptr(new XLSB::SORTSTATE); + XLS::BaseObjectPtr objectPtr(ptr); + auto beginSortState(new XLSB::BeginSortState); + ptr->m_BrtBeginSortState = XLS::BaseObjectPtr{beginSortState}; + if(m_oRef.IsInit()) + beginSortState->rfx = m_oRef->GetValue(); + if(m_oCaseSensitive.IsInit()) + beginSortState->fCaseSensitive = m_oCaseSensitive->GetValue(); + else + beginSortState->fCaseSensitive = false; + if(m_oColumnSort.IsInit()) + beginSortState->fCol = m_oColumnSort->GetValue(); + else + beginSortState->fCol = false; + if(m_oSortMethod == SimpleTypes::Spreadsheet::ESortMethod::sortmethodStroke) + beginSortState->fAltMethod = true; + else + beginSortState->fAltMethod = false; + auto sortConds(new XLSB::SORTCONDS); + ptr->m_source = XLS::BaseObjectPtr{sortConds}; + for(auto i:m_arrItems) + { + sortConds->m_arSORTCOND.push_back(i->toBin()); + } + beginSortState->cconditions = sortConds->m_arSORTCOND.size(); + + return objectPtr; } EElementType CSortState::getType () const { @@ -328,6 +399,15 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CColorFilter::toBin() + { + auto ptr(new XLSB::ColorFilter); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->fCellColor = m_oCellColor->GetValue(); + ptr->dxfid = m_oDxfId->GetValue(); + + return objectPtr; + } EElementType CColorFilter::getType () const { return et_x_ColorFilter; @@ -392,6 +472,94 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CDynamicFilter::toBin() + { + auto ptr(new XLSB::DynamicFilter); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oType.IsInit()) + { + if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeNull) + ptr->cft = 0x00000000; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeAboveAverage) + ptr->cft = 0x00000001; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeBelowAverage) + ptr->cft = 0x00000002; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeTomorrow) + ptr->cft = 0x00000008; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeToday) + ptr->cft = 0x00000009; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeYesterday) + ptr->cft = 0x0000000A; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeNextWeek) + ptr->cft = 0x0000000B; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeThisWeek) + ptr->cft = 0x0000000C; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeLastWeek) + ptr->cft = 0x0000000D; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeNextMonth) + ptr->cft = 0x0000000E; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeThisMonth) + ptr->cft = 0x0000000F; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeLastMonth) + ptr->cft = 0x00000010; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeNextQuarter) + ptr->cft = 0x00000011; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeThisQuarter) + ptr->cft = 0x00000012; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeLastQuarter) + ptr->cft = 0x00000013; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeNextYear) + ptr->cft = 0x00000014; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeThisYear) + ptr->cft = 0x00000015; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeLastYear) + ptr->cft = 0x00000016; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeYearToDate) + ptr->cft = 0x00000017; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeQ1) + ptr->cft = 0x00000018; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeQ2) + ptr->cft = 0x00000019; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeQ3) + ptr->cft = 0x0000001A; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeQ4) + ptr->cft = 0x0000001B; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM1) + ptr->cft = 0x0000001C; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM2) + ptr->cft = 0x0000001D; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM3) + ptr->cft = 0x0000001E; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM4) + ptr->cft = 0x0000001F; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM5) + ptr->cft = 0x00000020; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM6) + ptr->cft = 0x00000021; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM7) + ptr->cft = 0x00000022; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM8) + ptr->cft = 0x00000023; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM9) + ptr->cft = 0x00000024; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM10) + ptr->cft = 0x00000025; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM11) + ptr->cft = 0x00000026; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM12) + ptr->cft = 0x00000027; + } + if (m_oVal.IsInit()) + { + ptr->xNumValue.data.value = m_oVal->GetValue(); + } + + if (m_oMaxVal.IsInit()) + { + ptr->xNumValueMax.data.value = m_oMaxVal->GetValue(); + } + return objectPtr; + } EElementType CDynamicFilter::getType () const { return et_x_DynamicFilter; @@ -531,6 +699,40 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CCustomFilter::toBin() + { + auto ptr(new XLSB::CustomFilter); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oOperator == SimpleTypes::Spreadsheet::ECustomFilter::customfilterLessThan) + { + ptr->grbitSgn = 0x01; + } + else if (m_oOperator == SimpleTypes::Spreadsheet::ECustomFilter::customfilterEqual) + { + ptr->grbitSgn = 0x02; + } + else if (m_oOperator == SimpleTypes::Spreadsheet::ECustomFilter::customfilterLessThanOrEqual) + { + ptr->grbitSgn = 0x03; + } + else if (m_oOperator == SimpleTypes::Spreadsheet::ECustomFilter::customfilterGreaterThan) + { + ptr->grbitSgn = 0x04; + } + else if (m_oOperator == SimpleTypes::Spreadsheet::ECustomFilter::customfilterNotEqual) + { + ptr->grbitSgn = 0x05; + } + else if (m_oOperator == SimpleTypes::Spreadsheet::ECustomFilter::customfilterGreaterThanOrEqual) + { + ptr->grbitSgn = 0x06; + } + ptr->vts = 0x00000006; + ptr->vtsStringXls = m_oVal.get(); + + return objectPtr; + } EElementType CCustomFilter::getType () const { return et_x_CustomFilters; @@ -647,6 +849,21 @@ namespace OOX } } } + XLS::BaseObjectPtr CCustomFilters::toBin() + { + auto ptr(new XLSB::CUSTOMFILTERS); + XLS::BaseObjectPtr objectPtr(ptr); + auto customFilters(new XLSB::BeginCustomFilters); + ptr->m_BrtBeginCustomFilters = XLS::BaseObjectPtr{customFilters}; + + customFilters->fAnd = m_oAnd->GetValue(); + + for(auto i:m_arrItems) + { + ptr->m_arBrtCustomFilter.push_back(i->toBin()); + } + return objectPtr; + } EElementType CCustomFilters::getType () const { return et_x_CustomFilters; @@ -707,6 +924,13 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CFilter::toBin() + { + auto ptr(new XLSB::Filter); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->rgch = m_oVal.get(); + return objectPtr; + } EElementType CFilter::getType () const { return et_x_Filter; @@ -773,6 +997,44 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CDateGroupItem::toBin() + { + auto ptr(new XLSB::AFilterDateGroupItem); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oDateTimeGrouping == SimpleTypes::Spreadsheet::EDateTimeGroup::datetimegroupYear) + { + ptr->dntChecked = 0x00000000; + } + else if (m_oDateTimeGrouping == SimpleTypes::Spreadsheet::EDateTimeGroup::datetimegroupMonth) + { + ptr->dntChecked = 0x00000001; + } + else if (m_oDateTimeGrouping == SimpleTypes::Spreadsheet::EDateTimeGroup::datetimegroupDay) + { + ptr->dntChecked = 0x00000002; + } + else if (m_oDateTimeGrouping == SimpleTypes::Spreadsheet::EDateTimeGroup::datetimegroupHour) + { + ptr->dntChecked = 0x00000003; + } + else if (m_oDateTimeGrouping == SimpleTypes::Spreadsheet::EDateTimeGroup::datetimegroupMinute) + { + ptr->dntChecked = 0x00000004; + } + else if (m_oDateTimeGrouping == SimpleTypes::Spreadsheet::EDateTimeGroup::datetimegroupSecond) + { + ptr->dntChecked = 0x00000005; + } + + ptr->dom = m_oDay->GetValue(); + ptr->hour = m_oHour->GetValue(); + ptr->min = m_oMinute->GetValue(); + ptr->mon = m_oMonth->GetValue(); + ptr->sec = m_oSecond->GetValue(); + ptr->yr = m_oYear->GetValue(); + return objectPtr; + } EElementType CDateGroupItem::getType () const { return et_x_DateGroupItem; @@ -911,6 +1173,27 @@ namespace OOX } } } + XLS::BaseObjectPtr CFilters::toBin() + { + auto ptr(new XLSB::FILTERS); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oBlank.IsInit()) + { + auto beginFilters(new XLSB::BeginFilters); + beginFilters->fBlank = m_oBlank->GetValue(); + } + for(auto i: m_arrItems) + { + if (CFilter* cfilter = dynamic_cast(i)) { + // Элемент является экземпляром класса CFilter + ptr->m_arBrtFilter.push_back(cfilter->toBin()); + } else if (CDateGroupItem* groupItem = dynamic_cast(i)) { + // Элемент является экземпляром класса CDateGroupItem + ptr->m_arBrtAFilterDateGroupItem.push_back(groupItem->toBin()); + } + } + return objectPtr; + } EElementType CFilters::getType () const { return et_x_Filters; @@ -976,6 +1259,25 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CTop10::toBin() + { + auto ptr(new XLSB::Top10Filter); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oFilterVal.IsInit()) + ptr->xNumValue.data.value = m_oFilterVal->GetValue(); + + if (m_oPercent.IsInit()) + ptr->fPercent = m_oPercent->GetValue(); + + if (m_oTop.IsInit()) + ptr->fTop = m_oTop->GetValue(); + + if (m_oVal.IsInit()) + ptr->xNumFilter.data.value = m_oVal->GetValue(); + + return objectPtr; + } EElementType CTop10::getType () const { return et_x_ColorFilter; @@ -1092,6 +1394,33 @@ namespace OOX } } } + XLS::BaseObjectPtr CFilterColumn::toBin() + { + auto ptr(new XLSB::FILTERCOLUMN); + XLS::BaseObjectPtr objectPtr(ptr); + auto beginfilter(new XLSB::BeginFilterColumn); + ptr->m_BrtBeginFilterColumn = XLS::BaseObjectPtr{beginfilter}; + + if(m_oColId.IsInit()) + beginfilter->dwCol = m_oColId->GetValue(); + if(m_oHiddenButton.IsInit()) + beginfilter->fHideArrow = m_oHiddenButton->GetValue(); + if(m_oShowButton.IsInit()) + beginfilter->fNoBtn = m_oShowButton->GetValue(); + + if(m_oColorFilter.IsInit()) + ptr->m_source = m_oColorFilter->toBin(); + else if(m_oDynamicFilter.IsInit()) + ptr->m_source = m_oDynamicFilter->toBin(); + else if(m_oCustomFilters.IsInit()) + ptr->m_source = m_oCustomFilters->toBin(); + else if(m_oFilters.IsInit()) + ptr->m_source = m_oFilters->toBin(); + else if(m_oTop10.IsInit()) + ptr->m_source = m_oTop10->toBin(); + + return objectPtr; + } EElementType CFilterColumn::getType () const { return et_x_FilterColumn; @@ -1190,6 +1519,21 @@ namespace OOX } } } + XLS::BaseObjectPtr CAutofilter::toBin() + { + auto ptr(new XLSB::AUTOFILTER); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oRef.IsInit()) + { + auto beginFilter(new XLSB::BeginAFilter); + beginFilter->rfx = m_oRef->GetValue(); + ptr->m_BrtBeginAFilter = XLS::BaseObjectPtr{beginFilter}; + } + if(m_oSortState.IsInit()) + ptr->m_SORTSTATE = m_oSortState->toBin(); + + return objectPtr; + } EElementType CAutofilter::getType () const { return et_x_Autofilter; diff --git a/OOXML/XlsxFormat/Table/Autofilter.h b/OOXML/XlsxFormat/Table/Autofilter.h index 4a4ab8d6ab..ce6d0fd127 100644 --- a/OOXML/XlsxFormat/Table/Autofilter.h +++ b/OOXML/XlsxFormat/Table/Autofilter.h @@ -71,6 +71,7 @@ namespace OOX void toXMLWithNS(NSStringUtils::CStringBuilder& writer, const std::wstring &node_ns, const std::wstring &node_name, const std::wstring &child_ns) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; @@ -101,6 +102,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -131,6 +133,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -159,6 +162,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -188,6 +192,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -216,6 +221,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -242,7 +248,8 @@ namespace OOX void toXMLWithNS(NSStringUtils::CStringBuilder& writer, const std::wstring &node_ns, const std::wstring &node_name, const std::wstring &child_ns) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); - void fromBin(XLS::BaseObjectPtr& obj);; + void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -270,6 +277,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -303,6 +311,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -330,6 +339,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -360,6 +370,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -393,6 +404,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; diff --git a/OOXML/XlsxFormat/Table/Connections.cpp b/OOXML/XlsxFormat/Table/Connections.cpp index bcf807f5d2..f1211d7066 100644 --- a/OOXML/XlsxFormat/Table/Connections.cpp +++ b/OOXML/XlsxFormat/Table/Connections.cpp @@ -55,6 +55,8 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../Common/SimpleTypes_Spreadsheet.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -85,6 +87,15 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CTextField::toBin() + { + auto ptr(new XLSB::BeginECTwFldInfo); + if(m_oPosition.IsInit()) + ptr->data.fieldStart = m_oPosition.get(); + if(m_oType.IsInit()) + ptr->data.fieldType = m_oType->GetValue(); + return XLS::BaseObjectPtr{ptr}; + } EElementType CTextField::getType() const { return et_x_textField; @@ -158,6 +169,14 @@ namespace OOX m_arrItems.push_back(new CTextField(textField)); } } + XLS::BaseObjectPtr CTextFields::toBin() + { + auto ptr(new XLSB::ECTWFLDINFOLST); + for(auto i:m_arrItems) + ptr->m_arBrtBeginECTwFldInfo.push_back(i->toBin()); + + return XLS::BaseObjectPtr{ptr}; + } EElementType CTextFields::getType() const { return et_x_textFields; @@ -295,6 +314,13 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CRangePr::toBin() + { + auto ptr(new XLSB::RangePr15); + if(m_oSourceName.IsInit()) + ptr->irstSourceName = m_oSourceName.get(); + return XLS::BaseObjectPtr{ptr}; + } EElementType CRangePr::getType() const { return et_x_rangePr; @@ -348,6 +374,20 @@ namespace OOX ReadAttributes(ptr->m_BrtBeginECDbProps); } } + XLS::BaseObjectPtr CDbPr::toBin() + { + auto ptr1(new XLSB::ECDBPROPS); + auto ptr(new XLSB::BeginECDbProps); + if(m_oConnection.IsInit()) + ptr->stConn = m_oConnection.get(); + if(m_oCommand.IsInit()) + ptr->stCmd = m_oCommand.get(); + if(m_oServerCommand.IsInit()) + ptr->stCmdSvr = m_oServerCommand.get(); + if(m_oCommandType.IsInit()) + ptr->icmdtype = m_oCommandType.get(); + return XLS::BaseObjectPtr{ptr1}; + } EElementType CDbPr::getType() const { return et_x_dbPr; @@ -416,6 +456,52 @@ namespace OOX ReadAttributes(ptr->m_BrtBeginECOlapProps); } } + XLS::BaseObjectPtr COlapPr::toBin() + { + auto ptr1(new XLSB::ECOLAPPROPS); + auto ptr(new XLSB::BeginECOlapProps); + ptr1->m_BrtBeginECOlapProps = XLS::BaseObjectPtr{ptr}; + + if(m_oLocalConnection.IsInit()) + ptr->stConnLocal = m_oLocalConnection.get(); + else + { + ptr->bLoadConnLocal = false; + ptr->stConnLocal = L""; + } + if(m_oRowDrillCount.IsInit()) + ptr->nDrillthroughRows = m_oRowDrillCount.get(); + else + ptr->nDrillthroughRows = 0; + if(m_oLocal.IsInit()) + ptr->fLocalConn = m_oLocal.get(); + else + { + ptr->fLocalConn = false; + ptr->bLoadConnLocal = false; + } + if(m_oLocalRefresh.IsInit()) + ptr->fNoRefreshCube = m_oLocalRefresh.get(); + else + ptr->fNoRefreshCube = false; + if(m_oSendLocale.IsInit()) + ptr->fUseOfficeLcid = m_oSendLocale.get(); + else + ptr->fUseOfficeLcid = false; + if(m_oServerNumberFormat.IsInit()) + ptr->fSrvFmtNum = m_oServerNumberFormat.get(); + else + ptr->fSrvFmtNum = false; + if(m_oServerFont.IsInit()) + ptr->fSrvFmtFlags = m_oServerFont.get(); + else + ptr->fSrvFmtFlags = false; + if(m_oServerFontColor.IsInit()) + ptr->fSrvFmtFore = m_oServerFontColor.get(); + else + ptr->fSrvFmtFore = false; + return XLS::BaseObjectPtr{ptr1}; + } EElementType COlapPr::getType() const { return et_x_olapPr; @@ -510,6 +596,38 @@ namespace OOX ReadAttributes(ptr->m_BrtBeginECWebProps); } } + XLS::BaseObjectPtr CWebPr::toBin() + { + auto ptr1(new XLSB::ECWEBPROPS); + auto ptr(new XLSB::BeginECWebProps); + ptr1->m_BrtBeginECWebProps = XLS::BaseObjectPtr{ptr}; + + if(m_oUrl.IsInit()) + ptr->stURL = m_oUrl.get(); + if(m_oPost.IsInit()) + ptr->stWebPost = m_oPost.get(); + if(m_oEditPage.IsInit()) + ptr->stEditWebPage = m_oEditPage.get(); + if(m_oXml.IsInit()) + ptr->fSrcIsXML = m_oXml.get(); + if(m_oSourceData.IsInit()) + ptr->fImportSourceData = m_oSourceData.get(); + if(m_oConsecutive.IsInit()) + ptr->fConsecDelim = m_oConsecutive.get(); + if(m_oFirstRow.IsInit()) + ptr->fSameSettings = m_oFirstRow.get(); + if(m_oXl97.IsInit()) + ptr->fXL97Format = m_oXl97.get(); + if(m_oTextDates.IsInit()) + ptr->fNoDateRecog = m_oTextDates.get(); + if(m_oXl2000.IsInit()) + ptr->fRefreshedInXL9 = m_oXl2000.get(); + if(m_oHtmlTables.IsInit()) + ptr->fTablesOnlyHTML = m_oHtmlTables.get(); + if(m_oHtmlFormat.IsInit()) + ptr->wHTMLFmt = m_oHtmlFormat->GetValue(); + return XLS::BaseObjectPtr{ptr1}; + } EElementType CWebPr::getType() const { return et_x_webPr; @@ -623,6 +741,47 @@ namespace OOX m_oTextFields = ptr->m_ECTWFLDINFOLST; } } + XLS::BaseObjectPtr CTextPr::toBin() + { + auto ptr1(new XLSB::ECTXTWIZ); + auto ptr(new XLSB::BeginECTxtWiz); + + if(m_oSourceFile.IsInit()) + ptr->stFile = m_oSourceFile.get(); + if(m_oFileType.IsInit()) + { + ptr->data.iCpid = m_oFileType->m_eValue; + ptr->data.iCpidNew = m_oFileType->m_eValue; + } + if(m_oDecimal.IsInit()) + ptr->data.chDecimal = std::stoi(m_oDecimal.get()); + if(m_oDelimiter.IsInit()) + ptr->data.chCustom = std::stoi(m_oDelimiter.get()); + if(m_oThousands.IsInit()) + ptr->data.chThousSep = std::stoi(m_oThousands.get()); + if(m_oFirstRow.IsInit()) + ptr->data.rowStartAt = m_oFirstRow.get(); + if(m_oQualifier.IsInit()) + ptr->data.fTextDelim = m_oQualifier->GetValue(); + if(m_oPrompt.IsInit()) + ptr->data.fPromptForFile = m_oPrompt.get(); + if(m_oDelimited.IsInit()) + ptr->data.fDelimited = m_oDelimited.get(); + if(m_oTab.IsInit()) + ptr->data.fTab = m_oTab.get(); + if(m_oSpace.IsInit()) + ptr->data.fSpace = m_oSpace.get(); + if(m_oComma.IsInit()) + ptr->data.fComma = m_oComma.get(); + if(m_oSemicolon.IsInit()) + ptr->data.fSemiColon = m_oSemicolon.get(); + if(m_oConsecutive.IsInit()) + ptr->data.fConsecutive = m_oConsecutive.get(); + + if(m_oTextFields.IsInit()) + ptr1->m_ECTWFLDINFOLST = m_oTextFields->toBin(); + return XLS::BaseObjectPtr{ptr1}; + } EElementType CTextPr::getType() const { return et_x_textPr; @@ -798,6 +957,104 @@ namespace OOX } } } + XLS::BaseObjectPtr CConnection::toBin() + { + XLS::BaseObjectPtr objectPtr; + if(m_oRangePr.IsInit()) + { + auto ptr(new XLSB::EXTCONN15); + objectPtr = XLS::BaseObjectPtr{ptr}; + auto ptr1(new XLSB::BeginExtConn15); + ptr1->fAutoDelete = false; + ptr1->fExcludeFromRefreshAll = false; + ptr1->fSandbox = false; + ptr1->fUsedByAddin = false; + if(m_oId.IsInit()) + ptr1->irstId = m_oId->GetValue(); + else + ptr1->irstId = false; + + ptr->m_BrtBeginExtConn15 = XLS::BaseObjectPtr{ptr1}; + ptr->m_source = m_oRangePr->toBin(); + } + else + { + auto ptr(new XLSB::EXTCONNECTION); + objectPtr = XLS::BaseObjectPtr{ptr}; + auto ptr1(new XLSB::BeginExtConnection); + ptr->m_BrtBeginExtConnection = XLS::BaseObjectPtr{ptr1}; + + if(m_oDbPr.IsInit()) + ptr->m_ECDBPROPS = m_oDbPr->toBin(); + if(m_oOlapPr.IsInit()) + ptr->m_ECOLAPPROPS = m_oOlapPr->toBin(); + if(m_oTextPr.IsInit()) + ptr->m_ECTXTWIZ = m_oTextPr->toBin(); + if(m_oWebPr.IsInit()) + ptr->m_ECWEBPROPS = m_oWebPr->toBin(); + if(m_oExtLst.IsInit()) + ptr->m_FRTEXTCONNECTIONS = m_oExtLst->toBinConnections(); + + if(m_oType.IsInit()) + ptr1->idbtype = m_oType.get(); + if(m_oName.IsInit()) + ptr1->stConnName = m_oName.get(); + else + ptr1->stConnName = L""; + if(m_oId.IsInit()) + ptr1->dwConnID = m_oId->GetValue(); + if(m_oCredentials.IsInit()) + ptr1->iCredMethod = m_oCredentials->GetValue(); + if(m_oBackground.IsInit()) + ptr1->fBackgroundQuery = m_oBackground.get(); + else + ptr1->fBackgroundQuery = false; + if(m_oDeleted.IsInit()) + ptr1->fDeleted = m_oDeleted.get(); + if(m_oDescription.IsInit()) + ptr1->stConnDesc = m_oDescription.get(); + else + ptr1->fLoadConnectionDesc = false; + if(m_oInterval.IsInit()) + ptr1->wInterval = m_oInterval.get(); + if(m_oKeepAlive.IsInit()) + ptr1->fMaintain = m_oKeepAlive.get(); + if(m_oMinRefreshableVersion.IsInit()) + ptr1->bVerRefreshableMin = m_oMinRefreshableVersion.get(); + if(m_oNew.IsInit()) + ptr1->fNewQuery = m_oNew.get(); + if(m_oOdcFile.IsInit()) + ptr1->stConnectionFile = m_oOdcFile.get(); + else + ptr1->fLoadSourceConnectionFile = false; + if(m_oOnlyUseConnectionFile.IsInit()) + ptr1->fAlwaysUseConnectionFile = m_oOnlyUseConnectionFile.get(); + else + ptr1->fAlwaysUseConnectionFile = false; + if(m_oReconnectionMethod.IsInit()) + ptr1->irecontype = m_oReconnectionMethod.get(); + if(m_oRefreshedVersion.IsInit()) + ptr1->bVerRefreshed = m_oRefreshedVersion.get(); + if(m_oRefreshOnLoad.IsInit()) + ptr1->fRefreshOnLoad = m_oRefreshOnLoad.get(); + if(m_oSaveData.IsInit()) + ptr1->fSaveData = m_oSaveData.get(); + if(m_oSavePassword.IsInit()) + { + ptr1->pc = m_oSavePassword.get(); + } + if(m_oSingleSignOnId.IsInit()) + ptr1->stSso = m_oSingleSignOnId.get(); + else + ptr1->fLoadSSOApplicationID = false; + if(m_oSourceFile.IsInit()) + ptr1->stDataFile = m_oSourceFile.get(); + else + ptr1->fLoadSourceDataFile = false; + } + + return objectPtr; + } EElementType CConnection::getType() const { return et_x_Connection; @@ -945,6 +1202,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(new CConnection(connection)); } } + XLS::BaseObjectPtr CConnections::toBin() + { + auto ptr(new XLSB::EXTCONNECTIONS); + for(auto i:m_arrItems) + ptr->m_arEXTCONNECTION.push_back(i->toBin()); + return XLS::BaseObjectPtr{ptr}; + } EElementType CConnections::getType() const { return et_x_Connections; @@ -974,6 +1238,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" CPath oRootPath; read(oRootPath, oPath); } + XLS::BaseObjectPtr CConnectionsFile::WriteBin() const + { + XLSB::ConnectionsStreamPtr connectionsStream(new XLSB::ConnectionsStream); + if(m_oConnections.IsInit()) + connectionsStream->m_EXTCONNECTIONS = m_oConnections->toBin(); + return XLS::BaseObjectPtr{connectionsStream}; + } void CConnectionsFile::readBin(const CPath& oPath) { CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); @@ -1016,19 +1287,31 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { if (false == m_oConnections.IsInit()) return; - NSStringUtils::CStringBuilder sXml; + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + { + NSStringUtils::CStringBuilder sXml; - sXml.WriteString(L""); - m_oConnections->toXML(sXml); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + sXml.WriteString(L""); + m_oConnections->toXML(sXml); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); IFileContainer::Write(oPath, oDirectory, oContent); } const OOX::FileType CConnectionsFile::type() const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::ConnectionsBin; + } return OOX::Spreadsheet::FileTypes::Connections; } const CPath CConnectionsFile::DefaultDirectory() const diff --git a/OOXML/XlsxFormat/Table/Connections.h b/OOXML/XlsxFormat/Table/Connections.h index 6fa2dc9f04..00107d26f2 100644 --- a/OOXML/XlsxFormat/Table/Connections.h +++ b/OOXML/XlsxFormat/Table/Connections.h @@ -73,6 +73,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -95,6 +96,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -161,6 +163,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; @@ -184,6 +187,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; @@ -212,6 +216,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -241,6 +246,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; @@ -277,6 +283,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; @@ -320,6 +327,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; @@ -372,6 +380,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; @@ -389,6 +398,7 @@ namespace OOX virtual void read(const CPath& oPath); void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; diff --git a/OOXML/XlsxFormat/Table/QueryTable.h b/OOXML/XlsxFormat/Table/QueryTable.h index 9967417ab1..23ce219654 100644 --- a/OOXML/XlsxFormat/Table/QueryTable.h +++ b/OOXML/XlsxFormat/Table/QueryTable.h @@ -61,6 +61,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_QueryTableField; @@ -99,6 +100,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_QueryTableFields; @@ -126,6 +128,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_QueryTableDeletedField; @@ -154,6 +157,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_QueryTableFields; @@ -181,6 +185,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_QueryTableRefresh; @@ -224,6 +229,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_QueryTable; @@ -280,6 +286,7 @@ namespace OOX { } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -288,10 +295,7 @@ namespace OOX } virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::QueryTable; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); diff --git a/OOXML/XlsxFormat/Table/Table.h b/OOXML/XlsxFormat/Table/Table.h index b5be81fa45..585eb7dcad 100644 --- a/OOXML/XlsxFormat/Table/Table.h +++ b/OOXML/XlsxFormat/Table/Table.h @@ -74,6 +74,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { @@ -111,6 +112,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_TableStyleInfo; @@ -149,6 +151,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_TableColumn; @@ -201,6 +204,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { @@ -238,6 +242,7 @@ namespace OOX virtual void toXML2(NSStringUtils::CStringBuilder& writer, int nIndex); virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_Table; @@ -300,6 +305,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_TablePart; @@ -334,6 +340,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { @@ -366,6 +373,7 @@ namespace OOX { } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -374,10 +382,7 @@ namespace OOX } virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::Table; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index 79b4b0764f..aaa15cc6ff 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -42,24 +42,30 @@ #include "../../XlsbFormat/Biff12_unions/LISTCOLS.h" #include "../../XlsbFormat/Biff12_unions/LISTCOL.h" #include "../../XlsbFormat/Biff12_records/BeginListCol.h" +#include "../../XlsbFormat/Biff12_records/BeginListCols.h" #include "../../XlsbFormat/Biff12_records/ListCCFmla.h" #include "../../XlsbFormat/Biff12_records/ListTrFmla.h" #include "../../XlsbFormat/Biff12_records/List14.h" +#include "../../XlsbFormat/Biff12_records/BeginDeletedName.h" +#include "../../XlsbFormat/Biff12_records/BeginDeletedNames.h" #include "../../XlsbFormat/QueryTableStream.h" #include "../../XlsbFormat/Biff12_unions/QSI.h" #include "../../XlsbFormat/Biff12_records/CommonRecords.h" #include "../../XlsbFormat/Biff12_unions/QSIR.h" #include "../../XlsbFormat/Biff12_unions/QSIFS.h" +#include "../../XlsbFormat/Biff12_records/BeginQSIFs.h" #include "../../XlsbFormat/Biff12_unions/QSIF.h" #include "../../XlsbFormat/Biff12_unions/DELETEDNAMES.h" #include "../../XlsbFormat/Biff12_unions/DELETEDNAME.h" -#include "../../XlsbFormat/Biff12_records/BeginDeletedName.h" +#include "../../XlsbFormat/Biff12_unions/FRTTABLE.h" #include "../../Common/SimpleTypes_Shared.h" #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../DocxFormat/Drawing/DrawingExt.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -82,6 +88,16 @@ namespace Spreadsheet { ReadAttributes(obj); } + XLS::BaseObjectPtr CAltTextTable::toBin() + { + auto ptr(new XLSB::List14); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oAltText.IsInit()) + ptr->stAltText = m_oAltText.get(); + if(m_oAltTextSummary.IsInit()) + ptr->stAltTextSummary = m_oAltTextSummary.get(); + return objectPtr; + } void CAltTextTable::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -133,6 +149,22 @@ namespace Spreadsheet { ReadAttributes(obj); } + XLS::BaseObjectPtr CTableStyleInfo::toBin() + { + auto ptr(new XLSB::TableStyleClient); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oName.IsInit()) + ptr->stStyleName = m_oName.get(); + if(m_oShowColumnStripes.IsInit()) + ptr->fColumnStripes = m_oShowColumnStripes->GetValue(); + if(m_oShowFirstColumn.IsInit()) + ptr->fFirstColumn = m_oShowFirstColumn->GetValue(); + if(m_oShowLastColumn.IsInit()) + ptr->fLastColumn = m_oShowLastColumn->GetValue(); + if(m_oShowRowStripes.IsInit()) + ptr->fRowStripes = m_oShowRowStripes->GetValue(); + return objectPtr; + } void CTableStyleInfo::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -169,11 +201,11 @@ namespace Spreadsheet //есть такой баг: при сохранениии "sum" и названия таблицы "Table1" (русский excel), выдается ошибка в формулах WritingStringNullableAttrString(L"totalsRowFunction", m_oTotalsRowFunction, m_oTotalsRowFunction->ToString()); WritingStringNullableAttrInt(L"queryTableFieldId", m_oQueryTableFieldId, m_oQueryTableFieldId->GetValue()); - WritingStringNullableAttrString(L"dataCellStyle", m_oDataCellStyle, *m_oDataCellStyle); + WritingStringNullableAttrString(L"dataCellStyle", m_oDataCellStyle, *m_oDataCellStyle); WritingStringNullableAttrInt(L"dataDxfId", m_oDataDxfId, m_oDataDxfId->GetValue()); - WritingStringNullableAttrString(L"headerRowCellStyle", m_oHeaderRowCellStyle, *m_oHeaderRowCellStyle); + WritingStringNullableAttrString(L"headerRowCellStyle", m_oHeaderRowCellStyle, *m_oHeaderRowCellStyle); WritingStringNullableAttrInt(L"headerRowDxfId", m_oHeaderRowDxfId, m_oHeaderRowDxfId->GetValue()); - WritingStringNullableAttrString(L"totalsRowCellStyle", m_oTotalsRowCellStyle, *m_oTotalsRowCellStyle); + WritingStringNullableAttrString(L"totalsRowCellStyle", m_oTotalsRowCellStyle, *m_oTotalsRowCellStyle); WritingStringNullableAttrInt(L"totalsRowDxfId", m_oTotalsRowDxfId, m_oTotalsRowDxfId->GetValue()); if(m_oTotalsRowFormula.IsInit() || m_oCalculatedColumnFormula.IsInit()) { @@ -238,6 +270,102 @@ namespace Spreadsheet m_oTotalsRowFormula = ptrListTrFmla->formula.getAssembledFormula(); } } + } + XLS::BaseObjectPtr CTableColumn::toBin() + { + auto ptr(new XLSB::LISTCOL); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oDataCellStyle.IsInit() || m_oTotalsRowDxfId.IsInit() || m_oHeaderRowCellStyle.IsInit() || m_oHeaderRowDxfId.IsInit() + || m_oTotalsRowCellStyle.IsInit()|| m_oDataDxfId.IsInit() || m_oId.IsInit() || m_oName.IsInit() || m_oQueryTableFieldId.IsInit() + || m_oTotalsRowLabel.IsInit() || m_oUniqueName.IsInit() || m_oTotalsRowFunction.IsInit() ) + { + auto ptr1(new XLSB::BeginListCol); + ptr->m_BrtBeginListCol = XLS::BaseObjectPtr{ptr1}; + if(m_oDataCellStyle.IsInit()) + ptr1->stStyleInsertRow = m_oDataCellStyle.get(); + else + ptr1->stStyleInsertRow = 0xFFFFFFFF; + if(m_oTotalsRowDxfId.IsInit()) + ptr1->nDxfInsertRow = m_oTotalsRowDxfId->GetValue(); + else + ptr1->nDxfInsertRow = 0xFFFFFFFF; + + if(m_oHeaderRowDxfId.IsInit()) + ptr1->stStyleHeader = m_oHeaderRowCellStyle.get(); + else + ptr1->stStyleHeader = 0xFFFFFFFF; + if(m_oHeaderRowDxfId.IsInit()) + ptr1->nDxfHdr = m_oHeaderRowDxfId->GetValue(); + else + ptr1->nDxfHdr = 0xFFFFFFFF; + if(m_oTotalsRowCellStyle.IsInit()) + ptr1->stStyleAgg = m_oTotalsRowCellStyle.get(); + else + ptr1->stStyleAgg = 0xFFFFFFFF; + + if(m_oDataDxfId.IsInit()) + ptr1->nDxfAgg = m_oDataDxfId->GetValue(); + else + ptr1->nDxfAgg = 0xFFFFFFFF; + if(m_oId.IsInit()) + ptr1->idField = m_oId->GetValue(); + else + ptr1->idField = 0; + + if(m_oName.IsInit()) + ptr1->stCaption = m_oName.get(); + else + ptr1->stCaption = 0xFFFFFFFF; + if(m_oQueryTableFieldId.IsInit()) + ptr1->idqsif = m_oQueryTableFieldId->GetValue(); + else + ptr1->idqsif = 0; + + if(m_oTotalsRowLabel.IsInit()) + ptr1->stTotal = m_oTotalsRowLabel.get(); + else + ptr1->stTotal = 0xFFFFFFFF; + + if(m_oUniqueName.IsInit()) + ptr1->stName = m_oUniqueName.get(); + else + ptr1->stName = 0xFFFFFFFF; + if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionNone) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_NONE; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionAverage) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_AVERAGE; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCount) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_COUNT; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCountNums) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_COUNTNUMS; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionMax) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_MAX; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionMin) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_MIN; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionSum) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_SUM; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionStdDev) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_STDDEV; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionVar) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_VAR; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCustom) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_CUSTOM; + else + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_NONE; + } + if(m_oCalculatedColumnFormula.IsInit()) + { + auto fmla(new XLSB::ListCCFmla); + fmla->formula = m_oCalculatedColumnFormula.get(); + ptr->m_BrtListCCFmla = XLS::BaseObjectPtr{fmla}; + } + if(m_oTotalsRowFormula.IsInit()) + { + auto fmla(new XLSB::ListTrFmla); + fmla->formula = m_oTotalsRowFormula.get(); + ptr->m_BrtListTrFmla = XLS::BaseObjectPtr{fmla}; + } + return objectPtr; } void CTableColumn::ReadAttributes(XLS::BaseObjectPtr& obj) { @@ -326,7 +454,7 @@ namespace Spreadsheet writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -334,7 +462,7 @@ namespace Spreadsheet m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CTableColumns::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -368,6 +496,17 @@ namespace Spreadsheet m_arrItems.push_back(new CTableColumn(listcol)); } } + XLS::BaseObjectPtr CTableColumns::toBin() + { + auto ptr(new XLSB::LISTCOLS); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginListCols); + ptr1->nCols = m_arrItems.size(); + ptr->m_BrtBeginListCols = XLS::BaseObjectPtr{ptr1}; + for(auto i:m_arrItems) + ptr->m_arLISTCOL.push_back(i->toBin()); + return objectPtr; + } void CTableColumns::ReadAttributes(std::vector& obj) { if(!obj.empty()) @@ -405,17 +544,17 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") WritingStringNullableAttrString(L"totalsRowCellStyle", m_oTotalsRowCellStyle, *m_oTotalsRowCellStyle); WritingStringNullableAttrInt(L"totalsRowDxfId", m_oTotalsRowDxfId, m_oTotalsRowDxfId->GetValue()); WritingStringNullableAttrInt(L"totalsRowBorderDxfId", m_oTotalsRowBorderDxfId, m_oTotalsRowBorderDxfId->GetValue()); - + //if (m_oHeaderRowCount.IsInit() && 0 == m_oHeaderRowCount->GetValue()) // WritingStringAttrString(L"headerRowCount", L"1"); //if (m_oTotalsRowCount.IsInit() && m_oTotalsRowCount->GetValue() > 0) // WritingStringAttrString(L"totalsRowCount", L"1"); // else - // WritingStringAttrString(L"totalsRowShown", L"0");//m_oTotalsRowShown + // WritingStringAttrString(L"totalsRowShown", L"0");//m_oTotalsRowShown WritingStringNullableAttrInt(L"headerRowCount", m_oHeaderRowCount, m_oHeaderRowCount->GetValue()); WritingStringNullableAttrInt(L"totalsRowCount", m_oTotalsRowCount, m_oTotalsRowCount->GetValue()); WritingStringNullableAttrBool2(L"totalsRowShown", m_oTotalsRowShown); - + WritingStringNullableAttrBool2(L"insertRow", m_oInsertRow); WritingStringNullableAttrBool2(L"insertRowShift", m_oInsertRowShift); WritingStringNullableAttrBool2(L"published", m_oPublished); @@ -439,7 +578,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") void CTable::toXML2(NSStringUtils::CStringBuilder& writer, int nIndex) { if(false == m_oRef.IsInit() || false == m_oDisplayName.IsInit()) return; - + if(!m_oId.IsInit()) { m_oId.Init(); @@ -471,6 +610,23 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") else if ((L"extLst") == sName) m_oExtLst = oReader; } + if(!m_oName.IsInit() && m_oDisplayName.IsInit()) + m_oName = m_oDisplayName.get(); + + if(m_oTableColumns.IsInit() && !m_oTableColumns->m_arrItems.empty()) + { + XLS::GlobalWorkbookInfo::mapTableColumnNames_static.emplace(m_oId->GetValue(), + std::vector(m_oTableColumns->m_arrItems.size()+1, L"")); + for(auto i:m_oTableColumns->m_arrItems) + if(i->m_oName.IsInit() && i->m_oId.IsInit()) + { + if(i->m_oId->GetValue()+1 > XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).size()) + XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).resize(i->m_oId->GetValue()+1); + i->m_oName = boost::algorithm::erase_all_copy(i->m_oName.get(), L"_x000a_"); + XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).at(i->m_oId->GetValue()) = i->m_oName.get(); + } + } + XLS::GlobalWorkbookInfo::mapTableNames_static.emplace(m_oId->GetValue(), m_oName.get()); } void CTable::fromBin(XLS::BaseObjectPtr& obj) { @@ -496,6 +652,137 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") m_oExtLst = ptr->m_FRTTABLE; } } + XLS::BaseObjectPtr CTable::toBin() + { + auto ptr(new XLSB::TABLE); + auto ptr1(new XLSB::BeginList); + ptr->m_BrtBeginList = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oRef.IsInit()) + { + ptr1->rfxList = m_oRef->GetValue(); + } + if(m_oName.IsInit()) + ptr1->stName = m_oName.get(); + else if(m_oDisplayName.IsInit()) + ptr1->stName = m_oDisplayName.get(); + else + ptr1->stName = 0xFFFFFFFF; + if(m_oTotalsRowCount.IsInit()) + ptr1->crwTotals = m_oTotalsRowCount->GetValue(); + else + ptr1->crwTotals = false; + + if(m_oHeaderRowCount.IsInit()) + ptr1->crwHeader = m_oHeaderRowCount->GetValue(); + else + ptr1->crwHeader = true; + + if(m_oDisplayName.IsInit()) + ptr1->stDisplayName = m_oDisplayName.get(); + else + ptr1->stDisplayName = 0xFFFFFFFF; + + if(m_oTableBorderDxfId.IsInit()) + ptr1->nDxfBorder = m_oTableBorderDxfId->GetValue(); + else + ptr1->nDxfBorder = 0xFFFFFFFF; + + if(m_oComment.IsInit()) + ptr1->stComment = m_oComment.get(); + else + ptr1->stComment = 0xFFFFFFFF; + + if(m_oConnectionId.IsInit()) + ptr1->dwConnID = m_oConnectionId->GetValue(); + else + ptr1->dwConnID = 0; + + if(m_oDataDxfId.IsInit()) + ptr1->nDxfData = m_oDataDxfId->GetValue(); + else + ptr1->nDxfData = 0xFFFFFFFF; + + if(m_oDataCellStyle.IsInit()) + ptr1->stStyleData = m_oDataCellStyle.get(); + else + ptr1->stStyleData = 0xFFFFFFFF; + + if(m_oHeaderRowBorderDxfId.IsInit()) + ptr1->nDxfHeaderBorder = m_oHeaderRowBorderDxfId->GetValue(); + else + ptr1->nDxfHeaderBorder = 0xFFFFFFFF; + + if(m_oHeaderRowCellStyle.IsInit()) + ptr1->stStyleHeader = m_oHeaderRowCellStyle.get(); + else + ptr1->stStyleHeader = 0xFFFFFFFF; + + if(m_oHeaderRowDxfId.IsInit()) + ptr1->nDxfHeader = m_oHeaderRowDxfId->GetValue(); + else + ptr1->nDxfHeader = 0xFFFFFFFF; + if(m_oInsertRow.IsInit()) + ptr1->fForceInsertToBeVisible = m_oInsertRow.get(); + else + ptr1->fForceInsertToBeVisible = false; + if(m_oInsertRowShift.IsInit()) + ptr1->fInsertRowInsCells = m_oInsertRowShift.get(); + else + ptr1->fInsertRowInsCells = false; + if(m_oPublished.IsInit()) + ptr1->fPublished = m_oPublished.get(); + else + ptr1->fPublished = false; + if(m_oId.IsInit()) + ptr1->idList = m_oId->GetValue(); + + if(m_oTableType.IsInit()) + { + if(m_oTableType == SimpleTypes::Spreadsheet::ETableType::typeWorksheet) + ptr1->lt = XLSB::ListType::LTRANGE; + if(m_oTableType == SimpleTypes::Spreadsheet::ETableType::typeXml) + ptr1->lt = XLSB::ListType::LTXML; + if(m_oTableType == SimpleTypes::Spreadsheet::ETableType::typeQueryTable) + ptr1->lt = XLSB::ListType::LTEXTDATA; + } + else + { + ptr1->lt = XLSB::ListType::LTRANGE; + } + + if(m_oTotalsRowBorderDxfId.IsInit()) + ptr1->nDxfAggBorder = m_oTotalsRowBorderDxfId->GetValue(); + else + ptr1->nDxfAggBorder = 0xFFFFFFFF; + if(m_oTotalsRowCellStyle.IsInit()) + ptr1->stStyleAgg = m_oTotalsRowCellStyle.get(); + else + ptr1->stStyleAgg = 0xFFFFFFFF; + + if(m_oTotalsRowDxfId.IsInit()) + ptr1->nDxfAgg = m_oTotalsRowDxfId->GetValue(); + else + ptr1->nDxfAgg = 0xFFFFFFFF; + + if(m_oTotalsRowShown.IsInit()) + ptr1->fShownTotalRow = m_oTotalsRowShown.get(); + else + ptr1->fShownTotalRow = false; + ptr1->fSingleCell = false; + if(m_oAutoFilter.IsInit()) + ptr->m_AUTOFILTER = m_oAutoFilter->toBin(); + if(m_oSortState.IsInit()) + ptr->m_SORTSTATE = m_oSortState->toBin(); + if(m_oTableColumns.IsInit()) + ptr->m_LISTCOLS = m_oTableColumns->toBin(); + if(m_oTableStyleInfo.IsInit()) + ptr->m_BrtTableStyleClient = m_oTableStyleInfo->toBin(); + if(m_oExtLst.IsInit()) + ptr->m_FRTTABLE = m_oExtLst->toBinTable(); + return objectPtr; + } void CTable::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -508,7 +795,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") WritingElement_ReadAttributes_Read_else_if ( oReader, L"comment", m_oComment ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"connectionId", m_oConnectionId ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"dataDxfId", m_oDataDxfId ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"dataCellStyle", m_oDataCellStyle ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"dataCellStyle", m_oDataCellStyle ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"headerRowBorderDxfId", m_oHeaderRowBorderDxfId ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"headerRowCellStyle", m_oHeaderRowCellStyle ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"headerRowDxfId", m_oHeaderRowDxfId ) @@ -624,6 +911,14 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") { ReadAttributes(obj); } + XLS::BaseObjectPtr CTablePart::toBin() + { + auto ptr(new XLSB::ListPart); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oRId.IsInit()) + ptr->stRelID.value = m_oRId->GetValue(); + return objectPtr; + } void CTablePart::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start_No_NS( oReader ) @@ -644,7 +939,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -652,8 +947,8 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") m_arrItems[i]->toXML(writer); } } - - writer.WriteString(L""); + + writer.WriteString(L""); } void CTableParts::fromXML(XmlUtils::CXmlLiteReader& oReader) { @@ -689,6 +984,23 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") } } } + XLS::BaseObjectPtr CTableParts::toBin() + { + auto ptr(new XLSB::LISTPARTS); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oCount.IsInit()) + { + auto beginlistParts(new XLSB::BeginListParts); + ptr->m_BrtBeginListParts = XLS::BaseObjectPtr{beginlistParts}; + beginlistParts->cParts = m_oCount->m_eValue; + } + for(auto i:m_arrItems) + { + ptr->m_arBrtListPart.push_back(i->toBin()); + } + return objectPtr; + } void CTableParts::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -721,6 +1033,15 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") } } + XLS::BaseObjectPtr CTableFile::WriteBin() const + { + XLSB::TableStreamPtr tableStream(new XLSB::TableStream); + XLS::BaseObjectPtr objectPtr(tableStream); + + tableStream->m_TABLE = m_oTable->toBin(); + + return objectPtr; + } void CTableFile::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -746,18 +1067,35 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") { if(false == m_oTable.IsInit()) return; - NSStringUtils::CStringBuilder sXml; - int nGlobalNumber = OOX::FileGlobalEnumerated::GetGlobalNumber(); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { + NSStringUtils::CStringBuilder sXml; + int nGlobalNumber = OOX::FileGlobalEnumerated::GetGlobalNumber(); - sXml.WriteString(L""); - m_oTable->toXML2(sXml, nGlobalNumber); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + sXml.WriteString(L""); + m_oTable->toXML2(sXml, nGlobalNumber); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); IFileContainer::Write( oPath, oDirectory, oContent ); } + const OOX::FileType CTableFile::type() const + { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::TableBin; + } + return OOX::Spreadsheet::FileTypes::Table; + } //--------------------------------------------------------------------------------------------------------------------- @@ -790,6 +1128,29 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") m_oExtLst = oReader; } } + XLS::BaseObjectPtr CQueryTableField::toBin() + { + auto ptr1(new XLSB::QSIF); + auto ptr(new XLSB::BeginQSIF); + ptr1->m_BrtBeginQSIF = XLS::BaseObjectPtr{ptr}; + + if(m_oId.IsInit()) + ptr->idField = m_oId->GetValue(); + if(m_oTableColumnId.IsInit()) + ptr->idList = m_oTableColumnId->GetValue(); + if(m_oName.IsInit()) + ptr->name = m_oName.get(); + if(m_oRowNumbers.IsInit()) + ptr->fRowNums = m_oRowNumbers.get(); + if(m_oFillFormulas.IsInit()) + ptr->fFillDown = m_oFillFormulas.get(); + if(m_oDataBound.IsInit()) + ptr->fUserIns = m_oDataBound.get(); + if(m_oClipped.IsInit()) + ptr->fClipped = m_oClipped.get(); + + return XLS::BaseObjectPtr{ptr1}; + } void CQueryTableField::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -837,7 +1198,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -845,7 +1206,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CQueryTableFields::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -868,6 +1229,16 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") } } } + XLS::BaseObjectPtr CQueryTableFields::toBin() + { + auto ptr(new XLSB::QSIFS); + auto ptr1(new XLSB::BeginQSIFs); + ptr->m_BrtBeginQSIFs = XLS::BaseObjectPtr{ptr1}; + for(auto i:m_arrItems) + ptr->m_arQSIF.push_back(i->toBin()); + ptr1->nCols = m_arrItems.size(); + return XLS::BaseObjectPtr{ptr}; + } void CQueryTableFields::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -899,6 +1270,16 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CQueryTableDeletedField::toBin() + { + auto ptr1(new XLSB::DELETEDNAME); + auto ptr(new XLSB::BeginDeletedName); + ptr1->m_BrtBeginDeletedName = XLS::BaseObjectPtr{ptr}; + if(m_oName.IsInit()) + ptr->rgb = m_oName.get(); + + return XLS::BaseObjectPtr{ptr1}; + } void CQueryTableDeletedField::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -931,7 +1312,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -961,6 +1342,18 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") } } } + XLS::BaseObjectPtr CQueryTableDeletedFields::toBin() + { + auto ptr(new XLSB::DELETEDNAMES); + auto ptr1(new XLSB::BeginDeletedNames); + ptr->m_BrtBeginDeletedNames = XLS::BaseObjectPtr{ptr1}; + + for(auto i:m_arrItems) + ptr->m_arDELETEDNAME.push_back(i->toBin()); + + ptr1->nCols = ptr->m_arDELETEDNAME.size(); + return XLS::BaseObjectPtr{ptr}; + } void CQueryTableDeletedFields::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1026,6 +1419,36 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") m_oExtLst = oReader; } } + XLS::BaseObjectPtr CQueryTableRefresh::toBin() + { + auto ptr1(new XLSB::QSIR); + auto ptr(new XLSB::BeginQSIR); + ptr1->m_BrtBeginQSIR = XLS::BaseObjectPtr{ptr}; + + if(m_oNextId.IsInit()) + ptr->idFieldNext = m_oNextId->GetValue(); + if(m_oMinimumVersion.IsInit()) + ptr->wVerBeforeRefreshAlert = m_oMinimumVersion->GetValue(); + if(m_FieldIdWrapped.IsInit()) + ptr->fidWrapped = m_FieldIdWrapped.get(); + if(m_HeadersInLastRefresh.IsInit()) + ptr->fTitlesOld = m_HeadersInLastRefresh.get(); + if(m_PreserveSortFilterLayout.IsInit()) + ptr->fPersist = m_PreserveSortFilterLayout.get(); + if(m_UnboundColumnsLeft.IsInit()) + ptr->ccolExtraLeft = m_UnboundColumnsLeft->GetValue(); + if(m_UnboundColumnsRight.IsInit()) + ptr->ccolExtraRight = m_UnboundColumnsRight->GetValue(); + + if(m_oQueryTableFields.IsInit()) + ptr1->m_QSIFS = m_oQueryTableFields->toBin(); + if(m_oQueryTableDeletedFields.IsInit()) + ptr1->m_DELETEDNAMES = m_oQueryTableDeletedFields->toBin(); + if(m_oSortState.IsInit()) + ptr1->m_SORTSTATE = m_oSortState->toBin(); + + return XLS::BaseObjectPtr{ptr1}; + } void CQueryTableRefresh::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1071,7 +1494,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") WritingElement_ReadAttributes_Read_else_if ( oReader, (L"unboundColumnsRight"), m_UnboundColumnsRight ) WritingElement_ReadAttributes_End( oReader ) } - + void CQueryTable::toXML(NSStringUtils::CStringBuilder& writer) const { if(false == m_oName.IsInit()) return; @@ -1107,7 +1530,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrBool2(L"refreshOnLoad", m_oRefreshOnLoad); WritingStringNullableAttrBool2(L"removeDataOnSave", m_oRemoveDataOnSave); WritingStringNullableAttrBool2(L"rowNumbers", m_oRowNumbers); - + writer.WriteString(L">"); if(m_oQueryTableRefresh.IsInit()) @@ -1136,6 +1559,69 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oExtLst = oReader; } } + XLS::BaseObjectPtr CQueryTable::toBin() + { + auto ptr1(new XLSB::QSI); + auto ptr(new XLSB::BeginQSI); + ptr1->m_BrtBeginQSI = XLS::BaseObjectPtr{ptr}; + + if(m_oAdjustColumnWidth.IsInit()) + ptr->fAutoFit = m_oAdjustColumnWidth.get(); + if(m_oApplyAlignmentFormats.IsInit()) + ptr->fibitAtrAlc = m_oApplyAlignmentFormats.get(); + if(m_oApplyBorderFormats.IsInit()) + ptr->fibitAtrBdr = m_oApplyBorderFormats.get(); + if(m_oApplyFontFormats.IsInit()) + ptr->fibitAtrFnt = m_oApplyFontFormats.get(); + if(m_oApplyNumberFormats.IsInit()) + ptr->fibitAtrNum = m_oApplyNumberFormats.get(); + if(m_oApplyPatternFormats.IsInit()) + ptr->fibitAtrPat = m_oApplyPatternFormats.get(); + if(m_oApplyWidthHeightFormats.IsInit()) + ptr->fibitAtrProt = m_oApplyWidthHeightFormats.get(); + if(m_oBackgroundRefresh.IsInit()) + ptr->fAsync = m_oBackgroundRefresh.get(); + + if(m_oAutoFormatId.IsInit()) + ptr->itblAutoFmt = m_oAutoFormatId->GetValue(); + if(m_oConnectionId.IsInit()) + ptr->dwConnID = m_oConnectionId->GetValue(); + if(m_oDisableEdit.IsInit()) + ptr->fDisableEdit = m_oDisableEdit.get(); + if(m_oDisableRefresh.IsInit()) + ptr->fDisableRefresh = m_oDisableRefresh.get(); + if(m_oFillFormulas.IsInit()) + ptr->fFill = m_oFillFormulas.get(); + if(m_oFirstBackgroundRefresh.IsInit()) + ptr->fNewAsync = m_oFirstBackgroundRefresh.get(); + ptr->fOverwrite = false; + ptr->fShrink = false; + + if(m_oGrowShrinkType == L"overwriteClear" ) + ptr->fOverwrite = true; + else if(m_oGrowShrinkType == L"insertDelete") + ptr->fShrink = true; + if(m_oHeaders.IsInit()) + ptr->fTitles = m_oHeaders.get(); + if(m_oIntermediate.IsInit()) + ptr->fDummyList = m_oIntermediate.get(); + + if(!ptr->name.empty()) + m_oName = ptr->name; + if(m_oPreserveFormatting.IsInit()) + ptr->fPreserveFmt = m_oPreserveFormatting.get(); + if(m_oRefreshOnLoad.IsInit()) + ptr->fAutoRefresh = m_oRefreshOnLoad.get(); + if(m_oRemoveDataOnSave.IsInit()) + ptr->fSaveData = !m_oRemoveDataOnSave.get(); + if(m_oRowNumbers.IsInit()) + ptr->fRowNums = m_oRowNumbers.get(); + + if(m_oQueryTableRefresh.IsInit()) + ptr1->m_QSIR = m_oQueryTableRefresh->toBin(); + + return XLS::BaseObjectPtr{ptr1}; + } void CQueryTable::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1203,10 +1689,10 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingElement_ReadAttributes_Read_else_if ( oReader, L"applyFontFormats", m_oApplyFontFormats ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"applyNumberFormats", m_oApplyNumberFormats ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"applyPatternFormats", m_oApplyPatternFormats ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"applyWidthHeightFormats", m_oApplyWidthHeightFormats ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"applyWidthHeightFormats", m_oApplyWidthHeightFormats ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"autoFormatId", m_oAutoFormatId ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"backgroundRefresh", m_oBackgroundRefresh ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"connectionId", m_oConnectionId ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"connectionId", m_oConnectionId ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"disableEdit", m_oDisableEdit ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"disableRefresh", m_oDisableRefresh ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"fillFormulas", m_oFillFormulas ) @@ -1241,6 +1727,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } + XLS::BaseObjectPtr CQueryTableFile::WriteBin() const + { + XLSB::QueryTableStreamPtr querytableStream(new XLSB::QueryTableStream); + if(m_oQueryTable.IsInit()) + querytableStream->m_QSI = m_oQueryTable->toBin(); + return XLS::BaseObjectPtr{querytableStream}; + } void CQueryTableFile::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -1266,17 +1759,33 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { if(false == m_oQueryTable.IsInit()) return; - NSStringUtils::CStringBuilder sXml; + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + { + NSStringUtils::CStringBuilder sXml; - sXml.WriteString(L""); - m_oQueryTable->toXML(sXml); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + sXml.WriteString(L""); + m_oQueryTable->toXML(sXml); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); IFileContainer::Write( oPath, oDirectory, oContent ); } + const OOX::FileType CQueryTableFile::type() const + { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::QueryTableBin; + } + return OOX::Spreadsheet::FileTypes::QueryTable; + } } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Workbook/BookViews.cpp b/OOXML/XlsxFormat/Workbook/BookViews.cpp index b960837f4d..cc2cc8a740 100644 --- a/OOXML/XlsxFormat/Workbook/BookViews.cpp +++ b/OOXML/XlsxFormat/Workbook/BookViews.cpp @@ -74,6 +74,77 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CWorkbookView::toBin() + { + auto ptr(new XLS::Window1); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oActiveTab.IsInit()) + { + ptr->itabCur = m_oActiveTab->GetValue(); + ptr->ctabSel = m_oActiveTab->GetValue(); + } + else + { + ptr->itabCur = 0; + ptr->ctabSel = 0; + } + + if (m_oAutoFilterDateGrouping.IsInit()) + ptr->fNoAFDateGroup = m_oAutoFilterDateGrouping->GetValue(); + if (m_oFirstSheet.IsInit()) + ptr->itabFirst = m_oFirstSheet->GetValue(); + else + ptr->itabFirst = 0; + if (m_oMinimized.IsInit()) + ptr->fIconic = m_oMinimized->GetValue(); + else + ptr->fIconic = false; + if (m_oShowHorizontalScroll.IsInit()) + ptr->fDspHScroll = m_oShowHorizontalScroll->GetValue(); + if (m_oShowSheetTabs.IsInit()) + ptr->fBotAdornment = m_oShowSheetTabs->GetValue(); + if (m_oShowVerticalScroll.IsInit()) + ptr->fDspVScroll = m_oShowVerticalScroll->GetValue(); + if (m_oTabRatio.IsInit()) + ptr->wTabRatio = m_oTabRatio->GetValue(); + else + ptr->wTabRatio = 600; + if (m_oWindowHeight.IsInit()) + ptr->dyWn = m_oWindowHeight->GetValue(); + else + ptr->dyWn = 12750; + if (m_oWindowWidth.IsInit()) + ptr->dxWn = m_oWindowWidth->GetValue(); + else + ptr->dxWn = 21240; + if (m_oXWindow.IsInit()) + ptr->xWn = m_oXWindow->GetValue() * 6; + else + ptr->xWn = 2280; + if (m_oYWindow.IsInit()) + ptr->yWn = m_oYWindow->GetValue() * 110; + else + ptr->yWn = 1650; + + if (m_oVisibility == SimpleTypes::Spreadsheet::EVisibleType::visibleHidden) + { + ptr->fHidden = true; + ptr->fVeryHidden = false; + } + else if (m_oVisibility == SimpleTypes::Spreadsheet::EVisibleType::visibleVeryHidden) + { + ptr->fHidden = false; + ptr->fVeryHidden = true; + } + else + { + ptr->fHidden = false; + ptr->fVeryHidden = false; + } + + return objectPtr; + } EElementType CWorkbookView::getType () const { return et_x_WorkbookView; @@ -183,6 +254,14 @@ namespace OOX m_arrItems.push_back(new CWorkbookView(workbookView)); } } + std::vector CBookViews::toBin() + { + std::vector ptrVector{}; + for(auto i:m_arrItems) + ptrVector.push_back(i->toBin()); + + return ptrVector; + } EElementType CBookViews::getType () const { return et_x_BookViews; diff --git a/OOXML/XlsxFormat/Workbook/BookViews.h b/OOXML/XlsxFormat/Workbook/BookViews.h index 5083d26c15..bd5c418df5 100644 --- a/OOXML/XlsxFormat/Workbook/BookViews.h +++ b/OOXML/XlsxFormat/Workbook/BookViews.h @@ -67,6 +67,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -104,6 +105,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Workbook/CalcPr.cpp b/OOXML/XlsxFormat/Workbook/CalcPr.cpp index 1cfd708051..739b5cb9dd 100644 --- a/OOXML/XlsxFormat/Workbook/CalcPr.cpp +++ b/OOXML/XlsxFormat/Workbook/CalcPr.cpp @@ -82,6 +82,64 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CCalcPr::toBin() + { + auto ptr(new XLSB::CalcProp); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oCalcId.IsInit()) + ptr->recalcID = m_oCalcId->GetValue(); + else + ptr->recalcID = 0; + if(m_oCalcMode.IsInit()) + ptr->fAutoRecalc = m_oCalcMode->GetValue(); + else + ptr->fAutoRecalc = 1; + if(m_oFullCalcOnLoad.IsInit()) + ptr->fFullCalcOnLoad = m_oFullCalcOnLoad->GetValue(); + else + ptr->fFullCalcOnLoad = false; + if(m_oRefMode.IsInit()) + ptr->fRefA1 = !m_oRefMode->GetValue(); + if(m_oIterate.IsInit()) + ptr->fIter = m_oIterate->GetValue(); + else + ptr->fIter = 0; + if(m_oIterateCount.IsInit()) + ptr->cCalcCount = m_oIterateCount->GetValue(); + else + ptr->cCalcCount = 0; + if(m_oIterateDelta.IsInit()) + ptr->xnumDelta.data.value = m_oIterateDelta->GetValue(); + else + ptr->xnumDelta.data.value = 0; + if(m_oFullPrecision.IsInit()) + ptr->fFullPrec = m_oFullPrecision->GetValue(); + else + ptr->fFullPrec = true; + if(m_oCalcCompleted.IsInit()) + ptr->fSomeUncalced = m_oCalcCompleted->GetValue(); + else + ptr->fSomeUncalced = false; + if(m_oCalcOnSave.IsInit()) + ptr->fSaveRecalc = m_oCalcOnSave->GetValue(); + else + ptr->fSaveRecalc = true; + if(m_oConcurrentCalc.IsInit()) + ptr->fMTREnabled = m_oConcurrentCalc->GetValue(); + else + ptr->fMTREnabled = true; + if(m_oConcurrentManualCount.IsInit()) + ptr->cUserThreadCount = m_oConcurrentManualCount->GetValue(); + else + ptr->cUserThreadCount = 1; + if(m_oForceFullCalc.IsInit()) + ptr->fNoDeps = m_oForceFullCalc->GetValue(); + else + ptr->fNoDeps = false; + + return objectPtr; + } EElementType CCalcPr::getType () const { return et_x_CalcPr; diff --git a/OOXML/XlsxFormat/Workbook/CalcPr.h b/OOXML/XlsxFormat/Workbook/CalcPr.h index 821d0adb0b..2e193e766f 100644 --- a/OOXML/XlsxFormat/Workbook/CalcPr.h +++ b/OOXML/XlsxFormat/Workbook/CalcPr.h @@ -66,6 +66,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp index ce46f59928..e5e1ce607f 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp @@ -74,6 +74,80 @@ namespace OOX m_oRef = oReader.GetText3(); } + XLS::BaseObjectPtr CDefinedName::toBin() + { + auto ptr(new XLSB::Name); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oComment.IsInit()) + ptr->comment = m_oComment.get(); + else + ptr->comment = 0xFFFFFFFF; + + if(m_oDescription.IsInit()) + ptr->description = m_oDescription.get(); + else + ptr->description = 0xFFFFFFFF; + if(m_oFunction.IsInit()) + ptr->fFunc = m_oFunction->GetValue(); + else + ptr->fFunc = false; + if(m_oFunctionGroupId.IsInit()) + ptr->fGrp = m_oFunctionGroupId->GetValue(); + + if(m_oHelp.IsInit()) + ptr->helpTopic = m_oHelp.get(); + else + ptr->helpTopic = 0xFFFFFFFF; + if(m_oHidden.IsInit()) + ptr->fHidden = m_oHidden->GetValue(); + else + ptr->fHidden = false; + + if (m_oLocalSheetId.IsInit()) + ptr->itab = m_oLocalSheetId->GetValue(); + else + ptr->itab = 0xFFFFFFFF; + + if (m_oName.IsInit()) + ptr->name = m_oName.get(); + else + ptr->name = 0xFFFFFFFF; + if (m_oPublishToServer.IsInit()) + ptr->fPublished = m_oPublishToServer->GetValue(); + else + ptr->fPublished = false; + if (m_oShortcutKey.IsInit()) + ptr->chKey = std::stoi(m_oShortcutKey.get()); + else + ptr->chKey = 0; + + if (m_oVbProcedure.IsInit()) + ptr->fOB = m_oVbProcedure->GetValue(); + else + ptr->fOB = false; + if(!ptr->fOB) + ptr->fProc = false; + if(!ptr->fProc) + { + ptr->unusedstring1 = 0xFFFFFFFF; + ptr->unusedstring2 = 0xFFFFFFFF; + } + + if (m_oWorkbookParameter.IsInit()) + ptr->fWorkbookParam = m_oWorkbookParameter->GetValue(); + else + ptr->fWorkbookParam = false; + if (m_oXlm.IsInit()) + ptr->fFutureFunction = m_oXlm->GetValue(); + else + ptr->fFutureFunction = false; + if (m_oRef.IsInit()) + ptr->rgce = m_oRef.get(); + ptr->fCalcExp = true; + ptr->fBuiltin = false; + return objectPtr; + } void CDefinedName::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -165,6 +239,15 @@ namespace OOX } } } + std::vector CDefinedNames::toBin() + { + std::vector objectVector; + + for(auto i:m_arrItems) + objectVector.push_back(i->toBin()); + + return objectVector; + } void CDefinedNames::fromBin(std::vector& obj) { //ReadAttributes(obj); diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.h b/OOXML/XlsxFormat/Workbook/DefinedNames.h index 971c6ebc96..4e5c3edc4a 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.h +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.h @@ -60,6 +60,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -102,6 +103,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Workbook/ExternalReferences.cpp b/OOXML/XlsxFormat/Workbook/ExternalReferences.cpp index 4e86b9a981..3a86483d70 100644 --- a/OOXML/XlsxFormat/Workbook/ExternalReferences.cpp +++ b/OOXML/XlsxFormat/Workbook/ExternalReferences.cpp @@ -39,7 +39,7 @@ namespace OOX { namespace Spreadsheet - { + { CExternalReference::CExternalReference() { } @@ -66,6 +66,20 @@ namespace OOX if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CExternalReference::toBin() + { + auto ptr(new XLSB::SUP); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oRid.IsInit()) + { + auto ptr1(new XLSB::SupBookSrc); + ptr->m_source = XLS::BaseObjectPtr{ptr1}; + ptr1->strRelID.value = m_oRid->GetValue(); + } + + return objectPtr; + } + void CExternalReference::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -156,6 +170,13 @@ namespace OOX m_arrItems.push_back(reference); } } + std::vector CExternalReferences::toBin() + { + std::vector objectVector; + for(auto i:m_arrItems) + objectVector.push_back(i->toBin()); + return objectVector; + } EElementType CExternalReferences::getType () const { return et_x_ExternalReferences; diff --git a/OOXML/XlsxFormat/Workbook/ExternalReferences.h b/OOXML/XlsxFormat/Workbook/ExternalReferences.h index 557ef3a876..55a4813638 100644 --- a/OOXML/XlsxFormat/Workbook/ExternalReferences.h +++ b/OOXML/XlsxFormat/Workbook/ExternalReferences.h @@ -57,6 +57,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -83,6 +84,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; diff --git a/OOXML/XlsxFormat/Workbook/Metadata.cpp b/OOXML/XlsxFormat/Workbook/Metadata.cpp new file mode 100644 index 0000000000..7da7a64c2c --- /dev/null +++ b/OOXML/XlsxFormat/Workbook/Metadata.cpp @@ -0,0 +1,1064 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +#include "Metadata.h" + +#include "../FileTypes_Spreadsheet.h" + +#include "../../Common/SimpleTypes_Shared.h" +#include "../../Common/SimpleTypes_Spreadsheet.h" + +#include "../../DocxFormat/Drawing/DrawingExt.h" +#include "../../../DesktopEditor/common/File.h" + +#include "../../Binary/Presentation/XmlWriter.h" +#include "../../Binary/Presentation/BinaryFileReaderWriter.h" + +namespace OOX +{ + namespace Spreadsheet + { + CMdxKPI::CMdxKPI() {} + CMdxKPI::~CMdxKPI() {} + void CMdxKPI::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMdxKPI::toXML() const + { + return L""; + } + EElementType CMdxKPI::getType() const + { + return et_x_MdxKPI; + } + void CMdxKPI::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L"ToString()); + writer.WriteString(L"/>"); + } + void CMdxKPI::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CMdxKPI::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"n", m_oN) + WritingElement_ReadAttributes_Read_else_if(oReader, L"np", m_oNp) + WritingElement_ReadAttributes_Read_else_if(oReader, L"p", m_oP) + WritingElement_ReadAttributes_End(oReader) + } + //-------------------------------------------------------------------------------------------------------- + CMdxMemeberProp::CMdxMemeberProp() {} + CMdxMemeberProp::~CMdxMemeberProp() {} + void CMdxMemeberProp::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMdxMemeberProp::toXML() const + { + return L""; + } + EElementType CMdxMemeberProp::getType() const + { + return et_x_MdxMemeberProp; + } + void CMdxMemeberProp::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CMdxMemeberProp::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CMdxMemeberProp::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"n", m_oN) + WritingElement_ReadAttributes_Read_else_if(oReader, L"np", m_oNp) + WritingElement_ReadAttributes_End(oReader) + } + //-------------------------------------------------------------------------------------------------------- + CMdxSet::CMdxSet() {} + CMdxSet::~CMdxSet() {} + void CMdxSet::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMdxSet::toXML() const + { + return L""; + } + EElementType CMdxSet::getType() const + { + return et_x_MdxSet; + } + void CMdxSet::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + WritingStringNullableAttrInt2(L"ns", m_oNs); + WritingStringNullableAttrInt2(L"c", m_oC); + WritingStringNullableAttrString(L"o", m_oO, m_oO->ToString()); + writer.WriteString(L">"); + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + void CMdxSet::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"n" == sName) + { + CMetadataStringIndex* ind = new CMetadataStringIndex(); + *ind = oReader; + m_arrItems.push_back(ind); + } + } + } + void CMdxSet::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"ns", m_oNs) + WritingElement_ReadAttributes_Read_else_if(oReader, L"c", m_oC) + WritingElement_ReadAttributes_Read_else_if(oReader, L"o", m_oO) + WritingElement_ReadAttributes_End(oReader) + } + //-------------------------------------------------------------------------------------------------------- + CMetadataStringIndex::CMetadataStringIndex() {} + CMetadataStringIndex::~CMetadataStringIndex() {} + void CMetadataStringIndex::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataStringIndex::toXML() const + { + return L""; + } + EElementType CMetadataStringIndex::getType() const + { + return et_x_MetadataStringIndex; + } + void CMetadataStringIndex::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CMetadataStringIndex::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CMetadataStringIndex::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"x", m_oX) + WritingElement_ReadAttributes_Read_else_if(oReader, L"s", m_oS) + WritingElement_ReadAttributes_End(oReader) + } + //-------------------------------------------------------------------------------------------------------- + CMdxTuple::CMdxTuple() {} + CMdxTuple::~CMdxTuple() {} + void CMdxTuple::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMdxTuple::toXML() const + { + return L""; + } + EElementType CMdxTuple::getType() const + { + return et_x_MdxTuple; + } + void CMdxTuple::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + WritingStringNullableAttrInt2(L"c", m_oC); + WritingStringNullableAttrEncodeXmlString2(L"o", m_oCt); + WritingStringNullableAttrInt2(L"si", m_oSi); + WritingStringNullableAttrInt2(L"fi", m_oFi); + WritingStringNullableAttrInt2(L"bc", m_oBc); + WritingStringNullableAttrInt2(L"fc", m_oFc); + WritingStringNullableAttrBool2(L"i", m_oI); + WritingStringNullableAttrBool2(L"u", m_oU); + WritingStringNullableAttrBool2(L"st", m_oSt); + WritingStringNullableAttrBool2(L"b", m_oB); + writer.WriteString(L">"); + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + void CMdxTuple::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"n" == sName) + { + CMetadataStringIndex* ind = new CMetadataStringIndex(); + *ind = oReader; + m_arrItems.push_back(ind); + } + } + } + void CMdxTuple::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"c", m_oC) + WritingElement_ReadAttributes_Read_else_if(oReader, L"ct", m_oCt) + WritingElement_ReadAttributes_Read_else_if(oReader, L"si", m_oSi) + WritingElement_ReadAttributes_Read_else_if(oReader, L"fi", m_oFi) + WritingElement_ReadAttributes_Read_else_if(oReader, L"bc", m_oBc) + WritingElement_ReadAttributes_Read_else_if(oReader, L"fc", m_oFc) + WritingElement_ReadAttributes_Read_else_if(oReader, L"i", m_oI) + WritingElement_ReadAttributes_Read_else_if(oReader, L"u", m_oU) + WritingElement_ReadAttributes_Read_else_if(oReader, L"st", m_oSt) + WritingElement_ReadAttributes_Read_else_if(oReader, L"b", m_oB) + WritingElement_ReadAttributes_End(oReader) + } + //-------------------------------------------------------------------------------------------------------- + CMdx::CMdx() {} + CMdx::~CMdx() {} + void CMdx::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMdx::toXML() const + { + return L""; + } + EElementType CMdx::getType() const + { + return et_x_Mdx; + } + void CMdx::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + WritingStringNullableAttrInt2(L"n", m_oN); + WritingStringNullableAttrString(L"f", m_oF, m_oF->ToString()); + + if (m_oMdxTuple.IsInit()) + { + m_oMdxTuple->toXML(writer); + } + if (m_oMdxSet.IsInit()) + { + m_oMdxSet->toXML(writer); + } + if (m_oCMdxKPI.IsInit()) + { + m_oCMdxKPI->toXML(writer); + } + if (m_oMdxMemeberProp.IsInit()) + { + m_oMdxMemeberProp->toXML(writer); + } + writer.WriteString(L""); + } + void CMdx::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"t" == sName) + m_oMdxTuple = oReader; + else if (L"ms" == sName) + m_oMdxSet = oReader; + else if (L"p" == sName) + m_oMdxMemeberProp = oReader; + else if (L"k" == sName) + m_oCMdxKPI = oReader; + } + } + void CMdx::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"n", m_oN) + WritingElement_ReadAttributes_Read_else_if(oReader, L"f", m_oF) + WritingElement_ReadAttributes_End(oReader) + } + //------------------------------------------------------------------------------------- + CMdxMetadata::CMdxMetadata() {} + CMdxMetadata::~CMdxMetadata() {} + void CMdxMetadata::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMdxMetadata::toXML() const + { + return L""; + } + EElementType CMdxMetadata::getType() const + { + return et_x_MdxMetadata; + } + void CMdxMetadata::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"mdx" == sName) + { + CMdx* mdx = new CMdx(); + *mdx = oReader; + m_arrItems.push_back(mdx); + } + } + } + void CMdxMetadata::toXML(NSStringUtils::CStringBuilder& writer) const + { + if (m_arrItems.empty()) return; + + writer.WriteString(L""); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + //------------------------------------------------------------------------------------- + CMetadataStrings::CMetadataStrings() {} + CMetadataStrings::~CMetadataStrings() {} + void CMetadataStrings::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataStrings::toXML() const + { + return L""; + } + EElementType CMetadataStrings::getType() const + { + return et_x_MetadataStrings; + } + void CMetadataStrings::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"s" == sName) + { + CMetadataString* pS = new CMetadataString(); + *pS = oReader; + m_arrItems.push_back(pS); + } + } + } + void CMetadataStrings::toXML(NSStringUtils::CStringBuilder& writer) const + { + if (m_arrItems.empty()) return; + + writer.WriteString(L""); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + //-------------------------------------------------------------------------------------------------------- + CMetadataString::CMetadataString() {} + CMetadataString::~CMetadataString() {} + void CMetadataString::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataString::toXML() const + { + return L""; + } + EElementType CMetadataString::getType() const + { + return et_x_MetadataString; + } + void CMetadataString::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CMetadataString::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CMetadataString::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"v", m_oV) + WritingElement_ReadAttributes_End(oReader) + } + // -------------------------------------------------------------------------------------------------------- + CMetadataRecord::CMetadataRecord() {} + CMetadataRecord::~CMetadataRecord() {} + void CMetadataRecord::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataRecord::toXML() const + { + return L""; + } + EElementType CMetadataRecord::getType() const + { + return et_x_MetadataRecord; + } + void CMetadataRecord::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CMetadataRecord::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CMetadataRecord::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"t", m_oT) + WritingElement_ReadAttributes_Read_else_if(oReader, L"v", m_oV) + WritingElement_ReadAttributes_End(oReader) + } + //------------------------------------------------------------------------------------- + CMetadataBlock::CMetadataBlock() {} + CMetadataBlock::~CMetadataBlock() {} + void CMetadataBlock::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataBlock::toXML() const + { + return L""; + } + EElementType CMetadataBlock::getType() const + { + return et_x_MetadataBlock; + } + void CMetadataBlock::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"rc" == sName) + { + CMetadataRecord* pR = new CMetadataRecord(); + *pR = oReader; + m_arrItems.push_back(pR); + } + } + } + void CMetadataBlock::toXML(NSStringUtils::CStringBuilder& writer) const + { + if (m_arrItems.empty()) return; + + writer.WriteString(L""); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + //------------------------------------------------------------------------------------- + CMetadataBlocks::CMetadataBlocks() {} + CMetadataBlocks::~CMetadataBlocks() {} + void CMetadataBlocks::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataBlocks::toXML() const + { + return L""; + } + EElementType CMetadataBlocks::getType() const + { + return et_x_MetadataBlocks; + } + void CMetadataBlocks::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + m_sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"bk" == sName) + { + CMetadataBlock* pB = new CMetadataBlock(); + *pB = oReader; + m_arrItems.push_back(pB); + } + } + } + void CMetadataBlocks::toXML(NSStringUtils::CStringBuilder& writer) const + { + if (m_arrItems.empty()) return; + + writer.WriteString(L"<" + m_sName + L" count=\"" + std::to_wstring(m_arrItems.size()) + L"\">"); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + //------------------------------------------------------------------------------------- + CMetadataTypes::CMetadataTypes() {} + CMetadataTypes::~CMetadataTypes() {} + void CMetadataTypes::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataTypes::toXML() const + { + return L""; + } + EElementType CMetadataTypes::getType() const + { + return et_x_MetadataTypes; + } + void CMetadataTypes::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"metadataType" == sName) + { + CMetadataType* pT = new CMetadataType(); + *pT = oReader; + m_arrItems.push_back(pT); + } + } + } + void CMetadataTypes::toXML(NSStringUtils::CStringBuilder& writer) const + { + if (m_arrItems.empty()) return; + + writer.WriteString(L""); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + //-------------------------------------------------------------------------------------------------------- + CMetadataType::CMetadataType() {} + CMetadataType::~CMetadataType() {} + void CMetadataType::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataType::toXML() const + { + return L""; + } + EElementType CMetadataType::getType() const + { + return et_x_MetadataType; + } + void CMetadataType::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CMetadataType::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CMetadataType::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"name", m_oName) + WritingElement_ReadAttributes_Read_else_if(oReader, L"minSupportedVersion", m_oMinSupportedVersion) + WritingElement_ReadAttributes_Read_else_if(oReader, L"ghostRow", m_oGhostRow) + WritingElement_ReadAttributes_Read_else_if(oReader, L"ghostCol", m_oGhostCol) + WritingElement_ReadAttributes_Read_else_if(oReader, L"edit", m_oEdit) + WritingElement_ReadAttributes_Read_else_if(oReader, L"delete", m_oDelete) + WritingElement_ReadAttributes_Read_else_if(oReader, L"copy", m_oCopy) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteAll", m_oPasteAll) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteFormulas", m_oPasteFormulas) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteValues", m_oPasteValues) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteFormats", m_oPasteFormats) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteComments", m_oPasteComments) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteDataValidation", m_oPasteDataValidation) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteBorders", m_oPasteBorders) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteColWidths", m_oPasteColWidths) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteNumberFormats", m_oPasteNumberFormats) + WritingElement_ReadAttributes_Read_else_if(oReader, L"merge", m_oMerge) + WritingElement_ReadAttributes_Read_else_if(oReader, L"splitFirst", m_oSplitFirst) + WritingElement_ReadAttributes_Read_else_if(oReader, L"splitAll", m_oSplitAll) + WritingElement_ReadAttributes_Read_else_if(oReader, L"rowColShift", m_oRowColShift) + WritingElement_ReadAttributes_Read_else_if(oReader, L"clearAll", m_oClearAll) + WritingElement_ReadAttributes_Read_else_if(oReader, L"clearFormats", m_oClearFormats) + WritingElement_ReadAttributes_Read_else_if(oReader, L"clearContents", m_oClearContents) + WritingElement_ReadAttributes_Read_else_if(oReader, L"clearComments", m_oClearComments) + WritingElement_ReadAttributes_Read_else_if(oReader, L"assign", m_oAssign) + WritingElement_ReadAttributes_Read_else_if(oReader, L"coerce", m_oCoerce) + WritingElement_ReadAttributes_Read_else_if(oReader, L"cellMeta", m_oCellMeta) + WritingElement_ReadAttributes_End(oReader) + } + //-------------------------------------------------------------------------------------------------------- + CFutureMetadataBlock::CFutureMetadataBlock() {} + CFutureMetadataBlock::~CFutureMetadataBlock() {} + void CFutureMetadataBlock::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CFutureMetadataBlock::toXML() const + { + return L""; + } + EElementType CFutureMetadataBlock::getType() const + { + return et_x_FutureMetadataBlock; + } + void CFutureMetadataBlock::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + + if (m_oExtLst.IsInit()) + { + writer.WriteString(m_oExtLst->toXMLWithNS(L"")); + } + writer.WriteString(L""); + } + void CFutureMetadataBlock::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"extLst" == sName) + m_oExtLst = oReader; + } + } + //------------------------------------------------------------------------------------- + CFutureMetadata::CFutureMetadata() {} + CFutureMetadata::~CFutureMetadata() + { + } + void CFutureMetadata::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CFutureMetadata::toXML() const + { + return L""; + } + EElementType CFutureMetadata::getType() const + { + return et_x_FutureMetadata; + } + void CFutureMetadata::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"bk" == sName) + { + CFutureMetadataBlock* pT = new CFutureMetadataBlock(); + *pT = oReader; + m_arrItems.push_back(pT); + } + } + } + void CFutureMetadata::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"name", m_oName) + WritingElement_ReadAttributes_End(oReader) + } + void CFutureMetadata::toXML(NSStringUtils::CStringBuilder& writer) const + { + if (m_arrItems.empty()) return; + + writer.WriteString(L""); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + //-------------------------------------------------------------------------------------------------------- + CMetadata::CMetadata() {} + CMetadata::~CMetadata() + { + for (size_t i = 0; i < m_arFutureMetadata.size(); ++i) + { + if (m_arFutureMetadata[i]) delete m_arFutureMetadata[i]; + } + m_arFutureMetadata.clear(); + } + void CMetadata::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadata::toXML() const + { + return L""; + } + EElementType CMetadata::getType() const + { + return et_x_Metadata; + } + void CMetadata::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + + if (m_oMetadataTypes.IsInit()) + { + m_oMetadataTypes->toXML(writer); + } + if (m_oMetadataStrings.IsInit()) + { + m_oMetadataStrings->toXML(writer); + } + if (m_oMdxMetadata.IsInit()) + { + m_oMdxMetadata->toXML(writer); + } + for (size_t i = 0; i < m_arFutureMetadata.size(); ++i) + { + if (m_arFutureMetadata[i]) + { + m_arFutureMetadata[i]->toXML(writer); + } + } + if (m_oCellMetadata.IsInit()) + { + m_oCellMetadata->m_sName = L"cellMetadata"; + m_oCellMetadata->toXML(writer); + } + if (m_oValueMetadata.IsInit()) + { + m_oValueMetadata->m_sName = L"valueMetadata"; + m_oValueMetadata->toXML(writer); + } + if (m_oExtLst.IsInit()) + { + writer.WriteString(m_oExtLst->toXMLWithNS(L"")); + } + writer.WriteString(L""); + } + void CMetadata::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"metadataTypes" == sName) + m_oMetadataTypes = oReader; + else if (L"metadataStrings" == sName) + m_oMetadataStrings = oReader; + else if (L"mdxMetadata" == sName) + m_oMdxMetadata = oReader; + else if (L"cellMetadata" == sName) + m_oCellMetadata = oReader; + else if (L"valueMetadata" == sName) + m_oValueMetadata = oReader; + else if (L"futureMetadata" == sName) + { + CFutureMetadata* pF = new CFutureMetadata(); + *pF = oReader; + m_arFutureMetadata.push_back(pF); + } + else if (L"extLst" == sName) + m_oExtLst = oReader; + } + } + //----------------------------------------------------------------------------------------------------------------------------------------------------- + CMetadataFile::CMetadataFile(OOX::Document* pMain) : OOX::File(pMain) + { + } + CMetadataFile::CMetadataFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::File(pMain) + { + read(oRootPath, oPath); + } + CMetadataFile::~CMetadataFile() + { + } + void CMetadataFile::read(const CPath& oPath) + { + //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) + CPath oRootPath; + read(oRootPath, oPath); + } + const OOX::FileType CMetadataFile::type() const + { + return OOX::Spreadsheet::FileTypes::Metadata; + } + const CPath CMetadataFile::DefaultDirectory() const + { + return type().DefaultDirectory(); + } + const CPath CMetadataFile::DefaultFileName() const + { + return type().DefaultFileName(); + } + const CPath& CMetadataFile::GetReadPath() + { + return m_oReadPath; + } + void CMetadataFile::read(const CPath& oRootPath, const CPath& oPath) + { + m_oReadPath = oPath; + + XmlUtils::CXmlLiteReader oReader; + + if (!oReader.FromFile(oPath.GetPath())) + return; + + if (!oReader.ReadNextNode()) + return; + + m_oMetadata = oReader; + } + void CMetadataFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const + { + if (false == m_oMetadata.IsInit()) return; + + NSStringUtils::CStringBuilder sXml; + + sXml.WriteString(L""); + m_oMetadata->toXML(sXml); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + + oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); + } +//------------------------------------------------------------------------------------------------------------------------------------- + CDynamicArrayProperties::CDynamicArrayProperties() {} + CDynamicArrayProperties::~CDynamicArrayProperties() {} + void CDynamicArrayProperties::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CDynamicArrayProperties::toXML() const + { + return L""; + } + EElementType CDynamicArrayProperties::getType() const + { + return et_x_DynamicArrayProperties; + } + void CDynamicArrayProperties::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CDynamicArrayProperties::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CDynamicArrayProperties::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"fDynamic", m_oFDynamic) + WritingElement_ReadAttributes_Read_else_if(oReader, L"fCollapsed", m_oFCollapsed) + WritingElement_ReadAttributes_End(oReader) + } +//------------------------------------------------------------------------------------------------------------------------------------- + CRichValueBlock::CRichValueBlock() {} + CRichValueBlock::~CRichValueBlock() {} + void CRichValueBlock::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CRichValueBlock::toXML() const + { + return L""; + } + EElementType CRichValueBlock::getType() const + { + return et_x_RichValueBlock; + } + void CRichValueBlock::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CRichValueBlock::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CRichValueBlock::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"i", m_oI) + WritingElement_ReadAttributes_End(oReader) + } + } + +} // namespace OOX + diff --git a/OOXML/XlsxFormat/Workbook/Metadata.h b/OOXML/XlsxFormat/Workbook/Metadata.h new file mode 100644 index 0000000000..f0b17ae8c5 --- /dev/null +++ b/OOXML/XlsxFormat/Workbook/Metadata.h @@ -0,0 +1,506 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +#pragma once + +#include "../Table/Autofilter.h" +#include "../../DocxFormat/IFileContainer.h" +#include "../../Common/SimpleTypes_Spreadsheet.h" + +namespace OOX +{ + namespace Drawing + { + class COfficeArtExtensionList; + } + + namespace Spreadsheet + { +//----------------------------------------------------------------------------------------------------------------------- + class CMdxKPI : public WritingElement + { + public: + WritingElement_AdditionMethods(CMdxKPI) + CMdxKPI(); + virtual ~CMdxKPI(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oN; + nullable_uint m_oNp; + nullable m_oP; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//----------------------------------------------------------------------------------------------------------------------- + class CMdxMemeberProp : public WritingElement + { + public: + WritingElement_AdditionMethods(CMdxMemeberProp) + CMdxMemeberProp(); + virtual ~CMdxMemeberProp(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oN; + nullable_uint m_oNp; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//----------------------------------------------------------------------------------------------------------------------- + class CMetadataStringIndex : public WritingElement + { + public: + WritingElement_AdditionMethods(CMetadataStringIndex) + CMetadataStringIndex(); + virtual ~CMetadataStringIndex(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oX; + nullable_bool m_oS; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMdxSet : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMdxSet) + CMdxSet(); + virtual ~CMdxSet(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oNs; + nullable_uint m_oC; + nullable m_oO; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMdxTuple : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMdxTuple) + CMdxTuple(); + virtual ~CMdxTuple(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oC; + nullable_string m_oCt; + nullable_uint m_oSi; + nullable_uint m_oFi; + nullable_uint m_oBc; + nullable_uint m_oFc; + nullable_bool m_oI; + nullable_bool m_oU; + nullable_bool m_oSt; + nullable_bool m_oB; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMdx : public WritingElement + { + public: + WritingElement_AdditionMethods(CMdx) + CMdx(); + virtual ~CMdx(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + public: + nullable m_oMdxTuple; + nullable m_oMdxSet; + nullable m_oCMdxKPI; + nullable m_oMdxMemeberProp; + + nullable_uint m_oN; + nullable m_oF; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMdxMetadata : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMdxMetadata) + CMdxMetadata(); + virtual ~CMdxMetadata(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oCount; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataString : public WritingElement + { + public: + WritingElement_AdditionMethods(CMetadataString) + CMetadataString(); + virtual ~CMetadataString(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + public: + nullable_string m_oV; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataRecord : public WritingElement + { + public: + WritingElement_AdditionMethods(CMetadataRecord) + CMetadataRecord(); + virtual ~CMetadataRecord(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + public: + nullable_uint m_oT; + nullable_uint m_oV; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CFutureMetadataBlock : public WritingElement + { + public: + WritingElement_AdditionMethods(CFutureMetadataBlock) + CFutureMetadataBlock(); + virtual ~CFutureMetadataBlock(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable m_oExtLst; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataType : public WritingElement + { + public: + WritingElement_AdditionMethods(CMetadataType) + CMetadataType(); + virtual ~CMetadataType(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + public: + nullable_string m_oName; + nullable_uint m_oMinSupportedVersion; + nullable_bool m_oGhostRow; + nullable_bool m_oGhostCol; + nullable_bool m_oEdit; + nullable_bool m_oDelete; + nullable_bool m_oCopy; + nullable_bool m_oPasteAll; + nullable_bool m_oPasteFormulas; + nullable_bool m_oPasteValues; + nullable_bool m_oPasteFormats; + nullable_bool m_oPasteComments; + nullable_bool m_oPasteDataValidation; + nullable_bool m_oPasteBorders; + nullable_bool m_oPasteColWidths; + nullable_bool m_oPasteNumberFormats; + nullable_bool m_oMerge; + nullable_bool m_oSplitFirst; + nullable_bool m_oSplitAll; + nullable_bool m_oRowColShift; + nullable_bool m_oClearAll; + nullable_bool m_oClearFormats; + nullable_bool m_oClearContents; + nullable_bool m_oClearComments; + nullable_bool m_oAssign; + nullable_bool m_oCoerce; + nullable_bool m_oCellMeta; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataTypes : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMetadataTypes) + CMetadataTypes(); + virtual ~CMetadataTypes(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oCount; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataBlock : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMetadataBlock) + CMetadataBlock(); + virtual ~CMetadataBlock(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataBlocks : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMetadataBlocks) + CMetadataBlocks(); + virtual ~CMetadataBlocks(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oCount; + + std::wstring m_sName; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataStrings : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMetadataStrings) + CMetadataStrings(); + virtual ~CMetadataStrings(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oCount; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CFutureMetadata : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CFutureMetadata) + CFutureMetadata(); + virtual ~CFutureMetadata(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_string m_oName; + nullable_uint m_oCount; + + nullable m_oExtLst; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//-------------------------------------------------------------------------------------------------------------- + class CMetadata : public WritingElement + { + public: + WritingElement_AdditionMethods(CMetadata) + CMetadata(); + virtual ~CMetadata(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + public: + nullable m_oMetadataTypes; + nullable m_oMetadataStrings; + nullable m_oMdxMetadata; + nullable m_oCellMetadata; + nullable m_oValueMetadata; + + std::vector m_arFutureMetadata; + + nullable m_oExtLst; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataFile : public OOX::File + { + public: + CMetadataFile(OOX::Document* pMain); + CMetadataFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath); + virtual ~CMetadataFile(); + + //void readBin(const CPath& oPath); + //XLS::BaseObjectPtr WriteBin() const; + virtual void read(const CPath& oPath); + virtual void read(const CPath& oRootPath, const CPath& oPath); + + virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; + virtual const OOX::FileType type() const; + + virtual const CPath DefaultDirectory() const; + virtual const CPath DefaultFileName() const; + + const CPath& GetReadPath(); + + nullable m_oMetadata; + private: + CPath m_oReadPath; + }; +//----------------------------------------------------------------------------------------------------------------------- + class CDynamicArrayProperties : public WritingElement + { + public: + WritingElement_AdditionMethods(CDynamicArrayProperties) + CDynamicArrayProperties(); + virtual ~CDynamicArrayProperties(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_bool m_oFDynamic; + nullable_bool m_oFCollapsed; + + nullable m_oExtLst; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//----------------------------------------------------------------------------------------------------------------------- + class CRichValueBlock : public WritingElement + { + public: + WritingElement_AdditionMethods(CRichValueBlock) + CRichValueBlock(); + virtual ~CRichValueBlock(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oI; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; + } //Spreadsheet +} // namespace OOX diff --git a/OOXML/XlsxFormat/Workbook/Sheets.cpp b/OOXML/XlsxFormat/Workbook/Sheets.cpp index bcb06ac25e..6fc2a4616d 100644 --- a/OOXML/XlsxFormat/Workbook/Sheets.cpp +++ b/OOXML/XlsxFormat/Workbook/Sheets.cpp @@ -69,6 +69,26 @@ namespace OOX if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CSheet::toBin() + { + auto ptr(new XLSB::BundleSh); + XLS::BaseObjectPtr objectPtr(ptr); + + ptr->strRelID.value = m_oRid->GetValue(); + ptr->strName = m_oName.get(); + ptr->iTabID = m_oSheetId->GetValue(); + + if(m_oState == SimpleTypes::Spreadsheet::EVisibleType::visibleVisible) + ptr->hsState = XLSB::BundleSh::ST_SheetState::VISIBLE; + else if(m_oState == SimpleTypes::Spreadsheet::EVisibleType::visibleHidden) + ptr->hsState = XLSB::BundleSh::ST_SheetState::HIDDEN; + else if(m_oState == SimpleTypes::Spreadsheet::EVisibleType::visibleVeryHidden) + ptr->hsState = XLSB::BundleSh::ST_SheetState::VERYHIDDEN; + else + ptr->hsState = XLSB::BundleSh::ST_SheetState::VISIBLE; + + return objectPtr; + } void CSheet::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -171,6 +191,13 @@ namespace OOX m_arrItems.push_back(new CSheet(sheet)); } } + std::vector CSheets::toBin() + { + std::vector objectVector; + for(auto i: m_arrItems) + objectVector.push_back(i->toBin()); + return objectVector; + } EElementType CSheets::getType () const { return et_x_Sheets; diff --git a/OOXML/XlsxFormat/Workbook/Sheets.h b/OOXML/XlsxFormat/Workbook/Sheets.h index 7cee9f7af0..fc1956be6a 100644 --- a/OOXML/XlsxFormat/Workbook/Sheets.h +++ b/OOXML/XlsxFormat/Workbook/Sheets.h @@ -66,6 +66,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -95,6 +96,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 0ee060bee0..9342b0ac08 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -32,6 +32,7 @@ #pragma once #include "Workbook.h" +#include "../../XlsbFormat/Xlsb.h" #include "../../XlsbFormat/WorkBookStream.h" @@ -42,16 +43,23 @@ #include "../../XlsbFormat/Biff12_unions/PIVOTCACHEID.h" #include "../../XlsbFormat/Biff12_records/FileVersion.h" #include "../../XlsbFormat/Biff12_records/BeginPivotCacheID.h" +#include "../../XlsbFormat/Biff12_unions/SUP.h" +#include "../../XlsbFormat/Biff12_records/SupSelf.h" +#include "../../XlsbFormat/Biff12_records/CommonRecords.h" +#include "../../XlsbFormat/Biff12_records/BundleSh.h" + #include "../../../MsBinaryFile/XlsFile/Format/Logic/GlobalWorkbookInfo.h" #include "../../Common/SimpleTypes_Shared.h" #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../DocxFormat/Drawing/DrawingExt.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet - { + { CWorkbookPivotCache::CWorkbookPivotCache() { } @@ -84,6 +92,19 @@ namespace OOX ReadAttributes(ptr->m_BrtBeginPivotCacheID); } } + XLS::BaseObjectPtr CWorkbookPivotCache::toBin() + { + auto ptr(new XLSB::PIVOTCACHEID); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPivotCacheID); + ptr->m_BrtBeginPivotCacheID = XLS::BaseObjectPtr{ptr1}; + + if(m_oCacheId.IsInit()) + ptr1->idSx = m_oCacheId->GetValue(); + if(m_oRid.IsInit()) + ptr1->irstcacheRelID.value = m_oRid->GetValue(); + return objectPtr; + } EElementType CWorkbookPivotCache::getType() const { return et_x_WorkbookPivotCache; @@ -141,13 +162,12 @@ namespace OOX { if (oReader.IsEmptyNode()) return; - int nCurDepth = oReader.GetDepth(); while (oReader.ReadNextSiblingNode(nCurDepth)) { std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); - if (L"pivotCaches" == sName) + if (L"pivotCache" == sName) { CWorkbookPivotCache *pPivotCache = new CWorkbookPivotCache(); m_arrItems.push_back(pPivotCache); @@ -166,6 +186,16 @@ namespace OOX } } + XLS::BaseObjectPtr CWorkbookPivotCaches::toBin() + { + auto ptr(new XLSB::PIVOTCACHEIDS); + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto i:m_arrItems) + ptr->m_arPIVOTCACHEID.push_back(i->toBin()); + + return objectPtr; + } EElementType CWorkbookPivotCaches::getType() const { return et_x_WorkbookPivotCaches; @@ -238,7 +268,7 @@ namespace OOX if (workBookStream->m_FRTWORKBOOK != nullptr) m_oExtLst = workBookStream->m_FRTWORKBOOK; - + if (workBookStream->m_BrtFileSharingIso != nullptr) m_oFileSharing = workBookStream->m_BrtFileSharingIso; else if (workBookStream->m_BrtFileSharing != nullptr) @@ -249,6 +279,95 @@ namespace OOX } } + + XLS::BaseObjectPtr CWorkbook::WriteBin() const + { + XLSB::WorkBookStreamPtr workBookStream(new XLSB::WorkBookStream); + + if (m_oBookViews.IsInit()) + { + auto viewPtr(new XLSB::BOOKVIEWS); + viewPtr->m_arBrtBookView = m_oBookViews->toBin(); + workBookStream->m_BOOKVIEWS = XLS::BaseObjectPtr{viewPtr}; + } + if (m_oCalcPr.IsInit()) + workBookStream->m_BrtCalcProp = m_oCalcPr->toBin(); + if (m_oSheets.IsInit()) + { + auto ptr(new XLSB::BUNDLESHS); + ptr->m_arBrtBundleSh = m_oSheets->toBin(); + workBookStream->m_BUNDLESHS = XLS::BaseObjectPtr{ptr}; + + auto ptr1(new XLSB::EXTERNALS); + workBookStream->m_EXTERNALS = XLS::BaseObjectPtr{ptr1}; + auto externSheet(new XLSB::ExternSheet); + ptr1->m_BrtExternSheet = XLS::BaseObjectPtr{externSheet}; + externSheet->cXTI = ptr->m_arBrtBundleSh.size(); + for(auto i = 0; i < ptr->m_arBrtBundleSh.size(); i++) + { + auto sup(new XLSB::SUP); + auto supSelf(new XLSB::SupSelf); + sup->m_source = XLS::BaseObjectPtr{supSelf}; + ptr1->m_arSUP.push_back(XLS::BaseObjectPtr{sup}); + auto xti(new XLS::XTI); + xti->iSupBook = i; + xti->itabFirst = i; + xti->itabLast = i; + + auto biffStructPtr = XLS::BiffStructurePtr(xti); + externSheet->rgXTI.push_back(biffStructPtr); + + XLS::GlobalWorkbookInfo::_xti val_1; + val_1.iSup = xti->iSupBook; + val_1.itabFirst = i; + val_1.itabLast = i; + auto sheet = static_cast(ptr->m_arBrtBundleSh[i].get()); + val_1.link = sheet->strName; + + XLS::GlobalWorkbookInfo::arXti_External_static.push_back(val_1); + + } + } + if (m_oWorkbookPr.IsInit()) + workBookStream->m_BrtWbProp = m_oWorkbookPr->toBin(); + if (m_oPivotCaches.IsInit()) + workBookStream->m_PIVOTCACHEIDS = m_oPivotCaches->toBin(); + if (m_oDefinedNames.IsInit()) + { + workBookStream->m_arBrtName = m_oDefinedNames->toBin(); + } + if (m_oWorkbookProtection.IsInit()) + workBookStream->m_BrtBookProtection = m_oWorkbookProtection->toBin(); + + if (m_oExternalReferences.IsInit()) + { + auto ptr = static_cast(workBookStream->m_EXTERNALS.get()); + auto sups = m_oExternalReferences->toBin(); + if(!sups.empty()) + ptr->m_arSUP.insert(ptr->m_arSUP.end(), sups.begin(), sups.end()); + + } + + + /* + if (m_oAppName.IsInit()) + { + auto ptr(new XLSB::FileVersion); + ptr->stAppName = m_oAppName.get(); + ptr->stLastEdited = L""; + ptr->stLowestEdited = L""; + ptr->stRupBuild = L""; + workBookStream->m_BrtFileVersion = XLS::BaseObjectPtr{ptr}; + }*/ + + if (m_oExtLst.IsInit()) + workBookStream->m_FRTWORKBOOK = m_oExtLst->toBinWorkBook(); + + if (m_oFileSharing.IsInit()) + workBookStream->m_BrtFileSharing = m_oFileSharing->toBin(); + + return workBookStream; + } void CWorkbook::read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -381,7 +500,7 @@ xmlns:xr2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2\"\ WritingElement_ReadAttributes_Start(oReader) WritingElement_ReadAttributes_Read_if(oReader, L"appName", m_oAppName) WritingElement_ReadAttributes_End(oReader) - } + } else if (L"WindowHeight" == sName) { } @@ -398,20 +517,33 @@ xmlns:xr2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2\"\ } void CWorkbook::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { - NSStringUtils::CStringBuilder sXml; + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { + NSStringUtils::CStringBuilder sXml; - sXml.WriteString(L""); + sXml.WriteString(L""); - toXML(sXml); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath.c_str(), sXml.GetData()); + toXML(sXml); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath.c_str(), sXml.GetData()); + } oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); IFileContainer::Write(oPath, oDirectory, oContent); } const OOX::FileType CWorkbook::type() const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::WorkbookBin; + } if (m_bMacroEnabled) return OOX::Spreadsheet::FileTypes::WorkbookMacro; else return OOX::Spreadsheet::FileTypes::Workbook; } @@ -421,7 +553,17 @@ xmlns:xr2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2\"\ } const CPath CWorkbook::DefaultFileName() const { - return type().DefaultFileName(); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + CPath name = type().DefaultFileName(); + name.SetExtention(L"bin"); + return name; + } + else + { + return type().DefaultFileName(); + } } EElementType CWorkbook::getType () const { diff --git a/OOXML/XlsxFormat/Workbook/Workbook.h b/OOXML/XlsxFormat/Workbook/Workbook.h index 59d4a11399..a3b31d97db 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.h +++ b/OOXML/XlsxFormat/Workbook/Workbook.h @@ -81,6 +81,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType() const; @@ -106,6 +107,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType() const; }; @@ -120,6 +122,7 @@ namespace OOX virtual ~CWorkbook(); void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void fromXML(XmlUtils::CXmlNode& node); @@ -154,7 +157,7 @@ namespace OOX nullablem_oPivotCaches; nullable m_oPivotCachesXml; nullable m_oFileSharing; - + CPersonList* m_pPersonList; bool m_bMacroEnabled; }; diff --git a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp index 658fe94eb4..e7a7eed4e6 100644 --- a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp +++ b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp @@ -89,6 +89,82 @@ namespace OOX if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CWorkbookPr::toBin() + { + auto ptr(new XLSB::WbProp); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oAllowRefreshQuery.IsInit()) + ptr->fNoSaveSup = m_oAllowRefreshQuery->GetValue(); + else + ptr->fNoSaveSup = false; + if(m_oAutoCompressPictures.IsInit()) + ptr->fAutoCompressPictures = m_oAutoCompressPictures->GetValue(); + if(m_oBackupFile.IsInit()) + ptr->fBackup = m_oBackupFile->GetValue(); + else + ptr->fBackup = false; + if(m_oCheckCompatibility.IsInit()) + ptr->fCheckCompat = m_oCheckCompatibility->GetValue(); + else + ptr->fCheckCompat = false; + if(m_oCodeName.IsInit()) + ptr->strName.value = m_oCodeName->GetValue(); + else + ptr->strName.value = false; + if(m_oDate1904.IsInit()) + ptr->f1904 = m_oDate1904->GetValue(); + else + ptr->f1904 = false; + if(m_oDateCompatibility.IsInit()) + ptr->fNoSaveSup = m_oDateCompatibility->GetValue(); + else + ptr->fNoSaveSup = false; + if(m_oDefaultThemeVersion.IsInit()) + ptr->dwThemeVersion = m_oDefaultThemeVersion->GetValue(); + else + ptr->dwThemeVersion = 0; + if(m_oFilterPrivacy.IsInit()) + ptr->fFilterPrivacy = m_oFilterPrivacy->GetValue(); + else + ptr->fFilterPrivacy = false; + if(m_oHidePivotFieldList.IsInit()) + ptr->fHidePivotTableFList = m_oHidePivotFieldList->GetValue(); + else + ptr->fHidePivotTableFList = false; + if(m_oPromptedSolutions.IsInit()) + ptr->fBuggedUserAboutSolution = m_oPromptedSolutions->GetValue(); + else + ptr->fBuggedUserAboutSolution = false; + if(m_oPublishItems.IsInit()) + ptr->fPublishedBookItems = m_oPublishItems->GetValue(); + else + ptr->fPublishedBookItems = false; + if(m_oRefreshAllConnections.IsInit()) + ptr->fRefreshAll = m_oRefreshAllConnections->GetValue(); + else + ptr->fRefreshAll = false; + if(m_oShowBorderUnselectedTables.IsInit()) + ptr->fHideBorderUnselLists = m_oShowBorderUnselectedTables->GetValue(); + else + ptr->fHideBorderUnselLists = false; + if(m_oShowInkAnnotation.IsInit()) + ptr->fShowInkAnnotation = m_oShowInkAnnotation->GetValue(); + if(m_oShowObjects.IsInit()) + ptr->mdDspObj = m_oShowObjects->GetValue() ? 1 : 2; + else + ptr->mdDspObj = 0; + if(m_oShowPivotChartFilter.IsInit()) + ptr->fShowPivotChartFilter = m_oShowPivotChartFilter->GetValue(); + else + ptr->fShowPivotChartFilter = false; + if(m_oUpdateLinks.IsInit()) + ptr->grbitUpdateLinks = m_oUpdateLinks->GetValue(); + else + ptr->grbitUpdateLinks = 0; + + return objectPtr; + } void CWorkbookPr::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -176,6 +252,78 @@ namespace OOX if (!oReader.IsEmptyNode()) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CWorkbookProtection::toBin() + { + XLS::BaseObjectPtr objectPtr; + if(m_oWorkbookAlgorithmName.IsInit() || m_oWorkbookSpinCount.IsInit() || m_oRevisionsAlgorithmName.IsInit() || + m_oRevisionsSpinCount.IsInit()) + { + auto ptr(new XLSB::BookProtectionIso); + objectPtr = XLS::BaseObjectPtr{ptr}; + + ptr->wFlags.fLockRevision = m_oLockRevision->GetValue(); + ptr->wFlags.fLockStructure = m_oLockStructure->GetValue(); + ptr->wFlags.fLockWindow = m_oLockWindows->GetValue(); + + ptr->ipdBookPasswordData.szAlgName = m_oWorkbookAlgorithmName->GetValue(); + ptr->dwBookSpinCount = m_oWorkbookSpinCount->GetValue(); + + if(m_oWorkbookHashValue.IsInit()) + { + auto len = 0; + auto bytes = ptr->ipdBookPasswordData.rgbHash.rgbData.data(); + std::string strData = {m_oWorkbookHashValue.get().begin(), m_oWorkbookHashValue.get().end()}; + NSFile::CBase64Converter::Decode(strData.c_str(), strData.size(), + bytes, len); + ptr->ipdBookPasswordData.rgbHash.cbLength = len; + } + + if(m_oWorkbookSaltValue.IsInit()) + { + auto len1 = 0; + auto bytes1 = ptr->ipdBookPasswordData.rgbHash.rgbData.data(); + std::string strData1 = {m_oWorkbookSaltValue.get().begin(), m_oWorkbookSaltValue.get().end()}; + NSFile::CBase64Converter::Decode(strData1.c_str(), strData1.size(), + bytes1, len1); + ptr->ipdBookPasswordData.rgbSalt.cbLength = len1; + } + if(m_oRevisionsAlgorithmName.IsInit()) + ptr->ipdRevPasswordData.szAlgName = m_oRevisionsAlgorithmName->GetValue(); + if(m_oRevisionsSpinCount.IsInit()) + ptr->dwRevSpinCount = m_oRevisionsSpinCount->GetValue(); + + if(m_oRevisionsHashValue.IsInit()) + { + auto len2 = 0; + auto bytes2 = ptr->ipdRevPasswordData.rgbHash.rgbData.data(); + std::string strData2 = {m_oRevisionsHashValue.get().begin(), m_oRevisionsHashValue.get().end()}; + NSFile::CBase64Converter::Decode(strData2.c_str(), strData2.size(), + bytes2, len2); + ptr->ipdRevPasswordData.rgbHash.cbLength = len2; + } + if(m_oRevisionsSaltValue.IsInit()) + { + auto len3 = 0; + auto bytes3 = ptr->ipdRevPasswordData.rgbSalt.rgbData.data(); + std::string strData3 = {m_oRevisionsSaltValue.get().begin(), m_oRevisionsSaltValue.get().end()}; + NSFile::CBase64Converter::Decode(strData3.c_str(), strData3.size(), + bytes3, len3); + ptr->ipdRevPasswordData.rgbSalt.cbLength = len3; + } + } + else + { + auto ptr(new XLSB::BookProtection); + objectPtr = XLS::BaseObjectPtr{ptr}; + if(m_oLockRevision.IsInit()) + ptr->wFlags.fLockRevision = m_oLockRevision->GetValue(); + if(m_oLockStructure.IsInit()) + ptr->wFlags.fLockStructure = m_oLockStructure->GetValue(); + if(m_oLockWindows.IsInit()) + ptr->wFlags.fLockWindow = m_oLockWindows->GetValue(); + } + return objectPtr; + } void CWorkbookProtection::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -262,6 +410,46 @@ namespace OOX if (!oReader.IsEmptyNode()) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CFileSharing::toBin() + { + XLS::BaseObjectPtr objectPtr; + if(m_oSpinCount.IsInit() || m_oAlgorithmName.IsInit() || m_oHashValue.IsInit()) + { + auto ptr(new XLSB::FileSharingIso); + objectPtr = XLS::BaseObjectPtr{ptr}; + + if (m_oReadOnlyRecommended.IsInit()) + ptr->fReadOnlyRec = m_oReadOnlyRecommended.get(); + ptr->stUserName = m_oUserName.get(); + ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); + ptr->dwSpinCount = m_oSpinCount->GetValue(); + + auto len = 0; + auto bytes = ptr->ipdPasswordData.rgbHash.rgbData.data(); + std::string strData = {m_oHashValue.get().begin(), m_oHashValue.get().end()}; + NSFile::CBase64Converter::Decode(strData.c_str(), strData.size(), + bytes, len); + ptr->ipdPasswordData.rgbHash.cbLength = len; + + auto len1 = 0; + auto bytes1 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); + std::string strData1 = {m_oSaltValue.get().begin(), m_oSaltValue.get().end()}; + NSFile::CBase64Converter::Decode(strData1.c_str(), strData1.size(), + bytes1, len1); + ptr->ipdPasswordData.rgbSalt.cbLength = len1; + + } + else + { + auto ptr(new XLSB::FileSharing); + objectPtr = XLS::BaseObjectPtr{ptr}; + if (m_oReadOnlyRecommended.IsInit()) + ptr->fReadOnlyRec = m_oReadOnlyRecommended.get(); + ptr->stUserName = m_oUserName.get(); + ptr->wResPass = m_oPassword.get(); + } + return objectPtr; + } void CFileSharing::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); diff --git a/OOXML/XlsxFormat/Workbook/WorkbookPr.h b/OOXML/XlsxFormat/Workbook/WorkbookPr.h index db7b068222..3f32c987bf 100644 --- a/OOXML/XlsxFormat/Workbook/WorkbookPr.h +++ b/OOXML/XlsxFormat/Workbook/WorkbookPr.h @@ -56,7 +56,7 @@ namespace OOX public: WritingElement_AdditionMethods(CWorkbookPr) WritingElement_XlsbConstructors(CWorkbookPr) - + CWorkbookPr(); virtual ~CWorkbookPr(); @@ -67,6 +67,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -98,7 +99,7 @@ namespace OOX public: WritingElement_AdditionMethods(CWorkbookProtection) WritingElement_XlsbConstructors(CWorkbookProtection) - + CWorkbookProtection(); virtual ~CWorkbookProtection(); @@ -109,6 +110,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -135,7 +137,7 @@ namespace OOX public: WritingElement_AdditionMethods(CFileSharing) WritingElement_XlsbConstructors(CFileSharing) - + CFileSharing(); virtual ~CFileSharing(); @@ -146,6 +148,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -153,7 +156,7 @@ namespace OOX nullable_bool m_oReadOnlyRecommended; nullable_string m_oUserName; - + nullable m_oAlgorithmName; nullable m_oSpinCount; nullable_string m_oHashValue; diff --git a/OOXML/XlsxFormat/Worksheets/Cols.cpp b/OOXML/XlsxFormat/Worksheets/Cols.cpp index df7739a53f..9434ba6cef 100644 --- a/OOXML/XlsxFormat/Worksheets/Cols.cpp +++ b/OOXML/XlsxFormat/Worksheets/Cols.cpp @@ -81,6 +81,46 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CCol::toBin() + { + auto castedPtr = new XLSB::ColInfo; + XLS::BaseObjectPtr ptr(castedPtr); + if(m_oBestFit.IsInit()) + castedPtr->fBestFit = m_oBestFit->ToBool(); + else + castedPtr->fBestFit = false; + if(m_oCollapsed.IsInit()) + castedPtr->fCollapsed = m_oCollapsed->ToBool(); + else + castedPtr->fCollapsed = false; + if(m_oCustomWidth.IsInit()) + castedPtr->fUserSet = m_oCustomWidth->ToBool(); + else + castedPtr->fUserSet = false; + if(m_oHidden.IsInit()) + castedPtr->fHidden = m_oHidden->ToBool(); + else + castedPtr->fHidden = false; + if(m_oMax.IsInit()) + castedPtr->colLast = m_oMax->m_eValue - 1; + if(m_oMin.IsInit()) + castedPtr->colFirst = m_oMin->m_eValue - 1; + if(m_oOutlineLevel.IsInit()) + castedPtr->iOutLevel = m_oOutlineLevel->m_eValue; + if(m_oPhonetic.IsInit()) + castedPtr->fPhonetic = m_oPhonetic->ToBool(); + if(m_oStyle.IsInit()) + castedPtr->ixfeXLSB = m_oStyle->m_eValue; + else + castedPtr->ixfeXLSB = 0; + + if (m_oWidth.IsInit()) + { + if(m_oWidth->GetValue() > 0) + castedPtr->coldx = m_oWidth->GetValue() * 256; + } + return ptr; + } EElementType CCol::getType() const { return et_x_Col; @@ -230,6 +270,15 @@ namespace OOX } } } + std::vector CCols::toBin() + { + std::vector ptrVector; + for(auto i:m_arrItems) + { + ptrVector.push_back(i->toBin()); + } + return ptrVector; + } EElementType CCols::getType () const { return et_x_Cols; diff --git a/OOXML/XlsxFormat/Worksheets/Cols.h b/OOXML/XlsxFormat/Worksheets/Cols.h index 7c000a45f9..5d2dbba615 100644 --- a/OOXML/XlsxFormat/Worksheets/Cols.h +++ b/OOXML/XlsxFormat/Worksheets/Cols.h @@ -61,6 +61,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; private: @@ -95,6 +96,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index 3ae020f2a2..954ac25be5 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -108,7 +108,7 @@ EElementType CFormulaCF::getType () const void CFormulaCF::toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const { std::wstring node_name = bExtendedWrite ? L"xm:f" : L"formula"; - + writer.WriteString(L"<" + node_name + L">"); writer.WriteEncodeXmlString(m_sText); writer.WriteString(L""); @@ -125,7 +125,7 @@ void CFormulaCF::fromXML(XmlUtils::CXmlLiteReader& oReader) const CFormulaCF CFormulaCF::Merge(const CFormulaCF& oPrev, const CFormulaCF& oCurrent) { CFormulaCF oFormula; - + if (oCurrent.m_sText.empty() == false) { oFormula.m_sText = oCurrent.m_sText; @@ -180,11 +180,11 @@ void CConditionalFormatValueObject::ReadAttributes(XmlUtils::CXmlLiteReader& oRe void CConditionalFormatValueObject::toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const { if (false == m_oType.IsInit()) return; - + if (bExtendedWrite == false) { if (m_oType->GetValue() == SimpleTypes::Spreadsheet::autoMin) m_oType->SetValue(SimpleTypes::Spreadsheet::Minimum); - if (m_oType->GetValue() == SimpleTypes::Spreadsheet::autoMax) m_oType->SetValue(SimpleTypes::Spreadsheet::Maximum); + if (m_oType->GetValue() == SimpleTypes::Spreadsheet::autoMax) m_oType->SetValue(SimpleTypes::Spreadsheet::Maximum); } std::wstring node_name = bExtendedWrite ? L"x14:cfvo" : L"cfvo"; @@ -220,7 +220,7 @@ void CConditionalFormatValueObject::toXML2(NSStringUtils::CStringBuilder& writer CFormulaCF formla; formla.m_sText = m_oVal.get(); formla.toXML2(writer, true); } - + } writer.WriteString(L""); @@ -228,7 +228,7 @@ void CConditionalFormatValueObject::toXML2(NSStringUtils::CStringBuilder& writer void CConditionalFormatValueObject::fromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); - + if (oReader.IsEmptyNode()) return; @@ -240,6 +240,40 @@ void CConditionalFormatValueObject::fromXML(XmlUtils::CXmlLiteReader& oReader) m_oFormula = oReader; } } +XLS::BaseObjectPtr CConditionalFormatValueObject::toBin() +{ + auto ptr(new XLSB::uCFVO); + XLS::BaseObjectPtr objectPtr(ptr); + + auto ptr1(new XLSB::CFVO); + ptr->m_BrtCFVO = XLS::BaseObjectPtr{ptr1}; + if(m_oGte.IsInit()) + ptr1->fGTE = m_oGte->GetValue(); + else + ptr1->fGTE = false; + if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Number) + ptr1->iType = XLSB::CFVOtype::CFVONUM; + else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Minimum) + ptr1->iType = XLSB::CFVOtype::CFVOMIN; + else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Maximum) + ptr1->iType = XLSB::CFVOtype::CFVOMAX; + else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Percent) + ptr1->iType = XLSB::CFVOtype::CFVOPERCENT; + else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Percentile) + ptr1->iType = XLSB::CFVOtype::CFVOPERCENTILE; + else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Formula) + ptr1->iType = XLSB::CFVOtype::CFVOFMLA; + + if(m_oVal.IsInit()) + ptr1->numParam.data.value = std::stod(m_oVal.get()); + + if(m_oFormula.IsInit()) + { + ptr1->formula = m_oFormula->m_sText; + } + + return objectPtr; +} void CConditionalFormatValueObject::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -619,6 +653,14 @@ void CColorScale::fromBin(XLS::BaseObjectPtr& obj) } } } +XLS::BaseObjectPtr CColorScale::toBin() +{ + auto ptr(new XLSB::COLORSCALE); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrValues) + ptr->m_arCFVO.push_back(i->toBin()); + return objectPtr; +} EElementType CColorScale::getType () const { return et_x_ColorScale; @@ -637,7 +679,7 @@ nullable CColorScale::Merge(const nullable &oPrev, const nullablem_BrtBeginDatabar = XLS::BaseObjectPtr{ptr1}; + if(m_oMaxLength.IsInit()) + ptr1->bLenMax = m_oMaxLength->GetValue(); + else + m_oMaxLength = 100; + if(m_oMinLength.IsInit()) + ptr1->bLenMin = m_oMinLength->GetValue(); + else + ptr1->bLenMin = 0; + if(m_oShowValue.IsInit()) + ptr1->fShowValue = m_oShowValue->GetValue(); + else + ptr1->fShowValue = false; + + for(auto i:m_arrValues) + ptr->m_arCFVO.push_back(i->toBin()); + if(m_oColor.IsInit()) + ptr->m_BrtColor = m_oColor->toBin(); + + return objectPtr; +} void CDataBar::ReadAttributes(XLS::BaseObjectPtr& obj) { if(obj->get_type() == XLS::typeBeginDatabar) @@ -898,13 +967,13 @@ const CDataBar CDataBar::Merge(const CDataBar& oPrev, const CDataBar& oCurrent) oDataBar.m_oDirection = Merge( oPrev.m_oDirection, oCurrent.m_oDirection ); oDataBar.m_oNegativeBarColorSameAsPositive = Merge( oPrev.m_oNegativeBarColorSameAsPositive, oCurrent.m_oNegativeBarColorSameAsPositive ); oDataBar.m_oNegativeBarBorderColorSameAsPositive = Merge( oPrev.m_oNegativeBarBorderColorSameAsPositive, oCurrent.m_oNegativeBarBorderColorSameAsPositive ); - + oDataBar.m_oColor = Merge( oPrev.m_oColor, oCurrent.m_oColor ); oDataBar.m_oAxisColor = Merge( oPrev.m_oAxisColor, oCurrent.m_oAxisColor ); oDataBar.m_oBorderColor = Merge( oPrev.m_oBorderColor, oCurrent.m_oBorderColor ); oDataBar.m_oNegativeFillColor = Merge( oPrev.m_oNegativeFillColor, oCurrent.m_oNegativeFillColor ); oDataBar.m_oNegativeBorderColor = Merge( oPrev.m_oNegativeBorderColor, oCurrent.m_oNegativeBorderColor ); - + for (size_t i = 0; i < oPrev.m_arrValues.size(); i++) { if (i < oCurrent.m_arrValues.size()) @@ -1061,6 +1130,95 @@ void CIconSet::fromBin(XLS::BaseObjectPtr& obj) } } } +XLS::BaseObjectPtr CIconSet::toBin() +{ + auto ptr(new XLSB::ICONSET); + XLS::BaseObjectPtr objectPtr(ptr); + + auto beginPtr(new XLSB::BeginIconSet); + ptr->m_BrtBeginIconSet = XLS::BaseObjectPtr{beginPtr}; + if(m_oShowValue.IsInit()) + beginPtr->fIcon = !m_oShowValue->GetValue(); + if(m_oReverse.IsInit()) + beginPtr->fReverse = m_oReverse->GetValue(); + + if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::NoIcons) + { + beginPtr->iSet.set = KPISets::KPINIL; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows3) + { + beginPtr->iSet.set = KPISets::KPI3ARROWS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows3Gray) + { + beginPtr->iSet.set = KPISets::KPI3ARROWSGRAY; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Flags3) + { + beginPtr->iSet.set = KPISets::KPI3FLAGS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Traffic3Lights1) + { + beginPtr->iSet.set = KPISets::KPI3TRAFFICLIGHTS1; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Traffic3Lights2) + { + beginPtr->iSet.set = KPISets::KPI3TRAFFICLIGHTS2; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Signs3) + { + beginPtr->iSet.set = KPISets::KPI3SIGNS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Symbols3) + { + beginPtr->iSet.set = KPISets::KPI3SYMBOLS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Symbols3_2) + { + beginPtr->iSet.set = KPISets::KPI3SYMBOLS2; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows4) + { + beginPtr->iSet.set = KPISets::KPI4ARROWS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows4Gray) + { + beginPtr->iSet.set = KPISets::KPI4ARROWSGRAY; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::RedToBlack4) + { + beginPtr->iSet.set = KPISets::KPI4REDTOBLACK; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Rating4) + { + beginPtr->iSet.set = KPISets::KPI4RATING; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Traffic4Lights) + { + beginPtr->iSet.set = KPISets::KPI4TRAFFICLIGHTS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows5) + { + beginPtr->iSet.set = KPISets::KPI5ARROWS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows5Gray) + { + beginPtr->iSet.set = KPISets::KPI5ARROWSGRAY; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Rating5) + { + beginPtr->iSet.set = KPISets::KPI5RATING; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Quarters5) + { + beginPtr->iSet.set = KPISets::KPI5QUARTERS; + } + + for(auto i:m_arrValues) + ptr->m_arCFVO.push_back(i->toBin()); + return objectPtr; +} void CIconSet::ReadAttributes(XLS::BaseObjectPtr& obj) { if(obj->get_type() == XLS::typeBeginIconSet) @@ -1309,7 +1467,7 @@ const CIconSet CIconSet::Merge(const CIconSet& oPrev, const CIconSet& oCurrent) oIconSet.m_oReverse = Merge( oPrev.m_oReverse, oCurrent.m_oReverse ); oIconSet.m_oShowValue = Merge( oPrev.m_oShowValue, oCurrent.m_oShowValue ); oIconSet.m_oCustom = Merge( oPrev.m_oCustom, oCurrent.m_oCustom ); - + for (size_t i = 0; i < oPrev.m_arrValues.size(); i++) { if (i < oCurrent.m_arrValues.size()) @@ -1383,7 +1541,7 @@ bool CConditionalFormattingRule::isExtended() if (m_oDataBar.IsInit()) return m_oDataBar->isExtended(); if (m_oIconSet.IsInit()) return m_oIconSet->isExtended(); if (m_oColorScale.IsInit()) return m_oColorScale->isExtended(); - + for (size_t i = 0; i < m_arrFormula.size(); i++) { if ((m_arrFormula[i].IsInit()) && m_arrFormula[i]->isExtended()) @@ -1396,7 +1554,7 @@ void CConditionalFormattingRule::toXML2(NSStringUtils::CStringBuilder& writer, b if (false == isValid()) return; std::wstring node_name = bExtendedWrite ? L"x14:cfRule" : L"cfRule"; - + writer.WriteString(L"<" + node_name); WritingStringNullableAttrString(L"type", m_oType, m_oType->ToString()); WritingStringNullableAttrInt(L"priority", m_oPriority, m_oPriority->GetValue()); @@ -1434,7 +1592,7 @@ void CConditionalFormattingRule::toXML2(NSStringUtils::CStringBuilder& writer, b m_oColorScale->toXML2(writer, bExtendedWrite); if (m_oDataBar.IsInit()) m_oDataBar->toXML2(writer, bExtendedWrite); - + for (size_t i = 0; i < m_arrFormula.size(); i++) { if (m_arrFormula[i].IsInit()) @@ -1460,7 +1618,7 @@ void CConditionalFormattingRule::fromXML(XmlUtils::CXmlLiteReader& oReader) while (oReader.ReadNextSiblingNode(nCurDepth)) { std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); - + if (L"colorScale" == sName ) m_oColorScale = oReader; else if ( L"dataBar" == sName) @@ -1559,6 +1717,250 @@ void CConditionalFormattingRule::fromBin(XLS::BaseObjectPtr& obj) } } } + +XLS::BaseObjectPtr CConditionalFormattingRule::toBin(const XLS::CellRef &cellRef) +{ + auto ptr(new XLSB::CFRULE(cellRef)); + XLS::BaseObjectPtr objPtr(ptr); + + ptr->m_BrtBeginCFRule = WriteAttributes(cellRef); + + if(m_oColorScale.IsInit()) + { + ptr->m_source = m_oColorScale->toBin(); + } + else if(m_oDataBar.IsInit()) + { + ptr->m_source = m_oDataBar->toBin(); + } + else if(m_oIconSet.IsInit()) + { + ptr->m_source = m_oIconSet->toBin(); + } + return objPtr; +} + +XLS::BaseObjectPtr CConditionalFormattingRule::WriteAttributes(const XLS::CellRef &cellRef) +{ + + auto ptr(new XLSB::BeginCFRule(cellRef)); + BaseObjectPtr objectPtr(ptr); + + if(m_oDxfId.IsInit()) + { + ptr->dxfId = m_oDxfId->GetValue(); + } + if(m_oPriority.IsInit()) + ptr->iPri = m_oPriority->GetValue(); + if(m_oStopIfTrue.IsInit()) + ptr->fStopTrue = m_oStopIfTrue->GetValue(); + else + ptr->fStopTrue = false; + if(m_oAboveAverage.IsInit()) + ptr->fAbove = m_oAboveAverage->GetValue(); + else + ptr->fAbove = false; + if(m_oBottom.IsInit()) + ptr->fBottom = m_oBottom->GetValue(); + else + ptr->fBottom = false; + if(m_oPercent.IsInit()) + ptr->fPercent = m_oPercent->GetValue(); + else + ptr->fPercent = false; + if(m_oText.IsInit()) + ptr->strParam = m_oText.get(); + else + ptr->strParam = L""; + + if(!m_arrFormula.empty()) + { + ptr->rgce1 = m_arrFormula.front()->m_sText; + m_arrFormula.erase(m_arrFormula.begin()); + ptr->cbFmla1 = 1; + } + else + { + ptr->cbFmla1 = 0; + } + if(!m_arrFormula.empty()) + { + ptr->rgce2 = m_arrFormula.front()->m_sText; + m_arrFormula.erase(m_arrFormula.begin()); + ptr->cbFmla2 = 1; + } + else + { + ptr->cbFmla2 = 0; + } + if(!m_arrFormula.empty()) + { + ptr->rgce3 = m_arrFormula.front()->m_sText; + m_arrFormula.erase(m_arrFormula.begin()); + ptr->cbFmla3 = 1; + } + else + { + ptr->cbFmla3 = 0; + } + +ptr->iType = XLSB::CFType::CF_TYPE_EXPRIS; +ptr->iParam =0; + +if (m_oType == SimpleTypes::Spreadsheet::ECfType::cellIs) +{ + if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_between) + ptr->iParam = XLSB::CFOper::CF_OPER_BN; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_notBetween) + ptr->iParam = XLSB::CFOper::CF_OPER_NB; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_equal) + ptr->iParam = XLSB::CFOper::CF_OPER_EQ; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_notEqual) + ptr->iParam = XLSB::CFOper::CF_OPER_NE; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_greaterThan) + ptr->iParam = XLSB::CFOper::CF_OPER_GT; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_lessThan) + ptr->iParam = XLSB::CFOper::CF_OPER_LT; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_greaterThanOrEqual) + ptr->iParam = XLSB::CFOper::CF_OPER_GE; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_lessThanOrEqual) + ptr->iParam = XLSB::CFOper::CF_OPER_LE; + ptr->iType = XLSB::CFType::CF_TYPE_CELLIS; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_EXPR; +} + +if (m_oType == SimpleTypes::Spreadsheet::ECfType::expression) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_FMLA; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::uniqueValues) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_UNIQUEVALUES; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::containsText) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSTEXT; + ptr->iParam = XLSB::CFTextOper::CF_TEXTOPER_CONTAINS; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::notContainsText) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSTEXT; + ptr->iParam = XLSB::CFTextOper::CF_TEXTOPER_NOTCONTAINS; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::beginsWith) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSTEXT; + ptr->iParam = XLSB::CFTextOper::CF_TEXTOPER_BEGINSWITH; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::endsWith) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSTEXT; + ptr->iParam = XLSB::CFTextOper::CF_TEXTOPER_ENDSWITH; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::containsBlanks) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSBLANKS; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::notContainsBlanks) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSNOBLANKS; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::containsErrors) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSERRORS; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::notContainsErrors) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSNOERRORS; +} + +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::timePeriod) +{ + if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::today) + { + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTODAY; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_TODAY; + } + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::tomorrow) + { + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTOMORROW; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_TOMORROW; + } + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::yesterday) + { + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODYESTERDAY; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_YESTERDAY; + } + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::last7Days) + { + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLAST7DAYS; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_LAST7DAYS; + } + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::lastMonth) + { + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLASTMONTH; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_LASTMONTH; + } + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::nextMonth) + { + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODNEXTMONTH; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_NEXTMONTH; + } + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::thisWeek) + { + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTHISWEEK; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_THISWEEK; + } + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::nextWeek) + { + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODNEXTWEEK; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_NEXTWEEK; + } + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::lastWeek) + { + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLASTWEEK; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_LASTWEEK; + } + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::thisMonth) + { + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTHISMONTH; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_THISMONTH; + } +} + +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::aboveAverage) +{ + ptr->iTemplate= XLSB::CFTemp::CF_TEMPLATE_ABOVEAVERAGE; + ptr->iParam = m_oStdDev->GetValue(); +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::duplicateValues) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_DUPLICATEVALUES; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::colorScale) +{ + ptr->iType = XLSB::CFType::CF_TYPE_GRADIENT; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_GRADIENT; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::dataBar) +{ + ptr->iType = XLSB::CFType::CF_TYPE_DATABAR; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_DATABAR; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::iconSet) +{ + ptr->iType = XLSB::CFType::CF_TYPE_MULTISTATE; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_MULTISTATE; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::top10) +{ + ptr->iType = XLSB::CFType::CF_TYPE_FILTER; + ptr->iParam = m_oRank->GetValue(); + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_FILTER; +} + + return objectPtr; +} template nullable CConditionalFormattingRule::Merge(const nullable &oPrev, const nullable &oCurrent) { @@ -1572,7 +1974,7 @@ nullable CConditionalFormattingRule::Merge(const nullable &oPrev, co const CConditionalFormattingRule CConditionalFormattingRule::Merge(const CConditionalFormattingRule& oPrev, const CConditionalFormattingRule& oCurrent) { CConditionalFormattingRule oRule; - + oRule.m_oAboveAverage = Merge( oPrev.m_oAboveAverage, oCurrent.m_oAboveAverage ); oRule.m_oBottom = Merge( oPrev.m_oBottom, oCurrent.m_oBottom ); oRule.m_oDxfId = Merge( oPrev.m_oDxfId, oCurrent.m_oDxfId ); @@ -1604,7 +2006,7 @@ const CConditionalFormattingRule CConditionalFormattingRule::Merge(const CCondit oRule.m_oColorScale = Merge( oPrev.m_oColorScale, oCurrent.m_oColorScale ); if (oPrev.m_oDataBar.IsInit() && oCurrent.m_oDataBar.IsInit()) - oRule.m_oDataBar = CDataBar::Merge ( oPrev.m_oDataBar.get(), oCurrent.m_oDataBar.get()); + oRule.m_oDataBar = CDataBar::Merge ( oPrev.m_oDataBar.get(), oCurrent.m_oDataBar.get()); else oRule.m_oDataBar = Merge( oPrev.m_oDataBar, oCurrent.m_oDataBar ); @@ -2129,7 +2531,7 @@ bool CConditionalFormatting::IsExtended() { m_bIsExtended = false; m_bIsValid = false; - + if (m_oSqRef.IsInit() == false) return m_bIsExtended; m_bIsValid = true; @@ -2137,7 +2539,7 @@ bool CConditionalFormatting::IsExtended() for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( !m_arrItems[i]) continue; - + if (m_arrItems[i]->isValid() == false) m_bIsValid = false; if (m_arrItems[i]->isExtended() == true) @@ -2146,7 +2548,7 @@ bool CConditionalFormatting::IsExtended() return m_bIsExtended; } void CConditionalFormatting::toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const -{ +{ std::wstring node_name = bExtendedWrite ? L"x14:conditionalFormatting" : L"conditionalFormatting"; writer.WriteString(L"<" + node_name); @@ -2163,7 +2565,7 @@ void CConditionalFormatting::toXML2(NSStringUtils::CStringBuilder& writer, bool writer.WriteString(L" pivot=\"1\""); } writer.WriteString(L">"); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -2226,6 +2628,38 @@ void CConditionalFormatting::fromBin(XLS::BaseObjectPtr& obj) m_arrItems.push_back(new CConditionalFormattingRule(pCFRULE14)); } } + +XLS::BaseObjectPtr CConditionalFormatting::toBin() +{ + XLS::BaseObjectPtr objectPtr; + if(m_arrItems.empty()) + { + return objectPtr; + } + + auto ptr(new XLSB::CONDITIONALFORMATTING); + objectPtr = XLS::BaseObjectPtr{ptr}; + XLS::CellRef formatingfirstCell; + if(m_oSqRef.IsInit()) + { + auto conditionPtr(new XLSB::BeginConditionalFormatting);// + ptr->m_BrtBeginConditionalFormatting = XLS::BaseObjectPtr{conditionPtr}; + conditionPtr->ccf = m_arrItems.size(); + conditionPtr->sqrfx.strValue = m_oSqRef.get(); + if(m_oPivot.IsInit()) + conditionPtr->fPivot = m_oPivot->GetValue(); + else + conditionPtr->fPivot = false; + formatingfirstCell = conditionPtr->sqrfx.getLocationFirstCell(); + + } + for(auto i: m_arrItems) + { + ptr->m_arCFRULE.push_back(i->toBin(formatingfirstCell)); + } + + return objectPtr; +} bool CConditionalFormatting::IsUsage() { for ( size_t i = 0; i < m_arrItems.size(); ++i) diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h index 14d011972b..cb0ab73bc6 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h @@ -33,6 +33,7 @@ #include "../WritingElement.h" #include "../../Base/Nullable.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h" namespace SimpleTypes { @@ -106,6 +107,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; bool isExtended (); @@ -166,6 +168,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -199,6 +202,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -214,7 +218,7 @@ namespace OOX nullable m_oMaxLength; nullable m_oMinLength; nullable m_oShowValue; - + nullable m_oColor; std::vector> m_arrValues; @@ -229,7 +233,7 @@ namespace OOX nullable m_oAxisColor; nullable m_oBorderColor; - + nullable m_oNegativeFillColor; nullable m_oNegativeBorderColor; }; @@ -251,6 +255,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -295,6 +300,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(const XLS::CellRef &cellRef); virtual EElementType getType () const; bool isValid () const; @@ -306,6 +312,8 @@ namespace OOX private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr WriteAttributes(const XLS::CellRef &cellRef); + public: nullable m_oDxf; @@ -323,7 +331,7 @@ namespace OOX nullable m_oText; nullable m_oTimePeriod; nullable m_oType; - + nullable m_oExtLst; nullable_string m_oExtId; @@ -353,10 +361,11 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; bool IsUsage(); - + private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); diff --git a/OOXML/XlsxFormat/Worksheets/DataValidation.cpp b/OOXML/XlsxFormat/Worksheets/DataValidation.cpp index 5e759fa986..fb9b99a69e 100644 --- a/OOXML/XlsxFormat/Worksheets/DataValidation.cpp +++ b/OOXML/XlsxFormat/Worksheets/DataValidation.cpp @@ -212,6 +212,108 @@ xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">"); return result1 || result2; } + XLS::BaseObjectPtr CDataValidation::toBin() + { + auto ptr(new XLSB::DVal); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oType.IsInit()) + { + if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeNone) + ptr->valType = XLS::typeDvNone; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeWhole) + ptr->valType = XLS::typeDvWhole; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeDecimal) + ptr->valType = XLS::typeDvDecimal; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeList) + ptr->valType = XLS::typeDvList; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeDate) + ptr->valType = XLS::typeDvDate; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeTime) + ptr->valType = XLS::typeDvTime; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeTextLength) + ptr->valType = XLS::typeDvTextLength; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeCustom) + ptr->valType = XLS::typeDvCustom; + else + ptr->valType = XLS::typeDvNone; + } + else + ptr->valType = XLS::typeDvNone; + ptr->fAllowBlank = m_oAllowBlank->GetValue(); + if(m_oError.IsInit()) + ptr->Error = m_oError.get(); + + if (m_oErrorTitle.IsInit()) + ptr->ErrorTitle = m_oErrorTitle.get(); + + if (m_oPrompt.IsInit()) + ptr->Prompt = m_oPrompt.get(); + + if (m_oPromptTitle.IsInit()) + ptr->PromptTitle = m_oPromptTitle.get(); + if(m_oErrorStyle.IsInit()) + ptr->errStyle = m_oErrorStyle->GetValue(); + else + ptr->errStyle = 0; + if(m_oImeMode.IsInit()) + { + if(m_oImeMode == SimpleTypes::Spreadsheet::EDataValidationImeMode::imeModeOn) + { + ptr->mdImeMode = 0x01; + } + else if(m_oImeMode == SimpleTypes::Spreadsheet::EDataValidationImeMode::imeModeOff) + { + ptr->mdImeMode = 0x02; + } + else + { + ptr->mdImeMode = m_oImeMode->GetValue(); + } + } + else + ptr->mdImeMode = 0; + if(m_oOperator.IsInit()) + { + if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorBetween) + ptr->typOperator = XLS::_typOperatorDv::operatorDvBetween; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorNotBetween) + ptr->typOperator = XLS::_typOperatorDv::operatorDvNotBetween; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorEqual) + ptr->typOperator = XLS::_typOperatorDv::operatorDvEquals; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorNotEqual) + ptr->typOperator = XLS::_typOperatorDv::operatorDvNotEquals; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorGreaterThan) + ptr->typOperator = XLS::_typOperatorDv::operatorDvGreaterThan; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorLessThan) + ptr->typOperator = XLS::_typOperatorDv::operatorDvLessThan; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorGreaterThanOrEqual) + ptr->typOperator = XLS::_typOperatorDv::operatorDvGreaterThanOrEqual; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorLessThanOrEqual) + ptr->typOperator = XLS::_typOperatorDv::operatorDvLessThanOrEqual; + } + + if(m_oShowDropDown.IsInit()) + ptr->fSuppressCombo = m_oShowDropDown->GetValue(); + else + ptr->fSuppressCombo = false; + if(m_oShowErrorMessage.IsInit()) + ptr->fShowErrorMsg = m_oShowErrorMessage->GetValue(); + else + ptr->fShowErrorMsg = false; + if(m_oShowInputMessage.IsInit()) + ptr->fShowInputMsg = m_oShowInputMessage->GetValue(); + else + ptr->fShowInputMsg = false; + if(m_oSqRef.IsInit()) + ptr->sqrfx.strValue = m_oSqRef.get(); + + if(m_oFormula1.IsInit()) + ptr->formula1 = m_oFormula1->m_sText; + if(m_oFormula2.IsInit()) + ptr->formula2 = m_oFormula2->m_sText; + + return objectPtr; + } void CDataValidation::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -516,6 +618,35 @@ xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">"); } m_oCount = m_arrItems.size(); } + XLS::BaseObjectPtr CDataValidations::toBin() + { + XLS::BaseObjectPtr objectPtr; + auto ptr(new XLSB::DVALS); + objectPtr = XLS::BaseObjectPtr{ptr}; + + auto beginPtr(new XLSB::BeginDVals); + ptr->m_BrtBeginDVals = XLS::BaseObjectPtr{beginPtr}; + beginPtr->dVals.idvMac = m_arrItems.size(); + if(m_oDisablePrompts.IsInit()) + beginPtr->dVals.fWnClosed = m_oDisablePrompts->GetValue(); + else + beginPtr->dVals.fWnClosed = false; + if(m_oXWindow.IsInit()) + beginPtr->dVals.xLeft = m_oXWindow->GetValue(); + else + beginPtr->dVals.xLeft = 0; + if(m_oYWindow.IsInit()) + beginPtr->dVals.yTop = m_oYWindow->GetValue(); + else + beginPtr->dVals.yTop = false; + + for(auto i:m_arrItems) + { + ptr->m_arBrtDVal.push_back(i->toBin()); + } + + return objectPtr; + } void CDataValidations::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) diff --git a/OOXML/XlsxFormat/Worksheets/DataValidation.h b/OOXML/XlsxFormat/Worksheets/DataValidation.h index 32084f50cd..ef29895d7f 100644 --- a/OOXML/XlsxFormat/Worksheets/DataValidation.h +++ b/OOXML/XlsxFormat/Worksheets/DataValidation.h @@ -63,10 +63,10 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; - void toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const; + void toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const; virtual void toXML(NSStringUtils::CStringBuilder& writer) const; - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); virtual EElementType getType () const; std::wstring m_sNodeName; @@ -92,6 +92,7 @@ namespace OOX bool IsExtended(); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -135,6 +136,7 @@ namespace OOX void toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Worksheets/Hyperlinks.h b/OOXML/XlsxFormat/Worksheets/Hyperlinks.h index a04c61a30b..1e548d960d 100644 --- a/OOXML/XlsxFormat/Worksheets/Hyperlinks.h +++ b/OOXML/XlsxFormat/Worksheets/Hyperlinks.h @@ -59,6 +59,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -90,6 +91,8 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); + virtual EElementType getType () const; }; diff --git a/OOXML/XlsxFormat/Worksheets/MergeCells.cpp b/OOXML/XlsxFormat/Worksheets/MergeCells.cpp index 4d0cfd3446..b677a0291a 100644 --- a/OOXML/XlsxFormat/Worksheets/MergeCells.cpp +++ b/OOXML/XlsxFormat/Worksheets/MergeCells.cpp @@ -34,6 +34,8 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../XlsbFormat/Biff12_records/MergeCell.h" +#include "../../XlsbFormat/Biff12_records/BeginMergeCells.h" +#include "../../XlsbFormat/Biff12_unions/MERGECELLS.h" namespace OOX { @@ -69,6 +71,13 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CMergeCell::toBin() + { + auto castedPtr(new XLSB::MergeCell); + XLS::BaseObjectPtr ptr(castedPtr); + castedPtr->rfx = m_oRef.get(); + return ptr; + } EElementType CMergeCell::getType () const { return et_x_MergeCell; @@ -152,6 +161,19 @@ namespace OOX pMergeCell->fromBin(mergeCell); } } + XLS::BaseObjectPtr CMergeCells::toBin() + { + auto castedPtr(new XLSB::MERGECELLS); + auto beginCells(new XLSB::BeginMergeCells); + castedPtr->m_BrtBeginMergeCells = XLS::BaseObjectPtr{beginCells}; + XLS::BaseObjectPtr ptr(castedPtr); + for(auto i:m_arrItems) + { + castedPtr->m_arBrtMergeCell.push_back(i->toBin()); + } + beginCells->cmcs = castedPtr->m_arBrtMergeCell.size(); + return ptr; + } EElementType CMergeCells::getType () const { return et_x_MergeCells; diff --git a/OOXML/XlsxFormat/Worksheets/MergeCells.h b/OOXML/XlsxFormat/Worksheets/MergeCells.h index c761e0ea75..ce9064f602 100644 --- a/OOXML/XlsxFormat/Worksheets/MergeCells.h +++ b/OOXML/XlsxFormat/Worksheets/MergeCells.h @@ -59,6 +59,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -83,6 +84,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(std::vector& obj); virtual EElementType getType () const; diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index da61370bf0..5bb3bc109e 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -62,34 +62,44 @@ #include "../../XlsbFormat/Biff12_records/Cell.h" #include "../../XlsbFormat/Biff12_records/Fmla.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BIFF12/CellRef.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgArea.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExp.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExtraCol.h" #include #include #include +#ifndef MININT32 +#define MAXUINT32 ((uint32_t)~((uint32_t)0)) +#define MAXINT32 ((int32_t)(MAXUINT32 >> 1)) +#define MININT32 ((int32_t)~MAXINT32) +#endif + using namespace XLS; namespace OOX { namespace Spreadsheet { - static const wchar_t* m_aLetters[] = - { - L"A", L"B", L"C", L"D", L"E", L"F", L"G", L"H", L"I", L"J", L"K", L"L", L"M", L"N", L"O", L"P", L"Q", L"R", L"S", L"T", L"U", L"V", L"W", L"X", L"Y", L"Z", L"AA", L"AB", L"AC", L"AD", L"AE", L"AF", L"AG", L"AH", L"AI", L"AJ", L"AK", L"AL", L"AM", L"AN", L"AO", L"AP", L"AQ", L"AR", L"AS", L"AT", L"AU", L"AV", L"AW", L"AX", L"AY", L"AZ", L"BA", L"BB", L"BC", L"BD", L"BE", L"BF", L"BG", L"BH", L"BI", L"BJ", L"BK", L"BL", L"BM", L"BN", L"BO", L"BP", L"BQ", L"BR", L"BS", L"BT", L"BU", L"BV", L"BW", L"BX", L"BY", L"BZ", L"CA", L"CB", L"CC", L"CD", L"CE", L"CF", L"CG", L"CH", L"CI", L"CJ", L"CK", L"CL", L"CM", L"CN", L"CO", L"CP", L"CQ", L"CR", L"CS", L"CT", L"CU", L"CV", L"CW", L"CX", L"CY", L"CZ", L"DA", L"DB", L"DC", L"DD", L"DE", L"DF", L"DG", L"DH", L"DI", L"DJ", L"DK", L"DL", L"DM", L"DN", L"DO", L"DP", L"DQ", L"DR", L"DS", L"DT", L"DU", L"DV", L"DW", L"DX", L"DY", L"DZ", L"EA", L"EB", L"EC", L"ED", L"EE", L"EF", L"EG", L"EH", L"EI", L"EJ", L"EK", L"EL", L"EM", L"EN", L"EO", L"EP", L"EQ", L"ER", L"ES", L"ET", L"EU", L"EV", L"EW", L"EX", L"EY", L"EZ", L"FA", L"FB", L"FC", L"FD", L"FE", L"FF", L"FG", L"FH", L"FI", L"FJ", L"FK", L"FL", L"FM", L"FN", L"FO", L"FP", L"FQ", L"FR", L"FS", L"FT", L"FU", L"FV", L"FW", L"FX", L"FY", L"FZ", L"GA", L"GB", L"GC", L"GD", L"GE", L"GF", L"GG", L"GH", L"GI", L"GJ", L"GK", L"GL", L"GM", L"GN", L"GO", L"GP", L"GQ", L"GR", L"GS", L"GT", L"GU", L"GV", L"GW", L"GX", L"GY", L"GZ", L"HA", L"HB", L"HC", L"HD", L"HE", L"HF", L"HG", L"HH", L"HI", L"HJ", L"HK", L"HL", L"HM", L"HN", L"HO", L"HP", L"HQ", L"HR", L"HS", L"HT", L"HU", L"HV", L"HW", L"HX", L"HY", L"HZ", L"IA", L"IB", L"IC", L"ID", L"IE", L"IF", L"IG", L"IH", L"II", L"IJ", L"IK", L"IL", L"IM", L"IN", L"IO", L"IP", L"IQ", L"IR", L"IS", L"IT", L"IU", L"IV", L"IW", L"IX", L"IY", L"IZ", L"JA", L"JB", L"JC", L"JD", L"JE", L"JF", L"JG", L"JH", L"JI", L"JJ", L"JK", L"JL", L"JM", L"JN", L"JO", L"JP", L"JQ", L"JR", L"JS", L"JT", L"JU", L"JV", L"JW", L"JX", L"JY", L"JZ", L"KA", L"KB", L"KC", L"KD", L"KE", L"KF", L"KG", L"KH", L"KI", L"KJ", L"KK", L"KL", L"KM", L"KN", L"KO", L"KP", L"KQ", L"KR", L"KS", L"KT", L"KU", L"KV", L"KW", L"KX", L"KY", L"KZ", L"LA", L"LB", L"LC", L"LD", L"LE", L"LF", L"LG", L"LH", L"LI", L"LJ", L"LK", L"LL", L"LM", L"LN", L"LO", L"LP", L"LQ", L"LR", L"LS", L"LT", L"LU", L"LV", L"LW", L"LX", L"LY", L"LZ", L"MA", L"MB", L"MC", L"MD", L"ME", L"MF", L"MG", L"MH", L"MI", L"MJ", L"MK", L"ML", L"MM", L"MN", L"MO", L"MP", L"MQ", L"MR", L"MS", L"MT", L"MU", L"MV", L"MW", L"MX", L"MY", L"MZ", L"NA", L"NB", L"NC", L"ND", L"NE", L"NF", L"NG", L"NH", L"NI", L"NJ", L"NK", L"NL", L"NM", L"NN", L"NO", L"NP", L"NQ", L"NR", L"NS", L"NT", L"NU", L"NV", L"NW", L"NX", L"NY", L"NZ", L"OA", L"OB", L"OC", L"OD", L"OE", L"OF", L"OG", L"OH", L"OI", L"OJ", L"OK", L"OL", L"OM", L"ON", L"OO", L"OP", L"OQ", L"OR", L"OS", L"OT", L"OU", L"OV", L"OW", L"OX", L"OY", L"OZ", L"PA", L"PB", L"PC", L"PD", L"PE", L"PF", L"PG", L"PH", L"PI", L"PJ", L"PK", L"PL", L"PM", L"PN", L"PO", L"PP", L"PQ", L"PR", L"PS", L"PT", L"PU", L"PV", L"PW", L"PX", L"PY", L"PZ", L"QA", L"QB", L"QC", L"QD", L"QE", L"QF", L"QG", L"QH", L"QI", L"QJ", L"QK", L"QL", L"QM", L"QN", L"QO", L"QP", L"QQ", L"QR", L"QS", L"QT", L"QU", L"QV", L"QW", L"QX", L"QY", L"QZ", L"RA", L"RB", L"RC", L"RD", L"RE", L"RF", L"RG", L"RH", L"RI", L"RJ", L"RK", L"RL", L"RM", L"RN", L"RO", L"RP", L"RQ", L"RR", L"RS", L"RT", L"RU", L"RV", L"RW", L"RX", L"RY", L"RZ", L"SA", L"SB", L"SC", L"SD", L"SE", L"SF", L"SG", L"SH", L"SI", L"SJ", L"SK", L"SL", L"SM", L"SN", L"SO", L"SP", L"SQ", L"SR", L"SS", L"ST", L"SU", L"SV", L"SW", L"SX", L"SY", L"SZ", L"TA", L"TB", L"TC", L"TD", L"TE", L"TF", L"TG", L"TH", L"TI", L"TJ", L"TK", L"TL", L"TM", L"TN", L"TO", L"TP", L"TQ", L"TR", L"TS", L"TT", L"TU", L"TV", L"TW", L"TX", L"TY", L"TZ", L"UA", L"UB", L"UC", L"UD", L"UE", L"UF", L"UG", L"UH", L"UI", L"UJ", L"UK", L"UL", L"UM", L"UN", L"UO", L"UP", L"UQ", L"UR", L"US", L"UT", L"UU", L"UV", L"UW", L"UX", L"UY", L"UZ", L"VA", L"VB", L"VC", L"VD", L"VE", L"VF", L"VG", L"VH", L"VI", L"VJ", L"VK", L"VL", L"VM", L"VN", L"VO", L"VP", L"VQ", L"VR", L"VS", L"VT", L"VU", L"VV", L"VW", L"VX", L"VY", L"VZ", L"WA", L"WB", L"WC", L"WD", L"WE", L"WF", L"WG", L"WH", L"WI", L"WJ", L"WK", L"WL", L"WM", L"WN", L"WO", L"WP", L"WQ", L"WR", L"WS", L"WT", L"WU", L"WV", L"WW", L"WX", L"WY", - L"WZ", L"XA", L"XB", L"XC", L"XD", L"XE", L"XF", L"XG", L"XH", L"XI", L"XJ", L"XK", L"XL", L"XM", L"XN", L"XO", L"XP", L"XQ", L"XR", L"XS", L"XT", L"XU", L"XV", L"XW", L"XX", L"XY", L"XZ", L"YA", L"YB", L"YC", L"YD", L"YE", L"YF", L"YG", L"YH", L"YI", L"YJ", L"YK", L"YL", L"YM", L"YN", L"YO", L"YP", L"YQ", L"YR", L"YS", L"YT", L"YU", L"YV", L"YW", L"YX", L"YY", L"YZ", L"ZA", L"ZB", L"ZC", L"ZD", L"ZE", L"ZF", L"ZG", L"ZH", L"ZI", L"ZJ", L"ZK", L"ZL", L"ZM", L"ZN", L"ZO", L"ZP", L"ZQ", L"ZR", L"ZS", L"ZT", L"ZU", L"ZV", L"ZW", L"ZX", L"ZY", L"ZZ", L"AAA", L"AAB", L"AAC", L"AAD", L"AAE", L"AAF", L"AAG", L"AAH", L"AAI", L"AAJ", L"AAK", L"AAL", L"AAM", L"AAN", L"AAO", L"AAP", L"AAQ", L"AAR", L"AAS", L"AAT", L"AAU", L"AAV", L"AAW", L"AAX", L"AAY", L"AAZ", L"ABA", L"ABB", L"ABC", L"ABD", L"ABE", L"ABF", L"ABG", L"ABH", L"ABI", L"ABJ", L"ABK", L"ABL", L"ABM", L"ABN", L"ABO", L"ABP", L"ABQ", L"ABR", L"ABS", L"ABT", L"ABU", L"ABV", L"ABW", L"ABX", L"ABY", L"ABZ", L"ACA", L"ACB", L"ACC", L"ACD", L"ACE", L"ACF", L"ACG", L"ACH", L"ACI", L"ACJ", L"ACK", L"ACL", L"ACM", L"ACN", L"ACO", L"ACP", L"ACQ", L"ACR", L"ACS", L"ACT", L"ACU", L"ACV", L"ACW", L"ACX", L"ACY", L"ACZ", L"ADA", L"ADB", L"ADC", L"ADD", L"ADE", L"ADF", L"ADG", L"ADH", L"ADI", L"ADJ", L"ADK", L"ADL", L"ADM", L"ADN", L"ADO", L"ADP", L"ADQ", L"ADR", L"ADS", L"ADT", L"ADU", L"ADV", L"ADW", L"ADX", L"ADY", L"ADZ", L"AEA", L"AEB", L"AEC", L"AED", L"AEE", L"AEF", L"AEG", L"AEH", L"AEI", L"AEJ", L"AEK", L"AEL", L"AEM", L"AEN", L"AEO", L"AEP", L"AEQ", L"AER", L"AES", L"AET", L"AEU", L"AEV", L"AEW", L"AEX", L"AEY", L"AEZ", L"AFA", L"AFB", L"AFC", L"AFD", L"AFE", L"AFF", L"AFG", L"AFH", L"AFI", L"AFJ", L"AFK", L"AFL", L"AFM", L"AFN", L"AFO", L"AFP", L"AFQ", L"AFR", L"AFS", L"AFT", L"AFU", L"AFV", L"AFW", L"AFX", L"AFY", L"AFZ", L"AGA", L"AGB", L"AGC", L"AGD", L"AGE", L"AGF", L"AGG", L"AGH", L"AGI", L"AGJ", L"AGK", L"AGL", L"AGM", L"AGN", L"AGO", L"AGP", L"AGQ", L"AGR", L"AGS", L"AGT", L"AGU", L"AGV", L"AGW", L"AGX", L"AGY", L"AGZ", L"AHA", L"AHB", L"AHC", L"AHD", L"AHE", L"AHF", L"AHG", L"AHH", L"AHI", L"AHJ", L"AHK", L"AHL", L"AHM", L"AHN", L"AHO", L"AHP", L"AHQ", L"AHR", L"AHS", L"AHT", L"AHU", L"AHV", + static const wchar_t* m_aLetters[] = + { + L"A", L"B", L"C", L"D", L"E", L"F", L"G", L"H", L"I", L"J", L"K", L"L", L"M", L"N", L"O", L"P", L"Q", L"R", L"S", L"T", L"U", L"V", L"W", L"X", L"Y", L"Z", L"AA", L"AB", L"AC", L"AD", L"AE", L"AF", L"AG", L"AH", L"AI", L"AJ", L"AK", L"AL", L"AM", L"AN", L"AO", L"AP", L"AQ", L"AR", L"AS", L"AT", L"AU", L"AV", L"AW", L"AX", L"AY", L"AZ", L"BA", L"BB", L"BC", L"BD", L"BE", L"BF", L"BG", L"BH", L"BI", L"BJ", L"BK", L"BL", L"BM", L"BN", L"BO", L"BP", L"BQ", L"BR", L"BS", L"BT", L"BU", L"BV", L"BW", L"BX", L"BY", L"BZ", L"CA", L"CB", L"CC", L"CD", L"CE", L"CF", L"CG", L"CH", L"CI", L"CJ", L"CK", L"CL", L"CM", L"CN", L"CO", L"CP", L"CQ", L"CR", L"CS", L"CT", L"CU", L"CV", L"CW", L"CX", L"CY", L"CZ", L"DA", L"DB", L"DC", L"DD", L"DE", L"DF", L"DG", L"DH", L"DI", L"DJ", L"DK", L"DL", L"DM", L"DN", L"DO", L"DP", L"DQ", L"DR", L"DS", L"DT", L"DU", L"DV", L"DW", L"DX", L"DY", L"DZ", L"EA", L"EB", L"EC", L"ED", L"EE", L"EF", L"EG", L"EH", L"EI", L"EJ", L"EK", L"EL", L"EM", L"EN", L"EO", L"EP", L"EQ", L"ER", L"ES", L"ET", L"EU", L"EV", L"EW", L"EX", L"EY", L"EZ", L"FA", L"FB", L"FC", L"FD", L"FE", L"FF", L"FG", L"FH", L"FI", L"FJ", L"FK", L"FL", L"FM", L"FN", L"FO", L"FP", L"FQ", L"FR", L"FS", L"FT", L"FU", L"FV", L"FW", L"FX", L"FY", L"FZ", L"GA", L"GB", L"GC", L"GD", L"GE", L"GF", L"GG", L"GH", L"GI", L"GJ", L"GK", L"GL", L"GM", L"GN", L"GO", L"GP", L"GQ", L"GR", L"GS", L"GT", L"GU", L"GV", L"GW", L"GX", L"GY", L"GZ", L"HA", L"HB", L"HC", L"HD", L"HE", L"HF", L"HG", L"HH", L"HI", L"HJ", L"HK", L"HL", L"HM", L"HN", L"HO", L"HP", L"HQ", L"HR", L"HS", L"HT", L"HU", L"HV", L"HW", L"HX", L"HY", L"HZ", L"IA", L"IB", L"IC", L"ID", L"IE", L"IF", L"IG", L"IH", L"II", L"IJ", L"IK", L"IL", L"IM", L"IN", L"IO", L"IP", L"IQ", L"IR", L"IS", L"IT", L"IU", L"IV", L"IW", L"IX", L"IY", L"IZ", L"JA", L"JB", L"JC", L"JD", L"JE", L"JF", L"JG", L"JH", L"JI", L"JJ", L"JK", L"JL", L"JM", L"JN", L"JO", L"JP", L"JQ", L"JR", L"JS", L"JT", L"JU", L"JV", L"JW", L"JX", L"JY", L"JZ", L"KA", L"KB", L"KC", L"KD", L"KE", L"KF", L"KG", L"KH", L"KI", L"KJ", L"KK", L"KL", L"KM", L"KN", L"KO", L"KP", L"KQ", L"KR", L"KS", L"KT", L"KU", L"KV", L"KW", L"KX", L"KY", L"KZ", L"LA", L"LB", L"LC", L"LD", L"LE", L"LF", L"LG", L"LH", L"LI", L"LJ", L"LK", L"LL", L"LM", L"LN", L"LO", L"LP", L"LQ", L"LR", L"LS", L"LT", L"LU", L"LV", L"LW", L"LX", L"LY", L"LZ", L"MA", L"MB", L"MC", L"MD", L"ME", L"MF", L"MG", L"MH", L"MI", L"MJ", L"MK", L"ML", L"MM", L"MN", L"MO", L"MP", L"MQ", L"MR", L"MS", L"MT", L"MU", L"MV", L"MW", L"MX", L"MY", L"MZ", L"NA", L"NB", L"NC", L"ND", L"NE", L"NF", L"NG", L"NH", L"NI", L"NJ", L"NK", L"NL", L"NM", L"NN", L"NO", L"NP", L"NQ", L"NR", L"NS", L"NT", L"NU", L"NV", L"NW", L"NX", L"NY", L"NZ", L"OA", L"OB", L"OC", L"OD", L"OE", L"OF", L"OG", L"OH", L"OI", L"OJ", L"OK", L"OL", L"OM", L"ON", L"OO", L"OP", L"OQ", L"OR", L"OS", L"OT", L"OU", L"OV", L"OW", L"OX", L"OY", L"OZ", L"PA", L"PB", L"PC", L"PD", L"PE", L"PF", L"PG", L"PH", L"PI", L"PJ", L"PK", L"PL", L"PM", L"PN", L"PO", L"PP", L"PQ", L"PR", L"PS", L"PT", L"PU", L"PV", L"PW", L"PX", L"PY", L"PZ", L"QA", L"QB", L"QC", L"QD", L"QE", L"QF", L"QG", L"QH", L"QI", L"QJ", L"QK", L"QL", L"QM", L"QN", L"QO", L"QP", L"QQ", L"QR", L"QS", L"QT", L"QU", L"QV", L"QW", L"QX", L"QY", L"QZ", L"RA", L"RB", L"RC", L"RD", L"RE", L"RF", L"RG", L"RH", L"RI", L"RJ", L"RK", L"RL", L"RM", L"RN", L"RO", L"RP", L"RQ", L"RR", L"RS", L"RT", L"RU", L"RV", L"RW", L"RX", L"RY", L"RZ", L"SA", L"SB", L"SC", L"SD", L"SE", L"SF", L"SG", L"SH", L"SI", L"SJ", L"SK", L"SL", L"SM", L"SN", L"SO", L"SP", L"SQ", L"SR", L"SS", L"ST", L"SU", L"SV", L"SW", L"SX", L"SY", L"SZ", L"TA", L"TB", L"TC", L"TD", L"TE", L"TF", L"TG", L"TH", L"TI", L"TJ", L"TK", L"TL", L"TM", L"TN", L"TO", L"TP", L"TQ", L"TR", L"TS", L"TT", L"TU", L"TV", L"TW", L"TX", L"TY", L"TZ", L"UA", L"UB", L"UC", L"UD", L"UE", L"UF", L"UG", L"UH", L"UI", L"UJ", L"UK", L"UL", L"UM", L"UN", L"UO", L"UP", L"UQ", L"UR", L"US", L"UT", L"UU", L"UV", L"UW", L"UX", L"UY", L"UZ", L"VA", L"VB", L"VC", L"VD", L"VE", L"VF", L"VG", L"VH", L"VI", L"VJ", L"VK", L"VL", L"VM", L"VN", L"VO", L"VP", L"VQ", L"VR", L"VS", L"VT", L"VU", L"VV", L"VW", L"VX", L"VY", L"VZ", L"WA", L"WB", L"WC", L"WD", L"WE", L"WF", L"WG", L"WH", L"WI", L"WJ", L"WK", L"WL", L"WM", L"WN", L"WO", L"WP", L"WQ", L"WR", L"WS", L"WT", L"WU", L"WV", L"WW", L"WX", L"WY", + L"WZ", L"XA", L"XB", L"XC", L"XD", L"XE", L"XF", L"XG", L"XH", L"XI", L"XJ", L"XK", L"XL", L"XM", L"XN", L"XO", L"XP", L"XQ", L"XR", L"XS", L"XT", L"XU", L"XV", L"XW", L"XX", L"XY", L"XZ", L"YA", L"YB", L"YC", L"YD", L"YE", L"YF", L"YG", L"YH", L"YI", L"YJ", L"YK", L"YL", L"YM", L"YN", L"YO", L"YP", L"YQ", L"YR", L"YS", L"YT", L"YU", L"YV", L"YW", L"YX", L"YY", L"YZ", L"ZA", L"ZB", L"ZC", L"ZD", L"ZE", L"ZF", L"ZG", L"ZH", L"ZI", L"ZJ", L"ZK", L"ZL", L"ZM", L"ZN", L"ZO", L"ZP", L"ZQ", L"ZR", L"ZS", L"ZT", L"ZU", L"ZV", L"ZW", L"ZX", L"ZY", L"ZZ", L"AAA", L"AAB", L"AAC", L"AAD", L"AAE", L"AAF", L"AAG", L"AAH", L"AAI", L"AAJ", L"AAK", L"AAL", L"AAM", L"AAN", L"AAO", L"AAP", L"AAQ", L"AAR", L"AAS", L"AAT", L"AAU", L"AAV", L"AAW", L"AAX", L"AAY", L"AAZ", L"ABA", L"ABB", L"ABC", L"ABD", L"ABE", L"ABF", L"ABG", L"ABH", L"ABI", L"ABJ", L"ABK", L"ABL", L"ABM", L"ABN", L"ABO", L"ABP", L"ABQ", L"ABR", L"ABS", L"ABT", L"ABU", L"ABV", L"ABW", L"ABX", L"ABY", L"ABZ", L"ACA", L"ACB", L"ACC", L"ACD", L"ACE", L"ACF", L"ACG", L"ACH", L"ACI", L"ACJ", L"ACK", L"ACL", L"ACM", L"ACN", L"ACO", L"ACP", L"ACQ", L"ACR", L"ACS", L"ACT", L"ACU", L"ACV", L"ACW", L"ACX", L"ACY", L"ACZ", L"ADA", L"ADB", L"ADC", L"ADD", L"ADE", L"ADF", L"ADG", L"ADH", L"ADI", L"ADJ", L"ADK", L"ADL", L"ADM", L"ADN", L"ADO", L"ADP", L"ADQ", L"ADR", L"ADS", L"ADT", L"ADU", L"ADV", L"ADW", L"ADX", L"ADY", L"ADZ", L"AEA", L"AEB", L"AEC", L"AED", L"AEE", L"AEF", L"AEG", L"AEH", L"AEI", L"AEJ", L"AEK", L"AEL", L"AEM", L"AEN", L"AEO", L"AEP", L"AEQ", L"AER", L"AES", L"AET", L"AEU", L"AEV", L"AEW", L"AEX", L"AEY", L"AEZ", L"AFA", L"AFB", L"AFC", L"AFD", L"AFE", L"AFF", L"AFG", L"AFH", L"AFI", L"AFJ", L"AFK", L"AFL", L"AFM", L"AFN", L"AFO", L"AFP", L"AFQ", L"AFR", L"AFS", L"AFT", L"AFU", L"AFV", L"AFW", L"AFX", L"AFY", L"AFZ", L"AGA", L"AGB", L"AGC", L"AGD", L"AGE", L"AGF", L"AGG", L"AGH", L"AGI", L"AGJ", L"AGK", L"AGL", L"AGM", L"AGN", L"AGO", L"AGP", L"AGQ", L"AGR", L"AGS", L"AGT", L"AGU", L"AGV", L"AGW", L"AGX", L"AGY", L"AGZ", L"AHA", L"AHB", L"AHC", L"AHD", L"AHE", L"AHF", L"AHG", L"AHH", L"AHI", L"AHJ", L"AHK", L"AHL", L"AHM", L"AHN", L"AHO", L"AHP", L"AHQ", L"AHR", L"AHS", L"AHT", L"AHU", L"AHV", L"AHW", L"AHX", L"AHY", L"AHZ", L"AIA", L"AIB", L"AIC", L"AID", L"AIE", L"AIF", L"AIG", L"AIH", L"AII", L"AIJ", L"AIK", L"AIL", L"AIM", L"AIN", L"AIO", L"AIP", L"AIQ", L"AIR", L"AIS", L"AIT", L"AIU", L"AIV", L"AIW", L"AIX", L"AIY", L"AIZ", L"AJA", L"AJB", L"AJC", L"AJD", L"AJE", L"AJF", L"AJG", L"AJH", L"AJI", L"AJJ", L"AJK", L"AJL", L"AJM", L"AJN", L"AJO", L"AJP", L"AJQ", L"AJR", L"AJS", L"AJT", L"AJU", L"AJV", L"AJW", L"AJX", L"AJY", L"AJZ", L"AKA", L"AKB", L"AKC", L"AKD", L"AKE", L"AKF", L"AKG", L"AKH", L"AKI", L"AKJ", L"AKK", L"AKL", L"AKM", L"AKN", L"AKO", L"AKP", L"AKQ", L"AKR", L"AKS", L"AKT", L"AKU", L"AKV", L"AKW", L"AKX", L"AKY", L"AKZ", L"ALA", L"ALB", L"ALC", L"ALD", L"ALE", L"ALF", L"ALG", L"ALH", L"ALI", L"ALJ", L"ALK", L"ALL", L"ALM", L"ALN", L"ALO", L"ALP", L"ALQ", L"ALR", L"ALS", L"ALT", L"ALU", L"ALV", L"ALW", L"ALX", L"ALY", L"ALZ", L"AMA", L"AMB", L"AMC", L"AMD", L"AME", L"AMF", L"AMG", L"AMH", L"AMI", L"AMJ", L"AMK", L"AML", L"AMM", L"AMN", L"AMO", L"AMP", L"AMQ", L"AMR", L"AMS", L"AMT", L"AMU", L"AMV", L"AMW", L"AMX", L"AMY", L"AMZ", L"ANA", L"ANB", L"ANC", L"AND", L"ANE", L"ANF", L"ANG", L"ANH", L"ANI", L"ANJ", L"ANK", L"ANL", L"ANM", L"ANN", L"ANO", L"ANP", L"ANQ", L"ANR", L"ANS", L"ANT", L"ANU", L"ANV", L"ANW", L"ANX", L"ANY", L"ANZ", L"AOA", L"AOB", L"AOC", L"AOD", L"AOE", L"AOF", L"AOG", L"AOH", L"AOI", L"AOJ", L"AOK", L"AOL", L"AOM", L"AON", L"AOO", L"AOP", L"AOQ", L"AOR", L"AOS", L"AOT", L"AOU", L"AOV", L"AOW", L"AOX", L"AOY", L"AOZ", L"APA", L"APB", L"APC", L"APD", L"APE", L"APF", L"APG", L"APH", L"API", L"APJ", L"APK", L"APL", L"APM", L"APN", L"APO", L"APP", L"APQ", L"APR", L"APS", L"APT", L"APU", L"APV", L"APW", L"APX", L"APY", L"APZ", L"AQA", L"AQB", L"AQC", L"AQD", L"AQE", L"AQF", L"AQG", L"AQH", L"AQI", L"AQJ", L"AQK", L"AQL", L"AQM", L"AQN", L"AQO", L"AQP", L"AQQ", L"AQR", L"AQS", L"AQT", L"AQU", L"AQV", L"AQW", L"AQX", L"AQY", L"AQZ", L"ARA", L"ARB", L"ARC", L"ARD", L"ARE", L"ARF", L"ARG", L"ARH", L"ARI", L"ARJ", L"ARK", L"ARL", L"ARM", L"ARN", L"ARO", L"ARP", L"ARQ", L"ARR", L"ARS", L"ART", L"ARU", L"ARV", L"ARW", L"ARX", L"ARY", L"ARZ", L"ASA", L"ASB", L"ASC", L"ASD", L"ASE", L"ASF", L"ASG", L"ASH", L"ASI", L"ASJ", L"ASK", L"ASL", L"ASM", L"ASN", L"ASO", L"ASP", L"ASQ", L"ASR", L"ASS", L"AST", L"ASU", L"ASV", L"ASW", L"ASX", L"ASY", L"ASZ", L"ATA", L"ATB", L"ATC", L"ATD", L"ATE", L"ATF", L"ATG", L"ATH", L"ATI", L"ATJ", L"ATK", L"ATL", L"ATM", L"ATN", L"ATO", L"ATP", L"ATQ", L"ATR", L"ATS", L"ATT", L"ATU", L"ATV", L"ATW", L"ATX", L"ATY", L"ATZ", L"AUA", L"AUB", L"AUC", L"AUD", L"AUE", L"AUF", L"AUG", L"AUH", L"AUI", L"AUJ", L"AUK", L"AUL", L"AUM", L"AUN", L"AUO", L"AUP", L"AUQ", L"AUR", L"AUS", L"AUT", L"AUU", L"AUV", L"AUW", L"AUX", L"AUY", L"AUZ", L"AVA", L"AVB", L"AVC", L"AVD", L"AVE", L"AVF", L"AVG", L"AVH", L"AVI", L"AVJ", L"AVK", L"AVL", L"AVM", L"AVN", L"AVO", L"AVP", L"AVQ", L"AVR", L"AVS", L"AVT", L"AVU", L"AVV", L"AVW", L"AVX", L"AVY", L"AVZ", L"AWA", L"AWB", L"AWC", L"AWD", L"AWE", L"AWF", L"AWG", L"AWH", L"AWI", L"AWJ", L"AWK", L"AWL", L"AWM", L"AWN", L"AWO", L"AWP", L"AWQ", L"AWR", L"AWS", L"AWT", L"AWU", L"AWV", L"AWW", L"AWX", L"AWY", L"AWZ", L"AXA", L"AXB", L"AXC", L"AXD", L"AXE", L"AXF", L"AXG", L"AXH", L"AXI", L"AXJ", L"AXK", L"AXL", L"AXM", L"AXN", L"AXO", L"AXP", L"AXQ", L"AXR", L"AXS", L"AXT", L"AXU", L"AXV", L"AXW", L"AXX", L"AXY", L"AXZ", L"AYA", L"AYB", L"AYC", L"AYD", L"AYE", L"AYF", L"AYG", L"AYH", L"AYI", L"AYJ", L"AYK", L"AYL", L"AYM", L"AYN", L"AYO", L"AYP", L"AYQ", L"AYR", L"AYS", L"AYT", L"AYU", L"AYV", L"AYW", L"AYX", L"AYY", L"AYZ", L"AZA", L"AZB", L"AZC", L"AZD", L"AZE", L"AZF", L"AZG", L"AZH", L"AZI", L"AZJ", L"AZK", L"AZL", L"AZM", L"AZN", L"AZO", L"AZP", L"AZQ", L"AZR", L"AZS", L"AZT", L"AZU", L"AZV", L"AZW", L"AZX", L"AZY", L"AZZ", L"BAA", L"BAB", L"BAC", L"BAD", L"BAE", L"BAF", L"BAG", L"BAH", L"BAI", L"BAJ", L"BAK", L"BAL", L"BAM", L"BAN", L"BAO", L"BAP", L"BAQ", L"BAR", L"BAS", L"BAT", L"BAU", L"BAV", L"BAW", L"BAX", L"BAY", L"BAZ", L"BBA", L"BBB", L"BBC", L"BBD", L"BBE", L"BBF", L"BBG", L"BBH", L"BBI", L"BBJ", L"BBK", L"BBL", L"BBM", L"BBN", L"BBO", L"BBP", L"BBQ", L"BBR", L"BBS", L"BBT", L"BBU", L"BBV", L"BBW", L"BBX", L"BBY", L"BBZ", L"BCA", L"BCB", L"BCC", L"BCD", L"BCE", L"BCF", L"BCG", L"BCH", L"BCI", L"BCJ", L"BCK", L"BCL", L"BCM", L"BCN", L"BCO", L"BCP", L"BCQ", L"BCR", L"BCS", L"BCT", L"BCU", L"BCV", L"BCW", L"BCX", L"BCY", L"BCZ", L"BDA", L"BDB", L"BDC", L"BDD", L"BDE", L"BDF", L"BDG", L"BDH", L"BDI", L"BDJ", L"BDK", L"BDL", L"BDM", L"BDN", L"BDO", L"BDP", L"BDQ", L"BDR", L"BDS", L"BDT", L"BDU", L"BDV", L"BDW", L"BDX", L"BDY", L"BDZ", L"BEA", L"BEB", L"BEC", L"BED", L"BEE", L"BEF", L"BEG", L"BEH", L"BEI", L"BEJ", L"BEK", L"BEL", L"BEM", L"BEN", L"BEO", L"BEP", L"BEQ", L"BER", L"BES", L"BET", L"BEU", L"BEV", L"BEW", L"BEX", L"BEY", L"BEZ", L"BFA", L"BFB", L"BFC", L"BFD", L"BFE", L"BFF", L"BFG", L"BFH", L"BFI", L"BFJ", L"BFK", L"BFL", L"BFM", L"BFN", L"BFO", L"BFP", L"BFQ", L"BFR", L"BFS", L"BFT", L"BFU", L"BFV", L"BFW", L"BFX", L"BFY", L"BFZ", L"BGA", L"BGB", L"BGC", L"BGD", L"BGE", L"BGF", L"BGG", L"BGH", L"BGI", L"BGJ", L"BGK", L"BGL", L"BGM", L"BGN", L"BGO", L"BGP", L"BGQ", L"BGR", L"BGS", L"BGT", L"BGU", L"BGV", L"BGW", L"BGX", L"BGY", L"BGZ", L"BHA", L"BHB", L"BHC", L"BHD", L"BHE", L"BHF", L"BHG", L"BHH", L"BHI", L"BHJ", L"BHK", L"BHL", L"BHM", L"BHN", L"BHO", L"BHP", L"BHQ", L"BHR", L"BHS", L"BHT", L"BHU", L"BHV", L"BHW", L"BHX", L"BHY", L"BHZ", L"BIA", L"BIB", L"BIC", L"BID", L"BIE", L"BIF", L"BIG", L"BIH", L"BII", L"BIJ", L"BIK", L"BIL", L"BIM", L"BIN", L"BIO", L"BIP", L"BIQ", L"BIR", L"BIS", L"BIT", L"BIU", L"BIV", L"BIW", L"BIX", L"BIY", L"BIZ", L"BJA", L"BJB", L"BJC", L"BJD", L"BJE", L"BJF", L"BJG", L"BJH", L"BJI", L"BJJ", L"BJK", L"BJL", L"BJM", L"BJN", L"BJO", L"BJP", L"BJQ", L"BJR", L"BJS", L"BJT", L"BJU", L"BJV", L"BJW", L"BJX", L"BJY", L"BJZ", L"BKA", L"BKB", L"BKC", L"BKD", L"BKE", L"BKF", L"BKG", L"BKH", L"BKI", L"BKJ", L"BKK", L"BKL", L"BKM", L"BKN", L"BKO", L"BKP", L"BKQ", L"BKR", L"BKS", L"BKT", L"BKU", L"BKV", L"BKW", L"BKX", L"BKY", L"BKZ", L"BLA", L"BLB", L"BLC", L"BLD", L"BLE", L"BLF", L"BLG", L"BLH", L"BLI", L"BLJ", L"BLK", L"BLL", L"BLM", L"BLN", L"BLO", L"BLP", L"BLQ", L"BLR", L"BLS", L"BLT", L"BLU", L"BLV", L"BLW", L"BLX", L"BLY", L"BLZ", L"BMA", L"BMB", L"BMC", L"BMD", L"BME", L"BMF", L"BMG", L"BMH", L"BMI", L"BMJ", L"BMK", L"BML", L"BMM", L"BMN", L"BMO", L"BMP", L"BMQ", L"BMR", L"BMS", L"BMT", L"BMU", L"BMV", L"BMW", L"BMX", L"BMY", L"BMZ", L"BNA", L"BNB", L"BNC", L"BND", L"BNE", L"BNF", L"BNG", L"BNH", L"BNI", L"BNJ", L"BNK", L"BNL", L"BNM", L"BNN", L"BNO", L"BNP", L"BNQ", L"BNR", L"BNS", L"BNT", L"BNU", L"BNV", L"BNW", L"BNX", L"BNY", L"BNZ", L"BOA", L"BOB", L"BOC", L"BOD", L"BOE", L"BOF", L"BOG", L"BOH", L"BOI", L"BOJ", L"BOK", L"BOL", L"BOM", L"BON", L"BOO", L"BOP", L"BOQ", L"BOR", L"BOS", L"BOT", L"BOU", L"BOV", L"BOW", L"BOX", L"BOY", L"BOZ", L"BPA", L"BPB", L"BPC", L"BPD", L"BPE", L"BPF", L"BPG", L"BPH", L"BPI", L"BPJ", L"BPK", L"BPL", L"BPM", L"BPN", L"BPO", L"BPP", L"BPQ", L"BPR", L"BPS", L"BPT", L"BPU", L"BPV", L"BPW", L"BPX", L"BPY", L"BPZ", L"BQA", L"BQB", L"BQC", L"BQD", L"BQE", L"BQF", L"BQG", L"BQH", L"BQI", L"BQJ", L"BQK", L"BQL", L"BQM", L"BQN", L"BQO", L"BQP", L"BQQ", L"BQR", L"BQS", L"BQT", L"BQU", L"BQV", L"BQW", L"BQX", L"BQY", L"BQZ", L"BRA", L"BRB", L"BRC", L"BRD", L"BRE", L"BRF", L"BRG", L"BRH", L"BRI", L"BRJ", L"BRK", L"BRL", L"BRM", L"BRN", L"BRO", L"BRP", L"BRQ", L"BRR", L"BRS", L"BRT", L"BRU", L"BRV", L"BRW", L"BRX", L"BRY", L"BRZ", L"BSA", L"BSB", L"BSC", L"BSD", L"BSE", L"BSF", L"BSG", L"BSH", L"BSI", L"BSJ", L"BSK", L"BSL", L"BSM", L"BSN", L"BSO", L"BSP", L"BSQ", L"BSR", L"BSS", L"BST", L"BSU", L"BSV", L"BSW", L"BSX", L"BSY", L"BSZ", L"BTA", L"BTB", L"BTC", L"BTD", L"BTE", L"BTF", L"BTG", L"BTH", L"BTI", L"BTJ", L"BTK", L"BTL", L"BTM", L"BTN", L"BTO", L"BTP", L"BTQ", L"BTR", L"BTS", L"BTT", L"BTU", L"BTV", L"BTW", L"BTX", L"BTY", L"BTZ", L"BUA", L"BUB", L"BUC", L"BUD", L"BUE", L"BUF", L"BUG", L"BUH", L"BUI", L"BUJ", L"BUK", L"BUL", L"BUM", L"BUN", L"BUO", L"BUP", L"BUQ", L"BUR", L"BUS", L"BUT", L"BUU", L"BUV", L"BUW", L"BUX", L"BUY", L"BUZ", L"BVA", L"BVB", L"BVC", L"BVD", L"BVE", L"BVF", L"BVG", L"BVH", L"BVI", L"BVJ", L"BVK", L"BVL", L"BVM", L"BVN", L"BVO", L"BVP", L"BVQ", L"BVR", L"BVS", L"BVT", L"BVU", L"BVV", L"BVW", L"BVX", L"BVY", L"BVZ", L"BWA", L"BWB", L"BWC", L"BWD", L"BWE", L"BWF", L"BWG", L"BWH", L"BWI", L"BWJ", L"BWK", L"BWL", L"BWM", L"BWN", L"BWO", L"BWP", L"BWQ", L"BWR", L"BWS", L"BWT", L"BWU", L"BWV", L"BWW", L"BWX", L"BWY", L"BWZ", L"BXA", L"BXB", L"BXC", L"BXD", L"BXE", L"BXF", L"BXG", L"BXH", L"BXI", L"BXJ", L"BXK", L"BXL", L"BXM", L"BXN", L"BXO", L"BXP", L"BXQ", L"BXR", L"BXS", L"BXT", L"BXU", L"BXV", L"BXW", L"BXX", L"BXY", L"BXZ", L"BYA", L"BYB", L"BYC", L"BYD", L"BYE", L"BYF", L"BYG", L"BYH", L"BYI", L"BYJ", L"BYK", L"BYL", L"BYM", L"BYN", L"BYO", L"BYP", L"BYQ", L"BYR", L"BYS", L"BYT", L"BYU", L"BYV", L"BYW", L"BYX", L"BYY", L"BYZ", L"BZA", L"BZB", L"BZC", L"BZD", L"BZE", L"BZF", L"BZG", L"BZH", L"BZI", L"BZJ", L"BZK", L"BZL", L"BZM", L"BZN", L"BZO", L"BZP", L"BZQ", L"BZR", L"BZS", L"BZT", L"BZU", L"BZV", L"BZW", L"BZX", L"BZY", L"BZZ", L"CAA", L"CAB", L"CAC", L"CAD", L"CAE", L"CAF", L"CAG", L"CAH", L"CAI", L"CAJ", L"CAK", L"CAL", L"CAM", L"CAN", L"CAO", L"CAP", L"CAQ", L"CAR", L"CAS", L"CAT", L"CAU", L"CAV", L"CAW", L"CAX", L"CAY", L"CAZ", L"CBA", L"CBB", L"CBC", L"CBD", L"CBE", L"CBF", L"CBG", L"CBH", L"CBI", L"CBJ", L"CBK", L"CBL", L"CBM", L"CBN", L"CBO", L"CBP", L"CBQ", L"CBR", L"CBS", L"CBT", L"CBU", L"CBV", L"CBW", L"CBX", L"CBY", L"CBZ", L"CCA", L"CCB", L"CCC", L"CCD", L"CCE", L"CCF", L"CCG", L"CCH", L"CCI", L"CCJ", L"CCK", L"CCL", L"CCM", L"CCN", L"CCO", L"CCP", L"CCQ", L"CCR", L"CCS", L"CCT", L"CCU", L"CCV", L"CCW", L"CCX", L"CCY", L"CCZ", L"CDA", L"CDB", L"CDC", L"CDD", L"CDE", L"CDF", L"CDG", L"CDH", L"CDI", L"CDJ", L"CDK", L"CDL", L"CDM", L"CDN", L"CDO", L"CDP", L"CDQ", L"CDR", L"CDS", L"CDT", L"CDU", L"CDV", L"CDW", L"CDX", L"CDY", L"CDZ", L"CEA", L"CEB", L"CEC", L"CED", L"CEE", L"CEF", L"CEG", L"CEH", L"CEI", L"CEJ", L"CEK", L"CEL", L"CEM", L"CEN", L"CEO", L"CEP", L"CEQ", L"CER", L"CES", L"CET", L"CEU", L"CEV", L"CEW", L"CEX", L"CEY", L"CEZ", L"CFA", L"CFB", L"CFC", L"CFD", L"CFE", L"CFF", L"CFG", L"CFH", L"CFI", L"CFJ", L"CFK", L"CFL", L"CFM", L"CFN", L"CFO", L"CFP", L"CFQ", L"CFR", L"CFS", L"CFT", L"CFU", L"CFV", L"CFW", L"CFX", L"CFY", L"CFZ", L"CGA", L"CGB", L"CGC", L"CGD", L"CGE", L"CGF", L"CGG", L"CGH", L"CGI", L"CGJ", L"CGK", L"CGL", L"CGM", L"CGN", L"CGO", L"CGP", L"CGQ", L"CGR", L"CGS", L"CGT", L"CGU", L"CGV", L"CGW", L"CGX", L"CGY", L"CGZ", L"CHA", L"CHB", L"CHC", L"CHD", L"CHE", L"CHF", L"CHG", L"CHH", L"CHI", L"CHJ", L"CHK", L"CHL", L"CHM", L"CHN", L"CHO", L"CHP", L"CHQ", L"CHR", L"CHS", L"CHT", L"CHU", L"CHV", L"CHW", L"CHX", L"CHY", L"CHZ", L"CIA", L"CIB", L"CIC", L"CID", L"CIE", L"CIF", L"CIG", L"CIH", L"CII", L"CIJ", L"CIK", L"CIL", L"CIM", L"CIN", L"CIO", L"CIP", L"CIQ", L"CIR", L"CIS", L"CIT", L"CIU", L"CIV", L"CIW", L"CIX", L"CIY", L"CIZ", L"CJA", L"CJB", L"CJC", L"CJD", L"CJE", L"CJF", L"CJG", L"CJH", L"CJI", L"CJJ", L"CJK", L"CJL", L"CJM", L"CJN", L"CJO", L"CJP", L"CJQ", L"CJR", L"CJS", L"CJT", L"CJU", L"CJV", L"CJW", L"CJX", L"CJY", L"CJZ", L"CKA", L"CKB", L"CKC", L"CKD", L"CKE", L"CKF", L"CKG", L"CKH", L"CKI", L"CKJ", L"CKK", L"CKL", L"CKM", L"CKN", L"CKO", L"CKP", L"CKQ", L"CKR", L"CKS", L"CKT", L"CKU", L"CKV", L"CKW", L"CKX", L"CKY", L"CKZ", L"CLA", L"CLB", L"CLC", L"CLD", L"CLE", L"CLF", L"CLG", L"CLH", L"CLI", L"CLJ", L"CLK", L"CLL", L"CLM", L"CLN", L"CLO", L"CLP", L"CLQ", L"CLR", L"CLS", L"CLT", L"CLU", L"CLV", L"CLW", L"CLX", L"CLY", L"CLZ", L"CMA", L"CMB", L"CMC", L"CMD", L"CME", L"CMF", L"CMG", L"CMH", L"CMI", L"CMJ", L"CMK", L"CML", L"CMM", L"CMN", L"CMO", L"CMP", L"CMQ", L"CMR", L"CMS", L"CMT", L"CMU", L"CMV", L"CMW", L"CMX", L"CMY", L"CMZ", L"CNA", L"CNB", L"CNC", L"CND", L"CNE", L"CNF", L"CNG", L"CNH", L"CNI", L"CNJ", L"CNK", L"CNL", L"CNM", L"CNN", L"CNO", L"CNP", L"CNQ", L"CNR", L"CNS", L"CNT", L"CNU", L"CNV", L"CNW", L"CNX", L"CNY", L"CNZ", L"COA", L"COB", L"COC", L"COD", L"COE", L"COF", L"COG", L"COH", L"COI", L"COJ", L"COK", L"COL", L"COM", L"CON", L"COO", L"COP", L"COQ", L"COR", L"COS", L"COT", L"COU", L"COV", L"COW", L"COX", L"COY", L"COZ", L"CPA", L"CPB", L"CPC", L"CPD", L"CPE", L"CPF", L"CPG", L"CPH", L"CPI", L"CPJ", L"CPK", L"CPL", L"CPM", L"CPN", L"CPO", L"CPP", L"CPQ", L"CPR", L"CPS", L"CPT", L"CPU", L"CPV", L"CPW", L"CPX", L"CPY", L"CPZ", L"CQA", L"CQB", L"CQC", L"CQD", L"CQE", L"CQF", L"CQG", L"CQH", L"CQI", L"CQJ", L"CQK", L"CQL", L"CQM", L"CQN", L"CQO", L"CQP", L"CQQ", L"CQR", L"CQS", L"CQT", L"CQU", L"CQV", L"CQW", L"CQX", L"CQY", L"CQZ", L"CRA", L"CRB", L"CRC", L"CRD", L"CRE", L"CRF", L"CRG", L"CRH", L"CRI", L"CRJ", L"CRK", L"CRL", L"CRM", L"CRN", L"CRO", L"CRP", L"CRQ", L"CRR", L"CRS", L"CRT", L"CRU", L"CRV", L"CRW", L"CRX", L"CRY", L"CRZ", L"CSA", L"CSB", L"CSC", L"CSD", L"CSE", L"CSF", L"CSG", L"CSH", L"CSI", L"CSJ", L"CSK", L"CSL", L"CSM", L"CSN", L"CSO", L"CSP", L"CSQ", L"CSR", L"CSS", L"CST", L"CSU", L"CSV", L"CSW", L"CSX", L"CSY", L"CSZ", L"CTA", L"CTB", L"CTC", L"CTD", L"CTE", L"CTF", L"CTG", L"CTH", L"CTI", L"CTJ", L"CTK", L"CTL", L"CTM", L"CTN", L"CTO", L"CTP", L"CTQ", L"CTR", L"CTS", L"CTT", L"CTU", L"CTV", L"CTW", L"CTX", L"CTY", L"CTZ", L"CUA", L"CUB", L"CUC", L"CUD", L"CUE", L"CUF", L"CUG", L"CUH", L"CUI", L"CUJ", L"CUK", L"CUL", L"CUM", L"CUN", L"CUO", L"CUP", L"CUQ", L"CUR", L"CUS", L"CUT", L"CUU", L"CUV", L"CUW", L"CUX", L"CUY", L"CUZ", L"CVA", L"CVB", L"CVC", L"CVD", L"CVE", L"CVF", L"CVG", L"CVH", L"CVI", L"CVJ", L"CVK", L"CVL", L"CVM", L"CVN", L"CVO", L"CVP", L"CVQ", L"CVR", L"CVS", L"CVT", L"CVU", L"CVV", L"CVW", L"CVX", L"CVY", L"CVZ", L"CWA", L"CWB", L"CWC", L"CWD", L"CWE", L"CWF", L"CWG", L"CWH", L"CWI", L"CWJ", L"CWK", L"CWL", L"CWM", L"CWN", L"CWO", L"CWP", L"CWQ", L"CWR", L"CWS", L"CWT", L"CWU", L"CWV", L"CWW", L"CWX", L"CWY", L"CWZ", L"CXA", L"CXB", L"CXC", L"CXD", L"CXE", L"CXF", L"CXG", L"CXH", L"CXI", L"CXJ", L"CXK", L"CXL", L"CXM", L"CXN", L"CXO", L"CXP", L"CXQ", L"CXR", L"CXS", L"CXT", L"CXU", L"CXV", L"CXW", L"CXX", L"CXY", L"CXZ", L"CYA", L"CYB", L"CYC", L"CYD", L"CYE", L"CYF", L"CYG", L"CYH", L"CYI", L"CYJ", L"CYK", L"CYL", L"CYM", L"CYN", L"CYO", L"CYP", L"CYQ", L"CYR", L"CYS", L"CYT", L"CYU", L"CYV", L"CYW", L"CYX", L"CYY", L"CYZ", L"CZA", L"CZB", L"CZC", L"CZD", L"CZE", L"CZF", L"CZG", L"CZH", L"CZI", L"CZJ", L"CZK", L"CZL", L"CZM", L"CZN", L"CZO", L"CZP", L"CZQ", L"CZR", L"CZS", L"CZT", L"CZU", L"CZV", L"CZW", L"CZX", L"CZY", L"CZZ", L"DAA", L"DAB", L"DAC", L"DAD", L"DAE", L"DAF", L"DAG", L"DAH", L"DAI", L"DAJ", L"DAK", L"DAL", L"DAM", L"DAN", L"DAO", L"DAP", L"DAQ", L"DAR", L"DAS", L"DAT", L"DAU", L"DAV", L"DAW", L"DAX", L"DAY", L"DAZ", L"DBA", L"DBB", L"DBC", L"DBD", L"DBE", L"DBF", L"DBG", L"DBH", L"DBI", L"DBJ", L"DBK", L"DBL", L"DBM", L"DBN", L"DBO", L"DBP", L"DBQ", L"DBR", L"DBS", L"DBT", L"DBU", L"DBV", L"DBW", L"DBX", L"DBY", L"DBZ", L"DCA", L"DCB", L"DCC", L"DCD", L"DCE", L"DCF", L"DCG", L"DCH", L"DCI", L"DCJ", L"DCK", L"DCL", L"DCM", L"DCN", L"DCO", L"DCP", L"DCQ", L"DCR", L"DCS", L"DCT", L"DCU", L"DCV", L"DCW", L"DCX", L"DCY", L"DCZ", L"DDA", - L"DDB", L"DDC", L"DDD", L"DDE", L"DDF", L"DDG", L"DDH", L"DDI", L"DDJ", L"DDK", L"DDL", L"DDM", L"DDN", L"DDO", L"DDP", L"DDQ", L"DDR", L"DDS", L"DDT", L"DDU", L"DDV", L"DDW", L"DDX", L"DDY", L"DDZ", L"DEA", L"DEB", L"DEC", L"DED", L"DEE", L"DEF", L"DEG", L"DEH", L"DEI", L"DEJ", L"DEK", L"DEL", L"DEM", L"DEN", L"DEO", L"DEP", L"DEQ", L"DER", L"DES", L"DET", L"DEU", L"DEV", L"DEW", L"DEX", L"DEY", L"DEZ", L"DFA", L"DFB", L"DFC", L"DFD", L"DFE", L"DFF", L"DFG", L"DFH", L"DFI", L"DFJ", L"DFK", L"DFL", L"DFM", L"DFN", L"DFO", L"DFP", L"DFQ", L"DFR", L"DFS", L"DFT", L"DFU", L"DFV", L"DFW", L"DFX", L"DFY", L"DFZ", L"DGA", L"DGB", L"DGC", L"DGD", L"DGE", L"DGF", L"DGG", L"DGH", L"DGI", L"DGJ", L"DGK", L"DGL", L"DGM", L"DGN", L"DGO", L"DGP", L"DGQ", L"DGR", L"DGS", L"DGT", L"DGU", L"DGV", L"DGW", L"DGX", L"DGY", L"DGZ", L"DHA", L"DHB", L"DHC", L"DHD", L"DHE", L"DHF", L"DHG", L"DHH", L"DHI", L"DHJ", L"DHK", L"DHL", L"DHM", L"DHN", L"DHO", L"DHP", L"DHQ", L"DHR", L"DHS", L"DHT", L"DHU", L"DHV", L"DHW", L"DHX", L"DHY", L"DHZ", L"DIA", L"DIB", L"DIC", L"DID", L"DIE", L"DIF", L"DIG", L"DIH", L"DII", L"DIJ", L"DIK", L"DIL", L"DIM", L"DIN", L"DIO", L"DIP", L"DIQ", L"DIR", L"DIS", L"DIT", L"DIU", L"DIV", L"DIW", L"DIX", L"DIY", L"DIZ", L"DJA", L"DJB", L"DJC", L"DJD", L"DJE", L"DJF", L"DJG", L"DJH", L"DJI", L"DJJ", L"DJK", L"DJL", L"DJM", L"DJN", L"DJO", L"DJP", L"DJQ", L"DJR", L"DJS", L"DJT", L"DJU", L"DJV", L"DJW", L"DJX", L"DJY", L"DJZ", L"DKA", L"DKB", L"DKC", L"DKD", L"DKE", L"DKF", L"DKG", L"DKH", L"DKI", L"DKJ", L"DKK", L"DKL", L"DKM", L"DKN", L"DKO", L"DKP", L"DKQ", L"DKR", L"DKS", L"DKT", L"DKU", L"DKV", L"DKW", L"DKX", L"DKY", L"DKZ", L"DLA", L"DLB", L"DLC", L"DLD", L"DLE", L"DLF", L"DLG", L"DLH", L"DLI", L"DLJ", L"DLK", L"DLL", L"DLM", L"DLN", L"DLO", L"DLP", L"DLQ", L"DLR", L"DLS", L"DLT", L"DLU", L"DLV", L"DLW", L"DLX", L"DLY", L"DLZ", L"DMA", L"DMB", L"DMC", L"DMD", L"DME", L"DMF", L"DMG", L"DMH", L"DMI", L"DMJ", L"DMK", L"DML", L"DMM", L"DMN", L"DMO", L"DMP", L"DMQ", L"DMR", L"DMS", L"DMT", L"DMU", L"DMV", L"DMW", L"DMX", L"DMY", L"DMZ", L"DNA", L"DNB", L"DNC", L"DND", L"DNE", L"DNF", L"DNG", L"DNH", L"DNI", L"DNJ", L"DNK", L"DNL", L"DNM", L"DNN", L"DNO", L"DNP", L"DNQ", L"DNR", L"DNS", L"DNT", L"DNU", L"DNV", L"DNW", L"DNX", L"DNY", L"DNZ", L"DOA", L"DOB", L"DOC", L"DOD", L"DOE", L"DOF", L"DOG", L"DOH", L"DOI", L"DOJ", L"DOK", L"DOL", L"DOM", L"DON", L"DOO", L"DOP", L"DOQ", L"DOR", L"DOS", L"DOT", L"DOU", L"DOV", L"DOW", L"DOX", L"DOY", L"DOZ", L"DPA", L"DPB", L"DPC", L"DPD", L"DPE", L"DPF", L"DPG", L"DPH", L"DPI", L"DPJ", L"DPK", L"DPL", L"DPM", L"DPN", L"DPO", L"DPP", L"DPQ", L"DPR", L"DPS", L"DPT", L"DPU", L"DPV", L"DPW", L"DPX", L"DPY", L"DPZ", L"DQA", L"DQB", L"DQC", L"DQD", L"DQE", L"DQF", L"DQG", L"DQH", L"DQI", L"DQJ", L"DQK", L"DQL", L"DQM", L"DQN", L"DQO", L"DQP", L"DQQ", L"DQR", L"DQS", L"DQT", L"DQU", L"DQV", L"DQW", L"DQX", L"DQY", L"DQZ", L"DRA", L"DRB", L"DRC", L"DRD", L"DRE", L"DRF", L"DRG", L"DRH", L"DRI", L"DRJ", L"DRK", L"DRL", L"DRM", L"DRN", L"DRO", L"DRP", L"DRQ", L"DRR", L"DRS", L"DRT", L"DRU", L"DRV", L"DRW", L"DRX", L"DRY", L"DRZ", L"DSA", L"DSB", L"DSC", L"DSD", L"DSE", L"DSF", L"DSG", L"DSH", L"DSI", L"DSJ", L"DSK", L"DSL", L"DSM", L"DSN", L"DSO", L"DSP", L"DSQ", L"DSR", L"DSS", L"DST", L"DSU", L"DSV", L"DSW", L"DSX", L"DSY", L"DSZ", L"DTA", L"DTB", L"DTC", L"DTD", L"DTE", L"DTF", L"DTG", L"DTH", L"DTI", L"DTJ", L"DTK", L"DTL", L"DTM", L"DTN", L"DTO", L"DTP", L"DTQ", L"DTR", L"DTS", L"DTT", L"DTU", L"DTV", L"DTW", L"DTX", L"DTY", L"DTZ", L"DUA", L"DUB", L"DUC", L"DUD", L"DUE", L"DUF", L"DUG", L"DUH", L"DUI", L"DUJ", L"DUK", L"DUL", L"DUM", L"DUN", L"DUO", L"DUP", L"DUQ", L"DUR", L"DUS", L"DUT", L"DUU", L"DUV", L"DUW", L"DUX", L"DUY", L"DUZ", L"DVA", L"DVB", L"DVC", L"DVD", L"DVE", L"DVF", L"DVG", L"DVH", L"DVI", L"DVJ", L"DVK", L"DVL", L"DVM", L"DVN", L"DVO", L"DVP", L"DVQ", L"DVR", L"DVS", L"DVT", L"DVU", L"DVV", L"DVW", L"DVX", L"DVY", L"DVZ", L"DWA", L"DWB", L"DWC", L"DWD", L"DWE", L"DWF", L"DWG", L"DWH", L"DWI", L"DWJ", L"DWK", L"DWL", L"DWM", L"DWN", L"DWO", L"DWP", L"DWQ", L"DWR", L"DWS", L"DWT", L"DWU", L"DWV", L"DWW", L"DWX", L"DWY", L"DWZ", L"DXA", L"DXB", L"DXC", L"DXD", L"DXE", L"DXF", L"DXG", L"DXH", L"DXI", L"DXJ", L"DXK", L"DXL", L"DXM", L"DXN", L"DXO", L"DXP", L"DXQ", L"DXR", L"DXS", - L"DXT", L"DXU", L"DXV", L"DXW", L"DXX", L"DXY", L"DXZ", L"DYA", L"DYB", L"DYC", L"DYD", L"DYE", L"DYF", L"DYG", L"DYH", L"DYI", L"DYJ", L"DYK", L"DYL", L"DYM", L"DYN", L"DYO", L"DYP", L"DYQ", L"DYR", L"DYS", L"DYT", L"DYU", L"DYV", L"DYW", L"DYX", L"DYY", L"DYZ", L"DZA", L"DZB", L"DZC", L"DZD", L"DZE", L"DZF", L"DZG", L"DZH", L"DZI", L"DZJ", L"DZK", L"DZL", L"DZM", L"DZN", L"DZO", L"DZP", L"DZQ", L"DZR", L"DZS", L"DZT", L"DZU", L"DZV", L"DZW", L"DZX", L"DZY", L"DZZ", L"EAA", L"EAB", L"EAC", L"EAD", L"EAE", L"EAF", L"EAG", L"EAH", L"EAI", L"EAJ", L"EAK", L"EAL", L"EAM", L"EAN", L"EAO", L"EAP", L"EAQ", L"EAR", L"EAS", L"EAT", L"EAU", L"EAV", L"EAW", L"EAX", L"EAY", L"EAZ", L"EBA", L"EBB", L"EBC", L"EBD", L"EBE", L"EBF", L"EBG", L"EBH", L"EBI", L"EBJ", L"EBK", L"EBL", L"EBM", L"EBN", L"EBO", L"EBP", L"EBQ", L"EBR", L"EBS", L"EBT", L"EBU", L"EBV", L"EBW", L"EBX", L"EBY", L"EBZ", L"ECA", L"ECB", L"ECC", L"ECD", L"ECE", L"ECF", L"ECG", L"ECH", L"ECI", L"ECJ", L"ECK", L"ECL", L"ECM", L"ECN", L"ECO", L"ECP", L"ECQ", L"ECR", L"ECS", L"ECT", L"ECU", L"ECV", L"ECW", L"ECX", L"ECY", L"ECZ", L"EDA", L"EDB", L"EDC", L"EDD", L"EDE", L"EDF", L"EDG", L"EDH", L"EDI", L"EDJ", L"EDK", L"EDL", L"EDM", L"EDN", L"EDO", L"EDP", L"EDQ", L"EDR", L"EDS", L"EDT", L"EDU", L"EDV", L"EDW", L"EDX", L"EDY", L"EDZ", L"EEA", L"EEB", L"EEC", L"EED", L"EEE", L"EEF", L"EEG", L"EEH", L"EEI", L"EEJ", L"EEK", L"EEL", L"EEM", L"EEN", L"EEO", L"EEP", L"EEQ", L"EER", L"EES", L"EET", L"EEU", L"EEV", L"EEW", L"EEX", L"EEY", L"EEZ", L"EFA", L"EFB", L"EFC", L"EFD", L"EFE", L"EFF", L"EFG", L"EFH", L"EFI", L"EFJ", L"EFK", L"EFL", L"EFM", L"EFN", L"EFO", L"EFP", L"EFQ", L"EFR", L"EFS", L"EFT", L"EFU", L"EFV", L"EFW", L"EFX", L"EFY", L"EFZ", L"EGA", L"EGB", L"EGC", L"EGD", L"EGE", L"EGF", L"EGG", L"EGH", L"EGI", L"EGJ", L"EGK", L"EGL", L"EGM", L"EGN", L"EGO", L"EGP", L"EGQ", L"EGR", L"EGS", L"EGT", L"EGU", L"EGV", L"EGW", L"EGX", L"EGY", L"EGZ", L"EHA", L"EHB", L"EHC", L"EHD", L"EHE", L"EHF", L"EHG", L"EHH", L"EHI", L"EHJ", L"EHK", L"EHL", L"EHM", L"EHN", L"EHO", L"EHP", L"EHQ", L"EHR", L"EHS", L"EHT", L"EHU", L"EHV", L"EHW", L"EHX", L"EHY", L"EHZ", L"EIA", L"EIB", L"EIC", L"EID", L"EIE", L"EIF", L"EIG", L"EIH", L"EII", L"EIJ", L"EIK", L"EIL", L"EIM", L"EIN", L"EIO", L"EIP", L"EIQ", L"EIR", L"EIS", L"EIT", L"EIU", L"EIV", L"EIW", L"EIX", L"EIY", L"EIZ", L"EJA", L"EJB", L"EJC", L"EJD", L"EJE", L"EJF", L"EJG", L"EJH", L"EJI", L"EJJ", L"EJK", L"EJL", L"EJM", L"EJN", L"EJO", L"EJP", L"EJQ", L"EJR", L"EJS", L"EJT", L"EJU", L"EJV", L"EJW", L"EJX", L"EJY", L"EJZ", L"EKA", L"EKB", L"EKC", L"EKD", L"EKE", L"EKF", L"EKG", L"EKH", L"EKI", L"EKJ", L"EKK", L"EKL", L"EKM", L"EKN", L"EKO", L"EKP", L"EKQ", L"EKR", L"EKS", L"EKT", L"EKU", L"EKV", L"EKW", L"EKX", L"EKY", L"EKZ", L"ELA", L"ELB", L"ELC", L"ELD", L"ELE", L"ELF", L"ELG", L"ELH", L"ELI", L"ELJ", L"ELK", L"ELL", L"ELM", L"ELN", L"ELO", L"ELP", L"ELQ", L"ELR", L"ELS", L"ELT", L"ELU", L"ELV", L"ELW", L"ELX", L"ELY", L"ELZ", L"EMA", L"EMB", L"EMC", L"EMD", L"EME", L"EMF", L"EMG", L"EMH", L"EMI", L"EMJ", L"EMK", L"EML", L"EMM", L"EMN", L"EMO", L"EMP", L"EMQ", L"EMR", L"EMS", L"EMT", L"EMU", L"EMV", L"EMW", L"EMX", L"EMY", L"EMZ", L"ENA", L"ENB", L"ENC", L"END", L"ENE", L"ENF", L"ENG", L"ENH", L"ENI", L"ENJ", L"ENK", L"ENL", L"ENM", L"ENN", L"ENO", L"ENP", L"ENQ", L"ENR", L"ENS", L"ENT", L"ENU", L"ENV", L"ENW", L"ENX", L"ENY", L"ENZ", L"EOA", L"EOB", L"EOC", L"EOD", L"EOE", L"EOF", L"EOG", L"EOH", L"EOI", L"EOJ", L"EOK", L"EOL", L"EOM", L"EON", L"EOO", L"EOP", L"EOQ", L"EOR", L"EOS", L"EOT", L"EOU", L"EOV", L"EOW", L"EOX", L"EOY", L"EOZ", L"EPA", L"EPB", L"EPC", L"EPD", L"EPE", L"EPF", L"EPG", L"EPH", L"EPI", L"EPJ", L"EPK", L"EPL", L"EPM", L"EPN", L"EPO", L"EPP", L"EPQ", L"EPR", L"EPS", L"EPT", L"EPU", L"EPV", L"EPW", L"EPX", L"EPY", L"EPZ", L"EQA", L"EQB", L"EQC", L"EQD", L"EQE", L"EQF", L"EQG", L"EQH", L"EQI", L"EQJ", L"EQK", L"EQL", L"EQM", L"EQN", L"EQO", L"EQP", L"EQQ", L"EQR", L"EQS", L"EQT", L"EQU", L"EQV", L"EQW", L"EQX", L"EQY", L"EQZ", L"ERA", L"ERB", L"ERC", L"ERD", L"ERE", L"ERF", L"ERG", L"ERH", L"ERI", L"ERJ", L"ERK", L"ERL", L"ERM", L"ERN", L"ERO", L"ERP", L"ERQ", L"ERR", L"ERS", L"ERT", L"ERU", L"ERV", L"ERW", L"ERX", L"ERY", L"ERZ", L"ESA", L"ESB", L"ESC", L"ESD", L"ESE", L"ESF", L"ESG", L"ESH", L"ESI", L"ESJ", L"ESK", + L"DDB", L"DDC", L"DDD", L"DDE", L"DDF", L"DDG", L"DDH", L"DDI", L"DDJ", L"DDK", L"DDL", L"DDM", L"DDN", L"DDO", L"DDP", L"DDQ", L"DDR", L"DDS", L"DDT", L"DDU", L"DDV", L"DDW", L"DDX", L"DDY", L"DDZ", L"DEA", L"DEB", L"DEC", L"DED", L"DEE", L"DEF", L"DEG", L"DEH", L"DEI", L"DEJ", L"DEK", L"DEL", L"DEM", L"DEN", L"DEO", L"DEP", L"DEQ", L"DER", L"DES", L"DET", L"DEU", L"DEV", L"DEW", L"DEX", L"DEY", L"DEZ", L"DFA", L"DFB", L"DFC", L"DFD", L"DFE", L"DFF", L"DFG", L"DFH", L"DFI", L"DFJ", L"DFK", L"DFL", L"DFM", L"DFN", L"DFO", L"DFP", L"DFQ", L"DFR", L"DFS", L"DFT", L"DFU", L"DFV", L"DFW", L"DFX", L"DFY", L"DFZ", L"DGA", L"DGB", L"DGC", L"DGD", L"DGE", L"DGF", L"DGG", L"DGH", L"DGI", L"DGJ", L"DGK", L"DGL", L"DGM", L"DGN", L"DGO", L"DGP", L"DGQ", L"DGR", L"DGS", L"DGT", L"DGU", L"DGV", L"DGW", L"DGX", L"DGY", L"DGZ", L"DHA", L"DHB", L"DHC", L"DHD", L"DHE", L"DHF", L"DHG", L"DHH", L"DHI", L"DHJ", L"DHK", L"DHL", L"DHM", L"DHN", L"DHO", L"DHP", L"DHQ", L"DHR", L"DHS", L"DHT", L"DHU", L"DHV", L"DHW", L"DHX", L"DHY", L"DHZ", L"DIA", L"DIB", L"DIC", L"DID", L"DIE", L"DIF", L"DIG", L"DIH", L"DII", L"DIJ", L"DIK", L"DIL", L"DIM", L"DIN", L"DIO", L"DIP", L"DIQ", L"DIR", L"DIS", L"DIT", L"DIU", L"DIV", L"DIW", L"DIX", L"DIY", L"DIZ", L"DJA", L"DJB", L"DJC", L"DJD", L"DJE", L"DJF", L"DJG", L"DJH", L"DJI", L"DJJ", L"DJK", L"DJL", L"DJM", L"DJN", L"DJO", L"DJP", L"DJQ", L"DJR", L"DJS", L"DJT", L"DJU", L"DJV", L"DJW", L"DJX", L"DJY", L"DJZ", L"DKA", L"DKB", L"DKC", L"DKD", L"DKE", L"DKF", L"DKG", L"DKH", L"DKI", L"DKJ", L"DKK", L"DKL", L"DKM", L"DKN", L"DKO", L"DKP", L"DKQ", L"DKR", L"DKS", L"DKT", L"DKU", L"DKV", L"DKW", L"DKX", L"DKY", L"DKZ", L"DLA", L"DLB", L"DLC", L"DLD", L"DLE", L"DLF", L"DLG", L"DLH", L"DLI", L"DLJ", L"DLK", L"DLL", L"DLM", L"DLN", L"DLO", L"DLP", L"DLQ", L"DLR", L"DLS", L"DLT", L"DLU", L"DLV", L"DLW", L"DLX", L"DLY", L"DLZ", L"DMA", L"DMB", L"DMC", L"DMD", L"DME", L"DMF", L"DMG", L"DMH", L"DMI", L"DMJ", L"DMK", L"DML", L"DMM", L"DMN", L"DMO", L"DMP", L"DMQ", L"DMR", L"DMS", L"DMT", L"DMU", L"DMV", L"DMW", L"DMX", L"DMY", L"DMZ", L"DNA", L"DNB", L"DNC", L"DND", L"DNE", L"DNF", L"DNG", L"DNH", L"DNI", L"DNJ", L"DNK", L"DNL", L"DNM", L"DNN", L"DNO", L"DNP", L"DNQ", L"DNR", L"DNS", L"DNT", L"DNU", L"DNV", L"DNW", L"DNX", L"DNY", L"DNZ", L"DOA", L"DOB", L"DOC", L"DOD", L"DOE", L"DOF", L"DOG", L"DOH", L"DOI", L"DOJ", L"DOK", L"DOL", L"DOM", L"DON", L"DOO", L"DOP", L"DOQ", L"DOR", L"DOS", L"DOT", L"DOU", L"DOV", L"DOW", L"DOX", L"DOY", L"DOZ", L"DPA", L"DPB", L"DPC", L"DPD", L"DPE", L"DPF", L"DPG", L"DPH", L"DPI", L"DPJ", L"DPK", L"DPL", L"DPM", L"DPN", L"DPO", L"DPP", L"DPQ", L"DPR", L"DPS", L"DPT", L"DPU", L"DPV", L"DPW", L"DPX", L"DPY", L"DPZ", L"DQA", L"DQB", L"DQC", L"DQD", L"DQE", L"DQF", L"DQG", L"DQH", L"DQI", L"DQJ", L"DQK", L"DQL", L"DQM", L"DQN", L"DQO", L"DQP", L"DQQ", L"DQR", L"DQS", L"DQT", L"DQU", L"DQV", L"DQW", L"DQX", L"DQY", L"DQZ", L"DRA", L"DRB", L"DRC", L"DRD", L"DRE", L"DRF", L"DRG", L"DRH", L"DRI", L"DRJ", L"DRK", L"DRL", L"DRM", L"DRN", L"DRO", L"DRP", L"DRQ", L"DRR", L"DRS", L"DRT", L"DRU", L"DRV", L"DRW", L"DRX", L"DRY", L"DRZ", L"DSA", L"DSB", L"DSC", L"DSD", L"DSE", L"DSF", L"DSG", L"DSH", L"DSI", L"DSJ", L"DSK", L"DSL", L"DSM", L"DSN", L"DSO", L"DSP", L"DSQ", L"DSR", L"DSS", L"DST", L"DSU", L"DSV", L"DSW", L"DSX", L"DSY", L"DSZ", L"DTA", L"DTB", L"DTC", L"DTD", L"DTE", L"DTF", L"DTG", L"DTH", L"DTI", L"DTJ", L"DTK", L"DTL", L"DTM", L"DTN", L"DTO", L"DTP", L"DTQ", L"DTR", L"DTS", L"DTT", L"DTU", L"DTV", L"DTW", L"DTX", L"DTY", L"DTZ", L"DUA", L"DUB", L"DUC", L"DUD", L"DUE", L"DUF", L"DUG", L"DUH", L"DUI", L"DUJ", L"DUK", L"DUL", L"DUM", L"DUN", L"DUO", L"DUP", L"DUQ", L"DUR", L"DUS", L"DUT", L"DUU", L"DUV", L"DUW", L"DUX", L"DUY", L"DUZ", L"DVA", L"DVB", L"DVC", L"DVD", L"DVE", L"DVF", L"DVG", L"DVH", L"DVI", L"DVJ", L"DVK", L"DVL", L"DVM", L"DVN", L"DVO", L"DVP", L"DVQ", L"DVR", L"DVS", L"DVT", L"DVU", L"DVV", L"DVW", L"DVX", L"DVY", L"DVZ", L"DWA", L"DWB", L"DWC", L"DWD", L"DWE", L"DWF", L"DWG", L"DWH", L"DWI", L"DWJ", L"DWK", L"DWL", L"DWM", L"DWN", L"DWO", L"DWP", L"DWQ", L"DWR", L"DWS", L"DWT", L"DWU", L"DWV", L"DWW", L"DWX", L"DWY", L"DWZ", L"DXA", L"DXB", L"DXC", L"DXD", L"DXE", L"DXF", L"DXG", L"DXH", L"DXI", L"DXJ", L"DXK", L"DXL", L"DXM", L"DXN", L"DXO", L"DXP", L"DXQ", L"DXR", L"DXS", + L"DXT", L"DXU", L"DXV", L"DXW", L"DXX", L"DXY", L"DXZ", L"DYA", L"DYB", L"DYC", L"DYD", L"DYE", L"DYF", L"DYG", L"DYH", L"DYI", L"DYJ", L"DYK", L"DYL", L"DYM", L"DYN", L"DYO", L"DYP", L"DYQ", L"DYR", L"DYS", L"DYT", L"DYU", L"DYV", L"DYW", L"DYX", L"DYY", L"DYZ", L"DZA", L"DZB", L"DZC", L"DZD", L"DZE", L"DZF", L"DZG", L"DZH", L"DZI", L"DZJ", L"DZK", L"DZL", L"DZM", L"DZN", L"DZO", L"DZP", L"DZQ", L"DZR", L"DZS", L"DZT", L"DZU", L"DZV", L"DZW", L"DZX", L"DZY", L"DZZ", L"EAA", L"EAB", L"EAC", L"EAD", L"EAE", L"EAF", L"EAG", L"EAH", L"EAI", L"EAJ", L"EAK", L"EAL", L"EAM", L"EAN", L"EAO", L"EAP", L"EAQ", L"EAR", L"EAS", L"EAT", L"EAU", L"EAV", L"EAW", L"EAX", L"EAY", L"EAZ", L"EBA", L"EBB", L"EBC", L"EBD", L"EBE", L"EBF", L"EBG", L"EBH", L"EBI", L"EBJ", L"EBK", L"EBL", L"EBM", L"EBN", L"EBO", L"EBP", L"EBQ", L"EBR", L"EBS", L"EBT", L"EBU", L"EBV", L"EBW", L"EBX", L"EBY", L"EBZ", L"ECA", L"ECB", L"ECC", L"ECD", L"ECE", L"ECF", L"ECG", L"ECH", L"ECI", L"ECJ", L"ECK", L"ECL", L"ECM", L"ECN", L"ECO", L"ECP", L"ECQ", L"ECR", L"ECS", L"ECT", L"ECU", L"ECV", L"ECW", L"ECX", L"ECY", L"ECZ", L"EDA", L"EDB", L"EDC", L"EDD", L"EDE", L"EDF", L"EDG", L"EDH", L"EDI", L"EDJ", L"EDK", L"EDL", L"EDM", L"EDN", L"EDO", L"EDP", L"EDQ", L"EDR", L"EDS", L"EDT", L"EDU", L"EDV", L"EDW", L"EDX", L"EDY", L"EDZ", L"EEA", L"EEB", L"EEC", L"EED", L"EEE", L"EEF", L"EEG", L"EEH", L"EEI", L"EEJ", L"EEK", L"EEL", L"EEM", L"EEN", L"EEO", L"EEP", L"EEQ", L"EER", L"EES", L"EET", L"EEU", L"EEV", L"EEW", L"EEX", L"EEY", L"EEZ", L"EFA", L"EFB", L"EFC", L"EFD", L"EFE", L"EFF", L"EFG", L"EFH", L"EFI", L"EFJ", L"EFK", L"EFL", L"EFM", L"EFN", L"EFO", L"EFP", L"EFQ", L"EFR", L"EFS", L"EFT", L"EFU", L"EFV", L"EFW", L"EFX", L"EFY", L"EFZ", L"EGA", L"EGB", L"EGC", L"EGD", L"EGE", L"EGF", L"EGG", L"EGH", L"EGI", L"EGJ", L"EGK", L"EGL", L"EGM", L"EGN", L"EGO", L"EGP", L"EGQ", L"EGR", L"EGS", L"EGT", L"EGU", L"EGV", L"EGW", L"EGX", L"EGY", L"EGZ", L"EHA", L"EHB", L"EHC", L"EHD", L"EHE", L"EHF", L"EHG", L"EHH", L"EHI", L"EHJ", L"EHK", L"EHL", L"EHM", L"EHN", L"EHO", L"EHP", L"EHQ", L"EHR", L"EHS", L"EHT", L"EHU", L"EHV", L"EHW", L"EHX", L"EHY", L"EHZ", L"EIA", L"EIB", L"EIC", L"EID", L"EIE", L"EIF", L"EIG", L"EIH", L"EII", L"EIJ", L"EIK", L"EIL", L"EIM", L"EIN", L"EIO", L"EIP", L"EIQ", L"EIR", L"EIS", L"EIT", L"EIU", L"EIV", L"EIW", L"EIX", L"EIY", L"EIZ", L"EJA", L"EJB", L"EJC", L"EJD", L"EJE", L"EJF", L"EJG", L"EJH", L"EJI", L"EJJ", L"EJK", L"EJL", L"EJM", L"EJN", L"EJO", L"EJP", L"EJQ", L"EJR", L"EJS", L"EJT", L"EJU", L"EJV", L"EJW", L"EJX", L"EJY", L"EJZ", L"EKA", L"EKB", L"EKC", L"EKD", L"EKE", L"EKF", L"EKG", L"EKH", L"EKI", L"EKJ", L"EKK", L"EKL", L"EKM", L"EKN", L"EKO", L"EKP", L"EKQ", L"EKR", L"EKS", L"EKT", L"EKU", L"EKV", L"EKW", L"EKX", L"EKY", L"EKZ", L"ELA", L"ELB", L"ELC", L"ELD", L"ELE", L"ELF", L"ELG", L"ELH", L"ELI", L"ELJ", L"ELK", L"ELL", L"ELM", L"ELN", L"ELO", L"ELP", L"ELQ", L"ELR", L"ELS", L"ELT", L"ELU", L"ELV", L"ELW", L"ELX", L"ELY", L"ELZ", L"EMA", L"EMB", L"EMC", L"EMD", L"EME", L"EMF", L"EMG", L"EMH", L"EMI", L"EMJ", L"EMK", L"EML", L"EMM", L"EMN", L"EMO", L"EMP", L"EMQ", L"EMR", L"EMS", L"EMT", L"EMU", L"EMV", L"EMW", L"EMX", L"EMY", L"EMZ", L"ENA", L"ENB", L"ENC", L"END", L"ENE", L"ENF", L"ENG", L"ENH", L"ENI", L"ENJ", L"ENK", L"ENL", L"ENM", L"ENN", L"ENO", L"ENP", L"ENQ", L"ENR", L"ENS", L"ENT", L"ENU", L"ENV", L"ENW", L"ENX", L"ENY", L"ENZ", L"EOA", L"EOB", L"EOC", L"EOD", L"EOE", L"EOF", L"EOG", L"EOH", L"EOI", L"EOJ", L"EOK", L"EOL", L"EOM", L"EON", L"EOO", L"EOP", L"EOQ", L"EOR", L"EOS", L"EOT", L"EOU", L"EOV", L"EOW", L"EOX", L"EOY", L"EOZ", L"EPA", L"EPB", L"EPC", L"EPD", L"EPE", L"EPF", L"EPG", L"EPH", L"EPI", L"EPJ", L"EPK", L"EPL", L"EPM", L"EPN", L"EPO", L"EPP", L"EPQ", L"EPR", L"EPS", L"EPT", L"EPU", L"EPV", L"EPW", L"EPX", L"EPY", L"EPZ", L"EQA", L"EQB", L"EQC", L"EQD", L"EQE", L"EQF", L"EQG", L"EQH", L"EQI", L"EQJ", L"EQK", L"EQL", L"EQM", L"EQN", L"EQO", L"EQP", L"EQQ", L"EQR", L"EQS", L"EQT", L"EQU", L"EQV", L"EQW", L"EQX", L"EQY", L"EQZ", L"ERA", L"ERB", L"ERC", L"ERD", L"ERE", L"ERF", L"ERG", L"ERH", L"ERI", L"ERJ", L"ERK", L"ERL", L"ERM", L"ERN", L"ERO", L"ERP", L"ERQ", L"ERR", L"ERS", L"ERT", L"ERU", L"ERV", L"ERW", L"ERX", L"ERY", L"ERZ", L"ESA", L"ESB", L"ESC", L"ESD", L"ESE", L"ESF", L"ESG", L"ESH", L"ESI", L"ESJ", L"ESK", L"ESL", L"ESM", L"ESN", L"ESO", L"ESP", L"ESQ", L"ESR", L"ESS", L"EST", L"ESU", L"ESV", L"ESW", L"ESX", L"ESY", L"ESZ", L"ETA", L"ETB", L"ETC", L"ETD", L"ETE", L"ETF", L"ETG", L"ETH", L"ETI", L"ETJ", L"ETK", L"ETL", L"ETM", L"ETN", L"ETO", L"ETP", L"ETQ", L"ETR", L"ETS", L"ETT", L"ETU", L"ETV", L"ETW", L"ETX", L"ETY", L"ETZ", L"EUA", L"EUB", L"EUC", L"EUD", L"EUE", L"EUF", L"EUG", L"EUH", L"EUI", L"EUJ", L"EUK", L"EUL", L"EUM", L"EUN", L"EUO", L"EUP", L"EUQ", L"EUR", L"EUS", L"EUT", L"EUU", L"EUV", L"EUW", L"EUX", L"EUY", L"EUZ", L"EVA", L"EVB", L"EVC", L"EVD", L"EVE", L"EVF", L"EVG", L"EVH", L"EVI", L"EVJ", L"EVK", L"EVL", L"EVM", L"EVN", L"EVO", L"EVP", L"EVQ", L"EVR", L"EVS", L"EVT", L"EVU", L"EVV", L"EVW", L"EVX", L"EVY", L"EVZ", L"EWA", L"EWB", L"EWC", L"EWD", L"EWE", L"EWF", L"EWG", L"EWH", L"EWI", L"EWJ", L"EWK", L"EWL", L"EWM", L"EWN", L"EWO", L"EWP", L"EWQ", L"EWR", L"EWS", L"EWT", L"EWU", L"EWV", L"EWW", L"EWX", L"EWY", L"EWZ", L"EXA", L"EXB", L"EXC", L"EXD", L"EXE", L"EXF", L"EXG", L"EXH", L"EXI", L"EXJ", L"EXK", L"EXL", L"EXM", L"EXN", L"EXO", L"EXP", L"EXQ", L"EXR", L"EXS", L"EXT", L"EXU", L"EXV", L"EXW", L"EXX", L"EXY", L"EXZ", L"EYA", L"EYB", L"EYC", L"EYD", L"EYE", L"EYF", L"EYG", L"EYH", L"EYI", L"EYJ", L"EYK", L"EYL", L"EYM", L"EYN", L"EYO", L"EYP", L"EYQ", L"EYR", L"EYS", L"EYT", L"EYU", L"EYV", L"EYW", L"EYX", L"EYY", L"EYZ", L"EZA", L"EZB", L"EZC", L"EZD", L"EZE", L"EZF", L"EZG", L"EZH", L"EZI", L"EZJ", L"EZK", L"EZL", L"EZM", L"EZN", L"EZO", L"EZP", L"EZQ", L"EZR", L"EZS", L"EZT", L"EZU", L"EZV", L"EZW", L"EZX", L"EZY", L"EZZ", L"FAA", L"FAB", L"FAC", L"FAD", L"FAE", L"FAF", L"FAG", L"FAH", L"FAI", L"FAJ", L"FAK", L"FAL", L"FAM", L"FAN", L"FAO", L"FAP", L"FAQ", L"FAR", L"FAS", L"FAT", L"FAU", L"FAV", L"FAW", L"FAX", L"FAY", L"FAZ", L"FBA", L"FBB", L"FBC", L"FBD", L"FBE", L"FBF", L"FBG", L"FBH", L"FBI", L"FBJ", L"FBK", L"FBL", L"FBM", L"FBN", L"FBO", L"FBP", L"FBQ", L"FBR", L"FBS", L"FBT", L"FBU", L"FBV", L"FBW", L"FBX", L"FBY", L"FBZ", L"FCA", L"FCB", L"FCC", L"FCD", L"FCE", L"FCF", L"FCG", L"FCH", L"FCI", L"FCJ", L"FCK", L"FCL", L"FCM", L"FCN", L"FCO", L"FCP", L"FCQ", L"FCR", L"FCS", L"FCT", L"FCU", L"FCV", L"FCW", L"FCX", L"FCY", L"FCZ", L"FDA", L"FDB", L"FDC", L"FDD", L"FDE", L"FDF", - L"FDG", L"FDH", L"FDI", L"FDJ", L"FDK", L"FDL", L"FDM", L"FDN", L"FDO", L"FDP", L"FDQ", L"FDR", L"FDS", L"FDT", L"FDU", L"FDV", L"FDW", L"FDX", L"FDY", L"FDZ", L"FEA", L"FEB", L"FEC", L"FED", L"FEE", L"FEF", L"FEG", L"FEH", L"FEI", L"FEJ", L"FEK", L"FEL", L"FEM", L"FEN", L"FEO", L"FEP", L"FEQ", L"FER", L"FES", L"FET", L"FEU", L"FEV", L"FEW", L"FEX", L"FEY", L"FEZ", L"FFA", L"FFB", L"FFC", L"FFD", L"FFE", L"FFF", L"FFG", L"FFH", L"FFI", L"FFJ", L"FFK", L"FFL", L"FFM", L"FFN", L"FFO", L"FFP", L"FFQ", L"FFR", L"FFS", L"FFT", L"FFU", L"FFV", L"FFW", L"FFX", L"FFY", L"FFZ", L"FGA", L"FGB", L"FGC", L"FGD", L"FGE", L"FGF", L"FGG", L"FGH", L"FGI", L"FGJ", L"FGK", L"FGL", L"FGM", L"FGN", L"FGO", L"FGP", L"FGQ", L"FGR", L"FGS", L"FGT", L"FGU", L"FGV", L"FGW", L"FGX", L"FGY", L"FGZ", L"FHA", L"FHB", L"FHC", L"FHD", L"FHE", L"FHF", L"FHG", L"FHH", L"FHI", L"FHJ", L"FHK", L"FHL", L"FHM", L"FHN", L"FHO", L"FHP", L"FHQ", L"FHR", L"FHS", L"FHT", L"FHU", L"FHV", L"FHW", L"FHX", L"FHY", L"FHZ", L"FIA", L"FIB", L"FIC", L"FID", L"FIE", L"FIF", L"FIG", L"FIH", L"FII", L"FIJ", L"FIK", L"FIL", L"FIM", L"FIN", L"FIO", L"FIP", L"FIQ", L"FIR", L"FIS", L"FIT", L"FIU", L"FIV", L"FIW", L"FIX", L"FIY", L"FIZ", L"FJA", L"FJB", L"FJC", L"FJD", L"FJE", L"FJF", L"FJG", L"FJH", L"FJI", L"FJJ", L"FJK", L"FJL", L"FJM", L"FJN", L"FJO", L"FJP", L"FJQ", L"FJR", L"FJS", L"FJT", L"FJU", L"FJV", L"FJW", L"FJX", L"FJY", L"FJZ", L"FKA", L"FKB", L"FKC", L"FKD", L"FKE", L"FKF", L"FKG", L"FKH", L"FKI", L"FKJ", L"FKK", L"FKL", L"FKM", L"FKN", L"FKO", L"FKP", L"FKQ", L"FKR", L"FKS", L"FKT", L"FKU", L"FKV", L"FKW", L"FKX", L"FKY", L"FKZ", L"FLA", L"FLB", L"FLC", L"FLD", L"FLE", L"FLF", L"FLG", L"FLH", L"FLI", L"FLJ", L"FLK", L"FLL", L"FLM", L"FLN", L"FLO", L"FLP", L"FLQ", L"FLR", L"FLS", L"FLT", L"FLU", L"FLV", L"FLW", L"FLX", L"FLY", L"FLZ", L"FMA", L"FMB", L"FMC", L"FMD", L"FME", L"FMF", L"FMG", L"FMH", L"FMI", L"FMJ", L"FMK", L"FML", L"FMM", L"FMN", L"FMO", L"FMP", L"FMQ", L"FMR", L"FMS", L"FMT", L"FMU", L"FMV", L"FMW", L"FMX", L"FMY", L"FMZ", L"FNA", L"FNB", L"FNC", L"FND", L"FNE", L"FNF", L"FNG", L"FNH", L"FNI", L"FNJ", L"FNK", L"FNL", L"FNM", L"FNN", L"FNO", L"FNP", L"FNQ", L"FNR", L"FNS", L"FNT", L"FNU", L"FNV", L"FNW", L"FNX", L"FNY", L"FNZ", L"FOA", L"FOB", L"FOC", L"FOD", L"FOE", L"FOF", L"FOG", L"FOH", L"FOI", L"FOJ", L"FOK", L"FOL", L"FOM", L"FON", L"FOO", L"FOP", L"FOQ", L"FOR", L"FOS", L"FOT", L"FOU", L"FOV", L"FOW", L"FOX", L"FOY", L"FOZ", L"FPA", L"FPB", L"FPC", L"FPD", L"FPE", L"FPF", L"FPG", L"FPH", L"FPI", L"FPJ", L"FPK", L"FPL", L"FPM", L"FPN", L"FPO", L"FPP", L"FPQ", L"FPR", L"FPS", L"FPT", L"FPU", L"FPV", L"FPW", L"FPX", L"FPY", L"FPZ", L"FQA", L"FQB", L"FQC", L"FQD", L"FQE", L"FQF", L"FQG", L"FQH", L"FQI", L"FQJ", L"FQK", L"FQL", L"FQM", L"FQN", L"FQO", L"FQP", L"FQQ", L"FQR", L"FQS", L"FQT", L"FQU", L"FQV", L"FQW", L"FQX", L"FQY", L"FQZ", L"FRA", L"FRB", L"FRC", L"FRD", L"FRE", L"FRF", L"FRG", L"FRH", L"FRI", L"FRJ", L"FRK", L"FRL", L"FRM", L"FRN", L"FRO", L"FRP", L"FRQ", L"FRR", L"FRS", L"FRT", L"FRU", L"FRV", L"FRW", L"FRX", L"FRY", L"FRZ", L"FSA", L"FSB", L"FSC", L"FSD", L"FSE", L"FSF", L"FSG", L"FSH", L"FSI", L"FSJ", L"FSK", L"FSL", L"FSM", L"FSN", L"FSO", L"FSP", L"FSQ", L"FSR", L"FSS", L"FST", L"FSU", L"FSV", L"FSW", L"FSX", L"FSY", L"FSZ", L"FTA", L"FTB", L"FTC", L"FTD", L"FTE", L"FTF", L"FTG", L"FTH", L"FTI", L"FTJ", L"FTK", L"FTL", L"FTM", L"FTN", L"FTO", L"FTP", L"FTQ", L"FTR", L"FTS", L"FTT", L"FTU", L"FTV", L"FTW", L"FTX", L"FTY", L"FTZ", L"FUA", L"FUB", L"FUC", L"FUD", L"FUE", L"FUF", L"FUG", L"FUH", L"FUI", L"FUJ", L"FUK", L"FUL", L"FUM", L"FUN", L"FUO", L"FUP", L"FUQ", L"FUR", L"FUS", L"FUT", L"FUU", L"FUV", L"FUW", L"FUX", L"FUY", L"FUZ", L"FVA", L"FVB", L"FVC", L"FVD", L"FVE", L"FVF", L"FVG", L"FVH", L"FVI", L"FVJ", L"FVK", L"FVL", L"FVM", L"FVN", L"FVO", L"FVP", L"FVQ", L"FVR", L"FVS", L"FVT", L"FVU", L"FVV", L"FVW", L"FVX", L"FVY", L"FVZ", L"FWA", L"FWB", L"FWC", L"FWD", L"FWE", L"FWF", L"FWG", L"FWH", L"FWI", L"FWJ", L"FWK", L"FWL", L"FWM", L"FWN", L"FWO", L"FWP", L"FWQ", L"FWR", L"FWS", L"FWT", L"FWU", L"FWV", L"FWW", L"FWX", L"FWY", L"FWZ", L"FXA", L"FXB", L"FXC", L"FXD", L"FXE", L"FXF", L"FXG", L"FXH", L"FXI", L"FXJ", L"FXK", L"FXL", L"FXM", L"FXN", L"FXO", L"FXP", L"FXQ", L"FXR", L"FXS", L"FXT", L"FXU", L"FXV", L"FXW", L"FXX", + L"FDG", L"FDH", L"FDI", L"FDJ", L"FDK", L"FDL", L"FDM", L"FDN", L"FDO", L"FDP", L"FDQ", L"FDR", L"FDS", L"FDT", L"FDU", L"FDV", L"FDW", L"FDX", L"FDY", L"FDZ", L"FEA", L"FEB", L"FEC", L"FED", L"FEE", L"FEF", L"FEG", L"FEH", L"FEI", L"FEJ", L"FEK", L"FEL", L"FEM", L"FEN", L"FEO", L"FEP", L"FEQ", L"FER", L"FES", L"FET", L"FEU", L"FEV", L"FEW", L"FEX", L"FEY", L"FEZ", L"FFA", L"FFB", L"FFC", L"FFD", L"FFE", L"FFF", L"FFG", L"FFH", L"FFI", L"FFJ", L"FFK", L"FFL", L"FFM", L"FFN", L"FFO", L"FFP", L"FFQ", L"FFR", L"FFS", L"FFT", L"FFU", L"FFV", L"FFW", L"FFX", L"FFY", L"FFZ", L"FGA", L"FGB", L"FGC", L"FGD", L"FGE", L"FGF", L"FGG", L"FGH", L"FGI", L"FGJ", L"FGK", L"FGL", L"FGM", L"FGN", L"FGO", L"FGP", L"FGQ", L"FGR", L"FGS", L"FGT", L"FGU", L"FGV", L"FGW", L"FGX", L"FGY", L"FGZ", L"FHA", L"FHB", L"FHC", L"FHD", L"FHE", L"FHF", L"FHG", L"FHH", L"FHI", L"FHJ", L"FHK", L"FHL", L"FHM", L"FHN", L"FHO", L"FHP", L"FHQ", L"FHR", L"FHS", L"FHT", L"FHU", L"FHV", L"FHW", L"FHX", L"FHY", L"FHZ", L"FIA", L"FIB", L"FIC", L"FID", L"FIE", L"FIF", L"FIG", L"FIH", L"FII", L"FIJ", L"FIK", L"FIL", L"FIM", L"FIN", L"FIO", L"FIP", L"FIQ", L"FIR", L"FIS", L"FIT", L"FIU", L"FIV", L"FIW", L"FIX", L"FIY", L"FIZ", L"FJA", L"FJB", L"FJC", L"FJD", L"FJE", L"FJF", L"FJG", L"FJH", L"FJI", L"FJJ", L"FJK", L"FJL", L"FJM", L"FJN", L"FJO", L"FJP", L"FJQ", L"FJR", L"FJS", L"FJT", L"FJU", L"FJV", L"FJW", L"FJX", L"FJY", L"FJZ", L"FKA", L"FKB", L"FKC", L"FKD", L"FKE", L"FKF", L"FKG", L"FKH", L"FKI", L"FKJ", L"FKK", L"FKL", L"FKM", L"FKN", L"FKO", L"FKP", L"FKQ", L"FKR", L"FKS", L"FKT", L"FKU", L"FKV", L"FKW", L"FKX", L"FKY", L"FKZ", L"FLA", L"FLB", L"FLC", L"FLD", L"FLE", L"FLF", L"FLG", L"FLH", L"FLI", L"FLJ", L"FLK", L"FLL", L"FLM", L"FLN", L"FLO", L"FLP", L"FLQ", L"FLR", L"FLS", L"FLT", L"FLU", L"FLV", L"FLW", L"FLX", L"FLY", L"FLZ", L"FMA", L"FMB", L"FMC", L"FMD", L"FME", L"FMF", L"FMG", L"FMH", L"FMI", L"FMJ", L"FMK", L"FML", L"FMM", L"FMN", L"FMO", L"FMP", L"FMQ", L"FMR", L"FMS", L"FMT", L"FMU", L"FMV", L"FMW", L"FMX", L"FMY", L"FMZ", L"FNA", L"FNB", L"FNC", L"FND", L"FNE", L"FNF", L"FNG", L"FNH", L"FNI", L"FNJ", L"FNK", L"FNL", L"FNM", L"FNN", L"FNO", L"FNP", L"FNQ", L"FNR", L"FNS", L"FNT", L"FNU", L"FNV", L"FNW", L"FNX", L"FNY", L"FNZ", L"FOA", L"FOB", L"FOC", L"FOD", L"FOE", L"FOF", L"FOG", L"FOH", L"FOI", L"FOJ", L"FOK", L"FOL", L"FOM", L"FON", L"FOO", L"FOP", L"FOQ", L"FOR", L"FOS", L"FOT", L"FOU", L"FOV", L"FOW", L"FOX", L"FOY", L"FOZ", L"FPA", L"FPB", L"FPC", L"FPD", L"FPE", L"FPF", L"FPG", L"FPH", L"FPI", L"FPJ", L"FPK", L"FPL", L"FPM", L"FPN", L"FPO", L"FPP", L"FPQ", L"FPR", L"FPS", L"FPT", L"FPU", L"FPV", L"FPW", L"FPX", L"FPY", L"FPZ", L"FQA", L"FQB", L"FQC", L"FQD", L"FQE", L"FQF", L"FQG", L"FQH", L"FQI", L"FQJ", L"FQK", L"FQL", L"FQM", L"FQN", L"FQO", L"FQP", L"FQQ", L"FQR", L"FQS", L"FQT", L"FQU", L"FQV", L"FQW", L"FQX", L"FQY", L"FQZ", L"FRA", L"FRB", L"FRC", L"FRD", L"FRE", L"FRF", L"FRG", L"FRH", L"FRI", L"FRJ", L"FRK", L"FRL", L"FRM", L"FRN", L"FRO", L"FRP", L"FRQ", L"FRR", L"FRS", L"FRT", L"FRU", L"FRV", L"FRW", L"FRX", L"FRY", L"FRZ", L"FSA", L"FSB", L"FSC", L"FSD", L"FSE", L"FSF", L"FSG", L"FSH", L"FSI", L"FSJ", L"FSK", L"FSL", L"FSM", L"FSN", L"FSO", L"FSP", L"FSQ", L"FSR", L"FSS", L"FST", L"FSU", L"FSV", L"FSW", L"FSX", L"FSY", L"FSZ", L"FTA", L"FTB", L"FTC", L"FTD", L"FTE", L"FTF", L"FTG", L"FTH", L"FTI", L"FTJ", L"FTK", L"FTL", L"FTM", L"FTN", L"FTO", L"FTP", L"FTQ", L"FTR", L"FTS", L"FTT", L"FTU", L"FTV", L"FTW", L"FTX", L"FTY", L"FTZ", L"FUA", L"FUB", L"FUC", L"FUD", L"FUE", L"FUF", L"FUG", L"FUH", L"FUI", L"FUJ", L"FUK", L"FUL", L"FUM", L"FUN", L"FUO", L"FUP", L"FUQ", L"FUR", L"FUS", L"FUT", L"FUU", L"FUV", L"FUW", L"FUX", L"FUY", L"FUZ", L"FVA", L"FVB", L"FVC", L"FVD", L"FVE", L"FVF", L"FVG", L"FVH", L"FVI", L"FVJ", L"FVK", L"FVL", L"FVM", L"FVN", L"FVO", L"FVP", L"FVQ", L"FVR", L"FVS", L"FVT", L"FVU", L"FVV", L"FVW", L"FVX", L"FVY", L"FVZ", L"FWA", L"FWB", L"FWC", L"FWD", L"FWE", L"FWF", L"FWG", L"FWH", L"FWI", L"FWJ", L"FWK", L"FWL", L"FWM", L"FWN", L"FWO", L"FWP", L"FWQ", L"FWR", L"FWS", L"FWT", L"FWU", L"FWV", L"FWW", L"FWX", L"FWY", L"FWZ", L"FXA", L"FXB", L"FXC", L"FXD", L"FXE", L"FXF", L"FXG", L"FXH", L"FXI", L"FXJ", L"FXK", L"FXL", L"FXM", L"FXN", L"FXO", L"FXP", L"FXQ", L"FXR", L"FXS", L"FXT", L"FXU", L"FXV", L"FXW", L"FXX", L"FXY", L"FXZ", L"FYA", L"FYB", L"FYC", L"FYD", L"FYE", L"FYF", L"FYG", L"FYH", L"FYI", L"FYJ", L"FYK", L"FYL", L"FYM", L"FYN", L"FYO", L"FYP", L"FYQ", L"FYR", L"FYS", L"FYT", L"FYU", L"FYV", L"FYW", L"FYX", L"FYY", L"FYZ", L"FZA", L"FZB", L"FZC", L"FZD", L"FZE", L"FZF", L"FZG", L"FZH", L"FZI", L"FZJ", L"FZK", L"FZL", L"FZM", L"FZN", L"FZO", L"FZP", L"FZQ", L"FZR", L"FZS", L"FZT", L"FZU", L"FZV", L"FZW", L"FZX", L"FZY", L"FZZ", L"GAA", L"GAB", L"GAC", L"GAD", L"GAE", L"GAF", L"GAG", L"GAH", L"GAI", L"GAJ", L"GAK", L"GAL", L"GAM", L"GAN", L"GAO", L"GAP", L"GAQ", L"GAR", L"GAS", L"GAT", L"GAU", L"GAV", L"GAW", L"GAX", L"GAY", L"GAZ", L"GBA", L"GBB", L"GBC", L"GBD", L"GBE", L"GBF", L"GBG", L"GBH", L"GBI", L"GBJ", L"GBK", L"GBL", L"GBM", L"GBN", L"GBO", L"GBP", L"GBQ", L"GBR", L"GBS", L"GBT", L"GBU", L"GBV", L"GBW", L"GBX", L"GBY", L"GBZ", L"GCA", L"GCB", L"GCC", L"GCD", L"GCE", L"GCF", L"GCG", L"GCH", L"GCI", L"GCJ", L"GCK", L"GCL", L"GCM", L"GCN", L"GCO", L"GCP", L"GCQ", L"GCR", L"GCS", L"GCT", L"GCU", L"GCV", L"GCW", L"GCX", L"GCY", L"GCZ", L"GDA", L"GDB", L"GDC", L"GDD", L"GDE", L"GDF", L"GDG", L"GDH", L"GDI", L"GDJ", L"GDK", L"GDL", L"GDM", L"GDN", L"GDO", L"GDP", L"GDQ", L"GDR", L"GDS", L"GDT", L"GDU", L"GDV", L"GDW", L"GDX", L"GDY", L"GDZ", L"GEA", L"GEB", L"GEC", L"GED", L"GEE", L"GEF", L"GEG", L"GEH", L"GEI", L"GEJ", L"GEK", L"GEL", L"GEM", L"GEN", L"GEO", L"GEP", L"GEQ", L"GER", L"GES", L"GET", L"GEU", L"GEV", L"GEW", L"GEX", L"GEY", L"GEZ", L"GFA", L"GFB", L"GFC", L"GFD", L"GFE", L"GFF", L"GFG", L"GFH", L"GFI", L"GFJ", L"GFK", L"GFL", L"GFM", L"GFN", L"GFO", L"GFP", L"GFQ", L"GFR", L"GFS", L"GFT", L"GFU", L"GFV", L"GFW", L"GFX", L"GFY", L"GFZ", L"GGA", L"GGB", L"GGC", L"GGD", L"GGE", L"GGF", L"GGG", L"GGH", L"GGI", L"GGJ", L"GGK", L"GGL", L"GGM", L"GGN", L"GGO", L"GGP", L"GGQ", L"GGR", L"GGS", L"GGT", L"GGU", L"GGV", L"GGW", L"GGX", L"GGY", L"GGZ", L"GHA", L"GHB", L"GHC", L"GHD", L"GHE", L"GHF", L"GHG", L"GHH", L"GHI", L"GHJ", L"GHK", L"GHL", L"GHM", L"GHN", L"GHO", L"GHP", L"GHQ", L"GHR", L"GHS", L"GHT", L"GHU", L"GHV", L"GHW", L"GHX", L"GHY", L"GHZ", L"GIA", L"GIB", L"GIC", L"GID", L"GIE", L"GIF", L"GIG", L"GIH", L"GII", L"GIJ", L"GIK", L"GIL", L"GIM", L"GIN", L"GIO", L"GIP", L"GIQ", L"GIR", L"GIS", - L"GIT", L"GIU", L"GIV", L"GIW", L"GIX", L"GIY", L"GIZ", L"GJA", L"GJB", L"GJC", L"GJD", L"GJE", L"GJF", L"GJG", L"GJH", L"GJI", L"GJJ", L"GJK", L"GJL", L"GJM", L"GJN", L"GJO", L"GJP", L"GJQ", L"GJR", L"GJS", L"GJT", L"GJU", L"GJV", L"GJW", L"GJX", L"GJY", L"GJZ", L"GKA", L"GKB", L"GKC", L"GKD", L"GKE", L"GKF", L"GKG", L"GKH", L"GKI", L"GKJ", L"GKK", L"GKL", L"GKM", L"GKN", L"GKO", L"GKP", L"GKQ", L"GKR", L"GKS", L"GKT", L"GKU", L"GKV", L"GKW", L"GKX", L"GKY", L"GKZ", L"GLA", L"GLB", L"GLC", L"GLD", L"GLE", L"GLF", L"GLG", L"GLH", L"GLI", L"GLJ", L"GLK", L"GLL", L"GLM", L"GLN", L"GLO", L"GLP", L"GLQ", L"GLR", L"GLS", L"GLT", L"GLU", L"GLV", L"GLW", L"GLX", L"GLY", L"GLZ", L"GMA", L"GMB", L"GMC", L"GMD", L"GME", L"GMF", L"GMG", L"GMH", L"GMI", L"GMJ", L"GMK", L"GML", L"GMM", L"GMN", L"GMO", L"GMP", L"GMQ", L"GMR", L"GMS", L"GMT", L"GMU", L"GMV", L"GMW", L"GMX", L"GMY", L"GMZ", L"GNA", L"GNB", L"GNC", L"GND", L"GNE", L"GNF", L"GNG", L"GNH", L"GNI", L"GNJ", L"GNK", L"GNL", L"GNM", L"GNN", L"GNO", L"GNP", L"GNQ", L"GNR", L"GNS", L"GNT", L"GNU", L"GNV", L"GNW", L"GNX", L"GNY", L"GNZ", L"GOA", L"GOB", L"GOC", L"GOD", L"GOE", L"GOF", L"GOG", L"GOH", L"GOI", L"GOJ", L"GOK", L"GOL", L"GOM", L"GON", L"GOO", L"GOP", L"GOQ", L"GOR", L"GOS", L"GOT", L"GOU", L"GOV", L"GOW", L"GOX", L"GOY", L"GOZ", L"GPA", L"GPB", L"GPC", L"GPD", L"GPE", L"GPF", L"GPG", L"GPH", L"GPI", L"GPJ", L"GPK", L"GPL", L"GPM", L"GPN", L"GPO", L"GPP", L"GPQ", L"GPR", L"GPS", L"GPT", L"GPU", L"GPV", L"GPW", L"GPX", L"GPY", L"GPZ", L"GQA", L"GQB", L"GQC", L"GQD", L"GQE", L"GQF", L"GQG", L"GQH", L"GQI", L"GQJ", L"GQK", L"GQL", L"GQM", L"GQN", L"GQO", L"GQP", L"GQQ", L"GQR", L"GQS", L"GQT", L"GQU", L"GQV", L"GQW", L"GQX", L"GQY", L"GQZ", L"GRA", L"GRB", L"GRC", L"GRD", L"GRE", L"GRF", L"GRG", L"GRH", L"GRI", L"GRJ", L"GRK", L"GRL", L"GRM", L"GRN", L"GRO", L"GRP", L"GRQ", L"GRR", L"GRS", L"GRT", L"GRU", L"GRV", L"GRW", L"GRX", L"GRY", L"GRZ", L"GSA", L"GSB", L"GSC", L"GSD", L"GSE", L"GSF", L"GSG", L"GSH", L"GSI", L"GSJ", L"GSK", L"GSL", L"GSM", L"GSN", L"GSO", L"GSP", L"GSQ", L"GSR", L"GSS", L"GST", L"GSU", L"GSV", L"GSW", L"GSX", L"GSY", L"GSZ", L"GTA", L"GTB", L"GTC", L"GTD", L"GTE", L"GTF", - L"GTG", L"GTH", L"GTI", L"GTJ", L"GTK", L"GTL", L"GTM", L"GTN", L"GTO", L"GTP", L"GTQ", L"GTR", L"GTS", L"GTT", L"GTU", L"GTV", L"GTW", L"GTX", L"GTY", L"GTZ", L"GUA", L"GUB", L"GUC", L"GUD", L"GUE", L"GUF", L"GUG", L"GUH", L"GUI", L"GUJ", L"GUK", L"GUL", L"GUM", L"GUN", L"GUO", L"GUP", L"GUQ", L"GUR", L"GUS", L"GUT", L"GUU", L"GUV", L"GUW", L"GUX", L"GUY", L"GUZ", L"GVA", L"GVB", L"GVC", L"GVD", L"GVE", L"GVF", L"GVG", L"GVH", L"GVI", L"GVJ", L"GVK", L"GVL", L"GVM", L"GVN", L"GVO", L"GVP", L"GVQ", L"GVR", L"GVS", L"GVT", L"GVU", L"GVV", L"GVW", L"GVX", L"GVY", L"GVZ", L"GWA", L"GWB", L"GWC", L"GWD", L"GWE", L"GWF", L"GWG", L"GWH", L"GWI", L"GWJ", L"GWK", L"GWL", L"GWM", L"GWN", L"GWO", L"GWP", L"GWQ", L"GWR", L"GWS", L"GWT", L"GWU", L"GWV", L"GWW", L"GWX", L"GWY", L"GWZ", L"GXA", L"GXB", L"GXC", L"GXD", L"GXE", L"GXF", L"GXG", L"GXH", L"GXI", L"GXJ", L"GXK", L"GXL", L"GXM", L"GXN", L"GXO", L"GXP", L"GXQ", L"GXR", L"GXS", L"GXT", L"GXU", L"GXV", L"GXW", L"GXX", L"GXY", L"GXZ", L"GYA", L"GYB", L"GYC", L"GYD", L"GYE", L"GYF", L"GYG", L"GYH", L"GYI", L"GYJ", L"GYK", L"GYL", L"GYM", L"GYN", L"GYO", L"GYP", L"GYQ", L"GYR", L"GYS", L"GYT", L"GYU", L"GYV", L"GYW", L"GYX", L"GYY", L"GYZ", L"GZA", L"GZB", L"GZC", L"GZD", L"GZE", L"GZF", L"GZG", L"GZH", L"GZI", L"GZJ", L"GZK", L"GZL", L"GZM", L"GZN", L"GZO", L"GZP", L"GZQ", L"GZR", L"GZS", L"GZT", L"GZU", L"GZV", L"GZW", L"GZX", L"GZY", L"GZZ", L"HAA", L"HAB", L"HAC", L"HAD", L"HAE", L"HAF", L"HAG", L"HAH", L"HAI", L"HAJ", L"HAK", L"HAL", L"HAM", L"HAN", L"HAO", L"HAP", L"HAQ", L"HAR", L"HAS", L"HAT", L"HAU", L"HAV", L"HAW", L"HAX", L"HAY", L"HAZ", L"HBA", L"HBB", L"HBC", L"HBD", L"HBE", L"HBF", L"HBG", L"HBH", L"HBI", L"HBJ", L"HBK", L"HBL", L"HBM", L"HBN", L"HBO", L"HBP", L"HBQ", L"HBR", L"HBS", L"HBT", L"HBU", L"HBV", L"HBW", L"HBX", L"HBY", L"HBZ", L"HCA", L"HCB", L"HCC", L"HCD", L"HCE", L"HCF", L"HCG", L"HCH", L"HCI", L"HCJ", L"HCK", L"HCL", L"HCM", L"HCN", L"HCO", L"HCP", L"HCQ", L"HCR", L"HCS", L"HCT", L"HCU", L"HCV", L"HCW", L"HCX", L"HCY", L"HCZ", L"HDA", L"HDB", L"HDC", L"HDD", L"HDE", L"HDF", L"HDG", L"HDH", L"HDI", L"HDJ", L"HDK", L"HDL", L"HDM", L"HDN", L"HDO", L"HDP", L"HDQ", L"HDR", L"HDS", - L"HDT", L"HDU", L"HDV", L"HDW", L"HDX", L"HDY", L"HDZ", L"HEA", L"HEB", L"HEC", L"HED", L"HEE", L"HEF", L"HEG", L"HEH", L"HEI", L"HEJ", L"HEK", L"HEL", L"HEM", L"HEN", L"HEO", L"HEP", L"HEQ", L"HER", L"HES", L"HET", L"HEU", L"HEV", L"HEW", L"HEX", L"HEY", L"HEZ", L"HFA", L"HFB", L"HFC", L"HFD", L"HFE", L"HFF", L"HFG", L"HFH", L"HFI", L"HFJ", L"HFK", L"HFL", L"HFM", L"HFN", L"HFO", L"HFP", L"HFQ", L"HFR", L"HFS", L"HFT", L"HFU", L"HFV", L"HFW", L"HFX", L"HFY", L"HFZ", L"HGA", L"HGB", L"HGC", L"HGD", L"HGE", L"HGF", L"HGG", L"HGH", L"HGI", L"HGJ", L"HGK", L"HGL", L"HGM", L"HGN", L"HGO", L"HGP", L"HGQ", L"HGR", L"HGS", L"HGT", L"HGU", L"HGV", L"HGW", L"HGX", L"HGY", L"HGZ", L"HHA", L"HHB", L"HHC", L"HHD", L"HHE", L"HHF", L"HHG", L"HHH", L"HHI", L"HHJ", L"HHK", L"HHL", L"HHM", L"HHN", L"HHO", L"HHP", L"HHQ", L"HHR", L"HHS", L"HHT", L"HHU", L"HHV", L"HHW", L"HHX", L"HHY", L"HHZ", L"HIA", L"HIB", L"HIC", L"HID", L"HIE", L"HIF", L"HIG", L"HIH", L"HII", L"HIJ", L"HIK", L"HIL", L"HIM", L"HIN", L"HIO", L"HIP", L"HIQ", L"HIR", L"HIS", L"HIT", L"HIU", L"HIV", L"HIW", L"HIX", L"HIY", L"HIZ", L"HJA", L"HJB", L"HJC", L"HJD", L"HJE", L"HJF", L"HJG", L"HJH", L"HJI", L"HJJ", L"HJK", L"HJL", L"HJM", L"HJN", L"HJO", L"HJP", L"HJQ", L"HJR", L"HJS", L"HJT", L"HJU", L"HJV", L"HJW", L"HJX", L"HJY", L"HJZ", L"HKA", L"HKB", L"HKC", L"HKD", L"HKE", L"HKF", L"HKG", L"HKH", L"HKI", L"HKJ", L"HKK", L"HKL", L"HKM", L"HKN", L"HKO", L"HKP", L"HKQ", L"HKR", L"HKS", L"HKT", L"HKU", L"HKV", L"HKW", L"HKX", L"HKY", L"HKZ", L"HLA", L"HLB", L"HLC", L"HLD", L"HLE", L"HLF", L"HLG", L"HLH", L"HLI", L"HLJ", L"HLK", L"HLL", L"HLM", L"HLN", L"HLO", L"HLP", L"HLQ", L"HLR", L"HLS", L"HLT", L"HLU", L"HLV", L"HLW", L"HLX", L"HLY", L"HLZ", L"HMA", L"HMB", L"HMC", L"HMD", L"HME", L"HMF", L"HMG", L"HMH", L"HMI", L"HMJ", L"HMK", L"HML", L"HMM", L"HMN", L"HMO", L"HMP", L"HMQ", L"HMR", L"HMS", L"HMT", L"HMU", L"HMV", L"HMW", L"HMX", L"HMY", L"HMZ", L"HNA", L"HNB", L"HNC", L"HND", L"HNE", L"HNF", L"HNG", L"HNH", L"HNI", L"HNJ", L"HNK", L"HNL", L"HNM", L"HNN", L"HNO", L"HNP", L"HNQ", L"HNR", L"HNS", L"HNT", L"HNU", L"HNV", L"HNW", L"HNX", L"HNY", L"HNZ", L"HOA", L"HOB", L"HOC", L"HOD", L"HOE", L"HOF", + L"GIT", L"GIU", L"GIV", L"GIW", L"GIX", L"GIY", L"GIZ", L"GJA", L"GJB", L"GJC", L"GJD", L"GJE", L"GJF", L"GJG", L"GJH", L"GJI", L"GJJ", L"GJK", L"GJL", L"GJM", L"GJN", L"GJO", L"GJP", L"GJQ", L"GJR", L"GJS", L"GJT", L"GJU", L"GJV", L"GJW", L"GJX", L"GJY", L"GJZ", L"GKA", L"GKB", L"GKC", L"GKD", L"GKE", L"GKF", L"GKG", L"GKH", L"GKI", L"GKJ", L"GKK", L"GKL", L"GKM", L"GKN", L"GKO", L"GKP", L"GKQ", L"GKR", L"GKS", L"GKT", L"GKU", L"GKV", L"GKW", L"GKX", L"GKY", L"GKZ", L"GLA", L"GLB", L"GLC", L"GLD", L"GLE", L"GLF", L"GLG", L"GLH", L"GLI", L"GLJ", L"GLK", L"GLL", L"GLM", L"GLN", L"GLO", L"GLP", L"GLQ", L"GLR", L"GLS", L"GLT", L"GLU", L"GLV", L"GLW", L"GLX", L"GLY", L"GLZ", L"GMA", L"GMB", L"GMC", L"GMD", L"GME", L"GMF", L"GMG", L"GMH", L"GMI", L"GMJ", L"GMK", L"GML", L"GMM", L"GMN", L"GMO", L"GMP", L"GMQ", L"GMR", L"GMS", L"GMT", L"GMU", L"GMV", L"GMW", L"GMX", L"GMY", L"GMZ", L"GNA", L"GNB", L"GNC", L"GND", L"GNE", L"GNF", L"GNG", L"GNH", L"GNI", L"GNJ", L"GNK", L"GNL", L"GNM", L"GNN", L"GNO", L"GNP", L"GNQ", L"GNR", L"GNS", L"GNT", L"GNU", L"GNV", L"GNW", L"GNX", L"GNY", L"GNZ", L"GOA", L"GOB", L"GOC", L"GOD", L"GOE", L"GOF", L"GOG", L"GOH", L"GOI", L"GOJ", L"GOK", L"GOL", L"GOM", L"GON", L"GOO", L"GOP", L"GOQ", L"GOR", L"GOS", L"GOT", L"GOU", L"GOV", L"GOW", L"GOX", L"GOY", L"GOZ", L"GPA", L"GPB", L"GPC", L"GPD", L"GPE", L"GPF", L"GPG", L"GPH", L"GPI", L"GPJ", L"GPK", L"GPL", L"GPM", L"GPN", L"GPO", L"GPP", L"GPQ", L"GPR", L"GPS", L"GPT", L"GPU", L"GPV", L"GPW", L"GPX", L"GPY", L"GPZ", L"GQA", L"GQB", L"GQC", L"GQD", L"GQE", L"GQF", L"GQG", L"GQH", L"GQI", L"GQJ", L"GQK", L"GQL", L"GQM", L"GQN", L"GQO", L"GQP", L"GQQ", L"GQR", L"GQS", L"GQT", L"GQU", L"GQV", L"GQW", L"GQX", L"GQY", L"GQZ", L"GRA", L"GRB", L"GRC", L"GRD", L"GRE", L"GRF", L"GRG", L"GRH", L"GRI", L"GRJ", L"GRK", L"GRL", L"GRM", L"GRN", L"GRO", L"GRP", L"GRQ", L"GRR", L"GRS", L"GRT", L"GRU", L"GRV", L"GRW", L"GRX", L"GRY", L"GRZ", L"GSA", L"GSB", L"GSC", L"GSD", L"GSE", L"GSF", L"GSG", L"GSH", L"GSI", L"GSJ", L"GSK", L"GSL", L"GSM", L"GSN", L"GSO", L"GSP", L"GSQ", L"GSR", L"GSS", L"GST", L"GSU", L"GSV", L"GSW", L"GSX", L"GSY", L"GSZ", L"GTA", L"GTB", L"GTC", L"GTD", L"GTE", L"GTF", + L"GTG", L"GTH", L"GTI", L"GTJ", L"GTK", L"GTL", L"GTM", L"GTN", L"GTO", L"GTP", L"GTQ", L"GTR", L"GTS", L"GTT", L"GTU", L"GTV", L"GTW", L"GTX", L"GTY", L"GTZ", L"GUA", L"GUB", L"GUC", L"GUD", L"GUE", L"GUF", L"GUG", L"GUH", L"GUI", L"GUJ", L"GUK", L"GUL", L"GUM", L"GUN", L"GUO", L"GUP", L"GUQ", L"GUR", L"GUS", L"GUT", L"GUU", L"GUV", L"GUW", L"GUX", L"GUY", L"GUZ", L"GVA", L"GVB", L"GVC", L"GVD", L"GVE", L"GVF", L"GVG", L"GVH", L"GVI", L"GVJ", L"GVK", L"GVL", L"GVM", L"GVN", L"GVO", L"GVP", L"GVQ", L"GVR", L"GVS", L"GVT", L"GVU", L"GVV", L"GVW", L"GVX", L"GVY", L"GVZ", L"GWA", L"GWB", L"GWC", L"GWD", L"GWE", L"GWF", L"GWG", L"GWH", L"GWI", L"GWJ", L"GWK", L"GWL", L"GWM", L"GWN", L"GWO", L"GWP", L"GWQ", L"GWR", L"GWS", L"GWT", L"GWU", L"GWV", L"GWW", L"GWX", L"GWY", L"GWZ", L"GXA", L"GXB", L"GXC", L"GXD", L"GXE", L"GXF", L"GXG", L"GXH", L"GXI", L"GXJ", L"GXK", L"GXL", L"GXM", L"GXN", L"GXO", L"GXP", L"GXQ", L"GXR", L"GXS", L"GXT", L"GXU", L"GXV", L"GXW", L"GXX", L"GXY", L"GXZ", L"GYA", L"GYB", L"GYC", L"GYD", L"GYE", L"GYF", L"GYG", L"GYH", L"GYI", L"GYJ", L"GYK", L"GYL", L"GYM", L"GYN", L"GYO", L"GYP", L"GYQ", L"GYR", L"GYS", L"GYT", L"GYU", L"GYV", L"GYW", L"GYX", L"GYY", L"GYZ", L"GZA", L"GZB", L"GZC", L"GZD", L"GZE", L"GZF", L"GZG", L"GZH", L"GZI", L"GZJ", L"GZK", L"GZL", L"GZM", L"GZN", L"GZO", L"GZP", L"GZQ", L"GZR", L"GZS", L"GZT", L"GZU", L"GZV", L"GZW", L"GZX", L"GZY", L"GZZ", L"HAA", L"HAB", L"HAC", L"HAD", L"HAE", L"HAF", L"HAG", L"HAH", L"HAI", L"HAJ", L"HAK", L"HAL", L"HAM", L"HAN", L"HAO", L"HAP", L"HAQ", L"HAR", L"HAS", L"HAT", L"HAU", L"HAV", L"HAW", L"HAX", L"HAY", L"HAZ", L"HBA", L"HBB", L"HBC", L"HBD", L"HBE", L"HBF", L"HBG", L"HBH", L"HBI", L"HBJ", L"HBK", L"HBL", L"HBM", L"HBN", L"HBO", L"HBP", L"HBQ", L"HBR", L"HBS", L"HBT", L"HBU", L"HBV", L"HBW", L"HBX", L"HBY", L"HBZ", L"HCA", L"HCB", L"HCC", L"HCD", L"HCE", L"HCF", L"HCG", L"HCH", L"HCI", L"HCJ", L"HCK", L"HCL", L"HCM", L"HCN", L"HCO", L"HCP", L"HCQ", L"HCR", L"HCS", L"HCT", L"HCU", L"HCV", L"HCW", L"HCX", L"HCY", L"HCZ", L"HDA", L"HDB", L"HDC", L"HDD", L"HDE", L"HDF", L"HDG", L"HDH", L"HDI", L"HDJ", L"HDK", L"HDL", L"HDM", L"HDN", L"HDO", L"HDP", L"HDQ", L"HDR", L"HDS", + L"HDT", L"HDU", L"HDV", L"HDW", L"HDX", L"HDY", L"HDZ", L"HEA", L"HEB", L"HEC", L"HED", L"HEE", L"HEF", L"HEG", L"HEH", L"HEI", L"HEJ", L"HEK", L"HEL", L"HEM", L"HEN", L"HEO", L"HEP", L"HEQ", L"HER", L"HES", L"HET", L"HEU", L"HEV", L"HEW", L"HEX", L"HEY", L"HEZ", L"HFA", L"HFB", L"HFC", L"HFD", L"HFE", L"HFF", L"HFG", L"HFH", L"HFI", L"HFJ", L"HFK", L"HFL", L"HFM", L"HFN", L"HFO", L"HFP", L"HFQ", L"HFR", L"HFS", L"HFT", L"HFU", L"HFV", L"HFW", L"HFX", L"HFY", L"HFZ", L"HGA", L"HGB", L"HGC", L"HGD", L"HGE", L"HGF", L"HGG", L"HGH", L"HGI", L"HGJ", L"HGK", L"HGL", L"HGM", L"HGN", L"HGO", L"HGP", L"HGQ", L"HGR", L"HGS", L"HGT", L"HGU", L"HGV", L"HGW", L"HGX", L"HGY", L"HGZ", L"HHA", L"HHB", L"HHC", L"HHD", L"HHE", L"HHF", L"HHG", L"HHH", L"HHI", L"HHJ", L"HHK", L"HHL", L"HHM", L"HHN", L"HHO", L"HHP", L"HHQ", L"HHR", L"HHS", L"HHT", L"HHU", L"HHV", L"HHW", L"HHX", L"HHY", L"HHZ", L"HIA", L"HIB", L"HIC", L"HID", L"HIE", L"HIF", L"HIG", L"HIH", L"HII", L"HIJ", L"HIK", L"HIL", L"HIM", L"HIN", L"HIO", L"HIP", L"HIQ", L"HIR", L"HIS", L"HIT", L"HIU", L"HIV", L"HIW", L"HIX", L"HIY", L"HIZ", L"HJA", L"HJB", L"HJC", L"HJD", L"HJE", L"HJF", L"HJG", L"HJH", L"HJI", L"HJJ", L"HJK", L"HJL", L"HJM", L"HJN", L"HJO", L"HJP", L"HJQ", L"HJR", L"HJS", L"HJT", L"HJU", L"HJV", L"HJW", L"HJX", L"HJY", L"HJZ", L"HKA", L"HKB", L"HKC", L"HKD", L"HKE", L"HKF", L"HKG", L"HKH", L"HKI", L"HKJ", L"HKK", L"HKL", L"HKM", L"HKN", L"HKO", L"HKP", L"HKQ", L"HKR", L"HKS", L"HKT", L"HKU", L"HKV", L"HKW", L"HKX", L"HKY", L"HKZ", L"HLA", L"HLB", L"HLC", L"HLD", L"HLE", L"HLF", L"HLG", L"HLH", L"HLI", L"HLJ", L"HLK", L"HLL", L"HLM", L"HLN", L"HLO", L"HLP", L"HLQ", L"HLR", L"HLS", L"HLT", L"HLU", L"HLV", L"HLW", L"HLX", L"HLY", L"HLZ", L"HMA", L"HMB", L"HMC", L"HMD", L"HME", L"HMF", L"HMG", L"HMH", L"HMI", L"HMJ", L"HMK", L"HML", L"HMM", L"HMN", L"HMO", L"HMP", L"HMQ", L"HMR", L"HMS", L"HMT", L"HMU", L"HMV", L"HMW", L"HMX", L"HMY", L"HMZ", L"HNA", L"HNB", L"HNC", L"HND", L"HNE", L"HNF", L"HNG", L"HNH", L"HNI", L"HNJ", L"HNK", L"HNL", L"HNM", L"HNN", L"HNO", L"HNP", L"HNQ", L"HNR", L"HNS", L"HNT", L"HNU", L"HNV", L"HNW", L"HNX", L"HNY", L"HNZ", L"HOA", L"HOB", L"HOC", L"HOD", L"HOE", L"HOF", L"HOG", L"HOH", L"HOI", L"HOJ", L"HOK", L"HOL", L"HOM", L"HON", L"HOO", L"HOP", L"HOQ", L"HOR", L"HOS", L"HOT", L"HOU", L"HOV", L"HOW", L"HOX", L"HOY", L"HOZ", L"HPA", L"HPB", L"HPC", L"HPD", L"HPE", L"HPF", L"HPG", L"HPH", L"HPI", L"HPJ", L"HPK", L"HPL", L"HPM", L"HPN", L"HPO", L"HPP", L"HPQ", L"HPR", L"HPS", L"HPT", L"HPU", L"HPV", L"HPW", L"HPX", L"HPY", L"HPZ", L"HQA", L"HQB", L"HQC", L"HQD", L"HQE", L"HQF", L"HQG", L"HQH", L"HQI", L"HQJ", L"HQK", L"HQL", L"HQM", L"HQN", L"HQO", L"HQP", L"HQQ", L"HQR", L"HQS", L"HQT", L"HQU", L"HQV", L"HQW", L"HQX", L"HQY", L"HQZ", L"HRA", L"HRB", L"HRC", L"HRD", L"HRE", L"HRF", L"HRG", L"HRH", L"HRI", L"HRJ", L"HRK", L"HRL", L"HRM", L"HRN", L"HRO", L"HRP", L"HRQ", L"HRR", L"HRS", L"HRT", L"HRU", L"HRV", L"HRW", L"HRX", L"HRY", L"HRZ", L"HSA", L"HSB", L"HSC", L"HSD", L"HSE", L"HSF", L"HSG", L"HSH", L"HSI", L"HSJ", L"HSK", L"HSL", L"HSM", L"HSN", L"HSO", L"HSP", L"HSQ", L"HSR", L"HSS", L"HST", L"HSU", L"HSV", L"HSW", L"HSX", L"HSY", L"HSZ", L"HTA", L"HTB", L"HTC", L"HTD", L"HTE", L"HTF", L"HTG", L"HTH", L"HTI", L"HTJ", L"HTK", L"HTL", L"HTM", L"HTN", L"HTO", L"HTP", L"HTQ", L"HTR", L"HTS", L"HTT", L"HTU", L"HTV", L"HTW", L"HTX", L"HTY", L"HTZ", L"HUA", L"HUB", L"HUC", L"HUD", L"HUE", L"HUF", L"HUG", L"HUH", L"HUI", L"HUJ", L"HUK", L"HUL", L"HUM", L"HUN", L"HUO", L"HUP", L"HUQ", L"HUR", L"HUS", L"HUT", L"HUU", L"HUV", L"HUW", L"HUX", L"HUY", L"HUZ", L"HVA", L"HVB", L"HVC", L"HVD", L"HVE", L"HVF", L"HVG", L"HVH", L"HVI", L"HVJ", L"HVK", L"HVL", L"HVM", L"HVN", L"HVO", L"HVP", L"HVQ", L"HVR", L"HVS", L"HVT", L"HVU", L"HVV", L"HVW", L"HVX", L"HVY", L"HVZ", L"HWA", L"HWB", L"HWC", L"HWD", L"HWE", L"HWF", L"HWG", L"HWH", L"HWI", L"HWJ", L"HWK", L"HWL", L"HWM", L"HWN", L"HWO", L"HWP", L"HWQ", L"HWR", L"HWS", L"HWT", L"HWU", L"HWV", L"HWW", L"HWX", L"HWY", L"HWZ", L"HXA", L"HXB", L"HXC", L"HXD", L"HXE", L"HXF", L"HXG", L"HXH", L"HXI", L"HXJ", L"HXK", L"HXL", L"HXM", L"HXN", L"HXO", L"HXP", L"HXQ", L"HXR", L"HXS", L"HXT", L"HXU", L"HXV", L"HXW", L"HXX", L"HXY", L"HXZ", L"HYA", L"HYB", L"HYC", L"HYD", L"HYE", L"HYF", L"HYG", L"HYH", L"HYI", L"HYJ", L"HYK", L"HYL", L"HYM", L"HYN", L"HYO", L"HYP", L"HYQ", L"HYR", L"HYS", L"HYT", L"HYU", L"HYV", L"HYW", L"HYX", L"HYY", L"HYZ", L"HZA", L"HZB", L"HZC", L"HZD", L"HZE", L"HZF", L"HZG", L"HZH", L"HZI", L"HZJ", L"HZK", L"HZL", L"HZM", L"HZN", L"HZO", L"HZP", L"HZQ", L"HZR", L"HZS", L"HZT", L"HZU", L"HZV", L"HZW", L"HZX", L"HZY", L"HZZ", L"IAA", L"IAB", L"IAC", L"IAD", L"IAE", L"IAF", L"IAG", L"IAH", L"IAI", L"IAJ", L"IAK", L"IAL", L"IAM", L"IAN", L"IAO", L"IAP", L"IAQ", L"IAR", L"IAS", L"IAT", L"IAU", L"IAV", L"IAW", L"IAX", L"IAY", L"IAZ", L"IBA", L"IBB", L"IBC", L"IBD", L"IBE", L"IBF", L"IBG", L"IBH", L"IBI", L"IBJ", L"IBK", L"IBL", L"IBM", L"IBN", L"IBO", L"IBP", L"IBQ", L"IBR", L"IBS", L"IBT", L"IBU", L"IBV", L"IBW", L"IBX", L"IBY", L"IBZ", L"ICA", L"ICB", L"ICC", L"ICD", L"ICE", L"ICF", L"ICG", L"ICH", L"ICI", L"ICJ", L"ICK", L"ICL", L"ICM", L"ICN", L"ICO", L"ICP", L"ICQ", L"ICR", L"ICS", L"ICT", L"ICU", L"ICV", L"ICW", L"ICX", L"ICY", L"ICZ", L"IDA", L"IDB", L"IDC", L"IDD", L"IDE", L"IDF", L"IDG", L"IDH", L"IDI", L"IDJ", L"IDK", L"IDL", L"IDM", L"IDN", L"IDO", L"IDP", L"IDQ", L"IDR", L"IDS", L"IDT", L"IDU", L"IDV", L"IDW", L"IDX", L"IDY", L"IDZ", L"IEA", L"IEB", L"IEC", L"IED", L"IEE", L"IEF", L"IEG", L"IEH", L"IEI", L"IEJ", L"IEK", L"IEL", L"IEM", L"IEN", L"IEO", L"IEP", L"IEQ", L"IER", L"IES", L"IET", L"IEU", L"IEV", L"IEW", L"IEX", L"IEY", L"IEZ", L"IFA", L"IFB", L"IFC", L"IFD", L"IFE", L"IFF", L"IFG", L"IFH", L"IFI", L"IFJ", L"IFK", L"IFL", L"IFM", L"IFN", L"IFO", L"IFP", L"IFQ", L"IFR", L"IFS", L"IFT", L"IFU", L"IFV", L"IFW", L"IFX", L"IFY", L"IFZ", L"IGA", L"IGB", L"IGC", L"IGD", L"IGE", L"IGF", L"IGG", L"IGH", L"IGI", L"IGJ", L"IGK", L"IGL", L"IGM", L"IGN", L"IGO", L"IGP", L"IGQ", L"IGR", L"IGS", L"IGT", L"IGU", L"IGV", L"IGW", L"IGX", L"IGY", L"IGZ", L"IHA", L"IHB", L"IHC", L"IHD", L"IHE", L"IHF", L"IHG", L"IHH", L"IHI", L"IHJ", L"IHK", L"IHL", L"IHM", L"IHN", L"IHO", L"IHP", L"IHQ", L"IHR", L"IHS", L"IHT", L"IHU", L"IHV", L"IHW", L"IHX", L"IHY", L"IHZ", L"IIA", L"IIB", L"IIC", L"IID", L"IIE", L"IIF", L"IIG", L"IIH", L"III", L"IIJ", L"IIK", L"IIL", L"IIM", L"IIN", L"IIO", L"IIP", L"IIQ", L"IIR", L"IIS", L"IIT", L"IIU", L"IIV", L"IIW", L"IIX", L"IIY", L"IIZ", L"IJA", L"IJB", L"IJC", L"IJD", L"IJE", L"IJF", L"IJG", L"IJH", L"IJI", L"IJJ", L"IJK", L"IJL", L"IJM", L"IJN", L"IJO", L"IJP", L"IJQ", L"IJR", L"IJS", L"IJT", L"IJU", L"IJV", L"IJW", L"IJX", L"IJY", L"IJZ", L"IKA", L"IKB", L"IKC", L"IKD", L"IKE", L"IKF", L"IKG", L"IKH", L"IKI", L"IKJ", L"IKK", L"IKL", L"IKM", L"IKN", L"IKO", L"IKP", L"IKQ", L"IKR", L"IKS", L"IKT", L"IKU", L"IKV", L"IKW", L"IKX", L"IKY", L"IKZ", L"ILA", L"ILB", L"ILC", L"ILD", L"ILE", L"ILF", L"ILG", L"ILH", L"ILI", L"ILJ", L"ILK", L"ILL", L"ILM", L"ILN", L"ILO", L"ILP", L"ILQ", L"ILR", L"ILS", L"ILT", L"ILU", L"ILV", L"ILW", L"ILX", L"ILY", L"ILZ", L"IMA", L"IMB", L"IMC", L"IMD", L"IME", L"IMF", L"IMG", L"IMH", L"IMI", L"IMJ", L"IMK", L"IML", L"IMM", L"IMN", L"IMO", L"IMP", L"IMQ", L"IMR", L"IMS", L"IMT", L"IMU", L"IMV", L"IMW", L"IMX", L"IMY", L"IMZ", L"INA", L"INB", L"INC", L"IND", L"INE", L"INF", L"ING", L"INH", L"INI", L"INJ", L"INK", L"INL", L"INM", L"INN", L"INO", L"INP", L"INQ", L"INR", L"INS", L"INT", L"INU", L"INV", L"INW", L"INX", L"INY", L"INZ", L"IOA", L"IOB", L"IOC", L"IOD", L"IOE", L"IOF", L"IOG", L"IOH", L"IOI", L"IOJ", L"IOK", L"IOL", L"IOM", L"ION", L"IOO", L"IOP", L"IOQ", L"IOR", L"IOS", L"IOT", L"IOU", L"IOV", L"IOW", L"IOX", L"IOY", L"IOZ", L"IPA", L"IPB", L"IPC", L"IPD", L"IPE", L"IPF", L"IPG", L"IPH", L"IPI", L"IPJ", L"IPK", L"IPL", L"IPM", L"IPN", L"IPO", L"IPP", L"IPQ", L"IPR", L"IPS", L"IPT", L"IPU", L"IPV", L"IPW", L"IPX", L"IPY", L"IPZ", L"IQA", L"IQB", L"IQC", L"IQD", L"IQE", L"IQF", L"IQG", L"IQH", L"IQI", L"IQJ", L"IQK", L"IQL", L"IQM", L"IQN", L"IQO", L"IQP", L"IQQ", L"IQR", L"IQS", L"IQT", L"IQU", L"IQV", L"IQW", L"IQX", L"IQY", L"IQZ", L"IRA", L"IRB", L"IRC", L"IRD", L"IRE", L"IRF", L"IRG", L"IRH", L"IRI", L"IRJ", L"IRK", L"IRL", L"IRM", L"IRN", L"IRO", L"IRP", L"IRQ", L"IRR", L"IRS", L"IRT", L"IRU", L"IRV", L"IRW", L"IRX", L"IRY", L"IRZ", L"ISA", L"ISB", L"ISC", L"ISD", L"ISE", L"ISF", L"ISG", L"ISH", L"ISI", L"ISJ", L"ISK", L"ISL", L"ISM", L"ISN", L"ISO", L"ISP", L"ISQ", L"ISR", L"ISS", L"IST", L"ISU", L"ISV", L"ISW", L"ISX", L"ISY", L"ISZ", L"ITA", L"ITB", L"ITC", L"ITD", L"ITE", L"ITF", L"ITG", L"ITH", L"ITI", L"ITJ", L"ITK", @@ -97,37 +107,37 @@ namespace OOX L"JDY", L"JDZ", L"JEA", L"JEB", L"JEC", L"JED", L"JEE", L"JEF", L"JEG", L"JEH", L"JEI", L"JEJ", L"JEK", L"JEL", L"JEM", L"JEN", L"JEO", L"JEP", L"JEQ", L"JER", L"JES", L"JET", L"JEU", L"JEV", L"JEW", L"JEX", L"JEY", L"JEZ", L"JFA", L"JFB", L"JFC", L"JFD", L"JFE", L"JFF", L"JFG", L"JFH", L"JFI", L"JFJ", L"JFK", L"JFL", L"JFM", L"JFN", L"JFO", L"JFP", L"JFQ", L"JFR", L"JFS", L"JFT", L"JFU", L"JFV", L"JFW", L"JFX", L"JFY", L"JFZ", L"JGA", L"JGB", L"JGC", L"JGD", L"JGE", L"JGF", L"JGG", L"JGH", L"JGI", L"JGJ", L"JGK", L"JGL", L"JGM", L"JGN", L"JGO", L"JGP", L"JGQ", L"JGR", L"JGS", L"JGT", L"JGU", L"JGV", L"JGW", L"JGX", L"JGY", L"JGZ", L"JHA", L"JHB", L"JHC", L"JHD", L"JHE", L"JHF", L"JHG", L"JHH", L"JHI", L"JHJ", L"JHK", L"JHL", L"JHM", L"JHN", L"JHO", L"JHP", L"JHQ", L"JHR", L"JHS", L"JHT", L"JHU", L"JHV", L"JHW", L"JHX", L"JHY", L"JHZ", L"JIA", L"JIB", L"JIC", L"JID", L"JIE", L"JIF", L"JIG", L"JIH", L"JII", L"JIJ", L"JIK", L"JIL", L"JIM", L"JIN", L"JIO", L"JIP", L"JIQ", L"JIR", L"JIS", L"JIT", L"JIU", L"JIV", L"JIW", L"JIX", L"JIY", L"JIZ", L"JJA", L"JJB", L"JJC", L"JJD", L"JJE", L"JJF", L"JJG", L"JJH", L"JJI", L"JJJ", L"JJK", L"JJL", L"JJM", L"JJN", L"JJO", L"JJP", L"JJQ", L"JJR", L"JJS", L"JJT", L"JJU", L"JJV", L"JJW", L"JJX", L"JJY", L"JJZ", L"JKA", L"JKB", L"JKC", L"JKD", L"JKE", L"JKF", L"JKG", L"JKH", L"JKI", L"JKJ", L"JKK", L"JKL", L"JKM", L"JKN", L"JKO", L"JKP", L"JKQ", L"JKR", L"JKS", L"JKT", L"JKU", L"JKV", L"JKW", L"JKX", L"JKY", L"JKZ", L"JLA", L"JLB", L"JLC", L"JLD", L"JLE", L"JLF", L"JLG", L"JLH", L"JLI", L"JLJ", L"JLK", L"JLL", L"JLM", L"JLN", L"JLO", L"JLP", L"JLQ", L"JLR", L"JLS", L"JLT", L"JLU", L"JLV", L"JLW", L"JLX", L"JLY", L"JLZ", L"JMA", L"JMB", L"JMC", L"JMD", L"JME", L"JMF", L"JMG", L"JMH", L"JMI", L"JMJ", L"JMK", L"JML", L"JMM", L"JMN", L"JMO", L"JMP", L"JMQ", L"JMR", L"JMS", L"JMT", L"JMU", L"JMV", L"JMW", L"JMX", L"JMY", L"JMZ", L"JNA", L"JNB", L"JNC", L"JND", L"JNE", L"JNF", L"JNG", L"JNH", L"JNI", L"JNJ", L"JNK", L"JNL", L"JNM", L"JNN", L"JNO", L"JNP", L"JNQ", L"JNR", L"JNS", L"JNT", L"JNU", L"JNV", L"JNW", L"JNX", L"JNY", L"JNZ", L"JOA", L"JOB", L"JOC", L"JOD", L"JOE", L"JOF", L"JOG", L"JOH", L"JOI", L"JOJ", L"JOK", L"JOL", L"JOM", L"JON", L"JOO", L"JOP", L"JOQ", L"JOR", L"JOS", L"JOT", L"JOU", L"JOV", L"JOW", L"JOX", L"JOY", L"JOZ", L"JPA", L"JPB", L"JPC", L"JPD", L"JPE", L"JPF", L"JPG", L"JPH", L"JPI", L"JPJ", L"JPK", L"JPL", L"JPM", L"JPN", L"JPO", L"JPP", L"JPQ", L"JPR", L"JPS", L"JPT", L"JPU", L"JPV", L"JPW", L"JPX", L"JPY", L"JPZ", L"JQA", L"JQB", L"JQC", L"JQD", L"JQE", L"JQF", L"JQG", L"JQH", L"JQI", L"JQJ", L"JQK", L"JQL", L"JQM", L"JQN", L"JQO", L"JQP", L"JQQ", L"JQR", L"JQS", L"JQT", L"JQU", L"JQV", L"JQW", L"JQX", L"JQY", L"JQZ", L"JRA", L"JRB", L"JRC", L"JRD", L"JRE", L"JRF", L"JRG", L"JRH", L"JRI", L"JRJ", L"JRK", L"JRL", L"JRM", L"JRN", L"JRO", L"JRP", L"JRQ", L"JRR", L"JRS", L"JRT", L"JRU", L"JRV", L"JRW", L"JRX", L"JRY", L"JRZ", L"JSA", L"JSB", L"JSC", L"JSD", L"JSE", L"JSF", L"JSG", L"JSH", L"JSI", L"JSJ", L"JSK", L"JSL", L"JSM", L"JSN", L"JSO", L"JSP", L"JSQ", L"JSR", L"JSS", L"JST", L"JSU", L"JSV", L"JSW", L"JSX", L"JSY", L"JSZ", L"JTA", L"JTB", L"JTC", L"JTD", L"JTE", L"JTF", L"JTG", L"JTH", L"JTI", L"JTJ", L"JTK", L"JTL", L"JTM", L"JTN", L"JTO", L"JTP", L"JTQ", L"JTR", L"JTS", L"JTT", L"JTU", L"JTV", L"JTW", L"JTX", L"JTY", L"JTZ", L"JUA", L"JUB", L"JUC", L"JUD", L"JUE", L"JUF", L"JUG", L"JUH", L"JUI", L"JUJ", L"JUK", L"JUL", L"JUM", L"JUN", L"JUO", L"JUP", L"JUQ", L"JUR", L"JUS", L"JUT", L"JUU", L"JUV", L"JUW", L"JUX", L"JUY", L"JUZ", L"JVA", L"JVB", L"JVC", L"JVD", L"JVE", L"JVF", L"JVG", L"JVH", L"JVI", L"JVJ", L"JVK", L"JVL", L"JVM", L"JVN", L"JVO", L"JVP", L"JVQ", L"JVR", L"JVS", L"JVT", L"JVU", L"JVV", L"JVW", L"JVX", L"JVY", L"JVZ", L"JWA", L"JWB", L"JWC", L"JWD", L"JWE", L"JWF", L"JWG", L"JWH", L"JWI", L"JWJ", L"JWK", L"JWL", L"JWM", L"JWN", L"JWO", L"JWP", L"JWQ", L"JWR", L"JWS", L"JWT", L"JWU", L"JWV", L"JWW", L"JWX", L"JWY", L"JWZ", L"JXA", L"JXB", L"JXC", L"JXD", L"JXE", L"JXF", L"JXG", L"JXH", L"JXI", L"JXJ", L"JXK", L"JXL", L"JXM", L"JXN", L"JXO", L"JXP", L"JXQ", L"JXR", L"JXS", L"JXT", L"JXU", L"JXV", L"JXW", L"JXX", L"JXY", L"JXZ", L"JYA", L"JYB", L"JYC", L"JYD", L"JYE", L"JYF", L"JYG", L"JYH", L"JYI", L"JYJ", L"JYK", L"JYL", L"JYM", L"JYN", L"JYO", L"JYP", L"JYQ", L"JYR", L"JYS", L"JYT", L"JYU", L"JYV", L"JYW", L"JYX", L"JYY", L"JYZ", L"JZA", L"JZB", L"JZC", L"JZD", L"JZE", L"JZF", L"JZG", L"JZH", L"JZI", L"JZJ", L"JZK", L"JZL", L"JZM", L"JZN", L"JZO", L"JZP", L"JZQ", L"JZR", L"JZS", L"JZT", L"JZU", L"JZV", L"JZW", L"JZX", L"JZY", L"JZZ", L"KAA", L"KAB", L"KAC", L"KAD", L"KAE", L"KAF", L"KAG", L"KAH", L"KAI", L"KAJ", L"KAK", L"KAL", L"KAM", L"KAN", L"KAO", L"KAP", L"KAQ", L"KAR", L"KAS", L"KAT", L"KAU", L"KAV", L"KAW", L"KAX", L"KAY", L"KAZ", L"KBA", L"KBB", L"KBC", L"KBD", L"KBE", L"KBF", L"KBG", L"KBH", L"KBI", L"KBJ", L"KBK", L"KBL", L"KBM", L"KBN", L"KBO", L"KBP", L"KBQ", L"KBR", L"KBS", L"KBT", L"KBU", L"KBV", L"KBW", L"KBX", L"KBY", L"KBZ", L"KCA", L"KCB", L"KCC", L"KCD", L"KCE", L"KCF", L"KCG", L"KCH", L"KCI", L"KCJ", L"KCK", L"KCL", L"KCM", L"KCN", L"KCO", L"KCP", L"KCQ", L"KCR", L"KCS", L"KCT", L"KCU", L"KCV", L"KCW", L"KCX", L"KCY", L"KCZ", L"KDA", L"KDB", L"KDC", L"KDD", L"KDE", L"KDF", L"KDG", L"KDH", L"KDI", L"KDJ", L"KDK", L"KDL", L"KDM", L"KDN", L"KDO", L"KDP", L"KDQ", L"KDR", L"KDS", L"KDT", L"KDU", L"KDV", L"KDW", L"KDX", L"KDY", L"KDZ", L"KEA", L"KEB", L"KEC", L"KED", L"KEE", L"KEF", L"KEG", L"KEH", L"KEI", L"KEJ", L"KEK", L"KEL", L"KEM", L"KEN", L"KEO", L"KEP", L"KEQ", L"KER", L"KES", L"KET", L"KEU", L"KEV", L"KEW", L"KEX", L"KEY", L"KEZ", L"KFA", L"KFB", L"KFC", L"KFD", L"KFE", L"KFF", L"KFG", L"KFH", L"KFI", L"KFJ", L"KFK", L"KFL", L"KFM", L"KFN", L"KFO", L"KFP", L"KFQ", L"KFR", L"KFS", L"KFT", L"KFU", L"KFV", L"KFW", L"KFX", L"KFY", L"KFZ", L"KGA", L"KGB", L"KGC", L"KGD", L"KGE", L"KGF", L"KGG", L"KGH", L"KGI", L"KGJ", L"KGK", L"KGL", L"KGM", L"KGN", L"KGO", L"KGP", L"KGQ", L"KGR", L"KGS", L"KGT", L"KGU", L"KGV", L"KGW", L"KGX", L"KGY", L"KGZ", L"KHA", L"KHB", L"KHC", L"KHD", L"KHE", L"KHF", L"KHG", L"KHH", L"KHI", L"KHJ", L"KHK", L"KHL", L"KHM", L"KHN", L"KHO", L"KHP", L"KHQ", L"KHR", L"KHS", L"KHT", L"KHU", L"KHV", L"KHW", L"KHX", L"KHY", L"KHZ", L"KIA", L"KIB", L"KIC", L"KID", L"KIE", L"KIF", L"KIG", L"KIH", L"KII", L"KIJ", L"KIK", L"KIL", L"KIM", L"KIN", L"KIO", L"KIP", L"KIQ", L"KIR", L"KIS", L"KIT", L"KIU", L"KIV", L"KIW", L"KIX", L"KIY", L"KIZ", L"KJA", L"KJB", L"KJC", L"KJD", L"KJE", L"KJF", L"KJG", L"KJH", L"KJI", L"KJJ", L"KJK", - L"KJL", L"KJM", L"KJN", L"KJO", L"KJP", L"KJQ", L"KJR", L"KJS", L"KJT", L"KJU", L"KJV", L"KJW", L"KJX", L"KJY", L"KJZ", L"KKA", L"KKB", L"KKC", L"KKD", L"KKE", L"KKF", L"KKG", L"KKH", L"KKI", L"KKJ", L"KKK", L"KKL", L"KKM", L"KKN", L"KKO", L"KKP", L"KKQ", L"KKR", L"KKS", L"KKT", L"KKU", L"KKV", L"KKW", L"KKX", L"KKY", L"KKZ", L"KLA", L"KLB", L"KLC", L"KLD", L"KLE", L"KLF", L"KLG", L"KLH", L"KLI", L"KLJ", L"KLK", L"KLL", L"KLM", L"KLN", L"KLO", L"KLP", L"KLQ", L"KLR", L"KLS", L"KLT", L"KLU", L"KLV", L"KLW", L"KLX", L"KLY", L"KLZ", L"KMA", L"KMB", L"KMC", L"KMD", L"KME", L"KMF", L"KMG", L"KMH", L"KMI", L"KMJ", L"KMK", L"KML", L"KMM", L"KMN", L"KMO", L"KMP", L"KMQ", L"KMR", L"KMS", L"KMT", L"KMU", L"KMV", L"KMW", L"KMX", L"KMY", L"KMZ", L"KNA", L"KNB", L"KNC", L"KND", L"KNE", L"KNF", L"KNG", L"KNH", L"KNI", L"KNJ", L"KNK", L"KNL", L"KNM", L"KNN", L"KNO", L"KNP", L"KNQ", L"KNR", L"KNS", L"KNT", L"KNU", L"KNV", L"KNW", L"KNX", L"KNY", L"KNZ", L"KOA", L"KOB", L"KOC", L"KOD", L"KOE", L"KOF", L"KOG", L"KOH", L"KOI", L"KOJ", L"KOK", L"KOL", L"KOM", L"KON", L"KOO", L"KOP", L"KOQ", L"KOR", L"KOS", L"KOT", L"KOU", L"KOV", L"KOW", L"KOX", L"KOY", L"KOZ", L"KPA", L"KPB", L"KPC", L"KPD", L"KPE", L"KPF", L"KPG", L"KPH", L"KPI", L"KPJ", L"KPK", L"KPL", L"KPM", L"KPN", L"KPO", L"KPP", L"KPQ", L"KPR", L"KPS", L"KPT", L"KPU", L"KPV", L"KPW", L"KPX", L"KPY", L"KPZ", L"KQA", L"KQB", L"KQC", L"KQD", L"KQE", L"KQF", L"KQG", L"KQH", L"KQI", L"KQJ", L"KQK", L"KQL", L"KQM", L"KQN", L"KQO", L"KQP", L"KQQ", L"KQR", L"KQS", L"KQT", L"KQU", L"KQV", L"KQW", L"KQX", L"KQY", L"KQZ", L"KRA", L"KRB", L"KRC", L"KRD", L"KRE", L"KRF", L"KRG", L"KRH", L"KRI", L"KRJ", L"KRK", L"KRL", L"KRM", L"KRN", L"KRO", L"KRP", L"KRQ", L"KRR", L"KRS", L"KRT", L"KRU", L"KRV", L"KRW", L"KRX", L"KRY", L"KRZ", L"KSA", L"KSB", L"KSC", L"KSD", L"KSE", L"KSF", L"KSG", L"KSH", L"KSI", L"KSJ", L"KSK", L"KSL", L"KSM", L"KSN", L"KSO", L"KSP", L"KSQ", L"KSR", L"KSS", L"KST", L"KSU", L"KSV", L"KSW", L"KSX", L"KSY", L"KSZ", L"KTA", L"KTB", L"KTC", L"KTD", L"KTE", L"KTF", L"KTG", L"KTH", L"KTI", L"KTJ", L"KTK", L"KTL", L"KTM", L"KTN", L"KTO", L"KTP", L"KTQ", L"KTR", L"KTS", L"KTT", L"KTU", L"KTV", L"KTW", L"KTX", - L"KTY", L"KTZ", L"KUA", L"KUB", L"KUC", L"KUD", L"KUE", L"KUF", L"KUG", L"KUH", L"KUI", L"KUJ", L"KUK", L"KUL", L"KUM", L"KUN", L"KUO", L"KUP", L"KUQ", L"KUR", L"KUS", L"KUT", L"KUU", L"KUV", L"KUW", L"KUX", L"KUY", L"KUZ", L"KVA", L"KVB", L"KVC", L"KVD", L"KVE", L"KVF", L"KVG", L"KVH", L"KVI", L"KVJ", L"KVK", L"KVL", L"KVM", L"KVN", L"KVO", L"KVP", L"KVQ", L"KVR", L"KVS", L"KVT", L"KVU", L"KVV", L"KVW", L"KVX", L"KVY", L"KVZ", L"KWA", L"KWB", L"KWC", L"KWD", L"KWE", L"KWF", L"KWG", L"KWH", L"KWI", L"KWJ", L"KWK", L"KWL", L"KWM", L"KWN", L"KWO", L"KWP", L"KWQ", L"KWR", L"KWS", L"KWT", L"KWU", L"KWV", L"KWW", L"KWX", L"KWY", L"KWZ", L"KXA", L"KXB", L"KXC", L"KXD", L"KXE", L"KXF", L"KXG", L"KXH", L"KXI", L"KXJ", L"KXK", L"KXL", L"KXM", L"KXN", L"KXO", L"KXP", L"KXQ", L"KXR", L"KXS", L"KXT", L"KXU", L"KXV", L"KXW", L"KXX", L"KXY", L"KXZ", L"KYA", L"KYB", L"KYC", L"KYD", L"KYE", L"KYF", L"KYG", L"KYH", L"KYI", L"KYJ", L"KYK", L"KYL", L"KYM", L"KYN", L"KYO", L"KYP", L"KYQ", L"KYR", L"KYS", L"KYT", L"KYU", L"KYV", L"KYW", L"KYX", L"KYY", L"KYZ", L"KZA", L"KZB", L"KZC", L"KZD", L"KZE", L"KZF", L"KZG", L"KZH", L"KZI", L"KZJ", L"KZK", L"KZL", L"KZM", L"KZN", L"KZO", L"KZP", L"KZQ", L"KZR", L"KZS", L"KZT", L"KZU", L"KZV", L"KZW", L"KZX", L"KZY", L"KZZ", L"LAA", L"LAB", L"LAC", L"LAD", L"LAE", L"LAF", L"LAG", L"LAH", L"LAI", L"LAJ", L"LAK", L"LAL", L"LAM", L"LAN", L"LAO", L"LAP", L"LAQ", L"LAR", L"LAS", L"LAT", L"LAU", L"LAV", L"LAW", L"LAX", L"LAY", L"LAZ", L"LBA", L"LBB", L"LBC", L"LBD", L"LBE", L"LBF", L"LBG", L"LBH", L"LBI", L"LBJ", L"LBK", L"LBL", L"LBM", L"LBN", L"LBO", L"LBP", L"LBQ", L"LBR", L"LBS", L"LBT", L"LBU", L"LBV", L"LBW", L"LBX", L"LBY", L"LBZ", L"LCA", L"LCB", L"LCC", L"LCD", L"LCE", L"LCF", L"LCG", L"LCH", L"LCI", L"LCJ", L"LCK", L"LCL", L"LCM", L"LCN", L"LCO", L"LCP", L"LCQ", L"LCR", L"LCS", L"LCT", L"LCU", L"LCV", L"LCW", L"LCX", L"LCY", L"LCZ", L"LDA", L"LDB", L"LDC", L"LDD", L"LDE", L"LDF", L"LDG", L"LDH", L"LDI", L"LDJ", L"LDK", L"LDL", L"LDM", L"LDN", L"LDO", L"LDP", L"LDQ", L"LDR", L"LDS", L"LDT", L"LDU", L"LDV", L"LDW", L"LDX", L"LDY", L"LDZ", L"LEA", L"LEB", L"LEC", L"LED", L"LEE", L"LEF", L"LEG", L"LEH", L"LEI", L"LEJ", L"LEK", - L"LEL", L"LEM", L"LEN", L"LEO", L"LEP", L"LEQ", L"LER", L"LES", L"LET", L"LEU", L"LEV", L"LEW", L"LEX", L"LEY", L"LEZ", L"LFA", L"LFB", L"LFC", L"LFD", L"LFE", L"LFF", L"LFG", L"LFH", L"LFI", L"LFJ", L"LFK", L"LFL", L"LFM", L"LFN", L"LFO", L"LFP", L"LFQ", L"LFR", L"LFS", L"LFT", L"LFU", L"LFV", L"LFW", L"LFX", L"LFY", L"LFZ", L"LGA", L"LGB", L"LGC", L"LGD", L"LGE", L"LGF", L"LGG", L"LGH", L"LGI", L"LGJ", L"LGK", L"LGL", L"LGM", L"LGN", L"LGO", L"LGP", L"LGQ", L"LGR", L"LGS", L"LGT", L"LGU", L"LGV", L"LGW", L"LGX", L"LGY", L"LGZ", L"LHA", L"LHB", L"LHC", L"LHD", L"LHE", L"LHF", L"LHG", L"LHH", L"LHI", L"LHJ", L"LHK", L"LHL", L"LHM", L"LHN", L"LHO", L"LHP", L"LHQ", L"LHR", L"LHS", L"LHT", L"LHU", L"LHV", L"LHW", L"LHX", L"LHY", L"LHZ", L"LIA", L"LIB", L"LIC", L"LID", L"LIE", L"LIF", L"LIG", L"LIH", L"LII", L"LIJ", L"LIK", L"LIL", L"LIM", L"LIN", L"LIO", L"LIP", L"LIQ", L"LIR", L"LIS", L"LIT", L"LIU", L"LIV", L"LIW", L"LIX", L"LIY", L"LIZ", L"LJA", L"LJB", L"LJC", L"LJD", L"LJE", L"LJF", L"LJG", L"LJH", L"LJI", L"LJJ", L"LJK", L"LJL", L"LJM", L"LJN", L"LJO", L"LJP", L"LJQ", L"LJR", L"LJS", L"LJT", L"LJU", L"LJV", L"LJW", L"LJX", L"LJY", L"LJZ", L"LKA", L"LKB", L"LKC", L"LKD", L"LKE", L"LKF", L"LKG", L"LKH", L"LKI", L"LKJ", L"LKK", L"LKL", L"LKM", L"LKN", L"LKO", L"LKP", L"LKQ", L"LKR", L"LKS", L"LKT", L"LKU", L"LKV", L"LKW", L"LKX", L"LKY", L"LKZ", L"LLA", L"LLB", L"LLC", L"LLD", L"LLE", L"LLF", L"LLG", L"LLH", L"LLI", L"LLJ", L"LLK", L"LLL", L"LLM", L"LLN", L"LLO", L"LLP", L"LLQ", L"LLR", L"LLS", L"LLT", L"LLU", L"LLV", L"LLW", L"LLX", L"LLY", L"LLZ", L"LMA", L"LMB", L"LMC", L"LMD", L"LME", L"LMF", L"LMG", L"LMH", L"LMI", L"LMJ", L"LMK", L"LML", L"LMM", L"LMN", L"LMO", L"LMP", L"LMQ", L"LMR", L"LMS", L"LMT", L"LMU", L"LMV", L"LMW", L"LMX", L"LMY", L"LMZ", L"LNA", L"LNB", L"LNC", L"LND", L"LNE", L"LNF", L"LNG", L"LNH", L"LNI", L"LNJ", L"LNK", L"LNL", L"LNM", L"LNN", L"LNO", L"LNP", L"LNQ", L"LNR", L"LNS", L"LNT", L"LNU", L"LNV", L"LNW", L"LNX", L"LNY", L"LNZ", L"LOA", L"LOB", L"LOC", L"LOD", L"LOE", L"LOF", L"LOG", L"LOH", L"LOI", L"LOJ", L"LOK", L"LOL", L"LOM", L"LON", L"LOO", L"LOP", L"LOQ", L"LOR", L"LOS", L"LOT", L"LOU", L"LOV", L"LOW", L"LOX", + L"KJL", L"KJM", L"KJN", L"KJO", L"KJP", L"KJQ", L"KJR", L"KJS", L"KJT", L"KJU", L"KJV", L"KJW", L"KJX", L"KJY", L"KJZ", L"KKA", L"KKB", L"KKC", L"KKD", L"KKE", L"KKF", L"KKG", L"KKH", L"KKI", L"KKJ", L"KKK", L"KKL", L"KKM", L"KKN", L"KKO", L"KKP", L"KKQ", L"KKR", L"KKS", L"KKT", L"KKU", L"KKV", L"KKW", L"KKX", L"KKY", L"KKZ", L"KLA", L"KLB", L"KLC", L"KLD", L"KLE", L"KLF", L"KLG", L"KLH", L"KLI", L"KLJ", L"KLK", L"KLL", L"KLM", L"KLN", L"KLO", L"KLP", L"KLQ", L"KLR", L"KLS", L"KLT", L"KLU", L"KLV", L"KLW", L"KLX", L"KLY", L"KLZ", L"KMA", L"KMB", L"KMC", L"KMD", L"KME", L"KMF", L"KMG", L"KMH", L"KMI", L"KMJ", L"KMK", L"KML", L"KMM", L"KMN", L"KMO", L"KMP", L"KMQ", L"KMR", L"KMS", L"KMT", L"KMU", L"KMV", L"KMW", L"KMX", L"KMY", L"KMZ", L"KNA", L"KNB", L"KNC", L"KND", L"KNE", L"KNF", L"KNG", L"KNH", L"KNI", L"KNJ", L"KNK", L"KNL", L"KNM", L"KNN", L"KNO", L"KNP", L"KNQ", L"KNR", L"KNS", L"KNT", L"KNU", L"KNV", L"KNW", L"KNX", L"KNY", L"KNZ", L"KOA", L"KOB", L"KOC", L"KOD", L"KOE", L"KOF", L"KOG", L"KOH", L"KOI", L"KOJ", L"KOK", L"KOL", L"KOM", L"KON", L"KOO", L"KOP", L"KOQ", L"KOR", L"KOS", L"KOT", L"KOU", L"KOV", L"KOW", L"KOX", L"KOY", L"KOZ", L"KPA", L"KPB", L"KPC", L"KPD", L"KPE", L"KPF", L"KPG", L"KPH", L"KPI", L"KPJ", L"KPK", L"KPL", L"KPM", L"KPN", L"KPO", L"KPP", L"KPQ", L"KPR", L"KPS", L"KPT", L"KPU", L"KPV", L"KPW", L"KPX", L"KPY", L"KPZ", L"KQA", L"KQB", L"KQC", L"KQD", L"KQE", L"KQF", L"KQG", L"KQH", L"KQI", L"KQJ", L"KQK", L"KQL", L"KQM", L"KQN", L"KQO", L"KQP", L"KQQ", L"KQR", L"KQS", L"KQT", L"KQU", L"KQV", L"KQW", L"KQX", L"KQY", L"KQZ", L"KRA", L"KRB", L"KRC", L"KRD", L"KRE", L"KRF", L"KRG", L"KRH", L"KRI", L"KRJ", L"KRK", L"KRL", L"KRM", L"KRN", L"KRO", L"KRP", L"KRQ", L"KRR", L"KRS", L"KRT", L"KRU", L"KRV", L"KRW", L"KRX", L"KRY", L"KRZ", L"KSA", L"KSB", L"KSC", L"KSD", L"KSE", L"KSF", L"KSG", L"KSH", L"KSI", L"KSJ", L"KSK", L"KSL", L"KSM", L"KSN", L"KSO", L"KSP", L"KSQ", L"KSR", L"KSS", L"KST", L"KSU", L"KSV", L"KSW", L"KSX", L"KSY", L"KSZ", L"KTA", L"KTB", L"KTC", L"KTD", L"KTE", L"KTF", L"KTG", L"KTH", L"KTI", L"KTJ", L"KTK", L"KTL", L"KTM", L"KTN", L"KTO", L"KTP", L"KTQ", L"KTR", L"KTS", L"KTT", L"KTU", L"KTV", L"KTW", L"KTX", + L"KTY", L"KTZ", L"KUA", L"KUB", L"KUC", L"KUD", L"KUE", L"KUF", L"KUG", L"KUH", L"KUI", L"KUJ", L"KUK", L"KUL", L"KUM", L"KUN", L"KUO", L"KUP", L"KUQ", L"KUR", L"KUS", L"KUT", L"KUU", L"KUV", L"KUW", L"KUX", L"KUY", L"KUZ", L"KVA", L"KVB", L"KVC", L"KVD", L"KVE", L"KVF", L"KVG", L"KVH", L"KVI", L"KVJ", L"KVK", L"KVL", L"KVM", L"KVN", L"KVO", L"KVP", L"KVQ", L"KVR", L"KVS", L"KVT", L"KVU", L"KVV", L"KVW", L"KVX", L"KVY", L"KVZ", L"KWA", L"KWB", L"KWC", L"KWD", L"KWE", L"KWF", L"KWG", L"KWH", L"KWI", L"KWJ", L"KWK", L"KWL", L"KWM", L"KWN", L"KWO", L"KWP", L"KWQ", L"KWR", L"KWS", L"KWT", L"KWU", L"KWV", L"KWW", L"KWX", L"KWY", L"KWZ", L"KXA", L"KXB", L"KXC", L"KXD", L"KXE", L"KXF", L"KXG", L"KXH", L"KXI", L"KXJ", L"KXK", L"KXL", L"KXM", L"KXN", L"KXO", L"KXP", L"KXQ", L"KXR", L"KXS", L"KXT", L"KXU", L"KXV", L"KXW", L"KXX", L"KXY", L"KXZ", L"KYA", L"KYB", L"KYC", L"KYD", L"KYE", L"KYF", L"KYG", L"KYH", L"KYI", L"KYJ", L"KYK", L"KYL", L"KYM", L"KYN", L"KYO", L"KYP", L"KYQ", L"KYR", L"KYS", L"KYT", L"KYU", L"KYV", L"KYW", L"KYX", L"KYY", L"KYZ", L"KZA", L"KZB", L"KZC", L"KZD", L"KZE", L"KZF", L"KZG", L"KZH", L"KZI", L"KZJ", L"KZK", L"KZL", L"KZM", L"KZN", L"KZO", L"KZP", L"KZQ", L"KZR", L"KZS", L"KZT", L"KZU", L"KZV", L"KZW", L"KZX", L"KZY", L"KZZ", L"LAA", L"LAB", L"LAC", L"LAD", L"LAE", L"LAF", L"LAG", L"LAH", L"LAI", L"LAJ", L"LAK", L"LAL", L"LAM", L"LAN", L"LAO", L"LAP", L"LAQ", L"LAR", L"LAS", L"LAT", L"LAU", L"LAV", L"LAW", L"LAX", L"LAY", L"LAZ", L"LBA", L"LBB", L"LBC", L"LBD", L"LBE", L"LBF", L"LBG", L"LBH", L"LBI", L"LBJ", L"LBK", L"LBL", L"LBM", L"LBN", L"LBO", L"LBP", L"LBQ", L"LBR", L"LBS", L"LBT", L"LBU", L"LBV", L"LBW", L"LBX", L"LBY", L"LBZ", L"LCA", L"LCB", L"LCC", L"LCD", L"LCE", L"LCF", L"LCG", L"LCH", L"LCI", L"LCJ", L"LCK", L"LCL", L"LCM", L"LCN", L"LCO", L"LCP", L"LCQ", L"LCR", L"LCS", L"LCT", L"LCU", L"LCV", L"LCW", L"LCX", L"LCY", L"LCZ", L"LDA", L"LDB", L"LDC", L"LDD", L"LDE", L"LDF", L"LDG", L"LDH", L"LDI", L"LDJ", L"LDK", L"LDL", L"LDM", L"LDN", L"LDO", L"LDP", L"LDQ", L"LDR", L"LDS", L"LDT", L"LDU", L"LDV", L"LDW", L"LDX", L"LDY", L"LDZ", L"LEA", L"LEB", L"LEC", L"LED", L"LEE", L"LEF", L"LEG", L"LEH", L"LEI", L"LEJ", L"LEK", + L"LEL", L"LEM", L"LEN", L"LEO", L"LEP", L"LEQ", L"LER", L"LES", L"LET", L"LEU", L"LEV", L"LEW", L"LEX", L"LEY", L"LEZ", L"LFA", L"LFB", L"LFC", L"LFD", L"LFE", L"LFF", L"LFG", L"LFH", L"LFI", L"LFJ", L"LFK", L"LFL", L"LFM", L"LFN", L"LFO", L"LFP", L"LFQ", L"LFR", L"LFS", L"LFT", L"LFU", L"LFV", L"LFW", L"LFX", L"LFY", L"LFZ", L"LGA", L"LGB", L"LGC", L"LGD", L"LGE", L"LGF", L"LGG", L"LGH", L"LGI", L"LGJ", L"LGK", L"LGL", L"LGM", L"LGN", L"LGO", L"LGP", L"LGQ", L"LGR", L"LGS", L"LGT", L"LGU", L"LGV", L"LGW", L"LGX", L"LGY", L"LGZ", L"LHA", L"LHB", L"LHC", L"LHD", L"LHE", L"LHF", L"LHG", L"LHH", L"LHI", L"LHJ", L"LHK", L"LHL", L"LHM", L"LHN", L"LHO", L"LHP", L"LHQ", L"LHR", L"LHS", L"LHT", L"LHU", L"LHV", L"LHW", L"LHX", L"LHY", L"LHZ", L"LIA", L"LIB", L"LIC", L"LID", L"LIE", L"LIF", L"LIG", L"LIH", L"LII", L"LIJ", L"LIK", L"LIL", L"LIM", L"LIN", L"LIO", L"LIP", L"LIQ", L"LIR", L"LIS", L"LIT", L"LIU", L"LIV", L"LIW", L"LIX", L"LIY", L"LIZ", L"LJA", L"LJB", L"LJC", L"LJD", L"LJE", L"LJF", L"LJG", L"LJH", L"LJI", L"LJJ", L"LJK", L"LJL", L"LJM", L"LJN", L"LJO", L"LJP", L"LJQ", L"LJR", L"LJS", L"LJT", L"LJU", L"LJV", L"LJW", L"LJX", L"LJY", L"LJZ", L"LKA", L"LKB", L"LKC", L"LKD", L"LKE", L"LKF", L"LKG", L"LKH", L"LKI", L"LKJ", L"LKK", L"LKL", L"LKM", L"LKN", L"LKO", L"LKP", L"LKQ", L"LKR", L"LKS", L"LKT", L"LKU", L"LKV", L"LKW", L"LKX", L"LKY", L"LKZ", L"LLA", L"LLB", L"LLC", L"LLD", L"LLE", L"LLF", L"LLG", L"LLH", L"LLI", L"LLJ", L"LLK", L"LLL", L"LLM", L"LLN", L"LLO", L"LLP", L"LLQ", L"LLR", L"LLS", L"LLT", L"LLU", L"LLV", L"LLW", L"LLX", L"LLY", L"LLZ", L"LMA", L"LMB", L"LMC", L"LMD", L"LME", L"LMF", L"LMG", L"LMH", L"LMI", L"LMJ", L"LMK", L"LML", L"LMM", L"LMN", L"LMO", L"LMP", L"LMQ", L"LMR", L"LMS", L"LMT", L"LMU", L"LMV", L"LMW", L"LMX", L"LMY", L"LMZ", L"LNA", L"LNB", L"LNC", L"LND", L"LNE", L"LNF", L"LNG", L"LNH", L"LNI", L"LNJ", L"LNK", L"LNL", L"LNM", L"LNN", L"LNO", L"LNP", L"LNQ", L"LNR", L"LNS", L"LNT", L"LNU", L"LNV", L"LNW", L"LNX", L"LNY", L"LNZ", L"LOA", L"LOB", L"LOC", L"LOD", L"LOE", L"LOF", L"LOG", L"LOH", L"LOI", L"LOJ", L"LOK", L"LOL", L"LOM", L"LON", L"LOO", L"LOP", L"LOQ", L"LOR", L"LOS", L"LOT", L"LOU", L"LOV", L"LOW", L"LOX", L"LOY", L"LOZ", L"LPA", L"LPB", L"LPC", L"LPD", L"LPE", L"LPF", L"LPG", L"LPH", L"LPI", L"LPJ", L"LPK", L"LPL", L"LPM", L"LPN", L"LPO", L"LPP", L"LPQ", L"LPR", L"LPS", L"LPT", L"LPU", L"LPV", L"LPW", L"LPX", L"LPY", L"LPZ", L"LQA", L"LQB", L"LQC", L"LQD", L"LQE", L"LQF", L"LQG", L"LQH", L"LQI", L"LQJ", L"LQK", L"LQL", L"LQM", L"LQN", L"LQO", L"LQP", L"LQQ", L"LQR", L"LQS", L"LQT", L"LQU", L"LQV", L"LQW", L"LQX", L"LQY", L"LQZ", L"LRA", L"LRB", L"LRC", L"LRD", L"LRE", L"LRF", L"LRG", L"LRH", L"LRI", L"LRJ", L"LRK", L"LRL", L"LRM", L"LRN", L"LRO", L"LRP", L"LRQ", L"LRR", L"LRS", L"LRT", L"LRU", L"LRV", L"LRW", L"LRX", L"LRY", L"LRZ", L"LSA", L"LSB", L"LSC", L"LSD", L"LSE", L"LSF", L"LSG", L"LSH", L"LSI", L"LSJ", L"LSK", L"LSL", L"LSM", L"LSN", L"LSO", L"LSP", L"LSQ", L"LSR", L"LSS", L"LST", L"LSU", L"LSV", L"LSW", L"LSX", L"LSY", L"LSZ", L"LTA", L"LTB", L"LTC", L"LTD", L"LTE", L"LTF", L"LTG", L"LTH", L"LTI", L"LTJ", L"LTK", L"LTL", L"LTM", L"LTN", L"LTO", L"LTP", L"LTQ", L"LTR", L"LTS", L"LTT", L"LTU", L"LTV", L"LTW", L"LTX", L"LTY", L"LTZ", L"LUA", L"LUB", L"LUC", L"LUD", L"LUE", L"LUF", L"LUG", L"LUH", L"LUI", L"LUJ", L"LUK", L"LUL", L"LUM", L"LUN", L"LUO", L"LUP", L"LUQ", L"LUR", L"LUS", L"LUT", L"LUU", L"LUV", L"LUW", L"LUX", L"LUY", L"LUZ", L"LVA", L"LVB", L"LVC", L"LVD", L"LVE", L"LVF", L"LVG", L"LVH", L"LVI", L"LVJ", L"LVK", L"LVL", L"LVM", L"LVN", L"LVO", L"LVP", L"LVQ", L"LVR", L"LVS", L"LVT", L"LVU", L"LVV", L"LVW", L"LVX", L"LVY", L"LVZ", L"LWA", L"LWB", L"LWC", L"LWD", L"LWE", L"LWF", L"LWG", L"LWH", L"LWI", L"LWJ", L"LWK", L"LWL", L"LWM", L"LWN", L"LWO", L"LWP", L"LWQ", L"LWR", L"LWS", L"LWT", L"LWU", L"LWV", L"LWW", L"LWX", L"LWY", L"LWZ", L"LXA", L"LXB", L"LXC", L"LXD", L"LXE", L"LXF", L"LXG", L"LXH", L"LXI", L"LXJ", L"LXK", L"LXL", L"LXM", L"LXN", L"LXO", L"LXP", L"LXQ", L"LXR", L"LXS", L"LXT", L"LXU", L"LXV", L"LXW", L"LXX", L"LXY", L"LXZ", L"LYA", L"LYB", L"LYC", L"LYD", L"LYE", L"LYF", L"LYG", L"LYH", L"LYI", L"LYJ", L"LYK", L"LYL", L"LYM", L"LYN", L"LYO", L"LYP", L"LYQ", L"LYR", L"LYS", L"LYT", L"LYU", L"LYV", L"LYW", L"LYX", L"LYY", L"LYZ", L"LZA", L"LZB", L"LZC", L"LZD", L"LZE", L"LZF", L"LZG", L"LZH", L"LZI", L"LZJ", L"LZK", L"LZL", L"LZM", L"LZN", L"LZO", L"LZP", L"LZQ", L"LZR", L"LZS", L"LZT", L"LZU", L"LZV", L"LZW", L"LZX", L"LZY", L"LZZ", L"MAA", L"MAB", L"MAC", L"MAD", L"MAE", L"MAF", L"MAG", L"MAH", L"MAI", L"MAJ", L"MAK", L"MAL", L"MAM", L"MAN", L"MAO", L"MAP", L"MAQ", L"MAR", L"MAS", L"MAT", L"MAU", L"MAV", L"MAW", L"MAX", L"MAY", L"MAZ", L"MBA", L"MBB", L"MBC", L"MBD", L"MBE", L"MBF", L"MBG", L"MBH", L"MBI", L"MBJ", L"MBK", L"MBL", L"MBM", L"MBN", L"MBO", L"MBP", L"MBQ", L"MBR", L"MBS", L"MBT", L"MBU", L"MBV", L"MBW", L"MBX", L"MBY", L"MBZ", L"MCA", L"MCB", L"MCC", L"MCD", L"MCE", L"MCF", L"MCG", L"MCH", L"MCI", L"MCJ", L"MCK", L"MCL", L"MCM", L"MCN", L"MCO", L"MCP", L"MCQ", L"MCR", L"MCS", L"MCT", L"MCU", L"MCV", L"MCW", L"MCX", L"MCY", L"MCZ", L"MDA", L"MDB", L"MDC", L"MDD", L"MDE", L"MDF", L"MDG", L"MDH", L"MDI", L"MDJ", L"MDK", L"MDL", L"MDM", L"MDN", L"MDO", L"MDP", L"MDQ", L"MDR", L"MDS", L"MDT", L"MDU", L"MDV", L"MDW", L"MDX", L"MDY", L"MDZ", L"MEA", L"MEB", L"MEC", L"MED", L"MEE", L"MEF", L"MEG", L"MEH", L"MEI", L"MEJ", L"MEK", L"MEL", L"MEM", L"MEN", L"MEO", L"MEP", L"MEQ", L"MER", L"MES", L"MET", L"MEU", L"MEV", L"MEW", L"MEX", L"MEY", L"MEZ", L"MFA", L"MFB", L"MFC", L"MFD", L"MFE", L"MFF", L"MFG", L"MFH", L"MFI", L"MFJ", L"MFK", L"MFL", L"MFM", L"MFN", L"MFO", L"MFP", L"MFQ", L"MFR", L"MFS", L"MFT", L"MFU", L"MFV", L"MFW", L"MFX", L"MFY", L"MFZ", L"MGA", L"MGB", L"MGC", L"MGD", L"MGE", L"MGF", L"MGG", L"MGH", L"MGI", L"MGJ", L"MGK", L"MGL", L"MGM", L"MGN", L"MGO", L"MGP", L"MGQ", L"MGR", L"MGS", L"MGT", L"MGU", L"MGV", L"MGW", L"MGX", L"MGY", L"MGZ", L"MHA", L"MHB", L"MHC", L"MHD", L"MHE", L"MHF", L"MHG", L"MHH", L"MHI", L"MHJ", L"MHK", L"MHL", L"MHM", L"MHN", L"MHO", L"MHP", L"MHQ", L"MHR", L"MHS", L"MHT", L"MHU", L"MHV", L"MHW", L"MHX", L"MHY", L"MHZ", L"MIA", L"MIB", L"MIC", L"MID", L"MIE", L"MIF", L"MIG", L"MIH", L"MII", L"MIJ", L"MIK", L"MIL", L"MIM", L"MIN", L"MIO", L"MIP", L"MIQ", L"MIR", L"MIS", L"MIT", L"MIU", L"MIV", L"MIW", L"MIX", L"MIY", L"MIZ", L"MJA", L"MJB", L"MJC", L"MJD", L"MJE", L"MJF", L"MJG", L"MJH", L"MJI", L"MJJ", L"MJK", L"MJL", L"MJM", L"MJN", L"MJO", L"MJP", L"MJQ", L"MJR", L"MJS", L"MJT", L"MJU", L"MJV", L"MJW", L"MJX", L"MJY", L"MJZ", L"MKA", L"MKB", L"MKC", L"MKD", L"MKE", L"MKF", L"MKG", L"MKH", L"MKI", L"MKJ", L"MKK", L"MKL", L"MKM", L"MKN", L"MKO", L"MKP", L"MKQ", L"MKR", L"MKS", L"MKT", L"MKU", L"MKV", L"MKW", L"MKX", L"MKY", L"MKZ", L"MLA", L"MLB", L"MLC", L"MLD", L"MLE", L"MLF", L"MLG", L"MLH", L"MLI", L"MLJ", L"MLK", L"MLL", L"MLM", L"MLN", L"MLO", L"MLP", L"MLQ", L"MLR", L"MLS", L"MLT", L"MLU", L"MLV", L"MLW", L"MLX", L"MLY", L"MLZ", L"MMA", L"MMB", L"MMC", L"MMD", L"MME", L"MMF", L"MMG", L"MMH", L"MMI", L"MMJ", L"MMK", L"MML", L"MMM", L"MMN", L"MMO", L"MMP", L"MMQ", L"MMR", L"MMS", L"MMT", L"MMU", L"MMV", L"MMW", L"MMX", L"MMY", L"MMZ", L"MNA", L"MNB", L"MNC", L"MND", L"MNE", L"MNF", L"MNG", L"MNH", L"MNI", L"MNJ", L"MNK", L"MNL", L"MNM", L"MNN", L"MNO", L"MNP", L"MNQ", L"MNR", L"MNS", L"MNT", L"MNU", L"MNV", L"MNW", L"MNX", L"MNY", L"MNZ", L"MOA", L"MOB", L"MOC", L"MOD", L"MOE", L"MOF", L"MOG", L"MOH", L"MOI", L"MOJ", L"MOK", L"MOL", L"MOM", L"MON", L"MOO", L"MOP", L"MOQ", L"MOR", L"MOS", L"MOT", L"MOU", L"MOV", L"MOW", L"MOX", L"MOY", L"MOZ", L"MPA", L"MPB", L"MPC", L"MPD", L"MPE", L"MPF", L"MPG", L"MPH", L"MPI", L"MPJ", L"MPK", L"MPL", L"MPM", L"MPN", L"MPO", L"MPP", L"MPQ", L"MPR", L"MPS", L"MPT", L"MPU", L"MPV", L"MPW", L"MPX", L"MPY", L"MPZ", L"MQA", L"MQB", L"MQC", L"MQD", L"MQE", L"MQF", L"MQG", L"MQH", L"MQI", L"MQJ", L"MQK", L"MQL", L"MQM", L"MQN", L"MQO", L"MQP", L"MQQ", L"MQR", L"MQS", L"MQT", L"MQU", L"MQV", L"MQW", L"MQX", L"MQY", L"MQZ", L"MRA", L"MRB", L"MRC", L"MRD", L"MRE", L"MRF", L"MRG", L"MRH", L"MRI", L"MRJ", L"MRK", L"MRL", L"MRM", L"MRN", L"MRO", L"MRP", L"MRQ", L"MRR", L"MRS", L"MRT", L"MRU", L"MRV", L"MRW", L"MRX", L"MRY", L"MRZ", L"MSA", L"MSB", L"MSC", L"MSD", L"MSE", L"MSF", L"MSG", L"MSH", L"MSI", L"MSJ", L"MSK", L"MSL", L"MSM", L"MSN", L"MSO", L"MSP", L"MSQ", L"MSR", L"MSS", L"MST", L"MSU", L"MSV", L"MSW", L"MSX", L"MSY", L"MSZ", L"MTA", L"MTB", L"MTC", L"MTD", L"MTE", L"MTF", L"MTG", L"MTH", L"MTI", L"MTJ", L"MTK", L"MTL", L"MTM", L"MTN", L"MTO", L"MTP", L"MTQ", L"MTR", L"MTS", L"MTT", L"MTU", L"MTV", L"MTW", L"MTX", L"MTY", L"MTZ", L"MUA", L"MUB", L"MUC", - L"MUD", L"MUE", L"MUF", L"MUG", L"MUH", L"MUI", L"MUJ", L"MUK", L"MUL", L"MUM", L"MUN", L"MUO", L"MUP", L"MUQ", L"MUR", L"MUS", L"MUT", L"MUU", L"MUV", L"MUW", L"MUX", L"MUY", L"MUZ", L"MVA", L"MVB", L"MVC", L"MVD", L"MVE", L"MVF", L"MVG", L"MVH", L"MVI", L"MVJ", L"MVK", L"MVL", L"MVM", L"MVN", L"MVO", L"MVP", L"MVQ", L"MVR", L"MVS", L"MVT", L"MVU", L"MVV", L"MVW", L"MVX", L"MVY", L"MVZ", L"MWA", L"MWB", L"MWC", L"MWD", L"MWE", L"MWF", L"MWG", L"MWH", L"MWI", L"MWJ", L"MWK", L"MWL", L"MWM", L"MWN", L"MWO", L"MWP", L"MWQ", L"MWR", L"MWS", L"MWT", L"MWU", L"MWV", L"MWW", L"MWX", L"MWY", L"MWZ", L"MXA", L"MXB", L"MXC", L"MXD", L"MXE", L"MXF", L"MXG", L"MXH", L"MXI", L"MXJ", L"MXK", L"MXL", L"MXM", L"MXN", L"MXO", L"MXP", L"MXQ", L"MXR", L"MXS", L"MXT", L"MXU", L"MXV", L"MXW", L"MXX", L"MXY", L"MXZ", L"MYA", L"MYB", L"MYC", L"MYD", L"MYE", L"MYF", L"MYG", L"MYH", L"MYI", L"MYJ", L"MYK", L"MYL", L"MYM", L"MYN", L"MYO", L"MYP", L"MYQ", L"MYR", L"MYS", L"MYT", L"MYU", L"MYV", L"MYW", L"MYX", L"MYY", L"MYZ", L"MZA", L"MZB", L"MZC", L"MZD", L"MZE", L"MZF", L"MZG", L"MZH", L"MZI", L"MZJ", L"MZK", L"MZL", L"MZM", L"MZN", L"MZO", L"MZP", L"MZQ", L"MZR", L"MZS", L"MZT", L"MZU", L"MZV", L"MZW", L"MZX", L"MZY", L"MZZ", L"NAA", L"NAB", L"NAC", L"NAD", L"NAE", L"NAF", L"NAG", L"NAH", L"NAI", L"NAJ", L"NAK", L"NAL", L"NAM", L"NAN", L"NAO", L"NAP", L"NAQ", L"NAR", L"NAS", L"NAT", L"NAU", L"NAV", L"NAW", L"NAX", L"NAY", L"NAZ", L"NBA", L"NBB", L"NBC", L"NBD", L"NBE", L"NBF", L"NBG", L"NBH", L"NBI", L"NBJ", L"NBK", L"NBL", L"NBM", L"NBN", L"NBO", L"NBP", L"NBQ", L"NBR", L"NBS", L"NBT", L"NBU", L"NBV", L"NBW", L"NBX", L"NBY", L"NBZ", L"NCA", L"NCB", L"NCC", L"NCD", L"NCE", L"NCF", L"NCG", L"NCH", L"NCI", L"NCJ", L"NCK", L"NCL", L"NCM", L"NCN", L"NCO", L"NCP", L"NCQ", L"NCR", L"NCS", L"NCT", L"NCU", L"NCV", L"NCW", L"NCX", L"NCY", L"NCZ", L"NDA", L"NDB", L"NDC", L"NDD", L"NDE", L"NDF", L"NDG", L"NDH", L"NDI", L"NDJ", L"NDK", L"NDL", L"NDM", L"NDN", L"NDO", L"NDP", L"NDQ", L"NDR", L"NDS", L"NDT", L"NDU", L"NDV", L"NDW", L"NDX", L"NDY", L"NDZ", L"NEA", L"NEB", L"NEC", L"NED", L"NEE", L"NEF", L"NEG", L"NEH", L"NEI", L"NEJ", L"NEK", L"NEL", L"NEM", L"NEN", L"NEO", L"NEP", - L"NEQ", L"NER", L"NES", L"NET", L"NEU", L"NEV", L"NEW", L"NEX", L"NEY", L"NEZ", L"NFA", L"NFB", L"NFC", L"NFD", L"NFE", L"NFF", L"NFG", L"NFH", L"NFI", L"NFJ", L"NFK", L"NFL", L"NFM", L"NFN", L"NFO", L"NFP", L"NFQ", L"NFR", L"NFS", L"NFT", L"NFU", L"NFV", L"NFW", L"NFX", L"NFY", L"NFZ", L"NGA", L"NGB", L"NGC", L"NGD", L"NGE", L"NGF", L"NGG", L"NGH", L"NGI", L"NGJ", L"NGK", L"NGL", L"NGM", L"NGN", L"NGO", L"NGP", L"NGQ", L"NGR", L"NGS", L"NGT", L"NGU", L"NGV", L"NGW", L"NGX", L"NGY", L"NGZ", L"NHA", L"NHB", L"NHC", L"NHD", L"NHE", L"NHF", L"NHG", L"NHH", L"NHI", L"NHJ", L"NHK", L"NHL", L"NHM", L"NHN", L"NHO", L"NHP", L"NHQ", L"NHR", L"NHS", L"NHT", L"NHU", L"NHV", L"NHW", L"NHX", L"NHY", L"NHZ", L"NIA", L"NIB", L"NIC", L"NID", L"NIE", L"NIF", L"NIG", L"NIH", L"NII", L"NIJ", L"NIK", L"NIL", L"NIM", L"NIN", L"NIO", L"NIP", L"NIQ", L"NIR", L"NIS", L"NIT", L"NIU", L"NIV", L"NIW", L"NIX", L"NIY", L"NIZ", L"NJA", L"NJB", L"NJC", L"NJD", L"NJE", L"NJF", L"NJG", L"NJH", L"NJI", L"NJJ", L"NJK", L"NJL", L"NJM", L"NJN", L"NJO", L"NJP", L"NJQ", L"NJR", L"NJS", L"NJT", L"NJU", L"NJV", L"NJW", L"NJX", L"NJY", L"NJZ", L"NKA", L"NKB", L"NKC", L"NKD", L"NKE", L"NKF", L"NKG", L"NKH", L"NKI", L"NKJ", L"NKK", L"NKL", L"NKM", L"NKN", L"NKO", L"NKP", L"NKQ", L"NKR", L"NKS", L"NKT", L"NKU", L"NKV", L"NKW", L"NKX", L"NKY", L"NKZ", L"NLA", L"NLB", L"NLC", L"NLD", L"NLE", L"NLF", L"NLG", L"NLH", L"NLI", L"NLJ", L"NLK", L"NLL", L"NLM", L"NLN", L"NLO", L"NLP", L"NLQ", L"NLR", L"NLS", L"NLT", L"NLU", L"NLV", L"NLW", L"NLX", L"NLY", L"NLZ", L"NMA", L"NMB", L"NMC", L"NMD", L"NME", L"NMF", L"NMG", L"NMH", L"NMI", L"NMJ", L"NMK", L"NML", L"NMM", L"NMN", L"NMO", L"NMP", L"NMQ", L"NMR", L"NMS", L"NMT", L"NMU", L"NMV", L"NMW", L"NMX", L"NMY", L"NMZ", L"NNA", L"NNB", L"NNC", L"NND", L"NNE", L"NNF", L"NNG", L"NNH", L"NNI", L"NNJ", L"NNK", L"NNL", L"NNM", L"NNN", L"NNO", L"NNP", L"NNQ", L"NNR", L"NNS", L"NNT", L"NNU", L"NNV", L"NNW", L"NNX", L"NNY", L"NNZ", L"NOA", L"NOB", L"NOC", L"NOD", L"NOE", L"NOF", L"NOG", L"NOH", L"NOI", L"NOJ", L"NOK", L"NOL", L"NOM", L"NON", L"NOO", L"NOP", L"NOQ", L"NOR", L"NOS", L"NOT", L"NOU", L"NOV", L"NOW", L"NOX", L"NOY", L"NOZ", L"NPA", L"NPB", L"NPC", - L"NPD", L"NPE", L"NPF", L"NPG", L"NPH", L"NPI", L"NPJ", L"NPK", L"NPL", L"NPM", L"NPN", L"NPO", L"NPP", L"NPQ", L"NPR", L"NPS", L"NPT", L"NPU", L"NPV", L"NPW", L"NPX", L"NPY", L"NPZ", L"NQA", L"NQB", L"NQC", L"NQD", L"NQE", L"NQF", L"NQG", L"NQH", L"NQI", L"NQJ", L"NQK", L"NQL", L"NQM", L"NQN", L"NQO", L"NQP", L"NQQ", L"NQR", L"NQS", L"NQT", L"NQU", L"NQV", L"NQW", L"NQX", L"NQY", L"NQZ", L"NRA", L"NRB", L"NRC", L"NRD", L"NRE", L"NRF", L"NRG", L"NRH", L"NRI", L"NRJ", L"NRK", L"NRL", L"NRM", L"NRN", L"NRO", L"NRP", L"NRQ", L"NRR", L"NRS", L"NRT", L"NRU", L"NRV", L"NRW", L"NRX", L"NRY", L"NRZ", L"NSA", L"NSB", L"NSC", L"NSD", L"NSE", L"NSF", L"NSG", L"NSH", L"NSI", L"NSJ", L"NSK", L"NSL", L"NSM", L"NSN", L"NSO", L"NSP", L"NSQ", L"NSR", L"NSS", L"NST", L"NSU", L"NSV", L"NSW", L"NSX", L"NSY", L"NSZ", L"NTA", L"NTB", L"NTC", L"NTD", L"NTE", L"NTF", L"NTG", L"NTH", L"NTI", L"NTJ", L"NTK", L"NTL", L"NTM", L"NTN", L"NTO", L"NTP", L"NTQ", L"NTR", L"NTS", L"NTT", L"NTU", L"NTV", L"NTW", L"NTX", L"NTY", L"NTZ", L"NUA", L"NUB", L"NUC", L"NUD", L"NUE", L"NUF", L"NUG", L"NUH", L"NUI", L"NUJ", L"NUK", L"NUL", L"NUM", L"NUN", L"NUO", L"NUP", L"NUQ", L"NUR", L"NUS", L"NUT", L"NUU", L"NUV", L"NUW", L"NUX", L"NUY", L"NUZ", L"NVA", L"NVB", L"NVC", L"NVD", L"NVE", L"NVF", L"NVG", L"NVH", L"NVI", L"NVJ", L"NVK", L"NVL", L"NVM", L"NVN", L"NVO", L"NVP", L"NVQ", L"NVR", L"NVS", L"NVT", L"NVU", L"NVV", L"NVW", L"NVX", L"NVY", L"NVZ", L"NWA", L"NWB", L"NWC", L"NWD", L"NWE", L"NWF", L"NWG", L"NWH", L"NWI", L"NWJ", L"NWK", L"NWL", L"NWM", L"NWN", L"NWO", L"NWP", L"NWQ", L"NWR", L"NWS", L"NWT", L"NWU", L"NWV", L"NWW", L"NWX", L"NWY", L"NWZ", L"NXA", L"NXB", L"NXC", L"NXD", L"NXE", L"NXF", L"NXG", L"NXH", L"NXI", L"NXJ", L"NXK", L"NXL", L"NXM", L"NXN", L"NXO", L"NXP", L"NXQ", L"NXR", L"NXS", L"NXT", L"NXU", L"NXV", L"NXW", L"NXX", L"NXY", L"NXZ", L"NYA", L"NYB", L"NYC", L"NYD", L"NYE", L"NYF", L"NYG", L"NYH", L"NYI", L"NYJ", L"NYK", L"NYL", L"NYM", L"NYN", L"NYO", L"NYP", L"NYQ", L"NYR", L"NYS", L"NYT", L"NYU", L"NYV", L"NYW", L"NYX", L"NYY", L"NYZ", L"NZA", L"NZB", L"NZC", L"NZD", L"NZE", L"NZF", L"NZG", L"NZH", L"NZI", L"NZJ", L"NZK", L"NZL", L"NZM", L"NZN", L"NZO", L"NZP", - L"NZQ", L"NZR", L"NZS", L"NZT", L"NZU", L"NZV", L"NZW", L"NZX", L"NZY", L"NZZ", L"OAA", L"OAB", L"OAC", L"OAD", L"OAE", L"OAF", L"OAG", L"OAH", L"OAI", L"OAJ", L"OAK", L"OAL", L"OAM", L"OAN", L"OAO", L"OAP", L"OAQ", L"OAR", L"OAS", L"OAT", L"OAU", L"OAV", L"OAW", L"OAX", L"OAY", L"OAZ", L"OBA", L"OBB", L"OBC", L"OBD", L"OBE", L"OBF", L"OBG", L"OBH", L"OBI", L"OBJ", L"OBK", L"OBL", L"OBM", L"OBN", L"OBO", L"OBP", L"OBQ", L"OBR", L"OBS", L"OBT", L"OBU", L"OBV", L"OBW", L"OBX", L"OBY", L"OBZ", L"OCA", L"OCB", L"OCC", L"OCD", L"OCE", L"OCF", L"OCG", L"OCH", L"OCI", L"OCJ", L"OCK", L"OCL", L"OCM", L"OCN", L"OCO", L"OCP", L"OCQ", L"OCR", L"OCS", L"OCT", L"OCU", L"OCV", L"OCW", L"OCX", L"OCY", L"OCZ", L"ODA", L"ODB", L"ODC", L"ODD", L"ODE", L"ODF", L"ODG", L"ODH", L"ODI", L"ODJ", L"ODK", L"ODL", L"ODM", L"ODN", L"ODO", L"ODP", L"ODQ", L"ODR", L"ODS", L"ODT", L"ODU", L"ODV", L"ODW", L"ODX", L"ODY", L"ODZ", L"OEA", L"OEB", L"OEC", L"OED", L"OEE", L"OEF", L"OEG", L"OEH", L"OEI", L"OEJ", L"OEK", L"OEL", L"OEM", L"OEN", L"OEO", L"OEP", L"OEQ", L"OER", L"OES", L"OET", L"OEU", L"OEV", L"OEW", L"OEX", L"OEY", L"OEZ", L"OFA", L"OFB", L"OFC", L"OFD", L"OFE", L"OFF", L"OFG", L"OFH", L"OFI", L"OFJ", L"OFK", L"OFL", L"OFM", L"OFN", L"OFO", L"OFP", L"OFQ", L"OFR", L"OFS", L"OFT", L"OFU", L"OFV", L"OFW", L"OFX", L"OFY", L"OFZ", L"OGA", L"OGB", L"OGC", L"OGD", L"OGE", L"OGF", L"OGG", L"OGH", L"OGI", L"OGJ", L"OGK", L"OGL", L"OGM", L"OGN", L"OGO", L"OGP", L"OGQ", L"OGR", L"OGS", L"OGT", L"OGU", L"OGV", L"OGW", L"OGX", L"OGY", L"OGZ", L"OHA", L"OHB", L"OHC", L"OHD", L"OHE", L"OHF", L"OHG", L"OHH", L"OHI", L"OHJ", L"OHK", L"OHL", L"OHM", L"OHN", L"OHO", L"OHP", L"OHQ", L"OHR", L"OHS", L"OHT", L"OHU", L"OHV", L"OHW", L"OHX", L"OHY", L"OHZ", L"OIA", L"OIB", L"OIC", L"OID", L"OIE", L"OIF", L"OIG", L"OIH", L"OII", L"OIJ", L"OIK", L"OIL", L"OIM", L"OIN", L"OIO", L"OIP", L"OIQ", L"OIR", L"OIS", L"OIT", L"OIU", L"OIV", L"OIW", L"OIX", L"OIY", L"OIZ", L"OJA", L"OJB", L"OJC", L"OJD", L"OJE", L"OJF", L"OJG", L"OJH", L"OJI", L"OJJ", L"OJK", L"OJL", L"OJM", L"OJN", L"OJO", L"OJP", L"OJQ", L"OJR", L"OJS", L"OJT", L"OJU", L"OJV", L"OJW", L"OJX", L"OJY", L"OJZ", L"OKA", L"OKB", L"OKC", - L"OKD", L"OKE", L"OKF", L"OKG", L"OKH", L"OKI", L"OKJ", L"OKK", L"OKL", L"OKM", L"OKN", L"OKO", L"OKP", L"OKQ", L"OKR", L"OKS", L"OKT", L"OKU", L"OKV", L"OKW", L"OKX", L"OKY", L"OKZ", L"OLA", L"OLB", L"OLC", L"OLD", L"OLE", L"OLF", L"OLG", L"OLH", L"OLI", L"OLJ", L"OLK", L"OLL", L"OLM", L"OLN", L"OLO", L"OLP", L"OLQ", L"OLR", L"OLS", L"OLT", L"OLU", L"OLV", L"OLW", L"OLX", L"OLY", L"OLZ", L"OMA", L"OMB", L"OMC", L"OMD", L"OME", L"OMF", L"OMG", L"OMH", L"OMI", L"OMJ", L"OMK", L"OML", L"OMM", L"OMN", L"OMO", L"OMP", L"OMQ", L"OMR", L"OMS", L"OMT", L"OMU", L"OMV", L"OMW", L"OMX", L"OMY", L"OMZ", L"ONA", L"ONB", L"ONC", L"OND", L"ONE", L"ONF", L"ONG", L"ONH", L"ONI", L"ONJ", L"ONK", L"ONL", L"ONM", L"ONN", L"ONO", L"ONP", L"ONQ", L"ONR", L"ONS", L"ONT", L"ONU", L"ONV", L"ONW", L"ONX", L"ONY", L"ONZ", L"OOA", L"OOB", L"OOC", L"OOD", L"OOE", L"OOF", L"OOG", L"OOH", L"OOI", L"OOJ", L"OOK", L"OOL", L"OOM", L"OON", L"OOO", L"OOP", L"OOQ", L"OOR", L"OOS", L"OOT", L"OOU", L"OOV", L"OOW", L"OOX", L"OOY", L"OOZ", L"OPA", L"OPB", L"OPC", L"OPD", L"OPE", L"OPF", L"OPG", L"OPH", L"OPI", L"OPJ", L"OPK", L"OPL", L"OPM", L"OPN", L"OPO", L"OPP", L"OPQ", L"OPR", L"OPS", L"OPT", L"OPU", L"OPV", L"OPW", L"OPX", L"OPY", L"OPZ", L"OQA", L"OQB", L"OQC", L"OQD", L"OQE", L"OQF", L"OQG", L"OQH", L"OQI", L"OQJ", L"OQK", L"OQL", L"OQM", L"OQN", L"OQO", L"OQP", L"OQQ", L"OQR", L"OQS", L"OQT", L"OQU", L"OQV", L"OQW", L"OQX", L"OQY", L"OQZ", L"ORA", L"ORB", L"ORC", L"ORD", L"ORE", L"ORF", L"ORG", L"ORH", L"ORI", L"ORJ", L"ORK", L"ORL", L"ORM", L"ORN", L"ORO", L"ORP", L"ORQ", L"ORR", L"ORS", L"ORT", L"ORU", L"ORV", L"ORW", L"ORX", L"ORY", L"ORZ", L"OSA", L"OSB", L"OSC", L"OSD", L"OSE", L"OSF", L"OSG", L"OSH", L"OSI", L"OSJ", L"OSK", L"OSL", L"OSM", L"OSN", L"OSO", L"OSP", L"OSQ", L"OSR", L"OSS", L"OST", L"OSU", L"OSV", L"OSW", L"OSX", L"OSY", L"OSZ", L"OTA", L"OTB", L"OTC", L"OTD", L"OTE", L"OTF", L"OTG", L"OTH", L"OTI", L"OTJ", L"OTK", L"OTL", L"OTM", L"OTN", L"OTO", L"OTP", L"OTQ", L"OTR", L"OTS", L"OTT", L"OTU", L"OTV", L"OTW", L"OTX", L"OTY", L"OTZ", L"OUA", L"OUB", L"OUC", L"OUD", L"OUE", L"OUF", L"OUG", L"OUH", L"OUI", L"OUJ", L"OUK", L"OUL", L"OUM", L"OUN", L"OUO", L"OUP", - L"OUQ", L"OUR", L"OUS", L"OUT", L"OUU", L"OUV", L"OUW", L"OUX", L"OUY", L"OUZ", L"OVA", L"OVB", L"OVC", L"OVD", L"OVE", L"OVF", L"OVG", L"OVH", L"OVI", L"OVJ", L"OVK", L"OVL", L"OVM", L"OVN", L"OVO", L"OVP", L"OVQ", L"OVR", L"OVS", L"OVT", L"OVU", L"OVV", L"OVW", L"OVX", L"OVY", L"OVZ", L"OWA", L"OWB", L"OWC", L"OWD", L"OWE", L"OWF", L"OWG", L"OWH", L"OWI", L"OWJ", L"OWK", L"OWL", L"OWM", L"OWN", L"OWO", L"OWP", L"OWQ", L"OWR", L"OWS", L"OWT", L"OWU", L"OWV", L"OWW", L"OWX", L"OWY", L"OWZ", L"OXA", L"OXB", L"OXC", L"OXD", L"OXE", L"OXF", L"OXG", L"OXH", L"OXI", L"OXJ", L"OXK", L"OXL", L"OXM", L"OXN", L"OXO", L"OXP", L"OXQ", L"OXR", L"OXS", L"OXT", L"OXU", L"OXV", L"OXW", L"OXX", L"OXY", L"OXZ", L"OYA", L"OYB", L"OYC", L"OYD", L"OYE", L"OYF", L"OYG", L"OYH", L"OYI", L"OYJ", L"OYK", L"OYL", L"OYM", L"OYN", L"OYO", L"OYP", L"OYQ", L"OYR", L"OYS", L"OYT", L"OYU", L"OYV", L"OYW", L"OYX", L"OYY", L"OYZ", L"OZA", L"OZB", L"OZC", L"OZD", L"OZE", L"OZF", L"OZG", L"OZH", L"OZI", L"OZJ", L"OZK", L"OZL", L"OZM", L"OZN", L"OZO", L"OZP", L"OZQ", L"OZR", L"OZS", L"OZT", L"OZU", L"OZV", L"OZW", L"OZX", L"OZY", L"OZZ", L"PAA", L"PAB", L"PAC", L"PAD", L"PAE", L"PAF", L"PAG", L"PAH", L"PAI", L"PAJ", L"PAK", L"PAL", L"PAM", L"PAN", L"PAO", L"PAP", L"PAQ", L"PAR", L"PAS", L"PAT", L"PAU", L"PAV", L"PAW", L"PAX", L"PAY", L"PAZ", L"PBA", L"PBB", L"PBC", L"PBD", L"PBE", L"PBF", L"PBG", L"PBH", L"PBI", L"PBJ", L"PBK", L"PBL", L"PBM", L"PBN", L"PBO", L"PBP", L"PBQ", L"PBR", L"PBS", L"PBT", L"PBU", L"PBV", L"PBW", L"PBX", L"PBY", L"PBZ", L"PCA", L"PCB", L"PCC", L"PCD", L"PCE", L"PCF", L"PCG", L"PCH", L"PCI", L"PCJ", L"PCK", L"PCL", L"PCM", L"PCN", L"PCO", L"PCP", L"PCQ", L"PCR", L"PCS", L"PCT", L"PCU", L"PCV", L"PCW", L"PCX", L"PCY", L"PCZ", L"PDA", L"PDB", L"PDC", L"PDD", L"PDE", L"PDF", L"PDG", L"PDH", L"PDI", L"PDJ", L"PDK", L"PDL", L"PDM", L"PDN", L"PDO", L"PDP", L"PDQ", L"PDR", L"PDS", L"PDT", L"PDU", L"PDV", L"PDW", L"PDX", L"PDY", L"PDZ", L"PEA", L"PEB", L"PEC", L"PED", L"PEE", L"PEF", L"PEG", L"PEH", L"PEI", L"PEJ", L"PEK", L"PEL", L"PEM", L"PEN", L"PEO", L"PEP", L"PEQ", L"PER", L"PES", L"PET", L"PEU", L"PEV", L"PEW", L"PEX", L"PEY", L"PEZ", L"PFA", L"PFB", L"PFC", + L"MUD", L"MUE", L"MUF", L"MUG", L"MUH", L"MUI", L"MUJ", L"MUK", L"MUL", L"MUM", L"MUN", L"MUO", L"MUP", L"MUQ", L"MUR", L"MUS", L"MUT", L"MUU", L"MUV", L"MUW", L"MUX", L"MUY", L"MUZ", L"MVA", L"MVB", L"MVC", L"MVD", L"MVE", L"MVF", L"MVG", L"MVH", L"MVI", L"MVJ", L"MVK", L"MVL", L"MVM", L"MVN", L"MVO", L"MVP", L"MVQ", L"MVR", L"MVS", L"MVT", L"MVU", L"MVV", L"MVW", L"MVX", L"MVY", L"MVZ", L"MWA", L"MWB", L"MWC", L"MWD", L"MWE", L"MWF", L"MWG", L"MWH", L"MWI", L"MWJ", L"MWK", L"MWL", L"MWM", L"MWN", L"MWO", L"MWP", L"MWQ", L"MWR", L"MWS", L"MWT", L"MWU", L"MWV", L"MWW", L"MWX", L"MWY", L"MWZ", L"MXA", L"MXB", L"MXC", L"MXD", L"MXE", L"MXF", L"MXG", L"MXH", L"MXI", L"MXJ", L"MXK", L"MXL", L"MXM", L"MXN", L"MXO", L"MXP", L"MXQ", L"MXR", L"MXS", L"MXT", L"MXU", L"MXV", L"MXW", L"MXX", L"MXY", L"MXZ", L"MYA", L"MYB", L"MYC", L"MYD", L"MYE", L"MYF", L"MYG", L"MYH", L"MYI", L"MYJ", L"MYK", L"MYL", L"MYM", L"MYN", L"MYO", L"MYP", L"MYQ", L"MYR", L"MYS", L"MYT", L"MYU", L"MYV", L"MYW", L"MYX", L"MYY", L"MYZ", L"MZA", L"MZB", L"MZC", L"MZD", L"MZE", L"MZF", L"MZG", L"MZH", L"MZI", L"MZJ", L"MZK", L"MZL", L"MZM", L"MZN", L"MZO", L"MZP", L"MZQ", L"MZR", L"MZS", L"MZT", L"MZU", L"MZV", L"MZW", L"MZX", L"MZY", L"MZZ", L"NAA", L"NAB", L"NAC", L"NAD", L"NAE", L"NAF", L"NAG", L"NAH", L"NAI", L"NAJ", L"NAK", L"NAL", L"NAM", L"NAN", L"NAO", L"NAP", L"NAQ", L"NAR", L"NAS", L"NAT", L"NAU", L"NAV", L"NAW", L"NAX", L"NAY", L"NAZ", L"NBA", L"NBB", L"NBC", L"NBD", L"NBE", L"NBF", L"NBG", L"NBH", L"NBI", L"NBJ", L"NBK", L"NBL", L"NBM", L"NBN", L"NBO", L"NBP", L"NBQ", L"NBR", L"NBS", L"NBT", L"NBU", L"NBV", L"NBW", L"NBX", L"NBY", L"NBZ", L"NCA", L"NCB", L"NCC", L"NCD", L"NCE", L"NCF", L"NCG", L"NCH", L"NCI", L"NCJ", L"NCK", L"NCL", L"NCM", L"NCN", L"NCO", L"NCP", L"NCQ", L"NCR", L"NCS", L"NCT", L"NCU", L"NCV", L"NCW", L"NCX", L"NCY", L"NCZ", L"NDA", L"NDB", L"NDC", L"NDD", L"NDE", L"NDF", L"NDG", L"NDH", L"NDI", L"NDJ", L"NDK", L"NDL", L"NDM", L"NDN", L"NDO", L"NDP", L"NDQ", L"NDR", L"NDS", L"NDT", L"NDU", L"NDV", L"NDW", L"NDX", L"NDY", L"NDZ", L"NEA", L"NEB", L"NEC", L"NED", L"NEE", L"NEF", L"NEG", L"NEH", L"NEI", L"NEJ", L"NEK", L"NEL", L"NEM", L"NEN", L"NEO", L"NEP", + L"NEQ", L"NER", L"NES", L"NET", L"NEU", L"NEV", L"NEW", L"NEX", L"NEY", L"NEZ", L"NFA", L"NFB", L"NFC", L"NFD", L"NFE", L"NFF", L"NFG", L"NFH", L"NFI", L"NFJ", L"NFK", L"NFL", L"NFM", L"NFN", L"NFO", L"NFP", L"NFQ", L"NFR", L"NFS", L"NFT", L"NFU", L"NFV", L"NFW", L"NFX", L"NFY", L"NFZ", L"NGA", L"NGB", L"NGC", L"NGD", L"NGE", L"NGF", L"NGG", L"NGH", L"NGI", L"NGJ", L"NGK", L"NGL", L"NGM", L"NGN", L"NGO", L"NGP", L"NGQ", L"NGR", L"NGS", L"NGT", L"NGU", L"NGV", L"NGW", L"NGX", L"NGY", L"NGZ", L"NHA", L"NHB", L"NHC", L"NHD", L"NHE", L"NHF", L"NHG", L"NHH", L"NHI", L"NHJ", L"NHK", L"NHL", L"NHM", L"NHN", L"NHO", L"NHP", L"NHQ", L"NHR", L"NHS", L"NHT", L"NHU", L"NHV", L"NHW", L"NHX", L"NHY", L"NHZ", L"NIA", L"NIB", L"NIC", L"NID", L"NIE", L"NIF", L"NIG", L"NIH", L"NII", L"NIJ", L"NIK", L"NIL", L"NIM", L"NIN", L"NIO", L"NIP", L"NIQ", L"NIR", L"NIS", L"NIT", L"NIU", L"NIV", L"NIW", L"NIX", L"NIY", L"NIZ", L"NJA", L"NJB", L"NJC", L"NJD", L"NJE", L"NJF", L"NJG", L"NJH", L"NJI", L"NJJ", L"NJK", L"NJL", L"NJM", L"NJN", L"NJO", L"NJP", L"NJQ", L"NJR", L"NJS", L"NJT", L"NJU", L"NJV", L"NJW", L"NJX", L"NJY", L"NJZ", L"NKA", L"NKB", L"NKC", L"NKD", L"NKE", L"NKF", L"NKG", L"NKH", L"NKI", L"NKJ", L"NKK", L"NKL", L"NKM", L"NKN", L"NKO", L"NKP", L"NKQ", L"NKR", L"NKS", L"NKT", L"NKU", L"NKV", L"NKW", L"NKX", L"NKY", L"NKZ", L"NLA", L"NLB", L"NLC", L"NLD", L"NLE", L"NLF", L"NLG", L"NLH", L"NLI", L"NLJ", L"NLK", L"NLL", L"NLM", L"NLN", L"NLO", L"NLP", L"NLQ", L"NLR", L"NLS", L"NLT", L"NLU", L"NLV", L"NLW", L"NLX", L"NLY", L"NLZ", L"NMA", L"NMB", L"NMC", L"NMD", L"NME", L"NMF", L"NMG", L"NMH", L"NMI", L"NMJ", L"NMK", L"NML", L"NMM", L"NMN", L"NMO", L"NMP", L"NMQ", L"NMR", L"NMS", L"NMT", L"NMU", L"NMV", L"NMW", L"NMX", L"NMY", L"NMZ", L"NNA", L"NNB", L"NNC", L"NND", L"NNE", L"NNF", L"NNG", L"NNH", L"NNI", L"NNJ", L"NNK", L"NNL", L"NNM", L"NNN", L"NNO", L"NNP", L"NNQ", L"NNR", L"NNS", L"NNT", L"NNU", L"NNV", L"NNW", L"NNX", L"NNY", L"NNZ", L"NOA", L"NOB", L"NOC", L"NOD", L"NOE", L"NOF", L"NOG", L"NOH", L"NOI", L"NOJ", L"NOK", L"NOL", L"NOM", L"NON", L"NOO", L"NOP", L"NOQ", L"NOR", L"NOS", L"NOT", L"NOU", L"NOV", L"NOW", L"NOX", L"NOY", L"NOZ", L"NPA", L"NPB", L"NPC", + L"NPD", L"NPE", L"NPF", L"NPG", L"NPH", L"NPI", L"NPJ", L"NPK", L"NPL", L"NPM", L"NPN", L"NPO", L"NPP", L"NPQ", L"NPR", L"NPS", L"NPT", L"NPU", L"NPV", L"NPW", L"NPX", L"NPY", L"NPZ", L"NQA", L"NQB", L"NQC", L"NQD", L"NQE", L"NQF", L"NQG", L"NQH", L"NQI", L"NQJ", L"NQK", L"NQL", L"NQM", L"NQN", L"NQO", L"NQP", L"NQQ", L"NQR", L"NQS", L"NQT", L"NQU", L"NQV", L"NQW", L"NQX", L"NQY", L"NQZ", L"NRA", L"NRB", L"NRC", L"NRD", L"NRE", L"NRF", L"NRG", L"NRH", L"NRI", L"NRJ", L"NRK", L"NRL", L"NRM", L"NRN", L"NRO", L"NRP", L"NRQ", L"NRR", L"NRS", L"NRT", L"NRU", L"NRV", L"NRW", L"NRX", L"NRY", L"NRZ", L"NSA", L"NSB", L"NSC", L"NSD", L"NSE", L"NSF", L"NSG", L"NSH", L"NSI", L"NSJ", L"NSK", L"NSL", L"NSM", L"NSN", L"NSO", L"NSP", L"NSQ", L"NSR", L"NSS", L"NST", L"NSU", L"NSV", L"NSW", L"NSX", L"NSY", L"NSZ", L"NTA", L"NTB", L"NTC", L"NTD", L"NTE", L"NTF", L"NTG", L"NTH", L"NTI", L"NTJ", L"NTK", L"NTL", L"NTM", L"NTN", L"NTO", L"NTP", L"NTQ", L"NTR", L"NTS", L"NTT", L"NTU", L"NTV", L"NTW", L"NTX", L"NTY", L"NTZ", L"NUA", L"NUB", L"NUC", L"NUD", L"NUE", L"NUF", L"NUG", L"NUH", L"NUI", L"NUJ", L"NUK", L"NUL", L"NUM", L"NUN", L"NUO", L"NUP", L"NUQ", L"NUR", L"NUS", L"NUT", L"NUU", L"NUV", L"NUW", L"NUX", L"NUY", L"NUZ", L"NVA", L"NVB", L"NVC", L"NVD", L"NVE", L"NVF", L"NVG", L"NVH", L"NVI", L"NVJ", L"NVK", L"NVL", L"NVM", L"NVN", L"NVO", L"NVP", L"NVQ", L"NVR", L"NVS", L"NVT", L"NVU", L"NVV", L"NVW", L"NVX", L"NVY", L"NVZ", L"NWA", L"NWB", L"NWC", L"NWD", L"NWE", L"NWF", L"NWG", L"NWH", L"NWI", L"NWJ", L"NWK", L"NWL", L"NWM", L"NWN", L"NWO", L"NWP", L"NWQ", L"NWR", L"NWS", L"NWT", L"NWU", L"NWV", L"NWW", L"NWX", L"NWY", L"NWZ", L"NXA", L"NXB", L"NXC", L"NXD", L"NXE", L"NXF", L"NXG", L"NXH", L"NXI", L"NXJ", L"NXK", L"NXL", L"NXM", L"NXN", L"NXO", L"NXP", L"NXQ", L"NXR", L"NXS", L"NXT", L"NXU", L"NXV", L"NXW", L"NXX", L"NXY", L"NXZ", L"NYA", L"NYB", L"NYC", L"NYD", L"NYE", L"NYF", L"NYG", L"NYH", L"NYI", L"NYJ", L"NYK", L"NYL", L"NYM", L"NYN", L"NYO", L"NYP", L"NYQ", L"NYR", L"NYS", L"NYT", L"NYU", L"NYV", L"NYW", L"NYX", L"NYY", L"NYZ", L"NZA", L"NZB", L"NZC", L"NZD", L"NZE", L"NZF", L"NZG", L"NZH", L"NZI", L"NZJ", L"NZK", L"NZL", L"NZM", L"NZN", L"NZO", L"NZP", + L"NZQ", L"NZR", L"NZS", L"NZT", L"NZU", L"NZV", L"NZW", L"NZX", L"NZY", L"NZZ", L"OAA", L"OAB", L"OAC", L"OAD", L"OAE", L"OAF", L"OAG", L"OAH", L"OAI", L"OAJ", L"OAK", L"OAL", L"OAM", L"OAN", L"OAO", L"OAP", L"OAQ", L"OAR", L"OAS", L"OAT", L"OAU", L"OAV", L"OAW", L"OAX", L"OAY", L"OAZ", L"OBA", L"OBB", L"OBC", L"OBD", L"OBE", L"OBF", L"OBG", L"OBH", L"OBI", L"OBJ", L"OBK", L"OBL", L"OBM", L"OBN", L"OBO", L"OBP", L"OBQ", L"OBR", L"OBS", L"OBT", L"OBU", L"OBV", L"OBW", L"OBX", L"OBY", L"OBZ", L"OCA", L"OCB", L"OCC", L"OCD", L"OCE", L"OCF", L"OCG", L"OCH", L"OCI", L"OCJ", L"OCK", L"OCL", L"OCM", L"OCN", L"OCO", L"OCP", L"OCQ", L"OCR", L"OCS", L"OCT", L"OCU", L"OCV", L"OCW", L"OCX", L"OCY", L"OCZ", L"ODA", L"ODB", L"ODC", L"ODD", L"ODE", L"ODF", L"ODG", L"ODH", L"ODI", L"ODJ", L"ODK", L"ODL", L"ODM", L"ODN", L"ODO", L"ODP", L"ODQ", L"ODR", L"ODS", L"ODT", L"ODU", L"ODV", L"ODW", L"ODX", L"ODY", L"ODZ", L"OEA", L"OEB", L"OEC", L"OED", L"OEE", L"OEF", L"OEG", L"OEH", L"OEI", L"OEJ", L"OEK", L"OEL", L"OEM", L"OEN", L"OEO", L"OEP", L"OEQ", L"OER", L"OES", L"OET", L"OEU", L"OEV", L"OEW", L"OEX", L"OEY", L"OEZ", L"OFA", L"OFB", L"OFC", L"OFD", L"OFE", L"OFF", L"OFG", L"OFH", L"OFI", L"OFJ", L"OFK", L"OFL", L"OFM", L"OFN", L"OFO", L"OFP", L"OFQ", L"OFR", L"OFS", L"OFT", L"OFU", L"OFV", L"OFW", L"OFX", L"OFY", L"OFZ", L"OGA", L"OGB", L"OGC", L"OGD", L"OGE", L"OGF", L"OGG", L"OGH", L"OGI", L"OGJ", L"OGK", L"OGL", L"OGM", L"OGN", L"OGO", L"OGP", L"OGQ", L"OGR", L"OGS", L"OGT", L"OGU", L"OGV", L"OGW", L"OGX", L"OGY", L"OGZ", L"OHA", L"OHB", L"OHC", L"OHD", L"OHE", L"OHF", L"OHG", L"OHH", L"OHI", L"OHJ", L"OHK", L"OHL", L"OHM", L"OHN", L"OHO", L"OHP", L"OHQ", L"OHR", L"OHS", L"OHT", L"OHU", L"OHV", L"OHW", L"OHX", L"OHY", L"OHZ", L"OIA", L"OIB", L"OIC", L"OID", L"OIE", L"OIF", L"OIG", L"OIH", L"OII", L"OIJ", L"OIK", L"OIL", L"OIM", L"OIN", L"OIO", L"OIP", L"OIQ", L"OIR", L"OIS", L"OIT", L"OIU", L"OIV", L"OIW", L"OIX", L"OIY", L"OIZ", L"OJA", L"OJB", L"OJC", L"OJD", L"OJE", L"OJF", L"OJG", L"OJH", L"OJI", L"OJJ", L"OJK", L"OJL", L"OJM", L"OJN", L"OJO", L"OJP", L"OJQ", L"OJR", L"OJS", L"OJT", L"OJU", L"OJV", L"OJW", L"OJX", L"OJY", L"OJZ", L"OKA", L"OKB", L"OKC", + L"OKD", L"OKE", L"OKF", L"OKG", L"OKH", L"OKI", L"OKJ", L"OKK", L"OKL", L"OKM", L"OKN", L"OKO", L"OKP", L"OKQ", L"OKR", L"OKS", L"OKT", L"OKU", L"OKV", L"OKW", L"OKX", L"OKY", L"OKZ", L"OLA", L"OLB", L"OLC", L"OLD", L"OLE", L"OLF", L"OLG", L"OLH", L"OLI", L"OLJ", L"OLK", L"OLL", L"OLM", L"OLN", L"OLO", L"OLP", L"OLQ", L"OLR", L"OLS", L"OLT", L"OLU", L"OLV", L"OLW", L"OLX", L"OLY", L"OLZ", L"OMA", L"OMB", L"OMC", L"OMD", L"OME", L"OMF", L"OMG", L"OMH", L"OMI", L"OMJ", L"OMK", L"OML", L"OMM", L"OMN", L"OMO", L"OMP", L"OMQ", L"OMR", L"OMS", L"OMT", L"OMU", L"OMV", L"OMW", L"OMX", L"OMY", L"OMZ", L"ONA", L"ONB", L"ONC", L"OND", L"ONE", L"ONF", L"ONG", L"ONH", L"ONI", L"ONJ", L"ONK", L"ONL", L"ONM", L"ONN", L"ONO", L"ONP", L"ONQ", L"ONR", L"ONS", L"ONT", L"ONU", L"ONV", L"ONW", L"ONX", L"ONY", L"ONZ", L"OOA", L"OOB", L"OOC", L"OOD", L"OOE", L"OOF", L"OOG", L"OOH", L"OOI", L"OOJ", L"OOK", L"OOL", L"OOM", L"OON", L"OOO", L"OOP", L"OOQ", L"OOR", L"OOS", L"OOT", L"OOU", L"OOV", L"OOW", L"OOX", L"OOY", L"OOZ", L"OPA", L"OPB", L"OPC", L"OPD", L"OPE", L"OPF", L"OPG", L"OPH", L"OPI", L"OPJ", L"OPK", L"OPL", L"OPM", L"OPN", L"OPO", L"OPP", L"OPQ", L"OPR", L"OPS", L"OPT", L"OPU", L"OPV", L"OPW", L"OPX", L"OPY", L"OPZ", L"OQA", L"OQB", L"OQC", L"OQD", L"OQE", L"OQF", L"OQG", L"OQH", L"OQI", L"OQJ", L"OQK", L"OQL", L"OQM", L"OQN", L"OQO", L"OQP", L"OQQ", L"OQR", L"OQS", L"OQT", L"OQU", L"OQV", L"OQW", L"OQX", L"OQY", L"OQZ", L"ORA", L"ORB", L"ORC", L"ORD", L"ORE", L"ORF", L"ORG", L"ORH", L"ORI", L"ORJ", L"ORK", L"ORL", L"ORM", L"ORN", L"ORO", L"ORP", L"ORQ", L"ORR", L"ORS", L"ORT", L"ORU", L"ORV", L"ORW", L"ORX", L"ORY", L"ORZ", L"OSA", L"OSB", L"OSC", L"OSD", L"OSE", L"OSF", L"OSG", L"OSH", L"OSI", L"OSJ", L"OSK", L"OSL", L"OSM", L"OSN", L"OSO", L"OSP", L"OSQ", L"OSR", L"OSS", L"OST", L"OSU", L"OSV", L"OSW", L"OSX", L"OSY", L"OSZ", L"OTA", L"OTB", L"OTC", L"OTD", L"OTE", L"OTF", L"OTG", L"OTH", L"OTI", L"OTJ", L"OTK", L"OTL", L"OTM", L"OTN", L"OTO", L"OTP", L"OTQ", L"OTR", L"OTS", L"OTT", L"OTU", L"OTV", L"OTW", L"OTX", L"OTY", L"OTZ", L"OUA", L"OUB", L"OUC", L"OUD", L"OUE", L"OUF", L"OUG", L"OUH", L"OUI", L"OUJ", L"OUK", L"OUL", L"OUM", L"OUN", L"OUO", L"OUP", + L"OUQ", L"OUR", L"OUS", L"OUT", L"OUU", L"OUV", L"OUW", L"OUX", L"OUY", L"OUZ", L"OVA", L"OVB", L"OVC", L"OVD", L"OVE", L"OVF", L"OVG", L"OVH", L"OVI", L"OVJ", L"OVK", L"OVL", L"OVM", L"OVN", L"OVO", L"OVP", L"OVQ", L"OVR", L"OVS", L"OVT", L"OVU", L"OVV", L"OVW", L"OVX", L"OVY", L"OVZ", L"OWA", L"OWB", L"OWC", L"OWD", L"OWE", L"OWF", L"OWG", L"OWH", L"OWI", L"OWJ", L"OWK", L"OWL", L"OWM", L"OWN", L"OWO", L"OWP", L"OWQ", L"OWR", L"OWS", L"OWT", L"OWU", L"OWV", L"OWW", L"OWX", L"OWY", L"OWZ", L"OXA", L"OXB", L"OXC", L"OXD", L"OXE", L"OXF", L"OXG", L"OXH", L"OXI", L"OXJ", L"OXK", L"OXL", L"OXM", L"OXN", L"OXO", L"OXP", L"OXQ", L"OXR", L"OXS", L"OXT", L"OXU", L"OXV", L"OXW", L"OXX", L"OXY", L"OXZ", L"OYA", L"OYB", L"OYC", L"OYD", L"OYE", L"OYF", L"OYG", L"OYH", L"OYI", L"OYJ", L"OYK", L"OYL", L"OYM", L"OYN", L"OYO", L"OYP", L"OYQ", L"OYR", L"OYS", L"OYT", L"OYU", L"OYV", L"OYW", L"OYX", L"OYY", L"OYZ", L"OZA", L"OZB", L"OZC", L"OZD", L"OZE", L"OZF", L"OZG", L"OZH", L"OZI", L"OZJ", L"OZK", L"OZL", L"OZM", L"OZN", L"OZO", L"OZP", L"OZQ", L"OZR", L"OZS", L"OZT", L"OZU", L"OZV", L"OZW", L"OZX", L"OZY", L"OZZ", L"PAA", L"PAB", L"PAC", L"PAD", L"PAE", L"PAF", L"PAG", L"PAH", L"PAI", L"PAJ", L"PAK", L"PAL", L"PAM", L"PAN", L"PAO", L"PAP", L"PAQ", L"PAR", L"PAS", L"PAT", L"PAU", L"PAV", L"PAW", L"PAX", L"PAY", L"PAZ", L"PBA", L"PBB", L"PBC", L"PBD", L"PBE", L"PBF", L"PBG", L"PBH", L"PBI", L"PBJ", L"PBK", L"PBL", L"PBM", L"PBN", L"PBO", L"PBP", L"PBQ", L"PBR", L"PBS", L"PBT", L"PBU", L"PBV", L"PBW", L"PBX", L"PBY", L"PBZ", L"PCA", L"PCB", L"PCC", L"PCD", L"PCE", L"PCF", L"PCG", L"PCH", L"PCI", L"PCJ", L"PCK", L"PCL", L"PCM", L"PCN", L"PCO", L"PCP", L"PCQ", L"PCR", L"PCS", L"PCT", L"PCU", L"PCV", L"PCW", L"PCX", L"PCY", L"PCZ", L"PDA", L"PDB", L"PDC", L"PDD", L"PDE", L"PDF", L"PDG", L"PDH", L"PDI", L"PDJ", L"PDK", L"PDL", L"PDM", L"PDN", L"PDO", L"PDP", L"PDQ", L"PDR", L"PDS", L"PDT", L"PDU", L"PDV", L"PDW", L"PDX", L"PDY", L"PDZ", L"PEA", L"PEB", L"PEC", L"PED", L"PEE", L"PEF", L"PEG", L"PEH", L"PEI", L"PEJ", L"PEK", L"PEL", L"PEM", L"PEN", L"PEO", L"PEP", L"PEQ", L"PER", L"PES", L"PET", L"PEU", L"PEV", L"PEW", L"PEX", L"PEY", L"PEZ", L"PFA", L"PFB", L"PFC", L"PFD", L"PFE", L"PFF", L"PFG", L"PFH", L"PFI", L"PFJ", L"PFK", L"PFL", L"PFM", L"PFN", L"PFO", L"PFP", L"PFQ", L"PFR", L"PFS", L"PFT", L"PFU", L"PFV", L"PFW", L"PFX", L"PFY", L"PFZ", L"PGA", L"PGB", L"PGC", L"PGD", L"PGE", L"PGF", L"PGG", L"PGH", L"PGI", L"PGJ", L"PGK", L"PGL", L"PGM", L"PGN", L"PGO", L"PGP", L"PGQ", L"PGR", L"PGS", L"PGT", L"PGU", L"PGV", L"PGW", L"PGX", L"PGY", L"PGZ", L"PHA", L"PHB", L"PHC", L"PHD", L"PHE", L"PHF", L"PHG", L"PHH", L"PHI", L"PHJ", L"PHK", L"PHL", L"PHM", L"PHN", L"PHO", L"PHP", L"PHQ", L"PHR", L"PHS", L"PHT", L"PHU", L"PHV", L"PHW", L"PHX", L"PHY", L"PHZ", L"PIA", L"PIB", L"PIC", L"PID", L"PIE", L"PIF", L"PIG", L"PIH", L"PII", L"PIJ", L"PIK", L"PIL", L"PIM", L"PIN", L"PIO", L"PIP", L"PIQ", L"PIR", L"PIS", L"PIT", L"PIU", L"PIV", L"PIW", L"PIX", L"PIY", L"PIZ", L"PJA", L"PJB", L"PJC", L"PJD", L"PJE", L"PJF", L"PJG", L"PJH", L"PJI", L"PJJ", L"PJK", L"PJL", L"PJM", L"PJN", L"PJO", L"PJP", L"PJQ", L"PJR", L"PJS", L"PJT", L"PJU", L"PJV", L"PJW", L"PJX", L"PJY", L"PJZ", L"PKA", L"PKB", L"PKC", L"PKD", L"PKE", L"PKF", L"PKG", L"PKH", L"PKI", L"PKJ", L"PKK", L"PKL", L"PKM", L"PKN", L"PKO", L"PKP", L"PKQ", L"PKR", L"PKS", L"PKT", L"PKU", L"PKV", L"PKW", L"PKX", L"PKY", L"PKZ", L"PLA", L"PLB", L"PLC", L"PLD", L"PLE", L"PLF", L"PLG", L"PLH", L"PLI", L"PLJ", L"PLK", L"PLL", L"PLM", L"PLN", L"PLO", L"PLP", L"PLQ", L"PLR", L"PLS", L"PLT", L"PLU", L"PLV", L"PLW", L"PLX", L"PLY", L"PLZ", L"PMA", L"PMB", L"PMC", L"PMD", L"PME", L"PMF", L"PMG", L"PMH", L"PMI", L"PMJ", L"PMK", L"PML", L"PMM", L"PMN", L"PMO", L"PMP", L"PMQ", L"PMR", L"PMS", L"PMT", L"PMU", L"PMV", L"PMW", L"PMX", L"PMY", L"PMZ", L"PNA", L"PNB", L"PNC", L"PND", L"PNE", L"PNF", L"PNG", L"PNH", L"PNI", L"PNJ", L"PNK", L"PNL", L"PNM", L"PNN", L"PNO", L"PNP", L"PNQ", L"PNR", L"PNS", L"PNT", L"PNU", L"PNV", L"PNW", L"PNX", L"PNY", L"PNZ", L"POA", L"POB", L"POC", L"POD", L"POE", L"POF", L"POG", L"POH", L"POI", L"POJ", L"POK", L"POL", L"POM", L"PON", L"POO", L"POP", L"POQ", L"POR", L"POS", L"POT", L"POU", L"POV", L"POW", L"POX", L"POY", L"POZ", L"PPA", L"PPB", L"PPC", L"PPD", L"PPE", L"PPF", L"PPG", L"PPH", - L"PPI", L"PPJ", L"PPK", L"PPL", L"PPM", L"PPN", L"PPO", L"PPP", L"PPQ", L"PPR", L"PPS", L"PPT", L"PPU", L"PPV", L"PPW", L"PPX", L"PPY", L"PPZ", L"PQA", L"PQB", L"PQC", L"PQD", L"PQE", L"PQF", L"PQG", L"PQH", L"PQI", L"PQJ", L"PQK", L"PQL", L"PQM", L"PQN", L"PQO", L"PQP", L"PQQ", L"PQR", L"PQS", L"PQT", L"PQU", L"PQV", L"PQW", L"PQX", L"PQY", L"PQZ", L"PRA", L"PRB", L"PRC", L"PRD", L"PRE", L"PRF", L"PRG", L"PRH", L"PRI", L"PRJ", L"PRK", L"PRL", L"PRM", L"PRN", L"PRO", L"PRP", L"PRQ", L"PRR", L"PRS", L"PRT", L"PRU", L"PRV", L"PRW", L"PRX", L"PRY", L"PRZ", L"PSA", L"PSB", L"PSC", L"PSD", L"PSE", L"PSF", L"PSG", L"PSH", L"PSI", L"PSJ", L"PSK", L"PSL", L"PSM", L"PSN", L"PSO", L"PSP", L"PSQ", L"PSR", L"PSS", L"PST", L"PSU", L"PSV", L"PSW", L"PSX", L"PSY", L"PSZ", L"PTA", L"PTB", L"PTC", L"PTD", L"PTE", L"PTF", L"PTG", L"PTH", L"PTI", L"PTJ", L"PTK", L"PTL", L"PTM", L"PTN", L"PTO", L"PTP", L"PTQ", L"PTR", L"PTS", L"PTT", L"PTU", L"PTV", L"PTW", L"PTX", L"PTY", L"PTZ", L"PUA", L"PUB", L"PUC", L"PUD", L"PUE", L"PUF", L"PUG", L"PUH", L"PUI", L"PUJ", L"PUK", L"PUL", L"PUM", L"PUN", L"PUO", L"PUP", L"PUQ", L"PUR", L"PUS", L"PUT", L"PUU", L"PUV", L"PUW", L"PUX", L"PUY", L"PUZ", L"PVA", L"PVB", L"PVC", L"PVD", L"PVE", L"PVF", L"PVG", L"PVH", L"PVI", L"PVJ", L"PVK", L"PVL", L"PVM", L"PVN", L"PVO", L"PVP", L"PVQ", L"PVR", L"PVS", L"PVT", L"PVU", L"PVV", L"PVW", L"PVX", L"PVY", L"PVZ", L"PWA", L"PWB", L"PWC", L"PWD", L"PWE", L"PWF", L"PWG", L"PWH", L"PWI", L"PWJ", L"PWK", L"PWL", L"PWM", L"PWN", L"PWO", L"PWP", L"PWQ", L"PWR", L"PWS", L"PWT", L"PWU", L"PWV", L"PWW", L"PWX", L"PWY", L"PWZ", L"PXA", L"PXB", L"PXC", L"PXD", L"PXE", L"PXF", L"PXG", L"PXH", L"PXI", L"PXJ", L"PXK", L"PXL", L"PXM", L"PXN", L"PXO", L"PXP", L"PXQ", L"PXR", L"PXS", L"PXT", L"PXU", L"PXV", L"PXW", L"PXX", L"PXY", L"PXZ", L"PYA", L"PYB", L"PYC", L"PYD", L"PYE", L"PYF", L"PYG", L"PYH", L"PYI", L"PYJ", L"PYK", L"PYL", L"PYM", L"PYN", L"PYO", L"PYP", L"PYQ", L"PYR", L"PYS", L"PYT", L"PYU", L"PYV", L"PYW", L"PYX", L"PYY", L"PYZ", L"PZA", L"PZB", L"PZC", L"PZD", L"PZE", L"PZF", L"PZG", L"PZH", L"PZI", L"PZJ", L"PZK", L"PZL", L"PZM", L"PZN", L"PZO", L"PZP", L"PZQ", L"PZR", L"PZS", L"PZT", L"PZU", + L"PPI", L"PPJ", L"PPK", L"PPL", L"PPM", L"PPN", L"PPO", L"PPP", L"PPQ", L"PPR", L"PPS", L"PPT", L"PPU", L"PPV", L"PPW", L"PPX", L"PPY", L"PPZ", L"PQA", L"PQB", L"PQC", L"PQD", L"PQE", L"PQF", L"PQG", L"PQH", L"PQI", L"PQJ", L"PQK", L"PQL", L"PQM", L"PQN", L"PQO", L"PQP", L"PQQ", L"PQR", L"PQS", L"PQT", L"PQU", L"PQV", L"PQW", L"PQX", L"PQY", L"PQZ", L"PRA", L"PRB", L"PRC", L"PRD", L"PRE", L"PRF", L"PRG", L"PRH", L"PRI", L"PRJ", L"PRK", L"PRL", L"PRM", L"PRN", L"PRO", L"PRP", L"PRQ", L"PRR", L"PRS", L"PRT", L"PRU", L"PRV", L"PRW", L"PRX", L"PRY", L"PRZ", L"PSA", L"PSB", L"PSC", L"PSD", L"PSE", L"PSF", L"PSG", L"PSH", L"PSI", L"PSJ", L"PSK", L"PSL", L"PSM", L"PSN", L"PSO", L"PSP", L"PSQ", L"PSR", L"PSS", L"PST", L"PSU", L"PSV", L"PSW", L"PSX", L"PSY", L"PSZ", L"PTA", L"PTB", L"PTC", L"PTD", L"PTE", L"PTF", L"PTG", L"PTH", L"PTI", L"PTJ", L"PTK", L"PTL", L"PTM", L"PTN", L"PTO", L"PTP", L"PTQ", L"PTR", L"PTS", L"PTT", L"PTU", L"PTV", L"PTW", L"PTX", L"PTY", L"PTZ", L"PUA", L"PUB", L"PUC", L"PUD", L"PUE", L"PUF", L"PUG", L"PUH", L"PUI", L"PUJ", L"PUK", L"PUL", L"PUM", L"PUN", L"PUO", L"PUP", L"PUQ", L"PUR", L"PUS", L"PUT", L"PUU", L"PUV", L"PUW", L"PUX", L"PUY", L"PUZ", L"PVA", L"PVB", L"PVC", L"PVD", L"PVE", L"PVF", L"PVG", L"PVH", L"PVI", L"PVJ", L"PVK", L"PVL", L"PVM", L"PVN", L"PVO", L"PVP", L"PVQ", L"PVR", L"PVS", L"PVT", L"PVU", L"PVV", L"PVW", L"PVX", L"PVY", L"PVZ", L"PWA", L"PWB", L"PWC", L"PWD", L"PWE", L"PWF", L"PWG", L"PWH", L"PWI", L"PWJ", L"PWK", L"PWL", L"PWM", L"PWN", L"PWO", L"PWP", L"PWQ", L"PWR", L"PWS", L"PWT", L"PWU", L"PWV", L"PWW", L"PWX", L"PWY", L"PWZ", L"PXA", L"PXB", L"PXC", L"PXD", L"PXE", L"PXF", L"PXG", L"PXH", L"PXI", L"PXJ", L"PXK", L"PXL", L"PXM", L"PXN", L"PXO", L"PXP", L"PXQ", L"PXR", L"PXS", L"PXT", L"PXU", L"PXV", L"PXW", L"PXX", L"PXY", L"PXZ", L"PYA", L"PYB", L"PYC", L"PYD", L"PYE", L"PYF", L"PYG", L"PYH", L"PYI", L"PYJ", L"PYK", L"PYL", L"PYM", L"PYN", L"PYO", L"PYP", L"PYQ", L"PYR", L"PYS", L"PYT", L"PYU", L"PYV", L"PYW", L"PYX", L"PYY", L"PYZ", L"PZA", L"PZB", L"PZC", L"PZD", L"PZE", L"PZF", L"PZG", L"PZH", L"PZI", L"PZJ", L"PZK", L"PZL", L"PZM", L"PZN", L"PZO", L"PZP", L"PZQ", L"PZR", L"PZS", L"PZT", L"PZU", L"PZV", L"PZW", L"PZX", L"PZY", L"PZZ", L"QAA", L"QAB", L"QAC", L"QAD", L"QAE", L"QAF", L"QAG", L"QAH", L"QAI", L"QAJ", L"QAK", L"QAL", L"QAM", L"QAN", L"QAO", L"QAP", L"QAQ", L"QAR", L"QAS", L"QAT", L"QAU", L"QAV", L"QAW", L"QAX", L"QAY", L"QAZ", L"QBA", L"QBB", L"QBC", L"QBD", L"QBE", L"QBF", L"QBG", L"QBH", L"QBI", L"QBJ", L"QBK", L"QBL", L"QBM", L"QBN", L"QBO", L"QBP", L"QBQ", L"QBR", L"QBS", L"QBT", L"QBU", L"QBV", L"QBW", L"QBX", L"QBY", L"QBZ", L"QCA", L"QCB", L"QCC", L"QCD", L"QCE", L"QCF", L"QCG", L"QCH", L"QCI", L"QCJ", L"QCK", L"QCL", L"QCM", L"QCN", L"QCO", L"QCP", L"QCQ", L"QCR", L"QCS", L"QCT", L"QCU", L"QCV", L"QCW", L"QCX", L"QCY", L"QCZ", L"QDA", L"QDB", L"QDC", L"QDD", L"QDE", L"QDF", L"QDG", L"QDH", L"QDI", L"QDJ", L"QDK", L"QDL", L"QDM", L"QDN", L"QDO", L"QDP", L"QDQ", L"QDR", L"QDS", L"QDT", L"QDU", L"QDV", L"QDW", L"QDX", L"QDY", L"QDZ", L"QEA", L"QEB", L"QEC", L"QED", L"QEE", L"QEF", L"QEG", L"QEH", L"QEI", L"QEJ", L"QEK", L"QEL", L"QEM", L"QEN", L"QEO", L"QEP", L"QEQ", L"QER", L"QES", L"QET", L"QEU", L"QEV", L"QEW", L"QEX", L"QEY", L"QEZ", L"QFA", L"QFB", L"QFC", L"QFD", L"QFE", L"QFF", L"QFG", L"QFH", L"QFI", L"QFJ", L"QFK", L"QFL", L"QFM", L"QFN", L"QFO", L"QFP", L"QFQ", L"QFR", L"QFS", L"QFT", L"QFU", L"QFV", L"QFW", L"QFX", L"QFY", L"QFZ", L"QGA", L"QGB", L"QGC", L"QGD", L"QGE", L"QGF", L"QGG", L"QGH", L"QGI", L"QGJ", L"QGK", L"QGL", L"QGM", L"QGN", L"QGO", L"QGP", L"QGQ", L"QGR", L"QGS", L"QGT", L"QGU", L"QGV", L"QGW", L"QGX", L"QGY", L"QGZ", L"QHA", L"QHB", L"QHC", L"QHD", L"QHE", L"QHF", L"QHG", L"QHH", L"QHI", L"QHJ", L"QHK", L"QHL", L"QHM", L"QHN", L"QHO", L"QHP", L"QHQ", L"QHR", L"QHS", L"QHT", L"QHU", L"QHV", L"QHW", L"QHX", L"QHY", L"QHZ", L"QIA", L"QIB", L"QIC", L"QID", L"QIE", L"QIF", L"QIG", L"QIH", L"QII", L"QIJ", L"QIK", L"QIL", L"QIM", L"QIN", L"QIO", L"QIP", L"QIQ", L"QIR", L"QIS", L"QIT", L"QIU", L"QIV", L"QIW", L"QIX", L"QIY", L"QIZ", L"QJA", L"QJB", L"QJC", L"QJD", L"QJE", L"QJF", L"QJG", L"QJH", L"QJI", L"QJJ", L"QJK", L"QJL", L"QJM", L"QJN", L"QJO", L"QJP", L"QJQ", L"QJR", L"QJS", L"QJT", L"QJU", L"QJV", L"QJW", L"QJX", L"QJY", L"QJZ", L"QKA", L"QKB", L"QKC", L"QKD", L"QKE", L"QKF", L"QKG", L"QKH", - L"QKI", L"QKJ", L"QKK", L"QKL", L"QKM", L"QKN", L"QKO", L"QKP", L"QKQ", L"QKR", L"QKS", L"QKT", L"QKU", L"QKV", L"QKW", L"QKX", L"QKY", L"QKZ", L"QLA", L"QLB", L"QLC", L"QLD", L"QLE", L"QLF", L"QLG", L"QLH", L"QLI", L"QLJ", L"QLK", L"QLL", L"QLM", L"QLN", L"QLO", L"QLP", L"QLQ", L"QLR", L"QLS", L"QLT", L"QLU", L"QLV", L"QLW", L"QLX", L"QLY", L"QLZ", L"QMA", L"QMB", L"QMC", L"QMD", L"QME", L"QMF", L"QMG", L"QMH", L"QMI", L"QMJ", L"QMK", L"QML", L"QMM", L"QMN", L"QMO", L"QMP", L"QMQ", L"QMR", L"QMS", L"QMT", L"QMU", L"QMV", L"QMW", L"QMX", L"QMY", L"QMZ", L"QNA", L"QNB", L"QNC", L"QND", L"QNE", L"QNF", L"QNG", L"QNH", L"QNI", L"QNJ", L"QNK", L"QNL", L"QNM", L"QNN", L"QNO", L"QNP", L"QNQ", L"QNR", L"QNS", L"QNT", L"QNU", L"QNV", L"QNW", L"QNX", L"QNY", L"QNZ", L"QOA", L"QOB", L"QOC", L"QOD", L"QOE", L"QOF", L"QOG", L"QOH", L"QOI", L"QOJ", L"QOK", L"QOL", L"QOM", L"QON", L"QOO", L"QOP", L"QOQ", L"QOR", L"QOS", L"QOT", L"QOU", L"QOV", L"QOW", L"QOX", L"QOY", L"QOZ", L"QPA", L"QPB", L"QPC", L"QPD", L"QPE", L"QPF", L"QPG", L"QPH", L"QPI", L"QPJ", L"QPK", L"QPL", L"QPM", L"QPN", L"QPO", L"QPP", L"QPQ", L"QPR", L"QPS", L"QPT", L"QPU", L"QPV", L"QPW", L"QPX", L"QPY", L"QPZ", L"QQA", L"QQB", L"QQC", L"QQD", L"QQE", L"QQF", L"QQG", L"QQH", L"QQI", L"QQJ", L"QQK", L"QQL", L"QQM", L"QQN", L"QQO", L"QQP", L"QQQ", L"QQR", L"QQS", L"QQT", L"QQU", L"QQV", L"QQW", L"QQX", L"QQY", L"QQZ", L"QRA", L"QRB", L"QRC", L"QRD", L"QRE", L"QRF", L"QRG", L"QRH", L"QRI", L"QRJ", L"QRK", L"QRL", L"QRM", L"QRN", L"QRO", L"QRP", L"QRQ", L"QRR", L"QRS", L"QRT", L"QRU", L"QRV", L"QRW", L"QRX", L"QRY", L"QRZ", L"QSA", L"QSB", L"QSC", L"QSD", L"QSE", L"QSF", L"QSG", L"QSH", L"QSI", L"QSJ", L"QSK", L"QSL", L"QSM", L"QSN", L"QSO", L"QSP", L"QSQ", L"QSR", L"QSS", L"QST", L"QSU", L"QSV", L"QSW", L"QSX", L"QSY", L"QSZ", L"QTA", L"QTB", L"QTC", L"QTD", L"QTE", L"QTF", L"QTG", L"QTH", L"QTI", L"QTJ", L"QTK", L"QTL", L"QTM", L"QTN", L"QTO", L"QTP", L"QTQ", L"QTR", L"QTS", L"QTT", L"QTU", L"QTV", L"QTW", L"QTX", L"QTY", L"QTZ", L"QUA", L"QUB", L"QUC", L"QUD", L"QUE", L"QUF", L"QUG", L"QUH", L"QUI", L"QUJ", L"QUK", L"QUL", L"QUM", L"QUN", L"QUO", L"QUP", L"QUQ", L"QUR", L"QUS", L"QUT", L"QUU", - L"QUV", L"QUW", L"QUX", L"QUY", L"QUZ", L"QVA", L"QVB", L"QVC", L"QVD", L"QVE", L"QVF", L"QVG", L"QVH", L"QVI", L"QVJ", L"QVK", L"QVL", L"QVM", L"QVN", L"QVO", L"QVP", L"QVQ", L"QVR", L"QVS", L"QVT", L"QVU", L"QVV", L"QVW", L"QVX", L"QVY", L"QVZ", L"QWA", L"QWB", L"QWC", L"QWD", L"QWE", L"QWF", L"QWG", L"QWH", L"QWI", L"QWJ", L"QWK", L"QWL", L"QWM", L"QWN", L"QWO", L"QWP", L"QWQ", L"QWR", L"QWS", L"QWT", L"QWU", L"QWV", L"QWW", L"QWX", L"QWY", L"QWZ", L"QXA", L"QXB", L"QXC", L"QXD", L"QXE", L"QXF", L"QXG", L"QXH", L"QXI", L"QXJ", L"QXK", L"QXL", L"QXM", L"QXN", L"QXO", L"QXP", L"QXQ", L"QXR", L"QXS", L"QXT", L"QXU", L"QXV", L"QXW", L"QXX", L"QXY", L"QXZ", L"QYA", L"QYB", L"QYC", L"QYD", L"QYE", L"QYF", L"QYG", L"QYH", L"QYI", L"QYJ", L"QYK", L"QYL", L"QYM", L"QYN", L"QYO", L"QYP", L"QYQ", L"QYR", L"QYS", L"QYT", L"QYU", L"QYV", L"QYW", L"QYX", L"QYY", L"QYZ", L"QZA", L"QZB", L"QZC", L"QZD", L"QZE", L"QZF", L"QZG", L"QZH", L"QZI", L"QZJ", L"QZK", L"QZL", L"QZM", L"QZN", L"QZO", L"QZP", L"QZQ", L"QZR", L"QZS", L"QZT", L"QZU", L"QZV", L"QZW", L"QZX", L"QZY", L"QZZ", L"RAA", L"RAB", L"RAC", L"RAD", L"RAE", L"RAF", L"RAG", L"RAH", L"RAI", L"RAJ", L"RAK", L"RAL", L"RAM", L"RAN", L"RAO", L"RAP", L"RAQ", L"RAR", L"RAS", L"RAT", L"RAU", L"RAV", L"RAW", L"RAX", L"RAY", L"RAZ", L"RBA", L"RBB", L"RBC", L"RBD", L"RBE", L"RBF", L"RBG", L"RBH", L"RBI", L"RBJ", L"RBK", L"RBL", L"RBM", L"RBN", L"RBO", L"RBP", L"RBQ", L"RBR", L"RBS", L"RBT", L"RBU", L"RBV", L"RBW", L"RBX", L"RBY", L"RBZ", L"RCA", L"RCB", L"RCC", L"RCD", L"RCE", L"RCF", L"RCG", L"RCH", L"RCI", L"RCJ", L"RCK", L"RCL", L"RCM", L"RCN", L"RCO", L"RCP", L"RCQ", L"RCR", L"RCS", L"RCT", L"RCU", L"RCV", L"RCW", L"RCX", L"RCY", L"RCZ", L"RDA", L"RDB", L"RDC", L"RDD", L"RDE", L"RDF", L"RDG", L"RDH", L"RDI", L"RDJ", L"RDK", L"RDL", L"RDM", L"RDN", L"RDO", L"RDP", L"RDQ", L"RDR", L"RDS", L"RDT", L"RDU", L"RDV", L"RDW", L"RDX", L"RDY", L"RDZ", L"REA", L"REB", L"REC", L"RED", L"REE", L"REF", L"REG", L"REH", L"REI", L"REJ", L"REK", L"REL", L"REM", L"REN", L"REO", L"REP", L"REQ", L"RER", L"RES", L"RET", L"REU", L"REV", L"REW", L"REX", L"REY", L"REZ", L"RFA", L"RFB", L"RFC", L"RFD", L"RFE", L"RFF", L"RFG", L"RFH", - L"RFI", L"RFJ", L"RFK", L"RFL", L"RFM", L"RFN", L"RFO", L"RFP", L"RFQ", L"RFR", L"RFS", L"RFT", L"RFU", L"RFV", L"RFW", L"RFX", L"RFY", L"RFZ", L"RGA", L"RGB", L"RGC", L"RGD", L"RGE", L"RGF", L"RGG", L"RGH", L"RGI", L"RGJ", L"RGK", L"RGL", L"RGM", L"RGN", L"RGO", L"RGP", L"RGQ", L"RGR", L"RGS", L"RGT", L"RGU", L"RGV", L"RGW", L"RGX", L"RGY", L"RGZ", L"RHA", L"RHB", L"RHC", L"RHD", L"RHE", L"RHF", L"RHG", L"RHH", L"RHI", L"RHJ", L"RHK", L"RHL", L"RHM", L"RHN", L"RHO", L"RHP", L"RHQ", L"RHR", L"RHS", L"RHT", L"RHU", L"RHV", L"RHW", L"RHX", L"RHY", L"RHZ", L"RIA", L"RIB", L"RIC", L"RID", L"RIE", L"RIF", L"RIG", L"RIH", L"RII", L"RIJ", L"RIK", L"RIL", L"RIM", L"RIN", L"RIO", L"RIP", L"RIQ", L"RIR", L"RIS", L"RIT", L"RIU", L"RIV", L"RIW", L"RIX", L"RIY", L"RIZ", L"RJA", L"RJB", L"RJC", L"RJD", L"RJE", L"RJF", L"RJG", L"RJH", L"RJI", L"RJJ", L"RJK", L"RJL", L"RJM", L"RJN", L"RJO", L"RJP", L"RJQ", L"RJR", L"RJS", L"RJT", L"RJU", L"RJV", L"RJW", L"RJX", L"RJY", L"RJZ", L"RKA", L"RKB", L"RKC", L"RKD", L"RKE", L"RKF", L"RKG", L"RKH", L"RKI", L"RKJ", L"RKK", L"RKL", L"RKM", L"RKN", L"RKO", L"RKP", L"RKQ", L"RKR", L"RKS", L"RKT", L"RKU", L"RKV", L"RKW", L"RKX", L"RKY", L"RKZ", L"RLA", L"RLB", L"RLC", L"RLD", L"RLE", L"RLF", L"RLG", L"RLH", L"RLI", L"RLJ", L"RLK", L"RLL", L"RLM", L"RLN", L"RLO", L"RLP", L"RLQ", L"RLR", L"RLS", L"RLT", L"RLU", L"RLV", L"RLW", L"RLX", L"RLY", L"RLZ", L"RMA", L"RMB", L"RMC", L"RMD", L"RME", L"RMF", L"RMG", L"RMH", L"RMI", L"RMJ", L"RMK", L"RML", L"RMM", L"RMN", L"RMO", L"RMP", L"RMQ", L"RMR", L"RMS", L"RMT", L"RMU", L"RMV", L"RMW", L"RMX", L"RMY", L"RMZ", L"RNA", L"RNB", L"RNC", L"RND", L"RNE", L"RNF", L"RNG", L"RNH", L"RNI", L"RNJ", L"RNK", L"RNL", L"RNM", L"RNN", L"RNO", L"RNP", L"RNQ", L"RNR", L"RNS", L"RNT", L"RNU", L"RNV", L"RNW", L"RNX", L"RNY", L"RNZ", L"ROA", L"ROB", L"ROC", L"ROD", L"ROE", L"ROF", L"ROG", L"ROH", L"ROI", L"ROJ", L"ROK", L"ROL", L"ROM", L"RON", L"ROO", L"ROP", L"ROQ", L"ROR", L"ROS", L"ROT", L"ROU", L"ROV", L"ROW", L"ROX", L"ROY", L"ROZ", L"RPA", L"RPB", L"RPC", L"RPD", L"RPE", L"RPF", L"RPG", L"RPH", L"RPI", L"RPJ", L"RPK", L"RPL", L"RPM", L"RPN", L"RPO", L"RPP", L"RPQ", L"RPR", L"RPS", L"RPT", L"RPU", - L"RPV", L"RPW", L"RPX", L"RPY", L"RPZ", L"RQA", L"RQB", L"RQC", L"RQD", L"RQE", L"RQF", L"RQG", L"RQH", L"RQI", L"RQJ", L"RQK", L"RQL", L"RQM", L"RQN", L"RQO", L"RQP", L"RQQ", L"RQR", L"RQS", L"RQT", L"RQU", L"RQV", L"RQW", L"RQX", L"RQY", L"RQZ", L"RRA", L"RRB", L"RRC", L"RRD", L"RRE", L"RRF", L"RRG", L"RRH", L"RRI", L"RRJ", L"RRK", L"RRL", L"RRM", L"RRN", L"RRO", L"RRP", L"RRQ", L"RRR", L"RRS", L"RRT", L"RRU", L"RRV", L"RRW", L"RRX", L"RRY", L"RRZ", L"RSA", L"RSB", L"RSC", L"RSD", L"RSE", L"RSF", L"RSG", L"RSH", L"RSI", L"RSJ", L"RSK", L"RSL", L"RSM", L"RSN", L"RSO", L"RSP", L"RSQ", L"RSR", L"RSS", L"RST", L"RSU", L"RSV", L"RSW", L"RSX", L"RSY", L"RSZ", L"RTA", L"RTB", L"RTC", L"RTD", L"RTE", L"RTF", L"RTG", L"RTH", L"RTI", L"RTJ", L"RTK", L"RTL", L"RTM", L"RTN", L"RTO", L"RTP", L"RTQ", L"RTR", L"RTS", L"RTT", L"RTU", L"RTV", L"RTW", L"RTX", L"RTY", L"RTZ", L"RUA", L"RUB", L"RUC", L"RUD", L"RUE", L"RUF", L"RUG", L"RUH", L"RUI", L"RUJ", L"RUK", L"RUL", L"RUM", L"RUN", L"RUO", L"RUP", L"RUQ", L"RUR", L"RUS", L"RUT", L"RUU", L"RUV", L"RUW", L"RUX", L"RUY", L"RUZ", L"RVA", L"RVB", L"RVC", L"RVD", L"RVE", L"RVF", L"RVG", L"RVH", L"RVI", L"RVJ", L"RVK", L"RVL", L"RVM", L"RVN", L"RVO", L"RVP", L"RVQ", L"RVR", L"RVS", L"RVT", L"RVU", L"RVV", L"RVW", L"RVX", L"RVY", L"RVZ", L"RWA", L"RWB", L"RWC", L"RWD", L"RWE", L"RWF", L"RWG", L"RWH", L"RWI", L"RWJ", L"RWK", L"RWL", L"RWM", L"RWN", L"RWO", L"RWP", L"RWQ", L"RWR", L"RWS", L"RWT", L"RWU", L"RWV", L"RWW", L"RWX", L"RWY", L"RWZ", L"RXA", L"RXB", L"RXC", L"RXD", L"RXE", L"RXF", L"RXG", L"RXH", L"RXI", L"RXJ", L"RXK", L"RXL", L"RXM", L"RXN", L"RXO", L"RXP", L"RXQ", L"RXR", L"RXS", L"RXT", L"RXU", L"RXV", L"RXW", L"RXX", L"RXY", L"RXZ", L"RYA", L"RYB", L"RYC", L"RYD", L"RYE", L"RYF", L"RYG", L"RYH", L"RYI", L"RYJ", L"RYK", L"RYL", L"RYM", L"RYN", L"RYO", L"RYP", L"RYQ", L"RYR", L"RYS", L"RYT", L"RYU", L"RYV", L"RYW", L"RYX", L"RYY", L"RYZ", L"RZA", L"RZB", L"RZC", L"RZD", L"RZE", L"RZF", L"RZG", L"RZH", L"RZI", L"RZJ", L"RZK", L"RZL", L"RZM", L"RZN", L"RZO", L"RZP", L"RZQ", L"RZR", L"RZS", L"RZT", L"RZU", L"RZV", L"RZW", L"RZX", L"RZY", L"RZZ", L"SAA", L"SAB", L"SAC", L"SAD", L"SAE", L"SAF", L"SAG", L"SAH", - L"SAI", L"SAJ", L"SAK", L"SAL", L"SAM", L"SAN", L"SAO", L"SAP", L"SAQ", L"SAR", L"SAS", L"SAT", L"SAU", L"SAV", L"SAW", L"SAX", L"SAY", L"SAZ", L"SBA", L"SBB", L"SBC", L"SBD", L"SBE", L"SBF", L"SBG", L"SBH", L"SBI", L"SBJ", L"SBK", L"SBL", L"SBM", L"SBN", L"SBO", L"SBP", L"SBQ", L"SBR", L"SBS", L"SBT", L"SBU", L"SBV", L"SBW", L"SBX", L"SBY", L"SBZ", L"SCA", L"SCB", L"SCC", L"SCD", L"SCE", L"SCF", L"SCG", L"SCH", L"SCI", L"SCJ", L"SCK", L"SCL", L"SCM", L"SCN", L"SCO", L"SCP", L"SCQ", L"SCR", L"SCS", L"SCT", L"SCU", L"SCV", L"SCW", L"SCX", L"SCY", L"SCZ", L"SDA", L"SDB", L"SDC", L"SDD", L"SDE", L"SDF", L"SDG", L"SDH", L"SDI", L"SDJ", L"SDK", L"SDL", L"SDM", L"SDN", L"SDO", L"SDP", L"SDQ", L"SDR", L"SDS", L"SDT", L"SDU", L"SDV", L"SDW", L"SDX", L"SDY", L"SDZ", L"SEA", L"SEB", L"SEC", L"SED", L"SEE", L"SEF", L"SEG", L"SEH", L"SEI", L"SEJ", L"SEK", L"SEL", L"SEM", L"SEN", L"SEO", L"SEP", L"SEQ", L"SER", L"SES", L"SET", L"SEU", L"SEV", L"SEW", L"SEX", L"SEY", L"SEZ", L"SFA", L"SFB", L"SFC", L"SFD", L"SFE", L"SFF", L"SFG", L"SFH", L"SFI", L"SFJ", L"SFK", L"SFL", L"SFM", L"SFN", L"SFO", L"SFP", L"SFQ", L"SFR", L"SFS", L"SFT", L"SFU", L"SFV", L"SFW", L"SFX", L"SFY", L"SFZ", L"SGA", L"SGB", L"SGC", L"SGD", L"SGE", L"SGF", L"SGG", L"SGH", L"SGI", L"SGJ", L"SGK", L"SGL", L"SGM", L"SGN", L"SGO", L"SGP", L"SGQ", L"SGR", L"SGS", L"SGT", L"SGU", L"SGV", L"SGW", L"SGX", L"SGY", L"SGZ", L"SHA", L"SHB", L"SHC", L"SHD", L"SHE", L"SHF", L"SHG", L"SHH", L"SHI", L"SHJ", L"SHK", L"SHL", L"SHM", L"SHN", L"SHO", L"SHP", L"SHQ", L"SHR", L"SHS", L"SHT", L"SHU", L"SHV", L"SHW", L"SHX", L"SHY", L"SHZ", L"SIA", L"SIB", L"SIC", L"SID", L"SIE", L"SIF", L"SIG", L"SIH", L"SII", L"SIJ", L"SIK", L"SIL", L"SIM", L"SIN", L"SIO", L"SIP", L"SIQ", L"SIR", L"SIS", L"SIT", L"SIU", L"SIV", L"SIW", L"SIX", L"SIY", L"SIZ", L"SJA", L"SJB", L"SJC", L"SJD", L"SJE", L"SJF", L"SJG", L"SJH", L"SJI", L"SJJ", L"SJK", L"SJL", L"SJM", L"SJN", L"SJO", L"SJP", L"SJQ", L"SJR", L"SJS", L"SJT", L"SJU", L"SJV", L"SJW", L"SJX", L"SJY", L"SJZ", L"SKA", L"SKB", L"SKC", L"SKD", L"SKE", L"SKF", L"SKG", L"SKH", L"SKI", L"SKJ", L"SKK", L"SKL", L"SKM", L"SKN", L"SKO", L"SKP", L"SKQ", L"SKR", L"SKS", L"SKT", L"SKU", - L"SKV", L"SKW", L"SKX", L"SKY", L"SKZ", L"SLA", L"SLB", L"SLC", L"SLD", L"SLE", L"SLF", L"SLG", L"SLH", L"SLI", L"SLJ", L"SLK", L"SLL", L"SLM", L"SLN", L"SLO", L"SLP", L"SLQ", L"SLR", L"SLS", L"SLT", L"SLU", L"SLV", L"SLW", L"SLX", L"SLY", L"SLZ", L"SMA", L"SMB", L"SMC", L"SMD", L"SME", L"SMF", L"SMG", L"SMH", L"SMI", L"SMJ", L"SMK", L"SML", L"SMM", L"SMN", L"SMO", L"SMP", L"SMQ", L"SMR", L"SMS", L"SMT", L"SMU", L"SMV", L"SMW", L"SMX", L"SMY", L"SMZ", L"SNA", L"SNB", L"SNC", L"SND", L"SNE", L"SNF", L"SNG", L"SNH", L"SNI", L"SNJ", L"SNK", L"SNL", L"SNM", L"SNN", L"SNO", L"SNP", L"SNQ", L"SNR", L"SNS", L"SNT", L"SNU", L"SNV", L"SNW", L"SNX", L"SNY", L"SNZ", L"SOA", L"SOB", L"SOC", L"SOD", L"SOE", L"SOF", L"SOG", L"SOH", L"SOI", L"SOJ", L"SOK", L"SOL", L"SOM", L"SON", L"SOO", L"SOP", L"SOQ", L"SOR", L"SOS", L"SOT", L"SOU", L"SOV", L"SOW", L"SOX", L"SOY", L"SOZ", L"SPA", L"SPB", L"SPC", L"SPD", L"SPE", L"SPF", L"SPG", L"SPH", L"SPI", L"SPJ", L"SPK", L"SPL", L"SPM", L"SPN", L"SPO", L"SPP", L"SPQ", L"SPR", L"SPS", L"SPT", L"SPU", L"SPV", L"SPW", L"SPX", L"SPY", L"SPZ", L"SQA", L"SQB", L"SQC", L"SQD", L"SQE", L"SQF", L"SQG", L"SQH", L"SQI", L"SQJ", L"SQK", L"SQL", L"SQM", L"SQN", L"SQO", L"SQP", L"SQQ", L"SQR", L"SQS", L"SQT", L"SQU", L"SQV", L"SQW", L"SQX", L"SQY", L"SQZ", L"SRA", L"SRB", L"SRC", L"SRD", L"SRE", L"SRF", L"SRG", L"SRH", L"SRI", L"SRJ", L"SRK", L"SRL", L"SRM", L"SRN", L"SRO", L"SRP", L"SRQ", L"SRR", L"SRS", L"SRT", L"SRU", L"SRV", L"SRW", L"SRX", L"SRY", L"SRZ", L"SSA", L"SSB", L"SSC", L"SSD", L"SSE", L"SSF", L"SSG", L"SSH", L"SSI", L"SSJ", L"SSK", L"SSL", L"SSM", L"SSN", L"SSO", L"SSP", L"SSQ", L"SSR", L"SSS", L"SST", L"SSU", L"SSV", L"SSW", L"SSX", L"SSY", L"SSZ", L"STA", L"STB", L"STC", L"STD", L"STE", L"STF", L"STG", L"STH", L"STI", L"STJ", L"STK", L"STL", L"STM", L"STN", L"STO", L"STP", L"STQ", L"STR", L"STS", L"STT", L"STU", L"STV", L"STW", L"STX", L"STY", L"STZ", L"SUA", L"SUB", L"SUC", L"SUD", L"SUE", L"SUF", L"SUG", L"SUH", L"SUI", L"SUJ", L"SUK", L"SUL", L"SUM", L"SUN", L"SUO", L"SUP", L"SUQ", L"SUR", L"SUS", L"SUT", L"SUU", L"SUV", L"SUW", L"SUX", L"SUY", - L"SUZ", L"SVA", L"SVB", L"SVC", L"SVD", L"SVE", L"SVF", L"SVG", L"SVH", L"SVI", L"SVJ", L"SVK", L"SVL", L"SVM", L"SVN", L"SVO", L"SVP", L"SVQ", L"SVR", L"SVS", L"SVT", L"SVU", L"SVV", L"SVW", L"SVX", L"SVY", L"SVZ", L"SWA", L"SWB", L"SWC", L"SWD", L"SWE", L"SWF", L"SWG", L"SWH", L"SWI", L"SWJ", L"SWK", L"SWL", L"SWM", L"SWN", L"SWO", L"SWP", L"SWQ", L"SWR", L"SWS", L"SWT", L"SWU", L"SWV", L"SWW", L"SWX", L"SWY", L"SWZ", L"SXA", L"SXB", L"SXC", L"SXD", L"SXE", L"SXF", L"SXG", L"SXH", L"SXI", L"SXJ", L"SXK", L"SXL", L"SXM", L"SXN", L"SXO", L"SXP", L"SXQ", L"SXR", L"SXS", L"SXT", L"SXU", L"SXV", L"SXW", L"SXX", L"SXY", L"SXZ", L"SYA", L"SYB", L"SYC", L"SYD", L"SYE", L"SYF", L"SYG", L"SYH", L"SYI", L"SYJ", L"SYK", L"SYL", L"SYM", L"SYN", L"SYO", L"SYP", L"SYQ", L"SYR", L"SYS", L"SYT", L"SYU", L"SYV", L"SYW", L"SYX", L"SYY", L"SYZ", L"SZA", L"SZB", L"SZC", L"SZD", L"SZE", L"SZF", L"SZG", L"SZH", L"SZI", L"SZJ", L"SZK", L"SZL", L"SZM", L"SZN", L"SZO", L"SZP", L"SZQ", L"SZR", L"SZS", L"SZT", L"SZU", L"SZV", L"SZW", L"SZX", L"SZY", L"SZZ", L"TAA", L"TAB", L"TAC", L"TAD", L"TAE", L"TAF", L"TAG", L"TAH", L"TAI", L"TAJ", L"TAK", L"TAL", L"TAM", L"TAN", L"TAO", L"TAP", L"TAQ", L"TAR", L"TAS", L"TAT", L"TAU", L"TAV", L"TAW", L"TAX", L"TAY", L"TAZ", L"TBA", L"TBB", L"TBC", L"TBD", L"TBE", L"TBF", L"TBG", L"TBH", L"TBI", L"TBJ", L"TBK", L"TBL", L"TBM", L"TBN", L"TBO", L"TBP", L"TBQ", L"TBR", L"TBS", L"TBT", L"TBU", L"TBV", L"TBW", L"TBX", L"TBY", L"TBZ", L"TCA", L"TCB", L"TCC", L"TCD", L"TCE", L"TCF", L"TCG", L"TCH", L"TCI", L"TCJ", L"TCK", L"TCL", L"TCM", L"TCN", L"TCO", L"TCP", L"TCQ", L"TCR", L"TCS", L"TCT", L"TCU", L"TCV", L"TCW", L"TCX", L"TCY", L"TCZ", L"TDA", L"TDB", L"TDC", L"TDD", L"TDE", L"TDF", L"TDG", L"TDH", L"TDI", L"TDJ", L"TDK", L"TDL", L"TDM", L"TDN", L"TDO", L"TDP", L"TDQ", L"TDR", L"TDS", L"TDT", L"TDU", L"TDV", L"TDW", L"TDX", L"TDY", L"TDZ", L"TEA", L"TEB", L"TEC", L"TED", L"TEE", L"TEF", L"TEG", L"TEH", L"TEI", L"TEJ", L"TEK", L"TEL", L"TEM", L"TEN", L"TEO", L"TEP", L"TEQ", L"TER", L"TES", L"TET", L"TEU", L"TEV", L"TEW", L"TEX", L"TEY", L"TEZ", L"TFA", L"TFB", L"TFC", L"TFD", L"TFE", L"TFF", L"TFG", L"TFH", L"TFI", L"TFJ", L"TFK", L"TFL", + L"QKI", L"QKJ", L"QKK", L"QKL", L"QKM", L"QKN", L"QKO", L"QKP", L"QKQ", L"QKR", L"QKS", L"QKT", L"QKU", L"QKV", L"QKW", L"QKX", L"QKY", L"QKZ", L"QLA", L"QLB", L"QLC", L"QLD", L"QLE", L"QLF", L"QLG", L"QLH", L"QLI", L"QLJ", L"QLK", L"QLL", L"QLM", L"QLN", L"QLO", L"QLP", L"QLQ", L"QLR", L"QLS", L"QLT", L"QLU", L"QLV", L"QLW", L"QLX", L"QLY", L"QLZ", L"QMA", L"QMB", L"QMC", L"QMD", L"QME", L"QMF", L"QMG", L"QMH", L"QMI", L"QMJ", L"QMK", L"QML", L"QMM", L"QMN", L"QMO", L"QMP", L"QMQ", L"QMR", L"QMS", L"QMT", L"QMU", L"QMV", L"QMW", L"QMX", L"QMY", L"QMZ", L"QNA", L"QNB", L"QNC", L"QND", L"QNE", L"QNF", L"QNG", L"QNH", L"QNI", L"QNJ", L"QNK", L"QNL", L"QNM", L"QNN", L"QNO", L"QNP", L"QNQ", L"QNR", L"QNS", L"QNT", L"QNU", L"QNV", L"QNW", L"QNX", L"QNY", L"QNZ", L"QOA", L"QOB", L"QOC", L"QOD", L"QOE", L"QOF", L"QOG", L"QOH", L"QOI", L"QOJ", L"QOK", L"QOL", L"QOM", L"QON", L"QOO", L"QOP", L"QOQ", L"QOR", L"QOS", L"QOT", L"QOU", L"QOV", L"QOW", L"QOX", L"QOY", L"QOZ", L"QPA", L"QPB", L"QPC", L"QPD", L"QPE", L"QPF", L"QPG", L"QPH", L"QPI", L"QPJ", L"QPK", L"QPL", L"QPM", L"QPN", L"QPO", L"QPP", L"QPQ", L"QPR", L"QPS", L"QPT", L"QPU", L"QPV", L"QPW", L"QPX", L"QPY", L"QPZ", L"QQA", L"QQB", L"QQC", L"QQD", L"QQE", L"QQF", L"QQG", L"QQH", L"QQI", L"QQJ", L"QQK", L"QQL", L"QQM", L"QQN", L"QQO", L"QQP", L"QQQ", L"QQR", L"QQS", L"QQT", L"QQU", L"QQV", L"QQW", L"QQX", L"QQY", L"QQZ", L"QRA", L"QRB", L"QRC", L"QRD", L"QRE", L"QRF", L"QRG", L"QRH", L"QRI", L"QRJ", L"QRK", L"QRL", L"QRM", L"QRN", L"QRO", L"QRP", L"QRQ", L"QRR", L"QRS", L"QRT", L"QRU", L"QRV", L"QRW", L"QRX", L"QRY", L"QRZ", L"QSA", L"QSB", L"QSC", L"QSD", L"QSE", L"QSF", L"QSG", L"QSH", L"QSI", L"QSJ", L"QSK", L"QSL", L"QSM", L"QSN", L"QSO", L"QSP", L"QSQ", L"QSR", L"QSS", L"QST", L"QSU", L"QSV", L"QSW", L"QSX", L"QSY", L"QSZ", L"QTA", L"QTB", L"QTC", L"QTD", L"QTE", L"QTF", L"QTG", L"QTH", L"QTI", L"QTJ", L"QTK", L"QTL", L"QTM", L"QTN", L"QTO", L"QTP", L"QTQ", L"QTR", L"QTS", L"QTT", L"QTU", L"QTV", L"QTW", L"QTX", L"QTY", L"QTZ", L"QUA", L"QUB", L"QUC", L"QUD", L"QUE", L"QUF", L"QUG", L"QUH", L"QUI", L"QUJ", L"QUK", L"QUL", L"QUM", L"QUN", L"QUO", L"QUP", L"QUQ", L"QUR", L"QUS", L"QUT", L"QUU", + L"QUV", L"QUW", L"QUX", L"QUY", L"QUZ", L"QVA", L"QVB", L"QVC", L"QVD", L"QVE", L"QVF", L"QVG", L"QVH", L"QVI", L"QVJ", L"QVK", L"QVL", L"QVM", L"QVN", L"QVO", L"QVP", L"QVQ", L"QVR", L"QVS", L"QVT", L"QVU", L"QVV", L"QVW", L"QVX", L"QVY", L"QVZ", L"QWA", L"QWB", L"QWC", L"QWD", L"QWE", L"QWF", L"QWG", L"QWH", L"QWI", L"QWJ", L"QWK", L"QWL", L"QWM", L"QWN", L"QWO", L"QWP", L"QWQ", L"QWR", L"QWS", L"QWT", L"QWU", L"QWV", L"QWW", L"QWX", L"QWY", L"QWZ", L"QXA", L"QXB", L"QXC", L"QXD", L"QXE", L"QXF", L"QXG", L"QXH", L"QXI", L"QXJ", L"QXK", L"QXL", L"QXM", L"QXN", L"QXO", L"QXP", L"QXQ", L"QXR", L"QXS", L"QXT", L"QXU", L"QXV", L"QXW", L"QXX", L"QXY", L"QXZ", L"QYA", L"QYB", L"QYC", L"QYD", L"QYE", L"QYF", L"QYG", L"QYH", L"QYI", L"QYJ", L"QYK", L"QYL", L"QYM", L"QYN", L"QYO", L"QYP", L"QYQ", L"QYR", L"QYS", L"QYT", L"QYU", L"QYV", L"QYW", L"QYX", L"QYY", L"QYZ", L"QZA", L"QZB", L"QZC", L"QZD", L"QZE", L"QZF", L"QZG", L"QZH", L"QZI", L"QZJ", L"QZK", L"QZL", L"QZM", L"QZN", L"QZO", L"QZP", L"QZQ", L"QZR", L"QZS", L"QZT", L"QZU", L"QZV", L"QZW", L"QZX", L"QZY", L"QZZ", L"RAA", L"RAB", L"RAC", L"RAD", L"RAE", L"RAF", L"RAG", L"RAH", L"RAI", L"RAJ", L"RAK", L"RAL", L"RAM", L"RAN", L"RAO", L"RAP", L"RAQ", L"RAR", L"RAS", L"RAT", L"RAU", L"RAV", L"RAW", L"RAX", L"RAY", L"RAZ", L"RBA", L"RBB", L"RBC", L"RBD", L"RBE", L"RBF", L"RBG", L"RBH", L"RBI", L"RBJ", L"RBK", L"RBL", L"RBM", L"RBN", L"RBO", L"RBP", L"RBQ", L"RBR", L"RBS", L"RBT", L"RBU", L"RBV", L"RBW", L"RBX", L"RBY", L"RBZ", L"RCA", L"RCB", L"RCC", L"RCD", L"RCE", L"RCF", L"RCG", L"RCH", L"RCI", L"RCJ", L"RCK", L"RCL", L"RCM", L"RCN", L"RCO", L"RCP", L"RCQ", L"RCR", L"RCS", L"RCT", L"RCU", L"RCV", L"RCW", L"RCX", L"RCY", L"RCZ", L"RDA", L"RDB", L"RDC", L"RDD", L"RDE", L"RDF", L"RDG", L"RDH", L"RDI", L"RDJ", L"RDK", L"RDL", L"RDM", L"RDN", L"RDO", L"RDP", L"RDQ", L"RDR", L"RDS", L"RDT", L"RDU", L"RDV", L"RDW", L"RDX", L"RDY", L"RDZ", L"REA", L"REB", L"REC", L"RED", L"REE", L"REF", L"REG", L"REH", L"REI", L"REJ", L"REK", L"REL", L"REM", L"REN", L"REO", L"REP", L"REQ", L"RER", L"RES", L"RET", L"REU", L"REV", L"REW", L"REX", L"REY", L"REZ", L"RFA", L"RFB", L"RFC", L"RFD", L"RFE", L"RFF", L"RFG", L"RFH", + L"RFI", L"RFJ", L"RFK", L"RFL", L"RFM", L"RFN", L"RFO", L"RFP", L"RFQ", L"RFR", L"RFS", L"RFT", L"RFU", L"RFV", L"RFW", L"RFX", L"RFY", L"RFZ", L"RGA", L"RGB", L"RGC", L"RGD", L"RGE", L"RGF", L"RGG", L"RGH", L"RGI", L"RGJ", L"RGK", L"RGL", L"RGM", L"RGN", L"RGO", L"RGP", L"RGQ", L"RGR", L"RGS", L"RGT", L"RGU", L"RGV", L"RGW", L"RGX", L"RGY", L"RGZ", L"RHA", L"RHB", L"RHC", L"RHD", L"RHE", L"RHF", L"RHG", L"RHH", L"RHI", L"RHJ", L"RHK", L"RHL", L"RHM", L"RHN", L"RHO", L"RHP", L"RHQ", L"RHR", L"RHS", L"RHT", L"RHU", L"RHV", L"RHW", L"RHX", L"RHY", L"RHZ", L"RIA", L"RIB", L"RIC", L"RID", L"RIE", L"RIF", L"RIG", L"RIH", L"RII", L"RIJ", L"RIK", L"RIL", L"RIM", L"RIN", L"RIO", L"RIP", L"RIQ", L"RIR", L"RIS", L"RIT", L"RIU", L"RIV", L"RIW", L"RIX", L"RIY", L"RIZ", L"RJA", L"RJB", L"RJC", L"RJD", L"RJE", L"RJF", L"RJG", L"RJH", L"RJI", L"RJJ", L"RJK", L"RJL", L"RJM", L"RJN", L"RJO", L"RJP", L"RJQ", L"RJR", L"RJS", L"RJT", L"RJU", L"RJV", L"RJW", L"RJX", L"RJY", L"RJZ", L"RKA", L"RKB", L"RKC", L"RKD", L"RKE", L"RKF", L"RKG", L"RKH", L"RKI", L"RKJ", L"RKK", L"RKL", L"RKM", L"RKN", L"RKO", L"RKP", L"RKQ", L"RKR", L"RKS", L"RKT", L"RKU", L"RKV", L"RKW", L"RKX", L"RKY", L"RKZ", L"RLA", L"RLB", L"RLC", L"RLD", L"RLE", L"RLF", L"RLG", L"RLH", L"RLI", L"RLJ", L"RLK", L"RLL", L"RLM", L"RLN", L"RLO", L"RLP", L"RLQ", L"RLR", L"RLS", L"RLT", L"RLU", L"RLV", L"RLW", L"RLX", L"RLY", L"RLZ", L"RMA", L"RMB", L"RMC", L"RMD", L"RME", L"RMF", L"RMG", L"RMH", L"RMI", L"RMJ", L"RMK", L"RML", L"RMM", L"RMN", L"RMO", L"RMP", L"RMQ", L"RMR", L"RMS", L"RMT", L"RMU", L"RMV", L"RMW", L"RMX", L"RMY", L"RMZ", L"RNA", L"RNB", L"RNC", L"RND", L"RNE", L"RNF", L"RNG", L"RNH", L"RNI", L"RNJ", L"RNK", L"RNL", L"RNM", L"RNN", L"RNO", L"RNP", L"RNQ", L"RNR", L"RNS", L"RNT", L"RNU", L"RNV", L"RNW", L"RNX", L"RNY", L"RNZ", L"ROA", L"ROB", L"ROC", L"ROD", L"ROE", L"ROF", L"ROG", L"ROH", L"ROI", L"ROJ", L"ROK", L"ROL", L"ROM", L"RON", L"ROO", L"ROP", L"ROQ", L"ROR", L"ROS", L"ROT", L"ROU", L"ROV", L"ROW", L"ROX", L"ROY", L"ROZ", L"RPA", L"RPB", L"RPC", L"RPD", L"RPE", L"RPF", L"RPG", L"RPH", L"RPI", L"RPJ", L"RPK", L"RPL", L"RPM", L"RPN", L"RPO", L"RPP", L"RPQ", L"RPR", L"RPS", L"RPT", L"RPU", + L"RPV", L"RPW", L"RPX", L"RPY", L"RPZ", L"RQA", L"RQB", L"RQC", L"RQD", L"RQE", L"RQF", L"RQG", L"RQH", L"RQI", L"RQJ", L"RQK", L"RQL", L"RQM", L"RQN", L"RQO", L"RQP", L"RQQ", L"RQR", L"RQS", L"RQT", L"RQU", L"RQV", L"RQW", L"RQX", L"RQY", L"RQZ", L"RRA", L"RRB", L"RRC", L"RRD", L"RRE", L"RRF", L"RRG", L"RRH", L"RRI", L"RRJ", L"RRK", L"RRL", L"RRM", L"RRN", L"RRO", L"RRP", L"RRQ", L"RRR", L"RRS", L"RRT", L"RRU", L"RRV", L"RRW", L"RRX", L"RRY", L"RRZ", L"RSA", L"RSB", L"RSC", L"RSD", L"RSE", L"RSF", L"RSG", L"RSH", L"RSI", L"RSJ", L"RSK", L"RSL", L"RSM", L"RSN", L"RSO", L"RSP", L"RSQ", L"RSR", L"RSS", L"RST", L"RSU", L"RSV", L"RSW", L"RSX", L"RSY", L"RSZ", L"RTA", L"RTB", L"RTC", L"RTD", L"RTE", L"RTF", L"RTG", L"RTH", L"RTI", L"RTJ", L"RTK", L"RTL", L"RTM", L"RTN", L"RTO", L"RTP", L"RTQ", L"RTR", L"RTS", L"RTT", L"RTU", L"RTV", L"RTW", L"RTX", L"RTY", L"RTZ", L"RUA", L"RUB", L"RUC", L"RUD", L"RUE", L"RUF", L"RUG", L"RUH", L"RUI", L"RUJ", L"RUK", L"RUL", L"RUM", L"RUN", L"RUO", L"RUP", L"RUQ", L"RUR", L"RUS", L"RUT", L"RUU", L"RUV", L"RUW", L"RUX", L"RUY", L"RUZ", L"RVA", L"RVB", L"RVC", L"RVD", L"RVE", L"RVF", L"RVG", L"RVH", L"RVI", L"RVJ", L"RVK", L"RVL", L"RVM", L"RVN", L"RVO", L"RVP", L"RVQ", L"RVR", L"RVS", L"RVT", L"RVU", L"RVV", L"RVW", L"RVX", L"RVY", L"RVZ", L"RWA", L"RWB", L"RWC", L"RWD", L"RWE", L"RWF", L"RWG", L"RWH", L"RWI", L"RWJ", L"RWK", L"RWL", L"RWM", L"RWN", L"RWO", L"RWP", L"RWQ", L"RWR", L"RWS", L"RWT", L"RWU", L"RWV", L"RWW", L"RWX", L"RWY", L"RWZ", L"RXA", L"RXB", L"RXC", L"RXD", L"RXE", L"RXF", L"RXG", L"RXH", L"RXI", L"RXJ", L"RXK", L"RXL", L"RXM", L"RXN", L"RXO", L"RXP", L"RXQ", L"RXR", L"RXS", L"RXT", L"RXU", L"RXV", L"RXW", L"RXX", L"RXY", L"RXZ", L"RYA", L"RYB", L"RYC", L"RYD", L"RYE", L"RYF", L"RYG", L"RYH", L"RYI", L"RYJ", L"RYK", L"RYL", L"RYM", L"RYN", L"RYO", L"RYP", L"RYQ", L"RYR", L"RYS", L"RYT", L"RYU", L"RYV", L"RYW", L"RYX", L"RYY", L"RYZ", L"RZA", L"RZB", L"RZC", L"RZD", L"RZE", L"RZF", L"RZG", L"RZH", L"RZI", L"RZJ", L"RZK", L"RZL", L"RZM", L"RZN", L"RZO", L"RZP", L"RZQ", L"RZR", L"RZS", L"RZT", L"RZU", L"RZV", L"RZW", L"RZX", L"RZY", L"RZZ", L"SAA", L"SAB", L"SAC", L"SAD", L"SAE", L"SAF", L"SAG", L"SAH", + L"SAI", L"SAJ", L"SAK", L"SAL", L"SAM", L"SAN", L"SAO", L"SAP", L"SAQ", L"SAR", L"SAS", L"SAT", L"SAU", L"SAV", L"SAW", L"SAX", L"SAY", L"SAZ", L"SBA", L"SBB", L"SBC", L"SBD", L"SBE", L"SBF", L"SBG", L"SBH", L"SBI", L"SBJ", L"SBK", L"SBL", L"SBM", L"SBN", L"SBO", L"SBP", L"SBQ", L"SBR", L"SBS", L"SBT", L"SBU", L"SBV", L"SBW", L"SBX", L"SBY", L"SBZ", L"SCA", L"SCB", L"SCC", L"SCD", L"SCE", L"SCF", L"SCG", L"SCH", L"SCI", L"SCJ", L"SCK", L"SCL", L"SCM", L"SCN", L"SCO", L"SCP", L"SCQ", L"SCR", L"SCS", L"SCT", L"SCU", L"SCV", L"SCW", L"SCX", L"SCY", L"SCZ", L"SDA", L"SDB", L"SDC", L"SDD", L"SDE", L"SDF", L"SDG", L"SDH", L"SDI", L"SDJ", L"SDK", L"SDL", L"SDM", L"SDN", L"SDO", L"SDP", L"SDQ", L"SDR", L"SDS", L"SDT", L"SDU", L"SDV", L"SDW", L"SDX", L"SDY", L"SDZ", L"SEA", L"SEB", L"SEC", L"SED", L"SEE", L"SEF", L"SEG", L"SEH", L"SEI", L"SEJ", L"SEK", L"SEL", L"SEM", L"SEN", L"SEO", L"SEP", L"SEQ", L"SER", L"SES", L"SET", L"SEU", L"SEV", L"SEW", L"SEX", L"SEY", L"SEZ", L"SFA", L"SFB", L"SFC", L"SFD", L"SFE", L"SFF", L"SFG", L"SFH", L"SFI", L"SFJ", L"SFK", L"SFL", L"SFM", L"SFN", L"SFO", L"SFP", L"SFQ", L"SFR", L"SFS", L"SFT", L"SFU", L"SFV", L"SFW", L"SFX", L"SFY", L"SFZ", L"SGA", L"SGB", L"SGC", L"SGD", L"SGE", L"SGF", L"SGG", L"SGH", L"SGI", L"SGJ", L"SGK", L"SGL", L"SGM", L"SGN", L"SGO", L"SGP", L"SGQ", L"SGR", L"SGS", L"SGT", L"SGU", L"SGV", L"SGW", L"SGX", L"SGY", L"SGZ", L"SHA", L"SHB", L"SHC", L"SHD", L"SHE", L"SHF", L"SHG", L"SHH", L"SHI", L"SHJ", L"SHK", L"SHL", L"SHM", L"SHN", L"SHO", L"SHP", L"SHQ", L"SHR", L"SHS", L"SHT", L"SHU", L"SHV", L"SHW", L"SHX", L"SHY", L"SHZ", L"SIA", L"SIB", L"SIC", L"SID", L"SIE", L"SIF", L"SIG", L"SIH", L"SII", L"SIJ", L"SIK", L"SIL", L"SIM", L"SIN", L"SIO", L"SIP", L"SIQ", L"SIR", L"SIS", L"SIT", L"SIU", L"SIV", L"SIW", L"SIX", L"SIY", L"SIZ", L"SJA", L"SJB", L"SJC", L"SJD", L"SJE", L"SJF", L"SJG", L"SJH", L"SJI", L"SJJ", L"SJK", L"SJL", L"SJM", L"SJN", L"SJO", L"SJP", L"SJQ", L"SJR", L"SJS", L"SJT", L"SJU", L"SJV", L"SJW", L"SJX", L"SJY", L"SJZ", L"SKA", L"SKB", L"SKC", L"SKD", L"SKE", L"SKF", L"SKG", L"SKH", L"SKI", L"SKJ", L"SKK", L"SKL", L"SKM", L"SKN", L"SKO", L"SKP", L"SKQ", L"SKR", L"SKS", L"SKT", L"SKU", + L"SKV", L"SKW", L"SKX", L"SKY", L"SKZ", L"SLA", L"SLB", L"SLC", L"SLD", L"SLE", L"SLF", L"SLG", L"SLH", L"SLI", L"SLJ", L"SLK", L"SLL", L"SLM", L"SLN", L"SLO", L"SLP", L"SLQ", L"SLR", L"SLS", L"SLT", L"SLU", L"SLV", L"SLW", L"SLX", L"SLY", L"SLZ", L"SMA", L"SMB", L"SMC", L"SMD", L"SME", L"SMF", L"SMG", L"SMH", L"SMI", L"SMJ", L"SMK", L"SML", L"SMM", L"SMN", L"SMO", L"SMP", L"SMQ", L"SMR", L"SMS", L"SMT", L"SMU", L"SMV", L"SMW", L"SMX", L"SMY", L"SMZ", L"SNA", L"SNB", L"SNC", L"SND", L"SNE", L"SNF", L"SNG", L"SNH", L"SNI", L"SNJ", L"SNK", L"SNL", L"SNM", L"SNN", L"SNO", L"SNP", L"SNQ", L"SNR", L"SNS", L"SNT", L"SNU", L"SNV", L"SNW", L"SNX", L"SNY", L"SNZ", L"SOA", L"SOB", L"SOC", L"SOD", L"SOE", L"SOF", L"SOG", L"SOH", L"SOI", L"SOJ", L"SOK", L"SOL", L"SOM", L"SON", L"SOO", L"SOP", L"SOQ", L"SOR", L"SOS", L"SOT", L"SOU", L"SOV", L"SOW", L"SOX", L"SOY", L"SOZ", L"SPA", L"SPB", L"SPC", L"SPD", L"SPE", L"SPF", L"SPG", L"SPH", L"SPI", L"SPJ", L"SPK", L"SPL", L"SPM", L"SPN", L"SPO", L"SPP", L"SPQ", L"SPR", L"SPS", L"SPT", L"SPU", L"SPV", L"SPW", L"SPX", L"SPY", L"SPZ", L"SQA", L"SQB", L"SQC", L"SQD", L"SQE", L"SQF", L"SQG", L"SQH", L"SQI", L"SQJ", L"SQK", L"SQL", L"SQM", L"SQN", L"SQO", L"SQP", L"SQQ", L"SQR", L"SQS", L"SQT", L"SQU", L"SQV", L"SQW", L"SQX", L"SQY", L"SQZ", L"SRA", L"SRB", L"SRC", L"SRD", L"SRE", L"SRF", L"SRG", L"SRH", L"SRI", L"SRJ", L"SRK", L"SRL", L"SRM", L"SRN", L"SRO", L"SRP", L"SRQ", L"SRR", L"SRS", L"SRT", L"SRU", L"SRV", L"SRW", L"SRX", L"SRY", L"SRZ", L"SSA", L"SSB", L"SSC", L"SSD", L"SSE", L"SSF", L"SSG", L"SSH", L"SSI", L"SSJ", L"SSK", L"SSL", L"SSM", L"SSN", L"SSO", L"SSP", L"SSQ", L"SSR", L"SSS", L"SST", L"SSU", L"SSV", L"SSW", L"SSX", L"SSY", L"SSZ", L"STA", L"STB", L"STC", L"STD", L"STE", L"STF", L"STG", L"STH", L"STI", L"STJ", L"STK", L"STL", L"STM", L"STN", L"STO", L"STP", L"STQ", L"STR", L"STS", L"STT", L"STU", L"STV", L"STW", L"STX", L"STY", L"STZ", L"SUA", L"SUB", L"SUC", L"SUD", L"SUE", L"SUF", L"SUG", L"SUH", L"SUI", L"SUJ", L"SUK", L"SUL", L"SUM", L"SUN", L"SUO", L"SUP", L"SUQ", L"SUR", L"SUS", L"SUT", L"SUU", L"SUV", L"SUW", L"SUX", L"SUY", + L"SUZ", L"SVA", L"SVB", L"SVC", L"SVD", L"SVE", L"SVF", L"SVG", L"SVH", L"SVI", L"SVJ", L"SVK", L"SVL", L"SVM", L"SVN", L"SVO", L"SVP", L"SVQ", L"SVR", L"SVS", L"SVT", L"SVU", L"SVV", L"SVW", L"SVX", L"SVY", L"SVZ", L"SWA", L"SWB", L"SWC", L"SWD", L"SWE", L"SWF", L"SWG", L"SWH", L"SWI", L"SWJ", L"SWK", L"SWL", L"SWM", L"SWN", L"SWO", L"SWP", L"SWQ", L"SWR", L"SWS", L"SWT", L"SWU", L"SWV", L"SWW", L"SWX", L"SWY", L"SWZ", L"SXA", L"SXB", L"SXC", L"SXD", L"SXE", L"SXF", L"SXG", L"SXH", L"SXI", L"SXJ", L"SXK", L"SXL", L"SXM", L"SXN", L"SXO", L"SXP", L"SXQ", L"SXR", L"SXS", L"SXT", L"SXU", L"SXV", L"SXW", L"SXX", L"SXY", L"SXZ", L"SYA", L"SYB", L"SYC", L"SYD", L"SYE", L"SYF", L"SYG", L"SYH", L"SYI", L"SYJ", L"SYK", L"SYL", L"SYM", L"SYN", L"SYO", L"SYP", L"SYQ", L"SYR", L"SYS", L"SYT", L"SYU", L"SYV", L"SYW", L"SYX", L"SYY", L"SYZ", L"SZA", L"SZB", L"SZC", L"SZD", L"SZE", L"SZF", L"SZG", L"SZH", L"SZI", L"SZJ", L"SZK", L"SZL", L"SZM", L"SZN", L"SZO", L"SZP", L"SZQ", L"SZR", L"SZS", L"SZT", L"SZU", L"SZV", L"SZW", L"SZX", L"SZY", L"SZZ", L"TAA", L"TAB", L"TAC", L"TAD", L"TAE", L"TAF", L"TAG", L"TAH", L"TAI", L"TAJ", L"TAK", L"TAL", L"TAM", L"TAN", L"TAO", L"TAP", L"TAQ", L"TAR", L"TAS", L"TAT", L"TAU", L"TAV", L"TAW", L"TAX", L"TAY", L"TAZ", L"TBA", L"TBB", L"TBC", L"TBD", L"TBE", L"TBF", L"TBG", L"TBH", L"TBI", L"TBJ", L"TBK", L"TBL", L"TBM", L"TBN", L"TBO", L"TBP", L"TBQ", L"TBR", L"TBS", L"TBT", L"TBU", L"TBV", L"TBW", L"TBX", L"TBY", L"TBZ", L"TCA", L"TCB", L"TCC", L"TCD", L"TCE", L"TCF", L"TCG", L"TCH", L"TCI", L"TCJ", L"TCK", L"TCL", L"TCM", L"TCN", L"TCO", L"TCP", L"TCQ", L"TCR", L"TCS", L"TCT", L"TCU", L"TCV", L"TCW", L"TCX", L"TCY", L"TCZ", L"TDA", L"TDB", L"TDC", L"TDD", L"TDE", L"TDF", L"TDG", L"TDH", L"TDI", L"TDJ", L"TDK", L"TDL", L"TDM", L"TDN", L"TDO", L"TDP", L"TDQ", L"TDR", L"TDS", L"TDT", L"TDU", L"TDV", L"TDW", L"TDX", L"TDY", L"TDZ", L"TEA", L"TEB", L"TEC", L"TED", L"TEE", L"TEF", L"TEG", L"TEH", L"TEI", L"TEJ", L"TEK", L"TEL", L"TEM", L"TEN", L"TEO", L"TEP", L"TEQ", L"TER", L"TES", L"TET", L"TEU", L"TEV", L"TEW", L"TEX", L"TEY", L"TEZ", L"TFA", L"TFB", L"TFC", L"TFD", L"TFE", L"TFF", L"TFG", L"TFH", L"TFI", L"TFJ", L"TFK", L"TFL", L"TFM", L"TFN", L"TFO", L"TFP", L"TFQ", L"TFR", L"TFS", L"TFT", L"TFU", L"TFV", L"TFW", L"TFX", L"TFY", L"TFZ", L"TGA", L"TGB", L"TGC", L"TGD", L"TGE", L"TGF", L"TGG", L"TGH", L"TGI", L"TGJ", L"TGK", L"TGL", L"TGM", L"TGN", L"TGO", L"TGP", L"TGQ", L"TGR", L"TGS", L"TGT", L"TGU", L"TGV", L"TGW", L"TGX", L"TGY", L"TGZ", L"THA", L"THB", L"THC", L"THD", L"THE", L"THF", L"THG", L"THH", L"THI", L"THJ", L"THK", L"THL", L"THM", L"THN", L"THO", L"THP", L"THQ", L"THR", L"THS", L"THT", L"THU", L"THV", L"THW", L"THX", L"THY", L"THZ", L"TIA", L"TIB", L"TIC", L"TID", L"TIE", L"TIF", L"TIG", L"TIH", L"TII", L"TIJ", L"TIK", L"TIL", L"TIM", L"TIN", L"TIO", L"TIP", L"TIQ", L"TIR", L"TIS", L"TIT", L"TIU", L"TIV", L"TIW", L"TIX", L"TIY", L"TIZ", L"TJA", L"TJB", L"TJC", L"TJD", L"TJE", L"TJF", L"TJG", L"TJH", L"TJI", L"TJJ", L"TJK", L"TJL", L"TJM", L"TJN", L"TJO", L"TJP", L"TJQ", L"TJR", L"TJS", L"TJT", L"TJU", L"TJV", L"TJW", L"TJX", L"TJY", L"TJZ", L"TKA", L"TKB", L"TKC", L"TKD", L"TKE", L"TKF", L"TKG", L"TKH", L"TKI", L"TKJ", L"TKK", L"TKL", L"TKM", L"TKN", L"TKO", L"TKP", L"TKQ", L"TKR", L"TKS", L"TKT", L"TKU", L"TKV", L"TKW", L"TKX", L"TKY", L"TKZ", L"TLA", L"TLB", L"TLC", L"TLD", L"TLE", L"TLF", L"TLG", L"TLH", L"TLI", L"TLJ", L"TLK", L"TLL", L"TLM", L"TLN", L"TLO", L"TLP", L"TLQ", L"TLR", L"TLS", L"TLT", L"TLU", L"TLV", L"TLW", L"TLX", L"TLY", L"TLZ", L"TMA", L"TMB", L"TMC", L"TMD", L"TME", L"TMF", L"TMG", L"TMH", L"TMI", L"TMJ", L"TMK", L"TML", L"TMM", L"TMN", L"TMO", L"TMP", L"TMQ", L"TMR", L"TMS", L"TMT", L"TMU", L"TMV", L"TMW", L"TMX", L"TMY", L"TMZ", L"TNA", L"TNB", L"TNC", L"TND", L"TNE", L"TNF", L"TNG", L"TNH", L"TNI", L"TNJ", L"TNK", L"TNL", L"TNM", L"TNN", L"TNO", L"TNP", L"TNQ", L"TNR", L"TNS", L"TNT", L"TNU", L"TNV", L"TNW", L"TNX", L"TNY", L"TNZ", L"TOA", L"TOB", L"TOC", L"TOD", L"TOE", L"TOF", L"TOG", L"TOH", L"TOI", L"TOJ", L"TOK", L"TOL", L"TOM", L"TON", L"TOO", L"TOP", L"TOQ", L"TOR", L"TOS", L"TOT", L"TOU", L"TOV", L"TOW", L"TOX", L"TOY", L"TOZ", L"TPA", L"TPB", L"TPC", L"TPD", L"TPE", L"TPF", L"TPG", L"TPH", L"TPI", L"TPJ", L"TPK", L"TPL", L"TPM", L"TPN", L"TPO", L"TPP", L"TPQ", L"TPR", L"TPS", L"TPT", L"TPU", L"TPV", L"TPW", L"TPX", L"TPY", L"TPZ", - L"TQA", L"TQB", L"TQC", L"TQD", L"TQE", L"TQF", L"TQG", L"TQH", L"TQI", L"TQJ", L"TQK", L"TQL", L"TQM", L"TQN", L"TQO", L"TQP", L"TQQ", L"TQR", L"TQS", L"TQT", L"TQU", L"TQV", L"TQW", L"TQX", L"TQY", L"TQZ", L"TRA", L"TRB", L"TRC", L"TRD", L"TRE", L"TRF", L"TRG", L"TRH", L"TRI", L"TRJ", L"TRK", L"TRL", L"TRM", L"TRN", L"TRO", L"TRP", L"TRQ", L"TRR", L"TRS", L"TRT", L"TRU", L"TRV", L"TRW", L"TRX", L"TRY", L"TRZ", L"TSA", L"TSB", L"TSC", L"TSD", L"TSE", L"TSF", L"TSG", L"TSH", L"TSI", L"TSJ", L"TSK", L"TSL", L"TSM", L"TSN", L"TSO", L"TSP", L"TSQ", L"TSR", L"TSS", L"TST", L"TSU", L"TSV", L"TSW", L"TSX", L"TSY", L"TSZ", L"TTA", L"TTB", L"TTC", L"TTD", L"TTE", L"TTF", L"TTG", L"TTH", L"TTI", L"TTJ", L"TTK", L"TTL", L"TTM", L"TTN", L"TTO", L"TTP", L"TTQ", L"TTR", L"TTS", L"TTT", L"TTU", L"TTV", L"TTW", L"TTX", L"TTY", L"TTZ", L"TUA", L"TUB", L"TUC", L"TUD", L"TUE", L"TUF", L"TUG", L"TUH", L"TUI", L"TUJ", L"TUK", L"TUL", L"TUM", L"TUN", L"TUO", L"TUP", L"TUQ", L"TUR", L"TUS", L"TUT", L"TUU", L"TUV", L"TUW", L"TUX", L"TUY", L"TUZ", L"TVA", L"TVB", L"TVC", L"TVD", L"TVE", L"TVF", L"TVG", L"TVH", L"TVI", L"TVJ", L"TVK", L"TVL", L"TVM", L"TVN", L"TVO", L"TVP", L"TVQ", L"TVR", L"TVS", L"TVT", L"TVU", L"TVV", L"TVW", L"TVX", L"TVY", L"TVZ", L"TWA", L"TWB", L"TWC", L"TWD", L"TWE", L"TWF", L"TWG", L"TWH", L"TWI", L"TWJ", L"TWK", L"TWL", L"TWM", L"TWN", L"TWO", L"TWP", L"TWQ", L"TWR", L"TWS", L"TWT", L"TWU", L"TWV", L"TWW", L"TWX", L"TWY", L"TWZ", L"TXA", L"TXB", L"TXC", L"TXD", L"TXE", L"TXF", L"TXG", L"TXH", L"TXI", L"TXJ", L"TXK", L"TXL", L"TXM", L"TXN", L"TXO", L"TXP", L"TXQ", L"TXR", L"TXS", L"TXT", L"TXU", L"TXV", L"TXW", L"TXX", L"TXY", L"TXZ", L"TYA", L"TYB", L"TYC", L"TYD", L"TYE", L"TYF", L"TYG", L"TYH", L"TYI", L"TYJ", L"TYK", L"TYL", L"TYM", L"TYN", L"TYO", L"TYP", L"TYQ", L"TYR", L"TYS", L"TYT", L"TYU", L"TYV", L"TYW", L"TYX", L"TYY", L"TYZ", L"TZA", L"TZB", L"TZC", L"TZD", L"TZE", L"TZF", L"TZG", L"TZH", L"TZI", L"TZJ", L"TZK", L"TZL", L"TZM", L"TZN", L"TZO", L"TZP", L"TZQ", L"TZR", L"TZS", L"TZT", L"TZU", L"TZV", L"TZW", L"TZX", L"TZY", L"TZZ", L"UAA", L"UAB", L"UAC", L"UAD", L"UAE", L"UAF", L"UAG", L"UAH", L"UAI", L"UAJ", L"UAK", L"UAL", L"UAM", - L"UAN", L"UAO", L"UAP", L"UAQ", L"UAR", L"UAS", L"UAT", L"UAU", L"UAV", L"UAW", L"UAX", L"UAY", L"UAZ", L"UBA", L"UBB", L"UBC", L"UBD", L"UBE", L"UBF", L"UBG", L"UBH", L"UBI", L"UBJ", L"UBK", L"UBL", L"UBM", L"UBN", L"UBO", L"UBP", L"UBQ", L"UBR", L"UBS", L"UBT", L"UBU", L"UBV", L"UBW", L"UBX", L"UBY", L"UBZ", L"UCA", L"UCB", L"UCC", L"UCD", L"UCE", L"UCF", L"UCG", L"UCH", L"UCI", L"UCJ", L"UCK", L"UCL", L"UCM", L"UCN", L"UCO", L"UCP", L"UCQ", L"UCR", L"UCS", L"UCT", L"UCU", L"UCV", L"UCW", L"UCX", L"UCY", L"UCZ", L"UDA", L"UDB", L"UDC", L"UDD", L"UDE", L"UDF", L"UDG", L"UDH", L"UDI", L"UDJ", L"UDK", L"UDL", L"UDM", L"UDN", L"UDO", L"UDP", L"UDQ", L"UDR", L"UDS", L"UDT", L"UDU", L"UDV", L"UDW", L"UDX", L"UDY", L"UDZ", L"UEA", L"UEB", L"UEC", L"UED", L"UEE", L"UEF", L"UEG", L"UEH", L"UEI", L"UEJ", L"UEK", L"UEL", L"UEM", L"UEN", L"UEO", L"UEP", L"UEQ", L"UER", L"UES", L"UET", L"UEU", L"UEV", L"UEW", L"UEX", L"UEY", L"UEZ", L"UFA", L"UFB", L"UFC", L"UFD", L"UFE", L"UFF", L"UFG", L"UFH", L"UFI", L"UFJ", L"UFK", L"UFL", L"UFM", L"UFN", L"UFO", L"UFP", L"UFQ", L"UFR", L"UFS", L"UFT", L"UFU", L"UFV", L"UFW", L"UFX", L"UFY", L"UFZ", L"UGA", L"UGB", L"UGC", L"UGD", L"UGE", L"UGF", L"UGG", L"UGH", L"UGI", L"UGJ", L"UGK", L"UGL", L"UGM", L"UGN", L"UGO", L"UGP", L"UGQ", L"UGR", L"UGS", L"UGT", L"UGU", L"UGV", L"UGW", L"UGX", L"UGY", L"UGZ", L"UHA", L"UHB", L"UHC", L"UHD", L"UHE", L"UHF", L"UHG", L"UHH", L"UHI", L"UHJ", L"UHK", L"UHL", L"UHM", L"UHN", L"UHO", L"UHP", L"UHQ", L"UHR", L"UHS", L"UHT", L"UHU", L"UHV", L"UHW", L"UHX", L"UHY", L"UHZ", L"UIA", L"UIB", L"UIC", L"UID", L"UIE", L"UIF", L"UIG", L"UIH", L"UII", L"UIJ", L"UIK", L"UIL", L"UIM", L"UIN", L"UIO", L"UIP", L"UIQ", L"UIR", L"UIS", L"UIT", L"UIU", L"UIV", L"UIW", L"UIX", L"UIY", L"UIZ", L"UJA", L"UJB", L"UJC", L"UJD", L"UJE", L"UJF", L"UJG", L"UJH", L"UJI", L"UJJ", L"UJK", L"UJL", L"UJM", L"UJN", L"UJO", L"UJP", L"UJQ", L"UJR", L"UJS", L"UJT", L"UJU", L"UJV", L"UJW", L"UJX", L"UJY", L"UJZ", L"UKA", L"UKB", L"UKC", L"UKD", L"UKE", L"UKF", L"UKG", L"UKH", L"UKI", L"UKJ", L"UKK", L"UKL", L"UKM", L"UKN", L"UKO", L"UKP", L"UKQ", L"UKR", L"UKS", L"UKT", L"UKU", L"UKV", L"UKW", L"UKX", L"UKY", L"UKZ", - L"ULA", L"ULB", L"ULC", L"ULD", L"ULE", L"ULF", L"ULG", L"ULH", L"ULI", L"ULJ", L"ULK", L"ULL", L"ULM", L"ULN", L"ULO", L"ULP", L"ULQ", L"ULR", L"ULS", L"ULT", L"ULU", L"ULV", L"ULW", L"ULX", L"ULY", L"ULZ", L"UMA", L"UMB", L"UMC", L"UMD", L"UME", L"UMF", L"UMG", L"UMH", L"UMI", L"UMJ", L"UMK", L"UML", L"UMM", L"UMN", L"UMO", L"UMP", L"UMQ", L"UMR", L"UMS", L"UMT", L"UMU", L"UMV", L"UMW", L"UMX", L"UMY", L"UMZ", L"UNA", L"UNB", L"UNC", L"UND", L"UNE", L"UNF", L"UNG", L"UNH", L"UNI", L"UNJ", L"UNK", L"UNL", L"UNM", L"UNN", L"UNO", L"UNP", L"UNQ", L"UNR", L"UNS", L"UNT", L"UNU", L"UNV", L"UNW", L"UNX", L"UNY", L"UNZ", L"UOA", L"UOB", L"UOC", L"UOD", L"UOE", L"UOF", L"UOG", L"UOH", L"UOI", L"UOJ", L"UOK", L"UOL", L"UOM", L"UON", L"UOO", L"UOP", L"UOQ", L"UOR", L"UOS", L"UOT", L"UOU", L"UOV", L"UOW", L"UOX", L"UOY", L"UOZ", L"UPA", L"UPB", L"UPC", L"UPD", L"UPE", L"UPF", L"UPG", L"UPH", L"UPI", L"UPJ", L"UPK", L"UPL", L"UPM", L"UPN", L"UPO", L"UPP", L"UPQ", L"UPR", L"UPS", L"UPT", L"UPU", L"UPV", L"UPW", L"UPX", L"UPY", L"UPZ", L"UQA", L"UQB", L"UQC", L"UQD", L"UQE", L"UQF", L"UQG", L"UQH", L"UQI", L"UQJ", L"UQK", L"UQL", L"UQM", L"UQN", L"UQO", L"UQP", L"UQQ", L"UQR", L"UQS", L"UQT", L"UQU", L"UQV", L"UQW", L"UQX", L"UQY", L"UQZ", L"URA", L"URB", L"URC", L"URD", L"URE", L"URF", L"URG", L"URH", L"URI", L"URJ", L"URK", L"URL", L"URM", L"URN", L"URO", L"URP", L"URQ", L"URR", L"URS", L"URT", L"URU", L"URV", L"URW", L"URX", L"URY", L"URZ", L"USA", L"USB", L"USC", L"USD", L"USE", L"USF", L"USG", L"USH", L"USI", L"USJ", L"USK", L"USL", L"USM", L"USN", L"USO", L"USP", L"USQ", L"USR", L"USS", L"UST", L"USU", L"USV", L"USW", L"USX", L"USY", L"USZ", L"UTA", L"UTB", L"UTC", L"UTD", L"UTE", L"UTF", L"UTG", L"UTH", L"UTI", L"UTJ", L"UTK", L"UTL", L"UTM", L"UTN", L"UTO", L"UTP", L"UTQ", L"UTR", L"UTS", L"UTT", L"UTU", L"UTV", L"UTW", L"UTX", L"UTY", L"UTZ", L"UUA", L"UUB", L"UUC", L"UUD", L"UUE", L"UUF", L"UUG", L"UUH", L"UUI", L"UUJ", L"UUK", L"UUL", L"UUM", L"UUN", L"UUO", L"UUP", L"UUQ", L"UUR", L"UUS", L"UUT", L"UUU", L"UUV", L"UUW", L"UUX", L"UUY", L"UUZ", L"UVA", L"UVB", L"UVC", L"UVD", L"UVE", L"UVF", L"UVG", L"UVH", L"UVI", L"UVJ", L"UVK", L"UVL", L"UVM", - L"UVN", L"UVO", L"UVP", L"UVQ", L"UVR", L"UVS", L"UVT", L"UVU", L"UVV", L"UVW", L"UVX", L"UVY", L"UVZ", L"UWA", L"UWB", L"UWC", L"UWD", L"UWE", L"UWF", L"UWG", L"UWH", L"UWI", L"UWJ", L"UWK", L"UWL", L"UWM", L"UWN", L"UWO", L"UWP", L"UWQ", L"UWR", L"UWS", L"UWT", L"UWU", L"UWV", L"UWW", L"UWX", L"UWY", L"UWZ", L"UXA", L"UXB", L"UXC", L"UXD", L"UXE", L"UXF", L"UXG", L"UXH", L"UXI", L"UXJ", L"UXK", L"UXL", L"UXM", L"UXN", L"UXO", L"UXP", L"UXQ", L"UXR", L"UXS", L"UXT", L"UXU", L"UXV", L"UXW", L"UXX", L"UXY", L"UXZ", L"UYA", L"UYB", L"UYC", L"UYD", L"UYE", L"UYF", L"UYG", L"UYH", L"UYI", L"UYJ", L"UYK", L"UYL", L"UYM", L"UYN", L"UYO", L"UYP", L"UYQ", L"UYR", L"UYS", L"UYT", L"UYU", L"UYV", L"UYW", L"UYX", L"UYY", L"UYZ", L"UZA", L"UZB", L"UZC", L"UZD", L"UZE", L"UZF", L"UZG", L"UZH", L"UZI", L"UZJ", L"UZK", L"UZL", L"UZM", L"UZN", L"UZO", L"UZP", L"UZQ", L"UZR", L"UZS", L"UZT", L"UZU", L"UZV", L"UZW", L"UZX", L"UZY", L"UZZ", L"VAA", L"VAB", L"VAC", L"VAD", L"VAE", L"VAF", L"VAG", L"VAH", L"VAI", L"VAJ", L"VAK", L"VAL", L"VAM", L"VAN", L"VAO", L"VAP", L"VAQ", L"VAR", L"VAS", L"VAT", L"VAU", L"VAV", L"VAW", L"VAX", L"VAY", L"VAZ", L"VBA", L"VBB", L"VBC", L"VBD", L"VBE", L"VBF", L"VBG", L"VBH", L"VBI", L"VBJ", L"VBK", L"VBL", L"VBM", L"VBN", L"VBO", L"VBP", L"VBQ", L"VBR", L"VBS", L"VBT", L"VBU", L"VBV", L"VBW", L"VBX", L"VBY", L"VBZ", L"VCA", L"VCB", L"VCC", L"VCD", L"VCE", L"VCF", L"VCG", L"VCH", L"VCI", L"VCJ", L"VCK", L"VCL", L"VCM", L"VCN", L"VCO", L"VCP", L"VCQ", L"VCR", L"VCS", L"VCT", L"VCU", L"VCV", L"VCW", L"VCX", L"VCY", L"VCZ", L"VDA", L"VDB", L"VDC", L"VDD", L"VDE", L"VDF", L"VDG", L"VDH", L"VDI", L"VDJ", L"VDK", L"VDL", L"VDM", L"VDN", L"VDO", L"VDP", L"VDQ", L"VDR", L"VDS", L"VDT", L"VDU", L"VDV", L"VDW", L"VDX", L"VDY", L"VDZ", L"VEA", L"VEB", L"VEC", L"VED", L"VEE", L"VEF", L"VEG", L"VEH", L"VEI", L"VEJ", L"VEK", L"VEL", L"VEM", L"VEN", L"VEO", L"VEP", L"VEQ", L"VER", L"VES", L"VET", L"VEU", L"VEV", L"VEW", L"VEX", L"VEY", L"VEZ", L"VFA", L"VFB", L"VFC", L"VFD", L"VFE", L"VFF", L"VFG", L"VFH", L"VFI", L"VFJ", L"VFK", L"VFL", L"VFM", L"VFN", L"VFO", L"VFP", L"VFQ", L"VFR", L"VFS", L"VFT", L"VFU", L"VFV", L"VFW", L"VFX", L"VFY", L"VFZ", - L"VGA", L"VGB", L"VGC", L"VGD", L"VGE", L"VGF", L"VGG", L"VGH", L"VGI", L"VGJ", L"VGK", L"VGL", L"VGM", L"VGN", L"VGO", L"VGP", L"VGQ", L"VGR", L"VGS", L"VGT", L"VGU", L"VGV", L"VGW", L"VGX", L"VGY", L"VGZ", L"VHA", L"VHB", L"VHC", L"VHD", L"VHE", L"VHF", L"VHG", L"VHH", L"VHI", L"VHJ", L"VHK", L"VHL", L"VHM", L"VHN", L"VHO", L"VHP", L"VHQ", L"VHR", L"VHS", L"VHT", L"VHU", L"VHV", L"VHW", L"VHX", L"VHY", L"VHZ", L"VIA", L"VIB", L"VIC", L"VID", L"VIE", L"VIF", L"VIG", L"VIH", L"VII", L"VIJ", L"VIK", L"VIL", L"VIM", L"VIN", L"VIO", L"VIP", L"VIQ", L"VIR", L"VIS", L"VIT", L"VIU", L"VIV", L"VIW", L"VIX", L"VIY", L"VIZ", L"VJA", L"VJB", L"VJC", L"VJD", L"VJE", L"VJF", L"VJG", L"VJH", L"VJI", L"VJJ", L"VJK", L"VJL", L"VJM", L"VJN", L"VJO", L"VJP", L"VJQ", L"VJR", L"VJS", L"VJT", L"VJU", L"VJV", L"VJW", L"VJX", L"VJY", L"VJZ", L"VKA", L"VKB", L"VKC", L"VKD", L"VKE", L"VKF", L"VKG", L"VKH", L"VKI", L"VKJ", L"VKK", L"VKL", L"VKM", L"VKN", L"VKO", L"VKP", L"VKQ", L"VKR", L"VKS", L"VKT", L"VKU", L"VKV", L"VKW", L"VKX", L"VKY", L"VKZ", L"VLA", L"VLB", L"VLC", L"VLD", L"VLE", L"VLF", L"VLG", L"VLH", L"VLI", L"VLJ", L"VLK", L"VLL", L"VLM", L"VLN", L"VLO", L"VLP", L"VLQ", L"VLR", L"VLS", L"VLT", L"VLU", L"VLV", L"VLW", L"VLX", L"VLY", L"VLZ", L"VMA", L"VMB", L"VMC", L"VMD", L"VME", L"VMF", L"VMG", L"VMH", L"VMI", L"VMJ", L"VMK", L"VML", L"VMM", L"VMN", L"VMO", L"VMP", L"VMQ", L"VMR", L"VMS", L"VMT", L"VMU", L"VMV", L"VMW", L"VMX", L"VMY", L"VMZ", L"VNA", L"VNB", L"VNC", L"VND", L"VNE", L"VNF", L"VNG", L"VNH", L"VNI", L"VNJ", L"VNK", L"VNL", L"VNM", L"VNN", L"VNO", L"VNP", L"VNQ", L"VNR", L"VNS", L"VNT", L"VNU", L"VNV", L"VNW", L"VNX", L"VNY", L"VNZ", L"VOA", L"VOB", L"VOC", L"VOD", L"VOE", L"VOF", L"VOG", L"VOH", L"VOI", L"VOJ", L"VOK", L"VOL", L"VOM", L"VON", L"VOO", L"VOP", L"VOQ", L"VOR", L"VOS", L"VOT", L"VOU", L"VOV", L"VOW", L"VOX", L"VOY", L"VOZ", L"VPA", L"VPB", L"VPC", L"VPD", L"VPE", L"VPF", L"VPG", L"VPH", L"VPI", L"VPJ", L"VPK", L"VPL", L"VPM", L"VPN", L"VPO", L"VPP", L"VPQ", L"VPR", L"VPS", L"VPT", L"VPU", L"VPV", L"VPW", L"VPX", L"VPY", L"VPZ", L"VQA", L"VQB", L"VQC", L"VQD", L"VQE", L"VQF", L"VQG", L"VQH", L"VQI", L"VQJ", L"VQK", L"VQL", L"VQM", - L"VQN", L"VQO", L"VQP", L"VQQ", L"VQR", L"VQS", L"VQT", L"VQU", L"VQV", L"VQW", L"VQX", L"VQY", L"VQZ", L"VRA", L"VRB", L"VRC", L"VRD", L"VRE", L"VRF", L"VRG", L"VRH", L"VRI", L"VRJ", L"VRK", L"VRL", L"VRM", L"VRN", L"VRO", L"VRP", L"VRQ", L"VRR", L"VRS", L"VRT", L"VRU", L"VRV", L"VRW", L"VRX", L"VRY", L"VRZ", L"VSA", L"VSB", L"VSC", L"VSD", L"VSE", L"VSF", L"VSG", L"VSH", L"VSI", L"VSJ", L"VSK", L"VSL", L"VSM", L"VSN", L"VSO", L"VSP", L"VSQ", L"VSR", L"VSS", L"VST", L"VSU", L"VSV", L"VSW", L"VSX", L"VSY", L"VSZ", L"VTA", L"VTB", L"VTC", L"VTD", L"VTE", L"VTF", L"VTG", L"VTH", L"VTI", L"VTJ", L"VTK", L"VTL", L"VTM", L"VTN", L"VTO", L"VTP", L"VTQ", L"VTR", L"VTS", L"VTT", L"VTU", L"VTV", L"VTW", L"VTX", L"VTY", L"VTZ", L"VUA", L"VUB", L"VUC", L"VUD", L"VUE", L"VUF", L"VUG", L"VUH", L"VUI", L"VUJ", L"VUK", L"VUL", L"VUM", L"VUN", L"VUO", L"VUP", L"VUQ", L"VUR", L"VUS", L"VUT", L"VUU", L"VUV", L"VUW", L"VUX", L"VUY", L"VUZ", L"VVA", L"VVB", L"VVC", L"VVD", L"VVE", L"VVF", L"VVG", L"VVH", L"VVI", L"VVJ", L"VVK", L"VVL", L"VVM", L"VVN", L"VVO", L"VVP", L"VVQ", L"VVR", L"VVS", L"VVT", L"VVU", L"VVV", L"VVW", L"VVX", L"VVY", L"VVZ", L"VWA", L"VWB", L"VWC", L"VWD", L"VWE", L"VWF", L"VWG", L"VWH", L"VWI", L"VWJ", L"VWK", L"VWL", L"VWM", L"VWN", L"VWO", L"VWP", L"VWQ", L"VWR", L"VWS", L"VWT", L"VWU", L"VWV", L"VWW", L"VWX", L"VWY", L"VWZ", L"VXA", L"VXB", L"VXC", L"VXD", L"VXE", L"VXF", L"VXG", L"VXH", L"VXI", L"VXJ", L"VXK", L"VXL", L"VXM", L"VXN", L"VXO", L"VXP", L"VXQ", L"VXR", L"VXS", L"VXT", L"VXU", L"VXV", L"VXW", L"VXX", L"VXY", L"VXZ", L"VYA", L"VYB", L"VYC", L"VYD", L"VYE", L"VYF", L"VYG", L"VYH", L"VYI", L"VYJ", L"VYK", L"VYL", L"VYM", L"VYN", L"VYO", L"VYP", L"VYQ", L"VYR", L"VYS", L"VYT", L"VYU", L"VYV", L"VYW", L"VYX", L"VYY", L"VYZ", L"VZA", L"VZB", L"VZC", L"VZD", L"VZE", L"VZF", L"VZG", L"VZH", L"VZI", L"VZJ", L"VZK", L"VZL", L"VZM", L"VZN", L"VZO", L"VZP", L"VZQ", L"VZR", L"VZS", L"VZT", L"VZU", L"VZV", L"VZW", L"VZX", L"VZY", L"VZZ", L"WAA", L"WAB", L"WAC", L"WAD", L"WAE", L"WAF", L"WAG", L"WAH", L"WAI", L"WAJ", L"WAK", L"WAL", L"WAM", L"WAN", L"WAO", L"WAP", L"WAQ", L"WAR", L"WAS", L"WAT", L"WAU", L"WAV", L"WAW", L"WAX", L"WAY", L"WAZ", - L"WBA", L"WBB", L"WBC", L"WBD", L"WBE", L"WBF", L"WBG", L"WBH", L"WBI", L"WBJ", L"WBK", L"WBL", L"WBM", L"WBN", L"WBO", L"WBP", L"WBQ", L"WBR", L"WBS", L"WBT", L"WBU", L"WBV", L"WBW", L"WBX", L"WBY", L"WBZ", L"WCA", L"WCB", L"WCC", L"WCD", L"WCE", L"WCF", L"WCG", L"WCH", L"WCI", L"WCJ", L"WCK", L"WCL", L"WCM", L"WCN", L"WCO", L"WCP", L"WCQ", L"WCR", L"WCS", L"WCT", L"WCU", L"WCV", L"WCW", L"WCX", L"WCY", L"WCZ", L"WDA", L"WDB", L"WDC", L"WDD", L"WDE", L"WDF", L"WDG", L"WDH", L"WDI", L"WDJ", L"WDK", L"WDL", L"WDM", L"WDN", L"WDO", L"WDP", L"WDQ", L"WDR", L"WDS", L"WDT", L"WDU", L"WDV", L"WDW", L"WDX", L"WDY", L"WDZ", L"WEA", L"WEB", L"WEC", L"WED", L"WEE", L"WEF", L"WEG", L"WEH", L"WEI", L"WEJ", L"WEK", L"WEL", L"WEM", L"WEN", L"WEO", L"WEP", L"WEQ", L"WER", L"WES", L"WET", L"WEU", L"WEV", L"WEW", L"WEX", L"WEY", L"WEZ", L"WFA", L"WFB", L"WFC", L"WFD", L"WFE", L"WFF", L"WFG", L"WFH", L"WFI", L"WFJ", L"WFK", L"WFL", L"WFM", L"WFN", L"WFO", L"WFP", L"WFQ", L"WFR", L"WFS", L"WFT", L"WFU", L"WFV", L"WFW", L"WFX", L"WFY", L"WFZ", L"WGA", L"WGB", L"WGC", L"WGD", L"WGE", L"WGF", L"WGG", L"WGH", L"WGI", L"WGJ", L"WGK", L"WGL", L"WGM", L"WGN", L"WGO", L"WGP", L"WGQ", L"WGR", L"WGS", L"WGT", L"WGU", L"WGV", L"WGW", L"WGX", L"WGY", L"WGZ", L"WHA", L"WHB", L"WHC", L"WHD", L"WHE", L"WHF", L"WHG", L"WHH", L"WHI", L"WHJ", L"WHK", L"WHL", L"WHM", L"WHN", L"WHO", L"WHP", L"WHQ", L"WHR", L"WHS", L"WHT", L"WHU", L"WHV", L"WHW", L"WHX", L"WHY", L"WHZ", L"WIA", L"WIB", L"WIC", L"WID", L"WIE", L"WIF", L"WIG", L"WIH", L"WII", L"WIJ", L"WIK", L"WIL", L"WIM", L"WIN", L"WIO", L"WIP", L"WIQ", L"WIR", L"WIS", L"WIT", L"WIU", L"WIV", L"WIW", L"WIX", L"WIY", L"WIZ", L"WJA", L"WJB", L"WJC", L"WJD", L"WJE", L"WJF", L"WJG", L"WJH", L"WJI", L"WJJ", L"WJK", L"WJL", L"WJM", L"WJN", L"WJO", L"WJP", L"WJQ", L"WJR", L"WJS", L"WJT", L"WJU", L"WJV", L"WJW", L"WJX", L"WJY", L"WJZ", L"WKA", L"WKB", L"WKC", L"WKD", L"WKE", L"WKF", L"WKG", L"WKH", L"WKI", L"WKJ", L"WKK", L"WKL", L"WKM", L"WKN", L"WKO", L"WKP", L"WKQ", L"WKR", L"WKS", L"WKT", L"WKU", L"WKV", L"WKW", L"WKX", L"WKY", L"WKZ", L"WLA", L"WLB", L"WLC", L"WLD", L"WLE", L"WLF", L"WLG", L"WLH", L"WLI", L"WLJ", L"WLK", L"WLL", L"WLM", - L"WLN", L"WLO", L"WLP", L"WLQ", L"WLR", L"WLS", L"WLT", L"WLU", L"WLV", L"WLW", L"WLX", L"WLY", L"WLZ", L"WMA", L"WMB", L"WMC", L"WMD", L"WME", L"WMF", L"WMG", L"WMH", L"WMI", L"WMJ", L"WMK", L"WML", L"WMM", L"WMN", L"WMO", L"WMP", L"WMQ", L"WMR", L"WMS", L"WMT", L"WMU", L"WMV", L"WMW", L"WMX", L"WMY", L"WMZ", L"WNA", L"WNB", L"WNC", L"WND", L"WNE", L"WNF", L"WNG", L"WNH", L"WNI", L"WNJ", L"WNK", L"WNL", L"WNM", L"WNN", L"WNO", L"WNP", L"WNQ", L"WNR", L"WNS", L"WNT", L"WNU", L"WNV", L"WNW", L"WNX", L"WNY", L"WNZ", L"WOA", L"WOB", L"WOC", L"WOD", L"WOE", L"WOF", L"WOG", L"WOH", L"WOI", L"WOJ", L"WOK", L"WOL", L"WOM", L"WON", L"WOO", L"WOP", L"WOQ", L"WOR", L"WOS", L"WOT", L"WOU", L"WOV", L"WOW", L"WOX", L"WOY", L"WOZ", L"WPA", L"WPB", L"WPC", L"WPD", L"WPE", L"WPF", L"WPG", L"WPH", L"WPI", L"WPJ", L"WPK", L"WPL", L"WPM", L"WPN", L"WPO", L"WPP", L"WPQ", L"WPR", L"WPS", L"WPT", L"WPU", L"WPV", L"WPW", L"WPX", L"WPY", L"WPZ", L"WQA", L"WQB", L"WQC", L"WQD", L"WQE", L"WQF", L"WQG", L"WQH", L"WQI", L"WQJ", L"WQK", L"WQL", L"WQM", L"WQN", L"WQO", L"WQP", L"WQQ", L"WQR", L"WQS", L"WQT", L"WQU", L"WQV", L"WQW", L"WQX", L"WQY", L"WQZ", L"WRA", L"WRB", L"WRC", L"WRD", L"WRE", L"WRF", L"WRG", L"WRH", L"WRI", L"WRJ", L"WRK", L"WRL", L"WRM", L"WRN", L"WRO", L"WRP", L"WRQ", L"WRR", L"WRS", L"WRT", L"WRU", L"WRV", L"WRW", L"WRX", L"WRY", L"WRZ", L"WSA", L"WSB", L"WSC", L"WSD", L"WSE", L"WSF", L"WSG", L"WSH", L"WSI", L"WSJ", L"WSK", L"WSL", L"WSM", L"WSN", L"WSO", L"WSP", L"WSQ", L"WSR", L"WSS", L"WST", L"WSU", L"WSV", L"WSW", L"WSX", L"WSY", L"WSZ", L"WTA", L"WTB", L"WTC", L"WTD", L"WTE", L"WTF", L"WTG", L"WTH", L"WTI", L"WTJ", L"WTK", L"WTL", L"WTM", L"WTN", L"WTO", L"WTP", L"WTQ", L"WTR", L"WTS", L"WTT", L"WTU", L"WTV", L"WTW", L"WTX", L"WTY", L"WTZ", L"WUA", L"WUB", L"WUC", L"WUD", L"WUE", L"WUF", L"WUG", L"WUH", L"WUI", L"WUJ", L"WUK", L"WUL", L"WUM", L"WUN", L"WUO", L"WUP", L"WUQ", L"WUR", L"WUS", L"WUT", L"WUU", L"WUV", L"WUW", L"WUX", L"WUY", L"WUZ", L"WVA", L"WVB", L"WVC", L"WVD", L"WVE", L"WVF", L"WVG", L"WVH", L"WVI", L"WVJ", L"WVK", L"WVL", L"WVM", L"WVN", L"WVO", L"WVP", L"WVQ", L"WVR", L"WVS", L"WVT", L"WVU", L"WVV", L"WVW", L"WVX", L"WVY", L"WVZ", + L"TQA", L"TQB", L"TQC", L"TQD", L"TQE", L"TQF", L"TQG", L"TQH", L"TQI", L"TQJ", L"TQK", L"TQL", L"TQM", L"TQN", L"TQO", L"TQP", L"TQQ", L"TQR", L"TQS", L"TQT", L"TQU", L"TQV", L"TQW", L"TQX", L"TQY", L"TQZ", L"TRA", L"TRB", L"TRC", L"TRD", L"TRE", L"TRF", L"TRG", L"TRH", L"TRI", L"TRJ", L"TRK", L"TRL", L"TRM", L"TRN", L"TRO", L"TRP", L"TRQ", L"TRR", L"TRS", L"TRT", L"TRU", L"TRV", L"TRW", L"TRX", L"TRY", L"TRZ", L"TSA", L"TSB", L"TSC", L"TSD", L"TSE", L"TSF", L"TSG", L"TSH", L"TSI", L"TSJ", L"TSK", L"TSL", L"TSM", L"TSN", L"TSO", L"TSP", L"TSQ", L"TSR", L"TSS", L"TST", L"TSU", L"TSV", L"TSW", L"TSX", L"TSY", L"TSZ", L"TTA", L"TTB", L"TTC", L"TTD", L"TTE", L"TTF", L"TTG", L"TTH", L"TTI", L"TTJ", L"TTK", L"TTL", L"TTM", L"TTN", L"TTO", L"TTP", L"TTQ", L"TTR", L"TTS", L"TTT", L"TTU", L"TTV", L"TTW", L"TTX", L"TTY", L"TTZ", L"TUA", L"TUB", L"TUC", L"TUD", L"TUE", L"TUF", L"TUG", L"TUH", L"TUI", L"TUJ", L"TUK", L"TUL", L"TUM", L"TUN", L"TUO", L"TUP", L"TUQ", L"TUR", L"TUS", L"TUT", L"TUU", L"TUV", L"TUW", L"TUX", L"TUY", L"TUZ", L"TVA", L"TVB", L"TVC", L"TVD", L"TVE", L"TVF", L"TVG", L"TVH", L"TVI", L"TVJ", L"TVK", L"TVL", L"TVM", L"TVN", L"TVO", L"TVP", L"TVQ", L"TVR", L"TVS", L"TVT", L"TVU", L"TVV", L"TVW", L"TVX", L"TVY", L"TVZ", L"TWA", L"TWB", L"TWC", L"TWD", L"TWE", L"TWF", L"TWG", L"TWH", L"TWI", L"TWJ", L"TWK", L"TWL", L"TWM", L"TWN", L"TWO", L"TWP", L"TWQ", L"TWR", L"TWS", L"TWT", L"TWU", L"TWV", L"TWW", L"TWX", L"TWY", L"TWZ", L"TXA", L"TXB", L"TXC", L"TXD", L"TXE", L"TXF", L"TXG", L"TXH", L"TXI", L"TXJ", L"TXK", L"TXL", L"TXM", L"TXN", L"TXO", L"TXP", L"TXQ", L"TXR", L"TXS", L"TXT", L"TXU", L"TXV", L"TXW", L"TXX", L"TXY", L"TXZ", L"TYA", L"TYB", L"TYC", L"TYD", L"TYE", L"TYF", L"TYG", L"TYH", L"TYI", L"TYJ", L"TYK", L"TYL", L"TYM", L"TYN", L"TYO", L"TYP", L"TYQ", L"TYR", L"TYS", L"TYT", L"TYU", L"TYV", L"TYW", L"TYX", L"TYY", L"TYZ", L"TZA", L"TZB", L"TZC", L"TZD", L"TZE", L"TZF", L"TZG", L"TZH", L"TZI", L"TZJ", L"TZK", L"TZL", L"TZM", L"TZN", L"TZO", L"TZP", L"TZQ", L"TZR", L"TZS", L"TZT", L"TZU", L"TZV", L"TZW", L"TZX", L"TZY", L"TZZ", L"UAA", L"UAB", L"UAC", L"UAD", L"UAE", L"UAF", L"UAG", L"UAH", L"UAI", L"UAJ", L"UAK", L"UAL", L"UAM", + L"UAN", L"UAO", L"UAP", L"UAQ", L"UAR", L"UAS", L"UAT", L"UAU", L"UAV", L"UAW", L"UAX", L"UAY", L"UAZ", L"UBA", L"UBB", L"UBC", L"UBD", L"UBE", L"UBF", L"UBG", L"UBH", L"UBI", L"UBJ", L"UBK", L"UBL", L"UBM", L"UBN", L"UBO", L"UBP", L"UBQ", L"UBR", L"UBS", L"UBT", L"UBU", L"UBV", L"UBW", L"UBX", L"UBY", L"UBZ", L"UCA", L"UCB", L"UCC", L"UCD", L"UCE", L"UCF", L"UCG", L"UCH", L"UCI", L"UCJ", L"UCK", L"UCL", L"UCM", L"UCN", L"UCO", L"UCP", L"UCQ", L"UCR", L"UCS", L"UCT", L"UCU", L"UCV", L"UCW", L"UCX", L"UCY", L"UCZ", L"UDA", L"UDB", L"UDC", L"UDD", L"UDE", L"UDF", L"UDG", L"UDH", L"UDI", L"UDJ", L"UDK", L"UDL", L"UDM", L"UDN", L"UDO", L"UDP", L"UDQ", L"UDR", L"UDS", L"UDT", L"UDU", L"UDV", L"UDW", L"UDX", L"UDY", L"UDZ", L"UEA", L"UEB", L"UEC", L"UED", L"UEE", L"UEF", L"UEG", L"UEH", L"UEI", L"UEJ", L"UEK", L"UEL", L"UEM", L"UEN", L"UEO", L"UEP", L"UEQ", L"UER", L"UES", L"UET", L"UEU", L"UEV", L"UEW", L"UEX", L"UEY", L"UEZ", L"UFA", L"UFB", L"UFC", L"UFD", L"UFE", L"UFF", L"UFG", L"UFH", L"UFI", L"UFJ", L"UFK", L"UFL", L"UFM", L"UFN", L"UFO", L"UFP", L"UFQ", L"UFR", L"UFS", L"UFT", L"UFU", L"UFV", L"UFW", L"UFX", L"UFY", L"UFZ", L"UGA", L"UGB", L"UGC", L"UGD", L"UGE", L"UGF", L"UGG", L"UGH", L"UGI", L"UGJ", L"UGK", L"UGL", L"UGM", L"UGN", L"UGO", L"UGP", L"UGQ", L"UGR", L"UGS", L"UGT", L"UGU", L"UGV", L"UGW", L"UGX", L"UGY", L"UGZ", L"UHA", L"UHB", L"UHC", L"UHD", L"UHE", L"UHF", L"UHG", L"UHH", L"UHI", L"UHJ", L"UHK", L"UHL", L"UHM", L"UHN", L"UHO", L"UHP", L"UHQ", L"UHR", L"UHS", L"UHT", L"UHU", L"UHV", L"UHW", L"UHX", L"UHY", L"UHZ", L"UIA", L"UIB", L"UIC", L"UID", L"UIE", L"UIF", L"UIG", L"UIH", L"UII", L"UIJ", L"UIK", L"UIL", L"UIM", L"UIN", L"UIO", L"UIP", L"UIQ", L"UIR", L"UIS", L"UIT", L"UIU", L"UIV", L"UIW", L"UIX", L"UIY", L"UIZ", L"UJA", L"UJB", L"UJC", L"UJD", L"UJE", L"UJF", L"UJG", L"UJH", L"UJI", L"UJJ", L"UJK", L"UJL", L"UJM", L"UJN", L"UJO", L"UJP", L"UJQ", L"UJR", L"UJS", L"UJT", L"UJU", L"UJV", L"UJW", L"UJX", L"UJY", L"UJZ", L"UKA", L"UKB", L"UKC", L"UKD", L"UKE", L"UKF", L"UKG", L"UKH", L"UKI", L"UKJ", L"UKK", L"UKL", L"UKM", L"UKN", L"UKO", L"UKP", L"UKQ", L"UKR", L"UKS", L"UKT", L"UKU", L"UKV", L"UKW", L"UKX", L"UKY", L"UKZ", + L"ULA", L"ULB", L"ULC", L"ULD", L"ULE", L"ULF", L"ULG", L"ULH", L"ULI", L"ULJ", L"ULK", L"ULL", L"ULM", L"ULN", L"ULO", L"ULP", L"ULQ", L"ULR", L"ULS", L"ULT", L"ULU", L"ULV", L"ULW", L"ULX", L"ULY", L"ULZ", L"UMA", L"UMB", L"UMC", L"UMD", L"UME", L"UMF", L"UMG", L"UMH", L"UMI", L"UMJ", L"UMK", L"UML", L"UMM", L"UMN", L"UMO", L"UMP", L"UMQ", L"UMR", L"UMS", L"UMT", L"UMU", L"UMV", L"UMW", L"UMX", L"UMY", L"UMZ", L"UNA", L"UNB", L"UNC", L"UND", L"UNE", L"UNF", L"UNG", L"UNH", L"UNI", L"UNJ", L"UNK", L"UNL", L"UNM", L"UNN", L"UNO", L"UNP", L"UNQ", L"UNR", L"UNS", L"UNT", L"UNU", L"UNV", L"UNW", L"UNX", L"UNY", L"UNZ", L"UOA", L"UOB", L"UOC", L"UOD", L"UOE", L"UOF", L"UOG", L"UOH", L"UOI", L"UOJ", L"UOK", L"UOL", L"UOM", L"UON", L"UOO", L"UOP", L"UOQ", L"UOR", L"UOS", L"UOT", L"UOU", L"UOV", L"UOW", L"UOX", L"UOY", L"UOZ", L"UPA", L"UPB", L"UPC", L"UPD", L"UPE", L"UPF", L"UPG", L"UPH", L"UPI", L"UPJ", L"UPK", L"UPL", L"UPM", L"UPN", L"UPO", L"UPP", L"UPQ", L"UPR", L"UPS", L"UPT", L"UPU", L"UPV", L"UPW", L"UPX", L"UPY", L"UPZ", L"UQA", L"UQB", L"UQC", L"UQD", L"UQE", L"UQF", L"UQG", L"UQH", L"UQI", L"UQJ", L"UQK", L"UQL", L"UQM", L"UQN", L"UQO", L"UQP", L"UQQ", L"UQR", L"UQS", L"UQT", L"UQU", L"UQV", L"UQW", L"UQX", L"UQY", L"UQZ", L"URA", L"URB", L"URC", L"URD", L"URE", L"URF", L"URG", L"URH", L"URI", L"URJ", L"URK", L"URL", L"URM", L"URN", L"URO", L"URP", L"URQ", L"URR", L"URS", L"URT", L"URU", L"URV", L"URW", L"URX", L"URY", L"URZ", L"USA", L"USB", L"USC", L"USD", L"USE", L"USF", L"USG", L"USH", L"USI", L"USJ", L"USK", L"USL", L"USM", L"USN", L"USO", L"USP", L"USQ", L"USR", L"USS", L"UST", L"USU", L"USV", L"USW", L"USX", L"USY", L"USZ", L"UTA", L"UTB", L"UTC", L"UTD", L"UTE", L"UTF", L"UTG", L"UTH", L"UTI", L"UTJ", L"UTK", L"UTL", L"UTM", L"UTN", L"UTO", L"UTP", L"UTQ", L"UTR", L"UTS", L"UTT", L"UTU", L"UTV", L"UTW", L"UTX", L"UTY", L"UTZ", L"UUA", L"UUB", L"UUC", L"UUD", L"UUE", L"UUF", L"UUG", L"UUH", L"UUI", L"UUJ", L"UUK", L"UUL", L"UUM", L"UUN", L"UUO", L"UUP", L"UUQ", L"UUR", L"UUS", L"UUT", L"UUU", L"UUV", L"UUW", L"UUX", L"UUY", L"UUZ", L"UVA", L"UVB", L"UVC", L"UVD", L"UVE", L"UVF", L"UVG", L"UVH", L"UVI", L"UVJ", L"UVK", L"UVL", L"UVM", + L"UVN", L"UVO", L"UVP", L"UVQ", L"UVR", L"UVS", L"UVT", L"UVU", L"UVV", L"UVW", L"UVX", L"UVY", L"UVZ", L"UWA", L"UWB", L"UWC", L"UWD", L"UWE", L"UWF", L"UWG", L"UWH", L"UWI", L"UWJ", L"UWK", L"UWL", L"UWM", L"UWN", L"UWO", L"UWP", L"UWQ", L"UWR", L"UWS", L"UWT", L"UWU", L"UWV", L"UWW", L"UWX", L"UWY", L"UWZ", L"UXA", L"UXB", L"UXC", L"UXD", L"UXE", L"UXF", L"UXG", L"UXH", L"UXI", L"UXJ", L"UXK", L"UXL", L"UXM", L"UXN", L"UXO", L"UXP", L"UXQ", L"UXR", L"UXS", L"UXT", L"UXU", L"UXV", L"UXW", L"UXX", L"UXY", L"UXZ", L"UYA", L"UYB", L"UYC", L"UYD", L"UYE", L"UYF", L"UYG", L"UYH", L"UYI", L"UYJ", L"UYK", L"UYL", L"UYM", L"UYN", L"UYO", L"UYP", L"UYQ", L"UYR", L"UYS", L"UYT", L"UYU", L"UYV", L"UYW", L"UYX", L"UYY", L"UYZ", L"UZA", L"UZB", L"UZC", L"UZD", L"UZE", L"UZF", L"UZG", L"UZH", L"UZI", L"UZJ", L"UZK", L"UZL", L"UZM", L"UZN", L"UZO", L"UZP", L"UZQ", L"UZR", L"UZS", L"UZT", L"UZU", L"UZV", L"UZW", L"UZX", L"UZY", L"UZZ", L"VAA", L"VAB", L"VAC", L"VAD", L"VAE", L"VAF", L"VAG", L"VAH", L"VAI", L"VAJ", L"VAK", L"VAL", L"VAM", L"VAN", L"VAO", L"VAP", L"VAQ", L"VAR", L"VAS", L"VAT", L"VAU", L"VAV", L"VAW", L"VAX", L"VAY", L"VAZ", L"VBA", L"VBB", L"VBC", L"VBD", L"VBE", L"VBF", L"VBG", L"VBH", L"VBI", L"VBJ", L"VBK", L"VBL", L"VBM", L"VBN", L"VBO", L"VBP", L"VBQ", L"VBR", L"VBS", L"VBT", L"VBU", L"VBV", L"VBW", L"VBX", L"VBY", L"VBZ", L"VCA", L"VCB", L"VCC", L"VCD", L"VCE", L"VCF", L"VCG", L"VCH", L"VCI", L"VCJ", L"VCK", L"VCL", L"VCM", L"VCN", L"VCO", L"VCP", L"VCQ", L"VCR", L"VCS", L"VCT", L"VCU", L"VCV", L"VCW", L"VCX", L"VCY", L"VCZ", L"VDA", L"VDB", L"VDC", L"VDD", L"VDE", L"VDF", L"VDG", L"VDH", L"VDI", L"VDJ", L"VDK", L"VDL", L"VDM", L"VDN", L"VDO", L"VDP", L"VDQ", L"VDR", L"VDS", L"VDT", L"VDU", L"VDV", L"VDW", L"VDX", L"VDY", L"VDZ", L"VEA", L"VEB", L"VEC", L"VED", L"VEE", L"VEF", L"VEG", L"VEH", L"VEI", L"VEJ", L"VEK", L"VEL", L"VEM", L"VEN", L"VEO", L"VEP", L"VEQ", L"VER", L"VES", L"VET", L"VEU", L"VEV", L"VEW", L"VEX", L"VEY", L"VEZ", L"VFA", L"VFB", L"VFC", L"VFD", L"VFE", L"VFF", L"VFG", L"VFH", L"VFI", L"VFJ", L"VFK", L"VFL", L"VFM", L"VFN", L"VFO", L"VFP", L"VFQ", L"VFR", L"VFS", L"VFT", L"VFU", L"VFV", L"VFW", L"VFX", L"VFY", L"VFZ", + L"VGA", L"VGB", L"VGC", L"VGD", L"VGE", L"VGF", L"VGG", L"VGH", L"VGI", L"VGJ", L"VGK", L"VGL", L"VGM", L"VGN", L"VGO", L"VGP", L"VGQ", L"VGR", L"VGS", L"VGT", L"VGU", L"VGV", L"VGW", L"VGX", L"VGY", L"VGZ", L"VHA", L"VHB", L"VHC", L"VHD", L"VHE", L"VHF", L"VHG", L"VHH", L"VHI", L"VHJ", L"VHK", L"VHL", L"VHM", L"VHN", L"VHO", L"VHP", L"VHQ", L"VHR", L"VHS", L"VHT", L"VHU", L"VHV", L"VHW", L"VHX", L"VHY", L"VHZ", L"VIA", L"VIB", L"VIC", L"VID", L"VIE", L"VIF", L"VIG", L"VIH", L"VII", L"VIJ", L"VIK", L"VIL", L"VIM", L"VIN", L"VIO", L"VIP", L"VIQ", L"VIR", L"VIS", L"VIT", L"VIU", L"VIV", L"VIW", L"VIX", L"VIY", L"VIZ", L"VJA", L"VJB", L"VJC", L"VJD", L"VJE", L"VJF", L"VJG", L"VJH", L"VJI", L"VJJ", L"VJK", L"VJL", L"VJM", L"VJN", L"VJO", L"VJP", L"VJQ", L"VJR", L"VJS", L"VJT", L"VJU", L"VJV", L"VJW", L"VJX", L"VJY", L"VJZ", L"VKA", L"VKB", L"VKC", L"VKD", L"VKE", L"VKF", L"VKG", L"VKH", L"VKI", L"VKJ", L"VKK", L"VKL", L"VKM", L"VKN", L"VKO", L"VKP", L"VKQ", L"VKR", L"VKS", L"VKT", L"VKU", L"VKV", L"VKW", L"VKX", L"VKY", L"VKZ", L"VLA", L"VLB", L"VLC", L"VLD", L"VLE", L"VLF", L"VLG", L"VLH", L"VLI", L"VLJ", L"VLK", L"VLL", L"VLM", L"VLN", L"VLO", L"VLP", L"VLQ", L"VLR", L"VLS", L"VLT", L"VLU", L"VLV", L"VLW", L"VLX", L"VLY", L"VLZ", L"VMA", L"VMB", L"VMC", L"VMD", L"VME", L"VMF", L"VMG", L"VMH", L"VMI", L"VMJ", L"VMK", L"VML", L"VMM", L"VMN", L"VMO", L"VMP", L"VMQ", L"VMR", L"VMS", L"VMT", L"VMU", L"VMV", L"VMW", L"VMX", L"VMY", L"VMZ", L"VNA", L"VNB", L"VNC", L"VND", L"VNE", L"VNF", L"VNG", L"VNH", L"VNI", L"VNJ", L"VNK", L"VNL", L"VNM", L"VNN", L"VNO", L"VNP", L"VNQ", L"VNR", L"VNS", L"VNT", L"VNU", L"VNV", L"VNW", L"VNX", L"VNY", L"VNZ", L"VOA", L"VOB", L"VOC", L"VOD", L"VOE", L"VOF", L"VOG", L"VOH", L"VOI", L"VOJ", L"VOK", L"VOL", L"VOM", L"VON", L"VOO", L"VOP", L"VOQ", L"VOR", L"VOS", L"VOT", L"VOU", L"VOV", L"VOW", L"VOX", L"VOY", L"VOZ", L"VPA", L"VPB", L"VPC", L"VPD", L"VPE", L"VPF", L"VPG", L"VPH", L"VPI", L"VPJ", L"VPK", L"VPL", L"VPM", L"VPN", L"VPO", L"VPP", L"VPQ", L"VPR", L"VPS", L"VPT", L"VPU", L"VPV", L"VPW", L"VPX", L"VPY", L"VPZ", L"VQA", L"VQB", L"VQC", L"VQD", L"VQE", L"VQF", L"VQG", L"VQH", L"VQI", L"VQJ", L"VQK", L"VQL", L"VQM", + L"VQN", L"VQO", L"VQP", L"VQQ", L"VQR", L"VQS", L"VQT", L"VQU", L"VQV", L"VQW", L"VQX", L"VQY", L"VQZ", L"VRA", L"VRB", L"VRC", L"VRD", L"VRE", L"VRF", L"VRG", L"VRH", L"VRI", L"VRJ", L"VRK", L"VRL", L"VRM", L"VRN", L"VRO", L"VRP", L"VRQ", L"VRR", L"VRS", L"VRT", L"VRU", L"VRV", L"VRW", L"VRX", L"VRY", L"VRZ", L"VSA", L"VSB", L"VSC", L"VSD", L"VSE", L"VSF", L"VSG", L"VSH", L"VSI", L"VSJ", L"VSK", L"VSL", L"VSM", L"VSN", L"VSO", L"VSP", L"VSQ", L"VSR", L"VSS", L"VST", L"VSU", L"VSV", L"VSW", L"VSX", L"VSY", L"VSZ", L"VTA", L"VTB", L"VTC", L"VTD", L"VTE", L"VTF", L"VTG", L"VTH", L"VTI", L"VTJ", L"VTK", L"VTL", L"VTM", L"VTN", L"VTO", L"VTP", L"VTQ", L"VTR", L"VTS", L"VTT", L"VTU", L"VTV", L"VTW", L"VTX", L"VTY", L"VTZ", L"VUA", L"VUB", L"VUC", L"VUD", L"VUE", L"VUF", L"VUG", L"VUH", L"VUI", L"VUJ", L"VUK", L"VUL", L"VUM", L"VUN", L"VUO", L"VUP", L"VUQ", L"VUR", L"VUS", L"VUT", L"VUU", L"VUV", L"VUW", L"VUX", L"VUY", L"VUZ", L"VVA", L"VVB", L"VVC", L"VVD", L"VVE", L"VVF", L"VVG", L"VVH", L"VVI", L"VVJ", L"VVK", L"VVL", L"VVM", L"VVN", L"VVO", L"VVP", L"VVQ", L"VVR", L"VVS", L"VVT", L"VVU", L"VVV", L"VVW", L"VVX", L"VVY", L"VVZ", L"VWA", L"VWB", L"VWC", L"VWD", L"VWE", L"VWF", L"VWG", L"VWH", L"VWI", L"VWJ", L"VWK", L"VWL", L"VWM", L"VWN", L"VWO", L"VWP", L"VWQ", L"VWR", L"VWS", L"VWT", L"VWU", L"VWV", L"VWW", L"VWX", L"VWY", L"VWZ", L"VXA", L"VXB", L"VXC", L"VXD", L"VXE", L"VXF", L"VXG", L"VXH", L"VXI", L"VXJ", L"VXK", L"VXL", L"VXM", L"VXN", L"VXO", L"VXP", L"VXQ", L"VXR", L"VXS", L"VXT", L"VXU", L"VXV", L"VXW", L"VXX", L"VXY", L"VXZ", L"VYA", L"VYB", L"VYC", L"VYD", L"VYE", L"VYF", L"VYG", L"VYH", L"VYI", L"VYJ", L"VYK", L"VYL", L"VYM", L"VYN", L"VYO", L"VYP", L"VYQ", L"VYR", L"VYS", L"VYT", L"VYU", L"VYV", L"VYW", L"VYX", L"VYY", L"VYZ", L"VZA", L"VZB", L"VZC", L"VZD", L"VZE", L"VZF", L"VZG", L"VZH", L"VZI", L"VZJ", L"VZK", L"VZL", L"VZM", L"VZN", L"VZO", L"VZP", L"VZQ", L"VZR", L"VZS", L"VZT", L"VZU", L"VZV", L"VZW", L"VZX", L"VZY", L"VZZ", L"WAA", L"WAB", L"WAC", L"WAD", L"WAE", L"WAF", L"WAG", L"WAH", L"WAI", L"WAJ", L"WAK", L"WAL", L"WAM", L"WAN", L"WAO", L"WAP", L"WAQ", L"WAR", L"WAS", L"WAT", L"WAU", L"WAV", L"WAW", L"WAX", L"WAY", L"WAZ", + L"WBA", L"WBB", L"WBC", L"WBD", L"WBE", L"WBF", L"WBG", L"WBH", L"WBI", L"WBJ", L"WBK", L"WBL", L"WBM", L"WBN", L"WBO", L"WBP", L"WBQ", L"WBR", L"WBS", L"WBT", L"WBU", L"WBV", L"WBW", L"WBX", L"WBY", L"WBZ", L"WCA", L"WCB", L"WCC", L"WCD", L"WCE", L"WCF", L"WCG", L"WCH", L"WCI", L"WCJ", L"WCK", L"WCL", L"WCM", L"WCN", L"WCO", L"WCP", L"WCQ", L"WCR", L"WCS", L"WCT", L"WCU", L"WCV", L"WCW", L"WCX", L"WCY", L"WCZ", L"WDA", L"WDB", L"WDC", L"WDD", L"WDE", L"WDF", L"WDG", L"WDH", L"WDI", L"WDJ", L"WDK", L"WDL", L"WDM", L"WDN", L"WDO", L"WDP", L"WDQ", L"WDR", L"WDS", L"WDT", L"WDU", L"WDV", L"WDW", L"WDX", L"WDY", L"WDZ", L"WEA", L"WEB", L"WEC", L"WED", L"WEE", L"WEF", L"WEG", L"WEH", L"WEI", L"WEJ", L"WEK", L"WEL", L"WEM", L"WEN", L"WEO", L"WEP", L"WEQ", L"WER", L"WES", L"WET", L"WEU", L"WEV", L"WEW", L"WEX", L"WEY", L"WEZ", L"WFA", L"WFB", L"WFC", L"WFD", L"WFE", L"WFF", L"WFG", L"WFH", L"WFI", L"WFJ", L"WFK", L"WFL", L"WFM", L"WFN", L"WFO", L"WFP", L"WFQ", L"WFR", L"WFS", L"WFT", L"WFU", L"WFV", L"WFW", L"WFX", L"WFY", L"WFZ", L"WGA", L"WGB", L"WGC", L"WGD", L"WGE", L"WGF", L"WGG", L"WGH", L"WGI", L"WGJ", L"WGK", L"WGL", L"WGM", L"WGN", L"WGO", L"WGP", L"WGQ", L"WGR", L"WGS", L"WGT", L"WGU", L"WGV", L"WGW", L"WGX", L"WGY", L"WGZ", L"WHA", L"WHB", L"WHC", L"WHD", L"WHE", L"WHF", L"WHG", L"WHH", L"WHI", L"WHJ", L"WHK", L"WHL", L"WHM", L"WHN", L"WHO", L"WHP", L"WHQ", L"WHR", L"WHS", L"WHT", L"WHU", L"WHV", L"WHW", L"WHX", L"WHY", L"WHZ", L"WIA", L"WIB", L"WIC", L"WID", L"WIE", L"WIF", L"WIG", L"WIH", L"WII", L"WIJ", L"WIK", L"WIL", L"WIM", L"WIN", L"WIO", L"WIP", L"WIQ", L"WIR", L"WIS", L"WIT", L"WIU", L"WIV", L"WIW", L"WIX", L"WIY", L"WIZ", L"WJA", L"WJB", L"WJC", L"WJD", L"WJE", L"WJF", L"WJG", L"WJH", L"WJI", L"WJJ", L"WJK", L"WJL", L"WJM", L"WJN", L"WJO", L"WJP", L"WJQ", L"WJR", L"WJS", L"WJT", L"WJU", L"WJV", L"WJW", L"WJX", L"WJY", L"WJZ", L"WKA", L"WKB", L"WKC", L"WKD", L"WKE", L"WKF", L"WKG", L"WKH", L"WKI", L"WKJ", L"WKK", L"WKL", L"WKM", L"WKN", L"WKO", L"WKP", L"WKQ", L"WKR", L"WKS", L"WKT", L"WKU", L"WKV", L"WKW", L"WKX", L"WKY", L"WKZ", L"WLA", L"WLB", L"WLC", L"WLD", L"WLE", L"WLF", L"WLG", L"WLH", L"WLI", L"WLJ", L"WLK", L"WLL", L"WLM", + L"WLN", L"WLO", L"WLP", L"WLQ", L"WLR", L"WLS", L"WLT", L"WLU", L"WLV", L"WLW", L"WLX", L"WLY", L"WLZ", L"WMA", L"WMB", L"WMC", L"WMD", L"WME", L"WMF", L"WMG", L"WMH", L"WMI", L"WMJ", L"WMK", L"WML", L"WMM", L"WMN", L"WMO", L"WMP", L"WMQ", L"WMR", L"WMS", L"WMT", L"WMU", L"WMV", L"WMW", L"WMX", L"WMY", L"WMZ", L"WNA", L"WNB", L"WNC", L"WND", L"WNE", L"WNF", L"WNG", L"WNH", L"WNI", L"WNJ", L"WNK", L"WNL", L"WNM", L"WNN", L"WNO", L"WNP", L"WNQ", L"WNR", L"WNS", L"WNT", L"WNU", L"WNV", L"WNW", L"WNX", L"WNY", L"WNZ", L"WOA", L"WOB", L"WOC", L"WOD", L"WOE", L"WOF", L"WOG", L"WOH", L"WOI", L"WOJ", L"WOK", L"WOL", L"WOM", L"WON", L"WOO", L"WOP", L"WOQ", L"WOR", L"WOS", L"WOT", L"WOU", L"WOV", L"WOW", L"WOX", L"WOY", L"WOZ", L"WPA", L"WPB", L"WPC", L"WPD", L"WPE", L"WPF", L"WPG", L"WPH", L"WPI", L"WPJ", L"WPK", L"WPL", L"WPM", L"WPN", L"WPO", L"WPP", L"WPQ", L"WPR", L"WPS", L"WPT", L"WPU", L"WPV", L"WPW", L"WPX", L"WPY", L"WPZ", L"WQA", L"WQB", L"WQC", L"WQD", L"WQE", L"WQF", L"WQG", L"WQH", L"WQI", L"WQJ", L"WQK", L"WQL", L"WQM", L"WQN", L"WQO", L"WQP", L"WQQ", L"WQR", L"WQS", L"WQT", L"WQU", L"WQV", L"WQW", L"WQX", L"WQY", L"WQZ", L"WRA", L"WRB", L"WRC", L"WRD", L"WRE", L"WRF", L"WRG", L"WRH", L"WRI", L"WRJ", L"WRK", L"WRL", L"WRM", L"WRN", L"WRO", L"WRP", L"WRQ", L"WRR", L"WRS", L"WRT", L"WRU", L"WRV", L"WRW", L"WRX", L"WRY", L"WRZ", L"WSA", L"WSB", L"WSC", L"WSD", L"WSE", L"WSF", L"WSG", L"WSH", L"WSI", L"WSJ", L"WSK", L"WSL", L"WSM", L"WSN", L"WSO", L"WSP", L"WSQ", L"WSR", L"WSS", L"WST", L"WSU", L"WSV", L"WSW", L"WSX", L"WSY", L"WSZ", L"WTA", L"WTB", L"WTC", L"WTD", L"WTE", L"WTF", L"WTG", L"WTH", L"WTI", L"WTJ", L"WTK", L"WTL", L"WTM", L"WTN", L"WTO", L"WTP", L"WTQ", L"WTR", L"WTS", L"WTT", L"WTU", L"WTV", L"WTW", L"WTX", L"WTY", L"WTZ", L"WUA", L"WUB", L"WUC", L"WUD", L"WUE", L"WUF", L"WUG", L"WUH", L"WUI", L"WUJ", L"WUK", L"WUL", L"WUM", L"WUN", L"WUO", L"WUP", L"WUQ", L"WUR", L"WUS", L"WUT", L"WUU", L"WUV", L"WUW", L"WUX", L"WUY", L"WUZ", L"WVA", L"WVB", L"WVC", L"WVD", L"WVE", L"WVF", L"WVG", L"WVH", L"WVI", L"WVJ", L"WVK", L"WVL", L"WVM", L"WVN", L"WVO", L"WVP", L"WVQ", L"WVR", L"WVS", L"WVT", L"WVU", L"WVV", L"WVW", L"WVX", L"WVY", L"WVZ", L"WWA", L"WWB", L"WWC", L"WWD", L"WWE", L"WWF", L"WWG", L"WWH", L"WWI", L"WWJ", L"WWK", L"WWL", L"WWM", L"WWN", L"WWO", L"WWP", L"WWQ", L"WWR", L"WWS", L"WWT", L"WWU", L"WWV", L"WWW", L"WWX", L"WWY", L"WWZ", L"WXA", L"WXB", L"WXC", L"WXD", L"WXE", L"WXF", L"WXG", L"WXH", L"WXI", L"WXJ", L"WXK", L"WXL", L"WXM", L"WXN", L"WXO", L"WXP", L"WXQ", L"WXR", L"WXS", L"WXT", L"WXU", L"WXV", L"WXW", L"WXX", L"WXY", L"WXZ", L"WYA", L"WYB", L"WYC", L"WYD", L"WYE", L"WYF", L"WYG", L"WYH", L"WYI", L"WYJ", L"WYK", L"WYL", L"WYM", L"WYN", L"WYO", L"WYP", L"WYQ", L"WYR", L"WYS", L"WYT", L"WYU", L"WYV", L"WYW", L"WYX", L"WYY", L"WYZ", L"WZA", L"WZB", L"WZC", L"WZD", L"WZE", L"WZF", L"WZG", L"WZH", L"WZI", L"WZJ", L"WZK", L"WZL", L"WZM", L"WZN", L"WZO", L"WZP", L"WZQ", L"WZR", L"WZS", L"WZT", L"WZU", L"WZV", L"WZW", L"WZX", L"WZY", L"WZZ", L"XAA", L"XAB", L"XAC", L"XAD", L"XAE", L"XAF", L"XAG", L"XAH", L"XAI", L"XAJ", L"XAK", L"XAL", L"XAM", L"XAN", L"XAO", L"XAP", L"XAQ", L"XAR", L"XAS", L"XAT", L"XAU", L"XAV", L"XAW", L"XAX", L"XAY", L"XAZ", L"XBA", L"XBB", L"XBC", L"XBD", L"XBE", L"XBF", L"XBG", L"XBH", L"XBI", L"XBJ", L"XBK", L"XBL", L"XBM", L"XBN", L"XBO", L"XBP", L"XBQ", L"XBR", L"XBS", L"XBT", L"XBU", L"XBV", L"XBW", L"XBX", L"XBY", L"XBZ", L"XCA", L"XCB", L"XCC", L"XCD", L"XCE", L"XCF", L"XCG", L"XCH", L"XCI", L"XCJ", L"XCK", L"XCL", L"XCM", L"XCN", L"XCO", L"XCP", L"XCQ", L"XCR", L"XCS", L"XCT", L"XCU", L"XCV", L"XCW", L"XCX", L"XCY", L"XCZ", L"XDA", L"XDB", L"XDC", L"XDD", L"XDE", L"XDF", L"XDG", L"XDH", L"XDI", L"XDJ", L"XDK", L"XDL", L"XDM", L"XDN", L"XDO", L"XDP", L"XDQ", L"XDR", L"XDS", L"XDT", L"XDU", L"XDV", L"XDW", L"XDX", L"XDY", L"XDZ", L"XEA", L"XEB", L"XEC", L"XED", L"XEE", L"XEF", L"XEG", L"XEH", L"XEI", L"XEJ", L"XEK", L"XEL", L"XEM", L"XEN", L"XEO", L"XEP", L"XEQ", L"XER", L"XES", L"XET", L"XEU", L"XEV", L"XEW", L"XEX", L"XEY", L"XEZ", L"XFA", L"XFB", L"XFC", L"XFD" }; //------------------------------------------------------------------------------ @@ -191,7 +201,7 @@ namespace OOX { boost::wregex r(L"([\\d]+)-([\\d]+)-([\\d]+)(?:T([\\d]+):([\\d]+):([\\d]+)(?:\\.([\\d]+))?)?"); boost::match_results res; - + if (boost::regex_match(Date, res, r)) { Value = 0; @@ -243,7 +253,7 @@ namespace OOX const boost::uint64_t m1 = t.total_milliseconds(); const boost::uint64_t m2 = day.total_milliseconds(); - Value += 1.0 * m1 / m2; + Value += 1.0 * m1 / m2; } return true; @@ -1021,7 +1031,7 @@ namespace OOX auto formula = dynamic_cast(obj.get()); m_sText = formula->formula.getAssembledFormula(); m_oRef.Init(); - m_oRef = formula->rfx.toString(); + m_oRef = formula->rfx.toString(); } break; case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeArray: @@ -1085,6 +1095,98 @@ namespace OOX } } + void CFormula::toBin(XLS::BaseObjectPtr& obj) + { + switch(m_oT->GetValue()) + { + case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeNormal: + { + auto formula = dynamic_cast(obj.get()); + formula->formula = m_sText; + + } + break; + case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeShared: + { + auto formula = dynamic_cast(obj.get()); + formula->formula = m_sText; + if(m_oRef.IsInit()) + formula->rfx = m_oRef.get(); + + } + break; + case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeArray: + { + auto formula = dynamic_cast(obj.get()); + formula->formula = m_sText; + for(auto i:formula->formula.rgce.sequence) + { + if(i->ptg_id.get() == 37) + { + i->ptg_id = 101; + } + if(i->ptg_id.get() == 36) + { + i->ptg_id = 100; + } + } + if(m_oAca.IsInit()) + { + formula->fAlwaysCalc = m_oAca->GetValue(); + } + if(m_oRef.IsInit()) + formula->rfx = m_oRef.get(); + + + } + break; + case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeDataTable: + { + auto dataTable = dynamic_cast(obj.get()); + + if(m_oCa.IsInit()) + { + + dataTable->fAlwaysCalc = m_oCa->GetValue(); + } + if(m_oRef.IsInit()) + { + dataTable->rfx = m_oRef.get(); + } + + if(m_oDtr.IsInit()) + { + dataTable->fRw = m_oDtr->GetValue(); + } + + if(m_oDt2D.IsInit()) + { + dataTable->fTbl2 = m_oDt2D->GetValue(); + } + + if(m_oDel1.IsInit()) + { + dataTable->fDeleted1 = m_oDel1->GetValue(); + } + + if(m_oDel2.IsInit()) + { + dataTable->fDeleted2 = m_oDel2->GetValue(); + } + + if(m_oR1.IsInit()) + { + dataTable->r1 = m_oR1.get(); + } + + if(m_oR2.IsInit()) + { + dataTable->r2 = m_oR2.get(); + } + } + break; + } + } EElementType CFormula::getType () const { return et_x_Formula; @@ -1288,18 +1390,30 @@ namespace OOX { CData data_comment; data_comment.fromXML2(oReader); - + pComment->m_oText = data_comment.m_oRichText.GetPointerEmptyNullable(); } } } + bool CCell::checkArrayCell(XLS::CellRef &cellref, const sharedFormula& ArrFmlas) + { + for(auto i:ArrFmlas.arrfmla) + { + if(i.first.inRange(cellref)) + { + cellref = i.second; + return true; + } + } + return false; + } void CCell::After2003Read() { CXlsxFlat* xlsx_flat = dynamic_cast(m_pMainDocument); if (!xlsx_flat) return; - + CWorksheet* sheet = xlsx_flat->m_arWorksheets.back(); - + std::map>::iterator pFindRow = sheet->m_oSheetData->m_mapStyleMerges2003.find(xlsx_flat->m_nLastReadRow); std::map::iterator pFind; @@ -1309,8 +1423,8 @@ namespace OOX } else { - int newCol = *iColIndex; - + int newCol = *iColIndex; + if (pFindRow != sheet->m_oSheetData->m_mapStyleMerges2003.end()) { CCell *pCurrentCell = sheet->m_oSheetData->m_arrItems.back()->m_arrItems.back(); // == this @@ -1438,7 +1552,7 @@ namespace OOX { std::map mapColsStyle; mapColsStyle.insert(std::make_pair(xlsx_flat->m_nLastReadCol, *m_oStyle)); - + sheet->m_oSheetData->m_mapStyleMerges2003.insert(std::make_pair(xlsx_flat->m_nLastReadRow + i + 1, mapColsStyle)); } else @@ -1450,13 +1564,13 @@ namespace OOX for (int i = 0; i < iAcross.get_value_or(0); ++i) { xlsx_flat->m_nLastReadCol++; - + CCell *pCell = new CCell(this->m_pMainDocument); pCell->m_oRef = getCellAddressA(xlsx_flat->m_nLastReadRow, xlsx_flat->m_nLastReadCol); pCell->m_oStyle = pFindContinues->first; pCell->m_oCol = xlsx_flat->m_nLastReadCol - 1; pCell->m_oRow = xlsx_flat->m_nLastReadRow; - + sheet->m_oSheetData->m_arrItems.back()->m_arrItems.push_back(pCell); } } @@ -1482,10 +1596,10 @@ namespace OOX void CCell::AfterRead() { CSharedStrings *pSharedStrings = NULL; - + CXlsx* xlsx = dynamic_cast(m_pMainDocument); CXlsxFlat* xlsx_flat = dynamic_cast(m_pMainDocument); - + if (xlsx) { if (false == xlsx->m_arWorksheets.back()->m_bPrepareForBinaryWriter) return; @@ -1525,7 +1639,7 @@ namespace OOX m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeSharedString); } } - else if (SimpleTypes::Spreadsheet::celltypeStr == m_oType->GetValue() || SimpleTypes::Spreadsheet::celltypeError == m_oType->GetValue()) + else if ((SimpleTypes::Spreadsheet::celltypeStr == m_oType->GetValue() || SimpleTypes::Spreadsheet::celltypeError == m_oType->GetValue()) && !m_oFormula.IsInit()) { if (m_oValue.IsInit()) { @@ -1676,9 +1790,508 @@ namespace OOX oStream.Seek(nEnd); } + XLS::BaseObjectPtr CCell::toBin(sharedFormula &sharedFormulas) + { + std::vector shared_formulas_locations_ref; + auto ptr(new XLSB::CELL(0, shared_formulas_locations_ref)); + if(m_oRow.IsInit()) + { + ptr->m_Row = m_oRow.get(); + } + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCellMetadata.IsInit() || m_oValueMetadata.IsInit()) + { + auto pCellMeta(new XLSB::CELLMETA); + ptr->m_CELLMETA = XLS::BaseObjectPtr{pCellMeta}; + if(m_oCellMetadata.IsInit()) + { + auto metadata(new XLSB::CellMeta); + pCellMeta->m_BrtCellMeta = XLS::BaseObjectPtr{metadata}; + metadata->icmb = m_oCellMetadata->GetValue(); + } + + if(m_oValueMetadata.IsInit()) + { + auto metadata(new XLSB::ValueMeta); + pCellMeta->m_BrtValueMeta = XLS::BaseObjectPtr{metadata}; + metadata->ivmb = m_oValueMetadata->GetValue(); + } + } + + XLSB::DATACELL* pDATACELL = nullptr; + XLSB::TABLECELL* pTABLECELL = nullptr; + XLSB::FMLACELL* pFMLACELL = nullptr; + XLSB::SHRFMLACELL* pSHRFMLACELL = nullptr; + BiffRecord* pSource = nullptr; + XLSB::Cell* oCell; + bool isReal = false; + _INT32 intCache = 0; + double realCache = 0; + + XLS::CellRef cellref; + if(m_oRow.IsInit() && m_oCol.IsInit()) + cellref = XLS::CellRef(m_oRow.get() -1, m_oCol.get(), 0, 0); + else if(m_oRef.IsInit()) + { + std::wstring wstringRef(m_oRef.get().begin(), m_oRef.get().end()); + cellref = XLS::CellRef(wstringRef); + } + else + cellref = XLS::CellRef(0, 0, 0, 0); + auto sourceCellRef = cellref; + + if(!sharedFormulas.arrfmla.empty()) + { + if(checkArrayCell(sourceCellRef, sharedFormulas)) + { + if(!m_oFormula.IsInit()) + { + m_oFormula.Init(); + m_oFormula->m_oT = SimpleTypes::Spreadsheet::cellformulatypeArray; + } + } + } + + if(!m_oType.IsInit()) + { + m_oType.Init(); + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeStr); + if(m_oValue.IsInit()) + { + if(m_oValue->m_sText == L"TRUE" || m_oValue->m_sText == L"FALSE") + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeBool); + else if(std::all_of(m_oValue->m_sText.begin(), m_oValue->m_sText.end(), [](const char c) { return std::isdigit(c); }) && m_oValue->m_sText.size() <= 10) + { + if(m_oValue->m_sText.size() < 10) + { + intCache = std::stoi(m_oValue->m_sText); + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + } + else if(m_oValue->m_sText.size() == 10) + { + _INT64 tempVal = std::stoll(m_oValue->m_sText); + if(tempVal < MAXINT32 && tempVal > MININT32) + { + intCache = tempVal; + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + } + } + } + + if((m_oValue->m_sText.find(L".") == std::string::npos || m_oValue->m_sText.find(L".") == m_oValue->m_sText.rfind(L".")) + && m_oValue->m_sText.size() <=17) + { + if(m_oValue->m_sText.size() < 17) + { + wchar_t *tail; + double tempVal = std::wcstod(m_oValue->m_sText.c_str(), &tail); + if(*tail == L'\0') + { + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + isReal = true; + realCache = tempVal; + } + } + else + { + wchar_t *tail; + long double tempVal = std::wcstold(m_oValue->m_sText.c_str(), &tail); + if(*tail == L'\0') + if(tempVal <= DBL_MAX && tempVal >= DBL_MIN) + { + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + realCache = tempVal; + isReal = true; + } + } + } + else if((m_oValue->m_sText.find(L"E") == std::string::npos || m_oValue->m_sText.find(L"E") == m_oValue->m_sText.rfind(L"E"))) + { + wchar_t *tail; + long double tempVal = std::wcstold(m_oValue->m_sText.c_str(), &tail); + if(*tail == L'\0') + if(tempVal <= DBL_MAX) + { + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + realCache = tempVal; + isReal = true; + } + } + + } + } + switch (m_oType->GetValue()) + { + case SimpleTypes::Spreadsheet::celltypeNumber: + { + if(!isReal) + { + if(!m_oFormula.IsInit()) + { + auto pCellRk = new(XLSB::CellRk); + pCellRk->value.fInt = 1; + pCellRk->value.fX100 = 0; + pCellRk->value.num = intCache; + oCell = &pCellRk->cell; + pSource = pCellRk; + } + else + { + auto pCellRk = new(XLSB::FmlaNum); + + pCellRk->value.data.value = intCache; + oCell = &pCellRk->cell; + pSource = pCellRk; + } + + + + } + else if(isReal) + { + if(!m_oFormula.IsInit()) + { + auto pCellReal = new(XLSB::CellReal); + + pCellReal->value.data.value = realCache; + + oCell = &pCellReal->cell; + pSource = pCellReal; + } + else + { + auto pCellRk = new(XLSB::FmlaNum); + + pCellRk->value.data.value = realCache; + oCell = &pCellRk->cell; + pSource = pCellRk; + } + } + } + break; + case SimpleTypes::Spreadsheet::celltypeError: + { + if (m_oValue->m_sText == L"#NULL!") + { if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x00; + oCell = &error->cell; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x00; + oCell = &error->cell; + pSource = error; + } + } + else if (m_oValue->m_sText == L"#DIV/0!") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x07; + oCell = &error->cell; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x07; + oCell = &error->cell; + pSource = error; + } + } + else if (m_oValue->m_sText == L"#REF!") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x17; + oCell = &error->cell; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x17; + oCell = &error->cell; + pSource = error; + } + } + else if (m_oValue->m_sText == L"#NAME?") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x1D; + oCell = &error->cell; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x1D; + oCell = &error->cell; + pSource = error; + } + } + else if (m_oValue->m_sText == L"#NUM!") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x24; + oCell = &error->cell; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x24; + oCell = &error->cell; + pSource = error; + } + } + else if (m_oValue->m_sText == L"#N/A") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x2A; + oCell = &error->cell; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x2A; + oCell = &error->cell; + pSource = error; + } + } + else if (m_oValue->m_sText == L"#GETTING_DATA") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x2B; + oCell = &error->cell; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x2B; + oCell = &error->cell; + pSource = error; + } + } + } + break; + case SimpleTypes::Spreadsheet::celltypeBool: + { + if(m_oFormula.IsInit()) + { + auto cellBool(new XLSB::FmlaBool); + cellBool->value = m_oValue->m_sText == L"1" ? true : false; + oCell = &cellBool->cell; + pSource = cellBool; + } + else + { + auto cellBool(new XLSB::CellBool); + cellBool->value = m_oValue->m_sText == L"1" ? true : false; + oCell = &cellBool->cell; + pSource = cellBool; + } + } + break; + case SimpleTypes::Spreadsheet::celltypeSharedString: + { + auto pCellIsst(new XLSB::CellIsst); + pCellIsst->value = std::stoi(m_oValue->m_sText); + oCell = &pCellIsst->cell; + pSource = pCellIsst; + } + break; + case SimpleTypes::Spreadsheet::celltypeInlineStr: + case SimpleTypes::Spreadsheet::celltypeStr: + { + if(m_oValue.IsInit()) + { + if(m_oFormula.IsInit()) + { + auto str(new XLSB::FmlaString); + if(m_oValue.IsInit()) + str->value = m_oValue->m_sText; + oCell = &str->cell; + + pSource = str; + + } + else + { + auto str(new XLSB::CellSt); + if(m_oValue.IsInit()) + str->value = m_oValue->m_sText; + oCell = &str->cell; + pSource = str; + } + } + else + { + auto pCellblank = new(XLSB::CellBlank); + oCell = &pCellblank->cell; + oCell->fPhShow = false; + pSource = pCellblank; + } + } + break; + } + + if(!m_oFormula.IsInit()) + { + pDATACELL = new(XLSB::DATACELL); + ptr->m_source = XLS::BaseObjectPtr{pDATACELL}; + pDATACELL->m_source = XLS::BaseObjectPtr{pSource}; + } + else + { + if(!m_oFormula->m_oT.IsInit()) + { + m_oFormula->m_oT.Init(); + m_oFormula->m_oT = SimpleTypes::Spreadsheet::cellformulatypeNormal; + } + if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeDataTable) + { + pTABLECELL = new(XLSB::TABLECELL); + ptr->m_source = XLS::BaseObjectPtr{pTABLECELL}; + pTABLECELL->m_source = XLS::BaseObjectPtr{pSource}; + auto table(new XLSB::Table); + pTABLECELL->m_BrtTable = XLS::BaseObjectPtr{table}; + m_oFormula->toBin(pTABLECELL->m_BrtTable); + + } + else + { + std::vector refs; + pFMLACELL = new XLSB::FMLACELL(0, refs); + + if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeNormal) + { + ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; + pFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; + m_oFormula->toBin(pFMLACELL->m_source); + } + if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeShared) + { + + m_oFormula->m_oT = SimpleTypes::Spreadsheet::cellformulatypeNormal; + ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; + pFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; + + if(!m_oFormula->m_sText.empty()) + { + m_oFormula->toBin(pFMLACELL->m_source); + + sharedFormulas.shrFmla.push_back(std::make_pair(cellref, m_oFormula->m_sText)); + + } + else if(m_oFormula->m_oSi.IsInit() && sharedFormulas.shrFmla.size() > m_oFormula->m_oSi->GetValue() ) + { + + auto fmla = dynamic_cast(pSource); + + auto dataPair = sharedFormulas.shrFmla[m_oFormula->m_oSi->GetValue()]; + sourceCellRef = dataPair.first; + int coldiff = 0; + if(sourceCellRef.colRelative) + coldiff = cellref.column - dataPair.first.column; + int rowdiff = 0; + if(sourceCellRef.rowRelative) + rowdiff = cellref.row - dataPair.first.row; + fmla->formula = dataPair.second; + if(rowdiff || coldiff) + { + for(auto i:fmla->formula.rgce.sequence) + { + if(i->ptg_id.is_initialized() && i->ptg_id.get() == 37) + { + auto area(static_cast(i.get())); + area->areaXlsb.columnFirst += coldiff; + area->areaXlsb.columnLast += coldiff; + area->areaXlsb.rowFirst += rowdiff; + area->areaXlsb.rowLast += rowdiff; + } + else if(i->ptg_id.is_initialized() && i->ptg_id.get() == 36) + { + auto area(static_cast(i.get())); + area->loc_xlsb.column += coldiff; + area->loc_xlsb.row += rowdiff; + } + } + } + + } + } + else if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeArray) + { + pSHRFMLACELL = new XLSB::SHRFMLACELL(0,0, refs); + ptr->m_source = XLS::BaseObjectPtr{pSHRFMLACELL}; + pSHRFMLACELL->_fmlacell = XLS::BaseObjectPtr{pFMLACELL}; + pFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; + if(!m_oFormula->m_sText.empty()) + { + auto arrfmla(new XLSB::ArrFmla(XLS::CellRef())); + pSHRFMLACELL->m_source = XLS::BaseObjectPtr{arrfmla}; + m_oFormula->toBin(pSHRFMLACELL->m_source); + + auto rowPos = new XLS::PtgExp; + rowPos->rowXlsb = cellref.row; + auto colPos = new XLS::PtgExtraCol; + colPos->col = cellref.column; + auto cellFmla = dynamic_cast(pSource); + cellFmla->formula.rgce.addPtg(PtgPtr{rowPos}); + cellFmla->formula.rgcb.addPtg(PtgPtr{colPos}); + if(m_oFormula->m_oRef.IsInit()) + { + XLS::CellRangeRef arrRange(m_oFormula->m_oRef.get()); + sharedFormulas.arrfmla.push_back(std::make_pair(arrRange, cellref)); + } + } + else + { + auto rowPos = new XLS::PtgExp; + rowPos->rowXlsb = sourceCellRef.row; + auto colPos = new XLS::PtgExtraCol; + colPos->col = sourceCellRef.column; + auto cellFmla = dynamic_cast(pSource); + cellFmla->formula.rgce.addPtg(PtgPtr{rowPos}); + cellFmla->formula.rgcb.addPtg(PtgPtr{colPos}); + } + + } + + } + } + + oCell->column = cellref.column; + if(m_oShowPhonetic.IsInit()) + oCell->fPhShow = m_oShowPhonetic->GetValue(); + else + oCell->fPhShow = false; + if(m_oStyle.IsInit()) + oCell->iStyleRef = m_oStyle.get(); + else + oCell->iStyleRef = 0; + return objectPtr; + } void CCell::fromBin(XLS::BaseObjectPtr& obj) { - ReadAttributes(obj); + ReadAttributes(obj); } void CCell::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { @@ -1698,7 +2311,7 @@ namespace OOX WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:Index", iColIndex ) WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:MergeAcross", iAcross ) WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:MergeDown", iDown ) - WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:ArrayRange", sArrayRange ) + WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:ArrayRange", sArrayRange ) WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:StyleID", sStyleId ) WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:HRef", sHyperlink ) @@ -1757,7 +2370,7 @@ namespace OOX BiffRecord* pSource = nullptr; XLSB::Cell oCell; if(pDATACELL != nullptr) - { + { m_oCol = pDATACELL->m_Col; pSource = static_cast(pDATACELL->m_source.get()); if(pSource != nullptr) @@ -1777,7 +2390,7 @@ namespace OOX } else if(pFMLACELL != nullptr) { - m_oCol = pFMLACELL->m_Col; + m_oCol = pFMLACELL->m_Col; pSource = static_cast(pFMLACELL->m_source.get()); if(pSource != nullptr) oCell = dynamic_cast(pSource)->cell; @@ -1905,7 +2518,7 @@ namespace OOX } } } - } + } } EElementType CCell::getType () const { @@ -2263,7 +2876,7 @@ namespace OOX if (xlsx_flat) { CWorksheet* sheet = xlsx_flat->m_arWorksheets.back(); - + std::map>::iterator pFind = sheet->m_oSheetData->m_mapStyleMerges2003.find(xlsx_flat->m_nLastReadRow); if (pFind != sheet->m_oSheetData->m_mapStyleMerges2003.end()) @@ -2296,6 +2909,71 @@ namespace OOX m_arrItems.push_back(pCell); }*/ } + XLS::BaseObjectPtr CRow::toBin(sharedFormula &sharedFormulas) + { + std::vector shared_formulas_locations_ref; + auto ptr(new XLSB::Parenthesis_CELLTABLE(shared_formulas_locations_ref)); + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto it = m_arrItems.begin(); it != m_arrItems.end();) + { + ptr->m_arCELL.push_back((*it)->toBin(sharedFormulas)); + it = m_arrItems.erase(it); + } + + if(m_oCollapsed.IsInit() || m_oCustomFormat.IsInit() || m_oCustomHeight.IsInit() || m_oHidden.IsInit() || m_oHt.IsInit() + || m_oOutlineLevel.IsInit() || m_oPh.IsInit() || m_oR.IsInit() || m_oS.IsInit() || m_oThickBot.IsInit() || m_oThickTop.IsInit()) + { + auto hdrPtr(new XLSB::RowHdr); + ptr->m_BrtRowHdr = XLS::BaseObjectPtr{hdrPtr}; + + if(m_oCollapsed.IsInit()) + hdrPtr->fCollapsed = m_oCollapsed->GetValue(); + + if(m_oCustomFormat.IsInit()) + hdrPtr->fGhostDirty = m_oCustomFormat->GetValue(); + + if(m_oCustomHeight.IsInit()) + hdrPtr->fUnsynced = m_oCustomHeight->GetValue(); + + if(m_oHidden.IsInit()) + hdrPtr->fDyZero = m_oHidden->GetValue(); + + if(m_oHt.IsInit()) + hdrPtr->miyRw = m_oHt->GetValue() * 20.; + else + hdrPtr->miyRw = 240; + + if(m_oOutlineLevel.IsInit()) + hdrPtr->iOutLevel = m_oOutlineLevel->GetValue(); + + if(m_oPh.IsInit()) + hdrPtr->fPhonetic = m_oPh->GetValue(); + + if(m_oR.IsInit()) + hdrPtr->rw = m_oR->GetValue() - 1; + + if(m_oS.IsInit()) + hdrPtr->ixfe_val = m_oS->GetValue(); + + if(m_oThickBot.IsInit()) + hdrPtr->fExDes = m_oThickBot->GetValue(); + + if(m_oThickTop.IsInit()) + hdrPtr->fExAsc = m_oThickTop->GetValue(); + } + + //if(m_oDyDescent.IsInit()) + //{ + //auto ptrAccel(new XLSB::ACCELLTABLE); + //ptr->m_ACCELLTABLE = XLS::BaseObjectPtr{ptrAccel}; + //auto ptrdescent(new XLSB::RwDescent); + // ptrAccel->m_BrtRwDescent = XLS::BaseObjectPtr{ptrdescent}; + // ptrdescent->dyDescent = m_oDyDescent->GetValue(); + //} + + return objectPtr; + } void CRow::fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nType) { LONG nEnd = oStream.XlsbReadRecordLength() + oStream.GetPos(); @@ -2397,18 +3075,18 @@ namespace OOX { CRow *pCurrentRow = sheet->m_oSheetData->m_arrItems.back(); // == this sheet->m_oSheetData->m_arrItems.pop_back(); - + while (xlsx_flat->m_nLastReadRow < newRow) { xlsx_flat->m_nLastReadRow++; - + CRow *pRow = new CRow(m_pMainDocument); pRow->m_oR = xlsx_flat->m_nLastReadRow; sheet->m_oSheetData->m_arrItems.push_back(pRow); std::map>::iterator pFind = sheet->m_oSheetData->m_mapStyleMerges2003.find(xlsx_flat->m_nLastReadRow); - + if (pFind != sheet->m_oSheetData->m_mapStyleMerges2003.end()) { sheet->m_oSheetData->StyleFromMapStyleMerges2003(pFind->second); @@ -2417,7 +3095,7 @@ namespace OOX } sheet->m_oSheetData->m_arrItems.push_back(pCurrentRow); pCurrentRow = NULL; - } + } xlsx_flat->m_nLastReadRow = newRow; } xlsx_flat->m_nLastReadCol = -1; @@ -2450,7 +3128,7 @@ namespace OOX { m_oHt.Init(); m_oHt->SetValue(atof(oReader.GetTextChar())); - + m_oCustomHeight.Init(); m_oCustomHeight->SetValue(SimpleTypes::onoffTrue); } @@ -2602,7 +3280,7 @@ namespace OOX return; CXlsx* xlsx = dynamic_cast(m_pMainDocument); CXlsxFlat* xlsx_flat = dynamic_cast(m_pMainDocument); - + if(xlsx) { xlsx->m_nLastReadRow = 0; @@ -2671,11 +3349,11 @@ namespace OOX pWorksheet->m_oCols.Init(); } - pWorksheet->m_oCols->m_arrItems.push_back(pColumn); + pWorksheet->m_oCols->m_arrItems.push_back(pColumn); pColumn->m_oMin.Init(); pColumn->m_oMin->SetValue(pWorksheet->m_oCols->m_arrItems.size()); - + pColumn->m_oMax.Init(); pColumn->m_oMax->SetValue(pWorksheet->m_oCols->m_arrItems.size()); } @@ -2687,7 +3365,7 @@ namespace OOX { CXlsxFlat* xlsx_flat = dynamic_cast(m_pMainDocument); if (!xlsx_flat) return; - + CWorksheet* pWorksheet = xlsx_flat->m_arWorksheets.back(); pWorksheet->m_oSheetFormatPr.Init(); @@ -2848,6 +3526,20 @@ namespace OOX m_arrItems.push_back(pRow); }*/ } + XLS::BaseObjectPtr CSheetData::toBin() + { + auto ptr(new XLSB::CELLTABLE); + XLS::BaseObjectPtr objectPtr(ptr); + sharedFormula fmlaStruct; + + for(auto it = m_arrItems.begin(); it != m_arrItems.end();) + { + ptr->m_arParenthesis_CELLTABLE.push_back((*it)->toBin(fmlaStruct)); + it = m_arrItems.erase(it); + } + + return objectPtr; + } EElementType CSheetData::getType () const { return et_x_SheetData; diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.h b/OOXML/XlsxFormat/Worksheets/SheetData.h index 89cc177363..1b18f455f1 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.h +++ b/OOXML/XlsxFormat/Worksheets/SheetData.h @@ -33,6 +33,7 @@ #include "../SharedStrings/Si.h" #include "../../Common/SimpleTypes_Shared.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h" namespace NSBinPptxRW { @@ -125,6 +126,11 @@ namespace OOX void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); }; + struct sharedFormula + { + std::vector> shrFmla; + std::vector> arrfmla; + }; class CFormula : public WritingElement { public: @@ -141,6 +147,7 @@ namespace OOX void fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream); void fromXLSBExt (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nFlags); void fromBin(XLS::BaseObjectPtr& obj, SimpleTypes::Spreadsheet::ECellFormulaType eType); + void toBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; @@ -215,6 +222,7 @@ namespace OOX void fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nType, _UINT32 nRow); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(sharedFormula &sharedFormulas); virtual EElementType getType () const; @@ -234,9 +242,10 @@ namespace OOX void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadComment(XmlUtils::CXmlLiteReader& oReader, CCommentItem* pComment); + bool checkArrayCell(XLS::CellRef &cellref, const sharedFormula& ArrFmlas); void AfterRead(); - //----------- 2003 + //----------- 2003 void After2003Read(); nullable pCommentItem; @@ -259,7 +268,7 @@ namespace OOX nullable m_oFormula; nullable m_oRichText; nullable m_oValue; -//----------------------------- +//----------------------------- nullable_string m_oCacheValue; }; @@ -281,8 +290,9 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromXMLToXLSB(XmlUtils::CXmlLiteReader& oReader, NSBinPptxRW::CXlsbBinaryWriter& oStream, CCellXLSB& oCell); void fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nType); - void toXLSB (NSBinPptxRW::CXlsbBinaryWriter& oStream) const; + void toXLSB (NSBinPptxRW::CXlsbBinaryWriter& oStream) const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(sharedFormula &sharedFormulas); virtual EElementType getType () const; @@ -324,11 +334,12 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nType, CSVWriter* pCSVWriter, NSFile::CStreamWriter& oStreamWriter); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; - + nullable m_oXlsbPos; - + std::map> m_mapStyleMerges2003; // map(row, map(col, style)) void StyleFromMapStyleMerges2003(std::map &mapStyleMerges); void AfterRead(); diff --git a/OOXML/XlsxFormat/Worksheets/Sparkline.cpp b/OOXML/XlsxFormat/Worksheets/Sparkline.cpp index 9263752056..ca5d524267 100644 --- a/OOXML/XlsxFormat/Worksheets/Sparkline.cpp +++ b/OOXML/XlsxFormat/Worksheets/Sparkline.cpp @@ -393,6 +393,134 @@ namespace OOX m_oSparklines = obj; } } + XLS::BaseObjectPtr CSparklineGroup::toBin() + { + auto ptr1(new XLSB::SPARKLINEGROUP); + XLS::BaseObjectPtr objectPtr(ptr1); + + auto ptr(new XLSB::BeginSparklineGroup); + ptr1->m_BrtBeginSparklineGroup = XLS::BaseObjectPtr{ptr}; + + if(m_oManualMax.IsInit()) + ptr->dManualMax.data.value = m_oManualMax->GetValue(); + else + ptr->dManualMax.data.value = 0; + if(m_oManualMin.IsInit()) + ptr->dManualMin.data.value = m_oManualMin->GetValue(); + else + ptr->dManualMin.data.value = 0; + if(m_oLineWeight.IsInit()) + ptr->dLineWeight.data.value = m_oLineWeight->GetValue(); + else + ptr->dLineWeight.data.value = 0; + if(m_oType.IsInit()) + ptr->isltype = static_castisltype)>(m_oType->GetValue()); + else + ptr->isltype = 0; + if(m_oDateAxis.IsInit()) + ptr->fDateAxis = m_oDateAxis->GetValue(); + else + ptr->fDateAxis = 0; + if(m_oDisplayEmptyCellsAs.IsInit()) + ptr->fShowEmptyCellAsZero = (m_oDisplayEmptyCellsAs == OOX::Spreadsheet::ST_DispBlanksAs::st_dispblanksasZERO) ? 0x01 : 0x00; + else + ptr->fShowEmptyCellAsZero = false; + if(m_oMarkers.IsInit()) + ptr->fMarkers = m_oMarkers->GetValue(); + else + ptr->fMarkers = false; + if(m_oHigh.IsInit()) + ptr->fHigh = m_oHigh->GetValue(); + else + ptr->fHigh = false; + if(m_oLow.IsInit()) + ptr->fLow = m_oLow->GetValue(); + else + ptr->fLow = false; + if(m_oFirst.IsInit()) + ptr->fFirst = m_oFirst->GetValue(); + else + ptr->fFirst = false; + if(m_oLast.IsInit()) + ptr->fLast = m_oLast->GetValue(); + else + ptr->fLast = false; + if(m_oNegative.IsInit()) + ptr->fNegative = m_oNegative->GetValue(); + else + ptr->fNegative = false; + if(m_oDisplayXAxis.IsInit()) + ptr->fAxis = m_oDisplayXAxis->GetValue(); + else + ptr->fAxis = false; + if(m_oDisplayHidden.IsInit()) + ptr->fDisplayHidden = m_oDisplayHidden->GetValue(); + else + ptr->fDisplayHidden = false; + if(m_oRightToLeft.IsInit()) + ptr->fRTL = m_oRightToLeft->GetValue(); + else + ptr->fRTL = false; + if(m_oMaxAxisType.IsInit() && m_oMaxAxisType == SimpleTypes::Spreadsheet::ESparklineAxisMinMax::Individual) + ptr->fIndividualAutoMax = true; + else + ptr->fIndividualAutoMax = false; + + + if(m_oColorSeries.IsInit()) + ptr->brtcolorSeries = m_oColorSeries->toColor(); + else + ptr->brtcolorSeries = m_oColorSeries->GetDefaultColor(); + + if(m_oColorNegative.IsInit()) + ptr->brtcolorNegative = m_oColorNegative->toColor(); + else + ptr->brtcolorNegative = m_oColorSeries->GetDefaultColor(); + + if(m_oColorAxis.IsInit()) + ptr->brtcolorAxis = m_oColorAxis->toColor(); + else + ptr->brtcolorAxis = m_oColorSeries->GetDefaultColor(); + + if(m_oColorMarkers.IsInit()) + ptr->brtcolorMarkers = m_oColorMarkers->toColor(); + else + ptr->brtcolorMarkers = m_oColorSeries->GetDefaultColor(); + + if(m_oColorFirst.IsInit()) + ptr->brtcolorFirst = m_oColorFirst->toColor(); + else + ptr->brtcolorFirst = m_oColorSeries->GetDefaultColor(); + + if(m_oColorLast.IsInit()) + ptr->brtcolorLast = m_oColorLast->toColor(); + else + ptr->brtcolorLast = m_oColorSeries->GetDefaultColor(); + + if(m_oColorHigh.IsInit()) + ptr->brtcolorHigh = m_oColorHigh->toColor(); + else + ptr->brtcolorHigh = m_oColorHigh->GetDefaultColor(); + + if(m_oColorLow.IsInit()) + ptr->brtcolorLow = m_oColorLow->toColor(); + else + ptr->brtcolorLow = m_oColorLow->GetDefaultColor(); + + ptr->FRTheader.fFormula = false; + ptr->FRTheader.fRef = false; + ptr->FRTheader.fSqref = false; + ptr->FRTheader.fRelID = false; + if(m_oRef.IsInit()) + { + XLSB::FRTFormula fmla; + ptr->FRTheader.rgFormulas.array.push_back(fmla); + ptr->FRTheader.rgFormulas.array[0].formula = m_oRef.get(); + ptr->FRTheader.fFormula = true; + } + + return objectPtr; + } EElementType CSparklineGroup::getType () const { return et_x_SparklineGroup; @@ -556,6 +684,14 @@ namespace OOX m_arrItems.push_back(new CSparklineGroup(sparklineGroup)); } } + XLS::BaseObjectPtr CSparklineGroups::toBin() + { + auto ptr(new XLSB::SPARKLINEGROUPS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSPARKLINEGROUP.push_back(i->toBin()); + return objectPtr; + } EElementType CSparklineGroups::getType () const { return et_x_SparklineGroups; diff --git a/OOXML/XlsxFormat/Worksheets/Sparkline.h b/OOXML/XlsxFormat/Worksheets/Sparkline.h index c2968e768d..938fc399d0 100644 --- a/OOXML/XlsxFormat/Worksheets/Sparkline.h +++ b/OOXML/XlsxFormat/Worksheets/Sparkline.h @@ -109,6 +109,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -163,6 +164,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp index 4c62e56793..8aa1070b25 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp @@ -49,6 +49,8 @@ #include "../../XlsbFormat/Biff12_unions/HLINKS.h" #include "../../XlsbFormat/Biff12_unions/MERGECELLS.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -66,11 +68,11 @@ namespace OOX if (xlsx) { m_bPrepareForBinaryWriter = true; // подготовка для бинарника при чтении - + xlsx->m_arWorksheets.push_back( this ); //xlsx->m_mapWorksheets.insert( std::make_pair(rId, this) ); } - else + else m_bPrepareForBinaryWriter = false; } CWorksheet::CWorksheet(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath, const std::wstring & rId, bool isChartSheet) : OOX::File(pMain), OOX::IFileContainer(pMain), WritingElement(pMain) @@ -86,11 +88,11 @@ namespace OOX if (xlsx) { m_bPrepareForBinaryWriter = true; - + xlsx->m_arWorksheets.push_back( this ); xlsx->m_mapWorksheets.insert( std::make_pair(rId, this) ); } - else + else m_bPrepareForBinaryWriter = false; read( oRootPath, oPath ); @@ -229,6 +231,133 @@ namespace OOX } } + XLS::BaseObjectPtr CWorksheet::WriteBin() const + { + if(m_bIsChartSheet) + { + XLSB::ChartSheetStreamPtr chartSheetStream(new XLSB::ChartSheetStream); + + if (m_oPageMargins.IsInit()) + chartSheetStream->m_BrtMargins = m_oPageMargins->toBin(); + if (m_oHeaderFooter.IsInit()) + chartSheetStream->m_HEADERFOOTER = m_oHeaderFooter->toBin(); + if (m_oDrawing.IsInit()) + chartSheetStream->m_BrtDrawing = m_oDrawing->toBin(); + if (m_oLegacyDrawing.IsInit()) + chartSheetStream->m_BrtLegacyDrawing = m_oLegacyDrawing->toBin(); + if (m_oLegacyDrawingHF.IsInit()) + chartSheetStream->m_BrtLegacyDrawingHF = m_oLegacyDrawingHF->toBin(); + if (m_oPicture.IsInit()) + chartSheetStream->m_BrtBkHim = m_oPicture->toBin(); + + if (m_oSheetViews.IsInit()) + chartSheetStream->m_CSVIEWS = m_oSheetViews->toBin(); + + if (m_oPageSetup.IsInit()) + chartSheetStream->m_BrtCsPageSetup = m_oPageSetup->toBinCs(); + + if(m_oSheetProtection.IsInit()) + { + if (m_oSheetProtection->m_oAlgorithmName.IsInit()) + chartSheetStream->m_BrtCsProtectionIso = m_oSheetProtection->toBinCS(); + else if(m_oSheetProtection->m_oPassword.IsInit()) + chartSheetStream->m_BrtCsProtection = m_oSheetProtection->toBinCS(); + } + + if (m_oSheetPr.IsInit()) + { + if(m_oSheetPr->m_oCodeName.IsInit()) + chartSheetStream->m_BrtCsProp = m_oSheetPr->toBinCs(); + } + + return chartSheetStream; + } + else + { + XLSB::WorkSheetStreamPtr workSheetStream(new XLSB::WorkSheetStream); + + if (m_oCols.IsInit()) + workSheetStream->m_arCOLINFOS = m_oCols->toBin(); + if (m_oDimension.IsInit()) + workSheetStream->m_BrtWsDim = m_oDimension->toBin(); + if (m_oDrawing.IsInit()) + workSheetStream->m_BrtDrawing = m_oDrawing->toBin(); + if (m_oLegacyDrawing.IsInit()) + workSheetStream->m_BrtLegacyDrawing = m_oLegacyDrawing->toBin(); + if (m_oLegacyDrawingHF.IsInit()) + workSheetStream->m_BrtLegacyDrawingHF = m_oLegacyDrawingHF->toBin(); + if (m_oHyperlinks.IsInit()) + workSheetStream->m_HLINKS = m_oHyperlinks->toBin(); + if (m_oMergeCells.IsInit()) + workSheetStream->m_MERGECELLS = m_oMergeCells->toBin(); + + if ( m_oSheetData.IsInit()) + workSheetStream->m_CELLTABLE = m_oSheetData->toBin(); + + if (m_oSheetFormatPr.IsInit()) + workSheetStream->m_BrtWsFmtInfo = m_oSheetFormatPr->toBin(); + if (m_oSheetViews.IsInit()) + workSheetStream->m_WSVIEWS2 = m_oSheetViews->toBin(); + if (m_oPageMargins.IsInit()) + workSheetStream->m_BrtMargins = m_oPageMargins->toBin(); + if (m_oPageSetup.IsInit()) + workSheetStream->m_BrtPageSetup = m_oPageSetup->toBin(); + if (m_oPrintOptions.IsInit()) + workSheetStream->m_BrtPrintOptions = m_oPrintOptions->toBin(); + if (m_oHeaderFooter.IsInit()) + workSheetStream->m_HEADERFOOTER = m_oHeaderFooter->toBin(); + if(m_oSheetProtection.IsInit()) + { + if (m_oSheetProtection->m_oAlgorithmName.IsInit()) + workSheetStream->m_BrtSheetProtectionIso = m_oSheetProtection->toBin(); + else if(m_oSheetProtection->m_oPassword.IsInit()) + workSheetStream->m_BrtSheetProtection = m_oSheetProtection->toBin(); + } + if (m_oTableParts.IsInit()) + workSheetStream->m_LISTPARTS = m_oTableParts->toBin(); + if (m_oSortState.IsInit()) + workSheetStream->m_SORTSTATE = m_oSortState->toBin(); + if (!m_arrConditionalFormatting.empty()) + for(auto &item : m_arrConditionalFormatting) + workSheetStream->m_arCONDITIONALFORMATTING.push_back(item->toBin()); + + if (m_oAutofilter.IsInit()) + workSheetStream->m_AUTOFILTER = m_oAutofilter->toBin(); + if (m_oDataValidations.IsInit()) + workSheetStream->m_DVALS = m_oDataValidations->toBin(); + if (m_oOleObjects.IsInit()) + workSheetStream->m_OLEOBJECTS = m_oOleObjects->toBin(); + if (m_oControls.IsInit()) + workSheetStream->m_ACTIVEXCONTROLS = m_oControls->toBin(); + if (m_oSheetPr.IsInit()) + workSheetStream->m_BrtWsProp = m_oSheetPr->toBin(); + if (m_oPicture.IsInit()) + workSheetStream->m_BrtBkHim = m_oPicture->toBin(); + if (m_oRowBreaks.IsInit()) + workSheetStream->m_RWBRK = m_oRowBreaks->toBinRow(); + if (m_oColBreaks.IsInit()) + workSheetStream->m_COLBRK = m_oColBreaks->toBinColumn(); + if (m_oDataConsolidate.IsInit()) + workSheetStream->m_DCON = m_oDataConsolidate->toBin(); + + if (m_oProtectedRanges.IsInit()) + { + if(m_oProtectedRanges->m_arrItems.empty()) + { + auto arrayPtr = m_oProtectedRanges->m_arrItems.back(); + if(arrayPtr->m_oSpinCount.IsInit() || arrayPtr->m_oSpinCount.IsInit() || arrayPtr->m_oSpinCount.IsInit() || arrayPtr->m_oSaltValue.IsInit()) + workSheetStream->m_arBrtRangeProtectionIso = m_oProtectedRanges->toBin(); + else + workSheetStream->m_arBrtRangeProtection = m_oProtectedRanges->toBin(); + } + } + if (m_oExtLst.IsInit()) + workSheetStream->m_FRTWORKSHEET = m_oExtLst->toBinWorksheet(); + + return workSheetStream; + } + + } void CWorksheet::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -255,7 +384,11 @@ namespace OOX } void CWorksheet::PrepareAfterRead() { - PrepareComments(m_pComments, m_pThreadedComments, m_oLegacyDrawing.GetPointer()); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if (!xlsb || !xlsb->m_bWriteToXlsb) + { + PrepareComments(m_pComments, m_pThreadedComments, m_oLegacyDrawing.GetPointer()); + } PrepareConditionalFormatting(); PrepareDataValidations(); } @@ -265,7 +398,7 @@ namespace OOX if ( oReader.IsEmptyNode() ) return; - + int nDocumentDepth = oReader.GetDepth(); std::wstring sName; @@ -417,7 +550,7 @@ namespace OOX void CWorksheet::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { nullable_string sName; - + WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Read_if ( oReader, L"ss:Name", sName ) WritingElement_ReadAttributes_End( oReader ) @@ -501,10 +634,10 @@ namespace OOX } if(false == m_oSheetViews.IsInit()) m_oSheetViews.Init(); - + if(m_oSheetViews->m_arrItems.empty()) m_oSheetViews->m_arrItems.push_back(new CSheetView()); - + CSheetView* pSheetView = m_oSheetViews->m_arrItems.front(); if(false == pSheetView->m_oWorkbookViewId.IsInit()) @@ -584,52 +717,61 @@ namespace OOX if (bIsWritten) return; bIsWritten = true; + if (!m_bWriteDirectlyToFile) { - NSStringUtils::CStringBuilder sXml; - - toXMLStart(sXml); - toXML(sXml); - toXMLEnd(sXml); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { + NSStringUtils::CStringBuilder sXml; - //NSFile::CFileBinary::SaveToFile(oPath.GetPath(), sXml.GetData()); - //for memory optimization for large files + toXMLStart(sXml); + toXML(sXml); + toXMLEnd(sXml); - wchar_t* pXmlData = sXml.GetBuffer(); - LONG lwcharLen = (LONG)sXml.GetCurSize(); - const LONG lcurrentLen = 10485760; //10 Mbyte - LONG nCycles = lwcharLen / lcurrentLen; + //NSFile::CFileBinary::SaveToFile(oPath.GetPath(), sXml.GetData()); + //for memory optimization for large files - LONG lLen = 0; - BYTE* pData = NULL; - NSFile::CFileBinary oFile; - oFile.CreateFileW(oPath.GetPath()); + wchar_t* pXmlData = sXml.GetBuffer(); + LONG lwcharLen = (LONG)sXml.GetCurSize(); + const LONG lcurrentLen = 10485760; //10 Mbyte + LONG nCycles = lwcharLen / lcurrentLen; - while(nCycles--) - { - NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pXmlData, lcurrentLen, pData, lLen); + LONG lLen = 0; + BYTE* pData = NULL; + NSFile::CFileBinary oFile; + oFile.CreateFileW(oPath.GetPath()); - oFile.WriteFile(pData, lLen); + while(nCycles--) + { + NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pXmlData, lcurrentLen, pData, lLen); - pXmlData += lcurrentLen; + oFile.WriteFile(pData, lLen); - RELEASEARRAYOBJECTS(pData); - } + pXmlData += lcurrentLen; - if(lwcharLen % lcurrentLen > 0) - { - NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pXmlData, lwcharLen % lcurrentLen, pData, lLen); + RELEASEARRAYOBJECTS(pData); + } - oFile.WriteFile(pData, lLen); + if(lwcharLen % lcurrentLen > 0) + { + NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pXmlData, lwcharLen % lcurrentLen, pData, lLen); - RELEASEARRAYOBJECTS(pData); - } + oFile.WriteFile(pData, lLen); - oFile.CloseFile(); + RELEASEARRAYOBJECTS(pData); + } - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); - } + oFile.CloseFile(); + } + oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); + IFileContainer::Write( oPath, oDirectory, oContent ); + } else { CPath oRealPath(oPath.GetDirectory() + FILE_SEPARATOR_STR + m_sOutputFilename); @@ -695,14 +837,14 @@ mc:Ignorable=\"x14ac\">"); if (!m_oLegacyDrawing.IsInit()) return oElement; if (!m_oLegacyDrawing->m_oId.IsInit()) return oElement; - + smart_ptr oFile = this->Find(m_oLegacyDrawing->m_oId->GetValue()); smart_ptr oVmlDrawing = oFile.smart_dynamic_cast(); OOX::WritingElement* pShapeElem = NULL; if (oVmlDrawing.IsInit()) { - oElement = oVmlDrawing->FindVmlObject(spid); + oElement = oVmlDrawing->FindVmlObject(spid); } return oElement; } @@ -721,6 +863,13 @@ mc:Ignorable=\"x14ac\">"); } const OOX::FileType CWorksheet::type() const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + if(m_bIsChartSheet) + return OOX::SpreadsheetBin::FileTypes::ChartsheetsBin; + return OOX::SpreadsheetBin::FileTypes::WorksheetBin; + } return m_bIsChartSheet?OOX::Spreadsheet::FileTypes::Chartsheets:OOX::Spreadsheet::FileTypes::Worksheet; } const CPath CWorksheet::DefaultDirectory() const @@ -729,7 +878,18 @@ mc:Ignorable=\"x14ac\">"); } const CPath CWorksheet::DefaultFileName() const { - return type().DefaultFileName(); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + CPath name = type().DefaultFileName(); + + name.SetExtention(L"bin"); + return name; + } + else + { + return type().DefaultFileName(); + } } const CPath& CWorksheet::GetReadPath() const { diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.h b/OOXML/XlsxFormat/Worksheets/Worksheet.h index 240696a9ab..38a3ed1f65 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.h +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.h @@ -76,6 +76,7 @@ namespace OOX virtual ~CWorksheet(); void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); @@ -85,9 +86,9 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - + void toXMLStart(NSStringUtils::CStringBuilder& writer) const; void toXMLEnd(NSStringUtils::CStringBuilder& writer) const; virtual const OOX::FileType type() const; @@ -107,7 +108,7 @@ namespace OOX void ReadWorksheetOptions(XmlUtils::CXmlLiteReader& oReader); CPath m_oReadPath; - + bool m_bPrepareForBinaryWriter; bool m_bWriteDirectlyToFile; bool m_bIsChartSheet; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index e186cbc5b3..8fd1f88385 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -55,6 +55,7 @@ #include "../../XlsbFormat/Biff12_unions/DCON.h" #include "../../XlsbFormat/Biff12_records/BeginDCon.h" #include "../../XlsbFormat/Biff12_unions/DREFS.h" +#include "../../XlsbFormat/Biff12_records/BeginDRefs.h" #include "../../XlsbFormat/Biff12_records/DRef.h" #include "../../XlsbFormat/Biff12_unions/CSVIEWS.h" #include "../../XlsbFormat/Biff12_unions/CSVIEW.h" @@ -134,6 +135,49 @@ namespace OOX } } + XLS::BaseObjectPtr CProtectedRange::toBin() + { + XLS::BaseObjectPtr objectPtr; + if(m_oSpinCount.IsInit() || m_oSpinCount.IsInit() || m_oSpinCount.IsInit() || m_oSaltValue.IsInit()) + { + auto ptr(new XLSB::RangeProtectionIso); + objectPtr = XLS::BaseObjectPtr{ptr}; + if(m_oSpinCount.IsInit()) + ptr->dwSpinCount = m_oSpinCount->GetValue(); + if(m_oSqref.IsInit()) + ptr->sqRfX.strValue = m_oSqref.get(); + + if (m_oAlgorithmName.IsInit()) + ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); + + if (m_oName.IsInit()) + ptr->rangeProtectionTitleSDRel.rgchTitle = m_oName.get(); + + BYTE * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); + auto tempSize = 0; + NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), + m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); + ptr->ipdPasswordData.rgbHash.cbLength = tempSize; + + BYTE* temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); + auto tempSize2 = 0; + NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), + m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); + ptr->ipdPasswordData.rgbSalt.cbLength = tempSize2; + } + else + { + auto ptr(new XLSB::RangeProtection); + objectPtr = XLS::BaseObjectPtr{ptr}; + if(m_oSqref.IsInit()) + ptr->sqRfX.strValue = m_oSqref.get(); + + if (m_oName.IsInit()) + ptr->rangeProtectionTitleSDRel.rgchTitle = m_oName.get(); + + } + return objectPtr; + } void CProtectedRange::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -239,6 +283,15 @@ namespace OOX } } } + std::vector CProtectedRanges::toBin() + { + std::vector result; + for(auto i:m_arrItems) + { + result.push_back(i->toBin()); + } + return result; + } void CProtectedRanges::fromBin(std::vector& obj) { for (auto &protRange : obj) @@ -386,6 +439,31 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CPageMargins::toBin() + { + auto ptr(new XLSB::Margins); + XLS::BaseObjectPtr objPtr(ptr); + + if(m_oLeft.IsInit()) + ptr->xnumLeft.data.value = std::round(m_oLeft->GetValue()) / 100; + + if(m_oTop.IsInit()) + ptr->xnumTop.data.value = std::round(m_oTop->GetValue()) / 100; + + if(m_oRight.IsInit()) + ptr->xnumRight.data.value = std::round(m_oRight->GetValue()) / 100; + + if(m_oBottom.IsInit()) + ptr->xnumBottom.data.value = std::round(m_oBottom->GetValue()) / 100; + + if(m_oHeader.IsInit()) + ptr->xnumHeader.data.value = std::round(m_oHeader->GetValue()) / 100; + + if(m_oFooter.IsInit()) + ptr->xnumFooter.data.value = std::round(m_oFooter->GetValue()) / 100; + + return objPtr; + } EElementType CPageMargins::getType() const { return et_x_PageMargins; @@ -478,6 +556,145 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CPageSetup::toBin() + { + auto ptr(new XLSB::PageSetup); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oBlackAndWhite.IsInit()) + ptr->fNoColor = m_oBlackAndWhite->m_eValue; + if (ptr->fNoColor && m_oCellComments.IsInit()) + { + if (m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAtEnd) + ptr->fNotes = true; + else if(m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAsDisplayed) + ptr->fNotes = false; + } + + if (m_oCopies.IsInit()) + ptr->iCopies = m_oCopies->m_eValue; + else + ptr->iCopies = 1; + + if (m_oDraft.IsInit()) + ptr->fDraft = m_oDraft->m_eValue; + + if (m_oErrors.IsInit()) + ptr->iErrors = m_oErrors->m_eValue; + + if (m_oFirstPageNumber.IsInit()) + ptr->iPageStart = m_oFirstPageNumber->m_eValue; + else + ptr->iPageStart = 1; + + if (m_oFitToHeight.IsInit()) + ptr->iFitHeight = m_oFitToHeight->m_eValue; + else + ptr->iFitHeight = 1; + + if (m_oFitToWidth.IsInit()) + ptr->iFitWidth = m_oFitToWidth->m_eValue; + else + ptr->iFitWidth = 1; + + if (m_oHorizontalDpi.IsInit()) + ptr->iRes = m_oHorizontalDpi->m_eValue; + else + ptr->iRes = 600; + + if (m_oRId.IsInit()) + ptr->szRelID = m_oRId->GetValue(); + + if (m_oOrientation.IsInit() && m_oOrientation->GetValue() == SimpleTypes::EPageOrientation::pageorientLandscape) + { + ptr->fPortrait = false; + ptr->fLandscape = true; + } + else if(m_oOrientation.IsInit()) + { + ptr->fLandscape = false; + ptr->fPortrait = true; + } + else + { + ptr->fPortrait = false; + ptr->fLandscape = false; + ptr->fNoOrient = true; + } + + if (m_oPageOrder.IsInit() && m_oPageOrder->GetValue() == SimpleTypes::Spreadsheet::EPageOrder::pageorderOverThenDown) + ptr->fLeftToRight = true; + else + ptr->fLeftToRight = false; + + if (m_oPaperSize.IsInit()) + ptr->iPaperSize = m_oPaperSize->m_eValue; + else + ptr->iPaperSize = 9; + + if (m_oScale.IsInit()) + ptr->iScale = m_oScale->m_eValue; + else + ptr->iScale = 100; + + if (m_oUseFirstPageNumber.IsInit()) + ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; + else + ptr->fUsePage = true; + + if (m_oVerticalDpi.IsInit()) + ptr->iVRes = m_oVerticalDpi->m_eValue; + + return objectPtr; + } + XLS::BaseObjectPtr CPageSetup::toBinCs() + { + auto ptr(new XLSB::CsPageSetup); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oBlackAndWhite.IsInit()) + ptr->fNoColor = m_oBlackAndWhite->m_eValue; + if (ptr->fNoColor) + { + if (m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAtEnd) + ptr->fNotes = true; + else if(m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAsDisplayed) + ptr->fNotes = false; + } + + if (m_oCopies.IsInit()) + ptr->iCopies = m_oCopies->m_eValue; + + if (m_oDraft.IsInit()) + ptr->fDraft = m_oDraft->m_eValue; + + if (m_oFirstPageNumber.IsInit()) + ptr->iPageStart = m_oFirstPageNumber->m_eValue; + + if (m_oHorizontalDpi.IsInit()) + ptr->iRes = m_oHorizontalDpi->m_eValue; + + if (m_oRId.IsInit()) + ptr->szRelID = m_oRId->GetValue(); + + if (m_oOrientation.IsInit()) + { + if (m_oOrientation == SimpleTypes::EPageOrientation::pageorientLandscape) + ptr->fLandscape = true; + else + ptr->fLandscape = false; + } + + if (m_oPaperSize.IsInit()) + ptr->iPaperSize = m_oPaperSize->m_eValue; + + if (m_oUseFirstPageNumber.IsInit()) + ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; + + if (m_oVerticalDpi.IsInit()) + ptr->iVRes = m_oVerticalDpi->m_eValue; + return objectPtr; + } + EElementType CPageSetup::getType() const { return et_x_PageSetup; @@ -623,6 +840,23 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CPrintOptions::toBin() + { + auto ptr(new XLSB::PrintOptions); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oGridLines.IsInit()) + ptr->fPrintGrid = m_oGridLines->m_eValue; + if(m_oGridLinesSet.IsInit()) + ptr->fPrintGrid = m_oGridLinesSet->m_eValue; + if(m_oHeadings.IsInit()) + ptr->fPrintHeaders = m_oHeadings->m_eValue; + if(m_oHorizontalCentered.IsInit()) + ptr->fHCenter = m_oHorizontalCentered->m_eValue; + if(m_oVerticalCentered.IsInit()) + ptr->fVCenter = m_oVerticalCentered->m_eValue; + + return objectPtr; + } EElementType CPrintOptions::getType() const { return et_x_PrintOptions; @@ -677,6 +911,14 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CDimension::toBin() + { + auto castedPtr(new XLSB::WsDim); + XLS::BaseObjectPtr ptr(castedPtr); + if (m_oRef.IsInit()) + castedPtr->rfx = m_oRef.get(); + return ptr; + } EElementType CDimension::getType() const { return et_x_Dimension; @@ -732,6 +974,49 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CSheetFormatPr::toBin() + { + auto ptr(new XLSB::WsFmtInfo); + XLS::BaseObjectPtr Castedptr(ptr); + if(m_oBaseColWidth.IsInit()) + ptr->dxGCol = m_oBaseColWidth.get() * 256.; + else + ptr->dxGCol = 2304; + if(m_oDefaultColWidth.IsInit()) + { + ptr->cchDefColWidth = m_oDefaultColWidth.get(); + if(!m_oBaseColWidth.IsInit()) + { + ptr->dxGCol = m_oDefaultColWidth.get() * 256; + } + } + else + { + ptr->cchDefColWidth = 9; + } + if (m_oDefaultRowHeight.IsInit()) + ptr->miyDefRwHeight = m_oDefaultRowHeight.get() * 20; + else + ptr->miyDefRwHeight = 290; + + if (m_oOutlineLevelCol.IsInit()) + ptr->iOutLevelCol = m_oOutlineLevelCol.get(); + else + ptr->iOutLevelCol = 0; + if (m_oOutlineLevelRow.IsInit()) + ptr->iOutLevelRw = m_oOutlineLevelRow.get(); + else + ptr->iOutLevelRw = 0; + + if (m_oThickBottom.IsInit()) ptr->fExDesc = m_oThickBottom.get(); + else ptr->fExDesc = false; + if (m_oThickTop.IsInit()) ptr->fExAsc = m_oThickTop.get(); + else ptr->fExAsc = false; + if (m_oZeroHeight.IsInit()) ptr->fDyZero = m_oZeroHeight.get(); + else ptr->fDyZero = false; + ptr->fUnsynced = false; + return Castedptr; + } EElementType CSheetFormatPr::getType() const { return et_x_SheetFormatPr; @@ -808,6 +1093,43 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CPane::toBin() + { + auto ptr(new XLSB::Pane); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oActivePane.IsInit()) + { + if(m_oActivePane == SimpleTypes::Spreadsheet::EActivePane::activepaneBottomRight) + ptr->pnnAcct_xlsb = 0; + else if(m_oActivePane == SimpleTypes::Spreadsheet::EActivePane::activepaneTopRight) + ptr->pnnAcct_xlsb = 1; + else if(m_oActivePane == SimpleTypes::Spreadsheet::EActivePane::activepaneBottomLeft) + ptr->pnnAcct_xlsb = 2; + else if(m_oActivePane == SimpleTypes::Spreadsheet::EActivePane::activepaneTopLeft) + ptr->pnnAcct_xlsb = 3; + } + + if(m_oState.IsInit()) + { + if(m_oState == SimpleTypes::Spreadsheet::EPaneState::panestateFrozenSplit) + ptr->fFrozen = true; + else if(m_oState == SimpleTypes::Spreadsheet::EPaneState::panestateFrozen) + ptr->fFrozenNoSplit = true; + } + if(m_oTopLeftCell.IsInit()) + ptr->topLeftCell = m_oTopLeftCell.get(); + if(m_oXSplit.IsInit()) + ptr->xnumXSplit.data.value = m_oXSplit->GetValue(); + else + ptr->xnumXSplit.data.value = 0; + if(m_oYSplit.IsInit()) + ptr->xnumYSplit.data.value = m_oYSplit->GetValue(); + else + ptr->xnumYSplit.data.value = 0; + + return objectPtr; + } EElementType CPane::getType() const { return et_x_Pane; @@ -881,6 +1203,40 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CSelection::toBin() + { + auto ptr(new XLSB::Sel); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oActiveCell.IsInit()) + ptr->activeCell = m_oActiveCell.get(); + else + ptr->activeCell = L"A1"; + if(m_oActiveCellId.IsInit()) + ptr->irefAct = m_oActiveCellId->GetValue(); + else + ptr->irefAct = 0; + if(m_oSqref.IsInit()) + ptr->sqref = m_oSqref.get(); + else + ptr->sqref = L"A1"; + if(m_oPane.IsInit()) + { + if(m_oPane == SimpleTypes::Spreadsheet::EActivePane::activepaneBottomRight) + ptr->pnn_xlsb = 0; + else if(m_oPane == SimpleTypes::Spreadsheet::EActivePane::activepaneTopRight) + ptr->pnn_xlsb = 1; + else if(m_oPane == SimpleTypes::Spreadsheet::EActivePane::activepaneBottomLeft) + ptr->pnn_xlsb = 2; + else if(m_oPane == SimpleTypes::Spreadsheet::EActivePane::activepaneTopLeft) + ptr->pnn_xlsb = 3; + } + else + ptr->pnn_xlsb = 3; + ptr->rwAct = 0; + ptr->colAct = 0; + + return objectPtr; + } EElementType CSelection::getType() const { return et_x_Selection; @@ -1013,6 +1369,111 @@ namespace OOX ReadAttributes(pCSVIEW->m_BrtBeginCsView); } } + XLS::BaseObjectPtr CSheetView::toBin() + { + auto ptr(new XLSB::WSVIEW2); + XLS::BaseObjectPtr castedPtr(ptr); + auto pWsView(new XLSB::BeginWsView); + ptr->m_BrtBeginWsView = XLS::BaseObjectPtr{pWsView}; + + if (m_oColorId.IsInit()) + pWsView->icvHdr = m_oColorId->m_eValue; + else + pWsView->icvHdr = 64; + if (m_oDefaultGridColor.IsInit()) + pWsView->fDefaultHdr = m_oDefaultGridColor->m_eValue; + else + pWsView->fDefaultHdr = true; + if (m_oRightToLeft.IsInit()) + pWsView->fRightToLeft = m_oRightToLeft->m_eValue; + else + pWsView->fRightToLeft = false; + if (m_oShowFormulas.IsInit()) + pWsView->fDspFmlaRt = m_oShowFormulas->m_eValue; + else + pWsView->fDspFmlaRt = false; + if (m_oShowGridLines.IsInit()) + pWsView->fDspGridRt = m_oShowGridLines->m_eValue; + else + pWsView->fDspGridRt = true; + if (m_oShowOutlineSymbols.IsInit()) + pWsView->fDspGuts = m_oShowOutlineSymbols->m_eValue; + else + pWsView->fDspGuts = true; + if (m_oShowRowColHeaders.IsInit()) + pWsView->fDspRwColRt = m_oShowRowColHeaders->m_eValue; + else + pWsView->fDspRwColRt = true; + if (m_oShowRuler.IsInit()) + pWsView->fDspRuler = m_oShowRuler->m_eValue; + else + pWsView->fDspRuler = false; + if (m_oShowWhiteSpace.IsInit()) + pWsView->fWhitespaceHidden = !m_oShowWhiteSpace->m_eValue; + else + pWsView->fWhitespaceHidden = false; + if (m_oShowZeros.IsInit()) + pWsView->fDspZerosRt = m_oShowZeros->m_eValue; + else + pWsView->fDspZerosRt = true; + if (m_oTabSelected.IsInit()) + pWsView->fSelected = m_oTabSelected->m_eValue; + else + pWsView->fSelected = false; + if(m_oTopLeftCell.IsInit()) + pWsView->topLeftCell = m_oTopLeftCell.get(); + else + pWsView->topLeftCell = L"A1"; + if (m_oView.IsInit()) + pWsView->xlView = m_oView->m_eValue; + else + pWsView->xlView = 0; + if (m_oWindowProtection.IsInit()) + pWsView->fWnProt = m_oWindowProtection->m_eValue; + else + pWsView->fWnProt = false; + if (m_oWorkbookViewId.IsInit()) + pWsView->iWbkView = m_oWorkbookViewId->m_eValue; + if (m_oZoomScale.IsInit()) + pWsView->wScale = m_oZoomScale->m_eValue; + else + pWsView->wScale = 100; + if (m_oZoomScaleNormal.IsInit()) + pWsView->wScaleNormal = m_oZoomScaleNormal->m_eValue; + else + pWsView->wScaleNormal = 0; + if (m_oZoomScalePageLayoutView.IsInit()) + pWsView->wScalePLV = m_oZoomScalePageLayoutView->m_eValue; + else + pWsView->wScalePLV = 0; + if (m_oZoomScaleSheetLayoutView.IsInit()) + pWsView->wScaleSLV = m_oZoomScaleSheetLayoutView->m_eValue; + else + pWsView->wScaleSLV = 0; + pWsView->rwTop = 0; + pWsView->colLeft = 0; + if(m_oPane.IsInit()) + ptr->m_BrtPane = m_oPane->toBin(); + + for(auto i:m_arrItems) + { + ptr->m_arBrtSel.push_back(i->toBin()); + } + return castedPtr; + + } + XLS::BaseObjectPtr CSheetView::toBinCs() + { + auto pWsView(new XLSB::BeginCsView); + XLS::BaseObjectPtr castedPtr(pWsView); + if(m_oTabSelected.IsInit()) + pWsView->fSelected = m_oTabSelected->m_eValue; + if(m_oWorkbookViewId.IsInit()) + pWsView->iWbkView = m_oWorkbookViewId->m_eValue; + if(m_oZoomScale.IsInit()) + pWsView->wScale = m_oZoomScale->m_eValue; + return castedPtr; + } EElementType CSheetView::getType() const { return et_x_SheetView; @@ -1152,6 +1613,21 @@ namespace OOX } } } + XLS::BaseObjectPtr CSheetViews::toBin() + { + auto castedPtr(new XLSB::WSVIEWS2); + XLS::BaseObjectPtr ptr(castedPtr); + for(auto i:m_arrItems) + castedPtr->m_arWSVIEW2.push_back(i->toBin()); + return ptr; + } + XLS::BaseObjectPtr CSheetViews::toBinCs() + { + auto ptr(new XLSB::CSVIEWS); + for(auto i:m_arrItems) + ptr->m_arCSVIEW.push_back(i->toBinCs()); + return XLS::BaseObjectPtr{ptr}; + } EElementType CSheetViews::getType() const { return et_x_SheetViews; @@ -1188,6 +1664,18 @@ namespace OOX { ReadAttributes(obj); } + void CPageSetUpPr::toBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if(m_oAutoPageBreaks.IsInit()) + ptr->fShowAutoBreaks = m_oAutoPageBreaks->GetValue(); + else + ptr->fShowAutoBreaks = true; + if(m_oFitToPage.IsInit()) + ptr->fFitToPage = m_oFitToPage->GetValue(); + else + ptr->fFitToPage = false; + } EElementType CPageSetUpPr::getType() const { return et_x_PageSetUpPr; @@ -1198,7 +1686,7 @@ namespace OOX if (ptr != nullptr) { m_oAutoPageBreaks = ptr->fShowAutoBreaks; - m_oFitToPage = ptr->fFitToPage;; + m_oFitToPage = ptr->fFitToPage; } } void CPageSetUpPr::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) @@ -1242,6 +1730,26 @@ namespace OOX { ReadAttributes(obj); } + void COutlinePr::toBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if(m_oApplyStyles.IsInit()) + ptr->fApplyStyles = m_oApplyStyles->GetValue(); + else + ptr->fApplyStyles = false; + if(m_oShowOutlineSymbols.IsInit()) + ptr->fShowOutlineSymbols = m_oShowOutlineSymbols->GetValue(); + else + ptr->fShowOutlineSymbols = true; + if(m_oSummaryBelow.IsInit()) + ptr->fRowSumsBelow = m_oSummaryBelow->GetValue(); + else + ptr->fRowSumsBelow = true; + if(m_oSummaryRight.IsInit()) + ptr->fColSumsRight = m_oSummaryRight->GetValue(); + else + ptr->fColSumsRight = true; + } EElementType COutlinePr::getType() const { return et_x_OutlinePr; @@ -1329,6 +1837,81 @@ namespace OOX m_oOutlinePr = oReader; } } + XLS::BaseObjectPtr CSheetPr::toBin() + { + auto ptr(new XLSB::WsProp); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCodeName.IsInit()) + ptr->strName.value = m_oCodeName.get(); + else + ptr->strName.value = L""; + if(m_oEnableFormatConditionsCalculation.IsInit()) + ptr->fCondFmtCalc = m_oEnableFormatConditionsCalculation->GetValue(); + if(m_oFilterMode.IsInit()) + ptr->fFilterMode = m_oFilterMode->GetValue(); + else + ptr->fFilterMode = false; + if(m_oPublished.IsInit()) + ptr->fPublish = m_oPublished->GetValue(); + else + ptr->fPublish = true; + if(m_oSyncHorizontal.IsInit()) + ptr->fSyncHoriz = m_oSyncHorizontal->GetValue(); + else + ptr->fSyncHoriz = false; + if(m_oSyncVertical.IsInit()) + ptr->fSyncVert = m_oSyncVertical->GetValue(); + else + ptr->fSyncVert = false; + if(m_oTransitionEntry.IsInit()) + ptr->fAltFormulaEntry = m_oTransitionEntry->GetValue(); + else + ptr->fAltFormulaEntry = false; + if(m_oTransitionEvaluation.IsInit()) + ptr->fAltExprEval = m_oTransitionEvaluation->GetValue(); + else + ptr->fAltExprEval = false; + if (m_oSyncRef.IsInit()) + ptr->syncRef = m_oSyncRef.get(); + else + ptr->syncRef = L""; + if(m_oTabColor.IsInit()) + ptr->brtcolorTab = m_oTabColor->toColor(); + else + ptr->brtcolorTab = m_oTabColor->GetDefaultColor(); + if(m_oPageSetUpPr.IsInit()) + m_oPageSetUpPr->toBin(objectPtr); + else + { + ptr->fFitToPage = false; + ptr->fShowAutoBreaks = true; + } + if(m_oOutlinePr.IsInit()) + m_oOutlinePr->toBin(objectPtr); + else + { + ptr->fApplyStyles = false; + ptr->fColSumsRight = true; + ptr->fRowSumsBelow = true; + ptr->fShowOutlineSymbols = true; + } + ptr->fDialog = false; + ptr->fCondFmtCalc = false; + return objectPtr; + } + XLS::BaseObjectPtr CSheetPr::toBinCs() + { + auto ptr(new XLSB::CsProp); + + if(m_oCodeName.IsInit()) + ptr->strName = m_oCodeName.get(); + if(m_oPublished.IsInit()) + ptr->fPublish = m_oPublished->GetValue(); + if(m_oTabColor.IsInit()) + ptr->brtcolorTab = m_oTabColor->toColor(); + return XLS::BaseObjectPtr{ptr}; + } + void CSheetPr::fromBin(XLS::BaseObjectPtr& obj) { if (obj->get_type() == XLS::typeWsProp) @@ -1563,6 +2146,50 @@ namespace OOX } } } + XLS::BaseObjectPtr CHeaderFooter::toBin() + { + auto ptr(new XLSB::HEADERFOOTER); + + XLS::BaseObjectPtr objectPtr(ptr); + + auto castedBegin(new XLSB::BeginHeaderFooter); + ptr->m_BrtBeginHeaderFooter = XLS::BaseObjectPtr{castedBegin}; + + if(m_oAlignWithMargins.IsInit()) + castedBegin->fHFAlignMargins = m_oAlignWithMargins->m_eValue; + if(m_oDifferentFirst.IsInit()) + castedBegin->fHFDiffFirst = m_oDifferentFirst->m_eValue; + if(m_oDifferentOddEven.IsInit()) + castedBegin->fHFDiffOddEven = m_oDifferentOddEven->m_eValue; + if(m_oScaleWithDoc.IsInit()) + castedBegin->fHFScaleWithDoc = m_oScaleWithDoc->m_eValue; + + if(m_oOddHeader.IsInit()) + castedBegin->stHeader = m_oOddHeader->m_sText; + else + castedBegin->stHeader = false; + if(m_oOddFooter.IsInit()) + castedBegin->stFooter = m_oOddFooter->m_sText; + else + castedBegin->stFooter = false; + if(m_oEvenHeader.IsInit()) + castedBegin->stHeaderEven = m_oEvenHeader->m_sText; + else + castedBegin->stHeaderEven = false; + if(m_oEvenFooter.IsInit()) + castedBegin->stFooterEven = m_oEvenFooter->m_sText; + else + castedBegin->stFooterEven = false; + if(m_oFirstHeader.IsInit()) + castedBegin->stHeaderFirst = m_oFirstHeader->m_sText; + else + castedBegin->stHeaderFirst = false; + if(m_oFirstFooter.IsInit()) + castedBegin->stFooterFirst = m_oFirstFooter->m_sText; + else + castedBegin->stFooterFirst = false; + return objectPtr; + } EElementType CHeaderFooter::getType() const { return et_x_HeaderFooterWorksheet; @@ -1639,6 +2266,14 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CLegacyDrawingHFWorksheet::toBin() + { + auto castedPtr(new XLSB::LegacyDrawingHF); + XLS::BaseObjectPtr ptr(castedPtr); + if (m_oId.IsInit()) + castedPtr->stRelId.value = m_oId->GetValue(); + return ptr; + } EElementType CLegacyDrawingHFWorksheet::getType() const { return et_x_LegacyDrawingHFWorksheet; @@ -1705,6 +2340,16 @@ namespace OOX if (!oReader.IsEmptyNode()) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CPictureWorksheet::toBin() + { + auto ptr(new XLSB::BkHim); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oId.IsInit()) + ptr->rgb.value = m_oId->GetValue(); + + return objectPtr; + } void CPictureWorksheet::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -1759,6 +2404,24 @@ namespace OOX if (!oReader.IsEmptyNode()) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CBreak::toBin() + { + auto ptr(new XLSB::Brk); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oId.IsInit()) + ptr->unRwCol = m_oId->GetValue(); + if(m_oMan.IsInit()) + ptr->fMan = m_oMan->GetValue(); + if(m_oMax.IsInit()) + ptr->unColRwStrt = m_oMax->GetValue(); + if(m_oMin.IsInit()) + ptr->unColRwEnd = m_oMin->GetValue(); + if(m_oPt.IsInit()) + ptr->fPivot = m_oPt->GetValue(); + + return objectPtr; + } void CBreak::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -1845,6 +2508,40 @@ namespace OOX } } } + XLS::BaseObjectPtr CRowColBreaks::toBinRow() + { + auto ptr(new XLSB::RWBRK); + XLS::BaseObjectPtr objectPtr(ptr); + auto rowPtr(new XLSB::BeginRwBrk); + ptr->m_BrtBeginRwBrk = XLS::BaseObjectPtr{rowPtr}; + if(m_oCount.IsInit()) + rowPtr->ibrkMac = m_oCount->GetValue(); + if(m_oManualBreakCount.IsInit()) + rowPtr->ibrkManMac = m_oManualBreakCount->GetValue(); + for(auto i:m_arrItems) + { + ptr->m_arBrtBrk.push_back(i->toBin()); + } + return objectPtr; + } + + XLS::BaseObjectPtr CRowColBreaks::toBinColumn() + { + auto ptr(new XLSB::COLBRK); + XLS::BaseObjectPtr objectPtr(ptr); + auto colPtr(new XLSB::BeginColBrk); + ptr->m_BrtBeginColBrk = XLS::BaseObjectPtr{colPtr}; + if(m_oCount.IsInit()) + colPtr->ibrkMac = m_oCount->GetValue(); + if(m_oManualBreakCount.IsInit()) + colPtr->ibrkManMac = m_oManualBreakCount->GetValue(); + for(auto i:m_arrItems) + { + ptr->m_arBrtBrk.push_back(i->toBin()); + } + return objectPtr; + } + void CRowColBreaks::fromBin(XLS::BaseObjectPtr& obj) { if (obj->get_type() == XLS::typeRWBRK) @@ -1954,6 +2651,271 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CSheetProtection::toBin() + { + if(m_oPassword.IsInit()) + { + auto ptr(new XLSB::SheetProtection); + XLS::BaseObjectPtr castedPtr(ptr); + + if (m_oPassword.IsInit()) + ptr->protpwd = std::stoul(m_oPassword.get()); + else + ptr->protpwd = 0; + + if (m_oAutoFilter.IsInit()) + ptr->fAutoFilter = !m_oAutoFilter->GetValue(); + else + ptr->fAutoFilter = true; + + if (m_oDeleteColumns.IsInit()) + ptr->fDeleteColumns = !m_oDeleteColumns->GetValue(); + else + ptr->fDeleteColumns= true; + + if (m_oDeleteRows.IsInit()) + ptr->fDeleteRows = !m_oDeleteRows->GetValue(); + else + ptr->fDeleteRows = true; + + if (m_oFormatCells.IsInit()) + ptr->fFormatCells = !m_oFormatCells->GetValue(); + else + ptr->fFormatCells = true; + + if (m_oFormatColumns.IsInit()) + ptr->fFormatColumns = !m_oFormatColumns->GetValue(); + else + ptr->fFormatColumns = true; + + if (m_oFormatRows.IsInit()) + ptr->fFormatRows = !m_oFormatRows->GetValue(); + else + ptr->fFormatRows = true; + + if (m_oInsertColumns.IsInit()) + ptr->fInsertColumns = !m_oInsertColumns->GetValue(); + else + ptr->fInsertColumns = true; + + if (m_oInsertHyperlinks.IsInit()) + ptr->fInsertHyperlinks = !m_oInsertHyperlinks->GetValue(); + else + ptr->fInsertHyperlinks = true; + + if (m_oInsertRows.IsInit()) + ptr->fInsertRows = !m_oInsertRows->GetValue(); + else + ptr->fInsertRows = true; + + if (m_oObjects.IsInit()) + ptr->fObjects = !m_oObjects->GetValue(); + else + ptr->fObjects = true; + + if (m_oPivotTables.IsInit()) + ptr->fPivotTables = !m_oPivotTables->GetValue(); + else + ptr->fPivotTables = true; + + if (m_oScenarios.IsInit()) + ptr->fScenarios = !m_oScenarios->GetValue(); + else + ptr->fScenarios = true; + + if (m_oSelectLockedCells.IsInit()) + ptr->fSelLockedCells = !m_oSelectLockedCells->GetValue(); + else + ptr->fSelLockedCells = true; + + if (m_oSelectUnlockedCells.IsInit()) + ptr->fSelUnlockedCells = !m_oSelectUnlockedCells->GetValue(); + else + ptr->fSelUnlockedCells = true; + + if (m_oSheet.IsInit()) + ptr->fLocked = m_oSheet->GetValue(); + else + ptr->fLocked = false; + + if (m_oSort.IsInit()) + ptr->fSort = !m_oSort->GetValue(); + else + ptr->fSort = true; + + return castedPtr; + } + else + { + auto ptr(new XLSB::SheetProtectionIso); + XLS::BaseObjectPtr castedPtr(ptr); + if(m_oAlgorithmName.IsInit()) + ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); + if(m_oSpinCount.IsInit()) + ptr->dwSpinCount = m_oSpinCount->GetValue(); + if(m_oHashValue.IsInit()) + { + BYTE * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); + auto tempSize = 0; + NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), + m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); + ptr->ipdPasswordData.rgbHash.cbLength = tempSize; + } + + if(m_oSaltValue.IsInit()) + { + BYTE * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); + auto tempSize2 = 0; + NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), + m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); + ptr->ipdPasswordData.rgbSalt.cbLength = tempSize2; + } + + if (m_oAutoFilter.IsInit()) + ptr->fAutoFilter = !m_oAutoFilter->GetValue(); + else + ptr->fAutoFilter = true; + + if (m_oDeleteColumns.IsInit()) + ptr->fDeleteColumns = !m_oDeleteColumns->GetValue(); + else + ptr->fDeleteColumns= true; + + if (m_oDeleteRows.IsInit()) + ptr->fDeleteRows = !m_oDeleteRows->GetValue(); + else + ptr->fDeleteRows = true; + + if (m_oFormatCells.IsInit()) + ptr->fFormatCells = !m_oFormatCells->GetValue(); + else + ptr->fFormatCells = true; + + if (m_oFormatColumns.IsInit()) + ptr->fFormatColumns = !m_oFormatColumns->GetValue(); + else + ptr->fFormatColumns = true; + + if (m_oFormatRows.IsInit()) + ptr->fFormatRows = !m_oFormatRows->GetValue(); + else + ptr->fFormatRows = true; + + if (m_oInsertColumns.IsInit()) + ptr->fInsertColumns = !m_oInsertColumns->GetValue(); + else + ptr->fInsertColumns = true; + + if (m_oInsertHyperlinks.IsInit()) + ptr->fInsertHyperlinks = !m_oInsertHyperlinks->GetValue(); + else + ptr->fInsertHyperlinks = true; + + if (m_oInsertRows.IsInit()) + ptr->fInsertRows = !m_oInsertRows->GetValue(); + else + ptr->fInsertRows = true; + + if (m_oObjects.IsInit()) + ptr->fObjects = !m_oObjects->GetValue(); + else + ptr->fObjects = true; + + if (m_oPivotTables.IsInit()) + ptr->fPivotTables = !m_oPivotTables->GetValue(); + else + ptr->fPivotTables = true; + + if (m_oScenarios.IsInit()) + ptr->fScenarios = !m_oScenarios->GetValue(); + else + ptr->fScenarios = true; + + if (m_oSelectLockedCells.IsInit()) + ptr->fSelLockedCells = !m_oSelectLockedCells->GetValue(); + else + ptr->fSelLockedCells = true; + + if (m_oSelectUnlockedCells.IsInit()) + ptr->fSelUnlockedCells = !m_oSelectUnlockedCells->GetValue(); + else + ptr->fSelUnlockedCells = true; + + if (m_oSheet.IsInit()) + ptr->fLocked = m_oSheet->GetValue(); + else + ptr->fLocked = false; + + if (m_oSort.IsInit()) + ptr->fSort = !m_oSort->GetValue(); + else + ptr->fSort = true; + + return castedPtr; + } + } + XLS::BaseObjectPtr CSheetProtection::toBinCS() + { + XLS::BaseObjectPtr objectPtr; + if(m_oPassword.IsInit()) + { + auto ptr(new XLSB::CsProtection); + objectPtr = XLS::BaseObjectPtr{ptr}; + ptr->protpwd = std::stoul(m_oPassword.get()); + if(m_oObjects.IsInit()) + ptr->fObjects = m_oObjects->GetValue(); + else + ptr->fObjects = false; + if(m_oSheet.IsInit()) + ptr->fLocked = m_oSheet->GetValue(); + else + ptr->fObjects = false; + } + else + { + auto ptr(new XLSB::CsProtectionIso); + objectPtr = XLS::BaseObjectPtr{ptr}; + + if(m_oAlgorithmName.IsInit()) + ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); + else + ptr->ipdPasswordData.szAlgName = false; + if(m_oSpinCount.IsInit()) + ptr->dwSpinCount = m_oSpinCount->GetValue(); + else + ptr->dwSpinCount = 0; + + if(m_oHashValue.IsInit()) + { + BYTE * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); + auto tempSize = 0; + NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), + m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); + ptr->ipdPasswordData.rgbHash.cbLength = tempSize; + } + + if(m_oSaltValue.IsInit()) + { + BYTE * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); + auto tempSize2 = 0; + NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), + m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); + ptr->ipdPasswordData.rgbSalt.cbLength = tempSize2; + } + + if(m_oObjects.IsInit()) + ptr->fObjects = m_oObjects->GetValue(); + else + ptr->fObjects = false; + if(m_oSheet.IsInit()) + ptr->fLocked = m_oSheet->GetValue(); + else + ptr->fObjects = false; + + } + + return objectPtr; + } EElementType CSheetProtection::getType() const { return et_x_SheetProtection; @@ -2102,6 +3064,31 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CDataRef::toBin() + { + auto ptr(new XLSB::DRef); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oId.IsInit()) + ptr->relId.value = m_oId->GetValue(); + + if (m_oName.IsInit()) + ptr->xstrName = m_oName.get(); + else + { + ptr->fName = false; + ptr->fBuiltin = false; + } + if (m_oRef.IsInit()) + ptr->rfx = m_oRef.get(); + + if (m_oSheet.IsInit()) + ptr->xstrSheet = m_oSheet.get(); + else + ptr->xstrSheet = L""; + + return objectPtr; + } EElementType CDataRef::getType() const { return et_x_DataRef; @@ -2193,6 +3180,20 @@ namespace OOX m_arrItems.push_back(new CDataRef(dref)); } } + XLS::BaseObjectPtr CDataRefs::toBin() + { + auto ptr(new XLSB::DREFS); + XLS::BaseObjectPtr objectPtr(ptr); + auto beginRefs(new XLSB::BeginDRefs); + ptr->m_BrtBeginDRefs = XLS::BaseObjectPtr{beginRefs}; + + for(auto i:m_arrItems) + { + ptr->m_arBrtDRef.push_back(i->toBin()); + } + beginRefs->cdref = ptr->m_arBrtDRef.size(); + return objectPtr; + } EElementType CDataRefs::getType() const { return et_x_DataRefs; @@ -2244,6 +3245,36 @@ namespace OOX m_oDataRefs = oReader; } } + XLS::BaseObjectPtr CDataConsolidate::toBin() + { + auto ptr(new XLSB::DCON); + XLS::BaseObjectPtr objectPtr(ptr); + auto beginPtr(new XLSB::BeginDCon); + ptr->m_BrtBeginDCon = XLS::BaseObjectPtr{beginPtr}; + + if(m_oFunction.IsInit()) + beginPtr->iiftab = m_oFunction->GetValue(); + else + beginPtr->iiftab = 0; + if(m_oFunction.IsInit()) + beginPtr->fLinkConsol = m_oLink->GetValue(); + else + beginPtr->fLinkConsol = false; + if(m_oFunction.IsInit()) + beginPtr->fLeftCat = m_oStartLabels->GetValue(); + else + beginPtr->fLeftCat = false; + if(m_oFunction.IsInit()) + beginPtr->fTopCat = m_oTopLabels->GetValue(); + else + beginPtr->fTopCat = false; + + if(m_oDataRefs.IsInit()) + { + ptr->m_DREFS = m_oDataRefs->toBin(); + } + return objectPtr; + } void CDataConsolidate::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -2301,6 +3332,7 @@ namespace OOX WritingElement_ReadAttributes_Start(oReader) WritingElement_ReadAttributes_Read_if(oReader, L"name", m_oName) WritingElement_ReadAttributes_Read_else_if(oReader, L"sqref", m_oSqref) + WritingElement_ReadAttributes_Read_else_if(oReader, L"type", m_oType) WritingElement_ReadAttributes_End(oReader) } void CUserProtectedRange::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -2331,6 +3363,7 @@ namespace OOX WritingElement_ReadAttributes_Start(oReader) WritingElement_ReadAttributes_Read_if(oReader, L"id", desc.id) WritingElement_ReadAttributes_Read_else_if(oReader, L"name", desc.name) + WritingElement_ReadAttributes_Read_else_if(oReader, L"type", desc.type) WritingElement_ReadAttributes_End(oReader) m_arUsers.push_back(desc); } @@ -2348,6 +3381,7 @@ namespace OOX WritingElement_ReadAttributes_Start(oReader) WritingElement_ReadAttributes_Read_if(oReader, L"id", desc.id) WritingElement_ReadAttributes_Read_else_if(oReader, L"name", desc.name) + WritingElement_ReadAttributes_Read_else_if(oReader, L"type", desc.type) WritingElement_ReadAttributes_End(oReader) m_arUsersGroups.push_back(desc); } @@ -2360,6 +3394,7 @@ namespace OOX writer.WriteString(L"ToString()) writer.WriteString(L">"); if (m_oText.IsInit()) @@ -2376,6 +3411,7 @@ namespace OOX writer.WriteString(L"ToString()) writer.WriteString(L"/>"); } writer.WriteString(L""); @@ -2388,6 +3424,7 @@ namespace OOX writer.WriteString(L"ToString()) writer.WriteString(L"/>"); } writer.WriteString(L""); diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 5ad4d9a39b..201fea2061 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -55,6 +55,7 @@ namespace SimpleTypes class CPaneState; class CSheetViewType; class CDataConsolidateFunction; + class CUserProtectedRangeType; } } @@ -79,6 +80,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -108,6 +110,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType() const; }; @@ -169,6 +172,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -199,6 +203,8 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinCs(); virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -241,6 +247,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -269,6 +276,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; @@ -295,6 +303,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -328,6 +337,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -357,6 +367,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -388,6 +399,8 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinCs(); virtual EElementType getType () const; private: @@ -433,6 +446,8 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinCs(); virtual EElementType getType () const; }; @@ -451,6 +466,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + void toBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; private: @@ -477,6 +493,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + void toBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; private: @@ -505,6 +522,8 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinCs(); virtual EElementType getType () const; private: @@ -564,6 +583,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; @@ -601,6 +621,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -644,6 +665,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -669,6 +691,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -699,6 +722,8 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBinColumn(); + XLS::BaseObjectPtr toBinRow(); virtual EElementType getType () const; @@ -726,6 +751,8 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinCS(); virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -771,6 +798,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -797,6 +825,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -821,6 +850,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -841,6 +871,7 @@ namespace OOX { nullable_string id; nullable_string name; + nullable type; }; WritingElement_AdditionMethods(CUserProtectedRange) @@ -860,6 +891,7 @@ namespace OOX nullable_string m_oName; nullable_string m_oSqref; nullable_string m_oText; + nullable m_oType; std::vector<_UsersGroupsDesc> m_arUsers; std::vector<_UsersGroupsDesc> m_arUsersGroups; diff --git a/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp b/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp index 38782073a3..3b4bd4a027 100644 --- a/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp +++ b/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp @@ -35,6 +35,8 @@ #include "../../Common/SimpleTypes_Shared.h" +#include "../../XlsbFormat/Biff12_unions/HLINKS.h" + namespace OOX { namespace Spreadsheet @@ -73,6 +75,32 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CHyperlink::toBin() + { + auto castedPtr(new XLSB::HLink); + XLS::BaseObjectPtr ptr(castedPtr); + + if(m_oDisplay.IsInit()) + castedPtr->display = m_oDisplay.get(); + else + castedPtr->display = L""; + if(m_oRid.IsInit()) + castedPtr->relId.value = m_oRid->GetValue(); + else + castedPtr->relId.value = L""; + if(m_oLocation.IsInit()) + castedPtr->location = m_oLocation.get(); + else + castedPtr->location = L""; + if(m_oRef.IsInit()) + castedPtr->rfx = m_oRef.get(); + if(m_oTooltip.IsInit()) + castedPtr->tooltip = m_oTooltip.get(); + else + castedPtr->tooltip = L""; + + return ptr; + } EElementType CHyperlink::getType () const { return et_x_Hyperlink; @@ -160,6 +188,19 @@ namespace OOX pHyperlink->fromBin(hyperlink); } } + XLS::BaseObjectPtr CHyperlinks::toBin() + { + + auto castedPtr(new XLSB::HLINKS); + XLS::BaseObjectPtr ptr(castedPtr); + + for(auto i:m_arrItems) + { + castedPtr->m_arHlinks.push_back(i->toBin()); + } + return ptr; + } + EElementType CHyperlinks::getType () const { return et_x_Hyperlinks; diff --git a/OOXML/test/ExampleFiles/xlsb2xlsx/simple2.xlsx b/OOXML/test/ExampleFiles/xlsb2xlsx/simple2.xlsx index e49f4060d7..7cf898ccb1 100644 Binary files a/OOXML/test/ExampleFiles/xlsb2xlsx/simple2.xlsx and b/OOXML/test/ExampleFiles/xlsb2xlsx/simple2.xlsx differ diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb new file mode 100644 index 0000000000..7a984b15fd Binary files /dev/null and b/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb differ diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsx b/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsx new file mode 100644 index 0000000000..99714a52fd Binary files /dev/null and b/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsx differ diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb new file mode 100644 index 0000000000..6aac6466df Binary files /dev/null and b/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb differ diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsx b/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsx new file mode 100644 index 0000000000..1e0eb8a57a Binary files /dev/null and b/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsx differ diff --git a/OOXML/test/common.cpp b/OOXML/test/common.cpp index cde7cd8c13..daac3751ae 100644 --- a/OOXML/test/common.cpp +++ b/OOXML/test/common.cpp @@ -95,14 +95,6 @@ std::wstring CreateParamsFile(const std::wstring &pathFrom, const std::wstring & oBuilder.WriteEncodeXmlString(pathTo); oBuilder.WriteString(L""); - oBuilder.WriteString(L""); - int nFormat = COfficeFileFormatChecker::GetFormatByExtension(L"." + NSFile::GetFileExtention(pathTo)); - oBuilder.WriteString(std::to_wstring(nFormat)); - oBuilder.WriteString(L""); - - if (nFormat == AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDFA) - oBuilder.WriteString(L"true"); - // changes oBuilder.WriteString(L"false"); diff --git a/OOXML/test/test.pro b/OOXML/test/test.pro index 4763e64c7c..d9ab1094cd 100644 --- a/OOXML/test/test.pro +++ b/OOXML/test/test.pro @@ -14,7 +14,8 @@ SOURCES += $$X2T_DIR/src/dylib/x2t.cpp SOURCES += main.cpp\ common.cpp\ - xlsb2xlsx/conversion.cpp + xlsb2xlsx/conversion.cpp\ + xlsx2xlsb/conversion.cpp\ HEADERS += common.h diff --git a/OOXML/test/xlsx2xlsb/conversion.cpp b/OOXML/test/xlsx2xlsb/conversion.cpp new file mode 100644 index 0000000000..2b0d8dec0b --- /dev/null +++ b/OOXML/test/xlsx2xlsb/conversion.cpp @@ -0,0 +1,364 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +#include "../common.h" +#include +#include +#include +#include "gtest/gtest.h" + +namespace xlsb2xlsxTests +{ +void processTestFile(const std::wstring &tempDir, const std::wstring &testFile, const std::wstring &resultFile, const std::wstring &exampleFile) +{ + + boost::filesystem::path rootPath = std::wstring{L".."} + FILE_SEPARATOR_STR; + rootPath =boost::filesystem::absolute(rootPath.wstring() + rootPath.wstring() + rootPath.wstring()+ rootPath.wstring()); + boost::filesystem::path filePath = rootPath.wstring() +L"OOXML" + FILE_SEPARATOR_STR + L"test" + FILE_SEPARATOR_STR +L"ExampleFiles" + + FILE_SEPARATOR_STR + L"xlsx2xlsb" + FILE_SEPARATOR_STR + testFile; + boost::filesystem::path examplePath = rootPath.wstring() +L"OOXML" + FILE_SEPARATOR_STR + L"test" + FILE_SEPARATOR_STR +L"ExampleFiles" + + FILE_SEPARATOR_STR + L"xlsx2xlsb" + FILE_SEPARATOR_STR + exampleFile; + + std::wstring resultPath = tempDir + FILE_SEPARATOR_STR + resultFile; + + auto paramsPath = CreateParamsFile(filePath.wstring(), resultPath, tempDir); + ConvertFile(paramsPath); + PrepareFiles(resultPath, examplePath.wstring(), tempDir); +} + +class XlsbSimpleTests1 : public ::testing::Test +{ +public: + + static void SetUpTestCase() + { + + tempDir = GetWorkDir(); + processTestFile(tempDir, L"simple1.xlsx", L"result.xlsb", L"simple1.xlsb"); + } + + + static void TearDownTestCase() + { + RemoveWorkDir(tempDir); + } + + static std::wstring tempDir; +}; +class XlsbSimpleTests2 : public ::testing::Test +{ +public: + + static void SetUpTestCase() + { + + tempDir = GetWorkDir(); + processTestFile(tempDir, L"simple2.xlsx", L"result.xlsb", L"simple2.xlsb"); + } + + + static void TearDownTestCase() + { + RemoveWorkDir(tempDir); + } + + static std::wstring tempDir; +}; + +std::wstring XlsbSimpleTests1::tempDir = L""; +std::wstring XlsbSimpleTests2::tempDir = L""; + +_UINT32 readBinaryFiles(const std::wstring &filePath, const std::wstring &examplePath, std::vector &fileContent, std::vector &exampleContent) +{ + boost::filesystem::path path1(filePath); + boost::filesystem::path path2(examplePath); + path1 = boost::filesystem::absolute(path1); + path2 = boost::filesystem::absolute(path2); + std::ifstream file1(path1.string(), std::ios::binary); + std::ifstream file2(path2.string(), std::ios::binary); + + if (!file1.is_open() || !file2.is_open()) + { + return 1; + } + + fileContent = std::vector((std::istreambuf_iterator(file1)), std::istreambuf_iterator()); + exampleContent = std::vector((std::istreambuf_iterator(file2)), std::istreambuf_iterator()); + + return 0; +} + + +TEST_F(XlsbSimpleTests1, ContentTypesTest) +{ + auto tempDir = XlsbSimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR + L"example_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests1, WorkbookTest) +{ + auto tempDir = XlsbSimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests1, StylesTest) +{ + auto tempDir = XlsbSimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests1, SharedStringsTest) +{ + auto tempDir = XlsbSimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests1, WorksheetsTest) +{ + auto tempDir = XlsbSimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, ContentTypesTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR + L"example_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, WorkbookTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, StylesTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, SharedStringsTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, Worksheet1Test) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, Worksheet2Test) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, CommentsTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"comments2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"comments2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, TablesTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"tables" + FILE_SEPARATOR_STR + L"table2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"tables" + FILE_SEPARATOR_STR + L"table2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, SlicerTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"slicers" + FILE_SEPARATOR_STR + L"slicer2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"slicers" + FILE_SEPARATOR_STR + L"slicer2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, SlicerCacheTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"slicerCaches" + FILE_SEPARATOR_STR + L"slicerCache2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"slicerCaches" + FILE_SEPARATOR_STR + L"slicerCache2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, PivotTableTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"pivotTables" + FILE_SEPARATOR_STR + L"pivotTable2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"pivotTables" + FILE_SEPARATOR_STR + L"pivotTable2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, PivotCacheDefTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"pivotCache" + FILE_SEPARATOR_STR + L"pivotCacheDefinition2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"pivotCache" + FILE_SEPARATOR_STR + L"pivotCacheDefinition2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, PivotCacheRecordsTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"pivotCache" + FILE_SEPARATOR_STR + L"pivotCacheRecords2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"pivotCache" + FILE_SEPARATOR_STR + L"pivotCacheRecords2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, ChartSheetTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"chartsheets" + FILE_SEPARATOR_STR + L"sheet1.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"chartsheets" + FILE_SEPARATOR_STR + L"sheet1.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +} \ No newline at end of file diff --git a/OdfFile/Reader/Converter/docx_conversion_context.cpp b/OdfFile/Reader/Converter/docx_conversion_context.cpp index 3f43a5fbd5..344f467955 100644 --- a/OdfFile/Reader/Converter/docx_conversion_context.cpp +++ b/OdfFile/Reader/Converter/docx_conversion_context.cpp @@ -751,6 +751,15 @@ void docx_conversion_context::end_document() output_document_->get_docProps_files().set_app(package::simple_element::create(L"app.xml", dump_settings_app())); output_document_->get_docProps_files().set_core(package::simple_element::create(L"core.xml", dump_settings_core())); + std::wstring settings_custom = dump_settings_custom(); + if (false == settings_custom.empty()) + { + output_document_->get_docProps_files().set_custom(package::simple_element::create(L"custom.xml", settings_custom)); + output_document_->get_content_types_file().content()->add_override(L"/docProps/custom.xml", L"application/vnd.openxmlformats-officedocument.custom-properties+xml"); + output_document_->get_rels_files().add( + relationship(L"rCstmId", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties", L"docProps/custom.xml")); + } + for (size_t i = 0; i < charts_.size(); i++) { package::chart_content_ptr content = package::chart_content::create(); @@ -899,6 +908,24 @@ std::wstring docx_conversion_context::dump_settings_app() } return output.str(); } +std::wstring docx_conversion_context::dump_settings_custom() +{ + std::wstring user_defined = odf_document_->odf_context().DocProps().dump_user_defined(); + if (user_defined.empty()) return L""; + + std::wstringstream output; + CP_XML_WRITER(output) + { + CP_XML_NODE(L"Properties") + { + CP_XML_ATTR(L"xmlns", L"http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"); + CP_XML_ATTR(L"xmlns:vt", L"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); + + CP_XML_STREAM() << user_defined; + } + } + return output.str(); +} std::wstring docx_conversion_context::dump_settings_core() { std::wstringstream output; @@ -2377,7 +2404,7 @@ void docx_conversion_context::start_text_changes (const std::wstring &id) if (state_.in_paragraph_) { - std::wstring format_change = L" w:date=\"" + state.date + L"\" w:author=\"" + state.author + L"\""; + std::wstring format_change = L" w:date=\"" + state.date + L"\" w:author=\"" + XmlUtils::EncodeXmlString(state.author) + L"\""; finish_run(); state.in_drawing = get_drawing_state_content(); @@ -2438,7 +2465,7 @@ void docx_conversion_context::start_changes(bool in_para) std::wstring change_attr; change_attr += L" w:date=\"" + state.date + L"\""; - change_attr += L" w:author=\"" + state.author + L"\""; + change_attr += L" w:author=\"" + XmlUtils::EncodeXmlString(state.author) + L"\""; if (state.oox_id == 0) { diff --git a/OdfFile/Reader/Converter/docx_conversion_context.h b/OdfFile/Reader/Converter/docx_conversion_context.h index 895252b8e5..8ae7c5c4f9 100644 --- a/OdfFile/Reader/Converter/docx_conversion_context.h +++ b/OdfFile/Reader/Converter/docx_conversion_context.h @@ -803,6 +803,7 @@ public: std::wstring dump_settings_document(); std::wstring dump_settings_app(); std::wstring dump_settings_core(); + std::wstring dump_settings_custom(); bool next_dump_page_properties_; bool next_dump_section_; diff --git a/OdfFile/Reader/Converter/docx_package.cpp b/OdfFile/Reader/Converter/docx_package.cpp index 63570d4cf4..45916a33dc 100644 --- a/OdfFile/Reader/Converter/docx_package.cpp +++ b/OdfFile/Reader/Converter/docx_package.cpp @@ -461,7 +461,7 @@ void comments_elements::write(const std::wstring & RootPath) { content << L"0) - content << L"w:author=\""<< elm.author << "\" "; + content << L"w:author=\""<< XmlUtils::EncodeXmlString(elm.author) << "\" "; if (elm.date.length()>0) content << L"w:date=\""<< elm.date << "\" "; content<< L">"; diff --git a/OdfFile/Reader/Converter/oox_package.cpp b/OdfFile/Reader/Converter/oox_package.cpp index 73f71f9cb2..c7ae4fc7f2 100644 --- a/OdfFile/Reader/Converter/oox_package.cpp +++ b/OdfFile/Reader/Converter/oox_package.cpp @@ -314,7 +314,6 @@ simple_element_ptr simple_element::create(const std::wstring & FileName, const s //----------------------------------------------------------------------------------------------- docProps_files::docProps_files() { - } std::wstring docProps_files::create_core() { @@ -358,6 +357,10 @@ void docProps_files::set_core(element_ptr Element) { core_ = Element; } +void docProps_files::set_custom(element_ptr Element) +{ + custom_ = Element; +} void docProps_files::write(const std::wstring & RootPath) { std::wstring path = RootPath + FILE_SEPARATOR_STR + L"docProps"; @@ -368,6 +371,8 @@ void docProps_files::write(const std::wstring & RootPath) core_->write(path); app_->write(path); + + if (custom_) custom_->write(path); } //--------------------------------------------------------------------------------------------------- media::media(mediaitems_ptr & _mediaitems, NSFonts::IApplicationFonts *pAppFonts) : mediaItems_(_mediaitems), appFonts_(pAppFonts) diff --git a/OdfFile/Reader/Converter/oox_package.h b/OdfFile/Reader/Converter/oox_package.h index 314537181a..38169628f6 100644 --- a/OdfFile/Reader/Converter/oox_package.h +++ b/OdfFile/Reader/Converter/oox_package.h @@ -203,6 +203,7 @@ public: void set_app(element_ptr Element); void set_core(element_ptr Element); + void set_custom(element_ptr Element); virtual void write(const std::wstring & RootPath); @@ -212,6 +213,7 @@ private: element_ptr core_; element_ptr app_; + element_ptr custom_; }; class document : public element { diff --git a/OdfFile/Reader/Converter/oox_rels.cpp b/OdfFile/Reader/Converter/oox_rels.cpp index f51ca1710d..d6fca2e5c4 100644 --- a/OdfFile/Reader/Converter/oox_rels.cpp +++ b/OdfFile/Reader/Converter/oox_rels.cpp @@ -52,7 +52,7 @@ std::wostream & relationship::xml_to_stream(std::wostream & _Wostream) const CP_XML_ATTR(L"Type", type()); CP_XML_ATTR(L"Target", target()); - if (!target_mode().empty()) + if (!target_mode().empty() && type() != L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide") CP_XML_ATTR(L"TargetMode", target_mode()); } } diff --git a/OdfFile/Reader/Converter/pptx_conversion_context.cpp b/OdfFile/Reader/Converter/pptx_conversion_context.cpp index cd06a9bd62..f857f0e1d0 100644 --- a/OdfFile/Reader/Converter/pptx_conversion_context.cpp +++ b/OdfFile/Reader/Converter/pptx_conversion_context.cpp @@ -461,6 +461,7 @@ const std::vector& pptx_conversion_context::get_page_names() const { create_new_slide(pageName); get_slide_context().start_slide();//pageName, pageStyleName); + get_slide_context().get_animation_context().clear(); current_master_page_name_ = pageMasterName; current_layout_page_name_ = pageLayoutName; diff --git a/OdfFile/Reader/Converter/pptx_drawings.cpp b/OdfFile/Reader/Converter/pptx_drawings.cpp index 516633bbf6..b60312ccc2 100644 --- a/OdfFile/Reader/Converter/pptx_drawings.cpp +++ b/OdfFile/Reader/Converter/pptx_drawings.cpp @@ -31,6 +31,7 @@ */ #include +#include #include "oox_rels.h" @@ -74,8 +75,13 @@ public: } } - if(!found) - pptx_drawing_rels_.push_back(_rel(false, d.hlinks[i].hId, d.hlinks[i].hRef, typeHyperlink)); + if (!found) + { + oox::_rels_type type = boost::algorithm::starts_with(d.hlinks[i].hRef, L"slide") && + boost::algorithm::ends_with(d.hlinks[i].hRef, L".xml") ? typeSlide : typeHyperlink; + pptx_drawing_rels_.push_back(_rel(false, d.hlinks[i].hId, d.hlinks[i].hRef, type)); + } + } if (!d.action.hId.empty()) { diff --git a/OdfFile/Reader/Converter/pptx_slide_context.cpp b/OdfFile/Reader/Converter/pptx_slide_context.cpp index 3a9d5f1845..cc9248c690 100644 --- a/OdfFile/Reader/Converter/pptx_slide_context.cpp +++ b/OdfFile/Reader/Converter/pptx_slide_context.cpp @@ -170,6 +170,7 @@ public: private: void process_common_properties(drawing_object_description& obj, _pptx_drawing & drawing); + void process_crop(const drawing_object_description& obj, _pptx_drawing& drawing, const std::wstring& filename); void process_shape (drawing_object_description& obj, _pptx_drawing & drawing); void process_image (drawing_object_description& obj, _pptx_drawing & drawing); @@ -688,8 +689,7 @@ void pptx_slide_context::Impl::process_image(drawing_object_description& obj, _p } std::wstring fileName = odfPacket_ + FILE_SEPARATOR_STR + obj.xlink_href_; - drawing.fill.bitmap->bCrop = odf_reader::parse_clipping(obj.clipping_string_, fileName, drawing.fill.bitmap->cropRect, get_mediaitems()->applicationFonts()); - drawing.fill.bitmap->bStretch = true; + process_crop(obj, drawing, fileName); if ((sColorMode) && (*sColorMode == L"greyscale")) drawing.fill.bitmap->luminance = true; @@ -748,6 +748,9 @@ void pptx_slide_context::Impl::process_shape(drawing_object_description & obj, _ drawing.fill.bitmap->rId = get_mediaitems()->add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref, oox::document_place); add_additional_rels(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage); + + std::wstring fileName = odfPacket_ + FILE_SEPARATOR_STR + drawing.fill.bitmap->xlink_href_; + process_crop(obj, drawing, fileName); } std::wstring rId = get_mediaitems()->add_or_find(L"", typeShape, isMediaInternal, ref, oox::document_place); @@ -845,6 +848,12 @@ void pptx_slide_context::Impl::process_common_properties(drawing_object_descript drawing.fill = pic.fill_; } +void pptx_slide_context::Impl::process_crop(const drawing_object_description& obj, _pptx_drawing& drawing, const std::wstring& filename) +{ + drawing.fill.bitmap->bCrop = odf_reader::parse_clipping(obj.clipping_string_, filename, drawing.fill.bitmap->cropRect, get_mediaitems()->applicationFonts()); + drawing.fill.bitmap->bStretch = true; +} + void pptx_slide_context::dump_rels(rels & Rels) { impl_->get_drawings()->dump_rels(Rels); diff --git a/OdfFile/Reader/Converter/pptx_text_context.cpp b/OdfFile/Reader/Converter/pptx_text_context.cpp index 0bfc224aea..ccc4b7a24e 100644 --- a/OdfFile/Reader/Converter/pptx_text_context.cpp +++ b/OdfFile/Reader/Converter/pptx_text_context.cpp @@ -80,8 +80,12 @@ public: void set_local_styles_container(odf_reader::styles_container* local_styles_);//это если стили объектов содержатся в другом документе - void end_hyperlink (std::wstring hId); + hyperlink_data get_hyperlink(); void start_hyperlink(); + void set_rel_id(const std::wstring& rId); + void set_action(const std::wstring& action); + void end_hyperlink (); + void start_list (const std::wstring & StyleName, bool Continue = false); void end_list (); @@ -94,6 +98,8 @@ public: void start_comment (); std::wstring end_comment(); + std::wstring get_last_paragraph_style_name(); + bool in_list_; bool process_layouts_; @@ -102,6 +108,7 @@ private: odf_reader::odf_read_context & odf_context_ ; std::wstring hyperlink_hId; + hyperlink_data hyperlink_; bool in_span; bool in_paragraph; @@ -124,6 +131,7 @@ private: std::wstringstream paragraph_; //перманенто скидываемые параграфы std::wstringstream run_; //перманенто скидываемые куски с быть может разными свойствами + std::wstring last_paragraph_style_name_; std::wstring paragraph_style_name_; std::wstring span_style_name_; @@ -195,9 +203,10 @@ void pptx_text_context::Impl::start_paragraph(const std::wstring & styleName) text_.str(std::wstring()); field_value_.str(std::wstring()); } - paragraph_style_name_ = styleName; - in_paragraph = true; - is_predump = false; + last_paragraph_style_name_ = paragraph_style_name_; + paragraph_style_name_ = styleName; + in_paragraph = true; + is_predump = false; } void pptx_text_context::Impl::end_paragraph() @@ -240,11 +249,10 @@ void pptx_text_context::Impl::start_hyperlink() dump_run();//проверить } -void pptx_text_context::Impl::end_hyperlink(std::wstring hId) +void pptx_text_context::Impl::end_hyperlink() { - hyperlink_hId = hId; dump_run(); - hyperlink_hId = L""; + hyperlink_ = { L"", L"" }; } void pptx_text_context::Impl::ApplyTextProperties(std::wstring style_name, std::wstring para_style_name, odf_reader::text_format_properties & propertiesOut, bool inStyle) { @@ -393,7 +401,7 @@ void pptx_text_context::Impl::write_pPr(std::wostream & strm) const std::wstring & paragraphNodes = get_styles_context().paragraph_nodes().str(); - if (level < 0 && paragraphAttr.length() < 1 && !paragraphNodes.empty()) return; + if (level < 0 && paragraphAttr.length() < 1 && paragraphNodes.empty()) return; strm << L"start_hyperlink(); } -void pptx_text_context::end_hyperlink(std::wstring hId) +void pptx_text_context::set_rel_id(const std::wstring& rId) { - return impl_->end_hyperlink(hId); + impl_->set_rel_id(rId); +} +void pptx_text_context::set_action(const std::wstring& action) +{ + impl_->set_action(action); +} +void pptx_text_context::end_hyperlink() +{ + return impl_->end_hyperlink(); } std::wstring pptx_text_context::end_object() { return impl_->end_object(); } + +hyperlink_data pptx_text_context::get_hyperlink() +{ + return impl_->get_hyperlink(); +} + styles_context & pptx_text_context::get_styles_context() { return impl_->get_styles_context() ; @@ -900,5 +942,10 @@ void pptx_text_context::set_process_layouts(bool val) impl_->process_layouts_ = val; } +std::wstring pptx_text_context::get_last_paragraph_style_name() +{ + return impl_->get_last_paragraph_style_name(); +} + } } diff --git a/OdfFile/Reader/Converter/pptx_text_context.h b/OdfFile/Reader/Converter/pptx_text_context.h index a0aa4dc68a..ffb9d306a2 100644 --- a/OdfFile/Reader/Converter/pptx_text_context.h +++ b/OdfFile/Reader/Converter/pptx_text_context.h @@ -58,6 +58,12 @@ enum field_type datetime }; +struct hyperlink_data +{ + std::wstring rId; + std::wstring action; +}; + class pptx_text_context: boost::noncopyable { public: @@ -85,8 +91,11 @@ public: void start_object(); std::wstring end_object(); + hyperlink_data get_hyperlink(); void start_hyperlink(); - void end_hyperlink(std::wstring hId); + void set_rel_id(const std::wstring& rId); + void set_action(const std::wstring& action); + void end_hyperlink(); void start_field(field_type type, const std::wstring & styleName);//1 - datetime, 2 -pagecount, 3 - pagenumber - void end_field(); @@ -102,6 +111,8 @@ public: styles_context & get_styles_context(); void set_process_layouts(bool val); + + std::wstring get_last_paragraph_style_name(); private: diff --git a/OdfFile/Reader/Format/draw_page.cpp b/OdfFile/Reader/Format/draw_page.cpp index 12fe1fecab..ac0ab28507 100644 --- a/OdfFile/Reader/Format/draw_page.cpp +++ b/OdfFile/Reader/Format/draw_page.cpp @@ -207,7 +207,6 @@ void draw_page::pptx_convert(oox::pptx_conversion_context & Context) } Context.end_page(); - Context.get_slide_context().get_animation_context().clear(); if (presentation_notes_) { diff --git a/OdfFile/Reader/Format/draw_shapes_pptx.cpp b/OdfFile/Reader/Format/draw_shapes_pptx.cpp index 5a28971259..e3e2cd70ba 100644 --- a/OdfFile/Reader/Format/draw_shapes_pptx.cpp +++ b/OdfFile/Reader/Format/draw_shapes_pptx.cpp @@ -139,6 +139,12 @@ void draw_shape::common_pptx_convert(oox::pptx_conversion_context & Context) { properties->apply_to(Context.get_slide_context().get_properties()); Compute_GraphicFill(properties->common_draw_fill_attlist_, properties->style_background_image_, Context.root(), fill); + + if (properties->fo_clip_) + { + std::wstring strRectClip = properties->fo_clip_.get(); + Context.get_slide_context().set_clipping(strRectClip.substr(5, strRectClip.length() - 6)); + } } for (size_t i = 0; i < additional_.size(); i++) { diff --git a/OdfFile/Reader/Format/paragraph_elements.cpp b/OdfFile/Reader/Format/paragraph_elements.cpp index 230e98b625..dd5bc730bf 100644 --- a/OdfFile/Reader/Format/paragraph_elements.cpp +++ b/OdfFile/Reader/Format/paragraph_elements.cpp @@ -778,6 +778,27 @@ void a::xlsx_convert(oox::xlsx_conversion_context & Context) } Context.end_hyperlink(xlink_attlist_.href_.get_value_or(L"")); } + +static std::wstring convert_href(oox::pptx_conversion_context& Context, const std::wstring& href) +{ + std::wstring result = href; + + if (boost::algorithm::starts_with(href, L"#")) + result = href.substr(1); + + const auto& page_names = Context.get_page_names(); + for (size_t i = 0; i < page_names.size(); i++) + { + if (result == page_names[i]) + { + result = std::wstring(L"slide") + std::to_wstring(i + 1) + std::wstring(L".xml"); + break; + } + } + + return result; +} + void a::pptx_convert(oox::pptx_conversion_context & Context) { Context.get_text_context().start_hyperlink(); @@ -786,9 +807,20 @@ void a::pptx_convert(oox::pptx_conversion_context & Context) content_[i]->pptx_convert(Context); } - std::wstring hId = Context.get_slide_context().add_hyperlink(xlink_attlist_.href_.get_value_or(L"")); - Context.get_text_context().end_hyperlink(hId); + std::wstring href = xlink_attlist_.href_.get_value_or(L""); + if (boost::algorithm::starts_with(href, L"#")) + { + Context.get_text_context().set_action(L"ppaction://hlinksldjump"); + + href = convert_href(Context, href); + } + + std::wstring hId = Context.get_slide_context().add_hyperlink(href); + + Context.get_text_context().set_rel_id(hId); + + Context.get_text_context().end_hyperlink(); } //------------------------------------------------------------------------------------------------------------ const wchar_t * endnote::ns = L"text"; @@ -1842,7 +1874,10 @@ void text_user_defined::docx_convert(oox::docx_conversion_context & Context) if (!value.empty()) text_ = text::create(value) ; - docx_serialize_run(text_, Context); + if (text_name_) + docx_serialize_field(XmlUtils::EncodeXmlString(L"DOCPROPERTY \"" + *text_name_ + L"\""), text_, Context, false); + else + docx_serialize_run(text_, Context); } //----------------------------------------------------------------------------------------------- // text:bibliography-mark diff --git a/OdfFile/Reader/Format/style_paragraph_properties_pptx.cpp b/OdfFile/Reader/Format/style_paragraph_properties_pptx.cpp index 12ca330a5b..1735eb6972 100644 --- a/OdfFile/Reader/Format/style_paragraph_properties_pptx.cpp +++ b/OdfFile/Reader/Format/style_paragraph_properties_pptx.cpp @@ -35,6 +35,8 @@ #include #include "../../Reader/Converter/pptx_conversion_context.h" +#include "../../Reader/Format/odf_document.h" +#include "../../Reader/Format/odfcontext.h" #include "../../DataTypes/borderstyle.h" namespace cpdoccore { @@ -452,13 +454,32 @@ void paragraph_format_properties::pptx_convert(oox::pptx_conversion_context & Co } } } - if (fo_margin_top_/* || fo_margin_*/) + if (fo_margin_top_) { + style_instance* last_paragraph_style = Context.root()->odf_context().styleContainer().style_by_name( + Context.get_text_context().get_last_paragraph_style_name(), + style_family::Paragraph, + false + ); + CP_XML_NODE(L"a:spcBef") { if (fo_margin_top_->get_type() == length_or_percent::Length) { - std::wstring w_before = pptx_process_margin(fo_margin_top_, length::pt, 100.0); + _CP_OPT(length_or_percent) margin_top = fo_margin_top_; + if (last_paragraph_style) + { + const style_paragraph_properties* last_style_paragraph_props = last_paragraph_style->content()->get_style_paragraph_properties(); + const paragraph_format_properties& last_paragraph_props = last_paragraph_style->content()->get_style_paragraph_properties()->content_; + length_or_percent last_margin_bottom = last_paragraph_props.fo_margin_bottom_.get_value_or(length_or_percent(length(0.0, length::cm))); + + if (fo_margin_top_->get_length().get_value_unit(length::cm) > last_margin_bottom.get_length().get_value_unit(length::cm)) + margin_top = _CP_OPT(length_or_percent)(length(fo_margin_top_->get_length().get_value_unit(length::cm) - last_margin_bottom.get_length().get_value_unit(length::cm), length::cm)); + else + margin_top = _CP_OPT(length_or_percent)(length(0.0, length::cm)); + } + + std::wstring w_before = pptx_process_margin(margin_top, length::pt, 100.0); CP_XML_NODE(L"a:spcPts") { CP_XML_ATTR(L"val",w_before); @@ -475,16 +496,16 @@ void paragraph_format_properties::pptx_convert(oox::pptx_conversion_context & Co } } } - if (fo_margin_bottom_/* || fo_margin_*/) + if (fo_margin_bottom_) { CP_XML_NODE(L"a:spcAft") { if (fo_margin_bottom_->get_type() == length_or_percent::Length) { - std::wstring w_after = pptx_process_margin(fo_margin_bottom_, length::pt, 100.0); + std::wstring w_after = pptx_process_margin(fo_margin_bottom_, length::pt, 100.0); CP_XML_NODE(L"a:spcPts") { - CP_XML_ATTR(L"val",w_after); + CP_XML_ATTR(L"val", w_after); } } else @@ -498,6 +519,7 @@ void paragraph_format_properties::pptx_convert(oox::pptx_conversion_context & Co } } } + //if (style_punctuation_wrap_) //{ // std::wstring w_val; diff --git a/OdfFile/Reader/Format/style_text_properties.cpp b/OdfFile/Reader/Format/style_text_properties.cpp index 1ed28cf320..3ffccee423 100644 --- a/OdfFile/Reader/Format/style_text_properties.cpp +++ b/OdfFile/Reader/Format/style_text_properties.cpp @@ -311,7 +311,7 @@ void text_format_properties::pptx_convert_as_list(oox::pptx_conversion_context & } } } -void text_format_properties::drawing_serialize(std::wostream & strm, std::wstring node, fonts_container & fonts, const odf_reader::style_instance *current_style, std::wstring hlink) +void text_format_properties::drawing_serialize(std::wostream & strm, std::wstring node, fonts_container & fonts, const odf_reader::style_instance *current_style, const oox::hyperlink_data link) { CP_XML_WRITER(strm) { @@ -541,12 +541,15 @@ void text_format_properties::drawing_serialize(std::wostream & strm, std::wstrin } } - if (!hlink.empty()) + if (!link.rId.empty()) { CP_XML_NODE(L"a:hlinkClick") { - CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships"); - CP_XML_ATTR(L"r:id", hlink); + if (link.action == L"ppaction://hlinksldjump") + CP_XML_ATTR(L"action", link.action); + else + CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + CP_XML_ATTR(L"r:id", link.rId); } } } @@ -1031,7 +1034,9 @@ void text_format_properties::pptx_convert(oox::pptx_conversion_context & Context oox::styles_context & styles_context_ = Context.get_text_context().get_styles_context(); fonts_container & fonts_ = Context.root()->odf_context().fontContainer(); - drawing_serialize(styles_context_.text_style(), styles_context_.extern_node(), fonts_, styles_context_.get_current_processed_style(), styles_context_.hlinkClick()); + oox::hyperlink_data link = Context.get_text_context().get_hyperlink(); + + drawing_serialize(styles_context_.text_style(), styles_context_.extern_node(), fonts_, styles_context_.get_current_processed_style(), link); // styles_context_.hlinkClick() } void text_format_properties::docx_convert(oox::docx_conversion_context & Context) diff --git a/OdfFile/Reader/Format/style_text_properties.h b/OdfFile/Reader/Format/style_text_properties.h index 5953eccc9e..59e1b2ef7d 100644 --- a/OdfFile/Reader/Format/style_text_properties.h +++ b/OdfFile/Reader/Format/style_text_properties.h @@ -78,7 +78,7 @@ public: void oox_serialize (std::wostream & stream, bool graphic, fonts_container & fonts, bool default_ = false); void docx_serialize (std::wostream & stream, fonts_container & fonts); - void drawing_serialize (std::wostream & stream, std::wstring node, fonts_container & fonts, const odf_reader::style_instance *current_style = NULL, std::wstring hlink = L""); + void drawing_serialize (std::wostream & stream, std::wstring node, fonts_container & fonts, const odf_reader::style_instance *current_style = NULL, const oox::hyperlink_data link = {L"", L""}); void xlsx_serialize (std::wostream & strm, oox::xlsx_conversion_context & Context); diff --git a/OdfFile/Reader/Format/styles_lite_container.cpp b/OdfFile/Reader/Format/styles_lite_container.cpp index 59e80fe20f..0b74c34cd9 100644 --- a/OdfFile/Reader/Format/styles_lite_container.cpp +++ b/OdfFile/Reader/Format/styles_lite_container.cpp @@ -35,6 +35,7 @@ #include "styles_lite_container.h" #include "office_settings.h" +#include "../../Common/xml/simple_xml_writer.h" namespace cpdoccore { @@ -107,6 +108,28 @@ std::wstring doc_props_container::get_user_defined(const std::wstring & name) return pFind != impl_->map_user_defineds.end() ? pFind->second : L""; } +std::wstring doc_props_container::dump_user_defined() +{ + std::wstringstream output; + + CP_XML_WRITER(output) + { + for (std::map::iterator it = impl_->map_user_defineds.begin(); it != impl_->map_user_defineds.end(); ++it) + { + CP_XML_NODE(L"property") + { + CP_XML_ATTR(L"fmtid", L"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"); + CP_XML_ATTR(L"name", it->first); + CP_XML_ATTR(L"pid", 2); + CP_XML_NODE(L"vt:lpwstr") + { + CP_XML_STREAM() << it->second; + } + } + } + } + return output.str(); +} //---------------------------------------------------------------------------------- struct settings_value diff --git a/OdfFile/Reader/Format/styles_lite_container.h b/OdfFile/Reader/Format/styles_lite_container.h index 3d5dedbb2c..06fc5f3484 100644 --- a/OdfFile/Reader/Format/styles_lite_container.h +++ b/OdfFile/Reader/Format/styles_lite_container.h @@ -64,6 +64,7 @@ public: void add_user_defined(const std::wstring & name, const std::wstring & value); std::wstring get_user_defined(const std::wstring & name); + std::wstring dump_user_defined(); std::wstring dc_creator_; std::wstring dc_date_; diff --git a/OdfFile/Test/audio.cpp b/OdfFile/Test/audio.cpp index 0152443eeb..b7df1b30d1 100644 --- a/OdfFile/Test/audio.cpp +++ b/OdfFile/Test/audio.cpp @@ -104,36 +104,40 @@ const cpdoccore::oox::pptx_animation_context::Impl::_animation_element_array& OD return actions; } -TEST_F(ODP2OOX_AnimationAudioTest, r_embed_id) +TEST_F(ODP2OOX_AnimationAudioTest, set) { using namespace cpdoccore::oox; const auto& mainArray = GetMainSequenceArray(); ASSERT_GE(mainArray.size(), 1); const auto& actions = GetInnermostPar(mainArray[0])->AnimationActionArray; - ASSERT_EQ(actions.size(), 4); - const auto audio = dynamic_cast(actions[3].get()); ; - ASSERT_NE(audio, nullptr); - - const std::wstring rIdExp = L"aId1"; - - EXPECT_EQ(audio->RId.value(), rIdExp); + ASSERT_EQ(actions.size(), 3); + const auto set = dynamic_cast(actions[0].get()); + ASSERT_NE(set, nullptr); } -TEST_F(ODP2OOX_AnimationAudioTest, name) +TEST_F(ODP2OOX_AnimationAudioTest, anim_1) { using namespace cpdoccore::oox; const auto& mainArray = GetMainSequenceArray(); ASSERT_GE(mainArray.size(), 1); const auto& actions = GetInnermostPar(mainArray[0])->AnimationActionArray; - ASSERT_EQ(actions.size(), 4); - const auto audio = dynamic_cast(actions[3].get()); ; - ASSERT_NE(audio, nullptr); + ASSERT_EQ(actions.size(), 3); + const auto anim = dynamic_cast(actions[1].get()); + ASSERT_NE(anim, nullptr); +} - const std::wstring nameExp = L"apert.wav"; +TEST_F(ODP2OOX_AnimationAudioTest, anim_2) +{ + using namespace cpdoccore::oox; - EXPECT_EQ(audio->Name.value(), nameExp); + const auto& mainArray = GetMainSequenceArray(); + ASSERT_GE(mainArray.size(), 1); + const auto& actions = GetInnermostPar(mainArray[0])->AnimationActionArray; + ASSERT_EQ(actions.size(), 3); + const auto anim = dynamic_cast(actions[2].get()); + ASSERT_NE(anim, nullptr); } ////////////////////////////////////////////////////////////////////////// diff --git a/OdfFile/Test/common.cpp b/OdfFile/Test/common.cpp index 42da3e35e8..c62de29df6 100644 --- a/OdfFile/Test/common.cpp +++ b/OdfFile/Test/common.cpp @@ -191,7 +191,10 @@ const cpdoccore::odf_writer::anim_par* OOX2ODP_AnimationTest::GetInnerPar(const if (!par) return nullptr; - const anim_par* inner_par = dynamic_cast(par->anim_par_.get()); + if (par->anim_par_.size() == 0) + return nullptr; + + const anim_par* inner_par = dynamic_cast(par->anim_par_[0].get()); if (!inner_par) return nullptr; @@ -208,9 +211,9 @@ const cpdoccore::odf_writer::anim_par* OOX2ODP_AnimationTest::GetInnermostPar(co const anim_par* innermost = GetInnerPar(par); - while (innermost->anim_par_) + while (innermost->anim_par_.size()) { - innermost = dynamic_cast(innermost->anim_par_.get()); + innermost = dynamic_cast(innermost->anim_par_[0].get()); if (!innermost) return nullptr; } diff --git a/OdfFile/Test/entrance.cpp b/OdfFile/Test/entrance.cpp index ac0dd1cbf4..75001e91cb 100644 --- a/OdfFile/Test/entrance.cpp +++ b/OdfFile/Test/entrance.cpp @@ -432,8 +432,8 @@ TEST_F(ODP2OOX_EntranceAnimationTest, entrance_fly_in_action_animate_1_key_point const pptx_animation_context::Impl::_anim* animate1 = dynamic_cast(actions[1].get()); std::vector keypointsExp; - keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(0, L"#ppt_x", boost::none)); - keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(100000, L"#ppt_x", boost::none)); + keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(0, L"ppt_x", boost::none)); + keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(100000, L"ppt_x", boost::none)); EXPECT_EQ(animate1->KeypointArray->size(), keypointsExp.size()); for (size_t i = 0; i < animate1->KeypointArray->size(); i++) @@ -513,8 +513,8 @@ TEST_F(ODP2OOX_EntranceAnimationTest, entrance_fly_in_action_animate_2_key_point const pptx_animation_context::Impl::_anim* animate2 = dynamic_cast(actions[2].get()); std::vector keypointsExp; - keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(0, L"1+#ppt_h/2", boost::none)); - keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(100000, L"#ppt_y", boost::none)); + keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(0, L"1+ppt_h/2", boost::none)); + keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(100000, L"ppt_y", boost::none)); EXPECT_EQ(animate2->KeypointArray->size(), keypointsExp.size()); for (size_t i = 0; i < animate2->KeypointArray->size(); i++) @@ -576,9 +576,7 @@ TEST_F(ODP2OOX_EntranceAnimationTest, entrance_venetian_blinds_anim_effect_trans const pptx_animation_context::Impl::_animation_element_array& actions = GetAnimationActionsByIndex(animationIndex); const pptx_animation_context::Impl::_anim_effect* animEffect = dynamic_cast(actions[1].get()); - const std::wstring transitionExp = L"in"; - - EXPECT_EQ(animEffect->Transition.value(), transitionExp); + EXPECT_FALSE(animEffect->Transition.has_value()); } TEST_F(ODP2OOX_EntranceAnimationTest, entrance_venetian_blinds_anim_effect_duration) diff --git a/OdfFile/Test/interactions.cpp b/OdfFile/Test/interactions.cpp index 16860f0de9..8247f9b856 100644 --- a/OdfFile/Test/interactions.cpp +++ b/OdfFile/Test/interactions.cpp @@ -197,49 +197,69 @@ TEST_F(ODP2OOX_AnimationPlayAudioTest, rels_size) ASSERT_NE(mConversionContext, nullptr); auto rels_ = mConversionContext->current_slide().Rels().relationships(); - const size_t relsSizeExp = 3; + const size_t relsSizeExp = 2; - EXPECT_EQ(rels_.size(), 3); + EXPECT_EQ(rels_.size(), relsSizeExp); } -TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_rel_id) +TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_slide_rel_type) { ASSERT_NE(mConversionContext, nullptr); - auto audioRel = mConversionContext->current_slide().Rels().relationships()[1]; - const std::wstring idExp = L"hId1"; + auto slideRel = mConversionContext->current_slide().Rels().relationships()[0]; + const std::wstring typeExp = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout"; - EXPECT_EQ(audioRel.id(), idExp); + EXPECT_EQ(slideRel.type(), typeExp); } -TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_rel_type) +TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_slide_rel_target) { ASSERT_NE(mConversionContext, nullptr); - auto audioRel = mConversionContext->current_slide().Rels().relationships()[1]; - const std::wstring typeExp = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"; + auto slideRel = mConversionContext->current_slide().Rels().relationships()[0]; + const std::wstring targetExp = L"../slideLayouts/slideLayout1.xml"; - EXPECT_EQ(audioRel.type(), typeExp); + EXPECT_EQ(slideRel.target(), targetExp); } -TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_rel_target) +TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_slide_rel_target_mode) { ASSERT_NE(mConversionContext, nullptr); - auto audioRel = mConversionContext->current_slide().Rels().relationships()[1]; - const std::wstring targetExp = L"../../../../X2tConverter/test/win32Test/Res/media_example.wav"; + auto slideRel = mConversionContext->current_slide().Rels().relationships()[0]; + const std::wstring targetModeExp = L""; - EXPECT_EQ(audioRel.target(), targetExp); + EXPECT_EQ(slideRel.target_mode(), targetModeExp); } -TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_rel_target_mode) +TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_notes_rel_type) { ASSERT_NE(mConversionContext, nullptr); - auto audioRel = mConversionContext->current_slide().Rels().relationships()[1]; - const std::wstring targetModeExp = L"External"; + auto notesRel = mConversionContext->current_slide().Rels().relationships()[1]; + const std::wstring typeExp = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide"; - EXPECT_EQ(audioRel.target_mode(), targetModeExp); + EXPECT_EQ(notesRel.type(), typeExp); +} + +TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_notes_rel_target) +{ + ASSERT_NE(mConversionContext, nullptr); + + auto notesRel = mConversionContext->current_slide().Rels().relationships()[1]; + const std::wstring targetExp = L"../notesSlides/notesSlide1.xml"; + + EXPECT_EQ(notesRel.target(), targetExp); +} + +TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_notes_rel_target_mode) +{ + ASSERT_NE(mConversionContext, nullptr); + + auto notesRel = mConversionContext->current_slide().Rels().relationships()[1]; + const std::wstring targetModeExp = L""; + + EXPECT_EQ(notesRel.target_mode(), targetModeExp); } ////////////////////////////////////////////////////////////////////////// diff --git a/OdfFile/Writer/Converter/ConvertDrawing.cpp b/OdfFile/Writer/Converter/ConvertDrawing.cpp index 3d078d8803..7f9ee702cb 100644 --- a/OdfFile/Writer/Converter/ConvertDrawing.cpp +++ b/OdfFile/Writer/Converter/ConvertDrawing.cpp @@ -433,8 +433,7 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture) if (pFile.IsInit() && (OOX::FileTypes::Image == pFile->type())) { - OOX::Image* pImageFileCache = static_cast(pFile.GetPointer()); - + smart_ptr pImageFileCache = pFile.smart_dynamic_cast(); pathImage = pImageFileCache->filename().GetPath(); } } @@ -1993,6 +1992,26 @@ void OoxConverter::convert_list_level(PPTX::Logic::TextParagraphPr *oox_para_pro odf_context()->styles_context()->lists_styles().end_style_level(); } +static bool is_empty_run_elems(const std::vector& runElems) +{ + using namespace PPTX::Logic; + + auto runIt = std::find_if_not(runElems.begin(), runElems.end(), + [](const RunElem& r) { + return !r.is(); + }); + if (runIt != runElems.end()) + { + const Run& run = runIt->as(); + if (!run.HasText()) + return true; + } + else + return true; + + return false; +} + void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::TextListStyle *oox_list_style) { if (!oox_paragraph)return; @@ -2036,6 +2055,8 @@ void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::T if (paraPr->ParagraphBullet.is()) list_present = false; } + else + list_present = false; //свойства могут быть приписаны не только к параграфу, но и к самому объекту odf_writer::paragraph_format_properties* paragraph_properties = odf_context()->text_context()->get_paragraph_properties(); odf_writer::text_format_properties* text_properties = odf_context()->text_context()->get_text_properties(); @@ -2061,17 +2082,7 @@ void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::T } } - std::vector::iterator runIt = std::find_if_not(oox_paragraph->RunElems.begin(), oox_paragraph->RunElems.end(), - [](const PPTX::Logic::RunElem& r) { - return !r.is(); - }); - if (runIt != oox_paragraph->RunElems.end()) - { - const PPTX::Logic::Run& run = runIt->as(); - if (!run.HasText()) - list_present = false; - } - else + if (is_empty_run_elems(oox_paragraph->RunElems)) list_present = false; //if (oox_paragraph->RunElems.empty() && list_present) list_present = false; // ms не обозначает присутствие списка, libra - показывает значек @@ -2499,10 +2510,6 @@ void OoxConverter::convert(PPTX::Logic::RunProperties *oox_run_pr, odf_writer::t { text_properties->fo_text_transform_ = odf_types::text_transform(odf_types::text_transform::Capitalize); } - if (oox_run_pr->hlinkClick.IsInit()) - { - convert(oox_run_pr->hlinkClick.GetPointer()); - } } static std::vector split_tabs(const std::wstring& text) { @@ -2577,6 +2584,29 @@ void OoxConverter::convert(PPTX::Logic::Run *oox_run) bool bExternal = false; std::wstring hlink = find_link_by_id(oox_run->rPr->hlinkClick->id.get(), 2, bExternal); std::wstring location; + + smart_ptr file = find_file_by_id(oox_run->rPr->hlinkClick->id.get()); + OOX::HyperLink* hyperlink = dynamic_cast(file.GetPointer()); + + if (hyperlink) + location = hyperlink->Uri().GetBasename(); + + if (oox_run->rPr->hlinkClick->action.IsInit() && location.empty()) + { + const std::wstring& action = *oox_run->rPr->hlinkClick->action; + + if (std::wstring::npos != action.find(L"previousslide")) + location = L"previous-page"; + else if (std::wstring::npos != action.find(L"nextslide")) + location = L"next-page"; + else if (std::wstring::npos != action.find(L"firstslide")) + location = L"first-page"; + else if (std::wstring::npos != action.find(L"lastslide")) + location = L"last-page"; + else if (std::wstring::npos != action.find(L"endshow")) + location = L"end"; + } + text_context->add_hyperlink(hlink, oox_run->GetText(), location); } else diff --git a/OdfFile/Writer/Converter/PptxConverter.cpp b/OdfFile/Writer/Converter/PptxConverter.cpp index 0cf8f536ee..010c602f8b 100644 --- a/OdfFile/Writer/Converter/PptxConverter.cpp +++ b/OdfFile/Writer/Converter/PptxConverter.cpp @@ -84,6 +84,7 @@ #include "../Format/odf_text_context.h" #include "../Format/odf_drawing_context.h" #include "../Format/office_event_listeners.h" +#include "../Format/paragraph_elements.h" #include "../Format/styles.h" #include "../Format/style_presentation.h" @@ -1280,22 +1281,44 @@ std::wstring PptxConverter::get_page_name(PPTX::Logic::CSld* oox_slide, _typePag void PptxConverter::fill_in_deferred_hyperlinks() { - for (auto hyperlink : odp_context->get_deferred_hyperlinks()) + auto links = odp_context->get_deferred_hyperlinks(); + auto slidenames_vec = std::vector>(odp_context->map_slidenames_.begin(), odp_context->map_slidenames_.end()); + + for (size_t i = 0; i < links.size(); i++) { + const auto& hyperlink = links[i]; + cpdoccore::odf_writer::presentation_event_listener* event_listener = dynamic_cast(hyperlink.first.get()); + cpdoccore::odf_writer::text_a* text = dynamic_cast(hyperlink.first.get()); const std::wstring& slidename = hyperlink.second; - if (!event_listener) - continue; - + std::wstring href; auto hrefIt = odp_context->map_slidenames_.find(slidename); - if (hrefIt == odp_context->map_slidenames_.end()) + if (slidename == L"previous-page" && i > 0) + href = slidenames_vec[i - 1].second; + else if (slidename == L"next-page" && i < slidenames_vec.size() - 2) + href = slidenames_vec[i + 1].second; + else if (slidename == L"first-page") + href = slidenames_vec[0].second; + else if (slidename == L"last-page") + href = slidenames_vec[slidenames_vec.size() - 1].second; + else if (hrefIt == odp_context->map_slidenames_.end()) continue; + else + href = hrefIt->second; - event_listener->attlist_.common_xlink_attlist_.href_ = std::wstring(L"#") + hrefIt->second; - event_listener->attlist_.common_xlink_attlist_.type_ = xlink_type::Simple; - event_listener->attlist_.common_xlink_attlist_.show_ = xlink_show::Embed; - event_listener->attlist_.common_xlink_attlist_.actuate_ = xlink_actuate::OnRequest; + if (event_listener) + { + event_listener->attlist_.common_xlink_attlist_.href_ = std::wstring(L"#") + href; + event_listener->attlist_.common_xlink_attlist_.type_ = xlink_type::Simple; + event_listener->attlist_.common_xlink_attlist_.show_ = xlink_show::Embed; + event_listener->attlist_.common_xlink_attlist_.actuate_ = xlink_actuate::OnRequest; + } + else if (text) + { + text->common_xlink_attlist_.href_ = std::wstring(L"#") + href; + text->common_xlink_attlist_.type_ = xlink_type::Simple; + } } } diff --git a/OdfFile/Writer/Converter/XlsxConverter.cpp b/OdfFile/Writer/Converter/XlsxConverter.cpp index 7b7dc84846..31edbefe00 100644 --- a/OdfFile/Writer/Converter/XlsxConverter.cpp +++ b/OdfFile/Writer/Converter/XlsxConverter.cpp @@ -3018,9 +3018,9 @@ void XlsxConverter::convert(OOX::Spreadsheet::COleObjects *oox_objects, OOX::Spr if (pFile.IsInit() && ( OOX::FileTypes::Image == pFile->type())) { - OOX::Image* pImageFileCache = static_cast(pFile.GetPointer()); - - if (pImageFileCache && odf_ref_image.empty()) + smart_ptr pImageFileCache = pFile.smart_dynamic_cast(); + + if (pImageFileCache.IsInit() && odf_ref_image.empty()) { odf_ref_image = odf_context()->add_imageobject(pImageFileCache->filename().GetPath()); } diff --git a/OdfFile/Writer/Format/odf_text_context.cpp b/OdfFile/Writer/Format/odf_text_context.cpp index 468f7ff0e5..771b4347ee 100644 --- a/OdfFile/Writer/Format/odf_text_context.cpp +++ b/OdfFile/Writer/Format/odf_text_context.cpp @@ -669,9 +669,14 @@ void odf_text_context::add_hyperlink (const std::wstring & link, const std::wstr if (!display.empty()) hyperlink->add_text(display); //////////////////////////// - - hyperlink->common_xlink_attlist_.href_ = link + (location.empty() ? L"" : (L"#" + location)); - hyperlink->common_xlink_attlist_.type_ = xlink_type::Simple; + + if (!link.empty()) + { + hyperlink->common_xlink_attlist_.href_ = link + (location.empty() ? L"" : (L"#" + location)); + hyperlink->common_xlink_attlist_.type_ = xlink_type::Simple; + } + else + odf_context_->add_hyperlink(elm, location); if (false == current_level_.empty()) current_level_.back().elm->add_child_element(elm); diff --git a/OdfFile/Writer/Format/odp_conversion_context.h b/OdfFile/Writer/Format/odp_conversion_context.h index 4068241e00..76b3246216 100644 --- a/OdfFile/Writer/Format/odp_conversion_context.h +++ b/OdfFile/Writer/Format/odp_conversion_context.h @@ -103,7 +103,7 @@ public: std::vector map_identifiers_; // NOTE(Kamil Kerimov): Key - slide name in pptx (e.g. slide1.xml), Value - slide name in odp (e.g. "This is a title") - using SlidenameMap = std::unordered_map; + using SlidenameMap = std::map; SlidenameMap map_slidenames_; private: odp_slide_context slide_context_; diff --git a/OfficeUtils/src/OfficeUtils.h b/OfficeUtils/src/OfficeUtils.h index 7e9d1a081c..827352118f 100644 --- a/OfficeUtils/src/OfficeUtils.h +++ b/OfficeUtils/src/OfficeUtils.h @@ -53,7 +53,7 @@ public: HRESULT ExtractToDirectory (const std::wstring& zipFile, const std::wstring& unzipDir, wchar_t* password, short extract_without_path); HRESULT ExtractToDirectory (BYTE* data, size_t len, const std::wstring& unzipDir, wchar_t* password, short extract_without_path); - HRESULT CompressFileOrDirectory (const std::wstring& name, const std::wstring& outputFile, bool bSorted = false, int method = Z_DEFLATED, short level = -1, bool bDateTime = false); + HRESULT CompressFileOrDirectory (const std::wstring& name, const std::wstring& outputFile, bool bSorted = false, int method = Z_DEFLATED, short level = -1, bool bDateTime = true); HRESULT Uncompress (BYTE* destBuf, ULONG* destSize, BYTE* sourceBuf, ULONG sourceSize); HRESULT Compress (BYTE* destBuf, ULONG* destSize, BYTE* sourceBuf, ULONG sourceSize, short level = -1); diff --git a/OfficeUtils/src/ZipUtilsCP.cpp b/OfficeUtils/src/ZipUtilsCP.cpp index ebb3d1dc2c..3517610f41 100644 --- a/OfficeUtils/src/ZipUtilsCP.cpp +++ b/OfficeUtils/src/ZipUtilsCP.cpp @@ -217,28 +217,6 @@ namespace ZLibZipUtils /*========================================================================================================*/ - /* change_file_date : change the date/time of a file - filename : the filename of the file where date/time must be modified - dosdate : the new date at the MSDos format (4 bytes) - tmu_date : the SAME new date at the tm_unz format */ - static void change_file_date( const wchar_t *filename, uLong dosdate, tm_unz tmu_date ) - { -#if defined(_WIN32) || defined (_WIN64) - HANDLE hFile; - FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; - - hFile = CreateFileW(filename,GENERIC_READ | GENERIC_WRITE, - 0,NULL,OPEN_EXISTING,0,NULL); - GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); - DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); - LocalFileTimeToFileTime(&ftLocal,&ftm); - SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); - CloseHandle(hFile); -#endif - } - - /*========================================================================================================*/ - static void replace_all(std::string& subject, const std::string& search, const std::string& replace) { size_t pos = 0; @@ -380,13 +358,22 @@ namespace ZLibZipUtils break; } } + // ? while (err>0); - - //close вызовется в oFile - if (err==0) { - change_file_date(write_filename, file_info.dosDate, file_info.tmu_date); + oFile.CloseFile(); + + struct tm time; + memset(&time, 0, sizeof(struct tm)); + time.tm_sec = file_info.tmu_date.tm_sec; + time.tm_min = file_info.tmu_date.tm_min; + time.tm_hour = file_info.tmu_date.tm_hour; + time.tm_mday = file_info.tmu_date.tm_mday; + time.tm_mon = file_info.tmu_date.tm_mon + 1; + time.tm_year = file_info.tmu_date.tm_year; + + NSFile::CFileBinary::SetTime(write_filename, &time); } } @@ -572,16 +559,24 @@ namespace ZLibZipUtils zip_fileinfo zinfo; zinfo.dosDate = zinfo.external_fa = zinfo.internal_fa = 0; - zinfo.tmz_date.tm_sec = zinfo.tmz_date.tm_min = zinfo.tmz_date.tm_hour = 0; - zinfo.tmz_date.tm_mday = 1; - zinfo.tmz_date.tm_mon = 0; - zinfo.tmz_date.tm_year = 1980; zip_fileinfo* zi_new = zi ? zi : &zinfo; - if (bDateTime ) + + if (bDateTime) { - zi_new->dosDate = oFile.GetDateTime(file_name); + struct tm edited; + bool ok = NSFile::CFileBinary::GetTime(file_name, &edited); + if (ok) + { + zi_new->tmz_date.tm_sec = edited.tm_sec; + zi_new->tmz_date.tm_min = edited.tm_min; + zi_new->tmz_date.tm_hour = edited.tm_hour; + zi_new->tmz_date.tm_mday = edited.tm_mday; + zi_new->tmz_date.tm_mon = edited.tm_mon - 1; + zi_new->tmz_date.tm_year = edited.tm_year; + } } + if(oFile.OpenFile(file_name)) { DWORD dwSizeRead; @@ -730,9 +725,24 @@ namespace ZLibZipUtils zip_fileinfo zinfo; zinfo.external_fa = zinfo.internal_fa = 0; - zinfo.dosDate = bDateTime ? oFile.GetDateTime(inputFile) : 0; + zinfo.dosDate = 0; - if(oFile.OpenFile(inputFile)) + if (bDateTime) + { + struct tm edited; + bool ok = NSFile::CFileBinary::GetTime(inputFile, &edited); + if (ok) + { + zinfo.tmz_date.tm_sec = edited.tm_sec; + zinfo.tmz_date.tm_min = edited.tm_min; + zinfo.tmz_date.tm_hour = edited.tm_hour; + zinfo.tmz_date.tm_mday = edited.tm_mday; + zinfo.tmz_date.tm_mon = edited.tm_mon - 1; + zinfo.tmz_date.tm_year = edited.tm_year; + } + } + + if (oFile.OpenFile(inputFile)) { DWORD dwSizeRead; BYTE* pData = new BYTE[oFile.GetFileSize()]; @@ -740,24 +750,8 @@ namespace ZLibZipUtils { zipFile zf = zipOpenHelp(outputFile); if (zf) - { - wstring inputFileName( inputFile ); - - wstring::size_type pos = 0; - static const wstring::size_type npos = -1; - - pos = inputFileName.find_last_of( L'\\' ); - - wstring zipFileName; - - if ( pos != npos ) - { - zipFileName = wstring( ( inputFileName.begin() + pos + 1 ), inputFileName.end() ); - } - else - { - zipFileName = wstring( inputFileName.begin(), inputFileName.end() ); - } + { + wstring zipFileName = NSFile::GetFileName(inputFile); std::string zipFileNameA = codepage_issue_fixToOEM(zipFileName); err = zipOpenNewFileInZip( zf, zipFileNameA.c_str(), &zinfo, NULL, 0, NULL, 0, NULL, method, compressionLevel ); diff --git a/OfficeUtils/tests/.gitignore b/OfficeUtils/tests/.gitignore index 07fb5b83ca..3390380ff3 100644 --- a/OfficeUtils/tests/.gitignore +++ b/OfficeUtils/tests/.gitignore @@ -1 +1,2 @@ -unzip \ No newline at end of file +unzip +temp \ No newline at end of file diff --git a/OfficeUtils/tests/main.cpp b/OfficeUtils/tests/main.cpp index 22bfc76362..4f6364f603 100644 --- a/OfficeUtils/tests/main.cpp +++ b/OfficeUtils/tests/main.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include #include "gtest/gtest.h" @@ -53,6 +55,7 @@ public: std::wstring zipDirectory; std::wstring unzipDirectory; std::wstring wsep; + std::wstring tempDirectory; std::vector expected_general; std::vector expected_general_no_folder; @@ -70,10 +73,14 @@ public: workDirectory = NSFile::GetProcessDirectory(); unzipDirectory = workDirectory + wsep + L".." + wsep + L"unzip"; zipDirectory = workDirectory + wsep + L".." + wsep + L"zip"; + tempDirectory = workDirectory + wsep + L".." + wsep + L"temp"; if(!NSDirectory::Exists(unzipDirectory)) NSDirectory::CreateDirectories(unzipDirectory); + if(!NSDirectory::Exists(tempDirectory)) + NSDirectory::CreateDirectories(tempDirectory); + // general expected_general.push_back(L"1.txt"); expected_general.push_back(L"2.txt"); @@ -380,3 +387,112 @@ TEST_F(COfficeUtilsTest, other_win) ASSERT_EQ(error_code, S_OK); EXPECT_EQ(wstr, L"123 321"); } + +TEST_F(COfficeUtilsTest, time_file) +{ + // creating file + std::wstring filename = L"time_file_test.txt"; + std::wstring file_path = tempDirectory + wsep + filename; + + std::wstring zip_filename = L"time_file_test.zip"; + std::wstring zip_path = tempDirectory + wsep + zip_filename; + + std::wstring unzip_folder = tempDirectory + wsep + L"time_file_test"; + std::wstring unzip_path = unzip_folder + wsep + filename; + + // folder for unzip files + if (NSDirectory::Exists(unzip_folder)) + NSDirectory::DeleteDirectory(unzip_folder); + + NSDirectory::CreateDirectories(unzip_folder); + + // create file to zip, then unzip it + if (NSFile::CFileBinary::Exists(file_path)) + NSFile::CFileBinary::Remove(file_path); + + NSFile::CFileBinary file; + file.CreateFileW(file_path); + file.WriteStringUTF8(L"some text"); + file.CloseFile(); + + struct tm edit_time_before{}; + bool result_get_time_before = NSFile::CFileBinary::GetTime(file_path, &edit_time_before); + ASSERT_EQ(result_get_time_before, true); + + HRESULT error_code = utils.CompressFileOrDirectory(file_path, zip_path); + ASSERT_EQ(error_code, S_OK); + + error_code = utils.ExtractToDirectory(zip_path, unzip_folder, NULL, false); + ASSERT_EQ(error_code, S_OK); + + struct tm edit_time_after{}; + bool result_get_time_after = NSFile::CFileBinary::GetTime(unzip_path, &edit_time_after); + ASSERT_EQ(result_get_time_after, true); + + EXPECT_EQ(edit_time_before.tm_sec, edit_time_after.tm_sec); + EXPECT_EQ(edit_time_before.tm_min, edit_time_after.tm_min); + EXPECT_EQ(edit_time_before.tm_hour, edit_time_after.tm_hour); + EXPECT_EQ(edit_time_before.tm_mday, edit_time_after.tm_mday); + EXPECT_EQ(edit_time_before.tm_mon, edit_time_after.tm_mon); + EXPECT_EQ(edit_time_before.tm_year, edit_time_after.tm_year); +} + +TEST_F(COfficeUtilsTest, time_folder) +{ + std::wstring file_folder = tempDirectory + wsep + L"time_file_test_folder"; + + // creating file + std::wstring filename = L"time_file_test.txt"; + std::wstring file_path = file_folder + wsep + filename; + + std::wstring zip_filename = L"time_file_test.zip"; + std::wstring zip_path = tempDirectory + wsep + zip_filename; + + std::wstring unzip_folder = tempDirectory + wsep + L"time_file_test"; + std::wstring unzip_path = unzip_folder + wsep + filename; + + // folder for unzip files + if (NSDirectory::Exists(unzip_folder)) + NSDirectory::DeleteDirectory(unzip_folder); + + NSDirectory::CreateDirectories(unzip_folder); + + // folder for zip files + if (NSDirectory::Exists(file_folder)) + NSDirectory::DeleteDirectory(file_folder); + + NSDirectory::CreateDirectories(file_folder); + + // create file to zip, then unzip it + if (NSFile::CFileBinary::Exists(file_path)) + NSFile::CFileBinary::Remove(file_path); + + NSFile::CFileBinary file; + file.CreateFileW(file_path); + file.WriteStringUTF8(L"some text"); + file.CloseFile(); + + struct tm edit_time_before{}; + bool result_get_time_before = NSFile::CFileBinary::GetTime(file_path, &edit_time_before); + ASSERT_EQ(result_get_time_before, true); + + HRESULT error_code = utils.CompressFileOrDirectory(file_folder, zip_path); + ASSERT_EQ(error_code, S_OK); + + error_code = utils.ExtractToDirectory(zip_path, unzip_folder, NULL, false); + ASSERT_EQ(error_code, S_OK); + + struct tm edit_time_after{}; + bool result_get_time_after = NSFile::CFileBinary::GetTime(unzip_path, &edit_time_after); + ASSERT_EQ(result_get_time_after, true); + + // the 2-second precision + EXPECT_LE(std::abs(edit_time_before.tm_sec - edit_time_after.tm_sec), 1); + + EXPECT_EQ(edit_time_before.tm_min, edit_time_after.tm_min); + EXPECT_EQ(edit_time_before.tm_hour, edit_time_after.tm_hour); + EXPECT_EQ(edit_time_before.tm_mday, edit_time_after.tm_mday); + EXPECT_EQ(edit_time_before.tm_mon, edit_time_after.tm_mon); + EXPECT_EQ(edit_time_before.tm_year, edit_time_after.tm_year); +} + diff --git a/PdfFile/PdfFile.cpp b/PdfFile/PdfFile.cpp index 7bcd6cca94..31581d0e88 100644 --- a/PdfFile/PdfFile.cpp +++ b/PdfFile/PdfFile.cpp @@ -1525,6 +1525,12 @@ int CPdfFile::GetMaxRefID() return m_pInternal->pReader->GetMaxRefID(); } +bool CPdfFile::ValidMetaData() +{ + if (!m_pInternal->pReader) + return false; + return m_pInternal->pReader->ValidMetaData(); +} void CPdfFile::DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pBreak) { if (!m_pInternal->pReader) diff --git a/PdfFile/PdfFile.h b/PdfFile/PdfFile.h index cb444dcf65..0fa93e7fda 100644 --- a/PdfFile/PdfFile.h +++ b/PdfFile/PdfFile.h @@ -128,6 +128,7 @@ public: virtual std::wstring GetInfo(); virtual BYTE* GetStructure(); virtual BYTE* GetLinks(int nPageIndex); + bool ValidMetaData(); int GetRotate(int nPageIndex); int GetMaxRefID(); BYTE* GetWidgets(); diff --git a/PdfFile/PdfReader.cpp b/PdfFile/PdfReader.cpp index b42299c6ad..c300625ee9 100644 --- a/PdfFile/PdfReader.cpp +++ b/PdfFile/PdfReader.cpp @@ -461,6 +461,33 @@ int CPdfReader::GetMaxRefID() return 0; return m_pPDFDocument->getXRef()->getNumObjects(); } +bool CPdfReader::ValidMetaData() +{ + if (!m_pPDFDocument) + return false; + + XRef* xref = m_pPDFDocument->getXRef(); + Object oMeta, oType, oID; + if (!xref->fetch(1, 0, &oMeta)->isStream() || !oMeta.streamGetDict()->lookup("Type", &oType)->isName("MetaOForm") || !oMeta.streamGetDict()->lookup("ID", &oID)->isString()) + { + oMeta.free(); oType.free(); oID.free(); + return false; + } + oMeta.free(); oType.free(); + + Object oTID, oID2; + Object* pTrailerDict = xref->getTrailerDict(); + if (!pTrailerDict || !pTrailerDict->dictLookup("ID", &oTID)->isArray() || !oTID.arrayGet(1, &oID2)->isString()) + { + oID.free(); oTID.free(); oID2.free(); + return false; + } + oTID.free(); + + bool bRes = oID2.getString()->cmp(oID.getString()) == 0; + oID.free(); oID2.free(); + return bRes; +} void CPdfReader::DrawPageOnRenderer(IRenderer* pRenderer, int _nPageIndex, bool* pbBreak) { if (m_pPDFDocument && pRenderer) diff --git a/PdfFile/PdfReader.h b/PdfFile/PdfReader.h index 50ed129191..a1e5825670 100644 --- a/PdfFile/PdfReader.h +++ b/PdfFile/PdfReader.h @@ -61,6 +61,7 @@ public: int GetError(); int GetRotate(int nPageIndex); int GetMaxRefID(); + bool ValidMetaData(); void GetPageInfo(int nPageIndex, double* pdWidth, double* pdHeight, double* pdDpiX, double* pdDpiY); void DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pBreak); std::wstring GetInfo(); diff --git a/PdfFile/SrcWriter/Document.cpp b/PdfFile/SrcWriter/Document.cpp index f6bb3a064f..900412bee3 100644 --- a/PdfFile/SrcWriter/Document.cpp +++ b/PdfFile/SrcWriter/Document.cpp @@ -437,6 +437,22 @@ namespace PdfWriter { if (!m_pMetaData) return false; + + CArrayObject* pID = (CArrayObject*)m_pTrailer->Get("ID"); + if (!pID) + { + BYTE arrId[16]; + CEncryptDict::CreateId(m_pInfo, m_pXref, (BYTE*)arrId); + + pID = new CArrayObject(); + m_pTrailer->Add("ID", pID); + + pID->Add(new CBinaryObject(arrId, 16)); + pID->Add(new CBinaryObject(arrId, 16)); + + m_pMetaData->SetID(new CBinaryObject(arrId, 16)); + } + return m_pMetaData->AddMetaData(sMetaName, pMetaData, nMetaLength); } CDictObject* CDocument::CreatePageLabel(EPageNumStyle eStyle, unsigned int unFirstPage, const char* sPrefix) diff --git a/PdfFile/SrcWriter/Metadata.cpp b/PdfFile/SrcWriter/Metadata.cpp index 57d56629bd..d0cd8ebab7 100644 --- a/PdfFile/SrcWriter/Metadata.cpp +++ b/PdfFile/SrcWriter/Metadata.cpp @@ -179,6 +179,12 @@ namespace PdfWriter m_nLengthBegin = 0; m_nLengthEnd = 0; } + void CStreamData::SetID(CBinaryObject* pID) + { + if (!pID) + return; + Add("ID", pID); + } bool CStreamData::AddMetaData(const std::wstring& sMetaName, BYTE* pMetaData, DWORD nMetaLength) { if (sMetaName == L"Length") diff --git a/PdfFile/SrcWriter/Metadata.h b/PdfFile/SrcWriter/Metadata.h index 8e5d0da737..ea3673035d 100644 --- a/PdfFile/SrcWriter/Metadata.h +++ b/PdfFile/SrcWriter/Metadata.h @@ -62,6 +62,7 @@ namespace PdfWriter return dict_type_STREAM; } + void SetID(CBinaryObject* pID); bool AddMetaData(const std::wstring& sMetaName, BYTE* pMetaData, DWORD nMetaLength); void WriteToStream(CStream* pStream, CEncrypt* pEncrypt) override; void AfterWrite(CStream* pStream) override; diff --git a/PdfFile/test/test.cpp b/PdfFile/test/test.cpp index 0ddac403bb..6eab94b8e3 100644 --- a/PdfFile/test/test.cpp +++ b/PdfFile/test/test.cpp @@ -149,27 +149,25 @@ TEST_F(CPdfFileTest, GetMetaData) BYTE* pMetaData = NULL; DWORD nMetaLength = 0; - if (pdfFile->GetMetaData(wsSrcFile, L"Test0", &pMetaData, nMetaLength)) + if (pdfFile->GetMetaData(wsSrcFile, L"ONLYOFFICEFORM", &pMetaData, nMetaLength)) { NSFile::CFileBinary oFile; - if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/resGetMetaData0.png")) + if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/ONLYOFFICEFORM.docxf")) oFile.WriteFile(pMetaData, nMetaLength); oFile.CloseFile(); EXPECT_TRUE(pMetaData); } RELEASEARRAYOBJECTS(pMetaData); +} - if (pdfFile->GetMetaData(wsSrcFile, L"Test1", &pMetaData, nMetaLength)) - { - NSFile::CFileBinary oFile; - if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/resGetMetaData1.png")) - oFile.WriteFile(pMetaData, nMetaLength); - oFile.CloseFile(); +TEST_F(CPdfFileTest, ValidMetaData) +{ + GTEST_SKIP(); - EXPECT_TRUE(pMetaData); - } - RELEASEARRAYOBJECTS(pMetaData); + LoadFromFile(); + + std::cout << "ValidMetaData " << (pdfFile->ValidMetaData() ? "true" : "false") << std::endl; } TEST_F(CPdfFileTest, PdfBinToPng) @@ -215,14 +213,9 @@ TEST_F(CPdfFileTest, SetMetaData) BYTE* pFileData = NULL; DWORD nFileSize; - std::wstring sFile = NSFile::GetProcessDirectory() + L"/res0.png"; + std::wstring sFile = NSFile::GetProcessDirectory() + L"/ONLYOFFICEFORM.docxf"; EXPECT_TRUE(NSFile::CFileBinary::ReadAllBytes(sFile, &pFileData, nFileSize)); - pdfFile->AddMetaData(L"Test0", pFileData, nFileSize); - RELEASEARRAYOBJECTS(pFileData); - - sFile = NSFile::GetProcessDirectory() + L"/res1.png"; - EXPECT_TRUE(NSFile::CFileBinary::ReadAllBytes(sFile, &pFileData, nFileSize)); - pdfFile->AddMetaData(L"Test1", pFileData, nFileSize); + pdfFile->AddMetaData(L"ONLYOFFICEFORM", pFileData, nFileSize); RELEASEARRAYOBJECTS(pFileData); EXPECT_HRESULT_SUCCEEDED(pdfFile->OnlineWordToPdfFromBinary(NSFile::GetProcessDirectory() + L"/pdf.bin", wsDstFile)); diff --git a/RtfFile/Format/RtfChar.cpp b/RtfFile/Format/RtfChar.cpp index 47f322b4ad..8bed868948 100644 --- a/RtfFile/Format/RtfChar.cpp +++ b/RtfFile/Format/RtfChar.cpp @@ -132,7 +132,7 @@ std::wstring RtfChar::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oProperty.m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime(m_oProperty.m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oProperty.m_nRevised = PROP_DEF; } if (m_oProperty.m_nDeleted != PROP_DEF) @@ -142,7 +142,7 @@ std::wstring RtfChar::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oProperty.m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime(m_oProperty.m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oProperty.m_nDeleted = PROP_DEF; } sResult += L""; @@ -173,7 +173,7 @@ std::wstring RtfChar::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oProperty.m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime(m_oProperty.m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oProperty.m_nRevised = PROP_DEF; } if (m_oProperty.m_nDeleted != PROP_DEF) @@ -183,7 +183,7 @@ std::wstring RtfChar::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oProperty.m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime(m_oProperty.m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oProperty.m_nDeleted = PROP_DEF; } sResult += m_oProperty.RenderToOOX(oRenderParameter);//w:rPr внутри @@ -415,7 +415,7 @@ std::wstring RtfCharSpecial::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oProperty.m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime(m_oProperty.m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oProperty.m_nRevised = PROP_DEF; } if (m_oProperty.m_nDeleted != PROP_DEF) @@ -425,7 +425,7 @@ std::wstring RtfCharSpecial::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oProperty.m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime(m_oProperty.m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oProperty.m_nDeleted = PROP_DEF; } sResult += L""; diff --git a/RtfFile/Format/RtfField.cpp b/RtfFile/Format/RtfField.cpp index 7efac19245..a18d902e84 100644 --- a/RtfFile/Format/RtfField.cpp +++ b/RtfFile/Format/RtfField.cpp @@ -289,7 +289,7 @@ std::wstring RtfField::RenderToOOX(RenderParameter oRenderParameter) sAuthor = pRtfDocument->m_oRevisionTable.GetAuthor(m_pInsert->m_oCharProperty.m_nRevauth); sDate = std::wstring(RtfUtility::convertDateTime(m_pInsert->m_oCharProperty.m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_pInsert->m_oCharProperty.m_nRevised = PROP_DEF; } if (m_pInsert->m_oCharProperty.m_nDeleted != PROP_DEF) @@ -299,7 +299,7 @@ std::wstring RtfField::RenderToOOX(RenderParameter oRenderParameter) sAuthor = pRtfDocument->m_oRevisionTable.GetAuthor(m_pInsert->m_oCharProperty.m_nRevauthDel); sDate = std::wstring(RtfUtility::convertDateTime(m_pInsert->m_oCharProperty.m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_pInsert->m_oCharProperty.m_nDeleted = PROP_DEF; } //поверяем на наличие гиперссылки diff --git a/RtfFile/Format/RtfOle.cpp b/RtfFile/Format/RtfOle.cpp index bab4dd3daa..7a9f018036 100644 --- a/RtfFile/Format/RtfOle.cpp +++ b/RtfFile/Format/RtfOle.cpp @@ -82,7 +82,7 @@ std::wstring RtfOle::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(pCharProps->m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime(pCharProps->m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; pCharProps->m_nRevised = PROP_DEF; } if (pCharProps->m_nDeleted != PROP_DEF) @@ -92,7 +92,7 @@ std::wstring RtfOle::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(pCharProps->m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime(pCharProps->m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; pCharProps->m_nDeleted = PROP_DEF; } //---------- diff --git a/RtfFile/Format/RtfProperty.cpp b/RtfFile/Format/RtfProperty.cpp index a286cb60ab..f81ac1d476 100644 --- a/RtfFile/Format/RtfProperty.cpp +++ b/RtfFile/Format/RtfProperty.cpp @@ -1530,7 +1530,7 @@ std::wstring RtfCharProperty::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime( m_nRevdttm ).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_nRevised = PROP_DEF; } if (m_nDeleted != PROP_DEF) @@ -1540,7 +1540,7 @@ std::wstring RtfCharProperty::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime( m_nRevdttmDel ).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_nDeleted = PROP_DEF; } sResult += L""; @@ -1551,14 +1551,14 @@ std::wstring RtfCharProperty::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime(m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; } if ( PROP_DEF != m_nRevised ) { std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime(m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; } if( PROP_DEF != m_nCharStyle ) { @@ -1793,7 +1793,7 @@ std::wstring RtfCharProperty::RenderToOOX(RenderParameter oRenderParameter) RenderParameter oRenderParameterNew = oRenderParameter; oRenderParameterNew.nType = RENDER_TO_OOX_PARAM_UNKNOWN; - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; sResult += L""; sResult += m_pOldCharProp->RenderToOOX(oRenderParameterNew); sResult += L""; @@ -3921,7 +3921,7 @@ std::wstring RtfParagraphProperty::RenderToOOX(RenderParameter oRenderParameter) RenderParameter oRenderParameterNew = oRenderParameter; oRenderParameterNew.nType = RENDER_TO_OOX_PARAM_UNKNOWN; - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; sResult += L""; sResult += m_pOldParagraphProp->RenderToOOX(oRenderParameterNew); sResult += L""; @@ -5060,14 +5060,14 @@ std::wstring RtfRowProperty::RenderToOOX(RenderParameter oRenderParameter) // std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(oReader.m_oState->m_oCharProp.m_nRevauthDel); // std::wstring sDate(RtfUtility::convertDateTime(oReader.m_oState->m_oCharProp.m_nRevdttmDel).c_str()); - // sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; + // sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; //} //if ( PROP_DEF != oReader.m_oState->m_oCharProp.m_nRevised ) //{ // std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(oReader.m_oState->m_oCharProp.m_nRevauth); // std::wstring sDate(RtfUtility::convertDateTime(oReader.m_oState->m_oCharProp.m_nRevdttm).c_str()); // - // sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; + // sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; //} std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_nTrAuth); std::wstring sDate(RtfUtility::convertDateTime(m_nTrDate).c_str()); @@ -5078,11 +5078,11 @@ std::wstring RtfRowProperty::RenderToOOX(RenderParameter oRenderParameter) if (rowChangeProps.empty()) { - sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; } else { - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; sResult += L""; sResult += rowChangeProps; sResult += L""; diff --git a/RtfFile/Format/RtfSection.cpp b/RtfFile/Format/RtfSection.cpp index f4cddef819..50b69589a8 100644 --- a/RtfFile/Format/RtfSection.cpp +++ b/RtfFile/Format/RtfSection.cpp @@ -1000,7 +1000,7 @@ std::wstring RtfSectionProperty::RenderToOOX(RenderParameter oRenderParameter) RenderParameter oRenderParameterNew = oRenderParameter; oRenderParameterNew.nType = RENDER_TO_OOX_PARAM_UNKNOWN; - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; sResult += m_pOldSectionProp->RenderToOOX(oRenderParameterNew); sResult += L""; } diff --git a/RtfFile/Format/RtfShape.cpp b/RtfFile/Format/RtfShape.cpp index f9cbec4508..c5243517a4 100644 --- a/RtfFile/Format/RtfShape.cpp +++ b/RtfFile/Format/RtfShape.cpp @@ -867,7 +867,7 @@ std::wstring RtfShape::RenderToOOXBegin(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oCharProperty.m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime(m_oCharProperty.m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oCharProperty.m_nRevised = PROP_DEF; } if (m_oCharProperty.m_nDeleted != PROP_DEF) @@ -877,7 +877,7 @@ std::wstring RtfShape::RenderToOOXBegin(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oCharProperty.m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime(m_oCharProperty.m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oCharProperty.m_nDeleted = PROP_DEF; } std::wstring sCharProp = m_oCharProperty.RenderToOOX(oRenderParameter); diff --git a/RtfFile/OOXml/Writer/OOXCommentsWriter.cpp b/RtfFile/OOXml/Writer/OOXCommentsWriter.cpp index 7b576c52a7..2007ce82a7 100644 --- a/RtfFile/OOXml/Writer/OOXCommentsWriter.cpp +++ b/RtfFile/OOXml/Writer/OOXCommentsWriter.cpp @@ -153,7 +153,7 @@ mc:Ignorable=\"w14 w15 wp14\">"; for (std::map::iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { sResult += L"second.nID) + L"\" w:author=\"" + - it->second.author + L"\" w:date=\"" + it->second.date + L"\" w:initials=\"" + it->second.authorId + L"\">"; + XmlUtils::EncodeXmlString(it->second.author) + L"\" w:date=\"" + it->second.date + L"\" w:initials=\"" + it->second.authorId + L"\">"; sResult += it->second.content; sResult += L""; diff --git a/Test/Applications/StandardTester/main.cpp b/Test/Applications/StandardTester/main.cpp index d68817925d..fa29715f0f 100644 --- a/Test/Applications/StandardTester/main.cpp +++ b/Test/Applications/StandardTester/main.cpp @@ -27,6 +27,19 @@ enum CheckResultCode bool g_save_x2t_xml = false; +int GetPagesCount(const std::wstring& dir) +{ + int nCount = 0; + std::vector files = NSDirectory::GetFiles(dir, false); + for (std::vector::iterator i = files.begin(); i != files.end(); i++) + { + std::wstring sExt = NSFile::GetFileExtention(*i); + if (sExt == L"png") + ++nCount; + } + return nCount; +} + class CConverter; class CInternalWorker { @@ -63,6 +76,7 @@ public: bool m_bIsStandard; bool m_bIsDiffAllInOne; + bool m_bDiffOnly{false}; NSCriticalSection::CRITICAL_SECTION m_oCS; NSCriticalSection::CRITICAL_SECTION m_oCS_OfficeUtils; @@ -121,6 +135,13 @@ public: void OpenDir(std::wstring sDir) { m_sInputFolder = sDir; + if (m_bDiffOnly) + { + m_files = NSDirectory::GetDirectories(m_sInputFolder); + m_nCount = (int)m_files.size(); + return; + } + std::vector arFiles = NSDirectory::GetFiles(sDir, true); for (std::vector::iterator iter = arFiles.begin(); iter != arFiles.end(); iter++) { @@ -268,6 +289,224 @@ public: NSFile::CFileBinary::SaveToFile(sLogFile, sLogContent, true); } + + + int GenerateDiff(const std::wstring strDirIn, const std::wstring strDirOut, const std::wstring strDiffs) + { + int nCountInPages = GetPagesCount(strDirIn); + int nCountOutPages = GetPagesCount(strDirOut); + int checkCode = crcEqual; + + if (nCountInPages != nCountOutPages) + { + if (nCountInPages > nCountOutPages) + nCountInPages = nCountOutPages; + + if (!NSDirectory::Exists(strDiffs)) + NSDirectory::CreateDirectories(CorrectPathW(strDiffs)); + + std::wstring sFilePagesDiff = strDiffs + L"/pages_count"; + NSFile::CFileBinary oFile; + oFile.CreateFileW(sFilePagesDiff); + oFile.CloseFile(); + + checkCode |= crcPageCount; + } + + for (int nPage = 0; nPage < nCountInPages; ++nPage) + { + std::wstring sPageI = strDirIn + L"/image" + std::to_wstring(nPage + 1) + L".png"; + std::wstring sPageO = strDirOut + L"/image" + std::to_wstring(nPage + 1) + L".png"; + std::wstring sPageDiff = strDiffs + L"/image" + std::to_wstring(nPage + 1) + L".png"; + + CBgraFrame frameI; + frameI.OpenFile(sPageI); + + CBgraFrame frameO; + frameO.OpenFile(sPageO); + + int nW_I = frameI.get_Width(); + int nH_I = frameI.get_Height(); + + int nW_O = frameO.get_Width(); + int nH_O = frameO.get_Height(); + + if (nW_I != nW_O || nH_I != nH_O) + { + if (!NSDirectory::Exists(strDiffs)) + NSDirectory::CreateDirectories(CorrectPathW(strDiffs)); + + std::wstring sFilePagesDiff = sPageDiff; + NSFile::CFileBinary oFile; + oFile.CreateFileW(sPageDiff); + oFile.WriteStringUTF8(L"sizes!"); + oFile.CloseFile(); + + checkCode |= crcPageSize; + continue; + } + + BYTE* pDataI = frameI.get_Data(); + BYTE* pDataO = frameO.get_Data(); + size_t sizeMemory = 4 * nW_I * nH_I; + + if (0 == memcmp(pDataI, pDataO, sizeMemory)) + continue; + + sizeMemory = nW_I * nH_I; + + int nEpsilonEps = 3; + int nEpsilonNatural = 5; + + int nDivExist = 0; + for (int indexPixH = 0; indexPixH < nH_I; indexPixH++) + { + for (int indexPixW = 0; indexPixW < nW_I; indexPixW++) + { + if (pDataI[0] != pDataO[0] || pDataI[1] != pDataO[1] || pDataI[2] != pDataO[2]) + { + // test epsilon natural + if ((abs(pDataI[0] - pDataO[0]) < nEpsilonNatural) && + (abs(pDataI[1] - pDataO[1]) < nEpsilonNatural) && + (abs(pDataI[2] - pDataO[2]) < nEpsilonNatural)) + { + pDataI += 4; + pDataO += 4; + continue; + } + + // test epsilon left, right, top, bottom + int nEpsUp = nEpsilonEps; + if (indexPixH > 0) + { + BYTE* pByteI = frameI.get_Data() + 4 * (indexPixH - 1) * nW_I + 4 * indexPixW; + + if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && + (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && + (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) + { + nEpsUp = nEpsilonEps - 1; + } + } + + int nEpsDown = nEpsilonEps; + if (indexPixH < (nH_I - 1)) + { + BYTE* pByteI = frameI.get_Data() + 4 * (indexPixH + 1) * nW_I + 4 * indexPixW; + + if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && + (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && + (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) + { + nEpsDown = nEpsilonEps - 1; + } + } + + int nEpsLeft = nEpsilonEps; + if (indexPixW > 0) + { + BYTE* pByteI = pDataI - 4; + + if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && + (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && + (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) + { + nEpsLeft = nEpsilonEps - 1; + } + } + + int nEpsRight = nEpsilonEps; + if (indexPixW < (nW_I - 1)) + { + BYTE* pByteI = pDataI + 4; + + if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && + (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && + (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) + { + nEpsRight = nEpsilonEps - 1; + } + } + + if ((nEpsLeft < nEpsilonEps) || + (nEpsRight < nEpsilonEps) || + (nEpsUp < nEpsilonEps) || + (nEpsDown < nEpsilonEps)) + { + pDataI += 4; + pDataO += 4; + continue; + } + + ++nDivExist; + + if (pDataO[0] == 0x00 && pDataO[1] == 0x00 && pDataO[2] == 0xFF) + { + pDataO[0] = 0xFF; + pDataO[1] = 0x00; + pDataO[2] = 0x00; + } + else + { + pDataO[0] = 0x00; + pDataO[1] = 0x00; + pDataO[2] = 0xFF; + } + } + pDataI += 4; + pDataO += 4; + } + } + + if (nDivExist > 7) + { + if (!NSDirectory::Exists(strDiffs)) + NSDirectory::CreateDirectories(CorrectPathW(strDiffs)); + + if (!m_bIsDiffAllInOne) + { + frameO.SaveFile(sPageDiff, 4); + } + else + { + CBgraFrame frameOSrc; + frameOSrc.OpenFile(sPageO); + + BYTE* pData1 = frameI.get_Data(); + BYTE* pData2 = frameOSrc.get_Data(); + BYTE* pData3 = frameO.get_Data(); + + int nRowW = 4 * nW_I; + BYTE* pDataAll = new BYTE[3 * nRowW * nH_I]; + BYTE* pDataAllSrc = pDataAll; + for (int j = 0; j < nH_I; j++) + { + memcpy(pDataAll, pData1, nRowW); + pDataAll += nRowW; + pData1 += nRowW; + + memcpy(pDataAll, pData2, nRowW); + pDataAll += nRowW; + pData2 += nRowW; + + memcpy(pDataAll, pData3, nRowW); + pDataAll += nRowW; + pData3 += nRowW; + } + + CBgraFrame oFrameAll; + oFrameAll.put_Data(pDataAllSrc); + oFrameAll.put_Width(3 * nW_I); + oFrameAll.put_Height(nH_I); + oFrameAll.put_Stride(-3 * nRowW); + oFrameAll.SaveFile(sPageDiff, 4); + } + + checkCode |= crcPageDiffs; + } + } + return checkCode; + } }; class CConverter : public NSThreads::CBaseThread @@ -277,6 +516,7 @@ public: std::wstring m_file; std::wstring m_folder_dst; int m_format; + bool m_bDiffOnly{false}; public: CConverter(CInternalWorker* pWorker) : NSThreads::CBaseThread() @@ -291,6 +531,21 @@ public: virtual DWORD ThreadProc() { + if (m_bDiffOnly) + { + std::wstring strDirIn = m_file; + std::wstring strDirOut = m_folder_dst; + + std::wstring strDiffsMain = NSFile::GetDirectoryName(strDirOut) + L"/DIFF"; + std::wstring strDiffs = strDiffsMain + L"/" + NSFile::GetFileName(m_file); + + int checkCode = m_pInternal->GenerateDiff(strDirIn, strDirOut, strDiffs); + + m_bRunThread = FALSE; + m_pInternal->OnConvertFile(this, 0, 0, checkCode); + + return 0; + } bool bIsOfficeFile = true; if (true) { @@ -393,223 +648,7 @@ public: std::wstring strDiffsMain = NSFile::GetDirectoryName(strDirOut) + L"/DIFF"; std::wstring strDiffs = strDiffsMain + L"/" + NSFile::GetFileName(m_file); - int nCountInPages = GetPagesCount(strDirIn); - int nCountOutPages = GetPagesCount(strDirOut); - - if (nCountInPages != nCountOutPages) - { - if (!NSDirectory::Exists(strDiffsMain)) - NSDirectory::CreateDirectory(strDiffsMain); - if (!NSDirectory::Exists(strDiffs)) - NSDirectory::CreateDirectory(strDiffs); - - if (nCountInPages > nCountOutPages) - nCountInPages = nCountOutPages; - - std::wstring sFilePagesDiff = strDiffs + L"/pages_count"; - NSFile::CFileBinary oFile; - oFile.CreateFileW(sFilePagesDiff); - oFile.CloseFile(); - - checkCode |= crcPageCount; - } - - for (int nPage = 0; nPage < nCountInPages; ++nPage) - { - std::wstring sPageI = strDirIn + L"/image" + std::to_wstring(nPage + 1) + L".png"; - std::wstring sPageO = strDirOut + L"/image" + std::to_wstring(nPage + 1) + L".png"; - std::wstring sPageDiff = strDiffs + L"/image" + std::to_wstring(nPage + 1) + L".png"; - - CBgraFrame frameI; - frameI.OpenFile(sPageI); - - CBgraFrame frameO; - frameO.OpenFile(sPageO); - - int nW_I = frameI.get_Width(); - int nH_I = frameI.get_Height(); - - int nW_O = frameO.get_Width(); - int nH_O = frameO.get_Height(); - - if (nW_I != nW_O || nH_I != nH_O) - { - if (!NSDirectory::Exists(strDiffsMain)) - NSDirectory::CreateDirectory(strDiffsMain); - if (!NSDirectory::Exists(strDiffs)) - NSDirectory::CreateDirectory(strDiffs); - - std::wstring sFilePagesDiff = sPageDiff; - NSFile::CFileBinary oFile; - oFile.CreateFileW(sPageDiff); - oFile.WriteStringUTF8(L"sizes!"); - oFile.CloseFile(); - - checkCode |= crcPageSize; - continue; - } - - BYTE* pDataI = frameI.get_Data(); - BYTE* pDataO = frameO.get_Data(); - size_t sizeMemory = 4 * nW_I * nH_I; - - if (0 == memcmp(pDataI, pDataO, sizeMemory)) - continue; - - sizeMemory = nW_I * nH_I; - - int nEpsilonEps = 3; - int nEpsilonNatural = 5; - - int nDivExist = 0; - for (int indexPixH = 0; indexPixH < nH_I; indexPixH++) - { - for (int indexPixW = 0; indexPixW < nW_I; indexPixW++) - { - if (pDataI[0] != pDataO[0] || pDataI[1] != pDataO[1] || pDataI[2] != pDataO[2]) - { - // test epsilon natural - if ((abs(pDataI[0] - pDataO[0]) < nEpsilonNatural) && - (abs(pDataI[1] - pDataO[1]) < nEpsilonNatural) && - (abs(pDataI[2] - pDataO[2]) < nEpsilonNatural)) - { - pDataI += 4; - pDataO += 4; - continue; - } - - // test epsilon left, right, top, bottom - int nEpsUp = nEpsilonEps; - if (indexPixH > 0) - { - BYTE* pByteI = frameI.get_Data() + 4 * (indexPixH - 1) * nW_I + 4 * indexPixW; - - if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && - (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && - (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) - { - nEpsUp = nEpsilonEps - 1; - } - } - - int nEpsDown = nEpsilonEps; - if (indexPixH < (nH_I - 1)) - { - BYTE* pByteI = frameI.get_Data() + 4 * (indexPixH + 1) * nW_I + 4 * indexPixW; - - if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && - (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && - (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) - { - nEpsDown = nEpsilonEps - 1; - } - } - - int nEpsLeft = nEpsilonEps; - if (indexPixW > 0) - { - BYTE* pByteI = pDataI - 4; - - if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && - (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && - (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) - { - nEpsLeft = nEpsilonEps - 1; - } - } - - int nEpsRight = nEpsilonEps; - if (indexPixW < (nW_I - 1)) - { - BYTE* pByteI = pDataI + 4; - - if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && - (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && - (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) - { - nEpsRight = nEpsilonEps - 1; - } - } - - if ((nEpsLeft < nEpsilonEps) || - (nEpsRight < nEpsilonEps) || - (nEpsUp < nEpsilonEps) || - (nEpsDown < nEpsilonEps)) - { - pDataI += 4; - pDataO += 4; - continue; - } - - ++nDivExist; - - if (pDataO[0] == 0x00 && pDataO[1] == 0x00 && pDataO[2] == 0xFF) - { - pDataO[0] = 0xFF; - pDataO[1] = 0x00; - pDataO[2] = 0x00; - } - else - { - pDataO[0] = 0x00; - pDataO[1] = 0x00; - pDataO[2] = 0xFF; - } - } - pDataI += 4; - pDataO += 4; - } - } - - if (nDivExist > 7) - { - if (!NSDirectory::Exists(strDiffsMain)) - NSDirectory::CreateDirectory(strDiffsMain); - if (!NSDirectory::Exists(strDiffs)) - NSDirectory::CreateDirectory(strDiffs); - - if (!m_pInternal->m_bIsDiffAllInOne) - { - frameO.SaveFile(sPageDiff, 4); - } - else - { - CBgraFrame frameOSrc; - frameOSrc.OpenFile(sPageO); - - BYTE* pData1 = frameI.get_Data(); - BYTE* pData2 = frameOSrc.get_Data(); - BYTE* pData3 = frameO.get_Data(); - - int nRowW = 4 * nW_I; - BYTE* pDataAll = new BYTE[3 * nRowW * nH_I]; - BYTE* pDataAllSrc = pDataAll; - for (int j = 0; j < nH_I; j++) - { - memcpy(pDataAll, pData1, nRowW); - pDataAll += nRowW; - pData1 += nRowW; - - memcpy(pDataAll, pData2, nRowW); - pDataAll += nRowW; - pData2 += nRowW; - - memcpy(pDataAll, pData3, nRowW); - pDataAll += nRowW; - pData3 += nRowW; - } - - CBgraFrame oFrameAll; - oFrameAll.put_Data(pDataAllSrc); - oFrameAll.put_Width(3 * nW_I); - oFrameAll.put_Height(nH_I); - oFrameAll.put_Stride(-3 * nRowW); - oFrameAll.SaveFile(sPageDiff, 4); - } - - checkCode |= crcPageDiffs; - } - } + checkCode = m_pInternal->GenerateDiff(strDirIn, strDirOut, strDiffs); } m_bRunThread = FALSE; @@ -617,19 +656,6 @@ public: m_pInternal->OnConvertFile(this, nReturnCode, (int)(dwTime2 - dwTime1), checkCode); return 0; } - - int GetPagesCount(const std::wstring& dir) - { - int nCount = 0; - std::vector files = NSDirectory::GetFiles(dir, false); - for (std::vector::iterator i = files.begin(); i != files.end(); i++) - { - std::wstring sExt = NSFile::GetFileExtention(*i); - if (sExt == L"png") - ++nCount; - } - return nCount; - } }; CConverter* CInternalWorker::GetNextConverter() @@ -640,6 +666,7 @@ CConverter* CInternalWorker::GetNextConverter() CConverter* pConverter = new CConverter(this); pConverter->DestroyOnFinish(); pConverter->m_file = m_files[m_nCurrent]; + pConverter->m_bDiffOnly = m_bDiffOnly; ++m_nCurrent; std::wstring sName = NSFile::GetFileName(pConverter->m_file); @@ -737,6 +764,7 @@ int main(int argc, char** argv) { std::vector arFontsDirs; bool bIsStandard = false; + bool bDiffOnly = false; std::wstring strInputFolder = L""; std::wstring strOutputFolder = L""; bool bIsUseSystemFonts = true; @@ -780,6 +808,10 @@ int main(int argc, char** argv) { bIsStandard = true; } + else if (sKey == L"--diff-only") + { + bDiffOnly = true; + } else if (sKey == L"--use-system-fonts") { if (sValue == L"0" || sValue == L"false") @@ -853,6 +885,7 @@ int main(int argc, char** argv) #endif CInternalWorker oWorker; + oWorker.m_bDiffOnly = bDiffOnly; oWorker.OpenDir(strInputFolder); oWorker.m_sOutputFolder = strOutputFolder; oWorker.m_bIsStandard = bIsStandard; diff --git a/Test/Applications/x2tTester/README.md b/Test/Applications/x2tTester/README.md index f8a03581a4..1b35855423 100644 --- a/Test/Applications/x2tTester/README.md +++ b/Test/Applications/x2tTester/README.md @@ -1,7 +1,9 @@ CONFIGURATION ============= -You need to create an xml configuration file. It must contain: +## Default conversion + +You need to create an xml configuration file. It contains: # root of xml @@ -95,8 +97,23 @@ You need to create an xml configuration file. It must contain: docx txt pptx xlsx txt doc pdf +## Extraction +x2ttester can extract files with the required output extension instead of default x2t conversion. Set extraction mode: -You can use the following templates: + (non-required) sets extraction mode (default - "0") + + +When `extract` is "1", you can set the `output` parameter to determine which exts will be extracted. Default `output` is `emf wmf`. +Params `input`, `inputDirectory`, `outputDirectory`, `cores` works the same. + +Extract mode has additional options: + + (non-required) converts non-zip office files into docx (e.g. pdf) (default - "0"). + + +The conversion params in `convertBeforeExtract` are the same as the default conversion. + +## Templates # main xml config diff --git a/Test/Applications/x2tTester/x2tTester.cpp b/Test/Applications/x2tTester/x2tTester.cpp index b594a8ae4b..6a6a5ccdcc 100644 --- a/Test/Applications/x2tTester/x2tTester.cpp +++ b/Test/Applications/x2tTester/x2tTester.cpp @@ -119,22 +119,23 @@ std::vector CFormatsList::GetAllExts() const { std::vector all_formats; - for(auto& val : m_documents) + for (const auto& val : m_documents) all_formats.push_back(val); - for(auto& val : m_presentations) + for (const auto& val : m_presentations) all_formats.push_back(val); - for(auto& val : m_spreadsheets) + for (const auto& val : m_spreadsheets) all_formats.push_back(val); - for(auto& val : m_images) + for (const auto& val : m_images) all_formats.push_back(val); - for(auto& val : m_crossplatform) + for (const auto& val : m_crossplatform) all_formats.push_back(val); - all_formats.push_back(m_pdf); + if (!m_pdf.empty()) + all_formats.push_back(m_pdf); return all_formats; } @@ -259,6 +260,16 @@ CFormatsList CFormatsList::GetOutputExts() return list; } +CFormatsList CFormatsList::GetExtractExts() +{ + CFormatsList list; + + list.m_images.push_back(L"emf"); + list.m_images.push_back(L"wmf"); + + return list; +} + Cx2tTester::Cx2tTester(const std::wstring& configPath) { m_bIsUseSystemFonts = true; @@ -269,14 +280,22 @@ Cx2tTester::Cx2tTester(const std::wstring& configPath) m_bIsFilenamePassword = true; m_bTroughConversion = false; m_bSaveEnvironment = false; + + m_bExtract = false; + m_bConvertBeforeExtract = false; + m_defaultCsvDelimiter = L";"; m_defaultCsvTxtEndcoding = L"UTF-8"; m_inputFormatsList = CFormatsList::GetDefaultExts(); m_outputFormatsList = CFormatsList::GetOutputExts(); + m_extractFormatsList = CFormatsList::GetExtractExts(); m_timeout = 5 * 60; // 5 min + SetConfig(configPath); + m_errorsXmlDirectory = m_outputDirectory + FILE_SEPARATOR_STR + L"_errors"; m_troughConversionDirectory = m_outputDirectory + FILE_SEPARATOR_STR + L"_t"; + m_tempDirectory = m_outputDirectory + FILE_SEPARATOR_STR + L"_temp"; m_fontsDirectory = NSFile::GetProcessDirectory() + FILE_SEPARATOR_STR + L"fonts"; @@ -335,6 +354,12 @@ Cx2tTester::~Cx2tTester() m_reportCS.DeleteCriticalSection(); m_outputCS.DeleteCriticalSection(); m_reportStream.CloseFile(); + + for(auto&& val : m_deleteLaterFiles) + NSFile::CFileBinary::Remove(val); + + for(auto&& val : m_deleteLaterDirectories) + NSDirectory::DeleteDirectory(val); } void Cx2tTester::SetConfig(const std::wstring& configPath) @@ -366,6 +391,8 @@ void Cx2tTester::SetConfig(const std::wstring& configPath) else if(name == L"troughConversion" && !node.GetText().empty()) m_bTroughConversion = std::stoi(node.GetText()); else if(name == L"saveEnvironment" && !node.GetText().empty()) m_bSaveEnvironment = std::stoi(node.GetText()); else if(name == L"defaultCsvTxtEncoding" && !node.GetText().empty()) m_defaultCsvTxtEndcoding = node.GetText(); + else if(name == L"extract" && !node.GetText().empty()) m_bExtract = std::stoi(node.GetText()); + else if(name == L"convertBeforeExtract" && !node.GetText().empty()) m_bConvertBeforeExtract = std::stoi(node.GetText()); else if(name == L"defaultCsvDelimiter" && !node.GetText().empty()) m_defaultCsvDelimiter = (wchar_t)std::stoi(node.GetText(), nullptr, 16); else if(name == L"inputFilesList" && !node.GetText().empty()) { @@ -418,17 +445,40 @@ void Cx2tTester::SetConfig(const std::wstring& configPath) exit(-1); } - if(default_input_formats) + if (default_input_formats) m_inputExts = m_inputFormatsList.GetAllExts(); - if(default_output_formats) - m_outputExts = m_outputFormatsList.GetAllExts(); + if (default_output_formats) + { + if (m_bExtract) + m_outputExts = m_extractFormatsList.GetAllExts(); + else + m_outputExts = m_outputFormatsList.GetAllExts(); + } + } void Cx2tTester::Start() { // setup timer m_timeStart = NSTimers::GetTickCount(); + m_outputDirectory = CorrectPathW(m_outputDirectory); + m_errorsXmlDirectory = CorrectPathW(m_errorsXmlDirectory); + m_troughConversionDirectory = CorrectPathW(m_troughConversionDirectory); + m_tempDirectory = CorrectPathW(m_tempDirectory); + + // setup & clear output folder + if(NSDirectory::Exists(m_outputDirectory)) + NSDirectory::DeleteDirectory(m_outputDirectory); + + NSDirectory::CreateDirectory(m_outputDirectory); + + // setup & clear errors folder + if(NSDirectory::Exists(m_errorsXmlDirectory)) + NSDirectory::DeleteDirectory(m_errorsXmlDirectory); + + NSDirectory::CreateDirectory(m_errorsXmlDirectory); + // check fonts CApplicationFontsWorker fonts_worker; fonts_worker.m_sDirectory = m_fontsDirectory; @@ -449,23 +499,6 @@ void Cx2tTester::Start() NSFonts::IApplicationFonts* pFonts = fonts_worker.Check(); RELEASEINTERFACE(pFonts); - m_outputDirectory = CorrectPathW(m_outputDirectory); - m_errorsXmlDirectory = CorrectPathW(m_errorsXmlDirectory); - m_troughConversionDirectory = CorrectPathW(m_troughConversionDirectory); - - // setup & clear output folder - if(NSDirectory::Exists(m_outputDirectory)) - NSDirectory::DeleteDirectory(m_outputDirectory); - - NSDirectory::CreateDirectory(m_outputDirectory); - - // setup & clear errors folder - if(NSDirectory::Exists(m_errorsXmlDirectory)) - NSDirectory::DeleteDirectory(m_errorsXmlDirectory); - - NSDirectory::CreateDirectory(m_errorsXmlDirectory); - - std::vector files = NSDirectory::GetFiles(m_inputDirectory, true); for(int i = 0; i < files.size(); i++) { @@ -483,8 +516,53 @@ void Cx2tTester::Start() } } - if(files.size() < m_maxProc) - m_maxProc = files.size(); + if (m_bExtract) + { + COfficeFileFormatChecker checker; + COfficeUtils utils; + std::vector files_to_convert; + + for (size_t i = 0; i < files.size(); i++) + if (utils.IsArchive(files[i]) == S_FALSE && checker.isOfficeFile(files[i])) + { + if (m_bConvertBeforeExtract) + files_to_convert.push_back(files[i]); + files.erase(files.begin() + i); + } + + if (!files_to_convert.empty()) + { + if(NSDirectory::Exists(m_tempDirectory)) + NSDirectory::DeleteDirectory(m_tempDirectory); + + NSDirectory::CreateDirectories(m_tempDirectory); + + auto copy_inputDirectory = m_inputDirectory; + auto copy_outputDirectory = m_outputDirectory; + auto copy_outputExts = m_outputExts; + + m_outputDirectory = m_tempDirectory; + m_outputExts = {L"docx"}; + + Convert(files_to_convert, true, true); + + m_outputDirectory = copy_outputDirectory; + m_outputExts = copy_outputExts; + + m_inputDirectory = m_tempDirectory; + std::vector temp_files = NSDirectory::GetFiles(m_tempDirectory, true); + Extract(temp_files); + + m_inputDirectory = copy_inputDirectory; + } + + Extract(files); + + if(NSDirectory::Exists(m_tempDirectory)) + NSDirectory::DeleteDirectory(m_tempDirectory); + + return; + } // conversion in _t directory -> _t directory to output if(m_bTroughConversion) @@ -512,16 +590,13 @@ void Cx2tTester::Start() Convert(files); WriteTime(); - - for(auto&& val : m_deleteLaterFiles) - NSFile::CFileBinary::Remove(val); - - for(auto&& val : m_deleteLaterDirectories) - NSDirectory::DeleteDirectory(val); } void Cx2tTester::Convert(const std::vector& files, bool bNoDirectory, bool bTrough) { + if(files.size() < m_maxProc) + m_maxProc = files.size(); + for(int i = 0; i < files.size(); i++) { const std::wstring& input_file = files[i]; @@ -569,7 +644,7 @@ void Cx2tTester::Convert(const std::vector& files, bool bNoDirecto continue; // setup & clear output subfolder - while(!NSDirectory::Exists(output_files_directory)) + if (!NSDirectory::Exists(output_files_directory)) NSDirectory::CreateDirectories(output_files_directory); std::wstring csvTxtEncodingS = m_defaultCsvTxtEndcoding; @@ -620,6 +695,8 @@ void Cx2tTester::Convert(const std::vector& files, bool bNoDirecto NSThreads::Sleep(50); } while(IsAllBusy()); + + m_coresCS.Enter(); // setup & start new coverter @@ -652,6 +729,50 @@ void Cx2tTester::Convert(const std::vector& files, bool bNoDirecto while(!IsAllFree()) NSThreads::Sleep(150); } +void Cx2tTester::Extract(const std::vector& files) +{ + if(files.size() < m_maxProc) + m_maxProc = files.size(); + + for (int i = 0; i < files.size(); i++) + { + const std::wstring& input_file = files[i]; + std::wstring input_filename = NSFile::GetFileName(input_file); + std::wstring input_file_directory = NSFile::GetDirectoryName(input_file); + std::wstring input_subfolders = input_file_directory.substr(m_inputDirectory.size(), + input_file_directory.size() - m_inputDirectory.size()); + std::wstring output_files_directory = m_outputDirectory + input_subfolders + FILE_SEPARATOR_STR + input_filename; + + if(!NSDirectory::Exists(output_files_directory)) + NSDirectory::CreateDirectories(output_files_directory); + + // waiting... + do + { + NSThreads::Sleep(50); + } while(IsAllBusy()); + + m_coresCS.Enter(); + + // setup & start new extractor + CExtractor *extractor = new CExtractor(this); + extractor->SetInputFile(input_file); + extractor->SetOutputFilesDirectory(output_files_directory); + extractor->SetExtractExts(m_outputExts); + extractor->SetFilesCount(files.size(), i + 1); + extractor->DestroyOnFinish(); + m_currentProc++; + + m_coresCS.Leave(); + + extractor->Start(0); + } + + // waiting all procs end + while(!IsAllFree()) + NSThreads::Sleep(150); +} + void Cx2tTester::WriteReportHeader() { CTemporaryCS CS(&m_reportCS); @@ -844,7 +965,7 @@ DWORD CConverter::ThreadProc() for(int i = 0; i < m_outputExts.size(); i++) { std::wstring output_ext = L"."+ m_outputExts[i]; - int output_format = checker.GetFormatByExtension(output_ext); + int output_format = m_checker.GetFormatByExtension(output_ext); std::wstring xml_params_filename = input_filename + L"_" + output_ext + L".xml"; std::wstring xml_params_file = m_outputFilesDirectory + FILE_SEPARATOR_STR + xml_params_filename; @@ -1077,4 +1198,78 @@ DWORD CConverter::ThreadProc() return 0; } +CExtractor::CExtractor(Cx2tTester* internal) : m_internal(internal) +{ +} +CExtractor::~CExtractor() +{ + Stop(); +} +void CExtractor::SetInputFile(const std::wstring& inputFile) +{ + m_inputFile = inputFile; +} +void CExtractor::SetOutputFilesDirectory(const std::wstring& outputFilesDirectory) +{ + m_outputFilesDirectory = outputFilesDirectory; +} +void CExtractor::SetExtractExts(const std::vector& extractExts) +{ + m_extractExts = extractExts; +} +void CExtractor::SetFilesCount(int totalFiles, int currFile) +{ + m_totalFiles = totalFiles; + m_currFile = currFile; +} + +DWORD CExtractor::ThreadProc() +{ + std::wstring input_filename = NSFile::GetFileName(m_inputFile); + std::wstring input_ext = L'.' + NSFile::GetFileExtention(input_filename); + std::wstring input_filename_no_ext = input_filename.substr(0, input_filename.size() - input_ext.size()); + + for (size_t i = 0; i < m_extractExts.size(); i++) + { + const std::wstring& extract_ext = m_extractExts[i]; + std::wstring output_folder = m_outputFilesDirectory + FILE_SEPARATOR_STR + extract_ext; + + // output_CS start + m_internal->m_outputCS.Enter(); + + std::cout << "[" << m_currFile << "/" << m_totalFiles << "](" << i + 1 << "/" << m_extractExts.size() << ") "; + std::cout << "(" << m_internal->m_currentProc << " processes now) "; + std::cout << U_TO_UTF8(input_filename) << " extract " << U_TO_UTF8(extract_ext) << " "; + + std::cout << std::endl; + m_internal->m_outputCS.Leave(); + + if (NSDirectory::Exists(output_folder)) + NSDirectory::DeleteDirectory(output_folder); + + NSDirectory::CreateDirectories(output_folder); + + std::wstring temp_folder = NSDirectory::CreateDirectoryWithUniqueName(output_folder); + m_utils.ExtractToDirectory(m_inputFile, temp_folder, nullptr, false); + + auto unzip_files = NSDirectory::GetFiles(temp_folder, true); + bool delete_empty = true; + for (const auto& file : unzip_files) + { + if (NSFile::GetFileExtention(file) == m_extractExts[i]) + { + delete_empty = false; + NSFile::CFileBinary::Move(file, output_folder + FILE_SEPARATOR_STR +NSFile::GetFileName(file)); + } + } + if (delete_empty) + NSDirectory::DeleteDirectory(output_folder); + NSDirectory::DeleteDirectory(temp_folder); + } + if (NSDirectory::GetFilesCount(m_outputFilesDirectory, true) == 0) + NSDirectory::DeleteDirectory(m_outputFilesDirectory); + + m_internal->m_currentProc--; + return 0; +} diff --git a/Test/Applications/x2tTester/x2tTester.h b/Test/Applications/x2tTester/x2tTester.h index 47dfac8605..01ce96ada2 100644 --- a/Test/Applications/x2tTester/x2tTester.h +++ b/Test/Applications/x2tTester/x2tTester.h @@ -55,7 +55,10 @@ public: static CFormatsList GetDefaultExts(); // all writable exts - static CFormatsList GetOutputExts(); + static CFormatsList GetOutputExts(); + + // default exts to extract + static CFormatsList GetExtractExts(); private: std::vector m_documents; @@ -111,6 +114,7 @@ private: // parse string like "docx txt" into vector std::vector ParseExtensionsString(std::wstring extensions, const CFormatsList& fl); void Convert(const std::vector& files, bool bNoDirectory = false, bool bTrough = false); + void Extract(const std::vector& files); // takes from config std::wstring m_reportFile; @@ -121,6 +125,7 @@ private: std::wstring m_errorsXmlDirectory; std::wstring m_troughConversionDirectory; std::wstring m_fontsDirectory; + std::wstring m_tempDirectory; // fonts bool m_bIsUseSystemFonts; @@ -137,6 +142,7 @@ private: // lists CFormatsList m_inputFormatsList; CFormatsList m_outputFormatsList; + CFormatsList m_extractFormatsList; bool m_bIsErrorsOnly; bool m_bIsTimestamp; @@ -157,6 +163,12 @@ private: std::vector m_deleteLaterFiles; std::vector m_deleteLaterDirectories; + + // extract files with output_ext from input_files + bool m_bExtract; + + // convert to docx before extract + bool m_bConvertBeforeExtract; }; // generates temp xml, convert, calls m_internal->writeReport @@ -194,7 +206,7 @@ private: std::wstring m_inputExt; std::wstring m_fontsDirectory; - COfficeFileFormatChecker checker; + COfficeFileFormatChecker m_checker; std::wstring m_x2tPath; std::wstring m_errorsXmlDirectory; @@ -214,4 +226,30 @@ private: unsigned long m_timeout; }; +// extracts files from office files +class CExtractor : public NSThreads::CBaseThread +{ +public: + CExtractor(Cx2tTester* internal); + virtual ~CExtractor(); + + void SetInputFile(const std::wstring& inputFile); + void SetOutputFilesDirectory(const std::wstring& outputFilesDirectory); + void SetExtractExts(const std::vector& extractExts); + void SetFilesCount(int totalFiles, int currFile); + + virtual DWORD ThreadProc(); + +private: + Cx2tTester* m_internal; + std::wstring m_inputFile; + std::wstring m_outputFilesDirectory; + std::vector m_extractExts; + COfficeUtils m_utils; + + int m_totalFiles; + int m_currFile; + +}; + #endif // X2T_TESTER_H diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index c6c830233a..bd83aeae93 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -1,4 +1,4 @@ -/* +/* * (c) Copyright Ascensio System SIA 2010-2023 * * This program is a free software product. You can redistribute it and/or @@ -503,7 +503,9 @@ namespace NExtractTools { nRes = docxflat2odt(sFrom, sTo, params, convertParams); } - else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatTo) + else if ( AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatTo || + AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == nFormatTo || + AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo) { nRes = docxflat2docx(sFrom, sTo, params, convertParams); } @@ -782,6 +784,10 @@ namespace NExtractTools convertParams.m_bIsTemplate = false; nRes = xlsx_dir2ods(sFrom, sTo, params, convertParams); } + else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB == nFormatTo) + { + nRes = xlsx_dir2xlsb(sFrom, sTo, params, convertParams); + } // else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV == nFormatTo) //{ // nRes = xlsx_dir2csv(sFrom, sTo, sTemp, params); @@ -812,6 +818,10 @@ namespace NExtractTools { nRes = xlst_bin2csv(sFrom, sTo, params, convertParams); } + else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB == nFormatTo) + { + nRes = xlst_bin2xlsb(sFrom, sTo, params, convertParams); + } else if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) { NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::XLST; @@ -1322,6 +1332,28 @@ namespace NExtractTools else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; } + else if ((0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) + { + std::wstring sToRender = convertParams.m_sTempParamOOXMLFile; + if (sToRender.empty()) + { + sToRender = combinePath(convertParams.m_sTempDir, L"toRender.vsdx"); + nRes = dir2zip(sFrom, sToRender); + } + NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::VSDT; + if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) + { + convertParams.m_sInternalMediaDirectory = sFrom; + nRes = doct_bin2pdf(eFromType, sToRender, sTo, params, convertParams); + } + else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) + { + convertParams.m_sInternalMediaDirectory = sFrom; + nRes = doct_bin2image(eFromType, sToRender, sTo, params, convertParams); + } + else + nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; + } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; return nRes; @@ -1335,11 +1367,10 @@ namespace NExtractTools nFormatTo = *params.m_nFormatTo; _UINT32 nRes = 0; - std::wstring sVsdxFile; std::wstring sVsdxDir = combinePath(convertParams.m_sTempDir, L"xsdx_unpacked"); NSDirectory::CreateDirectory(sVsdxDir); - if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatFrom) + if (0 != (AVS_OFFICESTUDIO_FILE_DRAW & nFormatFrom)) { convertParams.m_sTempParamOOXMLFile = sFrom; if (params.getFromChanges()) @@ -1347,12 +1378,18 @@ namespace NExtractTools params.setFromChanges(false); nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::VSDT, convertParams.m_sTempParamOOXMLFile, params, convertParams); } - nRes = zip2dir(sVsdxFile, sVsdxDir); + nRes = zip2dir(sFrom, sVsdxDir); } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; if (SUCCEEDED_X2T(nRes)) { + std::wstring sFileToCurrent = *params.m_sFileTo; + params.changeFormatFromPost(*params.m_nFormatFrom, params.m_bMacro); + + if (NULL != params.m_nFormatTo) + nFormatTo = *params.m_nFormatTo; + nRes = fromVsdxDir(sVsdxDir, sTo, nFormatTo, params, convertParams); } return nRes; @@ -1363,8 +1400,9 @@ namespace NExtractTools _UINT32 fromInputParams(InputParams& oInputParams) { TConversionDirection conversion = oInputParams.getConversionDirection(); - std::wstring sFileFrom = *oInputParams.m_sFileFrom; - std::wstring sFileTo = *oInputParams.m_sFileTo; + + std::wstring sFileFrom = oInputParams.m_sFileFrom ? *oInputParams.m_sFileFrom : L""; + std::wstring sFileTo = oInputParams.m_sFileTo ? *oInputParams.m_sFileTo : L""; int nFormatFrom = AVS_OFFICESTUDIO_FILE_UNKNOWN; if (NULL != oInputParams.m_nFormatFrom) @@ -1549,6 +1587,13 @@ namespace NExtractTools result = xlst2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; + case TCD_XLST2XLSB: + { + oInputParams.m_bMacro = true; + oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB); + result = xlst2xlsb(sFileFrom, sFileTo, oInputParams, oConvertParams); + } + break; case TCD_XLST2XLTX: { oInputParams.m_bMacro = false; @@ -2019,9 +2064,12 @@ namespace NExtractTools { result = fromDraw(sFileFrom, nFormatFrom, oInputParams, oConvertParams); }break; + case TCD_XLSX2XLSB: + { + result = xlsx2xlsb(sFileFrom, sFileTo, oInputParams, oConvertParams); + }break; // TCD_FB22DOCT, // TCD_FB22DOCT_BIN, - // TCD_EPUB2DOCX, // TCD_EPUB2DOCT, // TCD_EPUB2DOCT_BIN, diff --git a/X2tConverter/src/cextracttools.cpp b/X2tConverter/src/cextracttools.cpp index abc8ed5dc8..bf4144f912 100644 --- a/X2tConverter/src/cextracttools.cpp +++ b/X2tConverter/src/cextracttools.cpp @@ -329,6 +329,8 @@ namespace NExtractTools res = TCD_T2BIN; else if (0 == sExt2.compare(L".csv")) res = TCD_XLST2CSV; + else if (0 == sExt2.compare(L".xlsb")) + res = TCD_XLST2XLSB; } break; case AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY: diff --git a/X2tConverter/src/cextracttools.h b/X2tConverter/src/cextracttools.h index 0fab20294a..f88553afb0 100644 --- a/X2tConverter/src/cextracttools.h +++ b/X2tConverter/src/cextracttools.h @@ -95,6 +95,7 @@ namespace NExtractTools TCD_XLTM2XLSM, TCD_XLSB2XLST, TCD_XLSX2XLSB, + TCD_XLST2XLSB, TCD_PPTX2PPTT, TCD_PPTT2PPTX, @@ -915,6 +916,8 @@ namespace NExtractTools sSaveType = _T(" saveFileType='3'"); else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV == *m_nFormatTo) nFileType = 2; + else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB == *m_nFormatTo) + nFileType = 4; } sRes = L"