OSDN Git Service

PATCH: [ 2805717 ] Refactor Date/Size compare to own compare engine
authorKimmo Varis <kimmov@gmail.com>
Sat, 13 Jun 2009 12:55:37 +0000 (12:55 +0000)
committerKimmo Varis <kimmov@gmail.com>
Sat, 13 Jun 2009 12:55:37 +0000 (12:55 +0000)
Src/CompareEngines/TimeSizeCompare.cpp [new file with mode: 0644]
Src/CompareEngines/TimeSizeCompare.h [new file with mode: 0644]
Src/FolderCmp.cpp
Src/FolderCmp.h
Src/Merge.vcproj

diff --git a/Src/CompareEngines/TimeSizeCompare.cpp b/Src/CompareEngines/TimeSizeCompare.cpp
new file mode 100644 (file)
index 0000000..bc073a2
--- /dev/null
@@ -0,0 +1,89 @@
+/** 
+ * @file  TimeSizeCompare.cpp
+ *
+ * @brief Implementation file for TimeSizeCompare
+ */
+// ID line follows -- this is updated by SVN
+// $Id$
+
+#include "stdafx.h"
+#include "DiffContext.h"
+#include "DIFF.H"
+#include "DiffItem.h"
+#include "TimeSizeCompare.h"
+#include "DiffWrapper.h"
+
+namespace CompareEngines
+{
+
+TimeSizeCompare::TimeSizeCompare()
+: m_ignoreSmallDiff(false)
+{
+}
+
+TimeSizeCompare::~TimeSizeCompare()
+{
+}
+
+/**
+ * @brief Set compare-type specific options.
+ * @param [in] ignoreSmallDiff Ignore small time differences?
+ */
+void TimeSizeCompare::SetAdditionalOptions(bool ignoreSmallDiff)
+{
+       m_ignoreSmallDiff = ignoreSmallDiff;
+}
+
+/** 
+ * @brief Compare two specified files, byte-by-byte
+ * @param [in] compMethod Compare method used.
+ * @param [in] di Diffitem info.
+ * @return DIFFCODE
+ */
+int TimeSizeCompare::CompareFiles(int compMethod, const DIFFITEM &di)
+{
+       UINT code = 0;
+
+       // Compare by modified date
+       // Check that we have both filetimes
+       if (di.left.mtime != 0 && di.right.mtime != 0)
+       {
+               INT64 nTimeDiff = di.left.mtime - di.right.mtime;
+               // Remove sign
+               nTimeDiff = (nTimeDiff > 0 ? nTimeDiff : -nTimeDiff);
+               if (m_ignoreSmallDiff)
+               {
+                       // If option to ignore small timediffs (couple of seconds)
+                       // is set, decrease absolute difference by allowed diff
+                       nTimeDiff -= SmallTimeDiff;
+               }
+               if (nTimeDiff <= 0)
+                       code = DIFFCODE::SAME;
+               else
+                       code = DIFFCODE::DIFF;
+       }
+       else
+       {
+               // Filetimes for item(s) could not be read. So we have to
+               // set error status, unless we have DATE_SIZE -compare
+               // when we have still hope for size compare..
+               if (compMethod == CMP_DATE_SIZE)
+                       code = DIFFCODE::SAME;
+               else
+                       code = DIFFCODE::CMPERR;
+       }
+       
+       // This is actual CMP_DATE_SIZE method..
+       // If file sizes differ mark them different
+       if (compMethod == CMP_DATE_SIZE)
+       {
+               if (di.left.size != di.right.size)
+               {
+                       code &= ~DIFFCODE::SAME;
+                       code = DIFFCODE::DIFF;
+               }
+       }
+       return code;
+}
+
+} // namespace CompareEngines
diff --git a/Src/CompareEngines/TimeSizeCompare.h b/Src/CompareEngines/TimeSizeCompare.h
new file mode 100644 (file)
index 0000000..187b05e
--- /dev/null
@@ -0,0 +1,33 @@
+/** 
+ * @file  TimeSizeCompare.h
+ *
+ * @brief Declaration file for TimeSizeCompare compare engine.
+ */
+// ID line follows -- this is updated by SVN
+// $Id$
+
+#ifndef _TIMESIZE_COMPARE_H_
+#define _TIMESIZE_COMPARE_H_
+
+namespace CompareEngines
+{
+
+/**
+ * @brief A time/size compare class.
+ * This compare method compares files by their times and sizes.
+ */
+class TimeSizeCompare
+{
+public:
+       TimeSizeCompare();
+       ~TimeSizeCompare();
+       void SetAdditionalOptions(bool ignoreSmallDiff);
+       int CompareFiles(int compMethod, const DIFFITEM &di);
+
+private:
+       bool m_ignoreSmallDiff;
+};
+
+} // namespace CompareEngines
+
+#endif // _TIMESIZE_COMPARE_H_
index d08c4c7..834effc 100644 (file)
 #include "FolderCmp.h"
 #include "ByteComparator.h"
 #include "codepage_detect.h"
+#include "TimeSizeCompare.h"
 
 using CompareEngines::ByteCompare;
