/** * @brief Enable/disable components based on validity of paths. */ void COpenView::UpdateButtonStates() { UpdateData(TRUE); // load member variables from screen KillTimer(IDT_CHECKFILES); TrimPaths(); if (!m_pUpdateButtonStatusThread) { m_pUpdateButtonStatusThread = AfxBeginThread( UpdateButtonStatesThread, NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); m_pUpdateButtonStatusThread->m_bAutoDelete = FALSE; m_pUpdateButtonStatusThread->ResumeThread(); while (PostThreadMessage(m_pUpdateButtonStatusThread->m_nThreadID, WM_NULL, 0, 0) == FALSE) Sleep(1); } UpdateButtonStatesThreadParams *pParams = new UpdateButtonStatesThreadParams; pParams->m_hWnd = this->m_hWnd; if (m_strPath[2].empty()) pParams->m_paths = PathContext(m_strPath[0], m_strPath[1]); else pParams->m_paths = PathContext(m_strPath[0], m_strPath[1], m_strPath[2]); PostThreadMessage(m_pUpdateButtonStatusThread->m_nThreadID, WM_USER + 2, (WPARAM)pParams, 0); }
int main() { #ifdef _MSC_VER _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif CompareStats cmpstats(2); FileFilterHelper filter; filter.UseMask(true); // filter.SetMask(_T("*.cpp;*.c;*.h;*.vcproj;*.vcxproj")); filter.SetMask(_T("*.*")); CDiffContext ctx( PathContext(_T("c:/windows"), _T("c:/windows")), CMP_CONTENT); DIFFOPTIONS options = {0}; options.nIgnoreWhitespace = false; options.bIgnoreBlankLines = false; options.bFilterCommentsLines = false; options.bIgnoreCase = false; options.bIgnoreEol = false; //ctx.CreateCompareOptions(CMP_CONTENT, options); ctx.CreateCompareOptions(CMP_DATE, options); ctx.m_iGuessEncodingType = 0;//(50001 << 16) + 2; ctx.m_bIgnoreSmallTimeDiff = true; ctx.m_bStopAfterFirstDiff = false; ctx.m_nQuickCompareLimit = 4 * 1024 * 1024; ctx.m_bPluginsEnabled = false; ctx.m_bWalkUniques = true; ctx.m_pCompareStats = &cmpstats; ctx.m_bRecursive = true; ctx.m_piFilterGlobal = &filter; // Folder names to compare are in the compare context CDiffThread diffThread; diffThread.SetContext(&ctx); diffThread.SetCompareSelected(false); diffThread.CompareDirectories(); while (diffThread.GetThreadState() != CDiffThread::THREAD_COMPLETED) { Poco::Thread::sleep(200); std::cout << cmpstats.GetComparedItems() << std::endl; } Poco::UIntPtr pos = ctx.GetFirstDiffPosition(); while (pos) { DIFFITEM& di = ctx.GetNextDiffRefPosition(pos); if (ctx.m_piFilterGlobal->includeFile(di.diffFileInfo[0].filename, di.diffFileInfo[1].filename)) { FolderCmp folderCmp; folderCmp.prepAndCompareFiles(&ctx, di); #ifdef _UNICODE // std::wcout << di.diffFileInfo[0].filename << ":" << di.diffcode.isResultDiff() << std::endl; #else // std::cout << di.diffFileInfo[0].filename << ":" << di.diffcode.isResultDiff() << std::endl; #endif } } return 0; }
/** * @brief Create a patch from files given. * @note Files can be given using AddFiles() or selecting using * CPatchDlg. */ int CPatchTool::CreatePatch() { DIFFSTATUS status; int retVal = 0; CPatchDlg dlgPatch; // If files already inserted, add them to dialog for(std::vector<PATCHFILES>::iterator iter = m_fileList.begin(); iter != m_fileList.end(); ++iter) { dlgPatch.AddItem(*iter); } if (ShowDialog(&dlgPatch)) { bool bResult = true; if (!paths::CreateIfNeeded(paths::GetPathOnly(dlgPatch.m_fileResult))) { LangMessageBox(IDS_FOLDER_NOTEXIST, MB_OK | MB_ICONSTOP); return 0; } // Select patch create -mode m_diffWrapper.SetCreatePatchFile(dlgPatch.m_fileResult); m_diffWrapper.SetAppendFiles(dlgPatch.m_appendFile); m_diffWrapper.SetPrediffer(nullptr); size_t fileCount = dlgPatch.GetItemCount(); m_diffWrapper.WritePatchFileHeader(dlgPatch.m_outputStyle, dlgPatch.m_appendFile); m_diffWrapper.SetAppendFiles(true); for (size_t index = 0; index < fileCount; index++) { const PATCHFILES& tFiles = dlgPatch.GetItemAt(index); String filename1 = tFiles.lfile.length() == 0 ? _T("NUL") : tFiles.lfile; String filename2 = tFiles.rfile.length() == 0 ? _T("NUL") : tFiles.rfile; // Set up DiffWrapper m_diffWrapper.SetPaths(PathContext(filename1, filename2), false); m_diffWrapper.SetAlternativePaths(PathContext(tFiles.pathLeft, tFiles.pathRight)); m_diffWrapper.SetCompareFiles(PathContext(tFiles.lfile, tFiles.rfile)); bool bDiffSuccess = m_diffWrapper.RunFileDiff(); m_diffWrapper.GetDiffStatus(&status); if (!bDiffSuccess) { LangMessageBox(IDS_FILEERROR, MB_ICONSTOP); bResult = false; break; } else if (status.bBinaries) { LangMessageBox(IDS_CANNOT_CREATE_BINARYPATCH, MB_ICONSTOP); bResult = false; break; } else if (status.bPatchFileFailed) { String errMsg = strutils::format_string1(_("Could not write to file %1."), dlgPatch.m_fileResult); AfxMessageBox(errMsg.c_str(), MB_ICONSTOP); bResult = false; break; } } m_diffWrapper.WritePatchFileTerminator(dlgPatch.m_outputStyle); if (bResult && fileCount > 0) { LangMessageBox(IDS_DIFF_SUCCEEDED, MB_ICONINFORMATION|MB_DONT_DISPLAY_AGAIN, IDS_DIFF_SUCCEEDED); m_sPatchFile = dlgPatch.m_fileResult; m_bOpenToEditor = dlgPatch.m_openToEditor; retVal = 1; } } dlgPatch.ClearItems(); if (retVal) { if (m_bOpenToEditor) theApp.OpenFileToExternalEditor(m_sPatchFile); } return retVal; }
/** * @brief Called when dialog is closed with "OK". * * Checks that paths are valid and sets filters. */ void COpenView::OnOK() { int pathsType; // enum from PATH_EXISTENCE in paths.h const String filterPrefix = _("[F] "); UpdateData(TRUE); TrimPaths(); int index; int nFiles = 0; for (index = 0; index < countof(m_strPath); index++) { if (index == 2 && m_strPath[index].empty()) break; m_files.SetSize(nFiles + 1); m_files[nFiles] = m_strPath[index]; m_dwFlags[nFiles] &= ~FFILEOPEN_READONLY; m_dwFlags[nFiles] |= m_bReadOnly[index] ? FFILEOPEN_READONLY : 0; nFiles++; } // If left path is a project-file, load it String ext; paths_SplitFilename(m_strPath[0], NULL, NULL, &ext); if (m_strPath[1].empty() && string_compare_nocase(ext, ProjectFile::PROJECTFILE_EXT) == 0) LoadProjectFile(m_strPath[0]); pathsType = GetPairComparability(m_files, IsArchiveFile); if (pathsType == DOES_NOT_EXIST) { LangMessageBox(IDS_ERROR_INCOMPARABLE, MB_ICONSTOP); return; } for (index = 0; index < nFiles; index++) { // If user has edited path by hand, expand environment variables bool bExpand = false; if (string_compare_nocase(m_strBrowsePath[index], m_files[index]) != 0) bExpand = true; if (!paths_IsURLorCLSID(m_files[index])) { m_files[index] = paths_GetLongPath(m_files[index], bExpand); // Add trailing '\' for directories if its missing if (paths_DoesPathExist(m_files[index]) == IS_EXISTING_DIR) m_files[index] = paths_AddTrailingSlash(m_files[index]); m_strPath[index] = m_files[index]; } } UpdateData(FALSE); KillTimer(IDT_CHECKFILES); String filter(string_trim_ws(m_strExt)); // If prefix found from start.. if (filter.find(filterPrefix, 0) == 0) { // Remove prefix + space filter.erase(0, filterPrefix.length()); if (!theApp.m_pGlobalFileFilter->SetFilter(filter)) { // If filtername is not found use default *.* mask theApp.m_pGlobalFileFilter->SetFilter(_T("*.*")); filter = _T("*.*"); } GetOptionsMgr()->SaveOption(OPT_FILEFILTER_CURRENT, filter); } else { BOOL bFilterSet = theApp.m_pGlobalFileFilter->SetFilter(filter); if (!bFilterSet) m_strExt = theApp.m_pGlobalFileFilter->GetFilterNameOrMask(); GetOptionsMgr()->SaveOption(OPT_FILEFILTER_CURRENT, filter); } SaveComboboxStates(); GetOptionsMgr()->SaveOption(OPT_CMP_INCLUDE_SUBDIRS, m_bRecurse); LoadComboboxStates(); m_constraint.Persist(true, false); COpenDoc *pDoc = GetDocument(); pDoc->m_files = m_files; pDoc->m_bRecurse = m_bRecurse; pDoc->m_strExt = m_strExt; pDoc->m_strUnpacker = m_strUnpacker; pDoc->m_infoHandler = m_infoHandler; pDoc->m_dwFlags[0] = m_dwFlags[0]; pDoc->m_dwFlags[1] = m_dwFlags[1]; pDoc->m_dwFlags[2] = m_dwFlags[2]; if (GetOptionsMgr()->GetBool(OPT_CLOSE_WITH_OK)) GetParentFrame()->PostMessage(WM_CLOSE); GetMainFrame()->DoFileOpen( &PathContext(pDoc->m_files), &std::vector<DWORD>(pDoc->m_dwFlags, pDoc->m_dwFlags + 3)[0], NULL, _T(""), !!pDoc->m_bRecurse, NULL, _T(""), &PackingInfo(pDoc->m_infoHandler)); }