From c7d906e4c032d514df2f3edbf867ce56f133ef86 Mon Sep 17 00:00:00 2001 From: Aleksey Dobrunov Date: Wed, 27 Jan 2021 23:00:10 +0500 Subject: [PATCH 1/6] reformate code --- .clang-format | 155 ++ src/AdvCmp.cpp | 1046 +++++----- src/AdvCmp.hpp | 441 ++--- src/AdvCmpDlgOpt.cpp | 2198 ++++++++++----------- src/AdvCmpDlgOpt.hpp | 16 +- src/AdvCmpLng.hpp | 377 ++-- src/AdvCmpProc.cpp | 3929 +++++++++++++++++++------------------- src/AdvCmpProc.hpp | 374 ++-- src/AdvCmpProc_CLIST.cpp | 2326 +++++++++++----------- src/AdvCmpProc_DUP.cpp | 3631 +++++++++++++++++------------------ src/AdvCmpProc_SYNC.cpp | 1842 +++++++++--------- 11 files changed, 8308 insertions(+), 8027 deletions(-) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..4f2b00b --- /dev/null +++ b/.clang-format @@ -0,0 +1,155 @@ +--- +Language: Cpp +AccessModifierOffset: -1 +AlignAfterOpenBracket: Align +AlignConsecutiveMacros: false +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Left +AlignOperands: DontAlign +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllConstructorInitializersOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Empty +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: true +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: Yes +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterCaseLabel: false + AfterClass: true + AfterControlStatement: Always + AfterEnum: false + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: true + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: true + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: false + SplitEmptyNamespace: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Custom +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 150 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IncludeBlocks: Merge +IncludeCategories: + - Regex: '^' + Priority: 2 + - Regex: '^<.*\.h>' + Priority: 1 + - Regex: '^<.*' + Priority: 2 + - Regex: '.*' + Priority: 3 +IncludeIsMainRegex: '([-_](test|unittest))?$' +IndentCaseLabels: true +IndentPPDirectives: None +IndentWidth: 2 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: false +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Never +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 1 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 200 +PointerAlignment: Left +RawStringFormats: + - Language: Cpp + Delimiters: + - cc + - CC + - cpp + - Cpp + - CPP + - 'c++' + - 'C++' + CanonicalDelimiter: '' + BasedOnStyle: google + - Language: TextProto + Delimiters: + - pb + - PB + - proto + - PROTO + EnclosingFunctions: + - EqualsProto + - EquivToProto + - PARSE_PARTIAL_TEXT_PROTO + - PARSE_TEST_PROTO + - PARSE_TEXT_PROTO + - ParseTextOrDie + - ParseTextProtoOrDie + CanonicalDelimiter: '' + BasedOnStyle: google +ReflowComments: true +SortIncludes: true +SortUsingDeclarations: true +SpaceAfterCStyleCast: true +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCpp11BracedList: true +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 2 +SpacesInAngles: false +SpacesInContainerLiterals: false +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: c++17 +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 4 +UseTab: Never +... diff --git a/src/AdvCmp.cpp b/src/AdvCmp.cpp index ae2ccda..ab47ab8 100644 --- a/src/AdvCmp.cpp +++ b/src/AdvCmp.cpp @@ -43,26 +43,25 @@ struct FarStandardFunctions FSF; /**************************************************************************** * Набор переменных ****************************************************************************/ -struct Options Opt; //Текущие настройки плагина -struct CacheCmp Cache; //Кеш сравнения "по содержимому" -struct FarPanelInfo LPanel,RPanel; +struct Options Opt; //Текущие настройки плагина +struct CacheCmp Cache; //Кеш сравнения "по содержимому" +struct FarPanelInfo LPanel, RPanel; struct TotalCmpInfo CmpInfo; struct FarWindowsInfo WinInfo; bool bBrokenByEsc; bool bStartMsg; -bool bGflLoaded=false; -bool bBASSLoaded=false; // bass.dll загружена? -HMODULE GflHandle=NULL; -HMODULE BASSHandle=NULL; -HANDLE hConInp=INVALID_HANDLE_VALUE; - +bool bGflLoaded = false; +bool bBASSLoaded = false; // bass.dll загружена? +HMODULE GflHandle = NULL; +HMODULE BASSHandle = NULL; +HANDLE hConInp = INVALID_HANDLE_VALUE; /**************************************************************************** * Обёртка сервисной функции FAR: получение строки из .lng-файла ****************************************************************************/ -const wchar_t *GetMsg(int MsgId) +const wchar_t* GetMsg(int MsgId) { - return Info.GetMsg(&MainGuid,MsgId); + return Info.GetMsg(&MainGuid, MsgId); } /**************************************************************************** @@ -70,8 +69,8 @@ const wchar_t *GetMsg(int MsgId) ****************************************************************************/ void ErrorMsg(DWORD Title, DWORD Body) { - const wchar_t *MsgItems[]={ GetMsg(Title), GetMsg(Body), GetMsg(MOK) }; - Info.Message(&MainGuid,&ErrorMsgGuid,FMSG_WARNING,0,MsgItems,3,1); + const wchar_t* MsgItems[] = {GetMsg(Title), GetMsg(Body), GetMsg(MOK)}; + Info.Message(&MainGuid, &ErrorMsgGuid, FMSG_WARNING, 0, MsgItems, 3, 1); } /**************************************************************************** @@ -79,121 +78,128 @@ void ErrorMsg(DWORD Title, DWORD Body) ****************************************************************************/ bool YesNoMsg(DWORD Title, DWORD Body) { - const wchar_t *MsgItems[]={ GetMsg(Title), GetMsg(Body) }; - return (!Info.Message(&MainGuid,&YesNoMsgGuid,FMSG_WARNING|FMSG_MB_YESNO,0,MsgItems,2,0)); + const wchar_t* MsgItems[] = {GetMsg(Title), GetMsg(Body)}; + return (!Info.Message(&MainGuid, &YesNoMsgGuid, FMSG_WARNING | FMSG_MB_YESNO, 0, MsgItems, 2, 0)); } // Сообщение для отладки -int DebugMsg(wchar_t *msg, wchar_t *msg2, unsigned int i) +int DebugMsg(wchar_t* msg, wchar_t* msg2, unsigned int i) { - wchar_t *MsgItems[] = {L"DebugMsg", L"", L"", L""}; - wchar_t buf[80]; FSF.itoa(i, buf,10); + wchar_t* MsgItems[] = {L"DebugMsg", L"", L"", L""}; + wchar_t buf[80]; + FSF.itoa(i, buf, 10); MsgItems[1] = msg2; MsgItems[2] = msg; MsgItems[3] = buf; - return (!Info.Message(&MainGuid,&DebugMsgGuid,FMSG_WARNING|FMSG_MB_OKCANCEL,0,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),2)); + return (!Info.Message(&MainGuid, &DebugMsgGuid, FMSG_WARNING | FMSG_MB_OKCANCEL, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 2)); } -__int64 GetFarSetting(FARSETTINGS_SUBFOLDERS Root,const wchar_t* Name) +__int64 GetFarSetting(FARSETTINGS_SUBFOLDERS Root, const wchar_t* Name) { - __int64 result=0; - FarSettingsCreate settings={sizeof(FarSettingsCreate),FarGuid,INVALID_HANDLE_VALUE}; - HANDLE Settings=Info.SettingsControl(INVALID_HANDLE_VALUE,SCTL_CREATE,0,&settings)?settings.Handle:0; - if (Settings) - { - FarSettingsItem item={sizeof(FarSettingsItem),Root,Name,FST_UNKNOWN,{0}}; - if(Info.SettingsControl(Settings,SCTL_GET,0,&item)&&FST_QWORD==item.Type) - { - result=item.Number; - } - Info.SettingsControl(Settings,SCTL_FREE,0,0); - } - return result; + __int64 result = 0; + FarSettingsCreate settings = {sizeof(FarSettingsCreate), FarGuid, INVALID_HANDLE_VALUE}; + HANDLE Settings = Info.SettingsControl(INVALID_HANDLE_VALUE, SCTL_CREATE, 0, &settings) ? settings.Handle : 0; + if (Settings) + { + FarSettingsItem item = {sizeof(FarSettingsItem), Root, Name, FST_UNKNOWN, {0}}; + if (Info.SettingsControl(Settings, SCTL_GET, 0, &item) && FST_QWORD == item.Type) + { + result = item.Number; + } + Info.SettingsControl(Settings, SCTL_FREE, 0, 0); + } + return result; } -void GetDirList(FarPanelInfo &CurPanel, DirList &CurList) +void GetDirList(FarPanelInfo& CurPanel, DirList& CurList) { - if (CurPanel.PInfo.ItemsNumber) - { - CurList.ItemsNumber=CurPanel.PInfo.ItemsNumber; - CurList.PPI=(PluginPanelItem*)malloc(CurList.ItemsNumber*sizeof(PluginPanelItem)); - if (CurList.PPI) - { - for (int i=0; iFileAttributes; - CurrentPluginItem.LastAccessTime=FGPPI.Item->LastAccessTime; - CurrentPluginItem.LastWriteTime=FGPPI.Item->LastWriteTime; - CurrentPluginItem.FileSize=FGPPI.Item->FileSize; - CurrentPluginItem.CRC32=FGPPI.Item->CRC32; - CurrentPluginItem.Flags=FGPPI.Item->Flags; - CurrentPluginItem.FileName=(wchar_t*)malloc((wcslen(FGPPI.Item->FileName)+1)*sizeof(wchar_t)); - if (CurrentPluginItem.FileName) wcscpy((wchar_t*)CurrentPluginItem.FileName,FGPPI.Item->FileName); - - if (!CurPanel.bARC && (CurPanel.PInfo.Flags&PFLAGS_PLUGIN) && FGPPI.Item->CRC32) - CurPanel.bARC=true; - if (!CurPanel.bTMP && ((CurPanel.PInfo.Flags&PFLAGS_PLUGIN) && (CurPanel.PInfo.Flags&PFLAGS_REALNAMES)) && wcspbrk(FGPPI.Item->FileName,L":\\/")) - CurPanel.bTMP=true; - if (i==CurPanel.PInfo.CurrentItem && !(FGPPI.Item->FileAttributes&FILE_ATTRIBUTE_DIRECTORY)) - CurPanel.bCurFile=true; - if (!CurPanel.bDir && !CurPanel.bTMP && (FGPPI.Item->FileAttributes&FILE_ATTRIBUTE_DIRECTORY) && !(FGPPI.Item->FileName[1]==L'.' && !FGPPI.Item->FileName[2])) - CurPanel.bDir=true; - - free(PPI); - } - } - } - if (!CurPanel.bARC) - CurPanel.bARC=(CurPanel.PInfo.Flags&PFLAGS_USECRC32?true:false); - } - else - { - CurList.ItemsNumber=0; - CurList.PPI=NULL; - } - - int size=Info.PanelControl(CurPanel.hPanel,FCTL_GETPANELDIRECTORY,0,0); - if (size) - { - FarPanelDirectory *buf=(FarPanelDirectory*)malloc(size); - if (buf) - { - buf->StructSize=sizeof(FarPanelDirectory); - Info.PanelControl(CurPanel.hPanel,FCTL_GETPANELDIRECTORY,size,buf); - wcscpy(CurPanel.Dir,buf->Name); - if (!(CurPanel.PInfo.Flags&PFLAGS_PLUGIN)) - { - size=FSF.ConvertPath(CPM_NATIVE,buf->Name,0,0); - CurList.Dir=(wchar_t*)malloc(size*sizeof(wchar_t)); - if (CurList.Dir) FSF.ConvertPath(CPM_NATIVE,buf->Name,CurList.Dir,size); - } - else - { - CurList.Dir=(wchar_t*)malloc((wcslen(buf->Name)+1)*sizeof(wchar_t)); - if (CurList.Dir) wcscpy(CurList.Dir,buf->Name); - } - free(buf); - } - } + if (CurPanel.PInfo.ItemsNumber) + { + CurList.ItemsNumber = CurPanel.PInfo.ItemsNumber; + CurList.PPI = (PluginPanelItem*) malloc(CurList.ItemsNumber * sizeof(PluginPanelItem)); + if (CurList.PPI) + { + for (int i = 0; i < CurList.ItemsNumber; i++) + { + size_t size = Info.PanelControl(CurPanel.hPanel, FCTL_GETPANELITEM, i, 0); + PluginPanelItem* PPI = (PluginPanelItem*) malloc(size); + if (PPI) + { + FarGetPluginPanelItem FGPPI = {sizeof(FarGetPluginPanelItem), size, PPI}; + Info.PanelControl(CurPanel.hPanel, FCTL_GETPANELITEM, i, &FGPPI); + PluginPanelItem& CurrentPluginItem = (CurList.PPI[i]); + CurrentPluginItem.FileAttributes = FGPPI.Item->FileAttributes; + CurrentPluginItem.LastAccessTime = FGPPI.Item->LastAccessTime; + CurrentPluginItem.LastWriteTime = FGPPI.Item->LastWriteTime; + CurrentPluginItem.FileSize = FGPPI.Item->FileSize; + CurrentPluginItem.CRC32 = FGPPI.Item->CRC32; + CurrentPluginItem.Flags = FGPPI.Item->Flags; + CurrentPluginItem.FileName = (wchar_t*) malloc((wcslen(FGPPI.Item->FileName) + 1) * sizeof(wchar_t)); + if (CurrentPluginItem.FileName) + wcscpy((wchar_t*) CurrentPluginItem.FileName, FGPPI.Item->FileName); + + if (!CurPanel.bARC && (CurPanel.PInfo.Flags & PFLAGS_PLUGIN) && FGPPI.Item->CRC32) + CurPanel.bARC = true; + if (!CurPanel.bTMP && ((CurPanel.PInfo.Flags & PFLAGS_PLUGIN) && (CurPanel.PInfo.Flags & PFLAGS_REALNAMES)) && + wcspbrk(FGPPI.Item->FileName, L":\\/")) + CurPanel.bTMP = true; + if (i == CurPanel.PInfo.CurrentItem && !(FGPPI.Item->FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + CurPanel.bCurFile = true; + if (!CurPanel.bDir && !CurPanel.bTMP && (FGPPI.Item->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + !(FGPPI.Item->FileName[1] == L'.' && !FGPPI.Item->FileName[2])) + CurPanel.bDir = true; + + free(PPI); + } + } + } + if (!CurPanel.bARC) + CurPanel.bARC = (CurPanel.PInfo.Flags & PFLAGS_USECRC32 ? true : false); + } + else + { + CurList.ItemsNumber = 0; + CurList.PPI = NULL; + } + + int size = Info.PanelControl(CurPanel.hPanel, FCTL_GETPANELDIRECTORY, 0, 0); + if (size) + { + FarPanelDirectory* buf = (FarPanelDirectory*) malloc(size); + if (buf) + { + buf->StructSize = sizeof(FarPanelDirectory); + Info.PanelControl(CurPanel.hPanel, FCTL_GETPANELDIRECTORY, size, buf); + wcscpy(CurPanel.Dir, buf->Name); + if (!(CurPanel.PInfo.Flags & PFLAGS_PLUGIN)) + { + size = FSF.ConvertPath(CPM_NATIVE, buf->Name, 0, 0); + CurList.Dir = (wchar_t*) malloc(size * sizeof(wchar_t)); + if (CurList.Dir) + FSF.ConvertPath(CPM_NATIVE, buf->Name, CurList.Dir, size); + } + else + { + CurList.Dir = (wchar_t*) malloc((wcslen(buf->Name) + 1) * sizeof(wchar_t)); + if (CurList.Dir) + wcscpy(CurList.Dir, buf->Name); + } + free(buf); + } + } } -void FreeDirList(struct DirList *pList) +void FreeDirList(struct DirList* pList) { - if (pList->PPI) - { - for (int i=0; iItemsNumber; i++) - free((void*)pList->PPI[i].FileName); - free(pList->PPI); pList->PPI=NULL; - } - free(pList->Dir); pList->Dir=NULL; - pList->ItemsNumber=0; + if (pList->PPI) + { + for (int i = 0; i < pList->ItemsNumber; i++) free((void*) pList->PPI[i].FileName); + free(pList->PPI); + pList->PPI = NULL; + } + free(pList->Dir); + pList->Dir = NULL; + pList->ItemsNumber = 0; } /**************************************************************************** @@ -201,464 +207,472 @@ void FreeDirList(struct DirList *pList) ****************************************************************************/ /// VisComp.dll -PCOMPAREFILES pCompareFiles=NULL; +PCOMPAREFILES pCompareFiles = NULL; /// libgfl340.dll -extern PGFLGETVERSION pGflGetVersion=NULL; -PGFLLIBRARYINIT pGflLibraryInit=NULL; -PGFLENABLELZW pGflEnableLZW=NULL; -PGFLLIBRARYEXIT pGflLibraryExit=NULL; -PGFLLOADBITMAPW pGflLoadBitmapW=NULL; -PGFLGETNUMBEROFFORMAT pGflGetNumberOfFormat=NULL; -PGFLGETFORMATINFORMATIONBYINDEX pGflGetFormatInformationByIndex=NULL; -PGFLGETDEFAULTLOADPARAMS pGflGetDefaultLoadParams=NULL; -PGFLCHANGECOLORDEPTH pGflChangeColorDepth=NULL; -PGFLROTATE pGflRotate=NULL; -PGFLRESIZE pGflResize=NULL; -PGFLFREEBITMAP pGflFreeBitmap=NULL; -PGFLFREEFILEINFORMATION pGflFreeFileInformation=NULL; -PGFLGETCOLORAT pGflGetColorAt=NULL; +extern PGFLGETVERSION pGflGetVersion = NULL; +PGFLLIBRARYINIT pGflLibraryInit = NULL; +PGFLENABLELZW pGflEnableLZW = NULL; +PGFLLIBRARYEXIT pGflLibraryExit = NULL; +PGFLLOADBITMAPW pGflLoadBitmapW = NULL; +PGFLGETNUMBEROFFORMAT pGflGetNumberOfFormat = NULL; +PGFLGETFORMATINFORMATIONBYINDEX pGflGetFormatInformationByIndex = NULL; +PGFLGETDEFAULTLOADPARAMS pGflGetDefaultLoadParams = NULL; +PGFLCHANGECOLORDEPTH pGflChangeColorDepth = NULL; +PGFLROTATE pGflRotate = NULL; +PGFLRESIZE pGflResize = NULL; +PGFLFREEBITMAP pGflFreeBitmap = NULL; +PGFLFREEFILEINFORMATION pGflFreeFileInformation = NULL; +PGFLGETCOLORAT pGflGetColorAt = NULL; /// bass.dll -PBASS_GETVERSION pBASS_GetVersion=NULL; -PBASS_SETCONFIG pBASS_SetConfig=NULL; -PBASS_INIT pBASS_Init=NULL; -PBASS_FREE pBASS_Free=NULL; -PBASS_STREAMCREATEFILE pBASS_StreamCreateFile=NULL; -PBASS_STREAMFREE pBASS_StreamFree=NULL; -PBASS_CHANNELGETLENGTH pBASS_ChannelGetLength=NULL; -PBASS_CHANNELBYTES2SECONDS pBASS_ChannelBytes2Seconds=NULL; -PBASS_CHANNELGETINFO pBASS_ChannelGetInfo=NULL; -PBASS_CHANNELGETTAGS pBASS_ChannelGetTags=NULL; -PBASS_STREAMGETFILEPOSITION pBASS_StreamGetFilePosition=NULL; -PBASS_GETDEVICEINFO pBASS_GetDeviceInfo=NULL; -PBASS_CHANNELISACTIVE pBASS_ChannelIsActive=NULL; -PBASS_CHANNELGETDATA pBASS_ChannelGetData=NULL; - -bool FindFile(wchar_t *Dir, wchar_t *Pattern, string &strFileName) +PBASS_GETVERSION pBASS_GetVersion = NULL; +PBASS_SETCONFIG pBASS_SetConfig = NULL; +PBASS_INIT pBASS_Init = NULL; +PBASS_FREE pBASS_Free = NULL; +PBASS_STREAMCREATEFILE pBASS_StreamCreateFile = NULL; +PBASS_STREAMFREE pBASS_StreamFree = NULL; +PBASS_CHANNELGETLENGTH pBASS_ChannelGetLength = NULL; +PBASS_CHANNELBYTES2SECONDS pBASS_ChannelBytes2Seconds = NULL; +PBASS_CHANNELGETINFO pBASS_ChannelGetInfo = NULL; +PBASS_CHANNELGETTAGS pBASS_ChannelGetTags = NULL; +PBASS_STREAMGETFILEPOSITION pBASS_StreamGetFilePosition = NULL; +PBASS_GETDEVICEINFO pBASS_GetDeviceInfo = NULL; +PBASS_CHANNELISACTIVE pBASS_ChannelIsActive = NULL; +PBASS_CHANNELGETDATA pBASS_ChannelGetData = NULL; + +bool FindFile(wchar_t* Dir, wchar_t* Pattern, string& strFileName) { - string strPathMask(Dir); - strPathMask+=L"\\*"; - WIN32_FIND_DATA wfdFindData; - HANDLE hFind; - bool ret=false; - - if ((hFind=FindFirstFileW(strPathMask,&wfdFindData)) != INVALID_HANDLE_VALUE) - { - do - { - if (wfdFindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) - { - if ((wfdFindData.cFileName[0]==L'.' && !wfdFindData.cFileName[1]) || (wfdFindData.cFileName[1]==L'.' && !wfdFindData.cFileName[2])) - continue; - strPathMask=Dir; - if (strPathMask.length()>0 && strPathMask[(size_t)(strPathMask.length()-1)]!=L'\\') strPathMask+=L"\\"; - strPathMask+=wfdFindData.cFileName; - if (FindFile(strPathMask.get(),Pattern,strFileName)) - { - ret=true; - break; - } - } - else - { - if (!FSF.LStricmp(wfdFindData.cFileName,Pattern)) - { - strFileName=Dir; - if (strFileName.length()>0 && strFileName[(size_t)(strFileName.length()-1)]!=L'\\') strFileName+=L"\\"; - strFileName+=wfdFindData.cFileName; - ret=true; - break; - } - } - } while (FindNextFile(hFind,&wfdFindData)); - FindClose(hFind); - } - return ret; + string strPathMask(Dir); + strPathMask += L"\\*"; + WIN32_FIND_DATA wfdFindData; + HANDLE hFind; + bool ret = false; + + if ((hFind = FindFirstFileW(strPathMask, &wfdFindData)) != INVALID_HANDLE_VALUE) + { + do + { + if (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if ((wfdFindData.cFileName[0] == L'.' && !wfdFindData.cFileName[1]) || (wfdFindData.cFileName[1] == L'.' && !wfdFindData.cFileName[2])) + continue; + strPathMask = Dir; + if (strPathMask.length() > 0 && strPathMask[(size_t)(strPathMask.length() - 1)] != L'\\') + strPathMask += L"\\"; + strPathMask += wfdFindData.cFileName; + if (FindFile(strPathMask.get(), Pattern, strFileName)) + { + ret = true; + break; + } + } + else + { + if (!FSF.LStricmp(wfdFindData.cFileName, Pattern)) + { + strFileName = Dir; + if (strFileName.length() > 0 && strFileName[(size_t)(strFileName.length() - 1)] != L'\\') + strFileName += L"\\"; + strFileName += wfdFindData.cFileName; + ret = true; + break; + } + } + } while (FindNextFile(hFind, &wfdFindData)); + FindClose(hFind); + } + return ret; } -bool LoadVisComp(wchar_t *PlugPath) +bool LoadVisComp(wchar_t* PlugPath) { - if (pCompareFiles) return true; - - string strPatchVisComp; - if (FindFile(PlugPath,L"VisComp.dll",strPatchVisComp) && - Info.PluginsControl(INVALID_HANDLE_VALUE,PCTL_FORCEDLOADPLUGIN,PLT_PATH,strPatchVisComp.get())) - { - HMODULE h=GetModuleHandleW(L"VisComp.dll"); - if (h) - { - pCompareFiles=(PCOMPAREFILES)GetProcAddress(h,"CompareFiles"); - return true; - } - } - return false; + if (pCompareFiles) + return true; + + string strPatchVisComp; + if (FindFile(PlugPath, L"VisComp.dll", strPatchVisComp) && + Info.PluginsControl(INVALID_HANDLE_VALUE, PCTL_FORCEDLOADPLUGIN, PLT_PATH, strPatchVisComp.get())) + { + HMODULE h = GetModuleHandleW(L"VisComp.dll"); + if (h) + { + pCompareFiles = (PCOMPAREFILES) GetProcAddress(h, "CompareFiles"); + return true; + } + } + return false; } bool UnLoadGfl() { - if (bGflLoaded) - { - pGflLibraryExit(); - if (FreeLibrary(GflHandle)) - bGflLoaded=false; - else - return false; - } - return true; + if (bGflLoaded) + { + pGflLibraryExit(); + if (FreeLibrary(GflHandle)) + bGflLoaded = false; + else + return false; + } + return true; } -bool LoadGfl(wchar_t *PlugPath) +bool LoadGfl(wchar_t* PlugPath) { - if (bGflLoaded) return true; - - string strPatchGfl; - if (FindFile(PlugPath,L"libgfl340.dll",strPatchGfl)) - { - if (!(GflHandle=LoadLibrary(strPatchGfl))) - return false; - if (!pGflGetVersion) - pGflGetVersion=(PGFLGETVERSION)GetProcAddress(GflHandle,"gflGetVersion"); - if (!pGflLibraryInit) - pGflLibraryInit=(PGFLLIBRARYINIT)GetProcAddress(GflHandle,"gflLibraryInit"); - if (!pGflEnableLZW) - pGflEnableLZW=(PGFLENABLELZW)GetProcAddress(GflHandle,"gflEnableLZW"); - if (!pGflLibraryExit) - pGflLibraryExit=(PGFLLIBRARYEXIT)GetProcAddress(GflHandle,"gflLibraryExit"); - if (!pGflLoadBitmapW) - pGflLoadBitmapW=(PGFLLOADBITMAPW)GetProcAddress(GflHandle,"gflLoadBitmapW"); - if (!pGflGetNumberOfFormat) - pGflGetNumberOfFormat=(PGFLGETNUMBEROFFORMAT)GetProcAddress(GflHandle,"gflGetNumberOfFormat"); - if (!pGflGetFormatInformationByIndex) - pGflGetFormatInformationByIndex=(PGFLGETFORMATINFORMATIONBYINDEX)GetProcAddress(GflHandle,"gflGetFormatInformationByIndex"); - if (!pGflGetDefaultLoadParams) - pGflGetDefaultLoadParams=(PGFLGETDEFAULTLOADPARAMS)GetProcAddress(GflHandle,"gflGetDefaultLoadParams"); - if (!pGflChangeColorDepth) - pGflChangeColorDepth=(PGFLCHANGECOLORDEPTH)GetProcAddress(GflHandle,"gflChangeColorDepth"); - if (!pGflRotate) - pGflRotate=(PGFLROTATE)GetProcAddress(GflHandle,"gflRotate"); - if (!pGflResize) - pGflResize=(PGFLRESIZE)GetProcAddress(GflHandle,"gflResize"); - if (!pGflFreeBitmap) - pGflFreeBitmap=(PGFLFREEBITMAP)GetProcAddress(GflHandle,"gflFreeBitmap"); - if (!pGflFreeFileInformation) - pGflFreeFileInformation=(PGFLFREEFILEINFORMATION)GetProcAddress(GflHandle,"gflFreeFileInformation"); - if (!pGflGetColorAt) - pGflGetColorAt=(PGFLGETCOLORAT)GetProcAddress(GflHandle,"gflGetColorAt"); - - if (!pGflGetVersion || !pGflLibraryInit || !pGflEnableLZW || !pGflLibraryExit || !pGflLoadBitmapW || !pGflGetNumberOfFormat || !pGflGetFormatInformationByIndex || - !pGflGetDefaultLoadParams || !pGflChangeColorDepth || !pGflRotate || !pGflResize || !pGflFreeBitmap || !pGflFreeFileInformation || !pGflGetColorAt) - { - FreeLibrary(GflHandle); - return false; - } - bGflLoaded=true; - - if (lstrcmpA(GFL_VERSION,pGflGetVersion())>0 || pGflLibraryInit()!=GFL_NO_ERROR) - UnLoadGfl(); - if (bGflLoaded) - pGflEnableLZW(GFL_TRUE); - } - return bGflLoaded; + if (bGflLoaded) + return true; + + string strPatchGfl; + if (FindFile(PlugPath, L"libgfl340.dll", strPatchGfl)) + { + if (!(GflHandle = LoadLibrary(strPatchGfl))) + return false; + if (!pGflGetVersion) + pGflGetVersion = (PGFLGETVERSION) GetProcAddress(GflHandle, "gflGetVersion"); + if (!pGflLibraryInit) + pGflLibraryInit = (PGFLLIBRARYINIT) GetProcAddress(GflHandle, "gflLibraryInit"); + if (!pGflEnableLZW) + pGflEnableLZW = (PGFLENABLELZW) GetProcAddress(GflHandle, "gflEnableLZW"); + if (!pGflLibraryExit) + pGflLibraryExit = (PGFLLIBRARYEXIT) GetProcAddress(GflHandle, "gflLibraryExit"); + if (!pGflLoadBitmapW) + pGflLoadBitmapW = (PGFLLOADBITMAPW) GetProcAddress(GflHandle, "gflLoadBitmapW"); + if (!pGflGetNumberOfFormat) + pGflGetNumberOfFormat = (PGFLGETNUMBEROFFORMAT) GetProcAddress(GflHandle, "gflGetNumberOfFormat"); + if (!pGflGetFormatInformationByIndex) + pGflGetFormatInformationByIndex = (PGFLGETFORMATINFORMATIONBYINDEX) GetProcAddress(GflHandle, "gflGetFormatInformationByIndex"); + if (!pGflGetDefaultLoadParams) + pGflGetDefaultLoadParams = (PGFLGETDEFAULTLOADPARAMS) GetProcAddress(GflHandle, "gflGetDefaultLoadParams"); + if (!pGflChangeColorDepth) + pGflChangeColorDepth = (PGFLCHANGECOLORDEPTH) GetProcAddress(GflHandle, "gflChangeColorDepth"); + if (!pGflRotate) + pGflRotate = (PGFLROTATE) GetProcAddress(GflHandle, "gflRotate"); + if (!pGflResize) + pGflResize = (PGFLRESIZE) GetProcAddress(GflHandle, "gflResize"); + if (!pGflFreeBitmap) + pGflFreeBitmap = (PGFLFREEBITMAP) GetProcAddress(GflHandle, "gflFreeBitmap"); + if (!pGflFreeFileInformation) + pGflFreeFileInformation = (PGFLFREEFILEINFORMATION) GetProcAddress(GflHandle, "gflFreeFileInformation"); + if (!pGflGetColorAt) + pGflGetColorAt = (PGFLGETCOLORAT) GetProcAddress(GflHandle, "gflGetColorAt"); + + if (!pGflGetVersion || !pGflLibraryInit || !pGflEnableLZW || !pGflLibraryExit || !pGflLoadBitmapW || !pGflGetNumberOfFormat || + !pGflGetFormatInformationByIndex || !pGflGetDefaultLoadParams || !pGflChangeColorDepth || !pGflRotate || !pGflResize || !pGflFreeBitmap || + !pGflFreeFileInformation || !pGflGetColorAt) + { + FreeLibrary(GflHandle); + return false; + } + bGflLoaded = true; + + if (lstrcmpA(GFL_VERSION, pGflGetVersion()) > 0 || pGflLibraryInit() != GFL_NO_ERROR) + UnLoadGfl(); + if (bGflLoaded) + pGflEnableLZW(GFL_TRUE); + } + return bGflLoaded; } bool UnLoadBASS() { - if (bBASSLoaded) - { - pBASS_Free(); - if (FreeLibrary(BASSHandle)) - bBASSLoaded=false; - else - return false; - } - return true; + if (bBASSLoaded) + { + pBASS_Free(); + if (FreeLibrary(BASSHandle)) + bBASSLoaded = false; + else + return false; + } + return true; } -bool LoadBASS(wchar_t *PlugPath) +bool LoadBASS(wchar_t* PlugPath) { - if (bBASSLoaded) return true; - - string strPatchBASS; - if (FindFile(PlugPath,L"bass.dll",strPatchBASS)) - { - if (!(BASSHandle=LoadLibrary(strPatchBASS))) - return false; - if (!pBASS_GetVersion) - pBASS_GetVersion=(PBASS_GETVERSION)GetProcAddress(BASSHandle,"BASS_GetVersion"); - if (!pBASS_SetConfig) - pBASS_SetConfig=(PBASS_SETCONFIG)GetProcAddress(BASSHandle,"BASS_SetConfig"); - if (!pBASS_Init) - pBASS_Init=(PBASS_INIT)GetProcAddress(BASSHandle,"BASS_Init"); - if (!pBASS_Free) - pBASS_Free=(PBASS_FREE)GetProcAddress(BASSHandle,"BASS_Free"); - if (!pBASS_StreamCreateFile) - pBASS_StreamCreateFile=(PBASS_STREAMCREATEFILE)GetProcAddress(BASSHandle,"BASS_StreamCreateFile"); - if (!pBASS_StreamFree) - pBASS_StreamFree=(PBASS_STREAMFREE)GetProcAddress(BASSHandle,"BASS_StreamFree"); - if (!pBASS_ChannelGetLength) - pBASS_ChannelGetLength=(PBASS_CHANNELGETLENGTH)GetProcAddress(BASSHandle,"BASS_ChannelGetLength"); - if (!pBASS_ChannelBytes2Seconds) - pBASS_ChannelBytes2Seconds=(PBASS_CHANNELBYTES2SECONDS)GetProcAddress(BASSHandle,"BASS_ChannelBytes2Seconds"); - if (!pBASS_ChannelGetInfo) - pBASS_ChannelGetInfo=(PBASS_CHANNELGETINFO)GetProcAddress(BASSHandle,"BASS_ChannelGetInfo"); - if (!pBASS_ChannelGetTags) - pBASS_ChannelGetTags=(PBASS_CHANNELGETTAGS)GetProcAddress(BASSHandle,"BASS_ChannelGetTags"); - if (!pBASS_StreamGetFilePosition) - pBASS_StreamGetFilePosition=(PBASS_STREAMGETFILEPOSITION)GetProcAddress(BASSHandle,"BASS_StreamGetFilePosition"); - if (!pBASS_GetDeviceInfo) - pBASS_GetDeviceInfo=(PBASS_GETDEVICEINFO)GetProcAddress(BASSHandle,"BASS_GetDeviceInfo"); - if (!pBASS_ChannelIsActive) - pBASS_ChannelIsActive=(PBASS_CHANNELISACTIVE)GetProcAddress(BASSHandle,"BASS_ChannelIsActive"); - if (!pBASS_ChannelGetData) - pBASS_ChannelGetData=(PBASS_CHANNELGETDATA)GetProcAddress(BASSHandle,"BASS_ChannelGetData"); - - if (!pBASS_GetVersion || !pBASS_SetConfig || !pBASS_Init || !pBASS_Free || !pBASS_StreamCreateFile || !pBASS_StreamFree || !pBASS_GetDeviceInfo || - !pBASS_ChannelGetLength || !pBASS_ChannelBytes2Seconds || !pBASS_ChannelGetInfo || !pBASS_ChannelGetTags || !pBASS_StreamGetFilePosition || - !pBASS_ChannelIsActive || !pBASS_ChannelGetData) - { - FreeLibrary(BASSHandle); - return false; - } - bBASSLoaded=true; - - if (HIWORD(pBASS_GetVersion())!=BASSVERSION) - UnLoadBASS(); - - if (bBASSLoaded) - { - if (!pBASS_Init(0,44100,BASS_DEVICE_MONO,0,NULL)) - UnLoadBASS(); - } - - } - return bBASSLoaded; + if (bBASSLoaded) + return true; + + string strPatchBASS; + if (FindFile(PlugPath, L"bass.dll", strPatchBASS)) + { + if (!(BASSHandle = LoadLibrary(strPatchBASS))) + return false; + if (!pBASS_GetVersion) + pBASS_GetVersion = (PBASS_GETVERSION) GetProcAddress(BASSHandle, "BASS_GetVersion"); + if (!pBASS_SetConfig) + pBASS_SetConfig = (PBASS_SETCONFIG) GetProcAddress(BASSHandle, "BASS_SetConfig"); + if (!pBASS_Init) + pBASS_Init = (PBASS_INIT) GetProcAddress(BASSHandle, "BASS_Init"); + if (!pBASS_Free) + pBASS_Free = (PBASS_FREE) GetProcAddress(BASSHandle, "BASS_Free"); + if (!pBASS_StreamCreateFile) + pBASS_StreamCreateFile = (PBASS_STREAMCREATEFILE) GetProcAddress(BASSHandle, "BASS_StreamCreateFile"); + if (!pBASS_StreamFree) + pBASS_StreamFree = (PBASS_STREAMFREE) GetProcAddress(BASSHandle, "BASS_StreamFree"); + if (!pBASS_ChannelGetLength) + pBASS_ChannelGetLength = (PBASS_CHANNELGETLENGTH) GetProcAddress(BASSHandle, "BASS_ChannelGetLength"); + if (!pBASS_ChannelBytes2Seconds) + pBASS_ChannelBytes2Seconds = (PBASS_CHANNELBYTES2SECONDS) GetProcAddress(BASSHandle, "BASS_ChannelBytes2Seconds"); + if (!pBASS_ChannelGetInfo) + pBASS_ChannelGetInfo = (PBASS_CHANNELGETINFO) GetProcAddress(BASSHandle, "BASS_ChannelGetInfo"); + if (!pBASS_ChannelGetTags) + pBASS_ChannelGetTags = (PBASS_CHANNELGETTAGS) GetProcAddress(BASSHandle, "BASS_ChannelGetTags"); + if (!pBASS_StreamGetFilePosition) + pBASS_StreamGetFilePosition = (PBASS_STREAMGETFILEPOSITION) GetProcAddress(BASSHandle, "BASS_StreamGetFilePosition"); + if (!pBASS_GetDeviceInfo) + pBASS_GetDeviceInfo = (PBASS_GETDEVICEINFO) GetProcAddress(BASSHandle, "BASS_GetDeviceInfo"); + if (!pBASS_ChannelIsActive) + pBASS_ChannelIsActive = (PBASS_CHANNELISACTIVE) GetProcAddress(BASSHandle, "BASS_ChannelIsActive"); + if (!pBASS_ChannelGetData) + pBASS_ChannelGetData = (PBASS_CHANNELGETDATA) GetProcAddress(BASSHandle, "BASS_ChannelGetData"); + + if (!pBASS_GetVersion || !pBASS_SetConfig || !pBASS_Init || !pBASS_Free || !pBASS_StreamCreateFile || !pBASS_StreamFree || !pBASS_GetDeviceInfo || + !pBASS_ChannelGetLength || !pBASS_ChannelBytes2Seconds || !pBASS_ChannelGetInfo || !pBASS_ChannelGetTags || !pBASS_StreamGetFilePosition || + !pBASS_ChannelIsActive || !pBASS_ChannelGetData) + { + FreeLibrary(BASSHandle); + return false; + } + bBASSLoaded = true; + + if (HIWORD(pBASS_GetVersion()) != BASSVERSION) + UnLoadBASS(); + + if (bBASSLoaded) + { + if (!pBASS_Init(0, 44100, BASS_DEVICE_MONO, 0, NULL)) + UnLoadBASS(); + } + } + return bBASSLoaded; } - /**************************************************************************** ***************************** Exported functions *************************** ****************************************************************************/ - /**************************************************************************** * Эти функции плагина FAR вызывает в первую очередь ****************************************************************************/ -void WINAPI GetGlobalInfoW(struct GlobalInfo *pInfo) +void WINAPI GetGlobalInfoW(struct GlobalInfo* pInfo) { - pInfo->StructSize=sizeof(GlobalInfo); - pInfo->MinFarVersion=MAKEFARVERSION(3, 0, 0, 2927, VS_RELEASE);; - pInfo->Version=MAKEFARVERSION(PLUGIN_VER_MAJOR, PLUGIN_VER_MINOR, PLUGIN_VER_PATCH, 0, VS_RELEASE); - pInfo->Guid=MainGuid; - pInfo->Title=L"AdvCmpEx"; - pInfo->Description=L"Advanced compare files plugin for Far Manager v3.0"; - pInfo->Author=L"Alexey Samlyukov & FarPlugins Team"; + pInfo->StructSize = sizeof(GlobalInfo); + pInfo->MinFarVersion = MAKEFARVERSION(3, 0, 0, 2927, VS_RELEASE); + ; + pInfo->Version = MAKEFARVERSION(PLUGIN_VER_MAJOR, PLUGIN_VER_MINOR, PLUGIN_VER_PATCH, 0, VS_RELEASE); + pInfo->Guid = MainGuid; + pInfo->Title = L"AdvCmpEx"; + pInfo->Description = L"Advanced compare files plugin for Far Manager v3.0"; + pInfo->Author = L"Alexey Samlyukov & FarPlugins Team"; } // заполним структуру PluginStartupInfo и сделаем ряд полезных действий... -void WINAPI SetStartupInfoW(const struct PluginStartupInfo *pInfo) +void WINAPI SetStartupInfoW(const struct PluginStartupInfo* pInfo) { - ::Info = *pInfo; - if (pInfo->StructSize >= sizeof(PluginStartupInfo)) - { - FSF = *pInfo->FSF; - ::Info.FSF = &FSF; - - // обнулим кэш (туда будем помещать результаты сравнения) - memset(&Cache,0,sizeof(Cache)); - - wchar_t PlugPath[MAX_PATH]; - ExpandEnvironmentStringsW(L"%FARHOME%\\Plugins",PlugPath,(sizeof(PlugPath)/sizeof(PlugPath[0]))); - LoadVisComp(PlugPath); - LoadGfl(PlugPath); - LoadBASS(PlugPath); - } + ::Info = *pInfo; + if (pInfo->StructSize >= sizeof(PluginStartupInfo)) + { + FSF = *pInfo->FSF; + ::Info.FSF = &FSF; + + // обнулим кэш (туда будем помещать результаты сравнения) + memset(&Cache, 0, sizeof(Cache)); + + wchar_t PlugPath[MAX_PATH]; + ExpandEnvironmentStringsW(L"%FARHOME%\\Plugins", PlugPath, (sizeof(PlugPath) / sizeof(PlugPath[0]))); + LoadVisComp(PlugPath); + LoadGfl(PlugPath); + LoadBASS(PlugPath); + } } - /**************************************************************************** * Эту функцию плагина FAR вызывает во вторую очередь - заполним PluginInfo, т.е. * скажем FARу какие пункты добавить в "Plugin commands" и "Plugins configuration". ****************************************************************************/ -void WINAPI GetPluginInfoW(struct PluginInfo *pInfo) +void WINAPI GetPluginInfoW(struct PluginInfo* pInfo) { - static const wchar_t *PluginMenuStrings[1]; - PluginMenuStrings[0] = GetMsg(MCmpTitle); + static const wchar_t* PluginMenuStrings[1]; + PluginMenuStrings[0] = GetMsg(MCmpTitle); - pInfo->StructSize=sizeof(PluginInfo); - pInfo->PluginMenu.Guids=&MenuGuid; - pInfo->PluginMenu.Strings=PluginMenuStrings; - pInfo->PluginMenu.Count=sizeof(PluginMenuStrings)/sizeof(PluginMenuStrings[0]); + pInfo->StructSize = sizeof(PluginInfo); + pInfo->PluginMenu.Guids = &MenuGuid; + pInfo->PluginMenu.Strings = PluginMenuStrings; + pInfo->PluginMenu.Count = sizeof(PluginMenuStrings) / sizeof(PluginMenuStrings[0]); } - /**************************************************************************** * Основная функция плагина. FAR её вызывает, когда пользователь зовёт плагин ****************************************************************************/ -HANDLE WINAPI OpenW(const struct OpenInfo *OInfo) +HANDLE WINAPI OpenW(const struct OpenInfo* OInfo) { - HANDLE hPanel = NULL; - struct PanelInfo PInfo={sizeof(PanelInfo)}; - - // Если не удалось запросить информацию о активной панели... - if (!Info.PanelControl(PANEL_ACTIVE,FCTL_GETPANELINFO,0,&PInfo)) - return hPanel; - if (PInfo.Flags & PFLAGS_PANELLEFT) - { - LPanel.PInfo.StructSize=sizeof(PanelInfo); - Info.PanelControl(PANEL_ACTIVE,FCTL_GETPANELINFO,0,&LPanel.PInfo); - LPanel.hPanel=PANEL_ACTIVE; - } - else - { - RPanel.PInfo.StructSize=sizeof(PanelInfo); - Info.PanelControl(PANEL_ACTIVE,FCTL_GETPANELINFO,0,&RPanel.PInfo); - RPanel.hPanel=PANEL_ACTIVE; - } - // Если не удалось запросить информацию о пассивной панели... - if (!Info.PanelControl(PANEL_PASSIVE,FCTL_GETPANELINFO,0,&PInfo)) - return hPanel; - if (PInfo.Flags & PFLAGS_PANELLEFT) - { - LPanel.PInfo.StructSize=sizeof(PanelInfo); - Info.PanelControl(PANEL_PASSIVE,FCTL_GETPANELINFO,0,&LPanel.PInfo); - LPanel.hPanel=PANEL_PASSIVE; - } - else - { - RPanel.PInfo.StructSize=sizeof(PanelInfo); - Info.PanelControl(PANEL_PASSIVE,FCTL_GETPANELINFO,0,&RPanel.PInfo); - RPanel.hPanel=PANEL_PASSIVE; - } - - // Если панели нефайловые... - if (LPanel.PInfo.PanelType != PTYPE_FILEPANEL || RPanel.PInfo.PanelType != PTYPE_FILEPANEL) - { - ErrorMsg(MCmpTitle, MFilePanelsRequired); - return hPanel; - } - - LPanel.bTMP=LPanel.bARC=LPanel.bCurFile=LPanel.bDir=false; - RPanel.bTMP=RPanel.bARC=RPanel.bCurFile=RPanel.bDir=false; - struct DirList LList, RList; - - GetDirList(LPanel, LList); - GetDirList(RPanel, RList); - - WinInfo.hFarWindow=(HWND)Info.AdvControl(&MainGuid,ACTL_GETFARHWND,0,0); - GetClientRect(WinInfo.hFarWindow,&WinInfo.Win); - if (Info.AdvControl(&MainGuid,ACTL_GETFARRECT,0,&WinInfo.Con)) - { - WinInfo.Con.Right-=WinInfo.Con.Left; - WinInfo.Con.Bottom-=WinInfo.Con.Top; - WinInfo.Con.Left=WinInfo.Con.Top=0; - WinInfo.TruncLen=WinInfo.Con.Right-WinInfo.Con.Left-20+1; - if (WinInfo.TruncLen>MAX_PATH-2) WinInfo.TruncLen=MAX_PATH-2; - } - else - { - WinInfo.Con.Left=0; - WinInfo.Con.Top=0; - WinInfo.Con.Right=79; - WinInfo.Con.Bottom=24; - WinInfo.TruncLen=60; - } - - memset(&CmpInfo,0,sizeof(CmpInfo)); - bBrokenByEsc=false; - - if (bBASSLoaded) - { - BASS_DEVICEINFO info; - pBASS_GetDeviceInfo(0,&info); - if (!(info.flags&BASS_DEVICE_INIT)) - if (!pBASS_Init(0,44100,BASS_DEVICE_MONO,0,NULL)) - UnLoadBASS(); - } - - class AdvCmpDlgOpt AdvCmpOpt; - int ret=AdvCmpOpt.ShowOptDialog(); - - if (ret==55 || ret==56) // DlgOK || DlgUNDERCURSOR - { - DWORD dwTicks=GetTickCount(); - // откроем, для проверок на Esc - hConInp=CreateFileW(L"CONIN$", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); - - class AdvCmpProc AdvCmp; - AdvCmp.Init(); - - if (ret==55) - { - if (Opt.Mode!=MODE_DUP) - { - bool bDifferenceNotFound=AdvCmp.CompareDirs(&LList,&RList,true,0); - - if (hConInp!=INVALID_HANDLE_VALUE) CloseHandle(hConInp); - if (AdvCmp.TitleSaved) SetConsoleTitle(AdvCmp.strFarTitle); - - // Отмечаем файлы и перерисовываем панели. Если нужно показываем сообщение... - if (!bBrokenByEsc) - { - { - Info.PanelControl(LPanel.hPanel,FCTL_BEGINSELECTION,0,0); - Info.PanelControl(RPanel.hPanel,FCTL_BEGINSELECTION,0,0); - - for (int i=0; i 30000)) MessageBeep(MB_ICONASTERISK); - Info.AdvControl(&MainGuid,ACTL_PROGRESSNOTIFY,0,0); - if (CmpInfo.Errors && Opt.ShowMsg) ErrorMsg(MOpenErrorTitle,MOpenErrorBody); - if (bDifferenceNotFound && Opt.ShowMsg) - { - const wchar_t *MsgItems[] = { GetMsg(MNoDiffTitle), GetMsg(MNoDiffBody), GetMsg(MOK) }; - Info.Message(&MainGuid,&NoDiffMsgGuid,0,0,MsgItems,sizeof(MsgItems) / sizeof(MsgItems[0]),1); - } - else if (!bDifferenceNotFound && Opt.Dialog) - AdvCmp.ShowCmpDialog(&LList,&RList); - } - } - else - { - AdvCmp.Duplicate(LPanel.PInfo.Flags&PFLAGS_FOCUS?&LList:&RList); - } - } - else - { - if (hConInp!=INVALID_HANDLE_VALUE) CloseHandle(hConInp); - AdvCmp.CompareCurFile(LList.Dir,LList.PPI[LPanel.PInfo.CurrentItem].FileName,RList.Dir,RList.PPI[RPanel.PInfo.CurrentItem].FileName,1); - } - AdvCmp.Close(); - } - - AdvCmpOpt.Close(); - - FreeDirList(&LList); - FreeDirList(&RList); - - return hPanel; + HANDLE hPanel = NULL; + struct PanelInfo PInfo = {sizeof(PanelInfo)}; + + // Если не удалось запросить информацию о активной панели... + if (!Info.PanelControl(PANEL_ACTIVE, FCTL_GETPANELINFO, 0, &PInfo)) + return hPanel; + if (PInfo.Flags & PFLAGS_PANELLEFT) + { + LPanel.PInfo.StructSize = sizeof(PanelInfo); + Info.PanelControl(PANEL_ACTIVE, FCTL_GETPANELINFO, 0, &LPanel.PInfo); + LPanel.hPanel = PANEL_ACTIVE; + } + else + { + RPanel.PInfo.StructSize = sizeof(PanelInfo); + Info.PanelControl(PANEL_ACTIVE, FCTL_GETPANELINFO, 0, &RPanel.PInfo); + RPanel.hPanel = PANEL_ACTIVE; + } + // Если не удалось запросить информацию о пассивной панели... + if (!Info.PanelControl(PANEL_PASSIVE, FCTL_GETPANELINFO, 0, &PInfo)) + return hPanel; + if (PInfo.Flags & PFLAGS_PANELLEFT) + { + LPanel.PInfo.StructSize = sizeof(PanelInfo); + Info.PanelControl(PANEL_PASSIVE, FCTL_GETPANELINFO, 0, &LPanel.PInfo); + LPanel.hPanel = PANEL_PASSIVE; + } + else + { + RPanel.PInfo.StructSize = sizeof(PanelInfo); + Info.PanelControl(PANEL_PASSIVE, FCTL_GETPANELINFO, 0, &RPanel.PInfo); + RPanel.hPanel = PANEL_PASSIVE; + } + + // Если панели нефайловые... + if (LPanel.PInfo.PanelType != PTYPE_FILEPANEL || RPanel.PInfo.PanelType != PTYPE_FILEPANEL) + { + ErrorMsg(MCmpTitle, MFilePanelsRequired); + return hPanel; + } + + LPanel.bTMP = LPanel.bARC = LPanel.bCurFile = LPanel.bDir = false; + RPanel.bTMP = RPanel.bARC = RPanel.bCurFile = RPanel.bDir = false; + struct DirList LList, RList; + + GetDirList(LPanel, LList); + GetDirList(RPanel, RList); + + WinInfo.hFarWindow = (HWND) Info.AdvControl(&MainGuid, ACTL_GETFARHWND, 0, 0); + GetClientRect(WinInfo.hFarWindow, &WinInfo.Win); + if (Info.AdvControl(&MainGuid, ACTL_GETFARRECT, 0, &WinInfo.Con)) + { + WinInfo.Con.Right -= WinInfo.Con.Left; + WinInfo.Con.Bottom -= WinInfo.Con.Top; + WinInfo.Con.Left = WinInfo.Con.Top = 0; + WinInfo.TruncLen = WinInfo.Con.Right - WinInfo.Con.Left - 20 + 1; + if (WinInfo.TruncLen > MAX_PATH - 2) + WinInfo.TruncLen = MAX_PATH - 2; + } + else + { + WinInfo.Con.Left = 0; + WinInfo.Con.Top = 0; + WinInfo.Con.Right = 79; + WinInfo.Con.Bottom = 24; + WinInfo.TruncLen = 60; + } + + memset(&CmpInfo, 0, sizeof(CmpInfo)); + bBrokenByEsc = false; + + if (bBASSLoaded) + { + BASS_DEVICEINFO info; + pBASS_GetDeviceInfo(0, &info); + if (!(info.flags & BASS_DEVICE_INIT)) + if (!pBASS_Init(0, 44100, BASS_DEVICE_MONO, 0, NULL)) + UnLoadBASS(); + } + + class AdvCmpDlgOpt AdvCmpOpt; + int ret = AdvCmpOpt.ShowOptDialog(); + + if (ret == 55 || ret == 56) // DlgOK || DlgUNDERCURSOR + { + DWORD dwTicks = GetTickCount(); + // откроем, для проверок на Esc + hConInp = CreateFileW(L"CONIN$", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + + class AdvCmpProc AdvCmp; + AdvCmp.Init(); + + if (ret == 55) + { + if (Opt.Mode != MODE_DUP) + { + bool bDifferenceNotFound = AdvCmp.CompareDirs(&LList, &RList, true, 0); + + if (hConInp != INVALID_HANDLE_VALUE) + CloseHandle(hConInp); + if (AdvCmp.TitleSaved) + SetConsoleTitle(AdvCmp.strFarTitle); + + // Отмечаем файлы и перерисовываем панели. Если нужно показываем сообщение... + if (!bBrokenByEsc) + { + { + Info.PanelControl(LPanel.hPanel, FCTL_BEGINSELECTION, 0, 0); + Info.PanelControl(RPanel.hPanel, FCTL_BEGINSELECTION, 0, 0); + + for (int i = 0; i < LList.ItemsNumber; i++) + Info.PanelControl(LPanel.hPanel, FCTL_SETSELECTION, i, (void*) (LList.PPI[i].Flags & PPIF_SELECTED)); + for (int i = 0; i < RList.ItemsNumber; i++) + Info.PanelControl(RPanel.hPanel, FCTL_SETSELECTION, i, (void*) (RList.PPI[i].Flags & PPIF_SELECTED)); + + Info.PanelControl(LPanel.hPanel, FCTL_ENDSELECTION, 0, 0); + Info.PanelControl(LPanel.hPanel, FCTL_REDRAWPANEL, 0, 0); + Info.PanelControl(RPanel.hPanel, FCTL_ENDSELECTION, 0, 0); + Info.PanelControl(RPanel.hPanel, FCTL_REDRAWPANEL, 0, 0); + } + + if (Opt.Sound && (GetTickCount() - dwTicks > 30000)) + MessageBeep(MB_ICONASTERISK); + Info.AdvControl(&MainGuid, ACTL_PROGRESSNOTIFY, 0, 0); + if (CmpInfo.Errors && Opt.ShowMsg) + ErrorMsg(MOpenErrorTitle, MOpenErrorBody); + if (bDifferenceNotFound && Opt.ShowMsg) + { + const wchar_t* MsgItems[] = {GetMsg(MNoDiffTitle), GetMsg(MNoDiffBody), GetMsg(MOK)}; + Info.Message(&MainGuid, &NoDiffMsgGuid, 0, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 1); + } + else if (!bDifferenceNotFound && Opt.Dialog) + AdvCmp.ShowCmpDialog(&LList, &RList); + } + } + else + { + AdvCmp.Duplicate(LPanel.PInfo.Flags & PFLAGS_FOCUS ? &LList : &RList); + } + } + else + { + if (hConInp != INVALID_HANDLE_VALUE) + CloseHandle(hConInp); + AdvCmp.CompareCurFile(LList.Dir, LList.PPI[LPanel.PInfo.CurrentItem].FileName, RList.Dir, RList.PPI[RPanel.PInfo.CurrentItem].FileName, 1); + } + AdvCmp.Close(); + } + + AdvCmpOpt.Close(); + + FreeDirList(&LList); + FreeDirList(&RList); + + return hPanel; } /**************************************************************************** * Эту функцию FAR вызывает перед выгрузкой плагина ****************************************************************************/ -void WINAPI ExitFARW(const struct ExitInfo *pInfo) +void WINAPI ExitFARW(const struct ExitInfo* pInfo) { - //Освободим память в случае выгрузки плагина - if (Cache.RCI) - free(Cache.RCI); - Cache.RCI=NULL; - Cache.ItemsNumber=0; - - UnLoadGfl(); - UnLoadBASS(); + //Освободим память в случае выгрузки плагина + if (Cache.RCI) + free(Cache.RCI); + Cache.RCI = NULL; + Cache.ItemsNumber = 0; + + UnLoadGfl(); + UnLoadBASS(); } diff --git a/src/AdvCmp.hpp b/src/AdvCmp.hpp index 0e0e00a..12cecb9 100644 --- a/src/AdvCmp.hpp +++ b/src/AdvCmp.hpp @@ -31,101 +31,111 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #pragma once -#include #include -#include "plugin.hpp" +#include +#include "AdvCmpLng.hpp" // набор констант для извлечения строк из .lng файла +#include "bass.h" #include "farcolor.hpp" -#include "string.hpp" #include "libgfl.h" -#include "bass.h" -#include "AdvCmpLng.hpp" // набор констант для извлечения строк из .lng файла - +#include "plugin.hpp" +#include "string.hpp" /// ВАЖНО! используем данные функции, чтоб дополнительно не обнулять память -#define malloc(size) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size) -#define free(ptr) ((ptr)?HeapFree(GetProcessHeap(),0,ptr):0) -#define realloc(ptr,size) ((size)?((ptr)?HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,ptr,size):HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size)):(HeapFree(GetProcessHeap(),0,ptr),(void *)0)) +#define malloc(size) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size) +#define free(ptr) ((ptr) ? HeapFree(GetProcessHeap(), 0, ptr) : 0) +#define realloc(ptr, size) \ + ((size) ? ((ptr) ? HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ptr, size) : HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size)) \ + : (HeapFree(GetProcessHeap(), 0, ptr), (void*) 0)) #ifdef __cplusplus -inline void * __cdecl operator new(size_t size) { return malloc(size); } -inline void __cdecl operator delete(void *block) { free(block); } +inline void* __cdecl operator new(size_t size) +{ + return malloc(size); +} +inline void __cdecl operator delete(void* block) +{ + free(block); +} #endif /// Подмена strncmp() (или strcmp() при n=-1) -inline int __cdecl Strncmp(const wchar_t *s1, const wchar_t *s2, int n=-1) { return CompareString(0,SORT_STRINGSORT,s1,n,s2,n)-2; } +inline int __cdecl Strncmp(const wchar_t* s1, const wchar_t* s2, int n = -1) +{ + return CompareString(0, SORT_STRINGSORT, s1, n, s2, n) - 2; +} /// -#define ControlKeyAllMask (RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED|RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED|SHIFT_PRESSED) -#define ControlKeyAltMask (RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED) -#define ControlKeyNonAltMask (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED|SHIFT_PRESSED) -#define ControlKeyCtrlMask (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED) -#define ControlKeyNonCtrlMask (RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED|SHIFT_PRESSED) -#define IsShift(rec) (((rec)->Event.KeyEvent.dwControlKeyState&ControlKeyAllMask)==SHIFT_PRESSED) -#define IsAlt(rec) (((rec)->Event.KeyEvent.dwControlKeyState&ControlKeyAltMask)&&!((rec)->Event.KeyEvent.dwControlKeyState&ControlKeyNonAltMask)) -#define IsCtrl(rec) (((rec)->Event.KeyEvent.dwControlKeyState&ControlKeyCtrlMask)&&!((rec)->Event.KeyEvent.dwControlKeyState&ControlKeyNonCtrlMask)) -#define IsNone(rec) (((rec)->Event.KeyEvent.dwControlKeyState&ControlKeyAllMask)==0) - +#define ControlKeyAllMask (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED | RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED | SHIFT_PRESSED) +#define ControlKeyAltMask (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED) +#define ControlKeyNonAltMask (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED | SHIFT_PRESSED) +#define ControlKeyCtrlMask (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED) +#define ControlKeyNonCtrlMask (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED | SHIFT_PRESSED) +#define IsShift(rec) (((rec)->Event.KeyEvent.dwControlKeyState & ControlKeyAllMask) == SHIFT_PRESSED) +#define IsAlt(rec) \ + (((rec)->Event.KeyEvent.dwControlKeyState & ControlKeyAltMask) && !((rec)->Event.KeyEvent.dwControlKeyState & ControlKeyNonAltMask)) +#define IsCtrl(rec) \ + (((rec)->Event.KeyEvent.dwControlKeyState & ControlKeyCtrlMask) && !((rec)->Event.KeyEvent.dwControlKeyState & ControlKeyNonCtrlMask)) +#define IsNone(rec) (((rec)->Event.KeyEvent.dwControlKeyState & ControlKeyAllMask) == 0) /**************************************************************************** * GUID ****************************************************************************/ // {ED0C4BD8-D2F0-4b6e-A19F-B0B0137C9B0C} -DEFINE_GUID(MainGuid,0xed0c4bd8, 0xd2f0, 0x4b6e, 0xa1, 0x9f, 0xb0, 0xb0, 0x13, 0x7c, 0x9b, 0xc); +DEFINE_GUID(MainGuid, 0xed0c4bd8, 0xd2f0, 0x4b6e, 0xa1, 0x9f, 0xb0, 0xb0, 0x13, 0x7c, 0x9b, 0xc); // {CF6DF7E7-060C-4dd7-80D8-69E20F96EA38} -DEFINE_GUID(MenuGuid,0xcf6df7e7, 0x60c, 0x4dd7, 0x80, 0xd8, 0x69, 0xe2, 0xf, 0x96, 0xea, 0x38); +DEFINE_GUID(MenuGuid, 0xcf6df7e7, 0x60c, 0x4dd7, 0x80, 0xd8, 0x69, 0xe2, 0xf, 0x96, 0xea, 0x38); // {81184FEB-5A2C-4e7d-8C3F-D266B00E3CF6} -DEFINE_GUID(OptDlgGuid,0x81184feb, 0x5a2c, 0x4e7d, 0x8c, 0x3f, 0xd2, 0x66, 0xb0, 0xe, 0x3c, 0xf6); +DEFINE_GUID(OptDlgGuid, 0x81184feb, 0x5a2c, 0x4e7d, 0x8c, 0x3f, 0xd2, 0x66, 0xb0, 0xe, 0x3c, 0xf6); // {50E6209D-3D39-42ad-B64A-CA960927A249} -DEFINE_GUID(CmpDlgGuid,0x50e6209d, 0x3d39, 0x42ad, 0xb6, 0x4a, 0xca, 0x96, 0x9, 0x27, 0xa2, 0x49); +DEFINE_GUID(CmpDlgGuid, 0x50e6209d, 0x3d39, 0x42ad, 0xb6, 0x4a, 0xca, 0x96, 0x9, 0x27, 0xa2, 0x49); // {1AEAB879-D71C-4542-B99D-06E4FE4BEE0A} -DEFINE_GUID(DupDlgGuid,0x1aeab879, 0xd71c, 0x4542, 0xb9, 0x9d, 0x6, 0xe4, 0xfe, 0x4b, 0xee, 0xa); +DEFINE_GUID(DupDlgGuid, 0x1aeab879, 0xd71c, 0x4542, 0xb9, 0x9d, 0x6, 0xe4, 0xfe, 0x4b, 0xee, 0xa); // {8FC5FB22-E223-41ef-9EB6-A77D9302D462} -DEFINE_GUID(CurDlgGuid,0x8fc5fb22, 0xe223, 0x41ef, 0x9e, 0xb6, 0xa7, 0x7d, 0x93, 0x2, 0xd4, 0x62); +DEFINE_GUID(CurDlgGuid, 0x8fc5fb22, 0xe223, 0x41ef, 0x9e, 0xb6, 0xa7, 0x7d, 0x93, 0x2, 0xd4, 0x62); // {543FD7B0-0B51-4F81-819A-449C503EEEC2} -DEFINE_GUID(OptSyncDlgGuid,0x543fd7b0, 0xb51, 0x4f81, 0x81, 0x9a, 0x44, 0x9c, 0x50, 0x3e, 0xee, 0xc2); +DEFINE_GUID(OptSyncDlgGuid, 0x543fd7b0, 0xb51, 0x4f81, 0x81, 0x9a, 0x44, 0x9c, 0x50, 0x3e, 0xee, 0xc2); // {965FC640-C950-47AC-A17C-9D05129D3C1C} -DEFINE_GUID(ErrorMsgGuid,0x965fc640, 0xc950, 0x47ac, 0xa1, 0x7c, 0x9d, 0x5, 0x12, 0x9d, 0x3c, 0x1c); +DEFINE_GUID(ErrorMsgGuid, 0x965fc640, 0xc950, 0x47ac, 0xa1, 0x7c, 0x9d, 0x5, 0x12, 0x9d, 0x3c, 0x1c); // {363D47D7-F723-48CF-9A31-7F5EB4475362} -DEFINE_GUID(YesNoMsgGuid,0x363d47d7, 0xf723, 0x48cf, 0x9a, 0x31, 0x7f, 0x5e, 0xb4, 0x47, 0x53, 0x62); +DEFINE_GUID(YesNoMsgGuid, 0x363d47d7, 0xf723, 0x48cf, 0x9a, 0x31, 0x7f, 0x5e, 0xb4, 0x47, 0x53, 0x62); // {E2C773EB-F711-4F70-B551-92833045A30A} -DEFINE_GUID(DebugMsgGuid,0xe2c773eb, 0xf711, 0x4f70, 0xb5, 0x51, 0x92, 0x83, 0x30, 0x45, 0xa3, 0xa); +DEFINE_GUID(DebugMsgGuid, 0xe2c773eb, 0xf711, 0x4f70, 0xb5, 0x51, 0x92, 0x83, 0x30, 0x45, 0xa3, 0xa); // {000A11B8-83DA-40B5-BE76-8B3E4975F3F3} -DEFINE_GUID(NoDiffMsgGuid,0xa11b8, 0x83da, 0x40b5, 0xbe, 0x76, 0x8b, 0x3e, 0x49, 0x75, 0xf3, 0xf3); +DEFINE_GUID(NoDiffMsgGuid, 0xa11b8, 0x83da, 0x40b5, 0xbe, 0x76, 0x8b, 0x3e, 0x49, 0x75, 0xf3, 0xf3); // {7E5BD905-1CA7-41E1-89D0-367043E94544} -DEFINE_GUID(ClearCacheMsgGuid,0x7e5bd905, 0x1ca7, 0x41e1, 0x89, 0xd0, 0x36, 0x70, 0x43, 0xe9, 0x45, 0x44); +DEFINE_GUID(ClearCacheMsgGuid, 0x7e5bd905, 0x1ca7, 0x41e1, 0x89, 0xd0, 0x36, 0x70, 0x43, 0xe9, 0x45, 0x44); // {D51A604E-593A-418A-996E-B3BC08EF0FD4} -DEFINE_GUID(CmpMsgGuid,0xd51a604e, 0x593a, 0x418a, 0x99, 0x6e, 0xb3, 0xbc, 0x8, 0xef, 0xf, 0xd4); +DEFINE_GUID(CmpMsgGuid, 0xd51a604e, 0x593a, 0x418a, 0x99, 0x6e, 0xb3, 0xbc, 0x8, 0xef, 0xf, 0xd4); // {1D64872F-93E0-498E-AAE6-73E94B297864} -DEFINE_GUID(NoSyncMsgGuid,0x1d64872f, 0x93e0, 0x498e, 0xaa, 0xe6, 0x73, 0xe9, 0x4b, 0x29, 0x78, 0x64); +DEFINE_GUID(NoSyncMsgGuid, 0x1d64872f, 0x93e0, 0x498e, 0xaa, 0xe6, 0x73, 0xe9, 0x4b, 0x29, 0x78, 0x64); // {89404D9E-CD7C-4F7F-A02F-A74BDC34095A} -DEFINE_GUID(QueryOverwriteMsgGuid,0x89404d9e, 0xcd7c, 0x4f7f, 0xa0, 0x2f, 0xa7, 0x4b, 0xdc, 0x34, 0x9, 0x5a); +DEFINE_GUID(QueryOverwriteMsgGuid, 0x89404d9e, 0xcd7c, 0x4f7f, 0xa0, 0x2f, 0xa7, 0x4b, 0xdc, 0x34, 0x9, 0x5a); // {EB98752F-E7C4-41D8-AD86-75692151638E} -DEFINE_GUID(QueryDelMsgGuid,0xeb98752f, 0xe7c4, 0x41d8, 0xad, 0x86, 0x75, 0x69, 0x21, 0x51, 0x63, 0x8e); +DEFINE_GUID(QueryDelMsgGuid, 0xeb98752f, 0xe7c4, 0x41d8, 0xad, 0x86, 0x75, 0x69, 0x21, 0x51, 0x63, 0x8e); // {1AB836F3-6252-4F95-B8EB-A38DD8063678} -DEFINE_GUID(SyncMsgGuid,0x1ab836f3, 0x6252, 0x4f95, 0xb8, 0xeb, 0xa3, 0x8d, 0xd8, 0x6, 0x36, 0x78); +DEFINE_GUID(SyncMsgGuid, 0x1ab836f3, 0x6252, 0x4f95, 0xb8, 0xeb, 0xa3, 0x8d, 0xd8, 0x6, 0x36, 0x78); // {124B2C5E-C9E8-4E99-AFB5-B93D8C9509B3} -DEFINE_GUID(FailedCopyMsgGuid,0x124b2c5e, 0xc9e8, 0x4e99, 0xaf, 0xb5, 0xb9, 0x3d, 0x8c, 0x95, 0x9, 0xb3); +DEFINE_GUID(FailedCopyMsgGuid, 0x124b2c5e, 0xc9e8, 0x4e99, 0xaf, 0xb5, 0xb9, 0x3d, 0x8c, 0x95, 0x9, 0xb3); // {961E4702-C8A1-49F2-8F96-36F2DCD91431} -DEFINE_GUID(FailedDelFileMsgGuid,0x961e4702, 0xc8a1, 0x49f2, 0x8f, 0x96, 0x36, 0xf2, 0xdc, 0xd9, 0x14, 0x31); +DEFINE_GUID(FailedDelFileMsgGuid, 0x961e4702, 0xc8a1, 0x49f2, 0x8f, 0x96, 0x36, 0xf2, 0xdc, 0xd9, 0x14, 0x31); // {12C3FDA1-D6C4-4168-8522-D1C02D131395} -DEFINE_GUID(CantCreateFolderMsgGuid,0x12c3fda1, 0xd6c4, 0x4168, 0x85, 0x22, 0xd1, 0xc0, 0x2d, 0x13, 0x13, 0x95); +DEFINE_GUID(CantCreateFolderMsgGuid, 0x12c3fda1, 0xd6c4, 0x4168, 0x85, 0x22, 0xd1, 0xc0, 0x2d, 0x13, 0x13, 0x95); // {21364334-8293-42C8-922D-24CE103BF65F} -DEFINE_GUID(FailedDelFolderMsgGuid,0x21364334, 0x8293, 0x42c8, 0x92, 0x2d, 0x24, 0xce, 0x10, 0x3b, 0xf6, 0x5f); +DEFINE_GUID(FailedDelFolderMsgGuid, 0x21364334, 0x8293, 0x42c8, 0x92, 0x2d, 0x24, 0xce, 0x10, 0x3b, 0xf6, 0x5f); // {89258BF3-3651-4791-91DF-E407D063F3C8} -DEFINE_GUID(CmpMethodMenuGuid,0x89258bf3, 0x3651, 0x4791, 0x91, 0xdf, 0xe4, 0x7, 0xd0, 0x63, 0xf3, 0xc8); +DEFINE_GUID(CmpMethodMenuGuid, 0x89258bf3, 0x3651, 0x4791, 0x91, 0xdf, 0xe4, 0x7, 0xd0, 0x63, 0xf3, 0xc8); // {F36D329D-0C58-4015-96AF-9BC33D5309CE} -DEFINE_GUID(CompareCurFileMsgGuid,0xf36d329d, 0xc58, 0x4015, 0x96, 0xaf, 0x9b, 0xc3, 0x3d, 0x53, 0x9, 0xce); +DEFINE_GUID(CompareCurFileMsgGuid, 0xf36d329d, 0xc58, 0x4015, 0x96, 0xaf, 0x9b, 0xc3, 0x3d, 0x53, 0x9, 0xce); // {30F9985D-EEB9-4588-B4DB-349E920B7513} -DEFINE_GUID(DlgNameGuid,0x30f9985d, 0xeeb9, 0x4588, 0xb4, 0xdb, 0x34, 0x9e, 0x92, 0xb, 0x75, 0x13); +DEFINE_GUID(DlgNameGuid, 0x30f9985d, 0xeeb9, 0x4588, 0xb4, 0xdb, 0x34, 0x9e, 0x92, 0xb, 0x75, 0x13); // {5B72A0FE-9BEC-4116-8455-7A52EA87D891} -DEFINE_GUID(DupMsgGuid,0x5b72a0fe, 0x9bec, 0x4116, 0x84, 0x55, 0x7a, 0x52, 0xea, 0x87, 0xd8, 0x91); +DEFINE_GUID(DupMsgGuid, 0x5b72a0fe, 0x9bec, 0x4116, 0x84, 0x55, 0x7a, 0x52, 0xea, 0x87, 0xd8, 0x91); // {53F54C6D-1F0F-410C-8D9C-02AFEF73EB7E} -DEFINE_GUID(NoDupMsgGuid,0x53f54c6d, 0x1f0f, 0x410c, 0x8d, 0x9c, 0x2, 0xaf, 0xef, 0x73, 0xeb, 0x7e); +DEFINE_GUID(NoDupMsgGuid, 0x53f54c6d, 0x1f0f, 0x410c, 0x8d, 0x9c, 0x2, 0xaf, 0xef, 0x73, 0xeb, 0x7e); // {8CD5F2F1-069E-4783-8A27-0974ED8BCEF2} -DEFINE_GUID(DupDelItemsMsgGuid,0x8cd5f2f1, 0x69e, 0x4783, 0x8a, 0x27, 0x9, 0x74, 0xed, 0x8b, 0xce, 0xf2); +DEFINE_GUID(DupDelItemsMsgGuid, 0x8cd5f2f1, 0x69e, 0x4783, 0x8a, 0x27, 0x9, 0x74, 0xed, 0x8b, 0xce, 0xf2); // {C0C3822E-6CEB-44D8-A8B5-767F4F9937A0} -DEFINE_GUID(DlgSyncSel,0xc0c3822e, 0x6ceb, 0x44d8, 0xa8, 0xb5, 0x76, 0x7f, 0x4f, 0x99, 0x37, 0xa0); - +DEFINE_GUID(DlgSyncSel, 0xc0c3822e, 0x6ceb, 0x44d8, 0xa8, 0xb5, 0x76, 0x7f, 0x4f, 0x99, 0x37, 0xa0); /**************************************************************************** * Копии стандартных структур FAR @@ -133,90 +143,40 @@ DEFINE_GUID(DlgSyncSel,0xc0c3822e, 0x6ceb, 0x44d8, 0xa8, 0xb5, 0x76, 0x7f, 0x4f, extern struct PluginStartupInfo Info; extern struct FarStandardFunctions FSF; - /**************************************************************************** * Текущие настройки плагина ****************************************************************************/ -extern struct Options { - int Mode, - CmpCase, - CmpSize, - CmpTime, - Seconds, - LowPrecisionTime, - IgnoreTimeZone, - CmpContents, - OnlyTimeDiff, - Cache, - CacheIgnore, - Partly, - PartlyFull, - PartlyKbSize, - Ignore, - IgnoreTemplates, - DupName, - DupSize, - DupContents, - DupPic, - DupPicDiff, - DupPicSize, - DupPicFmt, - DupMusic, - DupMusicArtist, - DupMusicTitle, - DupMusicDuration, - DupMusicDurationSec, - Subfolders, - MaxScanDepth, - ScanSymlink, - Filter, - StopDiffDup, - SkipSubstr, - ProcessSelected, - SelectedNew, - SyncOnlyRight, - LightSync, - IgnoreMissing, - ShowMsg, - Sound, - Dialog, - TotalProgress, - Sync, - // что показывать в листе - ShowListSelect, - ShowListIdentical, - ShowListDifferent, - ShowListLNew, - ShowListRNew, - // отметка элементов в листе - SyncFlagClearUser, - SyncFlagCopy, // <0 - налево, =0 - нет, >0 - направо - SyncFlagIfNew, - SyncFlagLCopy, // уникальный слева: <0 - налево, =0 - нет, >0 - направо - SyncFlagRCopy, // уникальный справа: <0 - налево/удалить, =0 - нет, >0 - направо - // копирование/удаление - SyncLPanel, - SyncRPanel, - SyncDel, - SyncUseDelFilter, - - Dup, - DupListSmall, - // удаление - DupDel, - DupDelRecycleBin, - - ProcessHidden, - BufSize; - char *Buf[2]; - wchar_t *DupPath, *Substr, *WinMergePath; - HANDLE hCustomFilter; +extern struct Options +{ + int Mode, CmpCase, CmpSize, CmpTime, Seconds, LowPrecisionTime, IgnoreTimeZone, CmpContents, OnlyTimeDiff, Cache, CacheIgnore, Partly, PartlyFull, + PartlyKbSize, Ignore, IgnoreTemplates, DupName, DupSize, DupContents, DupPic, DupPicDiff, DupPicSize, DupPicFmt, DupMusic, DupMusicArtist, + DupMusicTitle, DupMusicDuration, DupMusicDurationSec, Subfolders, MaxScanDepth, ScanSymlink, Filter, StopDiffDup, SkipSubstr, ProcessSelected, + SelectedNew, SyncOnlyRight, LightSync, IgnoreMissing, ShowMsg, Sound, Dialog, TotalProgress, Sync, + // что показывать в листе + ShowListSelect, ShowListIdentical, ShowListDifferent, ShowListLNew, ShowListRNew, + // отметка элементов в листе + SyncFlagClearUser, + SyncFlagCopy, // <0 - налево, =0 - нет, >0 - направо + SyncFlagIfNew, + SyncFlagLCopy, // уникальный слева: <0 - налево, =0 - нет, >0 - направо + SyncFlagRCopy, // уникальный справа: <0 - налево/удалить, =0 - нет, >0 - направо + // копирование/удаление + SyncLPanel, SyncRPanel, SyncDel, SyncUseDelFilter, + + Dup, DupListSmall, + // удаление + DupDel, DupDelRecycleBin, + + ProcessHidden, BufSize; + char* Buf[2]; + wchar_t *DupPath, *Substr, *WinMergePath; + HANDLE hCustomFilter; } Opt; enum ModeFlag { - MODE_CMP = 0, - MODE_SYNC = 1, - MODE_DUP = 2, + MODE_CMP = 0, + MODE_SYNC = 1, + MODE_DUP = 2, }; extern HANDLE hConInp; // хэндл консол. ввода @@ -226,136 +186,141 @@ extern bool bGflLoaded; // libgfl340.dll загружена? extern bool bBASSLoaded; // bass.dll загружена? // информация о панели -extern struct FarPanelInfo { - struct PanelInfo PInfo; - HANDLE hPanel; - HANDLE hFilter; // подцепим фильтр с панели - bool bTMP; // Tmp-панель? обрабатывается особо! - bool bARC; // панель-архив? обрабатывается особо! - bool bCurFile; // под курсором файл? - bool bDir; // на панели есть каталоги? - wchar_t Dir[32768]; +extern struct FarPanelInfo +{ + struct PanelInfo PInfo; + HANDLE hPanel; + HANDLE hFilter; // подцепим фильтр с панели + bool bTMP; // Tmp-панель? обрабатывается особо! + bool bARC; // панель-архив? обрабатывается особо! + bool bCurFile; // под курсором файл? + bool bDir; // на панели есть каталоги? + wchar_t Dir[32768]; } LPanel, RPanel; // информация об окне Фара -extern struct FarWindowsInfo { - HWND hFarWindow; // описатель окна фара - SMALL_RECT Con; // координаты консоли (символы - {0,0,79,24}) - RECT Win; // координаты окна (точки - {0,0,1280,896}) - int TruncLen; // оптимальная длина сообщения-сравнения +extern struct FarWindowsInfo +{ + HWND hFarWindow; // описатель окна фара + SMALL_RECT Con; // координаты консоли (символы - {0,0,79,24}) + RECT Win; // координаты окна (точки - {0,0,1280,896}) + int TruncLen; // оптимальная длина сообщения-сравнения } WinInfo; // информация -extern struct TotalCmpInfo { - unsigned int Count; // кол-во сравниваемых элементов - unsigned __int64 CountSize; // их размер - unsigned __int64 CurCountSize; // размер сравниваемой пары - unsigned int Proc; // кол-во обработанных элементов - unsigned __int64 ProcSize; // размер обработанного - unsigned __int64 CurProcSize; // размер обработанного из сравниваемой пары - unsigned int LDiff; // кол-во отличающихся на левой панели - unsigned int RDiff; // кол-во отличающихся на правой панели - unsigned int Errors; // кол-во, не смогли открыть каталогов/файлов +extern struct TotalCmpInfo +{ + unsigned int Count; // кол-во сравниваемых элементов + unsigned __int64 CountSize; // их размер + unsigned __int64 CurCountSize; // размер сравниваемой пары + unsigned int Proc; // кол-во обработанных элементов + unsigned __int64 ProcSize; // размер обработанного + unsigned __int64 CurProcSize; // размер обработанного из сравниваемой пары + unsigned int LDiff; // кол-во отличающихся на левой панели + unsigned int RDiff; // кол-во отличающихся на правой панели + unsigned int Errors; // кол-во, не смогли открыть каталогов/файлов } CmpInfo; // элементы для сравнения -struct DirList { - wchar_t *Dir; // каталог - PluginPanelItem *PPI; // элементы - int ItemsNumber; // кол-во +struct DirList +{ + wchar_t* Dir; // каталог + PluginPanelItem* PPI; // элементы + int ItemsNumber; // кол-во }; // флаги результата сравнения enum ResultCmpItemFlag { - RCIF_NONE = 0x00000000, - RCIF_EQUAL = 0x00000001, // одинаковые |=| - RCIF_DIFFER = 0x00000002, // разные |?| - RCIF_LNEW = 0x00000004, // слева новый |>| - RCIF_RNEW = 0x00000008, // справа новый |<| - - // пользовательские флаги, для итогового диалога: - RCIF_USER = 0x000001F0, - RCIF_USERSELECT = 0x00000010, // элемент выделен - RCIF_USERNONE = 0x00000020, // скинут флаг отличия - RCIF_USERLNEW = 0x00000040, // установлен флаг "слева новый" - RCIF_USERRNEW = 0x00000080, // установлен флаг "справа новый" - RCIF_USERDEL = 0x00000100, // удалить файл - - // дополнительные флаги - RCIF_NAME = 0x00000200, // одинаковые регистром имен - RCIF_SIZE = 0x00000400, // одинаковые размером - RCIF_TIME = 0x00000800, // одинаковые временем - RCIF_CONT = 0x00001000, // одинаковые содержимым - RCIF_NAMEDIFF = 0x00002000, // различаются регистром имен - RCIF_SIZEDIFF = 0x00004000, // различаются размером - RCIF_TIMEDIFF = 0x00008000, // различаются временем - RCIF_CONTDIFF = 0x00010000, // различаются содержимым - - RCIF_LUNIQ = 0x00040000, // слева уникальный - RCIF_RUNIQ = 0x00080000, // справа уникальный - - // для дубликатов - RCIF_PIC = 0x00100000, // картинка - RCIF_PICERR = 0x00200000, // битая картинка - RCIF_PICJPG = 0x00400000, // jpg-картинка - RCIF_PICBMP = 0x00800000, // bmp-картинка - RCIF_PICGIF = 0x01000000, // gif-картинка - RCIF_PICTIF = 0x02000000, // tif-картинка - RCIF_PICPNG = 0x04000000, // png-картинка - RCIF_PICICO = 0x08000000, // ico-картинка - - RCIF_MUSIC = 0x10000000, // mp3-файл - RCIF_MUSICART = 0x20000000, // у mp3-файла заполнен Артист - RCIF_MUSICTIT = 0x40000000, // заполнено Название + RCIF_NONE = 0x00000000, + RCIF_EQUAL = 0x00000001, // одинаковые |=| + RCIF_DIFFER = 0x00000002, // разные |?| + RCIF_LNEW = 0x00000004, // слева новый |>| + RCIF_RNEW = 0x00000008, // справа новый |<| + + // пользовательские флаги, для итогового диалога: + RCIF_USER = 0x000001F0, + RCIF_USERSELECT = 0x00000010, // элемент выделен + RCIF_USERNONE = 0x00000020, // скинут флаг отличия + RCIF_USERLNEW = 0x00000040, // установлен флаг "слева новый" + RCIF_USERRNEW = 0x00000080, // установлен флаг "справа новый" + RCIF_USERDEL = 0x00000100, // удалить файл + + // дополнительные флаги + RCIF_NAME = 0x00000200, // одинаковые регистром имен + RCIF_SIZE = 0x00000400, // одинаковые размером + RCIF_TIME = 0x00000800, // одинаковые временем + RCIF_CONT = 0x00001000, // одинаковые содержимым + RCIF_NAMEDIFF = 0x00002000, // различаются регистром имен + RCIF_SIZEDIFF = 0x00004000, // различаются размером + RCIF_TIMEDIFF = 0x00008000, // различаются временем + RCIF_CONTDIFF = 0x00010000, // различаются содержимым + + RCIF_LUNIQ = 0x00040000, // слева уникальный + RCIF_RUNIQ = 0x00080000, // справа уникальный + + // для дубликатов + RCIF_PIC = 0x00100000, // картинка + RCIF_PICERR = 0x00200000, // битая картинка + RCIF_PICJPG = 0x00400000, // jpg-картинка + RCIF_PICBMP = 0x00800000, // bmp-картинка + RCIF_PICGIF = 0x01000000, // gif-картинка + RCIF_PICTIF = 0x02000000, // tif-картинка + RCIF_PICPNG = 0x04000000, // png-картинка + RCIF_PICICO = 0x08000000, // ico-картинка + + RCIF_MUSIC = 0x10000000, // mp3-файл + RCIF_MUSICART = 0x20000000, // у mp3-файла заполнен Артист + RCIF_MUSICTIT = 0x40000000, // заполнено Название }; /**************************************************************************** * Кеш сравнения "по содержимому" ****************************************************************************/ // результат сравнения 2-х элементов -struct ResultCmpItem { - DWORD dwFullFileName[2]; - DWORD64 dwWriteTime[2]; - DWORD dwFlags; +struct ResultCmpItem +{ + DWORD dwFullFileName[2]; + DWORD64 dwWriteTime[2]; + DWORD dwFlags; }; // кеш -extern struct CacheCmp { - ResultCmpItem *RCI; - int ItemsNumber; +extern struct CacheCmp +{ + ResultCmpItem* RCI; + int ItemsNumber; } Cache; -const wchar_t *GetMsg(int MsgId); +const wchar_t* GetMsg(int MsgId); void ErrorMsg(DWORD Title, DWORD Body); bool YesNoMsg(DWORD Title, DWORD Body); -int DebugMsg(wchar_t *msg, wchar_t *msg2 = L" ", unsigned int i = 1000); -__int64 GetFarSetting(FARSETTINGS_SUBFOLDERS Root,const wchar_t* Name); - +int DebugMsg(wchar_t* msg, wchar_t* msg2 = L" ", unsigned int i = 1000); +__int64 GetFarSetting(FARSETTINGS_SUBFOLDERS Root, const wchar_t* Name); /**************************************************************************** * VisComp.dll ****************************************************************************/ -typedef int (WINAPI *PCOMPAREFILES)(wchar_t *FileName1, wchar_t *FileName2, DWORD Options); +typedef int(WINAPI* PCOMPAREFILES)(wchar_t* FileName1, wchar_t* FileName2, DWORD Options); extern PCOMPAREFILES pCompareFiles; /**************************************************************************** * libgfl340.dll ****************************************************************************/ -typedef const char* (WINAPI *PGFLGETVERSION)(void); -typedef GFL_ERROR (WINAPI *PGFLLIBRARYINIT)(void); -typedef void (WINAPI *PGFLENABLELZW)(GFL_BOOL); -typedef void (WINAPI *PGFLLIBRARYEXIT)(void); -typedef GFL_ERROR (WINAPI *PGFLLOADBITMAPW)(const wchar_t* filename, GFL_BITMAP** bitmap, const GFL_LOAD_PARAMS* params, GFL_FILE_INFORMATION* info); -typedef GFL_INT32 (WINAPI *PGFLGETNUMBEROFFORMAT)(void); -typedef GFL_ERROR (WINAPI *PGFLGETFORMATINFORMATIONBYINDEX)(GFL_INT32 index, GFL_FORMAT_INFORMATION* info); -typedef void (WINAPI *PGFLGETDEFAULTLOADPARAMS)(GFL_LOAD_PARAMS *); -typedef GFL_ERROR (WINAPI *PGFLCHANGECOLORDEPTH)(GFL_BITMAP* src, GFL_BITMAP** dst, GFL_MODE mode, GFL_MODE_PARAMS params); -typedef GFL_ERROR (WINAPI *PGFLROTATE)(GFL_BITMAP* src, GFL_BITMAP** dst, GFL_INT32 angle, const GFL_COLOR *background_color); -typedef GFL_ERROR (WINAPI *PGFLRESIZE)(GFL_BITMAP *, GFL_BITMAP **, GFL_INT32, GFL_INT32, GFL_UINT32, GFL_UINT32); -typedef void (WINAPI *PGFLFREEBITMAP)(GFL_BITMAP *); -typedef void (WINAPI *PGFLFREEFILEINFORMATION)(GFL_FILE_INFORMATION* info); -typedef GFL_ERROR (WINAPI *PGFLGETCOLORAT)(const GFL_BITMAP *, GFL_INT32, GFL_INT32, GFL_COLOR*); +typedef const char*(WINAPI* PGFLGETVERSION)(void); +typedef GFL_ERROR(WINAPI* PGFLLIBRARYINIT)(void); +typedef void(WINAPI* PGFLENABLELZW)(GFL_BOOL); +typedef void(WINAPI* PGFLLIBRARYEXIT)(void); +typedef GFL_ERROR(WINAPI* PGFLLOADBITMAPW)(const wchar_t* filename, GFL_BITMAP** bitmap, const GFL_LOAD_PARAMS* params, GFL_FILE_INFORMATION* info); +typedef GFL_INT32(WINAPI* PGFLGETNUMBEROFFORMAT)(void); +typedef GFL_ERROR(WINAPI* PGFLGETFORMATINFORMATIONBYINDEX)(GFL_INT32 index, GFL_FORMAT_INFORMATION* info); +typedef void(WINAPI* PGFLGETDEFAULTLOADPARAMS)(GFL_LOAD_PARAMS*); +typedef GFL_ERROR(WINAPI* PGFLCHANGECOLORDEPTH)(GFL_BITMAP* src, GFL_BITMAP** dst, GFL_MODE mode, GFL_MODE_PARAMS params); +typedef GFL_ERROR(WINAPI* PGFLROTATE)(GFL_BITMAP* src, GFL_BITMAP** dst, GFL_INT32 angle, const GFL_COLOR* background_color); +typedef GFL_ERROR(WINAPI* PGFLRESIZE)(GFL_BITMAP*, GFL_BITMAP**, GFL_INT32, GFL_INT32, GFL_UINT32, GFL_UINT32); +typedef void(WINAPI* PGFLFREEBITMAP)(GFL_BITMAP*); +typedef void(WINAPI* PGFLFREEFILEINFORMATION)(GFL_FILE_INFORMATION* info); +typedef GFL_ERROR(WINAPI* PGFLGETCOLORAT)(const GFL_BITMAP*, GFL_INT32, GFL_INT32, GFL_COLOR*); extern PGFLGETVERSION pGflGetVersion; extern PGFLLIBRARYINIT pGflLibraryInit; @@ -372,24 +337,23 @@ extern PGFLFREEBITMAP pGflFreeBitmap; extern PGFLFREEFILEINFORMATION pGflFreeFileInformation; extern PGFLGETCOLORAT pGflGetColorAt; - /**************************************************************************** * bass.dll ****************************************************************************/ -typedef DWORD (WINAPI *PBASS_GETVERSION)(void); -typedef BOOL (WINAPI *PBASS_SETCONFIG)(DWORD option, DWORD value); -typedef BOOL (WINAPI *PBASS_INIT)(int device, DWORD freq, DWORD flags, HWND win, const GUID *dsguid); -typedef BOOL (WINAPI *PBASS_FREE)(void); -typedef HSTREAM (WINAPI *PBASS_STREAMCREATEFILE)(BOOL mem, const void *file, QWORD offset, QWORD length, DWORD flags); -typedef BOOL (WINAPI *PBASS_STREAMFREE)(HSTREAM handle); -typedef QWORD (WINAPI *PBASS_CHANNELGETLENGTH)(DWORD handle, DWORD mode); -typedef double (WINAPI *PBASS_CHANNELBYTES2SECONDS)(DWORD handle, QWORD pos); -typedef QWORD (WINAPI *PBASS_STREAMGETFILEPOSITION)(HSTREAM handle, DWORD mode); -typedef BOOL (WINAPI *PBASS_CHANNELGETINFO)(DWORD handle, BASS_CHANNELINFO *info); -typedef const char* (WINAPI *PBASS_CHANNELGETTAGS)(DWORD handle, DWORD tags); -typedef BOOL (WINAPI *PBASS_GETDEVICEINFO)(DWORD device, BASS_DEVICEINFO *info); -typedef DWORD (WINAPI *PBASS_CHANNELISACTIVE)(DWORD handle); -typedef DWORD (WINAPI *PBASS_CHANNELGETDATA)(DWORD handle, void *buffer, DWORD length); +typedef DWORD(WINAPI* PBASS_GETVERSION)(void); +typedef BOOL(WINAPI* PBASS_SETCONFIG)(DWORD option, DWORD value); +typedef BOOL(WINAPI* PBASS_INIT)(int device, DWORD freq, DWORD flags, HWND win, const GUID* dsguid); +typedef BOOL(WINAPI* PBASS_FREE)(void); +typedef HSTREAM(WINAPI* PBASS_STREAMCREATEFILE)(BOOL mem, const void* file, QWORD offset, QWORD length, DWORD flags); +typedef BOOL(WINAPI* PBASS_STREAMFREE)(HSTREAM handle); +typedef QWORD(WINAPI* PBASS_CHANNELGETLENGTH)(DWORD handle, DWORD mode); +typedef double(WINAPI* PBASS_CHANNELBYTES2SECONDS)(DWORD handle, QWORD pos); +typedef QWORD(WINAPI* PBASS_STREAMGETFILEPOSITION)(HSTREAM handle, DWORD mode); +typedef BOOL(WINAPI* PBASS_CHANNELGETINFO)(DWORD handle, BASS_CHANNELINFO* info); +typedef const char*(WINAPI* PBASS_CHANNELGETTAGS)(DWORD handle, DWORD tags); +typedef BOOL(WINAPI* PBASS_GETDEVICEINFO)(DWORD device, BASS_DEVICEINFO* info); +typedef DWORD(WINAPI* PBASS_CHANNELISACTIVE)(DWORD handle); +typedef DWORD(WINAPI* PBASS_CHANNELGETDATA)(DWORD handle, void* buffer, DWORD length); extern PBASS_GETVERSION pBASS_GetVersion; extern PBASS_SETCONFIG pBASS_SetConfig; @@ -405,4 +369,3 @@ extern PBASS_STREAMGETFILEPOSITION pBASS_StreamGetFilePosition; extern PBASS_GETDEVICEINFO pBASS_GetDeviceInfo; extern PBASS_CHANNELISACTIVE pBASS_ChannelIsActive; extern PBASS_CHANNELGETDATA pBASS_ChannelGetData; - diff --git a/src/AdvCmpDlgOpt.cpp b/src/AdvCmpDlgOpt.cpp index 181df5e..9c70b26 100644 --- a/src/AdvCmpDlgOpt.cpp +++ b/src/AdvCmpDlgOpt.cpp @@ -40,966 +40,976 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ID-константы диалога ****************************************************************************/ enum { - DlgBORDER = 0, // 0 + DlgBORDER = 0, // 0 - DlgMODE, // 1 - DlgMODEBOX, // 2 + DlgMODE, // 1 + DlgMODEBOX, // 2 - DlgCMPCASE, // 3 - DlgCMPSIZE, // 4 - DlgCMPTIME, // 5 - DlgSECONDS, // 6 - DlgIGNORESEC, // 7 - DlgPRECISION, // 8 - DlgTIMEZONE, // 9 - DlgCMPCONTENTS, //10 - DlgDIFFTIME, //11 - DlgCACHE, //12 - DlgCACHEIGNORE, //13 - DlgCACHEUSE, //14 - DlgCACHECLEAR, //15 - DlgPARTLY, //16 - DlgPARTLYFULL, //17 - DlgLPARTLYKB, //18 - DlgEPARTLYKB, //19 - DlgIGNORE, //20 - DlgIGNORETEMPL, //21 + DlgCMPCASE, // 3 + DlgCMPSIZE, // 4 + DlgCMPTIME, // 5 + DlgSECONDS, // 6 + DlgIGNORESEC, // 7 + DlgPRECISION, // 8 + DlgTIMEZONE, // 9 + DlgCMPCONTENTS, // 10 + DlgDIFFTIME, // 11 + DlgCACHE, // 12 + DlgCACHEIGNORE, // 13 + DlgCACHEUSE, // 14 + DlgCACHECLEAR, // 15 + DlgPARTLY, // 16 + DlgPARTLYFULL, // 17 + DlgLPARTLYKB, // 18 + DlgEPARTLYKB, // 19 + DlgIGNORE, // 20 + DlgIGNORETEMPL, // 21 - DlgDUPPATH, //22 - DlgDUPNAME, //23 - DlgDUPSIZE, //24 - DlgDUPCONTENTS, //25 - DlgDUPPIC, //26 - DlgDUPPICDIFF, //27 - DlgDUPPICSIZE, //28 - DlgDUPPICFMT, //29 - DlgDUPMUSIC, //30 - DlgDUPMUSICARTIST,//31 - DlgDUPMUSICTITLE, //32 - DlgDUPMUSICDURL, //33 - DlgDUPMUSICDURE, //34 + DlgDUPPATH, // 22 + DlgDUPNAME, // 23 + DlgDUPSIZE, // 24 + DlgDUPCONTENTS, // 25 + DlgDUPPIC, // 26 + DlgDUPPICDIFF, // 27 + DlgDUPPICSIZE, // 28 + DlgDUPPICFMT, // 29 + DlgDUPMUSIC, // 30 + DlgDUPMUSICARTIST, // 31 + DlgDUPMUSICTITLE, // 32 + DlgDUPMUSICDURL, // 33 + DlgDUPMUSICDURE, // 34 - DlgSEP1, //35 - DlgSUBFOLDER, //36 - DlgLMAXDEPTH, //37 - DlgEMAXDEPTH, //38 - DlgSCANSYMLINK, //39 - DlgLCMPSKIP, //40 - DlgECMPSKIP, //41 - DlgSTOPDIFFDUP, //42 - DlgFILTER, //43 - DlgFILTERBOTTON,//44 - DlgSELECTED, //45 - DlgSELECTEDNEW, //46 - DlgONLYRIGHT, //47 - DlgIGNORMISSING,//48 - DlgLIGHTSYNC, //49 - DlgSHOWMSG, //50 - DlgSOUND, //51 - DlgDIALOG, //52 - DlgTOTALPROCESS,//53 + DlgSEP1, // 35 + DlgSUBFOLDER, // 36 + DlgLMAXDEPTH, // 37 + DlgEMAXDEPTH, // 38 + DlgSCANSYMLINK, // 39 + DlgLCMPSKIP, // 40 + DlgECMPSKIP, // 41 + DlgSTOPDIFFDUP, // 42 + DlgFILTER, // 43 + DlgFILTERBOTTON, // 44 + DlgSELECTED, // 45 + DlgSELECTEDNEW, // 46 + DlgONLYRIGHT, // 47 + DlgIGNORMISSING, // 48 + DlgLIGHTSYNC, // 49 + DlgSHOWMSG, // 50 + DlgSOUND, // 51 + DlgDIALOG, // 52 + DlgTOTALPROCESS, // 53 - DlgSEP2, //54 - DlgOK, //55 - DlgUNDERCURSOR, //56 - DlgCANCEL, //57 + DlgSEP2, // 54 + DlgOK, // 55 + DlgUNDERCURSOR, // 56 + DlgCANCEL, // 57 }; struct ParamStore { - int ID; - wchar_t *OptName; - int *Option; -} StoreOpt[] = { - {DlgBORDER, 0, 0}, - {DlgMODE, 0, 0}, - {DlgMODEBOX, L"Mode", &Opt.Mode}, + int ID; + wchar_t* OptName; + int* Option; +} StoreOpt[] = {{DlgBORDER, 0, 0}, + {DlgMODE, 0, 0}, + {DlgMODEBOX, L"Mode", &Opt.Mode}, - {DlgCMPCASE, L"CmpCase", &Opt.CmpCase}, - {DlgCMPSIZE, L"CmpSize", &Opt.CmpSize}, - {DlgCMPTIME, L"CmpTime", &Opt.CmpTime}, - {DlgSECONDS, L"Seconds", &Opt.Seconds}, - {DlgIGNORESEC, 0, 0}, - {DlgPRECISION, L"LowPrecisionTime", &Opt.LowPrecisionTime}, - {DlgTIMEZONE, L"IgnoreTimeZone", &Opt.IgnoreTimeZone}, - {DlgCMPCONTENTS, L"CmpContents", &Opt.CmpContents}, - {DlgDIFFTIME, L"OnlyTimeDiff", &Opt.OnlyTimeDiff}, - {DlgCACHE, L"Cache", &Opt.Cache}, - {DlgCACHEIGNORE, L"CacheIgnore", &Opt.CacheIgnore}, - {DlgCACHEUSE, 0, 0}, - {DlgCACHECLEAR, 0, 0}, - {DlgPARTLY, L"Partly", &Opt.Partly}, - {DlgPARTLYFULL, L"PartlyFull", &Opt.PartlyFull}, - {DlgLPARTLYKB, 0, 0}, - {DlgEPARTLYKB, L"PartlyKbSize", &Opt.PartlyKbSize}, - {DlgIGNORE, L"Ignore", &Opt.Ignore}, - {DlgIGNORETEMPL, L"IgnoreTemplates", &Opt.IgnoreTemplates}, + {DlgCMPCASE, L"CmpCase", &Opt.CmpCase}, + {DlgCMPSIZE, L"CmpSize", &Opt.CmpSize}, + {DlgCMPTIME, L"CmpTime", &Opt.CmpTime}, + {DlgSECONDS, L"Seconds", &Opt.Seconds}, + {DlgIGNORESEC, 0, 0}, + {DlgPRECISION, L"LowPrecisionTime", &Opt.LowPrecisionTime}, + {DlgTIMEZONE, L"IgnoreTimeZone", &Opt.IgnoreTimeZone}, + {DlgCMPCONTENTS, L"CmpContents", &Opt.CmpContents}, + {DlgDIFFTIME, L"OnlyTimeDiff", &Opt.OnlyTimeDiff}, + {DlgCACHE, L"Cache", &Opt.Cache}, + {DlgCACHEIGNORE, L"CacheIgnore", &Opt.CacheIgnore}, + {DlgCACHEUSE, 0, 0}, + {DlgCACHECLEAR, 0, 0}, + {DlgPARTLY, L"Partly", &Opt.Partly}, + {DlgPARTLYFULL, L"PartlyFull", &Opt.PartlyFull}, + {DlgLPARTLYKB, 0, 0}, + {DlgEPARTLYKB, L"PartlyKbSize", &Opt.PartlyKbSize}, + {DlgIGNORE, L"Ignore", &Opt.Ignore}, + {DlgIGNORETEMPL, L"IgnoreTemplates", &Opt.IgnoreTemplates}, - {DlgDUPPATH, 0, 0}, - {DlgDUPNAME, L"DupName", &Opt.DupName}, - {DlgDUPSIZE, L"DupSize", &Opt.DupSize}, - {DlgDUPCONTENTS, L"DupContents", &Opt.DupContents}, - {DlgDUPPIC, L"DupPic", &Opt.DupPic}, - {DlgDUPPICDIFF, L"DupPicDiff", &Opt.DupPicDiff}, - {DlgDUPPICSIZE, L"DupPicSize", &Opt.DupPicSize}, - {DlgDUPPICFMT, L"DupPicFmt", &Opt.DupPicFmt}, - {DlgDUPMUSIC, L"DupMusic", &Opt.DupMusic}, - {DlgDUPMUSICARTIST,L"DupMusicArtist", &Opt.DupMusicArtist}, - {DlgDUPMUSICTITLE,L"DupMusicTitle", &Opt.DupMusicTitle}, - {DlgDUPMUSICDURL,L"DupMusicDuration", &Opt.DupMusicDuration}, - {DlgDUPMUSICDURE,L"DupMusicDurationSec", &Opt.DupMusicDurationSec}, - - {DlgSEP1, 0, 0}, - {DlgSUBFOLDER, L"Subfolders", &Opt.Subfolders}, - {DlgLMAXDEPTH, 0, 0}, - {DlgEMAXDEPTH, L"MaxScanDepth", &Opt.MaxScanDepth}, - {DlgSCANSYMLINK, 0, 0}, - {DlgLCMPSKIP, L"SkipSubstr", &Opt.SkipSubstr}, - {DlgECMPSKIP, 0, 0}, - {DlgSTOPDIFFDUP, L"StopDiffDup", &Opt.StopDiffDup}, - {DlgFILTER, L"Filter", &Opt.Filter}, - {DlgFILTERBOTTON,0, 0}, - {DlgSELECTED, L"ProcessSelected", &Opt.ProcessSelected}, - {DlgSELECTEDNEW, L"SelectedNew", &Opt.SelectedNew}, - {DlgONLYRIGHT, L"SyncOnlyRight", &Opt.SyncOnlyRight}, - {DlgIGNORMISSING,L"IgnoreMissing", &Opt.IgnoreMissing}, - {DlgLIGHTSYNC, L"LightSync", &Opt.LightSync}, - {DlgSHOWMSG, L"ShowMsg", &Opt.ShowMsg}, - {DlgSOUND, L"Sound", &Opt.Sound}, - {DlgDIALOG, L"Dialog", &Opt.Dialog}, - {DlgTOTALPROCESS,L"TotalProgress", &Opt.TotalProgress} -}; + {DlgDUPPATH, 0, 0}, + {DlgDUPNAME, L"DupName", &Opt.DupName}, + {DlgDUPSIZE, L"DupSize", &Opt.DupSize}, + {DlgDUPCONTENTS, L"DupContents", &Opt.DupContents}, + {DlgDUPPIC, L"DupPic", &Opt.DupPic}, + {DlgDUPPICDIFF, L"DupPicDiff", &Opt.DupPicDiff}, + {DlgDUPPICSIZE, L"DupPicSize", &Opt.DupPicSize}, + {DlgDUPPICFMT, L"DupPicFmt", &Opt.DupPicFmt}, + {DlgDUPMUSIC, L"DupMusic", &Opt.DupMusic}, + {DlgDUPMUSICARTIST, L"DupMusicArtist", &Opt.DupMusicArtist}, + {DlgDUPMUSICTITLE, L"DupMusicTitle", &Opt.DupMusicTitle}, + {DlgDUPMUSICDURL, L"DupMusicDuration", &Opt.DupMusicDuration}, + {DlgDUPMUSICDURE, L"DupMusicDurationSec", &Opt.DupMusicDurationSec}, + {DlgSEP1, 0, 0}, + {DlgSUBFOLDER, L"Subfolders", &Opt.Subfolders}, + {DlgLMAXDEPTH, 0, 0}, + {DlgEMAXDEPTH, L"MaxScanDepth", &Opt.MaxScanDepth}, + {DlgSCANSYMLINK, 0, 0}, + {DlgLCMPSKIP, L"SkipSubstr", &Opt.SkipSubstr}, + {DlgECMPSKIP, 0, 0}, + {DlgSTOPDIFFDUP, L"StopDiffDup", &Opt.StopDiffDup}, + {DlgFILTER, L"Filter", &Opt.Filter}, + {DlgFILTERBOTTON, 0, 0}, + {DlgSELECTED, L"ProcessSelected", &Opt.ProcessSelected}, + {DlgSELECTEDNEW, L"SelectedNew", &Opt.SelectedNew}, + {DlgONLYRIGHT, L"SyncOnlyRight", &Opt.SyncOnlyRight}, + {DlgIGNORMISSING, L"IgnoreMissing", &Opt.IgnoreMissing}, + {DlgLIGHTSYNC, L"LightSync", &Opt.LightSync}, + {DlgSHOWMSG, L"ShowMsg", &Opt.ShowMsg}, + {DlgSOUND, L"Sound", &Opt.Sound}, + {DlgDIALOG, L"Dialog", &Opt.Dialog}, + {DlgTOTALPROCESS, L"TotalProgress", &Opt.TotalProgress}}; /**************************************************************************** * Обработчик диалога для ShowOptDialog ****************************************************************************/ -intptr_t WINAPI AdvCmpDlgOpt::ShowOptDialogProcThunk(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void *Param2) +intptr_t WINAPI AdvCmpDlgOpt::ShowOptDialogProcThunk(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void* Param2) { - AdvCmpDlgOpt* Class=(AdvCmpDlgOpt*)Info.SendDlgMessage(hDlg,DM_GETDLGDATA,0,0); - return Class->ShowOptDialogProc(hDlg,Msg,Param1,Param2); + AdvCmpDlgOpt* Class = (AdvCmpDlgOpt*) Info.SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); + return Class->ShowOptDialogProc(hDlg, Msg, Param1, Param2); } void AdvCmpDlgOpt::Close() { - bSkipSaveOpt=false; - // определены из диалога опций - if (Opt.Substr) { free(Opt.Substr); Opt.Substr=NULL; } - if (Opt.WinMergePath) { free(Opt.WinMergePath); Opt.WinMergePath=NULL; } - if (Opt.DupPath) { free(Opt.DupPath); Opt.DupPath=NULL; } - if (Opt.Filter) Info.FileFilterControl(Opt.hCustomFilter,FFCTL_FREEFILEFILTER,0,0); + bSkipSaveOpt = false; + // определены из диалога опций + if (Opt.Substr) + { + free(Opt.Substr); + Opt.Substr = NULL; + } + if (Opt.WinMergePath) + { + free(Opt.WinMergePath); + Opt.WinMergePath = NULL; + } + if (Opt.DupPath) + { + free(Opt.DupPath); + Opt.DupPath = NULL; + } + if (Opt.Filter) + Info.FileFilterControl(Opt.hCustomFilter, FFCTL_FREEFILEFILTER, 0, 0); } -intptr_t WINAPI AdvCmpDlgOpt::ShowOptDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void *Param2) +intptr_t WINAPI AdvCmpDlgOpt::ShowOptDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void* Param2) { + switch (Msg) + { + case DN_INITDIALOG: { + bool CheckSelect = false; + if (LPanel.PInfo.SelectedItemsNumber) + { + FarGetPluginPanelItem FGPPI = {sizeof(FarGetPluginPanelItem), 0, 0}; + FGPPI.Item = (PluginPanelItem*) malloc(FGPPI.Size = Info.PanelControl(LPanel.hPanel, FCTL_GETSELECTEDPANELITEM, 0, &FGPPI)); + if (FGPPI.Item) + { + Info.PanelControl(LPanel.hPanel, FCTL_GETSELECTEDPANELITEM, 0, &FGPPI); + if (FGPPI.Item->Flags & PPIF_SELECTED) + CheckSelect = true; + free(FGPPI.Item); + } + } + if (!CheckSelect && RPanel.PInfo.SelectedItemsNumber) + { + FarGetPluginPanelItem FGPPI = {sizeof(FarGetPluginPanelItem), 0, 0}; + FGPPI.Item = (PluginPanelItem*) malloc(FGPPI.Size = Info.PanelControl(RPanel.hPanel, FCTL_GETSELECTEDPANELITEM, 0, &FGPPI)); + if (FGPPI.Item) + { + Info.PanelControl(RPanel.hPanel, FCTL_GETSELECTEDPANELITEM, 0, &FGPPI); + if (FGPPI.Item->Flags & PPIF_SELECTED) + CheckSelect = true; + free(FGPPI.Item); + } + } + if (!CheckSelect) + { + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSELECTED, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSELECTED, (void*) false); + } + //------------- + if ((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN)) + { + Opt.Mode = MODE_CMP; + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgMODEBOX, (void*) false); + } + //------------- + if (Opt.Mode == MODE_CMP) + { + for (int i = DlgDUPPATH; i <= DlgDUPMUSICDURE; i++) Info.SendDlgMessage(hDlg, DM_SHOWITEM, i, 0); - switch (Msg) - { - case DN_INITDIALOG: - { - bool CheckSelect=false; - if (LPanel.PInfo.SelectedItemsNumber) - { - FarGetPluginPanelItem FGPPI={sizeof(FarGetPluginPanelItem),0,0}; - FGPPI.Item=(PluginPanelItem*)malloc(FGPPI.Size=Info.PanelControl(LPanel.hPanel,FCTL_GETSELECTEDPANELITEM,0,&FGPPI)); - if (FGPPI.Item) - { - Info.PanelControl(LPanel.hPanel,FCTL_GETSELECTEDPANELITEM,0,&FGPPI); - if (FGPPI.Item->Flags&PPIF_SELECTED) CheckSelect=true; - free(FGPPI.Item); - } - } - if (!CheckSelect && RPanel.PInfo.SelectedItemsNumber) - { - FarGetPluginPanelItem FGPPI={sizeof(FarGetPluginPanelItem),0,0}; - FGPPI.Item=(PluginPanelItem*)malloc(FGPPI.Size=Info.PanelControl(RPanel.hPanel,FCTL_GETSELECTEDPANELITEM,0,&FGPPI)); - if (FGPPI.Item) - { - Info.PanelControl(RPanel.hPanel,FCTL_GETSELECTEDPANELITEM,0,&FGPPI); - if (FGPPI.Item->Flags&PPIF_SELECTED) CheckSelect=true; - free(FGPPI.Item); - } - } - if (!CheckSelect) - { - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSELECTED,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSELECTED,(void*)false); - } - //------------- - if ((LPanel.PInfo.Flags&PFLAGS_PLUGIN) || (RPanel.PInfo.Flags&PFLAGS_PLUGIN)) - { - Opt.Mode=MODE_CMP; - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgMODEBOX,(void*)false); - } - //------------- - if (Opt.Mode==MODE_CMP) - { - for(int i=DlgDUPPATH; i<=DlgDUPMUSICDURE; i++) - Info.SendDlgMessage(hDlg,DM_SHOWITEM,i,0); - - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgONLYRIGHT,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgONLYRIGHT,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLIGHTSYNC,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgLIGHTSYNC,(void*)BSTATE_UNCHECKED); - } - else - { - if (Opt.Mode==MODE_SYNC) - { - for(int i=DlgDUPPATH; i<=DlgDUPMUSICDURE; i++) - Info.SendDlgMessage(hDlg,DM_SHOWITEM,i,0); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSTOPDIFFDUP,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSTOPDIFFDUP,(void*)BSTATE_UNCHECKED); - } - else if (Opt.Mode==MODE_DUP) // дубликаты - { - for(int i=DlgCMPCASE; i<=DlgIGNORETEMPL; i++) - Info.SendDlgMessage(hDlg,DM_SHOWITEM,i,0); - - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgONLYRIGHT,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgONLYRIGHT,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORMISSING,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgIGNORMISSING,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLIGHTSYNC,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgLIGHTSYNC,(void*)BSTATE_UNCHECKED); - } - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSCANSYMLINK,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSCANSYMLINK,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLCMPSKIP,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgLCMPSKIP,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgECMPSKIP,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSELECTEDNEW,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSELECTEDNEW,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDIALOG,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgDIALOG,(void*)BSTATE_CHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgUNDERCURSOR,(void*)false); - } - //------------порядок важен! идем из глубины опций наверх - if (Opt.LowPrecisionTime) - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgPRECISION,(void*)BSTATE_CHECKED); - else - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgIGNORESEC,(void*)BSTATE_CHECKED); - if (!Opt.Seconds) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORESEC,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPRECISION,(void*)false); - } - if (!Opt.CmpTime) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSECONDS,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORESEC,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPRECISION,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgTIMEZONE,(void*)false); - } - - //-------- - if ( !( ((LPanel.PInfo.Flags&PFLAGS_REALNAMES) && (RPanel.PInfo.Flags&PFLAGS_REALNAMES)) || - ((LPanel.PInfo.Flags&PFLAGS_REALNAMES) && RPanel.bARC) || - ((RPanel.PInfo.Flags&PFLAGS_REALNAMES) && LPanel.bARC) || - (LPanel.bARC && RPanel.bARC) ) ) - { - Opt.CmpContents=0; - Opt.Cache=0; - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgCMPCONTENTS,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCMPCONTENTS,(void*)false); - } - if (Opt.CmpContents && (LPanel.bARC || RPanel.bARC)) - { - Opt.Partly=0; - Opt.Ignore=0; - Opt.Cache=0; - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPARTLY,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHE,(void*)false); - } - //------------ порядок важен! идем из глубины опций наверх - if (Opt.PartlyFull) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEPARTLYKB,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgPARTLYFULL,(void*)BSTATE_CHECKED); - } - else - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgLPARTLYKB,(void*)BSTATE_CHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgONLYRIGHT, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgONLYRIGHT, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLIGHTSYNC, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgLIGHTSYNC, (void*) BSTATE_UNCHECKED); + } + else + { + if (Opt.Mode == MODE_SYNC) + { + for (int i = DlgDUPPATH; i <= DlgDUPMUSICDURE; i++) Info.SendDlgMessage(hDlg, DM_SHOWITEM, i, 0); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSTOPDIFFDUP, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSTOPDIFFDUP, (void*) BSTATE_UNCHECKED); + } + else if (Opt.Mode == MODE_DUP) // дубликаты + { + for (int i = DlgCMPCASE; i <= DlgIGNORETEMPL; i++) Info.SendDlgMessage(hDlg, DM_SHOWITEM, i, 0); - if (!Opt.Partly) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPARTLYFULL,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLPARTLYKB,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEPARTLYKB,(void*)false); - } - if (!Opt.Ignore) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORETEMPL,(void*)false); - } - //------------порядок важен! идем из глубины опций наверх - if (Opt.CacheIgnore) - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgCACHEIGNORE,(void*)BSTATE_CHECKED); - else - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgCACHEUSE,(void*)BSTATE_CHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgONLYRIGHT, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgONLYRIGHT, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORMISSING, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgIGNORMISSING, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLIGHTSYNC, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgLIGHTSYNC, (void*) BSTATE_UNCHECKED); + } + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSCANSYMLINK, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSCANSYMLINK, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLCMPSKIP, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgLCMPSKIP, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgECMPSKIP, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSELECTEDNEW, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSELECTEDNEW, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDIALOG, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgDIALOG, (void*) BSTATE_CHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgUNDERCURSOR, (void*) false); + } + //------------порядок важен! идем из глубины опций наверх + if (Opt.LowPrecisionTime) + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgPRECISION, (void*) BSTATE_CHECKED); + else + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgIGNORESEC, (void*) BSTATE_CHECKED); + if (!Opt.Seconds) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORESEC, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPRECISION, (void*) false); + } + if (!Opt.CmpTime) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSECONDS, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORESEC, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPRECISION, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgTIMEZONE, (void*) false); + } - if (!Opt.Cache) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEIGNORE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEUSE,(void*)false); - } + //-------- + if (!(((LPanel.PInfo.Flags & PFLAGS_REALNAMES) && (RPanel.PInfo.Flags & PFLAGS_REALNAMES)) || + ((LPanel.PInfo.Flags & PFLAGS_REALNAMES) && RPanel.bARC) || ((RPanel.PInfo.Flags & PFLAGS_REALNAMES) && LPanel.bARC) || + (LPanel.bARC && RPanel.bARC))) + { + Opt.CmpContents = 0; + Opt.Cache = 0; + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgCMPCONTENTS, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCMPCONTENTS, (void*) false); + } + if (Opt.CmpContents && (LPanel.bARC || RPanel.bARC)) + { + Opt.Partly = 0; + Opt.Ignore = 0; + Opt.Cache = 0; + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPARTLY, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHE, (void*) false); + } + //------------ порядок важен! идем из глубины опций наверх + if (Opt.PartlyFull) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEPARTLYKB, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgPARTLYFULL, (void*) BSTATE_CHECKED); + } + else + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgLPARTLYKB, (void*) BSTATE_CHECKED); - if (!Opt.CmpContents) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDIFFTIME,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPARTLY,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPARTLYFULL,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLPARTLYKB,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEPARTLYKB,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORETEMPL,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEIGNORE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEUSE,(void*)false); - } - //----------- - if (!Cache.ItemsNumber) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHECLEAR,(void*)false); - //------------ - if (LPanel.bTMP || RPanel.bTMP || (!LPanel.bDir && !RPanel.bDir)) - { - Opt.Subfolders=0; - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSUBFOLDER,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSUBFOLDER,(void*)false); - } - if (Opt.Subfolders!=2) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLMAXDEPTH,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEMAXDEPTH,(void*)false); - } - //------ - if (!Opt.DupPic || !bGflLoaded) - { - if (!bGflLoaded) - { - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgDUPPIC,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPIC,(void*)false); - } - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICDIFF,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICSIZE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICFMT,(void*)false); - } - if (!Opt.DupMusicDuration) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURE,(void*)false); - if (!Opt.DupMusic || !bBASSLoaded) - { - if (!bBASSLoaded) - { - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgDUPMUSIC,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSIC,(void*)false); - } - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICARTIST,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICTITLE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURL,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURE,(void*)false); - } - if (!Opt.DupContents) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPIC,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICDIFF,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICSIZE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICFMT,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSIC,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICARTIST,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICTITLE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURL,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURE,(void*)false); - } - //------ - Opt.ScanSymlink=GetFarSetting(FSSF_SYSTEM,L"ScanJunction")?true:false; - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSCANSYMLINK,(void*)(Opt.ScanSymlink?BSTATE_CHECKED:BSTATE_UNCHECKED)); - if (!Opt.Subfolders || Opt.Mode!=MODE_CMP || (LPanel.PInfo.Flags&PFLAGS_PLUGIN) || (RPanel.PInfo.Flags&PFLAGS_PLUGIN)) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSCANSYMLINK,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSCANSYMLINK,(void*)BSTATE_UNCHECKED); - } - //------------ - if (!Opt.Filter) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgFILTERBOTTON,(void*)false); - //------------ - if (!Opt.SkipSubstr) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgECMPSKIP,(void*)false); - //------------ - if (LPanel.bTMP || RPanel.bTMP) - { - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgDIALOG,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDIALOG,(void*)false); - } - //------------ - if (!LPanel.bCurFile || !RPanel.bCurFile || Opt.Mode!=MODE_CMP) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgUNDERCURSOR,(void*)false); + if (!Opt.Partly) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPARTLYFULL, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLPARTLYKB, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEPARTLYKB, (void*) false); + } + if (!Opt.Ignore) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORETEMPL, (void*) false); + } + //------------порядок важен! идем из глубины опций наверх + if (Opt.CacheIgnore) + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgCACHEIGNORE, (void*) BSTATE_CHECKED); + else + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgCACHEUSE, (void*) BSTATE_CHECKED); - // определим остальные опции... - Opt.ProcessHidden=GetFarSetting(FSSF_PANEL,L"ShowHidden")?true:false; - Opt.hCustomFilter=INVALID_HANDLE_VALUE; + if (!Opt.Cache) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEIGNORE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEUSE, (void*) false); + } - bSkipSaveOpt=false; + if (!Opt.CmpContents) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDIFFTIME, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPARTLY, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPARTLYFULL, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLPARTLYKB, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEPARTLYKB, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORETEMPL, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEIGNORE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEUSE, (void*) false); + } + //----------- + if (!Cache.ItemsNumber) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHECLEAR, (void*) false); + //------------ + if (LPanel.bTMP || RPanel.bTMP || (!LPanel.bDir && !RPanel.bDir)) + { + Opt.Subfolders = 0; + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSUBFOLDER, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSUBFOLDER, (void*) false); + } + if (Opt.Subfolders != 2) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLMAXDEPTH, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEMAXDEPTH, (void*) false); + } + //------ + if (!Opt.DupPic || !bGflLoaded) + { + if (!bGflLoaded) + { + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgDUPPIC, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPIC, (void*) false); + } + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICDIFF, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICSIZE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICFMT, (void*) false); + } + if (!Opt.DupMusicDuration) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURE, (void*) false); + if (!Opt.DupMusic || !bBASSLoaded) + { + if (!bBASSLoaded) + { + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgDUPMUSIC, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSIC, (void*) false); + } + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICARTIST, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICTITLE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURL, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURE, (void*) false); + } + if (!Opt.DupContents) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPIC, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICDIFF, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICSIZE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICFMT, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSIC, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICARTIST, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICTITLE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURL, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURE, (void*) false); + } + //------ + Opt.ScanSymlink = GetFarSetting(FSSF_SYSTEM, L"ScanJunction") ? true : false; + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSCANSYMLINK, (void*) (Opt.ScanSymlink ? BSTATE_CHECKED : BSTATE_UNCHECKED)); + if (!Opt.Subfolders || Opt.Mode != MODE_CMP || (LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN)) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSCANSYMLINK, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSCANSYMLINK, (void*) BSTATE_UNCHECKED); + } + //------------ + if (!Opt.Filter) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgFILTERBOTTON, (void*) false); + //------------ + if (!Opt.SkipSubstr) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgECMPSKIP, (void*) false); + //------------ + if (LPanel.bTMP || RPanel.bTMP) + { + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgDIALOG, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDIALOG, (void*) false); + } + //------------ + if (!LPanel.bCurFile || !RPanel.bCurFile || Opt.Mode != MODE_CMP) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgUNDERCURSOR, (void*) false); - return true; - } + // определим остальные опции... + Opt.ProcessHidden = GetFarSetting(FSSF_PANEL, L"ShowHidden") ? true : false; + Opt.hCustomFilter = INVALID_HANDLE_VALUE; - /************************************************************************/ + bSkipSaveOpt = false; - case DN_LISTHOTKEY: // для плагина это - case DN_LISTCHANGE: // одно и тоже - if (Param1 == DlgMODEBOX) - { - if (Param2 == (void*)MODE_DUP) - { - for(int i=DlgCMPCASE; i<=DlgIGNORETEMPL; i++) - Info.SendDlgMessage(hDlg,DM_SHOWITEM,i,0); - for(int i=DlgDUPPATH; i<=DlgDUPMUSICDURE; i++) - Info.SendDlgMessage(hDlg,DM_SHOWITEM,i,(void*)1); + return true; + } - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSCANSYMLINK,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSCANSYMLINK,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLCMPSKIP,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgLCMPSKIP,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgECMPSKIP,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSTOPDIFFDUP,(void*)true); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSTOPDIFFDUP,(void*)(Opt.StopDiffDup?BSTATE_CHECKED:BSTATE_UNCHECKED)); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSELECTEDNEW,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSELECTEDNEW,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORMISSING,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgIGNORMISSING,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDIALOG,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgDIALOG,(void*)BSTATE_CHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgUNDERCURSOR,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgONLYRIGHT,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgONLYRIGHT,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLIGHTSYNC,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgLIGHTSYNC,(void*)BSTATE_UNCHECKED); - } - else - { - for(int i=DlgCMPCASE; i<=DlgIGNORETEMPL; i++) - Info.SendDlgMessage(hDlg,DM_SHOWITEM,i,(void*)1); - for(int i=DlgDUPPATH; i<=DlgDUPMUSICDURE; i++) - Info.SendDlgMessage(hDlg,DM_SHOWITEM,i,0); + /************************************************************************/ - if (Param2 == (void*)MODE_CMP) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSCANSYMLINK,(void*)(Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgSUBFOLDER,0) && !((LPanel.PInfo.Flags&PFLAGS_PLUGIN) || (RPanel.PInfo.Flags&PFLAGS_PLUGIN))) ); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSCANSYMLINK,(void*)(Opt.ScanSymlink && Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgSUBFOLDER,0)?BSTATE_CHECKED:BSTATE_UNCHECKED)); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLCMPSKIP,(void*)true); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgLCMPSKIP,(void*)(Opt.SkipSubstr?BSTATE_CHECKED:BSTATE_UNCHECKED)); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgECMPSKIP,(void*)(Opt.SkipSubstr?true:false)); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSTOPDIFFDUP,(void*)true); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSTOPDIFFDUP,(void*)(Opt.StopDiffDup?BSTATE_CHECKED:BSTATE_UNCHECKED)); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSELECTEDNEW,(void*)true); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSELECTEDNEW,(void*)(Opt.SelectedNew?BSTATE_CHECKED:BSTATE_UNCHECKED)); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORMISSING,(void*)true); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgIGNORMISSING,(void*)(Opt.IgnoreMissing==2?BSTATE_3STATE:(Opt.IgnoreMissing?BSTATE_CHECKED:BSTATE_UNCHECKED))); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDIALOG,(void*)true); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgDIALOG,(void*)(Opt.Dialog?BSTATE_CHECKED:BSTATE_UNCHECKED)); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgUNDERCURSOR,(void*)(!LPanel.bCurFile || !RPanel.bCurFile?false:true)); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgONLYRIGHT,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgONLYRIGHT,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLIGHTSYNC,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgLIGHTSYNC,(void*)BSTATE_UNCHECKED); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSCANSYMLINK,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSCANSYMLINK,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLCMPSKIP,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgLCMPSKIP,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgECMPSKIP,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSTOPDIFFDUP,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSTOPDIFFDUP,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSELECTEDNEW,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSELECTEDNEW,(void*)BSTATE_UNCHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORMISSING,(void*)true); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgIGNORMISSING,(void*)(Opt.IgnoreMissing==2?BSTATE_3STATE:(Opt.IgnoreMissing?BSTATE_CHECKED:BSTATE_UNCHECKED))); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDIALOG,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgDIALOG,(void*)BSTATE_CHECKED); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgUNDERCURSOR,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgONLYRIGHT,(void*)true); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgONLYRIGHT,(void*)(Opt.SyncOnlyRight==2?BSTATE_3STATE:(Opt.SyncOnlyRight?BSTATE_CHECKED:BSTATE_UNCHECKED))); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLIGHTSYNC,(void*)true); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgLIGHTSYNC,(void*)(Opt.LightSync?BSTATE_CHECKED:BSTATE_UNCHECKED)); - } - } - return Msg==DN_LISTHOTKEY?false:true; // апи требует разного возврата - сделаем разным - } - break; + case DN_LISTHOTKEY: // для плагина это + case DN_LISTCHANGE: // одно и тоже + if (Param1 == DlgMODEBOX) + { + if (Param2 == (void*) MODE_DUP) + { + for (int i = DlgCMPCASE; i <= DlgIGNORETEMPL; i++) Info.SendDlgMessage(hDlg, DM_SHOWITEM, i, 0); + for (int i = DlgDUPPATH; i <= DlgDUPMUSICDURE; i++) Info.SendDlgMessage(hDlg, DM_SHOWITEM, i, (void*) 1); - /************************************************************************/ + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSCANSYMLINK, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSCANSYMLINK, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLCMPSKIP, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgLCMPSKIP, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgECMPSKIP, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSTOPDIFFDUP, (void*) true); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSTOPDIFFDUP, (void*) (Opt.StopDiffDup ? BSTATE_CHECKED : BSTATE_UNCHECKED)); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSELECTEDNEW, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSELECTEDNEW, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORMISSING, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgIGNORMISSING, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDIALOG, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgDIALOG, (void*) BSTATE_CHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgUNDERCURSOR, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgONLYRIGHT, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgONLYRIGHT, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLIGHTSYNC, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgLIGHTSYNC, (void*) BSTATE_UNCHECKED); + } + else + { + for (int i = DlgCMPCASE; i <= DlgIGNORETEMPL; i++) Info.SendDlgMessage(hDlg, DM_SHOWITEM, i, (void*) 1); + for (int i = DlgDUPPATH; i <= DlgDUPMUSICDURE; i++) Info.SendDlgMessage(hDlg, DM_SHOWITEM, i, 0); - case DN_BTNCLICK: - if (Param1 == DlgCMPTIME) - { - if (Param2) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSECONDS,(void*)true); - if (Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgSECONDS,0)) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORESEC,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPRECISION,(void*)true); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORESEC,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPRECISION,(void*)false); - } - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgTIMEZONE,(void*)true); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSECONDS,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORESEC,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPRECISION,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgTIMEZONE,(void*)false); - } - } - //------------ - else if (Param1 == DlgSECONDS) - { - if (Param2) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORESEC,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPRECISION,(void*)true); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORESEC,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPRECISION,(void*)false); - } - } - //----------- - else if (Param1 == DlgCMPCONTENTS) - { - if (Param2) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDIFFTIME,(void*)true); + if (Param2 == (void*) MODE_CMP) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSCANSYMLINK, + (void*) (Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgSUBFOLDER, 0) && + !((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN)))); + Info.SendDlgMessage( + hDlg, DM_SETCHECK, DlgSCANSYMLINK, + (void*) (Opt.ScanSymlink && Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgSUBFOLDER, 0) ? BSTATE_CHECKED : BSTATE_UNCHECKED)); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLCMPSKIP, (void*) true); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgLCMPSKIP, (void*) (Opt.SkipSubstr ? BSTATE_CHECKED : BSTATE_UNCHECKED)); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgECMPSKIP, (void*) (Opt.SkipSubstr ? true : false)); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSTOPDIFFDUP, (void*) true); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSTOPDIFFDUP, (void*) (Opt.StopDiffDup ? BSTATE_CHECKED : BSTATE_UNCHECKED)); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSELECTEDNEW, (void*) true); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSELECTEDNEW, (void*) (Opt.SelectedNew ? BSTATE_CHECKED : BSTATE_UNCHECKED)); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORMISSING, (void*) true); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgIGNORMISSING, + (void*) (Opt.IgnoreMissing == 2 ? BSTATE_3STATE : (Opt.IgnoreMissing ? BSTATE_CHECKED : BSTATE_UNCHECKED))); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDIALOG, (void*) true); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgDIALOG, (void*) (Opt.Dialog ? BSTATE_CHECKED : BSTATE_UNCHECKED)); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgUNDERCURSOR, (void*) (!LPanel.bCurFile || !RPanel.bCurFile ? false : true)); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgONLYRIGHT, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgONLYRIGHT, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLIGHTSYNC, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgLIGHTSYNC, (void*) BSTATE_UNCHECKED); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSCANSYMLINK, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSCANSYMLINK, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLCMPSKIP, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgLCMPSKIP, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgECMPSKIP, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSTOPDIFFDUP, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSTOPDIFFDUP, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSELECTEDNEW, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSELECTEDNEW, (void*) BSTATE_UNCHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORMISSING, (void*) true); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgIGNORMISSING, + (void*) (Opt.IgnoreMissing == 2 ? BSTATE_3STATE : (Opt.IgnoreMissing ? BSTATE_CHECKED : BSTATE_UNCHECKED))); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDIALOG, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgDIALOG, (void*) BSTATE_CHECKED); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgUNDERCURSOR, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgONLYRIGHT, (void*) true); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgONLYRIGHT, + (void*) (Opt.SyncOnlyRight == 2 ? BSTATE_3STATE : (Opt.SyncOnlyRight ? BSTATE_CHECKED : BSTATE_UNCHECKED))); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLIGHTSYNC, (void*) true); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgLIGHTSYNC, (void*) (Opt.LightSync ? BSTATE_CHECKED : BSTATE_UNCHECKED)); + } + } + return Msg == DN_LISTHOTKEY ? false : true; // апи требует разного возврата - сделаем разным + } + break; - if (!(LPanel.bARC || RPanel.bARC)) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPARTLY,(void*)true); - if (Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgPARTLY,0)) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPARTLYFULL,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLPARTLYKB,(void*)true); - if (Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgLPARTLYKB,0)) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEPARTLYKB,(void*)true); - else - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEPARTLYKB,(void*)false); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPARTLYFULL,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLPARTLYKB,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEPARTLYKB,(void*)false); - } + /************************************************************************/ - if (!(LPanel.bARC || RPanel.bARC)) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORE,(void*)true); - if (Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgIGNORE,0)) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORETEMPL,(void*)true); - else - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORETEMPL,(void*)false); + case DN_BTNCLICK: + if (Param1 == DlgCMPTIME) + { + if (Param2) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSECONDS, (void*) true); + if (Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgSECONDS, 0)) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORESEC, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPRECISION, (void*) true); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORESEC, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPRECISION, (void*) false); + } + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgTIMEZONE, (void*) true); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSECONDS, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORESEC, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPRECISION, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgTIMEZONE, (void*) false); + } + } + //------------ + else if (Param1 == DlgSECONDS) + { + if (Param2) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORESEC, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPRECISION, (void*) true); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORESEC, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPRECISION, (void*) false); + } + } + //----------- + else if (Param1 == DlgCMPCONTENTS) + { + if (Param2) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDIFFTIME, (void*) true); - if (!(LPanel.bARC || RPanel.bARC)) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHE,(void*)true); - if (Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgCACHE,0)) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEIGNORE,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEUSE,(void*)true); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEIGNORE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEUSE,(void*)false); - } - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDIFFTIME,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEIGNORE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEUSE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPARTLY,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPARTLYFULL,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLPARTLYKB,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEPARTLYKB,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORETEMPL,(void*)false); - } - } - //------------ - else if (Param1 == DlgCACHE) - { - if (Param2) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEIGNORE,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEUSE,(void*)true); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEIGNORE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHEUSE,(void*)false); - } - } - //------------ - else if (Param1 == DlgPARTLY) - { - if (Param2) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPARTLYFULL,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLPARTLYKB,(void*)true); - if (Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgLPARTLYKB,0)) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEPARTLYKB,(void*)true); - else - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEPARTLYKB,(void*)false); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgPARTLYFULL,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLPARTLYKB,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEPARTLYKB,(void*)false); - } - } - //------------ - else if (Param1 == DlgLPARTLYKB) - { - if (Param2) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEPARTLYKB,(void*)true); - else - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEPARTLYKB,(void*)false); - } - //------------ - else if (Param1 == DlgIGNORE) - { - if (Param2) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORETEMPL,(void*)true); - else - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgIGNORETEMPL,(void*)false); - } - //------------ - else if (Param1 == DlgSUBFOLDER) - { - if ((int)Param2 == MODE_SYNC) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLMAXDEPTH,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEMAXDEPTH,(void*)false); - if (!((LPanel.PInfo.Flags&PFLAGS_PLUGIN) || (RPanel.PInfo.Flags&PFLAGS_PLUGIN)) && !Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,DlgMODEBOX,0)) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSCANSYMLINK,(void*)true); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSCANSYMLINK,(void*)(Opt.ScanSymlink?BSTATE_CHECKED:BSTATE_UNCHECKED)); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSCANSYMLINK,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSCANSYMLINK,(void*)BSTATE_UNCHECKED); - } - } - else if ((int)Param2 == MODE_DUP) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLMAXDEPTH,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEMAXDEPTH,(void*)true); - if (!((LPanel.PInfo.Flags&PFLAGS_PLUGIN) || (RPanel.PInfo.Flags&PFLAGS_PLUGIN)) && !Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,DlgMODEBOX,0)) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSCANSYMLINK,(void*)true); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSCANSYMLINK,(void*)(Opt.ScanSymlink?BSTATE_CHECKED:BSTATE_UNCHECKED)); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSCANSYMLINK,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSCANSYMLINK,(void*)BSTATE_UNCHECKED); - } - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgLMAXDEPTH,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgEMAXDEPTH,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgSCANSYMLINK,(void*)false); - Info.SendDlgMessage(hDlg,DM_SETCHECK,DlgSCANSYMLINK,(void*)BSTATE_UNCHECKED); - } - } - //------------ - else if (Param1 == DlgFILTER) - { - if (Param2) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgFILTERBOTTON,(void*)true); - else - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgFILTERBOTTON,(void*)false); - } - //------------ - else if (Param1 == DlgLCMPSKIP) - { - if (Param2) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgECMPSKIP,(void*)true); - else - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgECMPSKIP,(void*)false); - } - else if (Param1 == DlgDUPCONTENTS) - { - if (Param2) - { - if (bGflLoaded) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPIC,(void*)true); - if (bGflLoaded && Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgDUPPIC,0)) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICDIFF,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICSIZE,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICFMT,(void*)true); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICDIFF,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICSIZE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICFMT,(void*)false); - } + if (!(LPanel.bARC || RPanel.bARC)) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPARTLY, (void*) true); + if (Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgPARTLY, 0)) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPARTLYFULL, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLPARTLYKB, (void*) true); + if (Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgLPARTLYKB, 0)) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEPARTLYKB, (void*) true); + else + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEPARTLYKB, (void*) false); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPARTLYFULL, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLPARTLYKB, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEPARTLYKB, (void*) false); + } - if (bBASSLoaded) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSIC,(void*)true); - if (bBASSLoaded && Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgDUPMUSIC,0)) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICARTIST,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICTITLE,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURL,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURE,(void*)true); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICARTIST,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICTITLE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURL,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURE,(void*)false); - } - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPIC,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICDIFF,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICSIZE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICFMT,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSIC,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICARTIST,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICTITLE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURL,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURE,(void*)false); - } - } - else if (Param1 == DlgDUPPIC) - { - if (Param2) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICDIFF,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICSIZE,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICFMT,(void*)true); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICDIFF,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICSIZE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPPICFMT,(void*)false); - } - } - else if (Param1 == DlgDUPMUSIC) - { - if (Param2) - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICARTIST,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICTITLE,(void*)true); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURL,(void*)true); - if (Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgDUPMUSICDURL,0)) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURE,(void*)true); - } - else - { - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICARTIST,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICTITLE,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURL,(void*)false); - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURE,(void*)false); - } - } - else if (Param1 == DlgDUPMUSICDURL) - { - if (Param2) - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURE,(void*)true); - else - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgDUPMUSICDURE,(void*)false); - } - break; + if (!(LPanel.bARC || RPanel.bARC)) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORE, (void*) true); + if (Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgIGNORE, 0)) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORETEMPL, (void*) true); + else + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORETEMPL, (void*) false); + if (!(LPanel.bARC || RPanel.bARC)) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHE, (void*) true); + if (Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgCACHE, 0)) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEIGNORE, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEUSE, (void*) true); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEIGNORE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEUSE, (void*) false); + } + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDIFFTIME, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEIGNORE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEUSE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPARTLY, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPARTLYFULL, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLPARTLYKB, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEPARTLYKB, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORETEMPL, (void*) false); + } + } + //------------ + else if (Param1 == DlgCACHE) + { + if (Param2) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEIGNORE, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEUSE, (void*) true); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEIGNORE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHEUSE, (void*) false); + } + } + //------------ + else if (Param1 == DlgPARTLY) + { + if (Param2) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPARTLYFULL, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLPARTLYKB, (void*) true); + if (Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgLPARTLYKB, 0)) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEPARTLYKB, (void*) true); + else + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEPARTLYKB, (void*) false); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgPARTLYFULL, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLPARTLYKB, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEPARTLYKB, (void*) false); + } + } + //------------ + else if (Param1 == DlgLPARTLYKB) + { + if (Param2) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEPARTLYKB, (void*) true); + else + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEPARTLYKB, (void*) false); + } + //------------ + else if (Param1 == DlgIGNORE) + { + if (Param2) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORETEMPL, (void*) true); + else + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgIGNORETEMPL, (void*) false); + } + //------------ + else if (Param1 == DlgSUBFOLDER) + { + if ((int) Param2 == MODE_SYNC) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLMAXDEPTH, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEMAXDEPTH, (void*) false); + if (!((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN)) && + !Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, DlgMODEBOX, 0)) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSCANSYMLINK, (void*) true); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSCANSYMLINK, (void*) (Opt.ScanSymlink ? BSTATE_CHECKED : BSTATE_UNCHECKED)); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSCANSYMLINK, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSCANSYMLINK, (void*) BSTATE_UNCHECKED); + } + } + else if ((int) Param2 == MODE_DUP) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLMAXDEPTH, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEMAXDEPTH, (void*) true); + if (!((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN)) && + !Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, DlgMODEBOX, 0)) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSCANSYMLINK, (void*) true); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSCANSYMLINK, (void*) (Opt.ScanSymlink ? BSTATE_CHECKED : BSTATE_UNCHECKED)); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSCANSYMLINK, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSCANSYMLINK, (void*) BSTATE_UNCHECKED); + } + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgLMAXDEPTH, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgEMAXDEPTH, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgSCANSYMLINK, (void*) false); + Info.SendDlgMessage(hDlg, DM_SETCHECK, DlgSCANSYMLINK, (void*) BSTATE_UNCHECKED); + } + } + //------------ + else if (Param1 == DlgFILTER) + { + if (Param2) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgFILTERBOTTON, (void*) true); + else + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgFILTERBOTTON, (void*) false); + } + //------------ + else if (Param1 == DlgLCMPSKIP) + { + if (Param2) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgECMPSKIP, (void*) true); + else + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgECMPSKIP, (void*) false); + } + else if (Param1 == DlgDUPCONTENTS) + { + if (Param2) + { + if (bGflLoaded) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPIC, (void*) true); + if (bGflLoaded && Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgDUPPIC, 0)) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICDIFF, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICSIZE, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICFMT, (void*) true); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICDIFF, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICSIZE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICFMT, (void*) false); + } - /************************************************************************/ + if (bBASSLoaded) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSIC, (void*) true); + if (bBASSLoaded && Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgDUPMUSIC, 0)) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICARTIST, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICTITLE, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURL, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURE, (void*) true); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICARTIST, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICTITLE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURL, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURE, (void*) false); + } + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPIC, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICDIFF, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICSIZE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICFMT, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSIC, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICARTIST, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICTITLE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURL, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURE, (void*) false); + } + } + else if (Param1 == DlgDUPPIC) + { + if (Param2) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICDIFF, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICSIZE, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICFMT, (void*) true); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICDIFF, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICSIZE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPPICFMT, (void*) false); + } + } + else if (Param1 == DlgDUPMUSIC) + { + if (Param2) + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICARTIST, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICTITLE, (void*) true); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURL, (void*) true); + if (Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgDUPMUSICDURL, 0)) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURE, (void*) true); + } + else + { + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICARTIST, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICTITLE, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURL, (void*) false); + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURE, (void*) false); + } + } + else if (Param1 == DlgDUPMUSICDURL) + { + if (Param2) + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURE, (void*) true); + else + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgDUPMUSICDURE, (void*) false); + } + break; - case DN_CONTROLINPUT: - { - const INPUT_RECORD* record=(const INPUT_RECORD *)Param2; + /************************************************************************/ - if (record->EventType==KEY_EVENT && record->Event.KeyEvent.bKeyDown) - { - WORD vk=record->Event.KeyEvent.wVirtualKeyCode; - if (IsNone(record)) - { - if (vk == VK_F4 && Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgFILTER,0)) - Info.SendDlgMessage(hDlg,DM_CLOSE,DlgFILTERBOTTON,0); - else if (Opt.Mode!=MODE_DUP && vk == VK_F8 && Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHECLEAR,(void*)-1)) - Info.SendDlgMessage(hDlg,DM_CLOSE,DlgCACHECLEAR,0); - else if (vk == VK_F2 && Info.SendDlgMessage(hDlg,DM_ENABLE,DlgUNDERCURSOR,(void*)-1)) - Info.SendDlgMessage(hDlg,DM_CLOSE,DlgUNDERCURSOR,0); - } - else if (IsCtrl(record) && vk==VK_RETURN) - { - bSkipSaveOpt=true; - Info.SendDlgMessage(hDlg,DM_CLOSE,DlgOK,0); - } - } - } - break; + case DN_CONTROLINPUT: { + const INPUT_RECORD* record = (const INPUT_RECORD*) Param2; - /************************************************************************/ + if (record->EventType == KEY_EVENT && record->Event.KeyEvent.bKeyDown) + { + WORD vk = record->Event.KeyEvent.wVirtualKeyCode; + if (IsNone(record)) + { + if (vk == VK_F4 && Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgFILTER, 0)) + Info.SendDlgMessage(hDlg, DM_CLOSE, DlgFILTERBOTTON, 0); + else if (Opt.Mode != MODE_DUP && vk == VK_F8 && Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHECLEAR, (void*) -1)) + Info.SendDlgMessage(hDlg, DM_CLOSE, DlgCACHECLEAR, 0); + else if (vk == VK_F2 && Info.SendDlgMessage(hDlg, DM_ENABLE, DlgUNDERCURSOR, (void*) -1)) + Info.SendDlgMessage(hDlg, DM_CLOSE, DlgUNDERCURSOR, 0); + } + else if (IsCtrl(record) && vk == VK_RETURN) + { + bSkipSaveOpt = true; + Info.SendDlgMessage(hDlg, DM_CLOSE, DlgOK, 0); + } + } + } + break; - case DN_CLOSE: - if (Param1 == DlgFILTERBOTTON) - { - if (Opt.hCustomFilter == INVALID_HANDLE_VALUE) - Opt.Filter=Info.FileFilterControl(PANEL_NONE,FFCTL_CREATEFILEFILTER,FFT_CUSTOM,&Opt.hCustomFilter); - if (Opt.hCustomFilter != INVALID_HANDLE_VALUE) - Info.FileFilterControl(Opt.hCustomFilter,FFCTL_OPENFILTERSMENU,0,0); - return false; - } - else if (Param1 == DlgCACHECLEAR) - { - if (Cache.RCI) - { - if (GetFarSetting(FSSF_CONFIRMATIONS,L"Delete")) - { - wchar_t buf[100]; FSF.sprintf(buf,GetMsg(MClearCacheItems),Cache.ItemsNumber); - const wchar_t *MsgItems[]={ GetMsg(MClearCacheTitle),buf,GetMsg(MClearCacheBody) }; - if (!Info.Message(&MainGuid,&ClearCacheMsgGuid,FMSG_WARNING|FMSG_MB_YESNO,0,MsgItems,3,0)) - goto ClearCache; - } - else - ClearCache: - { - free(Cache.RCI); - Cache.RCI=0; - Cache.ItemsNumber=0; - Info.SendDlgMessage(hDlg,DM_ENABLE,DlgCACHECLEAR,(void*)false); - } - } - return false; - } - else if (Param1 == DlgUNDERCURSOR) - { - for (int i=DlgMODEBOX; i<=DlgIGNORETEMPL; i++) - { - if (StoreOpt[i].OptName) - { - if (i==DlgEPARTLYKB) - *StoreOpt[i].Option=FSF.atoi((const wchar_t *)Info.SendDlgMessage(hDlg,DM_GETCONSTTEXTPTR,i,0)); - else if (i==DlgMODEBOX || i==DlgIGNORETEMPL) - *StoreOpt[i].Option=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,i,0); - else - *StoreOpt[i].Option=Info.SendDlgMessage(hDlg,DM_GETCHECK,i,0); - } - } - FarSettingsCreate settings={sizeof(FarSettingsCreate),MainGuid,INVALID_HANDLE_VALUE}; - if (Info.SettingsControl(INVALID_HANDLE_VALUE,SCTL_CREATE,0,&settings)) - { - size_t Root=0; // корень ключа - for (int i=DlgMODEBOX; i<=DlgIGNORETEMPL; i++) - { - if (StoreOpt[i].OptName && Info.SendDlgMessage(hDlg,DM_ENABLE,i,(void*)-1)) - { - FarSettingsItem item={sizeof(FarSettingsItem),Root,StoreOpt[i].OptName,FST_QWORD}; - item.Number=*StoreOpt[i].Option; - Info.SettingsControl(settings.Handle,SCTL_SET,0,&item); - } - } - Info.SettingsControl(settings.Handle,SCTL_FREE,0,0); - } - return true; - } - else if (Param1 == DlgOK) - { - for (int i=DlgMODEBOX; i<(sizeof(StoreOpt)/sizeof(StoreOpt[0])); i++) - { - if (StoreOpt[i].OptName) - { - if (i==DlgEPARTLYKB || i==DlgEMAXDEPTH || i==DlgDUPMUSICDURE) - *StoreOpt[i].Option=FSF.atoi((const wchar_t *)Info.SendDlgMessage(hDlg,DM_GETCONSTTEXTPTR,i,0)); - else if (i==DlgMODEBOX || i==DlgIGNORETEMPL || i==DlgDUPPICDIFF) - *StoreOpt[i].Option=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,i,0); - else - *StoreOpt[i].Option=Info.SendDlgMessage(hDlg,DM_GETCHECK,i,0); - } - } + /************************************************************************/ - Opt.ScanSymlink=Info.SendDlgMessage(hDlg,DM_GETCHECK,DlgSCANSYMLINK,0); + case DN_CLOSE: + if (Param1 == DlgFILTERBOTTON) + { + if (Opt.hCustomFilter == INVALID_HANDLE_VALUE) + Opt.Filter = Info.FileFilterControl(PANEL_NONE, FFCTL_CREATEFILEFILTER, FFT_CUSTOM, &Opt.hCustomFilter); + if (Opt.hCustomFilter != INVALID_HANDLE_VALUE) + Info.FileFilterControl(Opt.hCustomFilter, FFCTL_OPENFILTERSMENU, 0, 0); + return false; + } + else if (Param1 == DlgCACHECLEAR) + { + if (Cache.RCI) + { + if (GetFarSetting(FSSF_CONFIRMATIONS, L"Delete")) + { + wchar_t buf[100]; + FSF.sprintf(buf, GetMsg(MClearCacheItems), Cache.ItemsNumber); + const wchar_t* MsgItems[] = {GetMsg(MClearCacheTitle), buf, GetMsg(MClearCacheBody)}; + if (!Info.Message(&MainGuid, &ClearCacheMsgGuid, FMSG_WARNING | FMSG_MB_YESNO, 0, MsgItems, 3, 0)) + goto ClearCache; + } + else + ClearCache : { + free(Cache.RCI); + Cache.RCI = 0; + Cache.ItemsNumber = 0; + Info.SendDlgMessage(hDlg, DM_ENABLE, DlgCACHECLEAR, (void*) false); + } + } + return false; + } + else if (Param1 == DlgUNDERCURSOR) + { + for (int i = DlgMODEBOX; i <= DlgIGNORETEMPL; i++) + { + if (StoreOpt[i].OptName) + { + if (i == DlgEPARTLYKB) + *StoreOpt[i].Option = FSF.atoi((const wchar_t*) Info.SendDlgMessage(hDlg, DM_GETCONSTTEXTPTR, i, 0)); + else if (i == DlgMODEBOX || i == DlgIGNORETEMPL) + *StoreOpt[i].Option = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, i, 0); + else + *StoreOpt[i].Option = Info.SendDlgMessage(hDlg, DM_GETCHECK, i, 0); + } + } + FarSettingsCreate settings = {sizeof(FarSettingsCreate), MainGuid, INVALID_HANDLE_VALUE}; + if (Info.SettingsControl(INVALID_HANDLE_VALUE, SCTL_CREATE, 0, &settings)) + { + size_t Root = 0; // корень ключа + for (int i = DlgMODEBOX; i <= DlgIGNORETEMPL; i++) + { + if (StoreOpt[i].OptName && Info.SendDlgMessage(hDlg, DM_ENABLE, i, (void*) -1)) + { + FarSettingsItem item = {sizeof(FarSettingsItem), Root, StoreOpt[i].OptName, FST_QWORD}; + item.Number = *StoreOpt[i].Option; + Info.SettingsControl(settings.Handle, SCTL_SET, 0, &item); + } + } + Info.SettingsControl(settings.Handle, SCTL_FREE, 0, 0); + } + return true; + } + else if (Param1 == DlgOK) + { + for (int i = DlgMODEBOX; i < (sizeof(StoreOpt) / sizeof(StoreOpt[0])); i++) + { + if (StoreOpt[i].OptName) + { + if (i == DlgEPARTLYKB || i == DlgEMAXDEPTH || i == DlgDUPMUSICDURE) + *StoreOpt[i].Option = FSF.atoi((const wchar_t*) Info.SendDlgMessage(hDlg, DM_GETCONSTTEXTPTR, i, 0)); + else if (i == DlgMODEBOX || i == DlgIGNORETEMPL || i == DlgDUPPICDIFF) + *StoreOpt[i].Option = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, i, 0); + else + *StoreOpt[i].Option = Info.SendDlgMessage(hDlg, DM_GETCHECK, i, 0); + } + } - Opt.Substr=NULL; - int len=Info.SendDlgMessage(hDlg,DM_GETTEXT,DlgECMPSKIP,0); - if (len) - { - Opt.Substr=(wchar_t*)malloc((len+1)*sizeof(wchar_t)); - if (Opt.Substr) - { - FarDialogItemData item={sizeof(FarDialogItemData),len,Opt.Substr}; - Info.SendDlgMessage(hDlg,DM_GETTEXT,DlgECMPSKIP,&item); - } - else - Opt.SkipSubstr=0; - } - else - { - Opt.SkipSubstr=0; - } + Opt.ScanSymlink = Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgSCANSYMLINK, 0); - Opt.DupPath=NULL; - len=Info.SendDlgMessage(hDlg,DM_GETTEXT,DlgDUPPATH,0); - if (len) - { - Opt.DupPath=(wchar_t*)malloc((len+1)*sizeof(wchar_t)); - if (Opt.DupPath) - { - FarDialogItemData item={sizeof(FarDialogItemData),len,Opt.DupPath}; - Info.SendDlgMessage(hDlg,DM_GETTEXT,DlgDUPPATH,&item); - } - } + Opt.Substr = NULL; + int len = Info.SendDlgMessage(hDlg, DM_GETTEXT, DlgECMPSKIP, 0); + if (len) + { + Opt.Substr = (wchar_t*) malloc((len + 1) * sizeof(wchar_t)); + if (Opt.Substr) + { + FarDialogItemData item = {sizeof(FarDialogItemData), len, Opt.Substr}; + Info.SendDlgMessage(hDlg, DM_GETTEXT, DlgECMPSKIP, &item); + } + else + Opt.SkipSubstr = 0; + } + else + { + Opt.SkipSubstr = 0; + } - if (Opt.Filter && Opt.hCustomFilter == INVALID_HANDLE_VALUE) - Opt.Filter=Info.FileFilterControl(PANEL_NONE,FFCTL_CREATEFILEFILTER,FFT_CUSTOM,&Opt.hCustomFilter); + Opt.DupPath = NULL; + len = Info.SendDlgMessage(hDlg, DM_GETTEXT, DlgDUPPATH, 0); + if (len) + { + Opt.DupPath = (wchar_t*) malloc((len + 1) * sizeof(wchar_t)); + if (Opt.DupPath) + { + FarDialogItemData item = {sizeof(FarDialogItemData), len, Opt.DupPath}; + Info.SendDlgMessage(hDlg, DM_GETTEXT, DlgDUPPATH, &item); + } + } - if (!bSkipSaveOpt) - { - FarSettingsCreate settings={sizeof(FarSettingsCreate),MainGuid,INVALID_HANDLE_VALUE}; - if (Info.SettingsControl(INVALID_HANDLE_VALUE,SCTL_CREATE,0,&settings)) - { - size_t Root=0; // корень ключа - for (int i=DlgMODEBOX; i0 && Substr[0]==L'/') - Search+=Substr+1; - else Search+=Substr; - if (Search.length()>0 && Search[(size_t)(Search.length()-1)]!=L'/') - Search+=L"/i"; - if (Info.RegExpControl(re,RECTL_COMPILE,0,Search.get())) - { - int brackets=Info.RegExpControl(re,RECTL_BRACKETSCOUNT,0,0); - if (!brackets) { Info.RegExpControl(re,RECTL_FREE,0,0); return false; } - RegExpMatch *match=(RegExpMatch*)malloc(brackets*sizeof(RegExpMatch)); + if (!Substr) + return strSrc.get(); + int len = wcslen(Substr); + if (!len) + return strSrc.get(); + + int lenSrc = strSrc.length(); + const wchar_t* src = strSrc.get(); + string strBuf; + // делаем замену + { + HANDLE re; + int start_offset = 0; + if (!Info.RegExpControl(0, RECTL_CREATE, 0, &re)) + return false; + + string Search = L"/"; + if (len > 0 && Substr[0] == L'/') + Search += Substr + 1; + else + Search += Substr; + if (Search.length() > 0 && Search[(size_t)(Search.length() - 1)] != L'/') + Search += L"/i"; + if (Info.RegExpControl(re, RECTL_COMPILE, 0, Search.get())) + { + int brackets = Info.RegExpControl(re, RECTL_BRACKETSCOUNT, 0, 0); + if (!brackets) + { + Info.RegExpControl(re, RECTL_FREE, 0, 0); + return false; + } + RegExpMatch* match = (RegExpMatch*) malloc(brackets * sizeof(RegExpMatch)); - for (;;) - { - RegExpSearch search= { src,start_offset,lenSrc,match,brackets,0 }; + for (;;) + { + RegExpSearch search = {src, start_offset, lenSrc, match, brackets, 0}; - if (Info.RegExpControl(re,RECTL_SEARCHEX,0,&search)) - { - // копируем ДО паттерна - for (int i=start_offset; i=lenSrc) - break; - } - else - break; - } - free(match); - Info.RegExpControl(re,RECTL_FREE,0,0); - } - // копируем всё то что не вошло в паттерн - for (int i=start_offset; i= lenSrc) + break; + } + else + break; + } + free(match); + Info.RegExpControl(re, RECTL_FREE, 0, 0); + } + // копируем всё то что не вошло в паттерн + for (int i = start_offset; i < lenSrc; i++) strBuf += src[i]; + if (!FSF.Trim(strBuf.get())) + return strSrc.get(); + strSrc = strBuf.get(); + } + return strSrc.get(); } /**************************************************************************** * Центрирование строки и заполнение символом заполнителем ****************************************************************************/ -void strcentr(wchar_t *Dest, const wchar_t *Src, int len, wchar_t sym) +void strcentr(wchar_t* Dest, const wchar_t* Src, int len, wchar_t sym) { - int iLen, iLen2; - iLen=wcslen(wcscpy(Dest,Src)); - if (iLen0) n=nCurrent * (unsigned __int64)len / nTotal; - if (n>len) n=len; - wchar_t *Buf=(wchar_t*)malloc(WinInfo.TruncLen*sizeof(wchar_t)); - if (Buf) - { - wmemset(Buf,0x00002588,n); - wmemset(&Buf[n],0x00002591,len-n); - Buf[len]=L'\0'; - FSF.sprintf(Dest,L"%s%3d%%",Buf,nTotal?(nCurrent*100 / nTotal):0); - free(Buf); - } - else - *Dest=0; + int n = 0, len = WinInfo.TruncLen - 4; + if (nTotal > 0) + n = nCurrent * (unsigned __int64) len / nTotal; + if (n > len) + n = len; + wchar_t* Buf = (wchar_t*) malloc(WinInfo.TruncLen * sizeof(wchar_t)); + if (Buf) + { + wmemset(Buf, 0x00002588, n); + wmemset(&Buf[n], 0x00002591, len - n); + Buf[len] = L'\0'; + FSF.sprintf(Dest, L"%s%3d%%", Buf, nTotal ? (nCurrent * 100 / nTotal) : 0); + free(Buf); + } + else + *Dest = 0; } /**************************************************************************** * Возвращает смещение начала файла, т.е. без префиксов "\\?\" ****************************************************************************/ -wchar_t *GetPosToName(const wchar_t *FileName) +wchar_t* GetPosToName(const wchar_t* FileName) { - if (FileName && FileName[0]==L'\\' && FileName[1]==L'\\' && FileName[2]==L'?') - { - if (FileName[5]==L':') - return (wchar_t *)&FileName[4]; - else if (FileName[5]==L'N') - return (wchar_t *)&FileName[7]; - } - return (wchar_t *)FileName; + if (FileName && FileName[0] == L'\\' && FileName[1] == L'\\' && FileName[2] == L'?') + { + if (FileName[5] == L':') + return (wchar_t*) &FileName[4]; + else if (FileName[5] == L'N') + return (wchar_t*) &FileName[7]; + } + return (wchar_t*) FileName; } /**************************************************************************** * Возвращает полное имя файла, и опционально без префиксов "\\?\" ****************************************************************************/ -void GetFullFileName(string &strFullFileName, const wchar_t *Dir, const wchar_t *FileName, bool bNative) +void GetFullFileName(string& strFullFileName, const wchar_t* Dir, const wchar_t* FileName, bool bNative) { - if (Dir) strFullFileName=bNative?Dir:GetPosToName(Dir); - if ((strFullFileName.length()>0 && strFullFileName[(size_t)(strFullFileName.length()-1)]!=L'\\') || ((LPanel.bTMP||RPanel.bTMP)? false: !strFullFileName.length())) strFullFileName+=L"\\"; - strFullFileName+=FileName; + if (Dir) + strFullFileName = bNative ? Dir : GetPosToName(Dir); + if ((strFullFileName.length() > 0 && strFullFileName[(size_t)(strFullFileName.length() - 1)] != L'\\') || + ((LPanel.bTMP || RPanel.bTMP) ? false : !strFullFileName.length())) + strFullFileName += L"\\"; + strFullFileName += FileName; } /**************************************************************************** * Возвращает строку с временем файла ****************************************************************************/ -wchar_t *GetStrFileTime(FILETIME *LastWriteTime, wchar_t *Time, bool FullYear) +wchar_t* GetStrFileTime(FILETIME* LastWriteTime, wchar_t* Time, bool FullYear) { - SYSTEMTIME ModificTime; - FILETIME LocalTime; - FileTimeToLocalFileTime(LastWriteTime,&LocalTime); - FileTimeToSystemTime(&LocalTime,&ModificTime); - // для Time достаточно [20] !!! - if (Time) - FSF.sprintf(Time, FullYear?L"%02d.%02d.%04d %02d:%02d:%02d":L"%02d.%02d.%02d %02d:%02d:%02d",ModificTime.wDay,ModificTime.wMonth,FullYear?ModificTime.wYear:ModificTime.wYear%100,ModificTime.wHour,ModificTime.wMinute,ModificTime.wSecond); - return Time; + SYSTEMTIME ModificTime; + FILETIME LocalTime; + FileTimeToLocalFileTime(LastWriteTime, &LocalTime); + FileTimeToSystemTime(&LocalTime, &ModificTime); + // для Time достаточно [20] !!! + if (Time) + FSF.sprintf(Time, FullYear ? L"%02d.%02d.%04d %02d:%02d:%02d" : L"%02d.%02d.%02d %02d:%02d:%02d", ModificTime.wDay, ModificTime.wMonth, + FullYear ? ModificTime.wYear : ModificTime.wYear % 100, ModificTime.wHour, ModificTime.wMinute, ModificTime.wSecond); + return Time; } - /**************************************************************************** * Проверка на Esc. Возвращает true, если пользователь нажал Esc ****************************************************************************/ bool CheckForEsc(void) { - if (hConInp == INVALID_HANDLE_VALUE) - return false; - - static DWORD dwTicks; - DWORD dwNewTicks = GetTickCount(); - if (dwNewTicks - dwTicks < 500) - return false; - dwTicks = dwNewTicks; - - INPUT_RECORD rec; - DWORD ReadCount; - while (PeekConsoleInput(hConInp, &rec, 1, &ReadCount) && ReadCount) - { - ReadConsoleInput(hConInp, &rec, 1, &ReadCount); - if ( rec.EventType == KEY_EVENT && rec.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE && rec.Event.KeyEvent.bKeyDown ) - { - // Опциональное подтверждение прерывания по Esc - if (GetFarSetting(FSSF_CONFIRMATIONS,L"Esc")) - { - if (YesNoMsg(MEscTitle, MEscBody)) - return (bBrokenByEsc=true); - } - else - return (bBrokenByEsc=true); - } - } - return false; + if (hConInp == INVALID_HANDLE_VALUE) + return false; + + static DWORD dwTicks; + DWORD dwNewTicks = GetTickCount(); + if (dwNewTicks - dwTicks < 500) + return false; + dwTicks = dwNewTicks; + + INPUT_RECORD rec; + DWORD ReadCount; + while (PeekConsoleInput(hConInp, &rec, 1, &ReadCount) && ReadCount) + { + ReadConsoleInput(hConInp, &rec, 1, &ReadCount); + if (rec.EventType == KEY_EVENT && rec.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE && rec.Event.KeyEvent.bKeyDown) + { + // Опциональное подтверждение прерывания по Esc + if (GetFarSetting(FSSF_CONFIRMATIONS, L"Esc")) + { + if (YesNoMsg(MEscTitle, MEscBody)) + return (bBrokenByEsc = true); + } + else + return (bBrokenByEsc = true); + } + } + return false; } /**************************************************************************** * Усекает начало длинных имен файлов (или дополняет короткие имена) * для правильного показа в сообщении сравнения ****************************************************************************/ -void TruncCopy(wchar_t *Dest, const wchar_t *Src, int TruncLen, const wchar_t *FormatMsg) +void TruncCopy(wchar_t* Dest, const wchar_t* Src, int TruncLen, const wchar_t* FormatMsg) { - string strSrc(Src); - int iLen=0; - if (FormatMsg) // чего-нибудь допишем... - { - FSF.sprintf(Dest,FormatMsg,FSF.TruncPathStr(strSrc.get(),TruncLen-wcslen(FormatMsg)+2)); - iLen=wcslen(Dest); - } - else // иначе, тупо скопируем имя - iLen=wcslen(wcscpy(Dest,FSF.TruncPathStr(strSrc.get(),TruncLen))); - - if (iLen=l) - break; - // get argument - pos[num]=i; - while (cmd[i]!=L';' && i= l) + break; + // get argument + pos[num] = i; + while (cmd[i] != L';' && i < l) i++; + len[num] = i - pos[num]; + num++; + } + + if (num) + { + *argv = (wchar_t**) malloc(num * sizeof(**argv)); + for (i = 0; i < num; i++) + { + (*argv)[i] = (wchar_t*) malloc((len[i] + 2) * sizeof(***argv)); + lstrcpyn((*argv)[i], cmd + pos[i], len[i] + 1); + } + } + free(pos); + free(len); + return num; } - void AdvCmpProc::Init() { - hScreen=Info.SaveScreen(0,0,-1,-1); - bStartMsg=true; - - cFList.F=NULL; - cFList.iCount=0; - cFList.Items=0; - cFList.Select=0; - cFList.Identical=0; - cFList.Different=0; - cFList.LNew=0; - cFList.RNew=0; - - Opt.ShowListSelect=1; - Opt.ShowListIdentical=1; - Opt.ShowListDifferent=1; - Opt.ShowListLNew=1; - Opt.ShowListRNew=1; - Opt.SyncFlagClearUser=0; - Opt.SyncFlagCopy=Opt.SyncFlagIfNew=0; - Opt.SyncFlagLCopy=1; - Opt.SyncFlagRCopy=-1; - - dFList.F=NULL; - dFList.iCount=0; - dFList.GroupItems=0; - dFList.Del=0; - - Opt.BufSize=65536<<4; - Opt.Buf[0]=NULL; - Opt.Buf[1]=NULL; - - // создадим буферы сравнения - if (Opt.CmpContents) - { - Opt.Buf[0]=(char*)malloc(Opt.BufSize*sizeof(char)); - Opt.Buf[1]=(char*)malloc(Opt.BufSize*sizeof(char)); - } - - LPanel.hFilter=RPanel.hFilter=INVALID_HANDLE_VALUE; - Info.FileFilterControl(LPanel.hPanel,FFCTL_CREATEFILEFILTER,FFT_PANEL,&LPanel.hFilter); - Info.FileFilterControl(RPanel.hPanel,FFCTL_CREATEFILEFILTER,FFT_PANEL,&RPanel.hFilter); - Info.FileFilterControl(LPanel.hFilter,FFCTL_STARTINGTOFILTER,0,0); - Info.FileFilterControl(RPanel.hFilter,FFCTL_STARTINGTOFILTER,0,0); - if (Opt.Filter) Info.FileFilterControl(Opt.hCustomFilter,FFCTL_STARTINGTOFILTER,0,0); - - // На время сравнения изменим заголовок консоли ФАРа... - TitleSaved=GetFarTitle(strFarTitle); - SetConsoleTitle(GetMsg(MComparingFiles)); + hScreen = Info.SaveScreen(0, 0, -1, -1); + bStartMsg = true; + + cFList.F = NULL; + cFList.iCount = 0; + cFList.Items = 0; + cFList.Select = 0; + cFList.Identical = 0; + cFList.Different = 0; + cFList.LNew = 0; + cFList.RNew = 0; + + Opt.ShowListSelect = 1; + Opt.ShowListIdentical = 1; + Opt.ShowListDifferent = 1; + Opt.ShowListLNew = 1; + Opt.ShowListRNew = 1; + Opt.SyncFlagClearUser = 0; + Opt.SyncFlagCopy = Opt.SyncFlagIfNew = 0; + Opt.SyncFlagLCopy = 1; + Opt.SyncFlagRCopy = -1; + + dFList.F = NULL; + dFList.iCount = 0; + dFList.GroupItems = 0; + dFList.Del = 0; + + Opt.BufSize = 65536 << 4; + Opt.Buf[0] = NULL; + Opt.Buf[1] = NULL; + + // создадим буферы сравнения + if (Opt.CmpContents) + { + Opt.Buf[0] = (char*) malloc(Opt.BufSize * sizeof(char)); + Opt.Buf[1] = (char*) malloc(Opt.BufSize * sizeof(char)); + } + + LPanel.hFilter = RPanel.hFilter = INVALID_HANDLE_VALUE; + Info.FileFilterControl(LPanel.hPanel, FFCTL_CREATEFILEFILTER, FFT_PANEL, &LPanel.hFilter); + Info.FileFilterControl(RPanel.hPanel, FFCTL_CREATEFILEFILTER, FFT_PANEL, &RPanel.hFilter); + Info.FileFilterControl(LPanel.hFilter, FFCTL_STARTINGTOFILTER, 0, 0); + Info.FileFilterControl(RPanel.hFilter, FFCTL_STARTINGTOFILTER, 0, 0); + if (Opt.Filter) + Info.FileFilterControl(Opt.hCustomFilter, FFCTL_STARTINGTOFILTER, 0, 0); + + // На время сравнения изменим заголовок консоли ФАРа... + TitleSaved = GetFarTitle(strFarTitle); + SetConsoleTitle(GetMsg(MComparingFiles)); } void AdvCmpProc::Close() { - if (Opt.Buf[0]) { free(Opt.Buf[0]); Opt.Buf[0]=NULL; } - if (Opt.Buf[1]) { free(Opt.Buf[1]); Opt.Buf[1]=NULL; } - - Info.FileFilterControl(LPanel.hFilter,FFCTL_FREEFILEFILTER,0,0); - Info.FileFilterControl(RPanel.hFilter,FFCTL_FREEFILEFILTER,0,0); - - if (hScreen) Info.RestoreScreen(hScreen); - // Восстановим заголовок консоли ФАРа... - if (TitleSaved) SetConsoleTitle(strFarTitle); - - for (int i=0; i> 1) ^ 0xEDB88320 : r >> 1; - TableCRC[i] = r; - } - } - while (iLen--) - { - crc = TableCRC[(unsigned char)crc ^ *pdata++] ^ crc >> 8; - crc ^= 0xD202EF8D; - } - return crc; + register unsigned char* pdata = (unsigned char*) pData; + register DWORD crc = FileCRC; + static unsigned TableCRC[256]; + if (!TableCRC[1]) + { // Инициализация CRC32 таблицы + unsigned i, j, r; + for (i = 0; i < 256; i++) + { + for (r = i, j = 8; j; j--) r = r & 1 ? (r >> 1) ^ 0xEDB88320 : r >> 1; + TableCRC[i] = r; + } + } + while (iLen--) + { + crc = TableCRC[(unsigned char) crc ^ *pdata++] ^ crc >> 8; + crc ^= 0xD202EF8D; + } + return crc; } - - /**************************************************************************** * * COMPAREFILES FUNCTIONS * ****************************************************************************/ - /**************************************************************************** * Замена сервисной функции Info.GetDirList(). В отличие от оной возвращает * список файлов только в каталоге Dir, без подкаталогов. * Умеет собирать информацию об элементах на заданную глубину. ****************************************************************************/ -int AdvCmpProc::GetDirList(const wchar_t *Dir, int ScanDepth, bool OnlyInfo, struct DirList *pList) +int AdvCmpProc::GetDirList(const wchar_t* Dir, int ScanDepth, bool OnlyInfo, struct DirList* pList) { - bool ret=true; - - if (OnlyInfo && bBrokenByEsc) - return ret; - - string strPathMask(Dir); - - if (Opt.ScanSymlink) - { - DWORD Attrib=GetFileAttributesW(Dir); - if (Attrib!=INVALID_FILE_ATTRIBUTES && (Attrib&FILE_ATTRIBUTE_REPARSE_POINT)) - { - // получим реальный путь - size_t size=FSF.ConvertPath(CPM_REAL,Dir,0,0); - wchar_t *buf=strPathMask.get(size); - FSF.ConvertPath(CPM_REAL,Dir,buf,size); - strPathMask.updsize(); - // проверка на рекурсию - узнаем, может мы уже отсюда пришли - wchar_t RealPrevDir[32768]; - wcscpy(RealPrevDir,Dir); - (wchar_t)*(FSF.PointToName(RealPrevDir)) = 0; - FSF.ConvertPath(CPM_REAL,RealPrevDir,RealPrevDir,32768); - - if (!FSF.LStricmp(strPathMask.get(),RealPrevDir)) // да, уже были тут! - ret=false; - } - } - - if (!OnlyInfo) // заполняем DirList - { - pList->Dir=(wchar_t*)malloc((wcslen(Dir)+1)*sizeof(wchar_t)); - if (pList->Dir) wcscpy(pList->Dir,Dir); - pList->PPI=0; - pList->ItemsNumber=0; - } - - if (Opt.ScanSymlink && !ret) // выходим - return true; - - strPathMask+=L"\\*"; - WIN32_FIND_DATA wfdFindData; - HANDLE hFind; - - if ((hFind=FindFirstFileW(strPathMask.get(),&wfdFindData)) != INVALID_HANDLE_VALUE) - { - do - { - if (OnlyInfo && CheckForEsc()) - { - ret=true; - break; - } + bool ret = true; + + if (OnlyInfo && bBrokenByEsc) + return ret; + + string strPathMask(Dir); + + if (Opt.ScanSymlink) + { + DWORD Attrib = GetFileAttributesW(Dir); + if (Attrib != INVALID_FILE_ATTRIBUTES && (Attrib & FILE_ATTRIBUTE_REPARSE_POINT)) + { + // получим реальный путь + size_t size = FSF.ConvertPath(CPM_REAL, Dir, 0, 0); + wchar_t* buf = strPathMask.get(size); + FSF.ConvertPath(CPM_REAL, Dir, buf, size); + strPathMask.updsize(); + // проверка на рекурсию - узнаем, может мы уже отсюда пришли + wchar_t RealPrevDir[32768]; + wcscpy(RealPrevDir, Dir); + (wchar_t) * (FSF.PointToName(RealPrevDir)) = 0; + FSF.ConvertPath(CPM_REAL, RealPrevDir, RealPrevDir, 32768); + + if (!FSF.LStricmp(strPathMask.get(), RealPrevDir)) // да, уже были тут! + ret = false; + } + } + + if (!OnlyInfo) // заполняем DirList + { + pList->Dir = (wchar_t*) malloc((wcslen(Dir) + 1) * sizeof(wchar_t)); + if (pList->Dir) + wcscpy(pList->Dir, Dir); + pList->PPI = 0; + pList->ItemsNumber = 0; + } + + if (Opt.ScanSymlink && !ret) // выходим + return true; + + strPathMask += L"\\*"; + WIN32_FIND_DATA wfdFindData; + HANDLE hFind; + + if ((hFind = FindFirstFileW(strPathMask.get(), &wfdFindData)) != INVALID_HANDLE_VALUE) + { + do + { + if (OnlyInfo && CheckForEsc()) + { + ret = true; + break; + } - if (!Opt.ProcessHidden && (wfdFindData.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN)) - continue; - if ((wfdFindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && - ((wfdFindData.cFileName[0]==L'.' && !wfdFindData.cFileName[1]) || (wfdFindData.cFileName[0]==L'.' && wfdFindData.cFileName[1]==L'.' && !wfdFindData.cFileName[2]))) - continue; - if (OnlyInfo && (wfdFindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) - { - if (Opt.Subfolders==2 && Opt.MaxScanDepthPPI,(pList->ItemsNumber+1)*sizeof(PluginPanelItem)); - if (!pPPI) - { - ErrorMsg(MNoMemTitle, MNoMemBody); - // !!! возможно тут требуется обнулить элементы и их кол-во - ret=false; - break; - } - pList->PPI=pPPI; - WFD2PPI(wfdFindData,pList->PPI[pList->ItemsNumber++]); - } - } - } while (FindNextFile(hFind,&wfdFindData)); - FindClose(hFind); - } - else - CmpInfo.Errors++; + if (!Opt.ProcessHidden && (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + continue; + if ((wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + ((wfdFindData.cFileName[0] == L'.' && !wfdFindData.cFileName[1]) || + (wfdFindData.cFileName[0] == L'.' && wfdFindData.cFileName[1] == L'.' && !wfdFindData.cFileName[2]))) + continue; + if (OnlyInfo && (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + if (Opt.Subfolders == 2 && Opt.MaxScanDepth < ScanDepth + 1) // не глубже заданного уровня! + break; + if (!Opt.Subfolders) + continue; + string strPath; + GetFullFileName(strPath, Dir, wfdFindData.cFileName); + ret = GetDirList(strPath.get(), ScanDepth + 1, OnlyInfo, 0); + } + else + { + if (OnlyInfo) + { + CmpInfo.Count += 1; + CmpInfo.CountSize += ((unsigned __int64) wfdFindData.nFileSizeHigh << 32) | wfdFindData.nFileSizeLow; + ShowCmpMsg(L"*", L"*", L"*", L"*", false); + } + else + { + struct PluginPanelItem* pPPI = (PluginPanelItem*) realloc(pList->PPI, (pList->ItemsNumber + 1) * sizeof(PluginPanelItem)); + if (!pPPI) + { + ErrorMsg(MNoMemTitle, MNoMemBody); + // !!! возможно тут требуется обнулить элементы и их кол-во + ret = false; + break; + } + pList->PPI = pPPI; + WFD2PPI(wfdFindData, pList->PPI[pList->ItemsNumber++]); + } + } + } while (FindNextFile(hFind, &wfdFindData)); + FindClose(hFind); + } + else + CmpInfo.Errors++; - return ret; + return ret; } /**************************************************************************** * Замена сервисной функции Info.FreeDirList(). ****************************************************************************/ -void AdvCmpProc::FreeDirList(struct DirList *pList) +void AdvCmpProc::FreeDirList(struct DirList* pList) { - if (pList->PPI) - { - for (int i=0; iItemsNumber; i++) - free((void*)pList->PPI[i].FileName); - free(pList->PPI); pList->PPI=0; - } - free(pList->Dir); pList->Dir=0; - pList->ItemsNumber=0; + if (pList->PPI) + { + for (int i = 0; i < pList->ItemsNumber; i++) free((void*) pList->PPI[i].FileName); + free(pList->PPI); + pList->PPI = 0; + } + free(pList->Dir); + pList->Dir = 0; + pList->ItemsNumber = 0; } /**************************************************************************** * Функция сравнения имён файлов в двух структурах PluginPanelItem * для нужд qsort() ****************************************************************************/ -int WINAPI PICompare(const void *el1, const void *el2, void *el3) +int WINAPI PICompare(const void* el1, const void* el2, void* el3) { - const PluginPanelItem *ppi1 = *(const PluginPanelItem **)el1, *ppi2 = *(const PluginPanelItem **)el2; - - if (ppi1->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - if (!(ppi2->FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) - return 1; - } - else - { - if (ppi2->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) - return -1; - } - - string strLFileName(LPanel.bTMP||RPanel.bTMP?FSF.PointToName(ppi1->FileName):ppi1->FileName); - string strRFileName(LPanel.bTMP||RPanel.bTMP?FSF.PointToName(ppi2->FileName):ppi2->FileName); - - int i=FSF.LStricmp(Opt.SkipSubstr?CutSubstr(strLFileName,Opt.Substr):strLFileName.get(), - Opt.SkipSubstr?CutSubstr(strRFileName,Opt.Substr):strRFileName.get()); -// DebugMsg(strLFileName.get(),L"PICompare-strLFileName",i); -// DebugMsg(strRFileName.get(),L"PICompare-strRFileName",i); + const PluginPanelItem *ppi1 = *(const PluginPanelItem**) el1, *ppi2 = *(const PluginPanelItem**) el2; + + if (ppi1->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (!(ppi2->FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + return 1; + } + else + { + if (ppi2->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) + return -1; + } + + string strLFileName(LPanel.bTMP || RPanel.bTMP ? FSF.PointToName(ppi1->FileName) : ppi1->FileName); + string strRFileName(LPanel.bTMP || RPanel.bTMP ? FSF.PointToName(ppi2->FileName) : ppi2->FileName); + + int i = FSF.LStricmp(Opt.SkipSubstr ? CutSubstr(strLFileName, Opt.Substr) : strLFileName.get(), + Opt.SkipSubstr ? CutSubstr(strRFileName, Opt.Substr) : strRFileName.get()); + // DebugMsg(strLFileName.get(),L"PICompare-strLFileName",i); + // DebugMsg(strRFileName.get(),L"PICompare-strRFileName",i); return i; } - /**************************************************************************** * Построение сортированного списка элементов для быстрого сравнения ****************************************************************************/ -bool AdvCmpProc::BuildItemsIndex(bool bLeftPanel,const struct DirList *pList,struct ItemsIndex *pIndex,int ScanDepth) +bool AdvCmpProc::BuildItemsIndex(bool bLeftPanel, const struct DirList* pList, struct ItemsIndex* pIndex, int ScanDepth) { - pIndex->pPPI=0; - pIndex->iCount=pList->ItemsNumber; - - if (!pIndex->iCount) - return true; - if (!(pIndex->pPPI=(PluginPanelItem **)malloc(pIndex->iCount * sizeof(pIndex->pPPI[0])))) - return false; - - int j = 0; - for (int i=pIndex->iCount-1; i>=0 && jiCount; i--) - { - // каталоги отсеиваем сразу... если надо - if ( (Opt.Subfolders || !(pList->PPI[i].FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) && - // выбираем только отмеченные элементы... если надо :) - (!(Opt.ProcessSelected && ScanDepth==0) || (pList->PPI[i].Flags & PPIF_SELECTED)) - ) - { - if ( (pList->PPI[i].FileAttributes & FILE_ATTRIBUTE_DIRECTORY) && - ((pList->PPI[i].FileName[0]==L'.' && !pList->PPI[i].FileName[1]) || - (pList->PPI[i].FileName[0]==L'.' && pList->PPI[i].FileName[1]==L'.' && !pList->PPI[i].FileName[2])) - ) - continue; - if (!Opt.ProcessHidden && (pList->PPI[i].FileAttributes&FILE_ATTRIBUTE_HIDDEN)) - continue; - if ( (bLeftPanel?LPanel.hFilter:RPanel.hFilter)!=INVALID_HANDLE_VALUE && - !Info.FileFilterControl((bLeftPanel?LPanel.hFilter:RPanel.hFilter),FFCTL_ISFILEINFILTER,0,&pList->PPI[i])) - continue; - if (Opt.Filter && !Info.FileFilterControl(Opt.hCustomFilter,FFCTL_ISFILEINFILTER,0,&pList->PPI[i])) - continue; - - if (ScanDepth && !(LPanel.bTMP || RPanel.bTMP)) - { - bool bLPanelPlug=(LPanel.PInfo.Flags&PFLAGS_PLUGIN), bRPanelPlug=(RPanel.PInfo.Flags&PFLAGS_PLUGIN); - - // плагин + панель || панель + плагин (элемент с панели) - if ((bLPanelPlug && !bRPanelPlug && !bLeftPanel) || (!bLPanelPlug && bRPanelPlug && bLeftPanel)) - { - string srtFileName(pList->PPI[i].FileName); - string strSubstr; - wchar_t *p=pList->Dir+4; - while (*p++) // для экранирования спецсимволов в регэкспах - { - if (*p==L'\\' || *p==L'[' || *p==L']' || *p==L'+' || *p==L'{' || *p==L'}') - strSubstr+=L"\\"; - strSubstr+=*p; - } - // вырежем pList->Dir из имени файла, т.к. путь до текущей папки (и сама папка) нам не нужен - wcscpy((wchar_t*)pList->PPI[i].FileName,CutSubstr(srtFileName,strSubstr.get())+2); - - if (Opt.Subfolders==2 && !CheckScanDepth(pList->PPI[i].FileName, Opt.MaxScanDepth)) - continue; - } + pIndex->pPPI = 0; + pIndex->iCount = pList->ItemsNumber; + + if (!pIndex->iCount) + return true; + if (!(pIndex->pPPI = (PluginPanelItem**) malloc(pIndex->iCount * sizeof(pIndex->pPPI[0])))) + return false; + + int j = 0; + for (int i = pIndex->iCount - 1; i >= 0 && j < pIndex->iCount; i--) + { + // каталоги отсеиваем сразу... если надо + if ((Opt.Subfolders || !(pList->PPI[i].FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) && + // выбираем только отмеченные элементы... если надо :) + (!(Opt.ProcessSelected && ScanDepth == 0) || (pList->PPI[i].Flags & PPIF_SELECTED))) + { + if ((pList->PPI[i].FileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + ((pList->PPI[i].FileName[0] == L'.' && !pList->PPI[i].FileName[1]) || + (pList->PPI[i].FileName[0] == L'.' && pList->PPI[i].FileName[1] == L'.' && !pList->PPI[i].FileName[2]))) + continue; + if (!Opt.ProcessHidden && (pList->PPI[i].FileAttributes & FILE_ATTRIBUTE_HIDDEN)) + continue; + if ((bLeftPanel ? LPanel.hFilter : RPanel.hFilter) != INVALID_HANDLE_VALUE && + !Info.FileFilterControl((bLeftPanel ? LPanel.hFilter : RPanel.hFilter), FFCTL_ISFILEINFILTER, 0, &pList->PPI[i])) + continue; + if (Opt.Filter && !Info.FileFilterControl(Opt.hCustomFilter, FFCTL_ISFILEINFILTER, 0, &pList->PPI[i])) + continue; + + if (ScanDepth && !(LPanel.bTMP || RPanel.bTMP)) + { + bool bLPanelPlug = (LPanel.PInfo.Flags & PFLAGS_PLUGIN), bRPanelPlug = (RPanel.PInfo.Flags & PFLAGS_PLUGIN); - // плагин + панель || панель + плагин (элемент с плагина) - else if ((bLPanelPlug && !bRPanelPlug && bLeftPanel) || (!bLPanelPlug && bRPanelPlug && !bLeftPanel)) - { - if (Opt.Subfolders==2 && !CheckScanDepth(pList->PPI[i].FileName, Opt.MaxScanDepth)) - continue; - } - } + // плагин + панель || панель + плагин (элемент с панели) + if ((bLPanelPlug && !bRPanelPlug && !bLeftPanel) || (!bLPanelPlug && bRPanelPlug && bLeftPanel)) + { + string srtFileName(pList->PPI[i].FileName); + string strSubstr; + wchar_t* p = pList->Dir + 4; + while (*p++) // для экранирования спецсимволов в регэкспах + { + if (*p == L'\\' || *p == L'[' || *p == L']' || *p == L'+' || *p == L'{' || *p == L'}') + strSubstr += L"\\"; + strSubstr += *p; + } + // вырежем pList->Dir из имени файла, т.к. путь до текущей папки (и сама папка) нам не нужен + wcscpy((wchar_t*) pList->PPI[i].FileName, CutSubstr(srtFileName, strSubstr.get()) + 2); - pIndex->pPPI[j++]=&pList->PPI[i]; - } - } + if (Opt.Subfolders == 2 && !CheckScanDepth(pList->PPI[i].FileName, Opt.MaxScanDepth)) + continue; + } - if (pIndex->iCount=j) - { - FSF.qsort(pIndex->pPPI,j,sizeof(pIndex->pPPI[0]),PICompare, NULL); - } - else - { - free(pIndex->pPPI); - pIndex->pPPI=0; - } + // плагин + панель || панель + плагин (элемент с плагина) + else if ((bLPanelPlug && !bRPanelPlug && bLeftPanel) || (!bLPanelPlug && bRPanelPlug && !bLeftPanel)) + { + if (Opt.Subfolders == 2 && !CheckScanDepth(pList->PPI[i].FileName, Opt.MaxScanDepth)) + continue; + } + } - return true; + pIndex->pPPI[j++] = &pList->PPI[i]; + } + } + + if (pIndex->iCount = j) + { + FSF.qsort(pIndex->pPPI, j, sizeof(pIndex->pPPI[0]), PICompare, NULL); + } + else + { + free(pIndex->pPPI); + pIndex->pPPI = 0; + } + + return true; } /**************************************************************************** * Освобождение памяти ****************************************************************************/ -void AdvCmpProc::FreeItemsIndex(struct ItemsIndex *pIndex) +void AdvCmpProc::FreeItemsIndex(struct ItemsIndex* pIndex) { - if (pIndex->pPPI) - free(pIndex->pPPI); - pIndex->pPPI=0; - pIndex->iCount=0; + if (pIndex->pPPI) + free(pIndex->pPPI); + pIndex->pPPI = 0; + pIndex->iCount = 0; } - /**************************************************************************** * Результат предыдущего сравнения "по содержимому". ****************************************************************************/ int AdvCmpProc::GetCacheResult(DWORD FullFileName1, DWORD FullFileName2, DWORD64 WriteTime1, DWORD64 WriteTime2) { - for (int i=0; idwFullFileName[0] = FullFileName1; - CurItem->dwFullFileName[1] = FullFileName2; - CurItem->dwWriteTime[0] = WriteTime1; - CurItem->dwWriteTime[1] = WriteTime2; - CurItem->dwFlags=dwFlag; - } - else - { - ErrorMsg(MNoMemTitle, MNoMemBody); - free(Cache.RCI); - Cache.RCI=0; Cache.ItemsNumber=0; - return false; - } - return true; + for (int i = 0; i < Cache.ItemsNumber; i++) + { + if (((FullFileName1 == Cache.RCI[i].dwFullFileName[0] && FullFileName2 == Cache.RCI[i].dwFullFileName[1]) && + (WriteTime1 == Cache.RCI[i].dwWriteTime[0] && WriteTime2 == Cache.RCI[i].dwWriteTime[1])) || + ((FullFileName1 == Cache.RCI[i].dwFullFileName[1] && FullFileName2 == Cache.RCI[i].dwFullFileName[0]) && + (WriteTime1 == Cache.RCI[i].dwWriteTime[1] && WriteTime2 == Cache.RCI[i].dwWriteTime[0]))) + { + Cache.RCI[i].dwFlags = dwFlag; // был такой, обновим. сделаем "тупо" :-) + return true; + } + } + + struct ResultCmpItem* pRCI = (struct ResultCmpItem*) realloc(Cache.RCI, (Cache.ItemsNumber + 1) * sizeof(ResultCmpItem)); + if (pRCI) + { + Cache.RCI = pRCI; + struct ResultCmpItem* CurItem = &Cache.RCI[Cache.ItemsNumber++]; + CurItem->dwFullFileName[0] = FullFileName1; + CurItem->dwFullFileName[1] = FullFileName2; + CurItem->dwWriteTime[0] = WriteTime1; + CurItem->dwWriteTime[1] = WriteTime2; + CurItem->dwFlags = dwFlag; + } + else + { + ErrorMsg(MNoMemTitle, MNoMemBody); + free(Cache.RCI); + Cache.RCI = 0; + Cache.ItemsNumber = 0; + return false; + } + return true; } - /**************************************************************************** * Показывает сообщение о сравнении двух файлов ****************************************************************************/ -void AdvCmpProc::ShowCmpMsg(const wchar_t *Dir1, const wchar_t *Name1, const wchar_t *Dir2, const wchar_t *Name2, bool bRedraw) +void AdvCmpProc::ShowCmpMsg(const wchar_t* Dir1, const wchar_t* Name1, const wchar_t* Dir2, const wchar_t* Name2, bool bRedraw) { - // Для перерисовки не чаще 3-х раз в 1 сек. - if (!bRedraw) - { - static DWORD dwTicks; - DWORD dwNewTicks = GetTickCount(); - if (dwNewTicks - dwTicks < 350) - return; - dwTicks = dwNewTicks; - } - - wchar_t Buf[MAX_PATH], ItemsOut[MAX_PATH]; - - wchar_t TruncDir1[MAX_PATH], TruncDir2[MAX_PATH], TruncName1[MAX_PATH], TruncName2[MAX_PATH]; - TruncCopy(TruncDir1, GetPosToName(Dir1), WinInfo.TruncLen, GetMsg(MComparing)); - TruncCopy(TruncName1, Name1, WinInfo.TruncLen); - TruncCopy(TruncDir2, GetPosToName(Dir2), WinInfo.TruncLen, GetMsg(MComparingWith)); - TruncCopy(TruncName2, Name2, WinInfo.TruncLen); - - wchar_t LDiff[64], RDiff[64], Errors[64], DiffOut[MAX_PATH]; - FSF.sprintf(Buf,GetMsg(MComparingDiffN),itoaa(CmpInfo.LDiff,LDiff),itoaa(CmpInfo.RDiff,RDiff),itoaa(CmpInfo.Errors,Errors)); - strcentr(DiffOut,Buf,WinInfo.TruncLen,0x00002500); - - wchar_t ProgressLineCur[MAX_PATH], ProgressLineTotal[MAX_PATH]; - if (!Opt.CmpContents || bStartMsg) - wcscpy(ProgressLineCur,GetMsg(MWait)); - else - ProgressLine(ProgressLineCur,CmpInfo.CurProcSize,CmpInfo.CurCountSize); - - if (Opt.TotalProgress) - { - FSF.sprintf(Buf,GetMsg(MComparingFiles2),CmpInfo.CountSize && !((LPanel.PInfo.Flags&PFLAGS_PLUGIN) || (RPanel.PInfo.Flags&PFLAGS_PLUGIN))?(CmpInfo.ProcSize*100/CmpInfo.CountSize):0); - SetConsoleTitle(Buf); - - wchar_t Count[64], CountSize[64]; - FSF.sprintf(Buf,GetMsg(MComparingN),itoaa(CmpInfo.CountSize,CountSize),itoaa(CmpInfo.Count,Count)); - strcentr(ItemsOut,Buf,WinInfo.TruncLen,0x00002500); - - if ((LPanel.PInfo.Flags&PFLAGS_PLUGIN) || (RPanel.PInfo.Flags&PFLAGS_PLUGIN)) - wcscpy(ProgressLineTotal,GetMsg(MWait)); - else - ProgressLine(ProgressLineTotal,CmpInfo.ProcSize,CmpInfo.CountSize); - } - strcentr(Buf,L"",WinInfo.TruncLen,0x00002500); // просто сепаратор - - const wchar_t *MsgItems1[] = { - GetMsg(MCmpTitle), - TruncDir1,TruncName1,DiffOut,ProgressLineCur,Buf,TruncDir2,TruncName2 - }; - - const wchar_t *MsgItems2[] = { - GetMsg(MCmpTitle), - TruncDir1,TruncName1,DiffOut,ProgressLineCur,Buf,ProgressLineTotal,ItemsOut,TruncDir2,TruncName2 - }; - - - Info.Message(&MainGuid,&CmpMsgGuid,bStartMsg?FMSG_LEFTALIGN:FMSG_LEFTALIGN|FMSG_KEEPBACKGROUND,0,Opt.TotalProgress?MsgItems2:MsgItems1, - Opt.TotalProgress?sizeof(MsgItems2)/sizeof(MsgItems2[0]):sizeof(MsgItems1)/sizeof(MsgItems1[0]),0); - bStartMsg=false; + // Для перерисовки не чаще 3-х раз в 1 сек. + if (!bRedraw) + { + static DWORD dwTicks; + DWORD dwNewTicks = GetTickCount(); + if (dwNewTicks - dwTicks < 350) + return; + dwTicks = dwNewTicks; + } + + wchar_t Buf[MAX_PATH], ItemsOut[MAX_PATH]; + + wchar_t TruncDir1[MAX_PATH], TruncDir2[MAX_PATH], TruncName1[MAX_PATH], TruncName2[MAX_PATH]; + TruncCopy(TruncDir1, GetPosToName(Dir1), WinInfo.TruncLen, GetMsg(MComparing)); + TruncCopy(TruncName1, Name1, WinInfo.TruncLen); + TruncCopy(TruncDir2, GetPosToName(Dir2), WinInfo.TruncLen, GetMsg(MComparingWith)); + TruncCopy(TruncName2, Name2, WinInfo.TruncLen); + + wchar_t LDiff[64], RDiff[64], Errors[64], DiffOut[MAX_PATH]; + FSF.sprintf(Buf, GetMsg(MComparingDiffN), itoaa(CmpInfo.LDiff, LDiff), itoaa(CmpInfo.RDiff, RDiff), itoaa(CmpInfo.Errors, Errors)); + strcentr(DiffOut, Buf, WinInfo.TruncLen, 0x00002500); + + wchar_t ProgressLineCur[MAX_PATH], ProgressLineTotal[MAX_PATH]; + if (!Opt.CmpContents || bStartMsg) + wcscpy(ProgressLineCur, GetMsg(MWait)); + else + ProgressLine(ProgressLineCur, CmpInfo.CurProcSize, CmpInfo.CurCountSize); + + if (Opt.TotalProgress) + { + FSF.sprintf(Buf, GetMsg(MComparingFiles2), + CmpInfo.CountSize && !((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN)) + ? (CmpInfo.ProcSize * 100 / CmpInfo.CountSize) + : 0); + SetConsoleTitle(Buf); + + wchar_t Count[64], CountSize[64]; + FSF.sprintf(Buf, GetMsg(MComparingN), itoaa(CmpInfo.CountSize, CountSize), itoaa(CmpInfo.Count, Count)); + strcentr(ItemsOut, Buf, WinInfo.TruncLen, 0x00002500); + + if ((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN)) + wcscpy(ProgressLineTotal, GetMsg(MWait)); + else + ProgressLine(ProgressLineTotal, CmpInfo.ProcSize, CmpInfo.CountSize); + } + strcentr(Buf, L"", WinInfo.TruncLen, 0x00002500); // просто сепаратор + + const wchar_t* MsgItems1[] = {GetMsg(MCmpTitle), TruncDir1, TruncName1, DiffOut, ProgressLineCur, Buf, TruncDir2, TruncName2}; + + const wchar_t* MsgItems2[] = {GetMsg(MCmpTitle), TruncDir1, TruncName1, DiffOut, ProgressLineCur, Buf, + ProgressLineTotal, ItemsOut, TruncDir2, TruncName2}; + + Info.Message(&MainGuid, &CmpMsgGuid, bStartMsg ? FMSG_LEFTALIGN : FMSG_LEFTALIGN | FMSG_KEEPBACKGROUND, 0, + Opt.TotalProgress ? MsgItems2 : MsgItems1, + Opt.TotalProgress ? sizeof(MsgItems2) / sizeof(MsgItems2[0]) : sizeof(MsgItems1) / sizeof(MsgItems1[0]), 0); + bStartMsg = false; } /**************************************************************************** * Показывает сообщение о сравнении двух файлов ****************************************************************************/ -void AdvCmpProc::ShowDupMsg(const wchar_t *Dir, const wchar_t *Name, bool bRedraw) +void AdvCmpProc::ShowDupMsg(const wchar_t* Dir, const wchar_t* Name, bool bRedraw) { - // Для перерисовки не чаще 3-х раз в 1 сек. - if (!bRedraw) - { - static DWORD dwTicks; - DWORD dwNewTicks = GetTickCount(); - if (dwNewTicks - dwTicks < 350) - return; - dwTicks = dwNewTicks; - } - - wchar_t Buf[MAX_PATH], ItemsOut[MAX_PATH]; - - wchar_t TruncDir[MAX_PATH], TruncName[MAX_PATH]; - TruncCopy(TruncDir, GetPosToName(Dir), WinInfo.TruncLen, GetMsg(MComparing)); - TruncCopy(TruncName, Name, WinInfo.TruncLen); - - wchar_t CurProc[64], Errors[64], CurProcOut[MAX_PATH]; - FSF.sprintf(Buf,GetMsg(MDupCurProc),itoaa(CmpInfo.Proc,CurProc),itoaa(CmpInfo.Errors,Errors)); - strcentr(CurProcOut,Buf,WinInfo.TruncLen,0x00002500); - - wchar_t ProgressLineCur[MAX_PATH], ProgressLineTotal[MAX_PATH]; - if (!Opt.DupContents || bStartMsg) - wcscpy(ProgressLineCur,GetMsg(MWait)); - else - ProgressLine(ProgressLineCur,CmpInfo.CurProcSize,CmpInfo.CurCountSize); - - if (Opt.TotalProgress) - { - FSF.sprintf(Buf,GetMsg(MComparingFiles2),CmpInfo.CountSize && !((LPanel.PInfo.Flags&PFLAGS_PLUGIN) || (RPanel.PInfo.Flags&PFLAGS_PLUGIN))?(CmpInfo.ProcSize*100/CmpInfo.CountSize):0); - SetConsoleTitle(Buf); - - wchar_t Count[64], CountSize[64]; - FSF.sprintf(Buf,GetMsg(MComparingN),itoaa(CmpInfo.CountSize,CountSize),itoaa(CmpInfo.Count,Count)); - strcentr(ItemsOut,Buf,WinInfo.TruncLen,0x00002500); - - if ((LPanel.PInfo.Flags&PFLAGS_PLUGIN) || (RPanel.PInfo.Flags&PFLAGS_PLUGIN)) - wcscpy(ProgressLineTotal,GetMsg(MWait)); - else - ProgressLine(ProgressLineTotal,CmpInfo.ProcSize,CmpInfo.CountSize); - } - strcentr(Buf,L"",WinInfo.TruncLen,0x00002500); // просто сепаратор - - const wchar_t *MsgItems1[] = { - GetMsg(MCmpTitle), - TruncDir,TruncName,CurProcOut,ProgressLineCur - }; - - const wchar_t *MsgItems2[] = { - GetMsg(MCmpTitle), - TruncDir,TruncName,CurProcOut,ProgressLineCur,Buf,ProgressLineTotal,ItemsOut - }; - - - Info.Message(&MainGuid,&DupMsgGuid,bStartMsg?FMSG_LEFTALIGN:FMSG_LEFTALIGN|FMSG_KEEPBACKGROUND,0,Opt.TotalProgress?MsgItems2:MsgItems1, - Opt.TotalProgress?sizeof(MsgItems2)/sizeof(MsgItems2[0]):sizeof(MsgItems1)/sizeof(MsgItems1[0]),0); - bStartMsg=false; + // Для перерисовки не чаще 3-х раз в 1 сек. + if (!bRedraw) + { + static DWORD dwTicks; + DWORD dwNewTicks = GetTickCount(); + if (dwNewTicks - dwTicks < 350) + return; + dwTicks = dwNewTicks; + } + + wchar_t Buf[MAX_PATH], ItemsOut[MAX_PATH]; + + wchar_t TruncDir[MAX_PATH], TruncName[MAX_PATH]; + TruncCopy(TruncDir, GetPosToName(Dir), WinInfo.TruncLen, GetMsg(MComparing)); + TruncCopy(TruncName, Name, WinInfo.TruncLen); + + wchar_t CurProc[64], Errors[64], CurProcOut[MAX_PATH]; + FSF.sprintf(Buf, GetMsg(MDupCurProc), itoaa(CmpInfo.Proc, CurProc), itoaa(CmpInfo.Errors, Errors)); + strcentr(CurProcOut, Buf, WinInfo.TruncLen, 0x00002500); + + wchar_t ProgressLineCur[MAX_PATH], ProgressLineTotal[MAX_PATH]; + if (!Opt.DupContents || bStartMsg) + wcscpy(ProgressLineCur, GetMsg(MWait)); + else + ProgressLine(ProgressLineCur, CmpInfo.CurProcSize, CmpInfo.CurCountSize); + + if (Opt.TotalProgress) + { + FSF.sprintf(Buf, GetMsg(MComparingFiles2), + CmpInfo.CountSize && !((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN)) + ? (CmpInfo.ProcSize * 100 / CmpInfo.CountSize) + : 0); + SetConsoleTitle(Buf); + + wchar_t Count[64], CountSize[64]; + FSF.sprintf(Buf, GetMsg(MComparingN), itoaa(CmpInfo.CountSize, CountSize), itoaa(CmpInfo.Count, Count)); + strcentr(ItemsOut, Buf, WinInfo.TruncLen, 0x00002500); + + if ((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN)) + wcscpy(ProgressLineTotal, GetMsg(MWait)); + else + ProgressLine(ProgressLineTotal, CmpInfo.ProcSize, CmpInfo.CountSize); + } + strcentr(Buf, L"", WinInfo.TruncLen, 0x00002500); // просто сепаратор + + const wchar_t* MsgItems1[] = {GetMsg(MCmpTitle), TruncDir, TruncName, CurProcOut, ProgressLineCur}; + + const wchar_t* MsgItems2[] = {GetMsg(MCmpTitle), TruncDir, TruncName, CurProcOut, ProgressLineCur, Buf, ProgressLineTotal, ItemsOut}; + + Info.Message(&MainGuid, &DupMsgGuid, bStartMsg ? FMSG_LEFTALIGN : FMSG_LEFTALIGN | FMSG_KEEPBACKGROUND, 0, + Opt.TotalProgress ? MsgItems2 : MsgItems1, + Opt.TotalProgress ? sizeof(MsgItems2) / sizeof(MsgItems2[0]) : sizeof(MsgItems1) / sizeof(MsgItems1[0]), 0); + bStartMsg = false; } - - /**************************************************************************** * Сравнение атрибутов и прочего для двух одноимённых элементов (файлов или * подкаталогов). * Возвращает true, если они совпадают. ****************************************************************************/ -bool AdvCmpProc::CompareFiles(const wchar_t *LDir, const PluginPanelItem *pLPPI, const wchar_t *RDir, const PluginPanelItem *pRPPI, int ScanDepth, DWORD *dwFlag) +bool AdvCmpProc::CompareFiles(const wchar_t* LDir, const PluginPanelItem* pLPPI, const wchar_t* RDir, const PluginPanelItem* pRPPI, int ScanDepth, + DWORD* dwFlag) { - if (pLPPI->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - // Здесь сравниваем два подкаталога - if (Opt.Subfolders) - { - if (Opt.Subfolders==2 && Opt.MaxScanDepthFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + // Здесь сравниваем два подкаталога + if (Opt.Subfolders) + { + if (Opt.Subfolders == 2 && Opt.MaxScanDepth < ScanDepth + 1) + return true; - if (ScanDepth>0 && (bLPanelPlug || bRPanelPlug)) - return true; + bool bLPanelPlug = (LPanel.PInfo.Flags & PFLAGS_PLUGIN), bRPanelPlug = (RPanel.PInfo.Flags & PFLAGS_PLUGIN); - string strLFullDir, strRFullDir; - GetFullFileName(strLFullDir,LDir,pLPPI->FileName); - GetFullFileName(strRFullDir,RDir,pRPPI->FileName); + if (ScanDepth > 0 && (bLPanelPlug || bRPanelPlug)) + return true; - // Составим списки элементов в подкаталогах - struct DirList LList, RList; - bool bEqual = true; + string strLFullDir, strRFullDir; + GetFullFileName(strLFullDir, LDir, pLPPI->FileName); + GetFullFileName(strRFullDir, RDir, pRPPI->FileName); - if (!(bLPanelPlug || bRPanelPlug)) - { - if (!GetDirList(strLFullDir.get(),ScanDepth,false,&LList) || !GetDirList(strRFullDir.get(),ScanDepth,false,&RList)) - { - bBrokenByEsc=true; // То ли юзер прервал, то ли ошибка чтения - bEqual=false; // Остановим сравнение - } - } - else if (bLPanelPlug || bRPanelPlug) - { - LList.Dir=(wchar_t*)malloc((wcslen(LDir)+1)*sizeof(wchar_t)); - if (LList.Dir) wcscpy(LList.Dir,LDir); -// DebugMsg(L"LList.Dir",LList.Dir); -// DebugMsg(L"pLPPI->FileName",(wchar_t*)pLPPI->FileName); - RList.Dir=(wchar_t*)malloc((wcslen(RDir)+1)*sizeof(wchar_t)); - if (RList.Dir) wcscpy(RList.Dir,RDir); -// DebugMsg(L"RList.Dir",RList.Dir); -// DebugMsg(L"pRPPI->FileName",(wchar_t*)pRPPI->FileName); - - if (bLPanelPlug && !bBrokenByEsc && !Info.GetPluginDirList(&MainGuid,LPanel.hPanel,pLPPI->FileName,&LList.PPI,(size_t*)&LList.ItemsNumber)) - { - bBrokenByEsc=true; - bEqual=false; - } + // Составим списки элементов в подкаталогах + struct DirList LList, RList; + bool bEqual = true; - if (bRPanelPlug && !bBrokenByEsc && !Info.GetPluginDirList(&MainGuid,RPanel.hPanel,pRPPI->FileName,&RList.PPI,(size_t*)&RList.ItemsNumber)) - { - bBrokenByEsc=true; - bEqual=false; - } - - if (!bLPanelPlug && !bBrokenByEsc && !Info.GetDirList(GetPosToName(strLFullDir.get()),&LList.PPI,(size_t*)&LList.ItemsNumber)) - { - bBrokenByEsc=true; - bEqual=false; - } - - if (!bRPanelPlug && !bBrokenByEsc && !Info.GetDirList(GetPosToName(strRFullDir.get()),&RList.PPI,(size_t*)&RList.ItemsNumber)) - { - bBrokenByEsc=true; - bEqual=false; - } -// for (int i=0; bEqual && !LPanel.bARC && iFileSize+pRPPI->FileSize; - CmpInfo.CurProcSize=0; - - bool bFullCmp=(Opt.Mode==MODE_CMP||Opt.LightSync?false:true); - - // покажем "работу" на прогрессе :) - if (!Opt.CmpContents) // содержимое - особый случай... - CmpInfo.ProcSize+=CmpInfo.CurCountSize; - - //=========================================================================== - // регистр имен - if (Opt.CmpCase) - { - string strLFileName(LPanel.bTMP?FSF.PointToName(pLPPI->FileName):pLPPI->FileName); - string strRFileName(RPanel.bTMP?FSF.PointToName(pRPPI->FileName):pRPPI->FileName); + if (!(bLPanelPlug || bRPanelPlug)) + { + if (!GetDirList(strLFullDir.get(), ScanDepth, false, &LList) || !GetDirList(strRFullDir.get(), ScanDepth, false, &RList)) + { + bBrokenByEsc = true; // То ли юзер прервал, то ли ошибка чтения + bEqual = false; // Остановим сравнение + } + } + else if (bLPanelPlug || bRPanelPlug) + { + LList.Dir = (wchar_t*) malloc((wcslen(LDir) + 1) * sizeof(wchar_t)); + if (LList.Dir) + wcscpy(LList.Dir, LDir); + // DebugMsg(L"LList.Dir",LList.Dir); + // DebugMsg(L"pLPPI->FileName",(wchar_t*)pLPPI->FileName); + RList.Dir = (wchar_t*) malloc((wcslen(RDir) + 1) * sizeof(wchar_t)); + if (RList.Dir) + wcscpy(RList.Dir, RDir); + // DebugMsg(L"RList.Dir",RList.Dir); + // DebugMsg(L"pRPPI->FileName",(wchar_t*)pRPPI->FileName); + + if (bLPanelPlug && !bBrokenByEsc && + !Info.GetPluginDirList(&MainGuid, LPanel.hPanel, pLPPI->FileName, &LList.PPI, (size_t*) &LList.ItemsNumber)) + { + bBrokenByEsc = true; + bEqual = false; + } - if (Strncmp(Opt.SkipSubstr?CutSubstr(strLFileName,Opt.Substr):strLFileName.get(), - Opt.SkipSubstr?CutSubstr(strRFileName,Opt.Substr):strRFileName.get())) - { - if (bFullCmp) *dwFlag|=RCIF_NAMEDIFF; - else return false; - } - else if (bFullCmp) *dwFlag|=RCIF_NAME; - } - //=========================================================================== - // размер - if (Opt.CmpSize) - { - if (pLPPI->FileSize != pRPPI->FileSize) - { - if (bFullCmp) *dwFlag|=RCIF_SIZEDIFF; - else return false; - } - else if (bFullCmp) *dwFlag|=RCIF_SIZE; - } - //=========================================================================== - // время - if (Opt.CmpTime) - { - if (Opt.Seconds || Opt.IgnoreTimeZone) - { - union { - __int64 num; - struct { - DWORD lo; - DWORD hi; - } hilo; - } Precision, Difference, TimeDelta, temp; + if (bRPanelPlug && !bBrokenByEsc && + !Info.GetPluginDirList(&MainGuid, RPanel.hPanel, pRPPI->FileName, &RList.PPI, (size_t*) &RList.ItemsNumber)) + { + bBrokenByEsc = true; + bEqual = false; + } - Precision.hilo.hi = 0; - Precision.hilo.lo = (Opt.Seconds && Opt.LowPrecisionTime) ? 20000000 : 0; //2s or 0s - Difference.num = __int64(9000000000); //15m + if (!bLPanelPlug && !bBrokenByEsc && !Info.GetDirList(GetPosToName(strLFullDir.get()), &LList.PPI, (size_t*) &LList.ItemsNumber)) + { + bBrokenByEsc = true; + bEqual = false; + } - FILETIME LLastWriteTime=pLPPI->LastWriteTime, RLastWriteTime=pRPPI->LastWriteTime; + if (!bRPanelPlug && !bBrokenByEsc && !Info.GetDirList(GetPosToName(strRFullDir.get()), &RList.PPI, (size_t*) &RList.ItemsNumber)) + { + bBrokenByEsc = true; + bEqual = false; + } + // for (int i=0; bEqual && !LPanel.bARC && i RLastWriteTime.dwHighDateTime) - { - TimeDelta.hilo.hi=LLastWriteTime.dwHighDateTime - RLastWriteTime.dwHighDateTime; - TimeDelta.hilo.lo=LLastWriteTime.dwLowDateTime - RLastWriteTime.dwLowDateTime; - if (TimeDelta.hilo.lo > LLastWriteTime.dwLowDateTime) - --TimeDelta.hilo.hi; - } - else - { - if (LLastWriteTime.dwHighDateTime == RLastWriteTime.dwHighDateTime) - { - TimeDelta.hilo.hi=0; - TimeDelta.hilo.lo=max(RLastWriteTime.dwLowDateTime,LLastWriteTime.dwLowDateTime)- - min(RLastWriteTime.dwLowDateTime,LLastWriteTime.dwLowDateTime); - } - else - { - TimeDelta.hilo.hi=RLastWriteTime.dwHighDateTime - LLastWriteTime.dwHighDateTime; - TimeDelta.hilo.lo=RLastWriteTime.dwLowDateTime - LLastWriteTime.dwLowDateTime; - if (TimeDelta.hilo.lo > RLastWriteTime.dwLowDateTime) - --TimeDelta.hilo.hi; - } - } + if (!(bLPanelPlug || bRPanelPlug)) + { + FreeDirList(&LList); + FreeDirList(&RList); + } + else if (bLPanelPlug || bRPanelPlug) + { + free(LList.Dir); + free(RList.Dir); + if (bLPanelPlug) + Info.FreePluginDirList(LPanel.hPanel, LList.PPI, LList.ItemsNumber); + if (bRPanelPlug) + Info.FreePluginDirList(RPanel.hPanel, RList.PPI, RList.ItemsNumber); + if (!bLPanelPlug) + Info.FreeDirList(LList.PPI, LList.ItemsNumber); + if (!bRPanelPlug) + Info.FreeDirList(RList.PPI, RList.ItemsNumber); + } - //игнорировать различия не больше чем 26 часов. - if (Opt.IgnoreTimeZone) - { - int counter = 0; - while (TimeDelta.hilo.hi > Difference.hilo.hi && counter<=26*4) - { - temp.hilo.lo = TimeDelta.hilo.lo - Difference.hilo.lo; - temp.hilo.hi = TimeDelta.hilo.hi - Difference.hilo.hi; - if (temp.hilo.lo > TimeDelta.hilo.lo) - --temp.hilo.hi; - TimeDelta.hilo.lo = temp.hilo.lo; - TimeDelta.hilo.hi = temp.hilo.hi; - ++counter; - } - if (counter<=26*4 && TimeDelta.hilo.hi == Difference.hilo.hi) - { - TimeDelta.hilo.hi = 0; - TimeDelta.hilo.lo = max(TimeDelta.hilo.lo,Difference.hilo.lo) - min(TimeDelta.hilo.lo,Difference.hilo.lo); - } - } + return bEqual; + } + } + else + // Здесь сравниваем два файла + { + CmpInfo.CurCountSize = pLPPI->FileSize + pRPPI->FileSize; + CmpInfo.CurProcSize = 0; + + bool bFullCmp = (Opt.Mode == MODE_CMP || Opt.LightSync ? false : true); + + // покажем "работу" на прогрессе :) + if (!Opt.CmpContents) // содержимое - особый случай... + CmpInfo.ProcSize += CmpInfo.CurCountSize; + + //=========================================================================== + // регистр имен + if (Opt.CmpCase) + { + string strLFileName(LPanel.bTMP ? FSF.PointToName(pLPPI->FileName) : pLPPI->FileName); + string strRFileName(RPanel.bTMP ? FSF.PointToName(pRPPI->FileName) : pRPPI->FileName); + + if (Strncmp(Opt.SkipSubstr ? CutSubstr(strLFileName, Opt.Substr) : strLFileName.get(), + Opt.SkipSubstr ? CutSubstr(strRFileName, Opt.Substr) : strRFileName.get())) + { + if (bFullCmp) + *dwFlag |= RCIF_NAMEDIFF; + else + return false; + } + else if (bFullCmp) + *dwFlag |= RCIF_NAME; + } + //=========================================================================== + // размер + if (Opt.CmpSize) + { + if (pLPPI->FileSize != pRPPI->FileSize) + { + if (bFullCmp) + *dwFlag |= RCIF_SIZEDIFF; + else + return false; + } + else if (bFullCmp) + *dwFlag |= RCIF_SIZE; + } + //=========================================================================== + // время + if (Opt.CmpTime) + { + if (Opt.Seconds || Opt.IgnoreTimeZone) + { + union { + __int64 num; + struct + { + DWORD lo; + DWORD hi; + } hilo; + } Precision, Difference, TimeDelta, temp; - if ( Precision.hilo.hi < TimeDelta.hilo.hi || - (Precision.hilo.hi == TimeDelta.hilo.hi && Precision.hilo.lo < TimeDelta.hilo.lo)) - { - if (bFullCmp) *dwFlag|=RCIF_TIMEDIFF; - else return false; - } - else if (bFullCmp) *dwFlag|=RCIF_TIME; - } - else if (pLPPI->LastWriteTime.dwLowDateTime != pRPPI->LastWriteTime.dwLowDateTime || - pLPPI->LastWriteTime.dwHighDateTime != pRPPI->LastWriteTime.dwHighDateTime) - { - if (bFullCmp) *dwFlag|=RCIF_TIMEDIFF; - else return false; - } - else if (bFullCmp) *dwFlag|=RCIF_TIME; - } - //=========================================================================== - // содержимое - if (Opt.CmpContents) - { - bool bEqual=true; - string strLFullFileName, strRFullFileName; + Precision.hilo.hi = 0; + Precision.hilo.lo = (Opt.Seconds && Opt.LowPrecisionTime) ? 20000000 : 0; // 2s or 0s + Difference.num = __int64(9000000000); // 15m - // экспресс-сравнение: сравним размер файлов - if (!Opt.Ignore && (pLPPI->FileSize != pRPPI->FileSize)) - { - CmpInfo.ProcSize+=CmpInfo.CurCountSize; -// if (bFullCmp) *dwFlag|=RCIF_CONTDIFF; -// return false; - bEqual=false; - goto End; - } + FILETIME LLastWriteTime = pLPPI->LastWriteTime, RLastWriteTime = pRPPI->LastWriteTime; - // экспресс-сравнение: время совпало - скажем "одинаковые" - if ( Opt.OnlyTimeDiff && - (pLPPI->LastWriteTime.dwLowDateTime == pRPPI->LastWriteTime.dwLowDateTime && - pLPPI->LastWriteTime.dwHighDateTime == pRPPI->LastWriteTime.dwHighDateTime) - ) - { - CmpInfo.ProcSize+=CmpInfo.CurCountSize; -// if (bFullCmp) *dwFlag|=RCIF_CONT; - bEqual=true; -// return true; - goto End; - } - - // сравним 2-е архивные панели - if (LPanel.bARC && RPanel.bARC) - { - CmpInfo.ProcSize+=CmpInfo.CurCountSize; -// wchar_t buf[40]; -// FSF.sprintf(buf, L"L - %X R- %X", pLPPI->CRC32,pRPPI->CRC32); -// DebugMsg(buf, L""); - if (pLPPI->CRC32 == pRPPI->CRC32) bEqual=true; //return true; - else bEqual=false; //return false; - goto End; - } + if (Opt.Seconds && !Opt.LowPrecisionTime) + { + SYSTEMTIME Time; + FileTimeToSystemTime(&LLastWriteTime, &Time); + Time.wSecond = Time.wMilliseconds = 0; + SystemTimeToFileTime(&Time, &LLastWriteTime); + + FileTimeToSystemTime(&RLastWriteTime, &Time); + Time.wSecond = Time.wMilliseconds = 0; + SystemTimeToFileTime(&Time, &RLastWriteTime); + } - GetFullFileName(strLFullFileName,LDir,pLPPI->FileName); - GetFullFileName(strRFullFileName,RDir,pRPPI->FileName); + if (LLastWriteTime.dwHighDateTime > RLastWriteTime.dwHighDateTime) + { + TimeDelta.hilo.hi = LLastWriteTime.dwHighDateTime - RLastWriteTime.dwHighDateTime; + TimeDelta.hilo.lo = LLastWriteTime.dwLowDateTime - RLastWriteTime.dwLowDateTime; + if (TimeDelta.hilo.lo > LLastWriteTime.dwLowDateTime) + --TimeDelta.hilo.hi; + } + else + { + if (LLastWriteTime.dwHighDateTime == RLastWriteTime.dwHighDateTime) + { + TimeDelta.hilo.hi = 0; + TimeDelta.hilo.lo = + max(RLastWriteTime.dwLowDateTime, LLastWriteTime.dwLowDateTime) - min(RLastWriteTime.dwLowDateTime, LLastWriteTime.dwLowDateTime); + } + else + { + TimeDelta.hilo.hi = RLastWriteTime.dwHighDateTime - LLastWriteTime.dwHighDateTime; + TimeDelta.hilo.lo = RLastWriteTime.dwLowDateTime - LLastWriteTime.dwLowDateTime; + if (TimeDelta.hilo.lo > RLastWriteTime.dwLowDateTime) + --TimeDelta.hilo.hi; + } + } - // получим NativeDir - "\\?\dir\" - if (LPanel.bTMP || RPanel.bTMP) - { - size_t size=FSF.ConvertPath(CPM_NATIVE,LPanel.bTMP?strLFullFileName.get():strRFullFileName.get(),0,0); - wchar_t *buf=(wchar_t*)malloc(size*sizeof(wchar_t)); - if (buf) - { - FSF.ConvertPath(CPM_NATIVE,LPanel.bTMP?strLFullFileName.get():strRFullFileName.get(),buf,size); - (LPanel.bTMP?strLFullFileName:strRFullFileName)=buf; - free(buf); - } - } + //игнорировать различия не больше чем 26 часов. + if (Opt.IgnoreTimeZone) + { + int counter = 0; + while (TimeDelta.hilo.hi > Difference.hilo.hi && counter <= 26 * 4) + { + temp.hilo.lo = TimeDelta.hilo.lo - Difference.hilo.lo; + temp.hilo.hi = TimeDelta.hilo.hi - Difference.hilo.hi; + if (temp.hilo.lo > TimeDelta.hilo.lo) + --temp.hilo.hi; + TimeDelta.hilo.lo = temp.hilo.lo; + TimeDelta.hilo.hi = temp.hilo.hi; + ++counter; + } + if (counter <= 26 * 4 && TimeDelta.hilo.hi == Difference.hilo.hi) + { + TimeDelta.hilo.hi = 0; + TimeDelta.hilo.lo = max(TimeDelta.hilo.lo, Difference.hilo.lo) - min(TimeDelta.hilo.lo, Difference.hilo.lo); + } + } - // работа с кешем - DWORD dwLFileName, dwRFileName; + if (Precision.hilo.hi < TimeDelta.hilo.hi || (Precision.hilo.hi == TimeDelta.hilo.hi && Precision.hilo.lo < TimeDelta.hilo.lo)) + { + if (bFullCmp) + *dwFlag |= RCIF_TIMEDIFF; + else + return false; + } + else if (bFullCmp) + *dwFlag |= RCIF_TIME; + } + else if (pLPPI->LastWriteTime.dwLowDateTime != pRPPI->LastWriteTime.dwLowDateTime || + pLPPI->LastWriteTime.dwHighDateTime != pRPPI->LastWriteTime.dwHighDateTime) + { + if (bFullCmp) + *dwFlag |= RCIF_TIMEDIFF; + else + return false; + } + else if (bFullCmp) + *dwFlag |= RCIF_TIME; + } + //=========================================================================== + // содержимое + if (Opt.CmpContents) + { + bool bEqual = true; + string strLFullFileName, strRFullFileName; + + // экспресс-сравнение: сравним размер файлов + if (!Opt.Ignore && (pLPPI->FileSize != pRPPI->FileSize)) + { + CmpInfo.ProcSize += CmpInfo.CurCountSize; + // if (bFullCmp) *dwFlag|=RCIF_CONTDIFF; + // return false; + bEqual = false; + goto End; + } - if (Opt.Cache && !Opt.Ignore && !(LPanel.bARC || RPanel.bARC)) - { - dwLFileName=ProcessCRC((void *)strLFullFileName.get(),strLFullFileName.length()*2,0); - dwRFileName=ProcessCRC((void *)strRFullFileName.get(),strRFullFileName.length()*2,0); + // экспресс-сравнение: время совпало - скажем "одинаковые" + if (Opt.OnlyTimeDiff && + (pLPPI->LastWriteTime.dwLowDateTime == pRPPI->LastWriteTime.dwLowDateTime && + pLPPI->LastWriteTime.dwHighDateTime == pRPPI->LastWriteTime.dwHighDateTime)) + { + CmpInfo.ProcSize += CmpInfo.CurCountSize; + // if (bFullCmp) *dwFlag|=RCIF_CONT; + bEqual = true; + // return true; + goto End; + } - // Используем кешированные данные - if (!Opt.CacheIgnore ) - { - int Result=GetCacheResult(dwLFileName,dwRFileName, - ((__int64)pLPPI->LastWriteTime.dwHighDateTime << 32) | pLPPI->LastWriteTime.dwLowDateTime, - ((__int64)pRPPI->LastWriteTime.dwHighDateTime << 32) | pRPPI->LastWriteTime.dwLowDateTime); -// wchar_t buf[200]; -// FSF.sprintf(buf, L"GetCacheResult: L - %X R- %X", dwLFileName, dwRFileName); -// DebugMsg(buf,(wchar_t*)pLPPI->FindData.lpwszFileName,Result?(Result==RCIF_EQUAL?RCIF_EQUAL:RCIF_DIFFER):0); - - if (Result == RCIF_EQUAL) - { - CmpInfo.ProcSize+=CmpInfo.CurCountSize; -// if (bFullCmp) *dwFlag|=RCIF_CONT; - bEqual=true; -// return true; - goto End; - } - else if (Result == RCIF_DIFFER) - { - CmpInfo.ProcSize+=CmpInfo.CurCountSize; -// if (bFullCmp) *dwFlag|=RCIF_CONTDIFF; - bEqual=false; -// return false; - goto End; - } - } - } + // сравним 2-е архивные панели + if (LPanel.bARC && RPanel.bARC) + { + CmpInfo.ProcSize += CmpInfo.CurCountSize; + // wchar_t buf[40]; + // FSF.sprintf(buf, L"L - %X R- %X", pLPPI->CRC32,pRPPI->CRC32); + // DebugMsg(buf, L""); + if (pLPPI->CRC32 == pRPPI->CRC32) + bEqual = true; // return true; + else + bEqual = false; // return false; + goto End; + } - HANDLE hLFile, hRFile; - FILETIME LAccess, RAccess; - BY_HANDLE_FILE_INFORMATION LFileInfo, RFileInfo; - bool bOkLFileInfo=false, bOkRFileInfo=false; + GetFullFileName(strLFullFileName, LDir, pLPPI->FileName); + GetFullFileName(strRFullFileName, RDir, pRPPI->FileName); - if (!LPanel.bARC) - { - if ((hLFile=CreateFileW(strLFullFileName, GENERIC_READ, FILE_SHARE_READ, 0, - OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) == INVALID_HANDLE_VALUE) - { - CmpInfo.ProcSize+=CmpInfo.CurCountSize; - CmpInfo.Errors++; -// if (bFullCmp) *dwFlag|=RCIF_CONTDIFF; - bEqual=false; -// return false; - goto End; - } - bOkLFileInfo=GetFileInformationByHandle(hLFile,&LFileInfo); - // Сохраним время последнего доступа к файлу - LAccess=pLPPI->LastAccessTime; - } + // получим NativeDir - "\\?\dir\" + if (LPanel.bTMP || RPanel.bTMP) + { + size_t size = FSF.ConvertPath(CPM_NATIVE, LPanel.bTMP ? strLFullFileName.get() : strRFullFileName.get(), 0, 0); + wchar_t* buf = (wchar_t*) malloc(size * sizeof(wchar_t)); + if (buf) + { + FSF.ConvertPath(CPM_NATIVE, LPanel.bTMP ? strLFullFileName.get() : strRFullFileName.get(), buf, size); + (LPanel.bTMP ? strLFullFileName : strRFullFileName) = buf; + free(buf); + } + } - if (!RPanel.bARC) - { - if ((hRFile=CreateFileW(strRFullFileName, GENERIC_READ, FILE_SHARE_READ, 0, - OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) == INVALID_HANDLE_VALUE) - { - if (hLFile) CloseHandle(hLFile); - CmpInfo.ProcSize+=CmpInfo.CurCountSize; - CmpInfo.Errors++; -// if (bFullCmp) *dwFlag|=RCIF_CONTDIFF; - bEqual=false; -// return false; - goto End; - } - bOkRFileInfo=GetFileInformationByHandle(hRFile,&RFileInfo); - RAccess=pRPPI->LastAccessTime; - } + // работа с кешем + DWORD dwLFileName, dwRFileName; - //--------------------------------------------------------------------------- + if (Opt.Cache && !Opt.Ignore && !(LPanel.bARC || RPanel.bARC)) + { + dwLFileName = ProcessCRC((void*) strLFullFileName.get(), strLFullFileName.length() * 2, 0); + dwRFileName = ProcessCRC((void*) strRFullFileName.get(), strRFullFileName.length() * 2, 0); - ShowCmpMsg(LDir,pLPPI->FileName,RDir,pRPPI->FileName,true); + // Используем кешированные данные + if (!Opt.CacheIgnore) + { + int Result = + GetCacheResult(dwLFileName, dwRFileName, ((__int64) pLPPI->LastWriteTime.dwHighDateTime << 32) | pLPPI->LastWriteTime.dwLowDateTime, + ((__int64) pRPPI->LastWriteTime.dwHighDateTime << 32) | pRPPI->LastWriteTime.dwLowDateTime); + // wchar_t buf[200]; + // FSF.sprintf(buf, L"GetCacheResult: L - %X R- %X", dwLFileName, dwRFileName); + // DebugMsg(buf,(wchar_t*)pLPPI->FindData.lpwszFileName,Result?(Result==RCIF_EQUAL?RCIF_EQUAL:RCIF_DIFFER):0); + + if (Result == RCIF_EQUAL) + { + CmpInfo.ProcSize += CmpInfo.CurCountSize; + // if (bFullCmp) *dwFlag|=RCIF_CONT; + bEqual = true; + // return true; + goto End; + } + else if (Result == RCIF_DIFFER) + { + CmpInfo.ProcSize += CmpInfo.CurCountSize; + // if (bFullCmp) *dwFlag|=RCIF_CONTDIFF; + bEqual = false; + // return false; + goto End; + } + } + } - // экспресс-сравнение: FileIndex совпали - скажем "одинаковые" - if ( bOkLFileInfo && bOkRFileInfo && - LFileInfo.dwVolumeSerialNumber==RFileInfo.dwVolumeSerialNumber && - LFileInfo.nFileIndexHigh==RFileInfo.nFileIndexHigh && LFileInfo.nFileIndexLow==RFileInfo.nFileIndexLow ) - { - CloseHandle(hLFile); - CloseHandle(hRFile); - CmpInfo.ProcSize+=CmpInfo.CurCountSize; -// if (bFullCmp) *dwFlag|=RCIF_CONT; - bEqual=true; -// return true; - goto End; - } + HANDLE hLFile, hRFile; + FILETIME LAccess, RAccess; + BY_HANDLE_FILE_INFORMATION LFileInfo, RFileInfo; + bool bOkLFileInfo = false, bOkRFileInfo = false; - DWORD LReadSize=1, RReadSize=1; - DWORD LBufPos=1, RBufPos=1; // позиция в Opt.Buf - const DWORD ReadBlock=65536; - __int64 LFilePos=0, RFilePos=0; // позиция в файле + if (!LPanel.bARC) + { + if ((hLFile = CreateFileW(strLFullFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) == + INVALID_HANDLE_VALUE) + { + CmpInfo.ProcSize += CmpInfo.CurCountSize; + CmpInfo.Errors++; + // if (bFullCmp) *dwFlag|=RCIF_CONTDIFF; + bEqual = false; + // return false; + goto End; + } + bOkLFileInfo = GetFileInformationByHandle(hLFile, &LFileInfo); + // Сохраним время последнего доступа к файлу + LAccess = pLPPI->LastAccessTime; + } - { - char *LPtr=Opt.Buf[0]+LBufPos, *RPtr=Opt.Buf[1]+RBufPos; - bool bLExpectNewLine=false, bRExpectNewLine=false; - - SHFILEINFO shinfo; - bool bExe=false; - if (!(LPanel.bARC || RPanel.bARC)) - bExe=(SHGetFileInfoW(strLFullFileName,0,&shinfo,sizeof(shinfo),SHGFI_EXETYPE) || - SHGetFileInfoW(strRFullFileName,0,&shinfo,sizeof(shinfo),SHGFI_EXETYPE)); - - DWORD dwFileCRC=0; - __int64 PartlyKbSize=(__int64)Opt.PartlyKbSize*1024; - // частичное сравнение - bool bPartlyFull=( Opt.Partly && !Opt.Ignore && !(LPanel.bARC || RPanel.bARC) && - (Opt.PartlyFull && pLPPI->FileSize > Opt.BufSize) ); - - bool bPartlyKb=( Opt.Partly && !Opt.Ignore && !(LPanel.bARC || RPanel.bARC) && - (!Opt.PartlyFull && PartlyKbSize && pLPPI->FileSize > (unsigned __int64)abs(PartlyKbSize)) ); - - unsigned int BlockIndex=pLPPI->FileSize / Opt.BufSize; - unsigned int LCurBlockIndex=0, RCurBlockIndex=0; - - // если с минусом, отсчитаем с конца файла - bool bFromEnd=(bPartlyKb && abs(PartlyKbSize)!=PartlyKbSize); - if (bFromEnd) - { - if (!mySetFilePointer(hLFile,PartlyKbSize,FILE_END) || !mySetFilePointer(hRFile,PartlyKbSize,FILE_END)) - bEqual=false; - } + if (!RPanel.bARC) + { + if ((hRFile = CreateFileW(strRFullFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) == + INVALID_HANDLE_VALUE) + { + if (hLFile) + CloseHandle(hLFile); + CmpInfo.ProcSize += CmpInfo.CurCountSize; + CmpInfo.Errors++; + // if (bFullCmp) *dwFlag|=RCIF_CONTDIFF; + bEqual = false; + // return false; + goto End; + } + bOkRFileInfo = GetFileInformationByHandle(hRFile, &RFileInfo); + RAccess = pRPPI->LastAccessTime; + } - while (1) - { - // частичное сравнение, пропускаем блоками по Opt.BufSize - if (bPartlyFull) - { - if (!mySetFilePointer(hLFile,Opt.BufSize,FILE_CURRENT) || !mySetFilePointer(hRFile,Opt.BufSize,FILE_CURRENT)) - { - bEqual=false; - break; - } -// else DebugMsg(L"skip",L"",Opt.BufSize); - } - - // читаем файл с активной панели - if (!LPanel.bARC && LPtr >= Opt.Buf[0]+LBufPos) - { - LBufPos=0; - LPtr=Opt.Buf[0]; - // читаем блоком Opt.BufSize - while (LBufPos < (unsigned)Opt.BufSize) - { - if (CheckForEsc() || - !ReadFile(hLFile,Opt.Buf[0]+LBufPos,(!bPartlyKb || bFromEnd || LFilePos+ReadBlock<=PartlyKbSize)?ReadBlock:(PartlyKbSize-LFilePos),&LReadSize,0)) - { - bEqual=false; - break; - } - LBufPos+=LReadSize; - LFilePos+=LReadSize; -// DebugMsg(L"LReadSize",L"",LReadSize); - CmpInfo.CurProcSize+=LReadSize; - CmpInfo.ProcSize+=LReadSize; - if (LReadSize < ReadBlock) break; - } - } - if (!bEqual) - break; - - // читаем файл с пассивной панели - if (!RPanel.bARC && RPtr >= Opt.Buf[1]+RBufPos) - { - RBufPos=0; - RPtr=Opt.Buf[1]; - // читаем блоком Opt.BufSize - while (RBufPos < (unsigned)Opt.BufSize) - { - if (CheckForEsc() || - !ReadFile(hRFile,Opt.Buf[1]+RBufPos,(!bPartlyKb || bFromEnd || RFilePos+ReadBlock<=PartlyKbSize)?ReadBlock:(PartlyKbSize-RFilePos),&RReadSize,0)) - { - bEqual=false; - break; - } - RBufPos+=RReadSize; - RFilePos+=RReadSize; -// DebugMsg(L"RReadSize",L"",RReadSize); - - CmpInfo.CurProcSize+=RReadSize; - CmpInfo.ProcSize+=RReadSize; - if (RReadSize < ReadBlock) break; - } - } - if (!bEqual) - break; - - ShowCmpMsg(LDir,pLPPI->FileName,RDir,pRPPI->FileName,false); - - // сравниваем с архивом - if (RPanel.bARC) - { - dwFileCRC=ProcessCRC(Opt.Buf[0],LBufPos,dwFileCRC); - LPtr+=LBufPos; - CmpInfo.CurProcSize+=LBufPos; - CmpInfo.ProcSize+=LBufPos; - } - else if (LPanel.bARC) - { - dwFileCRC=ProcessCRC(Opt.Buf[1],RBufPos,dwFileCRC); - RPtr+=RBufPos; - CmpInfo.CurProcSize+=RBufPos; - CmpInfo.ProcSize+=RBufPos; - } - - if (LPanel.bARC || RPanel.bARC) - { - if ((RPanel.bARC && LBufPos != Opt.BufSize) || (LPanel.bARC && RBufPos != Opt.BufSize)) - { - if (!LPanel.bARC && RPanel.bARC && dwFileCRC != pRPPI->CRC32) - bEqual=false; - else if (LPanel.bARC && !RPanel.bARC && dwFileCRC != pLPPI->CRC32) - bEqual=false; -// wchar_t buf[40]; -// FSF.sprintf(buf, L"L - %X R- %X", LPanel.bARC?pLPPI->CRC32:dwFileCRC, RPanel.bARC?pRPPI->CRC32:dwFileCRC); -// if ((LPanel.bARC?pLPPI->CRC32:dwFileCRC)!=(RPanel.bARC?pRPPI->CRC32:dwFileCRC)) -// DebugMsg(buf,(wchar_t*)pLPPI->FindData.lpwszFileName,(LPanel.bARC?pLPPI->CRC32:dwFileCRC)!=(RPanel.bARC?pRPPI->CRC32:dwFileCRC)); - break; - } - else - continue; - } - - // обычное сравнение (фильтр отключен или файлы исполнимые) - if (!Opt.Ignore || bExe) - { - if (memcmp(Opt.Buf[0], Opt.Buf[1], LBufPos)) - { - bEqual=false; - break; - } - LPtr += LBufPos; - RPtr += RBufPos; - - // считали всё, выходим - if (LBufPos != Opt.BufSize || RBufPos != Opt.BufSize) - break; - } - else - // фильтр включен - { - if (Opt.IgnoreTemplates == 0) // '\n' & ' ' - { - while (LPtr < Opt.Buf[0]+LBufPos && RPtr < Opt.Buf[1]+RBufPos && !IsWhiteSpace(*LPtr) && !IsWhiteSpace(*RPtr)) - { - if (*LPtr != *RPtr) - { - bEqual=false; - break; - } - ++LPtr; - ++RPtr; - } - if (!bEqual) - break; - - while (LPtr < Opt.Buf[0]+LBufPos && IsWhiteSpace(*LPtr)) - ++LPtr; - - while (RPtr < Opt.Buf[1]+RBufPos && IsWhiteSpace(*RPtr)) - ++RPtr; - } - else if (Opt.IgnoreTemplates == 1) // '\n' - { - if (bLExpectNewLine) - { - bLExpectNewLine=false; - if (LPtr < Opt.Buf[0]+LBufPos && *LPtr == '\n') - ++LPtr; - } - - if (bRExpectNewLine) - { - bRExpectNewLine=false; - if (RPtr < Opt.Buf[1]+RBufPos && *RPtr == '\n') - ++RPtr; - } - - while (LPtr < Opt.Buf[0]+LBufPos && RPtr < Opt.Buf[1]+RBufPos && !IsNewLine(*LPtr) && !IsNewLine(*RPtr)) - { - if (*LPtr != *RPtr) - { - bEqual=false; - break; - } - ++LPtr; - ++RPtr; - } - if (!bEqual) - break; - - if (LPtr < Opt.Buf[0]+LBufPos && RPtr < Opt.Buf[1]+RBufPos && (!IsNewLine(*LPtr) || !IsNewLine(*RPtr))) - { - bEqual = false; - break; - } - - if (LPtr < Opt.Buf[0]+LBufPos && RPtr < Opt.Buf[1]+RBufPos) - { - if (*LPtr == '\r') - bLExpectNewLine=true; - - if (*RPtr == '\r') - bRExpectNewLine=true; - - ++LPtr; - ++RPtr; - } - } - else if (Opt.IgnoreTemplates == 2) // ' ' - { - while (LPtr < Opt.Buf[0]+LBufPos && RPtr < Opt.Buf[1]+RBufPos && !myIsSpace(*LPtr) && !myIsSpace(*RPtr)) - { - if (*LPtr != *RPtr) - { - bEqual=false; - break; - } - ++LPtr; - ++RPtr; - } - if (!bEqual) - break; - - while (LPtr < Opt.Buf[0]+LBufPos && myIsSpace(*LPtr)) - ++LPtr; - - while (RPtr < Opt.Buf[1]+RBufPos && myIsSpace(*RPtr)) - ++RPtr; - } - if (!LReadSize && RReadSize || LReadSize && !RReadSize) - { - bEqual = false; - break; - } - } - if (!LReadSize && !RReadSize) - break; - } + //--------------------------------------------------------------------------- - // поместим в кэш результат - if (Opt.Cache && !(LPanel.bARC || RPanel.bARC) && (!Opt.Ignore || bExe) && !Opt.Partly) - { - Opt.Cache=SetCacheResult(dwLFileName,dwRFileName, - ((__int64)pLPPI->LastWriteTime.dwHighDateTime << 32) | pLPPI->LastWriteTime.dwLowDateTime, - ((__int64)pRPPI->LastWriteTime.dwHighDateTime << 32) | pRPPI->LastWriteTime.dwLowDateTime, - bEqual?RCIF_EQUAL:RCIF_DIFFER); -// DebugMsg(L"SetCacheResult",(wchar_t*)pLPPI->FindData.lpwszFileName,bEqual?RCIF_EQUAL:RCIF_DIFFER); -// wchar_t buf[200]; -// FSF.sprintf(buf, L"SetCacheResult: L - %X R- %X", dwLFileName, dwRFileName); -// DebugMsg(buf,(wchar_t*)pLPPI->FindData.lpwszFileName,bEqual?RCIF_EQUAL:RCIF_DIFFER); + ShowCmpMsg(LDir, pLPPI->FileName, RDir, pRPPI->FileName, true); - } - } - if (!(LPanel.bARC)) - { - CloseHandle(hLFile); - if ((hLFile=CreateFileW(strLFullFileName, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, - OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) != INVALID_HANDLE_VALUE) - { - SetFileTime(hLFile,0,&LAccess,0); - CloseHandle(hLFile); - } - } - if (!(RPanel.bARC)) - { - CloseHandle(hRFile); - if ((hRFile=CreateFileW(strRFullFileName, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, - OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) != INVALID_HANDLE_VALUE) - { - SetFileTime(hRFile,0,&RAccess,0); - CloseHandle(hRFile); - } - } - if (!bEqual) - { - CmpInfo.ProcSize+=CmpInfo.CurCountSize-CmpInfo.CurProcSize; -// if (bFullCmp) *dwFlag|=RCIF_CONTDIFF; -// return false; - } + // экспресс-сравнение: FileIndex совпали - скажем "одинаковые" + if (bOkLFileInfo && bOkRFileInfo && LFileInfo.dwVolumeSerialNumber == RFileInfo.dwVolumeSerialNumber && + LFileInfo.nFileIndexHigh == RFileInfo.nFileIndexHigh && LFileInfo.nFileIndexLow == RFileInfo.nFileIndexLow) + { + CloseHandle(hLFile); + CloseHandle(hRFile); + CmpInfo.ProcSize += CmpInfo.CurCountSize; + // if (bFullCmp) *dwFlag|=RCIF_CONT; + bEqual = true; + // return true; + goto End; + } -End: - if (!bEqual) - { - if (bFullCmp) *dwFlag|=RCIF_CONTDIFF; - else return false; - } - else if (bFullCmp) *dwFlag|=RCIF_CONT; - } - //=========================================================================== - // если полное сравнение, то суммируем результаты сравнения - if (bFullCmp && ((*dwFlag&RCIF_NAMEDIFF) || (*dwFlag&RCIF_TIMEDIFF) || (*dwFlag&RCIF_SIZEDIFF) || (*dwFlag&RCIF_CONTDIFF))) - return false; - } - return true; -} + DWORD LReadSize = 1, RReadSize = 1; + DWORD LBufPos = 1, RBufPos = 1; // позиция в Opt.Buf + const DWORD ReadBlock = 65536; + __int64 LFilePos = 0, RFilePos = 0; // позиция в файле -/**************************************************************************** - * Сравнение двух каталогов, описанных структурами AInfo и PInfo. - * Возвращает true, если они совпадают. - * Параметр bCompareAll определяет, - * надо ли сравнивать все файлы и взводить PPIF_SELECTED (bCompareAll == true) - * или просто вернуть false при первом несовпадении (bCompareAll == false). - ****************************************************************************/ -bool AdvCmpProc::CompareDirs(const struct DirList *pLList,const struct DirList *pRList,bool bCompareAll,int ScanDepth) -{ - // Стартуем с сообщением о сравнении - ShowCmpMsg(pLList->Dir,L"*",pRList->Dir,L"*",true); + { + char *LPtr = Opt.Buf[0] + LBufPos, *RPtr = Opt.Buf[1] + RBufPos; + bool bLExpectNewLine = false, bRExpectNewLine = false; - // строим индексы элементов, для убыстрения сравнения - struct ItemsIndex LII, RII; - if (!BuildItemsIndex(true,pLList,&LII,ScanDepth) || !BuildItemsIndex(false,pRList,&RII,ScanDepth)) - { - ErrorMsg(MNoMemTitle,MNoMemBody); - bBrokenByEsc=true; - FreeItemsIndex(&LII); - FreeItemsIndex(&RII); - return true; - } + SHFILEINFO shinfo; + bool bExe = false; + if (!(LPanel.bARC || RPanel.bARC)) + bExe = (SHGetFileInfoW(strLFullFileName, 0, &shinfo, sizeof(shinfo), SHGFI_EXETYPE) || + SHGetFileInfoW(strRFullFileName, 0, &shinfo, sizeof(shinfo), SHGFI_EXETYPE)); - int i=0, j=0; + DWORD dwFileCRC = 0; + __int64 PartlyKbSize = (__int64) Opt.PartlyKbSize * 1024; + // частичное сравнение + bool bPartlyFull = (Opt.Partly && !Opt.Ignore && !(LPanel.bARC || RPanel.bARC) && (Opt.PartlyFull && pLPPI->FileSize > Opt.BufSize)); - // соберем информацию, сколько элементов будем сравнивать и их размер - if (ScanDepth==0 && Opt.TotalProgress) - { - while (iFileAttributes&FILE_ATTRIBUTE_DIRECTORY && !(LPanel.PInfo.Flags&PFLAGS_PLUGIN)) - { - GetFullFileName(strDir,pLList->Dir,LII.pPPI[i]->FileName); - GetDirList(strDir.get(),ScanDepth,true); - } - else - { - CmpInfo.Count+=1; - CmpInfo.CountSize+=(unsigned __int64)LII.pPPI[i]->FileSize; - } - - if (!bBrokenByEsc) - { - if (RII.pPPI[j]->FileAttributes&FILE_ATTRIBUTE_DIRECTORY && !(RPanel.PInfo.Flags&PFLAGS_PLUGIN)) - { - GetFullFileName(strDir,pRList->Dir,RII.pPPI[j]->FileName); - GetDirList(strDir.get(),ScanDepth,true); - } - else - { - CmpInfo.Count+=1; - CmpInfo.CountSize+=(unsigned __int64)RII.pPPI[j]->FileSize; - } - } - i++; j++; - break; - } - case -1: - { - CmpInfo.Count+=1; - CmpInfo.CountSize+=(unsigned __int64)LII.pPPI[i]->FileSize; - i++; - break; - } - case 1: - { - CmpInfo.Count+=1; - CmpInfo.CountSize+=(unsigned __int64)RII.pPPI[j]->FileSize; - j++; - break; - } - } - } - } + bool bPartlyKb = (Opt.Partly && !Opt.Ignore && !(LPanel.bARC || RPanel.bARC) && + (!Opt.PartlyFull && PartlyKbSize && pLPPI->FileSize > (unsigned __int64) abs(PartlyKbSize))); - if (bBrokenByEsc) - { - FreeItemsIndex(&LII); - FreeItemsIndex(&RII); - return true; - } + unsigned int BlockIndex = pLPPI->FileSize / Opt.BufSize; + unsigned int LCurBlockIndex = 0, RCurBlockIndex = 0; - // экспресс-сравнение вложенного каталога - if (ScanDepth && !Opt.Dialog && !Opt.IgnoreMissing && LII.iCount!=RII.iCount) - { - FreeItemsIndex(&LII); - FreeItemsIndex(&RII); - return false; - } + // если с минусом, отсчитаем с конца файла + bool bFromEnd = (bPartlyKb && abs(PartlyKbSize) != PartlyKbSize); + if (bFromEnd) + { + if (!mySetFilePointer(hLFile, PartlyKbSize, FILE_END) || !mySetFilePointer(hRFile, PartlyKbSize, FILE_END)) + bEqual = false; + } - // вначале снимем выделение на панелях - if (ScanDepth==0) - { - for (i=0; iItemsNumber; i++) - pLList->PPI[i].Flags &= ~PPIF_SELECTED; - for (i=0; iItemsNumber; i++) - pRList->PPI[i].Flags &= ~PPIF_SELECTED; - } + while (1) + { + // частичное сравнение, пропускаем блоками по Opt.BufSize + if (bPartlyFull) + { + if (!mySetFilePointer(hLFile, Opt.BufSize, FILE_CURRENT) || !mySetFilePointer(hRFile, Opt.BufSize, FILE_CURRENT)) + { + bEqual = false; + break; + } + // else DebugMsg(L"skip",L"",Opt.BufSize); + } - // начинаем сравнивать "наши" элементы... - bool bDifferenceNotFound=true; - i=0; j=0; - DWORD dwFlag=0; + // читаем файл с активной панели + if (!LPanel.bARC && LPtr >= Opt.Buf[0] + LBufPos) + { + LBufPos = 0; + LPtr = Opt.Buf[0]; + // читаем блоком Opt.BufSize + while (LBufPos < (unsigned) Opt.BufSize) + { + if (CheckForEsc() || + !ReadFile(hLFile, Opt.Buf[0] + LBufPos, + (!bPartlyKb || bFromEnd || LFilePos + ReadBlock <= PartlyKbSize) ? ReadBlock : (PartlyKbSize - LFilePos), &LReadSize, 0)) + { + bEqual = false; + break; + } + LBufPos += LReadSize; + LFilePos += LReadSize; + // DebugMsg(L"LReadSize",L"",LReadSize); + CmpInfo.CurProcSize += LReadSize; + CmpInfo.ProcSize += LReadSize; + if (LReadSize < ReadBlock) + break; + } + } + if (!bEqual) + break; - while (i= Opt.Buf[1] + RBufPos) + { + RBufPos = 0; + RPtr = Opt.Buf[1]; + // читаем блоком Opt.BufSize + while (RBufPos < (unsigned) Opt.BufSize) + { + if (CheckForEsc() || + !ReadFile(hRFile, Opt.Buf[1] + RBufPos, + (!bPartlyKb || bFromEnd || RFilePos + ReadBlock <= PartlyKbSize) ? ReadBlock : (PartlyKbSize - RFilePos), &RReadSize, 0)) + { + bEqual = false; + break; + } + RBufPos += RReadSize; + RFilePos += RReadSize; + // DebugMsg(L"RReadSize",L"",RReadSize); + + CmpInfo.CurProcSize += RReadSize; + CmpInfo.ProcSize += RReadSize; + if (RReadSize < ReadBlock) + break; + } + } + if (!bEqual) + break; - bool bNextItem; - dwFlag=RCIF_DIFFER; + ShowCmpMsg(LDir, pLPPI->FileName, RDir, pRPPI->FileName, false); - switch (PICompare(&LII.pPPI[i], &RII.pPPI[j], NULL)) - { + // сравниваем с архивом + if (RPanel.bARC) + { + dwFileCRC = ProcessCRC(Opt.Buf[0], LBufPos, dwFileCRC); + LPtr += LBufPos; + CmpInfo.CurProcSize += LBufPos; + CmpInfo.ProcSize += LBufPos; + } + else if (LPanel.bARC) + { + dwFileCRC = ProcessCRC(Opt.Buf[1], RBufPos, dwFileCRC); + RPtr += RBufPos; + CmpInfo.CurProcSize += RBufPos; + CmpInfo.ProcSize += RBufPos; + } - /******************************************************************************/ + if (LPanel.bARC || RPanel.bARC) + { + if ((RPanel.bARC && LBufPos != Opt.BufSize) || (LPanel.bARC && RBufPos != Opt.BufSize)) + { + if (!LPanel.bARC && RPanel.bARC && dwFileCRC != pRPPI->CRC32) + bEqual = false; + else if (LPanel.bARC && !RPanel.bARC && dwFileCRC != pLPPI->CRC32) + bEqual = false; + // wchar_t buf[40]; + // FSF.sprintf(buf, L"L - %X R- %X", LPanel.bARC?pLPPI->CRC32:dwFileCRC, RPanel.bARC?pRPPI->CRC32:dwFileCRC); + // if ((LPanel.bARC?pLPPI->CRC32:dwFileCRC)!=(RPanel.bARC?pRPPI->CRC32:dwFileCRC)) + // DebugMsg(buf,(wchar_t*)pLPPI->FindData.lpwszFileName,(LPanel.bARC?pLPPI->CRC32:dwFileCRC)!=(RPanel.bARC?pRPPI->CRC32:dwFileCRC)); + break; + } + else + continue; + } - case 0: // Имена совпали - проверяем всё остальное - { -//wchar_t buf[512]; -//FSF.sprintf(buf,L"Left: %s Right: %s, %d + %d", LII.pPPI[i]->FindData.lpwszFileName, RII.pPPI[j]->FindData.lpwszFileName, i,j); -// DebugMsg(buf,L"case 0",bDifferenceNotFound); - - if (CompareFiles(pLList->Dir,LII.pPPI[i],pRList->Dir,RII.pPPI[j],ScanDepth,&dwFlag)) - {// И остальное совпало - i++; j++; - dwFlag=RCIF_EQUAL; // просто установим - } - else - { - bDifferenceNotFound=false; - // узнаем, новый кто? - __int64 Delta=(((__int64)LII.pPPI[i]->LastWriteTime.dwHighDateTime << 32) | LII.pPPI[i]->LastWriteTime.dwLowDateTime) - - (((__int64)RII.pPPI[j]->LastWriteTime.dwHighDateTime << 32) | RII.pPPI[j]->LastWriteTime.dwLowDateTime); - if (Opt.CmpTime) - { - if (Delta>0) { dwFlag &= ~RCIF_DIFFER; dwFlag|=RCIF_LNEW; } - else if (Delta<0) { dwFlag &= ~RCIF_DIFFER; dwFlag|=RCIF_RNEW; } - } - if (Opt.SelectedNew) - { - if (Delta>0) - { - LII.pPPI[i]->Flags |= PPIF_SELECTED; - } - else if (Delta<0) - { - RII.pPPI[j]->Flags |= PPIF_SELECTED; - } - else - { - LII.pPPI[i]->Flags |= PPIF_SELECTED; - RII.pPPI[j]->Flags |= PPIF_SELECTED; - } - } - else - { - LII.pPPI[i]->Flags |= PPIF_SELECTED; - RII.pPPI[j]->Flags |= PPIF_SELECTED; - } - i++; j++; - CmpInfo.LDiff++; CmpInfo.RDiff++; -// dwFlag=RCIF_DIFFER; - if (Opt.StopDiffDup && !bBrokenByEsc) - { // нужно ли продолжать сравнивать - bCompareAll=(Opt.ShowMsg && !YesNoMsg(MFirstDiffTitle, MFirstDiffBody)); - Opt.StopDiffDup=0; - } - } - CmpInfo.Proc+=2; - // добавим элемент в диалог результатов - if (Opt.Dialog) - MakeFileList(pLList->Dir,LII.pPPI[i-1],pRList->Dir,RII.pPPI[j-1],dwFlag); - break; - } + // обычное сравнение (фильтр отключен или файлы исполнимые) + if (!Opt.Ignore || bExe) + { + if (memcmp(Opt.Buf[0], Opt.Buf[1], LBufPos)) + { + bEqual = false; + break; + } + LPtr += LBufPos; + RPtr += RBufPos; - /******************************************************************************/ + // считали всё, выходим + if (LBufPos != Opt.BufSize || RBufPos != Opt.BufSize) + break; + } + else + // фильтр включен + { + if (Opt.IgnoreTemplates == 0) // '\n' & ' ' + { + while (LPtr < Opt.Buf[0] + LBufPos && RPtr < Opt.Buf[1] + RBufPos && !IsWhiteSpace(*LPtr) && !IsWhiteSpace(*RPtr)) + { + if (*LPtr != *RPtr) + { + bEqual = false; + break; + } + ++LPtr; + ++RPtr; + } + if (!bEqual) + break; + + while (LPtr < Opt.Buf[0] + LBufPos && IsWhiteSpace(*LPtr)) ++LPtr; + + while (RPtr < Opt.Buf[1] + RBufPos && IsWhiteSpace(*RPtr)) ++RPtr; + } + else if (Opt.IgnoreTemplates == 1) // '\n' + { + if (bLExpectNewLine) + { + bLExpectNewLine = false; + if (LPtr < Opt.Buf[0] + LBufPos && *LPtr == '\n') + ++LPtr; + } + + if (bRExpectNewLine) + { + bRExpectNewLine = false; + if (RPtr < Opt.Buf[1] + RBufPos && *RPtr == '\n') + ++RPtr; + } + + while (LPtr < Opt.Buf[0] + LBufPos && RPtr < Opt.Buf[1] + RBufPos && !IsNewLine(*LPtr) && !IsNewLine(*RPtr)) + { + if (*LPtr != *RPtr) + { + bEqual = false; + break; + } + ++LPtr; + ++RPtr; + } + if (!bEqual) + break; + + if (LPtr < Opt.Buf[0] + LBufPos && RPtr < Opt.Buf[1] + RBufPos && (!IsNewLine(*LPtr) || !IsNewLine(*RPtr))) + { + bEqual = false; + break; + } + + if (LPtr < Opt.Buf[0] + LBufPos && RPtr < Opt.Buf[1] + RBufPos) + { + if (*LPtr == '\r') + bLExpectNewLine = true; + + if (*RPtr == '\r') + bRExpectNewLine = true; + + ++LPtr; + ++RPtr; + } + } + else if (Opt.IgnoreTemplates == 2) // ' ' + { + while (LPtr < Opt.Buf[0] + LBufPos && RPtr < Opt.Buf[1] + RBufPos && !myIsSpace(*LPtr) && !myIsSpace(*RPtr)) + { + if (*LPtr != *RPtr) + { + bEqual = false; + break; + } + ++LPtr; + ++RPtr; + } + if (!bEqual) + break; + + while (LPtr < Opt.Buf[0] + LBufPos && myIsSpace(*LPtr)) ++LPtr; + + while (RPtr < Opt.Buf[1] + RBufPos && myIsSpace(*RPtr)) ++RPtr; + } + if (!LReadSize && RReadSize || LReadSize && !RReadSize) + { + bEqual = false; + break; + } + } + if (!LReadSize && !RReadSize) + break; + } - case -1: // Элемент LII.pPPI[i] не имеет одноимённых в RII.pPPI - { -//wchar_t buf2[512]; -//FSF.sprintf(buf2,L"Left: %s Right: %s", LII.pPPI[i]->FindData.lpwszFileName, RII.pPPI[j]->FindData.lpwszFileName); -// DebugMsg(buf2,L"case -1",bDifferenceNotFound); + // поместим в кэш результат + if (Opt.Cache && !(LPanel.bARC || RPanel.bARC) && (!Opt.Ignore || bExe) && !Opt.Partly) + { + Opt.Cache = SetCacheResult( + dwLFileName, dwRFileName, ((__int64) pLPPI->LastWriteTime.dwHighDateTime << 32) | pLPPI->LastWriteTime.dwLowDateTime, + ((__int64) pRPPI->LastWriteTime.dwHighDateTime << 32) | pRPPI->LastWriteTime.dwLowDateTime, bEqual ? RCIF_EQUAL : RCIF_DIFFER); + // DebugMsg(L"SetCacheResult",(wchar_t*)pLPPI->FindData.lpwszFileName,bEqual?RCIF_EQUAL:RCIF_DIFFER); + // wchar_t buf[200]; + // FSF.sprintf(buf, L"SetCacheResult: L - %X R- %X", dwLFileName, dwRFileName); + // DebugMsg(buf,(wchar_t*)pLPPI->FindData.lpwszFileName,bEqual?RCIF_EQUAL:RCIF_DIFFER); + } + } + if (!(LPanel.bARC)) + { + CloseHandle(hLFile); + if ((hLFile = CreateFileW(strLFullFileName, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, + FILE_FLAG_SEQUENTIAL_SCAN, 0)) != INVALID_HANDLE_VALUE) + { + SetFileTime(hLFile, 0, &LAccess, 0); + CloseHandle(hLFile); + } + } + if (!(RPanel.bARC)) + { + CloseHandle(hRFile); + if ((hRFile = CreateFileW(strRFullFileName, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, + FILE_FLAG_SEQUENTIAL_SCAN, 0)) != INVALID_HANDLE_VALUE) + { + SetFileTime(hRFile, 0, &RAccess, 0); + CloseHandle(hRFile); + } + } + if (!bEqual) + { + CmpInfo.ProcSize += CmpInfo.CurCountSize - CmpInfo.CurProcSize; + // if (bFullCmp) *dwFlag|=RCIF_CONTDIFF; + // return false; + } - CmpContinueL: - dwFlag=RCIF_DIFFER; - if (!Opt.IgnoreMissing || (Opt.IgnoreMissing==2 && ScanDepth)) - { - if (!LPanel.bTMP) - { - bNextItem=true; - goto FoundDiffL; - } - else - { // ...но если с Темп-панели, то проверим с элементом RII.pPPI - bNextItem=false; - for (int k=0; kDir,LII.pPPI[i],pRList->Dir,RII.pPPI[k],ScanDepth,&dwFlag)) - { - i++; - break; - } - else - FoundDiffL: - { - bDifferenceNotFound=false; - LII.pPPI[i]->Flags |= PPIF_SELECTED; - dwFlag=(RCIF_LNEW|RCIF_LUNIQ); // просто установим - i++; CmpInfo.LDiff++; - if (LPanel.bTMP && kFlags |= PPIF_SELECTED; - CmpInfo.RDiff++; - } - if (Opt.StopDiffDup && !bBrokenByEsc) - { - bCompareAll=(Opt.ShowMsg && !YesNoMsg(MFirstDiffTitle, MFirstDiffBody)); - Opt.StopDiffDup=0; - } - break; - } - } - } - if (!bNextItem) - { - bNextItem=true; - goto FoundDiffL; - } - } - // добавим элемент в диалог результатов - if (Opt.Dialog) - MakeFileList(pLList->Dir,LII.pPPI[i-1],pRList->Dir,NULL,dwFlag); - } - else - { - i++; - } - CmpInfo.Proc++; - break; - } + End: + if (!bEqual) + { + if (bFullCmp) + *dwFlag |= RCIF_CONTDIFF; + else + return false; + } + else if (bFullCmp) + *dwFlag |= RCIF_CONT; + } + //=========================================================================== + // если полное сравнение, то суммируем результаты сравнения + if (bFullCmp && ((*dwFlag & RCIF_NAMEDIFF) || (*dwFlag & RCIF_TIMEDIFF) || (*dwFlag & RCIF_SIZEDIFF) || (*dwFlag & RCIF_CONTDIFF))) + return false; + } + return true; +} - /******************************************************************************/ +/**************************************************************************** + * Сравнение двух каталогов, описанных структурами AInfo и PInfo. + * Возвращает true, если они совпадают. + * Параметр bCompareAll определяет, + * надо ли сравнивать все файлы и взводить PPIF_SELECTED (bCompareAll == true) + * или просто вернуть false при первом несовпадении (bCompareAll == false). + ****************************************************************************/ +bool AdvCmpProc::CompareDirs(const struct DirList* pLList, const struct DirList* pRList, bool bCompareAll, int ScanDepth) +{ + // Стартуем с сообщением о сравнении + ShowCmpMsg(pLList->Dir, L"*", pRList->Dir, L"*", true); + + // строим индексы элементов, для убыстрения сравнения + struct ItemsIndex LII, RII; + if (!BuildItemsIndex(true, pLList, &LII, ScanDepth) || !BuildItemsIndex(false, pRList, &RII, ScanDepth)) + { + ErrorMsg(MNoMemTitle, MNoMemBody); + bBrokenByEsc = true; + FreeItemsIndex(&LII); + FreeItemsIndex(&RII); + return true; + } + + int i = 0, j = 0; + + // соберем информацию, сколько элементов будем сравнивать и их размер + if (ScanDepth == 0 && Opt.TotalProgress) + { + while (i < LII.iCount && j < RII.iCount && !bBrokenByEsc) + { + switch (PICompare(&LII.pPPI[i], &RII.pPPI[j], NULL)) + { + case 0: { + string strDir; + if (LII.pPPI[i]->FileAttributes & FILE_ATTRIBUTE_DIRECTORY && !(LPanel.PInfo.Flags & PFLAGS_PLUGIN)) + { + GetFullFileName(strDir, pLList->Dir, LII.pPPI[i]->FileName); + GetDirList(strDir.get(), ScanDepth, true); + } + else + { + CmpInfo.Count += 1; + CmpInfo.CountSize += (unsigned __int64) LII.pPPI[i]->FileSize; + } - case 1: // Элемент RII.pPPI[j] не имеет одноимённых в LII.pPPI - { -//wchar_t buf3[512]; -//FSF.sprintf(buf3,L"Left: %s Right: %s", LII.pPPI[i]->FindData.lpwszFileName, RII.pPPI[j]->FindData.lpwszFileName); -// DebugMsg(buf3,L"case 1",bDifferenceNotFound); + if (!bBrokenByEsc) + { + if (RII.pPPI[j]->FileAttributes & FILE_ATTRIBUTE_DIRECTORY && !(RPanel.PInfo.Flags & PFLAGS_PLUGIN)) + { + GetFullFileName(strDir, pRList->Dir, RII.pPPI[j]->FileName); + GetDirList(strDir.get(), ScanDepth, true); + } + else + { + CmpInfo.Count += 1; + CmpInfo.CountSize += (unsigned __int64) RII.pPPI[j]->FileSize; + } + } + i++; + j++; + break; + } + case -1: { + CmpInfo.Count += 1; + CmpInfo.CountSize += (unsigned __int64) LII.pPPI[i]->FileSize; + i++; + break; + } + case 1: { + CmpInfo.Count += 1; + CmpInfo.CountSize += (unsigned __int64) RII.pPPI[j]->FileSize; + j++; + break; + } + } + } + } + + if (bBrokenByEsc) + { + FreeItemsIndex(&LII); + FreeItemsIndex(&RII); + return true; + } + + // экспресс-сравнение вложенного каталога + if (ScanDepth && !Opt.Dialog && !Opt.IgnoreMissing && LII.iCount != RII.iCount) + { + FreeItemsIndex(&LII); + FreeItemsIndex(&RII); + return false; + } + + // вначале снимем выделение на панелях + if (ScanDepth == 0) + { + for (i = 0; i < pLList->ItemsNumber; i++) pLList->PPI[i].Flags &= ~PPIF_SELECTED; + for (i = 0; i < pRList->ItemsNumber; i++) pRList->PPI[i].Flags &= ~PPIF_SELECTED; + } + + // начинаем сравнивать "наши" элементы... + bool bDifferenceNotFound = true; + i = 0; + j = 0; + DWORD dwFlag = 0; + + while (i < LII.iCount && j < RII.iCount && (bDifferenceNotFound || bCompareAll) && !bBrokenByEsc) + { + // проверка на ESC + const int iMaxCounter = 256; + static int iCounter = iMaxCounter; + if (!--iCounter) + { + iCounter = iMaxCounter; + if (CheckForEsc()) + break; + } + + bool bNextItem; + dwFlag = RCIF_DIFFER; + + switch (PICompare(&LII.pPPI[i], &RII.pPPI[j], NULL)) + { + /******************************************************************************/ + + case 0: // Имена совпали - проверяем всё остальное + { + // wchar_t buf[512]; + // FSF.sprintf(buf,L"Left: %s Right: %s, %d + %d", LII.pPPI[i]->FindData.lpwszFileName, RII.pPPI[j]->FindData.lpwszFileName, i,j); + // DebugMsg(buf,L"case 0",bDifferenceNotFound); + + if (CompareFiles(pLList->Dir, LII.pPPI[i], pRList->Dir, RII.pPPI[j], ScanDepth, &dwFlag)) + { // И остальное совпало + i++; + j++; + dwFlag = RCIF_EQUAL; // просто установим + } + else + { + bDifferenceNotFound = false; + // узнаем, новый кто? + __int64 Delta = (((__int64) LII.pPPI[i]->LastWriteTime.dwHighDateTime << 32) | LII.pPPI[i]->LastWriteTime.dwLowDateTime) - + (((__int64) RII.pPPI[j]->LastWriteTime.dwHighDateTime << 32) | RII.pPPI[j]->LastWriteTime.dwLowDateTime); + if (Opt.CmpTime) + { + if (Delta > 0) + { + dwFlag &= ~RCIF_DIFFER; + dwFlag |= RCIF_LNEW; + } + else if (Delta < 0) + { + dwFlag &= ~RCIF_DIFFER; + dwFlag |= RCIF_RNEW; + } + } + if (Opt.SelectedNew) + { + if (Delta > 0) + { + LII.pPPI[i]->Flags |= PPIF_SELECTED; + } + else if (Delta < 0) + { + RII.pPPI[j]->Flags |= PPIF_SELECTED; + } + else + { + LII.pPPI[i]->Flags |= PPIF_SELECTED; + RII.pPPI[j]->Flags |= PPIF_SELECTED; + } + } + else + { + LII.pPPI[i]->Flags |= PPIF_SELECTED; + RII.pPPI[j]->Flags |= PPIF_SELECTED; + } + i++; + j++; + CmpInfo.LDiff++; + CmpInfo.RDiff++; + // dwFlag=RCIF_DIFFER; + if (Opt.StopDiffDup && !bBrokenByEsc) + { // нужно ли продолжать сравнивать + bCompareAll = (Opt.ShowMsg && !YesNoMsg(MFirstDiffTitle, MFirstDiffBody)); + Opt.StopDiffDup = 0; + } + } + CmpInfo.Proc += 2; + // добавим элемент в диалог результатов + if (Opt.Dialog) + MakeFileList(pLList->Dir, LII.pPPI[i - 1], pRList->Dir, RII.pPPI[j - 1], dwFlag); + break; + } - CmpContinueR: - dwFlag=RCIF_DIFFER; - if (!Opt.IgnoreMissing || (Opt.IgnoreMissing==2 && ScanDepth)) - { - if (!RPanel.bTMP) - { - bNextItem=true; - goto FoundDiffR; - } - else - { // ...но если с Темп-панели, то проверим с элементом LII.pPPI - bNextItem=false; - for (int k=0; kDir,LII.pPPI[k],pRList->Dir,RII.pPPI[j],ScanDepth,&dwFlag)) - { - j++; - break; - } - else - FoundDiffR: - { - bDifferenceNotFound=false; - RII.pPPI[j]->Flags |= PPIF_SELECTED; - dwFlag=(RCIF_RNEW|RCIF_RUNIQ); // просто установим - j++; CmpInfo.RDiff++; - if (RPanel.bTMP && kFlags |= PPIF_SELECTED; - CmpInfo.LDiff++; - } - if (Opt.StopDiffDup && !bBrokenByEsc) - { - bCompareAll=(Opt.ShowMsg && !YesNoMsg(MFirstDiffTitle, MFirstDiffBody)); - Opt.StopDiffDup=0; - } - break; - } - } - } - if (!bNextItem) - { - bNextItem = true; - goto FoundDiffR; - } - } - // добавим элемент в диалог результатов - if (Opt.Dialog) - MakeFileList(pLList->Dir,NULL,pRList->Dir,RII.pPPI[j-1],dwFlag); - } - else - { - j++; - } - CmpInfo.Proc++; - break; - } - } - } + /******************************************************************************/ - if (!bBrokenByEsc) - { - // Собственно сравнение окончено. Пометим то, что осталось необработанным в массивах - if ((!Opt.IgnoreMissing || (Opt.IgnoreMissing==2 && ScanDepth)) && iFindData.lpwszFileName, RII.pPPI[j]->FindData.lpwszFileName); + // DebugMsg(buf2,L"case -1",bDifferenceNotFound); + + CmpContinueL: + dwFlag = RCIF_DIFFER; + if (!Opt.IgnoreMissing || (Opt.IgnoreMissing == 2 && ScanDepth)) + { + if (!LPanel.bTMP) + { + bNextItem = true; + goto FoundDiffL; + } + else + { // ...но если с Темп-панели, то проверим с элементом RII.pPPI + bNextItem = false; + for (int k = 0; k < RII.iCount; k++) + { + if (!PICompare(&LII.pPPI[i], &RII.pPPI[k], NULL)) + { + bNextItem = true; + if (CompareFiles(pLList->Dir, LII.pPPI[i], pRList->Dir, RII.pPPI[k], ScanDepth, &dwFlag)) + { + i++; + break; + } + else + FoundDiffL : { + bDifferenceNotFound = false; + LII.pPPI[i]->Flags |= PPIF_SELECTED; + dwFlag = (RCIF_LNEW | RCIF_LUNIQ); // просто установим + i++; + CmpInfo.LDiff++; + if (LPanel.bTMP && k < RII.iCount) + { + RII.pPPI[k]->Flags |= PPIF_SELECTED; + CmpInfo.RDiff++; + } + if (Opt.StopDiffDup && !bBrokenByEsc) + { + bCompareAll = (Opt.ShowMsg && !YesNoMsg(MFirstDiffTitle, MFirstDiffBody)); + Opt.StopDiffDup = 0; + } + break; + } + } + } + if (!bNextItem) + { + bNextItem = true; + goto FoundDiffL; + } + } + // добавим элемент в диалог результатов + if (Opt.Dialog) + MakeFileList(pLList->Dir, LII.pPPI[i - 1], pRList->Dir, NULL, dwFlag); + } + else + { + i++; + } + CmpInfo.Proc++; + break; + } + + /******************************************************************************/ - FreeItemsIndex(&LII); - FreeItemsIndex(&RII); + case 1: // Элемент RII.pPPI[j] не имеет одноимённых в LII.pPPI + { + // wchar_t buf3[512]; + // FSF.sprintf(buf3,L"Left: %s Right: %s", LII.pPPI[i]->FindData.lpwszFileName, RII.pPPI[j]->FindData.lpwszFileName); + // DebugMsg(buf3,L"case 1",bDifferenceNotFound); - return bDifferenceNotFound; + CmpContinueR: + dwFlag = RCIF_DIFFER; + if (!Opt.IgnoreMissing || (Opt.IgnoreMissing == 2 && ScanDepth)) + { + if (!RPanel.bTMP) + { + bNextItem = true; + goto FoundDiffR; + } + else + { // ...но если с Темп-панели, то проверим с элементом LII.pPPI + bNextItem = false; + for (int k = 0; k < LII.iCount; k++) + { + if (!PICompare(&LII.pPPI[k], &RII.pPPI[j], NULL)) + { + bNextItem = true; + if (CompareFiles(pLList->Dir, LII.pPPI[k], pRList->Dir, RII.pPPI[j], ScanDepth, &dwFlag)) + { + j++; + break; + } + else + FoundDiffR : { + bDifferenceNotFound = false; + RII.pPPI[j]->Flags |= PPIF_SELECTED; + dwFlag = (RCIF_RNEW | RCIF_RUNIQ); // просто установим + j++; + CmpInfo.RDiff++; + if (RPanel.bTMP && k < LII.iCount) + { + LII.pPPI[k]->Flags |= PPIF_SELECTED; + CmpInfo.LDiff++; + } + if (Opt.StopDiffDup && !bBrokenByEsc) + { + bCompareAll = (Opt.ShowMsg && !YesNoMsg(MFirstDiffTitle, MFirstDiffBody)); + Opt.StopDiffDup = 0; + } + break; + } + } + } + if (!bNextItem) + { + bNextItem = true; + goto FoundDiffR; + } + } + // добавим элемент в диалог результатов + if (Opt.Dialog) + MakeFileList(pLList->Dir, NULL, pRList->Dir, RII.pPPI[j - 1], dwFlag); + } + else + { + j++; + } + CmpInfo.Proc++; + break; + } + } + } + + if (!bBrokenByEsc) + { + // Собственно сравнение окончено. Пометим то, что осталось необработанным в массивах + if ((!Opt.IgnoreMissing || (Opt.IgnoreMissing == 2 && ScanDepth)) && i < LII.iCount) + { + if (!LPanel.bTMP) + bDifferenceNotFound = false; + if (bCompareAll) + goto CmpContinueL; + } + if ((!Opt.IgnoreMissing || (Opt.IgnoreMissing == 2 && ScanDepth)) && j < RII.iCount) + { + if (!RPanel.bTMP) + bDifferenceNotFound = false; + if (bCompareAll) + goto CmpContinueR; + } + } + // DebugMsg(L"LII.iCount",L"",LII.iCount); + // DebugMsg(L"RII.iCount",L"",RII.iCount); + + FreeItemsIndex(&LII); + FreeItemsIndex(&RII); + + return bDifferenceNotFound; } #include "AdvCmpProc_CLIST.cpp" -#include "AdvCmpProc_SYNC.cpp" #include "AdvCmpProc_DUP.cpp" - +#include "AdvCmpProc_SYNC.cpp" /*************************************************************************** * @@ -1975,124 +2024,124 @@ bool AdvCmpProc::CompareDirs(const struct DirList *pLList,const struct DirList * * ***************************************************************************/ - -bool UpdateImage(PicData *data, bool CheckOnly=false) +bool UpdateImage(PicData* data, bool CheckOnly = false) { - if (!data->DibData&&!data->Loaded) - { - //DrawImage - { - bool result=false; - GFL_BITMAP *RawPicture=NULL; - data->DibData=NULL; - RECT RangedRect; - - GFL_LOAD_PARAMS load_params; - pGflGetDefaultLoadParams(&load_params); - load_params.Flags|=GFL_LOAD_SKIP_ALPHA; - load_params.Flags|=GFL_LOAD_IGNORE_READ_ERROR; - load_params.Origin=GFL_BOTTOM_LEFT; - load_params.LinePadding=4; - load_params.ImageWanted=data->Page-1; - GFL_ERROR res=pGflLoadBitmapW(data->FileName,&RawPicture,&load_params,data->pic_info); - if (res) - RawPicture=NULL; - if (RawPicture) - { - if (!pGflChangeColorDepth(RawPicture,NULL,GFL_MODE_TO_BGR,GFL_MODE_NO_DITHER)/* && !pGflRotate(RawPicture,NULL,data->Rotate,0)*/) - { - { - int dx=WinInfo.Win.right/(WinInfo.Con.Right-WinInfo.Con.Left); - int dy=WinInfo.Win.bottom/(WinInfo.Con.Bottom-WinInfo.Con.Top); - - RECT DCRect; - DCRect.left=dx*(data->DrawRect.left-WinInfo.Con.Left); - DCRect.right=dx*(data->DrawRect.right+1-WinInfo.Con.Left); - DCRect.top=dy*(data->DrawRect.top/*-WinInfo.Con.Top*/); //костыль для запуска far.exe /w - DCRect.bottom=dy*(data->DrawRect.bottom+1/*-WinInfo.Con.Top*/); //костыль для запуска far.exe /w - - float asp_dst=(float)(DCRect.right-DCRect.left)/(float)(DCRect.bottom-DCRect.top); - float asp_src=(float)RawPicture->Width/(float)RawPicture->Height; - int dst_w, dst_h; - - if (asp_dstWidth); - dst_h=(int)(dst_w/asp_src); - } - else - { - dst_h=min(DCRect.bottom-DCRect.top,RawPicture->Height); - dst_w=(int)(asp_src*dst_h); - } - RangedRect.left=DCRect.left; - RangedRect.top=DCRect.top; - RangedRect.right=dst_w; - RangedRect.bottom=dst_h; - RangedRect.left+=(DCRect.right-DCRect.left-RangedRect.right)/2; - RangedRect.top+=(DCRect.bottom-DCRect.top-RangedRect.bottom)/2; - } - data->MemSize=((RawPicture->Width*3+3)&-4)*RawPicture->Height; - GFL_BITMAP *pic=NULL; - pGflResize(RawPicture,&pic,RangedRect.right,RangedRect.bottom,GFL_RESIZE_BILINEAR,0); - if (pic) - { - data->DibData=NULL; - memset(data->BmpHeader,0,sizeof(BITMAPINFOHEADER)); - - data->BmpHeader->biSize=sizeof(BITMAPINFOHEADER); - data->BmpHeader->biWidth=pic->Width; - data->BmpHeader->biHeight=pic->Height; - data->BmpHeader->biPlanes=1; - data->BmpHeader->biClrUsed=0; - data->BmpHeader->biBitCount=24; - data->BmpHeader->biCompression=BI_RGB; - data->BmpHeader->biClrImportant=0; - int bytes_per_line=(pic->Width*3+3)&-4; - data->BmpHeader->biSizeImage=bytes_per_line*pic->Height; - - data->DibData=(unsigned char*)malloc(data->BmpHeader->biSizeImage); - if (data->DibData) - memcpy(data->DibData,pic->Data,data->BmpHeader->biSizeImage); - - pGflFreeBitmap(pic); - } - } - } - if (RawPicture&&data->DibData) - { - result=true; - data->GDIRect=RangedRect; - } - if (RawPicture) - pGflFreeBitmap(RawPicture); + if (!data->DibData && !data->Loaded) + { + // DrawImage + { + bool result = false; + GFL_BITMAP* RawPicture = NULL; + data->DibData = NULL; + RECT RangedRect; + + GFL_LOAD_PARAMS load_params; + pGflGetDefaultLoadParams(&load_params); + load_params.Flags |= GFL_LOAD_SKIP_ALPHA; + load_params.Flags |= GFL_LOAD_IGNORE_READ_ERROR; + load_params.Origin = GFL_BOTTOM_LEFT; + load_params.LinePadding = 4; + load_params.ImageWanted = data->Page - 1; + GFL_ERROR res = pGflLoadBitmapW(data->FileName, &RawPicture, &load_params, data->pic_info); + if (res) + RawPicture = NULL; + if (RawPicture) + { + if (!pGflChangeColorDepth(RawPicture, NULL, GFL_MODE_TO_BGR, GFL_MODE_NO_DITHER) /* && !pGflRotate(RawPicture,NULL,data->Rotate,0)*/) + { + { + int dx = WinInfo.Win.right / (WinInfo.Con.Right - WinInfo.Con.Left); + int dy = WinInfo.Win.bottom / (WinInfo.Con.Bottom - WinInfo.Con.Top); - if (result) - { - data->Loaded=true; - if ((!(data->FirstRun))&&(!CheckOnly)) - InvalidateRect(WinInfo.hFarWindow,NULL,TRUE); - } - } - } - if (!data->DibData||!data->Loaded) - return false; - if (CheckOnly) - return true; - HDC hDC=GetDC(WinInfo.hFarWindow); - StretchDIBits(hDC,data->GDIRect.left,data->GDIRect.top,data->GDIRect.right,data->GDIRect.bottom,0,0,data->GDIRect.right,data->GDIRect.bottom,data->DibData,(BITMAPINFO *)data->BmpHeader,DIB_RGB_COLORS,SRCCOPY); - ReleaseDC(WinInfo.hFarWindow,hDC); - return true; + RECT DCRect; + DCRect.left = dx * (data->DrawRect.left - WinInfo.Con.Left); + DCRect.right = dx * (data->DrawRect.right + 1 - WinInfo.Con.Left); + DCRect.top = dy * (data->DrawRect.top /*-WinInfo.Con.Top*/); //костыль для запуска far.exe /w + DCRect.bottom = dy * (data->DrawRect.bottom + 1 /*-WinInfo.Con.Top*/); //костыль для запуска far.exe /w + + float asp_dst = (float) (DCRect.right - DCRect.left) / (float) (DCRect.bottom - DCRect.top); + float asp_src = (float) RawPicture->Width / (float) RawPicture->Height; + int dst_w, dst_h; + + if (asp_dst < asp_src) + { + dst_w = min(DCRect.right - DCRect.left, RawPicture->Width); + dst_h = (int) (dst_w / asp_src); + } + else + { + dst_h = min(DCRect.bottom - DCRect.top, RawPicture->Height); + dst_w = (int) (asp_src * dst_h); + } + RangedRect.left = DCRect.left; + RangedRect.top = DCRect.top; + RangedRect.right = dst_w; + RangedRect.bottom = dst_h; + RangedRect.left += (DCRect.right - DCRect.left - RangedRect.right) / 2; + RangedRect.top += (DCRect.bottom - DCRect.top - RangedRect.bottom) / 2; + } + data->MemSize = ((RawPicture->Width * 3 + 3) & -4) * RawPicture->Height; + GFL_BITMAP* pic = NULL; + pGflResize(RawPicture, &pic, RangedRect.right, RangedRect.bottom, GFL_RESIZE_BILINEAR, 0); + if (pic) + { + data->DibData = NULL; + memset(data->BmpHeader, 0, sizeof(BITMAPINFOHEADER)); + + data->BmpHeader->biSize = sizeof(BITMAPINFOHEADER); + data->BmpHeader->biWidth = pic->Width; + data->BmpHeader->biHeight = pic->Height; + data->BmpHeader->biPlanes = 1; + data->BmpHeader->biClrUsed = 0; + data->BmpHeader->biBitCount = 24; + data->BmpHeader->biCompression = BI_RGB; + data->BmpHeader->biClrImportant = 0; + int bytes_per_line = (pic->Width * 3 + 3) & -4; + data->BmpHeader->biSizeImage = bytes_per_line * pic->Height; + + data->DibData = (unsigned char*) malloc(data->BmpHeader->biSizeImage); + if (data->DibData) + memcpy(data->DibData, pic->Data, data->BmpHeader->biSizeImage); + + pGflFreeBitmap(pic); + } + } + } + if (RawPicture && data->DibData) + { + result = true; + data->GDIRect = RangedRect; + } + if (RawPicture) + pGflFreeBitmap(RawPicture); + + if (result) + { + data->Loaded = true; + if ((!(data->FirstRun)) && (!CheckOnly)) + InvalidateRect(WinInfo.hFarWindow, NULL, TRUE); + } + } + } + if (!data->DibData || !data->Loaded) + return false; + if (CheckOnly) + return true; + HDC hDC = GetDC(WinInfo.hFarWindow); + StretchDIBits(hDC, data->GDIRect.left, data->GDIRect.top, data->GDIRect.right, data->GDIRect.bottom, 0, 0, data->GDIRect.right, + data->GDIRect.bottom, data->DibData, (BITMAPINFO*) data->BmpHeader, DIB_RGB_COLORS, SRCCOPY); + ReleaseDC(WinInfo.hFarWindow, hDC); + return true; } -void FreeImage(PicData *data) +void FreeImage(PicData* data) { - if (data && data->DibData) - { - free(data->DibData); - data->DibData=NULL; - pGflFreeFileInformation(data->pic_info); - } + if (data && data->DibData) + { + free(data->DibData); + data->DibData = NULL; + pGflFreeFileInformation(data->pic_info); + } } #if 0 void UpdateInfoText(HANDLE hDlg, PicData *data, bool left) @@ -2315,140 +2364,144 @@ int AdvCmpProc::ShowCmpCurDialog(const PluginPanelItem *pLPPI,const PluginPanelI } #endif -bool AdvCmpProc::CompareCurFile(const wchar_t *LDir, const wchar_t *LFileName, const wchar_t *RDir, const wchar_t *RFileName, int Method) +bool AdvCmpProc::CompareCurFile(const wchar_t* LDir, const wchar_t* LFileName, const wchar_t* RDir, const wchar_t* RFileName, int Method) { - string strLFullFileName, strRFullFileName; - GetFullFileName(strLFullFileName,LDir,LFileName); - GetFullFileName(strRFullFileName,RDir,RFileName); - - WIN32_FIND_DATA LWFD,RWFD; - if (!FileExists(strLFullFileName.get(),LWFD,0) || !FileExists(strRFullFileName.get(),RWFD,0)) - return false; - PluginPanelItem LPPI={}, RPPI={}; - WFD2PPI(LWFD,LPPI); - WFD2PPI(RWFD,RPPI); - - string strCommand; - strCommand.get(32768); - STARTUPINFO si; - PROCESS_INFORMATION pi; - WIN32_FIND_DATA wfdFindData; - HANDLE hFind; - wchar_t DiffProgram[MAX_PATH]; - ExpandEnvironmentStringsW(Opt.WinMergePath,DiffProgram,(sizeof(DiffProgram)/sizeof(DiffProgram[0]))); - bool bFindDiffProg=((hFind=FindFirstFileW(DiffProgram,&wfdFindData)) != INVALID_HANDLE_VALUE); - if (!bFindDiffProg) - { - ExpandEnvironmentStringsW(L"%ProgramFiles%\\WinMerge\\WinMergeU.exe",DiffProgram,(sizeof(DiffProgram)/sizeof(DiffProgram[0]))); - bFindDiffProg=((hFind=FindFirstFileW(DiffProgram,&wfdFindData)) != INVALID_HANDLE_VALUE); - } - if (bFindDiffProg) - { - FindClose(hFind); - memset(&si, 0, sizeof(si)); - memset(&pi, 0, sizeof(pi)); - si.cb = sizeof(si); - FSF.sprintf(strCommand.get(), L"\"%s\" -e \"%s\" \"%s\"", DiffProgram,GetPosToName(strLFullFileName.get()),GetPosToName(strRFullFileName.get())); - strCommand.updsize(); - } - - if (Method) // перебираем всё - { - bool bImage=false; - bool bVisCmp=(pCompareFiles && GetModuleHandleW(L"VisComp.dll")); - if (bGflLoaded) - { - CmpPic.L.FileName=strLFullFileName.get(); - CmpPic.R.FileName=strRFullFileName.get(); - CmpPic.L.DrawRect.left=1; - CmpPic.R.DrawRect.left=WinInfo.Con.Right/2+2; - CmpPic.L.DrawRect.top=CmpPic.R.DrawRect.top=1; - CmpPic.L.DrawRect.right=WinInfo.Con.Right/2-1; - CmpPic.R.DrawRect.right=WinInfo.Con.Right-1; - CmpPic.L.DrawRect.bottom=CmpPic.R.DrawRect.bottom=WinInfo.Con.Bottom-WinInfo.Con.Top-2-2; - CmpPic.L.FirstRun=CmpPic.R.FirstRun=true; - CmpPic.L.Redraw=CmpPic.R.Redraw=false; - CmpPic.L.Loaded=CmpPic.R.Loaded=false; - BITMAPINFOHEADER BmpHeader1, BmpHeader2; - CmpPic.L.BmpHeader=&BmpHeader1; - CmpPic.R.BmpHeader=&BmpHeader2; - CmpPic.L.DibData=CmpPic.R.DibData=NULL; - GFL_FILE_INFORMATION pic_info1, pic_info2; - CmpPic.L.pic_info=&pic_info1; - CmpPic.R.pic_info=&pic_info2; - CmpPic.L.Page=CmpPic.R.Page=1; - CmpPic.L.Rotate=CmpPic.R.Rotate=0; - - bImage=(UpdateImage(&CmpPic.L,true) && UpdateImage(&CmpPic.R,true)); - } - - struct FarMenuItem MenuItems[4]; - memset(MenuItems,0,sizeof(MenuItems)); - MenuItems[0].Text=GetMsg(MDefault); - MenuItems[1].Text=GetMsg(MWinMerge); - MenuItems[2].Text=GetMsg(MPictures); - MenuItems[3].Text=GetMsg(MVisCmp); - if (!bVisCmp) MenuItems[3].Flags|=MIF_GRAYED; - if (!bFindDiffProg) MenuItems[1].Flags|=MIF_GRAYED; - if (!bImage) MenuItems[2].Flags|=MIF_GRAYED; - if (bImage) MenuItems[2].Flags|=MIF_SELECTED; - else if (bVisCmp) MenuItems[3].Flags|=MIF_SELECTED; - int MenuCode=Info.Menu(&MainGuid,&CmpMethodMenuGuid,-1,-1,0,FMENU_AUTOHIGHLIGHT|FMENU_WRAPMODE,GetMsg(MMethod),NULL,L"Contents",NULL,NULL,MenuItems,sizeof(MenuItems)/sizeof(MenuItems[0])); - - if (MenuCode==0) - { - bool bDifferenceNotFound; - Opt.TotalProgress=0; - if (Opt.CmpCase || Opt.CmpSize || Opt.CmpTime || Opt.CmpContents) - { - bDifferenceNotFound=CompareFiles(LDir,&LPPI,RDir,&RPPI,0,0); - } - else - bDifferenceNotFound=!FSF.LStricmp(LFileName,RFileName); - - Info.PanelControl(LPanel.hPanel,FCTL_REDRAWPANEL,0,0); - Info.PanelControl(RPanel.hPanel,FCTL_REDRAWPANEL,0,0); - - const wchar_t *MsgItems[]= - { - GetMsg(bDifferenceNotFound?MNoDiffTitle:MFirstDiffTitle), - GetPosToName(strLFullFileName.get()), - GetPosToName(strRFullFileName.get()), - GetMsg(MOK) - }; - Info.Message(&MainGuid,&CompareCurFileMsgGuid,bDifferenceNotFound?0:FMSG_WARNING,0,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),1); - } - else if (MenuCode==1 && bFindDiffProg) - { - if (CreateProcess(0,strCommand.get(),0,0,false,0,0,0,&si,&pi)) - { - WaitForSingleObject(pi.hProcess,INFINITE); - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } - } - else if (MenuCode==2 && bImage) -// ShowCmpCurDialog(&LPPI,&RPPI); -; - else if (MenuCode==3 && bVisCmp) - pCompareFiles(strLFullFileName.get(),strRFullFileName.get(),0); - - if (LPPI.FileName) free((void*)LPPI.FileName); - if (RPPI.FileName) free((void*)RPPI.FileName); - if (bGflLoaded) - { - FreeImage(&CmpPic.L); - FreeImage(&CmpPic.R); - } - } - else if (bFindDiffProg) // WinMerge - { - if (CreateProcess(0,strCommand.get(),0,0,false,0,0,0,&si,&pi)) - { - WaitForSingleObject(pi.hProcess,INFINITE); - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } - } - return true; + string strLFullFileName, strRFullFileName; + GetFullFileName(strLFullFileName, LDir, LFileName); + GetFullFileName(strRFullFileName, RDir, RFileName); + + WIN32_FIND_DATA LWFD, RWFD; + if (!FileExists(strLFullFileName.get(), LWFD, 0) || !FileExists(strRFullFileName.get(), RWFD, 0)) + return false; + PluginPanelItem LPPI = {}, RPPI = {}; + WFD2PPI(LWFD, LPPI); + WFD2PPI(RWFD, RPPI); + + string strCommand; + strCommand.get(32768); + STARTUPINFO si; + PROCESS_INFORMATION pi; + WIN32_FIND_DATA wfdFindData; + HANDLE hFind; + wchar_t DiffProgram[MAX_PATH]; + ExpandEnvironmentStringsW(Opt.WinMergePath, DiffProgram, (sizeof(DiffProgram) / sizeof(DiffProgram[0]))); + bool bFindDiffProg = ((hFind = FindFirstFileW(DiffProgram, &wfdFindData)) != INVALID_HANDLE_VALUE); + if (!bFindDiffProg) + { + ExpandEnvironmentStringsW(L"%ProgramFiles%\\WinMerge\\WinMergeU.exe", DiffProgram, (sizeof(DiffProgram) / sizeof(DiffProgram[0]))); + bFindDiffProg = ((hFind = FindFirstFileW(DiffProgram, &wfdFindData)) != INVALID_HANDLE_VALUE); + } + if (bFindDiffProg) + { + FindClose(hFind); + memset(&si, 0, sizeof(si)); + memset(&pi, 0, sizeof(pi)); + si.cb = sizeof(si); + FSF.sprintf(strCommand.get(), L"\"%s\" -e \"%s\" \"%s\"", DiffProgram, GetPosToName(strLFullFileName.get()), + GetPosToName(strRFullFileName.get())); + strCommand.updsize(); + } + + if (Method) // перебираем всё + { + bool bImage = false; + bool bVisCmp = (pCompareFiles && GetModuleHandleW(L"VisComp.dll")); + if (bGflLoaded) + { + CmpPic.L.FileName = strLFullFileName.get(); + CmpPic.R.FileName = strRFullFileName.get(); + CmpPic.L.DrawRect.left = 1; + CmpPic.R.DrawRect.left = WinInfo.Con.Right / 2 + 2; + CmpPic.L.DrawRect.top = CmpPic.R.DrawRect.top = 1; + CmpPic.L.DrawRect.right = WinInfo.Con.Right / 2 - 1; + CmpPic.R.DrawRect.right = WinInfo.Con.Right - 1; + CmpPic.L.DrawRect.bottom = CmpPic.R.DrawRect.bottom = WinInfo.Con.Bottom - WinInfo.Con.Top - 2 - 2; + CmpPic.L.FirstRun = CmpPic.R.FirstRun = true; + CmpPic.L.Redraw = CmpPic.R.Redraw = false; + CmpPic.L.Loaded = CmpPic.R.Loaded = false; + BITMAPINFOHEADER BmpHeader1, BmpHeader2; + CmpPic.L.BmpHeader = &BmpHeader1; + CmpPic.R.BmpHeader = &BmpHeader2; + CmpPic.L.DibData = CmpPic.R.DibData = NULL; + GFL_FILE_INFORMATION pic_info1, pic_info2; + CmpPic.L.pic_info = &pic_info1; + CmpPic.R.pic_info = &pic_info2; + CmpPic.L.Page = CmpPic.R.Page = 1; + CmpPic.L.Rotate = CmpPic.R.Rotate = 0; + + bImage = (UpdateImage(&CmpPic.L, true) && UpdateImage(&CmpPic.R, true)); + } + + struct FarMenuItem MenuItems[4]; + memset(MenuItems, 0, sizeof(MenuItems)); + MenuItems[0].Text = GetMsg(MDefault); + MenuItems[1].Text = GetMsg(MWinMerge); + MenuItems[2].Text = GetMsg(MPictures); + MenuItems[3].Text = GetMsg(MVisCmp); + if (!bVisCmp) + MenuItems[3].Flags |= MIF_GRAYED; + if (!bFindDiffProg) + MenuItems[1].Flags |= MIF_GRAYED; + if (!bImage) + MenuItems[2].Flags |= MIF_GRAYED; + if (bImage) + MenuItems[2].Flags |= MIF_SELECTED; + else if (bVisCmp) + MenuItems[3].Flags |= MIF_SELECTED; + int MenuCode = Info.Menu(&MainGuid, &CmpMethodMenuGuid, -1, -1, 0, FMENU_AUTOHIGHLIGHT | FMENU_WRAPMODE, GetMsg(MMethod), NULL, L"Contents", NULL, + NULL, MenuItems, sizeof(MenuItems) / sizeof(MenuItems[0])); + + if (MenuCode == 0) + { + bool bDifferenceNotFound; + Opt.TotalProgress = 0; + if (Opt.CmpCase || Opt.CmpSize || Opt.CmpTime || Opt.CmpContents) + { + bDifferenceNotFound = CompareFiles(LDir, &LPPI, RDir, &RPPI, 0, 0); + } + else + bDifferenceNotFound = !FSF.LStricmp(LFileName, RFileName); + + Info.PanelControl(LPanel.hPanel, FCTL_REDRAWPANEL, 0, 0); + Info.PanelControl(RPanel.hPanel, FCTL_REDRAWPANEL, 0, 0); + + const wchar_t* MsgItems[] = {GetMsg(bDifferenceNotFound ? MNoDiffTitle : MFirstDiffTitle), GetPosToName(strLFullFileName.get()), + GetPosToName(strRFullFileName.get()), GetMsg(MOK)}; + Info.Message(&MainGuid, &CompareCurFileMsgGuid, bDifferenceNotFound ? 0 : FMSG_WARNING, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 1); + } + else if (MenuCode == 1 && bFindDiffProg) + { + if (CreateProcess(0, strCommand.get(), 0, 0, false, 0, 0, 0, &si, &pi)) + { + WaitForSingleObject(pi.hProcess, INFINITE); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + } + else if (MenuCode == 2 && bImage) + // ShowCmpCurDialog(&LPPI,&RPPI); + ; + else if (MenuCode == 3 && bVisCmp) + pCompareFiles(strLFullFileName.get(), strRFullFileName.get(), 0); + + if (LPPI.FileName) + free((void*) LPPI.FileName); + if (RPPI.FileName) + free((void*) RPPI.FileName); + if (bGflLoaded) + { + FreeImage(&CmpPic.L); + FreeImage(&CmpPic.R); + } + } + else if (bFindDiffProg) // WinMerge + { + if (CreateProcess(0, strCommand.get(), 0, 0, false, 0, 0, 0, &si, &pi)) + { + WaitForSingleObject(pi.hProcess, INFINITE); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + } + return true; } diff --git a/src/AdvCmpProc.hpp b/src/AdvCmpProc.hpp index 739bc7f..839da88 100644 --- a/src/AdvCmpProc.hpp +++ b/src/AdvCmpProc.hpp @@ -33,219 +33,231 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "AdvCmp.hpp" // коды возврата для сообщений -enum QueryResult { - QR_ABORT=-1, - QR_OVERWRITE=0, - QR_DELETE=0, - QR_EDIT=0, - QR_ALL=1, - QR_SKIP=2, - QR_SKIPALL=3 -}; +enum QueryResult { QR_ABORT = -1, QR_OVERWRITE = 0, QR_DELETE = 0, QR_EDIT = 0, QR_ALL = 1, QR_SKIP = 2, QR_SKIPALL = 3 }; + +struct FileInfo +{ + wchar_t* FileName; + wchar_t* Dir; + DWORD dwAttributes; + unsigned __int64 nFileSize; + FILETIME ftLastWriteTime; -struct FileInfo { - wchar_t *FileName; - wchar_t *Dir; - DWORD dwAttributes; - unsigned __int64 nFileSize; - FILETIME ftLastWriteTime; - - FileInfo() - { - FileName=Dir=NULL; - dwAttributes=0; nFileSize=0; - ftLastWriteTime.dwLowDateTime=ftLastWriteTime.dwHighDateTime=0; - } + FileInfo() + { + FileName = Dir = NULL; + dwAttributes = 0; + nFileSize = 0; + ftLastWriteTime.dwLowDateTime = ftLastWriteTime.dwHighDateTime = 0; + } }; // элемент для показа в диалоге результатов -struct cmpFile { - FileInfo L,R; - DWORD dwFlags; +struct cmpFile +{ + FileInfo L, R; + DWORD dwFlags; }; // массив элементов, для диалога с результатами сравнения -struct cmpFileList { - cmpFile *F; - int iCount; - // для строки статуса: - int Items; - int Select; - int Identical; - int Different; - int LNew; - int RNew; - - class AdvCmpProc *AdvCmp; +struct cmpFileList +{ + cmpFile* F; + int iCount; + // для строки статуса: + int Items; + int Select; + int Identical; + int Different; + int LNew; + int RNew; + + class AdvCmpProc* AdvCmp; }; -const int PIXELS_SIZE=32; +const int PIXELS_SIZE = 32; // элемент для показа в диалоге результатов дублей -struct dupFile { - FileInfo fi; - unsigned int nDupGroup; - DWORD dwCRC; - DWORD dwFlags; - - int PicWidth; - int PicHeight; - unsigned char *PicPix; // массив выборочных пикселей - - wchar_t *MusicArtist; - wchar_t *MusicTitle; - DWORD MusicBitrate; - DWORD MusicTime; // продолжительность - - dupFile() - { - nDupGroup=0; - dwCRC=0; - dwFlags=RCIF_NONE; - - PicWidth=PicHeight=0; - PicPix=NULL; - - MusicArtist=NULL; - MusicTitle=NULL; - MusicBitrate=0; - MusicTime=0; - } +struct dupFile +{ + FileInfo fi; + unsigned int nDupGroup; + DWORD dwCRC; + DWORD dwFlags; + + int PicWidth; + int PicHeight; + unsigned char* PicPix; // массив выборочных пикселей + + wchar_t* MusicArtist; + wchar_t* MusicTitle; + DWORD MusicBitrate; + DWORD MusicTime; // продолжительность + + dupFile() + { + nDupGroup = 0; + dwCRC = 0; + dwFlags = RCIF_NONE; + + PicWidth = PicHeight = 0; + PicPix = NULL; + + MusicArtist = NULL; + MusicTitle = NULL; + MusicBitrate = 0; + MusicTime = 0; + } }; // массив элементов - список дубликатов -struct dupFileList { - dupFile *F; - int iCount; - // для строки статуса - int GroupItems; - int Del; +struct dupFileList +{ + dupFile* F; + int iCount; + // для строки статуса + int GroupItems; + int Del; }; // для показа рисунков -struct PicData { - wchar_t *FileName; - RECT DrawRect; //символы - RECT GDIRect; //точки - bool Redraw; - bool Loaded; - bool FirstRun; - BITMAPINFOHEADER *BmpHeader; - unsigned char *DibData; - GFL_FILE_INFORMATION *pic_info; - int Page; - int Rotate; - DWORD MemSize; +struct PicData +{ + wchar_t* FileName; + RECT DrawRect; //символы + RECT GDIRect; //точки + bool Redraw; + bool Loaded; + bool FirstRun; + BITMAPINFOHEADER* BmpHeader; + unsigned char* DibData; + GFL_FILE_INFORMATION* pic_info; + int Page; + int Rotate; + DWORD MemSize; }; -struct cmpPicFile { - struct PicData L; - struct PicData R; +struct cmpPicFile +{ + struct PicData L; + struct PicData R; }; // сама сравнивалка :) class AdvCmpProc { - HANDLE hScreen; - - // отсортированный массив указателей на элементы DirList.PPI - struct ItemsIndex { - PluginPanelItem **pPPI; // элементы - int iCount; // кол-во - }; - - // массив элементов, для диалога с результатами сравнения - struct cmpFileList cFList; - // массив дубликатов - struct dupFileList dFList; - // два рисунка - struct cmpPicFile CmpPic; - // для синхронизации - bool bAskLOverwrite; - bool bAskROverwrite; - bool bAskLReadOnly; - bool bAskRReadOnly; - bool bAskDel; - bool bSkipLReadOnly; - bool bSkipRReadOnly; - - public: - bool TitleSaved; - string strFarTitle; - - private: - // полезняшки - bool GetFarTitle(string &strTitle); - void WFD2PPI(WIN32_FIND_DATA &wfd, PluginPanelItem &ppi); - inline bool IsNewLine(int c) {return (c == '\r' || c == '\n');} - inline bool myIsSpace(int c) {return (c == ' ' || c == '\t' || c == '\v' || c == '\f');} - inline bool IsWhiteSpace(int c) {return (c == ' ' || c == '\t' || c == '\v' || c == '\f' || c == '\r' || c == '\n');} - bool mySetFilePointer(HANDLE hf, unsigned __int64 distance, DWORD MoveMethod); - DWORD ProcessCRC(void *pData, register int iLen, DWORD FileCRC); - bool CheckScanDepth(const wchar_t *FileName, int ScanDepth); - - int GetDirList(const wchar_t *Dir, int ScanDepth, bool OnlyInfo, struct DirList *pList=0); - void FreeDirList(struct DirList *pList); - bool BuildItemsIndex(bool bLeftPanel,const struct DirList *pList,struct ItemsIndex *pIndex,int ScanDepth); - void FreeItemsIndex(struct ItemsIndex *pIndex); - int GetCacheResult(DWORD FullFileName1, DWORD FullFileName2, DWORD64 WriteTime1, DWORD64 WriteTime2); - bool SetCacheResult(DWORD FullFileName1, DWORD FullFileName2, DWORD64 WriteTime1, DWORD64 WriteTime2, DWORD dwFlag); - void ShowCmpMsg(const wchar_t *Dir1, const wchar_t *Name1, const wchar_t *Dir2, const wchar_t *Name2, bool bRedraw); - bool CompareFiles(const wchar_t *LDir, const PluginPanelItem *pLPPI, const wchar_t *RDir, const PluginPanelItem *pRPPI, int ScanDepth, DWORD *dwFlag); + HANDLE hScreen; + + // отсортированный массив указателей на элементы DirList.PPI + struct ItemsIndex + { + PluginPanelItem** pPPI; // элементы + int iCount; // кол-во + }; + + // массив элементов, для диалога с результатами сравнения + struct cmpFileList cFList; + // массив дубликатов + struct dupFileList dFList; + // два рисунка + struct cmpPicFile CmpPic; + // для синхронизации + bool bAskLOverwrite; + bool bAskROverwrite; + bool bAskLReadOnly; + bool bAskRReadOnly; + bool bAskDel; + bool bSkipLReadOnly; + bool bSkipRReadOnly; + + public: + bool TitleSaved; + string strFarTitle; + + private: + // полезняшки + bool GetFarTitle(string& strTitle); + void WFD2PPI(WIN32_FIND_DATA& wfd, PluginPanelItem& ppi); + inline bool IsNewLine(int c) + { + return (c == '\r' || c == '\n'); + } + inline bool myIsSpace(int c) + { + return (c == ' ' || c == '\t' || c == '\v' || c == '\f'); + } + inline bool IsWhiteSpace(int c) + { + return (c == ' ' || c == '\t' || c == '\v' || c == '\f' || c == '\r' || c == '\n'); + } + bool mySetFilePointer(HANDLE hf, unsigned __int64 distance, DWORD MoveMethod); + DWORD ProcessCRC(void* pData, register int iLen, DWORD FileCRC); + bool CheckScanDepth(const wchar_t* FileName, int ScanDepth); + + int GetDirList(const wchar_t* Dir, int ScanDepth, bool OnlyInfo, struct DirList* pList = 0); + void FreeDirList(struct DirList* pList); + bool BuildItemsIndex(bool bLeftPanel, const struct DirList* pList, struct ItemsIndex* pIndex, int ScanDepth); + void FreeItemsIndex(struct ItemsIndex* pIndex); + int GetCacheResult(DWORD FullFileName1, DWORD FullFileName2, DWORD64 WriteTime1, DWORD64 WriteTime2); + bool SetCacheResult(DWORD FullFileName1, DWORD FullFileName2, DWORD64 WriteTime1, DWORD64 WriteTime2, DWORD dwFlag); + void ShowCmpMsg(const wchar_t* Dir1, const wchar_t* Name1, const wchar_t* Dir2, const wchar_t* Name2, bool bRedraw); + bool CompareFiles(const wchar_t* LDir, const PluginPanelItem* pLPPI, const wchar_t* RDir, const PluginPanelItem* pRPPI, int ScanDepth, + DWORD* dwFlag); #if 0 int ShowCmpCurDialog(const PluginPanelItem *pLPPI,const PluginPanelItem *pRPPI); #endif - // диалог результатов сравнения - bool MakeFileList(const wchar_t *LDir,const PluginPanelItem *pLPPI,const wchar_t *RDir,const PluginPanelItem *pRPPI,DWORD dwFlag); - // синхронизация - int QueryOverwriteFile(const wchar_t *FileName, FILETIME *srcTime, FILETIME *destTime, unsigned __int64 srcSize, unsigned __int64 destSize, int direction, bool bReadOnlyType); - int QueryDelete(const wchar_t *FileName, bool bIsDir, bool bReadOnlyType); - int FileExists(const wchar_t *FileName, WIN32_FIND_DATA &FindData, int CheckForFilter); - int SyncFile(const wchar_t *srcFileName, const wchar_t *destFileName, int direction, DWORD dwFlag=0); - int DelFile(const wchar_t *FileName); - int SyncDir(const wchar_t *srcDirName, const wchar_t *destDirName, int direction); - int DelDir(const wchar_t *DirName); - int Synchronize(); - // дубликаты - void ShowDupMsg(const wchar_t *Dir, const wchar_t *Name, bool bRedraw); - int ScanDir(const wchar_t *DirName, int ScanDepth); - DWORD GetCRC(const dupFile *cur); - int GetPic(dupFile *cur, int GetInfo); - int GetMp3(dupFile *cur, int GetInfo); - bool MakeFileList(const wchar_t *Dir,const PluginPanelItem *pPPI); - int ShowDupDialog(); - - public: - AdvCmpProc() {} - ~AdvCmpProc() {} - - void Init(); - void Close(); - - bool CompareDirs(const struct DirList *pLList,const struct DirList *pRList,bool bCompareAll,int ScanDepth); - bool CompareCurFile(const wchar_t *LDir, const wchar_t *LFileName, const wchar_t *RDir, const wchar_t *RFileName, int Method); - int ShowCmpDialog(const struct DirList *pLList,const struct DirList *pRList); - int Duplicate(const struct DirList *pList); + // диалог результатов сравнения + bool MakeFileList(const wchar_t* LDir, const PluginPanelItem* pLPPI, const wchar_t* RDir, const PluginPanelItem* pRPPI, DWORD dwFlag); + // синхронизация + int QueryOverwriteFile(const wchar_t* FileName, FILETIME* srcTime, FILETIME* destTime, unsigned __int64 srcSize, unsigned __int64 destSize, + int direction, bool bReadOnlyType); + int QueryDelete(const wchar_t* FileName, bool bIsDir, bool bReadOnlyType); + int FileExists(const wchar_t* FileName, WIN32_FIND_DATA& FindData, int CheckForFilter); + int SyncFile(const wchar_t* srcFileName, const wchar_t* destFileName, int direction, DWORD dwFlag = 0); + int DelFile(const wchar_t* FileName); + int SyncDir(const wchar_t* srcDirName, const wchar_t* destDirName, int direction); + int DelDir(const wchar_t* DirName); + int Synchronize(); + // дубликаты + void ShowDupMsg(const wchar_t* Dir, const wchar_t* Name, bool bRedraw); + int ScanDir(const wchar_t* DirName, int ScanDepth); + DWORD GetCRC(const dupFile* cur); + int GetPic(dupFile* cur, int GetInfo); + int GetMp3(dupFile* cur, int GetInfo); + bool MakeFileList(const wchar_t* Dir, const PluginPanelItem* pPPI); + int ShowDupDialog(); + + public: + AdvCmpProc() {} + ~AdvCmpProc() {} + + void Init(); + void Close(); + + bool CompareDirs(const struct DirList* pLList, const struct DirList* pRList, bool bCompareAll, int ScanDepth); + bool CompareCurFile(const wchar_t* LDir, const wchar_t* LFileName, const wchar_t* RDir, const wchar_t* RFileName, int Method); + int ShowCmpDialog(const struct DirList* pLList, const struct DirList* pRList); + int Duplicate(const struct DirList* pList); }; // диалог результатов сравнения -void MakeListItemText(wchar_t *buf, cmpFile *cur, wchar_t Mark); -void SetBottom(HANDLE hDlg, cmpFileList *pFileList, wchar_t *CurDir=NULL); -bool MakeCmpFarList(HANDLE hDlg, cmpFileList *pFileList, bool bSetCurPos=true, bool bSort=false); -intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void *Param2); +void MakeListItemText(wchar_t* buf, cmpFile* cur, wchar_t Mark); +void SetBottom(HANDLE hDlg, cmpFileList* pFileList, wchar_t* CurDir = NULL); +bool MakeCmpFarList(HANDLE hDlg, cmpFileList* pFileList, bool bSetCurPos = true, bool bSort = false); +intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void* Param2); // синхронизация -int GetSyncOpt(cmpFileList *pFileList); -void ShowSyncMsg(const wchar_t *Name1, const wchar_t *Name2, unsigned __int64 Progress, unsigned __int64 Max, bool bRedraw); +int GetSyncOpt(cmpFileList* pFileList); +void ShowSyncMsg(const wchar_t* Name1, const wchar_t* Name2, unsigned __int64 Progress, unsigned __int64 Max, bool bRedraw); // полезняшки -wchar_t *CutSubstr(string &strSrc, wchar_t *Substr); -void strcentr(wchar_t *Dest, const wchar_t *Src, int len, wchar_t sym); -wchar_t* itoaa(__int64 num, wchar_t *buf); -void ProgressLine(wchar_t *Dest, unsigned __int64 nCurrent, unsigned __int64 nTotal); -wchar_t *GetPosToName(const wchar_t *FileName); -void GetFullFileName(string &strFullFileName, const wchar_t *Dir, const wchar_t *FileName, bool bNative=true); -wchar_t *GetStrFileTime(FILETIME *LastWriteTime, wchar_t *Time, bool FullYear=true); +wchar_t* CutSubstr(string& strSrc, wchar_t* Substr); +void strcentr(wchar_t* Dest, const wchar_t* Src, int len, wchar_t sym); +wchar_t* itoaa(__int64 num, wchar_t* buf); +void ProgressLine(wchar_t* Dest, unsigned __int64 nCurrent, unsigned __int64 nTotal); +wchar_t* GetPosToName(const wchar_t* FileName); +void GetFullFileName(string& strFullFileName, const wchar_t* Dir, const wchar_t* FileName, bool bNative = true); +wchar_t* GetStrFileTime(FILETIME* LastWriteTime, wchar_t* Time, bool FullYear = true); bool CheckForEsc(void); -void TruncCopy(wchar_t *Dest, const wchar_t *Src, int TruncLen, const wchar_t *FormatMsg=NULL); -int GetArgv(const wchar_t *cmd, wchar_t ***argv); +void TruncCopy(wchar_t* Dest, const wchar_t* Src, int TruncLen, const wchar_t* FormatMsg = NULL); +int GetArgv(const wchar_t* cmd, wchar_t*** argv); diff --git a/src/AdvCmpProc_CLIST.cpp b/src/AdvCmpProc_CLIST.cpp index d0e0efa..07faea6 100644 --- a/src/AdvCmpProc_CLIST.cpp +++ b/src/AdvCmpProc_CLIST.cpp @@ -29,615 +29,642 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - /*************************************************************************** * * ДИАЛОГ РЕЗУЛЬТАТОВ СРАВНЕНИЯ * ***************************************************************************/ - /**************************************************************************** * Построение массива элементов, для диалога с результатами сравнения ****************************************************************************/ -bool AdvCmpProc::MakeFileList(const wchar_t *LDir,const PluginPanelItem *pLPPI,const wchar_t *RDir,const PluginPanelItem *pRPPI,DWORD dwFlag) +bool AdvCmpProc::MakeFileList(const wchar_t* LDir, const PluginPanelItem* pLPPI, const wchar_t* RDir, const PluginPanelItem* pRPPI, DWORD dwFlag) { - cmpFile *New=(cmpFile*)realloc(cFList.F,(cFList.iCount+1)*sizeof(cmpFile)); - if (!New) - { - ErrorMsg(MNoMemTitle, MNoMemBody); - return false; - } - cFList.F=New; - - cFList.F[cFList.iCount].dwFlags=dwFlag; - - cFList.F[cFList.iCount].L.Dir=(wchar_t*)malloc((wcslen(LDir)+1)*sizeof(wchar_t)); - if (cFList.F[cFList.iCount].L.Dir) - wcscpy(cFList.F[cFList.iCount].L.Dir,LDir); - cFList.F[cFList.iCount].R.Dir=(wchar_t*)malloc((wcslen(RDir)+1)*sizeof(wchar_t)); - if (cFList.F[cFList.iCount].R.Dir) - wcscpy(cFList.F[cFList.iCount].R.Dir,RDir); - - if (pLPPI) - { - cFList.F[cFList.iCount].L.FileName=(wchar_t*)malloc((wcslen(pLPPI->FileName)+1)*sizeof(wchar_t)); - if (cFList.F[cFList.iCount].L.FileName) wcscpy(cFList.F[cFList.iCount].L.FileName,pLPPI->FileName); - cFList.F[cFList.iCount].L.ftLastWriteTime.dwLowDateTime=pLPPI->LastWriteTime.dwLowDateTime; - cFList.F[cFList.iCount].L.ftLastWriteTime.dwHighDateTime=pLPPI->LastWriteTime.dwHighDateTime; - cFList.F[cFList.iCount].L.nFileSize=pLPPI->FileSize; - cFList.F[cFList.iCount].L.dwAttributes=pLPPI->FileAttributes; - } - if (pRPPI) - { - cFList.F[cFList.iCount].R.FileName=(wchar_t*)malloc((wcslen(pRPPI->FileName)+1)*sizeof(wchar_t)); - if (cFList.F[cFList.iCount].R.FileName) wcscpy(cFList.F[cFList.iCount].R.FileName,pRPPI->FileName); - cFList.F[cFList.iCount].R.ftLastWriteTime.dwLowDateTime=pRPPI->LastWriteTime.dwLowDateTime; - cFList.F[cFList.iCount].R.ftLastWriteTime.dwHighDateTime=pRPPI->LastWriteTime.dwHighDateTime; - cFList.F[cFList.iCount].R.nFileSize=pRPPI->FileSize; - cFList.F[cFList.iCount].R.dwAttributes=pRPPI->FileAttributes; - } - cFList.iCount++; - - return true; + cmpFile* New = (cmpFile*) realloc(cFList.F, (cFList.iCount + 1) * sizeof(cmpFile)); + if (!New) + { + ErrorMsg(MNoMemTitle, MNoMemBody); + return false; + } + cFList.F = New; + + cFList.F[cFList.iCount].dwFlags = dwFlag; + + cFList.F[cFList.iCount].L.Dir = (wchar_t*) malloc((wcslen(LDir) + 1) * sizeof(wchar_t)); + if (cFList.F[cFList.iCount].L.Dir) + wcscpy(cFList.F[cFList.iCount].L.Dir, LDir); + cFList.F[cFList.iCount].R.Dir = (wchar_t*) malloc((wcslen(RDir) + 1) * sizeof(wchar_t)); + if (cFList.F[cFList.iCount].R.Dir) + wcscpy(cFList.F[cFList.iCount].R.Dir, RDir); + + if (pLPPI) + { + cFList.F[cFList.iCount].L.FileName = (wchar_t*) malloc((wcslen(pLPPI->FileName) + 1) * sizeof(wchar_t)); + if (cFList.F[cFList.iCount].L.FileName) + wcscpy(cFList.F[cFList.iCount].L.FileName, pLPPI->FileName); + cFList.F[cFList.iCount].L.ftLastWriteTime.dwLowDateTime = pLPPI->LastWriteTime.dwLowDateTime; + cFList.F[cFList.iCount].L.ftLastWriteTime.dwHighDateTime = pLPPI->LastWriteTime.dwHighDateTime; + cFList.F[cFList.iCount].L.nFileSize = pLPPI->FileSize; + cFList.F[cFList.iCount].L.dwAttributes = pLPPI->FileAttributes; + } + if (pRPPI) + { + cFList.F[cFList.iCount].R.FileName = (wchar_t*) malloc((wcslen(pRPPI->FileName) + 1) * sizeof(wchar_t)); + if (cFList.F[cFList.iCount].R.FileName) + wcscpy(cFList.F[cFList.iCount].R.FileName, pRPPI->FileName); + cFList.F[cFList.iCount].R.ftLastWriteTime.dwLowDateTime = pRPPI->LastWriteTime.dwLowDateTime; + cFList.F[cFList.iCount].R.ftLastWriteTime.dwHighDateTime = pRPPI->LastWriteTime.dwHighDateTime; + cFList.F[cFList.iCount].R.nFileSize = pRPPI->FileSize; + cFList.F[cFList.iCount].R.dwAttributes = pRPPI->FileAttributes; + } + cFList.iCount++; + + return true; } -int WINAPI cmpSortList(const void *el1, const void *el2, void * el3) +int WINAPI cmpSortList(const void* el1, const void* el2, void* el3) { - struct cmpFile *Item1=(struct cmpFile *)el1, *Item2=(struct cmpFile *)el2; - - int cmp=FSF.LStricmp(Item1->L.Dir,Item2->L.Dir); - - if (!cmp) - { - DWORD dwAttributes1=!(Item1->dwFlags&RCIF_RUNIQ)?Item1->L.dwAttributes:Item1->R.dwAttributes; - DWORD dwAttributes2=!(Item2->dwFlags&RCIF_RUNIQ)?Item2->L.dwAttributes:Item2->R.dwAttributes; - - if (dwAttributes1&FILE_ATTRIBUTE_DIRECTORY) - { - if (!(dwAttributes2&FILE_ATTRIBUTE_DIRECTORY)) - return 1; - } - else - { - if (dwAttributes2&FILE_ATTRIBUTE_DIRECTORY) - return -1; - } - wchar_t *FileName1=!(Item1->dwFlags&RCIF_RUNIQ)?Item1->L.FileName:Item1->R.FileName; - wchar_t *FileName2=!(Item2->dwFlags&RCIF_RUNIQ)?Item2->L.FileName:Item2->R.FileName; - - cmp=FSF.LStricmp(FileName1,FileName2); - } - return cmp; + struct cmpFile *Item1 = (struct cmpFile*) el1, *Item2 = (struct cmpFile*) el2; + + int cmp = FSF.LStricmp(Item1->L.Dir, Item2->L.Dir); + + if (!cmp) + { + DWORD dwAttributes1 = !(Item1->dwFlags & RCIF_RUNIQ) ? Item1->L.dwAttributes : Item1->R.dwAttributes; + DWORD dwAttributes2 = !(Item2->dwFlags & RCIF_RUNIQ) ? Item2->L.dwAttributes : Item2->R.dwAttributes; + + if (dwAttributes1 & FILE_ATTRIBUTE_DIRECTORY) + { + if (!(dwAttributes2 & FILE_ATTRIBUTE_DIRECTORY)) + return 1; + } + else + { + if (dwAttributes2 & FILE_ATTRIBUTE_DIRECTORY) + return -1; + } + wchar_t* FileName1 = !(Item1->dwFlags & RCIF_RUNIQ) ? Item1->L.FileName : Item1->R.FileName; + wchar_t* FileName2 = !(Item2->dwFlags & RCIF_RUNIQ) ? Item2->L.FileName : Item2->R.FileName; + + cmp = FSF.LStricmp(FileName1, FileName2); + } + return cmp; } /*************************************************************************** * Создание текстовой метки для элемента листа ***************************************************************************/ -void MakeListItemText(wchar_t *buf, cmpFile *cur, wchar_t Mark) +void MakeListItemText(wchar_t* buf, cmpFile* cur, wchar_t Mark) { - wchar_t LTime[20]={0}, RTime[20]={0}; - - if (!(cur->dwFlags&RCIF_RUNIQ)) // есть элемент слева - GetStrFileTime(&cur->L.ftLastWriteTime,LTime,false); - if (!(cur->dwFlags&RCIF_LUNIQ)) // есть элемент справа - GetStrFileTime(&cur->R.ftLastWriteTime,RTime,false); - - wchar_t LSize[65]={0}, RSize[65]={0}; - - if (!(cur->L.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) && !(cur->R.dwAttributes&FILE_ATTRIBUTE_DIRECTORY)) - { - if (LTime[0]) cur->L.nFileSize>99999999999?FSF.itoa64(cur->L.nFileSize,LSize,10):itoaa(cur->L.nFileSize,LSize); - if (RTime[0]) cur->R.nFileSize>99999999999?FSF.itoa64(cur->R.nFileSize,RSize,10):itoaa(cur->R.nFileSize,RSize); - } - else - { - if (LTime[0]) strcentr(LSize,GetMsg(MFolder),14,L' '); - if (RTime[0]) strcentr(RSize,GetMsg(MFolder),14,L' '); - } - - string strName; - if (cur->L.dwAttributes&FILE_ATTRIBUTE_DIRECTORY || cur->R.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) - { - if (LTime[0]) strName=GetPosToName(cur->L.Dir)+wcslen(LPanel.Dir); - if (RTime[0]) strName=GetPosToName(cur->R.Dir)+wcslen(RPanel.Dir); - strName+=L"\\"; - strName+=(cur->L.FileName?cur->L.FileName:cur->R.FileName); - if (strName.length()>0 && strName[(size_t)(strName.length()-1)]!=L'\\') strName+=L"\\"; - } - else - { - strName=(cur->L.FileName?cur->L.FileName:cur->R.FileName); - if (Opt.SkipSubstr) CutSubstr(strName,Opt.Substr); - } - FSF.sprintf(buf, L"%*.*s%c%*.*s%c%*.*s%c%*.*s%c%c%c%s",14,14,LSize,0x2502,17,17,LTime,0x2551,17,17,RTime,0x2502,14,14,RSize,0x2551,Mark,0x2502,strName.get()); + wchar_t LTime[20] = {0}, RTime[20] = {0}; + + if (!(cur->dwFlags & RCIF_RUNIQ)) // есть элемент слева + GetStrFileTime(&cur->L.ftLastWriteTime, LTime, false); + if (!(cur->dwFlags & RCIF_LUNIQ)) // есть элемент справа + GetStrFileTime(&cur->R.ftLastWriteTime, RTime, false); + + wchar_t LSize[65] = {0}, RSize[65] = {0}; + + if (!(cur->L.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) && !(cur->R.dwAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + if (LTime[0]) + cur->L.nFileSize > 99999999999 ? FSF.itoa64(cur->L.nFileSize, LSize, 10) : itoaa(cur->L.nFileSize, LSize); + if (RTime[0]) + cur->R.nFileSize > 99999999999 ? FSF.itoa64(cur->R.nFileSize, RSize, 10) : itoaa(cur->R.nFileSize, RSize); + } + else + { + if (LTime[0]) + strcentr(LSize, GetMsg(MFolder), 14, L' '); + if (RTime[0]) + strcentr(RSize, GetMsg(MFolder), 14, L' '); + } + + string strName; + if (cur->L.dwAttributes & FILE_ATTRIBUTE_DIRECTORY || cur->R.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (LTime[0]) + strName = GetPosToName(cur->L.Dir) + wcslen(LPanel.Dir); + if (RTime[0]) + strName = GetPosToName(cur->R.Dir) + wcslen(RPanel.Dir); + strName += L"\\"; + strName += (cur->L.FileName ? cur->L.FileName : cur->R.FileName); + if (strName.length() > 0 && strName[(size_t)(strName.length() - 1)] != L'\\') + strName += L"\\"; + } + else + { + strName = (cur->L.FileName ? cur->L.FileName : cur->R.FileName); + if (Opt.SkipSubstr) + CutSubstr(strName, Opt.Substr); + } + FSF.sprintf(buf, L"%*.*s%c%*.*s%c%*.*s%c%*.*s%c%c%c%s", 14, 14, LSize, 0x2502, 17, 17, LTime, 0x2551, 17, 17, RTime, 0x2502, 14, 14, RSize, 0x2551, + Mark, 0x2502, strName.get()); } /*************************************************************************** * Изменение строки статуса в листе -***************************************************************************/ -void SetBottom(HANDLE hDlg, cmpFileList *pFileList, wchar_t *CurDir) + ***************************************************************************/ +void SetBottom(HANDLE hDlg, cmpFileList* pFileList, wchar_t* CurDir) { - static wchar_t Title[MAX_PATH]; - static wchar_t Bottom[MAX_PATH]; - FarListTitles ListTitle={sizeof(FarListTitles)}; - ListTitle.Title=Title; - ListTitle.TitleSize=MAX_PATH; - ListTitle.Bottom=Bottom; - ListTitle.BottomSize=MAX_PATH; - Info.SendDlgMessage(hDlg,DM_LISTGETTITLES,0,&ListTitle); - if (CurDir) FSF.sprintf(Bottom,GetMsg(MListBottomCurDir),CurDir); - else FSF.sprintf(Bottom,GetMsg(MListBottom),pFileList->Items,pFileList->Select,Opt.ShowListSelect?L' ':L'*', - pFileList->Identical,Opt.ShowListIdentical?L' ':L'*', - pFileList->Different,Opt.ShowListDifferent?L' ':L'*', - pFileList->LNew,Opt.ShowListLNew?L' ':L'*',pFileList->RNew,Opt.ShowListRNew?L' ':L'*'); - Info.SendDlgMessage(hDlg,DM_LISTSETTITLES,0,&ListTitle); + static wchar_t Title[MAX_PATH]; + static wchar_t Bottom[MAX_PATH]; + FarListTitles ListTitle = {sizeof(FarListTitles)}; + ListTitle.Title = Title; + ListTitle.TitleSize = MAX_PATH; + ListTitle.Bottom = Bottom; + ListTitle.BottomSize = MAX_PATH; + Info.SendDlgMessage(hDlg, DM_LISTGETTITLES, 0, &ListTitle); + if (CurDir) + FSF.sprintf(Bottom, GetMsg(MListBottomCurDir), CurDir); + else + FSF.sprintf(Bottom, GetMsg(MListBottom), pFileList->Items, pFileList->Select, Opt.ShowListSelect ? L' ' : L'*', pFileList->Identical, + Opt.ShowListIdentical ? L' ' : L'*', pFileList->Different, Opt.ShowListDifferent ? L' ' : L'*', pFileList->LNew, + Opt.ShowListLNew ? L' ' : L'*', pFileList->RNew, Opt.ShowListRNew ? L' ' : L'*'); + Info.SendDlgMessage(hDlg, DM_LISTSETTITLES, 0, &ListTitle); } /*************************************************************************** * Изменение/обновление листа файлов в диалоге ***************************************************************************/ -bool MakeCmpFarList(HANDLE hDlg, cmpFileList *pFileList, bool bSetCurPos, bool bSort) +bool MakeCmpFarList(HANDLE hDlg, cmpFileList* pFileList, bool bSetCurPos, bool bSort) { - pFileList->Items=0; - pFileList->Select=0; - pFileList->Identical=0; - pFileList->Different=0; - pFileList->LNew=0; - pFileList->RNew=0; - - // запросим информацию - FarListInfo ListInfo={sizeof(FarListInfo)}; - Info.SendDlgMessage(hDlg,DM_LISTINFO,0,&ListInfo); - - if (ListInfo.ItemsNumber) - Info.SendDlgMessage(hDlg,DM_LISTDELETE,0,0); - - if (!pFileList->iCount) - return true; - - // сортируем только при инициализации - if (bSort) - FSF.qsort(pFileList->F,pFileList->iCount,sizeof(pFileList->F[0]),cmpSortList,NULL); - - int Index=0; - string strBuf; - strBuf.get(65536); - const int nSIZE=32; // размер ячейки для FSF.sprintf(%*.*) - - for (int i=0; iiCount; i++) - { - cmpFile *cur=&pFileList->F[i]; - - if (Opt.SyncFlagClearUser) - cur->dwFlags&= ~RCIF_USER; - - wchar_t Mark=L' '; - - if ((cur->L.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) && (cur->R.dwAttributes&FILE_ATTRIBUTE_DIRECTORY)) - continue; - if ((cur->dwFlags&RCIF_USERSELECT) && !Opt.ShowListSelect) - continue; - if (cur->dwFlags&RCIF_EQUAL) - { - if (!Opt.ShowListIdentical) - continue; - Mark=L'='; pFileList->Identical++; - } - if (cur->dwFlags&RCIF_DIFFER) - { - if (!Opt.ShowListDifferent) - continue; - - __int64 Delta=(((__int64)cur->L.ftLastWriteTime.dwHighDateTime << 32) | cur->L.ftLastWriteTime.dwLowDateTime) - - (((__int64)cur->R.ftLastWriteTime.dwHighDateTime << 32) | cur->R.ftLastWriteTime.dwLowDateTime); - - if (Opt.SyncOnlyRight) - { - if (Opt.SyncOnlyRight==1 || (Opt.SyncOnlyRight==2 && Delta>0)) cur->dwFlags|=RCIF_USERLNEW; - } + pFileList->Items = 0; + pFileList->Select = 0; + pFileList->Identical = 0; + pFileList->Different = 0; + pFileList->LNew = 0; + pFileList->RNew = 0; + + // запросим информацию + FarListInfo ListInfo = {sizeof(FarListInfo)}; + Info.SendDlgMessage(hDlg, DM_LISTINFO, 0, &ListInfo); + + if (ListInfo.ItemsNumber) + Info.SendDlgMessage(hDlg, DM_LISTDELETE, 0, 0); + + if (!pFileList->iCount) + return true; + + // сортируем только при инициализации + if (bSort) + FSF.qsort(pFileList->F, pFileList->iCount, sizeof(pFileList->F[0]), cmpSortList, NULL); + + int Index = 0; + string strBuf; + strBuf.get(65536); + const int nSIZE = 32; // размер ячейки для FSF.sprintf(%*.*) + + for (int i = 0; i < pFileList->iCount; i++) + { + cmpFile* cur = &pFileList->F[i]; + + if (Opt.SyncFlagClearUser) + cur->dwFlags &= ~RCIF_USER; + + wchar_t Mark = L' '; + + if ((cur->L.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) && (cur->R.dwAttributes & FILE_ATTRIBUTE_DIRECTORY)) + continue; + if ((cur->dwFlags & RCIF_USERSELECT) && !Opt.ShowListSelect) + continue; + if (cur->dwFlags & RCIF_EQUAL) + { + if (!Opt.ShowListIdentical) + continue; + Mark = L'='; + pFileList->Identical++; + } + if (cur->dwFlags & RCIF_DIFFER) + { + if (!Opt.ShowListDifferent) + continue; + + __int64 Delta = (((__int64) cur->L.ftLastWriteTime.dwHighDateTime << 32) | cur->L.ftLastWriteTime.dwLowDateTime) - + (((__int64) cur->R.ftLastWriteTime.dwHighDateTime << 32) | cur->R.ftLastWriteTime.dwLowDateTime); + + if (Opt.SyncOnlyRight) + { + if (Opt.SyncOnlyRight == 1 || (Opt.SyncOnlyRight == 2 && Delta > 0)) + cur->dwFlags |= RCIF_USERLNEW; + } #if 1 - // отметка элементов - if (Opt.SyncFlagCopy) - { - if ((Opt.SyncFlagCopy==2 && !Opt.SyncFlagIfNew) || (Opt.SyncFlagCopy==2 && Opt.SyncFlagIfNew && Delta>0)) - { - cur->dwFlags|=RCIF_USERLNEW; - cur->dwFlags&=~RCIF_USERRNEW; - } - else if ((Opt.SyncFlagCopy==-2 && !Opt.SyncFlagIfNew) || (Opt.SyncFlagCopy==-2 && Opt.SyncFlagIfNew && Delta<0)) - { - cur->dwFlags|=RCIF_USERRNEW; - cur->dwFlags&=~RCIF_USERLNEW; - } - else - { - cur->dwFlags&=~RCIF_USERLNEW; - cur->dwFlags&=~RCIF_USERRNEW; - } - } + // отметка элементов + if (Opt.SyncFlagCopy) + { + if ((Opt.SyncFlagCopy == 2 && !Opt.SyncFlagIfNew) || (Opt.SyncFlagCopy == 2 && Opt.SyncFlagIfNew && Delta > 0)) + { + cur->dwFlags |= RCIF_USERLNEW; + cur->dwFlags &= ~RCIF_USERRNEW; + } + else if ((Opt.SyncFlagCopy == -2 && !Opt.SyncFlagIfNew) || (Opt.SyncFlagCopy == -2 && Opt.SyncFlagIfNew && Delta < 0)) + { + cur->dwFlags |= RCIF_USERRNEW; + cur->dwFlags &= ~RCIF_USERLNEW; + } + else + { + cur->dwFlags &= ~RCIF_USERLNEW; + cur->dwFlags &= ~RCIF_USERRNEW; + } + } #endif - if (cur->dwFlags&RCIF_USERLNEW) Mark=0x25ba; - else if (!Opt.SyncOnlyRight && (cur->dwFlags&RCIF_USERRNEW)) Mark=0x25c4; - else Mark=0x2260; - pFileList->Different++; - } - if (cur->dwFlags&RCIF_LNEW) - { - if (!Opt.ShowListLNew) - continue; + if (cur->dwFlags & RCIF_USERLNEW) + Mark = 0x25ba; + else if (!Opt.SyncOnlyRight && (cur->dwFlags & RCIF_USERRNEW)) + Mark = 0x25c4; + else + Mark = 0x2260; + pFileList->Different++; + } + if (cur->dwFlags & RCIF_LNEW) + { + if (!Opt.ShowListLNew) + continue; #if 1 - // отметка элементов - if (Opt.SyncFlagLCopy<=0) - { - if (Opt.SyncFlagLCopy<0) // юзерское - { - if (!(cur->dwFlags&RCIF_LUNIQ) && !Opt.SyncOnlyRight) - { - cur->dwFlags&=~RCIF_USERNONE; - cur->dwFlags|=RCIF_USERRNEW; - } - else - { - cur->dwFlags|=RCIF_USERNONE; //cur->dwFlags&=~RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERRNEW; - } - } - else // скинем - { - cur->dwFlags|=RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERRNEW; - } - } - else if (Opt.SyncFlagLCopy==2) // установим обычное - { - cur->dwFlags&=~RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERRNEW; - } + // отметка элементов + if (Opt.SyncFlagLCopy <= 0) + { + if (Opt.SyncFlagLCopy < 0) // юзерское + { + if (!(cur->dwFlags & RCIF_LUNIQ) && !Opt.SyncOnlyRight) + { + cur->dwFlags &= ~RCIF_USERNONE; + cur->dwFlags |= RCIF_USERRNEW; + } + else + { + cur->dwFlags |= RCIF_USERNONE; // cur->dwFlags&=~RCIF_USERNONE; + cur->dwFlags &= ~RCIF_USERRNEW; + } + } + else // скинем + { + cur->dwFlags |= RCIF_USERNONE; + cur->dwFlags &= ~RCIF_USERRNEW; + } + } + else if (Opt.SyncFlagLCopy == 2) // установим обычное + { + cur->dwFlags &= ~RCIF_USERNONE; + cur->dwFlags &= ~RCIF_USERRNEW; + } #endif - if (!Opt.SyncOnlyRight && (cur->dwFlags&RCIF_USERRNEW)) Mark=0x25c4; //направо - else if (!(cur->dwFlags&RCIF_USERNONE)) Mark=0x2192; //как обычно, налево - pFileList->LNew++; - } - if (cur->dwFlags&RCIF_RNEW) - { - if (!Opt.ShowListRNew) - continue; - if (Opt.SyncOnlyRight) - { - if (cur->dwFlags&RCIF_RUNIQ) - { - if (Opt.SyncOnlyRight==1 && !(cur->dwFlags&RCIF_USERNONE)) cur->dwFlags|=RCIF_USERDEL; - else if (Opt.SyncOnlyRight==2) cur->dwFlags|=RCIF_USERNONE; - } - else - { - if (Opt.SyncOnlyRight==1) cur->dwFlags|=RCIF_USERLNEW; - else cur->dwFlags|=RCIF_USERNONE; - } - } + if (!Opt.SyncOnlyRight && (cur->dwFlags & RCIF_USERRNEW)) + Mark = 0x25c4; //направо + else if (!(cur->dwFlags & RCIF_USERNONE)) + Mark = 0x2192; //как обычно, налево + pFileList->LNew++; + } + if (cur->dwFlags & RCIF_RNEW) + { + if (!Opt.ShowListRNew) + continue; + if (Opt.SyncOnlyRight) + { + if (cur->dwFlags & RCIF_RUNIQ) + { + if (Opt.SyncOnlyRight == 1 && !(cur->dwFlags & RCIF_USERNONE)) + cur->dwFlags |= RCIF_USERDEL; + else if (Opt.SyncOnlyRight == 2) + cur->dwFlags |= RCIF_USERNONE; + } + else + { + if (Opt.SyncOnlyRight == 1) + cur->dwFlags |= RCIF_USERLNEW; + else + cur->dwFlags |= RCIF_USERNONE; + } + } #if 1 - // отметка элементов - if (Opt.SyncFlagRCopy>=0) - { - if (Opt.SyncFlagRCopy>0) // юзерское - { - if (!(cur->dwFlags&RCIF_RUNIQ)) - { - cur->dwFlags&=~RCIF_USERNONE; - cur->dwFlags|=RCIF_USERLNEW; - } - else - { - cur->dwFlags|=RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERLNEW; - cur->dwFlags&=~RCIF_USERDEL; -/* - cur->dwFlags&=~RCIF_USERNONE; - cur->dwFlags|=RCIF_USERDEL; -*/ - } - } - else // скинем - { - cur->dwFlags|=RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERLNEW; - cur->dwFlags&=~RCIF_USERDEL; - } - } - else if (Opt.SyncFlagRCopy==-2) // установим обычное - { - cur->dwFlags&=~RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERLNEW; - if (Opt.SyncOnlyRight && cur->dwFlags&RCIF_RUNIQ) cur->dwFlags|=RCIF_USERDEL; - } + // отметка элементов + if (Opt.SyncFlagRCopy >= 0) + { + if (Opt.SyncFlagRCopy > 0) // юзерское + { + if (!(cur->dwFlags & RCIF_RUNIQ)) + { + cur->dwFlags &= ~RCIF_USERNONE; + cur->dwFlags |= RCIF_USERLNEW; + } + else + { + cur->dwFlags |= RCIF_USERNONE; + cur->dwFlags &= ~RCIF_USERLNEW; + cur->dwFlags &= ~RCIF_USERDEL; + /* + cur->dwFlags&=~RCIF_USERNONE; + cur->dwFlags|=RCIF_USERDEL; + */ + } + } + else // скинем + { + cur->dwFlags |= RCIF_USERNONE; + cur->dwFlags &= ~RCIF_USERLNEW; + cur->dwFlags &= ~RCIF_USERDEL; + } + } + else if (Opt.SyncFlagRCopy == -2) // установим обычное + { + cur->dwFlags &= ~RCIF_USERNONE; + cur->dwFlags &= ~RCIF_USERLNEW; + if (Opt.SyncOnlyRight && cur->dwFlags & RCIF_RUNIQ) + cur->dwFlags |= RCIF_USERDEL; + } #endif - if (cur->dwFlags&RCIF_USERLNEW) Mark=0x25ba; //налево - else if (!Opt.SyncOnlyRight && !(cur->dwFlags&RCIF_USERNONE)) Mark=0x2190; //как обычно, направо - else if (cur->dwFlags&RCIF_USERDEL) Mark=L'x'; - if (!Opt.SyncOnlyRight || (Opt.SyncOnlyRight && (cur->dwFlags&RCIF_RUNIQ))) pFileList->RNew++; - } - - // виртуальная папка - bool bAddVirtDir=false; - string strVirtDir; - - // если попали сразу в подкаталог... добавим виртуальную папку в начало - if (!Index && FSF.LStricmp(GetPosToName(cur->L.Dir),LPanel.Dir)) - { - strVirtDir=GetPosToName(cur->L.Dir)+wcslen(LPanel.Dir); - if (strVirtDir.length()>0 && strVirtDir[(size_t)(strVirtDir.length()-1)]!=L'\\') strVirtDir+=L"\\"; - struct FarListItem Item={}; - Item.Flags=LIF_DISABLE|LIF_CHECKED|0x2b; - wchar_t Size[65]; - strcentr(Size,GetMsg(MFolder),nSIZE,L' '); - FSF.sprintf(strBuf.get(), L"%*.*s%c%*.*s%c%c%c%s",nSIZE,nSIZE,Size,0x2551,nSIZE,nSIZE,Size,0x2551,L' ',0x2502,strVirtDir.get()); - strBuf.updsize(); - Item.Text=strBuf.get(); - struct FarList List={sizeof(FarList)}; - List.ItemsNumber=1; - List.Items=&Item; - Info.SendDlgMessage(hDlg,DM_LISTADD,0,&List); - Index++; - } - - { - for (int j=i+1; jiCount; j++) - { - cmpFile *next=&pFileList->F[j]; - - if (Opt.SyncFlagClearUser) - next->dwFlags&= ~RCIF_USER; // все равно же скидывать - - if ((next->L.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) && (next->R.dwAttributes&FILE_ATTRIBUTE_DIRECTORY)) - continue; - if ((next->dwFlags&RCIF_USERSELECT) && !Opt.ShowListSelect) - continue; - if ((next->dwFlags&RCIF_EQUAL) && !Opt.ShowListIdentical) - continue; - if ((next->dwFlags&RCIF_DIFFER) && !Opt.ShowListDifferent) - continue; - if ((next->dwFlags&RCIF_LNEW) && !Opt.ShowListLNew) - continue; - if ((next->dwFlags&RCIF_RNEW) && !Opt.ShowListRNew) - continue; - - if (FSF.LStricmp(cur->L.Dir,next->L.Dir)) - { - bAddVirtDir=true; - strVirtDir=GetPosToName(next->L.Dir)+wcslen(LPanel.Dir); - if (strVirtDir.length()>0 && strVirtDir[(size_t)(strVirtDir.length()-1)]!=L'\\') strVirtDir+=L"\\"; - } - break; - } - } - - MakeListItemText(strBuf.get(),cur,Mark); - strBuf.updsize(); - - struct FarListItem Item={}; - if (cur->dwFlags&RCIF_EQUAL) - Item.Flags|=LIF_GRAYED; - if (cur->dwFlags&RCIF_USERSELECT) - { - Item.Flags|=LIF_CHECKED; - pFileList->Select++; - } - Item.Text=strBuf.get(); - struct FarList List={sizeof(FarList)}; - List.ItemsNumber=1; - List.Items=&Item; - - // если удачно добавили элемент... - if (Info.SendDlgMessage(hDlg,DM_LISTADD,0,&List)) - { - pFileList->Items++; - // ... то ассоциируем данные с элементом листа - struct FarListItemData Data={sizeof(FarListItemData)}; - Data.Index=Index++; - Data.DataSize=sizeof(cur); - Data.Data=&cur; - Info.SendDlgMessage(hDlg,DM_LISTSETDATA,0,&Data); - } - - if (bAddVirtDir) - { - wchar_t Size[65]; - strcentr(Size,GetMsg(MFolder),nSIZE,L' '); - FSF.sprintf(strBuf.get(), L"%*.*s%c%*.*s%c%c%c%s",nSIZE,nSIZE,Size,0x2551,nSIZE,nSIZE,Size,0x2551,L' ',0x2502,strVirtDir.get()); - strBuf.updsize(); - Item.Flags=LIF_DISABLE|LIF_CHECKED|0x2b; - Item.Text=strBuf.get(); - List.Items=&Item; - Info.SendDlgMessage(hDlg,DM_LISTADD,0,&List); - Index++; - } - } - - SetBottom(hDlg,pFileList); - - if (bSetCurPos) - { - FarListPos ListPos={sizeof(FarListPos)}; - ListPos.SelectPos=ListInfo.SelectPos; - ListPos.TopPos=ListInfo.TopPos; - Info.SendDlgMessage(hDlg,DM_LISTSETCURPOS,0,&ListPos); - } - return true; + if (cur->dwFlags & RCIF_USERLNEW) + Mark = 0x25ba; //налево + else if (!Opt.SyncOnlyRight && !(cur->dwFlags & RCIF_USERNONE)) + Mark = 0x2190; //как обычно, направо + else if (cur->dwFlags & RCIF_USERDEL) + Mark = L'x'; + if (!Opt.SyncOnlyRight || (Opt.SyncOnlyRight && (cur->dwFlags & RCIF_RUNIQ))) + pFileList->RNew++; + } + + // виртуальная папка + bool bAddVirtDir = false; + string strVirtDir; + + // если попали сразу в подкаталог... добавим виртуальную папку в начало + if (!Index && FSF.LStricmp(GetPosToName(cur->L.Dir), LPanel.Dir)) + { + strVirtDir = GetPosToName(cur->L.Dir) + wcslen(LPanel.Dir); + if (strVirtDir.length() > 0 && strVirtDir[(size_t)(strVirtDir.length() - 1)] != L'\\') + strVirtDir += L"\\"; + struct FarListItem Item = {}; + Item.Flags = LIF_DISABLE | LIF_CHECKED | 0x2b; + wchar_t Size[65]; + strcentr(Size, GetMsg(MFolder), nSIZE, L' '); + FSF.sprintf(strBuf.get(), L"%*.*s%c%*.*s%c%c%c%s", nSIZE, nSIZE, Size, 0x2551, nSIZE, nSIZE, Size, 0x2551, L' ', 0x2502, strVirtDir.get()); + strBuf.updsize(); + Item.Text = strBuf.get(); + struct FarList List = {sizeof(FarList)}; + List.ItemsNumber = 1; + List.Items = &Item; + Info.SendDlgMessage(hDlg, DM_LISTADD, 0, &List); + Index++; + } + + { + for (int j = i + 1; j < pFileList->iCount; j++) + { + cmpFile* next = &pFileList->F[j]; + + if (Opt.SyncFlagClearUser) + next->dwFlags &= ~RCIF_USER; // все равно же скидывать + + if ((next->L.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) && (next->R.dwAttributes & FILE_ATTRIBUTE_DIRECTORY)) + continue; + if ((next->dwFlags & RCIF_USERSELECT) && !Opt.ShowListSelect) + continue; + if ((next->dwFlags & RCIF_EQUAL) && !Opt.ShowListIdentical) + continue; + if ((next->dwFlags & RCIF_DIFFER) && !Opt.ShowListDifferent) + continue; + if ((next->dwFlags & RCIF_LNEW) && !Opt.ShowListLNew) + continue; + if ((next->dwFlags & RCIF_RNEW) && !Opt.ShowListRNew) + continue; + + if (FSF.LStricmp(cur->L.Dir, next->L.Dir)) + { + bAddVirtDir = true; + strVirtDir = GetPosToName(next->L.Dir) + wcslen(LPanel.Dir); + if (strVirtDir.length() > 0 && strVirtDir[(size_t)(strVirtDir.length() - 1)] != L'\\') + strVirtDir += L"\\"; + } + break; + } + } + + MakeListItemText(strBuf.get(), cur, Mark); + strBuf.updsize(); + + struct FarListItem Item = {}; + if (cur->dwFlags & RCIF_EQUAL) + Item.Flags |= LIF_GRAYED; + if (cur->dwFlags & RCIF_USERSELECT) + { + Item.Flags |= LIF_CHECKED; + pFileList->Select++; + } + Item.Text = strBuf.get(); + struct FarList List = {sizeof(FarList)}; + List.ItemsNumber = 1; + List.Items = &Item; + + // если удачно добавили элемент... + if (Info.SendDlgMessage(hDlg, DM_LISTADD, 0, &List)) + { + pFileList->Items++; + // ... то ассоциируем данные с элементом листа + struct FarListItemData Data = {sizeof(FarListItemData)}; + Data.Index = Index++; + Data.DataSize = sizeof(cur); + Data.Data = &cur; + Info.SendDlgMessage(hDlg, DM_LISTSETDATA, 0, &Data); + } + + if (bAddVirtDir) + { + wchar_t Size[65]; + strcentr(Size, GetMsg(MFolder), nSIZE, L' '); + FSF.sprintf(strBuf.get(), L"%*.*s%c%*.*s%c%c%c%s", nSIZE, nSIZE, Size, 0x2551, nSIZE, nSIZE, Size, 0x2551, L' ', 0x2502, strVirtDir.get()); + strBuf.updsize(); + Item.Flags = LIF_DISABLE | LIF_CHECKED | 0x2b; + Item.Text = strBuf.get(); + List.Items = &Item; + Info.SendDlgMessage(hDlg, DM_LISTADD, 0, &List); + Index++; + } + } + + SetBottom(hDlg, pFileList); + + if (bSetCurPos) + { + FarListPos ListPos = {sizeof(FarListPos)}; + ListPos.SelectPos = ListInfo.SelectPos; + ListPos.TopPos = ListInfo.TopPos; + Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); + } + return true; } -bool bSetBottom=false; +bool bSetBottom = false; /*************************************************************************** * Обработчик диалога ***************************************************************************/ -intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void *Param2) +intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void* Param2) { - cmpFileList *pFileList=(cmpFileList *)Info.SendDlgMessage(hDlg,DM_GETDLGDATA,0,0); - switch(Msg) - { - case DN_INITDIALOG: - MakeCmpFarList(hDlg,pFileList,true,true); - Info.SendDlgMessage(hDlg, DM_SETMOUSEEVENTNOTIFY, 1, 0); - break; - - /************************************************************************/ - - case DN_RESIZECONSOLE: - { - COORD c=(*(COORD*)Param2); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,false,0); - Info.SendDlgMessage(hDlg,DM_RESIZEDIALOG,0,&c); - WinInfo.Con.Right=c.X-1; - WinInfo.Con.Bottom=c.Y-1; - WinInfo.TruncLen=WinInfo.Con.Right-WinInfo.Con.Left-20+1; - if (WinInfo.TruncLen>MAX_PATH-2) WinInfo.TruncLen=MAX_PATH-2; - Info.SendDlgMessage(hDlg,DM_SETITEMPOSITION,0,&WinInfo.Con); - c.X=c.Y=-1; - Info.SendDlgMessage(hDlg,DM_MOVEDIALOG,true,&c); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,true,0); - return true; - } - - /************************************************************************/ - - case DN_CTLCOLORDLGLIST: - if (Param1==0) - { - struct FarDialogItemColors *Colors=(FarDialogItemColors*)Param2; - FarColor Color; - int ColorIndex[15]= - { - COL_PANELTEXT, - COL_PANELBOX, - COL_PANELBOX, // заголовки - COL_PANELTEXT, // элемент списка - COL_PANELSELECTEDTEXT, - COL_PANELBOX, - COL_PANELCURSOR, // под курсором - COL_PANELSELECTEDCURSOR, - COL_PANELSCROLLBAR, - COL_PANELHIGHLIGHTTEXT, // виртуальная папка - COL_PANELSELECTEDTEXT, - COL_PANELSELECTEDCURSOR, - COL_PANELSELECTEDTEXT, - COL_PANELHIGHLIGHTTEXT, // одинаковые элементы - COL_PANELCURSOR - }; - for (int i=0; i<15; i++) - { - Info.AdvControl(&MainGuid,ACTL_GETCOLOR,ColorIndex[i],&Color); - Colors->Colors[i] = Color; - if (i==9) // виртуальная папка - { - int color=0x1F; - Colors->Colors[i].Flags=FCF_FG_4BIT|FCF_BG_4BIT; - Colors->Colors[i].ForegroundColor=color; - Colors->Colors[i].BackgroundColor=color>>4; - } - } - return true; - } - break; - - /************************************************************************/ - - case DN_CLOSE: - if (Opt.Mode==MODE_SYNC && Param1==-1) - { - Opt.Sync=GetSyncOpt(pFileList); - if (Opt.Sync==QR_EDIT) - return false; - else - return true; - } - break; - - /************************************************************************/ - - case DN_INPUT: - { - const INPUT_RECORD* record=(const INPUT_RECORD *)Param2; - - if (record->EventType==MOUSE_EVENT) - // отработаем щелчок мыши в поле Mark - if (Opt.Mode==MODE_SYNC && Param1==0 && record->Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED && record->Event.MouseEvent.dwEventFlags!=DOUBLE_CLICK) - { - SMALL_RECT dlgRect; - Info.SendDlgMessage(hDlg, DM_GETDLGRECT, 0, &dlgRect); - // щелкнули в LISTе - if (record->Event.MouseEvent.dwMousePosition.X>dlgRect.Left && record->Event.MouseEvent.dwMousePosition.XEvent.MouseEvent.dwMousePosition.Y>dlgRect.Top && record->Event.MouseEvent.dwMousePosition.YEvent.MouseEvent.dwMousePosition.Y-1-dlgRect.Top); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,false,0); - int NewPos=Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); - if (NewPos!=ListPos.SelectPos) - { - ListPos.SelectPos=OldPos; - Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); - MessageBeep(MB_OK); - } - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,true,0); - // вот оно, поле Mark - if (NewPos==ListPos.SelectPos && record->Event.MouseEvent.dwMousePosition.X>=dlgRect.Left+68 && record->Event.MouseEvent.dwMousePosition.X<=dlgRect.Left+70) - { - goto GOTOCHANGEMARK; - return false; - } - } - } - else if (Param1==0 && record->Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED && record->Event.MouseEvent.dwEventFlags==DOUBLE_CLICK) - { - SMALL_RECT dlgRect; - Info.SendDlgMessage(hDlg, DM_GETDLGRECT, 0, &dlgRect); - // не нужно поле Mark - if (Opt.Mode==MODE_CMP || record->Event.MouseEvent.dwMousePosition.XEvent.MouseEvent.dwMousePosition.X>dlgRect.Left+70) - { - goto GOTOCMPFILE; - return false; - } - } - // закроем диалог по клику в правом верхнем угу - else if (Param1==0 && record->Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED) - { - SMALL_RECT dlgRect; - Info.SendDlgMessage(hDlg, DM_GETDLGRECT, 0, &dlgRect); - if (record->Event.MouseEvent.dwMousePosition.X==dlgRect.Right && record->Event.MouseEvent.dwMousePosition.Y==dlgRect.Top) - { - INPUT_RECORD rec; - if (FSF.FarNameToInputRecord(L"F10",&rec)) - Info.SendDlgMessage(hDlg,DM_KEY,1,&rec); - else - Info.SendDlgMessage(hDlg,DM_CLOSE,0,0); - return false; - } - } - - return true; - } - - /************************************************************************/ - - case DN_CONTROLINPUT: - { - const INPUT_RECORD* record=(const INPUT_RECORD *)Param2; - - if (bSetBottom) - { - SetBottom(hDlg,pFileList); - bSetBottom=false; - } - - if (record->EventType==KEY_EVENT && record->Event.KeyEvent.bKeyDown) - { - WORD vk=record->Event.KeyEvent.wVirtualKeyCode; - - if (IsNone(record)) - { + cmpFileList* pFileList = (cmpFileList*) Info.SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); + switch (Msg) + { + case DN_INITDIALOG: + MakeCmpFarList(hDlg, pFileList, true, true); + Info.SendDlgMessage(hDlg, DM_SETMOUSEEVENTNOTIFY, 1, 0); + break; + + /************************************************************************/ + + case DN_RESIZECONSOLE: { + COORD c = (*(COORD*) Param2); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_RESIZEDIALOG, 0, &c); + WinInfo.Con.Right = c.X - 1; + WinInfo.Con.Bottom = c.Y - 1; + WinInfo.TruncLen = WinInfo.Con.Right - WinInfo.Con.Left - 20 + 1; + if (WinInfo.TruncLen > MAX_PATH - 2) + WinInfo.TruncLen = MAX_PATH - 2; + Info.SendDlgMessage(hDlg, DM_SETITEMPOSITION, 0, &WinInfo.Con); + c.X = c.Y = -1; + Info.SendDlgMessage(hDlg, DM_MOVEDIALOG, true, &c); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + return true; + } + + /************************************************************************/ + + case DN_CTLCOLORDLGLIST: + if (Param1 == 0) + { + struct FarDialogItemColors* Colors = (FarDialogItemColors*) Param2; + FarColor Color; + int ColorIndex[15] = {COL_PANELTEXT, + COL_PANELBOX, + COL_PANELBOX, // заголовки + COL_PANELTEXT, // элемент списка + COL_PANELSELECTEDTEXT, + COL_PANELBOX, + COL_PANELCURSOR, // под курсором + COL_PANELSELECTEDCURSOR, + COL_PANELSCROLLBAR, + COL_PANELHIGHLIGHTTEXT, // виртуальная папка + COL_PANELSELECTEDTEXT, + COL_PANELSELECTEDCURSOR, + COL_PANELSELECTEDTEXT, + COL_PANELHIGHLIGHTTEXT, // одинаковые элементы + COL_PANELCURSOR}; + for (int i = 0; i < 15; i++) + { + Info.AdvControl(&MainGuid, ACTL_GETCOLOR, ColorIndex[i], &Color); + Colors->Colors[i] = Color; + if (i == 9) // виртуальная папка + { + int color = 0x1F; + Colors->Colors[i].Flags = FCF_FG_4BIT | FCF_BG_4BIT; + Colors->Colors[i].ForegroundColor = color; + Colors->Colors[i].BackgroundColor = color >> 4; + } + } + return true; + } + break; + + /************************************************************************/ + + case DN_CLOSE: + if (Opt.Mode == MODE_SYNC && Param1 == -1) + { + Opt.Sync = GetSyncOpt(pFileList); + if (Opt.Sync == QR_EDIT) + return false; + else + return true; + } + break; + + /************************************************************************/ + + case DN_INPUT: { + const INPUT_RECORD* record = (const INPUT_RECORD*) Param2; + + if (record->EventType == MOUSE_EVENT) + // отработаем щелчок мыши в поле Mark + if (Opt.Mode == MODE_SYNC && Param1 == 0 && record->Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED && + record->Event.MouseEvent.dwEventFlags != DOUBLE_CLICK) + { + SMALL_RECT dlgRect; + Info.SendDlgMessage(hDlg, DM_GETDLGRECT, 0, &dlgRect); + // щелкнули в LISTе + if (record->Event.MouseEvent.dwMousePosition.X > dlgRect.Left && record->Event.MouseEvent.dwMousePosition.X < dlgRect.Right && + record->Event.MouseEvent.dwMousePosition.Y > dlgRect.Top && record->Event.MouseEvent.dwMousePosition.Y < dlgRect.Bottom) + { + FarListPos ListPos = {sizeof(FarListPos)}; + Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, &ListPos); + int OldPos = ListPos.SelectPos; + ListPos.SelectPos = ListPos.TopPos + (record->Event.MouseEvent.dwMousePosition.Y - 1 - dlgRect.Top); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + int NewPos = Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); + if (NewPos != ListPos.SelectPos) + { + ListPos.SelectPos = OldPos; + Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); + MessageBeep(MB_OK); + } + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + // вот оно, поле Mark + if (NewPos == ListPos.SelectPos && record->Event.MouseEvent.dwMousePosition.X >= dlgRect.Left + 68 && + record->Event.MouseEvent.dwMousePosition.X <= dlgRect.Left + 70) + { + goto GOTOCHANGEMARK; + return false; + } + } + } + else if (Param1 == 0 && record->Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED && + record->Event.MouseEvent.dwEventFlags == DOUBLE_CLICK) + { + SMALL_RECT dlgRect; + Info.SendDlgMessage(hDlg, DM_GETDLGRECT, 0, &dlgRect); + // не нужно поле Mark + if (Opt.Mode == MODE_CMP || record->Event.MouseEvent.dwMousePosition.X < dlgRect.Left + 68 || + record->Event.MouseEvent.dwMousePosition.X > dlgRect.Left + 70) + { + goto GOTOCMPFILE; + return false; + } + } + // закроем диалог по клику в правом верхнем угу + else if (Param1 == 0 && record->Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) + { + SMALL_RECT dlgRect; + Info.SendDlgMessage(hDlg, DM_GETDLGRECT, 0, &dlgRect); + if (record->Event.MouseEvent.dwMousePosition.X == dlgRect.Right && record->Event.MouseEvent.dwMousePosition.Y == dlgRect.Top) + { + INPUT_RECORD rec; + if (FSF.FarNameToInputRecord(L"F10", &rec)) + Info.SendDlgMessage(hDlg, DM_KEY, 1, &rec); + else + Info.SendDlgMessage(hDlg, DM_CLOSE, 0, 0); + return false; + } + } + + return true; + } + + /************************************************************************/ + + case DN_CONTROLINPUT: { + const INPUT_RECORD* record = (const INPUT_RECORD*) Param2; + + if (bSetBottom) + { + SetBottom(hDlg, pFileList); + bSetBottom = false; + } + + if (record->EventType == KEY_EVENT && record->Event.KeyEvent.bKeyDown) + { + WORD vk = record->Event.KeyEvent.wVirtualKeyCode; + + if (IsNone(record)) + { #if 0 if (vk==VK_F3) { @@ -712,581 +739,608 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void MessageBeep(MB_OK); return true; } - else + else #endif - if (vk==VK_RETURN) - { -GOTOCMPFILE: - int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); - cmpFile **tmp=(cmpFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); - cmpFile *cur=tmp?*tmp:NULL; - if (cur) - { - if ((LPanel.PInfo.Flags&PFLAGS_PLUGIN) || (RPanel.PInfo.Flags&PFLAGS_PLUGIN) || - (cur->L.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) || (cur->R.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) || - (cur->dwFlags&RCIF_LUNIQ) || (cur->dwFlags&RCIF_RUNIQ)) - { - MessageBeep(MB_OK); - return true; - } -/* - string strLFullFileName, strRFullFileName; - GetFullFileName(strLFullFileName,cur->LDir,cur->FileName); - GetFullFileName(strRFullFileName,cur->RDir,cur->FileName); - - if (pCompareFiles) - { - pCompareFiles(strLFullFileName.get(),strRFullFileName.get(),0); - } - else - { - WIN32_FIND_DATA wfdFindData; - HANDLE hFind; - wchar_t DiffProgram[MAX_PATH]; - ExpandEnvironmentStringsW(Opt.WinMergePath,DiffProgram,(sizeof(DiffProgram)/sizeof(DiffProgram[0]))); - bool bFindDiffProg=((hFind=FindFirstFileW(DiffProgram,&wfdFindData)) != INVALID_HANDLE_VALUE); - if (!bFindDiffProg) - { - ExpandEnvironmentStringsW(L"%ProgramFiles%\\WinMerge\\WinMergeU.exe",DiffProgram,(sizeof(DiffProgram)/sizeof(DiffProgram[0]))); - bFindDiffProg=((hFind=FindFirstFileW(DiffProgram,&wfdFindData)) != INVALID_HANDLE_VALUE); - } - if (bFindDiffProg) - { - FindClose(hFind); - STARTUPINFO si; - PROCESS_INFORMATION pi; - memset(&si, 0, sizeof(si)); - si.cb = sizeof(si); - wchar_t Command[32768]; - FSF.sprintf(Command, L"\"%s\" -e \"%s\" \"%s\"", DiffProgram,GetPosToName(strLFullFileName.get()),GetPosToName(strRFullFileName.get())); - if (CreateProcess(0,Command,0,0,false,0,0,0,&si,&pi)) - { - WaitForSingleObject(pi.hProcess,INFINITE); - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } - } - else - MessageBeep(MB_ICONASTERISK); - } -*/ - - if (!pFileList->AdvCmp->CompareCurFile(cur->L.Dir,cur->L.FileName,cur->R.Dir,cur->R.FileName,0)) - MessageBeep(MB_ICONASTERISK); - } - return true; - } - else if (vk==VK_INSERT) - { - struct FarListPos FLP={sizeof(FarListPos)}; - Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,&FLP); - cmpFile **tmp=(cmpFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)FLP.SelectPos); - cmpFile *cur=tmp?*tmp:NULL; - if (cur && Opt.ShowListSelect) - { - struct FarListGetItem FLGI={sizeof(FarListGetItem)}; - FLGI.ItemIndex=FLP.SelectPos; - if (Info.SendDlgMessage(hDlg,DM_LISTGETITEM,0,&FLGI)) - { - (FLGI.Item.Flags&LIF_CHECKED)?(FLGI.Item.Flags&= ~LIF_CHECKED):(FLGI.Item.Flags|=LIF_CHECKED); - struct FarListUpdate FLU={sizeof(FarListUpdate)}; - FLU.Index=FLGI.ItemIndex; - FLU.Item=FLGI.Item; - if (Info.SendDlgMessage(hDlg,DM_LISTUPDATE,0,&FLU)) - { - if (cur->dwFlags&RCIF_USERSELECT) - { - cur->dwFlags&=~RCIF_USERSELECT; - pFileList->Select--; - } - else - { - cur->dwFlags|=RCIF_USERSELECT; - pFileList->Select++; - } - FLP.SelectPos++; - Info.SendDlgMessage(hDlg,DM_LISTSETCURPOS,0,&FLP); - - SetBottom(hDlg,pFileList); - return true; - } - } - } - MessageBeep(MB_OK); - return true; - } - else if (vk==VK_SPACE) - { -GOTOCHANGEMARK: - int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); - cmpFile **tmp=(cmpFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); - cmpFile *cur=tmp?*tmp:NULL; - if (cur && !(cur->dwFlags&RCIF_EQUAL) && Opt.Mode==MODE_SYNC) - { - struct FarListGetItem FLGI={sizeof(FarListGetItem)}; - FLGI.ItemIndex=Pos; - if (Info.SendDlgMessage(hDlg,DM_LISTGETITEM,0,&FLGI)) - { - __int64 Delta=0; - if (!(cur->dwFlags&RCIF_LUNIQ) && !(cur->dwFlags&RCIF_RUNIQ)) - Delta=(((__int64)cur->L.ftLastWriteTime.dwHighDateTime << 32) | cur->L.ftLastWriteTime.dwLowDateTime) - - (((__int64)cur->R.ftLastWriteTime.dwHighDateTime << 32) | cur->R.ftLastWriteTime.dwLowDateTime); - - if (cur->dwFlags&RCIF_DIFFER) // сравнивали без учета времени элементов - { - if (!(cur->dwFlags&RCIF_USERLNEW) && !(cur->dwFlags&RCIF_USERRNEW)) - { - if (Delta>=0 || Opt.SyncOnlyRight) cur->dwFlags|=RCIF_USERLNEW; - else if (!Opt.SyncOnlyRight) cur->dwFlags|=RCIF_USERRNEW; - } - else if ((Delta>=0 || Opt.SyncOnlyRight) && (cur->dwFlags&RCIF_USERLNEW)) - { - cur->dwFlags&=~RCIF_USERLNEW; - if (!Opt.SyncOnlyRight) cur->dwFlags|=RCIF_USERRNEW; - } - else if (Delta<0 && (cur->dwFlags&RCIF_USERRNEW)) - { - cur->dwFlags|=RCIF_USERLNEW; - cur->dwFlags&=~RCIF_USERRNEW; - } - else - { - cur->dwFlags&=~RCIF_USERLNEW; - cur->dwFlags&=~RCIF_USERRNEW; - } - } - else if (!(cur->dwFlags&RCIF_LUNIQ) && !(cur->dwFlags&RCIF_RUNIQ)) // сравнивали с учетом времени элементов - { - if (!(cur->dwFlags&RCIF_USERNONE) && !(cur->dwFlags&RCIF_USERLNEW) && !(cur->dwFlags&RCIF_USERRNEW)) - { - cur->dwFlags|=RCIF_USERNONE; -// cur->dwFlags&=~RCIF_USERLNEW; -// cur->dwFlags&=~RCIF_USERRNEW; - } - else if (cur->dwFlags&RCIF_USERNONE) - { - cur->dwFlags&=~RCIF_USERNONE; - if (cur->dwFlags&RCIF_LNEW) - { - if (!Opt.SyncOnlyRight) cur->dwFlags|=RCIF_USERRNEW; - } - else - { - cur->dwFlags|=RCIF_USERLNEW; - } - } - else - { - if (Opt.SyncOnlyRight) - { - cur->dwFlags|=RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERLNEW; - } - else - { -// cur->dwFlags&=~RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERLNEW; - cur->dwFlags&=~RCIF_USERRNEW; - } - } - } - else - { - if (cur->dwFlags&RCIF_USERNONE) - { - cur->dwFlags&= ~RCIF_USERNONE; - if (Opt.SyncOnlyRight && (cur->dwFlags&RCIF_RNEW)) cur->dwFlags|=RCIF_USERDEL; - } - else - { - cur->dwFlags|=RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERDEL; - } - } - - string strBuf; - strBuf.get(65536); - wchar_t Mark=L' '; - if (cur->dwFlags&RCIF_DIFFER) - { - if (cur->dwFlags&RCIF_USERLNEW) Mark=0x25ba; - else if (!Opt.SyncOnlyRight && (cur->dwFlags&RCIF_USERRNEW)) Mark=0x25c4; - else Mark=0x2260; - } - else if (cur->dwFlags&RCIF_LNEW) - { - if (!Opt.SyncOnlyRight && (cur->dwFlags&RCIF_USERRNEW)) Mark=0x25c4; - else if (!(cur->dwFlags&RCIF_USERNONE)) Mark=0x2192; - } - else if (cur->dwFlags&RCIF_RNEW) - { - if (cur->dwFlags&RCIF_USERLNEW) Mark=0x25ba; - else if (!Opt.SyncOnlyRight && !(cur->dwFlags&RCIF_USERNONE)) Mark=0x2190; - else if (cur->dwFlags&RCIF_USERDEL) Mark=L'x'; - } - MakeListItemText(strBuf.get(),cur,Mark); - strBuf.updsize(); - struct FarListUpdate FLU={sizeof(FarListUpdate)}; - FLU.Index=FLGI.ItemIndex; - FLU.Item=FLGI.Item; - FLU.Item.Text=strBuf.get(); - if (Info.SendDlgMessage(hDlg,DM_LISTUPDATE,0,&FLU)) - return true; - } - } - MessageBeep(MB_OK); - return true; - } - } - else if (IsShift(record)) - { - if (vk==VK_RETURN) - { - int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); - cmpFile **tmp=(cmpFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); - cmpFile *cur=tmp?*tmp:NULL; - if (cur) - { - if ((LPanel.PInfo.Flags&PFLAGS_PLUGIN) || (RPanel.PInfo.Flags&PFLAGS_PLUGIN) || - (cur->L.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) || (cur->R.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) || - (cur->dwFlags&RCIF_LUNIQ) || (cur->dwFlags&RCIF_RUNIQ)) - { - MessageBeep(MB_OK); - return true; - } - if (!pFileList->AdvCmp->CompareCurFile(cur->L.Dir,cur->L.FileName,cur->R.Dir,cur->R.FileName,1)) - MessageBeep(MB_ICONASTERISK); - } - return true; - } - } - else if (IsCtrl(record)) - { - if (vk==VK_CONTROL) - { - int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); - cmpFile **tmp=(cmpFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); - cmpFile *cur=tmp?*tmp:NULL; - if (cur) - { - string strVirtDir=GetPosToName(cur->L.Dir)+wcslen(LPanel.Dir); - if (strVirtDir.length()>0) - FSF.TruncStr(strVirtDir.get(),WinInfo.TruncLen-wcslen(GetMsg(MListBottomCurDir))); - else - { - MessageBeep(MB_OK); - return true; - } - strVirtDir.updsize(); - SetBottom(hDlg,pFileList,strVirtDir.get()); - bSetBottom=true; - return true; - } - } - else if (vk==0x52) //VK_R - { - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,false,0); - Opt.ShowListSelect=true; - Opt.ShowListIdentical=true; - Opt.ShowListDifferent=true; - Opt.ShowListLNew=true; - Opt.ShowListRNew=true; - Opt.SyncFlagClearUser=true; - MakeCmpFarList(hDlg,pFileList); - Opt.SyncFlagClearUser=false; // восстановим! - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,true,0); - return true; - } - else if (vk==VK_OEM_5 && !(Opt.ShowListSelect && pFileList->Select==0)) - { - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,false,0); - Opt.ShowListSelect=(Opt.ShowListSelect?false:true); - MakeCmpFarList(hDlg,pFileList); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,true,0); - return true; - } - else if (vk==VK_OEM_PLUS && !(Opt.ShowListIdentical && pFileList->Identical==0)) - { - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,false,0); - Opt.ShowListIdentical=(Opt.ShowListIdentical?false:true); - MakeCmpFarList(hDlg,pFileList); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,true,0); - return true; - } - else if (vk==VK_OEM_MINUS && !(Opt.ShowListDifferent && pFileList->Different==0)) - { - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,false,0); - Opt.ShowListDifferent=(Opt.ShowListDifferent?false:true); - MakeCmpFarList(hDlg,pFileList); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,true,0); - return true; - } - else if (vk==VK_OEM_4 && !(Opt.ShowListLNew && pFileList->LNew==0)) - { - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,false,0); - Opt.ShowListLNew=(Opt.ShowListLNew?false:true); - MakeCmpFarList(hDlg,pFileList); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,true,0); - return true; - } - else if (vk==VK_OEM_6 && !(Opt.ShowListRNew && pFileList->RNew==0)) - { - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,false,0); - Opt.ShowListRNew=(Opt.ShowListRNew?false:true); - MakeCmpFarList(hDlg,pFileList); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,true,0); - return true; - } - else if (vk==VK_SPACE && Opt.Mode==MODE_SYNC) - { - int ret=0; - struct FarDialogItem DialogItems[] = { - // Type X1 Y1 X2 Y2 Selected History Mask Flags Data MaxLen UserParam - /* 0*/{DI_DOUBLEBOX, 3, 1,60,11, 0, 0, 0, 0, GetMsg(MSyncSelTitle),0,0}, - /* 1*/{DI_TEXT, 5, 2, 0, 0, 0, 0, 0, DIF_SEPARATOR, GetMsg(MSyncSelDiff),0,0}, - /* 2*/{DI_RADIOBUTTON,5, 3, 0, 0,(Opt.SyncOnlyRight?0:1),0,0,DIF_FOCUS|DIF_GROUP, GetMsg(MSyncSelToSkip),0,0}, - /* 3*/{DI_RADIOBUTTON,22,3, 0, 0,(Opt.SyncOnlyRight?1:0),0,0,0, GetMsg(MSyncSelToRight),0,0}, - /* 4*/{DI_RADIOBUTTON,39,3, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelToLeft),0,0}, - /* 5*/{DI_CHECKBOX, 5, 4, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelIfNew),0,0}, - /* 6*/{DI_TEXT, 5, 5, 0, 0, 0, 0, 0, DIF_SEPARATOR, GetMsg(MSyncSelLNew),0,0}, - /* 7*/{DI_RADIOBUTTON,5, 6, 0, 0, 1, 0, 0, DIF_GROUP, GetMsg(MSyncSelToRight),0,0}, - /* 8*/{DI_RADIOBUTTON,22,6, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelToLeft),0,0}, - /* 9*/{DI_RADIOBUTTON,39,6, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelToNon),0,0}, - /*10*/{DI_TEXT, 5, 7, 0, 0, 0, 0, 0, DIF_SEPARATOR, GetMsg(MSyncSelRNew),0,0}, - /*11*/{DI_RADIOBUTTON,5, 8, 0, 0,(Opt.SyncOnlyRight!=2?1:0),0,0,DIF_GROUP,GetMsg(Opt.SyncOnlyRight?MSyncSelToDel:MSyncSelToLeft),0,0}, - /*12*/{DI_RADIOBUTTON,22,8, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelToRight),0,0}, - /*13*/{DI_RADIOBUTTON,39,8, 0, 0,(Opt.SyncOnlyRight!=2?0:1),0,0,0,GetMsg(MSyncSelToNon),0,0}, - /*14*/{DI_TEXT, -1, 9, 0, 0, 0, 0, 0, DIF_SEPARATOR, 0,0,0}, - /*15*/{DI_BUTTON, 0,10, 0, 0, 0, 0, 0, DIF_DEFAULTBUTTON|DIF_CENTERGROUP, GetMsg(MOK),0,0}, - /*16*/{DI_BUTTON, 0,10, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MCancel),0,0} - }; - - HANDLE hDlgCur=Info.DialogInit(&MainGuid,&DlgSyncSel,-1,-1,64,13,L"DlgCmp", DialogItems,sizeof(DialogItems)/sizeof(DialogItems[0]),0,0,0,0); - if (hDlgCur != INVALID_HANDLE_VALUE) - { - ret=(int)Info.DialogRun(hDlgCur); - if (ret==15) - { - Opt.SyncFlagCopy=(Info.SendDlgMessage(hDlgCur,DM_GETCHECK,2,0)?1:(Info.SendDlgMessage(hDlgCur,DM_GETCHECK,3,0)?2:-2)); - Opt.SyncFlagIfNew=Info.SendDlgMessage(hDlgCur,DM_GETCHECK,5,0); - Opt.SyncFlagLCopy=(Info.SendDlgMessage(hDlgCur,DM_GETCHECK,7,0)?2:(Info.SendDlgMessage(hDlgCur,DM_GETCHECK,8,0)?-2:0)); - Opt.SyncFlagRCopy=(Info.SendDlgMessage(hDlgCur,DM_GETCHECK,11,0)?-2:(Info.SendDlgMessage(hDlgCur,DM_GETCHECK,12,0)?2:0)); - } - Info.DialogFree(hDlgCur); - } - if (ret==15) - { - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,false,0); - MakeCmpFarList(hDlg,pFileList,true,false); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,true,0); - Opt.SyncFlagCopy=Opt.SyncFlagIfNew=0; Opt.SyncFlagLCopy=1; Opt.SyncFlagRCopy=-1; - } - return true; - } - else if (vk==VK_PRIOR) - { - int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); - cmpFile **tmp=(cmpFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); - cmpFile *cur=tmp?*tmp:NULL; - if (cur) - { - if ((LPanel.PInfo.Flags&PFLAGS_PLUGIN) || (RPanel.PInfo.Flags&PFLAGS_PLUGIN)) - { - MessageBeep(MB_OK); - return true; - } - - Opt.Mode=MODE_CMP; //скидываем!!! - - PanelRedrawInfo LRInfo={sizeof(PanelRedrawInfo),0,0}, RRInfo={sizeof(PanelRedrawInfo),0,0}; - bool bSetLDir=false, bSetLFile=false; - bool bSetRDir=false, bSetRFile=false; -/* - if (LPanel.PInfo.Flags&PFLAGS_PLUGIN) - { -DebugMsg(strLPanelDir.get(),L"strLPanelDir.get()"); -DebugMsg(cur->LDir,L"cur->LDir"); - strLPanelDir=cur->FileName; - (wchar_t)*(FSF.PointToName(strLPanelDir.get())) = 0; -DebugMsg(strLPanelDir.get(),L"strLPanelDir.get()"); - } -*/ - if (FSF.LStricmp(LPanel.Dir,GetPosToName(cur->L.Dir))) - { - FarPanelDirectory dirInfo={sizeof(FarPanelDirectory),GetPosToName(cur->L.Dir),NULL,{0},NULL}; - bSetLDir=Info.PanelControl(LPanel.hPanel,FCTL_SETPANELDIRECTORY,0,&dirInfo); - Info.PanelControl(LPanel.hPanel,FCTL_BEGINSELECTION,0,0); - } - - { - PanelInfo PInfo={sizeof(PanelInfo)}; - Info.PanelControl(LPanel.hPanel,FCTL_GETPANELINFO,0,&PInfo); - - for (unsigned i=0; iL.FileName && !FSF.LStricmp(cur->L.FileName,FGPPI.Item->FileName)) - { - LRInfo.CurrentItem=i; - bSetLFile=true; - } - // если изменили каталог, то отметим все отличия на новой напанели - if (bSetLDir) - { - for (int j=0; jiCount; j++) - { - if (FSF.LStricmp(pFileList->F[j].L.Dir,cur->L.Dir)) - continue; - if (pFileList->F[j].L.FileName && !FSF.LStricmp(pFileList->F[j].L.FileName,FGPPI.Item->FileName)) - { - Info.PanelControl(LPanel.hPanel,FCTL_SETSELECTION,i,(void*)((pFileList->F[j].dwFlags&RCIF_DIFFER) || (pFileList->F[j].dwFlags&RCIF_LNEW) || (pFileList->F[j].dwFlags&RCIF_RNEW))); - break; - } - } - } - free(PPI); - if (!bSetLDir && bSetLFile) - break; - } - } - if (bSetLDir) - Info.PanelControl(LPanel.hPanel,FCTL_ENDSELECTION,0,0); - } - - if (FSF.LStricmp(RPanel.Dir,GetPosToName(cur->R.Dir))) - { - FarPanelDirectory dirInfo={sizeof(FarPanelDirectory),GetPosToName(cur->R.Dir),NULL,{0},NULL}; - bSetRDir=Info.PanelControl(RPanel.hPanel,FCTL_SETPANELDIRECTORY,0,&dirInfo); - Info.PanelControl(RPanel.hPanel,FCTL_BEGINSELECTION,0,0); - } - { - PanelInfo PInfo={sizeof(PanelInfo)}; - Info.PanelControl(RPanel.hPanel,FCTL_GETPANELINFO,0,&PInfo); - - for (unsigned i=0; iR.FileName && !FSF.LStricmp(cur->R.FileName,FGPPI.Item->FileName)) - { - RRInfo.CurrentItem=i; - bSetRFile=true; - } - if (bSetRDir) - { - for (int j=0; jiCount; j++) - { - if (FSF.LStricmp(pFileList->F[j].R.Dir,cur->R.Dir)) - continue; - if (pFileList->F[j].R.FileName && !FSF.LStricmp(pFileList->F[j].R.FileName,FGPPI.Item->FileName)) - { - Info.PanelControl(RPanel.hPanel,FCTL_SETSELECTION,i,(void*)((pFileList->F[j].dwFlags&RCIF_DIFFER) || (pFileList->F[j].dwFlags&RCIF_LNEW) || (pFileList->F[j].dwFlags&RCIF_RNEW))); - break; - } - } - } - free(PPI); - if (!bSetRDir && bSetRFile) - break; - } - } - if (bSetRDir) - Info.PanelControl(RPanel.hPanel,FCTL_ENDSELECTION,0,0); - } - Info.PanelControl(LPanel.hPanel,FCTL_REDRAWPANEL,0,&LRInfo); - Info.PanelControl(RPanel.hPanel,FCTL_REDRAWPANEL,0,&RRInfo); - Info.SendDlgMessage(hDlg,DM_CLOSE,0,0); - } - return true; - } - } - } - } - - } - return Info.DefDlgProc(hDlg,Msg,Param1,Param2); + if (vk == VK_RETURN) + { + GOTOCMPFILE: + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); + cmpFile* cur = tmp ? *tmp : NULL; + if (cur) + { + if ((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN) || (cur->L.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) || + (cur->R.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) || (cur->dwFlags & RCIF_LUNIQ) || (cur->dwFlags & RCIF_RUNIQ)) + { + MessageBeep(MB_OK); + return true; + } + /* + string strLFullFileName, strRFullFileName; + GetFullFileName(strLFullFileName,cur->LDir,cur->FileName); + GetFullFileName(strRFullFileName,cur->RDir,cur->FileName); + + if (pCompareFiles) + { + pCompareFiles(strLFullFileName.get(),strRFullFileName.get(),0); + } + else + { + WIN32_FIND_DATA wfdFindData; + HANDLE hFind; + wchar_t DiffProgram[MAX_PATH]; + ExpandEnvironmentStringsW(Opt.WinMergePath,DiffProgram,(sizeof(DiffProgram)/sizeof(DiffProgram[0]))); + bool bFindDiffProg=((hFind=FindFirstFileW(DiffProgram,&wfdFindData)) != INVALID_HANDLE_VALUE); + if (!bFindDiffProg) + { + ExpandEnvironmentStringsW(L"%ProgramFiles%\\WinMerge\\WinMergeU.exe",DiffProgram,(sizeof(DiffProgram)/sizeof(DiffProgram[0]))); + bFindDiffProg=((hFind=FindFirstFileW(DiffProgram,&wfdFindData)) != INVALID_HANDLE_VALUE); + } + if (bFindDiffProg) + { + FindClose(hFind); + STARTUPINFO si; + PROCESS_INFORMATION pi; + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + wchar_t Command[32768]; + FSF.sprintf(Command, L"\"%s\" -e \"%s\" \"%s\"", + DiffProgram,GetPosToName(strLFullFileName.get()),GetPosToName(strRFullFileName.get())); if + (CreateProcess(0,Command,0,0,false,0,0,0,&si,&pi)) + { + WaitForSingleObject(pi.hProcess,INFINITE); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + } + else + MessageBeep(MB_ICONASTERISK); + } + */ + + if (!pFileList->AdvCmp->CompareCurFile(cur->L.Dir, cur->L.FileName, cur->R.Dir, cur->R.FileName, 0)) + MessageBeep(MB_ICONASTERISK); + } + return true; + } + else if (vk == VK_INSERT) + { + struct FarListPos FLP = {sizeof(FarListPos)}; + Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, &FLP); + cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) FLP.SelectPos); + cmpFile* cur = tmp ? *tmp : NULL; + if (cur && Opt.ShowListSelect) + { + struct FarListGetItem FLGI = {sizeof(FarListGetItem)}; + FLGI.ItemIndex = FLP.SelectPos; + if (Info.SendDlgMessage(hDlg, DM_LISTGETITEM, 0, &FLGI)) + { + (FLGI.Item.Flags & LIF_CHECKED) ? (FLGI.Item.Flags &= ~LIF_CHECKED) : (FLGI.Item.Flags |= LIF_CHECKED); + struct FarListUpdate FLU = {sizeof(FarListUpdate)}; + FLU.Index = FLGI.ItemIndex; + FLU.Item = FLGI.Item; + if (Info.SendDlgMessage(hDlg, DM_LISTUPDATE, 0, &FLU)) + { + if (cur->dwFlags & RCIF_USERSELECT) + { + cur->dwFlags &= ~RCIF_USERSELECT; + pFileList->Select--; + } + else + { + cur->dwFlags |= RCIF_USERSELECT; + pFileList->Select++; + } + FLP.SelectPos++; + Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &FLP); + + SetBottom(hDlg, pFileList); + return true; + } + } + } + MessageBeep(MB_OK); + return true; + } + else if (vk == VK_SPACE) + { + GOTOCHANGEMARK: + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); + cmpFile* cur = tmp ? *tmp : NULL; + if (cur && !(cur->dwFlags & RCIF_EQUAL) && Opt.Mode == MODE_SYNC) + { + struct FarListGetItem FLGI = {sizeof(FarListGetItem)}; + FLGI.ItemIndex = Pos; + if (Info.SendDlgMessage(hDlg, DM_LISTGETITEM, 0, &FLGI)) + { + __int64 Delta = 0; + if (!(cur->dwFlags & RCIF_LUNIQ) && !(cur->dwFlags & RCIF_RUNIQ)) + Delta = (((__int64) cur->L.ftLastWriteTime.dwHighDateTime << 32) | cur->L.ftLastWriteTime.dwLowDateTime) - + (((__int64) cur->R.ftLastWriteTime.dwHighDateTime << 32) | cur->R.ftLastWriteTime.dwLowDateTime); + + if (cur->dwFlags & RCIF_DIFFER) // сравнивали без учета времени элементов + { + if (!(cur->dwFlags & RCIF_USERLNEW) && !(cur->dwFlags & RCIF_USERRNEW)) + { + if (Delta >= 0 || Opt.SyncOnlyRight) + cur->dwFlags |= RCIF_USERLNEW; + else if (!Opt.SyncOnlyRight) + cur->dwFlags |= RCIF_USERRNEW; + } + else if ((Delta >= 0 || Opt.SyncOnlyRight) && (cur->dwFlags & RCIF_USERLNEW)) + { + cur->dwFlags &= ~RCIF_USERLNEW; + if (!Opt.SyncOnlyRight) + cur->dwFlags |= RCIF_USERRNEW; + } + else if (Delta < 0 && (cur->dwFlags & RCIF_USERRNEW)) + { + cur->dwFlags |= RCIF_USERLNEW; + cur->dwFlags &= ~RCIF_USERRNEW; + } + else + { + cur->dwFlags &= ~RCIF_USERLNEW; + cur->dwFlags &= ~RCIF_USERRNEW; + } + } + else if (!(cur->dwFlags & RCIF_LUNIQ) && !(cur->dwFlags & RCIF_RUNIQ)) // сравнивали с учетом времени элементов + { + if (!(cur->dwFlags & RCIF_USERNONE) && !(cur->dwFlags & RCIF_USERLNEW) && !(cur->dwFlags & RCIF_USERRNEW)) + { + cur->dwFlags |= RCIF_USERNONE; + // cur->dwFlags&=~RCIF_USERLNEW; + // cur->dwFlags&=~RCIF_USERRNEW; + } + else if (cur->dwFlags & RCIF_USERNONE) + { + cur->dwFlags &= ~RCIF_USERNONE; + if (cur->dwFlags & RCIF_LNEW) + { + if (!Opt.SyncOnlyRight) + cur->dwFlags |= RCIF_USERRNEW; + } + else + { + cur->dwFlags |= RCIF_USERLNEW; + } + } + else + { + if (Opt.SyncOnlyRight) + { + cur->dwFlags |= RCIF_USERNONE; + cur->dwFlags &= ~RCIF_USERLNEW; + } + else + { + // cur->dwFlags&=~RCIF_USERNONE; + cur->dwFlags &= ~RCIF_USERLNEW; + cur->dwFlags &= ~RCIF_USERRNEW; + } + } + } + else + { + if (cur->dwFlags & RCIF_USERNONE) + { + cur->dwFlags &= ~RCIF_USERNONE; + if (Opt.SyncOnlyRight && (cur->dwFlags & RCIF_RNEW)) + cur->dwFlags |= RCIF_USERDEL; + } + else + { + cur->dwFlags |= RCIF_USERNONE; + cur->dwFlags &= ~RCIF_USERDEL; + } + } + + string strBuf; + strBuf.get(65536); + wchar_t Mark = L' '; + if (cur->dwFlags & RCIF_DIFFER) + { + if (cur->dwFlags & RCIF_USERLNEW) + Mark = 0x25ba; + else if (!Opt.SyncOnlyRight && (cur->dwFlags & RCIF_USERRNEW)) + Mark = 0x25c4; + else + Mark = 0x2260; + } + else if (cur->dwFlags & RCIF_LNEW) + { + if (!Opt.SyncOnlyRight && (cur->dwFlags & RCIF_USERRNEW)) + Mark = 0x25c4; + else if (!(cur->dwFlags & RCIF_USERNONE)) + Mark = 0x2192; + } + else if (cur->dwFlags & RCIF_RNEW) + { + if (cur->dwFlags & RCIF_USERLNEW) + Mark = 0x25ba; + else if (!Opt.SyncOnlyRight && !(cur->dwFlags & RCIF_USERNONE)) + Mark = 0x2190; + else if (cur->dwFlags & RCIF_USERDEL) + Mark = L'x'; + } + MakeListItemText(strBuf.get(), cur, Mark); + strBuf.updsize(); + struct FarListUpdate FLU = {sizeof(FarListUpdate)}; + FLU.Index = FLGI.ItemIndex; + FLU.Item = FLGI.Item; + FLU.Item.Text = strBuf.get(); + if (Info.SendDlgMessage(hDlg, DM_LISTUPDATE, 0, &FLU)) + return true; + } + } + MessageBeep(MB_OK); + return true; + } + } + else if (IsShift(record)) + { + if (vk == VK_RETURN) + { + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); + cmpFile* cur = tmp ? *tmp : NULL; + if (cur) + { + if ((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN) || (cur->L.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) || + (cur->R.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) || (cur->dwFlags & RCIF_LUNIQ) || (cur->dwFlags & RCIF_RUNIQ)) + { + MessageBeep(MB_OK); + return true; + } + if (!pFileList->AdvCmp->CompareCurFile(cur->L.Dir, cur->L.FileName, cur->R.Dir, cur->R.FileName, 1)) + MessageBeep(MB_ICONASTERISK); + } + return true; + } + } + else if (IsCtrl(record)) + { + if (vk == VK_CONTROL) + { + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); + cmpFile* cur = tmp ? *tmp : NULL; + if (cur) + { + string strVirtDir = GetPosToName(cur->L.Dir) + wcslen(LPanel.Dir); + if (strVirtDir.length() > 0) + FSF.TruncStr(strVirtDir.get(), WinInfo.TruncLen - wcslen(GetMsg(MListBottomCurDir))); + else + { + MessageBeep(MB_OK); + return true; + } + strVirtDir.updsize(); + SetBottom(hDlg, pFileList, strVirtDir.get()); + bSetBottom = true; + return true; + } + } + else if (vk == 0x52) // VK_R + { + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Opt.ShowListSelect = true; + Opt.ShowListIdentical = true; + Opt.ShowListDifferent = true; + Opt.ShowListLNew = true; + Opt.ShowListRNew = true; + Opt.SyncFlagClearUser = true; + MakeCmpFarList(hDlg, pFileList); + Opt.SyncFlagClearUser = false; // восстановим! + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + return true; + } + else if (vk == VK_OEM_5 && !(Opt.ShowListSelect && pFileList->Select == 0)) + { + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Opt.ShowListSelect = (Opt.ShowListSelect ? false : true); + MakeCmpFarList(hDlg, pFileList); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + return true; + } + else if (vk == VK_OEM_PLUS && !(Opt.ShowListIdentical && pFileList->Identical == 0)) + { + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Opt.ShowListIdentical = (Opt.ShowListIdentical ? false : true); + MakeCmpFarList(hDlg, pFileList); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + return true; + } + else if (vk == VK_OEM_MINUS && !(Opt.ShowListDifferent && pFileList->Different == 0)) + { + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Opt.ShowListDifferent = (Opt.ShowListDifferent ? false : true); + MakeCmpFarList(hDlg, pFileList); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + return true; + } + else if (vk == VK_OEM_4 && !(Opt.ShowListLNew && pFileList->LNew == 0)) + { + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Opt.ShowListLNew = (Opt.ShowListLNew ? false : true); + MakeCmpFarList(hDlg, pFileList); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + return true; + } + else if (vk == VK_OEM_6 && !(Opt.ShowListRNew && pFileList->RNew == 0)) + { + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Opt.ShowListRNew = (Opt.ShowListRNew ? false : true); + MakeCmpFarList(hDlg, pFileList); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + return true; + } + else if (vk == VK_SPACE && Opt.Mode == MODE_SYNC) + { + int ret = 0; + struct FarDialogItem DialogItems[] = { + // Type X1 Y1 X2 Y2 Selected History Mask Flags Data MaxLen UserParam + /* 0*/ {DI_DOUBLEBOX, 3, 1, 60, 11, 0, 0, 0, 0, GetMsg(MSyncSelTitle), 0, 0}, + /* 1*/ {DI_TEXT, 5, 2, 0, 0, 0, 0, 0, DIF_SEPARATOR, GetMsg(MSyncSelDiff), 0, 0}, + /* 2*/ {DI_RADIOBUTTON, 5, 3, 0, 0, (Opt.SyncOnlyRight ? 0 : 1), 0, 0, DIF_FOCUS | DIF_GROUP, GetMsg(MSyncSelToSkip), 0, 0}, + /* 3*/ {DI_RADIOBUTTON, 22, 3, 0, 0, (Opt.SyncOnlyRight ? 1 : 0), 0, 0, 0, GetMsg(MSyncSelToRight), 0, 0}, + /* 4*/ {DI_RADIOBUTTON, 39, 3, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelToLeft), 0, 0}, + /* 5*/ {DI_CHECKBOX, 5, 4, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelIfNew), 0, 0}, + /* 6*/ {DI_TEXT, 5, 5, 0, 0, 0, 0, 0, DIF_SEPARATOR, GetMsg(MSyncSelLNew), 0, 0}, + /* 7*/ {DI_RADIOBUTTON, 5, 6, 0, 0, 1, 0, 0, DIF_GROUP, GetMsg(MSyncSelToRight), 0, 0}, + /* 8*/ {DI_RADIOBUTTON, 22, 6, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelToLeft), 0, 0}, + /* 9*/ {DI_RADIOBUTTON, 39, 6, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelToNon), 0, 0}, + /*10*/ {DI_TEXT, 5, 7, 0, 0, 0, 0, 0, DIF_SEPARATOR, GetMsg(MSyncSelRNew), 0, 0}, + /*11*/ + {DI_RADIOBUTTON, 5, 8, 0, 0, (Opt.SyncOnlyRight != 2 ? 1 : 0), 0, 0, DIF_GROUP, + GetMsg(Opt.SyncOnlyRight ? MSyncSelToDel : MSyncSelToLeft), 0, 0}, + /*12*/ {DI_RADIOBUTTON, 22, 8, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelToRight), 0, 0}, + /*13*/ {DI_RADIOBUTTON, 39, 8, 0, 0, (Opt.SyncOnlyRight != 2 ? 0 : 1), 0, 0, 0, GetMsg(MSyncSelToNon), 0, 0}, + /*14*/ {DI_TEXT, -1, 9, 0, 0, 0, 0, 0, DIF_SEPARATOR, 0, 0, 0}, + /*15*/ {DI_BUTTON, 0, 10, 0, 0, 0, 0, 0, DIF_DEFAULTBUTTON | DIF_CENTERGROUP, GetMsg(MOK), 0, 0}, + /*16*/ {DI_BUTTON, 0, 10, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MCancel), 0, 0}}; + + HANDLE hDlgCur = Info.DialogInit(&MainGuid, &DlgSyncSel, -1, -1, 64, 13, L"DlgCmp", DialogItems, + sizeof(DialogItems) / sizeof(DialogItems[0]), 0, 0, 0, 0); + if (hDlgCur != INVALID_HANDLE_VALUE) + { + ret = (int) Info.DialogRun(hDlgCur); + if (ret == 15) + { + Opt.SyncFlagCopy = (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 2, 0) ? 1 : (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 3, 0) ? 2 : -2)); + Opt.SyncFlagIfNew = Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 5, 0); + Opt.SyncFlagLCopy = + (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 7, 0) ? 2 : (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 8, 0) ? -2 : 0)); + Opt.SyncFlagRCopy = + (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 11, 0) ? -2 : (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 12, 0) ? 2 : 0)); + } + Info.DialogFree(hDlgCur); + } + if (ret == 15) + { + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + MakeCmpFarList(hDlg, pFileList, true, false); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Opt.SyncFlagCopy = Opt.SyncFlagIfNew = 0; + Opt.SyncFlagLCopy = 1; + Opt.SyncFlagRCopy = -1; + } + return true; + } + else if (vk == VK_PRIOR) + { + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); + cmpFile* cur = tmp ? *tmp : NULL; + if (cur) + { + if ((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN)) + { + MessageBeep(MB_OK); + return true; + } + + Opt.Mode = MODE_CMP; //скидываем!!! + + PanelRedrawInfo LRInfo = {sizeof(PanelRedrawInfo), 0, 0}, RRInfo = {sizeof(PanelRedrawInfo), 0, 0}; + bool bSetLDir = false, bSetLFile = false; + bool bSetRDir = false, bSetRFile = false; + /* + if (LPanel.PInfo.Flags&PFLAGS_PLUGIN) + { + DebugMsg(strLPanelDir.get(),L"strLPanelDir.get()"); + DebugMsg(cur->LDir,L"cur->LDir"); + strLPanelDir=cur->FileName; + (wchar_t)*(FSF.PointToName(strLPanelDir.get())) = 0; + DebugMsg(strLPanelDir.get(),L"strLPanelDir.get()"); + } + */ + if (FSF.LStricmp(LPanel.Dir, GetPosToName(cur->L.Dir))) + { + FarPanelDirectory dirInfo = {sizeof(FarPanelDirectory), GetPosToName(cur->L.Dir), NULL, {0}, NULL}; + bSetLDir = Info.PanelControl(LPanel.hPanel, FCTL_SETPANELDIRECTORY, 0, &dirInfo); + Info.PanelControl(LPanel.hPanel, FCTL_BEGINSELECTION, 0, 0); + } + + { + PanelInfo PInfo = {sizeof(PanelInfo)}; + Info.PanelControl(LPanel.hPanel, FCTL_GETPANELINFO, 0, &PInfo); + + for (unsigned i = 0; i < PInfo.ItemsNumber; i++) + { + size_t size = Info.PanelControl(LPanel.hPanel, FCTL_GETPANELITEM, i, 0); + PluginPanelItem* PPI = (PluginPanelItem*) malloc(size); + if (PPI) + { + FarGetPluginPanelItem FGPPI = {sizeof(FarGetPluginPanelItem), size, PPI}; + Info.PanelControl(LPanel.hPanel, FCTL_GETPANELITEM, i, &FGPPI); + if (!bSetLFile && cur->L.FileName && !FSF.LStricmp(cur->L.FileName, FGPPI.Item->FileName)) + { + LRInfo.CurrentItem = i; + bSetLFile = true; + } + // если изменили каталог, то отметим все отличия на новой напанели + if (bSetLDir) + { + for (int j = 0; j < pFileList->iCount; j++) + { + if (FSF.LStricmp(pFileList->F[j].L.Dir, cur->L.Dir)) + continue; + if (pFileList->F[j].L.FileName && !FSF.LStricmp(pFileList->F[j].L.FileName, FGPPI.Item->FileName)) + { + Info.PanelControl(LPanel.hPanel, FCTL_SETSELECTION, i, + (void*) ((pFileList->F[j].dwFlags & RCIF_DIFFER) || (pFileList->F[j].dwFlags & RCIF_LNEW) || + (pFileList->F[j].dwFlags & RCIF_RNEW))); + break; + } + } + } + free(PPI); + if (!bSetLDir && bSetLFile) + break; + } + } + if (bSetLDir) + Info.PanelControl(LPanel.hPanel, FCTL_ENDSELECTION, 0, 0); + } + + if (FSF.LStricmp(RPanel.Dir, GetPosToName(cur->R.Dir))) + { + FarPanelDirectory dirInfo = {sizeof(FarPanelDirectory), GetPosToName(cur->R.Dir), NULL, {0}, NULL}; + bSetRDir = Info.PanelControl(RPanel.hPanel, FCTL_SETPANELDIRECTORY, 0, &dirInfo); + Info.PanelControl(RPanel.hPanel, FCTL_BEGINSELECTION, 0, 0); + } + { + PanelInfo PInfo = {sizeof(PanelInfo)}; + Info.PanelControl(RPanel.hPanel, FCTL_GETPANELINFO, 0, &PInfo); + + for (unsigned i = 0; i < PInfo.ItemsNumber; i++) + { + size_t size = Info.PanelControl(RPanel.hPanel, FCTL_GETPANELITEM, i, 0); + PluginPanelItem* PPI = (PluginPanelItem*) malloc(size); + if (PPI) + { + FarGetPluginPanelItem FGPPI = {sizeof(FarGetPluginPanelItem), size, PPI}; + Info.PanelControl(RPanel.hPanel, FCTL_GETPANELITEM, i, &FGPPI); + if (!bSetRFile && cur->R.FileName && !FSF.LStricmp(cur->R.FileName, FGPPI.Item->FileName)) + { + RRInfo.CurrentItem = i; + bSetRFile = true; + } + if (bSetRDir) + { + for (int j = 0; j < pFileList->iCount; j++) + { + if (FSF.LStricmp(pFileList->F[j].R.Dir, cur->R.Dir)) + continue; + if (pFileList->F[j].R.FileName && !FSF.LStricmp(pFileList->F[j].R.FileName, FGPPI.Item->FileName)) + { + Info.PanelControl(RPanel.hPanel, FCTL_SETSELECTION, i, + (void*) ((pFileList->F[j].dwFlags & RCIF_DIFFER) || (pFileList->F[j].dwFlags & RCIF_LNEW) || + (pFileList->F[j].dwFlags & RCIF_RNEW))); + break; + } + } + } + free(PPI); + if (!bSetRDir && bSetRFile) + break; + } + } + if (bSetRDir) + Info.PanelControl(RPanel.hPanel, FCTL_ENDSELECTION, 0, 0); + } + Info.PanelControl(LPanel.hPanel, FCTL_REDRAWPANEL, 0, &LRInfo); + Info.PanelControl(RPanel.hPanel, FCTL_REDRAWPANEL, 0, &RRInfo); + Info.SendDlgMessage(hDlg, DM_CLOSE, 0, 0); + } + return true; + } + } + } + } + } + return Info.DefDlgProc(hDlg, Msg, Param1, Param2); } /*************************************************************************** * Диалог результатов сравнения файлов ***************************************************************************/ -int AdvCmpProc::ShowCmpDialog(const struct DirList *pLList,const struct DirList *pRList) +int AdvCmpProc::ShowCmpDialog(const struct DirList* pLList, const struct DirList* pRList) { - FarDialogItem DialogItems[1]; - memset(DialogItems,0,sizeof(DialogItems)); - - DialogItems[0].Type=DI_LISTBOX; - DialogItems[0].X1=0; DialogItems[0].X2=WinInfo.Con.Right; - DialogItems[0].Y1=0; DialogItems[0].Y2=WinInfo.Con.Bottom-WinInfo.Con.Top; - DialogItems[0].Flags=DIF_LISTNOCLOSE; - - int len=WinInfo.Con.Right/2-2; - - int size=Info.PanelControl(LPanel.hPanel,FCTL_GETPANELHOSTFILE,0,0); - string strTmp; - if (size>1) - { - strTmp.get(size); - Info.PanelControl(LPanel.hPanel,FCTL_GETPANELHOSTFILE,size,strTmp.get()); - strTmp.updsize(); - if (pLList->Dir[0]) strTmp+=L'/'; - strTmp+=pLList->Dir; - } - else - strTmp=GetPosToName(pLList->Dir); - FSF.TruncPathStr(strTmp.get(),len-2); - strTmp.updsize(); - string strTmp2=L" "; - strTmp2+=strTmp+L" "; - wchar_t buf1[MAX_PATH]; - strcentr(buf1,strTmp2.get(),len,0x00002550); - - size=Info.PanelControl(RPanel.hPanel,FCTL_GETPANELHOSTFILE,0,0); - if (size>1) - { - strTmp.get(size); - Info.PanelControl(RPanel.hPanel,FCTL_GETPANELHOSTFILE,size,strTmp.get()); - strTmp.updsize(); - if (pRList->Dir[0]) strTmp+=L'/'; - strTmp+=pRList->Dir; - } - else - strTmp=GetPosToName(pRList->Dir); - FSF.TruncPathStr(strTmp.get(),len-2); - strTmp.updsize(); - strTmp2=L" "; - strTmp2+=strTmp+L" "; - wchar_t buf2[MAX_PATH]; - strcentr(buf2,strTmp2.get(),len,0x00002550); - - wchar_t *buf=(wchar_t*)malloc(WinInfo.Con.Right*sizeof(wchar_t)); - if (buf) - { - FSF.sprintf(buf, L"%s %s",buf1,buf2); - DialogItems[0].Data=buf; - } - cFList.AdvCmp=this; - - HANDLE hDlg=Info.DialogInit(&MainGuid,&CmpDlgGuid,0,0,WinInfo.Con.Right,WinInfo.Con.Bottom-WinInfo.Con.Top,L"DlgCmp",DialogItems, - sizeof(DialogItems)/sizeof(DialogItems[0]),0,FDLG_SMALLDIALOG|FDLG_KEEPCONSOLETITLE,ShowCmpDialogProc,&cFList); - if (hDlg != INVALID_HANDLE_VALUE) - { - Info.DialogRun(hDlg); - Info.DialogFree(hDlg); - } - if (buf) free(buf); - - if (Opt.Mode==MODE_SYNC && (Opt.Sync==QR_ALL || Opt.Sync==QR_SKIP)) - Synchronize(); - - return 1; + FarDialogItem DialogItems[1]; + memset(DialogItems, 0, sizeof(DialogItems)); + + DialogItems[0].Type = DI_LISTBOX; + DialogItems[0].X1 = 0; + DialogItems[0].X2 = WinInfo.Con.Right; + DialogItems[0].Y1 = 0; + DialogItems[0].Y2 = WinInfo.Con.Bottom - WinInfo.Con.Top; + DialogItems[0].Flags = DIF_LISTNOCLOSE; + + int len = WinInfo.Con.Right / 2 - 2; + + int size = Info.PanelControl(LPanel.hPanel, FCTL_GETPANELHOSTFILE, 0, 0); + string strTmp; + if (size > 1) + { + strTmp.get(size); + Info.PanelControl(LPanel.hPanel, FCTL_GETPANELHOSTFILE, size, strTmp.get()); + strTmp.updsize(); + if (pLList->Dir[0]) + strTmp += L'/'; + strTmp += pLList->Dir; + } + else + strTmp = GetPosToName(pLList->Dir); + FSF.TruncPathStr(strTmp.get(), len - 2); + strTmp.updsize(); + string strTmp2 = L" "; + strTmp2 += strTmp + L" "; + wchar_t buf1[MAX_PATH]; + strcentr(buf1, strTmp2.get(), len, 0x00002550); + + size = Info.PanelControl(RPanel.hPanel, FCTL_GETPANELHOSTFILE, 0, 0); + if (size > 1) + { + strTmp.get(size); + Info.PanelControl(RPanel.hPanel, FCTL_GETPANELHOSTFILE, size, strTmp.get()); + strTmp.updsize(); + if (pRList->Dir[0]) + strTmp += L'/'; + strTmp += pRList->Dir; + } + else + strTmp = GetPosToName(pRList->Dir); + FSF.TruncPathStr(strTmp.get(), len - 2); + strTmp.updsize(); + strTmp2 = L" "; + strTmp2 += strTmp + L" "; + wchar_t buf2[MAX_PATH]; + strcentr(buf2, strTmp2.get(), len, 0x00002550); + + wchar_t* buf = (wchar_t*) malloc(WinInfo.Con.Right * sizeof(wchar_t)); + if (buf) + { + FSF.sprintf(buf, L"%s %s", buf1, buf2); + DialogItems[0].Data = buf; + } + cFList.AdvCmp = this; + + HANDLE hDlg = + Info.DialogInit(&MainGuid, &CmpDlgGuid, 0, 0, WinInfo.Con.Right, WinInfo.Con.Bottom - WinInfo.Con.Top, L"DlgCmp", DialogItems, + sizeof(DialogItems) / sizeof(DialogItems[0]), 0, FDLG_SMALLDIALOG | FDLG_KEEPCONSOLETITLE, ShowCmpDialogProc, &cFList); + if (hDlg != INVALID_HANDLE_VALUE) + { + Info.DialogRun(hDlg); + Info.DialogFree(hDlg); + } + if (buf) + free(buf); + + if (Opt.Mode == MODE_SYNC && (Opt.Sync == QR_ALL || Opt.Sync == QR_SKIP)) + Synchronize(); + + return 1; } diff --git a/src/AdvCmpProc_DUP.cpp b/src/AdvCmpProc_DUP.cpp index 916d8ec..fc0e78b 100644 --- a/src/AdvCmpProc_DUP.cpp +++ b/src/AdvCmpProc_DUP.cpp @@ -29,1901 +29,1920 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - /*************************************************************************** * * ДУБЛИКАТЫ * ***************************************************************************/ - /**************************************************************************** * Построение массива элементов, для диалога дубликатов ****************************************************************************/ -bool AdvCmpProc::MakeFileList(const wchar_t *Dir,const PluginPanelItem *pPPI) +bool AdvCmpProc::MakeFileList(const wchar_t* Dir, const PluginPanelItem* pPPI) { - for (int i=0; iFileName)) - return true; - } - - dupFile *New=(dupFile*)realloc(dFList.F,(dFList.iCount+1)*sizeof(dupFile)); - if (!New) - { - ErrorMsg(MNoMemTitle, MNoMemBody); - return false; - } - dFList.F=New; - - dFList.F[dFList.iCount].fi.FileName=(wchar_t*)malloc((wcslen(pPPI->FileName)+1)*sizeof(wchar_t)); - if (dFList.F[dFList.iCount].fi.FileName) wcscpy(dFList.F[dFList.iCount].fi.FileName,pPPI->FileName); - dFList.F[dFList.iCount].fi.Dir=(wchar_t*)malloc((wcslen(Dir)+1)*sizeof(wchar_t)); - if (dFList.F[dFList.iCount].fi.Dir) wcscpy(dFList.F[dFList.iCount].fi.Dir,Dir); - dFList.F[dFList.iCount].fi.ftLastWriteTime.dwLowDateTime=pPPI->LastWriteTime.dwLowDateTime; - dFList.F[dFList.iCount].fi.ftLastWriteTime.dwHighDateTime=pPPI->LastWriteTime.dwHighDateTime; - dFList.F[dFList.iCount].fi.nFileSize=pPPI->FileSize; - dFList.F[dFList.iCount].fi.dwAttributes=pPPI->FileAttributes; - - dFList.iCount++; - return true; + for (int i = 0; i < dFList.iCount; i++) + { + if (!FSF.LStricmp(dFList.F[i].fi.Dir, Dir)) + if (!FSF.LStricmp(dFList.F[i].fi.FileName, pPPI->FileName)) + return true; + } + + dupFile* New = (dupFile*) realloc(dFList.F, (dFList.iCount + 1) * sizeof(dupFile)); + if (!New) + { + ErrorMsg(MNoMemTitle, MNoMemBody); + return false; + } + dFList.F = New; + + dFList.F[dFList.iCount].fi.FileName = (wchar_t*) malloc((wcslen(pPPI->FileName) + 1) * sizeof(wchar_t)); + if (dFList.F[dFList.iCount].fi.FileName) + wcscpy(dFList.F[dFList.iCount].fi.FileName, pPPI->FileName); + dFList.F[dFList.iCount].fi.Dir = (wchar_t*) malloc((wcslen(Dir) + 1) * sizeof(wchar_t)); + if (dFList.F[dFList.iCount].fi.Dir) + wcscpy(dFList.F[dFList.iCount].fi.Dir, Dir); + dFList.F[dFList.iCount].fi.ftLastWriteTime.dwLowDateTime = pPPI->LastWriteTime.dwLowDateTime; + dFList.F[dFList.iCount].fi.ftLastWriteTime.dwHighDateTime = pPPI->LastWriteTime.dwHighDateTime; + dFList.F[dFList.iCount].fi.nFileSize = pPPI->FileSize; + dFList.F[dFList.iCount].fi.dwAttributes = pPPI->FileAttributes; + + dFList.iCount++; + return true; } /*************************************************************************** * Узнаем опции синхронизации ***************************************************************************/ -int GetDupOpt(dupFileList *pFileList) +int GetDupOpt(dupFileList* pFileList) { - int ret=QR_EDIT; // продолжаем редактировать список - int ItemsDel=0; - - for (int i=0; iiCount; i++) - { - dupFile *cur=&pFileList->F[i]; - - if (cur->dwFlags&RCIF_USERDEL) - ItemsDel++; - } -/* - // нет элементов, выходим - if (!ItemsDel) - { - if (Opt.ShowMsg) - { - const wchar_t *MsgItems[] = { GetMsg(MDupTitle), GetMsg(MNoDupBody), GetMsg(MOK) }; - Info.Message(&MainGuid,&NoDupMsgGuid,0,0,MsgItems,sizeof(MsgItems) / sizeof(MsgItems[0]),1); - } - return ret=QR_SKIP; //нет элементов - } -*/ - Opt.DupDel=ItemsDel; - Opt.DupDelRecycleBin=(Opt.DupDel && GetFarSetting(FSSF_SYSTEM,L"DeleteToRecycleBin")); - - wchar_t buf[80]; - FSF.sprintf(buf,GetMsg(MDupDel),ItemsDel); - - struct FarDialogItem DialogItems[] = { - // Type X1 Y1 X2 Y2 Selected History Mask Flags Data MaxLen UserParam - /* 0*/{DI_DOUBLEBOX, 3, 1,60, 6, 0, 0, 0, 0, GetMsg(MDupTitle),0,0}, - /* 1*/{DI_CHECKBOX, 5, 2, 0, 0, Opt.DupDel, 0, 0,Opt.DupDel?DIF_FOCUS:DIF_DISABLE,buf,0,0}, - /* 2*/{DI_CHECKBOX, 8, 3, 0, 0, Opt.DupDelRecycleBin, 0, 0, Opt.DupDel?0:DIF_DISABLE,GetMsg(MDupDelRecycleBin),0,0}, - /* 3*/{DI_TEXT, -1, 4, 0, 0, 0, 0, 0, DIF_SEPARATOR, L"",0,0}, - /* 4*/{DI_BUTTON, 0, 5, 0, 0, 0, 0, 0, DIF_DEFAULTBUTTON|DIF_CENTERGROUP, GetMsg(MOK),0,0}, - /* 5*/{DI_BUTTON, 0, 5, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MDupEdit),0,0}, - /* 6*/{DI_BUTTON, 0, 5, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MCancel),0,0} - }; - - HANDLE hDlg=Info.DialogInit(&MainGuid, &OptSyncDlgGuid,-1,-1,64,8,L"DlgDup",DialogItems,sizeof(DialogItems)/sizeof(DialogItems[0]),0,0,0,0); - - if (hDlg != INVALID_HANDLE_VALUE) - { - ret=(int)Info.DialogRun(hDlg); - if (ret==4) - { - Opt.DupDel=Info.SendDlgMessage(hDlg,DM_GETCHECK,1,0); - Opt.DupDelRecycleBin=Info.SendDlgMessage(hDlg,DM_GETCHECK,2,0); - ret=Opt.DupDel?QR_ALL:QR_SKIP; // удаляем дубли, иначе - пропустим - } - else if (ret==5) - ret=QR_EDIT; - else - { - bBrokenByEsc=true; - ret=QR_ABORT; // отменили - } - Info.DialogFree(hDlg); - } - else - ret=QR_ABORT; - - return ret; + int ret = QR_EDIT; // продолжаем редактировать список + int ItemsDel = 0; + + for (int i = 0; i < pFileList->iCount; i++) + { + dupFile* cur = &pFileList->F[i]; + + if (cur->dwFlags & RCIF_USERDEL) + ItemsDel++; + } + /* + // нет элементов, выходим + if (!ItemsDel) + { + if (Opt.ShowMsg) + { + const wchar_t *MsgItems[] = { GetMsg(MDupTitle), GetMsg(MNoDupBody), GetMsg(MOK) }; + Info.Message(&MainGuid,&NoDupMsgGuid,0,0,MsgItems,sizeof(MsgItems) / sizeof(MsgItems[0]),1); + } + return ret=QR_SKIP; //нет элементов + } + */ + Opt.DupDel = ItemsDel; + Opt.DupDelRecycleBin = (Opt.DupDel && GetFarSetting(FSSF_SYSTEM, L"DeleteToRecycleBin")); + + wchar_t buf[80]; + FSF.sprintf(buf, GetMsg(MDupDel), ItemsDel); + + struct FarDialogItem DialogItems[] = { + // Type X1 Y1 X2 Y2 Selected History Mask Flags Data MaxLen UserParam + /* 0*/ {DI_DOUBLEBOX, 3, 1, 60, 6, 0, 0, 0, 0, GetMsg(MDupTitle), 0, 0}, + /* 1*/ {DI_CHECKBOX, 5, 2, 0, 0, Opt.DupDel, 0, 0, Opt.DupDel ? DIF_FOCUS : DIF_DISABLE, buf, 0, 0}, + /* 2*/ {DI_CHECKBOX, 8, 3, 0, 0, Opt.DupDelRecycleBin, 0, 0, Opt.DupDel ? 0 : DIF_DISABLE, GetMsg(MDupDelRecycleBin), 0, 0}, + /* 3*/ {DI_TEXT, -1, 4, 0, 0, 0, 0, 0, DIF_SEPARATOR, L"", 0, 0}, + /* 4*/ {DI_BUTTON, 0, 5, 0, 0, 0, 0, 0, DIF_DEFAULTBUTTON | DIF_CENTERGROUP, GetMsg(MOK), 0, 0}, + /* 5*/ {DI_BUTTON, 0, 5, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MDupEdit), 0, 0}, + /* 6*/ {DI_BUTTON, 0, 5, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MCancel), 0, 0}}; + + HANDLE hDlg = + Info.DialogInit(&MainGuid, &OptSyncDlgGuid, -1, -1, 64, 8, L"DlgDup", DialogItems, sizeof(DialogItems) / sizeof(DialogItems[0]), 0, 0, 0, 0); + + if (hDlg != INVALID_HANDLE_VALUE) + { + ret = (int) Info.DialogRun(hDlg); + if (ret == 4) + { + Opt.DupDel = Info.SendDlgMessage(hDlg, DM_GETCHECK, 1, 0); + Opt.DupDelRecycleBin = Info.SendDlgMessage(hDlg, DM_GETCHECK, 2, 0); + ret = Opt.DupDel ? QR_ALL : QR_SKIP; // удаляем дубли, иначе - пропустим + } + else if (ret == 5) + ret = QR_EDIT; + else + { + bBrokenByEsc = true; + ret = QR_ABORT; // отменили + } + Info.DialogFree(hDlg); + } + else + ret = QR_ABORT; + + return ret; } - -int WINAPI dupSortListByName(const void *el1, const void *el2, void *el3) +int WINAPI dupSortListByName(const void* el1, const void* el2, void* el3) { - struct dupFile *Item1=(struct dupFile *)el1, *Item2=(struct dupFile *)el2; - return FSF.LStricmp(Item1->fi.FileName,Item2->fi.FileName); + struct dupFile *Item1 = (struct dupFile*) el1, *Item2 = (struct dupFile*) el2; + return FSF.LStricmp(Item1->fi.FileName, Item2->fi.FileName); } -int WINAPI dupSortListByGroup(const void *el1, const void *el2, void *el3) +int WINAPI dupSortListByGroup(const void* el1, const void* el2, void* el3) { - struct dupFile *Item1=(struct dupFile *)el1, *Item2=(struct dupFile *)el2; - return Item2->nDupGroup-Item1->nDupGroup; + struct dupFile *Item1 = (struct dupFile*) el1, *Item2 = (struct dupFile*) el2; + return Item2->nDupGroup - Item1->nDupGroup; } -int WINAPI dupSortListByGroupEx(const void *el1, const void *el2, void *el3) +int WINAPI dupSortListByGroupEx(const void* el1, const void* el2, void* el3) { - struct dupFile *Item1=(struct dupFile *)el1, *Item2=(struct dupFile *)el2; - int cmp=Item1->nDupGroup-Item2->nDupGroup; - if (!cmp) - cmp=FSF.LStricmp(Item1->fi.FileName,Item2->fi.FileName); - if (!cmp) - cmp=FSF.LStricmp(Item1->fi.Dir,Item2->fi.Dir); - return cmp; + struct dupFile *Item1 = (struct dupFile*) el1, *Item2 = (struct dupFile*) el2; + int cmp = Item1->nDupGroup - Item2->nDupGroup; + if (!cmp) + cmp = FSF.LStricmp(Item1->fi.FileName, Item2->fi.FileName); + if (!cmp) + cmp = FSF.LStricmp(Item1->fi.Dir, Item2->fi.Dir); + return cmp; } /*************************************************************************** * Изменение строки статуса в листе -***************************************************************************/ + ***************************************************************************/ -void SetBottom(HANDLE hDlg, dupFileList *pFileList, dupFile *curItem) +void SetBottom(HANDLE hDlg, dupFileList* pFileList, dupFile* curItem) { - if (curItem) - { - static wchar_t Title[MAX_PATH]; - static wchar_t Bottom[MAX_PATH]; - FarListTitles ListTitle={sizeof(FarListTitles)}; - ListTitle.Title=Title; - ListTitle.TitleSize=MAX_PATH; - ListTitle.Bottom=Bottom; - ListTitle.BottomSize=MAX_PATH; - Info.SendDlgMessage(hDlg,DM_LISTGETTITLES,0,&ListTitle); - - string strDir(GetPosToName(curItem->fi.Dir)); - FSF.TruncPathStr(strDir.get(),WinInfo.TruncLen); - strDir.updsize(); - wcscpy(Title,strDir.get()); - - wchar_t Time[20]; - wchar_t Size[65]; - GetStrFileTime(&curItem->fi.ftLastWriteTime,Time,false); - itoaa(curItem->fi.nFileSize,Size); - FSF.sprintf(Bottom,GetMsg(MDupListBottom),14,14,Size,Time,pFileList->GroupItems,pFileList->iCount,pFileList->Del); - - Info.SendDlgMessage(hDlg,DM_LISTSETTITLES,0,&ListTitle); - } + if (curItem) + { + static wchar_t Title[MAX_PATH]; + static wchar_t Bottom[MAX_PATH]; + FarListTitles ListTitle = {sizeof(FarListTitles)}; + ListTitle.Title = Title; + ListTitle.TitleSize = MAX_PATH; + ListTitle.Bottom = Bottom; + ListTitle.BottomSize = MAX_PATH; + Info.SendDlgMessage(hDlg, DM_LISTGETTITLES, 0, &ListTitle); + + string strDir(GetPosToName(curItem->fi.Dir)); + FSF.TruncPathStr(strDir.get(), WinInfo.TruncLen); + strDir.updsize(); + wcscpy(Title, strDir.get()); + + wchar_t Time[20]; + wchar_t Size[65]; + GetStrFileTime(&curItem->fi.ftLastWriteTime, Time, false); + itoaa(curItem->fi.nFileSize, Size); + FSF.sprintf(Bottom, GetMsg(MDupListBottom), 14, 14, Size, Time, pFileList->GroupItems, pFileList->iCount, pFileList->Del); + + Info.SendDlgMessage(hDlg, DM_LISTSETTITLES, 0, &ListTitle); + } } /*************************************************************************** * Изменение/обновление листа файлов в диалоге ***************************************************************************/ -bool MakeDupFarList(HANDLE hDlg, dupFileList *pFileList, bool bSetCurPos, bool bSort) +bool MakeDupFarList(HANDLE hDlg, dupFileList* pFileList, bool bSetCurPos, bool bSort) { - // запросим информацию - FarListInfo ListInfo={sizeof(FarListInfo)}; - Info.SendDlgMessage(hDlg,DM_LISTINFO,0,&ListInfo); - - if (ListInfo.ItemsNumber) - Info.SendDlgMessage(hDlg,DM_LISTDELETE,0,0); - - if (!pFileList->iCount) - return true; - - // сортируем только при инициализации - if (bSort) - FSF.qsort(pFileList->F,pFileList->iCount,sizeof(pFileList->F[0]),dupSortListByGroupEx, NULL); - - int Index=0; - string strBuf; - strBuf.get(32768); - wchar_t Size[10], Time[20], w[64], h[64]; - wchar_t MetaData[160]; - - int digits_count=1, m=10; - while (m <= pFileList->GroupItems) - { - m *= 10; - digits_count++; - } - - for (int i=0; iiCount; i++) - { - dupFile *cur=&pFileList->F[i]; - - FSF.FormatFileSize(cur->fi.nFileSize,7,FFFS_FLOATSIZE|FFFS_SHOWBYTESINDEX|FFFS_ECONOMIC,Size,8); - - if (Opt.DupListSmall) - { - FSF.sprintf(strBuf.get(), L"%*d%c%-7.7s%c%s",digits_count,cur->nDupGroup,0x2502,Size,0x2551,cur->fi.FileName); - } - else - { - string strPath(GetPosToName(cur->fi.Dir)); -/* - string strSubstr; - wchar_t *p=LPanel.PInfo.Flags&PFLAGS_FOCUS?LPanel.Dir:RPanel.Dir; - while (*p) // для экранирования спецсимволов в регэкспах - { - if (*p==L'\\' || *p==L'[' || *p==L']' || *p==L'+' || *p==L'{' || *p==L'}') - strSubstr+=L"\\"; - strSubstr+=*p++; - } - // вырежем все из имени файла до текущей папки (и сама папка) нам не нужна - CutSubstr(strPath,strSubstr.get()); - strPath+=L"\\"; -*/ - if ((cur->dwFlags&RCIF_PIC) || (cur->dwFlags&RCIF_PICERR && cur->PicWidth && cur->PicHeight)) - { - FSF.itoa(cur->PicWidth,w,10); - FSF.itoa(cur->PicHeight,h,10); - FSF.TruncPathStr(strPath.get(),88); - strPath.updsize(); - FSF.sprintf(MetaData,L"%-88.88s%c%5.5s x %-5.5s",strPath.get(),0x2551,w,h); - } - else if (cur->dwFlags&RCIF_MUSIC) - { - FSF.TruncPathStr(strPath.get(),30); - strPath.updsize(); - FSF.sprintf(MetaData,L"%-30.30s%c%-30.30s %-30.30s %02u:%02u %03u",strPath.get(),0x2551,(cur->dwFlags&RCIF_MUSICART)?cur->MusicArtist:L"",(cur->dwFlags&RCIF_MUSICTIT)?cur->MusicTitle:L"",cur->MusicTime/60,cur->MusicTime%60,cur->MusicBitrate); - } - else - { - GetStrFileTime(&cur->fi.ftLastWriteTime,Time,true); - FSF.TruncPathStr(strPath.get(),82); - strPath.updsize(); - FSF.sprintf(MetaData,L"%-82.82s%c%-19.19s",strPath.get(),0x2551,Time); - } - FSF.sprintf(strBuf.get(), L"%*d%c%-102.102s%c%-7.7s%c%s",digits_count,cur->nDupGroup,0x2502,MetaData,0x2551,Size,0x2551,cur->fi.FileName); - } - strBuf.updsize(); - - struct FarListItem Item={}; - if (cur->dwFlags&RCIF_USERDEL) - { - Item.Flags|=(LIF_CHECKED|LIF_GRAYED); - pFileList->Del++; - } - Item.Text=strBuf.get(); - struct FarList List={sizeof(FarList)}; - List.ItemsNumber=1; - List.Items=&Item; - - // если удачно добавили элемент... - if (Info.SendDlgMessage(hDlg,DM_LISTADD,0,&List)) - { - // ... то ассоциируем данные с элементом листа - struct FarListItemData Data={sizeof(FarListItemData)}; - Data.Index=Index++; - Data.DataSize=sizeof(cur); - Data.Data=&cur; - Info.SendDlgMessage(hDlg,DM_LISTSETDATA,0,&Data); - } - - // сепаратор - int j=i+1; - if (jiCount && cur->nDupGroup!=pFileList->F[j].nDupGroup) - { - Item.Flags=LIF_SEPARATOR; - Item.Text=NULL; - List.Items=&Item; - Info.SendDlgMessage(hDlg,DM_LISTADD,0,&List); - Index++; - } - } - - SetBottom(hDlg,pFileList,pFileList->iCount?&pFileList->F[0]:NULL); - - if (bSetCurPos) - { - FarListPos ListPos={sizeof(FarListPos)}; - ListPos.SelectPos=ListInfo.SelectPos; - ListPos.TopPos=ListInfo.TopPos; - Info.SendDlgMessage(hDlg,DM_LISTSETCURPOS,0,&ListPos); - } - return true; + // запросим информацию + FarListInfo ListInfo = {sizeof(FarListInfo)}; + Info.SendDlgMessage(hDlg, DM_LISTINFO, 0, &ListInfo); + + if (ListInfo.ItemsNumber) + Info.SendDlgMessage(hDlg, DM_LISTDELETE, 0, 0); + + if (!pFileList->iCount) + return true; + + // сортируем только при инициализации + if (bSort) + FSF.qsort(pFileList->F, pFileList->iCount, sizeof(pFileList->F[0]), dupSortListByGroupEx, NULL); + + int Index = 0; + string strBuf; + strBuf.get(32768); + wchar_t Size[10], Time[20], w[64], h[64]; + wchar_t MetaData[160]; + + int digits_count = 1, m = 10; + while (m <= pFileList->GroupItems) + { + m *= 10; + digits_count++; + } + + for (int i = 0; i < pFileList->iCount; i++) + { + dupFile* cur = &pFileList->F[i]; + + FSF.FormatFileSize(cur->fi.nFileSize, 7, FFFS_FLOATSIZE | FFFS_SHOWBYTESINDEX | FFFS_ECONOMIC, Size, 8); + + if (Opt.DupListSmall) + { + FSF.sprintf(strBuf.get(), L"%*d%c%-7.7s%c%s", digits_count, cur->nDupGroup, 0x2502, Size, 0x2551, cur->fi.FileName); + } + else + { + string strPath(GetPosToName(cur->fi.Dir)); + /* + string strSubstr; + wchar_t *p=LPanel.PInfo.Flags&PFLAGS_FOCUS?LPanel.Dir:RPanel.Dir; + while (*p) // для экранирования спецсимволов в регэкспах + { + if (*p==L'\\' || *p==L'[' || *p==L']' || *p==L'+' || *p==L'{' || *p==L'}') + strSubstr+=L"\\"; + strSubstr+=*p++; + } + // вырежем все из имени файла до текущей папки (и сама папка) нам не нужна + CutSubstr(strPath,strSubstr.get()); + strPath+=L"\\"; + */ + if ((cur->dwFlags & RCIF_PIC) || (cur->dwFlags & RCIF_PICERR && cur->PicWidth && cur->PicHeight)) + { + FSF.itoa(cur->PicWidth, w, 10); + FSF.itoa(cur->PicHeight, h, 10); + FSF.TruncPathStr(strPath.get(), 88); + strPath.updsize(); + FSF.sprintf(MetaData, L"%-88.88s%c%5.5s x %-5.5s", strPath.get(), 0x2551, w, h); + } + else if (cur->dwFlags & RCIF_MUSIC) + { + FSF.TruncPathStr(strPath.get(), 30); + strPath.updsize(); + FSF.sprintf(MetaData, L"%-30.30s%c%-30.30s %-30.30s %02u:%02u %03u", strPath.get(), 0x2551, + (cur->dwFlags & RCIF_MUSICART) ? cur->MusicArtist : L"", (cur->dwFlags & RCIF_MUSICTIT) ? cur->MusicTitle : L"", + cur->MusicTime / 60, cur->MusicTime % 60, cur->MusicBitrate); + } + else + { + GetStrFileTime(&cur->fi.ftLastWriteTime, Time, true); + FSF.TruncPathStr(strPath.get(), 82); + strPath.updsize(); + FSF.sprintf(MetaData, L"%-82.82s%c%-19.19s", strPath.get(), 0x2551, Time); + } + FSF.sprintf(strBuf.get(), L"%*d%c%-102.102s%c%-7.7s%c%s", digits_count, cur->nDupGroup, 0x2502, MetaData, 0x2551, Size, 0x2551, + cur->fi.FileName); + } + strBuf.updsize(); + + struct FarListItem Item = {}; + if (cur->dwFlags & RCIF_USERDEL) + { + Item.Flags |= (LIF_CHECKED | LIF_GRAYED); + pFileList->Del++; + } + Item.Text = strBuf.get(); + struct FarList List = {sizeof(FarList)}; + List.ItemsNumber = 1; + List.Items = &Item; + + // если удачно добавили элемент... + if (Info.SendDlgMessage(hDlg, DM_LISTADD, 0, &List)) + { + // ... то ассоциируем данные с элементом листа + struct FarListItemData Data = {sizeof(FarListItemData)}; + Data.Index = Index++; + Data.DataSize = sizeof(cur); + Data.Data = &cur; + Info.SendDlgMessage(hDlg, DM_LISTSETDATA, 0, &Data); + } + + // сепаратор + int j = i + 1; + if (j < pFileList->iCount && cur->nDupGroup != pFileList->F[j].nDupGroup) + { + Item.Flags = LIF_SEPARATOR; + Item.Text = NULL; + List.Items = &Item; + Info.SendDlgMessage(hDlg, DM_LISTADD, 0, &List); + Index++; + } + } + + SetBottom(hDlg, pFileList, pFileList->iCount ? &pFileList->F[0] : NULL); + + if (bSetCurPos) + { + FarListPos ListPos = {sizeof(FarListPos)}; + ListPos.SelectPos = ListInfo.SelectPos; + ListPos.TopPos = ListInfo.TopPos; + Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); + } + return true; } - /*************************************************************************** * Обработчик диалога ***************************************************************************/ -intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void *Param2) +intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void* Param2) { - dupFileList *pFileList=(dupFileList *)Info.SendDlgMessage(hDlg,DM_GETDLGDATA,0,0); - switch(Msg) - { - case DN_INITDIALOG: - MakeDupFarList(hDlg,pFileList,true,true); - Info.SendDlgMessage(hDlg, DM_SETMOUSEEVENTNOTIFY, 1, 0); - break; - - /************************************************************************/ - - case DN_RESIZECONSOLE: - { - COORD c=(*(COORD*)Param2); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,false,0); - Info.SendDlgMessage(hDlg,DM_RESIZEDIALOG,0,&c); - WinInfo.Con.Right=c.X-1; - WinInfo.Con.Bottom=c.Y-1; - WinInfo.TruncLen=WinInfo.Con.Right-WinInfo.Con.Left-20+1; - if (WinInfo.TruncLen>MAX_PATH-2) WinInfo.TruncLen=MAX_PATH-2; - Info.SendDlgMessage(hDlg,DM_SETITEMPOSITION,0,&WinInfo.Con); - int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); - dupFile **tmp=(dupFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); - dupFile *cur=tmp?*tmp:NULL; - if (cur) SetBottom(hDlg,pFileList,cur); - c.X=c.Y=-1; - Info.SendDlgMessage(hDlg,DM_MOVEDIALOG,true,&c); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,true,0); - return true; - } - - /************************************************************************/ - - case DN_CTLCOLORDLGLIST: - if (Param1==0) - { - struct FarDialogItemColors *Colors=(FarDialogItemColors*)Param2; - FarColor Color; - int ColorIndex[15]= - { - COL_PANELTEXT, - COL_PANELBOX, - COL_PANELBOX, // заголовки - COL_PANELTEXT, // элемент списка - COL_PANELSELECTEDTEXT, - COL_PANELBOX, - COL_PANELCURSOR, // под курсором - COL_PANELSELECTEDCURSOR, - COL_PANELSCROLLBAR, - COL_PANELHIGHLIGHTTEXT, // виртуальная папка - COL_PANELSELECTEDTEXT, - COL_PANELSELECTEDCURSOR, - COL_PANELSELECTEDTEXT, - COL_PANELHIGHLIGHTTEXT, // одинаковые элементы - COL_PANELCURSOR - }; - for (int i=0; i<15; i++) - { - Info.AdvControl(&MainGuid,ACTL_GETCOLOR,ColorIndex[i],&Color); - Colors->Colors[i] = Color; - } - return true; - } - break; - - /************************************************************************/ - - case DN_LISTCHANGE: - if (Param1==0) - { - dupFile **tmp=(dupFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Param2); - dupFile *cur=tmp?*tmp:NULL; - if (cur) - { - SetBottom(hDlg,pFileList,cur); - return true; - } - } - break; - - /************************************************************************/ - - case DN_CLOSE: - if (Opt.Mode==MODE_DUP && Param1==-1) - { - Opt.Dup=GetDupOpt(pFileList); - if (Opt.Dup==QR_EDIT) - return false; - else - return true; - } - break; - - /************************************************************************/ - - case DN_INPUT: - { - const INPUT_RECORD* record=(const INPUT_RECORD *)Param2; - - if (record->EventType==MOUSE_EVENT) - if (Param1==0 && record->Event.MouseEvent.dwButtonState==RIGHTMOST_BUTTON_PRESSED) - { - SMALL_RECT dlgRect; - Info.SendDlgMessage(hDlg, DM_GETDLGRECT, 0, &dlgRect); - // щелкнули в LISTе - if (record->Event.MouseEvent.dwMousePosition.X>dlgRect.Left && record->Event.MouseEvent.dwMousePosition.XEvent.MouseEvent.dwMousePosition.Y>dlgRect.Top && record->Event.MouseEvent.dwMousePosition.YEvent.MouseEvent.dwMousePosition.Y-1-dlgRect.Top); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,false,0); - int NewPos=Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); - if (NewPos!=ListPos.SelectPos) - { - ListPos.SelectPos=OldPos; - Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); - MessageBeep(MB_OK); - } - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,true,0); - if (NewPos==ListPos.SelectPos) - { - dupFile **tmp=(dupFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)ListPos.SelectPos); - dupFile *cur=(tmp && *tmp)?*tmp:NULL; - if (cur) - { - struct FarListGetItem FLGI={sizeof(FarListGetItem)}; - FLGI.ItemIndex=ListPos.SelectPos; - if (Info.SendDlgMessage(hDlg,DM_LISTGETITEM,0,&FLGI)) - { - (FLGI.Item.Flags&(LIF_CHECKED|LIF_GRAYED))?(FLGI.Item.Flags&= ~(LIF_CHECKED|LIF_GRAYED)):(FLGI.Item.Flags|=(LIF_CHECKED|LIF_GRAYED)); - struct FarListUpdate FLU={sizeof(FarListUpdate)}; - FLU.Index=FLGI.ItemIndex; - FLU.Item=FLGI.Item; - if (Info.SendDlgMessage(hDlg,DM_LISTUPDATE,0,&FLU)) - { - if (cur->dwFlags&RCIF_USERDEL) - { - cur->dwFlags&=~RCIF_USERDEL; - pFileList->Del--; - } - else - { - cur->dwFlags|=RCIF_USERDEL; - pFileList->Del++; - } - SetBottom(hDlg,pFileList,cur); - return false; - } - } - } - } - } - } - } - break; - - /************************************************************************/ - - case DN_CONTROLINPUT: - { - const INPUT_RECORD* record=(const INPUT_RECORD *)Param2; - - if (record->EventType==KEY_EVENT && record->Event.KeyEvent.bKeyDown) - { - WORD vk=record->Event.KeyEvent.wVirtualKeyCode; - - if (IsNone(record)) - { - if (vk==VK_F3) - { - int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); - dupFile **tmp=(dupFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); - dupFile *cur=tmp?*tmp:NULL; - if (cur) - { - string strFullFileName; - GetFullFileName(strFullFileName,cur->fi.Dir,cur->fi.FileName); - if (Info.Viewer(GetPosToName(strFullFileName.get()),NULL,0,0,-1,-1,VF_DISABLEHISTORY,CP_DEFAULT)) - { - SetBottom(hDlg,pFileList,cur); // обходим баг фара: почему-то строка функциональных клавиш не прячется автоматом! - return true; - } - } - else - MessageBeep(MB_OK); - return true; - } - else if (vk==VK_INSERT) - { - struct FarListPos FLP={sizeof(FarListPos)}; - Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,&FLP); - dupFile **tmp=(dupFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)FLP.SelectPos); - dupFile *cur=tmp?*tmp:NULL; - if (cur) - { - struct FarListGetItem FLGI={sizeof(FarListGetItem)}; - FLGI.ItemIndex=FLP.SelectPos; - if (Info.SendDlgMessage(hDlg,DM_LISTGETITEM,0,&FLGI)) - { - (FLGI.Item.Flags&(LIF_CHECKED|LIF_GRAYED))?(FLGI.Item.Flags&= ~(LIF_CHECKED|LIF_GRAYED)):(FLGI.Item.Flags|=(LIF_CHECKED|LIF_GRAYED)); - struct FarListUpdate FLU={sizeof(FarListUpdate)}; - FLU.Index=FLGI.ItemIndex; - FLU.Item=FLGI.Item; - if (Info.SendDlgMessage(hDlg,DM_LISTUPDATE,0,&FLU)) - { - if (cur->dwFlags&RCIF_USERDEL) - { - cur->dwFlags&=~RCIF_USERDEL; - pFileList->Del--; - } - else - { - cur->dwFlags|=RCIF_USERDEL; - pFileList->Del++; - } - FLP.SelectPos++; - if ((FLP.SelectPos-1)==Info.SendDlgMessage(hDlg,DM_LISTSETCURPOS,0,&FLP)) - SetBottom(hDlg,pFileList,cur); - - return true; - } - } - } - MessageBeep(MB_OK); - return true; - } -/* - else if (vk==VK_SPACE) - { -GOTOCHANGEMARK: - int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); - cmpFile **tmp=(cmpFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); - cmpFile *cur=(tmp && *tmp)?*tmp:NULL; - if (cur && !(cur->dwFlags&RCIF_EQUAL) && Opt.Mode==MODE_SYNC) - { - struct FarListGetItem FLGI; - FLGI.StructSize=sizeof(FarListGetItem); - FLGI.ItemIndex=Pos; - if (Info.SendDlgMessage(hDlg,DM_LISTGETITEM,0,&FLGI)) - { - __int64 Delta=0; - if (!(cur->dwFlags&RCIF_LUNIQ) && !(cur->dwFlags&RCIF_RUNIQ)) - Delta=(((__int64)cur->ftLLastWriteTime.dwHighDateTime << 32) | cur->ftLLastWriteTime.dwLowDateTime) - - (((__int64)cur->ftRLastWriteTime.dwHighDateTime << 32) | cur->ftRLastWriteTime.dwLowDateTime); - - if (cur->dwFlags&RCIF_DIFFER) - { - if (!(cur->dwFlags&RCIF_USERLNEW) && !(cur->dwFlags&RCIF_USERRNEW)) - { - if (Delta>=0 || Opt.SyncOnlyRight) cur->dwFlags|=RCIF_USERLNEW; - else if (!Opt.SyncOnlyRight) cur->dwFlags|=RCIF_USERRNEW; - } - else if ((Delta>=0 || Opt.SyncOnlyRight) && (cur->dwFlags&RCIF_USERLNEW)) - { - cur->dwFlags&=~RCIF_USERLNEW; - if (!Opt.SyncOnlyRight) cur->dwFlags|=RCIF_USERRNEW; - } - else if (Delta<0 && (cur->dwFlags&RCIF_USERRNEW)) - { - cur->dwFlags|=RCIF_USERLNEW; - cur->dwFlags&=~RCIF_USERRNEW; - } - else - { - cur->dwFlags&=~RCIF_USERLNEW; - cur->dwFlags&=~RCIF_USERRNEW; - } - } - else if (!(cur->dwFlags&RCIF_LUNIQ) && !(cur->dwFlags&RCIF_RUNIQ)) - { - if (!(cur->dwFlags&RCIF_USERNONE) && !(cur->dwFlags&RCIF_USERLNEW) && !(cur->dwFlags&RCIF_USERRNEW)) - { - cur->dwFlags|=RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERLNEW; - cur->dwFlags&=~RCIF_USERRNEW; - } - else if (cur->dwFlags&RCIF_USERNONE) - { - cur->dwFlags&=~RCIF_USERNONE; - if (cur->dwFlags&RCIF_LNEW) - { - if (!Opt.SyncOnlyRight) cur->dwFlags|=RCIF_USERRNEW; - } - else - { - cur->dwFlags|=RCIF_USERLNEW; - } - } - else - { - if (Opt.SyncOnlyRight) - { - cur->dwFlags|=RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERLNEW; - } - else - { - cur->dwFlags&=~RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERLNEW; - cur->dwFlags&=~RCIF_USERRNEW; - } - } - } - else - { - if (cur->dwFlags&RCIF_USERNONE) - { - cur->dwFlags&= ~RCIF_USERNONE; - if (Opt.SyncOnlyRight && (cur->dwFlags&RCIF_RNEW)) cur->dwFlags|=RCIF_USERDEL; - } - else - { - cur->dwFlags|=RCIF_USERNONE; - cur->dwFlags&=~RCIF_USERDEL; - } - } - - wchar_t buf[65536]; - wchar_t Mark=L' '; - if (cur->dwFlags&RCIF_DIFFER) - { - if (cur->dwFlags&RCIF_USERLNEW) Mark=0x25ba; - else if (!Opt.SyncOnlyRight && (cur->dwFlags&RCIF_USERRNEW)) Mark=0x25c4; - else Mark=0x2260; - } - else if (cur->dwFlags&RCIF_LNEW) - { - if (!Opt.SyncOnlyRight && (cur->dwFlags&RCIF_USERRNEW)) Mark=0x25c4; - else if (!(cur->dwFlags&RCIF_USERNONE)) Mark=0x2192; - } - else if (cur->dwFlags&RCIF_RNEW) - { - if (cur->dwFlags&RCIF_USERLNEW) Mark=0x25ba; - else if (!Opt.SyncOnlyRight && !(cur->dwFlags&RCIF_USERNONE)) Mark=0x2190; - else if (cur->dwFlags&RCIF_USERDEL) Mark=L'x'; - } - MakeListItemText(buf,cur,Mark); - struct FarListUpdate FLU; - FLU.StructSize=sizeof(FarListUpdate); - FLU.Index=FLGI.ItemIndex; - FLU.Item=FLGI.Item; - FLU.Item.Text=buf; - if (Info.SendDlgMessage(hDlg,DM_LISTUPDATE,0,&FLU)) - return true; - } - } - MessageBeep(MB_OK); - return true; - } -*/ - } - else if (IsCtrl(record)) - { - if (vk==0x31) //VK_1 - { - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,false,0); - Opt.DupListSmall ? Opt.DupListSmall=0 : Opt.DupListSmall=1; - MakeDupFarList(hDlg,pFileList,true,false); - Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,true,0); - return true; - } - else if (vk==VK_PRIOR) - { - int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); - dupFile **tmp=(dupFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); - dupFile *cur=tmp?*tmp:NULL; - if (cur) - { - Opt.Mode=MODE_CMP; //скидываем!!! - - PanelRedrawInfo RInfo={sizeof(PanelRedrawInfo),0,0}; - bool bLeft=(LPanel.PInfo.Flags&PFLAGS_FOCUS?true:false); - if (FSF.LStricmp(bLeft?LPanel.Dir:RPanel.Dir,GetPosToName(cur->fi.Dir))) - { - FarPanelDirectory dirInfo={sizeof(FarPanelDirectory),GetPosToName(cur->fi.Dir),NULL,{0},NULL}; - Info.PanelControl(bLeft?LPanel.hPanel:RPanel.hPanel,FCTL_SETPANELDIRECTORY,0,&dirInfo); - } - PanelInfo PInfo={sizeof(PanelInfo)}; - Info.PanelControl(bLeft?LPanel.hPanel:RPanel.hPanel,FCTL_GETPANELINFO,0,&PInfo); - - for (unsigned i=0; ifi.FileName,FGPPI.Item->FileName)) - { - RInfo.CurrentItem=i; - free(PPI); - break; - } - free(PPI); - } - } - Info.PanelControl(bLeft?LPanel.hPanel:RPanel.hPanel,FCTL_REDRAWPANEL,0,&RInfo); - Info.SendDlgMessage(hDlg,DM_CLOSE,0,0); - } - return true; - } - } - else if (IsShift(record)) - { - if (vk==VK_RETURN) - { - int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); - dupFile **tmp=(dupFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); - dupFile *cur=tmp?*tmp:NULL; - if (cur) - { - string strFullFileName; - GetFullFileName(strFullFileName,cur->fi.Dir,cur->fi.FileName,false); - SHELLEXECUTEINFOW info; - memset(&info,0,sizeof(info)); - info.cbSize=sizeof(info); - info.fMask=SEE_MASK_UNICODE|SEE_MASK_NOCLOSEPROCESS; - info.lpFile=strFullFileName.get(); - info.nShow=SW_SHOWNORMAL; - ShellExecuteExW(&info); - } - return true; - } - } - } - } - } - return Info.DefDlgProc(hDlg,Msg,Param1,Param2); + dupFileList* pFileList = (dupFileList*) Info.SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); + switch (Msg) + { + case DN_INITDIALOG: + MakeDupFarList(hDlg, pFileList, true, true); + Info.SendDlgMessage(hDlg, DM_SETMOUSEEVENTNOTIFY, 1, 0); + break; + + /************************************************************************/ + + case DN_RESIZECONSOLE: { + COORD c = (*(COORD*) Param2); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_RESIZEDIALOG, 0, &c); + WinInfo.Con.Right = c.X - 1; + WinInfo.Con.Bottom = c.Y - 1; + WinInfo.TruncLen = WinInfo.Con.Right - WinInfo.Con.Left - 20 + 1; + if (WinInfo.TruncLen > MAX_PATH - 2) + WinInfo.TruncLen = MAX_PATH - 2; + Info.SendDlgMessage(hDlg, DM_SETITEMPOSITION, 0, &WinInfo.Con); + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); + dupFile* cur = tmp ? *tmp : NULL; + if (cur) + SetBottom(hDlg, pFileList, cur); + c.X = c.Y = -1; + Info.SendDlgMessage(hDlg, DM_MOVEDIALOG, true, &c); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + return true; + } + + /************************************************************************/ + + case DN_CTLCOLORDLGLIST: + if (Param1 == 0) + { + struct FarDialogItemColors* Colors = (FarDialogItemColors*) Param2; + FarColor Color; + int ColorIndex[15] = {COL_PANELTEXT, + COL_PANELBOX, + COL_PANELBOX, // заголовки + COL_PANELTEXT, // элемент списка + COL_PANELSELECTEDTEXT, + COL_PANELBOX, + COL_PANELCURSOR, // под курсором + COL_PANELSELECTEDCURSOR, + COL_PANELSCROLLBAR, + COL_PANELHIGHLIGHTTEXT, // виртуальная папка + COL_PANELSELECTEDTEXT, + COL_PANELSELECTEDCURSOR, + COL_PANELSELECTEDTEXT, + COL_PANELHIGHLIGHTTEXT, // одинаковые элементы + COL_PANELCURSOR}; + for (int i = 0; i < 15; i++) + { + Info.AdvControl(&MainGuid, ACTL_GETCOLOR, ColorIndex[i], &Color); + Colors->Colors[i] = Color; + } + return true; + } + break; + + /************************************************************************/ + + case DN_LISTCHANGE: + if (Param1 == 0) + { + dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Param2); + dupFile* cur = tmp ? *tmp : NULL; + if (cur) + { + SetBottom(hDlg, pFileList, cur); + return true; + } + } + break; + + /************************************************************************/ + + case DN_CLOSE: + if (Opt.Mode == MODE_DUP && Param1 == -1) + { + Opt.Dup = GetDupOpt(pFileList); + if (Opt.Dup == QR_EDIT) + return false; + else + return true; + } + break; + + /************************************************************************/ + + case DN_INPUT: { + const INPUT_RECORD* record = (const INPUT_RECORD*) Param2; + + if (record->EventType == MOUSE_EVENT) + if (Param1 == 0 && record->Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED) + { + SMALL_RECT dlgRect; + Info.SendDlgMessage(hDlg, DM_GETDLGRECT, 0, &dlgRect); + // щелкнули в LISTе + if (record->Event.MouseEvent.dwMousePosition.X > dlgRect.Left && record->Event.MouseEvent.dwMousePosition.X < dlgRect.Right && + record->Event.MouseEvent.dwMousePosition.Y > dlgRect.Top && record->Event.MouseEvent.dwMousePosition.Y < dlgRect.Bottom) + { + FarListPos ListPos = {sizeof(FarListPos)}; + Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, &ListPos); + int OldPos = ListPos.SelectPos; + ListPos.SelectPos = ListPos.TopPos + (record->Event.MouseEvent.dwMousePosition.Y - 1 - dlgRect.Top); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + int NewPos = Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); + if (NewPos != ListPos.SelectPos) + { + ListPos.SelectPos = OldPos; + Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); + MessageBeep(MB_OK); + } + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + if (NewPos == ListPos.SelectPos) + { + dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) ListPos.SelectPos); + dupFile* cur = (tmp && *tmp) ? *tmp : NULL; + if (cur) + { + struct FarListGetItem FLGI = {sizeof(FarListGetItem)}; + FLGI.ItemIndex = ListPos.SelectPos; + if (Info.SendDlgMessage(hDlg, DM_LISTGETITEM, 0, &FLGI)) + { + (FLGI.Item.Flags & (LIF_CHECKED | LIF_GRAYED)) ? (FLGI.Item.Flags &= ~(LIF_CHECKED | LIF_GRAYED)) + : (FLGI.Item.Flags |= (LIF_CHECKED | LIF_GRAYED)); + struct FarListUpdate FLU = {sizeof(FarListUpdate)}; + FLU.Index = FLGI.ItemIndex; + FLU.Item = FLGI.Item; + if (Info.SendDlgMessage(hDlg, DM_LISTUPDATE, 0, &FLU)) + { + if (cur->dwFlags & RCIF_USERDEL) + { + cur->dwFlags &= ~RCIF_USERDEL; + pFileList->Del--; + } + else + { + cur->dwFlags |= RCIF_USERDEL; + pFileList->Del++; + } + SetBottom(hDlg, pFileList, cur); + return false; + } + } + } + } + } + } + } + break; + + /************************************************************************/ + + case DN_CONTROLINPUT: { + const INPUT_RECORD* record = (const INPUT_RECORD*) Param2; + + if (record->EventType == KEY_EVENT && record->Event.KeyEvent.bKeyDown) + { + WORD vk = record->Event.KeyEvent.wVirtualKeyCode; + + if (IsNone(record)) + { + if (vk == VK_F3) + { + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); + dupFile* cur = tmp ? *tmp : NULL; + if (cur) + { + string strFullFileName; + GetFullFileName(strFullFileName, cur->fi.Dir, cur->fi.FileName); + if (Info.Viewer(GetPosToName(strFullFileName.get()), NULL, 0, 0, -1, -1, VF_DISABLEHISTORY, CP_DEFAULT)) + { + SetBottom(hDlg, pFileList, cur); // обходим баг фара: почему-то строка функциональных клавиш не прячется автоматом! + return true; + } + } + else + MessageBeep(MB_OK); + return true; + } + else if (vk == VK_INSERT) + { + struct FarListPos FLP = {sizeof(FarListPos)}; + Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, &FLP); + dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) FLP.SelectPos); + dupFile* cur = tmp ? *tmp : NULL; + if (cur) + { + struct FarListGetItem FLGI = {sizeof(FarListGetItem)}; + FLGI.ItemIndex = FLP.SelectPos; + if (Info.SendDlgMessage(hDlg, DM_LISTGETITEM, 0, &FLGI)) + { + (FLGI.Item.Flags & (LIF_CHECKED | LIF_GRAYED)) ? (FLGI.Item.Flags &= ~(LIF_CHECKED | LIF_GRAYED)) + : (FLGI.Item.Flags |= (LIF_CHECKED | LIF_GRAYED)); + struct FarListUpdate FLU = {sizeof(FarListUpdate)}; + FLU.Index = FLGI.ItemIndex; + FLU.Item = FLGI.Item; + if (Info.SendDlgMessage(hDlg, DM_LISTUPDATE, 0, &FLU)) + { + if (cur->dwFlags & RCIF_USERDEL) + { + cur->dwFlags &= ~RCIF_USERDEL; + pFileList->Del--; + } + else + { + cur->dwFlags |= RCIF_USERDEL; + pFileList->Del++; + } + FLP.SelectPos++; + if ((FLP.SelectPos - 1) == Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &FLP)) + SetBottom(hDlg, pFileList, cur); + + return true; + } + } + } + MessageBeep(MB_OK); + return true; + } + /* + else if (vk==VK_SPACE) + { + GOTOCHANGEMARK: + int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); + cmpFile **tmp=(cmpFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); + cmpFile *cur=(tmp && *tmp)?*tmp:NULL; + if (cur && !(cur->dwFlags&RCIF_EQUAL) && Opt.Mode==MODE_SYNC) + { + struct FarListGetItem FLGI; + FLGI.StructSize=sizeof(FarListGetItem); + FLGI.ItemIndex=Pos; + if (Info.SendDlgMessage(hDlg,DM_LISTGETITEM,0,&FLGI)) + { + __int64 Delta=0; + if (!(cur->dwFlags&RCIF_LUNIQ) && !(cur->dwFlags&RCIF_RUNIQ)) + Delta=(((__int64)cur->ftLLastWriteTime.dwHighDateTime << 32) | cur->ftLLastWriteTime.dwLowDateTime) - + (((__int64)cur->ftRLastWriteTime.dwHighDateTime << 32) | + cur->ftRLastWriteTime.dwLowDateTime); + + if (cur->dwFlags&RCIF_DIFFER) + { + if (!(cur->dwFlags&RCIF_USERLNEW) && !(cur->dwFlags&RCIF_USERRNEW)) + { + if (Delta>=0 || Opt.SyncOnlyRight) cur->dwFlags|=RCIF_USERLNEW; + else if (!Opt.SyncOnlyRight) cur->dwFlags|=RCIF_USERRNEW; + } + else if ((Delta>=0 || Opt.SyncOnlyRight) && (cur->dwFlags&RCIF_USERLNEW)) + { + cur->dwFlags&=~RCIF_USERLNEW; + if (!Opt.SyncOnlyRight) cur->dwFlags|=RCIF_USERRNEW; + } + else if (Delta<0 && (cur->dwFlags&RCIF_USERRNEW)) + { + cur->dwFlags|=RCIF_USERLNEW; + cur->dwFlags&=~RCIF_USERRNEW; + } + else + { + cur->dwFlags&=~RCIF_USERLNEW; + cur->dwFlags&=~RCIF_USERRNEW; + } + } + else if (!(cur->dwFlags&RCIF_LUNIQ) && !(cur->dwFlags&RCIF_RUNIQ)) + { + if (!(cur->dwFlags&RCIF_USERNONE) && !(cur->dwFlags&RCIF_USERLNEW) && !(cur->dwFlags&RCIF_USERRNEW)) + { + cur->dwFlags|=RCIF_USERNONE; + cur->dwFlags&=~RCIF_USERLNEW; + cur->dwFlags&=~RCIF_USERRNEW; + } + else if (cur->dwFlags&RCIF_USERNONE) + { + cur->dwFlags&=~RCIF_USERNONE; + if (cur->dwFlags&RCIF_LNEW) + { + if (!Opt.SyncOnlyRight) cur->dwFlags|=RCIF_USERRNEW; + } + else + { + cur->dwFlags|=RCIF_USERLNEW; + } + } + else + { + if (Opt.SyncOnlyRight) + { + cur->dwFlags|=RCIF_USERNONE; + cur->dwFlags&=~RCIF_USERLNEW; + } + else + { + cur->dwFlags&=~RCIF_USERNONE; + cur->dwFlags&=~RCIF_USERLNEW; + cur->dwFlags&=~RCIF_USERRNEW; + } + } + } + else + { + if (cur->dwFlags&RCIF_USERNONE) + { + cur->dwFlags&= ~RCIF_USERNONE; + if (Opt.SyncOnlyRight && (cur->dwFlags&RCIF_RNEW)) cur->dwFlags|=RCIF_USERDEL; + } + else + { + cur->dwFlags|=RCIF_USERNONE; + cur->dwFlags&=~RCIF_USERDEL; + } + } + + wchar_t buf[65536]; + wchar_t Mark=L' '; + if (cur->dwFlags&RCIF_DIFFER) + { + if (cur->dwFlags&RCIF_USERLNEW) Mark=0x25ba; + else if (!Opt.SyncOnlyRight && (cur->dwFlags&RCIF_USERRNEW)) Mark=0x25c4; + else Mark=0x2260; + } + else if (cur->dwFlags&RCIF_LNEW) + { + if (!Opt.SyncOnlyRight && (cur->dwFlags&RCIF_USERRNEW)) Mark=0x25c4; + else if (!(cur->dwFlags&RCIF_USERNONE)) Mark=0x2192; + } + else if (cur->dwFlags&RCIF_RNEW) + { + if (cur->dwFlags&RCIF_USERLNEW) Mark=0x25ba; + else if (!Opt.SyncOnlyRight && !(cur->dwFlags&RCIF_USERNONE)) Mark=0x2190; + else if (cur->dwFlags&RCIF_USERDEL) Mark=L'x'; + } + MakeListItemText(buf,cur,Mark); + struct FarListUpdate FLU; + FLU.StructSize=sizeof(FarListUpdate); + FLU.Index=FLGI.ItemIndex; + FLU.Item=FLGI.Item; + FLU.Item.Text=buf; + if (Info.SendDlgMessage(hDlg,DM_LISTUPDATE,0,&FLU)) + return true; + } + } + MessageBeep(MB_OK); + return true; + } + */ + } + else if (IsCtrl(record)) + { + if (vk == 0x31) // VK_1 + { + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Opt.DupListSmall ? Opt.DupListSmall = 0 : Opt.DupListSmall = 1; + MakeDupFarList(hDlg, pFileList, true, false); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + return true; + } + else if (vk == VK_PRIOR) + { + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); + dupFile* cur = tmp ? *tmp : NULL; + if (cur) + { + Opt.Mode = MODE_CMP; //скидываем!!! + + PanelRedrawInfo RInfo = {sizeof(PanelRedrawInfo), 0, 0}; + bool bLeft = (LPanel.PInfo.Flags & PFLAGS_FOCUS ? true : false); + if (FSF.LStricmp(bLeft ? LPanel.Dir : RPanel.Dir, GetPosToName(cur->fi.Dir))) + { + FarPanelDirectory dirInfo = {sizeof(FarPanelDirectory), GetPosToName(cur->fi.Dir), NULL, {0}, NULL}; + Info.PanelControl(bLeft ? LPanel.hPanel : RPanel.hPanel, FCTL_SETPANELDIRECTORY, 0, &dirInfo); + } + PanelInfo PInfo = {sizeof(PanelInfo)}; + Info.PanelControl(bLeft ? LPanel.hPanel : RPanel.hPanel, FCTL_GETPANELINFO, 0, &PInfo); + + for (unsigned i = 0; i < PInfo.ItemsNumber; i++) + { + size_t size = Info.PanelControl(bLeft ? LPanel.hPanel : RPanel.hPanel, FCTL_GETPANELITEM, i, 0); + PluginPanelItem* PPI = (PluginPanelItem*) malloc(size); + if (PPI) + { + FarGetPluginPanelItem FGPPI = {sizeof(FarGetPluginPanelItem), size, PPI}; + Info.PanelControl(bLeft ? LPanel.hPanel : RPanel.hPanel, FCTL_GETPANELITEM, i, &FGPPI); + if (!FSF.LStricmp(cur->fi.FileName, FGPPI.Item->FileName)) + { + RInfo.CurrentItem = i; + free(PPI); + break; + } + free(PPI); + } + } + Info.PanelControl(bLeft ? LPanel.hPanel : RPanel.hPanel, FCTL_REDRAWPANEL, 0, &RInfo); + Info.SendDlgMessage(hDlg, DM_CLOSE, 0, 0); + } + return true; + } + } + else if (IsShift(record)) + { + if (vk == VK_RETURN) + { + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); + dupFile* cur = tmp ? *tmp : NULL; + if (cur) + { + string strFullFileName; + GetFullFileName(strFullFileName, cur->fi.Dir, cur->fi.FileName, false); + SHELLEXECUTEINFOW info; + memset(&info, 0, sizeof(info)); + info.cbSize = sizeof(info); + info.fMask = SEE_MASK_UNICODE | SEE_MASK_NOCLOSEPROCESS; + info.lpFile = strFullFileName.get(); + info.nShow = SW_SHOWNORMAL; + ShellExecuteExW(&info); + } + return true; + } + } + } + } + } + return Info.DefDlgProc(hDlg, Msg, Param1, Param2); } - /*************************************************************************** * Диалог результатов сравнения файлов ***************************************************************************/ int AdvCmpProc::ShowDupDialog() { - FarDialogItem DialogItems[1]; - memset(DialogItems,0,sizeof(DialogItems)); - - DialogItems[0].Type=DI_LISTBOX; - DialogItems[0].X1=0; DialogItems[0].X2=WinInfo.Con.Right; - DialogItems[0].Y1=0; DialogItems[0].Y2=WinInfo.Con.Bottom-WinInfo.Con.Top; - DialogItems[0].Flags=DIF_LISTNOCLOSE; - - HANDLE hDlg=Info.DialogInit(&MainGuid,&DupDlgGuid,0,0,WinInfo.Con.Right,WinInfo.Con.Bottom-WinInfo.Con.Top,L"DlgDup",DialogItems, - sizeof(DialogItems)/sizeof(DialogItems[0]),0,FDLG_SMALLDIALOG|FDLG_KEEPCONSOLETITLE,ShowDupDialogProc,&dFList); - if (hDlg != INVALID_HANDLE_VALUE) - { - FarSettingsCreate settings={sizeof(FarSettingsCreate),MainGuid,INVALID_HANDLE_VALUE}; - Opt.DupListSmall=0; - if (Info.SettingsControl(INVALID_HANDLE_VALUE,SCTL_CREATE,0,&settings)) - { - size_t Root=0; // корень ключа - FarSettingsItem item={sizeof(FarSettingsItem),Root,L"DupListSmall",FST_QWORD}; - if (Info.SettingsControl(settings.Handle,SCTL_GET,0,&item)) - Opt.DupListSmall=(int)item.Number; - Info.SettingsControl(settings.Handle,SCTL_FREE,0,0); - } - - Info.DialogRun(hDlg); - - if (Info.SettingsControl(INVALID_HANDLE_VALUE,SCTL_CREATE,0,&settings)) - { - size_t Root=0; // корень ключа - FarSettingsItem item={sizeof(FarSettingsItem),Root,L"DupListSmall",FST_QWORD}; - item.Number=Opt.DupListSmall; - Info.SettingsControl(settings.Handle,SCTL_SET,0,&item); - Info.SettingsControl(settings.Handle,SCTL_FREE,0,0); - } - Info.DialogFree(hDlg); - } - - return 1; + FarDialogItem DialogItems[1]; + memset(DialogItems, 0, sizeof(DialogItems)); + + DialogItems[0].Type = DI_LISTBOX; + DialogItems[0].X1 = 0; + DialogItems[0].X2 = WinInfo.Con.Right; + DialogItems[0].Y1 = 0; + DialogItems[0].Y2 = WinInfo.Con.Bottom - WinInfo.Con.Top; + DialogItems[0].Flags = DIF_LISTNOCLOSE; + + HANDLE hDlg = + Info.DialogInit(&MainGuid, &DupDlgGuid, 0, 0, WinInfo.Con.Right, WinInfo.Con.Bottom - WinInfo.Con.Top, L"DlgDup", DialogItems, + sizeof(DialogItems) / sizeof(DialogItems[0]), 0, FDLG_SMALLDIALOG | FDLG_KEEPCONSOLETITLE, ShowDupDialogProc, &dFList); + if (hDlg != INVALID_HANDLE_VALUE) + { + FarSettingsCreate settings = {sizeof(FarSettingsCreate), MainGuid, INVALID_HANDLE_VALUE}; + Opt.DupListSmall = 0; + if (Info.SettingsControl(INVALID_HANDLE_VALUE, SCTL_CREATE, 0, &settings)) + { + size_t Root = 0; // корень ключа + FarSettingsItem item = {sizeof(FarSettingsItem), Root, L"DupListSmall", FST_QWORD}; + if (Info.SettingsControl(settings.Handle, SCTL_GET, 0, &item)) + Opt.DupListSmall = (int) item.Number; + Info.SettingsControl(settings.Handle, SCTL_FREE, 0, 0); + } + + Info.DialogRun(hDlg); + + if (Info.SettingsControl(INVALID_HANDLE_VALUE, SCTL_CREATE, 0, &settings)) + { + size_t Root = 0; // корень ключа + FarSettingsItem item = {sizeof(FarSettingsItem), Root, L"DupListSmall", FST_QWORD}; + item.Number = Opt.DupListSmall; + Info.SettingsControl(settings.Handle, SCTL_SET, 0, &item); + Info.SettingsControl(settings.Handle, SCTL_FREE, 0, 0); + } + Info.DialogFree(hDlg); + } + + return 1; } - -int AdvCmpProc::ScanDir(const wchar_t *DirName, int ScanDepth) +int AdvCmpProc::ScanDir(const wchar_t* DirName, int ScanDepth) { - bool ret=true; - - if (bBrokenByEsc) - return ret; - - WIN32_FIND_DATA wfdFindData; - HANDLE hFind; - string strDirMask(DirName); - strDirMask+=L"\\*"; - - if ((hFind=FindFirstFileW(strDirMask,&wfdFindData))!= INVALID_HANDLE_VALUE) - { - do - { - if (CheckForEsc()) - { - ret=true; - break; - } - - if (!Opt.ProcessHidden && (wfdFindData.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN)) - continue; - if ((wfdFindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && - ((wfdFindData.cFileName[0]==L'.' && !wfdFindData.cFileName[1]) || (wfdFindData.cFileName[0]==L'.' && wfdFindData.cFileName[1]==L'.' && !wfdFindData.cFileName[2]))) - continue; - - if (wfdFindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) - { - if (Opt.Subfolders==2 && Opt.MaxScanDepthfi.Dir,cur->fi.FileName); - - HANDLE hFile; - if ((hFile=CreateFileW(strFullFileName, GENERIC_READ, FILE_SHARE_READ, 0, - OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) == INVALID_HANDLE_VALUE) - { - CmpInfo.ProcSize+=cur->fi.nFileSize; - CmpInfo.Errors++; - return 0; - } - - ShowDupMsg(GetPosToName(cur->fi.Dir),cur->fi.FileName,true); - - const DWORD ReadBlock=65536; - char *Buf=(char*)malloc(ReadBlock*sizeof(char)); - DWORD ReadSize=0; - bool ret=true; - - DWORD dwFileCRC=0; - - while (1) - { - if (CheckForEsc() || !ReadFile(hFile,Buf,ReadBlock,&ReadSize,0)) - { - ret=false; - break; - } - CmpInfo.CurProcSize+=ReadSize; - CmpInfo.ProcSize+=ReadSize; - dwFileCRC=ProcessCRC(Buf,ReadBlock,dwFileCRC); - - ShowDupMsg(GetPosToName(cur->fi.Dir),cur->fi.FileName,false); - - if (ReadSizefi.Dir, cur->fi.FileName); + + HANDLE hFile; + if ((hFile = CreateFileW(strFullFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) == INVALID_HANDLE_VALUE) + { + CmpInfo.ProcSize += cur->fi.nFileSize; + CmpInfo.Errors++; + return 0; + } + + ShowDupMsg(GetPosToName(cur->fi.Dir), cur->fi.FileName, true); + + const DWORD ReadBlock = 65536; + char* Buf = (char*) malloc(ReadBlock * sizeof(char)); + DWORD ReadSize = 0; + bool ret = true; + + DWORD dwFileCRC = 0; + + while (1) + { + if (CheckForEsc() || !ReadFile(hFile, Buf, ReadBlock, &ReadSize, 0)) + { + ret = false; + break; + } + CmpInfo.CurProcSize += ReadSize; + CmpInfo.ProcSize += ReadSize; + dwFileCRC = ProcessCRC(Buf, ReadBlock, dwFileCRC); + + ShowDupMsg(GetPosToName(cur->fi.Dir), cur->fi.FileName, false); + + if (ReadSize < ReadBlock) + break; + } + + free(Buf); + CloseHandle(hFile); + + if (!ret) + return 0; + + return dwFileCRC; } -unsigned int GetSyncSafeInt(unsigned char *b) +unsigned int GetSyncSafeInt(unsigned char* b) { - return (b[0]<<21) | (b[1]<<14) | (b[2]<<7) | (b[3]); + return (b[0] << 21) | (b[1] << 14) | (b[2] << 7) | (b[3]); } -unsigned int GetNonSyncSafeInt23(unsigned char *b) +unsigned int GetNonSyncSafeInt23(unsigned char* b) { - return (b[0]<<24) | (b[1]<<16) | (b[2]<<8) | (b[3]); + return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3]); } -unsigned int GetNonSyncSafeInt22(unsigned char *b) +unsigned int GetNonSyncSafeInt22(unsigned char* b) { - return (b[0]<<16) | (b[1]<<8) | (b[2]); + return (b[0] << 16) | (b[1] << 8) | (b[2]); } -bool ID3_ReadFrameText(char bType, char *pTextRaw, int nTextRawSize, wchar_t *pszBuf, int nBufSize) +bool ID3_ReadFrameText(char bType, char* pTextRaw, int nTextRawSize, wchar_t* pszBuf, int nBufSize) { - if ((bType == 3) || (bType != 1 && bType != 2 && nTextRawSize>= 3 && pTextRaw[0] == 0xef && pTextRaw[1] == 0xbb && pTextRaw[2] == 0xbf)) - { - /* UTF8 */ - if (nTextRawSize>= 3 && pTextRaw[0] == 0xef && pTextRaw[1] == 0xbb && pTextRaw[2] == 0xbf) - { - pTextRaw += 3; - nTextRawSize -= 3; - } - MultiByteToWideChar(CP_UTF8, 0, pTextRaw, nTextRawSize, pszBuf, nBufSize); - } - else if (bType == 1 || bType == 2) - { - /* UTF16 LE*/ - if (nTextRawSize>= 2 && pTextRaw[0] == 0xff && pTextRaw[1] == 0xfe) - { - pTextRaw += 2; - nTextRawSize -= 2; - bType = 1; - } - /* UTF16 BE*/ - else if (nTextRawSize>= 2 && pTextRaw[0] == 0xfe && pTextRaw[1] == 0xff) - { - pTextRaw += 2; - nTextRawSize -= 2; - bType = 2; - } - if (bType == 2) - { - char *pa = (char *)malloc(nTextRawSize); - if (pa) - { - int l = nTextRawSize >> 1; - for (int i=0; iy)?y:x) - memcpy(pszBuf, pTextRaw, XMIN((nTextRawSize >> 1), nBufSize) * sizeof(wchar_t)); - } - else - { - MultiByteToWideChar(CP_ACP, 0, pTextRaw, nTextRawSize, pszBuf, nBufSize); - } - FSF.RTrim(pszBuf); - return true; + if ((bType == 3) || (bType != 1 && bType != 2 && nTextRawSize >= 3 && pTextRaw[0] == 0xef && pTextRaw[1] == 0xbb && pTextRaw[2] == 0xbf)) + { + /* UTF8 */ + if (nTextRawSize >= 3 && pTextRaw[0] == 0xef && pTextRaw[1] == 0xbb && pTextRaw[2] == 0xbf) + { + pTextRaw += 3; + nTextRawSize -= 3; + } + MultiByteToWideChar(CP_UTF8, 0, pTextRaw, nTextRawSize, pszBuf, nBufSize); + } + else if (bType == 1 || bType == 2) + { + /* UTF16 LE*/ + if (nTextRawSize >= 2 && pTextRaw[0] == 0xff && pTextRaw[1] == 0xfe) + { + pTextRaw += 2; + nTextRawSize -= 2; + bType = 1; + } + /* UTF16 BE*/ + else if (nTextRawSize >= 2 && pTextRaw[0] == 0xfe && pTextRaw[1] == 0xff) + { + pTextRaw += 2; + nTextRawSize -= 2; + bType = 2; + } + if (bType == 2) + { + char* pa = (char*) malloc(nTextRawSize); + if (pa) + { + int l = nTextRawSize >> 1; + for (int i = 0; i < l; i++) + { + pa[i * 2 + 0] = pTextRaw[i * 2 + 1]; + pa[i * 2 + 1] = pTextRaw[i * 2 + 0]; + } + ID3_ReadFrameText(1, pa, nTextRawSize, pszBuf, nBufSize); + free(pa); + return true; + } + return false; + } +#define XMIN(x, y) ((x > y) ? y : x) + memcpy(pszBuf, pTextRaw, XMIN((nTextRawSize >> 1), nBufSize) * sizeof(wchar_t)); + } + else + { + MultiByteToWideChar(CP_ACP, 0, pTextRaw, nTextRawSize, pszBuf, nBufSize); + } + FSF.RTrim(pszBuf); + return true; } -char *Unsync(char *pSrc, unsigned nSrcLen, unsigned nDstLmt, unsigned *pnDstLen) +char* Unsync(char* pSrc, unsigned nSrcLen, unsigned nDstLmt, unsigned* pnDstLen) { - char *pUnsync=(char *)malloc(nSrcLen?nSrcLen:nDstLmt); - if (pUnsync) - { - unsigned i=0, j=0; - for ( ; (nSrcLen?ifi.Dir,cur->fi.FileName); - HSTREAM stream=pBASS_StreamCreateFile(FALSE,strFullFileName.get(),0,0,BASS_STREAM_DECODE|BASS_UNICODE); - - if (!(cur->dwFlags&RCIF_MUSIC) && FSF.ProcessName(L"*.mp3",cur->fi.FileName,0,PN_CMPNAME)) - { - BASS_CHANNELINFO info; - if (stream && pBASS_ChannelGetInfo(stream,&info)) - if (info.ctype==BASS_CTYPE_STREAM_MP3 || info.ctype==BASS_CTYPE_STREAM_MP2) - cur->dwFlags|=RCIF_MUSIC; - } - - if (!(cur->dwFlags&RCIF_MUSIC) || !stream) - { - ret=0; - goto END; - } - - if (!GetInfo && (!cur->MusicBitrate || !cur->MusicTime)) - { - cur->MusicBitrate=(DWORD)(pBASS_StreamGetFilePosition(stream,BASS_FILEPOS_END)/ - (125*pBASS_ChannelBytes2Seconds(stream,pBASS_ChannelGetLength(stream,BASS_POS_BYTE)))+0.5); // bitrate (Kbps) - cur->MusicTime=(DWORD)pBASS_ChannelBytes2Seconds(stream,pBASS_ChannelGetLength(stream,BASS_POS_BYTE)); - ret=1; - } - else if ((GetInfo==1 || GetInfo==3) && !cur->dwCRC) - { - ShowDupMsg(GetPosToName(cur->fi.Dir),cur->fi.FileName,true); - DWORD dwCRC=0; - short Buf[10000]; - int i=15; - while (i && pBASS_ChannelIsActive(stream)==BASS_ACTIVE_PLAYING) - { - if (CheckForEsc()) - { - ret=0; - goto END; - } - pBASS_ChannelGetData(stream,Buf,20000); - dwCRC=ProcessCRC(Buf,10000,dwCRC); - i--; - } - -//DebugMsg(L"pBASS_StreamGetFilePosition(stream,BASS_FILEPOS_START)",cur->FileName,(DWORD)pBASS_StreamGetFilePosition(stream,BASS_FILEPOS_START)); -//DebugMsg(L"pBASS_StreamGetFilePosition(stream,BASS_FILEPOS_END)",cur->FileName,(DWORD)pBASS_StreamGetFilePosition(stream,BASS_FILEPOS_END)); - cur->dwCRC=dwCRC; - ret=1; - } - if ((GetInfo==2 || GetInfo==3) && (!cur->MusicArtist || !cur->MusicTitle)) - { - const unsigned int nSize=256; - cur->MusicArtist=(wchar_t*)malloc(nSize*sizeof(wchar_t)); - cur->MusicTitle=(wchar_t*)malloc(nSize*sizeof(wchar_t)); - - if (!cur->MusicArtist || !cur->MusicTitle) - { - ret=0; - goto END; - } - - ShowDupMsg(GetPosToName(cur->fi.Dir),cur->fi.FileName,true); - - char *p=(char *)pBASS_ChannelGetTags(stream,BASS_TAG_ID3V2); - if (p && p[0]=='I' && p[1]=='D' && p[2]=='3') - { - unsigned nVersion = ((*(p + 3)) << 8) | (*(p + 4)); - unsigned nFlag = *(p + 5); - unsigned nTagSize = GetSyncSafeInt((unsigned char*)p + 6); - char szFrameID[5]; - unsigned nFrameSize; - unsigned nTotal=0; - char *pUnsync=NULL; - - if ((nFlag&0x80) && (nVersion<=0x300)) - p = pUnsync = Unsync(p+10,0,nTagSize,&nTagSize); - else - p += 10; - if (p) - { - if (nVersion>=0x300) - { - if (nFlag & 0x40) - nTotal += (nVersion==0x300) ? (4+GetNonSyncSafeInt23((unsigned char*)p+nTotal)) : GetSyncSafeInt((unsigned char*)p+nTotal); - - while(nTotal0 && nLenID<4 && nTotal>4) - { - /* broken tag */ - lstrcpynA(szFrameID,(p+nTotal-4+nLenID),5); - if (lstrlenA(szFrameID)==4) - { - nTotal += -4+nLenID; - continue; - } - } - if (nLenID!=4) - break; - if (nVersion!=0x300) - nFrameFlag = (p[nTotal+9] & 3) | ((nFlag & 0x80) ? 2 : 0); - - if(!lstrcmpA(szFrameID, "TPE1")) - ID3V23_ReadFrame(nFrameFlag, p+nTotal+10,nFrameSize,cur->MusicArtist,nSize); - else if(!lstrcmpA(szFrameID, "TIT2")) - ID3V23_ReadFrame(nFrameFlag, p+nTotal+10,nFrameSize,cur->MusicTitle,nSize); - nTotal += nFrameSize+10; - } - } - else - { - while(nTotalMusicArtist,nSize); - else if(!lstrcmpA(szFrameID, "TT2")) - ID3V23_ReadFrame(nFrameFlag, p+nTotal+6, nFrameSize,cur->MusicTitle,nSize); - nTotal += nFrameSize+6; - } - } - } - if (pUnsync) free(pUnsync); - } - if (*cur->MusicArtist) - { - //DebugMsg(L"cur->MusicArtist-2",cur->MusicArtist); - ret=1; - cur->dwFlags|=RCIF_MUSICART; - } - if (*cur->MusicTitle) - { - //DebugMsg(L"cur->MusicTitle-2",cur->MusicTitle); - ret=1; - cur->dwFlags|=RCIF_MUSICTIT; - } - - TAG_ID3 *id3=(TAG_ID3*)pBASS_ChannelGetTags(stream,BASS_TAG_ID3); - if (id3) - { - int nFrameSize=30; - if (!(cur->dwFlags&RCIF_MUSICART)) - { - while (nFrameSize>0 && id3->artist[nFrameSize-1] == 0x20) nFrameSize--; - MultiByteToWideChar(CP_ACP,0,id3->artist,nFrameSize,cur->MusicArtist,nSize); - FSF.RTrim(cur->MusicArtist); - if (*cur->MusicArtist) - { - //DebugMsg(L"cur->MusicArtist-1",cur->MusicArtist); - ret=1; - cur->dwFlags|=RCIF_MUSICART; - } - } - nFrameSize=30; - if (!(cur->dwFlags&RCIF_MUSICTIT)) - { - while (nFrameSize>0 && id3->title[nFrameSize-1] == 0x20) nFrameSize--; - MultiByteToWideChar(CP_ACP,0,id3->title,nFrameSize,cur->MusicTitle,nSize); - FSF.RTrim(cur->MusicTitle); - if (*cur->MusicTitle) - { - //DebugMsg(L"cur->MusicTitle-1",cur->MusicTitle); - ret=1; - cur->dwFlags|=RCIF_MUSICTIT; - } - } - } - - if (!(cur->dwFlags&RCIF_MUSICART) || !(cur->dwFlags&RCIF_MUSICTIT)) - { - wchar_t *Name=cur->fi.FileName; - int lenName=wcslen(Name)-4; //за минусом расширения - int Ptr=lenName; - for (int i=0; i0 && FSF.LIsAlphanum((wchar_t)Name[i-1])) - { - Ptr=i; - break; - } - } - } - - if (!(cur->dwFlags&RCIF_MUSICART) && Ptr!=lenName) - { - bool bNum=true; - for (int i=0,j=0; Name[j] && j=L'0' && Name[j]<=L'9') - continue; - else - bNum=false; - } - cur->MusicArtist[i++]=Name[j]; - } - //!!! память обнулена - cur->MusicArtist[i]=0 не делаем !!! - FSF.RTrim(cur->MusicArtist); - FSF.LTrim(cur->MusicArtist); - if (*cur->MusicArtist) - { - //DebugMsg(L"cur->MusicArtist-0",cur->MusicArtist); - ret=1; - } - } - - if (!(cur->dwFlags&RCIF_MUSICTIT)) - { - if (Ptr!=lenName) - { - for (int i=0,j=Ptr+3; jMusicTitle[i]=Name[j]; - } - else - { - for (int i=0; Name[i] && iMusicTitle[i]=Name[i]; - } - //!!! память обнулена, cur->MusicTitle[i]=0 не делаем !!! - FSF.RTrim(cur->MusicTitle); - FSF.LTrim(cur->MusicTitle); - if (*cur->MusicTitle) - { - //DebugMsg(L"cur->MusicTitle-0",cur->MusicTitle); - ret=1; - } - } - } - } + int ret = 0; + + if (CheckForEsc()) + return ret; + + string strFullFileName; + GetFullFileName(strFullFileName, cur->fi.Dir, cur->fi.FileName); + HSTREAM stream = pBASS_StreamCreateFile(FALSE, strFullFileName.get(), 0, 0, BASS_STREAM_DECODE | BASS_UNICODE); + + if (!(cur->dwFlags & RCIF_MUSIC) && FSF.ProcessName(L"*.mp3", cur->fi.FileName, 0, PN_CMPNAME)) + { + BASS_CHANNELINFO info; + if (stream && pBASS_ChannelGetInfo(stream, &info)) + if (info.ctype == BASS_CTYPE_STREAM_MP3 || info.ctype == BASS_CTYPE_STREAM_MP2) + cur->dwFlags |= RCIF_MUSIC; + } + + if (!(cur->dwFlags & RCIF_MUSIC) || !stream) + { + ret = 0; + goto END; + } + + if (!GetInfo && (!cur->MusicBitrate || !cur->MusicTime)) + { + cur->MusicBitrate = (DWORD)(pBASS_StreamGetFilePosition(stream, BASS_FILEPOS_END) / + (125 * pBASS_ChannelBytes2Seconds(stream, pBASS_ChannelGetLength(stream, BASS_POS_BYTE))) + + 0.5); // bitrate (Kbps) + cur->MusicTime = (DWORD) pBASS_ChannelBytes2Seconds(stream, pBASS_ChannelGetLength(stream, BASS_POS_BYTE)); + ret = 1; + } + else if ((GetInfo == 1 || GetInfo == 3) && !cur->dwCRC) + { + ShowDupMsg(GetPosToName(cur->fi.Dir), cur->fi.FileName, true); + DWORD dwCRC = 0; + short Buf[10000]; + int i = 15; + while (i && pBASS_ChannelIsActive(stream) == BASS_ACTIVE_PLAYING) + { + if (CheckForEsc()) + { + ret = 0; + goto END; + } + pBASS_ChannelGetData(stream, Buf, 20000); + dwCRC = ProcessCRC(Buf, 10000, dwCRC); + i--; + } + + // DebugMsg(L"pBASS_StreamGetFilePosition(stream,BASS_FILEPOS_START)",cur->FileName,(DWORD)pBASS_StreamGetFilePosition(stream,BASS_FILEPOS_START)); + // DebugMsg(L"pBASS_StreamGetFilePosition(stream,BASS_FILEPOS_END)",cur->FileName,(DWORD)pBASS_StreamGetFilePosition(stream,BASS_FILEPOS_END)); + cur->dwCRC = dwCRC; + ret = 1; + } + if ((GetInfo == 2 || GetInfo == 3) && (!cur->MusicArtist || !cur->MusicTitle)) + { + const unsigned int nSize = 256; + cur->MusicArtist = (wchar_t*) malloc(nSize * sizeof(wchar_t)); + cur->MusicTitle = (wchar_t*) malloc(nSize * sizeof(wchar_t)); + + if (!cur->MusicArtist || !cur->MusicTitle) + { + ret = 0; + goto END; + } + + ShowDupMsg(GetPosToName(cur->fi.Dir), cur->fi.FileName, true); + + char* p = (char*) pBASS_ChannelGetTags(stream, BASS_TAG_ID3V2); + if (p && p[0] == 'I' && p[1] == 'D' && p[2] == '3') + { + unsigned nVersion = ((*(p + 3)) << 8) | (*(p + 4)); + unsigned nFlag = *(p + 5); + unsigned nTagSize = GetSyncSafeInt((unsigned char*) p + 6); + char szFrameID[5]; + unsigned nFrameSize; + unsigned nTotal = 0; + char* pUnsync = NULL; + + if ((nFlag & 0x80) && (nVersion <= 0x300)) + p = pUnsync = Unsync(p + 10, 0, nTagSize, &nTagSize); + else + p += 10; + if (p) + { + if (nVersion >= 0x300) + { + if (nFlag & 0x40) + nTotal += (nVersion == 0x300) ? (4 + GetNonSyncSafeInt23((unsigned char*) p + nTotal)) : GetSyncSafeInt((unsigned char*) p + nTotal); + + while (nTotal < nTagSize) + { + int nFrameFlag = 0; + // Ver.2.3 + lstrcpynA(szFrameID, (p + nTotal), 5); + if (nVersion == 0x300) + nFrameSize = GetNonSyncSafeInt23((unsigned char*) p + nTotal + 4); + else + nFrameSize = GetSyncSafeInt((unsigned char*) p + nTotal + 4); + int nLenID = lstrlenA(szFrameID); + if (nLenID > 0 && nLenID < 4 && nTotal > 4) + { + /* broken tag */ + lstrcpynA(szFrameID, (p + nTotal - 4 + nLenID), 5); + if (lstrlenA(szFrameID) == 4) + { + nTotal += -4 + nLenID; + continue; + } + } + if (nLenID != 4) + break; + if (nVersion != 0x300) + nFrameFlag = (p[nTotal + 9] & 3) | ((nFlag & 0x80) ? 2 : 0); + + if (!lstrcmpA(szFrameID, "TPE1")) + ID3V23_ReadFrame(nFrameFlag, p + nTotal + 10, nFrameSize, cur->MusicArtist, nSize); + else if (!lstrcmpA(szFrameID, "TIT2")) + ID3V23_ReadFrame(nFrameFlag, p + nTotal + 10, nFrameSize, cur->MusicTitle, nSize); + nTotal += nFrameSize + 10; + } + } + else + { + while (nTotal < nTagSize) + { + int nFrameFlag = 0; + // Ver.2.2 + lstrcpynA(szFrameID, (p + nTotal), 4); + nFrameSize = GetNonSyncSafeInt22((unsigned char*) p + nTotal + 3); + if (lstrlenA(szFrameID) != 3) + break; + + if (!lstrcmpA(szFrameID, "TP1")) + ID3V23_ReadFrame(nFrameFlag, p + nTotal + 6, nFrameSize, cur->MusicArtist, nSize); + else if (!lstrcmpA(szFrameID, "TT2")) + ID3V23_ReadFrame(nFrameFlag, p + nTotal + 6, nFrameSize, cur->MusicTitle, nSize); + nTotal += nFrameSize + 6; + } + } + } + if (pUnsync) + free(pUnsync); + } + if (*cur->MusicArtist) + { + // DebugMsg(L"cur->MusicArtist-2",cur->MusicArtist); + ret = 1; + cur->dwFlags |= RCIF_MUSICART; + } + if (*cur->MusicTitle) + { + // DebugMsg(L"cur->MusicTitle-2",cur->MusicTitle); + ret = 1; + cur->dwFlags |= RCIF_MUSICTIT; + } + + TAG_ID3* id3 = (TAG_ID3*) pBASS_ChannelGetTags(stream, BASS_TAG_ID3); + if (id3) + { + int nFrameSize = 30; + if (!(cur->dwFlags & RCIF_MUSICART)) + { + while (nFrameSize > 0 && id3->artist[nFrameSize - 1] == 0x20) nFrameSize--; + MultiByteToWideChar(CP_ACP, 0, id3->artist, nFrameSize, cur->MusicArtist, nSize); + FSF.RTrim(cur->MusicArtist); + if (*cur->MusicArtist) + { + // DebugMsg(L"cur->MusicArtist-1",cur->MusicArtist); + ret = 1; + cur->dwFlags |= RCIF_MUSICART; + } + } + nFrameSize = 30; + if (!(cur->dwFlags & RCIF_MUSICTIT)) + { + while (nFrameSize > 0 && id3->title[nFrameSize - 1] == 0x20) nFrameSize--; + MultiByteToWideChar(CP_ACP, 0, id3->title, nFrameSize, cur->MusicTitle, nSize); + FSF.RTrim(cur->MusicTitle); + if (*cur->MusicTitle) + { + // DebugMsg(L"cur->MusicTitle-1",cur->MusicTitle); + ret = 1; + cur->dwFlags |= RCIF_MUSICTIT; + } + } + } + + if (!(cur->dwFlags & RCIF_MUSICART) || !(cur->dwFlags & RCIF_MUSICTIT)) + { + wchar_t* Name = cur->fi.FileName; + int lenName = wcslen(Name) - 4; //за минусом расширения + int Ptr = lenName; + for (int i = 0; i < lenName; i++) + { + if (!Strncmp(Name + i, L" - ", 3) || !Strncmp(Name + i, L"_-_", 3)) + { + if (i > 0 && FSF.LIsAlphanum((wchar_t) Name[i - 1])) + { + Ptr = i; + break; + } + } + } + + if (!(cur->dwFlags & RCIF_MUSICART) && Ptr != lenName) + { + bool bNum = true; + for (int i = 0, j = 0; Name[j] && j < Ptr && i < nSize; j++) + { + if (bNum) + { + if (Name[j] >= L'0' && Name[j] <= L'9') + continue; + else + bNum = false; + } + cur->MusicArtist[i++] = Name[j]; + } + //!!! память обнулена - cur->MusicArtist[i]=0 не делаем !!! + FSF.RTrim(cur->MusicArtist); + FSF.LTrim(cur->MusicArtist); + if (*cur->MusicArtist) + { + // DebugMsg(L"cur->MusicArtist-0",cur->MusicArtist); + ret = 1; + } + } + + if (!(cur->dwFlags & RCIF_MUSICTIT)) + { + if (Ptr != lenName) + { + for (int i = 0, j = Ptr + 3; j < lenName && i < nSize; i++, j++) cur->MusicTitle[i] = Name[j]; + } + else + { + for (int i = 0; Name[i] && i < lenName && i < nSize; i++) cur->MusicTitle[i] = Name[i]; + } + //!!! память обнулена, cur->MusicTitle[i]=0 не делаем !!! + FSF.RTrim(cur->MusicTitle); + FSF.LTrim(cur->MusicTitle); + if (*cur->MusicTitle) + { + // DebugMsg(L"cur->MusicTitle-0",cur->MusicTitle); + ret = 1; + } + } + } + } END: - if (stream) pBASS_StreamFree(stream); + if (stream) + pBASS_StreamFree(stream); - return ret; + return ret; } - -int AdvCmpProc::GetPic(dupFile *cur, int GetInfo) +int AdvCmpProc::GetPic(dupFile* cur, int GetInfo) { - int ret=0; - - if (CheckForEsc()) - return ret; - - if (!(cur->dwFlags&RCIF_PIC)) - { - if (FSF.ProcessName(L"*.jpg,*.jpeg,*.jpe,*.jfif,*.jiff,*.jif,*.j,*.jng,*.jff",cur->fi.FileName,0,PN_CMPNAMELIST)) - cur->dwFlags|=(RCIF_PICJPG|RCIF_PIC); - else if (FSF.ProcessName(L"*.bmp,*.dib,*.rle",cur->fi.FileName,0,PN_CMPNAMELIST)) - cur->dwFlags|=(RCIF_PICBMP|RCIF_PIC); - else if (FSF.ProcessName(L"*.gif",cur->fi.FileName,0,PN_CMPNAME)) - cur->dwFlags|=(RCIF_PICGIF|RCIF_PIC); - else if (FSF.ProcessName(L"*.png",cur->fi.FileName,0,PN_CMPNAME)) - cur->dwFlags|=(RCIF_PICPNG|RCIF_PIC); - else if (FSF.ProcessName(L"*.tif,*.tiff",cur->fi.FileName,0,PN_CMPNAMELIST)) - cur->dwFlags|=(RCIF_PICTIF|RCIF_PIC); - else if (FSF.ProcessName(L"*.ico,*.icon,*.icn",cur->fi.FileName,0,PN_CMPNAMELIST)) - cur->dwFlags|=(RCIF_PICICO|RCIF_PIC); - else - return ret; - } - - if (GetInfo) - { - ShowDupMsg(GetPosToName(cur->fi.Dir),cur->fi.FileName,true); - - string strFullFileName; - GetFullFileName(strFullFileName,cur->fi.Dir,cur->fi.FileName); - - GFL_BITMAP *pBitmap=NULL; - GFL_LOAD_PARAMS load_params; - - pGflGetDefaultLoadParams(&load_params); - load_params.Flags|=GFL_LOAD_SKIP_ALPHA; - load_params.Origin=GFL_BOTTOM_LEFT; - load_params.LinePadding=4; - - GFL_ERROR res=pGflLoadBitmapW(strFullFileName.get(),&pBitmap,&load_params,NULL); - if (res) - { - cur->dwFlags|=RCIF_PICERR; - pBitmap=NULL; - load_params.Flags|=GFL_LOAD_IGNORE_READ_ERROR; - res=pGflLoadBitmapW(strFullFileName.get(),&pBitmap,&load_params,NULL); - if (res) - { - pBitmap=NULL; - CmpInfo.Errors++; - return ret; - } - } - - if (pBitmap) - { - if (pBitmap->Width<=0 || pBitmap->Height<=0) - { - cur->dwFlags|=RCIF_PICERR; - pGflFreeBitmap(pBitmap); - CmpInfo.Errors++; - return ret; - } - cur->PicWidth=pBitmap->Width; - cur->PicHeight=pBitmap->Height; - cur->PicPix=(unsigned char*)malloc(PIXELS_SIZE*PIXELS_SIZE*sizeof(unsigned char)); - if (cur->PicPix) - { - for (int i_x=0; i_xWidth/PIXELS_SIZE; - for (int i_y=0; i_yHeight/PIXELS_SIZE; - GFL_COLOR Color; - if (!pGflGetColorAt(pBitmap,b_x,b_y,&Color)) - { - float fGray=(Color.Red+Color.Green+Color.Blue)/3+0.5; - cur->PicPix[i_x*PIXELS_SIZE + i_y]=(unsigned char)fGray; - } - } - } - } - else - { - cur->dwFlags|=RCIF_PICERR; - pGflFreeBitmap(pBitmap); - CmpInfo.Errors++; - return ret; - } - pGflFreeBitmap(pBitmap); - ret=1; - } - } - return ret; + int ret = 0; + + if (CheckForEsc()) + return ret; + + if (!(cur->dwFlags & RCIF_PIC)) + { + if (FSF.ProcessName(L"*.jpg,*.jpeg,*.jpe,*.jfif,*.jiff,*.jif,*.j,*.jng,*.jff", cur->fi.FileName, 0, PN_CMPNAMELIST)) + cur->dwFlags |= (RCIF_PICJPG | RCIF_PIC); + else if (FSF.ProcessName(L"*.bmp,*.dib,*.rle", cur->fi.FileName, 0, PN_CMPNAMELIST)) + cur->dwFlags |= (RCIF_PICBMP | RCIF_PIC); + else if (FSF.ProcessName(L"*.gif", cur->fi.FileName, 0, PN_CMPNAME)) + cur->dwFlags |= (RCIF_PICGIF | RCIF_PIC); + else if (FSF.ProcessName(L"*.png", cur->fi.FileName, 0, PN_CMPNAME)) + cur->dwFlags |= (RCIF_PICPNG | RCIF_PIC); + else if (FSF.ProcessName(L"*.tif,*.tiff", cur->fi.FileName, 0, PN_CMPNAMELIST)) + cur->dwFlags |= (RCIF_PICTIF | RCIF_PIC); + else if (FSF.ProcessName(L"*.ico,*.icon,*.icn", cur->fi.FileName, 0, PN_CMPNAMELIST)) + cur->dwFlags |= (RCIF_PICICO | RCIF_PIC); + else + return ret; + } + + if (GetInfo) + { + ShowDupMsg(GetPosToName(cur->fi.Dir), cur->fi.FileName, true); + + string strFullFileName; + GetFullFileName(strFullFileName, cur->fi.Dir, cur->fi.FileName); + + GFL_BITMAP* pBitmap = NULL; + GFL_LOAD_PARAMS load_params; + + pGflGetDefaultLoadParams(&load_params); + load_params.Flags |= GFL_LOAD_SKIP_ALPHA; + load_params.Origin = GFL_BOTTOM_LEFT; + load_params.LinePadding = 4; + + GFL_ERROR res = pGflLoadBitmapW(strFullFileName.get(), &pBitmap, &load_params, NULL); + if (res) + { + cur->dwFlags |= RCIF_PICERR; + pBitmap = NULL; + load_params.Flags |= GFL_LOAD_IGNORE_READ_ERROR; + res = pGflLoadBitmapW(strFullFileName.get(), &pBitmap, &load_params, NULL); + if (res) + { + pBitmap = NULL; + CmpInfo.Errors++; + return ret; + } + } + + if (pBitmap) + { + if (pBitmap->Width <= 0 || pBitmap->Height <= 0) + { + cur->dwFlags |= RCIF_PICERR; + pGflFreeBitmap(pBitmap); + CmpInfo.Errors++; + return ret; + } + cur->PicWidth = pBitmap->Width; + cur->PicHeight = pBitmap->Height; + cur->PicPix = (unsigned char*) malloc(PIXELS_SIZE * PIXELS_SIZE * sizeof(unsigned char)); + if (cur->PicPix) + { + for (int i_x = 0; i_x < PIXELS_SIZE; i_x++) + { + int b_x = i_x * pBitmap->Width / PIXELS_SIZE; + for (int i_y = 0; i_y < PIXELS_SIZE; i_y++) + { + int b_y = i_y * pBitmap->Height / PIXELS_SIZE; + GFL_COLOR Color; + if (!pGflGetColorAt(pBitmap, b_x, b_y, &Color)) + { + float fGray = (Color.Red + Color.Green + Color.Blue) / 3 + 0.5; + cur->PicPix[i_x * PIXELS_SIZE + i_y] = (unsigned char) fGray; + } + } + } + } + else + { + cur->dwFlags |= RCIF_PICERR; + pGflFreeBitmap(pBitmap); + CmpInfo.Errors++; + return ret; + } + pGflFreeBitmap(pBitmap); + ret = 1; + } + } + return ret; } -bool CmpNameEx(const wchar_t *FileName1, const wchar_t *FileName2) +bool CmpNameEx(const wchar_t* FileName1, const wchar_t* FileName2) { - bool ret=false; - // определим указатель на расширение файла - wchar_t *p1=(wchar_t *)FileName1, *p2=(wchar_t *)FileName2; - while (*p1++) ; - wchar_t *pEnd1=p1-1; - while (--p1 != FileName1 && *p1 != L'.') ; - while (*p2++) ; - wchar_t *pEnd2=p2-1; - while (--p2 != FileName2 && *p2 != L'.') ; - - int lenName1=(*p1== L'.'?p1-FileName1:pEnd1-FileName1); - int lenName2=(*p2== L'.'?p2-FileName2:pEnd2-FileName2); - // если есть только расширение - if (!lenName1 && !lenName2) return true; - if (!lenName1 || !lenName2) return false; - // если нет расширения - if (*p1 != L'.') p1=pEnd1; - if (*p2 != L'.') p2=pEnd2; - - wchar_t *Name1=(wchar_t *)malloc((lenName1+1)*sizeof(wchar_t)); - wchar_t *Name2=(wchar_t *)malloc((lenName2+1)*sizeof(wchar_t)); - - if (Name1 && Name2) - { - wchar_t *s1=(wchar_t *)FileName1, *s2=(wchar_t *)FileName2; - wchar_t *ss1=Name1, *ss2=Name2; - while (s1!=p1) - { - if (FSF.LIsAlpha(*s1)) *ss1++ = *s1++; - else s1++; - } - while (s2!=p2) - { - if (FSF.LIsAlpha(*s2)) *ss2++ = *s2++; - else s2++; - } - unsigned Len1=ss1-Name1; - unsigned Len2=ss2-Name2; - if (Len1<=Len2 && Len1>(Len2>>1)) - { - for (unsigned l=0;l (Len2 >> 1)) + { + for (unsigned l = 0; l < Len2; l++) + { + if (!FSF.LStrnicmp(Name2 + l, Name1, Len1)) + { + ret = true; + break; + } + } + } + } + if (Name1) + free(Name1); + if (Name2) + free(Name2); + + return ret; } -int AdvCmpProc::Duplicate(const struct DirList *pList) +int AdvCmpProc::Duplicate(const struct DirList* pList) { - int ret=0; - - if (!Opt.DupName && !Opt.DupSize && !Opt.DupContents) - goto END; - - bBrokenByEsc=false; - bStartMsg=true; - bAskLReadOnly=bAskRReadOnly=GetFarSetting(FSSF_CONFIRMATIONS,L"RO")?true:false; - bAskDel=GetFarSetting(FSSF_CONFIRMATIONS,L"Delete")?true:false; - bSkipLReadOnly=bSkipRReadOnly=false; - DWORD dwTicks=GetTickCount(); - - if (Opt.ProcessSelected) - { - for (int i=0; iItemsNumber; i++) - { - if (pList->PPI[i].Flags&PPIF_SELECTED) - { - if (pList->PPI[i].FileAttributes&FILE_ATTRIBUTE_DIRECTORY) - { - string strDir; - GetFullFileName(strDir,pList->Dir,pList->PPI[i].FileName); - ret=ScanDir(strDir.get(),0); - } - else - { - if (Opt.Filter && !Info.FileFilterControl(Opt.hCustomFilter,FFCTL_ISFILEINFILTER,0,&pList->PPI[i])) - continue; - - CmpInfo.Count+=1; - CmpInfo.CountSize+=pList->PPI[i].FileSize; - ShowDupMsg((LPanel.PInfo.Flags&PFLAGS_FOCUS?LPanel.Dir:RPanel.Dir),L"*",false); - ret=MakeFileList(pList->Dir,&pList->PPI[i]); - } - if (!ret) break; - } - } - } - else - { - if (!(ret=ScanDir(pList->Dir,0))) - goto END; - - wchar_t **ListPath=NULL; - int NumPath=GetArgv(Opt.DupPath, &ListPath); - if (NumPath) - { - for (int i=0; iDir),GetPosToName(ListPath[i]))) - { - int size=FSF.ConvertPath(CPM_NATIVE,ListPath[i],0,0); - wchar_t *Dir=(wchar_t*)malloc(size*sizeof(wchar_t)); - if (Dir) - { - FSF.ConvertPath(CPM_NATIVE,ListPath[i],Dir,size); - if (GetFileAttributesW(Dir)==FILE_ATTRIBUTE_DIRECTORY) - ret=ScanDir(Dir,0); - free(Dir); - } - } - if (!ret) break; - } - } - for (int i=0; iDir),L"*",false); - dupFile *cur=&dFList.F[i]; - // предпроход для сбора первичной инфы о композиции. для ускорения поиска дублей! - if (Opt.DupMusic) - GetMp3(cur,0); - // а теперь предпроход для рисунков - if (Opt.DupPic) - GetPic(cur,0); - } - } - - // ищем дубли, первый проход - ускоренный - if (Opt.DupName || Opt.DupSize || (Opt.DupContents && !Opt.DupPic)) - { - for (int i=0, IndexGroup=1; iDir),L"*",false); - if (CheckForEsc()) - break; - bool bSetGroupItems=false; - - for (int j=0; jnDupGroup) - { - if (Opt.DupName) - { - if (Opt.DupName==2) - { - if (!CmpNameEx(src->fi.FileName,cur->fi.FileName)) - continue; // разные, сразу переходим к следующему - } - else - { - if (FSF.LStricmp(src->fi.FileName,cur->fi.FileName)) - continue; // разные, сразу переходим к следующему - } - } - if (Opt.DupSize) - { - if (src->fi.nFileSize!=cur->fi.nFileSize) - continue; // разные, сразу переходим к следующему - } - if (Opt.DupContents && !Opt.DupPic && !Opt.DupMusic) - { - if (src->fi.nFileSize!=cur->fi.nFileSize) - continue; // разные, сразу переходим к следующему - } - if (Opt.DupContents && !Opt.DupPic && Opt.DupMusic) - { - if ((src->dwFlags&RCIF_MUSIC) && (cur->dwFlags&RCIF_MUSIC)) - { - if (src->MusicTime!=cur->MusicTime) - continue; - } - else - { - continue; // разные, сразу переходим к следующему - } - } - bSetGroupItems=true; - src->nDupGroup=IndexGroup; - src->dwFlags|=RCIF_EQUAL; - cur->nDupGroup=IndexGroup; - cur->dwFlags|=RCIF_EQUAL; -/* - if (Opt.StopDiffDup) - { - bCompareAll=!YesNoMsg(MFirstDiffTitle, MFirstDiffBody); - Opt.StopDiffDup=0; - } -*/ -//DebugMsg(cur->FileName,src->FileName,IndexGroup); - } - } - if (bSetGroupItems) // есть группа - { - dFList.GroupItems=IndexGroup; - IndexGroup++; - } - if (!Opt.DupContents) // там свой индикатор! - { - CmpInfo.ProcSize+=dFList.F[i].fi.nFileSize; - CmpInfo.Proc=i+1; - } - } - } - - if (Opt.DupContents) - { - // собираем инф-цию - for (int i=0; inDupGroup=0; // скинем, проверять будем флаг RCIF_EQUAL - - ShowDupMsg(GetPosToName(cur->fi.Dir),cur->fi.FileName,false); -/* -if (cur->dwFlags&RCIF_EQUAL) - DebugMsg(cur->FileName,L"RCIF_EQUAL",i); -else - DebugMsg(cur->FileName,L"RCIF_DIFF",i); -*/ - if ((Opt.DupName || Opt.DupSize || (Opt.DupContents && !Opt.DupPic && !Opt.DupMusic)) && !(cur->dwFlags&RCIF_EQUAL)) - { -//DebugMsg(cur->FileName,L"tut1",i); - CmpInfo.ProcSize+=cur->fi.nFileSize; - CmpInfo.Proc=i+1; - continue; // обрабатывали, переходим к следующему - } - if (cur->fi.nFileSize==0) - { - CmpInfo.Proc=i+1; - continue; // пустой, переходим к следующему - } - if (Opt.DupPic && bGflLoaded && GetPic(cur,1)) - { - CmpInfo.ProcSize+=cur->fi.nFileSize; - CmpInfo.Proc=i+1; - continue; // обработали, переходим к следующему - } - if (Opt.DupMusic && (cur->dwFlags&RCIF_MUSIC) && (cur->dwFlags&RCIF_EQUAL) && !(Opt.DupMusicArtist || Opt.DupMusicTitle) && GetMp3(cur,3)) // анализируем поток - { -//DebugMsg(cur->FileName,L"tut2",i); - CmpInfo.ProcSize+=cur->fi.nFileSize; - CmpInfo.Proc=i+1; - continue; // обработали, переходим к следующему - } - if (Opt.DupMusic && (cur->dwFlags&RCIF_MUSIC) && (Opt.DupMusicArtist || Opt.DupMusicTitle) && GetMp3(cur,2)) // теги - { - CmpInfo.ProcSize+=cur->fi.nFileSize; - CmpInfo.Proc=i+1; - continue; // обработали, переходим к следующему - } - if (Opt.DupContents && !(Opt.DupPic==1 || Opt.DupMusic==1) && !cur->dwCRC) - { - cur->dwCRC=GetCRC(cur); - CmpInfo.Proc=i+1; - continue; // обработали, переходим к следующему - } - CmpInfo.ProcSize+=cur->fi.nFileSize; - CmpInfo.Proc=i+1; - } - - // обрабатываем, ищем дубли - for (int i=0, IndexGroup=1; ifi.Dir),src->fi.FileName,false); - - if (!cur->nDupGroup) - { - if ((Opt.DupName || Opt.DupSize || (Opt.DupContents && !Opt.DupPic && !Opt.DupMusic)) && !(cur->dwFlags&RCIF_EQUAL)) - continue; // обрабатывали -они разные, переходим к следующему - - if (Opt.DupPic && (src->dwFlags&RCIF_PIC) && (cur->dwFlags&RCIF_PIC)) - { - if (Opt.DupPicSize) - { - if (src->PicWidth!=cur->PicWidth || src->PicHeight!=cur->PicHeight) - continue; // разные, сразу переходим к следующему - } - if (Opt.DupPicFmt) - { - if (!((src->dwFlags&RCIF_PICJPG && cur->dwFlags&RCIF_PICJPG) || - (src->dwFlags&RCIF_PICBMP && cur->dwFlags&RCIF_PICBMP) || - (src->dwFlags&RCIF_PICGIF && cur->dwFlags&RCIF_PICGIF) || - (src->dwFlags&RCIF_PICPNG && cur->dwFlags&RCIF_PICPNG) || - (src->dwFlags&RCIF_PICTIF && cur->dwFlags&RCIF_PICTIF) || - (src->dwFlags&RCIF_PICTIF && cur->dwFlags&RCIF_PICICO)) ) - { - continue; - } - } - // сравнивалка картинок - // Yermalayeu Ihar, Minsk, Belarus, 2002-2009 - { - int nCmpDiff = Opt.DupPicDiff*8; - int nMaxFastSum = PIXELS_SIZE*nCmpDiff*nCmpDiff; - int nMaxSlowSum = PIXELS_SIZE*PIXELS_SIZE*nCmpDiff*nCmpDiff; - - int nRatioDiff = (cur->PicWidth>cur->PicHeight?(cur->PicHeight*PIXELS_SIZE/cur->PicWidth-PIXELS_SIZE):(cur->PicWidth*PIXELS_SIZE/cur->PicHeight-PIXELS_SIZE)) - - (src->PicWidth>src->PicHeight?(src->PicHeight*PIXELS_SIZE/src->PicWidth-PIXELS_SIZE):(src->PicWidth*PIXELS_SIZE/src->PicHeight-PIXELS_SIZE)); - - int nMaxRatDiff = Opt.DupPicDiff; - - if (nRatioDiff>nMaxRatDiff || nRatioDiff<-nMaxRatDiff) - continue; - - int nDiff, nPix, nSum = 0; - unsigned char *pCPix = cur->PicPix, - *pSPix = src->PicPix; - - for (int i_f=0; i_fnMaxFastSum) - continue; - - for (int i_f = PIXELS_SIZE*PIXELS_SIZE - 1; i_f >= 0; i_f--) - { - nDiff = pCPix[i_f] - pSPix[i_f]; - nSum += nDiff*nDiff; - } - if (nSum>nMaxSlowSum) - continue; - } - } - else if (Opt.DupMusic && (src->dwFlags&RCIF_MUSIC) && (cur->dwFlags&RCIF_MUSIC)) - { - if (Opt.DupMusicDuration) - { - int nDiff=(src->MusicTime>=cur->MusicTime?src->MusicTime-cur->MusicTime:cur->MusicTime-src->MusicTime); - if (nDiff>Opt.DupMusicDurationSec) - continue; - } - if (Opt.DupMusicArtist) - { - if (!src->MusicArtist || !(*src->MusicArtist) || !cur->MusicArtist || !(*cur->MusicArtist)) - continue; - - if (Opt.DupMusicArtist==2) - { - unsigned LenS=wcslen(src->MusicArtist); - unsigned LenC=wcslen(cur->MusicArtist); - int r=1; - if (LenS<=LenC) - { - for (unsigned l=0;lMusicArtist+l,src->MusicArtist,LenS); - if (r==0) - break; - } - } - if (r) - continue; - } - else - { - if (FSF.LStricmp(cur->MusicArtist,src->MusicArtist)) - continue; - } - } - if (Opt.DupMusicTitle) - { - if (!src->MusicTitle || !(*src->MusicTitle) || !cur->MusicTitle || !(*cur->MusicTitle)) - continue; - - if (Opt.DupMusicTitle==2) - { - unsigned LenS=wcslen(src->MusicTitle); - unsigned LenC=wcslen(cur->MusicTitle); - int r=1; - if (LenS<=LenC) - { - for (unsigned l=0;lMusicTitle+l,src->MusicTitle,LenS); - if (r==0) - break; - } - } - if (r) - continue; - } - else - { - if (FSF.LStricmp(cur->MusicTitle,src->MusicTitle)) - continue; - } - } - if ((!src->dwCRC || !cur->dwCRC || src->dwCRC!=cur->dwCRC)) // CRC аудиопотока - continue; - } - else - { - if (src->fi.nFileSize!=cur->fi.nFileSize) - continue; - if (src->fi.nFileSize && cur->fi.nFileSize && (!src->dwCRC || !cur->dwCRC || src->dwCRC!=cur->dwCRC)) - continue; - } - bSetGroupItems=true; - src->nDupGroup=IndexGroup; - cur->nDupGroup=IndexGroup; - } - } - if (bSetGroupItems) - { - dFList.GroupItems=IndexGroup; - IndexGroup++; - } - } - } - - if (bBrokenByEsc) - goto END; - - // освободимся от уникальных - FSF.qsort(dFList.F,dFList.iCount,sizeof(dFList.F[0]),dupSortListByGroup, NULL); - int Index; - for (Index=dFList.iCount-1; Index>=0 && !dFList.F[Index].nDupGroup; Index--) - { - free(dFList.F[Index].fi.FileName); - dFList.F[Index].fi.FileName=NULL; - free(dFList.F[Index].fi.Dir); - dFList.F[Index].fi.Dir=NULL; - free(dFList.F[Index].PicPix); - dFList.F[Index].PicPix=NULL; - free(dFList.F[Index].MusicArtist); - dFList.F[Index].MusicArtist=NULL; - free(dFList.F[Index].MusicTitle); - dFList.F[Index].MusicTitle=NULL; - } - - dFList.F=(dupFile*)realloc(dFList.F,(dFList.iCount=Index+1)*sizeof(dupFile)); - - if (hConInp!=INVALID_HANDLE_VALUE) CloseHandle(hConInp); - Info.PanelControl(LPanel.hPanel,FCTL_REDRAWPANEL,0,0); - Info.PanelControl(RPanel.hPanel,FCTL_REDRAWPANEL,0,0); - if (TitleSaved) SetConsoleTitle(strFarTitle); - - ShowDupDialog(); - - CmpInfo.Proc=0; - CmpInfo.ProcSize=0; - if (Opt.Dup==QR_ALL) - { - for (int i=0; idwFlags&RCIF_USERDEL) - { - string strName; - GetFullFileName(strName,cur->fi.Dir,cur->fi.FileName); - if (!(ret=DelFile(strName.get()))) - break; - } - } - - if (ret && !bBrokenByEsc) - { - if (Opt.Sound && (GetTickCount()-dwTicks > 30000)) MessageBeep(MB_ICONASTERISK); - Info.AdvControl(&MainGuid,ACTL_PROGRESSNOTIFY,0,0); - } - if (!bBrokenByEsc) - { - if (CmpInfo.Errors && Opt.ShowMsg) ErrorMsg(MOpenErrorTitle,MOpenErrorBody); - if (Opt.ShowMsg) - { - wchar_t buf[80], size[10]; - FSF.FormatFileSize(CmpInfo.ProcSize,7,FFFS_FLOATSIZE|FFFS_SHOWBYTESINDEX|FFFS_ECONOMIC,size,8); - FSF.sprintf(buf,GetMsg(MDupDelItems), size, CmpInfo.Proc); - const wchar_t *MsgItems[] = { GetMsg(MDupTitle), buf, GetMsg(MOK) }; - Info.Message(&MainGuid,&DupDelItemsMsgGuid,0,0,MsgItems,sizeof(MsgItems) / sizeof(MsgItems[0]),1); - } - } - } - if (Opt.Dup==QR_ALL || Opt.Dup==QR_SKIP) - { - Info.PanelControl(LPanel.hPanel,FCTL_UPDATEPANEL,0,0); - Info.PanelControl(RPanel.hPanel,FCTL_UPDATEPANEL,0,0); - } + int ret = 0; + + if (!Opt.DupName && !Opt.DupSize && !Opt.DupContents) + goto END; + + bBrokenByEsc = false; + bStartMsg = true; + bAskLReadOnly = bAskRReadOnly = GetFarSetting(FSSF_CONFIRMATIONS, L"RO") ? true : false; + bAskDel = GetFarSetting(FSSF_CONFIRMATIONS, L"Delete") ? true : false; + bSkipLReadOnly = bSkipRReadOnly = false; + DWORD dwTicks = GetTickCount(); + + if (Opt.ProcessSelected) + { + for (int i = 0; i < pList->ItemsNumber; i++) + { + if (pList->PPI[i].Flags & PPIF_SELECTED) + { + if (pList->PPI[i].FileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + string strDir; + GetFullFileName(strDir, pList->Dir, pList->PPI[i].FileName); + ret = ScanDir(strDir.get(), 0); + } + else + { + if (Opt.Filter && !Info.FileFilterControl(Opt.hCustomFilter, FFCTL_ISFILEINFILTER, 0, &pList->PPI[i])) + continue; + + CmpInfo.Count += 1; + CmpInfo.CountSize += pList->PPI[i].FileSize; + ShowDupMsg((LPanel.PInfo.Flags & PFLAGS_FOCUS ? LPanel.Dir : RPanel.Dir), L"*", false); + ret = MakeFileList(pList->Dir, &pList->PPI[i]); + } + if (!ret) + break; + } + } + } + else + { + if (!(ret = ScanDir(pList->Dir, 0))) + goto END; + + wchar_t** ListPath = NULL; + int NumPath = GetArgv(Opt.DupPath, &ListPath); + if (NumPath) + { + for (int i = 0; i < NumPath; i++) + { + if (FSF.LStricmp(GetPosToName(pList->Dir), GetPosToName(ListPath[i]))) + { + int size = FSF.ConvertPath(CPM_NATIVE, ListPath[i], 0, 0); + wchar_t* Dir = (wchar_t*) malloc(size * sizeof(wchar_t)); + if (Dir) + { + FSF.ConvertPath(CPM_NATIVE, ListPath[i], Dir, size); + if (GetFileAttributesW(Dir) == FILE_ATTRIBUTE_DIRECTORY) + ret = ScanDir(Dir, 0); + free(Dir); + } + } + if (!ret) + break; + } + } + for (int i = 0; i < NumPath; i++) free(ListPath[i]); + free(ListPath); + } + + if (!ret) + goto END; + + FSF.qsort(dFList.F, dFList.iCount, sizeof(dFList.F[0]), dupSortListByName, NULL); + + if (Opt.DupContents) + { + if ((Opt.DupMusic && bBASSLoaded) || (Opt.DupPic && bGflLoaded)) + for (int i = 0; i < dFList.iCount && !bBrokenByEsc; i++) + { + ShowDupMsg(GetPosToName(pList->Dir), L"*", false); + dupFile* cur = &dFList.F[i]; + // предпроход для сбора первичной инфы о композиции. для ускорения поиска дублей! + if (Opt.DupMusic) + GetMp3(cur, 0); + // а теперь предпроход для рисунков + if (Opt.DupPic) + GetPic(cur, 0); + } + } + + // ищем дубли, первый проход - ускоренный + if (Opt.DupName || Opt.DupSize || (Opt.DupContents && !Opt.DupPic)) + { + for (int i = 0, IndexGroup = 1; i < dFList.iCount && !bBrokenByEsc; i++) + { + ShowDupMsg(GetPosToName(pList->Dir), L"*", false); + if (CheckForEsc()) + break; + bool bSetGroupItems = false; + + for (int j = 0; j < dFList.iCount && !bBrokenByEsc; j++) + { + if (j == i) + continue; + dupFile* src = &dFList.F[i]; + dupFile* cur = &dFList.F[j]; + if (!cur->nDupGroup) + { + if (Opt.DupName) + { + if (Opt.DupName == 2) + { + if (!CmpNameEx(src->fi.FileName, cur->fi.FileName)) + continue; // разные, сразу переходим к следующему + } + else + { + if (FSF.LStricmp(src->fi.FileName, cur->fi.FileName)) + continue; // разные, сразу переходим к следующему + } + } + if (Opt.DupSize) + { + if (src->fi.nFileSize != cur->fi.nFileSize) + continue; // разные, сразу переходим к следующему + } + if (Opt.DupContents && !Opt.DupPic && !Opt.DupMusic) + { + if (src->fi.nFileSize != cur->fi.nFileSize) + continue; // разные, сразу переходим к следующему + } + if (Opt.DupContents && !Opt.DupPic && Opt.DupMusic) + { + if ((src->dwFlags & RCIF_MUSIC) && (cur->dwFlags & RCIF_MUSIC)) + { + if (src->MusicTime != cur->MusicTime) + continue; + } + else + { + continue; // разные, сразу переходим к следующему + } + } + bSetGroupItems = true; + src->nDupGroup = IndexGroup; + src->dwFlags |= RCIF_EQUAL; + cur->nDupGroup = IndexGroup; + cur->dwFlags |= RCIF_EQUAL; + /* + if (Opt.StopDiffDup) + { + bCompareAll=!YesNoMsg(MFirstDiffTitle, MFirstDiffBody); + Opt.StopDiffDup=0; + } + */ + // DebugMsg(cur->FileName,src->FileName,IndexGroup); + } + } + if (bSetGroupItems) // есть группа + { + dFList.GroupItems = IndexGroup; + IndexGroup++; + } + if (!Opt.DupContents) // там свой индикатор! + { + CmpInfo.ProcSize += dFList.F[i].fi.nFileSize; + CmpInfo.Proc = i + 1; + } + } + } + + if (Opt.DupContents) + { + // собираем инф-цию + for (int i = 0; i < dFList.iCount && !bBrokenByEsc; i++) + { + if (CheckForEsc()) + break; + dupFile* cur = &dFList.F[i]; + cur->nDupGroup = 0; // скинем, проверять будем флаг RCIF_EQUAL + + ShowDupMsg(GetPosToName(cur->fi.Dir), cur->fi.FileName, false); + /* + if (cur->dwFlags&RCIF_EQUAL) + DebugMsg(cur->FileName,L"RCIF_EQUAL",i); + else + DebugMsg(cur->FileName,L"RCIF_DIFF",i); + */ + if ((Opt.DupName || Opt.DupSize || (Opt.DupContents && !Opt.DupPic && !Opt.DupMusic)) && !(cur->dwFlags & RCIF_EQUAL)) + { + // DebugMsg(cur->FileName,L"tut1",i); + CmpInfo.ProcSize += cur->fi.nFileSize; + CmpInfo.Proc = i + 1; + continue; // обрабатывали, переходим к следующему + } + if (cur->fi.nFileSize == 0) + { + CmpInfo.Proc = i + 1; + continue; // пустой, переходим к следующему + } + if (Opt.DupPic && bGflLoaded && GetPic(cur, 1)) + { + CmpInfo.ProcSize += cur->fi.nFileSize; + CmpInfo.Proc = i + 1; + continue; // обработали, переходим к следующему + } + if (Opt.DupMusic && (cur->dwFlags & RCIF_MUSIC) && (cur->dwFlags & RCIF_EQUAL) && !(Opt.DupMusicArtist || Opt.DupMusicTitle) && + GetMp3(cur, 3)) // анализируем поток + { + // DebugMsg(cur->FileName,L"tut2",i); + CmpInfo.ProcSize += cur->fi.nFileSize; + CmpInfo.Proc = i + 1; + continue; // обработали, переходим к следующему + } + if (Opt.DupMusic && (cur->dwFlags & RCIF_MUSIC) && (Opt.DupMusicArtist || Opt.DupMusicTitle) && GetMp3(cur, 2)) // теги + { + CmpInfo.ProcSize += cur->fi.nFileSize; + CmpInfo.Proc = i + 1; + continue; // обработали, переходим к следующему + } + if (Opt.DupContents && !(Opt.DupPic == 1 || Opt.DupMusic == 1) && !cur->dwCRC) + { + cur->dwCRC = GetCRC(cur); + CmpInfo.Proc = i + 1; + continue; // обработали, переходим к следующему + } + CmpInfo.ProcSize += cur->fi.nFileSize; + CmpInfo.Proc = i + 1; + } + + // обрабатываем, ищем дубли + for (int i = 0, IndexGroup = 1; i < dFList.iCount && !bBrokenByEsc; i++) + { + if (CheckForEsc()) + break; + bool bSetGroupItems = false; + + for (int j = 0; j < dFList.iCount && !bBrokenByEsc; j++) + { + if (j == i) + continue; + dupFile* src = &dFList.F[i]; + dupFile* cur = &dFList.F[j]; + + ShowDupMsg(GetPosToName(src->fi.Dir), src->fi.FileName, false); + + if (!cur->nDupGroup) + { + if ((Opt.DupName || Opt.DupSize || (Opt.DupContents && !Opt.DupPic && !Opt.DupMusic)) && !(cur->dwFlags & RCIF_EQUAL)) + continue; // обрабатывали -они разные, переходим к следующему + + if (Opt.DupPic && (src->dwFlags & RCIF_PIC) && (cur->dwFlags & RCIF_PIC)) + { + if (Opt.DupPicSize) + { + if (src->PicWidth != cur->PicWidth || src->PicHeight != cur->PicHeight) + continue; // разные, сразу переходим к следующему + } + if (Opt.DupPicFmt) + { + if (!((src->dwFlags & RCIF_PICJPG && cur->dwFlags & RCIF_PICJPG) || (src->dwFlags & RCIF_PICBMP && cur->dwFlags & RCIF_PICBMP) || + (src->dwFlags & RCIF_PICGIF && cur->dwFlags & RCIF_PICGIF) || (src->dwFlags & RCIF_PICPNG && cur->dwFlags & RCIF_PICPNG) || + (src->dwFlags & RCIF_PICTIF && cur->dwFlags & RCIF_PICTIF) || (src->dwFlags & RCIF_PICTIF && cur->dwFlags & RCIF_PICICO))) + { + continue; + } + } + // сравнивалка картинок + // Yermalayeu Ihar, Minsk, Belarus, 2002-2009 + { + int nCmpDiff = Opt.DupPicDiff * 8; + int nMaxFastSum = PIXELS_SIZE * nCmpDiff * nCmpDiff; + int nMaxSlowSum = PIXELS_SIZE * PIXELS_SIZE * nCmpDiff * nCmpDiff; + + int nRatioDiff = (cur->PicWidth > cur->PicHeight ? (cur->PicHeight * PIXELS_SIZE / cur->PicWidth - PIXELS_SIZE) + : (cur->PicWidth * PIXELS_SIZE / cur->PicHeight - PIXELS_SIZE)) - + (src->PicWidth > src->PicHeight ? (src->PicHeight * PIXELS_SIZE / src->PicWidth - PIXELS_SIZE) + : (src->PicWidth * PIXELS_SIZE / src->PicHeight - PIXELS_SIZE)); + + int nMaxRatDiff = Opt.DupPicDiff; + + if (nRatioDiff > nMaxRatDiff || nRatioDiff < -nMaxRatDiff) + continue; + + int nDiff, nPix, nSum = 0; + unsigned char *pCPix = cur->PicPix, *pSPix = src->PicPix; + + for (int i_f = 0; i_f < PIXELS_SIZE; i_f += 4) + { + nPix = i_f * PIXELS_SIZE + i_f; + nDiff = pCPix[nPix] - pSPix[nPix]; + nSum += nDiff * nDiff; + nPix = i_f * PIXELS_SIZE + PIXELS_SIZE - i_f; + nDiff = pCPix[nPix] - pSPix[nPix]; + nSum += nDiff * nDiff; + } + if (nSum > nMaxFastSum) + continue; + + for (int i_f = PIXELS_SIZE * PIXELS_SIZE - 1; i_f >= 0; i_f--) + { + nDiff = pCPix[i_f] - pSPix[i_f]; + nSum += nDiff * nDiff; + } + if (nSum > nMaxSlowSum) + continue; + } + } + else if (Opt.DupMusic && (src->dwFlags & RCIF_MUSIC) && (cur->dwFlags & RCIF_MUSIC)) + { + if (Opt.DupMusicDuration) + { + int nDiff = (src->MusicTime >= cur->MusicTime ? src->MusicTime - cur->MusicTime : cur->MusicTime - src->MusicTime); + if (nDiff > Opt.DupMusicDurationSec) + continue; + } + if (Opt.DupMusicArtist) + { + if (!src->MusicArtist || !(*src->MusicArtist) || !cur->MusicArtist || !(*cur->MusicArtist)) + continue; + + if (Opt.DupMusicArtist == 2) + { + unsigned LenS = wcslen(src->MusicArtist); + unsigned LenC = wcslen(cur->MusicArtist); + int r = 1; + if (LenS <= LenC) + { + for (unsigned l = 0; l < LenC; l++) + { + r = FSF.LStrnicmp(cur->MusicArtist + l, src->MusicArtist, LenS); + if (r == 0) + break; + } + } + if (r) + continue; + } + else + { + if (FSF.LStricmp(cur->MusicArtist, src->MusicArtist)) + continue; + } + } + if (Opt.DupMusicTitle) + { + if (!src->MusicTitle || !(*src->MusicTitle) || !cur->MusicTitle || !(*cur->MusicTitle)) + continue; + + if (Opt.DupMusicTitle == 2) + { + unsigned LenS = wcslen(src->MusicTitle); + unsigned LenC = wcslen(cur->MusicTitle); + int r = 1; + if (LenS <= LenC) + { + for (unsigned l = 0; l < LenC; l++) + { + r = FSF.LStrnicmp(cur->MusicTitle + l, src->MusicTitle, LenS); + if (r == 0) + break; + } + } + if (r) + continue; + } + else + { + if (FSF.LStricmp(cur->MusicTitle, src->MusicTitle)) + continue; + } + } + if ((!src->dwCRC || !cur->dwCRC || src->dwCRC != cur->dwCRC)) // CRC аудиопотока + continue; + } + else + { + if (src->fi.nFileSize != cur->fi.nFileSize) + continue; + if (src->fi.nFileSize && cur->fi.nFileSize && (!src->dwCRC || !cur->dwCRC || src->dwCRC != cur->dwCRC)) + continue; + } + bSetGroupItems = true; + src->nDupGroup = IndexGroup; + cur->nDupGroup = IndexGroup; + } + } + if (bSetGroupItems) + { + dFList.GroupItems = IndexGroup; + IndexGroup++; + } + } + } + + if (bBrokenByEsc) + goto END; + + // освободимся от уникальных + FSF.qsort(dFList.F, dFList.iCount, sizeof(dFList.F[0]), dupSortListByGroup, NULL); + int Index; + for (Index = dFList.iCount - 1; Index >= 0 && !dFList.F[Index].nDupGroup; Index--) + { + free(dFList.F[Index].fi.FileName); + dFList.F[Index].fi.FileName = NULL; + free(dFList.F[Index].fi.Dir); + dFList.F[Index].fi.Dir = NULL; + free(dFList.F[Index].PicPix); + dFList.F[Index].PicPix = NULL; + free(dFList.F[Index].MusicArtist); + dFList.F[Index].MusicArtist = NULL; + free(dFList.F[Index].MusicTitle); + dFList.F[Index].MusicTitle = NULL; + } + + dFList.F = (dupFile*) realloc(dFList.F, (dFList.iCount = Index + 1) * sizeof(dupFile)); + + if (hConInp != INVALID_HANDLE_VALUE) + CloseHandle(hConInp); + Info.PanelControl(LPanel.hPanel, FCTL_REDRAWPANEL, 0, 0); + Info.PanelControl(RPanel.hPanel, FCTL_REDRAWPANEL, 0, 0); + if (TitleSaved) + SetConsoleTitle(strFarTitle); + + ShowDupDialog(); + + CmpInfo.Proc = 0; + CmpInfo.ProcSize = 0; + if (Opt.Dup == QR_ALL) + { + for (int i = 0; i < dFList.iCount; i++) + { + dupFile* cur = &dFList.F[i]; + if (cur->dwFlags & RCIF_USERDEL) + { + string strName; + GetFullFileName(strName, cur->fi.Dir, cur->fi.FileName); + if (!(ret = DelFile(strName.get()))) + break; + } + } + + if (ret && !bBrokenByEsc) + { + if (Opt.Sound && (GetTickCount() - dwTicks > 30000)) + MessageBeep(MB_ICONASTERISK); + Info.AdvControl(&MainGuid, ACTL_PROGRESSNOTIFY, 0, 0); + } + if (!bBrokenByEsc) + { + if (CmpInfo.Errors && Opt.ShowMsg) + ErrorMsg(MOpenErrorTitle, MOpenErrorBody); + if (Opt.ShowMsg) + { + wchar_t buf[80], size[10]; + FSF.FormatFileSize(CmpInfo.ProcSize, 7, FFFS_FLOATSIZE | FFFS_SHOWBYTESINDEX | FFFS_ECONOMIC, size, 8); + FSF.sprintf(buf, GetMsg(MDupDelItems), size, CmpInfo.Proc); + const wchar_t* MsgItems[] = {GetMsg(MDupTitle), buf, GetMsg(MOK)}; + Info.Message(&MainGuid, &DupDelItemsMsgGuid, 0, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 1); + } + } + } + if (Opt.Dup == QR_ALL || Opt.Dup == QR_SKIP) + { + Info.PanelControl(LPanel.hPanel, FCTL_UPDATEPANEL, 0, 0); + Info.PanelControl(RPanel.hPanel, FCTL_UPDATEPANEL, 0, 0); + } END: - if (hConInp!=INVALID_HANDLE_VALUE) CloseHandle(hConInp); - return ret; + if (hConInp != INVALID_HANDLE_VALUE) + CloseHandle(hConInp); + return ret; } diff --git a/src/AdvCmpProc_SYNC.cpp b/src/AdvCmpProc_SYNC.cpp index 1faf745..fc32b3c 100644 --- a/src/AdvCmpProc_SYNC.cpp +++ b/src/AdvCmpProc_SYNC.cpp @@ -38,904 +38,897 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /*************************************************************************** * Узнаем опции синхронизации ***************************************************************************/ -int GetSyncOpt(cmpFileList *pFileList) +int GetSyncOpt(cmpFileList* pFileList) { - int ret=QR_EDIT; // продолжаем редактировать список - int ItemsLNew=0, ItemsRNew=0, ItemsRDel=0; - - for (int i=0; iiCount; i++) - { - cmpFile *cur=&pFileList->F[i]; - - if ((cur->L.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) && (cur->R.dwAttributes&FILE_ATTRIBUTE_DIRECTORY)) - continue; - if ( ((cur->dwFlags&RCIF_USERSELECT) && !Opt.ShowListSelect) || ((cur->dwFlags&RCIF_DIFFER) && !Opt.ShowListDifferent) || - ((cur->dwFlags&RCIF_LNEW) && !Opt.ShowListLNew) || ((cur->dwFlags&RCIF_RNEW) && !Opt.ShowListRNew) ) - continue; - if ((cur->dwFlags&RCIF_EQUAL) || ((cur->dwFlags&RCIF_DIFFER) && !(cur->dwFlags&(RCIF_USERLNEW|RCIF_USERRNEW))) || (cur->dwFlags&RCIF_USERNONE)) - continue; - if ((cur->dwFlags&RCIF_USERLNEW) || (cur->dwFlags&RCIF_LNEW)) - { - ItemsLNew++; - continue; - } - if (cur->dwFlags&RCIF_USERDEL) - { - ItemsRDel++; - continue; - } - if (!Opt.SyncOnlyRight && ((cur->dwFlags&RCIF_USERRNEW) || (cur->dwFlags&RCIF_RNEW))) - { - ItemsRNew++; - } - } - - // нет элементов для синхронизации, выходим - if (!ItemsLNew && !ItemsRNew && !ItemsRDel) - { - if (Opt.ShowMsg) - { - const wchar_t *MsgItems[] = { GetMsg(MSyncTitle), GetMsg(MNoSyncBody), GetMsg(MOK) }; - Info.Message(&MainGuid,&NoSyncMsgGuid,0,0,MsgItems,sizeof(MsgItems) / sizeof(MsgItems[0]),1); - } - return ret=QR_SKIP; //нет элементов - } - - Opt.SyncLPanel=ItemsRNew, Opt.SyncRPanel=ItemsLNew, Opt.SyncDel=ItemsRDel; - - wchar_t buf1[80], buf2[80], buf3[80]; - FSF.sprintf(buf1,GetMsg(MSyncLPanel),ItemsRNew); - FSF.sprintf(buf2,GetMsg(MSyncRPanel),ItemsLNew); - FSF.sprintf(buf3,GetMsg(MSyncDel),ItemsRDel); - - struct FarDialogItem DialogItems[] = { - // Type X1 Y1 X2 Y2 Selected History Mask Flags Data MaxLen UserParam - /* 0*/{DI_DOUBLEBOX, 3, 1,60, 8, 0, 0, 0, 0, GetMsg(MSyncTitle),0,0}, - /* 1*/{DI_CHECKBOX, 5, 2, 0, 0, Opt.SyncRPanel, 0, 0,Opt.SyncRPanel?DIF_FOCUS:DIF_DISABLE,buf2,0,0}, - /* 2*/{DI_CHECKBOX, 5, 3, 0, 0, Opt.SyncLPanel, 0, 0,Opt.SyncLPanel?0:DIF_DISABLE,buf1,0,0}, - /* 3*/{DI_CHECKBOX, 5, 4, 0, 0, Opt.SyncDel, 0, 0, Opt.SyncDel?0:DIF_DISABLE,buf3,0,0}, - /* 4*/{DI_CHECKBOX, 8, 5, 0, 0, 0, 0, 0, Opt.SyncDel?0:DIF_DISABLE,GetMsg(MSyncUseDelFilter),0,0}, - /* 5*/{DI_TEXT, -1, 6, 0, 0, 0, 0, 0, DIF_SEPARATOR, L"",0,0}, - /* 6*/{DI_BUTTON, 0, 7, 0, 0, 0, 0, 0, DIF_DEFAULTBUTTON|DIF_CENTERGROUP, GetMsg(MOK),0,0}, - /* 7*/{DI_BUTTON, 0, 7, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MSyncEdit),0,0}, - /* 8*/{DI_BUTTON, 0, 7, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MCancel),0,0} - }; - - HANDLE hDlg=Info.DialogInit(&MainGuid, &OptSyncDlgGuid,-1,-1,64,10,L"DlgCmp",DialogItems,sizeof(DialogItems)/sizeof(DialogItems[0]),0,0,0,0); - - if (hDlg != INVALID_HANDLE_VALUE) - { - ret=(int)Info.DialogRun(hDlg); - if (ret==6) - { - Opt.SyncRPanel=Info.SendDlgMessage(hDlg,DM_GETCHECK,1,0); - Opt.SyncLPanel=Info.SendDlgMessage(hDlg,DM_GETCHECK,2,0); - Opt.SyncDel=Info.SendDlgMessage(hDlg,DM_GETCHECK,3,0); - Opt.SyncUseDelFilter=Info.SendDlgMessage(hDlg,DM_GETCHECK,4,0); - ret=(Opt.SyncLPanel || Opt.SyncRPanel || Opt.SyncDel)?QR_ALL:QR_SKIP; // синхронизируем, иначе - пропустим - } - else if (ret==7) - ret=QR_EDIT; - else - { - bBrokenByEsc=true; - ret=QR_ABORT; // отменили синхронизацию - } - Info.DialogFree(hDlg); - } - else - ret=QR_ABORT; - - return ret; + int ret = QR_EDIT; // продолжаем редактировать список + int ItemsLNew = 0, ItemsRNew = 0, ItemsRDel = 0; + + for (int i = 0; i < pFileList->iCount; i++) + { + cmpFile* cur = &pFileList->F[i]; + + if ((cur->L.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) && (cur->R.dwAttributes & FILE_ATTRIBUTE_DIRECTORY)) + continue; + if (((cur->dwFlags & RCIF_USERSELECT) && !Opt.ShowListSelect) || ((cur->dwFlags & RCIF_DIFFER) && !Opt.ShowListDifferent) || + ((cur->dwFlags & RCIF_LNEW) && !Opt.ShowListLNew) || ((cur->dwFlags & RCIF_RNEW) && !Opt.ShowListRNew)) + continue; + if ((cur->dwFlags & RCIF_EQUAL) || ((cur->dwFlags & RCIF_DIFFER) && !(cur->dwFlags & (RCIF_USERLNEW | RCIF_USERRNEW))) || + (cur->dwFlags & RCIF_USERNONE)) + continue; + if ((cur->dwFlags & RCIF_USERLNEW) || (cur->dwFlags & RCIF_LNEW)) + { + ItemsLNew++; + continue; + } + if (cur->dwFlags & RCIF_USERDEL) + { + ItemsRDel++; + continue; + } + if (!Opt.SyncOnlyRight && ((cur->dwFlags & RCIF_USERRNEW) || (cur->dwFlags & RCIF_RNEW))) + { + ItemsRNew++; + } + } + + // нет элементов для синхронизации, выходим + if (!ItemsLNew && !ItemsRNew && !ItemsRDel) + { + if (Opt.ShowMsg) + { + const wchar_t* MsgItems[] = {GetMsg(MSyncTitle), GetMsg(MNoSyncBody), GetMsg(MOK)}; + Info.Message(&MainGuid, &NoSyncMsgGuid, 0, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 1); + } + return ret = QR_SKIP; //нет элементов + } + + Opt.SyncLPanel = ItemsRNew, Opt.SyncRPanel = ItemsLNew, Opt.SyncDel = ItemsRDel; + + wchar_t buf1[80], buf2[80], buf3[80]; + FSF.sprintf(buf1, GetMsg(MSyncLPanel), ItemsRNew); + FSF.sprintf(buf2, GetMsg(MSyncRPanel), ItemsLNew); + FSF.sprintf(buf3, GetMsg(MSyncDel), ItemsRDel); + + struct FarDialogItem DialogItems[] = {// Type X1 Y1 X2 Y2 Selected History Mask Flags Data MaxLen UserParam + /* 0*/ {DI_DOUBLEBOX, 3, 1, 60, 8, 0, 0, 0, 0, GetMsg(MSyncTitle), 0, 0}, + /* 1*/ {DI_CHECKBOX, 5, 2, 0, 0, Opt.SyncRPanel, 0, 0, Opt.SyncRPanel ? DIF_FOCUS : DIF_DISABLE, buf2, 0, 0}, + /* 2*/ {DI_CHECKBOX, 5, 3, 0, 0, Opt.SyncLPanel, 0, 0, Opt.SyncLPanel ? 0 : DIF_DISABLE, buf1, 0, 0}, + /* 3*/ {DI_CHECKBOX, 5, 4, 0, 0, Opt.SyncDel, 0, 0, Opt.SyncDel ? 0 : DIF_DISABLE, buf3, 0, 0}, + /* 4*/ {DI_CHECKBOX, 8, 5, 0, 0, 0, 0, 0, Opt.SyncDel ? 0 : DIF_DISABLE, GetMsg(MSyncUseDelFilter), 0, 0}, + /* 5*/ {DI_TEXT, -1, 6, 0, 0, 0, 0, 0, DIF_SEPARATOR, L"", 0, 0}, + /* 6*/ {DI_BUTTON, 0, 7, 0, 0, 0, 0, 0, DIF_DEFAULTBUTTON | DIF_CENTERGROUP, GetMsg(MOK), 0, 0}, + /* 7*/ {DI_BUTTON, 0, 7, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MSyncEdit), 0, 0}, + /* 8*/ {DI_BUTTON, 0, 7, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MCancel), 0, 0}}; + + HANDLE hDlg = + Info.DialogInit(&MainGuid, &OptSyncDlgGuid, -1, -1, 64, 10, L"DlgCmp", DialogItems, sizeof(DialogItems) / sizeof(DialogItems[0]), 0, 0, 0, 0); + + if (hDlg != INVALID_HANDLE_VALUE) + { + ret = (int) Info.DialogRun(hDlg); + if (ret == 6) + { + Opt.SyncRPanel = Info.SendDlgMessage(hDlg, DM_GETCHECK, 1, 0); + Opt.SyncLPanel = Info.SendDlgMessage(hDlg, DM_GETCHECK, 2, 0); + Opt.SyncDel = Info.SendDlgMessage(hDlg, DM_GETCHECK, 3, 0); + Opt.SyncUseDelFilter = Info.SendDlgMessage(hDlg, DM_GETCHECK, 4, 0); + ret = (Opt.SyncLPanel || Opt.SyncRPanel || Opt.SyncDel) ? QR_ALL : QR_SKIP; // синхронизируем, иначе - пропустим + } + else if (ret == 7) + ret = QR_EDIT; + else + { + bBrokenByEsc = true; + ret = QR_ABORT; // отменили синхронизацию + } + Info.DialogFree(hDlg); + } + else + ret = QR_ABORT; + + return ret; } /*************************************************************************** * Запрос на перезапись файлов ***************************************************************************/ -int AdvCmpProc::QueryOverwriteFile(const wchar_t *FileName, FILETIME *srcTime, FILETIME *destTime, unsigned __int64 srcSize, unsigned __int64 destSize, int direction, bool bReadOnlyType) +int AdvCmpProc::QueryOverwriteFile(const wchar_t* FileName, FILETIME* srcTime, FILETIME* destTime, unsigned __int64 srcSize, + unsigned __int64 destSize, int direction, bool bReadOnlyType) { - wchar_t Warning[67], Name[67]; - wchar_t New[67], Existing[67]; - wchar_t Time[20], Size[20]; - const int LEN=66; - - strcentr(Warning,GetMsg(bReadOnlyType?MFileIsReadOnly:MFileAlreadyExists),LEN,L' '); - TruncCopy(Name,GetPosToName(FileName),LEN); - FSF.sprintf(New, L"%-30.30s %15.15s %19.19s",direction<0?GetMsg(MNewToL):GetMsg(MNewToR),itoaa(srcSize,Size), GetStrFileTime(srcTime,Time)); - FSF.sprintf(Existing, L"%-30.30s %15.15s %19.19s",GetMsg(MExisting),itoaa(destSize,Size),GetStrFileTime(destTime,Time)); - - const wchar_t *MsgItems[]= - { - GetMsg(MWarning), - Warning, - Name, - L"\1", - New, - Existing, - GetMsg(MOverwrite), GetMsg(MAll), GetMsg(MSkip), GetMsg(MSkipAll), GetMsg(MCancel) - }; - - int ExitCode=(int)Info.Message(&MainGuid,&QueryOverwriteMsgGuid,FMSG_WARNING|FMSG_LEFTALIGN,NULL,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]), 5); - - return (ExitCode<=QR_SKIPALL?ExitCode:QR_ABORT); + wchar_t Warning[67], Name[67]; + wchar_t New[67], Existing[67]; + wchar_t Time[20], Size[20]; + const int LEN = 66; + + strcentr(Warning, GetMsg(bReadOnlyType ? MFileIsReadOnly : MFileAlreadyExists), LEN, L' '); + TruncCopy(Name, GetPosToName(FileName), LEN); + FSF.sprintf(New, L"%-30.30s %15.15s %19.19s", direction < 0 ? GetMsg(MNewToL) : GetMsg(MNewToR), itoaa(srcSize, Size), + GetStrFileTime(srcTime, Time)); + FSF.sprintf(Existing, L"%-30.30s %15.15s %19.19s", GetMsg(MExisting), itoaa(destSize, Size), GetStrFileTime(destTime, Time)); + + const wchar_t* MsgItems[] = {GetMsg(MWarning), Warning, Name, L"\1", New, Existing, GetMsg(MOverwrite), GetMsg(MAll), + GetMsg(MSkip), GetMsg(MSkipAll), GetMsg(MCancel)}; + + int ExitCode = + (int) Info.Message(&MainGuid, &QueryOverwriteMsgGuid, FMSG_WARNING | FMSG_LEFTALIGN, NULL, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 5); + + return (ExitCode <= QR_SKIPALL ? ExitCode : QR_ABORT); } /*************************************************************************** * Запрос на удаление файлов ***************************************************************************/ -int AdvCmpProc::QueryDelete(const wchar_t *FileName, bool bIsDir, bool bReadOnlyType) +int AdvCmpProc::QueryDelete(const wchar_t* FileName, bool bIsDir, bool bReadOnlyType) { - const wchar_t *MsgItems[]= - { - GetMsg(MWarning), - GetMsg(bReadOnlyType ? MFileIsReadOnly : ((Opt.Mode==MODE_DUP && Opt.DupDelRecycleBin)?(bIsDir?MDelFolderRecycleBin:MDelFileRecycleBin):(bIsDir?MDelFolder:MDelFile))), - GetPosToName(FileName), - GetMsg(MAskDel), - GetMsg(MDelete), GetMsg(MAll), GetMsg(MSkip), GetMsg(MSkipAll), GetMsg(MCancel) - }; - - int ExitCode=(int)Info.Message(&MainGuid,&QueryDelMsgGuid,FMSG_WARNING,NULL,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]), 5); - - return (ExitCode<=QR_SKIPALL?ExitCode:QR_ABORT); + const wchar_t* MsgItems[] = { + GetMsg(MWarning), + GetMsg(bReadOnlyType ? MFileIsReadOnly + : ((Opt.Mode == MODE_DUP && Opt.DupDelRecycleBin) ? (bIsDir ? MDelFolderRecycleBin : MDelFileRecycleBin) + : (bIsDir ? MDelFolder : MDelFile))), + GetPosToName(FileName), + GetMsg(MAskDel), + GetMsg(MDelete), + GetMsg(MAll), + GetMsg(MSkip), + GetMsg(MSkipAll), + GetMsg(MCancel)}; + + int ExitCode = (int) Info.Message(&MainGuid, &QueryDelMsgGuid, FMSG_WARNING, NULL, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 5); + + return (ExitCode <= QR_SKIPALL ? ExitCode : QR_ABORT); } /*************************************************************************** * Диалог-прогресс ***************************************************************************/ -void ShowSyncMsg(const wchar_t *Name1, const wchar_t *Name2, unsigned __int64 Progress, unsigned __int64 Max, bool bRedraw) +void ShowSyncMsg(const wchar_t* Name1, const wchar_t* Name2, unsigned __int64 Progress, unsigned __int64 Max, bool bRedraw) { - // Для перерисовки не чаще 3-х раз в 1 сек. - if (!bRedraw) - { - static DWORD dwTicks; - DWORD dwNewTicks = GetTickCount(); - if (dwNewTicks - dwTicks < 350) - return; - dwTicks = dwNewTicks; - } - - wchar_t TruncName1[MAX_PATH], TruncName2[MAX_PATH]; - TruncCopy(TruncName1,GetPosToName(Name1),WinInfo.TruncLen); - TruncCopy(TruncName2,GetPosToName(Name2),WinInfo.TruncLen); - - wchar_t ProgressBar[MAX_PATH]; - ProgressLine(ProgressBar,Progress,Max); - - const wchar_t *MsgItems[] = - { - GetMsg(MSyncTitle), - GetMsg(MCopying), - TruncName1, - GetMsg(MCopyingTo), - TruncName2, - L"\1", - ProgressBar - }; - - Info.Message(&MainGuid,&SyncMsgGuid,bStartMsg?FMSG_LEFTALIGN:FMSG_LEFTALIGN|FMSG_KEEPBACKGROUND,NULL,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),0); - bStartMsg=false; + // Для перерисовки не чаще 3-х раз в 1 сек. + if (!bRedraw) + { + static DWORD dwTicks; + DWORD dwNewTicks = GetTickCount(); + if (dwNewTicks - dwTicks < 350) + return; + dwTicks = dwNewTicks; + } + + wchar_t TruncName1[MAX_PATH], TruncName2[MAX_PATH]; + TruncCopy(TruncName1, GetPosToName(Name1), WinInfo.TruncLen); + TruncCopy(TruncName2, GetPosToName(Name2), WinInfo.TruncLen); + + wchar_t ProgressBar[MAX_PATH]; + ProgressLine(ProgressBar, Progress, Max); + + const wchar_t* MsgItems[] = {GetMsg(MSyncTitle), GetMsg(MCopying), TruncName1, GetMsg(MCopyingTo), TruncName2, L"\1", ProgressBar}; + + Info.Message(&MainGuid, &SyncMsgGuid, bStartMsg ? FMSG_LEFTALIGN : FMSG_LEFTALIGN | FMSG_KEEPBACKGROUND, NULL, MsgItems, + sizeof(MsgItems) / sizeof(MsgItems[0]), 0); + bStartMsg = false; } struct SynchronizeFileCopyCallbackData { - wchar_t *srcFileName; - wchar_t *destFileName; + wchar_t* srcFileName; + wchar_t* destFileName; }; -DWORD WINAPI SynchronizeFileCopyCallback( LARGE_INTEGER TotalFileSize, LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamSize, LARGE_INTEGER StreamBytesTransferred, - DWORD dwStreamNumber, DWORD dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID lpData ) +DWORD WINAPI SynchronizeFileCopyCallback(LARGE_INTEGER TotalFileSize, LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamSize, + LARGE_INTEGER StreamBytesTransferred, DWORD dwStreamNumber, DWORD dwCallbackReason, HANDLE hSourceFile, + HANDLE hDestinationFile, LPVOID lpData) { - unsigned __int64 progress=TotalBytesTransferred.QuadPart, max=TotalFileSize.QuadPart; - - if (lpData) - { - struct SynchronizeFileCopyCallbackData * data = (SynchronizeFileCopyCallbackData *)lpData; - ShowSyncMsg(data->srcFileName,data->destFileName,progress,max,false); - } - else - ShowSyncMsg(L"", L"", progress, max,false); - - if (CheckForEsc()) - return PROGRESS_CANCEL; - else - return PROGRESS_CONTINUE; + unsigned __int64 progress = TotalBytesTransferred.QuadPart, max = TotalFileSize.QuadPart; + + if (lpData) + { + struct SynchronizeFileCopyCallbackData* data = (SynchronizeFileCopyCallbackData*) lpData; + ShowSyncMsg(data->srcFileName, data->destFileName, progress, max, false); + } + else + ShowSyncMsg(L"", L"", progress, max, false); + + if (CheckForEsc()) + return PROGRESS_CANCEL; + else + return PROGRESS_CONTINUE; } /*************************************************************************** * Проверка на наличие файла ***************************************************************************/ -int AdvCmpProc::FileExists(const wchar_t *FileName, WIN32_FIND_DATA &FindData, int CheckForFilter) +int AdvCmpProc::FileExists(const wchar_t* FileName, WIN32_FIND_DATA& FindData, int CheckForFilter) { - int ret=0; // продолжим, но пропустим элемент - HANDLE hFind=FindFirstFileW(FileName,&FindData); - - if (hFind != INVALID_HANDLE_VALUE) - { - FindClose(hFind); - if (CheckForFilter) - { - if (!Opt.ProcessHidden && (FindData.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN)) - return ret; - - PluginPanelItem ppi={}; - ppi.FileAttributes=FindData.dwFileAttributes; - ppi.LastAccessTime=FindData.ftLastAccessTime; - ppi.LastWriteTime=FindData.ftLastWriteTime; - ppi.FileSize=((unsigned __int64)FindData.nFileSizeHigh << 32) | FindData.nFileSizeLow; - ppi.FileName=FindData.cFileName; //FSF.PointToName(FileName); - - if ( (CheckForFilter>0?LPanel.hFilter:RPanel.hFilter)!=INVALID_HANDLE_VALUE && - !Info.FileFilterControl((CheckForFilter>0?LPanel.hFilter:RPanel.hFilter),FFCTL_ISFILEINFILTER,0,&ppi)) - return ret; - - if (Opt.Filter && !Info.FileFilterControl(Opt.hCustomFilter,FFCTL_ISFILEINFILTER,0,&ppi)) - return ret; - } - ret=1; // ОК - } - else - memset(&FindData,0,sizeof(FindData)); - return ret; + int ret = 0; // продолжим, но пропустим элемент + HANDLE hFind = FindFirstFileW(FileName, &FindData); + + if (hFind != INVALID_HANDLE_VALUE) + { + FindClose(hFind); + if (CheckForFilter) + { + if (!Opt.ProcessHidden && (FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + return ret; + + PluginPanelItem ppi = {}; + ppi.FileAttributes = FindData.dwFileAttributes; + ppi.LastAccessTime = FindData.ftLastAccessTime; + ppi.LastWriteTime = FindData.ftLastWriteTime; + ppi.FileSize = ((unsigned __int64) FindData.nFileSizeHigh << 32) | FindData.nFileSizeLow; + ppi.FileName = FindData.cFileName; // FSF.PointToName(FileName); + + if ((CheckForFilter > 0 ? LPanel.hFilter : RPanel.hFilter) != INVALID_HANDLE_VALUE && + !Info.FileFilterControl((CheckForFilter > 0 ? LPanel.hFilter : RPanel.hFilter), FFCTL_ISFILEINFILTER, 0, &ppi)) + return ret; + + if (Opt.Filter && !Info.FileFilterControl(Opt.hCustomFilter, FFCTL_ISFILEINFILTER, 0, &ppi)) + return ret; + } + ret = 1; // ОК + } + else + memset(&FindData, 0, sizeof(FindData)); + return ret; } /*************************************************************************** * Синхронизация файлов (копирование) ***************************************************************************/ -int AdvCmpProc::SyncFile(const wchar_t *srcFileName, const wchar_t *destFileName, int direction, DWORD dwFlag) +int AdvCmpProc::SyncFile(const wchar_t* srcFileName, const wchar_t* destFileName, int direction, DWORD dwFlag) { - if (bBrokenByEsc) - return 0; - - int ret=1; - - // если сказали - "а мы не хотим туда копировать", то пропустим... - if (((direction < 0) && !Opt.SyncLPanel) || ((direction > 0) && !Opt.SyncRPanel)) - return ret; - - WIN32_FIND_DATA sWFD,dWFD; - int destFileExists=FileExists(destFileName,dWFD,0); - - if (srcFileName && destFileName && FileExists(srcFileName,sWFD,direction)) - { - unsigned __int64 srcSize=((unsigned __int64)sWFD.nFileSizeHigh << 32) | sWFD.nFileSizeLow; - ShowSyncMsg(srcFileName,destFileName,0,srcSize,true); - int doCopy=1; - - if (destFileExists) - { - unsigned __int64 destSize=((unsigned __int64)dWFD.nFileSizeHigh << 32) | dWFD.nFileSizeLow; - // Overwrite confirmation - if (((direction < 0) && bAskLOverwrite) || ((direction > 0) && bAskROverwrite)) - { - switch(QueryOverwriteFile(destFileName,&sWFD.ftLastWriteTime,&dWFD.ftLastWriteTime,srcSize,destSize,direction,false)) - { - case QR_OVERWRITE: - doCopy=1; - break; - case QR_ALL: - doCopy=1; - if (direction<0) bAskLOverwrite=false; - else bAskROverwrite=false; - break; - case QR_SKIP: - doCopy=0; - break; - case QR_SKIPALL: - doCopy=0; - if (direction<0) Opt.SyncLPanel=0; - else Opt.SyncRPanel=0; - break; - default: - doCopy=0; - ret=0; - bBrokenByEsc=true; - break; - } - } - - // ReadOnly overwrite confirmation - if (doCopy && (dWFD.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) - { - if (((direction < 0) && bSkipLReadOnly) || ((direction > 0) && bSkipRReadOnly)) - { - doCopy=0; - } - else if (((direction < 0) && bAskLReadOnly) || ((direction > 0) && bAskRReadOnly)) - { - switch(QueryOverwriteFile(destFileName,&sWFD.ftLastWriteTime,&dWFD.ftLastWriteTime,srcSize,destSize,direction,true)) - { - case QR_OVERWRITE: - doCopy=1; - break; - case QR_ALL: - doCopy=1; - if (direction < 0) bAskLReadOnly=false; - else bAskRReadOnly=false; - break; - case QR_SKIP: - doCopy=0; - break; - case QR_SKIPALL: - doCopy=0; - if (direction < 0) bSkipLReadOnly=true; - else bSkipRReadOnly=true; - break; - default: - doCopy=0; - ret=0; - bBrokenByEsc=true; - break; - } - } - } - } - - if (doCopy) - { - struct SynchronizeFileCopyCallbackData copyData; - copyData.srcFileName=(wchar_t *)srcFileName; - copyData.destFileName=(wchar_t *)destFileName; - int doSync=1; - int reSync=1; // только один раз пробуем переименование -RetryCopy: - - DWORD dwErr=0; - SetLastError(dwErr); - - // если использовали полное сравнение - просто переименуем файл и выставим атрибуты! + if (bBrokenByEsc) + return 0; + + int ret = 1; + + // если сказали - "а мы не хотим туда копировать", то пропустим... + if (((direction < 0) && !Opt.SyncLPanel) || ((direction > 0) && !Opt.SyncRPanel)) + return ret; + + WIN32_FIND_DATA sWFD, dWFD; + int destFileExists = FileExists(destFileName, dWFD, 0); + + if (srcFileName && destFileName && FileExists(srcFileName, sWFD, direction)) + { + unsigned __int64 srcSize = ((unsigned __int64) sWFD.nFileSizeHigh << 32) | sWFD.nFileSizeLow; + ShowSyncMsg(srcFileName, destFileName, 0, srcSize, true); + int doCopy = 1; + + if (destFileExists) + { + unsigned __int64 destSize = ((unsigned __int64) dWFD.nFileSizeHigh << 32) | dWFD.nFileSizeLow; + // Overwrite confirmation + if (((direction < 0) && bAskLOverwrite) || ((direction > 0) && bAskROverwrite)) + { + switch (QueryOverwriteFile(destFileName, &sWFD.ftLastWriteTime, &dWFD.ftLastWriteTime, srcSize, destSize, direction, false)) + { + case QR_OVERWRITE: + doCopy = 1; + break; + case QR_ALL: + doCopy = 1; + if (direction < 0) + bAskLOverwrite = false; + else + bAskROverwrite = false; + break; + case QR_SKIP: + doCopy = 0; + break; + case QR_SKIPALL: + doCopy = 0; + if (direction < 0) + Opt.SyncLPanel = 0; + else + Opt.SyncRPanel = 0; + break; + default: + doCopy = 0; + ret = 0; + bBrokenByEsc = true; + break; + } + } + + // ReadOnly overwrite confirmation + if (doCopy && (dWFD.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + { + if (((direction < 0) && bSkipLReadOnly) || ((direction > 0) && bSkipRReadOnly)) + { + doCopy = 0; + } + else if (((direction < 0) && bAskLReadOnly) || ((direction > 0) && bAskRReadOnly)) + { + switch (QueryOverwriteFile(destFileName, &sWFD.ftLastWriteTime, &dWFD.ftLastWriteTime, srcSize, destSize, direction, true)) + { + case QR_OVERWRITE: + doCopy = 1; + break; + case QR_ALL: + doCopy = 1; + if (direction < 0) + bAskLReadOnly = false; + else + bAskRReadOnly = false; + break; + case QR_SKIP: + doCopy = 0; + break; + case QR_SKIPALL: + doCopy = 0; + if (direction < 0) + bSkipLReadOnly = true; + else + bSkipRReadOnly = true; + break; + default: + doCopy = 0; + ret = 0; + bBrokenByEsc = true; + break; + } + } + } + } + + if (doCopy) + { + struct SynchronizeFileCopyCallbackData copyData; + copyData.srcFileName = (wchar_t*) srcFileName; + copyData.destFileName = (wchar_t*) destFileName; + int doSync = 1; + int reSync = 1; // только один раз пробуем переименование + RetryCopy: + + DWORD dwErr = 0; + SetLastError(dwErr); + + // если использовали полное сравнение - просто переименуем файл и выставим атрибуты! #if 1 - if (!Opt.LightSync && reSync && destFileExists && dwFlag) - { - reSync--; - if ((Opt.CmpContents && (dwFlag&RCIF_CONT)) /*|| (!Opt.CmpContents && Opt.CmpSize && (dwFlag&RCIF_SIZE))*/) - { - const wchar_t *pSrc=FSF.PointToName(srcFileName); - if ((Opt.CmpCase && (dwFlag&RCIF_NAMEDIFF)) || (!Opt.CmpCase && Strncmp(pSrc,FSF.PointToName(destFileName)))) - { - wchar_t *NewFileName=(wchar_t*)malloc((wcslen(destFileName)+1)*sizeof(wchar_t)); - if (NewFileName) - { - wcscpy(NewFileName,destFileName); - wcscpy((wchar_t*)(FSF.PointToName(NewFileName)),pSrc); - - if (!MoveFileW(destFileName,NewFileName)) - dwErr=GetLastError(); - free(NewFileName); - } - else - dwErr=GetLastError(); - } - if (!dwErr && ((Opt.CmpTime && (dwFlag&RCIF_TIMEDIFF)) || !Opt.CmpTime)) - { - HANDLE hFile=CreateFileW(destFileName,FILE_WRITE_ATTRIBUTES,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); - if (hFile!=INVALID_HANDLE_VALUE) - { - if (!SetFileTime(hFile,&sWFD.ftCreationTime,&sWFD.ftLastAccessTime,&sWFD.ftLastWriteTime)) - dwErr=GetLastError(); - CloseHandle(hFile); - } - else - dwErr=GetLastError(); - } - if (!dwErr) - { - if (!SetFileAttributesW(destFileName,sWFD.dwFileAttributes)) - dwErr=GetLastError(); - } - if (!dwErr) doSync=0; - } - } + if (!Opt.LightSync && reSync && destFileExists && dwFlag) + { + reSync--; + if ((Opt.CmpContents && (dwFlag & RCIF_CONT)) /*|| (!Opt.CmpContents && Opt.CmpSize && (dwFlag&RCIF_SIZE))*/) + { + const wchar_t* pSrc = FSF.PointToName(srcFileName); + if ((Opt.CmpCase && (dwFlag & RCIF_NAMEDIFF)) || (!Opt.CmpCase && Strncmp(pSrc, FSF.PointToName(destFileName)))) + { + wchar_t* NewFileName = (wchar_t*) malloc((wcslen(destFileName) + 1) * sizeof(wchar_t)); + if (NewFileName) + { + wcscpy(NewFileName, destFileName); + wcscpy((wchar_t*) (FSF.PointToName(NewFileName)), pSrc); + + if (!MoveFileW(destFileName, NewFileName)) + dwErr = GetLastError(); + free(NewFileName); + } + else + dwErr = GetLastError(); + } + if (!dwErr && ((Opt.CmpTime && (dwFlag & RCIF_TIMEDIFF)) || !Opt.CmpTime)) + { + HANDLE hFile = + CreateFileW(destFileName, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0); + if (hFile != INVALID_HANDLE_VALUE) + { + if (!SetFileTime(hFile, &sWFD.ftCreationTime, &sWFD.ftLastAccessTime, &sWFD.ftLastWriteTime)) + dwErr = GetLastError(); + CloseHandle(hFile); + } + else + dwErr = GetLastError(); + } + if (!dwErr) + { + if (!SetFileAttributesW(destFileName, sWFD.dwFileAttributes)) + dwErr = GetLastError(); + } + if (!dwErr) + doSync = 0; + } + } #endif - if (doSync) - { - if (dWFD.dwFileAttributes&(FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN)) - if (!SetFileAttributesW(destFileName,dWFD.dwFileAttributes & ~(FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN))) - dwErr=GetLastError(); - - if (!dwErr && CopyFileExW(srcFileName,destFileName,SynchronizeFileCopyCallback,©Data,NULL,0)) - { - // CopyFileExW() не синхронизирует имена, поэтому... - const wchar_t *pSrc=FSF.PointToName(srcFileName); - if (Strncmp(pSrc,FSF.PointToName(destFileName))) - { - wchar_t *NewFileName=(wchar_t*)malloc((wcslen(destFileName)+1)*sizeof(wchar_t)); - if (NewFileName) - { - wcscpy(NewFileName,destFileName); - wcscpy((wchar_t*)(FSF.PointToName(NewFileName)),pSrc); - MoveFileW(destFileName,NewFileName); - free(NewFileName); - } - } - } - else - { - dwErr=GetLastError(); - if (!dwErr) dwErr=E_UNEXPECTED; - if (dWFD.dwFileAttributes&(FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN)) - SetFileAttributesW(destFileName,dWFD.dwFileAttributes); // пробуем восстановить атрибуты - } - } - - if (dwErr) - { - int nErrMsg=MFailedCopySrcFile; - // Check, wich file failes? - HANDLE hFile; - // ERROR_SHARING_VIOLATION==32 - hFile=CreateFileW(srcFileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,NULL); - if (hFile==INVALID_HANDLE_VALUE) - nErrMsg=MFailedOpenSrcFile; // Source file failed - else - { - CloseHandle(hFile); - hFile=CreateFileW(destFileName,GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,NULL); - if (hFile==INVALID_HANDLE_VALUE) - { - if (GetLastError() == ERROR_FILE_NOT_FOUND) - nErrMsg=MFailedCreateDstFile; // Failed to create destination file - else - nErrMsg=MFailedOpenDstFile; // Failed to open destination file - } - else - CloseHandle(hFile); - } - - const wchar_t *MsgItems[]= - { - GetMsg(MWarning), - GetMsg(nErrMsg), - GetPosToName(srcFileName), - GetMsg(MFailedCopyDstFile), - GetPosToName(destFileName), - GetMsg(MRetry), GetMsg(MSkip), GetMsg(MCancel) - }; - - SetLastError(dwErr); - int ExitCode= bBrokenByEsc ? 2/*MCancel*/ : Info.Message(&MainGuid,&FailedCopyMsgGuid,FMSG_WARNING|FMSG_ERRORTYPE,0,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),3); - - if (!ExitCode) - goto RetryCopy; - else if (ExitCode != 1) - ret=0; - } - } - } - return ret; + if (doSync) + { + if (dWFD.dwFileAttributes & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN)) + if (!SetFileAttributesW(destFileName, dWFD.dwFileAttributes & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN))) + dwErr = GetLastError(); + + if (!dwErr && CopyFileExW(srcFileName, destFileName, SynchronizeFileCopyCallback, ©Data, NULL, 0)) + { + // CopyFileExW() не синхронизирует имена, поэтому... + const wchar_t* pSrc = FSF.PointToName(srcFileName); + if (Strncmp(pSrc, FSF.PointToName(destFileName))) + { + wchar_t* NewFileName = (wchar_t*) malloc((wcslen(destFileName) + 1) * sizeof(wchar_t)); + if (NewFileName) + { + wcscpy(NewFileName, destFileName); + wcscpy((wchar_t*) (FSF.PointToName(NewFileName)), pSrc); + MoveFileW(destFileName, NewFileName); + free(NewFileName); + } + } + } + else + { + dwErr = GetLastError(); + if (!dwErr) + dwErr = E_UNEXPECTED; + if (dWFD.dwFileAttributes & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN)) + SetFileAttributesW(destFileName, dWFD.dwFileAttributes); // пробуем восстановить атрибуты + } + } + + if (dwErr) + { + int nErrMsg = MFailedCopySrcFile; + // Check, wich file failes? + HANDLE hFile; + // ERROR_SHARING_VIOLATION==32 + hFile = CreateFileW(srcFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, NULL); + if (hFile == INVALID_HANDLE_VALUE) + nErrMsg = MFailedOpenSrcFile; // Source file failed + else + { + CloseHandle(hFile); + hFile = CreateFileW(destFileName, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, NULL); + if (hFile == INVALID_HANDLE_VALUE) + { + if (GetLastError() == ERROR_FILE_NOT_FOUND) + nErrMsg = MFailedCreateDstFile; // Failed to create destination file + else + nErrMsg = MFailedOpenDstFile; // Failed to open destination file + } + else + CloseHandle(hFile); + } + + const wchar_t* MsgItems[] = { + GetMsg(MWarning), GetMsg(nErrMsg), GetPosToName(srcFileName), GetMsg(MFailedCopyDstFile), GetPosToName(destFileName), GetMsg(MRetry), + GetMsg(MSkip), GetMsg(MCancel)}; + + SetLastError(dwErr); + int ExitCode = bBrokenByEsc + ? 2 /*MCancel*/ + : Info.Message(&MainGuid, &FailedCopyMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); + + if (!ExitCode) + goto RetryCopy; + else if (ExitCode != 1) + ret = 0; + } + } + } + return ret; } /*************************************************************************** * Синхронизация файлов (удаление) * Теперь оно же и при удалении дубликатов ***************************************************************************/ -int AdvCmpProc::DelFile(const wchar_t *FileName) +int AdvCmpProc::DelFile(const wchar_t* FileName) { - if (bBrokenByEsc) - return 0; - - int ret=1; - - if ((Opt.Mode==MODE_SYNC && !Opt.SyncDel) || (Opt.Mode==MODE_DUP && !Opt.DupDel)) - return ret; - - WIN32_FIND_DATA WFD; - - if (FileName && FileExists(FileName,WFD,(Opt.Mode==MODE_SYNC && Opt.SyncUseDelFilter?-1:0))) // -1, т.е. справа - { - int doDel=1; - - // Delete confirmation - if (bAskDel) - { - switch(QueryDelete(FileName,false,false)) - { - case QR_DELETE: - doDel=1; - break; - case QR_ALL: - doDel=1; - bAskDel=false; - break; - case QR_SKIP: - doDel=0; - break; - case QR_SKIPALL: - doDel=0; - Opt.Mode==MODE_SYNC?Opt.SyncDel=0:Opt.DupDel=0; - break; - default: - doDel=0; - ret=0; - bBrokenByEsc=true; - break; - } - } - - // ReadOnly delete confirmation - if (doDel && (WFD.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) - { - if (bSkipRReadOnly) // для синхронизации это правая панель, а для дубликатов будем просто юзать переменную :) - { - doDel=0; - } - else if (bAskRReadOnly) // для синхронизации это правая панель, а для дубликатов будем просто юзать переменную :) - { - switch(QueryDelete(FileName,false,true)) - { - case QR_DELETE: - doDel=1; - break; - case QR_ALL: - doDel=1; - bAskRReadOnly=false; - break; - case QR_SKIP: - doDel=0; - break; - case QR_SKIPALL: - doDel=0; - bSkipRReadOnly=true; - break; - default: - doDel=0; - ret=0; - bBrokenByEsc=true; - break; - } - } - } - - if (doDel) - { - - const wchar_t *MsgItems[]= - { - GetMsg(MWarning), - GetMsg((Opt.Mode==MODE_DUP && Opt.DupDelRecycleBin)?MFailedDelFileRecycleBin:MFailedDelFile), - GetPosToName(FileName), - GetMsg(MRetry), GetMsg(MSkip), GetMsg(MCancel) - }; - -RetryDelFile: - - SetLastError(0); - - if (Opt.Mode==MODE_DUP && Opt.DupDelRecycleBin) - { - SHFILEOPSTRUCT shs; - memset(&shs,0,sizeof(shs)); - int len=wcslen(GetPosToName(FileName)); - wchar_t *lpwszName=(wchar_t*)malloc((len+2)*sizeof(wchar_t)); - if (lpwszName) - { - wcscpy(lpwszName,GetPosToName(FileName)); - lpwszName[len+1]=0; - shs.pFrom=lpwszName; - shs.wFunc=FO_DELETE; - shs.fFlags=FOF_ALLOWUNDO|FOF_SILENT|FOF_NOCONFIRMATION; - DWORD Result=SHFileOperation(&shs); - free(lpwszName); - - if (Result || shs.fAnyOperationsAborted) - { - int ExitCode= bBrokenByEsc ? 2/*MCancel*/ : Info.Message(&MainGuid,&FailedDelFileMsgGuid,FMSG_WARNING|FMSG_ERRORTYPE,0,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),3); - - if (!ExitCode) - goto RetryDelFile; - else if (ExitCode != 1) - ret=0; - } - else - { - CmpInfo.Proc+=1; - CmpInfo.ProcSize+=(((unsigned __int64)WFD.nFileSizeHigh<<32)|WFD.nFileSizeLow); - } - } - else - ret=0; - } - else - { - if (WFD.dwFileAttributes&FILE_ATTRIBUTE_READONLY) - SetFileAttributesW(FileName,WFD.dwFileAttributes & ~(FILE_ATTRIBUTE_READONLY)); - - if (!DeleteFileW(FileName)) - { - int ExitCode=bBrokenByEsc ? 2/*MCancel*/ : Info.Message(&MainGuid,&FailedDelFileMsgGuid,FMSG_WARNING|FMSG_ERRORTYPE,0,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),3); - - if (!ExitCode) - goto RetryDelFile; - else if (ExitCode != 1) - { - if (WFD.dwFileAttributes&FILE_ATTRIBUTE_READONLY) - SetFileAttributesW(FileName,WFD.dwFileAttributes); // пробуем восстановить атрибуты - ret=0; - } - } - else - { - CmpInfo.Proc+=1; - CmpInfo.ProcSize+=(((unsigned __int64)WFD.nFileSizeHigh<<32)|WFD.nFileSizeLow); - } - } - } - } - return ret; + if (bBrokenByEsc) + return 0; + + int ret = 1; + + if ((Opt.Mode == MODE_SYNC && !Opt.SyncDel) || (Opt.Mode == MODE_DUP && !Opt.DupDel)) + return ret; + + WIN32_FIND_DATA WFD; + + if (FileName && FileExists(FileName, WFD, (Opt.Mode == MODE_SYNC && Opt.SyncUseDelFilter ? -1 : 0))) // -1, т.е. справа + { + int doDel = 1; + + // Delete confirmation + if (bAskDel) + { + switch (QueryDelete(FileName, false, false)) + { + case QR_DELETE: + doDel = 1; + break; + case QR_ALL: + doDel = 1; + bAskDel = false; + break; + case QR_SKIP: + doDel = 0; + break; + case QR_SKIPALL: + doDel = 0; + Opt.Mode == MODE_SYNC ? Opt.SyncDel = 0 : Opt.DupDel = 0; + break; + default: + doDel = 0; + ret = 0; + bBrokenByEsc = true; + break; + } + } + + // ReadOnly delete confirmation + if (doDel && (WFD.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + { + if (bSkipRReadOnly) // для синхронизации это правая панель, а для дубликатов будем просто юзать переменную :) + { + doDel = 0; + } + else if (bAskRReadOnly) // для синхронизации это правая панель, а для дубликатов будем просто юзать переменную :) + { + switch (QueryDelete(FileName, false, true)) + { + case QR_DELETE: + doDel = 1; + break; + case QR_ALL: + doDel = 1; + bAskRReadOnly = false; + break; + case QR_SKIP: + doDel = 0; + break; + case QR_SKIPALL: + doDel = 0; + bSkipRReadOnly = true; + break; + default: + doDel = 0; + ret = 0; + bBrokenByEsc = true; + break; + } + } + } + + if (doDel) + { + const wchar_t* MsgItems[] = { + GetMsg(MWarning), GetMsg((Opt.Mode == MODE_DUP && Opt.DupDelRecycleBin) ? MFailedDelFileRecycleBin : MFailedDelFile), + GetPosToName(FileName), GetMsg(MRetry), + GetMsg(MSkip), GetMsg(MCancel)}; + + RetryDelFile: + + SetLastError(0); + + if (Opt.Mode == MODE_DUP && Opt.DupDelRecycleBin) + { + SHFILEOPSTRUCT shs; + memset(&shs, 0, sizeof(shs)); + int len = wcslen(GetPosToName(FileName)); + wchar_t* lpwszName = (wchar_t*) malloc((len + 2) * sizeof(wchar_t)); + if (lpwszName) + { + wcscpy(lpwszName, GetPosToName(FileName)); + lpwszName[len + 1] = 0; + shs.pFrom = lpwszName; + shs.wFunc = FO_DELETE; + shs.fFlags = FOF_ALLOWUNDO | FOF_SILENT | FOF_NOCONFIRMATION; + DWORD Result = SHFileOperation(&shs); + free(lpwszName); + + if (Result || shs.fAnyOperationsAborted) + { + int ExitCode = bBrokenByEsc ? 2 /*MCancel*/ + : Info.Message(&MainGuid, &FailedDelFileMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, 0, MsgItems, + sizeof(MsgItems) / sizeof(MsgItems[0]), 3); + + if (!ExitCode) + goto RetryDelFile; + else if (ExitCode != 1) + ret = 0; + } + else + { + CmpInfo.Proc += 1; + CmpInfo.ProcSize += (((unsigned __int64) WFD.nFileSizeHigh << 32) | WFD.nFileSizeLow); + } + } + else + ret = 0; + } + else + { + if (WFD.dwFileAttributes & FILE_ATTRIBUTE_READONLY) + SetFileAttributesW(FileName, WFD.dwFileAttributes & ~(FILE_ATTRIBUTE_READONLY)); + + if (!DeleteFileW(FileName)) + { + int ExitCode = bBrokenByEsc + ? 2 /*MCancel*/ + : Info.Message(&MainGuid, &FailedDelFileMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); + + if (!ExitCode) + goto RetryDelFile; + else if (ExitCode != 1) + { + if (WFD.dwFileAttributes & FILE_ATTRIBUTE_READONLY) + SetFileAttributesW(FileName, WFD.dwFileAttributes); // пробуем восстановить атрибуты + ret = 0; + } + } + else + { + CmpInfo.Proc += 1; + CmpInfo.ProcSize += (((unsigned __int64) WFD.nFileSizeHigh << 32) | WFD.nFileSizeLow); + } + } + } + } + return ret; } /*************************************************************************** * Синхронизация каталогов (копирование) ***************************************************************************/ -int AdvCmpProc::SyncDir(const wchar_t *srcDirName, const wchar_t *destDirName, int direction) +int AdvCmpProc::SyncDir(const wchar_t* srcDirName, const wchar_t* destDirName, int direction) { - if (bBrokenByEsc) - return 0; + if (bBrokenByEsc) + return 0; - if (!srcDirName || !*srcDirName || !destDirName || !*destDirName) - { - SetLastError(E_INVALIDARG); - return 0; - } + if (!srcDirName || !*srcDirName || !destDirName || !*destDirName) + { + SetLastError(E_INVALIDARG); + return 0; + } - // проверим на фильтр - WIN32_FIND_DATA WFD; + // проверим на фильтр + WIN32_FIND_DATA WFD; - if (!FileExists(srcDirName,WFD,direction)) - return 1; // пропустим + if (!FileExists(srcDirName, WFD, direction)) + return 1; // пропустим RetryMkDir: - int ret=1; - WIN32_FIND_DATA wfdFindData; - HANDLE hFind=FindFirstFileW(destDirName,&wfdFindData); - - if (hFind==INVALID_HANDLE_VALUE) - { - if (WFD.dwFileAttributes && CreateDirectoryW(destDirName,NULL)) - SetFileAttributesW(destDirName,WFD.dwFileAttributes); - else - ret=0; - } - else - { - FindClose(hFind); - if (!(wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) - ret=0; - else - { - // синхронизирует имена... - const wchar_t *pSrc=FSF.PointToName(srcDirName); - if (Strncmp(pSrc,FSF.PointToName(destDirName))) - { - wchar_t *NewName=(wchar_t*)malloc((wcslen(destDirName)+1)*sizeof(wchar_t)); - if (NewName) - { - wcscpy(NewName,destDirName); - wcscpy((wchar_t*)(FSF.PointToName(NewName)),pSrc); - MoveFileW(destDirName,NewName); - free(NewName); - } - } - } - } - - if (!ret) - { - const wchar_t *MsgItems[]= - { - GetMsg(MWarning), - GetMsg(MCantCreateFolder), - GetPosToName(destDirName), - GetMsg(MRetry), GetMsg(MSkip), GetMsg(MCancel) - }; - - int ExitCode=Info.Message(&MainGuid,&CantCreateFolderMsgGuid,FMSG_WARNING|FMSG_ERRORTYPE,0,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),3); - - if (!ExitCode) - goto RetryMkDir; - else if (ExitCode == 1) - return 1; // значит продолжим, но не будем копировать эту папку и ее содержимое! - return 0; - } - - string strSrcDirMask(srcDirName); - strSrcDirMask+=L"\\*"; - - if ((hFind=FindFirstFileW(strSrcDirMask,&wfdFindData))!= INVALID_HANDLE_VALUE) - { - do - { - string strNewSrc, strNewDest; - GetFullFileName(strNewSrc,srcDirName,wfdFindData.cFileName); - GetFullFileName(strNewDest,destDirName,wfdFindData.cFileName); - - if (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - if (!(wfdFindData.cFileName[0]==L'.' && !wfdFindData.cFileName[1]) && !(wfdFindData.cFileName[0]==L'.' && wfdFindData.cFileName[1]==L'.' && !wfdFindData.cFileName[2])) - { - if (!SyncDir(strNewSrc,strNewDest,direction)) - ret=0; - } - } - else - { - if (!SyncFile(strNewSrc,strNewDest,direction)) - ret=0; - } - } - while (ret && FindNextFile(hFind,&wfdFindData)); - FindClose(hFind); - } - return ret; + int ret = 1; + WIN32_FIND_DATA wfdFindData; + HANDLE hFind = FindFirstFileW(destDirName, &wfdFindData); + + if (hFind == INVALID_HANDLE_VALUE) + { + if (WFD.dwFileAttributes && CreateDirectoryW(destDirName, NULL)) + SetFileAttributesW(destDirName, WFD.dwFileAttributes); + else + ret = 0; + } + else + { + FindClose(hFind); + if (!(wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + ret = 0; + else + { + // синхронизирует имена... + const wchar_t* pSrc = FSF.PointToName(srcDirName); + if (Strncmp(pSrc, FSF.PointToName(destDirName))) + { + wchar_t* NewName = (wchar_t*) malloc((wcslen(destDirName) + 1) * sizeof(wchar_t)); + if (NewName) + { + wcscpy(NewName, destDirName); + wcscpy((wchar_t*) (FSF.PointToName(NewName)), pSrc); + MoveFileW(destDirName, NewName); + free(NewName); + } + } + } + } + + if (!ret) + { + const wchar_t* MsgItems[] = {GetMsg(MWarning), GetMsg(MCantCreateFolder), GetPosToName(destDirName), GetMsg(MRetry), GetMsg(MSkip), + GetMsg(MCancel)}; + + int ExitCode = + Info.Message(&MainGuid, &CantCreateFolderMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); + + if (!ExitCode) + goto RetryMkDir; + else if (ExitCode == 1) + return 1; // значит продолжим, но не будем копировать эту папку и ее содержимое! + return 0; + } + + string strSrcDirMask(srcDirName); + strSrcDirMask += L"\\*"; + + if ((hFind = FindFirstFileW(strSrcDirMask, &wfdFindData)) != INVALID_HANDLE_VALUE) + { + do + { + string strNewSrc, strNewDest; + GetFullFileName(strNewSrc, srcDirName, wfdFindData.cFileName); + GetFullFileName(strNewDest, destDirName, wfdFindData.cFileName); + + if (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (!(wfdFindData.cFileName[0] == L'.' && !wfdFindData.cFileName[1]) && + !(wfdFindData.cFileName[0] == L'.' && wfdFindData.cFileName[1] == L'.' && !wfdFindData.cFileName[2])) + { + if (!SyncDir(strNewSrc, strNewDest, direction)) + ret = 0; + } + } + else + { + if (!SyncFile(strNewSrc, strNewDest, direction)) + ret = 0; + } + } while (ret && FindNextFile(hFind, &wfdFindData)); + FindClose(hFind); + } + return ret; } /*************************************************************************** * Синхронизация каталогов (удаление) ***************************************************************************/ -int AdvCmpProc::DelDir(const wchar_t *DirName) +int AdvCmpProc::DelDir(const wchar_t* DirName) { - if (bBrokenByEsc) - return 0; + if (bBrokenByEsc) + return 0; - int ret=1; + int ret = 1; - if (!Opt.SyncDel) - return ret; + if (!Opt.SyncDel) + return ret; - if (!DirName || !*DirName) - { - SetLastError(E_INVALIDARG); - return 0; - } + if (!DirName || !*DirName) + { + SetLastError(E_INVALIDARG); + return 0; + } - // проверим на фильтр - WIN32_FIND_DATA WFD; + // проверим на фильтр + WIN32_FIND_DATA WFD; - if (!FileExists(DirName,WFD,Opt.SyncUseDelFilter?-1:0)) - return 1; // пропустим + if (!FileExists(DirName, WFD, Opt.SyncUseDelFilter ? -1 : 0)) + return 1; // пропустим RetryDelDir: - WIN32_FIND_DATA wfdFindData; - HANDLE hFind=FindFirstFileW(DirName,&wfdFindData); - - if (hFind==INVALID_HANDLE_VALUE) - { - return 1; // не найден, считаем, что удалили - } - else - { - FindClose(hFind); - if (!(wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) - ret=0; - } - - if (ret) - { - int doDel=1; - - // Delete confirmation - if (bAskDel) - { - switch(QueryDelete(DirName,true,false)) - { - case QR_DELETE: - doDel=1; - break; - case QR_ALL: - doDel=1; - bAskDel=false; - break; - case QR_SKIP: - doDel=0; - break; - case QR_SKIPALL: - doDel=0; - Opt.SyncDel=0; - break; - default: - doDel=0; - ret=0; - bBrokenByEsc=true; - break; - } - } -/* - // ReadOnly delete confirmation - if (doDel && (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) - { - if (bSkipRReadOnly) - { - doDel=0; - } - else if (bAskRReadOnly) - { - switch(QueryDelete(DirName,true,true)) - { - case QR_DELETE: - doDel=1; - break; - case QR_ALL: - doDel=1; - bAskRReadOnly=false; - break; - case QR_SKIP: - doDel=0; - break; - case QR_SKIPALL: - doDel=0; - bSkipRReadOnly=true; - break; - default: - doDel=0; - ret=0; - bBrokenByEsc=true; - break; - } - } - } -*/ - if (doDel) - { - string strDirMask(DirName); - strDirMask+=L"\\*"; - - if ((hFind=FindFirstFileW(strDirMask,&wfdFindData)) != INVALID_HANDLE_VALUE) - { - do - { - string strNew; - GetFullFileName(strNew,DirName,wfdFindData.cFileName); - - if (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - if (!(wfdFindData.cFileName[0]==L'.' && !wfdFindData.cFileName[1]) && !(wfdFindData.cFileName[0]==L'.' && wfdFindData.cFileName[1]==L'.' && !wfdFindData.cFileName[2])) - { - if (!DelDir(strNew)) - ret=0; - } - } - else - { - if (!DelFile(strNew)) - ret=0; - } - } - while (ret && FindNextFile(hFind,&wfdFindData)); - FindClose(hFind); - } - } - - if (ret && doDel && Opt.SyncDel) - { - SetFileAttributesW(DirName,FILE_ATTRIBUTE_DIRECTORY); - if (!RemoveDirectoryW(DirName)) - ret=0; - } - } - - if (!ret) - { - const wchar_t *MsgItems[]= - { - GetMsg(MWarning), - GetMsg(MFailedDeleteFolder), - GetPosToName(DirName), - GetMsg(MRetry), GetMsg(MSkip), GetMsg(MCancel) - }; - - int ExitCode=bBrokenByEsc ? 2/*MCancel*/ : Info.Message(&MainGuid,&FailedDelFolderMsgGuid,FMSG_WARNING|FMSG_ERRORTYPE,0,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),3); - - if (!ExitCode) - goto RetryDelDir; - else if (ExitCode == 1) - ret=1; - - if (WFD.dwFileAttributes) SetFileAttributesW(DirName,WFD.dwFileAttributes); // пробуем восстановить - } - - return ret; + WIN32_FIND_DATA wfdFindData; + HANDLE hFind = FindFirstFileW(DirName, &wfdFindData); + + if (hFind == INVALID_HANDLE_VALUE) + { + return 1; // не найден, считаем, что удалили + } + else + { + FindClose(hFind); + if (!(wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + ret = 0; + } + + if (ret) + { + int doDel = 1; + + // Delete confirmation + if (bAskDel) + { + switch (QueryDelete(DirName, true, false)) + { + case QR_DELETE: + doDel = 1; + break; + case QR_ALL: + doDel = 1; + bAskDel = false; + break; + case QR_SKIP: + doDel = 0; + break; + case QR_SKIPALL: + doDel = 0; + Opt.SyncDel = 0; + break; + default: + doDel = 0; + ret = 0; + bBrokenByEsc = true; + break; + } + } + /* + // ReadOnly delete confirmation + if (doDel && (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + { + if (bSkipRReadOnly) + { + doDel=0; + } + else if (bAskRReadOnly) + { + switch(QueryDelete(DirName,true,true)) + { + case QR_DELETE: + doDel=1; + break; + case QR_ALL: + doDel=1; + bAskRReadOnly=false; + break; + case QR_SKIP: + doDel=0; + break; + case QR_SKIPALL: + doDel=0; + bSkipRReadOnly=true; + break; + default: + doDel=0; + ret=0; + bBrokenByEsc=true; + break; + } + } + } + */ + if (doDel) + { + string strDirMask(DirName); + strDirMask += L"\\*"; + + if ((hFind = FindFirstFileW(strDirMask, &wfdFindData)) != INVALID_HANDLE_VALUE) + { + do + { + string strNew; + GetFullFileName(strNew, DirName, wfdFindData.cFileName); + + if (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (!(wfdFindData.cFileName[0] == L'.' && !wfdFindData.cFileName[1]) && + !(wfdFindData.cFileName[0] == L'.' && wfdFindData.cFileName[1] == L'.' && !wfdFindData.cFileName[2])) + { + if (!DelDir(strNew)) + ret = 0; + } + } + else + { + if (!DelFile(strNew)) + ret = 0; + } + } while (ret && FindNextFile(hFind, &wfdFindData)); + FindClose(hFind); + } + } + + if (ret && doDel && Opt.SyncDel) + { + SetFileAttributesW(DirName, FILE_ATTRIBUTE_DIRECTORY); + if (!RemoveDirectoryW(DirName)) + ret = 0; + } + } + + if (!ret) + { + const wchar_t* MsgItems[] = {GetMsg(MWarning), GetMsg(MFailedDeleteFolder), GetPosToName(DirName), GetMsg(MRetry), GetMsg(MSkip), + GetMsg(MCancel)}; + + int ExitCode = bBrokenByEsc + ? 2 /*MCancel*/ + : Info.Message(&MainGuid, &FailedDelFolderMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); + + if (!ExitCode) + goto RetryDelDir; + else if (ExitCode == 1) + ret = 1; + + if (WFD.dwFileAttributes) + SetFileAttributesW(DirName, WFD.dwFileAttributes); // пробуем восстановить + } + + return ret; } /*************************************************************************** @@ -943,103 +936,106 @@ int AdvCmpProc::DelDir(const wchar_t *DirName) ***************************************************************************/ int AdvCmpProc::Synchronize() { - int ret=0; - - if (Opt.Sync==QR_ALL) // есть элементы, синхронизируем - { - bBrokenByEsc=false; - bStartMsg=true; - bAskLOverwrite=bAskROverwrite=GetFarSetting(FSSF_CONFIRMATIONS,L"Copy")?true:false; - bAskLReadOnly=bAskRReadOnly=GetFarSetting(FSSF_CONFIRMATIONS,L"RO")?true:false; - bAskDel=GetFarSetting(FSSF_CONFIRMATIONS,L"Delete")?true:false; - bSkipLReadOnly=bSkipRReadOnly=false; - - hConInp=CreateFileW(L"CONIN$", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); - DWORD dwTicks=GetTickCount(); - cmpFileList *pFileList=&cFList; - - for (int i=0; iiCount; i++) - { - cmpFile *cur=&pFileList->F[i]; - int direction; - if ((cur->L.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) && (cur->R.dwAttributes&FILE_ATTRIBUTE_DIRECTORY)) - continue; - if ( ((cur->dwFlags&RCIF_USERSELECT) && !Opt.ShowListSelect) || ((cur->dwFlags&RCIF_DIFFER) && !Opt.ShowListDifferent) || - ((cur->dwFlags&RCIF_LNEW) && !Opt.ShowListLNew) || ((cur->dwFlags&RCIF_RNEW) && !Opt.ShowListRNew) ) - continue; - if ((cur->dwFlags&RCIF_EQUAL) || ((cur->dwFlags&RCIF_DIFFER) && !(cur->dwFlags&(RCIF_USERLNEW|RCIF_USERRNEW))) || (cur->dwFlags&RCIF_USERNONE)) - continue; - if ((cur->dwFlags&RCIF_USERLNEW) || (cur->dwFlags&RCIF_LNEW)) - { - direction=1; // слева новый, значит копируем направо - string strSrcName, strDestName; - GetFullFileName(strSrcName,cur->L.Dir,cur->L.FileName); - GetFullFileName(strDestName,cur->R.Dir,(cur->R.FileName?cur->R.FileName:cur->L.FileName)); - - if (cur->L.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) - { - if (!(ret=SyncDir(strSrcName,strDestName,direction))) - break; - } - else - { - if (!(ret=SyncFile(strSrcName,strDestName,direction,cur->dwFlags))) - break; - } - } - else if (cur->dwFlags&RCIF_USERDEL) // справа удаляем - { - string strName; - GetFullFileName(strName,cur->R.Dir,cur->R.FileName); - - if (cur->R.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) - { - if (!(ret=DelDir(strName))) - break; - } - else - { - if (!(ret=DelFile(strName))) - break; - } - } - else if ((cur->dwFlags&RCIF_USERRNEW) || (cur->dwFlags&RCIF_RNEW)) - { - direction=-1; // справа новый, значит копируем налево - string strSrcName, strDestName; - GetFullFileName(strSrcName,cur->R.Dir,cur->R.FileName); - GetFullFileName(strDestName,cur->L.Dir,(cur->L.FileName?cur->L.FileName:cur->R.FileName)); - - if (cur->R.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) - { - if (!(ret=SyncDir(strSrcName,strDestName,direction))) - break; - } - else - { - if (!(ret=SyncFile(strSrcName,strDestName,direction,cur->dwFlags))) - break; - } - } - } - - if (hConInp!=INVALID_HANDLE_VALUE) CloseHandle(hConInp); - - if (ret && !bBrokenByEsc) - { - if (Opt.Sound && (GetTickCount()-dwTicks > 30000)) MessageBeep(MB_ICONASTERISK); - Info.AdvControl(&MainGuid,ACTL_PROGRESSNOTIFY,0,0); - } - - // Кеш стал неактуальным, освободим - if (Cache.RCI) - free(Cache.RCI); - Cache.RCI=0; - Cache.ItemsNumber=0; - } - - Info.PanelControl(LPanel.hPanel,FCTL_UPDATEPANEL,0,0); - Info.PanelControl(RPanel.hPanel,FCTL_UPDATEPANEL,0,0); - - return ret; + int ret = 0; + + if (Opt.Sync == QR_ALL) // есть элементы, синхронизируем + { + bBrokenByEsc = false; + bStartMsg = true; + bAskLOverwrite = bAskROverwrite = GetFarSetting(FSSF_CONFIRMATIONS, L"Copy") ? true : false; + bAskLReadOnly = bAskRReadOnly = GetFarSetting(FSSF_CONFIRMATIONS, L"RO") ? true : false; + bAskDel = GetFarSetting(FSSF_CONFIRMATIONS, L"Delete") ? true : false; + bSkipLReadOnly = bSkipRReadOnly = false; + + hConInp = CreateFileW(L"CONIN$", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + DWORD dwTicks = GetTickCount(); + cmpFileList* pFileList = &cFList; + + for (int i = 0; i < pFileList->iCount; i++) + { + cmpFile* cur = &pFileList->F[i]; + int direction; + if ((cur->L.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) && (cur->R.dwAttributes & FILE_ATTRIBUTE_DIRECTORY)) + continue; + if (((cur->dwFlags & RCIF_USERSELECT) && !Opt.ShowListSelect) || ((cur->dwFlags & RCIF_DIFFER) && !Opt.ShowListDifferent) || + ((cur->dwFlags & RCIF_LNEW) && !Opt.ShowListLNew) || ((cur->dwFlags & RCIF_RNEW) && !Opt.ShowListRNew)) + continue; + if ((cur->dwFlags & RCIF_EQUAL) || ((cur->dwFlags & RCIF_DIFFER) && !(cur->dwFlags & (RCIF_USERLNEW | RCIF_USERRNEW))) || + (cur->dwFlags & RCIF_USERNONE)) + continue; + if ((cur->dwFlags & RCIF_USERLNEW) || (cur->dwFlags & RCIF_LNEW)) + { + direction = 1; // слева новый, значит копируем направо + string strSrcName, strDestName; + GetFullFileName(strSrcName, cur->L.Dir, cur->L.FileName); + GetFullFileName(strDestName, cur->R.Dir, (cur->R.FileName ? cur->R.FileName : cur->L.FileName)); + + if (cur->L.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (!(ret = SyncDir(strSrcName, strDestName, direction))) + break; + } + else + { + if (!(ret = SyncFile(strSrcName, strDestName, direction, cur->dwFlags))) + break; + } + } + else if (cur->dwFlags & RCIF_USERDEL) // справа удаляем + { + string strName; + GetFullFileName(strName, cur->R.Dir, cur->R.FileName); + + if (cur->R.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (!(ret = DelDir(strName))) + break; + } + else + { + if (!(ret = DelFile(strName))) + break; + } + } + else if ((cur->dwFlags & RCIF_USERRNEW) || (cur->dwFlags & RCIF_RNEW)) + { + direction = -1; // справа новый, значит копируем налево + string strSrcName, strDestName; + GetFullFileName(strSrcName, cur->R.Dir, cur->R.FileName); + GetFullFileName(strDestName, cur->L.Dir, (cur->L.FileName ? cur->L.FileName : cur->R.FileName)); + + if (cur->R.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (!(ret = SyncDir(strSrcName, strDestName, direction))) + break; + } + else + { + if (!(ret = SyncFile(strSrcName, strDestName, direction, cur->dwFlags))) + break; + } + } + } + + if (hConInp != INVALID_HANDLE_VALUE) + CloseHandle(hConInp); + + if (ret && !bBrokenByEsc) + { + if (Opt.Sound && (GetTickCount() - dwTicks > 30000)) + MessageBeep(MB_ICONASTERISK); + Info.AdvControl(&MainGuid, ACTL_PROGRESSNOTIFY, 0, 0); + } + + // Кеш стал неактуальным, освободим + if (Cache.RCI) + free(Cache.RCI); + Cache.RCI = 0; + Cache.ItemsNumber = 0; + } + + Info.PanelControl(LPanel.hPanel, FCTL_UPDATEPANEL, 0, 0); + Info.PanelControl(RPanel.hPanel, FCTL_UPDATEPANEL, 0, 0); + + return ret; } From c393161e62ab8949a26cccdfe649fa277c6bf918 Mon Sep 17 00:00:00 2001 From: Aleksey Dobrunov Date: Wed, 27 Jan 2021 23:07:01 +0500 Subject: [PATCH 2/6] invalidate handle after close; fix #4 --- src/AdvCmp.cpp | 6 ++++++ src/AdvCmpProc_DUP.cpp | 6 ++++++ src/AdvCmpProc_SYNC.cpp | 3 +++ 3 files changed, 15 insertions(+) diff --git a/src/AdvCmp.cpp b/src/AdvCmp.cpp index ab47ab8..b62083b 100644 --- a/src/AdvCmp.cpp +++ b/src/AdvCmp.cpp @@ -604,7 +604,10 @@ HANDLE WINAPI OpenW(const struct OpenInfo* OInfo) bool bDifferenceNotFound = AdvCmp.CompareDirs(&LList, &RList, true, 0); if (hConInp != INVALID_HANDLE_VALUE) + { CloseHandle(hConInp); + hConInp = INVALID_HANDLE_VALUE; + } if (AdvCmp.TitleSaved) SetConsoleTitle(AdvCmp.strFarTitle); @@ -648,7 +651,10 @@ HANDLE WINAPI OpenW(const struct OpenInfo* OInfo) else { if (hConInp != INVALID_HANDLE_VALUE) + { CloseHandle(hConInp); + hConInp = INVALID_HANDLE_VALUE; + } AdvCmp.CompareCurFile(LList.Dir, LList.PPI[LPanel.PInfo.CurrentItem].FileName, RList.Dir, RList.PPI[RPanel.PInfo.CurrentItem].FileName, 1); } AdvCmp.Close(); diff --git a/src/AdvCmpProc_DUP.cpp b/src/AdvCmpProc_DUP.cpp index fc0e78b..6d60467 100644 --- a/src/AdvCmpProc_DUP.cpp +++ b/src/AdvCmpProc_DUP.cpp @@ -1891,7 +1891,10 @@ int AdvCmpProc::Duplicate(const struct DirList* pList) dFList.F = (dupFile*) realloc(dFList.F, (dFList.iCount = Index + 1) * sizeof(dupFile)); if (hConInp != INVALID_HANDLE_VALUE) + { CloseHandle(hConInp); + hConInp = INVALID_HANDLE_VALUE; + } Info.PanelControl(LPanel.hPanel, FCTL_REDRAWPANEL, 0, 0); Info.PanelControl(RPanel.hPanel, FCTL_REDRAWPANEL, 0, 0); if (TitleSaved) @@ -1943,6 +1946,9 @@ int AdvCmpProc::Duplicate(const struct DirList* pList) END: if (hConInp != INVALID_HANDLE_VALUE) + { CloseHandle(hConInp); + hConInp = INVALID_HANDLE_VALUE; + } return ret; } diff --git a/src/AdvCmpProc_SYNC.cpp b/src/AdvCmpProc_SYNC.cpp index fc32b3c..82cdf97 100644 --- a/src/AdvCmpProc_SYNC.cpp +++ b/src/AdvCmpProc_SYNC.cpp @@ -1018,7 +1018,10 @@ int AdvCmpProc::Synchronize() } if (hConInp != INVALID_HANDLE_VALUE) + { CloseHandle(hConInp); + hConInp = INVALID_HANDLE_VALUE; + } if (ret && !bBrokenByEsc) { From 365c25ca54af432d23149f4d1d60effc61f8c5eb Mon Sep 17 00:00:00 2001 From: Aleksey Dobrunov Date: Wed, 27 Jan 2021 23:32:28 +0500 Subject: [PATCH 3/6] use nullptr --- src/AdvCmp.cpp | 112 ++++++++++++++++---------------- src/AdvCmpDlgOpt.cpp | 44 ++++++------- src/AdvCmpProc_CLIST.cpp | 134 +++++++++++++++++++-------------------- src/AdvCmpProc_DUP.cpp | 124 ++++++++++++++++++------------------ src/AdvCmpProc_SYNC.cpp | 70 ++++++++++---------- 5 files changed, 242 insertions(+), 242 deletions(-) diff --git a/src/AdvCmp.cpp b/src/AdvCmp.cpp index b62083b..3a0e640 100644 --- a/src/AdvCmp.cpp +++ b/src/AdvCmp.cpp @@ -52,8 +52,8 @@ bool bBrokenByEsc; bool bStartMsg; bool bGflLoaded = false; bool bBASSLoaded = false; // bass.dll загружена? -HMODULE GflHandle = NULL; -HMODULE BASSHandle = NULL; +HMODULE GflHandle = nullptr; +HMODULE BASSHandle = nullptr; HANDLE hConInp = INVALID_HANDLE_VALUE; /**************************************************************************** @@ -70,7 +70,7 @@ const wchar_t* GetMsg(int MsgId) void ErrorMsg(DWORD Title, DWORD Body) { const wchar_t* MsgItems[] = {GetMsg(Title), GetMsg(Body), GetMsg(MOK)}; - Info.Message(&MainGuid, &ErrorMsgGuid, FMSG_WARNING, 0, MsgItems, 3, 1); + Info.Message(&MainGuid, &ErrorMsgGuid, FMSG_WARNING, nullptr, MsgItems, 3, 1); } /**************************************************************************** @@ -79,7 +79,7 @@ void ErrorMsg(DWORD Title, DWORD Body) bool YesNoMsg(DWORD Title, DWORD Body) { const wchar_t* MsgItems[] = {GetMsg(Title), GetMsg(Body)}; - return (!Info.Message(&MainGuid, &YesNoMsgGuid, FMSG_WARNING | FMSG_MB_YESNO, 0, MsgItems, 2, 0)); + return (!Info.Message(&MainGuid, &YesNoMsgGuid, FMSG_WARNING | FMSG_MB_YESNO, nullptr, MsgItems, 2, 0)); } // Сообщение для отладки @@ -91,14 +91,14 @@ int DebugMsg(wchar_t* msg, wchar_t* msg2, unsigned int i) MsgItems[1] = msg2; MsgItems[2] = msg; MsgItems[3] = buf; - return (!Info.Message(&MainGuid, &DebugMsgGuid, FMSG_WARNING | FMSG_MB_OKCANCEL, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 2)); + return (!Info.Message(&MainGuid, &DebugMsgGuid, FMSG_WARNING | FMSG_MB_OKCANCEL, nullptr, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 2)); } __int64 GetFarSetting(FARSETTINGS_SUBFOLDERS Root, const wchar_t* Name) { __int64 result = 0; FarSettingsCreate settings = {sizeof(FarSettingsCreate), FarGuid, INVALID_HANDLE_VALUE}; - HANDLE Settings = Info.SettingsControl(INVALID_HANDLE_VALUE, SCTL_CREATE, 0, &settings) ? settings.Handle : 0; + HANDLE Settings = Info.SettingsControl(INVALID_HANDLE_VALUE, SCTL_CREATE, 0, &settings) ? settings.Handle : nullptr; if (Settings) { FarSettingsItem item = {sizeof(FarSettingsItem), Root, Name, FST_UNKNOWN, {0}}; @@ -106,7 +106,7 @@ __int64 GetFarSetting(FARSETTINGS_SUBFOLDERS Root, const wchar_t* Name) { result = item.Number; } - Info.SettingsControl(Settings, SCTL_FREE, 0, 0); + Info.SettingsControl(Settings, SCTL_FREE, 0, nullptr); } return result; } @@ -121,7 +121,7 @@ void GetDirList(FarPanelInfo& CurPanel, DirList& CurList) { for (int i = 0; i < CurList.ItemsNumber; i++) { - size_t size = Info.PanelControl(CurPanel.hPanel, FCTL_GETPANELITEM, i, 0); + size_t size = Info.PanelControl(CurPanel.hPanel, FCTL_GETPANELITEM, i, nullptr); PluginPanelItem* PPI = (PluginPanelItem*) malloc(size); if (PPI) { @@ -159,10 +159,10 @@ void GetDirList(FarPanelInfo& CurPanel, DirList& CurList) else { CurList.ItemsNumber = 0; - CurList.PPI = NULL; + CurList.PPI = nullptr; } - int size = Info.PanelControl(CurPanel.hPanel, FCTL_GETPANELDIRECTORY, 0, 0); + int size = Info.PanelControl(CurPanel.hPanel, FCTL_GETPANELDIRECTORY, 0, nullptr); if (size) { FarPanelDirectory* buf = (FarPanelDirectory*) malloc(size); @@ -173,7 +173,7 @@ void GetDirList(FarPanelInfo& CurPanel, DirList& CurList) wcscpy(CurPanel.Dir, buf->Name); if (!(CurPanel.PInfo.Flags & PFLAGS_PLUGIN)) { - size = FSF.ConvertPath(CPM_NATIVE, buf->Name, 0, 0); + size = FSF.ConvertPath(CPM_NATIVE, buf->Name, nullptr, 0); CurList.Dir = (wchar_t*) malloc(size * sizeof(wchar_t)); if (CurList.Dir) FSF.ConvertPath(CPM_NATIVE, buf->Name, CurList.Dir, size); @@ -195,10 +195,10 @@ void FreeDirList(struct DirList* pList) { for (int i = 0; i < pList->ItemsNumber; i++) free((void*) pList->PPI[i].FileName); free(pList->PPI); - pList->PPI = NULL; + pList->PPI = nullptr; } free(pList->Dir); - pList->Dir = NULL; + pList->Dir = nullptr; pList->ItemsNumber = 0; } @@ -207,39 +207,39 @@ void FreeDirList(struct DirList* pList) ****************************************************************************/ /// VisComp.dll -PCOMPAREFILES pCompareFiles = NULL; +PCOMPAREFILES pCompareFiles = nullptr; /// libgfl340.dll -extern PGFLGETVERSION pGflGetVersion = NULL; -PGFLLIBRARYINIT pGflLibraryInit = NULL; -PGFLENABLELZW pGflEnableLZW = NULL; -PGFLLIBRARYEXIT pGflLibraryExit = NULL; -PGFLLOADBITMAPW pGflLoadBitmapW = NULL; -PGFLGETNUMBEROFFORMAT pGflGetNumberOfFormat = NULL; -PGFLGETFORMATINFORMATIONBYINDEX pGflGetFormatInformationByIndex = NULL; -PGFLGETDEFAULTLOADPARAMS pGflGetDefaultLoadParams = NULL; -PGFLCHANGECOLORDEPTH pGflChangeColorDepth = NULL; -PGFLROTATE pGflRotate = NULL; -PGFLRESIZE pGflResize = NULL; -PGFLFREEBITMAP pGflFreeBitmap = NULL; -PGFLFREEFILEINFORMATION pGflFreeFileInformation = NULL; -PGFLGETCOLORAT pGflGetColorAt = NULL; +extern PGFLGETVERSION pGflGetVersion = nullptr; +PGFLLIBRARYINIT pGflLibraryInit = nullptr; +PGFLENABLELZW pGflEnableLZW = nullptr; +PGFLLIBRARYEXIT pGflLibraryExit = nullptr; +PGFLLOADBITMAPW pGflLoadBitmapW = nullptr; +PGFLGETNUMBEROFFORMAT pGflGetNumberOfFormat = nullptr; +PGFLGETFORMATINFORMATIONBYINDEX pGflGetFormatInformationByIndex = nullptr; +PGFLGETDEFAULTLOADPARAMS pGflGetDefaultLoadParams = nullptr; +PGFLCHANGECOLORDEPTH pGflChangeColorDepth = nullptr; +PGFLROTATE pGflRotate = nullptr; +PGFLRESIZE pGflResize = nullptr; +PGFLFREEBITMAP pGflFreeBitmap = nullptr; +PGFLFREEFILEINFORMATION pGflFreeFileInformation = nullptr; +PGFLGETCOLORAT pGflGetColorAt = nullptr; /// bass.dll -PBASS_GETVERSION pBASS_GetVersion = NULL; -PBASS_SETCONFIG pBASS_SetConfig = NULL; -PBASS_INIT pBASS_Init = NULL; -PBASS_FREE pBASS_Free = NULL; -PBASS_STREAMCREATEFILE pBASS_StreamCreateFile = NULL; -PBASS_STREAMFREE pBASS_StreamFree = NULL; -PBASS_CHANNELGETLENGTH pBASS_ChannelGetLength = NULL; -PBASS_CHANNELBYTES2SECONDS pBASS_ChannelBytes2Seconds = NULL; -PBASS_CHANNELGETINFO pBASS_ChannelGetInfo = NULL; -PBASS_CHANNELGETTAGS pBASS_ChannelGetTags = NULL; -PBASS_STREAMGETFILEPOSITION pBASS_StreamGetFilePosition = NULL; -PBASS_GETDEVICEINFO pBASS_GetDeviceInfo = NULL; -PBASS_CHANNELISACTIVE pBASS_ChannelIsActive = NULL; -PBASS_CHANNELGETDATA pBASS_ChannelGetData = NULL; +PBASS_GETVERSION pBASS_GetVersion = nullptr; +PBASS_SETCONFIG pBASS_SetConfig = nullptr; +PBASS_INIT pBASS_Init = nullptr; +PBASS_FREE pBASS_Free = nullptr; +PBASS_STREAMCREATEFILE pBASS_StreamCreateFile = nullptr; +PBASS_STREAMFREE pBASS_StreamFree = nullptr; +PBASS_CHANNELGETLENGTH pBASS_ChannelGetLength = nullptr; +PBASS_CHANNELBYTES2SECONDS pBASS_ChannelBytes2Seconds = nullptr; +PBASS_CHANNELGETINFO pBASS_ChannelGetInfo = nullptr; +PBASS_CHANNELGETTAGS pBASS_ChannelGetTags = nullptr; +PBASS_STREAMGETFILEPOSITION pBASS_StreamGetFilePosition = nullptr; +PBASS_GETDEVICEINFO pBASS_GetDeviceInfo = nullptr; +PBASS_CHANNELISACTIVE pBASS_ChannelIsActive = nullptr; +PBASS_CHANNELGETDATA pBASS_ChannelGetData = nullptr; bool FindFile(wchar_t* Dir, wchar_t* Pattern, string& strFileName) { @@ -439,7 +439,7 @@ bool LoadBASS(wchar_t* PlugPath) if (bBASSLoaded) { - if (!pBASS_Init(0, 44100, BASS_DEVICE_MONO, 0, NULL)) + if (!pBASS_Init(0, 44100, BASS_DEVICE_MONO, nullptr, nullptr)) UnLoadBASS(); } } @@ -505,7 +505,7 @@ void WINAPI GetPluginInfoW(struct PluginInfo* pInfo) ****************************************************************************/ HANDLE WINAPI OpenW(const struct OpenInfo* OInfo) { - HANDLE hPanel = NULL; + HANDLE hPanel = nullptr; struct PanelInfo PInfo = {sizeof(PanelInfo)}; // Если не удалось запросить информацию о активной панели... @@ -553,7 +553,7 @@ HANDLE WINAPI OpenW(const struct OpenInfo* OInfo) GetDirList(LPanel, LList); GetDirList(RPanel, RList); - WinInfo.hFarWindow = (HWND) Info.AdvControl(&MainGuid, ACTL_GETFARHWND, 0, 0); + WinInfo.hFarWindow = (HWND) Info.AdvControl(&MainGuid, ACTL_GETFARHWND, 0, nullptr); GetClientRect(WinInfo.hFarWindow, &WinInfo.Win); if (Info.AdvControl(&MainGuid, ACTL_GETFARRECT, 0, &WinInfo.Con)) { @@ -581,7 +581,7 @@ HANDLE WINAPI OpenW(const struct OpenInfo* OInfo) BASS_DEVICEINFO info; pBASS_GetDeviceInfo(0, &info); if (!(info.flags & BASS_DEVICE_INIT)) - if (!pBASS_Init(0, 44100, BASS_DEVICE_MONO, 0, NULL)) + if (!pBASS_Init(0, 44100, BASS_DEVICE_MONO, nullptr, nullptr)) UnLoadBASS(); } @@ -592,7 +592,7 @@ HANDLE WINAPI OpenW(const struct OpenInfo* OInfo) { DWORD dwTicks = GetTickCount(); // откроем, для проверок на Esc - hConInp = CreateFileW(L"CONIN$", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + hConInp = CreateFileW(L"CONIN$", GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr); class AdvCmpProc AdvCmp; AdvCmp.Init(); @@ -615,29 +615,29 @@ HANDLE WINAPI OpenW(const struct OpenInfo* OInfo) if (!bBrokenByEsc) { { - Info.PanelControl(LPanel.hPanel, FCTL_BEGINSELECTION, 0, 0); - Info.PanelControl(RPanel.hPanel, FCTL_BEGINSELECTION, 0, 0); + Info.PanelControl(LPanel.hPanel, FCTL_BEGINSELECTION, 0, nullptr); + Info.PanelControl(RPanel.hPanel, FCTL_BEGINSELECTION, 0, nullptr); for (int i = 0; i < LList.ItemsNumber; i++) Info.PanelControl(LPanel.hPanel, FCTL_SETSELECTION, i, (void*) (LList.PPI[i].Flags & PPIF_SELECTED)); for (int i = 0; i < RList.ItemsNumber; i++) Info.PanelControl(RPanel.hPanel, FCTL_SETSELECTION, i, (void*) (RList.PPI[i].Flags & PPIF_SELECTED)); - Info.PanelControl(LPanel.hPanel, FCTL_ENDSELECTION, 0, 0); - Info.PanelControl(LPanel.hPanel, FCTL_REDRAWPANEL, 0, 0); - Info.PanelControl(RPanel.hPanel, FCTL_ENDSELECTION, 0, 0); - Info.PanelControl(RPanel.hPanel, FCTL_REDRAWPANEL, 0, 0); + Info.PanelControl(LPanel.hPanel, FCTL_ENDSELECTION, 0, nullptr); + Info.PanelControl(LPanel.hPanel, FCTL_REDRAWPANEL, 0, nullptr); + Info.PanelControl(RPanel.hPanel, FCTL_ENDSELECTION, 0, nullptr); + Info.PanelControl(RPanel.hPanel, FCTL_REDRAWPANEL, 0, nullptr); } if (Opt.Sound && (GetTickCount() - dwTicks > 30000)) MessageBeep(MB_ICONASTERISK); - Info.AdvControl(&MainGuid, ACTL_PROGRESSNOTIFY, 0, 0); + Info.AdvControl(&MainGuid, ACTL_PROGRESSNOTIFY, 0, nullptr); if (CmpInfo.Errors && Opt.ShowMsg) ErrorMsg(MOpenErrorTitle, MOpenErrorBody); if (bDifferenceNotFound && Opt.ShowMsg) { const wchar_t* MsgItems[] = {GetMsg(MNoDiffTitle), GetMsg(MNoDiffBody), GetMsg(MOK)}; - Info.Message(&MainGuid, &NoDiffMsgGuid, 0, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 1); + Info.Message(&MainGuid, &NoDiffMsgGuid, 0, nullptr, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 1); } else if (!bDifferenceNotFound && Opt.Dialog) AdvCmp.ShowCmpDialog(&LList, &RList); @@ -676,7 +676,7 @@ void WINAPI ExitFARW(const struct ExitInfo* pInfo) //Освободим память в случае выгрузки плагина if (Cache.RCI) free(Cache.RCI); - Cache.RCI = NULL; + Cache.RCI = nullptr; Cache.ItemsNumber = 0; UnLoadGfl(); diff --git a/src/AdvCmpDlgOpt.cpp b/src/AdvCmpDlgOpt.cpp index 9c70b26..634bdfc 100644 --- a/src/AdvCmpDlgOpt.cpp +++ b/src/AdvCmpDlgOpt.cpp @@ -110,31 +110,31 @@ struct ParamStore int ID; wchar_t* OptName; int* Option; -} StoreOpt[] = {{DlgBORDER, 0, 0}, - {DlgMODE, 0, 0}, +} StoreOpt[] = {{DlgBORDER, nullptr, nullptr}, + {DlgMODE, nullptr, nullptr}, {DlgMODEBOX, L"Mode", &Opt.Mode}, {DlgCMPCASE, L"CmpCase", &Opt.CmpCase}, {DlgCMPSIZE, L"CmpSize", &Opt.CmpSize}, {DlgCMPTIME, L"CmpTime", &Opt.CmpTime}, {DlgSECONDS, L"Seconds", &Opt.Seconds}, - {DlgIGNORESEC, 0, 0}, + {DlgIGNORESEC, nullptr, nullptr}, {DlgPRECISION, L"LowPrecisionTime", &Opt.LowPrecisionTime}, {DlgTIMEZONE, L"IgnoreTimeZone", &Opt.IgnoreTimeZone}, {DlgCMPCONTENTS, L"CmpContents", &Opt.CmpContents}, {DlgDIFFTIME, L"OnlyTimeDiff", &Opt.OnlyTimeDiff}, {DlgCACHE, L"Cache", &Opt.Cache}, {DlgCACHEIGNORE, L"CacheIgnore", &Opt.CacheIgnore}, - {DlgCACHEUSE, 0, 0}, - {DlgCACHECLEAR, 0, 0}, + {DlgCACHEUSE, nullptr, nullptr}, + {DlgCACHECLEAR, nullptr, nullptr}, {DlgPARTLY, L"Partly", &Opt.Partly}, {DlgPARTLYFULL, L"PartlyFull", &Opt.PartlyFull}, - {DlgLPARTLYKB, 0, 0}, + {DlgLPARTLYKB, nullptr, nullptr}, {DlgEPARTLYKB, L"PartlyKbSize", &Opt.PartlyKbSize}, {DlgIGNORE, L"Ignore", &Opt.Ignore}, {DlgIGNORETEMPL, L"IgnoreTemplates", &Opt.IgnoreTemplates}, - {DlgDUPPATH, 0, 0}, + {DlgDUPPATH, nullptr, nullptr}, {DlgDUPNAME, L"DupName", &Opt.DupName}, {DlgDUPSIZE, L"DupSize", &Opt.DupSize}, {DlgDUPCONTENTS, L"DupContents", &Opt.DupContents}, @@ -148,16 +148,16 @@ struct ParamStore {DlgDUPMUSICDURL, L"DupMusicDuration", &Opt.DupMusicDuration}, {DlgDUPMUSICDURE, L"DupMusicDurationSec", &Opt.DupMusicDurationSec}, - {DlgSEP1, 0, 0}, + {DlgSEP1, nullptr, nullptr}, {DlgSUBFOLDER, L"Subfolders", &Opt.Subfolders}, - {DlgLMAXDEPTH, 0, 0}, + {DlgLMAXDEPTH, nullptr, nullptr}, {DlgEMAXDEPTH, L"MaxScanDepth", &Opt.MaxScanDepth}, - {DlgSCANSYMLINK, 0, 0}, + {DlgSCANSYMLINK, nullptr, nullptr}, {DlgLCMPSKIP, L"SkipSubstr", &Opt.SkipSubstr}, - {DlgECMPSKIP, 0, 0}, + {DlgECMPSKIP, nullptr, nullptr}, {DlgSTOPDIFFDUP, L"StopDiffDup", &Opt.StopDiffDup}, {DlgFILTER, L"Filter", &Opt.Filter}, - {DlgFILTERBOTTON, 0, 0}, + {DlgFILTERBOTTON, nullptr, nullptr}, {DlgSELECTED, L"ProcessSelected", &Opt.ProcessSelected}, {DlgSELECTEDNEW, L"SelectedNew", &Opt.SelectedNew}, {DlgONLYRIGHT, L"SyncOnlyRight", &Opt.SyncOnlyRight}, @@ -174,7 +174,7 @@ struct ParamStore intptr_t WINAPI AdvCmpDlgOpt::ShowOptDialogProcThunk(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void* Param2) { - AdvCmpDlgOpt* Class = (AdvCmpDlgOpt*) Info.SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); + AdvCmpDlgOpt* Class = (AdvCmpDlgOpt*) Info.SendDlgMessage(hDlg, DM_GETDLGDATA, 0, nullptr); return Class->ShowOptDialogProc(hDlg, Msg, Param1, Param2); } @@ -185,20 +185,20 @@ void AdvCmpDlgOpt::Close() if (Opt.Substr) { free(Opt.Substr); - Opt.Substr = NULL; + Opt.Substr = nullptr; } if (Opt.WinMergePath) { free(Opt.WinMergePath); - Opt.WinMergePath = NULL; + Opt.WinMergePath = nullptr; } if (Opt.DupPath) { free(Opt.DupPath); - Opt.DupPath = NULL; + Opt.DupPath = nullptr; } if (Opt.Filter) - Info.FileFilterControl(Opt.hCustomFilter, FFCTL_FREEFILEFILTER, 0, 0); + Info.FileFilterControl(Opt.hCustomFilter, FFCTL_FREEFILEFILTER, 0, nullptr); } intptr_t WINAPI AdvCmpDlgOpt::ShowOptDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void* Param2) @@ -209,7 +209,7 @@ intptr_t WINAPI AdvCmpDlgOpt::ShowOptDialogProc(HANDLE hDlg, intptr_t Msg, intpt bool CheckSelect = false; if (LPanel.PInfo.SelectedItemsNumber) { - FarGetPluginPanelItem FGPPI = {sizeof(FarGetPluginPanelItem), 0, 0}; + FarGetPluginPanelItem FGPPI = {sizeof(FarGetPluginPanelItem), 0, nullptr}; FGPPI.Item = (PluginPanelItem*) malloc(FGPPI.Size = Info.PanelControl(LPanel.hPanel, FCTL_GETSELECTEDPANELITEM, 0, &FGPPI)); if (FGPPI.Item) { @@ -221,7 +221,7 @@ intptr_t WINAPI AdvCmpDlgOpt::ShowOptDialogProc(HANDLE hDlg, intptr_t Msg, intpt } if (!CheckSelect && RPanel.PInfo.SelectedItemsNumber) { - FarGetPluginPanelItem FGPPI = {sizeof(FarGetPluginPanelItem), 0, 0}; + FarGetPluginPanelItem FGPPI = {sizeof(FarGetPluginPanelItem), 0, nullptr}; FGPPI.Item = (PluginPanelItem*) malloc(FGPPI.Size = Info.PanelControl(RPanel.hPanel, FCTL_GETSELECTEDPANELITEM, 0, &FGPPI)); if (FGPPI.Item) { @@ -945,7 +945,7 @@ intptr_t WINAPI AdvCmpDlgOpt::ShowOptDialogProc(HANDLE hDlg, intptr_t Msg, intpt Opt.ScanSymlink = Info.SendDlgMessage(hDlg, DM_GETCHECK, DlgSCANSYMLINK, 0); - Opt.Substr = NULL; + Opt.Substr = nullptr; int len = Info.SendDlgMessage(hDlg, DM_GETTEXT, DlgECMPSKIP, 0); if (len) { @@ -963,7 +963,7 @@ intptr_t WINAPI AdvCmpDlgOpt::ShowOptDialogProc(HANDLE hDlg, intptr_t Msg, intpt Opt.SkipSubstr = 0; } - Opt.DupPath = NULL; + Opt.DupPath = nullptr; len = Info.SendDlgMessage(hDlg, DM_GETTEXT, DlgDUPPATH, 0); if (len) { @@ -1149,7 +1149,7 @@ int AdvCmpDlgOpt::ShowOptDialog() } } // узнаем пользовательский путь до WinMerge - Opt.WinMergePath = NULL; + Opt.WinMergePath = nullptr; FarSettingsItem item = {sizeof(FarSettingsItem), Root, L"WinMergePath", FST_STRING}; if (Info.SettingsControl(settings.Handle, SCTL_GET, 0, &item)) { diff --git a/src/AdvCmpProc_CLIST.cpp b/src/AdvCmpProc_CLIST.cpp index 07faea6..f650122 100644 --- a/src/AdvCmpProc_CLIST.cpp +++ b/src/AdvCmpProc_CLIST.cpp @@ -201,14 +201,14 @@ bool MakeCmpFarList(HANDLE hDlg, cmpFileList* pFileList, bool bSetCurPos, bool b Info.SendDlgMessage(hDlg, DM_LISTINFO, 0, &ListInfo); if (ListInfo.ItemsNumber) - Info.SendDlgMessage(hDlg, DM_LISTDELETE, 0, 0); + Info.SendDlgMessage(hDlg, DM_LISTDELETE, 0, nullptr); if (!pFileList->iCount) return true; // сортируем только при инициализации if (bSort) - FSF.qsort(pFileList->F, pFileList->iCount, sizeof(pFileList->F[0]), cmpSortList, NULL); + FSF.qsort(pFileList->F, pFileList->iCount, sizeof(pFileList->F[0]), cmpSortList, nullptr); int Index = 0; string strBuf; @@ -501,19 +501,19 @@ bool bSetBottom = false; ***************************************************************************/ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void* Param2) { - cmpFileList* pFileList = (cmpFileList*) Info.SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); + cmpFileList* pFileList = (cmpFileList*) Info.SendDlgMessage(hDlg, DM_GETDLGDATA, 0, nullptr); switch (Msg) { case DN_INITDIALOG: MakeCmpFarList(hDlg, pFileList, true, true); - Info.SendDlgMessage(hDlg, DM_SETMOUSEEVENTNOTIFY, 1, 0); + Info.SendDlgMessage(hDlg, DM_SETMOUSEEVENTNOTIFY, 1, nullptr); break; /************************************************************************/ case DN_RESIZECONSOLE: { COORD c = (*(COORD*) Param2); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); Info.SendDlgMessage(hDlg, DM_RESIZEDIALOG, 0, &c); WinInfo.Con.Right = c.X - 1; WinInfo.Con.Bottom = c.Y - 1; @@ -523,7 +523,7 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo Info.SendDlgMessage(hDlg, DM_SETITEMPOSITION, 0, &WinInfo.Con); c.X = c.Y = -1; Info.SendDlgMessage(hDlg, DM_MOVEDIALOG, true, &c); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, nullptr); return true; } @@ -598,7 +598,7 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, &ListPos); int OldPos = ListPos.SelectPos; ListPos.SelectPos = ListPos.TopPos + (record->Event.MouseEvent.dwMousePosition.Y - 1 - dlgRect.Top); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); int NewPos = Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); if (NewPos != ListPos.SelectPos) { @@ -606,7 +606,7 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); MessageBeep(MB_OK); } - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, nullptr); // вот оно, поле Mark if (NewPos == ListPos.SelectPos && record->Event.MouseEvent.dwMousePosition.X >= dlgRect.Left + 68 && record->Event.MouseEvent.dwMousePosition.X <= dlgRect.Left + 70) @@ -640,7 +640,7 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo if (FSF.FarNameToInputRecord(L"F10", &rec)) Info.SendDlgMessage(hDlg, DM_KEY, 1, &rec); else - Info.SendDlgMessage(hDlg, DM_CLOSE, 0, 0); + Info.SendDlgMessage(hDlg, DM_CLOSE, 0, nullptr); return false; } } @@ -744,9 +744,9 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo if (vk == VK_RETURN) { GOTOCMPFILE: - int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, nullptr); cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); - cmpFile* cur = tmp ? *tmp : NULL; + cmpFile* cur = tmp ? *tmp : nullptr; if (cur) { if ((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN) || (cur->L.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) || @@ -808,7 +808,7 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo struct FarListPos FLP = {sizeof(FarListPos)}; Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, &FLP); cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) FLP.SelectPos); - cmpFile* cur = tmp ? *tmp : NULL; + cmpFile* cur = tmp ? *tmp : nullptr; if (cur && Opt.ShowListSelect) { struct FarListGetItem FLGI = {sizeof(FarListGetItem)}; @@ -845,9 +845,9 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo else if (vk == VK_SPACE) { GOTOCHANGEMARK: - int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, nullptr); cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); - cmpFile* cur = tmp ? *tmp : NULL; + cmpFile* cur = tmp ? *tmp : nullptr; if (cur && !(cur->dwFlags & RCIF_EQUAL) && Opt.Mode == MODE_SYNC) { struct FarListGetItem FLGI = {sizeof(FarListGetItem)}; @@ -982,9 +982,9 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo { if (vk == VK_RETURN) { - int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, nullptr); cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); - cmpFile* cur = tmp ? *tmp : NULL; + cmpFile* cur = tmp ? *tmp : nullptr; if (cur) { if ((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN) || (cur->L.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) || @@ -1003,9 +1003,9 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo { if (vk == VK_CONTROL) { - int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, nullptr); cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); - cmpFile* cur = tmp ? *tmp : NULL; + cmpFile* cur = tmp ? *tmp : nullptr; if (cur) { string strVirtDir = GetPosToName(cur->L.Dir) + wcslen(LPanel.Dir); @@ -1024,7 +1024,7 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo } else if (vk == 0x52) // VK_R { - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); Opt.ShowListSelect = true; Opt.ShowListIdentical = true; Opt.ShowListDifferent = true; @@ -1033,47 +1033,47 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo Opt.SyncFlagClearUser = true; MakeCmpFarList(hDlg, pFileList); Opt.SyncFlagClearUser = false; // восстановим! - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, nullptr); return true; } else if (vk == VK_OEM_5 && !(Opt.ShowListSelect && pFileList->Select == 0)) { - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); Opt.ShowListSelect = (Opt.ShowListSelect ? false : true); MakeCmpFarList(hDlg, pFileList); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, nullptr); return true; } else if (vk == VK_OEM_PLUS && !(Opt.ShowListIdentical && pFileList->Identical == 0)) { - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); Opt.ShowListIdentical = (Opt.ShowListIdentical ? false : true); MakeCmpFarList(hDlg, pFileList); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, nullptr); return true; } else if (vk == VK_OEM_MINUS && !(Opt.ShowListDifferent && pFileList->Different == 0)) { - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); Opt.ShowListDifferent = (Opt.ShowListDifferent ? false : true); MakeCmpFarList(hDlg, pFileList); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, nullptr); return true; } else if (vk == VK_OEM_4 && !(Opt.ShowListLNew && pFileList->LNew == 0)) { - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); Opt.ShowListLNew = (Opt.ShowListLNew ? false : true); MakeCmpFarList(hDlg, pFileList); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, nullptr); return true; } else if (vk == VK_OEM_6 && !(Opt.ShowListRNew && pFileList->RNew == 0)) { - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); Opt.ShowListRNew = (Opt.ShowListRNew ? false : true); MakeCmpFarList(hDlg, pFileList); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, nullptr); return true; } else if (vk == VK_SPACE && Opt.Mode == MODE_SYNC) @@ -1081,47 +1081,47 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo int ret = 0; struct FarDialogItem DialogItems[] = { // Type X1 Y1 X2 Y2 Selected History Mask Flags Data MaxLen UserParam - /* 0*/ {DI_DOUBLEBOX, 3, 1, 60, 11, 0, 0, 0, 0, GetMsg(MSyncSelTitle), 0, 0}, - /* 1*/ {DI_TEXT, 5, 2, 0, 0, 0, 0, 0, DIF_SEPARATOR, GetMsg(MSyncSelDiff), 0, 0}, - /* 2*/ {DI_RADIOBUTTON, 5, 3, 0, 0, (Opt.SyncOnlyRight ? 0 : 1), 0, 0, DIF_FOCUS | DIF_GROUP, GetMsg(MSyncSelToSkip), 0, 0}, - /* 3*/ {DI_RADIOBUTTON, 22, 3, 0, 0, (Opt.SyncOnlyRight ? 1 : 0), 0, 0, 0, GetMsg(MSyncSelToRight), 0, 0}, - /* 4*/ {DI_RADIOBUTTON, 39, 3, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelToLeft), 0, 0}, - /* 5*/ {DI_CHECKBOX, 5, 4, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelIfNew), 0, 0}, - /* 6*/ {DI_TEXT, 5, 5, 0, 0, 0, 0, 0, DIF_SEPARATOR, GetMsg(MSyncSelLNew), 0, 0}, - /* 7*/ {DI_RADIOBUTTON, 5, 6, 0, 0, 1, 0, 0, DIF_GROUP, GetMsg(MSyncSelToRight), 0, 0}, - /* 8*/ {DI_RADIOBUTTON, 22, 6, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelToLeft), 0, 0}, - /* 9*/ {DI_RADIOBUTTON, 39, 6, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelToNon), 0, 0}, - /*10*/ {DI_TEXT, 5, 7, 0, 0, 0, 0, 0, DIF_SEPARATOR, GetMsg(MSyncSelRNew), 0, 0}, + /* 0*/ {DI_DOUBLEBOX, 3, 1, 60, 11, 0, nullptr, nullptr, 0, GetMsg(MSyncSelTitle), 0, 0}, + /* 1*/ {DI_TEXT, 5, 2, 0, 0, 0, nullptr, nullptr, DIF_SEPARATOR, GetMsg(MSyncSelDiff), 0, 0}, + /* 2*/ {DI_RADIOBUTTON, 5, 3, 0, 0, (Opt.SyncOnlyRight ? 0 : 1), nullptr, nullptr, DIF_FOCUS | DIF_GROUP, GetMsg(MSyncSelToSkip), 0, 0}, + /* 3*/ {DI_RADIOBUTTON, 22, 3, 0, 0, (Opt.SyncOnlyRight ? 1 : 0), nullptr, nullptr, 0, GetMsg(MSyncSelToRight), 0, 0}, + /* 4*/ {DI_RADIOBUTTON, 39, 3, 0, 0, 0, nullptr, nullptr, 0, GetMsg(MSyncSelToLeft), 0, 0}, + /* 5*/ {DI_CHECKBOX, 5, 4, 0, 0, 0, nullptr, nullptr, 0, GetMsg(MSyncSelIfNew), 0, 0}, + /* 6*/ {DI_TEXT, 5, 5, 0, 0, 0, nullptr, nullptr, DIF_SEPARATOR, GetMsg(MSyncSelLNew), 0, 0}, + /* 7*/ {DI_RADIOBUTTON, 5, 6, 0, 0, 1, nullptr, nullptr, DIF_GROUP, GetMsg(MSyncSelToRight), 0, 0}, + /* 8*/ {DI_RADIOBUTTON, 22, 6, 0, 0, 0, nullptr, nullptr, 0, GetMsg(MSyncSelToLeft), 0, 0}, + /* 9*/ {DI_RADIOBUTTON, 39, 6, 0, 0, 0, nullptr, nullptr, 0, GetMsg(MSyncSelToNon), 0, 0}, + /*10*/ {DI_TEXT, 5, 7, 0, 0, 0, nullptr, nullptr, DIF_SEPARATOR, GetMsg(MSyncSelRNew), 0, 0}, /*11*/ - {DI_RADIOBUTTON, 5, 8, 0, 0, (Opt.SyncOnlyRight != 2 ? 1 : 0), 0, 0, DIF_GROUP, + {DI_RADIOBUTTON, 5, 8, 0, 0, (Opt.SyncOnlyRight != 2 ? 1 : 0), nullptr, nullptr, DIF_GROUP, GetMsg(Opt.SyncOnlyRight ? MSyncSelToDel : MSyncSelToLeft), 0, 0}, - /*12*/ {DI_RADIOBUTTON, 22, 8, 0, 0, 0, 0, 0, 0, GetMsg(MSyncSelToRight), 0, 0}, - /*13*/ {DI_RADIOBUTTON, 39, 8, 0, 0, (Opt.SyncOnlyRight != 2 ? 0 : 1), 0, 0, 0, GetMsg(MSyncSelToNon), 0, 0}, - /*14*/ {DI_TEXT, -1, 9, 0, 0, 0, 0, 0, DIF_SEPARATOR, 0, 0, 0}, - /*15*/ {DI_BUTTON, 0, 10, 0, 0, 0, 0, 0, DIF_DEFAULTBUTTON | DIF_CENTERGROUP, GetMsg(MOK), 0, 0}, - /*16*/ {DI_BUTTON, 0, 10, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MCancel), 0, 0}}; + /*12*/ {DI_RADIOBUTTON, 22, 8, 0, 0, 0, nullptr, nullptr, 0, GetMsg(MSyncSelToRight), 0, 0}, + /*13*/ {DI_RADIOBUTTON, 39, 8, 0, 0, (Opt.SyncOnlyRight != 2 ? 0 : 1), nullptr, nullptr, 0, GetMsg(MSyncSelToNon), 0, 0}, + /*14*/ {DI_TEXT, -1, 9, 0, 0, 0, nullptr, nullptr, DIF_SEPARATOR, nullptr, 0, 0}, + /*15*/ {DI_BUTTON, 0, 10, 0, 0, 0, nullptr, nullptr, DIF_DEFAULTBUTTON | DIF_CENTERGROUP, GetMsg(MOK), 0, 0}, + /*16*/ {DI_BUTTON, 0, 10, 0, 0, 0, nullptr, nullptr, DIF_CENTERGROUP, GetMsg(MCancel), 0, 0}}; HANDLE hDlgCur = Info.DialogInit(&MainGuid, &DlgSyncSel, -1, -1, 64, 13, L"DlgCmp", DialogItems, - sizeof(DialogItems) / sizeof(DialogItems[0]), 0, 0, 0, 0); + sizeof(DialogItems) / sizeof(DialogItems[0]), 0, 0, nullptr, nullptr); if (hDlgCur != INVALID_HANDLE_VALUE) { ret = (int) Info.DialogRun(hDlgCur); if (ret == 15) { - Opt.SyncFlagCopy = (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 2, 0) ? 1 : (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 3, 0) ? 2 : -2)); - Opt.SyncFlagIfNew = Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 5, 0); + Opt.SyncFlagCopy = (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 2, nullptr) ? 1 : (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 3, nullptr) ? 2 : -2)); + Opt.SyncFlagIfNew = Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 5, nullptr); Opt.SyncFlagLCopy = - (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 7, 0) ? 2 : (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 8, 0) ? -2 : 0)); + (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 7, nullptr) ? 2 : (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 8, nullptr) ? -2 : 0)); Opt.SyncFlagRCopy = - (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 11, 0) ? -2 : (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 12, 0) ? 2 : 0)); + (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 11, nullptr) ? -2 : (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 12, nullptr) ? 2 : 0)); } Info.DialogFree(hDlgCur); } if (ret == 15) { - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); MakeCmpFarList(hDlg, pFileList, true, false); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, nullptr); Opt.SyncFlagCopy = Opt.SyncFlagIfNew = 0; Opt.SyncFlagLCopy = 1; Opt.SyncFlagRCopy = -1; @@ -1130,9 +1130,9 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo } else if (vk == VK_PRIOR) { - int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, nullptr); cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); - cmpFile* cur = tmp ? *tmp : NULL; + cmpFile* cur = tmp ? *tmp : nullptr; if (cur) { if ((LPanel.PInfo.Flags & PFLAGS_PLUGIN) || (RPanel.PInfo.Flags & PFLAGS_PLUGIN)) @@ -1158,9 +1158,9 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo */ if (FSF.LStricmp(LPanel.Dir, GetPosToName(cur->L.Dir))) { - FarPanelDirectory dirInfo = {sizeof(FarPanelDirectory), GetPosToName(cur->L.Dir), NULL, {0}, NULL}; + FarPanelDirectory dirInfo = {sizeof(FarPanelDirectory), GetPosToName(cur->L.Dir), nullptr, {0}, nullptr}; bSetLDir = Info.PanelControl(LPanel.hPanel, FCTL_SETPANELDIRECTORY, 0, &dirInfo); - Info.PanelControl(LPanel.hPanel, FCTL_BEGINSELECTION, 0, 0); + Info.PanelControl(LPanel.hPanel, FCTL_BEGINSELECTION, 0, nullptr); } { @@ -1169,7 +1169,7 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo for (unsigned i = 0; i < PInfo.ItemsNumber; i++) { - size_t size = Info.PanelControl(LPanel.hPanel, FCTL_GETPANELITEM, i, 0); + size_t size = Info.PanelControl(LPanel.hPanel, FCTL_GETPANELITEM, i, nullptr); PluginPanelItem* PPI = (PluginPanelItem*) malloc(size); if (PPI) { @@ -1202,14 +1202,14 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo } } if (bSetLDir) - Info.PanelControl(LPanel.hPanel, FCTL_ENDSELECTION, 0, 0); + Info.PanelControl(LPanel.hPanel, FCTL_ENDSELECTION, 0, nullptr); } if (FSF.LStricmp(RPanel.Dir, GetPosToName(cur->R.Dir))) { - FarPanelDirectory dirInfo = {sizeof(FarPanelDirectory), GetPosToName(cur->R.Dir), NULL, {0}, NULL}; + FarPanelDirectory dirInfo = {sizeof(FarPanelDirectory), GetPosToName(cur->R.Dir), nullptr, {0}, nullptr}; bSetRDir = Info.PanelControl(RPanel.hPanel, FCTL_SETPANELDIRECTORY, 0, &dirInfo); - Info.PanelControl(RPanel.hPanel, FCTL_BEGINSELECTION, 0, 0); + Info.PanelControl(RPanel.hPanel, FCTL_BEGINSELECTION, 0, nullptr); } { PanelInfo PInfo = {sizeof(PanelInfo)}; @@ -1217,7 +1217,7 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo for (unsigned i = 0; i < PInfo.ItemsNumber; i++) { - size_t size = Info.PanelControl(RPanel.hPanel, FCTL_GETPANELITEM, i, 0); + size_t size = Info.PanelControl(RPanel.hPanel, FCTL_GETPANELITEM, i, nullptr); PluginPanelItem* PPI = (PluginPanelItem*) malloc(size); if (PPI) { @@ -1249,11 +1249,11 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo } } if (bSetRDir) - Info.PanelControl(RPanel.hPanel, FCTL_ENDSELECTION, 0, 0); + Info.PanelControl(RPanel.hPanel, FCTL_ENDSELECTION, 0, nullptr); } Info.PanelControl(LPanel.hPanel, FCTL_REDRAWPANEL, 0, &LRInfo); Info.PanelControl(RPanel.hPanel, FCTL_REDRAWPANEL, 0, &RRInfo); - Info.SendDlgMessage(hDlg, DM_CLOSE, 0, 0); + Info.SendDlgMessage(hDlg, DM_CLOSE, 0, nullptr); } return true; } @@ -1281,7 +1281,7 @@ int AdvCmpProc::ShowCmpDialog(const struct DirList* pLList, const struct DirList int len = WinInfo.Con.Right / 2 - 2; - int size = Info.PanelControl(LPanel.hPanel, FCTL_GETPANELHOSTFILE, 0, 0); + int size = Info.PanelControl(LPanel.hPanel, FCTL_GETPANELHOSTFILE, 0, nullptr); string strTmp; if (size > 1) { @@ -1301,7 +1301,7 @@ int AdvCmpProc::ShowCmpDialog(const struct DirList* pLList, const struct DirList wchar_t buf1[MAX_PATH]; strcentr(buf1, strTmp2.get(), len, 0x00002550); - size = Info.PanelControl(RPanel.hPanel, FCTL_GETPANELHOSTFILE, 0, 0); + size = Info.PanelControl(RPanel.hPanel, FCTL_GETPANELHOSTFILE, 0, nullptr); if (size > 1) { strTmp.get(size); diff --git a/src/AdvCmpProc_DUP.cpp b/src/AdvCmpProc_DUP.cpp index 6d60467..bfaf6d1 100644 --- a/src/AdvCmpProc_DUP.cpp +++ b/src/AdvCmpProc_DUP.cpp @@ -105,24 +105,24 @@ int GetDupOpt(dupFileList* pFileList) struct FarDialogItem DialogItems[] = { // Type X1 Y1 X2 Y2 Selected History Mask Flags Data MaxLen UserParam - /* 0*/ {DI_DOUBLEBOX, 3, 1, 60, 6, 0, 0, 0, 0, GetMsg(MDupTitle), 0, 0}, - /* 1*/ {DI_CHECKBOX, 5, 2, 0, 0, Opt.DupDel, 0, 0, Opt.DupDel ? DIF_FOCUS : DIF_DISABLE, buf, 0, 0}, - /* 2*/ {DI_CHECKBOX, 8, 3, 0, 0, Opt.DupDelRecycleBin, 0, 0, Opt.DupDel ? 0 : DIF_DISABLE, GetMsg(MDupDelRecycleBin), 0, 0}, - /* 3*/ {DI_TEXT, -1, 4, 0, 0, 0, 0, 0, DIF_SEPARATOR, L"", 0, 0}, - /* 4*/ {DI_BUTTON, 0, 5, 0, 0, 0, 0, 0, DIF_DEFAULTBUTTON | DIF_CENTERGROUP, GetMsg(MOK), 0, 0}, - /* 5*/ {DI_BUTTON, 0, 5, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MDupEdit), 0, 0}, - /* 6*/ {DI_BUTTON, 0, 5, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MCancel), 0, 0}}; + /* 0*/ {DI_DOUBLEBOX, 3, 1, 60, 6, 0, nullptr, nullptr, 0, GetMsg(MDupTitle), 0, 0}, + /* 1*/ {DI_CHECKBOX, 5, 2, 0, 0, Opt.DupDel, nullptr, nullptr, Opt.DupDel ? DIF_FOCUS : DIF_DISABLE, buf, 0, 0}, + /* 2*/ {DI_CHECKBOX, 8, 3, 0, 0, Opt.DupDelRecycleBin, nullptr, nullptr, Opt.DupDel ? 0 : DIF_DISABLE, GetMsg(MDupDelRecycleBin), 0, 0}, + /* 3*/ {DI_TEXT, -1, 4, 0, 0, 0, nullptr, nullptr, DIF_SEPARATOR, L"", 0, 0}, + /* 4*/ {DI_BUTTON, 0, 5, 0, 0, 0, nullptr, nullptr, DIF_DEFAULTBUTTON | DIF_CENTERGROUP, GetMsg(MOK), 0, 0}, + /* 5*/ {DI_BUTTON, 0, 5, 0, 0, 0, nullptr, nullptr, DIF_CENTERGROUP, GetMsg(MDupEdit), 0, 0}, + /* 6*/ {DI_BUTTON, 0, 5, 0, 0, 0, nullptr, nullptr, DIF_CENTERGROUP, GetMsg(MCancel), 0, 0}}; HANDLE hDlg = - Info.DialogInit(&MainGuid, &OptSyncDlgGuid, -1, -1, 64, 8, L"DlgDup", DialogItems, sizeof(DialogItems) / sizeof(DialogItems[0]), 0, 0, 0, 0); + Info.DialogInit(&MainGuid, &OptSyncDlgGuid, -1, -1, 64, 8, L"DlgDup", DialogItems, sizeof(DialogItems) / sizeof(DialogItems[0]), 0, 0, nullptr, nullptr); if (hDlg != INVALID_HANDLE_VALUE) { ret = (int) Info.DialogRun(hDlg); if (ret == 4) { - Opt.DupDel = Info.SendDlgMessage(hDlg, DM_GETCHECK, 1, 0); - Opt.DupDelRecycleBin = Info.SendDlgMessage(hDlg, DM_GETCHECK, 2, 0); + Opt.DupDel = Info.SendDlgMessage(hDlg, DM_GETCHECK, 1, nullptr); + Opt.DupDelRecycleBin = Info.SendDlgMessage(hDlg, DM_GETCHECK, 2, nullptr); ret = Opt.DupDel ? QR_ALL : QR_SKIP; // удаляем дубли, иначе - пропустим } else if (ret == 5) @@ -205,14 +205,14 @@ bool MakeDupFarList(HANDLE hDlg, dupFileList* pFileList, bool bSetCurPos, bool b Info.SendDlgMessage(hDlg, DM_LISTINFO, 0, &ListInfo); if (ListInfo.ItemsNumber) - Info.SendDlgMessage(hDlg, DM_LISTDELETE, 0, 0); + Info.SendDlgMessage(hDlg, DM_LISTDELETE, 0, nullptr); if (!pFileList->iCount) return true; // сортируем только при инициализации if (bSort) - FSF.qsort(pFileList->F, pFileList->iCount, sizeof(pFileList->F[0]), dupSortListByGroupEx, NULL); + FSF.qsort(pFileList->F, pFileList->iCount, sizeof(pFileList->F[0]), dupSortListByGroupEx, nullptr); int Index = 0; string strBuf; @@ -308,14 +308,14 @@ bool MakeDupFarList(HANDLE hDlg, dupFileList* pFileList, bool bSetCurPos, bool b if (j < pFileList->iCount && cur->nDupGroup != pFileList->F[j].nDupGroup) { Item.Flags = LIF_SEPARATOR; - Item.Text = NULL; + Item.Text = nullptr; List.Items = &Item; Info.SendDlgMessage(hDlg, DM_LISTADD, 0, &List); Index++; } } - SetBottom(hDlg, pFileList, pFileList->iCount ? &pFileList->F[0] : NULL); + SetBottom(hDlg, pFileList, pFileList->iCount ? &pFileList->F[0] : nullptr); if (bSetCurPos) { @@ -332,19 +332,19 @@ bool MakeDupFarList(HANDLE hDlg, dupFileList* pFileList, bool bSetCurPos, bool b ***************************************************************************/ intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void* Param2) { - dupFileList* pFileList = (dupFileList*) Info.SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); + dupFileList* pFileList = (dupFileList*) Info.SendDlgMessage(hDlg, DM_GETDLGDATA, 0, nullptr); switch (Msg) { case DN_INITDIALOG: MakeDupFarList(hDlg, pFileList, true, true); - Info.SendDlgMessage(hDlg, DM_SETMOUSEEVENTNOTIFY, 1, 0); + Info.SendDlgMessage(hDlg, DM_SETMOUSEEVENTNOTIFY, 1, nullptr); break; /************************************************************************/ case DN_RESIZECONSOLE: { COORD c = (*(COORD*) Param2); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); Info.SendDlgMessage(hDlg, DM_RESIZEDIALOG, 0, &c); WinInfo.Con.Right = c.X - 1; WinInfo.Con.Bottom = c.Y - 1; @@ -352,14 +352,14 @@ intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo if (WinInfo.TruncLen > MAX_PATH - 2) WinInfo.TruncLen = MAX_PATH - 2; Info.SendDlgMessage(hDlg, DM_SETITEMPOSITION, 0, &WinInfo.Con); - int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, nullptr); dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); - dupFile* cur = tmp ? *tmp : NULL; + dupFile* cur = tmp ? *tmp : nullptr; if (cur) SetBottom(hDlg, pFileList, cur); c.X = c.Y = -1; Info.SendDlgMessage(hDlg, DM_MOVEDIALOG, true, &c); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, nullptr); return true; } @@ -400,7 +400,7 @@ intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo if (Param1 == 0) { dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Param2); - dupFile* cur = tmp ? *tmp : NULL; + dupFile* cur = tmp ? *tmp : nullptr; if (cur) { SetBottom(hDlg, pFileList, cur); @@ -440,7 +440,7 @@ intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, &ListPos); int OldPos = ListPos.SelectPos; ListPos.SelectPos = ListPos.TopPos + (record->Event.MouseEvent.dwMousePosition.Y - 1 - dlgRect.Top); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); int NewPos = Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); if (NewPos != ListPos.SelectPos) { @@ -448,11 +448,11 @@ intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo Info.SendDlgMessage(hDlg, DM_LISTSETCURPOS, 0, &ListPos); MessageBeep(MB_OK); } - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, nullptr); if (NewPos == ListPos.SelectPos) { dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) ListPos.SelectPos); - dupFile* cur = (tmp && *tmp) ? *tmp : NULL; + dupFile* cur = (tmp && *tmp) ? *tmp : nullptr; if (cur) { struct FarListGetItem FLGI = {sizeof(FarListGetItem)}; @@ -500,14 +500,14 @@ intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo { if (vk == VK_F3) { - int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, nullptr); dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); - dupFile* cur = tmp ? *tmp : NULL; + dupFile* cur = tmp ? *tmp : nullptr; if (cur) { string strFullFileName; GetFullFileName(strFullFileName, cur->fi.Dir, cur->fi.FileName); - if (Info.Viewer(GetPosToName(strFullFileName.get()), NULL, 0, 0, -1, -1, VF_DISABLEHISTORY, CP_DEFAULT)) + if (Info.Viewer(GetPosToName(strFullFileName.get()), nullptr, 0, 0, -1, -1, VF_DISABLEHISTORY, CP_DEFAULT)) { SetBottom(hDlg, pFileList, cur); // обходим баг фара: почему-то строка функциональных клавиш не прячется автоматом! return true; @@ -522,7 +522,7 @@ intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo struct FarListPos FLP = {sizeof(FarListPos)}; Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, &FLP); dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) FLP.SelectPos); - dupFile* cur = tmp ? *tmp : NULL; + dupFile* cur = tmp ? *tmp : nullptr; if (cur) { struct FarListGetItem FLGI = {sizeof(FarListGetItem)}; @@ -687,17 +687,17 @@ intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo { if (vk == 0x31) // VK_1 { - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); Opt.DupListSmall ? Opt.DupListSmall = 0 : Opt.DupListSmall = 1; MakeDupFarList(hDlg, pFileList, true, false); - Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, 0); + Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, true, nullptr); return true; } else if (vk == VK_PRIOR) { - int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, nullptr); dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); - dupFile* cur = tmp ? *tmp : NULL; + dupFile* cur = tmp ? *tmp : nullptr; if (cur) { Opt.Mode = MODE_CMP; //скидываем!!! @@ -706,7 +706,7 @@ intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo bool bLeft = (LPanel.PInfo.Flags & PFLAGS_FOCUS ? true : false); if (FSF.LStricmp(bLeft ? LPanel.Dir : RPanel.Dir, GetPosToName(cur->fi.Dir))) { - FarPanelDirectory dirInfo = {sizeof(FarPanelDirectory), GetPosToName(cur->fi.Dir), NULL, {0}, NULL}; + FarPanelDirectory dirInfo = {sizeof(FarPanelDirectory), GetPosToName(cur->fi.Dir), nullptr, {0}, nullptr}; Info.PanelControl(bLeft ? LPanel.hPanel : RPanel.hPanel, FCTL_SETPANELDIRECTORY, 0, &dirInfo); } PanelInfo PInfo = {sizeof(PanelInfo)}; @@ -714,7 +714,7 @@ intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo for (unsigned i = 0; i < PInfo.ItemsNumber; i++) { - size_t size = Info.PanelControl(bLeft ? LPanel.hPanel : RPanel.hPanel, FCTL_GETPANELITEM, i, 0); + size_t size = Info.PanelControl(bLeft ? LPanel.hPanel : RPanel.hPanel, FCTL_GETPANELITEM, i, nullptr); PluginPanelItem* PPI = (PluginPanelItem*) malloc(size); if (PPI) { @@ -730,7 +730,7 @@ intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo } } Info.PanelControl(bLeft ? LPanel.hPanel : RPanel.hPanel, FCTL_REDRAWPANEL, 0, &RInfo); - Info.SendDlgMessage(hDlg, DM_CLOSE, 0, 0); + Info.SendDlgMessage(hDlg, DM_CLOSE, 0, nullptr); } return true; } @@ -739,9 +739,9 @@ intptr_t WINAPI ShowDupDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo { if (vk == VK_RETURN) { - int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, 0); + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, nullptr); dupFile** tmp = (dupFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); - dupFile* cur = tmp ? *tmp : NULL; + dupFile* cur = tmp ? *tmp : nullptr; if (cur) { string strFullFileName; @@ -791,7 +791,7 @@ int AdvCmpProc::ShowDupDialog() FarSettingsItem item = {sizeof(FarSettingsItem), Root, L"DupListSmall", FST_QWORD}; if (Info.SettingsControl(settings.Handle, SCTL_GET, 0, &item)) Opt.DupListSmall = (int) item.Number; - Info.SettingsControl(settings.Handle, SCTL_FREE, 0, 0); + Info.SettingsControl(settings.Handle, SCTL_FREE, 0, nullptr); } Info.DialogRun(hDlg); @@ -802,7 +802,7 @@ int AdvCmpProc::ShowDupDialog() FarSettingsItem item = {sizeof(FarSettingsItem), Root, L"DupListSmall", FST_QWORD}; item.Number = Opt.DupListSmall; Info.SettingsControl(settings.Handle, SCTL_SET, 0, &item); - Info.SettingsControl(settings.Handle, SCTL_FREE, 0, 0); + Info.SettingsControl(settings.Handle, SCTL_FREE, 0, nullptr); } Info.DialogFree(hDlg); } @@ -883,7 +883,7 @@ DWORD AdvCmpProc::GetCRC(const dupFile* cur) GetFullFileName(strFullFileName, cur->fi.Dir, cur->fi.FileName); HANDLE hFile; - if ((hFile = CreateFileW(strFullFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) == INVALID_HANDLE_VALUE) + if ((hFile = CreateFileW(strFullFileName, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr)) == INVALID_HANDLE_VALUE) { CmpInfo.ProcSize += cur->fi.nFileSize; CmpInfo.Errors++; @@ -901,7 +901,7 @@ DWORD AdvCmpProc::GetCRC(const dupFile* cur) while (1) { - if (CheckForEsc() || !ReadFile(hFile, Buf, ReadBlock, &ReadSize, 0)) + if (CheckForEsc() || !ReadFile(hFile, Buf, ReadBlock, &ReadSize, nullptr)) { ret = false; break; @@ -1119,7 +1119,7 @@ int AdvCmpProc::GetMp3(dupFile* cur, int GetInfo) // GetInfo=0-только б char szFrameID[5]; unsigned nFrameSize; unsigned nTotal = 0; - char* pUnsync = NULL; + char* pUnsync = nullptr; if ((nFlag & 0x80) && (nVersion <= 0x300)) p = pUnsync = Unsync(p + 10, 0, nTagSize, &nTagSize); @@ -1332,7 +1332,7 @@ int AdvCmpProc::GetPic(dupFile* cur, int GetInfo) string strFullFileName; GetFullFileName(strFullFileName, cur->fi.Dir, cur->fi.FileName); - GFL_BITMAP* pBitmap = NULL; + GFL_BITMAP* pBitmap = nullptr; GFL_LOAD_PARAMS load_params; pGflGetDefaultLoadParams(&load_params); @@ -1340,16 +1340,16 @@ int AdvCmpProc::GetPic(dupFile* cur, int GetInfo) load_params.Origin = GFL_BOTTOM_LEFT; load_params.LinePadding = 4; - GFL_ERROR res = pGflLoadBitmapW(strFullFileName.get(), &pBitmap, &load_params, NULL); + GFL_ERROR res = pGflLoadBitmapW(strFullFileName.get(), &pBitmap, &load_params, nullptr); if (res) { cur->dwFlags |= RCIF_PICERR; - pBitmap = NULL; + pBitmap = nullptr; load_params.Flags |= GFL_LOAD_IGNORE_READ_ERROR; - res = pGflLoadBitmapW(strFullFileName.get(), &pBitmap, &load_params, NULL); + res = pGflLoadBitmapW(strFullFileName.get(), &pBitmap, &load_params, nullptr); if (res) { - pBitmap = NULL; + pBitmap = nullptr; CmpInfo.Errors++; return ret; } @@ -1516,7 +1516,7 @@ int AdvCmpProc::Duplicate(const struct DirList* pList) if (!(ret = ScanDir(pList->Dir, 0))) goto END; - wchar_t** ListPath = NULL; + wchar_t** ListPath = nullptr; int NumPath = GetArgv(Opt.DupPath, &ListPath); if (NumPath) { @@ -1524,7 +1524,7 @@ int AdvCmpProc::Duplicate(const struct DirList* pList) { if (FSF.LStricmp(GetPosToName(pList->Dir), GetPosToName(ListPath[i]))) { - int size = FSF.ConvertPath(CPM_NATIVE, ListPath[i], 0, 0); + int size = FSF.ConvertPath(CPM_NATIVE, ListPath[i], nullptr, 0); wchar_t* Dir = (wchar_t*) malloc(size * sizeof(wchar_t)); if (Dir) { @@ -1545,7 +1545,7 @@ int AdvCmpProc::Duplicate(const struct DirList* pList) if (!ret) goto END; - FSF.qsort(dFList.F, dFList.iCount, sizeof(dFList.F[0]), dupSortListByName, NULL); + FSF.qsort(dFList.F, dFList.iCount, sizeof(dFList.F[0]), dupSortListByName, nullptr); if (Opt.DupContents) { @@ -1872,20 +1872,20 @@ int AdvCmpProc::Duplicate(const struct DirList* pList) goto END; // освободимся от уникальных - FSF.qsort(dFList.F, dFList.iCount, sizeof(dFList.F[0]), dupSortListByGroup, NULL); + FSF.qsort(dFList.F, dFList.iCount, sizeof(dFList.F[0]), dupSortListByGroup, nullptr); int Index; for (Index = dFList.iCount - 1; Index >= 0 && !dFList.F[Index].nDupGroup; Index--) { free(dFList.F[Index].fi.FileName); - dFList.F[Index].fi.FileName = NULL; + dFList.F[Index].fi.FileName = nullptr; free(dFList.F[Index].fi.Dir); - dFList.F[Index].fi.Dir = NULL; + dFList.F[Index].fi.Dir = nullptr; free(dFList.F[Index].PicPix); - dFList.F[Index].PicPix = NULL; + dFList.F[Index].PicPix = nullptr; free(dFList.F[Index].MusicArtist); - dFList.F[Index].MusicArtist = NULL; + dFList.F[Index].MusicArtist = nullptr; free(dFList.F[Index].MusicTitle); - dFList.F[Index].MusicTitle = NULL; + dFList.F[Index].MusicTitle = nullptr; } dFList.F = (dupFile*) realloc(dFList.F, (dFList.iCount = Index + 1) * sizeof(dupFile)); @@ -1895,8 +1895,8 @@ int AdvCmpProc::Duplicate(const struct DirList* pList) CloseHandle(hConInp); hConInp = INVALID_HANDLE_VALUE; } - Info.PanelControl(LPanel.hPanel, FCTL_REDRAWPANEL, 0, 0); - Info.PanelControl(RPanel.hPanel, FCTL_REDRAWPANEL, 0, 0); + Info.PanelControl(LPanel.hPanel, FCTL_REDRAWPANEL, 0, nullptr); + Info.PanelControl(RPanel.hPanel, FCTL_REDRAWPANEL, 0, nullptr); if (TitleSaved) SetConsoleTitle(strFarTitle); @@ -1922,7 +1922,7 @@ int AdvCmpProc::Duplicate(const struct DirList* pList) { if (Opt.Sound && (GetTickCount() - dwTicks > 30000)) MessageBeep(MB_ICONASTERISK); - Info.AdvControl(&MainGuid, ACTL_PROGRESSNOTIFY, 0, 0); + Info.AdvControl(&MainGuid, ACTL_PROGRESSNOTIFY, 0, nullptr); } if (!bBrokenByEsc) { @@ -1934,14 +1934,14 @@ int AdvCmpProc::Duplicate(const struct DirList* pList) FSF.FormatFileSize(CmpInfo.ProcSize, 7, FFFS_FLOATSIZE | FFFS_SHOWBYTESINDEX | FFFS_ECONOMIC, size, 8); FSF.sprintf(buf, GetMsg(MDupDelItems), size, CmpInfo.Proc); const wchar_t* MsgItems[] = {GetMsg(MDupTitle), buf, GetMsg(MOK)}; - Info.Message(&MainGuid, &DupDelItemsMsgGuid, 0, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 1); + Info.Message(&MainGuid, &DupDelItemsMsgGuid, 0, nullptr, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 1); } } } if (Opt.Dup == QR_ALL || Opt.Dup == QR_SKIP) { - Info.PanelControl(LPanel.hPanel, FCTL_UPDATEPANEL, 0, 0); - Info.PanelControl(RPanel.hPanel, FCTL_UPDATEPANEL, 0, 0); + Info.PanelControl(LPanel.hPanel, FCTL_UPDATEPANEL, 0, nullptr); + Info.PanelControl(RPanel.hPanel, FCTL_UPDATEPANEL, 0, nullptr); } END: diff --git a/src/AdvCmpProc_SYNC.cpp b/src/AdvCmpProc_SYNC.cpp index 82cdf97..bd6ca80 100644 --- a/src/AdvCmpProc_SYNC.cpp +++ b/src/AdvCmpProc_SYNC.cpp @@ -77,7 +77,7 @@ int GetSyncOpt(cmpFileList* pFileList) if (Opt.ShowMsg) { const wchar_t* MsgItems[] = {GetMsg(MSyncTitle), GetMsg(MNoSyncBody), GetMsg(MOK)}; - Info.Message(&MainGuid, &NoSyncMsgGuid, 0, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 1); + Info.Message(&MainGuid, &NoSyncMsgGuid, 0, nullptr, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 1); } return ret = QR_SKIP; //нет элементов } @@ -90,28 +90,28 @@ int GetSyncOpt(cmpFileList* pFileList) FSF.sprintf(buf3, GetMsg(MSyncDel), ItemsRDel); struct FarDialogItem DialogItems[] = {// Type X1 Y1 X2 Y2 Selected History Mask Flags Data MaxLen UserParam - /* 0*/ {DI_DOUBLEBOX, 3, 1, 60, 8, 0, 0, 0, 0, GetMsg(MSyncTitle), 0, 0}, - /* 1*/ {DI_CHECKBOX, 5, 2, 0, 0, Opt.SyncRPanel, 0, 0, Opt.SyncRPanel ? DIF_FOCUS : DIF_DISABLE, buf2, 0, 0}, - /* 2*/ {DI_CHECKBOX, 5, 3, 0, 0, Opt.SyncLPanel, 0, 0, Opt.SyncLPanel ? 0 : DIF_DISABLE, buf1, 0, 0}, - /* 3*/ {DI_CHECKBOX, 5, 4, 0, 0, Opt.SyncDel, 0, 0, Opt.SyncDel ? 0 : DIF_DISABLE, buf3, 0, 0}, - /* 4*/ {DI_CHECKBOX, 8, 5, 0, 0, 0, 0, 0, Opt.SyncDel ? 0 : DIF_DISABLE, GetMsg(MSyncUseDelFilter), 0, 0}, - /* 5*/ {DI_TEXT, -1, 6, 0, 0, 0, 0, 0, DIF_SEPARATOR, L"", 0, 0}, - /* 6*/ {DI_BUTTON, 0, 7, 0, 0, 0, 0, 0, DIF_DEFAULTBUTTON | DIF_CENTERGROUP, GetMsg(MOK), 0, 0}, - /* 7*/ {DI_BUTTON, 0, 7, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MSyncEdit), 0, 0}, - /* 8*/ {DI_BUTTON, 0, 7, 0, 0, 0, 0, 0, DIF_CENTERGROUP, GetMsg(MCancel), 0, 0}}; + /* 0*/ {DI_DOUBLEBOX, 3, 1, 60, 8, 0, nullptr, nullptr, 0, GetMsg(MSyncTitle), 0, 0}, + /* 1*/ {DI_CHECKBOX, 5, 2, 0, 0, Opt.SyncRPanel, nullptr, nullptr, Opt.SyncRPanel ? DIF_FOCUS : DIF_DISABLE, buf2, 0, 0}, + /* 2*/ {DI_CHECKBOX, 5, 3, 0, 0, Opt.SyncLPanel, nullptr, nullptr, Opt.SyncLPanel ? 0 : DIF_DISABLE, buf1, 0, 0}, + /* 3*/ {DI_CHECKBOX, 5, 4, 0, 0, Opt.SyncDel, nullptr, nullptr, Opt.SyncDel ? 0 : DIF_DISABLE, buf3, 0, 0}, + /* 4*/ {DI_CHECKBOX, 8, 5, 0, 0, 0, nullptr, nullptr, Opt.SyncDel ? 0 : DIF_DISABLE, GetMsg(MSyncUseDelFilter), 0, 0}, + /* 5*/ {DI_TEXT, -1, 6, 0, 0, 0, nullptr, nullptr, DIF_SEPARATOR, L"", 0, 0}, + /* 6*/ {DI_BUTTON, 0, 7, 0, 0, 0, nullptr, nullptr, DIF_DEFAULTBUTTON | DIF_CENTERGROUP, GetMsg(MOK), 0, 0}, + /* 7*/ {DI_BUTTON, 0, 7, 0, 0, 0, nullptr, nullptr, DIF_CENTERGROUP, GetMsg(MSyncEdit), 0, 0}, + /* 8*/ {DI_BUTTON, 0, 7, 0, 0, 0, nullptr, nullptr, DIF_CENTERGROUP, GetMsg(MCancel), 0, 0}}; HANDLE hDlg = - Info.DialogInit(&MainGuid, &OptSyncDlgGuid, -1, -1, 64, 10, L"DlgCmp", DialogItems, sizeof(DialogItems) / sizeof(DialogItems[0]), 0, 0, 0, 0); + Info.DialogInit(&MainGuid, &OptSyncDlgGuid, -1, -1, 64, 10, L"DlgCmp", DialogItems, sizeof(DialogItems) / sizeof(DialogItems[0]), 0, 0, nullptr, nullptr); if (hDlg != INVALID_HANDLE_VALUE) { ret = (int) Info.DialogRun(hDlg); if (ret == 6) { - Opt.SyncRPanel = Info.SendDlgMessage(hDlg, DM_GETCHECK, 1, 0); - Opt.SyncLPanel = Info.SendDlgMessage(hDlg, DM_GETCHECK, 2, 0); - Opt.SyncDel = Info.SendDlgMessage(hDlg, DM_GETCHECK, 3, 0); - Opt.SyncUseDelFilter = Info.SendDlgMessage(hDlg, DM_GETCHECK, 4, 0); + Opt.SyncRPanel = Info.SendDlgMessage(hDlg, DM_GETCHECK, 1, nullptr); + Opt.SyncLPanel = Info.SendDlgMessage(hDlg, DM_GETCHECK, 2, nullptr); + Opt.SyncDel = Info.SendDlgMessage(hDlg, DM_GETCHECK, 3, nullptr); + Opt.SyncUseDelFilter = Info.SendDlgMessage(hDlg, DM_GETCHECK, 4, nullptr); ret = (Opt.SyncLPanel || Opt.SyncRPanel || Opt.SyncDel) ? QR_ALL : QR_SKIP; // синхронизируем, иначе - пропустим } else if (ret == 7) @@ -150,7 +150,7 @@ int AdvCmpProc::QueryOverwriteFile(const wchar_t* FileName, FILETIME* srcTime, F GetMsg(MSkip), GetMsg(MSkipAll), GetMsg(MCancel)}; int ExitCode = - (int) Info.Message(&MainGuid, &QueryOverwriteMsgGuid, FMSG_WARNING | FMSG_LEFTALIGN, NULL, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 5); + (int) Info.Message(&MainGuid, &QueryOverwriteMsgGuid, FMSG_WARNING | FMSG_LEFTALIGN, nullptr, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 5); return (ExitCode <= QR_SKIPALL ? ExitCode : QR_ABORT); } @@ -173,7 +173,7 @@ int AdvCmpProc::QueryDelete(const wchar_t* FileName, bool bIsDir, bool bReadOnly GetMsg(MSkipAll), GetMsg(MCancel)}; - int ExitCode = (int) Info.Message(&MainGuid, &QueryDelMsgGuid, FMSG_WARNING, NULL, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 5); + int ExitCode = (int) Info.Message(&MainGuid, &QueryDelMsgGuid, FMSG_WARNING, nullptr, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 5); return (ExitCode <= QR_SKIPALL ? ExitCode : QR_ABORT); } @@ -202,7 +202,7 @@ void ShowSyncMsg(const wchar_t* Name1, const wchar_t* Name2, unsigned __int64 Pr const wchar_t* MsgItems[] = {GetMsg(MSyncTitle), GetMsg(MCopying), TruncName1, GetMsg(MCopyingTo), TruncName2, L"\1", ProgressBar}; - Info.Message(&MainGuid, &SyncMsgGuid, bStartMsg ? FMSG_LEFTALIGN : FMSG_LEFTALIGN | FMSG_KEEPBACKGROUND, NULL, MsgItems, + Info.Message(&MainGuid, &SyncMsgGuid, bStartMsg ? FMSG_LEFTALIGN : FMSG_LEFTALIGN | FMSG_KEEPBACKGROUND, nullptr, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 0); bStartMsg = false; } @@ -221,7 +221,7 @@ DWORD WINAPI SynchronizeFileCopyCallback(LARGE_INTEGER TotalFileSize, LARGE_INTE if (lpData) { - struct SynchronizeFileCopyCallbackData* data = (SynchronizeFileCopyCallbackData*) lpData; + auto* data = (SynchronizeFileCopyCallbackData*) lpData; ShowSyncMsg(data->srcFileName, data->destFileName, progress, max, false); } else @@ -372,7 +372,7 @@ int AdvCmpProc::SyncFile(const wchar_t* srcFileName, const wchar_t* destFileName if (doCopy) { - struct SynchronizeFileCopyCallbackData copyData; + struct SynchronizeFileCopyCallbackData copyData{}; copyData.srcFileName = (wchar_t*) srcFileName; copyData.destFileName = (wchar_t*) destFileName; int doSync = 1; @@ -408,7 +408,7 @@ int AdvCmpProc::SyncFile(const wchar_t* srcFileName, const wchar_t* destFileName if (!dwErr && ((Opt.CmpTime && (dwFlag & RCIF_TIMEDIFF)) || !Opt.CmpTime)) { HANDLE hFile = - CreateFileW(destFileName, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0); + CreateFileW(destFileName, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr); if (hFile != INVALID_HANDLE_VALUE) { if (!SetFileTime(hFile, &sWFD.ftCreationTime, &sWFD.ftLastAccessTime, &sWFD.ftLastWriteTime)) @@ -435,7 +435,7 @@ int AdvCmpProc::SyncFile(const wchar_t* srcFileName, const wchar_t* destFileName if (!SetFileAttributesW(destFileName, dWFD.dwFileAttributes & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN))) dwErr = GetLastError(); - if (!dwErr && CopyFileExW(srcFileName, destFileName, SynchronizeFileCopyCallback, ©Data, NULL, 0)) + if (!dwErr && CopyFileExW(srcFileName, destFileName, SynchronizeFileCopyCallback, ©Data, nullptr, 0)) { // CopyFileExW() не синхронизирует имена, поэтому... const wchar_t* pSrc = FSF.PointToName(srcFileName); @@ -467,13 +467,13 @@ int AdvCmpProc::SyncFile(const wchar_t* srcFileName, const wchar_t* destFileName // Check, wich file failes? HANDLE hFile; // ERROR_SHARING_VIOLATION==32 - hFile = CreateFileW(srcFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, NULL); + hFile = CreateFileW(srcFileName, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr); if (hFile == INVALID_HANDLE_VALUE) nErrMsg = MFailedOpenSrcFile; // Source file failed else { CloseHandle(hFile); - hFile = CreateFileW(destFileName, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, NULL); + hFile = CreateFileW(destFileName, GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr); if (hFile == INVALID_HANDLE_VALUE) { if (GetLastError() == ERROR_FILE_NOT_FOUND) @@ -492,7 +492,7 @@ int AdvCmpProc::SyncFile(const wchar_t* srcFileName, const wchar_t* destFileName SetLastError(dwErr); int ExitCode = bBrokenByEsc ? 2 /*MCancel*/ - : Info.Message(&MainGuid, &FailedCopyMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); + : Info.Message(&MainGuid, &FailedCopyMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, nullptr, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); if (!ExitCode) goto RetryCopy; @@ -615,7 +615,7 @@ int AdvCmpProc::DelFile(const wchar_t* FileName) if (Result || shs.fAnyOperationsAborted) { int ExitCode = bBrokenByEsc ? 2 /*MCancel*/ - : Info.Message(&MainGuid, &FailedDelFileMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, 0, MsgItems, + : Info.Message(&MainGuid, &FailedDelFileMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, nullptr, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); if (!ExitCode) @@ -641,7 +641,7 @@ int AdvCmpProc::DelFile(const wchar_t* FileName) { int ExitCode = bBrokenByEsc ? 2 /*MCancel*/ - : Info.Message(&MainGuid, &FailedDelFileMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); + : Info.Message(&MainGuid, &FailedDelFileMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, nullptr, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); if (!ExitCode) goto RetryDelFile; @@ -691,7 +691,7 @@ int AdvCmpProc::SyncDir(const wchar_t* srcDirName, const wchar_t* destDirName, i if (hFind == INVALID_HANDLE_VALUE) { - if (WFD.dwFileAttributes && CreateDirectoryW(destDirName, NULL)) + if (WFD.dwFileAttributes && CreateDirectoryW(destDirName, nullptr)) SetFileAttributesW(destDirName, WFD.dwFileAttributes); else ret = 0; @@ -725,7 +725,7 @@ int AdvCmpProc::SyncDir(const wchar_t* srcDirName, const wchar_t* destDirName, i GetMsg(MCancel)}; int ExitCode = - Info.Message(&MainGuid, &CantCreateFolderMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); + Info.Message(&MainGuid, &CantCreateFolderMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, nullptr, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); if (!ExitCode) goto RetryMkDir; @@ -917,7 +917,7 @@ int AdvCmpProc::DelDir(const wchar_t* DirName) int ExitCode = bBrokenByEsc ? 2 /*MCancel*/ - : Info.Message(&MainGuid, &FailedDelFolderMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, 0, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); + : Info.Message(&MainGuid, &FailedDelFolderMsgGuid, FMSG_WARNING | FMSG_ERRORTYPE, nullptr, MsgItems, sizeof(MsgItems) / sizeof(MsgItems[0]), 3); if (!ExitCode) goto RetryDelDir; @@ -947,7 +947,7 @@ int AdvCmpProc::Synchronize() bAskDel = GetFarSetting(FSSF_CONFIRMATIONS, L"Delete") ? true : false; bSkipLReadOnly = bSkipRReadOnly = false; - hConInp = CreateFileW(L"CONIN$", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + hConInp = CreateFileW(L"CONIN$", GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr); DWORD dwTicks = GetTickCount(); cmpFileList* pFileList = &cFList; @@ -1027,18 +1027,18 @@ int AdvCmpProc::Synchronize() { if (Opt.Sound && (GetTickCount() - dwTicks > 30000)) MessageBeep(MB_ICONASTERISK); - Info.AdvControl(&MainGuid, ACTL_PROGRESSNOTIFY, 0, 0); + Info.AdvControl(&MainGuid, ACTL_PROGRESSNOTIFY, 0, nullptr); } // Кеш стал неактуальным, освободим if (Cache.RCI) free(Cache.RCI); - Cache.RCI = 0; + Cache.RCI = nullptr; Cache.ItemsNumber = 0; } - Info.PanelControl(LPanel.hPanel, FCTL_UPDATEPANEL, 0, 0); - Info.PanelControl(RPanel.hPanel, FCTL_UPDATEPANEL, 0, 0); + Info.PanelControl(LPanel.hPanel, FCTL_UPDATEPANEL, 0, nullptr); + Info.PanelControl(RPanel.hPanel, FCTL_UPDATEPANEL, 0, nullptr); return ret; } From a4c80c4ddf56c6a4001a2ad85b103a97fd471f06 Mon Sep 17 00:00:00 2001 From: Aleksey Dobrunov Date: Wed, 27 Jan 2021 23:42:23 +0500 Subject: [PATCH 4/6] split declaration --- src/AdvCmp.hpp | 92 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 71 insertions(+), 21 deletions(-) diff --git a/src/AdvCmp.hpp b/src/AdvCmp.hpp index 12cecb9..0a40b55 100644 --- a/src/AdvCmp.hpp +++ b/src/AdvCmp.hpp @@ -148,28 +148,78 @@ extern struct FarStandardFunctions FSF; ****************************************************************************/ extern struct Options { - int Mode, CmpCase, CmpSize, CmpTime, Seconds, LowPrecisionTime, IgnoreTimeZone, CmpContents, OnlyTimeDiff, Cache, CacheIgnore, Partly, PartlyFull, - PartlyKbSize, Ignore, IgnoreTemplates, DupName, DupSize, DupContents, DupPic, DupPicDiff, DupPicSize, DupPicFmt, DupMusic, DupMusicArtist, - DupMusicTitle, DupMusicDuration, DupMusicDurationSec, Subfolders, MaxScanDepth, ScanSymlink, Filter, StopDiffDup, SkipSubstr, ProcessSelected, - SelectedNew, SyncOnlyRight, LightSync, IgnoreMissing, ShowMsg, Sound, Dialog, TotalProgress, Sync, - // что показывать в листе - ShowListSelect, ShowListIdentical, ShowListDifferent, ShowListLNew, ShowListRNew, - // отметка элементов в листе - SyncFlagClearUser, - SyncFlagCopy, // <0 - налево, =0 - нет, >0 - направо - SyncFlagIfNew, - SyncFlagLCopy, // уникальный слева: <0 - налево, =0 - нет, >0 - направо - SyncFlagRCopy, // уникальный справа: <0 - налево/удалить, =0 - нет, >0 - направо - // копирование/удаление - SyncLPanel, SyncRPanel, SyncDel, SyncUseDelFilter, - - Dup, DupListSmall, - // удаление - DupDel, DupDelRecycleBin, - - ProcessHidden, BufSize; + int Mode; + int CmpCase; + int CmpSize; + int CmpTime; + int Seconds; + int LowPrecisionTime; + int IgnoreTimeZone; + int CmpContents; + int OnlyTimeDiff; + int Cache; + int CacheIgnore; + int Partly; + int PartlyFull; + int PartlyKbSize; + int Ignore; + int IgnoreTemplates; + int DupName; + int DupSize; + int DupContents; + int DupPic; + int DupPicDiff; + int DupPicSize; + int DupPicFmt; + int DupMusic; + int DupMusicArtist; + int DupMusicTitle; + int DupMusicDuration; + int DupMusicDurationSec; + int Subfolders; + int MaxScanDepth; + int ScanSymlink; + int Filter; + int StopDiffDup; + int SkipSubstr; + int ProcessSelected; + int SelectedNew; + int SyncOnlyRight; + int LightSync; + int IgnoreMissing; + int ShowMsg; + int Sound; + int Dialog; + int TotalProgress; + int Sync; + // что показывать в листе + int ShowListSelect; + int ShowListIdentical; + int ShowListDifferent; + int ShowListLNew; + int ShowListRNew; + // отметка элементов в листе + int SyncFlagClearUser; + int SyncFlagCopy; // <0 - налево, =0 - нет, >0 - направо + int SyncFlagIfNew; + int SyncFlagLCopy; // уникальный слева: <0 - налево, =0 - нет, >0 - направо + int SyncFlagRCopy; // уникальный справа: <0 - налево/удалить, =0 - нет, >0 - направо + // копирование/удаление + int SyncLPanel; + int SyncRPanel; + int SyncDel; + int SyncUseDelFilter; + int Dup; + int DupListSmall; + // удаление + int DupDel; + int DupDelRecycleBin; + int ProcessHidden; + int BufSize; char* Buf[2]; - wchar_t *DupPath, *Substr, *WinMergePath; + wchar_t *DupPath; + wchar_t* Substr; + wchar_t* WinMergePath; HANDLE hCustomFilter; } Opt; From aa2d0f13f9479117815242201384cb2d3ab1f784 Mon Sep 17 00:00:00 2001 From: Aleksey Dobrunov Date: Fri, 29 Jan 2021 00:26:13 +0500 Subject: [PATCH 5/6] fix shortcut ; (fix #3) --- src/AdvCmp.cpp | 2 +- src/AdvCmpExRus.hlf.in | 5 +- src/AdvCmpProc_CLIST.cpp | 176 ++++++++++++--------------------------- 3 files changed, 56 insertions(+), 127 deletions(-) diff --git a/src/AdvCmp.cpp b/src/AdvCmp.cpp index 3a0e640..6f122af 100644 --- a/src/AdvCmp.cpp +++ b/src/AdvCmp.cpp @@ -548,7 +548,7 @@ HANDLE WINAPI OpenW(const struct OpenInfo* OInfo) LPanel.bTMP = LPanel.bARC = LPanel.bCurFile = LPanel.bDir = false; RPanel.bTMP = RPanel.bARC = RPanel.bCurFile = RPanel.bDir = false; - struct DirList LList, RList; + struct DirList LList{}, RList{}; GetDirList(LPanel, LList); GetDirList(RPanel, RList); diff --git a/src/AdvCmpExRus.hlf.in b/src/AdvCmpExRus.hlf.in index 8c4745c..7f3ec3b 100644 --- a/src/AdvCmpExRus.hlf.in +++ b/src/AdvCmpExRus.hlf.in @@ -449,7 +449,7 @@ $^ #Итоговый диалог сравнения# #Ins# - отметить файл; - #Space# - изменить флаг отличия файлов; + #Space# - изменить флаг отличия файлов, доступно только в режиме синхронизации; #Ctrl-Space# - изменить флаг отличия у группы файлов; @@ -474,14 +474,13 @@ $^ #Итоговый диалог сравнения# #Клик в правый верхний угол# - закрыть диалог; - #Клик левой клавишей# - изменить флаг отличия файлов; + #Клик левой клавишей# - изменить флаг отличия файлов, доступно только в режиме синхронизации; #Двойной клик левой клавишей# - текстовое сравнение файлов под курсором, если установлена программа ~WinMerge~@@ESCAPE@http://winmerge.org/@ESCAPE@@; Скрытые пользователем элементы не участвуют в процессе синхронизации. -Изменение флага отличия элементов доступно только в режиме синхронизации. Смотрите также: --------------- diff --git a/src/AdvCmpProc_CLIST.cpp b/src/AdvCmpProc_CLIST.cpp index f650122..dd43619 100644 --- a/src/AdvCmpProc_CLIST.cpp +++ b/src/AdvCmpProc_CLIST.cpp @@ -497,20 +497,20 @@ bool MakeCmpFarList(HANDLE hDlg, cmpFileList* pFileList, bool bSetCurPos, bool b bool bSetBottom = false; /*************************************************************************** - * Обработчик диалога + * Обработчик диалога результатов сравнения файлов ***************************************************************************/ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void* Param2) { - cmpFileList* pFileList = (cmpFileList*) Info.SendDlgMessage(hDlg, DM_GETDLGDATA, 0, nullptr); + auto* pFileList = (cmpFileList*) Info.SendDlgMessage(hDlg, DM_GETDLGDATA, 0, nullptr); switch (Msg) { case DN_INITDIALOG: MakeCmpFarList(hDlg, pFileList, true, true); - Info.SendDlgMessage(hDlg, DM_SETMOUSEEVENTNOTIFY, 1, nullptr); + Info.SendDlgMessage(hDlg, DM_SETINPUTNOTIFY, 1, nullptr); break; /************************************************************************/ - + // изменение размера окна FAR case DN_RESIZECONSOLE: { COORD c = (*(COORD*) Param2); Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); @@ -529,11 +529,13 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo /************************************************************************/ + // перед отрисовкой элемента списка, выбирам цвет отображения case DN_CTLCOLORDLGLIST: if (Param1 == 0) { - struct FarDialogItemColors* Colors = (FarDialogItemColors*) Param2; - FarColor Color; + // TODO сделать заполнение массива один раз, а не на каждое движение по списку + auto* Colors = (FarDialogItemColors*) Param2; + FarColor Color {}; int ColorIndex[15] = {COL_PANELTEXT, COL_PANELBOX, COL_PANELBOX, // заголовки @@ -567,9 +569,11 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo /************************************************************************/ + // попытка выйти из окна case DN_CLOSE: if (Opt.Mode == MODE_SYNC && Param1 == -1) { + // проверяем есть ли что синхронизировать, и показываем окно действий Opt.Sync = GetSyncOpt(pFileList); if (Opt.Sync == QR_EDIT) return false; @@ -581,17 +585,18 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo /************************************************************************/ case DN_INPUT: { - const INPUT_RECORD* record = (const INPUT_RECORD*) Param2; + const auto* record = (const INPUT_RECORD*) Param2; if (record->EventType == MOUSE_EVENT) - // отработаем щелчок мыши в поле Mark - if (Opt.Mode == MODE_SYNC && Param1 == 0 && record->Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED && + { + if (Param1 == 0 && record->Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED && record->Event.MouseEvent.dwEventFlags != DOUBLE_CLICK) { SMALL_RECT dlgRect; Info.SendDlgMessage(hDlg, DM_GETDLGRECT, 0, &dlgRect); + // отработаем щелчок мыши в поле Mark // щелкнули в LISTе - if (record->Event.MouseEvent.dwMousePosition.X > dlgRect.Left && record->Event.MouseEvent.dwMousePosition.X < dlgRect.Right && + if (Opt.Mode == MODE_SYNC && record->Event.MouseEvent.dwMousePosition.X > dlgRect.Left && record->Event.MouseEvent.dwMousePosition.X < dlgRect.Right && record->Event.MouseEvent.dwMousePosition.Y > dlgRect.Top && record->Event.MouseEvent.dwMousePosition.Y < dlgRect.Bottom) { FarListPos ListPos = {sizeof(FarListPos)}; @@ -615,6 +620,16 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo return false; } } + // закроем диалог по клику в правом верхнем угу + if (record->Event.MouseEvent.dwMousePosition.X == dlgRect.Right && record->Event.MouseEvent.dwMousePosition.Y == dlgRect.Top) + { + INPUT_RECORD rec; + if (FSF.FarNameToInputRecord(L"F10", &rec)) + Info.SendDlgMessage(hDlg, DM_KEY, 1, &rec); + else + Info.SendDlgMessage(hDlg, DM_CLOSE, 0, nullptr); + return false; + } } else if (Param1 == 0 && record->Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED && record->Event.MouseEvent.dwEventFlags == DOUBLE_CLICK) @@ -629,29 +644,37 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo return false; } } - // закроем диалог по клику в правом верхнем угу - else if (Param1 == 0 && record->Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) + } + else if (record->EventType == KEY_EVENT && record->Event.KeyEvent.bKeyDown && record->Event.KeyEvent.wVirtualKeyCode == VK_CONTROL && + IsCtrl(record)) + { + int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, nullptr); + cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); + cmpFile* cur = tmp ? *tmp : nullptr; + if (cur) { - SMALL_RECT dlgRect; - Info.SendDlgMessage(hDlg, DM_GETDLGRECT, 0, &dlgRect); - if (record->Event.MouseEvent.dwMousePosition.X == dlgRect.Right && record->Event.MouseEvent.dwMousePosition.Y == dlgRect.Top) + string strVirtDir = GetPosToName(cur->L.Dir) + wcslen(LPanel.Dir); + if (strVirtDir.length() > 0) + FSF.TruncStr(strVirtDir.get(), WinInfo.TruncLen - wcslen(GetMsg(MListBottomCurDir))); + else { - INPUT_RECORD rec; - if (FSF.FarNameToInputRecord(L"F10", &rec)) - Info.SendDlgMessage(hDlg, DM_KEY, 1, &rec); - else - Info.SendDlgMessage(hDlg, DM_CLOSE, 0, nullptr); - return false; + MessageBeep(MB_OK); + return true; } + strVirtDir.updsize(); + SetBottom(hDlg, pFileList, strVirtDir.get()); + bSetBottom = true; + return true; } + } return true; } /************************************************************************/ - + // нажатия клавиш case DN_CONTROLINPUT: { - const INPUT_RECORD* record = (const INPUT_RECORD*) Param2; + const auto* record = (const INPUT_RECORD*) Param2; if (bSetBottom) { @@ -665,82 +688,6 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo if (IsNone(record)) { -#if 0 - if (vk==VK_F3) - { - wchar_t LName[4][66], RName[4][66]; - - for (int i=0; i<4; i++) - { - LName[i][0]=0; - RName[i][0]=0; - } - int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); - cmpFile **tmp=(cmpFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); - cmpFile *cur=(tmp && *tmp)?*tmp:NULL; - if (cur) - { - for (int j=0;j<=1;j++) - { - wchar_t *Name=GetPosToName((j==0)?cur->LDir:cur->RDir); - int len=wcslen(Name); - for (int i=0; i<4; i++, len-=65) - { - if (len<65) - { - lstrcpyn((j==0)?LName[i]:RName[i], Name+i*65, len+1); - break; - } - else - lstrcpyn((j==0)?LName[i]:RName[i], Name+i*65, 66); - } - } - } - struct FarDialogItem DialogItems[] = { - // Type X1 Y1 X2 Y2 Selected History Mask Flags Data MaxLen UserParam - /* 0*/{DI_DOUBLEBOX,0, 0,70,14, 0, 0, 0, 0, GetMsg(MCurDirName), 0,0}, - /* 1*/{DI_SINGLEBOX,2, 1,68, 6, 0, 0, 0, DIF_LEFTTEXT, GetMsg(MLName), 0,0}, - /* 2*/{DI_TEXT, 3, 2, 0, 0, 0, 0, 0, DIF_LEFTTEXT, LName[0],0,0}, - /* 3*/{DI_TEXT, 3, 3, 0, 0, 0, 0, 0, DIF_LEFTTEXT, LName[1],0,0}, - /* 4*/{DI_TEXT, 3, 4, 0, 0, 0, 0, 0, DIF_LEFTTEXT, LName[2],0,0}, - /* 5*/{DI_TEXT, 3, 5, 0, 0, 0, 0, 0, DIF_LEFTTEXT, LName[3],0,0}, - /* 6*/{DI_SINGLEBOX,2, 7,68,12, 0, 0, 0, DIF_LEFTTEXT, GetMsg(MRName), 0,0}, - /* 7*/{DI_TEXT, 3, 8, 0, 0, 0, 0, 0, DIF_LEFTTEXT, RName[0],0,0}, - /* 8*/{DI_TEXT, 3, 9, 0, 0, 0, 0, 0, DIF_LEFTTEXT, RName[1],0,0}, - /* 9*/{DI_TEXT, 3,10, 0, 0, 0, 0, 0, DIF_LEFTTEXT, RName[2],0,0}, - /*10*/{DI_TEXT, 3,11, 0, 0, 0, 0, 0, DIF_LEFTTEXT, RName[3],0,0}, - /*11*/{DI_BUTTON, 0,13, 0, 0, 0, 0, 0,DIF_CENTERGROUP|DIF_DEFAULTBUTTON, GetMsg(MOK),0,0}, - }; - HANDLE hDlg=Info.DialogInit(&MainGuid,&DlgNameGuid,-1,-1,71,15,L"DlgCmp", DialogItems,sizeof(DialogItems)/sizeof(DialogItems[0]),0,FDLG_SMALLDIALOG,0,0); - if (hDlg != INVALID_HANDLE_VALUE) - { - Info.DialogRun(hDlg); - Info.DialogFree(hDlg); - } - return true; - } - //----- - else - if (vk==VK_F3||vk==VK_F4) - { - int Pos=Info.SendDlgMessage(hDlg,DM_LISTGETCURPOS,0,0); - cmpFile **tmp=(cmpFile **)Info.SendDlgMessage(hDlg,DM_LISTGETDATA,0,(void *)Pos); - cmpFile *cur=(tmp && *tmp)?*tmp:NULL; - if (cur) - { - string strFullFileName; - if (vk==VK_F3 && !(cur->dwFlags&RCIF_RUNIQ) && !(cur->dwLAttributes&FILE_ATTRIBUTE_DIRECTORY)) - GetFullFileName(strFullFileName,cur->LDir,cur->FileName); - else if (vk==VK_F4 && !(cur->dwFlags&RCIF_LUNIQ) && !(cur->dwRAttributes&FILE_ATTRIBUTE_DIRECTORY)) - GetFullFileName(strFullFileName,cur->RDir,cur->FileName); - if (strFullFileName.length() && Info.Viewer(GetPosToName(strFullFileName.get()),NULL,0,0,-1,-1,VF_DISABLEHISTORY,CP_AUTODETECT)) - return true; - } - MessageBeep(MB_OK); - return true; - } - else -#endif if (vk == VK_RETURN) { GOTOCMPFILE: @@ -1001,28 +948,7 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo } else if (IsCtrl(record)) { - if (vk == VK_CONTROL) - { - int Pos = Info.SendDlgMessage(hDlg, DM_LISTGETCURPOS, 0, nullptr); - cmpFile** tmp = (cmpFile**) Info.SendDlgMessage(hDlg, DM_LISTGETDATA, 0, (void*) Pos); - cmpFile* cur = tmp ? *tmp : nullptr; - if (cur) - { - string strVirtDir = GetPosToName(cur->L.Dir) + wcslen(LPanel.Dir); - if (strVirtDir.length() > 0) - FSF.TruncStr(strVirtDir.get(), WinInfo.TruncLen - wcslen(GetMsg(MListBottomCurDir))); - else - { - MessageBeep(MB_OK); - return true; - } - strVirtDir.updsize(); - SetBottom(hDlg, pFileList, strVirtDir.get()); - bSetBottom = true; - return true; - } - } - else if (vk == 0x52) // VK_R + if (vk == 0x52) // VK_R { Info.SendDlgMessage(hDlg, DM_ENABLEREDRAW, false, nullptr); Opt.ShowListSelect = true; @@ -1083,7 +1009,8 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo // Type X1 Y1 X2 Y2 Selected History Mask Flags Data MaxLen UserParam /* 0*/ {DI_DOUBLEBOX, 3, 1, 60, 11, 0, nullptr, nullptr, 0, GetMsg(MSyncSelTitle), 0, 0}, /* 1*/ {DI_TEXT, 5, 2, 0, 0, 0, nullptr, nullptr, DIF_SEPARATOR, GetMsg(MSyncSelDiff), 0, 0}, - /* 2*/ {DI_RADIOBUTTON, 5, 3, 0, 0, (Opt.SyncOnlyRight ? 0 : 1), nullptr, nullptr, DIF_FOCUS | DIF_GROUP, GetMsg(MSyncSelToSkip), 0, 0}, + /* 2*/ + {DI_RADIOBUTTON, 5, 3, 0, 0, (Opt.SyncOnlyRight ? 0 : 1), nullptr, nullptr, DIF_FOCUS | DIF_GROUP, GetMsg(MSyncSelToSkip), 0, 0}, /* 3*/ {DI_RADIOBUTTON, 22, 3, 0, 0, (Opt.SyncOnlyRight ? 1 : 0), nullptr, nullptr, 0, GetMsg(MSyncSelToRight), 0, 0}, /* 4*/ {DI_RADIOBUTTON, 39, 3, 0, 0, 0, nullptr, nullptr, 0, GetMsg(MSyncSelToLeft), 0, 0}, /* 5*/ {DI_CHECKBOX, 5, 4, 0, 0, 0, nullptr, nullptr, 0, GetMsg(MSyncSelIfNew), 0, 0}, @@ -1108,7 +1035,8 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo ret = (int) Info.DialogRun(hDlgCur); if (ret == 15) { - Opt.SyncFlagCopy = (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 2, nullptr) ? 1 : (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 3, nullptr) ? 2 : -2)); + Opt.SyncFlagCopy = + (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 2, nullptr) ? 1 : (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 3, nullptr) ? 2 : -2)); Opt.SyncFlagIfNew = Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 5, nullptr); Opt.SyncFlagLCopy = (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 7, nullptr) ? 2 : (Info.SendDlgMessage(hDlgCur, DM_GETCHECK, 8, nullptr) ? -2 : 0)); @@ -1260,6 +1188,8 @@ intptr_t WINAPI ShowCmpDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, vo } } } + default: + break; } return Info.DefDlgProc(hDlg, Msg, Param1, Param2); } From 792d55d9735e5b95dcf38fe18c425ce30361b5cf Mon Sep 17 00:00:00 2001 From: Aleksey Dobrunov Date: Fri, 29 Jan 2021 22:58:03 +0500 Subject: [PATCH 6/6] update version --- WhatsNewRus.txt | 5 +++++ src/version.hpp | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/WhatsNewRus.txt b/WhatsNewRus.txt index dc9e7c3..1886ac5 100644 --- a/WhatsNewRus.txt +++ b/WhatsNewRus.txt @@ -6,6 +6,11 @@ AdvCmpEx ~~~~~~~~ +Version 3.3.0 (29.01.2021) +-------------------------- +[*] Исправлено падение плагина при работе с хэндлами консоли +[*] Исправлена работа горячих клавиш и мыши в окне результатов сравнения файлов + Version 3.2.0 (09.01.2021) -------------------------- [+] добавлена поддержка Windows 2000 и WindowsXP diff --git a/src/version.hpp b/src/version.hpp index 89017aa..b604bc5 100644 --- a/src/version.hpp +++ b/src/version.hpp @@ -7,7 +7,7 @@ #endif #define PLUGIN_VER_MAJOR 3 -#define PLUGIN_VER_MINOR 2 +#define PLUGIN_VER_MINOR 3 #define PLUGIN_VER_PATCH 0 #define PLUGIN_DESC L"Advanced compare files for Far Manager 3" PLATFORM #define PLUGIN_NAME L"AdvCmpEx"