#include #include "../../../X2tConverter/src/run.h" #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/raster/BgraFrame.h" #include "../../../DesktopEditor/fontengine/ApplicationFontsWorker.h" #include "../../../OfficeUtils/src/OfficeUtils.h" #include enum CheckResultCode { crcEqual = 0, crcPageCount = 1, crcPageSize = 2, crcPageDiffs = 4 }; 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 { public: class CFileLog { public: std::wstring File; int Error; int Time; int CheckCode; CFileLog(const std::wstring& _file = L"", const int& _error = 0, const int& _time = 0, const int& _check_code = 0) { File = _file; Error = _error; Time = _time; CheckCode = _check_code; } }; public: std::map m_formats; std::vector m_files; int m_nCount; int m_nCurrent; int m_nCurrentComplete; std::wstring m_sInputFolder; std::wstring m_sOutputFolder; std::wstring m_sConvertParams; bool m_bIsStandard; bool m_bIsDiffAllInOne; bool m_bDiffOnly{false}; NSCriticalSection::CRITICAL_SECTION m_oCS; NSCriticalSection::CRITICAL_SECTION m_oCS_OfficeUtils; std::vector m_arFileLogs; std::vector m_arFileLogsError; size_t m_nProgressPrevLen; public: CInternalWorker() { m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DRAW_VSDX, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DRAW_VSSX, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DRAW_VSTX, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DRAW_VSDM, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DRAW_VSSM, true)); m_formats.insert(std::make_pair(AVS_OFFICESTUDIO_FILE_DRAW_VSTM, true)); m_nCount = 0; m_nCurrent = 0; m_nCurrentComplete = 0; m_bIsDiffAllInOne = true; m_oCS.InitializeCriticalSection(); m_oCS_OfficeUtils.InitializeCriticalSection(); m_nProgressPrevLen = 0; } ~CInternalWorker() { m_oCS.DeleteCriticalSection(); m_oCS_OfficeUtils.DeleteCriticalSection(); } CConverter* GetNextConverter(); void OnConvertFile(CConverter* pConverter, int nCode, int nTime, int nCheckCode); void Start(int nCores); void Cancel(); void OpenDir(std::wstring sDir) { m_sInputFolder = sDir; std::vector arFiles = NSDirectory::GetFiles(sDir, true); for (std::vector::iterator iter = arFiles.begin(); iter != arFiles.end(); iter++) { std::wstring sExt = NSFile::GetFileExtention(*iter); if (sExt == L"docx" || sExt == L"doc" || sExt == L"odt" || sExt == L"rtf" || sExt == L"docxf" || sExt == L"oform" || sExt == L"pptx" || sExt == L"ppt" || sExt == L"odp" || sExt == L"xlsx" || sExt == L"xls" || sExt == L"ods" || sExt == L"pdf" || sExt == L"xps" || sExt == L"djvu" || sExt == L"vsdx") { m_files.push_back(*iter); } } m_nCount = (int)m_files.size(); } bool IsWork() { CTemporaryCS oCS(&m_oCS); return (m_nCurrentComplete < m_nCount); } void OnReportFile(const std::wstring& sFile, int nReturnCode, int nTime, int nCheckReport) { if (nReturnCode == 0) m_arFileLogs.push_back(CFileLog(sFile, nReturnCode, nTime, nCheckReport)); else m_arFileLogsError.push_back(CFileLog(sFile, nReturnCode, nCheckReport)); if (m_nProgressPrevLen > 0) std::cout << "\r"; std::wstring sFileLog = GetFileNameForLog(sFile); std::string sFileLogUtf8 = U_TO_UTF8(sFileLog); size_t nDiff = sFileLogUtf8.length() - sFileLog.length(); std::string message = "[" + std::to_string(m_nCurrentComplete + 1) + "/" + std::to_string(m_nCount) + " (errors: " + std::to_string(m_arFileLogsError.size()) + ")] " + sFileLogUtf8; size_t nOldLen = m_nProgressPrevLen + nDiff; size_t nNewLen = message.length(); m_nProgressPrevLen = nNewLen; while (nNewLen < nOldLen) { message += " "; ++nNewLen; } std::cout << message; } std::wstring GetFileNameForLog(const std::wstring& sFile) { std::wstring::size_type pos = sFile.rfind(L"/documents/"); if (std::wstring::npos != pos) { return sFile.substr(pos + 11); } pos = sFile.rfind(L"/master/"); if (std::wstring::npos != pos) { std::wstring sCheckPath = sFile.substr(pos + 8); std::wstring sTempDir = NSFile::GetDirectoryName(sCheckPath); std::wstring sTempFile = NSFile::GetFileName(sCheckPath); if (sTempDir == sTempFile) return sTempFile; return sCheckPath; } return sFile; } void WriteReport(const std::wstring& sLogFile, int nTime) { if (NSFile::CFileBinary::Exists(sLogFile)) NSFile::CFileBinary::Remove(sLogFile); std::wstring sLogContent; sLogContent += L"GOOD:\n"; for (std::vector::iterator iter = m_arFileLogs.begin(); iter != m_arFileLogs.end(); iter++) { std::wstring sFileForLog = GetFileNameForLog(iter->File); size_t nFileNameSize = sFileForLog.length(); sLogContent += sFileForLog; while (nFileNameSize < 100) { sLogContent += L" "; ++nFileNameSize; } if (iter->CheckCode & ((int)crcPageCount)) { sLogContent += L"PAGES_COUNT"; } else if (iter->CheckCode & ((int)crcPageSize)) { sLogContent += L"PAGES_SIZE "; } else if (iter->CheckCode & ((int)crcPageDiffs)) { sLogContent += L"DIFFS "; } else { sLogContent += L" "; } sLogContent += L" "; sLogContent += std::to_wstring(iter->Time); sLogContent += L"\n"; } sLogContent += L"\n\n"; sLogContent += L"BAD:\n"; for (std::vector::iterator iter = m_arFileLogsError.begin(); iter != m_arFileLogsError.end(); iter++) { std::wstring sFileForLog = GetFileNameForLog(iter->File); size_t nFileNameSize = sFileForLog.length(); sLogContent += sFileForLog; while (nFileNameSize < 100) { sLogContent += L" "; ++nFileNameSize; } sLogContent += std::to_wstring(iter->Error); sLogContent += L"\n"; } sLogContent += L"\n\n"; sLogContent += L"TIME: "; sLogContent += std::to_wstring(nTime); sLogContent += L"\n"; 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 { public: CInternalWorker* m_pInternal; std::wstring m_input_dir; std::wstring m_output_dir; std::wstring m_file; std::wstring m_folder_dst; int m_format; bool m_bDiffOnly{false}; public: CConverter(CInternalWorker* pWorker) : NSThreads::CBaseThread() { m_pInternal = pWorker; m_format = -1; } virtual ~CConverter() { Stop(); } std::wstring GetOutputFile(const std::wstring& sFolderAddon = L"", const bool& isStandart = false) { std::wstring input_dir = m_input_dir; NSStringUtils::string_replace(input_dir, L"\\", L"/"); std::wstring input_file = m_file; NSStringUtils::string_replace(input_file, L"\\", L"/"); std::wstring output_dir = isStandart ? (m_input_dir + L"/../out/master") : (m_output_dir + L"/"); if (!sFolderAddon.empty()) output_dir += (sFolderAddon + L"/"); NSStringUtils::string_replace(output_dir, L"\\", L"/"); NSStringUtils::string_replace(output_dir, L"//", L"/"); std::wstring output_file = output_dir + input_file.substr(input_dir.length()); NSStringUtils::string_replace(output_file, L"//", L"/"); #ifdef _WIN32 NSStringUtils::string_replace(output_file, L"/", L"\\"); #endif return output_file; } virtual DWORD ThreadProc() { if (m_bDiffOnly) { std::wstring strDirIn = GetOutputFile(L"", true); std::wstring strDirOut = m_folder_dst; std::wstring strDiffs = GetOutputFile(L"DIFF"); 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) { CTemporaryCS oCS(&m_pInternal->m_oCS_OfficeUtils); COfficeFileFormatChecker oChecker; bIsOfficeFile = oChecker.isOfficeFile(m_file); if (bIsOfficeFile) m_format = oChecker.nFileType; } if (!bIsOfficeFile) { m_bRunThread = FALSE; m_pInternal->OnConvertFile(this, -1, 0, 0); return 0; } #if 0 std::map::iterator find = m_pInternal->m_formats.find(m_format); if ((find == m_pInternal->m_formats.end()) || (find->second == false)) { m_bRunThread = FALSE; m_pInternal->OnConvertFile(this, -1); return 0; } #endif DWORD dwTime1 = NSTimers::GetTickCount(); std::wstring sProcess = NSFile::GetProcessDirectory(); NSStringUtils::string_replace(sProcess, L"\\", L"/"); NSStringUtils::string_replace(m_file, L"\\", L"/"); std::wstring sDirectoryDst = m_folder_dst; NSStringUtils::string_replace(sDirectoryDst, L"\\", L"/"); #ifdef WIN32 NSStringUtils::string_replace(m_file, L"//", L"\\\\"); #endif NSDirectory::CreateDirectory(sDirectoryDst); NSStringUtils::CStringBuilder oBuilder; oBuilder.WriteString(L""); oBuilder.WriteEncodeXmlString(m_file); oBuilder.WriteString(L""); oBuilder.WriteEncodeXmlString(sDirectoryDst); oBuilder.WriteString(L""); oBuilder.WriteString(std::to_wstring(AVS_OFFICESTUDIO_FILE_IMAGE)); oBuilder.WriteString(L"./true"); oBuilder.WriteString(sProcess + L"/fonts"); oBuilder.WriteString(L"/AllFonts.js464"); oBuilder.WriteString(L""); oBuilder.WriteEncodeXmlString(sProcess + L"/fonts"); oBuilder.WriteString(L""); oBuilder.WriteString(L"42falsefalse10001000"); oBuilder.WriteString(L"{"spreadsheetLayout":{"gridLines":true,"headings":true,"fitToHeight":1,"fitToWidth":1,"orientation":"landscape"}}"); if (!m_pInternal->m_sConvertParams.empty()) oBuilder.WriteString(m_pInternal->m_sConvertParams); oBuilder.WriteString(L""); std::wstring sXmlConvert = oBuilder.GetData(); std::wstring sTempFileForParams = sDirectoryDst + L"/params.xml"; NSFile::CFileBinary::SaveToFile(sTempFileForParams, sXmlConvert, true); if (NSDirectory::Exists(sProcess + L"/converter")) sProcess += L"/converter"; int nReturnCode = NSX2T::Convert(sProcess, sTempFileForParams); if (0 != nReturnCode) { m_bRunThread = FALSE; m_pInternal->OnConvertFile(this, nReturnCode, 0, 0); return 0; } if (g_save_x2t_xml != true) NSFile::CFileBinary::Remove(sTempFileForParams); DWORD dwTime2 = NSTimers::GetTickCount(); int checkCode = crcEqual; if (!m_pInternal->m_bIsStandard) { // смотрим разницу std::wstring strDirIn = GetOutputFile(L"", true); std::wstring strDirOut = sDirectoryDst; std::wstring strDiffs = GetOutputFile(L"DIFF"); checkCode = m_pInternal->GenerateDiff(strDirIn, strDirOut, strDiffs); } m_bRunThread = FALSE; m_pInternal->OnConvertFile(this, nReturnCode, (int)(dwTime2 - dwTime1), checkCode); return 0; } }; CConverter* CInternalWorker::GetNextConverter() { if (m_nCurrent >= m_nCount) return NULL; CConverter* pConverter = new CConverter(this); pConverter->DestroyOnFinish(); pConverter->m_input_dir = m_sInputFolder; pConverter->m_output_dir = m_sOutputFolder; pConverter->m_file = m_files[m_nCurrent]; pConverter->m_bDiffOnly = m_bDiffOnly; ++m_nCurrent; std::wstring sName = NSFile::GetFileName(pConverter->m_file); pConverter->m_folder_dst = pConverter->GetOutputFile(); NSDirectory::CreateDirectories(pConverter->m_folder_dst); if (m_bIsStandard) NSFile::CFileBinary::Copy(pConverter->m_file, pConverter->m_folder_dst + L"/" + sName); pConverter->Start(0); return pConverter; } void CInternalWorker::OnConvertFile(CConverter* pConverter, int nCode, int nTime, int nCheckCode) { CTemporaryCS oCS(&m_oCS); OnReportFile(pConverter->m_file, nCode, nTime, nCheckCode); ++m_nCurrentComplete; GetNextConverter(); } void CInternalWorker::Start(int nCores) { CTemporaryCS oCS(&m_oCS); int nSizeInit = nCores; if (nSizeInit > m_nCount) nSizeInit = m_nCount; for (int i = 0; i < nSizeInit; ++i) GetNextConverter(); } void CInternalWorker::Cancel() { CTemporaryCS oCS(&m_oCS); m_nCount = m_nCurrent; } void CheckFonts(const bool& bIsUseSystemFonts, std::vector& arDirs) { CApplicationFontsWorker oWorker; oWorker.m_sDirectory = NSFile::GetProcessDirectory() + L"/fonts"; if (!NSDirectory::Exists(oWorker.m_sDirectory)) NSDirectory::CreateDirectory(oWorker.m_sDirectory); oWorker.m_bIsUseSystemFonts = bIsUseSystemFonts; for (std::vector::iterator i = arDirs.begin(); i != arDirs.end(); i++) oWorker.m_arAdditionalFolders.push_back(*i); oWorker.m_bIsNeedThumbnails = false; NSFonts::IApplicationFonts* pFonts = oWorker.Check(); if (pFonts) pFonts->Release(); } std::wstring CorrectDir(const std::wstring& sDir) { if (sDir.empty()) return L""; const wchar_t* data = sDir.c_str(); std::wstring::size_type pos1 = (data[0] == '\"') ? 1 : 0; std::wstring::size_type pos2 = sDir.length(); if (data[pos2 - 1] == '\"') --pos2; if (pos2 > 0 && ((data[pos2 - 1] == '\\') || (data[pos2 - 1] == '/'))) --pos2; return sDir.substr(pos1, pos2 - pos1); } /* * * --input="input-standard-files-dir" * --output="output-dir" * --standard // generate standarts * --use-system-fonts="0/1/false/true" * --font-dirs="C:\\Windows\\Fonts;/usr/share/fonts;" * --cores=4 * */ #ifdef WIN32 int wmain(int argc, wchar_t** argv) #else int main(int argc, char** argv) #endif { std::vector arFontsDirs; bool bIsStandard = false; bool bDiffOnly = false; std::wstring strInputFolder = L""; std::wstring strOutputFolder = L""; bool bIsUseSystemFonts = true; int nCores = 1; std::wstring strAdditionalParams; for (int i = 0; i < argc; ++i) { #ifdef WIN32 std::wstring sParam(argv[i]); #else std::string sParamA(argv[i]); std::wstring sParam = UTF8_TO_U(sParamA); #endif if (sParam.find(L"--") == 0) { std::wstring sKey = L""; std::wstring sValue = L""; std::wstring::size_type _pos = sParam.find('='); if (std::wstring::npos == _pos) { sKey = sParam; } else { sKey = sParam.substr(0, _pos); sValue = sParam.substr(_pos + 1); } if (sKey == L"--input") { strInputFolder = CorrectDir(sValue); } else if (sKey == L"--output") { strOutputFolder = CorrectDir(sValue); } else if (sKey == L"--standard") { bIsStandard = true; } else if (sKey == L"--diff-only") { bDiffOnly = true; } else if (sKey == L"--use-system-fonts") { if (sValue == L"0" || sValue == L"false") bIsUseSystemFonts = false; } else if (sKey == L"--font-dirs") { const wchar_t* src = sValue.c_str(); const wchar_t* limit = src + sValue.length(); const wchar_t* srcPrev = src; while (src < limit) { if (*src == ';') { if (srcPrev != src) { arFontsDirs.push_back(std::wstring(srcPrev, src - srcPrev)); } src++; srcPrev = src; } else src++; } if (src > srcPrev) { arFontsDirs.push_back(std::wstring(srcPrev, src - srcPrev)); } } else if (sKey == L"--cores") { nCores = std::stoi(sValue); if (nCores < 1) nCores = 1; } else if (sKey == L"--additional-params") { strAdditionalParams = sValue; } else if (sKey == L"--x2t-debug") { g_save_x2t_xml = true; } } } DWORD dwTime1 = NSTimers::GetTickCount(); CheckFonts(bIsUseSystemFonts, arFontsDirs); #if 0 if (true) { strInputFolder = L"D:\\standard"; strOutputFolder = L"D:\\standard\\out"; bIsStandard = true; } else { strInputFolder = L"D:\\standard\\out"; strOutputFolder = L"D:\\standard\\check"; bIsStandard = false; } #endif #ifdef _WIN32 UINT currConsoleCP = GetConsoleOutputCP(); SetConsoleOutputCP(CP_UTF8); #endif CInternalWorker oWorker; oWorker.m_bDiffOnly = bDiffOnly; oWorker.OpenDir(strInputFolder); oWorker.m_sOutputFolder = strOutputFolder; oWorker.m_bIsStandard = bIsStandard; oWorker.m_sConvertParams = strAdditionalParams; if (!NSDirectory::Exists(strOutputFolder)) NSDirectory::CreateDirectories(strOutputFolder); oWorker.Start(nCores); while (oWorker.IsWork()) NSThreads::Sleep(500); DWORD dwTime2 = NSTimers::GetTickCount(); DWORD dwTimeDelta = (dwTime2 - dwTime1) / 1000; std::cout << std::endl << "time: " << dwTimeDelta << std::endl; oWorker.WriteReport(NSFile::GetProcessDirectory() + L"/../report.txt", (int)(dwTime2 - dwTime1)); #ifdef _WIN32 SetConsoleOutputCP(currConsoleCP); #endif return 0; }