+using CompareEngines::TimeSizeCompare;
 
 static void GetComparePaths(CDiffContext * pCtxt, const DIFFITEM &di, String & left, String & right);
 static bool Unpack(String & filepathTransformed,
@@ -31,6 +33,7 @@ static bool Unpack(String & filepathTransformed,
 FolderCmp::FolderCmp()
 : m_pDiffUtilsEngine(NULL)
 , m_pByteCompare(NULL)
+, m_pTimeSizeCompare(NULL)
 , m_ndiffs(CDiffContext::DIFFS_UNKNOWN)
 , m_ntrivialdiffs(CDiffContext::DIFFS_UNKNOWN)
 , m_pCtx(NULL)
@@ -41,6 +44,7 @@ FolderCmp::~FolderCmp()
 {
        delete m_pDiffUtilsEngine;
        delete m_pByteCompare;
+       delete m_pTimeSizeCompare;
 }
 
 bool FolderCmp::RunPlugins(CDiffContext * pCtxt, PluginsContext * plugCtxt, CString &errStr)
@@ -275,55 +279,14 @@ UINT FolderCmp::prepAndCompareTwoFiles(CDiffContext * pCtxt, DIFFITEM &di)
                di.left.m_textStats = m_diffFileData.m_textStats0;
                di.right.m_textStats = m_diffFileData.m_textStats1;
        }
-       else if (nCompMethod == CMP_DATE || nCompMethod == CMP_DATE_SIZE)
+       else if (nCompMethod == CMP_DATE || nCompMethod == CMP_DATE_SIZE || nCompMethod == CMP_SIZE)
        {
-               // Compare by modified date
-               // Check that we have both filetimes
-               if (di.left.mtime != 0 && di.right.mtime != 0)
-               {
-                       __int64 nTimeDiff = di.left.mtime - di.right.mtime;
-                       // Remove sign
-                       nTimeDiff = (nTimeDiff > 0 ? nTimeDiff : -nTimeDiff);
-                       if (pCtxt->m_bIgnoreSmallTimeDiff)
-                       {
-                               // If option to ignore small timediffs (couple of seconds)
-                               // is set, decrease absolute difference by allowed diff
-                               nTimeDiff -= SmallTimeDiff;
-                       }
-                       if (nTimeDiff <= 0)
-                               code = DIFFCODE::SAME;
-                       else
-                               code = DIFFCODE::DIFF;
-               }
-               else
-               {
-                       // Filetimes for item(s) could not be read. So we have to
-                       // set error status, unless we have DATE_SIZE -compare
-                       // when we have still hope for size compare..
-                       if (nCompMethod == CMP_DATE_SIZE)
-                               code = DIFFCODE::SAME;
-                       else
-                               code = DIFFCODE::CMPERR;
-               }
-               
-               // This is actual CMP_DATE_SIZE method..
-               // If file sizes differ mark them different
-               if (nCompMethod == CMP_DATE_SIZE)
-               {
-                       if (di.left.size != di.right.size)
-                       {
-                               code &= ~DIFFCODE::SAME;
-                               code = DIFFCODE::DIFF;
-                       }
-               }
-       }
-       else if (nCompMethod == CMP_SIZE)
-       {
-               // Compare by size
-               if (di.left.size == di.right.size)
-                       code = DIFFCODE::SAME;
-               else
-                       code = DIFFCODE::DIFF;
+               if (m_pTimeSizeCompare == NULL)
+                       m_pTimeSizeCompare = new TimeSizeCompare();
+
+               m_pTimeSizeCompare->SetAdditionalOptions(!!pCtxt->m_bIgnoreSmallTimeDiff);
+               code = m_pTimeSizeCompare->CompareFiles(nCompMethod, di);
+
        }
        else
        {
index 21abce4..54debd1 100644 (file)
@@ -12,6 +12,7 @@
 #include "DiffFileData.h"
 #include "DiffUtils.h"
 #include "ByteCompare.h"
+#include "TimeSizeCompare.h"
 
 class CDiffContext;
 class PackingInfo;
@@ -56,6 +57,7 @@ public:
 private:
        CompareEngines::DiffUtils *m_pDiffUtilsEngine;
        CompareEngines::ByteCompare *m_pByteCompare;
+       CompareEngines::TimeSizeCompare *m_pTimeSizeCompare;
 };
 
 
index ad98a33..8ed73e3 100644 (file)
                                </FileConfiguration>
                        </File>
                        <File
+                               RelativePath="CompareEngines\TimeSizeCompare.cpp">
+                               <FileConfiguration
+                                       Name="UnicodeRelease|Win32">
+                                       <Tool
+                                               Name="VCCLCompilerTool"
+                                               Optimization="1"
+                                               AdditionalIncludeDirectories=""
+                                               PreprocessorDefinitions=""/>
+                               </FileConfiguration>
+                               <FileConfiguration
+                                       Name="UnicodeDebug|Win32">
+                                       <Tool
+                                               Name="VCCLCompilerTool"
+                                               Optimization="0"
+                                               AdditionalIncludeDirectories=""
+                                               PreprocessorDefinitions=""
+                                               BrowseInformation="1"/>
+                               </FileConfiguration>
+                               <FileConfiguration
+                                       Name="Debug|Win32">
+                                       <Tool
+                                               Name="VCCLCompilerTool"
+                                               Optimization="0"
+                                               AdditionalIncludeDirectories=""
+                                               PreprocessorDefinitions=""
+                                               BrowseInformation="1"/>
+                               </FileConfiguration>
+                               <FileConfiguration
+                                       Name="Release|Win32">
+                                       <Tool
+                                               Name="VCCLCompilerTool"
+                                               Optimization="1"
+                                               AdditionalIncludeDirectories=""
+                                               PreprocessorDefinitions=""/>
+                               </FileConfiguration>
+                       </File>
+                       <File
                                RelativePath="Common\ToolBarXPThemes.cpp">
                                <FileConfiguration
                                        Name="UnicodeRelease|Win32">
                                RelativePath="TestFilterDlg.h">
                        </File>
                        <File
+                               RelativePath="CompareEngines\TimeSizeCompare.h">
+                       </File>
+                       <File
                                RelativePath="Common\ToolbarXPThemes.h">
                        </File>
                        <File