Files
core/Test/Applications/x2tTester/x2tTester.h
Alexander Trofimov 76ee07f61c [copyright] Update copyright header
Co-authored-by: Alexander Trofimov <alexander.trofimov@onlyoffice.com>
Co-committed-by: Alexander Trofimov <alexander.trofimov@onlyoffice.com>
2026-05-14 08:23:56 +00:00

296 lines
8.5 KiB
C++

/*
* Copyright (C) Ascensio System SIA, 2009-2026
*
* 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, together with the
* additional terms provided in the LICENSE file.
*
* 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: https://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA by email at info@onlyoffice.com
* or by postal mail at 20A-6 Ernesta Birznieka-Upisha Street, Riga,
* LV-1050, Latvia, European Union.
*
* The interactive user interfaces in modified versions of the Program
* are required to display Appropriate Legal Notices in accordance with
* Section 5 of the GNU AGPL version 3.
*
* No trademark rights are granted under this License.
*
* All non-code elements of the Product, including illustrations,
* icon sets, and technical writing content, are licensed under the
* Creative Commons Attribution-ShareAlike 4.0 International License:
* https://creativecommons.org/licenses/by-sa/4.0/legalcode
*
* This license applies only to such non-code elements and does not
* modify or replace the licensing terms applicable to the Program's
* source code, which remains licensed under the GNU Affero General
* Public License v3.
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
#ifndef X2T_TESTER_H
#define X2T_TESTER_H
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <ctime>
#include "../../../Common/OfficeFileFormats.h"
#include "../../../Common/OfficeFileFormatChecker.h"
#include "../../../DesktopEditor/graphics/Timer.h"
#include "../../../DesktopEditor/graphics/TemporaryCS.h"
#include "../../../DesktopEditor/common/File.h"
#include "../../../DesktopEditor/common/Directory.h"
#include "../../../DesktopEditor/xml/include/xmlutils.h"
#include "../../../DesktopEditor/common/StringBuilder.h"
#include "../../../DesktopEditor/fontengine/ApplicationFontsWorker.h"
#include "../../../OfficeUtils/src/OfficeUtils.h"
#include "../../../UnicodeConverter/UnicodeConverter_Encodings.h"
class CFormatsList
{
public:
CFormatsList();
CFormatsList(const CFormatsList& list);
CFormatsList& operator=(const CFormatsList& list);
std::vector<std::wstring> GetDocuments() const;
std::vector<std::wstring> GetPresentations() const;
std::vector<std::wstring> GetSpreadsheets() const;
std::vector<std::wstring> GetCrossplatform() const;
std::vector<std::wstring> GetDraw() const;
std::vector<std::wstring> GetImages() const;
std::wstring GetPdf() const;
bool IsDocument(const std::wstring& ext) const;
bool IsPresentation(const std::wstring& ext) const;
bool IsSpreadsheet(const std::wstring& ext) const;
bool IsCrossplatform(const std::wstring& ext) const;
bool IsDraw(const std::wstring& ext) const;
bool IsImage(const std::wstring& ext) const;
bool IsPdf(const std::wstring& ext) const;
bool IsAny(const std::wstring& ext) const;
void AddDocument(const std::wstring& ext);
void AddPresentation(const std::wstring& ext);
void AddSpreadsheet(const std::wstring& ext);
void AddCrossplatform(const std::wstring& ext);
void AddDraw(const std::wstring& ext);
void AddImage(const std::wstring& ext);
std::vector<std::wstring> GetAllExts() const;
// all supported exts
static CFormatsList GetDefaultExts();
// all writable exts
static CFormatsList GetOutputExts();
// default exts to extract
static CFormatsList GetExtractExts();
private:
std::vector<std::wstring> m_documents;
std::vector<std::wstring> m_presentations;
std::vector<std::wstring> m_spreadsheets;
std::vector<std::wstring> m_crossplatform;
std::vector<std::wstring> m_images;
std::vector<std::wstring> m_draw;
std::wstring m_pdf;
};
// setups folders, parse xml config, takes formats, create CConverters
class Cx2tTester
{
public:
struct Report
{
std::wstring inputFile;
std::wstring outputFile;
std::wstring direction;
unsigned long time;
int inputSize;
int outputSize;
std::wstring exitCode;
std::wstring log;
};
Cx2tTester(const std::wstring& configPath);
~Cx2tTester();
void SetConfig(const std::wstring& configPath);
void Start();
void WriteReportHeader();
void WriteReport(const Report& report);
void WriteReports(const std::vector<Report>& reports);
void WriteTime();
void AddDeleteLaterFile(const std::wstring& file);
void AddDeleteLaterDirectory(const std::wstring& directory);
bool IsAllBusy();
bool IsAllFree();
NSCriticalSection::CRITICAL_SECTION m_coresCS;
NSCriticalSection::CRITICAL_SECTION m_reportCS;
NSCriticalSection::CRITICAL_SECTION m_outputCS;
int m_currentProc;
int m_maxProc;
private:
// parse string like "docx txt" into vector
std::vector<std::wstring> ParseExtensionsString(std::wstring extensions, const CFormatsList& fl);
void Convert(const std::vector<std::wstring>& files, bool bNoDirectory = false, bool bTrough = false);
void Extract(const std::vector<std::wstring>& files);
// takes from config
std::wstring m_reportFile;
std::wstring m_inputDirectory;
std::wstring m_outputDirectory;
std::wstring m_x2tPath;
std::wstring m_errorsXmlDirectory;
std::wstring m_troughConversionDirectory;
std::wstring m_fontsDirectory;
std::wstring m_tempDirectory;
// fonts
bool m_bIsUseSystemFonts;
std::vector<std::wstring> m_arAdditionalFontsDirs;
NSFile::CFileBinary m_reportStream;
// takes from config or sets all
std::vector<std::wstring> m_inputExts;
std::vector<std::wstring> m_outputExts;
std::vector<std::wstring> m_inputFiles;
// lists
CFormatsList m_inputFormatsList;
CFormatsList m_outputFormatsList;
CFormatsList m_extractFormatsList;
bool m_bIsErrorsOnly;
bool m_bIsTimestamp;
bool m_bIsDeleteOk;
bool m_bIsFilenameCsvTxtParams;
bool m_bIsFilenamePassword;
std::wstring m_defaultCsvTxtEndcoding;
std::wstring m_defaultCsvDelimiter;
std::wstring m_defaultTsvDelimiter;
unsigned long m_timeout;
unsigned long m_timeStart;
// format -> *t format -> all formats
bool m_bTroughConversion;
bool m_bSaveEnvironment;
std::vector<std::wstring> m_deleteLaterFiles;
std::vector<std::wstring> 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
class CConverter : public NSThreads::CBaseThread
{
public:
CConverter(Cx2tTester* internal);
virtual ~CConverter();
void SetInputFile(const std::wstring& inputFile);
void SetInputExt(const std::wstring& inputExt);
void SetOutputFilesDirectory(const std::wstring& outputFilesDirectory);
void SetOutputExts(const std::vector<std::wstring>& outputExts);
void SetFontsDirectory(const std::wstring& fontsDirectory);
void SetX2tPath(const std::wstring& x2tPath);
void SetErrorsOnly(bool bIsErrorsOnly);
void SetDeleteOk(bool bIsDeleteOk);
void SetTrough(bool bIsTrough);
void SetXmlErrorsDirectory(const std::wstring& errorsXmlDirectory);
void SetCsvTxtEncoding(int csvTxtEncoding);
void SetCsvDelimiter(const std::wstring& csvDelimiter);
void SetPassword(const std::wstring& password);
void SetTimeout(unsigned long timeout);
void SetFilesCount(int totalFiles, int currFile);
void SetSaveEnvironment(bool bSaveEnvironment);
virtual DWORD ThreadProc();
private:
Cx2tTester* m_internal;
std::wstring m_inputFile;
std::wstring m_outputFilesDirectory;
std::vector<std::wstring> m_outputExts;
std::wstring m_inputExt;
std::wstring m_fontsDirectory;
COfficeFileFormatChecker m_checker;
std::wstring m_x2tPath;
std::wstring m_errorsXmlDirectory;
int m_csvTxtEncoding;
std::wstring m_csvDelimiter;
std::wstring m_password;
bool m_bIsErrorsOnly;
bool m_bIsDeleteOk;
bool m_bIsTrough;
bool m_bSaveEnvironment;
int m_totalFiles;
int m_currFile;
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<std::wstring>& extractExts);
void SetFilesCount(int totalFiles, int currFile);
virtual DWORD ThreadProc();
private:
Cx2tTester* m_internal;
std::wstring m_inputFile;
std::wstring m_outputFilesDirectory;
std::vector<std::wstring> m_extractExts;
COfficeUtils m_utils;
int m_totalFiles;
int m_currFile;
};
#endif // X2T_TESTER_H