From 4226e548662339ea1ca37b45385a7cf9b237ff1e Mon Sep 17 00:00:00 2001 From: Daniel Wilhelm Date: Fri, 18 Apr 2014 17:07:43 +0200 Subject: 3.8 --- Application.cpp | 7 +- Application.h | 6 + BUILD/Changelog.txt | 16 + BUILD/FreeFileSync.chm | Bin 361168 -> 374528 bytes BUILD/Help/html/advanced/CmpSettings.png | Bin 17093 -> 29984 bytes BUILD/Help/html/advanced/SymbolicLinks.html | 68 +- BUILD/Languages/chinese_simple.lng | 64 +- BUILD/Languages/chinese_traditional.lng | 114 +- BUILD/Languages/czech.lng | 66 +- BUILD/Languages/dutch.lng | 62 +- BUILD/Languages/english_uk.lng | 70 +- BUILD/Languages/finnish.lng | 78 +- BUILD/Languages/french.lng | 130 +- BUILD/Languages/german.lng | 74 +- BUILD/Languages/hebrew.lng | 892 + BUILD/Languages/hungarian.lng | 134 +- BUILD/Languages/italian.lng | 100 +- BUILD/Languages/japanese.lng | 62 +- BUILD/Languages/polish.lng | 64 +- BUILD/Languages/portuguese.lng | 64 +- BUILD/Languages/portuguese_br.lng | 76 +- BUILD/Languages/romanian.lng | 348 +- BUILD/Languages/russian.lng | 64 +- BUILD/Languages/slovenian.lng | 74 +- BUILD/Languages/spanish.lng | 70 +- BUILD/Languages/swedish.lng | 64 +- BUILD/Languages/turkish.lng | 62 +- BUILD/Resources.dat | Bin 295575 -> 296154 bytes Cleanup.cmd | 2 + FreeFileSync.cbp | 10 +- FreeFileSync.vcproj | 702 - FreeFileSync.vcxproj | 315 + LICENSE | 621 + Makefile | 38 +- RealtimeSync/RealtimeSync.cbp | 2 + RealtimeSync/RealtimeSync.vcproj | 540 - RealtimeSync/RealtimeSync.vcxproj | 269 + RealtimeSync/application.h | 6 + RealtimeSync/guiGenerated.cpp | 4 +- RealtimeSync/mainDialog.cpp | 13 +- RealtimeSync/makefile | 3 +- RealtimeSync/resource.rc | 26 +- RealtimeSync/trayMenu.cpp | 25 +- RealtimeSync/watcher.cpp | 16 +- algorithm.cpp | 425 +- algorithm.h | 4 +- comparison.cpp | 452 +- comparison.h | 13 +- fileHierarchy.cpp | 43 +- fileHierarchy.h | 486 +- library/CustomGrid.cpp | 314 +- library/CustomGrid.h | 10 +- library/FreeFileSync.ico | Bin 94198 -> 82726 bytes library/dbFile.cpp | 59 +- library/dbFile.h | 6 + library/filter.cpp | 3 +- library/iconBuffer.cpp | 346 +- library/iconBuffer.h | 25 +- library/multithreading.cpp | 254 - library/multithreading.h | 41 - library/pch.h | 4 + library/processXml.cpp | 54 +- library/statistics.cpp | 14 +- resource.rc | 28 +- shared/IFileOperation/FileOperation_Vista.vcproj | 409 - shared/IFileOperation/FileOperation_Vista.vcxproj | 234 + shared/IFileOperation/dllmain.cpp | 2 +- shared/IFileOperation/fileOp.cpp | 4 +- shared/ShadowCopy/Shadow_2003.vcproj | 413 - shared/ShadowCopy/Shadow_2003.vcxproj | 238 + shared/ShadowCopy/Shadow_XP.vcproj | 413 - shared/ShadowCopy/Shadow_XP.vcxproj | 239 + shared/ShadowCopy/dllmain.cpp | 2 +- shared/ShadowCopy/shadow.cpp | 71 +- shared/Taskbar_Seven/Taskbar_Seven.vcproj | 409 - shared/Taskbar_Seven/Taskbar_Seven.vcxproj | 233 + shared/Taskbar_Seven/dllmain.cpp | 4 +- shared/Taskbar_Seven/taskbar.cpp | 2 +- shared/checkExist.cpp | 54 + shared/checkExist.h | 19 + shared/customTooltip.cpp | 8 +- shared/customTooltip.h | 4 +- shared/dllLoader.cpp | 2 +- shared/dragAndDrop.cpp | 8 +- shared/fileHandling.cpp | 282 +- shared/fileHandling.h | 7 +- shared/fileIO.h | 2 +- shared/fileTraverser.cpp | 272 +- shared/fileTraverser.h | 28 +- shared/globalFunctions.cpp | 21 - shared/globalFunctions.h | 72 +- shared/guid.cpp | 102 +- shared/localization.cpp | 55 +- shared/lock.cpp | 22 + shared/lock.h | 26 + shared/ossp_uuid/.libs/libuuid++.a | Bin 83704 -> 0 bytes shared/ossp_uuid/.libs/libuuid++.la | 41 - shared/ossp_uuid/.libs/libuuid++.lai | 41 - shared/ossp_uuid/.libs/libuuid.a | Bin 48408 -> 0 bytes shared/ossp_uuid/.libs/libuuid.la | 41 - shared/ossp_uuid/.libs/libuuid.lai | 41 - shared/ossp_uuid/AUTHORS | 15 - shared/ossp_uuid/BINDINGS | 35 - shared/ossp_uuid/ChangeLog | 624 - shared/ossp_uuid/HISTORY | 358 - shared/ossp_uuid/INSTALL | 23 - shared/ossp_uuid/MANIFEST | 83 - shared/ossp_uuid/Makefile | 357 - shared/ossp_uuid/Makefile.PL | 67 - shared/ossp_uuid/Makefile.in | 357 - shared/ossp_uuid/NEWS | 42 - shared/ossp_uuid/OVERVIEW | 81 - shared/ossp_uuid/PORTING | 33 - shared/ossp_uuid/README | 62 - shared/ossp_uuid/SEEALSO | 52 - shared/ossp_uuid/THANKS | 29 - shared/ossp_uuid/TODO | 23 - shared/ossp_uuid/USERS | 49 - shared/ossp_uuid/aclocal.m4 | 352 - shared/ossp_uuid/confdefs.h | 49 - shared/ossp_uuid/config.guess | 1526 -- shared/ossp_uuid/config.h | 217 - shared/ossp_uuid/config.h.in | 216 - shared/ossp_uuid/config.log | 1434 -- shared/ossp_uuid/config.status | 2094 -- shared/ossp_uuid/config.sub | 1658 -- shared/ossp_uuid/configure | 24246 -------------------- shared/ossp_uuid/configure.ac | 57 - shared/ossp_uuid/libtool | 8521 ------- shared/ossp_uuid/libtool.m4 | 7915 ------- shared/ossp_uuid/libuuid++.la | 41 - shared/ossp_uuid/libuuid.la | 41 - shared/ossp_uuid/ltmain.sh | 7874 ------- shared/ossp_uuid/perl/MANIFEST | 10 - shared/ossp_uuid/perl/Makefile.PL | 68 - shared/ossp_uuid/perl/uuid.pm | 334 - shared/ossp_uuid/perl/uuid.pod | 207 - shared/ossp_uuid/perl/uuid.tm | 39 - shared/ossp_uuid/perl/uuid.ts | 171 - shared/ossp_uuid/perl/uuid.xs | 236 - shared/ossp_uuid/perl/uuid_compat.pm | 176 - shared/ossp_uuid/perl/uuid_compat.pod | 55 - shared/ossp_uuid/perl/uuid_compat.ts | 55 - shared/ossp_uuid/pgsql/Makefile | 57 - shared/ossp_uuid/pgsql/uuid.c | 436 - shared/ossp_uuid/pgsql/uuid.sql.in | 244 - shared/ossp_uuid/pgsql/uuid.txt | 36 - shared/ossp_uuid/php/Makefile.local | 71 - shared/ossp_uuid/php/config.m4 | 48 - shared/ossp_uuid/php/package.xml | 35 - shared/ossp_uuid/php/uuid.c | 531 - shared/ossp_uuid/php/uuid.php4 | 78 - shared/ossp_uuid/php/uuid.php5 | 81 - shared/ossp_uuid/php/uuid.ts | 161 - shared/ossp_uuid/shtool | 4007 ---- shared/ossp_uuid/uuid | Bin 49158 -> 0 bytes shared/ossp_uuid/uuid++.3 | 307 - shared/ossp_uuid/uuid++.cc | 301 - shared/ossp_uuid/uuid++.hh | 98 - shared/ossp_uuid/uuid++.lo | 12 - shared/ossp_uuid/uuid++.o | Bin 34452 -> 0 bytes shared/ossp_uuid/uuid++.pod | 253 - shared/ossp_uuid/uuid-config | 145 - shared/ossp_uuid/uuid-config.1 | 236 - shared/ossp_uuid/uuid-config.in | 145 - shared/ossp_uuid/uuid-config.pod | 155 - shared/ossp_uuid/uuid.1 | 291 - shared/ossp_uuid/uuid.3 | 578 - shared/ossp_uuid/uuid.ac | 206 - shared/ossp_uuid/uuid.c | 1217 - shared/ossp_uuid/uuid.h | 120 - shared/ossp_uuid/uuid.h.in | 120 - shared/ossp_uuid/uuid.lo | 12 - shared/ossp_uuid/uuid.o | Bin 12344 -> 0 bytes shared/ossp_uuid/uuid.pc | 42 - shared/ossp_uuid/uuid.pc.in | 42 - shared/ossp_uuid/uuid.pod | 529 - shared/ossp_uuid/uuid_ac.h | 109 - shared/ossp_uuid/uuid_bm.h | 80 - shared/ossp_uuid/uuid_cli.c | 283 - shared/ossp_uuid/uuid_cli.o | Bin 7876 -> 0 bytes shared/ossp_uuid/uuid_cli.pod | 201 - shared/ossp_uuid/uuid_dce.c | 294 - shared/ossp_uuid/uuid_dce.h | 88 - shared/ossp_uuid/uuid_mac.c | 183 - shared/ossp_uuid/uuid_mac.h | 54 - shared/ossp_uuid/uuid_mac.lo | 12 - shared/ossp_uuid/uuid_mac.o | Bin 1232 -> 0 bytes shared/ossp_uuid/uuid_md5.c | 471 - shared/ossp_uuid/uuid_md5.h | 76 - shared/ossp_uuid/uuid_md5.lo | 12 - shared/ossp_uuid/uuid_md5.o | Bin 4408 -> 0 bytes shared/ossp_uuid/uuid_prng.c | 198 - shared/ossp_uuid/uuid_prng.h | 68 - shared/ossp_uuid/uuid_prng.lo | 12 - shared/ossp_uuid/uuid_prng.o | Bin 2188 -> 0 bytes shared/ossp_uuid/uuid_sha1.c | 450 - shared/ossp_uuid/uuid_sha1.h | 77 - shared/ossp_uuid/uuid_sha1.lo | 12 - shared/ossp_uuid/uuid_sha1.o | Bin 3120 -> 0 bytes shared/ossp_uuid/uuid_str.c | 762 - shared/ossp_uuid/uuid_str.h | 63 - shared/ossp_uuid/uuid_str.lo | 12 - shared/ossp_uuid/uuid_str.o | Bin 7264 -> 0 bytes shared/ossp_uuid/uuid_time.c | 117 - shared/ossp_uuid/uuid_time.h | 83 - shared/ossp_uuid/uuid_time.lo | 12 - shared/ossp_uuid/uuid_time.o | Bin 920 -> 0 bytes shared/ossp_uuid/uuid_ui128.c | 591 - shared/ossp_uuid/uuid_ui128.h | 114 - shared/ossp_uuid/uuid_ui128.lo | 12 - shared/ossp_uuid/uuid_ui128.o | Bin 7876 -> 0 bytes shared/ossp_uuid/uuid_ui64.c | 591 - shared/ossp_uuid/uuid_ui64.h | 113 - shared/ossp_uuid/uuid_ui64.lo | 12 - shared/ossp_uuid/uuid_ui64.o | Bin 6924 -> 0 bytes shared/ossp_uuid/uuid_vers.h | 46 - shared/parallelCall.cpp | 159 + shared/parallelCall.h | 34 + shared/recycler.cpp | 41 +- shared/recycler.h | 9 +- shared/serialize.cpp | 11 +- shared/serialize.h | 34 +- shared/shadow.cpp | 4 +- shared/systemFunctions.cpp | 4 +- shared/tinyxml/xmltest.cpp | 2 +- shared/toggleButton.h | 5 +- shared/util.cpp | 96 +- shared/util.h | 59 +- shared/xmlBase.h | 8 +- shared/zstring.cpp | 2 +- shared/zstring.h | 56 +- structures.cpp | 4 +- structures.h | 37 +- synchronization.cpp | 410 +- synchronization.h | 7 +- ui/MainDialog.cpp | 287 +- ui/MainDialog.h | 6 +- ui/SmallDialogs.cpp | 121 +- ui/SmallDialogs.h | 4 +- ui/batchConfig.cpp | 5 +- ui/batchStatusHandler.cpp | 4 +- ui/checkVersion.cpp | 13 +- ui/gridView.cpp | 121 +- ui/gridView.h | 4 +- ui/guiGenerated.cpp | 7341 +++--- ui/guiGenerated.h | 2129 +- ui/guiStatusHandler.cpp | 16 +- ui/guiStatusHandler.h | 1 + ui/progressIndicator.cpp | 46 +- ui/search.cpp | 1 + ui/sorting.h | 35 +- version/version.h | 2 +- version/version.rc | 2 + 254 files changed, 12672 insertions(+), 85955 deletions(-) create mode 100644 BUILD/Languages/hebrew.lng delete mode 100644 FreeFileSync.vcproj create mode 100644 FreeFileSync.vcxproj create mode 100644 LICENSE delete mode 100644 RealtimeSync/RealtimeSync.vcproj create mode 100644 RealtimeSync/RealtimeSync.vcxproj delete mode 100644 library/multithreading.cpp delete mode 100644 library/multithreading.h delete mode 100644 shared/IFileOperation/FileOperation_Vista.vcproj create mode 100644 shared/IFileOperation/FileOperation_Vista.vcxproj delete mode 100644 shared/ShadowCopy/Shadow_2003.vcproj create mode 100644 shared/ShadowCopy/Shadow_2003.vcxproj delete mode 100644 shared/ShadowCopy/Shadow_XP.vcproj create mode 100644 shared/ShadowCopy/Shadow_XP.vcxproj delete mode 100644 shared/Taskbar_Seven/Taskbar_Seven.vcproj create mode 100644 shared/Taskbar_Seven/Taskbar_Seven.vcxproj create mode 100644 shared/checkExist.cpp create mode 100644 shared/checkExist.h create mode 100644 shared/lock.cpp create mode 100644 shared/lock.h delete mode 100644 shared/ossp_uuid/.libs/libuuid++.a delete mode 100644 shared/ossp_uuid/.libs/libuuid++.la delete mode 100644 shared/ossp_uuid/.libs/libuuid++.lai delete mode 100644 shared/ossp_uuid/.libs/libuuid.a delete mode 100644 shared/ossp_uuid/.libs/libuuid.la delete mode 100644 shared/ossp_uuid/.libs/libuuid.lai delete mode 100644 shared/ossp_uuid/AUTHORS delete mode 100644 shared/ossp_uuid/BINDINGS delete mode 100644 shared/ossp_uuid/ChangeLog delete mode 100644 shared/ossp_uuid/HISTORY delete mode 100644 shared/ossp_uuid/INSTALL delete mode 100644 shared/ossp_uuid/MANIFEST delete mode 100644 shared/ossp_uuid/Makefile delete mode 100644 shared/ossp_uuid/Makefile.PL delete mode 100644 shared/ossp_uuid/Makefile.in delete mode 100644 shared/ossp_uuid/NEWS delete mode 100644 shared/ossp_uuid/OVERVIEW delete mode 100644 shared/ossp_uuid/PORTING delete mode 100644 shared/ossp_uuid/README delete mode 100644 shared/ossp_uuid/SEEALSO delete mode 100644 shared/ossp_uuid/THANKS delete mode 100644 shared/ossp_uuid/TODO delete mode 100644 shared/ossp_uuid/USERS delete mode 100644 shared/ossp_uuid/aclocal.m4 delete mode 100644 shared/ossp_uuid/confdefs.h delete mode 100644 shared/ossp_uuid/config.guess delete mode 100644 shared/ossp_uuid/config.h delete mode 100644 shared/ossp_uuid/config.h.in delete mode 100644 shared/ossp_uuid/config.log delete mode 100644 shared/ossp_uuid/config.status delete mode 100644 shared/ossp_uuid/config.sub delete mode 100644 shared/ossp_uuid/configure delete mode 100644 shared/ossp_uuid/configure.ac delete mode 100644 shared/ossp_uuid/libtool delete mode 100644 shared/ossp_uuid/libtool.m4 delete mode 100644 shared/ossp_uuid/libuuid++.la delete mode 100644 shared/ossp_uuid/libuuid.la delete mode 100644 shared/ossp_uuid/ltmain.sh delete mode 100644 shared/ossp_uuid/perl/MANIFEST delete mode 100644 shared/ossp_uuid/perl/Makefile.PL delete mode 100644 shared/ossp_uuid/perl/uuid.pm delete mode 100644 shared/ossp_uuid/perl/uuid.pod delete mode 100644 shared/ossp_uuid/perl/uuid.tm delete mode 100644 shared/ossp_uuid/perl/uuid.ts delete mode 100644 shared/ossp_uuid/perl/uuid.xs delete mode 100644 shared/ossp_uuid/perl/uuid_compat.pm delete mode 100644 shared/ossp_uuid/perl/uuid_compat.pod delete mode 100644 shared/ossp_uuid/perl/uuid_compat.ts delete mode 100644 shared/ossp_uuid/pgsql/Makefile delete mode 100644 shared/ossp_uuid/pgsql/uuid.c delete mode 100644 shared/ossp_uuid/pgsql/uuid.sql.in delete mode 100644 shared/ossp_uuid/pgsql/uuid.txt delete mode 100644 shared/ossp_uuid/php/Makefile.local delete mode 100644 shared/ossp_uuid/php/config.m4 delete mode 100644 shared/ossp_uuid/php/package.xml delete mode 100644 shared/ossp_uuid/php/uuid.c delete mode 100644 shared/ossp_uuid/php/uuid.php4 delete mode 100644 shared/ossp_uuid/php/uuid.php5 delete mode 100644 shared/ossp_uuid/php/uuid.ts delete mode 100644 shared/ossp_uuid/shtool delete mode 100644 shared/ossp_uuid/uuid delete mode 100644 shared/ossp_uuid/uuid++.3 delete mode 100644 shared/ossp_uuid/uuid++.cc delete mode 100644 shared/ossp_uuid/uuid++.hh delete mode 100644 shared/ossp_uuid/uuid++.lo delete mode 100644 shared/ossp_uuid/uuid++.o delete mode 100644 shared/ossp_uuid/uuid++.pod delete mode 100644 shared/ossp_uuid/uuid-config delete mode 100644 shared/ossp_uuid/uuid-config.1 delete mode 100644 shared/ossp_uuid/uuid-config.in delete mode 100644 shared/ossp_uuid/uuid-config.pod delete mode 100644 shared/ossp_uuid/uuid.1 delete mode 100644 shared/ossp_uuid/uuid.3 delete mode 100644 shared/ossp_uuid/uuid.ac delete mode 100644 shared/ossp_uuid/uuid.c delete mode 100644 shared/ossp_uuid/uuid.h delete mode 100644 shared/ossp_uuid/uuid.h.in delete mode 100644 shared/ossp_uuid/uuid.lo delete mode 100644 shared/ossp_uuid/uuid.o delete mode 100644 shared/ossp_uuid/uuid.pc delete mode 100644 shared/ossp_uuid/uuid.pc.in delete mode 100644 shared/ossp_uuid/uuid.pod delete mode 100644 shared/ossp_uuid/uuid_ac.h delete mode 100644 shared/ossp_uuid/uuid_bm.h delete mode 100644 shared/ossp_uuid/uuid_cli.c delete mode 100644 shared/ossp_uuid/uuid_cli.o delete mode 100644 shared/ossp_uuid/uuid_cli.pod delete mode 100644 shared/ossp_uuid/uuid_dce.c delete mode 100644 shared/ossp_uuid/uuid_dce.h delete mode 100644 shared/ossp_uuid/uuid_mac.c delete mode 100644 shared/ossp_uuid/uuid_mac.h delete mode 100644 shared/ossp_uuid/uuid_mac.lo delete mode 100644 shared/ossp_uuid/uuid_mac.o delete mode 100644 shared/ossp_uuid/uuid_md5.c delete mode 100644 shared/ossp_uuid/uuid_md5.h delete mode 100644 shared/ossp_uuid/uuid_md5.lo delete mode 100644 shared/ossp_uuid/uuid_md5.o delete mode 100644 shared/ossp_uuid/uuid_prng.c delete mode 100644 shared/ossp_uuid/uuid_prng.h delete mode 100644 shared/ossp_uuid/uuid_prng.lo delete mode 100644 shared/ossp_uuid/uuid_prng.o delete mode 100644 shared/ossp_uuid/uuid_sha1.c delete mode 100644 shared/ossp_uuid/uuid_sha1.h delete mode 100644 shared/ossp_uuid/uuid_sha1.lo delete mode 100644 shared/ossp_uuid/uuid_sha1.o delete mode 100644 shared/ossp_uuid/uuid_str.c delete mode 100644 shared/ossp_uuid/uuid_str.h delete mode 100644 shared/ossp_uuid/uuid_str.lo delete mode 100644 shared/ossp_uuid/uuid_str.o delete mode 100644 shared/ossp_uuid/uuid_time.c delete mode 100644 shared/ossp_uuid/uuid_time.h delete mode 100644 shared/ossp_uuid/uuid_time.lo delete mode 100644 shared/ossp_uuid/uuid_time.o delete mode 100644 shared/ossp_uuid/uuid_ui128.c delete mode 100644 shared/ossp_uuid/uuid_ui128.h delete mode 100644 shared/ossp_uuid/uuid_ui128.lo delete mode 100644 shared/ossp_uuid/uuid_ui128.o delete mode 100644 shared/ossp_uuid/uuid_ui64.c delete mode 100644 shared/ossp_uuid/uuid_ui64.h delete mode 100644 shared/ossp_uuid/uuid_ui64.lo delete mode 100644 shared/ossp_uuid/uuid_ui64.o delete mode 100644 shared/ossp_uuid/uuid_vers.h create mode 100644 shared/parallelCall.cpp create mode 100644 shared/parallelCall.h create mode 100644 version/version.rc diff --git a/Application.cpp b/Application.cpp index 4d0fd65f..d0a05124 100644 --- a/Application.cpp +++ b/Application.cpp @@ -231,8 +231,7 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet //COMPARE DIRECTORIES FreeFileSync::FolderComparison folderCmp; - FreeFileSync::CompareProcess comparison(batchCfg.mainCfg.processSymlinks, - batchCfg.mainCfg.traverseDirectorySymlinks, + FreeFileSync::CompareProcess comparison(batchCfg.mainCfg.handleSymlinks, batchCfg.mainCfg.hidden.fileTimeTolerance, globSettings.ignoreOneHourDiff, globSettings.optDialogs, @@ -246,13 +245,11 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet if (!synchronizationNeeded(folderCmp)) { statusHandler->reportInfo(_("Nothing to synchronize according to configuration!")); //inform about this special case - return; + //return; -> disabled: mode requires database to be written in any case } //START SYNCHRONIZATION FreeFileSync::SyncProcess synchronization( - batchCfg.mainCfg.copyFileSymlinks, - batchCfg.mainCfg.traverseDirectorySymlinks, globSettings.optDialogs, batchCfg.mainCfg.hidden.verifyFileCopy, globSettings.copyLockedFiles, diff --git a/Application.h b/Application.h index 8287b9be..cf69890d 100644 --- a/Application.h +++ b/Application.h @@ -24,6 +24,12 @@ private: void runGuiMode(const wxString& cfgFileName, xmlAccess::XmlGlobalSettings& settings); void runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSettings& globSettings); + virtual wxLayoutDirection GetLayoutDirection() const //disable RTL languages for now... + { + return wxLayout_LeftToRight; + } + + xmlAccess::XmlGlobalSettings globalSettings; //settings used by GUI, batch mode or both int returnValue; }; diff --git a/BUILD/Changelog.txt b/BUILD/Changelog.txt index 83e18b6f..a896ab4a 100644 --- a/BUILD/Changelog.txt +++ b/BUILD/Changelog.txt @@ -2,6 +2,22 @@ |FreeFileSync| -------------- +Changelog v3.8 +-------------- +New options handling Symlinks: ignore/direct/follow => warning: new database format for mode +Fixed crash when starting sync for Windows XP SP2 +Prevent tooltip from stealing focus +Show associated file icons (Linux) +Run folder existence checks in separate thread (faster network share access) +Write mode database file even if both sides are already in sync +Don't raise status dialog to the top after synchronisation +Embedded version information into executable (Windows) +Migrated Compiler to Visual C++ 2010 (Windows) +Avoid losing manual changes when excluding via context menu +Adjusted auto-updater web-address +Updated translation files + + Changelog v3.7 -------------- RealtimeSync: Trigger commandline only if all directories are existing diff --git a/BUILD/FreeFileSync.chm b/BUILD/FreeFileSync.chm index 5018530c..0772a6ac 100644 Binary files a/BUILD/FreeFileSync.chm and b/BUILD/FreeFileSync.chm differ diff --git a/BUILD/Help/html/advanced/CmpSettings.png b/BUILD/Help/html/advanced/CmpSettings.png index 618f4057..834647f5 100644 Binary files a/BUILD/Help/html/advanced/CmpSettings.png and b/BUILD/Help/html/advanced/CmpSettings.png differ diff --git a/BUILD/Help/html/advanced/SymbolicLinks.html b/BUILD/Help/html/advanced/SymbolicLinks.html index fc385f8f..8117ab60 100644 --- a/BUILD/Help/html/advanced/SymbolicLinks.html +++ b/BUILD/Help/html/advanced/SymbolicLinks.html @@ -3,9 +3,9 @@ - + - + @@ -17,6 +17,7 @@ H3 { margin-bottom: 0.21cm } H3.western { font-family: "Arial", sans-serif } H3.cjk { font-family: "MS Mincho" } + H3.ctl { font-family: "Mangal" } A:link { so-language: zxx } --> @@ -29,46 +30,27 @@ Linux)

FreeFileSync offers three advanced options to configure processing of Symbolic -Links (also called Symlinks or Soft Links). They can be configured -directly within a *.ffs_gui/ffs_batch file via a text editor. Only -the first option is presented on GUI:

-


-

-
    -

    -

    - <IncludeSymlinks>          false          </IncludeSymlinks>
    <TraverseDirectorySymlinks>true </TraverseDirectorySymlinks>
    <CopyFileSymlinks>         false         </CopyFileSymlinks>

    -
    -

    -
+Links (also called Symlinks or Soft Links):


    -
  • Enable - "Include Symbolic Links" in order to process - Symbolic Links at all, i.e. add them to the file and directory - listing.
     

    -
  • "Traverse - Directory Links" specifies handling of Symbolic Links to - directories:
    If this option is enabled, they are traversed like - ordinary directories during comparison. When synchronizing, the - target of the Symbolic Link will be copied. If disabled, Symbolic - Links are not traversed. During synchronization, copying them - results in a copy of the Symbolic Link.
     

    -
  • "Copy - File Links" defines the behavior for copying Symbolic Links - pointing to files:
    If checked, the Symbolic Link itself will be - copied. If unchecked, the target of the Link will be copied instead.

    +
  • "Ignore" + excludes Symbolic Links while scanning the input directories.
     

    +
  • "Direct" + configures synchronization of the Symbolic Link object itself and + not its target. Symbolic Links will be visible on main grid as a + separate entity with corresponding metadata. Links pointing to + directories are not traversed and the Link object is copied directly + during synchronization.
     

    +
  • "Follow" + dereferences Symbolic Links, i.e. they are treated like their target + objects. Links pointing to directories are traversed like ordinary + folders and the target of each Link is copied during + synchronization.


-

On GUI -only the first option is available for configuration, while "Traverse -Directory Links" is implicitly enabled and "Copy -File Links" disabled.

-


-

-

+


@@ -76,15 +58,15 @@ File Links" disabled.

Note:

  • In - the Windows build the options described above always apply to - "Reparse Points". - Reparse Points are a more general concept including for example - Symbolic Links, Junctions and Mount Points. The term "Symbolic + Windows the options described above always apply to "Reparse + Points". Reparse + Points are a more general concept including for example Symbolic + Links, Junctions and Mount Points. The term "Symbolic Link" has been retained nevertheless for harmonization with Linux.

    -
  • Creating - or copying Symbolic Links requires the application to be started - with Administrator rights.

    +
  • Copying + Symbolic Links requires the application to be started with + Administrator rights.



diff --git a/BUILD/Languages/chinese_simple.lng b/BUILD/Languages/chinese_simple.lng index f3fe6dc7..1b9d610a 100644 --- a/BUILD/Languages/chinese_simple.lng +++ b/BUILD/Languages/chinese_simple.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) 日 hour(s) @@ -22,12 +18,24 @@ 秒 %x / %y objects deleted successfully %x / %y 个对象被成功删除 +%x Byte + +%x GB + +%x MB + +%x PB + +%x TB + %x directories %x 目录 -%x files, -%x 个文件, +%x files +%x 个文件 %x is not a valid FreeFileSync batch file! %x 不是有效的 FreeFileSync 批处理文件 +%x kB + %x of %y rows in view %x of %y 横向视图 %x of 1 row in view @@ -90,6 +98,8 @@ 切换(&S) &Yes 是(&Y) +(Build: %x) + (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (请注意只有FAT/FAT32分区受此问题影响!\n在所有其他情况下你可禁用\"忽略一小时差异\"这一选项.) (Requires an Internet connection!) @@ -126,8 +136,8 @@ /秒 1 directory 1 目录 -1 file, -1 文件, +1 file +1 文件 1. &Compare 1. 比较(&C) 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ <目录> <最后会话> + + <多选> A newer version of FreeFileSync is available: @@ -196,8 +208,6 @@ Browse 浏览 Browse directory 浏览目录 -Build: -开发: Cannot determine sync-direction: 不能检测同步方向: Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service 使用卷影复制服务来复制共享或锁定的文件 Copy to clipboard\tCTRL+C 复制到剪贴板\tCTRL+C +Copying Symbolic Link %x overwriting %y + +Copying Symbolic Link %x to %y + +Copying file %x overwriting %y + Copying file %x to %y 正复制文件 %x 到 %y -Copying file %x to %y overwriting target -复制文件 %x 并覆盖到目标 %y Could not determine volume name for file: 不能确定此文件的卷名称: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently 永久性删除或覆盖文件 Delete permanently 永久性删除 +Deleting Symbolic Link %x + Deleting file %x 正删除文件 %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling 删除处理 Description 描述 +Direct + Directories are dependent! Be careful when setting up synchronization rules: 目录有依赖性!在设立同步规则时请小心: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again 不要再显示此对话框 Do nothing 保持不动 -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? 你确定要删除下列对象吗? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? 你确定要移动下列对象到回收站吗? Do you want FreeFileSync to automatically check for updates every week? 要让 FreeFileSync 保持每周检查一次更新吗?> @@ -484,6 +502,8 @@ Find what: 要查找什么: Folder Comparison and Synchronization 文件夹比较与同步 +Follow + Free disk space available: 可用磁盘空间: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con 使用数据库来识别和传送两边的改变. 自动检测删除和冲突状态. If you like FFS 如果你喜欢 FFS +Ignore + Ignore 1-hour file time difference 忽略1小时文件时间差异 Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors 忽略随后的错误 Include 包括 -Include Symbolic Links -包含符号连结 Include all rows 包括所有行 Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory 移动文件到时间标记子目录 Moving %x to Recycle Bin 移动 %x 到回收站 +Moving Symbolic Link %x to user-defined directory %y + Moving file %x to user-defined directory %y 移动文件 %x 到用户定义目录 %y Moving folder %x to user-defined directory %y @@ -682,8 +704,6 @@ Remove folder 删除文件夹 Remove folder pair 删除文件夹对 -Renaming file %x to %y -将 %x 重命名为 %y Report translation error 报告翻译错误 Reset @@ -776,6 +796,10 @@ Swap sides 两侧互换 Switching to FreeFileSync GUI modus... 切换至FreeFileSync图形用户界面模块... +Symbolic Link handling + +Symlinks %x have the same date but a different target! + Synchronization Preview 同步预览 Synchronization aborted! @@ -800,8 +824,8 @@ Target directory already existing! 目标目录已经存在! Target file already existing! 目标文件已经存在! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -有如下情况时此命令行会执行:\n- 一个文件夹变成可用时(例如:插入U盘)\n- 这些文件夹或其子文件夹中的文件被改动 +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified + The file does not contain a valid configuration: 该文件不包含有效的配置: The file was not processed by last synchronization! diff --git a/BUILD/Languages/chinese_traditional.lng b/BUILD/Languages/chinese_traditional.lng index 5c03027b..56658a93 100644 --- a/BUILD/Languages/chinese_traditional.lng +++ b/BUILD/Languages/chinese_traditional.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) 日 hour(s) @@ -22,18 +18,30 @@ 秒 %x / %y objects deleted successfully %x / %y 個物件已删除成功 +%x Byte +%x Byte +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories %x 目錄 -%x files, -%x 檔案, +%x files +%x 檔案 %x is not a valid FreeFileSync batch file! %x 不是一個有效的 FreeFileSync 批次檔! +%x kB +%x kB %x of %y rows in view 顯示 %y 之 %x 行 %x of 1 row in view 顯示 1 之 %x 行 %x% - +%x% &Abort 取消(&A) &About... @@ -87,9 +95,11 @@ &Save 儲存(&S) &Switch - +切換 &Yes 是 +(Build: %x) +(建立:%x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (請注意只有 FAT/FAT32 磁碟機會受到此問題的影響!\n在所有其他狀況下,可以關閉這個設定\"忽略1小時的誤差\"。) (Requires an Internet connection!) @@ -126,8 +136,8 @@ /秒 1 directory 1 目錄 -1 file, -1 檔案, +1 file +1 檔案 1. &Compare 1. 比對(&C) 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ <目錄> <最後連線> + +<符號連結> <多重選擇> A newer version of FreeFileSync is available: @@ -167,7 +179,7 @@ Action Add folder 新增資料夾 Add folder pair -新增兩個資料夾 +新增一對資料夾 All directories in sync! 同步所有目錄! An exception occured! @@ -195,9 +207,7 @@ Both sides have changed since last synchronization! Browse 瀏覽 Browse directory - -Build: -建立: +瀏覽目錄 Cannot determine sync-direction: 無法判斷同步方向: Cannot find %x @@ -205,7 +215,7 @@ Cannot find %x Category 分類 Clear filter settings - +清除篩選器設定 Comma separated list 逗號分隔清單 Command line @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service 使用卷影複製服務來複製共享或鎖定的檔案 Copy to clipboard\tCTRL+C 複製到剪貼簿\tCTRL+C +Copying Symbolic Link %x overwriting %y +正在複製符號連結 %x 覆蓋到 %y +Copying Symbolic Link %x to %y +正在複製符號連結 %x 到 %y +Copying file %x overwriting %y +正在複製檔案 %x 覆蓋到 %y Copying file %x to %y 正在複製檔案 %x 到 %y -Copying file %x to %y overwriting target -正在複製檔案 %x 覆蓋到目標 %y Could not determine volume name for file: 無法判斷此檔案的卷標名稱: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently 永久刪除或覆蓋檔案 Delete permanently 永久刪除 +Deleting Symbolic Link %x +正在刪除符號連結 %x Deleting file %x 正在刪除檔案 %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling 刪除處理 Description 描述 +Direct +直接 Directories are dependent! Be careful when setting up synchronization rules: 目錄有依靠性!請小心設定同步規則: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again 不要再顯示此對話框 Do nothing 維持原狀 -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? 真的要刪除以下物件嗎? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? 真的要將下列物件移動到資源回收筒嗎? Do you want FreeFileSync to automatically check for updates every week? 要每週自動檢查更新 FreeFileSync 嗎? @@ -353,11 +371,11 @@ Download now? Drag && drop 拖放 Elements found: - +尋找要素: Elements processed: - +已處理要素: Elements remaining: - +剩餘要素: Email 信箱 Endless loop when traversing directory: @@ -461,7 +479,7 @@ Files that exist on both sides, left one is newer Files that exist on both sides, right one is newer 檔案存在於兩邊,右邊檔案較新 Files that have different content - +具有不同內容的檔案 Files/folders that exist on left side only 只存在於左邊的檔案/資料夾 Files/folders that exist on right side only @@ -469,21 +487,23 @@ Files/folders that exist on right side only Filter files 篩選檔案 Filter is active - +篩選器為啟動 Filter settings have changed! 篩選器設定已更改! Filter view 篩選檢視 Filter: All pairs - +篩選器:所有對 Filter: Single pair - +篩選器:單對 Find 尋找 Find what: 尋找內容: Folder Comparison and Synchronization 資料夾比對和同步 +Follow +跟隨 Free disk space available: 可用的磁碟空間: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con 對兩邊使用同一個資料庫的識別和傳送更改。自動檢測刪除和衝突部份。 If you like FFS 如果你喜歡 FFS +Ignore +忽略 Ignore 1-hour file time difference 忽略1小時的檔案時差 Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors 忽略後續錯誤 Include 包括 -Include Symbolic Links - Include all rows 包括所有行 Include temporarily @@ -599,7 +619,7 @@ Match case Mirror ->> 鏡像 ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. -左邊資料夾的鏡像備份: 同步之後,右邊資料夾將被覆蓋,完全和左邊資料夾一模一樣。 +左邊資料夾的鏡像備份:同步之後,右邊資料夾將被覆蓋,完全和左邊資料夾一模一樣。 Monitoring active... 監測活動... More than 50% of the total number of files will be copied or deleted! @@ -611,11 +631,13 @@ Move column up Move files into a time-stamped subdirectory 移動檔案到一個時間標記的子目錄 Moving %x to Recycle Bin -移動 %x 到資源回收筒 +正在移動 %x 到資源回收筒 +Moving Symbolic Link %x to user-defined directory %y +正在移動符號連結 %x 到自定義目錄 %y Moving file %x to user-defined directory %y -移動檔案 %x 到自定義目錄 %y +正在移動檔案 %x 到自定義目錄 %y Moving folder %x to user-defined directory %y -移動資料夾 %x 到自定義資料夾 %y +正在移動資料夾 %x 到自定義目錄 %y Multiple... 多個... No change since last synchronization! @@ -641,7 +663,7 @@ Only files/directories that pass filtering will be selected for synchronization. Open with Explorer 使用檔案總管開啟 Open with default application - +使用預設的應用程式開啟 Operation aborted! 中止操作! Operation: @@ -653,13 +675,13 @@ Pause Paused 已暫停 Planned directory deletion is in conflict with its subdirectories and -files! - +計劃要刪除的目錄與其子目錄和檔案是衝突的! Please run a Compare first before synchronizing! 請執行同步前先比對! Press \"Switch\" to open FreeFileSync GUI modus. - +按下 \"切換\" 開啟 FreeFileSync 圖形介面操作方式。 Processing folder pair: -處理兩個資料夾: +處理一對資料夾: Published under the GNU General Public License: 在GNU通用公共許可證下發佈: Question @@ -673,7 +695,7 @@ RealtimeSync - Automated Synchronization RealtimeSync configuration 即時同步配置 Recycle Bin not yet supported for this system! - +資源回收筒尚未支援此系統! Relative path 相對路徑 Remove alternate settings @@ -681,9 +703,7 @@ Remove alternate settings Remove folder 移除資料夾 Remove folder pair -移除兩個資料夾 -Renaming file %x to %y -檔案重新命名 %x 為 %y +移除一對資料夾 Report translation error 回報翻譯錯誤 Reset @@ -769,13 +789,17 @@ Start synchronization Statistics 統計 Status feedback - +狀態回報 Stop 停止 Swap sides 兩邊交換 Switching to FreeFileSync GUI modus... - +切換 FreeFileSync 圖形介面操作方式... +Symbolic Link handling +符號連結處理 +Symlinks %x have the same date but a different target! +符號連結 %x 有相同日期但是不同目標! Synchronization Preview 同步預覽 Synchronization aborted! @@ -800,12 +824,12 @@ Target directory already existing! 目標目錄已存在! Target file already existing! 目標檔案已存在! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified 命令列每次執行:\n- 可用的目錄(例如插入USB隨身碟)\n- 檔案在這些目錄或子目錄會被修改 The file does not contain a valid configuration: 該檔案不包含有效的配置: The file was not processed by last synchronization! - +上次同步時該檔案未被處理! This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. 此變數計算結果為兩個檔名相同的檔案,只有當他們的檔案大小和最後修改日期時間也相同,才會判斷他們是相同的檔案。 Time @@ -847,7 +871,7 @@ Verifying file %x Volume name %x not part of filename %y! 卷名 %x 並非檔名 %y 的一部份! Waiting for all directories to become available... - +等待所有目錄變為可用... Warning 警告 Warning: Synchronization failed for %x item(s): diff --git a/BUILD/Languages/czech.lng b/BUILD/Languages/czech.lng index c88b97b3..6cc29511 100644 --- a/BUILD/Languages/czech.lng +++ b/BUILD/Languages/czech.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) d hour(s) @@ -22,12 +18,24 @@ s %x / %y objects deleted successfully %x / %y objektů úspěšně smazáno +%x Byte +%x Byte +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories adresářů: %x -%x files, -souborů: %x; +%x files +souborů: %x %x is not a valid FreeFileSync batch file! %x není platným dávkovým souborem programu FreeFileSync! +%x kB +%x kB %x of %y rows in view %x z %y řádků %x of 1 row in view @@ -90,6 +98,8 @@ U&končit &Přepnout &Yes &Ano +(Build: %x) +(Build: %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Platí pouze pro souborové systémy FAT/FAT32. V ostatních případech můžete nastavení \"Ignorovat 1 hodinu rozdílu v čase mezi soubory\" nechat vypnuté.) (Requires an Internet connection!) @@ -126,8 +136,8 @@ U&končit /s 1 directory adresář: 1 -1 file, -soubor: 1; +1 file +soubor: 1 1. &Compare 1. &Porovnat 1. Enter relative file or directory names separated by ';' or a new line. @@ -149,7 +159,9 @@ soubor: 1; - + + + A newer version of FreeFileSync is available: @@ -196,8 +208,6 @@ Browse Procházet Browse directory Procházet adresář -Build: -Build: Cannot determine sync-direction: Nelze určit směr synchronizace: Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Kopírovat sdílené nebo zamčené soubory pomocí Volume Shadow Copy Service Copy to clipboard\tCTRL+C Vložit do schránky\tCTRL+C +Copying Symbolic Link %x overwriting %y +Kopírování symbolického odkazu %x přes %y +Copying Symbolic Link %x to %y +Kopírování symbolického odkazu %x do %y +Copying file %x overwriting %y +Kopírování soubor %x přes %y Copying file %x to %y Kopírování souboru %x do %y -Copying file %x to %y overwriting target -Přepis souboru %y souborem %x Could not determine volume name for file: Není možné zjistit jméno jednotky souboru: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently Smazat nebo přepsat soubory trvale Delete permanently Odstranit trvale +Deleting Symbolic Link %x +Mazání symbolického odkazu Deleting file %x Mazání souboru %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Nastavení mazání Description Popis +Direct +Zachovat Directories are dependent! Be careful when setting up synchronization rules: Adresáře jsou závislé! Buďte opatrní s definicí synchronizačních pravidel: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again Tento dialog již nezobrazovat Do nothing Nic nedělat -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Opravdu chcete smazat následující objekty? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Opravdu chcete přesunout následující objekty do koše? Do you want FreeFileSync to automatically check for updates every week? Chcete aby FreeFileSync automaticky zjišťoval aktualizace každý týden? @@ -484,6 +502,8 @@ Find what: Najít: Folder Comparison and Synchronization Porovnání a Synchronizace adresářů +Follow +Použít cíl Free disk space available: Volné místo k dispozici: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Rozpoznat a provést změny na obou stranách pomocí databáze. Odstraněné soubory a konflikty budou detekovány automaticky. If you like FFS Pokud se Vám FSS líbí +Ignore +Přeskočit Ignore 1-hour file time difference Ignorovat 1 hodinu rozdílu v čase mezi soubory Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Ignorovat další chyby Include Přidat -Include Symbolic Links -Zahrnout symboliké odkazy Include all rows Použít všechny řádky Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory Přesunout soubory do časově označeného podadresáře Moving %x to Recycle Bin Přesouvání %x do Koše. +Moving Symbolic Link %x to user-defined directory %y +Přesouvání symbolického odkazu %xdo uživatelského adresáře %y Moving file %x to user-defined directory %y Přesouvání souboru %x do uživatelského adresáře %y Moving folder %x to user-defined directory %y @@ -682,8 +704,6 @@ Remove folder Odstranit adresář Remove folder pair Odstranit dvojici adresářů -Renaming file %x to %y -Přejmenovávání souboru %x na %y Report translation error Hlásit chyby překladu Reset @@ -776,6 +796,10 @@ Swap sides Změna stran Switching to FreeFileSync GUI modus... Otevírání okna FreeFileSync... +Symbolic Link handling +Zpracování symbolických odkazů +Symlinks %x have the same date but a different target! +Symbolický odkaz %x má stejné datum ale jiný cíl! Synchronization Preview Náhled synchronizace Synchronization aborted! @@ -800,8 +824,8 @@ Target directory already existing! Cílový adresář již existuje! Target file already existing! Cílový soubor již existuje! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Příkazová řádka je spuštěna pokaždé když:\n- je k dispozici daný adresář (např. vložením USB disku)\n- dojde ke změně souborů v adresáři nebo podadresářích +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +Příkazová řádka je spuštěna pokaždé když:\n- jsou k dispozici všechny adresáře (např. vložením USB disku)\n- dojde ke změně souborů v adresáři nebo podadresářích The file does not contain a valid configuration: Soubor neobsahuje platnou konfiguraci: The file was not processed by last synchronization! diff --git a/BUILD/Languages/dutch.lng b/BUILD/Languages/dutch.lng index c0cff493..0c771872 100644 --- a/BUILD/Languages/dutch.lng +++ b/BUILD/Languages/dutch.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) dag(en) hour(s) @@ -22,12 +18,24 @@ sec %x / %y objects deleted successfully %x / %y objecten succesvol verwijderd +%x Byte + +%x GB + +%x MB + +%x PB + +%x TB + %x directories %x paden -%x files, -%x bestanden, +%x files +%x bestanden %x is not a valid FreeFileSync batch file! %x is geen geldig FreeFileSync batch-bestand! +%x kB + %x of %y rows in view %x van de %y rijen in zicht %x of 1 row in view @@ -90,6 +98,8 @@ &Yes &Ja +(Build: %x) + (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Alleen FAT/FAT32 schijven hebben last van dit probleem!\nIn alle andere gevallen kunt u deze instelling uitschakelen \"negeer 1-uur tijdsverschil\".) (Requires an Internet connection!) @@ -126,8 +136,8 @@ /sec 1 directory 1 pad -1 file, -1 bestand, +1 file +1 bestand 1. &Compare 1. &Vergelijk 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ + + A newer version of FreeFileSync is available: @@ -196,8 +208,6 @@ Browse Map opzoeken Browse directory -Build: -Gebouwd: Cannot determine sync-direction: Kan de synchronisatie-richting niet bepalen: Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Kopieer gedeelde of alleen-lezen bestanden met Volume Shadow Copy Service Copy to clipboard\tCTRL+C Kopieer naar het klembord\tCTRL+C +Copying Symbolic Link %x overwriting %y + +Copying Symbolic Link %x to %y + +Copying file %x overwriting %y + Copying file %x to %y Bestand %x wordt gekopieerd naar %y -Copying file %x to %y overwriting target -Aan het overschrijven van bestand %x naar %y Could not determine volume name for file: Kon de schijfnaam niet vaststellen van bestand: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently Verwijder of overschrijf bestanden onomkeerbaar Delete permanently Verwijder onomkeerbaar +Deleting Symbolic Link %x + Deleting file %x Bestand %x wordt verwijderd Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Verwijder-afhandeling Description Beschrijving +Direct + Directories are dependent! Be careful when setting up synchronization rules: Mappen zijn afhankelijk van elkaar! Wees voorzichtig met het maken van synchronisatieregels: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again Deze melding niet meer weergeven Do nothing Geen actie ondernemen -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Weet u zeker dat u de volgende bestanden wilt verwijderen? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Weet u zeker dat u de/het volgende bestand(en) wilt verplaatsen naar de prullenbak? Do you want FreeFileSync to automatically check for updates every week? Wilt u FreeFileSync automatisch elke week laten controleren of er een nieuwe versie is? @@ -484,6 +502,8 @@ Find what: Folder Comparison and Synchronization Mappen vergelijken en synchroniseren +Follow + Free disk space available: Beschikbare vrije schijfruimte : FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Identificeer en verwerk verandereringen aan beide kanten dmv een database. Verschillen en conflicten worden automatisch gedecteerd. If you like FFS Als het programma u bevalt +Ignore + Ignore 1-hour file time difference Negeer 1-uur bestandstijd verschillen Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Negeer verdere foutmeldingen Include Gebruiken -Include Symbolic Links - Include all rows Alle rijen gebruiken Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory Verplaats de bestanden in een tijd-gemarkeerde sublocatie Moving %x to Recycle Bin %x aan het verplaatsen naar de Prullenbak +Moving Symbolic Link %x to user-defined directory %y + Moving file %x to user-defined directory %y Verplaatsen bestand %x naar een door de gebruiker gedefinieerde locatie %y Moving folder %x to user-defined directory %y @@ -682,8 +704,6 @@ Remove folder Verwijder map Remove folder pair Verwijder 1 paar gekoppelde mappen -Renaming file %x to %y -Hernoemen van bestand %x naar %y Report translation error Rapporteer een fout in de vertaling Reset @@ -776,6 +796,10 @@ Swap sides Wissel zijdes Switching to FreeFileSync GUI modus... +Symbolic Link handling + +Symlinks %x have the same date but a different target! + Synchronization Preview Synchronisatie voorbeeldweergave Synchronization aborted! @@ -800,7 +824,7 @@ Target directory already existing! Doellocatie bestaal al! Target file already existing! Doelbestand bestaat al! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified The file does not contain a valid configuration: Het bestand bevat geen geldige configuratie: diff --git a/BUILD/Languages/english_uk.lng b/BUILD/Languages/english_uk.lng index af174b6b..b5d0923a 100644 --- a/BUILD/Languages/english_uk.lng +++ b/BUILD/Languages/english_uk.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) day(s) hour(s) @@ -22,12 +18,24 @@ sec %x / %y objects deleted successfully %x / %y objects deleted successfully +%x Byte +%x Byte +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories %x directories -%x files, -%x files, +%x files +%x files %x is not a valid FreeFileSync batch file! %x is not a valid FreeFileSync batch file! +%x kB +%x kB %x of %y rows in view %x of %y rows in view %x of 1 row in view @@ -90,6 +98,8 @@ &Switch &Yes &Yes +(Build: %x) +(Build: %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Requires an Internet connection!) @@ -126,8 +136,8 @@ /sec 1 directory 1 directory -1 file, -1 file, +1 file +1 file 1. &Compare 1. &Compare 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ + + A newer version of FreeFileSync is available: @@ -196,8 +208,6 @@ Browse Browse Browse directory Browse directory -Build: -Build: Cannot determine sync-direction: Cannot determine sync-direction: Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Copy shared or locked files using Volume Shadow Copy Service Copy to clipboard\tCTRL+C Copy to clipboard\tCTRL+C +Copying Symbolic Link %x overwriting %y +Copying Symbolic Link %x overwriting %y +Copying Symbolic Link %x to %y +Copying Symbolic Link %x to %y +Copying file %x overwriting %y +Copying file %x overwriting %y Copying file %x to %y Copying file %x to %y -Copying file %x to %y overwriting target -Copying file %x to %y overwriting target Could not determine volume name for file: Could not determine volume name for file: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently Delete or overwrite files permanently Delete permanently Delete permanently +Deleting Symbolic Link %x +Deleting Symbolic Link %x Deleting file %x Deleting file %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Deletion handling Description Description +Direct +Direct Directories are dependent! Be careful when setting up synchronization rules: Directories are dependent! Be careful when setting up synchronisation rules: Directories to watch @@ -340,10 +358,10 @@ Do not show this dialog again Do not show this dialogue again Do nothing Do nothing -Do you really want to delete the following objects(s)? -Do you really want to delete the following objects(s)? -Do you really want to move the following objects(s) to the Recycle Bin? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to delete the following object(s)? +Do you really want to delete the following object(s)? +Do you really want to move the following object(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Do you want FreeFileSync to automatically check for updates every week? Do you want FreeFileSync to automatically check for updates every week? Donate with PayPal @@ -484,6 +502,8 @@ Find what: Find what: Folder Comparison and Synchronization Folder Comparison and Synchronisation +Follow +Follow Free disk space available: Free disk space available: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. If you like FFS If you like FFS +Ignore +Ignore Ignore 1-hour file time difference Ignore 1-hour file time difference Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Ignore subsequent errors Include Include -Include Symbolic Links -Include Symbolic Links Include all rows Include all rows Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory Move files into a time-stamped subdirectory Moving %x to Recycle Bin Moving %x to Recycle Bin +Moving Symbolic Link %x to user-defined directory %y +Moving Symbolic Link %x to user-defined directory %y Moving file %x to user-defined directory %y Moving file %x to user-defined directory %y Moving folder %x to user-defined directory %y @@ -682,8 +704,6 @@ Remove folder Remove folder Remove folder pair Remove folder pair -Renaming file %x to %y -Renaming file %x to %y Report translation error Report translation error Reset @@ -715,7 +735,7 @@ Select variant: Set direction: Set direction: Setting default synchronization directions: Old files will be overwritten with newer files. -Setting default synchronization directions: Old files will be overwritten with newer files. +Setting default synchronisation directions: Old files will be overwritten with newer files. Show conflicts Show conflicts Show files that are different @@ -776,6 +796,10 @@ Swap sides Swap sides Switching to FreeFileSync GUI modus... Switching to FreeFileSync GUI modus... +Symbolic Link handling +Symbolic Link handling +Symlinks %x have the same date but a different target! +Symlinks %x have the same date but a different target! Synchronization Preview Synchronisation Preview Synchronization aborted! @@ -800,8 +824,8 @@ Target directory already existing! Target directory already existing! Target file already existing! Target file already existing! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified The file does not contain a valid configuration: The file does not contain a valid configuration: The file was not processed by last synchronization! diff --git a/BUILD/Languages/finnish.lng b/BUILD/Languages/finnish.lng index 2c134237..6648f921 100644 --- a/BUILD/Languages/finnish.lng +++ b/BUILD/Languages/finnish.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) päivää(e) hour(s) @@ -22,12 +18,24 @@ Sek. %x / %y objects deleted successfully %x / %y Kohteiden poisto onnistui +%x Byte +%x Tavua +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories -%x hakemistoja -%x files, -%x tiedostoja, +%x hakemistoa +%x files +%x tiedostoista %x is not a valid FreeFileSync batch file! %x ei kelvollinen FreeFileSync eräajotiedosto! +%x kB +%x kB %x of %y rows in view %x riviä %y rivistä näytössä %x of 1 row in view @@ -35,7 +43,7 @@ %x% %x% &Abort -&Keskeytä +&Lopeta &About... &Ohje... &Advanced @@ -90,6 +98,8 @@ Asetusten &lataus... &Vaihda &Yes &Kyllä +(Build: %x) +(Versio: %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (HUOM: Tämä ongelma vaikuttaa vain FAT/FAT32 ohjaimiin!\nOptio voidaan poistaa kaikissa muissa tapauksissa \"jätetään 1. tunnin ero huomiotta\".) (Requires an Internet connection!) @@ -126,8 +136,8 @@ Asetusten &lataus... /s 1 directory 1 hakemisto -1 file, -1 tiedosto, +1 file +1 tiedosto 1. &Compare 1. &Vertaa 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ Asetusten &lataus... + + A newer version of FreeFileSync is available: @@ -157,9 +169,9 @@ FreeFileSync:n uusi versio on olemassa: Abort requested: Waiting for current operation to finish... Ohjelma on lopetettava: Odotetaan toiminnon lopettamista... Abort synchronization immediately -Keskeytä täsmäytys välittömästi +Lopeta täsmäytys välittömästi Aborted -Keskeytetty +Lopetettu About Ohje Action @@ -196,8 +208,6 @@ Browse Selaa Browse directory Selaa hakemistoa -Build: -Luotu: Cannot determine sync-direction: Täsmäytys suuntä tuntematon: Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Kopioi jaetut ja lukitut tiedostot käyttäen Volume Shadow Copy Service Copy to clipboard\tCTRL+C Kopioi Leikepöydälle\tCTRL+C +Copying Symbolic Link %x overwriting %y +Kopioin Symlinkki %x ylikirjoittamalla %y +Copying Symbolic Link %x to %y +Kopioin Symlinkki %x -> %y +Copying file %x overwriting %y +Kopioin tiedostoa %x ylikirjoittaen %y Copying file %x to %y -Kopioidaan tiedostoa %x -> %y -Copying file %x to %y overwriting target -Kopioidaan tiedostoa %x -> %y ylikirjoittaen +Kopioin tiedostoa %x -> %y Could not determine volume name for file: Levyasemaa ei tunnistettu tiedostolle: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently Poista tai ylikirjoita tiedostoja pysyvästi Delete permanently Poista pysyvästi +Deleting Symbolic Link %x +Poista Symlinkki %x Deleting file %x Poista tiedosto %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Poistotapa Description Seloste +Direct +Suoraan Directories are dependent! Be careful when setting up synchronization rules: Hakemistot riippuvuussuhteessa! Aseta täsmäytyssääntöjä varovasti: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again Älä näytä tätä jatkossa Do nothing Älä tee mitään -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Haluatko varmasti poista valittuja kohteita? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Haluatko varmasti siirtää valittuja kohteita Roskakoriin? Do you want FreeFileSync to automatically check for updates every week? Haluatko että FreeFileSync hakee päivityksiä automaattisesti viikoittain? @@ -484,6 +502,8 @@ Find what: Etsi: Folder Comparison and Synchronization Hakemistojen vertailu ja täsmäytys +Follow +Seuraa Free disk space available: Levytilaa jäljellä: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Tunnista ja monista muutokset molemmilla puolilla tietokannalla. Poistot ja ristiriidat hoidetaan automaattisesti. If you like FFS Jos pidät FFS:tä +Ignore +Sivuta Ignore 1-hour file time difference Älä huomioi 1. tunnin poikkeamaa Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Jätä toistuvia virheitä huomiotta Include Sisällytä -Include Symbolic Links -Sisällytä symbolisia linkkejä Include all rows Sisällytä kaikki rivit Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory Siirrä tiedostot aikaleimattuun hakemistoon Moving %x to Recycle Bin Siirrä %x Roskakoriin +Moving Symbolic Link %x to user-defined directory %y +Siirrä Symlinkki %x valittuun hakemistoon %y Moving file %x to user-defined directory %y Siirretään tiedostoa %x valittuun hakemistoon %y Moving folder %x to user-defined directory %y @@ -643,7 +665,7 @@ Avaa Explorerilla Open with default application Avaa oletus sovelluksessa Operation aborted! -Toiminto keskeytetty! +Toiminto lopetettiin! Operation: Toiminto: Overview @@ -682,8 +704,6 @@ Remove folder Poista hakemisto Remove folder pair Poista hakemistopari -Renaming file %x to %y -Nimeän tiedostoa %x nimellä %y Report translation error Ilmoita käännösvirheestä Reset @@ -776,10 +796,14 @@ Swap sides Puolten vaihto Switching to FreeFileSync GUI modus... Siirtyminen FreeFileSync GUI toimintoon... +Symbolic Link handling +Symlinkkien hallinta +Symlinks %x have the same date but a different target! +Symlinkki %x samalta päivältä mutta kohde on toinen! Synchronization Preview Täsmäytyksen esikatselu Synchronization aborted! -Täsmäytys keskeytetty! +Täsmäytys lopetettiin! Synchronization completed successfully! Täsmäytys suoritettu onnistuneesti! Synchronization completed with errors! @@ -800,8 +824,8 @@ Target directory already existing! Haluttu tiedosto on jo olemassa! Target file already existing! Kohde tiedosto on jo olemassa! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Komentokehote suoritetaan joka kerta kun:\n- hakemisto on saatavilla (esim. USB tikku asennetaan)\n- tiedostot näissä hakemistoisa ja alihakemistoissa muutetaan +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +Komento suoritetaan kun:\n- nämä hakemistot ovat saatavilla (esim. USB tikku asennetaan)\n- tiedostot näissä hakemistoissa tai alihakemistoissa muutetaan The file does not contain a valid configuration: Asetustiedosto ei ole kelvollinen: The file was not processed by last synchronization! diff --git a/BUILD/Languages/french.lng b/BUILD/Languages/french.lng index d5a1e24b..b390f956 100644 --- a/BUILD/Languages/french.lng +++ b/BUILD/Languages/french.lng @@ -6,28 +6,36 @@ Go MB Mo - PB - Po - TB - To day(s) jour(s) hour(s) heure(s) kB - ko + Ko min min sec sec %x / %y objects deleted successfully -%x / %y objets détruits avec succès +%x / %y objets supprimés avec succès +%x Byte +%x Octets +%x GB +%x Go +%x MB +%x Mo +%x PB +%x Po +%x TB +%x To %x directories -%x dossiers -%x files, -%x fichiers, +%x répertoires +%x files +%x fichiers %x is not a valid FreeFileSync batch file! %x n'est pas un fichier batch FreeFileSync valide ! +%x kB +%x Ko %x of %y rows in view %x sur %y lignes affichées %x of 1 row in view @@ -90,10 +98,12 @@ &Changer &Yes &Oui +(Build: %x) +(Généré : %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Notez que seuls les lecteurs FAT/FAT32 sont concernés par ce problème !\nDans tous les autres cas, vous pouvez désactiver le paramètre \"ignorer la différence d'une heure\".) (Requires an Internet connection!) -(Nécessite une connexion internet) +(Nécessite une connexion Internet) - Other side's counterpart to %dir - équivalent de %dir de l'autre côté - Other side's counterpart to %name @@ -113,7 +123,7 @@ - exists right only - le fichier existe seulement à droite - full file or directory name -- nom complet du fichier ou du dossier +- nom complet du fichier ou du répertoire - left - à gauche - left newer @@ -125,9 +135,9 @@ /sec /sec 1 directory -1 dossier -1 file, -1 fichier, +1 répertoire +1 file +1 fichier 1. &Compare 1. &Comparer 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ + + A newer version of FreeFileSync is available: @@ -195,9 +207,7 @@ Les deux côtés ont changé depuis la dernière synchronisation ! Browse Parcourir Browse directory -Prcourir le dossier -Build: -Créé le : +Prcourir le répertoire Cannot determine sync-direction: Impossible de déterminer le sens de la synchro : Cannot find %x @@ -267,15 +277,19 @@ Copie de droite à gauche avec remplacement Copy locked files Copier les fichiers verrouillés Copy new or updated files to right folder. -Copie de fichiers nouveaux ou modifiés dans le dossier de droite. +Copie les fichiers nouveaux ou modifiés dans le dossier de droite. Copy shared or locked files using Volume Shadow Copy Service Copier les fichiers partagés ou verrouilés en utilisant le service Volume Shadow Copy Copy to clipboard\tCTRL+C Copier dans le presse-papiers\tCTRL+C +Copying Symbolic Link %x overwriting %y +Copie du Lien Symbolique %x remplaçant %y +Copying Symbolic Link %x to %y +Copie du Lien Symbolique %x vers %y +Copying file %x overwriting %y +Copie du fichier %x remplaçant %y Copying file %x to %y Copie le fichier %x vers %y -Copying file %x to %y overwriting target -Copie le fichier %x vers %y avec écrasement Could not determine volume name for file: Impossible de trouver le nom de volume pour le fichier : Could not initialize directory monitoring: @@ -307,9 +321,9 @@ Délai Delay between detection of changes and execution of command line in seconds Intervalle entre la détection des changements et l'exécution de la ligne de commande en secondes Delete files/folders existing on left side only -Suppression des fichiers/répertoires n'existant que sur le côté gauche +Suppression des fichiers/dossiers n'existant que sur le côté gauche Delete files/folders existing on right side only -Suppression des fichiers/répertoires n'existant que sur le côté droit +Suppression des fichiers/dossiers n'existant que sur le côté droit Delete files\tDEL Suppression des fichiers\tDEL Delete on both sides @@ -320,6 +334,8 @@ Delete or overwrite files permanently Supprimer ou écraser les fichiers définitivement Delete permanently Suppression définitive +Deleting Symbolic Link %x +Suppression du Lien Symbolique %x Deleting file %x Suppression du fichier %x Deleting folder %x @@ -328,24 +344,26 @@ Deletion handling Gestion des suppressions Description Description +Direct +Direct Directories are dependent! Be careful when setting up synchronization rules: -Les dossiers sont imbriqués ! Attention à la mise à jour des règles de synchronisation : +Les répertoires sont imbriqués ! Attention à la mise à jour des règles de synchronisation : Directories to watch -Dossiers à surveiller +Réperoires à surveiller Directory Répertoire Directory does not exist: Le répertoire n'existe pas : Do not show this dialog again -Ne plus afficher ce message les prochaines fois +Ne plus afficher ce message la prochaine fois Do nothing Ne rien faire -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Voulez-vous vraiment supprimer les objets suivants ? -Do you really want to move the following objects(s) to the Recycle Bin? -Voulez-vous vraiment déplacer les objets suivants dans la corbeille ? +Do you really want to move the following object(s) to the Recycle Bin? +Voulez-vous vraiment déplacer les objets suivants dans la Corbeille ? Do you want FreeFileSync to automatically check for updates every week? -Voulez-vous que FreeFileSync recherche automatiquement de nouvelles versions chaque semaine ? +Voulez-vous que FreeFileSync recherche automatiquement une nouvelle version chaque semaine ? Donate with PayPal Faites un don avec PayPal Download now? @@ -383,11 +401,11 @@ Erreur de gestion de fichiers Error loading library function: Erreur lors du chargement de la bibliothèque de fonctions : Error moving directory: -Erreur lors du déplacement du dossier : +Erreur lors du déplacement du répertoire : Error moving file: Erreur lors du déplacement du fichier : Error moving to Recycle Bin: -Erreur lors du déplacement dans la corbeille : +Erreur lors du déplacement dans la Corbeille : Error opening file: Erreur lors de l'ouverture du fichier : Error parsing configuration file: @@ -405,7 +423,7 @@ Erreur lors du démarrage du service 'Volume Shadow Copy' ! Error traversing directory: Erreur lors du parcours du répertoire : Error when monitoring directories. -Erreur lors de la surveillance des dossiers. +Erreur lors de la surveillance des répertoires. Error writing file attributes: Erreur lors de l'écriture des attributs du fichier : Error writing file: @@ -483,7 +501,9 @@ Chercher Find what: Chercher cela : Folder Comparison and Synchronization -Comparaison de Dossiers et Synchronisation +Comparaison de dossiers et Synchronisation +Follow +Suivre Free disk space available: Espace disque disponible : FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Identifier et propager les modifications des deux côtés en utilisant une base de données. Les suppressions et les conflits sont détectés automatiquement. If you like FFS Si vous aimez FFS +Ignore +Ignorer Ignore 1-hour file time difference Ignorer les diférences d'une heure Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Ignorer les erreurs ultérieures Include Inclure -Include Symbolic Links -Inclure les liens symboliques Include all rows Inclure toutes les lignes Include temporarily @@ -599,7 +619,7 @@ Respecter la casse Mirror ->> Miroir ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. -Sauvegarde miroir du répertoire de gauche : Le répertoire de droite sera écrasé et exactement identique au répertoire de gauche après la synchronisation. +Sauvegarde miroir du répertoire de gauche : Le répertoire de droite sera écrasé et totalement identique au répertoire de gauche après la synchronisation. Monitoring active... Surveillance en cours... More than 50% of the total number of files will be copied or deleted! @@ -612,10 +632,12 @@ Move files into a time-stamped subdirectory Déplacer les fichiers vers un sous-répertoire daté Moving %x to Recycle Bin Déplacement de %x vers la Corbeille +Moving Symbolic Link %x to user-defined directory %y +Déplacement du Lien Symbolique %x vers le répertoire utilisateur %y Moving file %x to user-defined directory %y -Déplacement du fichier %x vers le répertoire défini par l'utilisateur %y +Déplacement du fichier %x vers le répertoire utilisateur %y Moving folder %x to user-defined directory %y -Déplacement du dossier %x vers le répertoire défini par l'utilisateur %y +Déplacement du dossier %x vers le répertoire utilisateur %y Multiple... Multiple... No change since last synchronization! @@ -635,9 +657,9 @@ Nombre de fichiers qui seront remplacés One of the FreeFileSync database entries within the following file is not yet existing: L'une des entrées de la base de données FreeFileSync n'existe plus dans le fichier : One of the FreeFileSync database files is not yet existing: -L'une des entrées de la base de données FreeFileSync n'existe plus : +L'un des fichiers de la base de données FreeFileSync n'existe plus : Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Seuls les fichiers/répertoires filtrés seront sélectionnés pour la synchronisation. Le filtre sera appliqué au nom relatif (!) pour les répertoires de synchroniqation de base. +Seuls les fichiers/répertoires filtrés seront sélectionnés pour la synchronisation. Le filtre sera appliqué au nom relatif (!) pour les répertoires de synchronisation de base. Open with Explorer Ouvrir avec Explorer Open with default application @@ -653,7 +675,7 @@ Pause Paused En pause Planned directory deletion is in conflict with its subdirectories and -files! -Le répertoire de suppression choisi est en conflit avec ses sous répertoires et -fichiers ! +Le répertoire de suppression choisi est en conflit avec ses sous-répertoires et -fichiers ! Please run a Compare first before synchronizing! Veuillez lancer une Comparaison avant de lancer la synchronisation ! Press \"Switch\" to open FreeFileSync GUI modus. @@ -673,7 +695,7 @@ RealtimeSync - Synchronisation Automatisée RealtimeSync configuration Configuration RealtimeSync Recycle Bin not yet supported for this system! -La corbeille n'est pas supportée par ce système ! +La Corbeille n'est pas supportée par ce système ! Relative path Chemin relatif Remove alternate settings @@ -682,8 +704,6 @@ Remove folder Supprimer le dossier Remove folder pair Supprimer le couple de dossiers -Renaming file %x to %y -Renommage des fichiers %x en %y Report translation error Etat des erreurs de transfert Reset @@ -705,7 +725,7 @@ Lecture en cours... Scanning: Lecture en cours : Select a folder -Choisissez un répertoire +Choisissez un dossier Select alternate synchronization settings Sélectionner une autre configuration de la synchronisation Select logfile directory: @@ -757,7 +777,7 @@ Mode silencieux Size Taille Source code written completely in C++ utilizing: -Code source écrit entièrement en C++ et utilisant : +Code source écrit entièrement en C++ utilisant : Source directory does not exist anymore: Le répertoire source n'existe plus : Speed: @@ -776,6 +796,10 @@ Swap sides Permuter les côtés Switching to FreeFileSync GUI modus... Changement en mode FreeFileSync GUI... +Symbolic Link handling +Gestion des Liens Symboliques +Symlinks %x have the same date but a different target! +Le Lien Symbolique %x a la même date mais une destination différente ! Synchronization Preview Prévisualisation de la Synchronisation Synchronization aborted! @@ -800,14 +824,14 @@ Target directory already existing! Le répertoire de destination existe déjà ! Target file already existing! Le fichier de destination existe déjà ! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -La ligne de commande est exécutée chaque fois : \n- qu'un répertoire est disponible (insertion d'une clé USB)\n- que les fichiers de ces répertoires ou sous-répertoires sont mofifiés +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +La ligne de commande est exécutée chaque fois que :\n- tous les répertoires deviennent accessibles (par exemple, lors de l'insertion d'une clé USB)\n- les fichiers de ces répertoires ou sous-répertoires sont modifiés The file does not contain a valid configuration: Le fichier ne contient pas de configuration valide : The file was not processed by last synchronization! -Le ficgier n'a pas été traité par la dernière synchronisation ! +Le fichier n'a pas été traité par la dernière synchronisation ! This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Cette variante définit comme identiques deux fichiers de même nom lorsqu'ils ont la même taille ET le même date et heure de modification. +Cette variante définit comme identiques deux fichiers de même nom lorsqu'ils ont la même taille ET les mêmes date et heure de modification. Time Heure Time elapsed: @@ -833,7 +857,7 @@ Mise à Jour -> Usage: Utilisation : Use Recycle Bin -Utilisation de la corbeille +Utiliser la Corbeille Use Recycle Bin when deleting or overwriting files Utiliser la Corbeille lors de la suppression ou du remplacement d'un fichier User-defined directory @@ -847,7 +871,7 @@ Contrôle du fichier %x Volume name %x not part of filename %y! Le nom de volume %x ne fait pas partie du nom de fichier %y ! Waiting for all directories to become available... -En attente de la disponibilité de tous les dossiers... +En attente de la disponibilité de tous les répertoires... Warning Attention Warning: Synchronization failed for %x item(s): @@ -865,4 +889,4 @@ fichiers différents file exists on both sides le fichier existe des deux côtés on one side only -le fichier existe sur un seul côté seulement +le fichier existe d'un seul côté seulement diff --git a/BUILD/Languages/german.lng b/BUILD/Languages/german.lng index ac781ed4..9adac7a6 100644 --- a/BUILD/Languages/german.lng +++ b/BUILD/Languages/german.lng @@ -1,33 +1,33 @@ MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE - Byte - Byte - GB - GB - MB - MB - PB - PB - TB - TB day(s) Tag(e) hour(s) Stunde(n) - kB - kB min Min. sec Sek. %x / %y objects deleted successfully %x von %y Objekten erfolgreich gelöscht +%x Byte +%x Byte +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories %x Verzeichnisse -%x files, -%x Dateien, +%x files +%x Dateien %x is not a valid FreeFileSync batch file! %x ist keine gültige FreeFileSync-Batchdatei! +%x kB +%x kB %x of %y rows in view %x von %y Zeilen zur Ansicht %x of 1 row in view @@ -90,6 +90,8 @@ Konfiguration &laden... &Wechseln &Yes &Ja +(Build: %x) +(Build: %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Achtung: Nur FAT/FAT32 Laufwerke sind von diesem Problem betroffen!\nIn allen anderen Fällen kann die Einstellung \"Zeitunterschied von einer Stunde ignorieren\" deaktiviert werden.) (Requires an Internet connection!) @@ -126,8 +128,8 @@ Konfiguration &laden... /s 1 directory 1 Verzeichnis -1 file, -1 Datei, +1 file +1 Datei 1. &Compare 1. &Vergleichen 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +152,8 @@ Konfiguration &laden... + + A newer version of FreeFileSync is available: @@ -196,8 +200,6 @@ Browse Auswählen Browse directory Verzeichnis öffnen -Build: -Build: Cannot determine sync-direction: Die Synchronisationsrichtung konnte nicht bestimmt werden: Cannot find %x @@ -205,7 +207,7 @@ Cannot find %x Category Kategorie Clear filter settings -Filtereinstellungen zurücksetzen +Filtereinstellungen löschen Comma separated list Kommagetrennte Liste Command line @@ -272,10 +274,14 @@ Copy shared or locked files using Volume Shadow Copy Service Gesperrte oder gemeinsam verwendete Dateien mit Hilfe des Volume Shadow Copy Service kopieren Copy to clipboard\tCTRL+C In die Zwischenablage kopieren\tCTRL+C +Copying Symbolic Link %x overwriting %y +Kopiere Symbolischen Link %x und überschreibe %y +Copying Symbolic Link %x to %y +Kopiere Symbolischen Link %x nach %y +Copying file %x overwriting %y +Kopiere Datei %x und überschreibe %y Copying file %x to %y Kopiere Datei %x nach %y -Copying file %x to %y overwriting target -Kopiere Datei %x nach %y und überschreibe Ziel Could not determine volume name for file: Der Laufwerksname für folgende Datei konnte nicht ermittelt werden: Could not initialize directory monitoring: @@ -320,6 +326,8 @@ Delete or overwrite files permanently Dateien endgültig löschen oder überschreiben Delete permanently Endgültig löschen +Deleting Symbolic Link %x +Lösche Symbolischen Link %x Deleting file %x Lösche Datei %x Deleting folder %x @@ -328,6 +336,8 @@ Deletion handling Behandlung von Löschungen Description Beschreibung +Direct +Direkt Directories are dependent! Be careful when setting up synchronization rules: Die Verzeichnisse sind voneinander abhängig! Achtung beim Festlegen der Synchronisationseinstellungen: Directories to watch @@ -340,9 +350,9 @@ Do not show this dialog again Diesen Dialog nicht mehr anzeigen Do nothing Nichts tun -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Sollen folgende Elemente wirklich gelöscht werden? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Sollen folgende Elemente wirklich in den Papierkorb verschoben werden? Do you want FreeFileSync to automatically check for updates every week? Soll FreeFileSync automatisch jede Woche nach Aktualisierungen suchen? @@ -484,6 +494,8 @@ Find what: Suchen nach: Folder Comparison and Synchronization Verzeichnisvergleich und Synchronisation +Follow +Folgen Free disk space available: Verfügbarer freier Speicherplatz: FreeFileSync Batch Job @@ -552,6 +564,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Identifiziere und propagiere Änderungen auf beiden Seiten mit Hilfe einer Datenbank. Löschungen und Konflikte werden automatisch erkannt. If you like FFS FFS unterstützen +Ignore +Ignorieren Ignore 1-hour file time difference Zeitunterschied von einer Stunde ignorieren Ignore errors @@ -560,8 +574,6 @@ Ignore subsequent errors Nachfolgende Fehler ignorieren Include Einschließen -Include Symbolic Links -Symbolische Links aufnehmen Include all rows Alle Zeilen einschließen Include temporarily @@ -612,6 +624,8 @@ Move files into a time-stamped subdirectory Verschiebe Dateien in ein Unterverzeichnis mit Zeitstempel Moving %x to Recycle Bin Verschiebe %x in den Papierkorb +Moving Symbolic Link %x to user-defined directory %y +Verschiebe Symbolischen Link %x in benutzerdefiniertes Verzeichnis %y Moving file %x to user-defined directory %y Verschiebe Datei %x in benutzerdefiniertes Verzeichnis %y Moving folder %x to user-defined directory %y @@ -682,8 +696,6 @@ Remove folder Verzeichnis entfernen Remove folder pair Verzeichnispaar entfernen -Renaming file %x to %y -Benenne Datei %x um nach %y Report translation error Übersetzungsfehler melden Reset @@ -776,6 +788,10 @@ Swap sides Seiten vertauschen Switching to FreeFileSync GUI modus... Wechsle in die graphische Ansicht... +Symbolic Link handling +Verwendung Symbolischer Links +Symlinks %x have the same date but a different target! +Die Symbolischen Links %x haben dasselbe Datum, aber ein unterschiedliches Ziel! Synchronization Preview Vorschau auf Synchronisation Synchronization aborted! @@ -800,8 +816,8 @@ Target directory already existing! Zielverzeichnis existiert bereits! Target file already existing! Die Zieldatei existiert bereits! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Die Befehlszeile wird ausgeführt wenn:\n- ein Verzeichnis verfügbar wird (z.B. beim Anschluss eines USB Sticks)\n- Dateien innerhalb dieser Verzeichnisse oder Unterverzeichnisse geändert werden +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +Die Befehlszeile wird ausgeführt wenn:\n- alle Verzeichnisse verfügbar werden (z.B. beim Anschluss eines USB Sticks)\n- Dateien innerhalb dieser Verzeichnisse oder Unterverzeichnisse geändert werden The file does not contain a valid configuration: Die Datei enthält keine gültige Konfiguration: The file was not processed by last synchronization! diff --git a/BUILD/Languages/hebrew.lng b/BUILD/Languages/hebrew.lng new file mode 100644 index 00000000..5ca0b934 --- /dev/null +++ b/BUILD/Languages/hebrew.lng @@ -0,0 +1,892 @@ + MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE + MinGW \t- מהדר גנו של חלונות\n wxWidgets \t- ממשק גרפי של תוכנת קוד פתוח\n wxFormBuilder\t- wxWidgets מנוע ממשג גרפי\n CodeBlocks \t- IDE תוכנת קוד פתוח + Byte + ביית + GB + גב + MB + מב + day(s) + יום + hour(s) + שעות + kB + קב + min + דקה + sec + שניה +%x / %y objects deleted successfully +אוביקטים נמחקו בהצלחה %y מ %x +%x Byte +%x בייט +%x GB +%x גיגה ביט +%x MB +%x מגה ביט +%x PB +%x פיקו ביט +%x TB +%x טרה ביט +%x directories +מחיצות %x +%x files +%x קבצים +%x is not a valid FreeFileSync batch file! +!קובץ אצווה לא מתאים %x +%x kB +%x קב +%x of %y rows in view +שורות בתצוגה %y מ %x +%x of 1 row in view +שורות בתצוגה %x מ 1 +%x% +%x% +&Abort +&נטוש +&About... +&אודות... +&Advanced +&מתקדם +&Cancel +&בטל +&Check for new version +&בדוק לגירסא חדשה +&Content +&תוכן +&Create batch job... +&צור קובץ אצווה... +&Default +&ברירת מחדל +&Exit +&יציאה +&Export file list... +יצא רשימת קבצים... +&File +&קובץ +&Find next +&מצא הבא +&Global settings... +&משתנים גלובליים... +&Help +&עזרה +&Ignore +&התעלם +&Language +&שפה +&Load +&טען +&Load configuration... +טען תצורה... +&New +&חדש +&No +&לא +&OK +&אשר +&Pause +&עצור +&Quit +&יציאה +&Restore +&טען מחדש +&Retry +&נסה שנית +&Save +&שמירה +&Switch +&החלפה +&Yes +&כן +(Build: %x) + +(Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) +(שים לב: רק כוננים קשיחים מסוג פאט-פאט32 מושפעום מבעיה זאת \מ ) +(Requires an Internet connection!) +(מחייב קישור אינטרנטי פעיל!) +- Other side's counterpart to %dir +- %dir הצד השני מקביל ל +- Other side's counterpart to %name +- %name הצד השני מקביל ל +- conflict +- קונפליקט +- conflict (same date, different size) +- תאריך זהה - גודל שונה) קונפליקט) +- different +- שונה +- directory part only +- חלק התיקיה בלבד +- equal +- שווה +- exists left only +- נמצא משמאל בלבד +- exists right only +- נמצא מימין בלבד +- full file or directory name +- שם מלא של קובץ או תיקיה +- left +- שמאל +- left newer +- שמאלי חדש יותר +- right +- ימין +- right newer +- ימני חדש יותר +/sec +/שנ +1 directory +1 תיקיה +1 file +1 קובץ +1. &Compare +1. &השווה +1. Enter relative file or directory names separated by ';' or a new line. +1. הכנס שם קובץ או שם תיקיה מופרדים ע"י ';' או דורה חדשה +1. Select directories to monitor. +1. בחר מחיצות לניתור. +2. &Synchronize... +2. &סנכרן... +2. Enter a command line. +2. הקש שורת פקודות. +2. Use wildcard characters '*' and '?'. +2. השתמש באשפים '*' או '?'לבחירה מרובה. +3. Exclude files directly on main grid via context menu. +3. הוצא קבצים היישר באסכלה עיקרית דרך תפריט הקשר. +3. Press 'Start'. +3. לחץ'הפעל'. + +<אוטומטי> + +<מחיצה> + +<נשמר אחרון> + + + +<בחירה מרובה> +A newer version of FreeFileSync is available: +יותר קיימת גרסא חדשה: +Abort requested: Waiting for current operation to finish... +התקבלה בקשת ביטול מחכה לפעולה הנוכחית להסתיים +Abort synchronization immediately +הפסק סנכרון מידית +Aborted +הופסק +About +אודות +Action +פעולה +Add folder +הוסף מחיצה +Add folder pair +הוסף מחיצה זוגית +All directories in sync! +כל המחיצות מסונכרנות! +An exception occured! +אירוע חריג! +As a result the files are separated into the following categories: +:כתוצאה הקבצים הופרדו לקטגוריות הבאות +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: + כפי שהשם מוצע, שני קבצים החולקים שם זההומסומנים כשווים במידה ואך ורק הם בעל י תוכן זהה אופציה זאת שימושית לבדיקת עקביות מאשר גיבוי לכן זמני הקובץ לא נלקחים בחשבון כלל .\n\n +Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe . This can also be scheduled in your operating system's task planner. +אפשר גם להשתמש במנהל המשימות המתוזמנות של המערכת להפעלה באצווה העבר את שם הקובץ לתוכנה הגדר קובץ אצווה לסנכרון אוטומטי +At least one directory input field is empty. +לפחות מחיצה אחת בשדה הכניסה ריקה. +Auto-adjust columns +עימוד אוטומטי +Batch execution +פעולת אצווה +Batch file created successfully! +!קובץ אצווה נוצר בהצלחה +Batch job +עבודת אצווה +Big thanks for localizing FreeFileSync goes out to: +:תודות עבור עבודות התרגום של תוכנת הסנכרון +Both sides have changed since last synchronization! +!שני הצדדים שונו מאז הסנכרון האחרון +Browse +עיין +Browse directory +עיין במחיצה +Cannot determine sync-direction: +לא מזהה כוון סנכרון: +Cannot find %x +.%x לא מוצא +Category +קטגוריה +Clear filter settings +נקה בחירת מסנן +Comma separated list +רשימה מופרדת פסיקים +Command line +שורת פקודות +Command line is empty! +שורת פקודות ריקה +Compare +השוואה +Compare both sides +השוה בין שני הצדדים +Compare by \"File content\" +\"File content\" השווה ע"י תכולת הקובץ +Compare by \"File size and date\" +\"File size and date\" השווה ע"י גודל הקובץ ותאריך +Compare by... +השווה ע"י... +Comparing content of files %x +%x השווה תכולה של קובץ +Comparing content... +משווה תכולה... +Comparing files by content failed. +השואה ע"י תכולה הקבצים נכשלה. +Comparison Result +תוצאות ההשוואה +Comparison settings +משתני ההשוואה +Completed +הושלם +Configuration +תצורה +Configuration loaded! +תצורה הוטענה! +Configuration overview: +:סקירת תצורה +Configuration saved! +תצורה נשמרה! +Configure filter +תצורת מסנן +Configure your own synchronization rules. +סדר את כללי הסנכרון שלך. +Confirm +אשר +Conflict detected: +התגלה קונפליקט: +Conflicts/files that cannot be categorized +קונפליקטים-קבצים אשר אינם יכולים לסווג +Continue +המשך +Conversion error: +טעות בהסבה: +Copy from left to right +העתק משמאל לימין +Copy from left to right overwriting +העתק ודרוס משמאל לימין +Copy from right to left +העתק מימין לשמאל +Copy from right to left overwriting +העתק ודרוס מימין לשמאל +Copy locked files +העתק קבצים נעולים +Copy new or updated files to right folder. +העתק קבצים חדשים או מעודכנים למחיצה הימנית. +Copy shared or locked files using Volume Shadow Copy Service +העתק קבצים משותבים או נעולים בעזרת שרות העתקה מוצל +Copy to clipboard\tCTRL+C +העתק למכתבה \tCTRL+C +Copying Symbolic Link %x overwriting %y + +Copying Symbolic Link %x to %y + +Copying file %x overwriting %y + +Copying file %x to %y +העתק קובץ %x nach %y +Could not determine volume name for file: +לא יכול לקבוע שם כונן לקובץ: +Could not initialize directory monitoring: +לא יכול לאתחל מחיצה נדרשת: +Could not load a required DLL: +:נדרש DLL לא יכל לטעון +Could not read values for the following XML nodes: +XML לא יכול לקרא ערכים מ : +Create a batch job +יוצר עבודת אצווה +Creating folder %x +יוצר מחיצה %x +Custom +מותאם +Customize columns +סדר עמודות +Customize... +מותאם אישית... +D-Click +לחיצה-כפולה +DECISION TREE +עץ-החלטה +Data verification error: Source and target file have different content! +!טעות של אימות נתונים קובץ מקור ומטרה בעלי תכולת נתונים שונה +Date +תארין +Delay +השהייה +Delay between detection of changes and execution of command line in seconds +השהייה בין גילוי של שינוי לבין הפעלה של שורת פקודות בשניות +Delete files/folders existing on left side only +מחק קבצים -תיקיות הקימים אך ורק בצד שמאל +Delete files/folders existing on right side only +מחק קבצים -תיקיות הקימים אך ורק בצד ימין +Delete files\tDEL +מחק קבצים\tDEL +Delete on both sides +מחק בשני הצדדים +Delete on both sides even if the file is selected on one side only +מחק בשני הצדדים אף אם הקובץ נבחר בצד אחד בלבד +Delete or overwrite files permanently +מחק או דרוס קבצים לצמיתות +Delete permanently +מחק לצמיתות +Deleting Symbolic Link %x + +Deleting file %x +מחק קובץ %x +Deleting folder %x +מחק מחיצה %x +Deletion handling +מוחק +Description +תאור +Direct + +Directories are dependent! Be careful when setting up synchronization rules: +מחיצות תלויות זהירות בהגדרת כללי סנכרון: +Directories to watch +מחיצות לניתור +Directory +מחיצה +Directory does not exist: +מחיצה לא קיימת: +Do not show this dialog again +אל תראה מסך זה שנית +Do nothing +אל תעשה כלום +Do you really want to delete the following object(s)? +האם אתה באמת רוצה למחוק את האוביקטים הבאים? +Do you really want to move the following object(s) to the Recycle Bin? +האם אתה רוצה להעביר את האוביקטים הבאים לסל המיחזור? +Do you want FreeFileSync to automatically check for updates every week? +האם ברצונך שהתוכנה תבדוק לעדכון בכל שבוע? +Donate with PayPal +תרום עם פייפל +Download now? +הוקד עכשיו? +Drag && drop +גרור והשלך +Elements found: +אלמנטים נמצאו: +Elements processed: +אלמנטים עובדו: +Elements remaining: +אלמנתים נותרו: +Email +:דוא"ל +Endless loop when traversing directory: +נוצרת לולאה אינסופית בחצית מחיצות +Error +טעות +Error changing modification time: +טעות בשינוי זמן: +Error copying file: +טעות בהעתקת קובץ: +Error copying locked file %x! +טעות בהעתקת קובץ נעול %x! +Error copying symbolic link: +טעות בהעתקת קישור : +Error creating directory: +טעות ביצירת מחיצה: +Error deleting directory: +טעות המחיקת מחיצה: +Error deleting file: +טעות במחיקת קובץ: +Error handling +טעות בטיפול בשגיאות +Error loading library function: +טעות בטעינת ספרית פונקציות: +Error moving directory: +טעות בהעברת מחיצה: +Error moving file: +טעות בהעברת קובץ: +Error moving to Recycle Bin: +טעות בהעברה לסל המיחזור: +Error opening file: +טעות בפתיחת קובץ: +Error parsing configuration file: +טעות בניתוח קובץ קונפיגורציה: +Error reading file attributes: +טעות בקריאת תכונות קובץ: +Error reading file: +טעות בקריאת קובץ: +Error reading from synchronization database: +טעות בקריאה מבסיס הנתונים של הסנכרון: +Error resolving symbolic link: +טעות בפענוח מראה מקום סימלי (Symbolic Link) +Error starting Volume Shadow Copy Service! +טעות בטעינת מעתיק צללים (Shadow Copy Service)! +Error traversing directory: +טעות בהצלבת מחיצות +Error when monitoring directories. +טעות בניתור מחיצות. +Error writing file attributes: +טעות בכתיבת תכונות קובץ: +Error writing file: +טעות בכתיבת קובת: +Error writing to synchronization database: +טעות ברישום לבסיס נתוני סנכרון: +Example +דוגמה +Exclude +הוצא +Exclude all rows +הוצא כל שורות +Exclude temporarily +הוצא זמנית +Exclude via filter: +הוצא בעזרת סנן: +Exit instantly +צא מידית +Extension +סיומת +External applications +תוכנה חיצונית +Fatal Error +שגיאה פטלית +Feedback and suggestions are welcome at: +:תגובות והצעות ותקבלו בברכה +File %x has an invalid date! +קובץ %x מכיל מידע שגוי! +File already exists. Overwrite? +קובץ קיים האם לדרוס? +File content +תכולת הקובץ +File does not exist: +קובץ לא קיים: +File list exported! +רשימת קבצים יוצאה! +File size and date +גודל קובץ ותאריך +Filename +שם קובץ +Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to decide which one is newer due to Daylight Saving Time issues. +קובץ %x נשמר בשעה הבדל!\n\n אין אפשרות להחליט מי מהקבצים חדש יותר בגלל אפשרות שעון קייץ +Files %x have the same date but a different size! +קובץ %x בעל תאריך זהה אך גודל שונה +Files are found equal if\n - file content\nis the same +קבצים נחשבים כזהים \n - במקרה והתוכן זהה +Files are found equal if\n - filesize\n - last write time and date\nare the same +קבצים נחשבים כזהים \n - גודל הקובץ \n - זמן כתיבה ותאריך זהים +Files that are equal on both sides +קבצים זהים בשינ הצדדים +Files that exist on both sides, left one is newer +קבצים הנמצאים בשני הצדדים -השמאלי חדש יותר +Files that exist on both sides, right one is newer +קבצים הנמצאים בשני הצדדים -הימני חדש יותר +Files that have different content +קבצים בעלי תוכן שונה +Files/folders that exist on left side only +קבצים ותיקיות הנמצאים בעמודה השמאלית בלבד +Files/folders that exist on right side only +קבצים ותיקיות הנמצאים בעמודה הימנית בלבד +Filter files +קבצי המסנן +Filter is active +מסנן פעיל +Filter settings have changed! +קביעת המסנן שונו! +Filter view +תצוגה מסוננת +Filter: All pairs +כל הזוגות :מסונן +Filter: Single pair +זוג אחד :מסונן +Find +חפש +Find what: +חפש מה: +Folder Comparison and Synchronization +סנכרון קבצים ומחיצות +Follow + +Free disk space available: +מקום פנוי בדיסק: +FreeFileSync Batch Job +FreeFileSync עבודת אצווה +FreeFileSync at Sourceforge +FreeFileSync ב Sourceforge +FreeFileSync batch file +FreeFileSync קובץ אצווה +FreeFileSync configuration +FreeFileSync הגדרות +FreeFileSync is up to date! +FreeFileSync מעודכן בגירסה האחרונה! +Full path +שביל מלא +Generating database... +מיצר בסיס נתונים... +Generating file list... +מיצר רשימת קבצים... +Global settings +משתנים גלובליים +Help +עזרה +Hidden dialogs: +דיאלוגים מוסתרים: +Hide all error and warning messages +הסתר את כל הודעות ההזהרה והטעות +Hide conflicts +הסתר קונפליקטים +Hide excluded items +החבא פריטים לא נבחרים +Hide files that are different +החבא פרטים שונים +Hide files that are equal +החבא פרטים שאינם שווים +Hide files that are newer on left +החבא קבצים חדשים יותר בצד שמאל +Hide files that are newer on right +החבא קבציםדשים יותר בצד ימין +Hide files that exist on left side only +החבא קבצים הקימים אך ורק בצד שמאל +Hide files that exist on right side only +החבא קבצים הקימים אך ורק בצד ימין +Hide files that will be created on the left side +החבא קבצים שייוצרו בצד שמאל +Hide files that will be created on the right side +החבא קבצים שייוצרו בצד ימין +Hide files that will be deleted on the left side +החבא קבצים שימחקו בצד שמאל +Hide files that will be deleted on the right side +החבא קבצים שימחקו בצד ימין +Hide files that will be overwritten on left side +החבא קבצים אשר ידרסו בצד ימין +Hide files that will be overwritten on right side +הסתר קבצים אשר ידרסו בעמודה הימנית +Hide files that won't be copied +החבא קבצים אשר לא יועתקו +Hide filtered or temporarily excluded files +החבא קבצים מסוננים או לא בחורים +Hide further error messages during the current process +החבא הערות ואזהרות בהמשך התהליך הנוכחי +Hints: +טיפים: +Homepage +:אתר-הבית +Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. +זהה והפץ שינויים בשניי הצדדים בעזרת בסיס נתונים מחיקות וקונפליקטים מזוהים באופן אוטומטי +If you like FFS +:תרומה תתקבל בברכה +Ignore + +Ignore 1-hour file time difference +התעלם מ-1 שעה הבדל בזמן השמירה של הקובץ -בעית שעון קיץ +Ignore errors +התעלם מטעויות +Ignore subsequent errors +התעלפ מטעויות נישנות +Include +כלול +Include all rows +כלול את כל השורות +Include temporarily +כלול זמנית +Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* +כלול: *.doc;*.zip;*.exe\n אל תכלול: \\stuff\\temp\\* +Incompatible synchronization database format: +מסד נתונים של הסנכרון לא תואם: +Info +מידע +Information +הסבר +Initial synchronization: +סנכרון ראשוני: +Integrate external applications into context menu. The following macros are available: +:הטמע תוכנות חיצוניות לתפריט המקרו הבאים מוכנים +Leave as unresolved conflict +השאר כקונפליקט לא מטופל +Left +שמאל +Legend +מקרא +Load configuration from file +טען קונפיגורציה מקובץ +Load configuration history (press DEL to delete items) +טען היסטורית קונפיגורציות לחץ DEL +Log-messages: +הודעת יומן: +Logging +רישום ביומן +Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. +לא נתמכת בגרסה זאת אנא התקן גרסה 64 WOW64 העתקת צל ב +Match case +אותיות התאם +Mirror ->> +מראה ->> +Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. +גיבוי מראה של העמודה השמאלית העמודה הימנית תדרס ותהיה העתק מדויק של העמודה השמאלית לאחר סנכרון +Monitoring active... +נטר ארכיב... +More than 50% of the total number of files will be copied or deleted! +יותר מ 50% מהקבצים ימחקו או יועתקו +Move column down +הורד עמודה +Move column up +העלה עמודה +Move files into a time-stamped subdirectory +העבר קבצים לתוך מחיצות עם שם המכיל טביעת זמן ותאריך +Moving %x to Recycle Bin +העבר %x לסל המיחזור +Moving Symbolic Link %x to user-defined directory %y + +Moving file %x to user-defined directory %y +העבר קובץ %x למחיצה מותאמת אישית %y +Moving folder %x to user-defined directory %y +העבר תיקיה %x למחיצה מותאמת אישית %y +Multiple... +הכפל... +No change since last synchronization! +אין שינוי מאז הסנכרון האחרון! +No filter selected +לא נבחר מסנן פעיל +Not enough free disk space available in: +:אין מספיק זכרון פנוי ב +Nothing to synchronize according to configuration! +אין מה לסנכרן ע"פ הקונפיגורציה! +Number of files and directories that will be created +מספר התקיות והקבצים אשר עומדים להיוצר +Number of files and directories that will be deleted +מספר הקבצים והתיקיות העומדים להימחק +Number of files that will be overwritten +מספר הקבצים העומדים להידרס +One of the FreeFileSync database entries within the following file is not yet existing: +אחד מקובצי בסיס הנתונים המוכנסים הבא עדיין לא קיים +One of the FreeFileSync database files is not yet existing: +אחד מקובצי בסיס הנתונים הבא עדיין לא קיים +Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. +תיקיות וקבצים אשר עברו סינון יבחרו לסנכרון הסינון יוכל לנתיב היחסי לת'יות המסונכרנות +Open with Explorer +פתח בעזרת תוכנת הגלישה +Open with default application +פתח בעזרת התוכנה הנבחרת +Operation aborted! +הפעולה בוטלה! +Operation: +פעולה: +Overview +מבט כללי +Pause +עצור +Paused +עצור +Planned directory deletion is in conflict with its subdirectories and -files! +מחיצה המיועדת למחיקה מצויה בסתירה לתקיות המשנה ולקבצים +Please run a Compare first before synchronizing! +הרץ השוואה לפני סנכרון! +Press \"Switch\" to open FreeFileSync GUI modus. +\"לחץ\" לפתיחת FreeFileSync בממשק גרפי. +Processing folder pair: +מבצע זיווז מחיצות: +Published under the GNU General Public License: +GNU מפורסם במסגרת: +Question +שאלה +Quit +יציאה +Re-enable all hidden dialogs? +הפעל מחדש דיאלוגים נסתרים? +RealtimeSync - Automated Synchronization +RealtimeSync - סינכרון אוטומטי +RealtimeSync configuration +RealtimeSync בקרת תצורה +Recycle Bin not yet supported for this system! +סל המחזור לא בתמך כרגע במערכת הפעלה זו! +Relative path +נתיב יחסי +Remove alternate settings +תצורה מרוחקת אלטרנטיבית +Remove folder +הסר מחיצה +Remove folder pair +הסר זוג מחיצות +Report translation error +:דווח שגיאת תרגום +Reset +אפס +Right +ימין +Run minimized and write status information to a logfile +הפעל ניסתר ורשום ליומן פעילות +S&ave configuration... +שמ&ןר תצורה... +S&witch view +החל&ף תצוגה +Save changes to current configuration? +שמור שינויים לתורה נוכחית? +Save current configuration to file +שמור תצורה לקובץ +Scanning... +סורק... +Scanning: +סורק: +Select a folder +בחר מחיצה +Select alternate synchronization settings +בחר משתני סנכרון אלטרנטיביים +Select logfile directory: +בחר מחיצה לתיקית-יומן +Select variant: +בחר משתנה: +Set direction: +בחר כוון: +Setting default synchronization directions: Old files will be overwritten with newer files. +בחר בררת מחדל של סנכרון קבצים ישנים ידרסו ע"י קבצים חדשים יותר. +Show conflicts +הראה קונפליקטים +Show files that are different +הראה קבצים שונים +Show files that are equal +הראה קבצים שווה +Show files that are newer on left +הראה קבצים חדשים יותר על העמודה השמאלית +Show files that are newer on right +הראה קבצים חדשים יותר על העמודה הימנית +Show files that exist on left side only +הראה קבצים הנמצאים בעמודה השמאלית בלבד +Show files that exist on right side only +הראה קבצים הנמצאים בעמודה הימנית בלבד +Show files that will be created on the left side +הראה קבצים שיווצרו בעמודה השמאלית +Show files that will be created on the right side +הראה קבצים שיווצרו בעמודה הימנית +Show files that will be deleted on the left side +הראה קבצים שימחקו בעמודה השמאלית +Show files that will be deleted on the right side +הראה קבצים שימחקו בעמודה הימנית +Show files that will be overwritten on left side +הראה קבצים שידרסו בעמודה השמאלית +Show files that will be overwritten on right side +הראה קבצים שידרסו בעמודה הימנית +Show files that won't be copied +הראה קבצים שלא יועתקו +Show hidden dialogs +הראה דיאולוגים נסתרים +Show popup +הראה חלונות קופצים +Show popup on errors or warnings +הראה חלונות קופצים בזמן טעות או תקלה +Significant difference detected: +התגלה שוני גדול מידי: +Silent mode +מוד שקט +Size +גודל +Source code written completely in C++ utilizing: +C++ קוד מקור נרשם במהדר +Source directory does not exist anymore: +מחיצת המקור לא נמצאת: +Speed: +מהירות: +Start +התחל +Start synchronization +התחל סנכרון +Statistics +סטטיסטיקה +Status feedback +היזון חוזר +Stop +עצור +Swap sides +החלף צדדים +Switching to FreeFileSync GUI modus... +החלף לתצורת ממשק חזותי... +Symbolic Link handling + +Symlinks %x have the same date but a different target! + +Synchronization Preview +תצוגה מקדימה של סנכרון +Synchronization aborted! +סינכרון בוטל! +Synchronization completed successfully! +סינכרון הושלם בהצלחה! +Synchronization completed with errors! +סנכרון הושלם עם שגיאות! +Synchronization settings +משתני סנכרון +Synchronization status +סטטוס סנכרון +Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". +סנכרן .doc, .zip und .exe כל הקבצים בתיקית משנה \"temp\". +Synchronize... +...סנכרן +Synchronizing... +מסנכרן... +System out of memory! +מחסור בזכרון מערכת! +Target directory already existing! +מחיצת מטרה כבר קיימת! +Target file already existing! +קובץ מטרה כבר קיים! +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +בכל פעם שכל המחיצות מאופשרות למשל בהכנסת מקלון זכרון \n שורת הפקודות מתבצעת +The file does not contain a valid configuration: +קובץ זה לא מכיל קונפיגורציה ברת תוקף +The file was not processed by last synchronization! +קובץ זה לא טופל בסנכרון האחרון! +This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. +הוריאציה הזאת מעריכה את 2 הקבצים במידה שווה כאשר שמם זהה ויש להם גודל זהה ותאריך הרישום האחרון זהה +Time +זמן +Time elapsed: +זמן עבר: +Time remaining: +זמן נותר: +Total amount of data that will be transferred +סך הכל נתונים להעברה +Total required free disk space: +זכרון פנוי כללי נדרש +Total time: +זמן מקומי: +Treat file times that differ by exactly +/- 1 hour as equal, less than 1 hour as conflict in order to handle Daylight Saving Time changes +התיחס לזמני הקובץ כאשר הם שונים בדיוק ב +/- שעה כשווים לצורך פתרון בעית שעון קיץ +Unable to connect to sourceforge.net! +אין תקשורת ל sourceforge.net! +Unable to create logfile! +לא מסוגל ליצור יומן! +Unresolved conflicts existing! +קיים קונפליקט לא פתור! +Update -> +שדרג-> +Usage: +שימוש: +Use Recycle Bin +השתמש בסל המיחזור +Use Recycle Bin when deleting or overwriting files +השתמש בסל המיחזור כאשר מוחק או דורס קבצים +User-defined directory +מחיצה מותאמת אישית +User-defined directory for deletion was not specified! +מחיצה מותאמת אישית למחיקה לא מוגדרת! +Variant +משתנה +Verifying file %x +מאמת קובץ %x +Volume name %x not part of filename %y! +כנונן %x לא בנתיב של קובץ %y! +Waiting for all directories to become available... +מחכה להתפנות כל המחיצות... +Warning +אזהרה +Warning: Synchronization failed for %x item(s): +עצמים %x אזהרה סנכרון נכשל לגבי +When the comparison is started with this option set the following decision tree is processed: +:כאשר ההשוואה מתחילה בעזרת הבחירות הנבחרות עץ ההחלטות הבא מתבצע +You can ignore conflicts and continue synchronization. +באפשרותך להתעלם מהקונפליקטים ולהמשיך בסנכרון +You can ignore the error to consider not existing directories as empty. +!באפשרותך להתעלם מהשגיאה ולהחשיב את המחיצות החסרות כריקות +You may try to synchronize remaining items again (WITHOUT having to re-compare)! +!באפשרותך לנסות לסנכרן את העצמים הנותרים מבלי להשוות מחדש +different +שונה +file exists on both sides +קובץ נמצא בדני הצדדים +on one side only +בצד אחד בלבד diff --git a/BUILD/Languages/hungarian.lng b/BUILD/Languages/hungarian.lng index dcd595aa..faffa5ad 100644 --- a/BUILD/Languages/hungarian.lng +++ b/BUILD/Languages/hungarian.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) nap hour(s) @@ -22,18 +18,30 @@ másodperc %x / %y objects deleted successfully %X / %Y objektum sikeresen törölve +%x Byte +%x bájt +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories %x mappa -%x files, -%x fájl, +%x files +%x fájl %x is not a valid FreeFileSync batch file! A(z) %x nem megfelelő FreeFileSync kötegelt feladat fájl! +%x kB +%x kB %x of %y rows in view %x sor látható a(z) %y sorból %x of 1 row in view %x sor látható az 1 sorból %x% - +%x% &Abort &Megszakít &About... @@ -57,7 +65,7 @@ A(z) %x nem megfelelő FreeFileSync kötegelt feladat fájl! &File &Fájl &Find next - +&Következő keresése &Global settings... &Globális beállítások... &Help @@ -85,11 +93,13 @@ A(z) %x nem megfelelő FreeFileSync kötegelt feladat fájl! &Retry &Ismét &Save -&Mestés +&Mentés &Switch - +&Váltás &Yes &Igen +(Build: %x) +(Build: %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Megjegyzés: Csak a FAT/FAT32 meghajtókat érinti ez a probléma!\nMinden más esetben ki lehet kapcsolni az \"1 órás különbség figyelmen kívül hagyása\" beállítást.) (Requires an Internet connection!) @@ -126,8 +136,8 @@ A(z) %x nem megfelelő FreeFileSync kötegelt feladat fájl! /másodperc 1 directory 1 mappa -1 file, -1 fájl, +1 file +1 fájl 1. &Compare 1. &Összehasonlítás 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ A(z) %x nem megfelelő FreeFileSync kötegelt feladat fájl! + + A newer version of FreeFileSync is available: @@ -157,7 +169,7 @@ Elérhető a FreeFileSync egy újabb verziója: Abort requested: Waiting for current operation to finish... Megszakítási kérelem: Várakozás a folyamatban lévő művelet befejezésére... Abort synchronization immediately - +Szinkronizáció azonnali megszakítása Aborted Megszakítva About @@ -195,17 +207,15 @@ Mindkét oldal megváltozott az utolsó szikronizálás óta! Browse Tallózás Browse directory - -Build: -Build: +Mappa tallózása Cannot determine sync-direction: Nem lehet meghatározni a szinkronizáció irányát: Cannot find %x - +Nem található: %x Category Kategória Clear filter settings - +Szűrőbeállítások törlése Comma separated list Comma separated values Command line @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Megosztott vagy zárolt fájlok másolása a Volume Shadow Copy Service segítségével Copy to clipboard\tCTRL+C Másolás a vágólapra\tCTRL+C +Copying Symbolic Link %x overwriting %y +A(z) %x symlink másolása fölülírva a következőt: %y +Copying Symbolic Link %x to %y +A(z) %x symlink másolása ide: %y +Copying file %x overwriting %y +A(z) %x fájl másolása fölülírva a következőt: %y Copying file %x to %y %x fájl másolása a(z) %y fájlba -Copying file %x to %y overwriting target -A(z) %x fájl másolása a(z) %y fájlba fölülírva a célt Could not determine volume name for file: A következő fájlnak nem lehet meghatározni a kötetnevét: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently A fájlok folyamatos törlése vagy felülírása Delete permanently Folyamatosan törölni +Deleting Symbolic Link %x +Symlink törlése: %x Deleting file %x Fájl törlése %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Törlések kezelése Description Megjegyzés +Direct +Közvetlen Directories are dependent! Be careful when setting up synchronization rules: A mappák függenek egymástól! Legyen óvatos, amikor megadja a szinkronizálási szabályokat: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again Ne mutasd újra ezt a párbeszédablakot Do nothing Nincs mit csinálni -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Valóban törölni akarja a az alábbi objektumo(ka)t? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Valóban a Lomtárba (Recycle Bin) akarja mozgatni az alábbi objektumo(ka)t? Do you want FreeFileSync to automatically check for updates every week? Akarod, hogy a FreeFileSync automatikusan minden héten keressen frissítést? @@ -353,11 +371,11 @@ Letöltsem most? Drag && drop Húzd && Ejtsd Elements found: - +Talált elemek száma: Elements processed: - +Feldolgozott elemek száma: Elements remaining: - +Hátralévő elemek száma: Email E-mail Endless loop when traversing directory: @@ -371,7 +389,7 @@ A fájl másolása sikertelen: Error copying locked file %x! Hiba történt a(z) %x zárolt fájl másolása közben! Error copying symbolic link: - +Hiba történt a szimbolikus link másolása közben: Error creating directory: A mappa létrehozása sikertelen: Error deleting directory: @@ -423,9 +441,9 @@ Ideiglenesen kizár Exclude via filter: Kizárás szűrő segítségével: Exit instantly - +Kilépés azonnal Extension - +Kiterjesztés External applications Külső alkalmazások Fatal Error @@ -461,7 +479,7 @@ Mindkét oldalon létező fájlok, de a bal oldali újabb Files that exist on both sides, right one is newer Mindkét oldalon létező fájlok, de a jobb oldali újabb Files that have different content - +Fájlok, amelyeknek különböző a tartalmuk: Files/folders that exist on left side only Csak a bal oldalon létező fájlok/mappák Files/folders that exist on right side only @@ -469,21 +487,23 @@ Csak a jobb oldalon létező fájlok/mappák Filter files Fájlok szűrése Filter is active - +A szűrő aktív Filter settings have changed! A szűrőbeállítások megváltoztak! Filter view Szűrő nézet Filter: All pairs - +Szűrő: Minden pár Filter: Single pair - +Szűrő: Egy pár Find - +Keresés: Find what: - +Mit keresünk: Folder Comparison and Synchronization Mappa összehasonlítás és szinkronizáció +Follow +Követés Free disk space available: Szabad lemezterület: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Mindkét oldal változásainak azonosítása és tárolása adatbázis segítségével. A törlések és ütközések automatikusan észlelődnek. If you like FFS FFS támogatása +Ignore +Figyelmen kívül hagy Ignore 1-hour file time difference 1 órás fájl dátum különbségek figyelmen kívül hagyása Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Későbbi hibák figyelmen kívül hagyása Include Csatol -Include Symbolic Links - Include all rows Minden sort csatolni Include temporarily @@ -595,7 +615,7 @@ Naplózás Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. A Shadow Copy a WOW64-en nem támogatott. Kérjük, használja a 64-bites FreeFileSync-et. Match case - +Kis-/nagybetű egyezés Mirror ->> Tükrözés ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -611,7 +631,9 @@ Oszlop mozgatása felfelé Move files into a time-stamped subdirectory Fájlok másolása időbélyeggel ellátott almappába Moving %x to Recycle Bin -%x mozgatása a Lomtárba +%x mozgatása a Lomtárba (Recycle Bin) +Moving Symbolic Link %x to user-defined directory %y +A(z) %x symlink másolása a felhasználó által megadott %y mappába Moving file %x to user-defined directory %y %x fájl mozgatása a felhasználó által megadott %y mappába Moving folder %x to user-defined directory %y @@ -633,15 +655,15 @@ A törlendő fájlok és mappák száma Number of files that will be overwritten A felülírandó fájlok száma One of the FreeFileSync database entries within the following file is not yet existing: - +A FreeFileSync a következő fájlban lévő egyik adatbázisbejegyzése nem található: One of the FreeFileSync database files is not yet existing: - +A FreeFileSync egyik adatbázisfájlja nem létezik: Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. Csak a szűrésnek megfelelő fájlok/mappák lesznek kijelölve szinkronizáláshoz. A szűrő a szinkronizálás alap mappáihoz relatív fájl- és mappanevekre lesz alkalmazva. Open with Explorer Megnyitás Explorerrel Open with default application - +Megnyitás az alapértelmezett alkalmazással Operation aborted! Művelet megszakítva! Operation: @@ -653,11 +675,11 @@ Szünet Paused Szüneteltetve Planned directory deletion is in conflict with its subdirectories and -files! - +A tervezett mappának a törlése ütközik az almappáival és fájljaival. Please run a Compare first before synchronizing! Kérjük, futtass le egy összehasonlítást mielőtt szinkronizálnál! Press \"Switch\" to open FreeFileSync GUI modus. - +Kérjük, nyomja meg a \"Váltás\" gombot a GUI mód megnyitásához. Processing folder pair: Mappapár feldolgozása: Published under the GNU General Public License: @@ -673,7 +695,7 @@ RealtimeSync - Automatikus szinkronizálás RealtimeSync configuration RealtimeSync beállítások Recycle Bin not yet supported for this system! - +A Lomtár (Recycle Bin) nem támogatott ezen a rendszeren! Relative path Relatív útvonal Remove alternate settings @@ -682,8 +704,6 @@ Remove folder Mappa eltávolítása Remove folder pair Mappa párok eltávolítása -Renaming file %x to %y -%x fájl átnevezése %y névre Report translation error Fordítói hiba bejelentése Reset @@ -713,9 +733,9 @@ Naplófájl mappájának kiválasztása: Select variant: Változat kiválasztása: Set direction: - +Irány Setting default synchronization directions: Old files will be overwritten with newer files. - +Alapértelmezett szinkronizációs irányok beállítása: a régebbi fájlok felülíródnak az újabbakkal. Show conflicts Ütközések mutatása Show files that are different @@ -769,13 +789,17 @@ Szinkronizáció indítása Statistics Statisztikák Status feedback - +Státusz visszajelzés Stop Megállítás Swap sides Oldalak felcserélése Switching to FreeFileSync GUI modus... - +Váltás a FreeFileSync GUI módjára... +Symbolic Link handling +Symlink kezelés +Symlinks %x have the same date but a different target! +A(z) %x symlinknek megegyezik a dátuma, de a célpontja nem! Synchronization Preview Szinkronizáció előnézete Synchronization aborted! @@ -800,12 +824,12 @@ Target directory already existing! A célmappa már létezik! Target file already existing! A célként megadott fájl már létezik! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified - +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +A parancssor végrehajtódik minden alkalommal, ha:\n- minden mappa elérhetővé válik (pl. USB-kulcs csatlakoztatása)\n- fájlok módosulnak az adott mappákban és almappákban The file does not contain a valid configuration: A következő fájl nem tartalmaz érvényes beállításokat: The file was not processed by last synchronization! - +A fájl nem lett feldolgozva az utolsó szinkronizáció alkalmával! This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. Ez a változat akkor tekint egyezőnek két azonos nevű fájlt, ha azok mérete ÉS az utolsó módosításuk ideje azonos. Time @@ -835,7 +859,7 @@ Használat: Use Recycle Bin Lomtár (Recycle Bin) használata Use Recycle Bin when deleting or overwriting files -A Lomtár használata fájlok törlésénél vagy felülírásánál +A Lomtár (Recycle Bin) használata fájlok törlésénél vagy felülírásánál User-defined directory Felhasználó által megadott mappa User-defined directory for deletion was not specified! @@ -847,7 +871,7 @@ Verifying file %x Volume name %x not part of filename %y! A(z) %x kötetnevet nem tartalmazza a(z) %y fájlnév! Waiting for all directories to become available... - +Várakozás az összes mappa elérhetővé válására... Warning Figyelem Warning: Synchronization failed for %x item(s): diff --git a/BUILD/Languages/italian.lng b/BUILD/Languages/italian.lng index 6439dfd5..79104c4f 100644 --- a/BUILD/Languages/italian.lng +++ b/BUILD/Languages/italian.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) giorno(i) hour(s) @@ -22,18 +18,30 @@ sec %x / %y objects deleted successfully %x / %y oggetti cancellati con successo +%x Byte + +%x GB + +%x MB + +%x PB + +%x TB + %x directories %x cartelle -%x files, -%x files, +%x files +%x files %x is not a valid FreeFileSync batch file! %x non è un batch file valido per FreeFileSync! +%x kB + %x of %y rows in view %x di %y righe visualizzate %x of 1 row in view %x di 1 riga visualizzata %x% - +%x% &Abort &Abbandona &About... @@ -87,9 +95,11 @@ &Save &Salva &Switch - +&Switch &Yes &Si +(Build: %x) + (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Solo volumi con file-system FAT/FAT32 risentono di questo problema!\nIn tutti gli altri casi puoi disabilitare l'impostazione \"ignora differenze di 1 ora\".) (Requires an Internet connection!) @@ -126,8 +136,8 @@ /sec 1 directory 1 directory -1 file, -1 file, +1 file +1 file 1. &Compare 1. &Compara 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ + + A newer version of FreeFileSync is available: @@ -195,9 +207,7 @@ Entrambi i lati sono cambiati dall'ultima sincronizzazione! Browse Sfoglia Browse directory - -Build: -Build: +Sfoglia cartelle Cannot determine sync-direction: Impossibile determinare direzione di sincronia: Cannot find %x @@ -205,7 +215,7 @@ Impossibile trovare %x Category Categoria Clear filter settings - +Pulisci impostazioni filtro Comma separated list Lista di elementi separati da virgola Command line @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Copia file condivisi o bloccati usando il servizio Volume Shadow Copy Copy to clipboard\tCTRL+C Copia nella clipboard\tCTRL+C +Copying Symbolic Link %x overwriting %y + +Copying Symbolic Link %x to %y + +Copying file %x overwriting %y + Copying file %x to %y Copia di file da %x a %y -Copying file %x to %y overwriting target -Copia file %x su %y sovrascrivendo la destinazione Could not determine volume name for file: Impossibile determinare il nome volume per il file: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently Cancella o sovrascrivi file definitivamente Delete permanently Cancella definitivamente +Deleting Symbolic Link %x + Deleting file %x Eliminazione file %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Gestione cancellazione Description Descrizione +Direct + Directories are dependent! Be careful when setting up synchronization rules: Le directory sono dipendenti! Fai attenzione quando configuri le regole di sincronizzazione: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again Non visualizzare più questo messaggio Do nothing Non fare nulla -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Vuoi veramente eliminare i seguenti oggetti? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Vuoi veramente spostare i seguenti oggetti nel Cestino? Do you want FreeFileSync to automatically check for updates every week? Vuoi che FreeFileSync controlli automaticamente gli aggiornamenti ogni settimana? @@ -353,11 +371,11 @@ Scaricare ora? Drag && drop Drag && drop Elements found: - +Elementi trovati: Elements processed: - +Elementi processati: Elements remaining: - +Elementi rimanenti: Email Email Endless loop when traversing directory: @@ -461,7 +479,7 @@ Files esistenti su entrambi i lati, più recenti a sinistra Files that exist on both sides, right one is newer Files esistenti su entrambi i lati, più recenti a destra Files that have different content - +Files con contenuto differente Files/folders that exist on left side only Files/cartelle esistenti solo a sinistra Files/folders that exist on right side only @@ -469,21 +487,23 @@ Files/cartelle esistenti solo a destra Filter files Filtro dei files Filter is active - +Il filtro e' attivo Filter settings have changed! Le impostazioni del filtro sono cambiate! Filter view Filtro della vista Filter: All pairs - +Filtro: Tutte le coppie Filter: Single pair - +Filtro: Singola coppia Find Trova Find what: Trova cosa: Folder Comparison and Synchronization Comparazione di Cartelle e Sincronizzazione +Follow + Free disk space available: Spazio libero su disco disponibile: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Identifica e propaga cambiamenti su entrambi i lati usando un database. Cancellazioni e conflitti sono riconosciuti automaticamente. If you like FFS Se ti piace FFS +Ignore + Ignore 1-hour file time difference Ignora la differenza di file time di 1 ora Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Ignora gli errori successivi Include Includi -Include Symbolic Links - Include all rows Includi tutte le righe Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory Sposta file in una sotto-cartella datata Moving %x to Recycle Bin Spostamento di %x nel Cestino +Moving Symbolic Link %x to user-defined directory %y + Moving file %x to user-defined directory %y Spostamento del file %x nella directory personalizzata %y Moving folder %x to user-defined directory %y @@ -641,7 +663,7 @@ Solo file e directory che passano il filtro saranno selezionati per la sincroniz Open with Explorer Apri con Explorer Open with default application - +Apri con applicazione di default Operation aborted! Operazione abortita! Operation: @@ -653,11 +675,11 @@ Pausa Paused In pausa Planned directory deletion is in conflict with its subdirectories and -files! - +La cancellazione della directory pianificata e' in conflitto con queste sottodirectory e files! Please run a Compare first before synchronizing! Prima di sincronizzare effettua una Comparazione! Press \"Switch\" to open FreeFileSync GUI modus. - +Premi \"Switch\" per aprire modalità GUI di FreeFileSync Processing folder pair: Elaborazione coppia di cartelle: Published under the GNU General Public License: @@ -673,7 +695,7 @@ RealtimeSync - Sincronizzazione Automatizzata RealtimeSync configuration Configurazione di RealtimeSync Recycle Bin not yet supported for this system! - +Cestino non ancora supportato per questo sistema! Relative path Percorso relativo Remove alternate settings @@ -682,8 +704,6 @@ Remove folder Rimuovi cartella Remove folder pair Elimina la coppia di cartelle -Renaming file %x to %y -Rinomina file %x in %y Report translation error Segnala errori di traduzione Reset @@ -769,12 +789,16 @@ Avvia sincronizzazione Statistics Statistiche Status feedback - +Feedback di stato Stop Stop Swap sides Inverti i lati Switching to FreeFileSync GUI modus... +Switch alla modalità GUI di FreeFileSync... +Symbolic Link handling + +Symlinks %x have the same date but a different target! Synchronization Preview Anteprima Sincronizzazione @@ -800,12 +824,12 @@ Target directory already existing! Directory di destinazione già esistente! Target file already existing! File destinazione già esistente! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -La linea di comando è eseguita ogni volta che:\n- una directory diviene disponibile (es: inserimento USB key)\n- file all'interno di queste directory o sotto-directory vengono modificati +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified + The file does not contain a valid configuration: Il file non contiene una configurazione valida The file was not processed by last synchronization! - +Il file non era processato nell'ultima sincronizzazione! This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. Questa variante definisce identici due file con lo stesso nome quando hanno la stessa dimensione E la stessa data e ora. Time @@ -847,7 +871,7 @@ Verifica di file %x Volume name %x not part of filename %y! Il nome volume %x non è parte del nome file %y! Waiting for all directories to become available... - +In attesa che tutte le directory siano disponibili... Warning Attenzione Warning: Synchronization failed for %x item(s): diff --git a/BUILD/Languages/japanese.lng b/BUILD/Languages/japanese.lng index fa96854f..73b9e0f4 100644 --- a/BUILD/Languages/japanese.lng +++ b/BUILD/Languages/japanese.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) 日(間) hour(s) @@ -22,12 +18,24 @@ 秒 %x / %y objects deleted successfully %x / %y のオブジェクトを削除しました +%x Byte +%x バイト +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories %x ディレクトリ -%x files, -%x 個のファイル: +%x files +%x 個のファイル %x is not a valid FreeFileSync batch file! %x は有効なバッチファイルではありません! +%x kB +%x kB %x of %y rows in view %x / %y 行を表示 %x of 1 row in view @@ -90,6 +98,8 @@ 切り替え(&S) &Yes はい(&Y) +(Build: %x) +(ビルド: %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (注意: FAT/FAT32 ドライブのみこの影響を受けます! \n その他のケースでは設定を無効にすることができます。"1 時間の差異は無視" ) (Requires an Internet connection!) @@ -126,7 +136,7 @@ /秒 1 directory 1 ディレクトリ -1 file, +1 file 1 ファイル 1. &Compare 1. 比較(&C) @@ -150,6 +160,8 @@ <ディレクトリ> <最後のセッション> + +<シンボリックリンク> <複数選択> A newer version of FreeFileSync is available: @@ -196,8 +208,6 @@ Browse 参照 Browse directory ディレクトリを参照 -Build: -ビルド: Cannot determine sync-direction: 同期方向が決定されていません: Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service 共有、またはボリュームシャドウコピーでロックされたファイルをコピー Copy to clipboard\tCTRL+C クリップボードにコピー\tCTRL+C +Copying Symbolic Link %x overwriting %y +シンボリックリンク %x をコピー.. %y に上書き中 +Copying Symbolic Link %x to %y +シンボリックリンク %x から %y にコピー中 +Copying file %x overwriting %y +ファイル %x をコピー.. %y に上書き中 Copying file %x to %y ファイル %x を %y にコピー中 -Copying file %x to %y overwriting target -ファイル %x をコピー、%y に上書き中 Could not determine volume name for file: ファイルのボリューム名が決定されていません: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently ファイルを上書き、または完全に削除 Delete permanently 完全に削除 +Deleting Symbolic Link %x +シンボリックリンク %x を削除中 Deleting file %x ファイル %x を削除中 Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling 削除の取り扱い Description 説明 +Direct +方向 Directories are dependent! Be careful when setting up synchronization rules: ディレクトリが依存関係にあります! 同期規則の設定時には注意してください: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again 次回から表示しない Do nothing 何もしない -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? 本当に以下のオブジェクトを削除しますか? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? 本当に以下のオブジェクト(複)をゴミ箱に移動しますか? Do you want FreeFileSync to automatically check for updates every week? FreeFileSync のアップデートの有無の確認を自動的に毎週行いますか> @@ -484,6 +502,8 @@ Find what: 検索語: Folder Comparison and Synchronization フォルダの比較と同期 +Follow +フォロー Free disk space available: 利用可能なディスク空き容量: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con データベースを使用して、両側アイテムの変更を特定します。 削除、競合は自動的に検出することができます。 If you like FFS FFS が気に入った場合 +Ignore +無視 Ignore 1-hour file time difference 1 時間のファイル時間の差異は無視 Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors 以降のエラーを無視 Include 含める -Include Symbolic Links -シンボリックリンクを含める Include all rows すべての行を含める Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory ファイルをタイムスタンプ名のサブフォルダに移動 Moving %x to Recycle Bin %x をゴミ箱に移動中 +Moving Symbolic Link %x to user-defined directory %y +シンボリックリンク %x をユーザ定義ディレクトリ %y にコピー中 Moving file %x to user-defined directory %y ファイル %x をユーザ定義ディレクトリ %y に移動 Moving folder %x to user-defined directory %y @@ -682,8 +704,6 @@ Remove folder フォルダ除去 Remove folder pair フォルダペアを除去 -Renaming file %x to %y -ファイル %x を %y にリネーム中 Report translation error 翻訳エラーの詳細 Reset @@ -776,6 +796,10 @@ Swap sides パネルを入れ替え Switching to FreeFileSync GUI modus... FreeFileSync GUI モードの切り替え中... +Symbolic Link handling +シンボリックリンク・リンクの取り扱い +Symlinks %x have the same date but a different target! +シンボリックリンク %x の日付は同一ですが、異なる対象があります! Synchronization Preview 同期処理のプレビュー Synchronization aborted! @@ -800,8 +824,8 @@ Target directory already existing! 対象ディレクトリはすでに存在します! Target file already existing! 対象ファイルは既に存在します! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -このコマンドラインは逐次実行されます:\n- ディレクトリに利用可能です(例.USBメモリ、ドライブなど)\n- これらディレクトリ/サブディレクトリのファイルの更新 +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +これらのコマンドはその都度実行されます:\n- すべてのディレクトリで利用可能です (例. USB スティックの挿入時)\n- ディレクトリ、またはサブディレクトリ内のファイルは更新されます。 The file does not contain a valid configuration: このファイルには有効な構成が含まれていません: The file was not processed by last synchronization! diff --git a/BUILD/Languages/polish.lng b/BUILD/Languages/polish.lng index 11efd3a8..4d486a48 100644 --- a/BUILD/Languages/polish.lng +++ b/BUILD/Languages/polish.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) dni hour(s) @@ -22,12 +18,24 @@ sekundy %x / %y objects deleted successfully %x / %y usuniętych obiektów +%x Byte +%x Bajtów +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories %x katalogi -%x files, -%x pliki, +%x files +%x pliki %x is not a valid FreeFileSync batch file! %x nie jest poprawnym plikiem batch programu FreeFileSync! +%x kB +%x kB %x of %y rows in view %x z %y wierszy w widoku %x of 1 row in view @@ -90,6 +98,8 @@ &Zamień &Yes &Tak +(Build: %x) +(Buduję: %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Pamiętaj, że ten problem dotyczy tylko FAT/FAT32!\nW każdym innym przypadku możesz wyłączyć opcję \"Ignoruj 1-godzinną różnicę\".) (Requires an Internet connection!) @@ -126,8 +136,8 @@ /sekundę 1 directory 1 katalog -1 file, -1 plik, +1 file +1 plik 1. &Compare 1. &Porównaj 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ + + A newer version of FreeFileSync is available: @@ -196,8 +208,6 @@ Browse Przeglądaj Browse directory Przeglądaj katalog -Build: -Buduj: Cannot determine sync-direction: Nie można określić kierunku synchronizacji: Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Kopiuj współdzielone lub zablokowane pliki używając Volume Shadow Copy Service Copy to clipboard\tCTRL+C Kopiuj do pamięci\tCTRL+C +Copying Symbolic Link %x overwriting %y +Kopiowanie dowiązania symbolicznego %x nadpisując %y +Copying Symbolic Link %x to %y +Kopiowanie dowiązania symbolicznego %x do %y +Copying file %x overwriting %y +Kopiowanie pliku %x nadpisując %y Copying file %x to %y Kopiowanie pliku %x do %y -Copying file %x to %y overwriting target -Nadpisywanie pliku %y plikiem %x Could not determine volume name for file: Nie można określić nazwy dysku dla pliku: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently Usuń lub nadpisz pliki na stałe Delete permanently Usuń na stałe +Deleting Symbolic Link %x +Usuwanie dowiązania symbolicznego %x Deleting file %x Usuwanie pliku %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Obsługa usuwania Description Opis +Direct +Bezpośrednio Directories are dependent! Be careful when setting up synchronization rules: Katalogi są zależne! Pamiętaj o tym podczas ustawiania zasad synchronizacji: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again Nie pokazuj tego okna ponownie Do nothing Nic nie rób -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Czy na pewno chcesz usunąć wybrane obiekty? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Czy na pewno chcesz przenieść wybrane pliki do kosza? Do you want FreeFileSync to automatically check for updates every week? Czy chcesz aby FreeFileSync sprawdzał uaktualnienia co tydzień? @@ -484,6 +502,8 @@ Find what: Co: Folder Comparison and Synchronization Porównywanie i Synchronizacja folderów +Follow +Podąrzaj Free disk space available: Wolne miejsce: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Wykryj i zastosuj zmiany po obu stronach używając bazy danych. Usunięcia i konflikty są wykrywane automatycznie. If you like FFS Jeżeli Ci się podoba +Ignore +Ignoruj Ignore 1-hour file time difference Ignoruj 1-godzinną różnicę między plikami Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Ignoruj kolejne błędy Include Dołącz -Include Symbolic Links -Dołącz dowiązania symboliczne (symlinks) Include all rows Dołącz wszystkie rzędy Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory Przenieś pliki do oznaczonego podkatalogu Moving %x to Recycle Bin Przenoszenie %x do kosza. +Moving Symbolic Link %x to user-defined directory %y +Przenoszenie dowiązania symbolicznego %x do zdefiniowanego katalogu %y Moving file %x to user-defined directory %y Przenoszenie pliku %x do katalogu użytkownia %y Moving folder %x to user-defined directory %y @@ -682,8 +704,6 @@ Remove folder Usuń folder Remove folder pair Usuń parę folderów -Renaming file %x to %y -Zmiana nazwy pliku %X na %Y Report translation error Zgłoś błąd w tłumaczeniu Reset @@ -776,6 +796,10 @@ Swap sides Zamień stronami Switching to FreeFileSync GUI modus... Przełączanie do trybu GUI FreeFileSync +Symbolic Link handling +Obsługa dowiązań symbolicznych +Symlinks %x have the same date but a different target! +Dowiązanie symboliczne %x ma te same dane, ale inny cel! Synchronization Preview Podgląd synchronizacji Synchronization aborted! @@ -800,8 +824,8 @@ Target directory already existing! Katalog docelowy już istnieje! Target file already existing! Plik docelowy już istnieje! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Komenda jest wykonywana za każdym razem gdy:\n- katalog stanie się dostepny (np. włożenie USB)\n- pliki w katalogach ulegną zmianie +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +Komenda jest wykonwywana za każdym razem gdy:\n- wszystkie katalogi będą dostępne (np. włożenie USB)\n- pliki w obrębie tych katalogów i podkatalogów ulegną zmianie The file does not contain a valid configuration: Nieprawidłowy format pliku: The file was not processed by last synchronization! diff --git a/BUILD/Languages/portuguese.lng b/BUILD/Languages/portuguese.lng index 2518dbe6..3f320f91 100644 --- a/BUILD/Languages/portuguese.lng +++ b/BUILD/Languages/portuguese.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) dia(s) hour(s) @@ -22,12 +18,24 @@ seg %x / %y objects deleted successfully %x / %y objectos eliminados com sucesso +%x Byte + +%x GB + +%x MB + +%x PB + +%x TB + %x directories %x pastas -%x files, -%x ficheiros, +%x files +%x ficheiros %x is not a valid FreeFileSync batch file! %x não é um batch válido do FreeFileSync! +%x kB + %x of %y rows in view %x de %y ficheiros %x of 1 row in view @@ -90,6 +98,8 @@ &Yes &Sim +(Build: %x) + (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Apenas as drives FAT/FAT32 são afectadas por este problema! \nPara todas as outras situações pode desactivar a opção \"ignorar diferença de 1 hora\".) (Requires an Internet connection!) @@ -126,8 +136,8 @@ /seg 1 directory 1 pastas -1 file, -1 ficheiro, +1 file +1 ficheiro 1. &Compare 1. &Comparar 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ <Última Sessão> + + A newer version of FreeFileSync is available: @@ -196,8 +208,6 @@ Browse Procurar Browse directory -Build: -Criado: Cannot determine sync-direction: Não é possível saber a direcção de sincronização: Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Copiar ficheiros partilhados ou bloqueados usando o serviço Volume Shadow Copy Copy to clipboard\tCTRL+C Copiar para a Área de transferência\tCTRL+C +Copying Symbolic Link %x overwriting %y + +Copying Symbolic Link %x to %y + +Copying file %x overwriting %y + Copying file %x to %y Copiar ficheiro %x para %y -Copying file %x to %y overwriting target -Copiar ficheiro %x para %y substituindo Could not determine volume name for file: Não é possível determinar o nome do volume para o ficheiro: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently Apagar ou substituir ficheiros permanentemente Delete permanently Apagar permanentemente +Deleting Symbolic Link %x + Deleting file %x Apagar ficheiro %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Controlo eliminação Description Descrição +Direct + Directories are dependent! Be careful when setting up synchronization rules: Directórios são dependentes! Cuidado ao definir as regras de sincronização: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again Não mostrar novamente Do nothing Não fazer nada -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Quer mesmo eliminar o(s) seguinte(s) item(s) ? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Quer mesmo mover o(s) seguinte(s) objecto(s) para a Reciclagem? Do you want FreeFileSync to automatically check for updates every week? Deseja que o FreeFileSync procure automaticamente actualizações todas as semanas? @@ -484,6 +502,8 @@ Find what: Procurar: Folder Comparison and Synchronization Comparação e Sincronização de pastas +Follow + Free disk space available: Espaço livre em disco: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Identificar e propagar as mudanças usando base de dados. Eliminações e conflitos serão detectados automaticamente. If you like FFS Se gosta do FreeFileSync +Ignore + Ignore 1-hour file time difference Ignorar diferenças de 1 hora entre ficheiros Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Ignorar erros subsequentes Include Incluir -Include Symbolic Links - Include all rows Incluir todas as linhas Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory Mover ficheiros para uma pasta com a data Moving %x to Recycle Bin A mover %x para a Reciclagem +Moving Symbolic Link %x to user-defined directory %y + Moving file %x to user-defined directory %y A mover ficheiro %x para o directório &y Moving folder %x to user-defined directory %y @@ -682,8 +704,6 @@ Remove folder Remover pasta(s) Remove folder pair Remover o par de pastas -Renaming file %x to %y -Mudar o nome de %x para %y Report translation error Informar um erro de tradução Reset @@ -776,6 +796,10 @@ Swap sides Trocar lados Switching to FreeFileSync GUI modus... +Symbolic Link handling + +Symlinks %x have the same date but a different target! + Synchronization Preview Previsualizar sincronização Synchronization aborted! @@ -800,8 +824,8 @@ Target directory already existing! Directório de destino já existe! Target file already existing! Ficheiro de destino já existe! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Linha de comnados a executar sempre que: \n- um directorio fica disponível (i.e. pen USB)\n- ficheiros dentro deste directórios ou sub-directórios forem alterados +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified + The file does not contain a valid configuration: O ficheiro não contém uma configuração válida: The file was not processed by last synchronization! diff --git a/BUILD/Languages/portuguese_br.lng b/BUILD/Languages/portuguese_br.lng index 1ab38b28..9a8669b9 100644 --- a/BUILD/Languages/portuguese_br.lng +++ b/BUILD/Languages/portuguese_br.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) dia(s) hour(s) @@ -22,12 +18,24 @@ seg %x / %y objects deleted successfully %x / %y objetos apagados com sucesso +%x Byte +%x Byte +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories %x diretórios -%x files, -%x arquivos, +%x files +%x arquivos %x is not a valid FreeFileSync batch file! %x não é um arquivo batch válido do FreeFileSync! +%x kB +%x kB %x of %y rows in view %x de %y arquivos %x of 1 row in view @@ -90,6 +98,8 @@ C&riar um arquivo batch... &Alterar &Yes &Sim +(Build: %x) +(Versão: %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Note que apenas discos FAT/FAT32 são afetados por este problema!\nEm todos os outros casos pode-se desabilitar esta opção \"ignorar diferença de 1 hora\".) (Requires an Internet connection!) @@ -126,8 +136,8 @@ C&riar um arquivo batch... /seg 1 directory 1 diretório -1 file, -1 arquivo, +1 file +1 arquivo 1. &Compare 1. C&omparar 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ C&riar um arquivo batch... <Última Sessão> + + A newer version of FreeFileSync is available: @@ -196,8 +208,6 @@ Browse Procurar Browse directory Navegar pelo diretório -Build: -Criado: Cannot determine sync-direction: Não foi possível determinar a direção de sincronização: Cannot find %x @@ -259,11 +269,11 @@ Erro de conversão: Copy from left to right Copiar da esquerda para a direita Copy from left to right overwriting -Copiar da esquerda para a direita com sobreposição +Copiar da esquerda para a direita substituindo Copy from right to left Copiar da direita para a esquerda Copy from right to left overwriting -Copiar da direita para a esquerda com sobreposição +Copiar da direita para a esquerda substituindo Copy locked files Copiar arquivos bloqueados (em uso) Copy new or updated files to right folder. @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Copiar arquivos compartilhados ou bloqueados usando o Serviço de Cópias de Sombra de Volume Copy to clipboard\tCTRL+C Copiar para a Área de transferência\tCTRL+C +Copying Symbolic Link %x overwriting %y +Copiando Link Simbólico %x substituindo %y +Copying Symbolic Link %x to %y +Copiando Link Simbólico %x para %y +Copying file %x overwriting %y +Copiando arquivo %x substituindo %y Copying file %x to %y Copiando arquivo %x para %y -Copying file %x to %y overwriting target -Copiando arquivo %x para %y substituindo destino Could not determine volume name for file: Não foi possível determinar o nome do volume para o arquivo: Could not initialize directory monitoring: @@ -317,9 +331,11 @@ Apagar em ambos os lados Delete on both sides even if the file is selected on one side only Apagar em ambos os lados mesmo se o arquivo está selecionado só em um lado Delete or overwrite files permanently -Apagar ou sobrescrever arquivos permanentemente +Apagar ou substituir arquivos permanentemente Delete permanently Apagar permanentemente +Deleting Symbolic Link %x +Apagando Link Simbólico %x Deleting file %x Apagando arquivo %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Tratamento da exclusão Description Descrição +Direct +Direto Directories are dependent! Be careful when setting up synchronization rules: Diretórios são dependentes! Cuidado ao definir as regras de sincronização: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again Não mostrar esse diálogo novamente Do nothing Não fazer nada -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Quer mesmo apagar o(s) seguinte(s) item(s) ? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Quer mesmo mover o(s) seguinte(s) item(s) para a Lixeira? Do you want FreeFileSync to automatically check for updates every week? Deseja que o FreeFileSync procure automaticamente novas versões toda semana? @@ -484,6 +502,8 @@ Find what: Localizar o que: Folder Comparison and Synchronization Comparação e Sincronização de Pastas +Follow +Seguir Free disk space available: Espaço livre em disco: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Identificar e propagar mudanças em ambos os lados utilizando um banco de dados. Exclusões e conflitos serão detectados automaticamente. If you like FFS Se gosta do FFS +Ignore +Ignorar Ignore 1-hour file time difference Ignorar diferenças de 1 hora nos arquivos Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Ignorar erros subsequentes Include Incluir -Include Symbolic Links -Incluir Links Simbólicos Include all rows Incluir todas as linhas Include temporarily @@ -599,7 +619,7 @@ Diferenciar maiúsculas e minúsculas Mirror ->> Espelhar ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. -Espelhar pasta da esquerda: A pasta da direita vai ser sobreposta e será feita uma cópia exata da pasta da esquerda após a sincronização. +Espelhar pasta da esquerda: A pasta da direita vai ser substituída por uma cópia exata da pasta da esquerda após a sincronização. Monitoring active... Monitoramento ativo... More than 50% of the total number of files will be copied or deleted! @@ -612,10 +632,12 @@ Move files into a time-stamped subdirectory Mover arquivos para um subdiretório com carimbo de tempo Moving %x to Recycle Bin Movendo %x para a Lixeira +Moving Symbolic Link %x to user-defined directory %y +Movendo Link Simbólico %x para o diretório especificado %y Moving file %x to user-defined directory %y -Movendo arquivo %x para o diretório especificado +Movendo arquivo %x para o diretório especificado %y Moving folder %x to user-defined directory %y -Movendo pasta %x para o diretório especificado +Movendo pasta %x para o diretório especificado %y Multiple... Múltiplos... No change since last synchronization! @@ -682,8 +704,6 @@ Remove folder Remover pasta Remove folder pair Remover par de pastas -Renaming file %x to %y -Renomeando arquivo %x para %y Report translation error Reportar erro de tradução Reset @@ -776,6 +796,10 @@ Swap sides Inverter lados Switching to FreeFileSync GUI modus... Alterando para o modo GUI do FreeFileSync... +Symbolic Link handling +Tratamento de Links Simbólicos +Symlinks %x have the same date but a different target! +Links Simbólicos %x têm a mesma data mas um destino diferente! Synchronization Preview Pré-visualização da Sincronização Synchronization aborted! @@ -800,8 +824,8 @@ Target directory already existing! Diretório de destino já existe! Target file already existing! Arquivo de destino já existe! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -A linha de comando é executada cada vez que:\n- um diretório fica disponível (ex. é inserido um pendrive)\n- arquivos dentro desses diretórios ou subdiretórios são modificados +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +A linha de comando é executada cada vez que:\n- todos os diretórios ficam disponíveis (ex.: inserção de uma Pen Drive)\n- arquivos dentro desses diretórios ou subdiretórios são modificados The file does not contain a valid configuration: O arquivo não contém uma configuração válida: The file was not processed by last synchronization! diff --git a/BUILD/Languages/romanian.lng b/BUILD/Languages/romanian.lng index b81e6824..aaab97ce 100644 --- a/BUILD/Languages/romanian.lng +++ b/BUILD/Languages/romanian.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) zile hour(s) @@ -22,12 +18,24 @@ sec %x / %y objects deleted successfully %x / %y obiecte șterse cu succes +%x Byte +%x Baiți +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories %x dosare -%x files, -%x fișiere, +%x files +%x file %x is not a valid FreeFileSync batch file! -%x nu este un fișier lot FreeFileSync valid ! +%x nu este o filă lot FreeFileSync validă ! +%x kB +%x KB %x of %y rows in view %x din %y rînduri afișate %x of 1 row in view @@ -53,9 +61,9 @@ &Exit &Ieși &Export file list... -&Exportă Lista de Fișiere... +&Exportă Lista de File... &File -&Fișier +&Filă &Find next &Găsește Următorul &Global settings... @@ -71,7 +79,7 @@ &Load configuration... &Deschide Configurația... &New -&Nou +&Nouă &No &Nu &OK @@ -90,8 +98,10 @@ &Comută &Yes &Da +(Build: %x) +(Compilarea: %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) -(Doar dispozitivele FAT/FAT32 sînt afectate de această problemă!\nÎn celelalte cazuri, puteți dezactiva setarea \"ignoră diferența de 1-oră\".) +(Doar dispozitivele FAT/FAT32 sînt afectate de această problemă!\nÎn celelalte cazuri, poți dezactiva setarea \"ignoră diferența de 1-oră\".) (Requires an Internet connection!) (Necesită o conexiune la internet!) - Other side's counterpart to %dir @@ -113,7 +123,7 @@ - exists right only - există doar în dreapta - full file or directory name -- numele complet al fișierului sau dosarului +- numele complet al filei sau dosarului - left - stînga - left newer @@ -126,30 +136,32 @@ /sec 1 directory 1 dosar -1 file, -1 fișier, +1 file +1 filă 1. &Compare 1. &Compară 1. Enter relative file or directory names separated by ';' or a new line. -1. Introduceți numele relative ale fișierelor sau dosarelor, separate de semnul ';' sau de un rînd nou. +1. Scrie numele relative ale filelor sau dosarelor, separate de semnul ';' sau de un rînd nou. 1. Select directories to monitor. -1. Selectați dosarele de monitorizat. +1. Selectează dosarele de monitorizat. 2. &Synchronize... 2. &Sincronizează... 2. Enter a command line. -2. Introduceți calea. +2. Scrie calea. 2. Use wildcard characters '*' and '?'. -2. Folosiți metacaracterele '*' și '?' (asterisc și semn de întrebare). +2. Folosește metacaracterele '*' și '?' (asterisc și semn de întrebare). 3. Exclude files directly on main grid via context menu. -3. Excludeți fișierele și dosarele direct de pe grila principală cu ajutorul meniului contextual. +3. Exclude filele și dosarele direct de pe grila principală, cu ajutorul meniului contextual. 3. Press 'Start'. -3. Apăsați 'Start'. +3. Apasă 'Pornește'. + + A newer version of FreeFileSync is available: @@ -173,19 +185,19 @@ Toate dosarele au fost sincronizate! An exception occured! A apărut o excepție ! As a result the files are separated into the following categories: -În concluzie, fișierele sînt repartizate în categoriile următoare: +În concluzie, filele sînt repartizate în categoriile următoare: As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Așa cum sugerează și numele, două fișiere cu același nume sînt considerate identice dacă și numai dacă este identic și conținutul lor. Această opțiune este utilă mai degrabă pentru verificările de consecvență decît pentru operațiunile de salvgardare [backup]. Așa că timpurile fișierelor (data și ora) nu sînt luate deloc în considerare.\n\nCu această opțiune activată, arborele de decizie e mai simplu: +Așa cum sugerează și numele, două file cu același nume sînt considerate identice dacă și numai dacă este identic și conținutul lor. Această opțiune este utilă mai degrabă pentru verificările de consecvență decît pentru operațiunile de salvgardare [backup]. Așa că timpurile filelor (data și ora) nu sînt luate deloc în considerare.\n\nCu această opțiune activată, arborele de decizie e mai simplu: Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe . This can also be scheduled in your operating system's task planner. -Se poate crea un fișier cu un lot de comenzi [batch file] pentru sincronizarea inteligentă. Pentru a porni în modul lot, indicați astfel numele fișierului lot pentru prelucrarea sa de către executabilul FreeFileSync: freefilesync.exe . Această operațiune poate fi programată în planificatorul de sarcini al sistemului de operare [task scheduler]. +Se poate crea o filă cu un lot de comenzi [batch file] pentru sincronizarea inteligentă. Pentru a porni în modul lot, precizează astfel numele filei lot pentru prelucrarea sa de către executabilul FreeFileSync: freefilesync.exe . Această operațiune poate fi programată în planificatorul de sarcini al sistemului de operare [task scheduler]. At least one directory input field is empty. Cel puțin un cîmp de introducere a dosarului este gol. Auto-adjust columns Autoajustează Coloanele Batch execution -Execută Fișierul Lot +Execută Fila Lot Batch file created successfully! -Fișierul cu lotul de comenzi a fost creat cu succces ! +Fila cu lotul de comenzi a fost creată cu succces ! Batch job Sarcină Lot Big thanks for localizing FreeFileSync goes out to: @@ -196,8 +208,6 @@ Browse Explorează Browse directory Explorează Dosarul -Build: -Compilat la: Cannot determine sync-direction: Nu se poate determina sensul de sincronizare: Cannot find %x @@ -217,17 +227,17 @@ Compară Compare both sides Compară Părțile Stîngă și Dreaptă Compare by \"File content\" -Compară după \"Conținutul Fișierelor\" +Compară după \"Conținutul Filelor\" Compare by \"File size and date\" -Compară după \"Data și Mărimea Fișierelor\" +Compară după \"Data și Mărimea Filelor\" Compare by... Compară după: Comparing content of files %x -Compar conținutul fișierelor %x +Compar conținutul filelor %x Comparing content... Compar conținutul... Comparing files by content failed. -Compararea fișierelor după conținut a eșuat. +Compararea filelor după conținut a eșuat. Comparison Result Rezultatul Comparării Comparison settings @@ -265,23 +275,27 @@ Copiază de la Dreapta la Stînga Copy from right to left overwriting Copiază de la Dreapta la Stînga cu Suprascriere Copy locked files -Copiază fișierele zăvorîte [locked] +Copiază filele zăvorîte [locked] Copy new or updated files to right folder. -Copiere în dosarul din dreapta a fișierelor actualizate sau noi. +Copiază în dosarul din dreapta filele actualizate sau noi. Copy shared or locked files using Volume Shadow Copy Service -Copiază fișierele partajate sau zăvorîte folosind serviciul de salvgardare din Windows +Copiază filele partajate sau zăvorîte folosind serviciul de salvgardare din Windows Copy to clipboard\tCTRL+C Copiază în Cliplanșetă\tCTRL+C +Copying Symbolic Link %x overwriting %y +Copiez legătura simbolică %x și suprascriu %y +Copying Symbolic Link %x to %y +Copiez legătura simbolică %x în %y +Copying file %x overwriting %y +Copiez fila %x și suprascriu %y Copying file %x to %y -Copiez fișierul %x în %y -Copying file %x to %y overwriting target -Copiez fișierul %x în %y cu suprascrierea țintei +Copiez fila %x în %y Could not determine volume name for file: -Nu pot determina numele volumului pentru fișierul: +Nu pot determina numele volumului pentru fila: Could not initialize directory monitoring: Nu pot inițializa monitorizarea dosarelor: Could not load a required DLL: -Nu pot încărca un fișier DLL necesar: +Nu pot încărca o filă DLL necesară: Could not read values for the following XML nodes: Nu pot citi valorile pentru următoarele noduri XML: Create a batch job @@ -299,7 +313,7 @@ Clic-Dreapta DECISION TREE ARBORE DECIZIONAL Data verification error: Source and target file have different content! -Eroare la verificarea datelor: Fișierele sursă și țintă au conținut diferit! +Eroare la verificarea datelor: Filele sursă și țintă au conținut diferit! Date Dată Delay @@ -311,23 +325,27 @@ Delete files/folders existing on left side only Delete files/folders existing on right side only Șterge Itemul din Dreapta Delete files\tDEL -Șterge Fișierele\tDEL +Șterge Filele\tDEL Delete on both sides Șterge din ambele părți Delete on both sides even if the file is selected on one side only -Șterge din ameble părți, chiar dacă fișierul e selecționat într-o singură parte +Șterge din ambele părți, chiar dacă fila e selecționată într-o singură parte Delete or overwrite files permanently -Fișierele sînt șterse sau suprascrise în mod definitiv +Filele sînt șterse sau suprascrise în mod definitiv Delete permanently Șterge definitiv +Deleting Symbolic Link %x +Șterg legătura simbolică %x Deleting file %x -Șterg fișierul %x +Șterg fila %x Deleting folder %x Șterg dosarul %x Deletion handling Gestionarea Ștergerii Description Descriere +Direct +Direcționează Directories are dependent! Be careful when setting up synchronization rules: Dosarele sînt interdependente! Atenție la setarea regulilor de sincronizare: Directories to watch @@ -340,24 +358,24 @@ Do not show this dialog again Nu afișa acest dialog din nou Do nothing Nici o Acțiune -Do you really want to delete the following objects(s)? -Sigur doriți să ștergeți următoarele elemente ? -Do you really want to move the following objects(s) to the Recycle Bin? -Sigur doriți să mutați în Reciclator următoarele elemente ? +Do you really want to delete the following object(s)? +Sigur dorești să ștergi elementele următoare ? +Do you really want to move the following object(s) to the Recycle Bin? +Sigur dorești să muți în Reciclator elementele următoare ? Do you want FreeFileSync to automatically check for updates every week? -Doriți ca FreeFileSync să caute automat actualizări în fiecare săptămînă ? +Dorești ca FreeFileSync să caute automat actualizări în fiecare săptămînă ? Donate with PayPal -Donați prin PayPal +Donează prin PayPal Download now? Descarc acum ? Drag && drop -Trageți un dosar peste compartiment sau folosiți butonul Explorează +Trage un dosar peste compartiment sau folosește butonul Explorează Elements found: -Elemente găsite: +Elemente Găsite: Elements processed: -Elemente procesate: +Elemente Procesate: Elements remaining: -Elemente rămase: +Elemente Rămase: Email E-mail Endless loop when traversing directory: @@ -367,9 +385,9 @@ Eroare Error changing modification time: Eroare la schimbarea datei de modificare: Error copying file: -Eroare la copierea fișierului: +Eroare la copierea filei: Error copying locked file %x! -Eroare la copierea fișierului zăvorît %x! +Eroare la copierea filei zăvorîte %x! Error copying symbolic link: Eroare la copierea legăturii simbolice: Error creating directory: @@ -377,7 +395,7 @@ Eroare la crearea dosarului: Error deleting directory: Eroare la ștergerea dosarului: Error deleting file: -Eroare la ștergerea fișierului: +Eroare la ștergerea filei: Error handling Gestionarea Erorilor Error loading library function: @@ -385,17 +403,17 @@ Eroare la încărcarea bibliotecii de funcții: Error moving directory: Eroare la mutarea dosarului: Error moving file: -Eroare la mutarea fișierului: +Eroare la mutarea filei: Error moving to Recycle Bin: Eroare la mutarea în Reciclator: Error opening file: -Eroare la deschiderea fișierului: +Eroare la deschiderea filei: Error parsing configuration file: -Eroare la parsarea fișierului de configurare: +Eroare la parsarea filei de configurare: Error reading file attributes: -Eroare la citirea atributelor fișierului: +Eroare la citirea atributelor filei: Error reading file: -Eroare la citirea fișierului: +Eroare la citirea filei: Error reading from synchronization database: Eroare la citirea din baza de date a sincronizării: Error resolving symbolic link: @@ -407,9 +425,9 @@ Eroare la parcurgerea dosarului: Error when monitoring directories. Eroare la monitorizarea dosarelor. Error writing file attributes: -Eroare la scrierea atributelor fișierului: +Eroare la scrierea atributelor filei: Error writing file: -Eroare la scrierea fișierului: +Eroare la scrierea filei: Error writing to synchronization database: Eroare la scrierea în baza de date a sincronizării: Example @@ -433,41 +451,41 @@ Eroare Fatală Feedback and suggestions are welcome at: Opiniile și sugestiile sînt binevenite: File %x has an invalid date! -Fișierul %x are o dată nevalidă ! +Fila %x are o dată nevalidă ! File already exists. Overwrite? -Fișierul există deja. Doriți să-l suprascrieți? +Fila există deja. Dorești s-o suprascrii? File content -Conținutul Fișierului +Conținutul Filei File does not exist: -Fișierul nu există: +Fila nu există: File list exported! -Lista de fișiere a fost exportată! +Lista de file a fost exportată! File size and date -Mărimea și Data Fișierului +Mărimea și Data Filei Filename -Numele Fișierului +Numele Filei Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to decide which one is newer due to Daylight Saving Time issues. -Fișierele %x au o diferență de dată mai mică de 1 oră!\n\nNu este clar care e mai nou, din cauza problemelor cauzate de ora de vară. +Filele %x au o diferență de dată mai mică de 1 oră!\n\nNu este clar care e mai nouă, din cauza problemelor cauzate de ora de vară. Files %x have the same date but a different size! -Fișierele %x au aceeași dată, dar mărime diferită! +Filele %x au aceeași dată, dar mărime diferită! Files are found equal if\n - file content\nis the same -Fișierele sînt considerate identice dacă\n - conținutul\neste identic +Filele sînt considerate identice dacă\n - conținutul\neste identic Files are found equal if\n - filesize\n - last write time and date\nare the same -Fișierele sînt considerate identice dacă\n - mărimea\n - și data ultimei modificări\nsînt identice +Filele sînt considerate identice dacă\n - mărimea\n - și data ultimei modificări\nsînt identice Files that are equal on both sides -Fișiere identice în ambele părți +File identice în ambele părți Files that exist on both sides, left one is newer -Fișiere care există în ambele părți, cel din stînga fiind mai nou +File care există în ambele părți, cea din stînga fiind mai nouă Files that exist on both sides, right one is newer -Fișiere care există în ambele părți, cel din dreapta fiind mai nou +File care există în ambele părți, cea din dreapta fiind mai nouă Files that have different content -Fișiere care au conținut diferit +File care au conținut diferit Files/folders that exist on left side only -Fișiere sau dosare care există doar în partea stîngă +File sau dosare care există doar în partea stîngă Files/folders that exist on right side only -Fișiere sau dosare care există doar în partea dreaptă +File sau dosare care există doar în partea dreaptă Filter files -Filtrează Fișierele +Filtru de File Filter is active Filtrul este activ Filter settings have changed! @@ -484,24 +502,26 @@ Find what: Găsește Asta: Folder Comparison and Synchronization Comparare și Sincronizare de Dosare +Follow +Urmărește Free disk space available: Spațiu de stocare disponibil: FreeFileSync Batch Job -FreeFileSync Sarcină cu Lot de Comenzi +Sarcină cu lot de comenzi FreeFileSync FreeFileSync at Sourceforge FreeFileSync la Sourceforge FreeFileSync batch file -FreeFileSync fișier cu lot de comenzi +Filă cu lot de comenzi FreeFileSync FreeFileSync configuration -FreeFileSync configurație +Configurație FreeFileSync FreeFileSync is up to date! -Aveți deja ultima versiune a softului! +Ai deja ultima versiune a softului! Full path Cale completă Generating database... Generez baza de date... Generating file list... -Generez lista de fișiere... +Generez lista de file... Global settings Setări Globale Help @@ -515,33 +535,33 @@ Ascunde conflictele Hide excluded items Ascunde itemurile excluse Hide files that are different -Ascunde fișierele care sînt diferite +Ascunde filele care sînt diferite Hide files that are equal -Ascunde fișierele care sînt identice +Ascunde filele care sînt identice Hide files that are newer on left -Ascunde fișierele care sînt mai noi în stînga +Ascunde filele care sînt mai noi în stînga Hide files that are newer on right -Ascunde fișierele care sînt mai noi în dreapta +Ascunde filele care sînt mai noi în dreapta Hide files that exist on left side only -Ascunde fișierele care există doar în stînga +Ascunde filele care există doar în stînga Hide files that exist on right side only -Ascunde fișierele care există doar în dreapta +Ascunde filele care există doar în dreapta Hide files that will be created on the left side -Ascunde fișierele care vor fi create în stînga +Ascunde filele care vor fi create în stînga Hide files that will be created on the right side -Ascunde fișierele care vor fi create în dreapta +Ascunde filele care vor fi create în dreapta Hide files that will be deleted on the left side -Ascunde fișierele care vor fi șterse în stînga +Ascunde filele care vor fi șterse în stînga Hide files that will be deleted on the right side -Ascunde fișierele care vor fi șterse în dreapta +Ascunde filele care vor fi șterse în dreapta Hide files that will be overwritten on left side -Ascunde fișierele care vor fi suprascrise în stînga +Ascunde filele care vor fi suprascrise în stînga Hide files that will be overwritten on right side -Ascunde fișierele care vor fi suprascrise în dreapta +Ascunde filele care vor fi suprascrise în dreapta Hide files that won't be copied -Ascunde fișierele care nu vor fi copiate +Ascunde filele care nu vor fi copiate Hide filtered or temporarily excluded files -Ascunde fișierele filtrate sau excluse temporar +Ascunde filele filtrate sau excluse temporar Hide further error messages during the current process Ascunde mesajele de eroare apărute ulterior în timpul acestui proces Hints: @@ -552,16 +572,16 @@ Identify and propagate changes on both sides using a database. Deletions and con Identifică și propagă modificările în ambele părți folosind o bază de date. Ștergerile și conflictele sînt detectate automat. If you like FFS Donare pentru FFS +Ignore +Ignoră Ignore 1-hour file time difference -Ignoră diferențele de 1 oră ale timpurilor fișierelor +Ignoră diferențele de 1 oră ale timpurilor filelor Ignore errors Ignoră erorile Ignore subsequent errors Ignoră (nu lua în seamă) erorile ulterioare Include Incluse -Include Symbolic Links -Include Legăturile Simbolice Include all rows Include Toate Rîndurile Include temporarily @@ -585,35 +605,37 @@ Stînga Legend Legendă Load configuration from file -Încarcă configurația dintr-un fișier +Încarcă configurația dintr-o filă Load configuration history (press DEL to delete items) -Încarcă istoricul configurației (apăsați tasta DEL pentru a șterge itemuri) +Încarcă istoricul configurației (apasă tasta DEL pentru a șterge itemuri) Log-messages: Mesaje de jurnalizare: Logging Jurnalizez Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Realizarea de copii de rezervă prin sistemul WOW64 nu este suportată. Folosiți versiunea pe 64-biți a FreeFileSync. +Realizarea de copii de rezervă prin sistemul WOW64 nu este suportată. Folosește versiunea pe 64-biți a FreeFileSync. Match case Potrivește MAJ/min Mirror ->> Clonare =>> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. -Salvgardare [backup] prin clonare a dosarului stîng: dosarul din dreapta va fi suprascris și va fi identic după sincronizare cu dosarul din stînga. +Salvgardează [backup] prin clonare dosarul stîng: dosarul din dreapta va fi suprascris și va fi identic după sincronizare cu dosarul din stînga. Monitoring active... Monitorizare activă... More than 50% of the total number of files will be copied or deleted! -Peste 50% din numărul total de fișiere vor fi copiate sau distruse! +Peste 50% din numărul total de file vor fi copiate sau distruse! Move column down Mută coloana în jos Move column up Mută coloana în sus Move files into a time-stamped subdirectory -Mută fișierele într-un subdosar cu marcaj de timp +Mută filele într-un subdosar cu marcaj de timp Moving %x to Recycle Bin Mut %x în Reciclator +Moving Symbolic Link %x to user-defined directory %y +Mut legătura simbolică %x în dosarul ales de utilizator %y Moving file %x to user-defined directory %y -Mut fișierul %x în dosarul %y ales de utilizator +Mut fila %x în dosarul %y ales de utilizator Moving folder %x to user-defined directory %y Mut dosarul %x în dosarul %y ales de utilizator Multiple... @@ -627,17 +649,17 @@ Spațiu de stocare insuficient pe: Nothing to synchronize according to configuration! Nu este nimic de sincronizat conform configurației! Number of files and directories that will be created -Numărul de fișiere și dosare care vor fi create +Numărul de file și dosare care vor fi create Number of files and directories that will be deleted -Numărul de fișiere și dosare care vor fi șterse +Numărul de file și dosare care vor fi șterse Number of files that will be overwritten -Numărul de fișiere care vor fi suprascrise +Numărul de file care vor fi suprascrise One of the FreeFileSync database entries within the following file is not yet existing: -Una dintre intrările în baza de date FreeFileSync din fișierul următor nu există: +Una dintre intrările în baza de date FreeFileSync din fila următoare nu există: One of the FreeFileSync database files is not yet existing: -Una dintre părți nu are un fișier de tip bază de date FreeFileSync: +Una dintre părți nu are o filă de tip bază de date FreeFileSync: Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Doar fișierele sau dosarele care trec de filtru vor fi selecționate pentru sincronizare. Filtrul va fi aplicat la numele elementelor aflate ierarhic sub dosarul de sincronizat. +Doar filele sau dosarele care trec de filtru vor fi selecționate pentru sincronizare. Filtrul va fi aplicat la numele elementelor aflate ierarhic sub dosarul de sincronizat. Open with Explorer Deschide în Windows Explorer Open with default application @@ -653,11 +675,11 @@ Pauză Paused Pauzat Planned directory deletion is in conflict with its subdirectories and -files! -Ștergerea plănuită a dosarului intră în conflict cu subdosarele și fișierele sale! +Ștergerea plănuită a dosarului intră în conflict cu subdosarele și filele sale! Please run a Compare first before synchronizing! -Rulați compararea înainte de a sincroniza! +Rulează compararea înainte de a sincroniza! Press \"Switch\" to open FreeFileSync GUI modus. -Apăsați \"Comută\" pentru a deschide modul grafic al FreeFileSync +Apasă \"Comută\" pentru a deschide modul grafic al FreeFileSync Processing folder pair: Procesez perechea de dosare: Published under the GNU General Public License: @@ -667,7 +689,7 @@ Question Quit Ieși Re-enable all hidden dialogs? -Reactivați casetele de dialog ascunse? +Reactivezi casetele de dialog ascunse? RealtimeSync - Automated Synchronization RealtimeSync - Sincronizare Inteligentă RealtimeSync configuration @@ -682,8 +704,6 @@ Remove folder Înlătură Dosarul Remove folder pair Înlătură Perechea de Dosare -Renaming file %x to %y -Redenumesc fișierul %x în %y Report translation error Raportarea erorilor de traducere Reset @@ -697,53 +717,53 @@ S&alvează Configurația... S&witch view Schimbă &Vederea Save changes to current configuration? -Doriți să salvați modificările configurației curente? +Dorești să salvezi modificările configurației curente? Save current configuration to file -Salvează într-un fișier modificările configurației curente +Salvează într-o filă modificările configurației curente Scanning... Scanez... Scanning: Scanez: Select a folder -Selectați un dosar +Selectează un dosar Select alternate synchronization settings -Selectați o altă configurație a sincronizării +Selectează o altă configurație a sincronizării Select logfile directory: -Selectați un dosar pentru fișierul .log: +Selectează un dosar pentru fila .log: Select variant: -Selectați Varianta de Sincronizare: +Selectează Varianta de Sincronizare: Set direction: -Setează Acțiunea ca în Iconița Alăturată: +Setează Acțiunea ca în Icoana Alăturată: Setting default synchronization directions: Old files will be overwritten with newer files. -Va fi setat sensul implicit de sincronizare: Fișierele vechi vor fi suprascrise de cele noi. +Va fi setat sensul implicit de sincronizare: Filele vechi vor fi suprascrise de cele noi. Show conflicts Arată conflictele Show files that are different -Arată fișierele diferite +Arată filele diferite Show files that are equal -Arată fișierele identice +Arată filele identice Show files that are newer on left -Arată fișierele din stînga mai noi decît cele din dreapta +Arată filele din stînga mai noi decît cele din dreapta Show files that are newer on right -Arată fișierele din dreapta mai noi decît cele din stînga +Arată filele din dreapta mai noi decît cele din stînga Show files that exist on left side only -Arată fișierele care există doar în stînga +Arată filele care există doar în stînga Show files that exist on right side only -Arată fișierele care există doar în dreapta +Arată filele care există doar în dreapta Show files that will be created on the left side -Arată fișierele care vor fi create în stînga +Arată filele care vor fi create în stînga Show files that will be created on the right side -Arată fișierele care vor fi create în dreapta +Arată filele care vor fi create în dreapta Show files that will be deleted on the left side -Arată fișierele care vor fi șterse în stînga +Arată filele care vor fi șterse în stînga Show files that will be deleted on the right side -Arată fișierele care vor fi șterse în dreapta +Arată filele care vor fi șterse în dreapta Show files that will be overwritten on left side -Arată fișierele care vor fi suprascrise în stînga +Arată filele care vor fi suprascrise în stînga Show files that will be overwritten on right side -Arată fișierele care vor fi suprascrise în dreapta +Arată filele care vor fi suprascrise în dreapta Show files that won't be copied -Arată fișierele care nu vor fi copiate +Arată filele care nu vor fi copiate Show hidden dialogs Arată casetele de dialog ascunse Show popup @@ -776,6 +796,10 @@ Swap sides Schimbă părțile între ele Switching to FreeFileSync GUI modus... Comut la modul grafic al FreeFileSync... +Symbolic Link handling +Prelucrarea Legăturilor Simbolice (Simlegături) +Symlinks %x have the same date but a different target! +Simlegăturile %x au aceeași dată, dar ținte diferite! Synchronization Preview Previzionarea Sincronizării Synchronization aborted! @@ -789,7 +813,7 @@ Setările Sincronizării Synchronization status Starea Sincronizării Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Sincronizează fișierele .doc, .zip și .exe, cu excepția celor din dosarul \"temp\". +Sincronizează filele .doc, .zip și .exe, cu excepția celor din dosarul \"temp\". Synchronize... Sincronizează Synchronizing... @@ -799,15 +823,15 @@ Memoria sistemului a fost epuizată! Target directory already existing! Dosarul țintă există deja! Target file already existing! -Fișierul țintă există deja! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Linia de comandă este executată de fiecare dată cînd:\n- un dosar devine disponibil (de ex. se introduce un dispozitiv USB)\n- fișierele conținute în aceste dosare sau subdosare sînt modificate +Fila țintă există deja! +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +Linia de comandă este executată de fiecare dată cînd:\n- toate dosarele devin disponibile (de ex. se introduce un dispozitiv USB)\n- filele conținute în aceste dosare sau subdosare sînt modificate The file does not contain a valid configuration: -Fișierul nu conține o configurație validă: +Fila nu conține o configurație validă: The file was not processed by last synchronization! -Fișierul nu a fost procesat la ultima sincronizare! +Fila nu a fost procesată la ultima sincronizare! This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Această variantă definește două fișiere cu același nume ca fiind identice atunci cînd au aceeași mărime ȘI aceeași dată și oră a ultimei modificări. +Această variantă definește două file cu același nume ca fiind identice atunci cînd au aceeași mărime ȘI aceeași dată și oră a ultimei modificări. Time Oră Time elapsed: @@ -821,11 +845,11 @@ Spațiu de stocare necesar: Total time: Timp Total: Treat file times that differ by exactly +/- 1 hour as equal, less than 1 hour as conflict in order to handle Daylight Saving Time changes -Tratează ca egale timpurile fișierelor care diferă exact cu +/- 1 oră, iar cele care diferă cu mai puțin de 1 oră, ca niște conflicte generate de gestionarea orei de vară +Tratează ca egale timpurile filelor care diferă exact cu +/- 1 oră, iar cele care diferă cu mai puțin de 1 oră, ca niște conflicte generate de gestionarea orei de vară Unable to connect to sourceforge.net! Conectarea la situl sourceforge.net nu poate fi realizată! Unable to create logfile! -Fișierul jurnal nu poate fi creat! +Fila jurnal nu poate fi creată! Unresolved conflicts existing! Există conflicte nerezolvate! Update -> @@ -835,7 +859,7 @@ Utilizare: Use Recycle Bin Mută în reciclator Use Recycle Bin when deleting or overwriting files -Se folosește Reciclatorul [Recycle Bin] cu ocazia ștergerii sau suprascrierii unui fișier +Se folosește Reciclatorul [Recycle Bin] cu ocazia ștergerii sau suprascrierii unei file User-defined directory Mută într-un dosar personalizat User-defined directory for deletion was not specified! @@ -843,9 +867,9 @@ Dosarul ales de utilizator pentru ștergere nu a fost specificat ! Variant Varianta Sincronizării Verifying file %x -Verific fișierul %x +Verific fila %x Volume name %x not part of filename %y! -Numele volumului %x nu face parte din numele fișierului %y ! +Numele volumului %x nu face parte din numele filei %y ! Waiting for all directories to become available... Aștept ca toate dosarele să devină disponibile... Warning @@ -855,14 +879,14 @@ Atenție: Sincronizarea a eșuat pentru %x itemuri: When the comparison is started with this option set the following decision tree is processed: Cînd compararea este pornită cu acest set de opțiuni, este executat următorul arbore de decizie: You can ignore conflicts and continue synchronization. -Puteți ignora conflictele pentru a continua cu sincronizarea. +Poți ignora conflictele pentru a continua cu sincronizarea. You can ignore the error to consider not existing directories as empty. -Puteți ignora eroarea care consideră că un dosar inexistent este gol. +Poți ignora eroarea care consideră că un dosar inexistent este gol. You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Puteți încerca să sincronizați din nou itemurile rămase (FĂRĂ să trebuiască să le recomparați) ! +Poți încerca să sincronizezi din nou itemurile rămase (FĂRĂ a le recompara) ! different -fișiere diferite +file diferite file exists on both sides -fișierul există în ambele părți +fila există în ambele părți on one side only -fișierul există doar într-o parte +fila există doar într-o parte diff --git a/BUILD/Languages/russian.lng b/BUILD/Languages/russian.lng index aab58510..030df988 100644 --- a/BUILD/Languages/russian.lng +++ b/BUILD/Languages/russian.lng @@ -6,10 +6,6 @@ ГБ MB МБ - PB - ПБ - TB - ТБ day(s) день(ей) hour(s) @@ -22,12 +18,24 @@ сек. %x / %y objects deleted successfully %x / %y объектов удалено удачно +%x Byte + +%x GB + +%x MB + +%x PB + +%x TB + %x directories %x папки -%x files, -%x файл(ов), +%x files +%x файл(ов) %x is not a valid FreeFileSync batch file! %x не корректный файл пакетного задания FreeFileSync! +%x kB + %x of %y rows in view %x из %y строк(и) показано %x of 1 row in view @@ -90,6 +98,8 @@ &Yes &Да +(Build: %x) + (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Помните, что только диски FAT/FAT32 страдают от этой проблемы!\nВо всех остальных случаях вы можете отключить параметр \"игнорировать 1-часовую разницу\".) (Requires an Internet connection!) @@ -126,8 +136,8 @@ /сек. 1 directory 1 папка -1 file, -1 файл, +1 file +1 файл 1. &Compare 1. &Сравнить 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ <Папка> <Последняя сессия> + + <групповое выделение> A newer version of FreeFileSync is available: @@ -196,8 +208,6 @@ Browse Обзор Browse directory -Build: -Сборка: Cannot determine sync-direction: Невозможно определить направление синхронизации: Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Копировать общие или заблокированные файлы с помощью Службы Теневого Копирования Тома Copy to clipboard\tCTRL+C Копировать в буфер обмена\tCTRL+C +Copying Symbolic Link %x overwriting %y + +Copying Symbolic Link %x to %y + +Copying file %x overwriting %y + Copying file %x to %y Копирование файла %x в %y -Copying file %x to %y overwriting target -Копирование файла %x в %y с заменой Could not determine volume name for file: Не удалось определить название тома для файла: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently Удалять или перезаписать файлы, не помещая в "Корзину" Delete permanently Удалять, не помещая в "Корзину" +Deleting Symbolic Link %x + Deleting file %x Удаление файла %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Настройки удаления Description Описание +Direct + Directories are dependent! Be careful when setting up synchronization rules: Зависимые папки! Будьте внимательны при настройке правил синхронизации: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again Больше не показывать это окно Do nothing Ничего не делать -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Вы действительно хотите удалить следующие объекты? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Вы действительно хотите отправить следующие объекты в "Корзину"? Do you want FreeFileSync to automatically check for updates every week? Вы хотите, чтобы FreeFileSync автоматически проверял наличие обновлений каждую неделю? @@ -484,6 +502,8 @@ Find what: Найти: Folder Comparison and Synchronization Сравнение и синхронизация +Follow + Free disk space available: Доступно свободного места на диске: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Выявление и распространение изменений на обеих сторонах с использованием базы данных. Удаленные файлы и конфликты определяются автоматически. If you like FFS Если Вам понравился FFS +Ignore + Ignore 1-hour file time difference Игнорировать 1-часовую разницу во времени Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Игнорировать последующие ошибки Include Включить -Include Symbolic Links - Include all rows Отметить все Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory Переместить файлы во временно-отмеченную подпапку Moving %x to Recycle Bin Отправка %x в "Корзину" +Moving Symbolic Link %x to user-defined directory %y + Moving file %x to user-defined directory %y Перемещение файла %x в заданную пользователем папку %y Moving folder %x to user-defined directory %y @@ -682,8 +704,6 @@ Remove folder Удалить папку Remove folder pair Удалить пару папок -Renaming file %x to %y -Переименование файла %x в %y Report translation error Сообщить об ошибке перевода Reset @@ -776,6 +796,10 @@ Swap sides Поменять направление Switching to FreeFileSync GUI modus... +Symbolic Link handling + +Symlinks %x have the same date but a different target! + Synchronization Preview Предпросмотр синхронизации Synchronization aborted! @@ -800,8 +824,8 @@ Target directory already existing! Конечная папка уже существует! Target file already existing! Конечный файл уже существует! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Командная строка выполняется, если:\n- папка становится доступной (например, при подключении USB флеш-накопителя);\n- файлы в обозначенных папках или подпапках были изменены. +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified + The file does not contain a valid configuration: Файл не содержит действительную конфигурацию: The file was not processed by last synchronization! diff --git a/BUILD/Languages/slovenian.lng b/BUILD/Languages/slovenian.lng index f959623b..7dce6bf4 100644 --- a/BUILD/Languages/slovenian.lng +++ b/BUILD/Languages/slovenian.lng @@ -1,15 +1,11 @@ MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE MinGW \t- Windows port od GNU Compiler Collection\n wxWidgets \t- Open-Source GUI ogrodje\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE Byte - Byte + Bajt GB GB MB MB - PB - PB - TB - TB day(s) dni hour(s) @@ -22,12 +18,24 @@ sek %x / %y objects deleted successfully %x / %y objektov uspešno izbrisanih +%x Byte +%x Bajt +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories %x imeniki -%x files, -%x datoteke, +%x files +%x datoteke %x is not a valid FreeFileSync batch file! %x ni veljavna FreeFileSync batch datoteka! +%x kB +%x kB %x of %y rows in view %x od %y vrstic prikazanih %x of 1 row in view @@ -90,6 +98,8 @@ Na&loži konfiguracijo... &Zamenjaj &Yes &Da +(Build: %x) +(Izgradnja: %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Vedite, da samo na pogonih s FAT/FAT32 lahko pride do teh težav!\nV vseh drugih primerih lahko onemogočite nastavitev \"prezri 1-urno razliko\".) (Requires an Internet connection!) @@ -126,8 +136,8 @@ Duplikat z druge strani od %name /sek 1 directory 1 imenik -1 file, -1 datoteka, +1 file +1 datoteka 1. &Compare 1. &Primerjaj 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ Duplikat z druge strani od %name + + A newer version of FreeFileSync is available: @@ -157,7 +169,7 @@ Na voljo je nova različica FreeFileSync: Abort requested: Waiting for current operation to finish... Zahtevana je bila prekinitev: čakam, da se zaključi trenutna operacija... Abort synchronization immediately -Takoj prekimi sinhronizacijo +Takoj prekini sinhronizacijo Aborted Prekinitev uspela About @@ -196,8 +208,6 @@ Browse Brskaj Browse directory Brskaj po imeniku -Build: -Izgradnja: Cannot determine sync-direction: Ne morem določiti sinhronizacijske smeri. Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Kopiraj deljene ali zaklenjene datoteke z uporabo servisa Volume Shadow Copy Copy to clipboard\tCTRL+C Kopiraj v odložišče\tCTRL+C +Copying Symbolic Link %x overwriting %y +Kopiram simbolično povezavo %x s prepisovanjem %y +Copying Symbolic Link %x to %y +Kopiram simbolično povezavo %x v %y +Copying file %x overwriting %y +Kopiram datoteko %x s prepisovanjem %y Copying file %x to %y Kopiram datoteko %x v %y -Copying file %x to %y overwriting target -Kopiram datoteko %x v %y s prepisovanjem cilja Could not determine volume name for file: Ne morem določiti imena volumna za datoteko: Could not initialize directory monitoring: @@ -299,7 +313,7 @@ D-Klik DECISION TREE DREVO ODLOČITEV Data verification error: Source and target file have different content! -Napaka pri preverjanju podatkov: izvorna in tarčna datoteka imata različno vsebino! +Napaka pri preverjanju podatkov: izvorna in ciljna datoteka imata različno vsebino! Date Datum Delay @@ -320,14 +334,18 @@ Delete or overwrite files permanently Trajno izbriši ali prepiši datoteke Delete permanently Trajno izbriši +Deleting Symbolic Link %x +Brisanje simbolične povezave %x Deleting file %x Brisanje datoteke %x Deleting folder %x Brisanje mape %x Deletion handling -Postopanje pri brisanju +Ravnanje pri brisanju Description Opis +Direct +Neposredno Directories are dependent! Be careful when setting up synchronization rules: Imeniki so v odvisnosti! Bodite pozorni, ko nastavljate sinhronizacijska pravila: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again Ne prikaži več tega pogovornega okna Do nothing Ne naredi ničesar -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Ali resnično želite izbrisati naslednje objekte? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Ali resnično želite premakniti naslednje objekte v Koš? Do you want FreeFileSync to automatically check for updates every week? Ali želite, da FreeFileSync samodejno preverja za posodobitve vsak teden? @@ -484,6 +502,8 @@ Find what: Najdi kaj Folder Comparison and Synchronization Primerjava in sinhronizacija imenika +Follow +Sledi Free disk space available: Prosti disk, ki je na voljo: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Prepoznaj in širi spremembe na obeh straneh z uporabo podatkovne baze. Izbrisi in spori so zaznani samodejno. If you like FFS Če vam je FFS všeč +Ignore +Ignoriraj Ignore 1-hour file time difference Ignoriraj 1-urno časovno razliko Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Ignoriraj vse nadaljnje napake Include Vključi -Include Symbolic Links -Vključi simbolične povezave Include all rows Vključi se vrstice Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory Premakni datoteke v časovno-označen podimenik Moving %x to Recycle Bin Premikam %x v Koš +Moving Symbolic Link %x to user-defined directory %y +Premikam simbolično povezavo %x v uporabniško določen imenik %y Moving file %x to user-defined directory %y Premikam datoteko %x v uporabniško-določen imenik %y Moving folder %x to user-defined directory %y @@ -682,8 +704,6 @@ Remove folder Odstrani v mapo Remove folder pair Odstrani par imenikov -Renaming file %x to %y -Preimenujem datoteko %x v %y Report translation error Poročaj o napaki prevoda Reset @@ -709,7 +729,7 @@ Izberite mapo Select alternate synchronization settings Izberite nadomestne nastavitve sinhronizacije Select logfile directory: -Izberite imenik datoteke za beleženje: +Izberite imenik za datoteko beleženja: Select variant: Izberite varianto: Set direction: @@ -776,6 +796,10 @@ Swap sides Zamenjaj strani Switching to FreeFileSync GUI modus... Preklapljam v FreeFileSync GUI način... +Symbolic Link handling +Rokovanje s simboličnimi povezavami +Symlinks %x have the same date but a different target! +Simbolične povezave %x imajo isti datum, vendar različni cilj! Synchronization Preview Predogled sinhronizacije Synchronization aborted! @@ -800,8 +824,8 @@ Target directory already existing! Ciljni imenik že obstaja! Target file already existing! Ciljna datoteka že obstaja! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Ukazna vrstica se izvrši vsakič ko:\n- postane imenik na voljo (npr. vstavitem USB ključa)\n- datoteke znotraj teh imenikov ali podimenikov so spremenjene +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +Ukazna vrstica se izvrši vsakič ko:\n- vsi imeniki postanejo dostopni (npr. ob vstavitvi USB ključa)\n- so datoteke znotraj teh imenikov in podimenikov spremenjene The file does not contain a valid configuration: Datoteka ne vsebuje veljavne konfiguracije: The file was not processed by last synchronization! diff --git a/BUILD/Languages/spanish.lng b/BUILD/Languages/spanish.lng index b20d3130..23bd2a59 100644 --- a/BUILD/Languages/spanish.lng +++ b/BUILD/Languages/spanish.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) dia(s) hour(s) @@ -22,12 +18,24 @@ seg %x / %y objects deleted successfully %x / %y objetos borrados satisfactoriamente +%x Byte +%x Bytes +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories %x directorios -%x files, -%x archivos, +%x files +%x archivos %x is not a valid FreeFileSync batch file! %x no es un archivo batch de FreeFileSync válido! +%x kB +%x kB %x of %y rows in view %x de %y filas en vista %x of 1 row in view @@ -89,7 +97,9 @@ &Switch &Cambiar &Yes -&Yes +&Si +(Build: %x) +(Completado: %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Tenga en cuenta que sólo las unidades FAT/FAT32 se ven afectadas por este problema!\nEn los demás casos puede deshabilitar la opción \"ignorar 1-hora de diferencia\".) (Requires an Internet connection!) @@ -126,8 +136,8 @@ /seg 1 directory 1 directorio -1 file, -1 archivo, +1 file +1 archivo 1. &Compare 1. &Comparar 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ <Última sesión> + + A newer version of FreeFileSync is available: @@ -196,8 +208,6 @@ Browse Examinar Browse directory Examinar directorio -Build: -Realizado: Cannot determine sync-direction: No se puede determinar la dirección de la sincronización: Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Copiar archivos compartidos o bloqueados usando el servicio "Volume Shadow Copy" Copy to clipboard\tCTRL+C Copiar al Portapapeles\tCTRL+C +Copying Symbolic Link %x overwriting %y +Copiando enlace simbólico %x y sobreescribiendo %y +Copying Symbolic Link %x to %y +Copiando enlace simbólico %x a %y +Copying file %x overwriting %y +Copiando archivo %x y sobreescribiendo %y Copying file %x to %y Copiar archivo %x a %y -Copying file %x to %y overwriting target -Copiar archivo %x a %y sobreescribiendo el destino Could not determine volume name for file: No se ha podido determinar el nombre del volumen para el archivo: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently Borrar o sobreescribir archivos permanentemente Delete permanently Borrar permanentemente +Deleting Symbolic Link %x +Eliminando enlace simbólico %x Deleting file %x Borrar archivo %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Gestión de borrado Description Descripción +Direct +Enviar Directories are dependent! Be careful when setting up synchronization rules: ¡Los directorios son dependientes! Tenga cuidado al establecer las reglas de sincronización: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again No volver a mostrar este diálogo Do nothing No hacer nada -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? ¿Está seguro de querer borrar el/los siguiente(s) elemento(s)? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? ¿Está seguro de querer mover el/los siguiente(s) elemento(s) a la Papelera de Reciclaje? Do you want FreeFileSync to automatically check for updates every week? ¿Quiere que FreeFileSync detecte automáticamente actualizaciones cada semana? @@ -484,6 +502,8 @@ Find what: Buscar: Folder Comparison and Synchronization Comparación y Sincronización de Carpetas +Follow +Seguir Free disk space available: Espacio de disco disponible: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Identificar y aplicar cambios en ambos lados usando una base de datos. Las eliminaciones y los conflictos se detectan automáticamente. If you like FFS Si te gusta FFS +Ignore +Ignorar Ignore 1-hour file time difference Ignorar el archivo de 1-hora de tiempo de diferencia Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Ignorar errores posteriores Include Incluir -Include Symbolic Links -Incluir enlaces simbólicos Include all rows Incluir todas las filas Include temporarily @@ -612,10 +632,12 @@ Move files into a time-stamped subdirectory Mover archivos a un subdirectorio con marca de tiempo Moving %x to Recycle Bin Mover %x a la Papelera de Reciclaje +Moving Symbolic Link %x to user-defined directory %y +Mover enlace simbólico %x al directorio definido por el usuario %y Moving file %x to user-defined directory %y -Mover el archivo %x al directorio definido por el usuario %y. +Mover el archivo %x al directorio definido por el usuario %y Moving folder %x to user-defined directory %y -Mover la carpeta %x al directorio definido por el usuario %y. +Mover la carpeta %x al directorio definido por el usuario %y Multiple... Múltiple... No change since last synchronization! @@ -682,8 +704,6 @@ Remove folder Eliminar carpeta Remove folder pair Eliminar un par de carpetas -Renaming file %x to %y -Renombrando archivo %x a %y Report translation error Informar de errores de traducción Reset @@ -776,6 +796,10 @@ Swap sides Intercambiar lados Switching to FreeFileSync GUI modus... Cambiando al modo GUI de FreeFileSync... +Symbolic Link handling +Gestión de enlaces simbólicos +Symlinks %x have the same date but a different target! +¡Los enlaces simbólicos %x tienen la misma fecha pero un destino diferente! Synchronization Preview Previsualización de la sincronización Synchronization aborted! @@ -800,8 +824,8 @@ Target directory already existing! ¡El directorio de destino ya existe! Target file already existing! ¡El archivo de destino ya existe! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Cada vez que la línea de comandos se ejecuta:\n- un directorio se muestra disponible (por ejemplo, la inserción de una memoria USB)\n- los archivos dentro de estos directorios o subdirectorios son modificados +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +La línea de comandos se ejecuta cada vez:\n- todos los directorios estan disponibles (ej. inserción de un lápiz USB)\n- archivos dentro de directorios o subdirectorios son modificados The file does not contain a valid configuration: El archivo no contiene una configuración válida: The file was not processed by last synchronization! diff --git a/BUILD/Languages/swedish.lng b/BUILD/Languages/swedish.lng index f32e7d53..e5c5a68c 100644 --- a/BUILD/Languages/swedish.lng +++ b/BUILD/Languages/swedish.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) dag(ar) hour(s) @@ -22,12 +18,24 @@ sek. %x / %y objects deleted successfully %x / %y objekt borttagna +%x Byte +%x Byte +%x GB +%x GB +%x MB +%x MB +%x PB +%x PB +%x TB +%x TB %x directories %x kataloger -%x files, -%x filer, +%x files +%x filer %x is not a valid FreeFileSync batch file! %x är ingen giltig FreeFileSync batch-fil! +%x kB +%x kB %x of %y rows in view %x rader av %y i vyn %x of 1 row in view @@ -90,6 +98,8 @@ &Växla &Yes &Ja +(Build: %x) +(Bygg: %x) (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Notera att endast FAT/FAT32-formaterade diskar berörs av detta problem!\nI alla andra fall kan du inaktivera alternativet \"Ignorera sommartid\".) (Requires an Internet connection!) @@ -126,8 +136,8 @@ /s 1 directory 1 katalog -1 file, -1 fil, +1 file +1 fil 1. &Compare 1. &Jämför 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ + + A newer version of FreeFileSync is available: @@ -196,8 +208,6 @@ Browse Bläddra Browse directory Sök upp katalog -Build: -Bygg: Cannot determine sync-direction: Kan inte bestämma synk-riktning: Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Använd Volume Shadow Copy Service för att kopiera låsta eller delade filer Copy to clipboard\tCTRL+C Kopiera till urklipp\tCTRL+C +Copying Symbolic Link %x overwriting %y +Kopierar symbolisk länk %x skriver över %y +Copying Symbolic Link %x to %y +Kopierar symbolisk länk %x till %y +Copying file %x overwriting %y +Kopierar fil %x skriver över %y Copying file %x to %y Kopierar fil %x till %y -Copying file %x to %y overwriting target -Kopierar fil %x till %y skriver över målet Could not determine volume name for file: Kan inte bestämma volym för fil: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently Ta bort eller skriv över permanent Delete permanently Ta bort permanent +Deleting Symbolic Link %x +Tar bort symbolisk länk %x Deleting file %x Tar bort filen %x Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Borttagning Description Beskrivning +Direct +Direkt Directories are dependent! Be careful when setting up synchronization rules: Kataloger är beroende! Var försiktig när du sätter upp synkroniseringsregler: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again Visa inte den här dialogrutan igen Do nothing Gör ingenting -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Vill du verkligen ta bort följande objekt? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Vill du verkligen flytta följande objekt till papperskorgen? Do you want FreeFileSync to automatically check for updates every week? Vill du att FreeFileSync skall söka efter uppdateringar varje vecka? @@ -484,6 +502,8 @@ Find what: Sök efter: Folder Comparison and Synchronization Katalogjämförelse och synkronisering +Follow +Följ Free disk space available: Ledigt diskutrymme: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con Identifiera och visa förändringar på båda sidor via databas. Borttagningar och konflikter upptäcks automatiskt. If you like FFS Om du gillar FFS +Ignore +Ignorera Ignore 1-hour file time difference Ignorera sommartid Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Ignorera följdfel Include Inkludera -Include Symbolic Links -Inkludera symboliska länkar Include all rows Inkludera alla rader Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory Flytta filer till en tidsstämplad underkatalog Moving %x to Recycle Bin Flyttar %x till papperskorgen +Moving Symbolic Link %x to user-defined directory %y +Flyttar symbolisk länk %x till användardefinierad plats %y Moving file %x to user-defined directory %y Flyttar %x till %y Moving folder %x to user-defined directory %y @@ -682,8 +704,6 @@ Remove folder Ta bort katalog Remove folder pair Ta bort katalogpar -Renaming file %x to %y -Byter namn på %x till %y Report translation error Rapportera översättningsfel Reset @@ -776,6 +796,10 @@ Swap sides Byt sida Switching to FreeFileSync GUI modus... Växlar till FreeFileSyncs grafiska läge +Symbolic Link handling +Hantering av Symboliska länkar +Symlinks %x have the same date but a different target! +Symbolisk länk %x har samma datum, men annat mål! Synchronization Preview Förhandsvisning Synchronization aborted! @@ -800,8 +824,8 @@ Target directory already existing! Målkatalogen finns redan! Target file already existing! Filen finns redan! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Kommandot kommer att verkställas varje gång:\n- målkatalogen blir tillgänglig (t.ex USB-anslutning)\n- filer i dessa kataloger eller underkataloger ändras +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +Kommandot verkställes när:\n- alla berörda kataloger blir tillgängliga (t.ex om USB-minne ansluts)\n- filer i berörda kataloger eller underkataloger ändras The file does not contain a valid configuration: Filen är ingen giltig konfigureringsfil: The file was not processed by last synchronization! diff --git a/BUILD/Languages/turkish.lng b/BUILD/Languages/turkish.lng index 4ad70178..6c7aa151 100644 --- a/BUILD/Languages/turkish.lng +++ b/BUILD/Languages/turkish.lng @@ -6,10 +6,6 @@ GB MB MB - PB - PB - TB - TB day(s) gün(ler) hour(s) @@ -22,12 +18,24 @@ san %x / %y objects deleted successfully %x / %y obje başarıyla silindi +%x Byte + +%x GB + +%x MB + +%x PB + +%x TB + %x directories %x dizin -%x files, -%x dosya, +%x files +%x dosya %x is not a valid FreeFileSync batch file! %x geçerli bir FreeFileSync komut (batch) dosyası değildir! +%x kB + %x of %y rows in view %y satırdan %x'i görüntüleniyor %x of 1 row in view @@ -90,6 +98,8 @@ Ge&ri yükle &Yes &Evet +(Build: %x) + (Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".) (Not: Sadece FAT/FAT32 olarak biçimlendirilmiş sürücüler bu problemden etkilenir!\nDiğer durumlarda, \"1-saat'lik zaman farkını yoksay\" ayarı devre dışı bırakılabilir.) (Requires an Internet connection!) @@ -126,8 +136,8 @@ Ge&ri yükle /san 1 directory 1 dizin -1 file, -1 dosya, +1 file +1 dosya 1. &Compare 1. &Karşılaştır 1. Enter relative file or directory names separated by ';' or a new line. @@ -150,6 +160,8 @@ Ge&ri yükle <Önceki oturum> + + <Çoklu seçim> A newer version of FreeFileSync is available: @@ -196,8 +208,6 @@ Browse Araştır Browse directory -Build: -Derleme: Cannot determine sync-direction: Cannot find %x @@ -272,10 +282,14 @@ Copy shared or locked files using Volume Shadow Copy Service Copy to clipboard\tCTRL+C Hafızaya kopyala\tCTRL+C +Copying Symbolic Link %x overwriting %y + +Copying Symbolic Link %x to %y + +Copying file %x overwriting %y + Copying file %x to %y %x'den %y'e dosya kopyalanıyor -Copying file %x to %y overwriting target -%x'den %y'e üzerine yazmaya açık olarak dosya kopyalanıyor Could not determine volume name for file: Belirtilen dosya için birim adı belirlenemedi: Could not initialize directory monitoring: @@ -320,6 +334,8 @@ Delete or overwrite files permanently Kalıcı olarak üzerine yaz veya sil Delete permanently Kalıcı olarak sil +Deleting Symbolic Link %x + Deleting file %x %x dosyası siliniyor Deleting folder %x @@ -328,6 +344,8 @@ Deletion handling Silme işleminin idaresi Description Açıklama +Direct + Directories are dependent! Be careful when setting up synchronization rules: Dizinler bağımlı! Senkronizasyon kurallarını koyarken dikkatli olun: Directories to watch @@ -340,9 +358,9 @@ Do not show this dialog again Bu iletiyi tekrar gösterme Do nothing Hiçbir şey yapma -Do you really want to delete the following objects(s)? +Do you really want to delete the following object(s)? Gerçekten şu objeleri silmek istiyormusunuz? -Do you really want to move the following objects(s) to the Recycle Bin? +Do you really want to move the following object(s) to the Recycle Bin? Gerçekten şu objeleri geri dönüşüm kutusuna taşımak istiyormusunuz? Do you want FreeFileSync to automatically check for updates every week? Her hafta FreeFileSync'in güncellemeleri denetlemesini istermisiniz? @@ -484,6 +502,8 @@ Find what: Folder Comparison and Synchronization Klasör Karşılaştırması ve Senkronizasyonu +Follow + Free disk space available: Boşta kullanılabilir disk alanı: FreeFileSync Batch Job @@ -552,6 +572,8 @@ Identify and propagate changes on both sides using a database. Deletions and con If you like FFS Eğer FFS’i sevdiyseniz +Ignore + Ignore 1-hour file time difference 1 saatlik dosya tarihi farklılaşmasını yoksay Ignore errors @@ -560,8 +582,6 @@ Ignore subsequent errors Takibeden hataları yoksay Include Dahil et -Include Symbolic Links - Include all rows Include temporarily @@ -612,6 +632,8 @@ Move files into a time-stamped subdirectory Moving %x to Recycle Bin %x geri dönüşüm kutusuna taşınıyor +Moving Symbolic Link %x to user-defined directory %y + Moving file %x to user-defined directory %y %x dosyası kullanıcı tanımlı dizin %y’e taşınıyor Moving folder %x to user-defined directory %y @@ -682,8 +704,6 @@ Remove folder Klasörü kaldır Remove folder pair Klasör çiftini kaldır -Renaming file %x to %y - Report translation error Çeviri hatasını bildir Reset @@ -776,6 +796,10 @@ Swap sides Tarafları ters çevir Switching to FreeFileSync GUI modus... +Symbolic Link handling + +Symlinks %x have the same date but a different target! + Synchronization Preview Senkronizasyon Önizlemesi Synchronization aborted! @@ -800,7 +824,7 @@ Target directory already existing! Hedef dizin zaten mevcut! Target file already existing! Hedef dosya zaten mevcut! -The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified +The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified The file does not contain a valid configuration: Dosya geçerli bir konfigürasyon içermiyor: diff --git a/BUILD/Resources.dat b/BUILD/Resources.dat index b9b73aa7..57450b8d 100644 Binary files a/BUILD/Resources.dat and b/BUILD/Resources.dat differ diff --git a/Cleanup.cmd b/Cleanup.cmd index 7424db08..ebed029e 100644 --- a/Cleanup.cmd +++ b/Cleanup.cmd @@ -15,6 +15,8 @@ attrib FreeFileSync.suo -h del FreeFileSync.suo attrib RealtimeSync\RealtimeSync.suo -h del RealtimeSync\RealtimeSync.suo +del FreeFileSync.sdf +del RealtimeSync\RealtimeSync.sdf del BUILD\FreeFileSync*.pdb del BUILD\FreeFileSync*.ilk diff --git a/FreeFileSync.cbp b/FreeFileSync.cbp index 0a3d7600..750cc527 100644 --- a/FreeFileSync.cbp +++ b/FreeFileSync.cbp @@ -138,6 +138,7 @@ + - - + + + + + + diff --git a/FreeFileSync.vcproj b/FreeFileSync.vcproj deleted file mode 100644 index aeb6bd77..00000000 --- a/FreeFileSync.vcproj +++ /dev/null @@ -1,702 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/FreeFileSync.vcxproj b/FreeFileSync.vcxproj new file mode 100644 index 00000000..e0bb3457 --- /dev/null +++ b/FreeFileSync.vcxproj @@ -0,0 +1,315 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {86C36CC7-9418-4253-9929-829486F59A00} + Win32Proj + FreeFileSync + + + + Application + true + Unicode + v100 + + + Application + true + Unicode + Windows7.1SDK + + + Application + false + true + Unicode + v100 + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + BUILD\ + OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\ + $(ProjectName)_$(PlatformName) + false + true + + + true + BUILD\ + OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\ + $(ProjectName)_$(PlatformName) + false + + + false + BUILD\ + OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\ + false + $(ProjectName)_$(PlatformName) + + + false + BUILD\ + OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\ + false + $(ProjectName)_$(PlatformName) + + + + Use + Level4 + Disabled + wxUSE_UNICODE;__WXMSW__;FFS_WIN;__WXDEBUG__;TIXML_USE_STL;ZSTRING_WIDE_CHAR;%(PreprocessorDefinitions) + C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud;.\shared\boost_1_x + $(ProjectDir)library\pch.h + 4100 + false + false + $(IntDir)pch.obj + $(ProjectDir)library/pch.h + EditAndContinue + MultiThreadedDebugDLL + + + Windows + true + true + $(OutDir)$(TargetName)$(TargetExt) + wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies) + C:\Programme\C++\wxWidgets\lib\vc_lib + + + + + C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud + %(PreprocessorDefinitions); + + + + + + + + + Use + Level4 + Disabled + wxUSE_UNICODE;__WXMSW__;FFS_WIN;__WXDEBUG__;TIXML_USE_STL;ZSTRING_WIDE_CHAR;%(PreprocessorDefinitions) + C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswud;.\shared\boost_1_x + $(ProjectDir)library\pch.h + 4100 + false + false + $(IntDir)pch.obj + $(ProjectDir)library/pch.h + ProgramDatabase + true + + + Windows + true + true + $(OutDir)$(TargetName)$(TargetExt) + wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies) + C:\Programme\C++\wxWidgets-x64\lib\vc_lib + + + + + C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud + %(PreprocessorDefinitions);WX_CPU_AMD64 + + + + + + + + + Level4 + NotUsing + MaxSpeed + true + true + wxUSE_UNICODE;__WXMSW__;FFS_WIN;NDEBUG;TIXML_USE_STL;ZSTRING_WIDE_CHAR;%(PreprocessorDefinitions) + C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu;.\shared\boost_1_x + Speed + 4100 + MultiThreaded + true + false + + + Windows + false + true + true + true + wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + C:\Programme\C++\wxWidgets\lib\vc_lib + + + + + C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu + %(PreprocessorDefinitions); + + + + + + + Level4 + NotUsing + MaxSpeed + true + true + wxUSE_UNICODE;__WXMSW__;FFS_WIN;NDEBUG;TIXML_USE_STL;ZSTRING_WIDE_CHAR;%(PreprocessorDefinitions) + C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswu;.\shared\boost_1_x + Speed + 4100 + MultiThreaded + true + false + true + + + Windows + false + true + true + true + wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + C:\Programme\C++\wxWidgets-x64\lib\vc_lib + + + + + C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu + %(PreprocessorDefinitions);WX_CPU_AMD64 + + + + + + + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4100 + 4100 + wxUSE_UNICODE;__WXMSW__;FFS_WIN;__WXDEBUG__;TIXML_USE_STL;ZSTRING_WIDE_CHAR;%(PreprocessorDefinitions) + wxUSE_UNICODE;__WXMSW__;FFS_WIN;__WXDEBUG__;TIXML_USE_STL;ZSTRING_WIDE_CHAR;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..94a04532 --- /dev/null +++ b/LICENSE @@ -0,0 +1,621 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS diff --git a/Makefile b/Makefile index 9c6781e3..57d6152a 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,11 @@ SHAREDIR = $(DESTDIR)$(prefix)/share APPSHAREDIR = $(SHAREDIR)/$(APPNAME) FFS_CPPFLAGS=-Wall -pipe -DNDEBUG -DwxUSE_UNICODE `wx-config --cxxflags --debug=no --unicode=yes` `pkg-config --cflags gtk+-2.0` -DFFS_LINUX -DTIXML_USE_STL -DZSTRING_CHAR -O3 -pthread -c -Ishared/boost_1_x -LINKFLAGS=`wx-config --libs --debug=no --unicode=yes` shared/ossp_uuid/.libs/libuuid++.a -O3 -pthread +LINKFLAGS=`wx-config --libs --debug=no --unicode=yes` -O3 -pthread + +#support for GTKMM +FFS_CPPFLAGS+=`pkg-config --cflags gtkmm-2.4` +LINKFLAGS+=`pkg-config --libs gtkmm-2.4` FILE_LIST= #internal list of all *.cpp files needed for compilation FILE_LIST+=structures.cpp @@ -35,6 +39,7 @@ FILE_LIST+=library/statusHandler.cpp FILE_LIST+=library/resources.cpp FILE_LIST+=ui/smallDialogs.cpp FILE_LIST+=library/processXml.cpp +FILE_LIST+=library/iconBuffer.cpp FILE_LIST+=library/statistics.cpp FILE_LIST+=library/filter.cpp FILE_LIST+=library/binary.cpp @@ -43,8 +48,9 @@ FILE_LIST+=shared/localization_no_BOM.cpp FILE_LIST+=shared/fileIO.cpp FILE_LIST+=shared/dragAndDrop.cpp FILE_LIST+=shared/guid.cpp +FILE_LIST+=shared/checkExist.cpp +FILE_LIST+=shared/parallelCall.cpp FILE_LIST+=shared/tinyxml/tinyxml.cpp -FILE_LIST+=shared/tinyxml/tinystr.cpp FILE_LIST+=shared/tinyxml/tinyxmlerror.cpp FILE_LIST+=shared/tinyxml/tinyxmlparser.cpp FILE_LIST+=shared/globalFunctions.cpp @@ -70,21 +76,6 @@ OBJECT_LIST=$(foreach file, $(FILE_LIST), OBJ/$(subst .cpp,.o,$(notdir $(file))) #build list of all dependencies DEP_LIST=$(foreach file, $(FILE_LIST), $(subst .cpp,.dep,$(file))) -#support for Glib-IO/GIO recycler -#Recycle bin: check whether GLIB library is existing (and add relevant compiler and linker flags) -GIO_EXISTING=$(shell pkg-config --exists gio-2.0 && echo YES) -ifeq ($(GIO_EXISTING),YES) -FFS_CPPFLAGS+=-DRECYCLER_GIO `pkg-config --cflags gio-2.0` -LINKFLAGS+=`pkg-config --libs gio-2.0` -else -FFS_CPPFLAGS+=-DRECYCLER_NONE -$(warning ) -$(warning -----------------------------------------------------------------------------------------) -$(warning | Warning: No gio-2.0 package found: Recycle Bin will NOT be available for this system! |) -$(warning -----------------------------------------------------------------------------------------) -$(warning ) -endif - all: FreeFileSync @@ -96,27 +87,16 @@ removeBOM: tools/removeBOM.cpp g++ -o OBJ/removeBOM tools/removeBOM.cpp ./OBJ/removeBOM shared/localization.cpp shared/localization_no_BOM.cpp -osspUUID: -#some files within ossp_uuid may need to have readonly attribute removed - chmod -R 0755 shared/ossp_uuid && \ - cd shared/ossp_uuid && \ - chmod +x configure && \ - chmod +x shtool && \ - ./configure --with-cxx --disable-shared && \ - make && \ - make check - %.dep : %.cpp #strip path information g++ $(FFS_CPPFLAGS) $< -o OBJ/$(subst .cpp,.o,$(notdir $<)) -FreeFileSync: init removeBOM osspUUID $(DEP_LIST) +FreeFileSync: init removeBOM $(DEP_LIST) g++ -o BUILD/$(APPNAME) $(OBJECT_LIST) $(LINKFLAGS) clean: rm -rf OBJ rm -f BUILD/$(APPNAME) - if [ -e shared/ossp_uuid/Makefile ]; then cd shared/ossp_uuid && make clean; fi rm -f shared/localization_no_BOM.cpp install: diff --git a/RealtimeSync/RealtimeSync.cbp b/RealtimeSync/RealtimeSync.cbp index 24b6d859..dd803ecf 100644 --- a/RealtimeSync/RealtimeSync.cbp +++ b/RealtimeSync/RealtimeSync.cbp @@ -120,6 +120,7 @@ + @@ -135,6 +136,7 @@ + diff --git a/RealtimeSync/RealtimeSync.vcproj b/RealtimeSync/RealtimeSync.vcproj deleted file mode 100644 index 8e95f3a6..00000000 --- a/RealtimeSync/RealtimeSync.vcproj +++ /dev/null @@ -1,540 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/RealtimeSync/RealtimeSync.vcxproj b/RealtimeSync/RealtimeSync.vcxproj new file mode 100644 index 00000000..04f1d7a8 --- /dev/null +++ b/RealtimeSync/RealtimeSync.vcxproj @@ -0,0 +1,269 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {A80B97E9-807C-47A1-803A-27565A1BD526} + Win32Proj + RealtimeSync + + + + Application + true + Unicode + Windows7.1SDK + + + Application + true + Unicode + Windows7.1SDK + + + Application + false + true + Unicode + Windows7.1SDK + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + ..\BUILD\ + OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\ + $(ProjectName)_$(PlatformName) + false + + + true + ..\BUILD\ + OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\ + $(ProjectName)_$(PlatformName) + false + + + false + ..\BUILD\ + OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\ + false + $(ProjectName)_$(PlatformName) + + + false + ..\BUILD\ + OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\ + false + $(ProjectName)_$(PlatformName) + + + + Use + Level4 + Disabled + wxUSE_UNICODE;__WXMSW__;FFS_WIN;__WXDEBUG__;TIXML_USE_STL;ZSTRING_WIDE_CHAR + C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud;..\shared\boost_1_x + $(ProjectDir)../library/pch.h + 4100 + false + false + $(IntDir)pch.obj + $(ProjectDir)../library/pch.h + EditAndContinue + + + Windows + true + true + $(OutDir)$(TargetName)$(TargetExt) + wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies) + C:\Programme\C++\wxWidgets\lib\vc_lib + + + + + C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud + %(PreprocessorDefinitions); + + + + + Use + Level4 + Disabled + wxUSE_UNICODE;__WXMSW__;FFS_WIN;__WXDEBUG__;TIXML_USE_STL;ZSTRING_WIDE_CHAR + C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswud;..\shared\boost_1_x + $(ProjectDir)../library/pch.h + 4100 + false + false + $(IntDir)pch.obj + $(ProjectDir)../library/pch.h + ProgramDatabase + true + + + Windows + true + true + $(OutDir)$(TargetName)$(TargetExt) + wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies) + C:\Programme\C++\wxWidgets-x64\lib\vc_lib + + + + + C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud + %(PreprocessorDefinitions);WX_CPU_AMD64 + + + + + Level4 + NotUsing + MaxSpeed + true + true + wxUSE_UNICODE;__WXMSW__;FFS_WIN;NDEBUG;TIXML_USE_STL;ZSTRING_WIDE_CHAR + C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu;..\shared\boost_1_x + Speed + 4100 + MultiThreaded + true + false + + + Windows + false + true + true + true + wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + C:\Programme\C++\wxWidgets\lib\vc_lib + + + + + C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu + %(PreprocessorDefinitions); + + + + + + + Level4 + NotUsing + MaxSpeed + true + true + wxUSE_UNICODE;__WXMSW__;FFS_WIN;NDEBUG;TIXML_USE_STL;ZSTRING_WIDE_CHAR + C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswu;..\shared\boost_1_x + Speed + 4100 + MultiThreaded + true + false + true + + + Windows + false + true + true + true + wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + C:\Programme\C++\wxWidgets-x64\lib\vc_lib + + + + + C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu + %(PreprocessorDefinitions);WX_CPU_AMD64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RealtimeSync/application.h b/RealtimeSync/application.h index 38303857..00b6a4ec 100644 --- a/RealtimeSync/application.h +++ b/RealtimeSync/application.h @@ -19,6 +19,12 @@ public: private: void OnStartApplication(wxIdleEvent& event); + + virtual wxLayoutDirection GetLayoutDirection() const //disable RTL languages for now... +{ + return wxLayout_LeftToRight; +} + }; #endif // REALTIMESYNCAPP_H diff --git a/RealtimeSync/guiGenerated.cpp b/RealtimeSync/guiGenerated.cpp index 3252b0c5..4ee67bc9 100644 --- a/RealtimeSync/guiGenerated.cpp +++ b/RealtimeSync/guiGenerated.cpp @@ -61,7 +61,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_staticText2 = new wxStaticText( m_panelMain, wxID_ANY, _("Usage:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText2->Wrap( -1 ); - m_staticText2->SetFont( wxFont( 10, 74, 90, 90, true, wxT("Tahoma") ) ); + m_staticText2->SetFont( wxFont( 10, 74, 90, 90, true, wxEmptyString ) ); sbSizer41->Add( m_staticText2, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); @@ -80,7 +80,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_staticline3 = new wxStaticLine( m_panelMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); sbSizer41->Add( m_staticline3, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - m_staticText21 = new wxStaticText( m_panelMain, wxID_ANY, _("The command line is executed each time:\n- a directory becomes available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText21 = new wxStaticText( m_panelMain, wxID_ANY, _("The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText21->Wrap( -1 ); sbSizer41->Add( m_staticText21, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); diff --git a/RealtimeSync/mainDialog.cpp b/RealtimeSync/mainDialog.cpp index 5ba378ce..a6bc7829 100644 --- a/RealtimeSync/mainDialog.cpp +++ b/RealtimeSync/mainDialog.cpp @@ -141,8 +141,8 @@ void MainDialog::OnShowHelp(wxCommandEvent& event) void MainDialog::OnMenuAbout(wxCommandEvent& event) { - //build information - wxString build = wxString(wxT("(")) + _("Build:") + wxT(" ") + __TDATE__; + //build information + wxString build = __TDATE__; #if wxUSE_UNICODE build += wxT(" - Unicode"); #else @@ -151,12 +151,15 @@ void MainDialog::OnMenuAbout(wxCommandEvent& event) //compile time info about 32/64-bit build if (Utility::is64BitBuild) - build += wxT(" x64)"); + build += wxT(" x64"); else - build += wxT(" x86)"); + build += wxT(" x86"); assert_static(Utility::is32BitBuild || Utility::is64BitBuild); - wxMessageDialog* aboutDlg = new wxMessageDialog(this, wxString(wxT("RealtimeSync")) + wxT("\n\n") + build, _("About"), wxOK); +wxString buildFormatted = _("(Build: %x)"); +buildFormatted.Replace(wxT("%x"), build); + + wxMessageDialog* aboutDlg = new wxMessageDialog(this, wxString(wxT("RealtimeSync")) + wxT("\n\n") + buildFormatted, _("About"), wxOK); aboutDlg->ShowModal(); } diff --git a/RealtimeSync/makefile b/RealtimeSync/makefile index 9692e22a..1b7018eb 100644 --- a/RealtimeSync/makefile +++ b/RealtimeSync/makefile @@ -18,10 +18,11 @@ FILE_LIST+=xmlProcessing.cpp FILE_LIST+=xmlFreeFileSync.cpp FILE_LIST+=../library/processXml.cpp FILE_LIST+=../structures.cpp +FILE_LIST+=../shared/checkExist.cpp +FILE_LIST+=../shared/parallelCall.cpp FILE_LIST+=../shared/localization_no_BOM.cpp FILE_LIST+=../shared/inotify/inotify-cxx.cpp FILE_LIST+=../shared/tinyxml/tinyxml.cpp -FILE_LIST+=../shared/tinyxml/tinystr.cpp FILE_LIST+=../shared/tinyxml/tinyxmlerror.cpp FILE_LIST+=../shared/tinyxml/tinyxmlparser.cpp FILE_LIST+=../shared/globalFunctions.cpp diff --git a/RealtimeSync/resource.rc b/RealtimeSync/resource.rc index 616ea49d..1b70fa6a 100644 --- a/RealtimeSync/resource.rc +++ b/RealtimeSync/resource.rc @@ -1,4 +1,28 @@ +#define IDR_VERSION1 1 + #include "wx/msw/wx.rc" +#include "../version/version.rc" -//naming convention to set icon sequence in executable file A_PROGRAM_ICON ICON DISCARDABLE "RealtimeSync.ico" + +IDR_VERSION1 VERSIONINFO +FILEVERSION VER_FREEFILESYNC +PRODUCTVERSION VER_FREEFILESYNC +FILEOS 0x00000004 +FILETYPE 0x00000001 +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "FFFF04B0" + BEGIN + VALUE "ProductVersion", VER_FREEFILESYNC_STR + VALUE "FileDescription", "Realtime Application Launcher\0" + VALUE "LegalCopyright", "(c) 2008 - 2010 ZenJu\0" + VALUE "ProductName", "RealtimeSync\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0xFFFF, 0x04B0 + END +END diff --git a/RealtimeSync/trayMenu.cpp b/RealtimeSync/trayMenu.cpp index 436ee904..4e82b5f7 100644 --- a/RealtimeSync/trayMenu.cpp +++ b/RealtimeSync/trayMenu.cpp @@ -175,22 +175,25 @@ void WaitCallbackImpl::OnContextMenuSelection(wxCommandEvent& event) break; case CONTEXT_ABOUT: { - //build information - wxString build = wxString(wxT("(")) + _("Build:") + wxT(" ") + __TDATE__; + //build information + wxString build = __TDATE__; #if wxUSE_UNICODE - build += wxT(" - Unicode"); + build += wxT(" - Unicode"); #else - build += wxT(" - ANSI"); + build += wxT(" - ANSI"); #endif //wxUSE_UNICODE - //compile time info about 32/64-bit build - if (Utility::is64BitBuild) - build += wxT(" x64)"); - else - build += wxT(" x86)"); - assert_static(Utility::is32BitBuild || Utility::is64BitBuild); + //compile time info about 32/64-bit build + if (Utility::is64BitBuild) + build += wxT(" x64"); + else + build += wxT(" x86"); + assert_static(Utility::is32BitBuild || Utility::is64BitBuild); - wxMessageDialog aboutDlg(NULL, wxString(wxT("RealtimeSync")) + wxT("\n\n") + build, _("About"), wxOK); +wxString buildFormatted = _("(Build: %x)"); +buildFormatted.Replace(wxT("%x"), build); + + wxMessageDialog aboutDlg(NULL, wxString(wxT("RealtimeSync")) + wxT("\n\n") + buildFormatted, _("About"), wxOK); aboutDlg.ShowModal(); } break; diff --git a/RealtimeSync/watcher.cpp b/RealtimeSync/watcher.cpp index ad9e6508..9af48783 100644 --- a/RealtimeSync/watcher.cpp +++ b/RealtimeSync/watcher.cpp @@ -264,20 +264,14 @@ class DirsOnlyTraverser : public FreeFileSync::TraverseCallback public: DirsOnlyTraverser(std::vector& dirs) : m_dirs(dirs) {} - virtual ReturnValue onFile(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink, const FileInfo& details) - { - return TRAVERSING_CONTINUE; - } - virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink) + virtual void onFile(const DefaultChar* shortName, const Zstring& fullName, const FileInfo& details) {} + virtual void onSymlink(const DefaultChar* shortName, const Zstring& fullName, const SymlinkInfo& details) {} + virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName) { m_dirs.push_back(fullName.c_str()); - - if (isSymlink) //don't traverse into symlinks (analog to windows build) - return ReturnValDir(Loki::Int2Type()); - else return ReturnValDir(Loki::Int2Type(), this); } - virtual ReturnValue onError(const wxString& errorText) + virtual void onError(const wxString& errorText) { throw FreeFileSync::FileError(errorText); } @@ -409,7 +403,7 @@ RealtimeSync::WaitResult RealtimeSync::waitForChanges(const std::vector try //get all subdirectories { DirsOnlyTraverser traverser(fullDirList); - FreeFileSync::traverseFolder(formattedDir, &traverser); //don't traverse into symlinks (analog to windows build) + FreeFileSync::traverseFolder(formattedDir, false, &traverser); //don't traverse into symlinks (analog to windows build) } catch (const FreeFileSync::FileError&) { diff --git a/algorithm.cpp b/algorithm.cpp index 1f34ca6a..a44fbebf 100644 --- a/algorithm.cpp +++ b/algorithm.cpp @@ -38,15 +38,15 @@ public: void execute(HierarchyObject& hierObj) const { - //process files - std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), *this); - //process directories - std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), *this); + Utility::Proxy prx(*this); //grant std::for_each access to private parts of this class + + std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), prx); //process files + std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), prx); //process links + std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), prx); //process directories } private: - template - friend Function std::for_each(Iterator, Iterator, Function); + friend class Utility::Proxy; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! void operator()(FileMapping& fileObj) const { @@ -82,6 +82,31 @@ private: } } + void operator()(SymLinkMapping& linkObj) const + { + switch (linkObj.getLinkCategory()) + { + case SYMLINK_LEFT_SIDE_ONLY: + linkObj.setSyncDir(config.exLeftSideOnly); + break; + case SYMLINK_RIGHT_SIDE_ONLY: + linkObj.setSyncDir(config.exRightSideOnly); + break; + case SYMLINK_LEFT_NEWER: + linkObj.setSyncDir(config.leftNewer); + break; + case SYMLINK_RIGHT_NEWER: + linkObj.setSyncDir(config.rightNewer); + break; + case SYMLINK_CONFLICT: + linkObj.setSyncDir(config.conflict); + break; + case SYMLINK_EQUAL: + linkObj.setSyncDir(SYNC_DIR_NONE); + break; + } + } + void operator()(DirMapping& dirObj) const { switch (dirObj.getDirCategory()) @@ -111,8 +136,9 @@ class FindNonEqual //test if non-equal items exist in scanned data public: bool findNonEqual(const HierarchyObject& hierObj) const { - return std::find_if(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), *this) != hierObj.useSubFiles().end() || //files - std::find_if(hierObj.useSubDirs(). begin(), hierObj.useSubDirs(). end(), *this) != hierObj.useSubDirs(). end(); //directories + return std::find_if(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), *this) != hierObj.useSubFiles().end() || //files + std::find_if(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), *this) != hierObj.useSubLinks(). end() || //symlinks + std::find_if(hierObj.useSubDirs(). begin(), hierObj.useSubDirs(). end(), *this) != hierObj.useSubDirs(). end(); //directories } //logical private! => __find_if (used by std::find_if) needs public access @@ -121,6 +147,11 @@ public: return fileObj.getCategory() != FILE_EQUAL; } + bool operator()(const SymLinkMapping& linkObj) const + { + return linkObj.getLinkCategory() != SYMLINK_EQUAL; + } + bool operator()(const DirMapping& dirObj) const { if (dirObj.getDirCategory() != DIR_EQUAL) @@ -225,7 +256,91 @@ private: }; -//----------------------------------- +//-------------------------------------------------------------------- +class DataSetSymlink +{ +public: + DataSetSymlink(const SymLinkMapping& linkObj, Loki::Int2Type) + { + init(linkObj); + } + + DataSetSymlink(const SymLinkMapping& linkObj, Loki::Int2Type) + { + init(linkObj); + } + + DataSetSymlink(const SymLinkContainer* linkCont) + { + if (linkCont) + { + const LinkDescriptor& dbData = linkCont->getData(); + data.lastWriteTime = &dbData.lastWriteTimeRaw; + data.targetPath = &dbData.targetPath; +#ifdef FFS_WIN //type of symbolic link is relevant for Windows only + data.type = dbData.type; +#endif + } + } + + bool operator==(const DataSetSymlink& other) const + { + if (data.lastWriteTime == NULL) //implicit test if object is existing at all + return other.data.lastWriteTime == NULL; + else + { + if (other.data.lastWriteTime == NULL) + return false; + else + { + //respect 2 second FAT/FAT32 precision! copying a file to a FAT32 drive changes it's modification date by up to 2 seconds + return *data.targetPath == *other.data.targetPath && +#ifdef FFS_WIN //comparison of symbolic link type is relevant for Windows only + data.type == other.data.type && +#endif + (!data.targetPath->empty() || ::sameFileTime(*data.lastWriteTime, *other.data.lastWriteTime, 2)); //date may be ignored, if targetPaths can actually be considered + } + } + } + + template + bool operator!=(const T& other) const + { + return !(*this == other); + } + +private: + template + void init(const SymLinkMapping& linkObj) + { + if (!linkObj.isEmpty()) + { + data.lastWriteTime = &linkObj.getLastWriteTime(); + data.targetPath = &linkObj.getTargetPath(); +#ifdef FFS_WIN //type of symbolic link is relevant for Windows only + data.type = linkObj.getLinkType(); +#endif + } + } + + struct DataReferences + { + DataReferences() : +#ifdef FFS_WIN //type of symbolic link is relevant for Windows only + type(LinkDescriptor::TYPE_FILE), +#endif + lastWriteTime(NULL), targetPath(NULL) {} + +#ifdef FFS_WIN + LinkDescriptor::LinkType type; +#endif + const wxLongLong* lastWriteTime; //use to test for overall object existence! + const Zstring* targetPath; + } data; +}; + + +//-------------------------------------------------------------------- class DataSetDir { public: @@ -264,6 +379,15 @@ DataSetFile retrieveDataSetFile(const Zstring& objShortName, const DirContainer* return DataSetFile(NULL); } +DataSetSymlink retrieveDataSetSymlink(const Zstring& objShortName, const DirContainer* dbDirectory) +{ + if (dbDirectory) + return dbDirectory->findLink(objShortName); //return value may be NULL + + //object not found + return DataSetSymlink(NULL); +} + std::pair retrieveDataSetDir(const Zstring& objShortName, const DirContainer* dbDirectory) { @@ -288,15 +412,15 @@ public: void execute(HierarchyObject& hierObj) const { - //files - std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), *this); - //directories - std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), *this); + Utility::Proxy prx(*this); //grant std::for_each access to private parts of this class + + std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), prx); //process files + std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), prx); //process links + std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), prx); //process directories } private: - template - friend Function std::for_each(Iterator, Iterator, Function); + friend class Utility::Proxy; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! void operator()(FileMapping& fileObj) const { @@ -313,6 +437,21 @@ private: fileObj.setSyncDirConflict(txtFilterChanged); //set syncDir = SYNC_DIR_INT_CONFLICT } + void operator()(SymLinkMapping& linkObj) const + { + const CompareSymlinkResult cat = linkObj.getLinkCategory(); + + if (cat == SYMLINK_EQUAL) + return; + + if (cat == SYMLINK_LEFT_SIDE_ONLY) + linkObj.setSyncDir(SYNC_DIR_RIGHT); + else if (cat == SYMLINK_RIGHT_SIDE_ONLY) + linkObj.setSyncDir(SYNC_DIR_LEFT); + else + linkObj.setSyncDirConflict(txtFilterChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + } + void operator()(DirMapping& dirObj) const { switch (dirObj.getDirCategory()) @@ -341,6 +480,7 @@ public: bool conflictFound(const HierarchyObject& hierObj) const { return std::find_if(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), *this) != hierObj.useSubFiles().end() || //files + std::find_if(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), *this) != hierObj.useSubLinks().end() || //symlinks std::find_if(hierObj.useSubDirs(). begin(), hierObj.useSubDirs(). end(), *this) != hierObj.useSubDirs(). end(); //directories } @@ -438,19 +578,19 @@ private: } - bool filterConflictFound(const FileMapping& fileObj) const + bool filterFileConflictFound(const Zstring& shortname) const { //if filtering would have excluded file during database creation, then we can't say anything about its former state - return (dbFilterLeft && !dbFilterLeft ->passFileFilter(fileObj.getObjShortName())) || - (dbFilterRight && !dbFilterRight->passFileFilter(fileObj.getObjShortName())); + return (dbFilterLeft && !dbFilterLeft ->passFileFilter(shortname)) || + (dbFilterRight && !dbFilterRight->passFileFilter(shortname)); } - bool filterConflictFound(const DirMapping& dirObj) const + bool filterDirConflictFound(const Zstring& shortname) const { //if filtering would have excluded directory during database creation, then we can't say anything about its former state - return (dbFilterLeft && !dbFilterLeft ->passDirFilter(dirObj.getObjShortName(), NULL)) || - (dbFilterRight && !dbFilterRight->passDirFilter(dirObj.getObjShortName(), NULL)); + return (dbFilterLeft && !dbFilterLeft ->passDirFilter(shortname, NULL)) || + (dbFilterRight && !dbFilterRight->passDirFilter(shortname, NULL)); } @@ -465,6 +605,9 @@ private: //process files std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), boost::bind(&RedetermineAuto::processFile, this, _1, dbDirectoryLeft, dbDirectoryRight)); + //process symbolic links + std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), + boost::bind(&RedetermineAuto::processSymlink, this, _1, dbDirectoryLeft, dbDirectoryRight)); //process directories std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), boost::bind(&RedetermineAuto::processDir, this, _1, dbDirectoryLeft, dbDirectoryRight)); @@ -494,7 +637,7 @@ private: //##################################################################################################### - if (filterConflictFound(fileObj)) + if (filterFileConflictFound(fileObj.getObjShortName())) { if (cat == FILE_LEFT_SIDE_ONLY) fileObj.setSyncDir(SYNC_DIR_RIGHT); @@ -550,13 +693,70 @@ private: } + void processSymlink(SymLinkMapping& linkObj, + const DirContainer* dbDirectoryLeft, + const DirContainer* dbDirectoryRight) + { + const CompareSymlinkResult cat = linkObj.getLinkCategory(); + if (cat == SYMLINK_EQUAL) + return; + + if (filterFileConflictFound(linkObj.getObjShortName())) //always use file filter: Link type may not be "stable" on Linux! + { + if (cat == SYMLINK_LEFT_SIDE_ONLY) + linkObj.setSyncDir(SYNC_DIR_RIGHT); + else if (cat == SYMLINK_RIGHT_SIDE_ONLY) + linkObj.setSyncDir(SYNC_DIR_LEFT); + else + linkObj.setSyncDirConflict(txtFilterChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + return; + } + + //determine datasets for change detection + const DataSetSymlink dataDbLeft = retrieveDataSetSymlink(linkObj.getObjShortName(), dbDirectoryLeft); + const DataSetSymlink dataDbRight = retrieveDataSetSymlink(linkObj.getObjShortName(), dbDirectoryRight); + + const DataSetSymlink dataCurrentLeft( linkObj, Loki::Int2Type()); + const DataSetSymlink dataCurrentRight(linkObj, Loki::Int2Type()); + + //evaluation + const bool changeOnLeft = dataDbLeft != dataCurrentLeft; + const bool changeOnRight = dataDbRight != dataCurrentRight; + + if (dataDbLeft == dataDbRight) //last sync seems to have been successful + { + if (changeOnLeft) + { + if (changeOnRight) + linkObj.setSyncDirConflict(txtBothSidesChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + else + linkObj.setSyncDir(SYNC_DIR_RIGHT); + } + else + { + if (changeOnRight) + linkObj.setSyncDir(SYNC_DIR_LEFT); + else + linkObj.setSyncDirConflict(txtNoSideChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + } + } + else //object did not complete last sync + { + if (changeOnLeft && changeOnRight) + linkObj.setSyncDirConflict(txtBothSidesChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + else + linkObj.setSyncDirConflict(txtLastSyncFail); //set syncDir = SYNC_DIR_INT_CONFLICT + } + } + + void processDir(DirMapping& dirObj, const DirContainer* dbDirectoryLeft, const DirContainer* dbDirectoryRight) { const CompareDirResult cat = dirObj.getDirCategory(); - if (filterConflictFound(dirObj)) + if (filterDirConflictFound(dirObj.getObjShortName())) { switch (cat) { @@ -567,7 +767,7 @@ private: dirObj.setSyncDir(SYNC_DIR_LEFT); break; case DIR_EQUAL: - ; //assert(false); + ; } SetDirChangedFilter().execute(dirObj); //filter issue for this directory => treat subfiles/-dirs the same @@ -697,15 +897,15 @@ public: void execute(HierarchyObject& hierObj) const { - //directories - std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), *this); - //files - std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), *this); + Utility::Proxy prx(*this); //grant std::for_each access to private parts of this class + + std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), prx); //process files + std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), prx); //process links + std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), prx); //process directories } private: - template - friend Function std::for_each(Iterator, Iterator, Function); + friend class Utility::Proxy; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! void operator()(FileMapping& fileObj) const { @@ -713,6 +913,12 @@ private: fileObj.setSyncDir(newDirection_); } + void operator()(SymLinkMapping& linkObj) const + { + if (linkObj.getLinkCategory() != SYMLINK_EQUAL) + linkObj.setSyncDir(newDirection_); + } + void operator()(DirMapping& dirObj) const { if (dirObj.getDirCategory() != DIR_EQUAL) @@ -729,9 +935,20 @@ void FreeFileSync::setSyncDirectionRec(SyncDirection newDirection, FileSystemObj if (fsObj.getCategory() != FILE_EQUAL) fsObj.setSyncDir(newDirection); - DirMapping* dirObj = dynamic_cast(&fsObj); - if (dirObj) //process subdirectories also! - SetNewDirection(newDirection).execute(*dirObj); + //process subdirectories also! + struct Recurse: public FSObjectVisitor + { + Recurse(SyncDirection newDirect) : newDirection_(newDirect) {} + virtual void visit(const FileMapping& fileObj) {} + virtual void visit(const SymLinkMapping& linkObj) {} + virtual void visit(const DirMapping& dirObj) + { + SetNewDirection(newDirection_).execute(const_cast(dirObj)); //phyiscal object is not const in this method anyway + } +private: + const SyncDirection newDirection_; + } recurse(newDirection); + fsObj.accept(recurse); } @@ -748,19 +965,26 @@ public: void execute(FreeFileSync::HierarchyObject& hierObj) const //don't create ambiguity by replacing with operator() { - std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), *this); //files - std::for_each(hierObj.useSubDirs(). begin(), hierObj.useSubDirs().end(), *this); //directories + Utility::Proxy > prx(*this); //grant std::for_each access to private parts of this class + + std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), prx); //process files + std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), prx); //process links + std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), prx); //process directories } private: - template - friend Function std::for_each(Iterator, Iterator, Function); + friend class Utility::Proxy >; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! void operator()(FreeFileSync::FileMapping& fileObj) const { fileObj.setActive(include); } + void operator()(FreeFileSync::SymLinkMapping& linkObj) const + { + linkObj.setActive(include); + } + void operator()(FreeFileSync::DirMapping& dirObj) const { dirObj.setActive(include); @@ -782,17 +1006,36 @@ void FreeFileSync::setActiveStatus(bool newStatus, FreeFileSync::FileSystemObjec { fsObj.setActive(newStatus); - DirMapping* dirObj = dynamic_cast(&fsObj); - if (dirObj) //process subdirectories also! +//process subdirectories also! + struct Recurse: public FSObjectVisitor { - if (newStatus) - InOrExcludeAllRows().execute(*dirObj); - else - InOrExcludeAllRows().execute(*dirObj); - } + Recurse(bool newStat) : newStatus_(newStat) {} + virtual void visit(const FileMapping& fileObj) {} + virtual void visit(const SymLinkMapping& linkObj) {} + virtual void visit(const DirMapping& dirObj) + { + if (newStatus_) + InOrExcludeAllRows().execute(const_cast(dirObj)); //object is not physically const here anyway + else + InOrExcludeAllRows().execute(const_cast(dirObj)); // + } +private: + const bool newStatus_; + } recurse(newStatus); + fsObj.accept(recurse); } +namespace +{ +enum FilterStrategy +{ + STRATEGY_ALL, + STRATEGY_ACTIVE_ONLY + //STRATEGY_INACTIVE_ONLY -> logical conflict with InOrExcludeAllRows +}; + +template class FilterData { public: @@ -800,21 +1043,28 @@ public: void execute(FreeFileSync::HierarchyObject& hierObj) const { - //files - std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), *this); + Utility::Proxy prx(*this); //grant std::for_each access to private parts of this class - //directories - std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), *this); + std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), prx); //files + std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), prx); //symlinks + std::for_each(hierObj.useSubDirs(). begin(), hierObj.useSubDirs(). end(), prx); //directories }; private: - template - friend Function std::for_each(Iterator, Iterator, Function); + friend class Utility::Proxy; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! + bool processObject(FreeFileSync::FileSystemObject& fsObj) const; void operator()(FreeFileSync::FileMapping& fileObj) const { - fileObj.setActive(filterProc.passFileFilter(fileObj.getObjRelativeName())); + if (processObject(fileObj)) + fileObj.setActive(filterProc.passFileFilter(fileObj.getObjRelativeName())); + } + + void operator()(FreeFileSync::SymLinkMapping& linkObj) const + { + if (processObject(linkObj)) + linkObj.setActive(filterProc.passFileFilter(linkObj.getObjRelativeName())); } void operator()(FreeFileSync::DirMapping& dirObj) const @@ -822,21 +1072,42 @@ private: bool subObjMightMatch = true; const bool filterPassed = filterProc.passDirFilter(dirObj.getObjRelativeName(), &subObjMightMatch); - dirObj.setActive(filterPassed); + if (processObject(dirObj)) + dirObj.setActive(filterPassed); - if (subObjMightMatch) //use same logic like directory traversing here: evaluate filter in subdirs only if objects could match - execute(dirObj); //recursion - else + if (!subObjMightMatch) //use same logic like directory traversing here: evaluate filter in subdirs only if objects could match + { InOrExcludeAllRows().execute(dirObj); //exclude all files dirs in subfolders + return; + } + + execute(dirObj); //recursion } const BaseFilter& filterProc; }; -void FreeFileSync::applyFiltering(const BaseFilter& filter, FreeFileSync::BaseDirMapping& baseDirectory) +template <> //process all elements +inline +bool FilterData::processObject(FreeFileSync::FileSystemObject& fsObj) const +{ + return true; +} + +template <> +inline +bool FilterData::processObject(FreeFileSync::FileSystemObject& fsObj) const +{ + return fsObj.isActive(); +} +} + + +void FreeFileSync::addExcludeFiltering(const Zstring& excludeFilter, FolderComparison& folderCmp) { - FilterData(filter).execute(baseDirectory); + for (std::vector::iterator i = folderCmp.begin(); i != folderCmp.end(); ++i) + FilterData(*BaseFilter::FilterRef(new NameFilter(DefaultStr("*"), excludeFilter))).execute(*i); } @@ -862,11 +1133,10 @@ void FreeFileSync::applyFiltering(const MainConfiguration& currentMainCfg, Folde { BaseDirMapping& baseDirectory = folderCmp[i - allPairs.begin()]; - applyFiltering(*combineFilters(globalFilter, - BaseFilter::FilterRef(new NameFilter( - i->localFilter.includeFilter, - i->localFilter.excludeFilter))), - baseDirectory); + FilterData(*combineFilters(globalFilter, + BaseFilter::FilterRef(new NameFilter( + i->localFilter.includeFilter, + i->localFilter.excludeFilter)))).execute(baseDirectory); } } @@ -952,10 +1222,33 @@ void deleteFromGridAndHDOneSide(std::vector& rowsToDeleteOneS FreeFileSync::moveToRecycleBin(fsObj->getFullName()); //throw (FileError) else { - if (isDirectoryMapping(*fsObj)) - FreeFileSync::removeDirectory(fsObj->getFullName()); - else - FreeFileSync::removeFile(fsObj->getFullName()); + //del directories and symlinks + struct DeletePermanently : public FSObjectVisitor + { + virtual void visit(const FileMapping& fileObj) + { + FreeFileSync::removeFile(fileObj.getFullName()); + } + + virtual void visit(const SymLinkMapping& linkObj) + { + switch (linkObj.getLinkType()) + { + case LinkDescriptor::TYPE_DIR: + FreeFileSync::removeDirectory(linkObj.getFullName()); + break; + case LinkDescriptor::TYPE_FILE: + FreeFileSync::removeFile(linkObj.getFullName()); + break; + } + } + + virtual void visit(const DirMapping& dirObj) + { + FreeFileSync::removeDirectory(dirObj.getFullName()); + } + } delPerm; + fsObj->accept(delPerm); } fsObj->removeObject(); //if directory: removes recursively! diff --git a/algorithm.h b/algorithm.h index 902750d0..cdd278ac 100644 --- a/algorithm.h +++ b/algorithm.h @@ -29,8 +29,8 @@ void setSyncDirectionRec(SyncDirection newDirection, FileSystemObject& fsObj); / bool allElementsEqual(const FolderComparison& folderCmp); //filtering -void applyFiltering(const MainConfiguration& currentMainCfg, FolderComparison& folderCmp); -void applyFiltering(const BaseFilter& filter, BaseDirMapping& baseDirectory); +void applyFiltering(const MainConfiguration& currentMainCfg, FolderComparison& folderCmp); //full filter apply +void addExcludeFiltering(const Zstring& excludeFilter, FolderComparison& folderCmp); //exclude additional entries only void setActiveStatus(bool newStatus, FolderComparison& folderCmp); //activate or deactivate all rows void setActiveStatus(bool newStatus, FileSystemObject& fsObj); //activate or deactivate row: works recursively! diff --git a/comparison.cpp b/comparison.cpp index e85334e0..66bfb0ca 100644 --- a/comparison.cpp +++ b/comparison.cpp @@ -73,9 +73,10 @@ public: virtual ~DirCallback() {} - virtual ReturnValue onFile(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink, const FileInfo& details); - virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink); - virtual ReturnValue onError(const wxString& errorText); + virtual void onFile(const DefaultChar* shortName, const Zstring& fullName, const FileInfo& details); + virtual void onSymlink(const DefaultChar* shortName, const Zstring& fullName, const SymlinkInfo& details); + virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName); + virtual void onError(const wxString& errorText); private: BaseDirCallback* const baseCallback_; @@ -91,23 +92,20 @@ class BaseDirCallback : public DirCallback friend class DirCallback; public: BaseDirCallback(DirContainer& output, - bool processSymlinks, - bool traverseDirSymlinks, + SymLinkHandling handleSymlinks, const BaseFilter::FilterRef& filter, StatusHandler* handler) : DirCallback(this, Zstring(), output, handler), - processSymlinks_(processSymlinks), - traverseDirSymlinks_(traverseDirSymlinks), + handleSymlinks_(handleSymlinks), textScanning(wxToZ(wxString(_("Scanning:")) + wxT(" \n"))), filterInstance(filter) {} - virtual TraverseCallback::ReturnValue onFile(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink, const TraverseCallback::FileInfo& details); + virtual void onFile(const DefaultChar* shortName, const Zstring& fullName, const TraverseCallback::FileInfo& details); private: typedef boost::shared_ptr CallbackPointer; - bool processSymlinks_; - bool traverseDirSymlinks_; + const SymLinkHandling handleSymlinks_; const Zstring textScanning; std::vector callBackBox; //collection of callback pointers to handle ownership @@ -115,7 +113,7 @@ private: }; -TraverseCallback::ReturnValue DirCallback::onFile(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink, const FileInfo& details) +void DirCallback::onFile(const DefaultChar* shortName, const Zstring& fullName, const FileInfo& details) { //assemble status message (performance optimized) = textScanning + wxT("\"") + fullName + wxT("\"") Zstring statusText = baseCallback_->textScanning; @@ -128,17 +126,11 @@ TraverseCallback::ReturnValue DirCallback::onFile(const DefaultChar* shortName, statusHandler->updateStatusText(statusText); //------------------------------------------------------------------------------------ - if (isSymlink && !baseCallback_->processSymlinks_) //handle symbolic links - { - statusHandler->requestUiRefresh(); - return TRAVERSING_CONTINUE; - } - //apply filter before processing (use relative name!) if (!baseCallback_->filterInstance->passFileFilter(relNameParentPf_ + shortName)) { statusHandler->requestUiRefresh(); - return TRAVERSING_CONTINUE; + return; } //warning: for windows retrieveFileID is slow as hell! approximately 3 * 10^-4 s per file! @@ -157,14 +149,13 @@ TraverseCallback::ReturnValue DirCallback::onFile(const DefaultChar* shortName, statusHandler->updateProcessedData(1, 0); //NO performance issue at all //trigger display refresh statusHandler->requestUiRefresh(); - - return TRAVERSING_CONTINUE; } -TraverseCallback::ReturnValDir DirCallback::onDir(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink) +void DirCallback::onSymlink(const DefaultChar* shortName, const Zstring& fullName, const SymlinkInfo& details) { - using globalFunctions::FILE_NAME_SEPARATOR; + if (baseCallback_->handleSymlinks_ == SYMLINK_IGNORE) + return; //assemble status message (performance optimized) = textScanning + wxT("\"") + fullName + wxT("\"") Zstring statusText = baseCallback_->textScanning; @@ -177,22 +168,40 @@ TraverseCallback::ReturnValDir DirCallback::onDir(const DefaultChar* shortName, statusHandler->updateStatusText(statusText); //------------------------------------------------------------------------------------ + const Zstring& relName = relNameParentPf_ + shortName; - bool traverseSubdirs = true; - - if (isSymlink) //handle symbolic links + //apply filter before processing (use relative name!) + if (!baseCallback_->filterInstance->passFileFilter(relName)) //always use file filter: Link type may not be "stable" on Linux! { - if (!baseCallback_->processSymlinks_) - { - statusHandler->requestUiRefresh(); - return Loki::Int2Type(); //do NOT traverse subdirs - } - else - traverseSubdirs = baseCallback_->traverseDirSymlinks_; + statusHandler->requestUiRefresh(); + return; } - Zstring relName = relNameParentPf_; - relName += shortName; + output_.addSubLink(shortName, LinkDescriptor(details.lastWriteTimeRaw, details.targetPath, details.dirLink ? LinkDescriptor::TYPE_DIR : LinkDescriptor::TYPE_FILE)); + + //add 1 element to the progress indicator + statusHandler->updateProcessedData(1, 0); //NO performance issue at all + //trigger display refresh + statusHandler->requestUiRefresh(); +} + + +TraverseCallback::ReturnValDir DirCallback::onDir(const DefaultChar* shortName, const Zstring& fullName) +{ + using globalFunctions::FILE_NAME_SEPARATOR; + + //assemble status message (performance optimized) = textScanning + wxT("\"") + fullName + wxT("\"") + Zstring statusText = baseCallback_->textScanning; + statusText.reserve(statusText.length() + fullName.length() + 2); + statusText += DefaultChar('\"'); + statusText += fullName; + statusText += DefaultChar('\"'); + + //update UI/commandline status information + statusHandler->updateStatusText(statusText); + +//------------------------------------------------------------------------------------ + const Zstring& relName = relNameParentPf_ + shortName; //apply filter before processing (use relative name!) bool subObjMightMatch = true; @@ -200,72 +209,46 @@ TraverseCallback::ReturnValDir DirCallback::onDir(const DefaultChar* shortName, { statusHandler->requestUiRefresh(); - if (subObjMightMatch) - { - DirContainer& subDir = output_.addSubDir(shortName); - - if (traverseSubdirs) - { - DirCallback* subDirCallback = new DirCallback(baseCallback_, relName += FILE_NAME_SEPARATOR, subDir, statusHandler); - baseCallback_->callBackBox.push_back(BaseDirCallback::CallbackPointer(subDirCallback)); //handle ownership - //attention: ensure directory filtering is applied later to exclude actually filtered directories - return ReturnValDir(Loki::Int2Type(), subDirCallback); - } - else - return Loki::Int2Type(); - } - else + if (!subObjMightMatch) return Loki::Int2Type(); //do NOT traverse subdirs } - + else + { + statusHandler->updateProcessedData(1, 0); //NO performance issue at all + statusHandler->requestUiRefresh(); //trigger display refresh + } DirContainer& subDir = output_.addSubDir(shortName); - //add 1 element to the progress indicator - statusHandler->updateProcessedData(1, 0); //NO performance issue at all - //trigger display refresh - statusHandler->requestUiRefresh(); - - if (traverseSubdirs) - { - DirCallback* subDirCallback = new DirCallback(baseCallback_, relName += FILE_NAME_SEPARATOR, subDir, statusHandler); - baseCallback_->callBackBox.push_back(BaseDirCallback::CallbackPointer(subDirCallback)); //handle ownership - - return ReturnValDir(Loki::Int2Type(), subDirCallback); - } - else - return Loki::Int2Type(); + DirCallback* subDirCallback = new DirCallback(baseCallback_, relName + FILE_NAME_SEPARATOR, subDir, statusHandler); + baseCallback_->callBackBox.push_back(BaseDirCallback::CallbackPointer(subDirCallback)); //handle ownership + //attention: ensure directory filtering is applied later to exclude actually filtered directories + return ReturnValDir(Loki::Int2Type(), subDirCallback); } -TraverseCallback::ReturnValue DirCallback::onError(const wxString& errorText) +void DirCallback::onError(const wxString& errorText) { while (true) { switch (statusHandler->reportError(errorText)) { case ErrorHandler::IGNORE_ERROR: - return TRAVERSING_CONTINUE; + return; case ErrorHandler::RETRY: break; //I have to admit "retry" is a bit of a fake here... at least the user has opportunity to abort! } } - - return TRAVERSING_CONTINUE; //dummy value } -TraverseCallback::ReturnValue BaseDirCallback::onFile( - const DefaultChar* shortName, - const Zstring& fullName, - bool isSymlink, - const TraverseCallback::FileInfo& details) +void BaseDirCallback::onFile(const DefaultChar* shortName, const Zstring& fullName, const TraverseCallback::FileInfo& details) { //do not list the database file(s) sync.ffs_db, sync.x64.ffs_db, etc. if (Zstring(shortName).AfterLast(DefaultChar('.')).cmpFileName(DefaultStr("ffs_db")) == 0) - return TraverseCallback::TRAVERSING_CONTINUE; + return; - return DirCallback::onFile(shortName, fullName, isSymlink, details); + DirCallback::onFile(shortName, fullName, details); } @@ -297,11 +280,9 @@ struct DirBufferKey class CompareProcess::DirectoryBuffer //buffer multiple scans of the same directories { public: - DirectoryBuffer(bool processSymLinks, - bool traverseDirectorySymlinks, + DirectoryBuffer(SymLinkHandling handleSymlinks, StatusHandler* statusUpdater) : - processSymLinks_(processSymLinks), - traverseDirectorySymlinks_(traverseDirectorySymlinks), + handleSymlinks_(handleSymlinks), statusUpdater_(statusUpdater) {} const DirContainer& getDirectoryDescription(const Zstring& directoryPostfixed, const BaseFilter::FilterRef& filter); @@ -314,8 +295,7 @@ private: BufferType buffer; - const bool processSymLinks_; - const bool traverseDirectorySymlinks_; + const SymLinkHandling handleSymlinks_; StatusHandler* statusUpdater_; }; //------------------------------------------------------------------------------------------ @@ -328,13 +308,26 @@ DirContainer& CompareProcess::DirectoryBuffer::insertIntoBuffer(const DirBufferK if (FreeFileSync::dirExists(newKey.directoryName)) //folder existence already checked in startCompareProcess(): do not treat as error when arriving here! { std::auto_ptr traverser(new BaseDirCallback(*baseContainer, - processSymLinks_, - traverseDirectorySymlinks_, + handleSymlinks_, newKey.filter, statusUpdater_)); + bool followSymlinks = false; + switch (handleSymlinks_) + { + case SYMLINK_IGNORE: + followSymlinks = false; //=> symlinks will be reported via onSymlink() where they are excluded + break; + case SYMLINK_USE_DIRECTLY: + followSymlinks = false; + break; + case SYMLINK_FOLLOW_LINK: + followSymlinks = true; + break; + } + //get all files and folders from directoryPostfixed (and subdirectories) - traverseFolder(newKey.directoryName, traverser.get()); //exceptions may be thrown! + traverseFolder(newKey.directoryName, followSymlinks, traverser.get()); //exceptions may be thrown! } return *baseContainer.get(); } @@ -516,6 +509,7 @@ struct ToBeRemoved { return !dirObj.isActive() && dirObj.useSubDirs(). size() == 0 && + dirObj.useSubLinks().size() == 0 && dirObj.useSubFiles().size() == 0; } }; @@ -532,7 +526,8 @@ public: HierarchyObject::SubDirMapping& subDirs = hierObj.useSubDirs(); //process subdirs recursively - std::for_each(subDirs.begin(), subDirs.end(), *this); + Utility::Proxy prx(*this); //grant std::for_each access to private parts of this class + std::for_each(subDirs.begin(), subDirs.end(), prx); //remove superfluous directories subDirs.erase( @@ -541,8 +536,7 @@ public: } private: - template - friend Function std::for_each(Iterator, Iterator, Function); + friend class Utility::Proxy; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! void operator()(DirMapping& dirObj) { @@ -565,8 +559,7 @@ void formatPair(FolderPairCfg& input) //############################################################################################################################# -CompareProcess::CompareProcess(bool processSymLinks, - bool traverseSymLinks, +CompareProcess::CompareProcess(SymLinkHandling handleSymlinks, size_t fileTimeTol, bool ignoreOneHourDiff, xmlAccess::OptionalDialogs& warnings, @@ -577,7 +570,7 @@ CompareProcess::CompareProcess(bool processSymLinks, statusUpdater(handler), txtComparingContentOfFiles(wxToZ(_("Comparing content of files %x")).Replace(DefaultStr("%x"), DefaultStr("\n\"%x\""), false)) { - directoryBuffer.reset(new DirectoryBuffer(processSymLinks, traverseSymLinks, handler)); + directoryBuffer.reset(new DirectoryBuffer(handleSymlinks, handler)); } @@ -718,7 +711,8 @@ wxString getConflictSameDateDiffSize(const FileMapping& fileObj) //check for files that have a difference in file modification date below 1 hour when DST check is active -wxString getConflictChangeWithinHour(const FileMapping& fileObj) +template +wxString getConflictChangeWithinHour(const FileOrLinkMapping& fileObj) { //some beautification... wxString left = wxString(_("Left")) + wxT(": "); @@ -727,25 +721,81 @@ wxString getConflictChangeWithinHour(const FileMapping& fileObj) wxString msg = _("Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to decide which one is newer due to Daylight Saving Time issues."); msg += wxString(wxT("\n")) + _("(Note that only FAT/FAT32 drives are affected by this problem!\nIn all other cases you can disable the setting \"ignore 1-hour difference\".)"); - msg.Replace(wxT("%x"), wxString(wxT("\"")) + zToWx(fileObj.getRelativeName()) + wxT("\"")); + msg.Replace(wxT("%x"), wxString(wxT("\"")) + zToWx(fileObj.template getRelativeName()) + wxT("\"")); msg += wxT("\n\n"); - msg += left + wxT("\t") + _("Date") + wxT(": ") + utcTimeToLocalString(fileObj.getLastWriteTime()) + wxT("\n"); - msg += right + wxT("\t") + _("Date") + wxT(": ") + utcTimeToLocalString(fileObj.getLastWriteTime()); + msg += left + wxT("\t") + _("Date") + wxT(": ") + utcTimeToLocalString(fileObj.template getLastWriteTime()) + wxT("\n"); + msg += right + wxT("\t") + _("Date") + wxT(": ") + utcTimeToLocalString(fileObj.template getLastWriteTime()); return wxString(_("Conflict detected:")) + wxT("\n") + msg; } //----------------------------------------------------------------------------- -inline -bool sameFileTime(const wxLongLong& a, const wxLongLong& b, size_t tolerance) +class CmpFileTime { - if (a < b) - return b <= a + tolerance; - else - return a <= b + tolerance; -} +public: + CmpFileTime(bool ignoreOneHourDifference, size_t tolerance) : + ignoreOneHourDifference_(ignoreOneHourDifference), + tolerance_(tolerance) {} + + enum Result + { + TIME_EQUAL, + TIME_LEFT_NEWER, + TIME_RIGHT_NEWER, + TIME_LEFT_INVALID, + TIME_RIGHT_INVALID, + TIME_DST_CHANGE_WITHIN_HOUR + }; + + Result getResult(const wxLongLong& lhs, const wxLongLong& rhs) const + { + if (lhs == rhs) + return TIME_EQUAL; + + //number of seconds since Jan 1st 1970 + 1 year (needn't be too precise) + static const long oneYearFromNow = wxGetUTCTime() + 365 * 24 * 3600; + //check for erroneous dates (but only if dates are not (EXACTLY) the same) + if (lhs < 0 || lhs > oneYearFromNow) //earlier than Jan 1st 1970 or more than one year in future + return TIME_LEFT_INVALID; -void CompareProcess::compareByTimeSize(const std::vector& directoryPairsFormatted, FolderComparison& output) + if (rhs < 0 || rhs > oneYearFromNow) + return TIME_RIGHT_INVALID; + + if (sameFileTime(lhs, rhs, tolerance_)) //last write time may differ by up to 2 seconds (NTFS vs FAT32) + return TIME_EQUAL; + + //DST +/- 1-hour check: test if time diff is exactly +/- 1-hour (respecting 2 second FAT precision) + if (ignoreOneHourDifference_ && sameFileTime(lhs, rhs, 3600 + 2)) + { + //date diff < 1 hour is a conflict: it's not safe to determine which file is newer + if (sameFileTime(lhs, rhs, 3600 - 2 - 1)) + return TIME_DST_CHANGE_WITHIN_HOUR; + else //exact +/- 1-hour detected: treat as equal + return TIME_EQUAL; + } + + //regular time comparison + if (lhs < rhs) + return TIME_RIGHT_NEWER; + else + return TIME_LEFT_NEWER; + } + +private: + static bool sameFileTime(const wxLongLong& a, const wxLongLong& b, size_t tolerance) + { + if (a < b) + return b <= a + tolerance; + else + return a <= b + tolerance; + } + + const bool ignoreOneHourDifference_; + const size_t tolerance_; +}; + + +void CompareProcess::compareByTimeSize(const std::vector& directoryPairsFormatted, FolderComparison& output) const { output.reserve(output.size() + directoryPairsFormatted.size()); @@ -762,69 +812,41 @@ void CompareProcess::compareByTimeSize(const std::vector& directo performBaseComparison(output.back(), compareCandidates); //PERF_START; + const CmpFileTime timeCmp(ignoreOneHourDifference, fileTimeTolerance); //categorize files that exist on both sides for (std::vector::iterator i = compareCandidates.begin(); i != compareCandidates.end(); ++i) { FileMapping* const line = *i; - if (line->getLastWriteTime() != line->getLastWriteTime()) - { - //number of seconds since Jan 1st 1970 + 1 year (needn't be too precise) - static const long oneYearFromNow = wxGetUTCTime() + 365 * 24 * 3600; - - //check for erroneous dates (but only if dates are not (EXACTLY) the same) - if ( line->getLastWriteTime() < 0 || //earlier than Jan 1st 1970 - line->getLastWriteTime() < 0 || //earlier than Jan 1st 1970 - line->getLastWriteTime() > oneYearFromNow || //dated more than one year in future - line->getLastWriteTime() > oneYearFromNow) //dated more than one year in future - { - if (line->getLastWriteTime() < 0 || line->getLastWriteTime() > oneYearFromNow) - line->setCategoryConflict(getConflictInvalidDate(line->getFullName(), line->getLastWriteTime())); - else - line->setCategoryConflict(getConflictInvalidDate(line->getFullName(), line->getLastWriteTime())); - } - else //from this block on all dates are at least "valid" - { - //last write time may differ by up to 2 seconds (NTFS vs FAT32) - if (sameFileTime(line->getLastWriteTime(), line->getLastWriteTime(), fileTimeTolerance)) - { - if (line->getFileSize() == line->getFileSize()) - line->setCategory(); - else - line->setCategoryConflict(getConflictSameDateDiffSize(*line)); //same date, different filesize - } - else - { - //finally: DST +/- 1-hour check: test if time diff is exactly +/- 1-hour (respecting 2 second FAT precision) - if (ignoreOneHourDifference && sameFileTime(line->getLastWriteTime(), line->getLastWriteTime(), 3600 + 2)) - { - //date diff < 1 hour is a conflict: it's not safe to determine which file is newer - if (sameFileTime(line->getLastWriteTime(), line->getLastWriteTime(), 3600 - 2 - 1)) - line->setCategoryConflict(getConflictChangeWithinHour(*line)); - else //exact +/- 1-hour detected: treat as equal - { - if (line->getFileSize() == line->getFileSize()) - line->setCategory(); - else - line->setCategoryConflict(getConflictSameDateDiffSize(*line)); //same date, different filesize - } - } - else - { - if (line->getLastWriteTime() < line->getLastWriteTime()) - line->setCategory(); - else - line->setCategory(); - } - } - } - } - else //same write time + + switch (timeCmp.getResult(line->getLastWriteTime(), line->getLastWriteTime())) { + case CmpFileTime::TIME_EQUAL: if (line->getFileSize() == line->getFileSize()) line->setCategory(); else line->setCategoryConflict(getConflictSameDateDiffSize(*line)); //same date, different filesize + break; + + case CmpFileTime::TIME_LEFT_NEWER: + line->setCategory(); + break; + + case CmpFileTime::TIME_RIGHT_NEWER: + line->setCategory(); + break; + + case CmpFileTime::TIME_LEFT_INVALID: + line->setCategoryConflict(getConflictInvalidDate(line->getFullName(), line->getLastWriteTime())); + break; + + case CmpFileTime::TIME_RIGHT_INVALID: + line->setCategoryConflict(getConflictInvalidDate(line->getFullName(), line->getLastWriteTime())); + break; + + case CmpFileTime::TIME_DST_CHANGE_WITHIN_HOUR: + line->setCategoryConflict(getConflictChangeWithinHour(*line)); + break; } } } @@ -842,7 +864,7 @@ wxULongLong getBytesToCompare(const std::vector& rowsToCompare) } -void CompareProcess::compareByContent(const std::vector& directoryPairsFormatted, FolderComparison& output) +void CompareProcess::compareByContent(const std::vector& directoryPairsFormatted, FolderComparison& output) const { //PERF_START; std::vector compareCandidates; @@ -936,8 +958,10 @@ void CompareProcess::compareByContent(const std::vector& director class MergeSides { public: - MergeSides(std::vector& appendUndefinedOut) : - appendUndefined(appendUndefinedOut) {} + MergeSides(std::vector& appendUndefinedFileOut, + std::vector& appendUndefinedLinkOut) : + appendUndefinedFile(appendUndefinedFileOut), + appendUndefinedLink(appendUndefinedLinkOut) {} void execute(const DirContainer& leftSide, const DirContainer& rightSide, HierarchyObject& output); @@ -945,20 +969,25 @@ private: template void fillOneSide(const DirContainer& dirCont, HierarchyObject& output); - std::vector& appendUndefined; + std::vector& appendUndefinedFile; + std::vector& appendUndefinedLink; }; template <> void MergeSides::fillOneSide(const DirContainer& dirCont, HierarchyObject& output) { - //reserve() fulfills two task here: 1. massive performance improvement! 2. ensure references in appendUndefined remain valid! + //reserve() fulfills one task here: massive performance improvement! output.useSubFiles().reserve(dirCont.fileCount()); output.useSubDirs(). reserve(dirCont.dirCount()); + output.useSubLinks().reserve(dirCont.linkCount()); for (DirContainer::SubFileList::const_iterator i = dirCont.fileBegin(); i != dirCont.fileEnd(); ++i) output.addSubFile(i->second.getData(), i->first); + for (DirContainer::SubLinkList::const_iterator i = dirCont.linkBegin(); i != dirCont.linkEnd(); ++i) + output.addSubLink(i->second.getData(), i->first); + for (DirContainer::SubDirList::const_iterator i = dirCont.dirBegin(); i != dirCont.dirEnd(); ++i) { DirMapping& newDirMap = output.addSubDir(true, i->first, false); @@ -970,13 +999,17 @@ void MergeSides::fillOneSide(const DirContainer& dirCont, HierarchyOb template <> void MergeSides::fillOneSide(const DirContainer& dirCont, HierarchyObject& output) { - //reserve() fulfills two task here: 1. massive performance improvement! 2. ensure references in appendUndefined remain valid! + //reserve() fulfills one task here: massive performance improvement! output.useSubFiles().reserve(dirCont.fileCount()); output.useSubDirs(). reserve(dirCont.dirCount()); + output.useSubLinks().reserve(dirCont.linkCount()); for (DirContainer::SubFileList::const_iterator i = dirCont.fileBegin(); i != dirCont.fileEnd(); ++i) output.addSubFile(i->first, i->second.getData()); + for (DirContainer::SubLinkList::const_iterator i = dirCont.linkBegin(); i != dirCont.linkEnd(); ++i) + output.addSubLink(i->first, i->second.getData()); + for (DirContainer::SubDirList::const_iterator i = dirCont.dirBegin(); i != dirCont.dirEnd(); ++i) { DirMapping& newDirMap = output.addSubDir(false, i->first, true); @@ -988,7 +1021,7 @@ void MergeSides::fillOneSide(const DirContainer& dirCont, HierarchyO void MergeSides::execute(const DirContainer& leftSide, const DirContainer& rightSide, HierarchyObject& output) { //ATTENTION: HierarchyObject::retrieveById() can only work correctly if the following conditions are fulfilled: - //1. on each level, files are added first, then directories (=> file id < dir id) + //1. on each level, files are added first, symlinks, then directories (=> file id < link id < dir id) //2. when a directory is added, all subdirectories must be added immediately (recursion) before the next dir on this level is added //3. entries may be deleted but NEVER new ones inserted!!! //=> this allows for a quasi-binary search by id! @@ -998,6 +1031,7 @@ void MergeSides::execute(const DirContainer& leftSide, const DirContainer& right //reserve() fulfills two task here: 1. massive performance improvement! 2. ensure references in appendUndefined remain valid! output.useSubFiles().reserve(leftSide.fileCount() + rightSide.fileCount()); //assume worst case! output.useSubDirs(). reserve(leftSide.dirCount() + rightSide.dirCount()); // + output.useSubLinks().reserve(leftSide.linkCount() + rightSide.linkCount()); // for (DirContainer::SubFileList::const_iterator i = leftSide.fileBegin(); i != leftSide.fileEnd(); ++i) { @@ -1014,7 +1048,7 @@ void MergeSides::execute(const DirContainer& leftSide, const DirContainer& right i->first, FILE_EQUAL, //FILE_EQUAL is just a dummy-value here rightFile->getData()); - appendUndefined.push_back(&newEntry); + appendUndefinedFile.push_back(&newEntry); } } @@ -1026,6 +1060,34 @@ void MergeSides::execute(const DirContainer& leftSide, const DirContainer& right } +//----------------------------------------------------------------------------------------------- + for (DirContainer::SubLinkList::const_iterator i = leftSide.linkBegin(); i != leftSide.linkEnd(); ++i) + { + const SymLinkContainer* rightLink = rightSide.findLink(i->first); + + //find files that exist on left but not on right + if (rightLink == NULL) + output.addSubLink(i->second.getData(), i->first); + //find files that exist on left and right + else + { + SymLinkMapping& newEntry = output.addSubLink( + i->second.getData(), + i->first, + SYMLINK_EQUAL, //SYMLINK_EQUAL is just a dummy-value here + rightLink->getData()); + appendUndefinedLink.push_back(&newEntry); + } + } + + //find files that exist on right but not on left + for (DirContainer::SubLinkList::const_iterator j = rightSide.linkBegin(); j != rightSide.linkEnd(); ++j) + { + if (leftSide.findLink(j->first) == NULL) + output.addSubLink(j->first, j->second.getData()); + } + + //----------------------------------------------------------------------------------------------- for (DirContainer::SubDirList::const_iterator i = leftSide.dirBegin(); i != leftSide.dirEnd(); ++i) { @@ -1056,9 +1118,65 @@ void MergeSides::execute(const DirContainer& leftSide, const DirContainer& right } -void CompareProcess::performBaseComparison(BaseDirMapping& output, std::vector& appendUndefined) +void CompareProcess::categorizeSymlink(SymLinkMapping* linkObj) const +{ + //categorize symlinks that exist on both sides + if ( +#ifdef FFS_WIN //type of symbolic link is relevant for Windows only + linkObj->getLinkType() == linkObj->getLinkType() && +#endif + !linkObj->getTargetPath().empty() && + linkObj->getTargetPath() == linkObj->getTargetPath()) + + { + linkObj->setCategory(); + return; + } + + switch (CmpFileTime(ignoreOneHourDifference, fileTimeTolerance).getResult(linkObj->getLastWriteTime(), linkObj->getLastWriteTime())) + { + case CmpFileTime::TIME_EQUAL: + if ( +#ifdef FFS_WIN //type of symbolic link is relevant for Windows only + linkObj->getLinkType() == linkObj->getLinkType() && +#endif + linkObj->getTargetPath() == linkObj->getTargetPath()) //may both be empty if following link failed + linkObj->setCategory(); + else + { + wxString conflictMsg = wxString(_("Conflict detected:")) + wxT("\n") + _("Symlinks %x have the same date but a different target!"); + conflictMsg.Replace(wxT("%x"), wxString(wxT("\"")) + zToWx(linkObj->getRelativeName()) + wxT("\"")); + linkObj->setCategoryConflict(conflictMsg); + } + break; + + case CmpFileTime::TIME_LEFT_NEWER: + linkObj->setCategory(); + break; + + case CmpFileTime::TIME_RIGHT_NEWER: + linkObj->setCategory(); + break; + + case CmpFileTime::TIME_LEFT_INVALID: + linkObj->setCategoryConflict(getConflictInvalidDate(linkObj->getFullName(), linkObj->getLastWriteTime())); + break; + + case CmpFileTime::TIME_RIGHT_INVALID: + linkObj->setCategoryConflict(getConflictInvalidDate(linkObj->getFullName(), linkObj->getLastWriteTime())); + break; + + case CmpFileTime::TIME_DST_CHANGE_WITHIN_HOUR: + linkObj->setCategoryConflict(getConflictChangeWithinHour(*linkObj)); + break; + } +} + + +void CompareProcess::performBaseComparison(BaseDirMapping& output, std::vector& appendUndefined) const { assert(output.useSubDirs(). empty()); + assert(output.useSubLinks().empty()); assert(output.useSubFiles().empty()); //PERF_START; @@ -1078,5 +1196,9 @@ void CompareProcess::performBaseComparison(BaseDirMapping& output, std::vector undefinedLinks; + MergeSides(appendUndefined, undefinedLinks).execute(directoryLeft, directoryRight, output); + + //finish symlink categorization + std::for_each(undefinedLinks.begin(), undefinedLinks.end(), boost::bind(&CompareProcess::categorizeSymlink, this, _1)); } diff --git a/comparison.h b/comparison.h index caa237c0..e6d95d40 100644 --- a/comparison.h +++ b/comparison.h @@ -10,6 +10,7 @@ #include "fileHierarchy.h" #include "library/processXml.h" #include "library/statusHandler.h" +#include "structures.h" namespace FreeFileSync @@ -40,8 +41,7 @@ std::vector extractCompareCfg(const MainConfiguration& mainCfg); class CompareProcess { public: - CompareProcess(bool processSymLinks, - bool traverseSymLinks, + CompareProcess(SymLinkHandling handleSymlinks, size_t fileTimeTol, bool ignoreOneHourDiff, xmlAccess::OptionalDialogs& warnings, @@ -52,12 +52,13 @@ public: FolderComparison& output); private: - void compareByTimeSize(const std::vector& directoryPairsFormatted, FolderComparison& output); - - void compareByContent(const std::vector& directoryPairsFormatted, FolderComparison& output); + void compareByTimeSize(const std::vector& directoryPairsFormatted, FolderComparison& output) const; + void compareByContent( const std::vector& directoryPairsFormatted, FolderComparison& output) const; //create comparison result table and fill category except for files existing on both sides - void performBaseComparison(BaseDirMapping& output, std::vector& appendUndefined); + void performBaseComparison(BaseDirMapping& output, std::vector& appendUndefined) const; + + void categorizeSymlink(SymLinkMapping* linkObj) const; //buffer accesses to the same directories; useful when multiple folder pairs are used class DirectoryBuffer; diff --git a/fileHierarchy.cpp b/fileHierarchy.cpp index b8c4c3bc..7b0df8cb 100644 --- a/fileHierarchy.cpp +++ b/fileHierarchy.cpp @@ -9,7 +9,8 @@ using namespace FreeFileSync; - +namespace +{ struct LowerID { bool operator()(const FileSystemObject& a, HierarchyObject::ObjectID b) const @@ -27,12 +28,13 @@ struct LowerID return a < b.getId(); } }; +} const FileSystemObject* HierarchyObject::retrieveById(ObjectID id) const //returns NULL if object is not found { //ATTENTION: HierarchyObject::retrieveById() can only work correctly if the following conditions are fulfilled: - //1. on each level, files are added first, then directories (=> file id < dir id) + //1. on each level, files are added first, symlinks, then directories (=> file id < link id < dir id) //2. when a directory is added, all subdirectories must be added immediately (recursion) before the next dir on this level is added //3. entries may be deleted but NEVER new ones inserted!!! //=> this allows for a quasi-binary search by id! @@ -50,16 +52,26 @@ const FileSystemObject* HierarchyObject::retrieveById(ObjectID id) const //retur else //id found return &(*i); } - else //search within sub-directories + + //search within sub-symlinks + SubLinkMapping::const_iterator j = std::lower_bound(subLinks.begin(), subLinks.end(), id, LowerID()); //binary search! + if (j != subLinks.end()) { - SubDirMapping::const_iterator j = std::lower_bound(subDirs.begin(), subDirs.end(), id, LowerID()); //binary search! - if (j != subDirs.end() && !LowerID()(id, *j)) //id == j + //id <= i + if (LowerID()(id, *j)) + return NULL; // --i < id < i + else //id found return &(*j); - else if (j == subDirs.begin()) //either begin() == end() or id < begin() - return NULL; - else - return (--j)->retrieveById(id); //j != begin() and id < j } + + //search within sub-directories + SubDirMapping::const_iterator k = std::lower_bound(subDirs.begin(), subDirs.end(), id, LowerID()); //binary search! + if (k != subDirs.end() && !LowerID()(id, *k)) //id == j + return &(*k); + else if (k == subDirs.begin()) //either begin() == end() or id < begin() + return NULL; + else + return (--k)->retrieveById(id); //j != begin() and id < j } @@ -74,13 +86,12 @@ struct IsInvalid void FileSystemObject::removeEmptyNonRec(HierarchyObject& hierObj) { - //remove invalid files - hierObj.useSubFiles().erase(std::remove_if(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), IsInvalid()), - hierObj.useSubFiles().end()); - - //remove invalid directories - hierObj.useSubDirs().erase(std::remove_if(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), IsInvalid()), - hierObj.useSubDirs().end()); + //remove invalid files: + hierObj.useSubFiles().erase(std::remove_if(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), IsInvalid()), hierObj.useSubFiles().end()); + //remove invalid symlinks: + hierObj.useSubLinks().erase(std::remove_if(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), IsInvalid()), hierObj.useSubLinks().end()); + //remove invalid directories: + hierObj.useSubDirs(). erase(std::remove_if(hierObj.useSubDirs(). begin(), hierObj.useSubDirs(). end(), IsInvalid()), hierObj.useSubDirs(). end()); } diff --git a/fileHierarchy.h b/fileHierarchy.h index ef439c29..aad0a995 100644 --- a/fileHierarchy.h +++ b/fileHierarchy.h @@ -22,11 +22,29 @@ class DirectoryBuffer; +namespace Utility //helper class to allow algorithms like std::for_each access to private parts of a predicate class +{ +template +class Proxy +{ +public: + Proxy(T& target) : target_(target) {} + template void operator()(FS& obj) const + { + target_(obj); + } + +private: + T& target_; +}; +} + + namespace FreeFileSync { struct FileDescriptor { - FileDescriptor(const wxLongLong& lastWriteTimeRawIn, + FileDescriptor(const wxLongLong& lastWriteTimeRawIn, const wxULongLong& fileSizeIn) : //const Utility::FileID fileId) : lastWriteTimeRaw(lastWriteTimeRawIn), @@ -39,6 +57,27 @@ struct FileDescriptor }; +struct LinkDescriptor +{ + enum LinkType + { + TYPE_DIR, //Windows: dir symlink; Linux: dir symlink + TYPE_FILE //Windows: file symlink; Linux: file symlink or broken link (or other symlink, pathological) + }; + + LinkDescriptor(const wxLongLong& lastWriteTimeRawIn, + const Zstring& targetPathIn, + LinkType lt) : + lastWriteTimeRaw(lastWriteTimeRawIn), + targetPath(targetPathIn), + type(lt) {} + + wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long) + Zstring targetPath; //symlink "content", may be empty if determination failed + LinkType type; //type is required for Windows only! On Linux there is no such thing => consider this when comparing Symbolic Links! +}; + + enum SelectedSide { LEFT_SIDE, @@ -47,8 +86,10 @@ enum SelectedSide class FileContainer; -class FileMapping; +class SymLinkContainer; class DirMapping; +class FileMapping; +class SymLinkMapping; class FileSystemObject; class BaseDirMapping; class HierarchyObject; @@ -66,6 +107,7 @@ class DirContainer { public: void addSubFile(const Zstring& shortName, const FileDescriptor& fileData); + void addSubLink(const Zstring& shortName, const LinkDescriptor& linkData); DirContainer& addSubDir(const Zstring& shortName); //------------------------------------------------------------------ @@ -74,8 +116,9 @@ public: bool operator()(const Zstring& a, const Zstring& b) const; }; - typedef std::map SubDirList; //key: shortName - typedef std::map SubFileList; // + typedef std::map SubDirList; //key: shortName + typedef std::map SubFileList; // + typedef std::map SubLinkList; // //------------------------------------------------------------------ //iterator access: std::map is implementation detail! don't expose @@ -85,17 +128,23 @@ public: SubFileList::const_iterator fileBegin() const; SubFileList::const_iterator fileEnd() const; + SubLinkList::const_iterator linkBegin() const; + SubLinkList::const_iterator linkEnd() const; + size_t dirCount() const; size_t fileCount() const; + size_t linkCount() const; - const DirContainer* findDir (const Zstring& shortName) const; //returns NULL if not found - const FileContainer* findFile(const Zstring& shortName) const; // + const DirContainer* findDir (const Zstring& shortName) const; //returns NULL if not found + const FileContainer* findFile(const Zstring& shortName) const; // + const SymLinkContainer* findLink(const Zstring& shortName) const; // DirContainer() {} //default constructor use for base directory only! private: SubDirList subDirs; //contained directories SubFileList subFiles; //contained files + SubLinkList subLinks; //contained symlinks (note: only symlinks that are not treated as their target are placed here!) }; //------------------------------------------------------------------ @@ -106,39 +155,41 @@ public: private: friend class DirContainer; - - FileContainer(const FileDescriptor& fileData) : - data(fileData) {} + FileContainer(const FileDescriptor& fileData) : data(fileData) {} const FileDescriptor data; }; - -//------------------------------------------------------------------ -struct DirInformation +class SymLinkContainer { - //filter settings (used when retrieving directory data) - BaseFilter::FilterRef filter; +public: + const LinkDescriptor& getData() const; + +private: + friend class DirContainer; + SymLinkContainer(const LinkDescriptor& linkData) : data(linkData) {} - //hierarchical directory information - DirContainer baseDirContainer; + const LinkDescriptor data; }; +//------------------------------------------------------------------ //save/load full directory information const Zstring& getSyncDBFilename(); //get short filename of database file //------------------------------------------------------------------ /* class hierarchy: - FileSystemObject HierarchyObject - /|\ /|\ - ______|______ ______|______ - | | | | -FileMapping DirMapping BaseDirMapping + FileSystemObject HierarchyObject + /|\ /|\ + _______________|______________ ______|______ + | | | | | +SymLinkMapping FileMapping DirMapping BaseDirMapping */ //------------------------------------------------------------------ + + class HierarchyObject { public: @@ -159,16 +210,28 @@ public: void addSubFile(const Zstring& fileNameShort, //file exists on right side only const FileDescriptor& right); + SymLinkMapping& addSubLink(const LinkDescriptor& left, //link exists on both sides + const Zstring& linkNameShort, + CompareSymlinkResult defaultCmpResult, + const LinkDescriptor& right); + void addSubLink(const LinkDescriptor& left, //link exists on left side only + const Zstring& linkNameShort); + void addSubLink(const Zstring& linkNameShort, //link exists on right side only + const LinkDescriptor& right); + const Zstring& getRelativeNamePf() const; //get name relative to base sync dir with FILE_NAME_SEPARATOR postfix: "blah\" template const Zstring& getBaseDir() const; //postfixed! - typedef std::vector SubFileMapping; //MergeSides::execute() requires a structure that doesn't invalidate pointers after push_back() - typedef std::vector SubDirMapping; //Note: deque<> has circular reference in VCPP! + typedef std::vector SubFileMapping; //MergeSides::execute() requires a structure that doesn't invalidate pointers after push_back() + typedef std::vector SubDirMapping; //Note: deque<> has circular reference in VCPP! + typedef std::vector SubLinkMapping; - SubDirMapping& useSubDirs(); SubFileMapping& useSubFiles(); - const SubDirMapping& useSubDirs() const; + SubLinkMapping& useSubLinks(); + SubDirMapping& useSubDirs(); const SubFileMapping& useSubFiles() const; + const SubLinkMapping& useSubLinks() const; + const SubDirMapping& useSubDirs() const; protected: //constructor used by DirMapping @@ -182,13 +245,15 @@ protected: const Zstring& dirPostfixedRight) : baseDirLeft(dirPostfixedLeft), baseDirRight(dirPostfixedRight) {} + ~HierarchyObject() {} //don't need polymorphic deletion virtual void swap(); private: - SubDirMapping subDirs; //contained directory maps SubFileMapping subFiles; //contained file maps + SubLinkMapping subLinks; //contained symbolic link maps + SubDirMapping subDirs; //contained directory maps Zstring relNamePf; Zstring baseDirLeft; //directory name ending with FILE_NAME_SEPARATOR @@ -227,10 +292,22 @@ struct RelNamesBuffered }; + +class FSObjectVisitor +{ +public: + virtual ~FSObjectVisitor() {} + virtual void visit(const FileMapping& fileObj) = 0; + virtual void visit(const SymLinkMapping& linkObj) = 0; + virtual void visit(const DirMapping& dirObj) = 0; +}; + //------------------------------------------------------------------ class FileSystemObject { public: + virtual void accept(FSObjectVisitor& visitor) const = 0; + const Zstring getParentRelativeName() const; //get name relative to base sync dir without FILE_NAME_SEPARATOR postfix const Zstring getObjRelativeName() const; //same as getRelativeName() but also returns value if either side is empty const Zstring& getObjShortName() const; //same as getShortName() but also returns value if either side is empty @@ -313,8 +390,10 @@ private: class DirMapping : public FileSystemObject, public HierarchyObject { public: + virtual void accept(FSObjectVisitor& visitor) const; + virtual CompareFilesResult getCategory() const; - CompareDirResult getDirCategory() const; //returns actually used subsed of CompareFilesResult + CompareDirResult getDirCategory() const; //returns actually used subset of CompareFilesResult virtual const wxString& getCatConflict() const; private: @@ -333,7 +412,7 @@ private: const HierarchyObject& parent) : FileSystemObject(existsLeft, existsRight, dirNameShort, parent), HierarchyObject(parent, dirNameShort), - cmpResult(!existsRight ? DIR_LEFT_SIDE_ONLY : existsLeft ? DIR_EQUAL : DIR_RIGHT_SIDE_ONLY) {} + cmpResult(!existsRight ? DIR_LEFT_SIDE_ONLY : (existsLeft ? DIR_EQUAL : DIR_RIGHT_SIDE_ONLY)) {} //categorization CompareDirResult cmpResult; @@ -343,10 +422,11 @@ private: class FileMapping : public FileSystemObject { public: + virtual void accept(FSObjectVisitor& visitor) const; + template const wxLongLong& getLastWriteTime() const; template const wxULongLong& getFileSize() const; template const Zstring getExtension() const; - //template const Utility::FileID& getFileID() const; virtual CompareFilesResult getCategory() const; virtual const wxString& getCatConflict() const; @@ -398,6 +478,66 @@ private: FileDescriptor dataRight; }; +//------------------------------------------------------------------ +class SymLinkMapping : public FileSystemObject //this class models a TRUE symbolic link, i.e. one that is NEVER dereferenced: deref-links should be directly placed in class File/DirMapping +{ +public: + virtual void accept(FSObjectVisitor& visitor) const; + + template const wxLongLong& getLastWriteTime() const; //write time of the link, NOT target! + template LinkDescriptor::LinkType getLinkType() const; + template const Zstring& getTargetPath() const; + + virtual CompareFilesResult getCategory() const; + CompareSymlinkResult getLinkCategory() const; //returns actually used subset of CompareFilesResult + virtual const wxString& getCatConflict() const; + +private: + friend class CompareProcess; //only CompareProcess shall be allowed to change cmpResult + friend class HierarchyObject; //construction + virtual void swap(); + virtual void removeObjectL(); + virtual void removeObjectR(); + virtual void copyToL(); + virtual void copyToR(); + + template + void setCategory(); + void setCategoryConflict(const wxString& description); + + SymLinkMapping(const LinkDescriptor& left, //link exists on both sides + const Zstring& linkNameShort, + CompareSymlinkResult defaultCmpResult, + const LinkDescriptor& right, + const HierarchyObject& parent) : + FileSystemObject(true, true, linkNameShort, parent), + cmpResult(defaultCmpResult), + dataLeft(left), + dataRight(right) {} + SymLinkMapping(const LinkDescriptor& left, //link exists on left side only + const Zstring& linkNameShort, + const HierarchyObject& parent) : + FileSystemObject(true, false, linkNameShort, parent), + cmpResult(SYMLINK_LEFT_SIDE_ONLY), + dataLeft(left), + dataRight(0, Zstring(), LinkDescriptor::TYPE_FILE) {} + SymLinkMapping(const Zstring& linkNameShort, //link exists on right side only + const LinkDescriptor& right, + const HierarchyObject& parent) : + FileSystemObject(false, true, linkNameShort, parent), + cmpResult(SYMLINK_RIGHT_SIDE_ONLY), + dataLeft(0, Zstring(), LinkDescriptor::TYPE_FILE), + dataRight(right) {} + //------------------------------------------------------------------ + + //categorization + CompareSymlinkResult cmpResult; + wxString cmpConflictDescr; //only filled if cmpResult == SYMLINK_CONFLICT + + LinkDescriptor dataLeft; + LinkDescriptor dataRight; +}; + //------------------------------------------------------------------ class BaseDirMapping : public HierarchyObject //synchronization base directory { @@ -421,9 +561,9 @@ typedef std::vector FolderComparison; //------------------------------------------------------------------ -//convenience methods -//test whether FileSystemObject is a DirMapping -bool isDirectoryMapping(const FileSystemObject& fsObj); + + + @@ -452,6 +592,27 @@ bool isDirectoryMapping(const FileSystemObject& fsObj); //---------------Inline Implementation--------------------------------------------------- +inline //inline virtual... admittedly its use may be limited +void FileMapping::accept(FSObjectVisitor& visitor) const +{ + visitor.visit(*this); +} + + +inline +void DirMapping::accept(FSObjectVisitor& visitor) const +{ + visitor.visit(*this); +} + + +inline +void SymLinkMapping::accept(FSObjectVisitor& visitor) const +{ + visitor.visit(*this); +} + + inline FileSystemObject* HierarchyObject::retrieveById(ObjectID id) //returns NULL if object is not found { @@ -516,6 +677,20 @@ DirContainer::SubFileList::const_iterator DirContainer::fileEnd() const } +inline +DirContainer::SubLinkList::const_iterator DirContainer::linkBegin() const +{ + return subLinks.begin(); +} + + +inline +DirContainer::SubLinkList::const_iterator DirContainer::linkEnd() const +{ + return subLinks.end(); +} + + inline size_t DirContainer::dirCount() const { @@ -530,6 +705,13 @@ size_t DirContainer::fileCount() const } +inline +size_t DirContainer::linkCount() const +{ + return subLinks.size(); +} + + inline const DirContainer* DirContainer::findDir(const Zstring& shortName) const { @@ -546,6 +728,14 @@ const FileContainer* DirContainer::findFile(const Zstring& shortName) const } +inline +const SymLinkContainer* DirContainer::findLink(const Zstring& shortName) const +{ + const SubLinkList::const_iterator iter = subLinks.find(shortName); + return iter == subLinks.end() ? NULL : &iter->second; +} + + inline const FileDescriptor& FileContainer::getData() const { @@ -553,6 +743,13 @@ const FileDescriptor& FileContainer::getData() const } +inline +const LinkDescriptor& SymLinkContainer::getData() const +{ + return data; +} + + inline DirContainer& DirContainer::addSubDir(const Zstring& shortName) { @@ -567,6 +764,13 @@ void DirContainer::addSubFile(const Zstring& shortName, const FileDescriptor& fi } +inline +void DirContainer::addSubLink(const Zstring& shortName, const LinkDescriptor& linkData) +{ + subLinks.insert(std::make_pair(shortName, SymLinkContainer(linkData))); +} + + inline CompareFilesResult FileMapping::getCategory() const { @@ -799,6 +1003,8 @@ void HierarchyObject::swap() std::for_each(subFiles.begin(), subFiles.end(), std::mem_fun_ref(&FileMapping::swap)); //directories std::for_each(subDirs.begin(), subDirs.end(), std::mem_fun_ref(&DirMapping::swap)); + //symbolic links + std::for_each(subLinks.begin(), subLinks.end(), std::mem_fun_ref(&SymLinkMapping::swap)); } @@ -846,6 +1052,33 @@ void HierarchyObject::addSubFile(const Zstring& fileNameShort, //file e } +inline +SymLinkMapping& HierarchyObject::addSubLink(const LinkDescriptor& left, //link exists on both sides + const Zstring& linkNameShort, + CompareSymlinkResult defaultCmpResult, + const LinkDescriptor& right) +{ + subLinks.push_back(SymLinkMapping(left, linkNameShort, defaultCmpResult, right, *this)); + return subLinks.back(); +} + + +inline +void HierarchyObject::addSubLink(const LinkDescriptor& left, //link exists on left side only + const Zstring& linkNameShort) +{ + subLinks.push_back(SymLinkMapping(left, linkNameShort, *this)); +} + + +inline +void HierarchyObject::addSubLink(const Zstring& linkNameShort, //link exists on right side only + const LinkDescriptor& right) +{ + subLinks.push_back(SymLinkMapping(linkNameShort, right, *this)); +} + + inline const HierarchyObject::SubDirMapping& HierarchyObject::useSubDirs() const { @@ -860,6 +1093,13 @@ const HierarchyObject::SubFileMapping& HierarchyObject::useSubFiles() const } +inline +const HierarchyObject::SubLinkMapping& HierarchyObject::useSubLinks() const +{ + return subLinks; +} + + inline HierarchyObject::SubDirMapping& HierarchyObject::useSubDirs() { @@ -874,6 +1114,13 @@ HierarchyObject::SubFileMapping& HierarchyObject::useSubFiles() } +inline +HierarchyObject::SubLinkMapping& HierarchyObject::useSubLinks() +{ + return const_cast(static_cast(this)->useSubLinks()); +} + + inline void BaseDirMapping::swap() { @@ -909,7 +1156,8 @@ void DirMapping::removeObjectL() { cmpResult = DIR_RIGHT_SIDE_ONLY; std::for_each(useSubFiles().begin(), useSubFiles().end(), std::mem_fun_ref(&FileSystemObject::removeObject)); - std::for_each(useSubDirs().begin(), useSubDirs().end(), std::mem_fun_ref(&FileSystemObject::removeObject)); + std::for_each(useSubLinks().begin(), useSubLinks().end(), std::mem_fun_ref(&FileSystemObject::removeObject)); + std::for_each(useSubDirs(). begin(), useSubDirs() .end(), std::mem_fun_ref(&FileSystemObject::removeObject)); } @@ -918,7 +1166,8 @@ void DirMapping::removeObjectR() { cmpResult = DIR_LEFT_SIDE_ONLY; std::for_each(useSubFiles().begin(), useSubFiles().end(), std::mem_fun_ref(&FileSystemObject::removeObject)); - std::for_each(useSubDirs().begin(), useSubDirs().end(), std::mem_fun_ref(&FileSystemObject::removeObject)); + std::for_each(useSubLinks().begin(), useSubLinks().end(), std::mem_fun_ref(&FileSystemObject::removeObject)); + std::for_each(useSubDirs(). begin(), useSubDirs(). end(), std::mem_fun_ref(&FileSystemObject::removeObject)); } @@ -1022,8 +1271,7 @@ inline void FileMapping::copyToL() { cmpResult = FILE_EQUAL; - dataLeft = FileDescriptor(dataRight.lastWriteTimeRaw, - dataRight.fileSize); + dataLeft = dataRight; //Utility::FileID()); //attention! do not copy FileID! It is retained on file renaming only! } @@ -1032,8 +1280,7 @@ inline void FileMapping::copyToR() { cmpResult = FILE_EQUAL; - dataRight = FileDescriptor(dataLeft.lastWriteTimeRaw, - dataLeft.fileSize); + dataRight = dataLeft; //Utility::FileID()); //attention! do not copy FileID! It is retained on file renaming only! } @@ -1084,25 +1331,156 @@ const Zstring FileMapping::getExtension() const } -//template <> -//inline -//const Utility::FileID& FileMapping::getFileID() const -//{ -// return dataLeft.fileIdentifier; -//} -// -// -//template <> -//inline -//const Utility::FileID& FileMapping::getFileID() const -//{ -// return dataRight.fileIdentifier; -//} +template <> +inline +const wxLongLong& SymLinkMapping::getLastWriteTime() const +{ + return dataLeft.lastWriteTimeRaw; +} + + +template <> +inline +const wxLongLong& SymLinkMapping::getLastWriteTime() const +{ + return dataRight.lastWriteTimeRaw; +} + +template <> inline -bool isDirectoryMapping(const FileSystemObject& fsObj) + +LinkDescriptor::LinkType SymLinkMapping::getLinkType() const { - return dynamic_cast(&fsObj) != NULL; + return dataLeft.type; +} + + +template <> +inline +LinkDescriptor::LinkType SymLinkMapping::getLinkType() const +{ + return dataRight.type; +} + + +template <> +inline +const Zstring& SymLinkMapping::getTargetPath() const +{ + return dataLeft.targetPath; +} + + +template <> +inline +const Zstring& SymLinkMapping::getTargetPath() const +{ + return dataRight.targetPath; +} + + +inline +CompareFilesResult SymLinkMapping::getCategory() const +{ + return convertToFilesResult(cmpResult); +} + + +inline +CompareSymlinkResult SymLinkMapping::getLinkCategory() const +{ + return cmpResult; +} + + +inline +const wxString& SymLinkMapping::getCatConflict() const +{ + return cmpConflictDescr; +} + + +inline +void SymLinkMapping::swap() +{ + //call base class versions + FileSystemObject::swap(); + + //swap compare result + switch (cmpResult) + { + case SYMLINK_LEFT_SIDE_ONLY: + cmpResult = SYMLINK_RIGHT_SIDE_ONLY; + break; + case SYMLINK_RIGHT_SIDE_ONLY: + cmpResult = SYMLINK_LEFT_SIDE_ONLY; + break; + case SYMLINK_LEFT_NEWER: + cmpResult = SYMLINK_RIGHT_NEWER; + break; + case SYMLINK_RIGHT_NEWER: + cmpResult = SYMLINK_LEFT_NEWER; + break; + case SYMLINK_EQUAL: + case SYMLINK_CONFLICT: + break; + } + + std::swap(dataLeft, dataRight); +} + + +inline +void SymLinkMapping::removeObjectL() +{ + cmpResult = SYMLINK_RIGHT_SIDE_ONLY; + dataLeft = LinkDescriptor(0, Zstring(), LinkDescriptor::TYPE_FILE); +} + + +inline +void SymLinkMapping::removeObjectR() +{ + cmpResult = SYMLINK_LEFT_SIDE_ONLY; + dataRight = LinkDescriptor(0, Zstring(), LinkDescriptor::TYPE_FILE); +} + + +inline +void SymLinkMapping::copyToL() +{ + cmpResult = SYMLINK_EQUAL; + dataLeft = dataRight; +} + + +inline +void SymLinkMapping::copyToR() +{ + cmpResult = SYMLINK_EQUAL; + dataRight = dataLeft; +} + + +template +inline +void SymLinkMapping::setCategory() +{ + cmpResult = res; +} + + +template <> +inline +void SymLinkMapping::setCategory(); //if conflict is detected, use setCategoryConflict! => method is not defined! + + +inline +void SymLinkMapping::setCategoryConflict(const wxString& description) +{ + cmpResult = SYMLINK_CONFLICT; + cmpConflictDescr = description; } } diff --git a/library/CustomGrid.cpp b/library/CustomGrid.cpp index 5fc993ce..a9846f74 100644 --- a/library/CustomGrid.cpp +++ b/library/CustomGrid.cpp @@ -16,11 +16,11 @@ #include "../synchronization.h" #include "../shared/customTooltip.h" #include +#include "iconBuffer.h" +#include #ifdef FFS_WIN #include -#include -#include "iconBuffer.h" #include "statusHandler.h" #include @@ -53,14 +53,6 @@ class CustomGridTable : public wxGridTableBase public: CustomGridTable(int initialRows = 0, int initialCols = 0) : //note: initialRows/initialCols MUST match with GetNumberRows()/GetNumberCols() at initialization!!! wxGridTableBase(), - COLOR_BLUE( 80, 110, 255), - COLOR_GREY( 212, 208, 200), - COLOR_CMP_RED( 249, 163, 165), - COLOR_CMP_BLUE( 144, 232, 246), - COLOR_CMP_GREEN( 147, 253, 159), - COLOR_SYNC_BLUE( 201, 203, 247), - COLOR_SYNC_GREEN(197, 248, 190), - COLOR_YELLOW( 247, 252, 62), gridDataView(NULL), lastNrRows(initialRows), lastNrCols(initialCols) {} @@ -162,7 +154,7 @@ public: virtual wxGridCellAttr* GetAttr(int row, int col, wxGridCellAttr::wxAttrKind kind) { - const wxColour& color = getRowColor(row); + const wxColour color = getRowColor(row); //add color to some rows wxGridCellAttr* result = wxGridTableBase::GetAttr(row, col, kind); @@ -197,24 +189,36 @@ public: } protected: - const wxColour COLOR_BLUE; - const wxColour COLOR_GREY; - const wxColour COLOR_CMP_RED; - const wxColour COLOR_CMP_BLUE; - const wxColour COLOR_CMP_GREEN; - const wxColour COLOR_SYNC_BLUE; - const wxColour COLOR_SYNC_GREEN; - const wxColour COLOR_YELLOW; + static const wxColour COLOR_BLUE; + static const wxColour COLOR_GREY; + static const wxColour COLOR_ORANGE; + static const wxColour COLOR_CMP_RED; + static const wxColour COLOR_CMP_BLUE; + static const wxColour COLOR_CMP_GREEN; + static const wxColour COLOR_SYNC_BLUE; + static const wxColour COLOR_SYNC_GREEN; + static const wxColour COLOR_YELLOW; const GridView* gridDataView; //(very fast) access to underlying grid data :) private: - virtual const wxColour& getRowColor(int row) = 0; //rows that are filtered out are shown in different color + virtual const wxColour getRowColor(int row) = 0; //rows that are filtered out are shown in different color int lastNrRows; int lastNrCols; }; +//see http://www.latiumsoftware.com/en/articles/00015.php#12 for "safe" colors +const wxColour CustomGridTable::COLOR_ORANGE( 238, 201, 0); +const wxColour CustomGridTable::COLOR_BLUE( 80, 110, 255); +const wxColour CustomGridTable::COLOR_GREY( 212, 208, 200); +const wxColour CustomGridTable::COLOR_CMP_RED( 249, 163, 165); +const wxColour CustomGridTable::COLOR_CMP_BLUE( 144, 232, 246); +const wxColour CustomGridTable::COLOR_CMP_GREEN( 147, 253, 159); +const wxColour CustomGridTable::COLOR_SYNC_BLUE( 201, 203, 247); +const wxColour CustomGridTable::COLOR_SYNC_GREEN(197, 248, 190); +const wxColour CustomGridTable::COLOR_YELLOW( 247, 252, 62); + class CustomGridTableRim : public CustomGridTable { @@ -259,60 +263,143 @@ protected: { if (!fsObj->isEmpty()) { - const DirMapping* dirObj = dynamic_cast (fsObj); - if (dirObj != NULL) + struct GetValue : public FSObjectVisitor { - switch (getTypeAtPos(col)) + GetValue(xmlAccess::ColumnTypes colType) : colType_(colType) {} + virtual void visit(const FileMapping& fileObj) { - case xmlAccess::FULL_PATH: - return zToWx(dirObj->getFullName()); - case xmlAccess::FILENAME: - return wxEmptyString; - case xmlAccess::REL_PATH: - return zToWx(dirObj->getRelativeName()); - case xmlAccess::DIRECTORY: - return zToWx(dirObj->getBaseDirPf()); - case xmlAccess::SIZE: //file size - return _(""); - case xmlAccess::DATE: //date - return wxEmptyString; - case xmlAccess::EXTENSION: //file extension - return wxEmptyString; + switch (colType_) + { + case xmlAccess::FULL_PATH: + value = zToWx(fileObj.getFullName().BeforeLast(globalFunctions::FILE_NAME_SEPARATOR)); + break; + case xmlAccess::FILENAME: //filename + value = zToWx(fileObj.getShortName()); + break; + case xmlAccess::REL_PATH: //relative path + value = zToWx(fileObj.getParentRelativeName()); + break; + case xmlAccess::DIRECTORY: + value = zToWx(fileObj.getBaseDirPf()); + break; + case xmlAccess::SIZE: //file size + value = FreeFileSync::numberToStringSep(fileObj.getFileSize()); + break; + case xmlAccess::DATE: //date + value = FreeFileSync::utcTimeToLocalString(fileObj.getLastWriteTime()); + break; + case xmlAccess::EXTENSION: //file extension + value = zToWx(fileObj.getExtension()); + break; + } } - } - else - { - const FileMapping* fileObj = dynamic_cast(fsObj); - if (fileObj != NULL) + + virtual void visit(const SymLinkMapping& linkObj) { - switch (getTypeAtPos(col)) + switch (colType_) { case xmlAccess::FULL_PATH: - return zToWx(fileObj->getFullName().BeforeLast(globalFunctions::FILE_NAME_SEPARATOR)); + value = zToWx(linkObj.getFullName().BeforeLast(globalFunctions::FILE_NAME_SEPARATOR)); + break; case xmlAccess::FILENAME: //filename - return zToWx(fileObj->getShortName()); + value = zToWx(linkObj.getShortName()); + break; case xmlAccess::REL_PATH: //relative path - return zToWx(fileObj->getParentRelativeName()); + value = zToWx(linkObj.getParentRelativeName()); + break; case xmlAccess::DIRECTORY: - return zToWx(fileObj->getBaseDirPf()); + value = zToWx(linkObj.getBaseDirPf()); + break; case xmlAccess::SIZE: //file size - return FreeFileSync::numberToWxString(fileObj->getFileSize(), true); + value = _(""); + break; case xmlAccess::DATE: //date - return FreeFileSync::utcTimeToLocalString(fileObj->getLastWriteTime()); + value = FreeFileSync::utcTimeToLocalString(linkObj.getLastWriteTime()); + break; case xmlAccess::EXTENSION: //file extension - return zToWx(fileObj->getExtension()); + value = wxEmptyString; + break; } } - } + + virtual void visit(const DirMapping& dirObj) + { + switch (colType_) + { + case xmlAccess::FULL_PATH: + value = zToWx(dirObj.getFullName()); + break; + case xmlAccess::FILENAME: + value = wxEmptyString; + break; + case xmlAccess::REL_PATH: + value = zToWx(dirObj.getRelativeName()); + break; + case xmlAccess::DIRECTORY: + value = zToWx(dirObj.getBaseDirPf()); + break; + case xmlAccess::SIZE: //file size + value = _(""); + break; + case xmlAccess::DATE: //date + value = wxEmptyString; + break; + case xmlAccess::EXTENSION: //file extension + value = wxEmptyString; + break; + } + } + xmlAccess::ColumnTypes colType_; + wxString value; + } getVal(getTypeAtPos(col)); + fsObj->accept(getVal); + return getVal.value; } } //if data is not found: return wxEmptyString; } + template + Zstring getIconFileImpl(size_t row) const //return "folder" if row points to a folder + { + const FileSystemObject* fsObj = getRawData(row); + if (fsObj && !fsObj->isEmpty()) + { + struct GetIcon : public FSObjectVisitor + { + virtual void visit(const FileMapping& fileObj) + { + //Optimization: if filename exists on both sides, always use left side's file: + //Icon should be the same on both sides anyway... + if (!fileObj.isEmpty() && !fileObj.isEmpty()) + iconName = fileObj.getFullName(); + else + iconName = fileObj.getFullName(); + } + virtual void visit(const SymLinkMapping& linkObj) + { + iconName = linkObj.getLinkType() == LinkDescriptor::TYPE_DIR ? + DefaultStr("folder") : + linkObj.getFullName(); + } + virtual void visit(const DirMapping& dirObj) + { + iconName = DefaultStr("folder"); + } + + Zstring iconName; + } getIcon; + fsObj->accept(getIcon); + return getIcon.iconName; + } + + return Zstring(); + } + private: - virtual const wxColour& getRowColor(int row) //rows that are filtered out are shown in different color + virtual const wxColour getRowColor(int row) //rows that are filtered out are shown in different color { const FileSystemObject* fsObj = getRawData(row); if (fsObj) @@ -320,11 +407,27 @@ private: //mark filtered rows if (!fsObj->isActive()) return COLOR_BLUE; - //mark directories - else if (isDirectoryMapping(*fsObj)) - return COLOR_GREY; - else - return *wxWHITE; + + //mark directories and symlinks + struct GetRowColor : public FSObjectVisitor + { + virtual void visit(const FileMapping& fileObj) + { + rowColor = *wxWHITE; + } + virtual void visit(const SymLinkMapping& linkObj) + { + rowColor = COLOR_ORANGE; + } + virtual void visit(const DirMapping& dirObj) + { + rowColor = COLOR_GREY; + } + + wxColour rowColor; + } getCol; + fsObj->accept(getCol); + return getCol.rowColor; } return *wxWHITE; } @@ -344,16 +447,7 @@ public: virtual Zstring getIconFile(size_t row) const //return "folder" if row points to a folder { - const FileSystemObject* fsObj = getRawData(row); - if (fsObj && !fsObj->isEmpty()) - { - if (isDirectoryMapping(*fsObj)) //it's a directory icon - return DefaultStr("folder"); - else - return fsObj->getFullName(); - } - - return Zstring(); + return getIconFileImpl(row); } }; @@ -368,23 +462,7 @@ public: virtual Zstring getIconFile(size_t row) const //return "folder" if row points to a folder { - const FileSystemObject* fsObj = getRawData(row); - if (fsObj && !fsObj->isEmpty()) - { - if (isDirectoryMapping(*fsObj)) //it's a directory icon - return DefaultStr("folder"); - else - { - //Optimization: if filename exists on both sides, always use left side's file: - //Icon should be the same on both sides anyway... - if (!fsObj->isEmpty()) - return fsObj->getFullName(); - else - return fsObj->getFullName(); - } - } - - return Zstring(); + return getIconFileImpl(row); } }; @@ -431,7 +509,7 @@ public: } private: - virtual const wxColour& getRowColor(int row) //rows that are filtered out are shown in different color + virtual const wxColour getRowColor(int row) //rows that are filtered out are shown in different color { const FileSystemObject* fsObj = getRawData(row); if (fsObj) @@ -502,10 +580,6 @@ CustomGrid::CustomGrid(wxWindow *parent, isLeading(false), m_marker(-1, ASCENDING) { - SetLayoutDirection(wxLayout_LeftToRight); // - GetGridWindow()->SetLayoutDirection(wxLayout_LeftToRight); //avoid mirroring this dialog in RTL languages like Hebrew or Arabic - GetGridColLabelWindow()->SetLayoutDirection(wxLayout_LeftToRight); // - //set color of selections wxColour darkBlue(40, 35, 140); SetSelectionBackground(darkBlue); @@ -550,6 +624,12 @@ void CustomGrid::initSettings(CustomGridLeft* gridLeft, } +void CustomGrid::release() //release connection to FreeFileSync::GridView +{ + setGridDataTable(NULL); +} + + bool CustomGrid::isLeadGrid() const { return isLeading; @@ -574,7 +654,6 @@ void CustomGrid::OnPaintGrid(wxEvent& event) } -inline void moveCursorWhileSelecting(const int anchor, const int oldPos, const int newPos, wxGrid* grid) { //note: all positions are valid in this context! @@ -951,7 +1030,6 @@ std::set CustomGrid::getAllSelectedRows() const //############################################################################################ //CustomGrid specializations -#ifdef FFS_WIN template class GridCellRenderer : public wxGridCellStringRenderer { @@ -1039,8 +1117,8 @@ public: m_loadIconSuccess[row] = iconLoaded && iconDrawnFully; } } + return; } - return; } //default @@ -1072,7 +1150,6 @@ private: static const int LEFT_BORDER = 2; }; -#endif //---------------------------------------------------------------------------------------- @@ -1082,10 +1159,7 @@ CustomGridRim::CustomGridRim(wxWindow *parent, const wxSize& size, long style, const wxString& name) : - CustomGrid(parent, id, pos, size, style, name) -#ifdef FFS_WIN - , fileIconsAreEnabled(false) -#endif + CustomGrid(parent, id, pos, size, style, name), fileIconsAreEnabled(false) {} @@ -1164,14 +1238,15 @@ xmlAccess::ColumnAttributes CustomGridRim::getColumnAttributes() void CustomGridRim::setColumnAttributes(const xmlAccess::ColumnAttributes& attr) { //remove special alignment for column "size" - for (int i = 0; i < GetNumberCols(); ++i) - if (getTypeAtPos(i) == xmlAccess::SIZE) - { - wxGridCellAttr* cellAttributes = GetOrCreateCellAttr(0, i); - cellAttributes->SetAlignment(wxALIGN_LEFT,wxALIGN_CENTRE); - SetColAttr(i, cellAttributes); - break; - } + if (GetLayoutDirection() != wxLayout_RightToLeft) //don't change for RTL languages + for (int i = 0; i < GetNumberCols(); ++i) + if (getTypeAtPos(i) == xmlAccess::SIZE) + { + wxGridCellAttr* cellAttributes = GetOrCreateCellAttr(0, i); + cellAttributes->SetAlignment(wxALIGN_LEFT,wxALIGN_CENTRE); + SetColAttr(i, cellAttributes); + break; + } //---------------------------------------------------------------------------------- columnSettings.clear(); @@ -1222,14 +1297,15 @@ void CustomGridRim::setColumnAttributes(const xmlAccess::ColumnAttributes& attr) //-------------------------------------------------------------------------------------------------------- //set special alignment for column "size" - for (int i = 0; i < GetNumberCols(); ++i) - if (getTypeAtPos(i) == xmlAccess::SIZE) - { - wxGridCellAttr* cellAttributes = GetOrCreateCellAttr(0, i); - cellAttributes->SetAlignment(wxALIGN_RIGHT, wxALIGN_CENTRE); - SetColAttr(i, cellAttributes); //make filesize right justified on grids - break; - } + if (GetLayoutDirection() != wxLayout_RightToLeft) //don't change for RTL languages + for (int i = 0; i < GetNumberCols(); ++i) + if (getTypeAtPos(i) == xmlAccess::SIZE) + { + wxGridCellAttr* cellAttributes = GetOrCreateCellAttr(0, i); + cellAttributes->SetAlignment(wxALIGN_RIGHT, wxALIGN_CENTRE); + SetColAttr(i, cellAttributes); //make filesize right justified on grids + break; + } ClearSelection(); ForceRefresh(); @@ -1328,7 +1404,6 @@ void CustomGridRim::autoSizeColumns() //performance optimized column resizer (a } -#ifdef FFS_WIN void CustomGridRim::enableFileIcons(const bool value) { fileIconsAreEnabled = value; @@ -1449,7 +1524,6 @@ void IconUpdater::loadIconsAsynchronously(wxEvent& event) //loads all (not yet) //event.Skip(); } -#endif //---------------------------------------------------------------------------------------- @@ -1591,6 +1665,11 @@ CustomGridMiddle::CustomGridMiddle(wxWindow *parent, gridDataTable(NULL), toolTip(new CustomTooltip) { + SetLayoutDirection(wxLayout_LeftToRight); // + GetGridWindow()->SetLayoutDirection(wxLayout_LeftToRight); //avoid mirroring this dialog in RTL languages like Hebrew or Arabic + GetGridColLabelWindow()->SetLayoutDirection(wxLayout_LeftToRight); // + + //connect events for dynamic selection of sync direction GetGridWindow()->Connect(wxEVT_MOTION, wxMouseEventHandler(CustomGridMiddle::OnMouseMovement), NULL, this); GetGridWindow()->Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(CustomGridMiddle::OnLeaveWindow), NULL, this); @@ -1848,6 +1927,11 @@ void CustomGridMiddle::enableSyncPreview(bool value) { assert(gridDataTable); gridDataTable->enableSyncPreview(value); + + if (value) + GetGridColLabelWindow()->SetToolTip(_("Synchronization Preview")); + else + GetGridColLabelWindow()->SetToolTip(_("Comparison Result")); } diff --git a/library/CustomGrid.h b/library/CustomGrid.h index 5f1823c0..0cace1a9 100644 --- a/library/CustomGrid.h +++ b/library/CustomGrid.h @@ -60,11 +60,13 @@ public: virtual ~CustomGrid() {} - void initSettings(CustomGridLeft* gridLeft, + void initSettings(CustomGridLeft* gridLeft, //create connection with FreeFileSync::GridView CustomGridMiddle* gridMiddle, CustomGridRight* gridRight, const FreeFileSync::GridView* gridDataView); + void release(); //release connection to FreeFileSync::GridView + std::set getAllSelectedRows() const; //set sort direction indicator on UI @@ -112,7 +114,6 @@ class GridCellRenderer; //----------------------------------------------------------- -#ifdef FFS_WIN class IconUpdater : private wxEvtHandler //update file icons periodically: use SINGLE instance to coordinate left and right grid at once { public: @@ -127,7 +128,6 @@ private: std::auto_ptr m_timer; //user timer event to periodically update icons: better than idle event because also active when scrolling! :) }; -#endif //############## SPECIALIZATIONS ################### @@ -159,15 +159,12 @@ public: void autoSizeColumns(); //performance optimized column resizer void autoSizeColumns(int col, bool doRefresh = true); // -#ifdef FFS_WIN void enableFileIcons(const bool value); -#endif private: CustomGridTableRim* getGridDataTable(); virtual const CustomGridTableRim* getGridDataTable() const = 0; -#ifdef FFS_WIN //asynchronous icon loading void getIconsToBeLoaded(std::vector& newLoad); //loads all (not yet) drawn icons @@ -183,7 +180,6 @@ private: LoadSuccess loadIconSuccess; //save status of last icon load when drawing on GUI bool fileIconsAreEnabled; -#endif xmlAccess::ColumnAttributes columnSettings; //set visibility, position and width of columns }; diff --git a/library/FreeFileSync.ico b/library/FreeFileSync.ico index bceb6ee4..bfa8ffc4 100644 Binary files a/library/FreeFileSync.ico and b/library/FreeFileSync.ico differ diff --git a/library/dbFile.cpp b/library/dbFile.cpp index 7a000197..1919dd6d 100644 --- a/library/dbFile.cpp +++ b/library/dbFile.cpp @@ -29,7 +29,7 @@ namespace { //------------------------------------------------------------------------------------------------------------------------------- const char FILE_FORMAT_DESCR[] = "FreeFileSync"; -const int FILE_FORMAT_VER = 3; +const int FILE_FORMAT_VER = 4; //------------------------------------------------------------------------------------------------------------------------------- @@ -86,18 +86,22 @@ public: } private: - void execute(DirContainer& dirCont) + void execute(DirContainer& dirCont) const { - unsigned int fileCount = readNumberC(); + size_t fileCount = readNumberC(); while (fileCount-- != 0) readSubFile(dirCont); - unsigned int dirCount = readNumberC(); + size_t symlinkCount = readNumberC(); + while (symlinkCount-- != 0) + readSubLink(dirCont); + + size_t dirCount = readNumberC(); while (dirCount-- != 0) readSubDirectory(dirCont); } - void readSubFile(DirContainer& dirCont) + void readSubFile(DirContainer& dirCont) const { //attention: order of function argument evaluation is undefined! So do it one after the other... const Zstring shortName = readStringC(); //file name @@ -116,7 +120,22 @@ private: wxULongLong(sizeHigh, sizeLow))); } - void readSubDirectory(DirContainer& dirCont) + + void readSubLink(DirContainer& dirCont) const + { + //attention: order of function argument evaluation is undefined! So do it one after the other... + const Zstring shortName = readStringC(); //file name + const long modHigh = readNumberC(); + const unsigned long modLow = readNumberC(); + const Zstring targetPath = readStringC(); //file name + const LinkDescriptor::LinkType linkType = static_cast(readNumberC()); + + dirCont.addSubLink(shortName, + LinkDescriptor(wxLongLong(modHigh, modLow), targetPath, linkType)); + } + + + void readSubDirectory(DirContainer& dirCont) const { const Zstring shortName = readStringC(); //directory name DirContainer& subDir = dirCont.addSubDir(shortName); @@ -254,16 +273,20 @@ public: } private: - template - friend Function std::for_each(Iterator, Iterator, Function); + friend class Utility::Proxy >; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! void execute(const HierarchyObject& hierObj) { - writeNumberC(std::count_if(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), IsNonEmpty())); //number of (existing) files - std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), *this); + Utility::Proxy > prx(*this); //grant std::for_each access to private parts of this class - writeNumberC(std::count_if(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), IsNonEmpty())); //number of (existing) directories - std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), *this); + writeNumberC(std::count_if(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), IsNonEmpty())); //number of (existing) files + std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), prx); + + writeNumberC(std::count_if(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), IsNonEmpty())); //number of (existing) files + std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), prx); + + writeNumberC(std::count_if(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), IsNonEmpty())); //number of (existing) directories + std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), prx); } void operator()(const FileMapping& fileMap) @@ -281,6 +304,18 @@ private: } } + void operator()(const SymLinkMapping& linkObj) + { + if (!linkObj.isEmpty()) + { + writeStringC(linkObj.getObjShortName()); + writeNumberC( linkObj.getLastWriteTime().GetHi()); //last modification time + writeNumberC(linkObj.getLastWriteTime().GetLo()); // + writeStringC(linkObj.getTargetPath()); + writeNumberC(linkObj.getLinkType()); + } + } + void operator()(const DirMapping& dirMap) { if (!dirMap.isEmpty()) diff --git a/library/dbFile.h b/library/dbFile.h index e7db0393..9fa49c51 100644 --- a/library/dbFile.h +++ b/library/dbFile.h @@ -13,7 +13,13 @@ namespace FreeFileSync { void saveToDisk(const BaseDirMapping& baseMapping); //throw (FileError) +struct DirInformation +{ + BaseFilter::FilterRef filter; //filter settings (used when retrieving directory data) + DirContainer baseDirContainer; //hierarchical directory information +}; typedef boost::shared_ptr DirInfoPtr; + std::pair loadFromDisk(const BaseDirMapping& baseMapping); //throw (FileError) -> return value always bound! } diff --git a/library/filter.cpp b/library/filter.cpp index 931532c3..a64c3a31 100644 --- a/library/filter.cpp +++ b/library/filter.cpp @@ -251,8 +251,7 @@ bool NameFilter::passDirFilter(const Zstring& relDirname, bool* subObjMightMatch { if (subObjMightMatch) { - Zstring subNameBegin = relDirname; - subNameBegin += globalFunctions::FILE_NAME_SEPARATOR; + const Zstring& subNameBegin = relDirname + globalFunctions::FILE_NAME_SEPARATOR; //const-ref optimization *subObjMightMatch = matchesFilterBegin(subNameBegin, filterFileIn) || //might match a file in subdirectory matchesFilterBegin(subNameBegin, filterFolderIn); //or another subdirectory diff --git a/library/iconBuffer.cpp b/library/iconBuffer.cpp index 338f53df..fa0b1673 100644 --- a/library/iconBuffer.cpp +++ b/library/iconBuffer.cpp @@ -7,7 +7,6 @@ #include "iconBuffer.h" #include #include -#include //includes "windows.h" #include #include #include @@ -15,42 +14,34 @@ #include #include -using FreeFileSync::IconBuffer; +#ifdef FFS_WIN +#include //includes "windows.h" +#elif defined FFS_LINUX +#include +#include +#include +#endif -const wxIcon& IconBuffer::getDirectoryIcon() //one folder icon should be sufficient... -{ - static wxIcon folderIcon; - static bool isInitalized = false; - if (!isInitalized) - { - isInitalized = true; - - SHFILEINFO fileInfo; - fileInfo.hIcon = 0; //initialize hIcon - - //NOTE: CoInitializeEx()/CoUninitialize() implicitly called by wxWidgets on program startup! - if (::SHGetFileInfo(DefaultStr("dummy"), //Windows Seven doesn't like this parameter to be an empty string - FILE_ATTRIBUTE_DIRECTORY, - &fileInfo, - sizeof(fileInfo), - SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES) && +using FreeFileSync::IconBuffer; - fileInfo.hIcon != 0) //fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! - { - folderIcon.SetHICON(fileInfo.hIcon); - folderIcon.SetSize(IconBuffer::ICON_SIZE, IconBuffer::ICON_SIZE); - } - } - return folderIcon; -} namespace { +struct CmpFilename +{ + bool operator()(const Zstring& a, const Zstring& b) const + { + return a.cmpFileName(b) < 0; + } +}; + + +#ifdef FFS_WIN Zstring getFileExtension(const Zstring& filename) { - const Zstring shortName = filename.AfterLast(DefaultChar('\\')); //Zstring::AfterLast() returns the whole string if ch not found + const Zstring shortName = filename.AfterLast(DefaultChar('\\')); //warning: using windows file name separator! const size_t pos = shortName.Find(DefaultChar('.'), true); return pos == Zstring::npos ? Zstring() : @@ -58,19 +49,10 @@ Zstring getFileExtension(const Zstring& filename) } -struct CmpFilenameWin -{ - bool operator()(const Zstring& a, const Zstring& b) const - { - return a.cmpFileName(b) < 0; - } -}; - - //test for extension for icons that physically have to be retrieved from disc bool isPriceyExtension(const Zstring& extension) { - static std::set exceptions; + static std::set exceptions; static bool isInitalized = false; if (!isInitalized) { @@ -86,39 +68,198 @@ bool isPriceyExtension(const Zstring& extension) } return exceptions.find(extension) != exceptions.end(); } +#endif } //################################################################################################################################################ -class IconBuffer::IconHolder //handle HICON ownership WITHOUT ref-counting to allow a deep-copy (in contrast to wxIcon) +class IconBuffer::IconHolder //handle HICON/GdkPixbuf ownership WITHOUT ref-counting to allow thread-safe usage (in contrast to wxIcon) { public: - IconHolder(HICON handle = 0) : handle_(handle) {} +#ifdef FFS_WIN + typedef HICON HandleType; +#elif defined FFS_LINUX + typedef GdkPixbuf* HandleType; +#endif + + IconHolder(HandleType handle = 0) : handle_(handle) {} //take ownership! + + //icon holder has value semantics! + IconHolder(const IconHolder& other) : handle_(other.handle_ == 0 ? 0 : +#ifdef FFS_WIN + ::CopyIcon(other.handle_) +#elif defined FFS_LINUX + gdk_pixbuf_copy(other.handle_) //create new Pix buf with reference count 1 or return 0 on error +#endif + ) {} + + IconHolder& operator=(const IconHolder& other) + { + IconHolder(other).swap(*this); + return *this; + } ~IconHolder() { if (handle_ != 0) +#ifdef FFS_WIN ::DestroyIcon(handle_); +#elif defined FFS_LINUX + g_object_unref(handle_); +#endif } - HICON clone() const //copy HICON, caller needs to take ownership! + void swap(IconHolder& other) //throw() { - return handle_ != 0 ? ::CopyIcon(handle_) : 0; + std::swap(handle_, other.handle_); } - void swap(IconHolder& other) //throw() + wxIcon toWxIcon() const //copy HandleType, caller needs to take ownership! { - std::swap(handle_, other.handle_); + IconHolder clone(*this); + if (clone.handle_ != 0) + { + wxIcon newIcon; //attention: wxIcon uses reference counting! +#ifdef FFS_WIN + newIcon.SetHICON(clone.handle_); // + newIcon.SetSize(IconBuffer::ICON_SIZE, IconBuffer::ICON_SIZE); //icon is actually scaled to this size (just in case referenced HICON differs) +#elif defined FFS_LINUX // + newIcon.SetPixbuf(clone.handle_); // transfer ownership!! +#endif // + clone.handle_ = 0; // + return newIcon; + } + return wxNullIcon; } private: - IconHolder(const IconHolder&); - IconHolder& operator=(const IconHolder&); - - HICON handle_; + HandleType handle_; }; +const wxIcon& IconBuffer::getDirectoryIcon() //one folder icon should be sufficient... +{ + static wxIcon folderIcon; + + static bool isInitalized = false; + if (!isInitalized) + { + isInitalized = true; + +#ifdef FFS_WIN + SHFILEINFO fileInfo; + fileInfo.hIcon = 0; //initialize hIcon + + //NOTE: CoInitializeEx()/CoUninitialize() implicitly called by wxWidgets on program startup! + if (::SHGetFileInfo(DefaultStr("dummy"), //Windows Seven doesn't like this parameter to be an empty string + FILE_ATTRIBUTE_DIRECTORY, + &fileInfo, + sizeof(fileInfo), + SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES) && + + fileInfo.hIcon != 0) //fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! + { + folderIcon.SetHICON(fileInfo.hIcon); //transfer ownership! + folderIcon.SetSize(IconBuffer::ICON_SIZE, IconBuffer::ICON_SIZE); + } + +#elif defined FFS_LINUX + folderIcon = getAssociatedIcon(DefaultStr("/usr/")).toWxIcon(); //all directories will look like "/usr/" +#endif + } + return folderIcon; +} + + +IconBuffer::IconHolder IconBuffer::getAssociatedIcon(const Zstring& filename) +{ +#ifdef FFS_WIN + //despite what docu says about SHGetFileInfo() it can't handle all relative filenames, e.g. "\DirName" + //but no problem, directory formatting takes care that filenames are always absolute! + + SHFILEINFO fileInfo; + fileInfo.hIcon = 0; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! + //bug report: https://sourceforge.net/tracker/?func=detail&aid=2768004&group_id=234430&atid=1093080 + + //NOTE: CoInitializeEx()/CoUninitialize() implicitly called by wxWidgets on program startup! + ::SHGetFileInfo(filename.c_str(), //FreeFileSync::removeLongPathPrefix(fileName), //::SHGetFileInfo() can't handle \\?\-prefix! + 0, + &fileInfo, + sizeof(fileInfo), + SHGFI_ICON | SHGFI_SMALLICON); + + return IconHolder(fileInfo.hIcon); //pass icon ownership (may be 0) + +#elif defined FFS_LINUX + static struct RunOnce + { + RunOnce() + { + Gtk::Main::init_gtkmm_internals(); + } + } dummy; + + try + { + Glib::RefPtr fileObj = Gio::File::create_for_path(filename.c_str()); //never fails + Glib::RefPtr fileInfo = fileObj->query_info(G_FILE_ATTRIBUTE_STANDARD_ICON); + if (fileInfo) + { + Glib::RefPtr gicon = fileInfo->get_icon(); + if (gicon) + { + Glib::RefPtr iconTheme = Gtk::IconTheme::get_default(); + if (iconTheme) + { + Gtk::IconInfo iconInfo = iconTheme->lookup_icon(gicon, ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); //this may fail if icon is not installed on system + if (iconInfo) + { + Glib::RefPtr iconPixbuf = iconInfo.load_icon(); //render icon into Pixbuf + if (iconPixbuf) + return IconHolder(iconPixbuf->gobj_copy()); //copy and pass icon ownership (may be 0) + } + } + } + } + } + catch (const Glib::Error&) {} + + + //fallback: icon lookup may fail because some icons are currently not present on system + Glib::RefPtr iconTheme = Gtk::IconTheme::get_default(); + if (iconTheme) + { + Glib::RefPtr iconPixbuf = iconTheme->load_icon("misc", ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); + if (!iconPixbuf) + iconPixbuf = iconTheme->load_icon("text-x-generic", ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); + if (iconPixbuf) + return IconHolder(iconPixbuf->gobj_copy()); //copy and pass icon ownership (may be 0) + } + + //fallback fallback + return IconHolder(); +#endif +} + + +#ifdef FFS_WIN +IconBuffer::IconHolder IconBuffer::getAssociatedIconByExt(const Zstring& extension) +{ + SHFILEINFO fileInfo; + fileInfo.hIcon = 0; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! + + //no read-access to disk! determine icon by extension + ::SHGetFileInfo((Zstring(DefaultStr("dummy.")) + extension).c_str(), //Windows Seven doesn't like this parameter to be without short name + FILE_ATTRIBUTE_NORMAL, + &fileInfo, + sizeof(fileInfo), + SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); + + return IconHolder(fileInfo.hIcon); //pass icon ownership (may be 0) +} +#endif + + //--------------------------------------------------------------------------------------------------- typedef std::vector BasicString; //simple thread safe string class: std::vector is guaranteed to not use reference counting, Effective STL, item 13 //avoid reference-counted objects as shared data: NOT THREADSAFE!!! (implicitly shared variables: ref-count + c-string) @@ -144,10 +285,9 @@ private: wxCriticalSection lockWorkload; //use for locking shared data std::vector workload; //processes last elements of vector first! bool threadHasMutex; - bool threadExitIsRequested; //------------------------------------------------------------ - //event: icon buffer -> woker thread + //signal event: icon buffer(main thread) -> worker thread wxMutex threadIsListening; wxCondition continueWork; //wake up thread @@ -156,9 +296,8 @@ private: IconBuffer::WorkerThread::WorkerThread(IconBuffer* iconBuff) : - wxThread(wxTHREAD_JOINABLE), + wxThread(wxTHREAD_DETACHED), //we're using the thread encapsulated in a static object => use "detached" to avoid main thread waiting for this thread on exit(which in turn would prevent deletion of static object...ect.) => deadlock! threadHasMutex(false), - threadExitIsRequested(false), threadIsListening(), continueWork(threadIsListening), iconBuffer(iconBuff) @@ -195,12 +334,8 @@ void IconBuffer::WorkerThread::setWorkload(const std::vector& load) //( void IconBuffer::WorkerThread::quitThread() { - { - wxMutexLocker dummy(threadIsListening); //wait until thread is in waiting state - threadExitIsRequested = true; //no sharing conflicts in this situation - continueWork.Signal(); //exit thread - } - Wait(); //wait until thread has exitted + setWorkload(std::vector()); + Delete(); //gracefully terminate a detached thread... } @@ -208,22 +343,20 @@ wxThread::ExitCode IconBuffer::WorkerThread::Entry() { try { - wxMutexLocker dummy(threadIsListening); //this lock needs to be called from WITHIN the thread => calling it from constructor(Main thread) would be useless + //this lock needs to be called from WITHIN the thread => calling it from constructor(Main thread) would be useless (signal direction: main -> thread) + wxMutexLocker dummy(threadIsListening); //this mutex STAYS locked all the time except of continueWork.Wait()! { - //this mutex STAYS locked all the time except of continueWork.Wait()! wxCriticalSectionLocker dummy2(lockWorkload); threadHasMutex = true; } while (true) { - continueWork.Wait(); //waiting for continueWork.Signal(); unlocks Mutex "threadIsListening" + continueWork.WaitTimeout(100); //waiting for continueWork.Signal(); unlocks Mutex "threadIsListening" - //no mutex needed in this context - if (threadExitIsRequested) //no mutex here: atomicity is not prob for a bool, but visibility (e.g. caching in registers) - return 0; //shouldn't be a problem nevertheless because of implicit memory barrier caused by mutex.Lock() in .Wait() + if (TestDestroy()) + return 0; - //do work: get the file icons doWork(); } } @@ -237,60 +370,43 @@ wxThread::ExitCode IconBuffer::WorkerThread::Entry() void IconBuffer::WorkerThread::doWork() { - Zstring fileName; - //do work: get the file icon. while (true) { + Zstring fileName; { wxCriticalSectionLocker dummy(lockWorkload); if (workload.empty()) break; //enter waiting state - fileName = &workload.back()[0]; //deep copy: fileName is NOT empty (includes NULL-termination) + fileName = &workload.back()[0]; //deep copy (includes NULL-termination) workload.pop_back(); } if (iconBuffer->requestFileIcon(fileName)) //thread safety: Zstring okay, won't be reference-counted in requestIcon() continue; //icon already in buffer: skip - //despite what docu says about SHGetFileInfo() it can't handle all relative filenames, e.g. "\DirName" - //but no problem, directory formatting takes care that filenames are always absolute! - - //load icon - SHFILEINFO fileInfo; - fileInfo.hIcon = 0; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! - //bug report: https://sourceforge.net/tracker/?func=detail&aid=2768004&group_id=234430&atid=1093080 - +#ifdef FFS_WIN const Zstring extension = getFileExtension(fileName); //thread-safe: no sharing! if (isPriceyExtension(extension)) //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension { - //NOTE: CoInitializeEx()/CoUninitialize() implicitly called by wxWidgets on program startup! - ::SHGetFileInfo(fileName.c_str(), //FreeFileSync::removeLongPathPrefix(fileName), //::SHGetFileInfo() can't handle \\?\-prefix! - 0, - &fileInfo, - sizeof(fileInfo), - SHGFI_ICON | SHGFI_SMALLICON); - - IconBuffer::IconHolder newIcon(fileInfo.hIcon); //pass icon ownership (may be 0) + const IconHolder newIcon = IconBuffer::getAssociatedIcon(fileName); iconBuffer->insertIntoBuffer(fileName, newIcon); } else //no read-access to disk! determine icon by extension { - ::SHGetFileInfo((Zstring(DefaultStr("dummy.")) + extension).c_str(), //Windows Seven doesn't like this parameter to be without short name - FILE_ATTRIBUTE_NORMAL, - &fileInfo, - sizeof(fileInfo), - SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); - - IconBuffer::IconHolder newIcon(fileInfo.hIcon); //pass icon ownership (may be 0) + const IconHolder newIcon = IconBuffer::getAssociatedIconByExt(extension); iconBuffer->insertIntoBuffer(extension, newIcon); } +#elif defined FFS_LINUX + const IconHolder newIcon = IconBuffer::getAssociatedIcon(fileName); + iconBuffer->insertIntoBuffer(fileName, newIcon); +#endif } } //--------------------------------------------------------------------------------------------------- -class IconBuffer::IconDB : public std::map {}; //entryName/icon -> ATTENTION: consider ref-counting for this shared data structure!!! +class IconBuffer::IconDB : public std::map {}; //entryName/icon -> ATTENTION: avoid ref-counting for this shared data structure!!! (== don't copy instances between threads) class IconBuffer::IconDbSequence : public std::queue {}; //entryName //--------------------------------------------------------------------------------------------------- @@ -312,42 +428,29 @@ IconBuffer::IconBuffer() : IconBuffer::~IconBuffer() { - //keep non-inline destructor for std::auto_ptr to work with forward declarations - worker->quitThread(); } bool IconBuffer::requestFileIcon(const Zstring& fileName, wxIcon* icon) { + wxCriticalSectionLocker dummy(*lockIconDB); + +#ifdef FFS_WIN + //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension const Zstring extension = getFileExtension(fileName); + IconDB::const_iterator i = buffer->find(isPriceyExtension(extension) ? fileName : extension); +#elif defined FFS_LINUX + IconDB::const_iterator i = buffer->find(fileName); +#endif - wxCriticalSectionLocker dummy(*lockIconDB); + if (i == buffer->end()) + return false; - IconDB::const_iterator i = buffer->find( //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension - isPriceyExtension(extension) ? - fileName : - extension); - if (i != buffer->end()) - { - if (icon != NULL) - { - HICON clonedIcon = i->second->clone(); //thread safety: make deep copy! - if (clonedIcon != 0) - { - //create wxIcon from handle - wxIcon newIcon; //attention: wxIcon uses reference counting! - newIcon.SetHICON(clonedIcon); //transfer ownership!! - newIcon.SetSize(IconBuffer::ICON_SIZE, IconBuffer::ICON_SIZE); - *icon = newIcon; - } - else - *icon = wxNullIcon; - } - return true; - } + if (icon != NULL) + *icon = i->second.toWxIcon(); - return false; + return true; } @@ -357,16 +460,14 @@ void IconBuffer::setWorkload(const std::vector& load) } -void IconBuffer::insertIntoBuffer(const DefaultChar* entryName, IconHolder& icon) //called by worker thread +void IconBuffer::insertIntoBuffer(const DefaultChar* entryName, const IconHolder& icon) //called by worker thread { wxCriticalSectionLocker dummy(*lockIconDB); //thread safety, ref-counting: (implicitly) make deep copy! const Zstring fileNameZ = entryName; - const IconBuffer::CountedIconPtr newIcon(new IconBuffer::IconHolder); //exception safety! - newIcon->swap(icon); // - const std::pair rc = buffer->insert(IconDB::value_type(fileNameZ, newIcon)); //thread saftey: icon uses ref-counting! But is NOT shared with main thread! + const std::pair rc = buffer->insert(std::make_pair(fileNameZ, icon)); //thread saftey: icon uses ref-counting! But is NOT shared with main thread! if (rc.second) //if insertion took place bufSequence->push(fileNameZ); //note: sharing Zstring with IconDB!!! @@ -381,4 +482,3 @@ void IconBuffer::insertIntoBuffer(const DefaultChar* entryName, IconHolder& icon bufSequence->pop(); } } - diff --git a/library/iconBuffer.h b/library/iconBuffer.h index cb2d809f..4a19af3d 100644 --- a/library/iconBuffer.h +++ b/library/iconBuffer.h @@ -7,14 +7,9 @@ #ifndef ICONBUFFER_H_INCLUDED #define ICONBUFFER_H_INCLUDED -#ifndef FFS_WIN -header should be used in the windows build only! -#endif - #include #include "../shared/zstring.h" #include -#include class wxCriticalSection; class wxIcon; @@ -32,24 +27,27 @@ public: bool requestFileIcon(const Zstring& fileName, wxIcon* icon = NULL); //returns false if icon is not in buffer void setWorkload(const std::vector& load); //(re-)set new workload of icons to be retrieved; - static const int ICON_SIZE = 16; //size in pixel - static const size_t BUFFER_SIZE = 800; //maximum number if icons to buffer +#ifdef FFS_WIN + static const int ICON_SIZE = 16; //size in pixel +#elif defined FFS_LINUX + static const int ICON_SIZE = 24; //size in pixel +#endif private: IconBuffer(); ~IconBuffer(); - class WorkerThread; - friend class WorkerThread; + static const size_t BUFFER_SIZE = 800; //maximum number of icons to buffer class IconDB; class IconHolder; class IconDbSequence; - typedef boost::shared_ptr CountedIconPtr; - //methods used by worker thread - void insertIntoBuffer(const DefaultChar* entryName, IconHolder& icon); //icon is invalidated by this call!! + void insertIntoBuffer(const DefaultChar* entryName, const IconHolder& icon); + + static IconHolder getAssociatedIcon(const Zstring& filename); + static IconHolder getAssociatedIconByExt(const Zstring& extension); //---------------------- Shared Data ------------------------- std::auto_ptr lockIconDB; @@ -57,7 +55,8 @@ private: std::auto_ptr bufSequence; //save sequence of buffer entry to delete oldest elements (implicitly shared by sharing Zstring with IconDB!!!) //------------------------------------------------------------ - std::auto_ptr worker; + class WorkerThread; + WorkerThread* worker; //detached thread => destroys itself }; } diff --git a/library/multithreading.cpp b/library/multithreading.cpp deleted file mode 100644 index 252884a2..00000000 --- a/library/multithreading.cpp +++ /dev/null @@ -1,254 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) 2008-2010 ZenJu (zhnmju123 AT gmx.de) * -// ************************************************************************** -// -#include "multithreading.h" -#include "statusHandler.h" -#include - -//#include //includes "windows.h" -//MessageBox(0, "hi", "", 0); - -/*choreography: - - ------------- --------------- - |main thread| |worker thread| - ------------- --------------- - -1. Instantiation (Constructor) -------------------------------- - create thread - enter waiting state -2. waitUntilReady -------------------------------- - wait until thread is ready - -3. Call execute -------------------------------- - send signal to start - start processing - update UI while thread works - finish processing - wait until main thread is ready to receive signal - receive signal - enter waiting state -4. Termination (Destructor) -------------------------------- - wait until thread is in wait state - set exit flag - signal thread to continue (and exit) -*/ -class WorkerThread : public wxThread -{ - friend class UpdateWhileExecuting; - -public: - WorkerThread(UpdateWhileExecuting* handler) : - wxThread(wxTHREAD_DETACHED), - readyToBeginProcessing(), - beginProcessing(readyToBeginProcessing), - threadIsInitialized(false), - threadExitIsRequested(false), - threadHandler(handler) - { } - - - ~WorkerThread() {} - - - ExitCode Entry() - { - readyToBeginProcessing.Lock(); //this lock needs to be called IN the thread => calling it from constructor(Main thread) would be useless - sharedData.Enter(); - threadIsInitialized = true; - sharedData.Leave(); - - while (true) - { - beginProcessing.Wait(); - - //no mutex needed in this context - if (threadExitIsRequested) - return 0; - - //actual (long running) work is done in this method - threadHandler->longRunner(); - - threadHandler->readyToReceiveResult.Lock(); - threadHandler->receivingResult.Signal(); // kind of a double notice that work is completed - threadHandler->workDone = true; // Workaround for wxWidgets: bug in wxCondition (wxWidgets v2.8.9, signal might geht lost) - threadHandler->readyToReceiveResult.Unlock(); - } - - return 0; - } - -private: - wxMutex readyToBeginProcessing; - wxCondition beginProcessing; - - //shared data - wxCriticalSection sharedData; - bool threadIsInitialized; - bool threadExitIsRequested; - - UpdateWhileExecuting* threadHandler; -}; - - -UpdateWhileExecuting::UpdateWhileExecuting() : - readyToReceiveResult(), - receivingResult(readyToReceiveResult), - workDone(false) -{ - //mutex needs to be initially locked for condition receivingResult to work properly - readyToReceiveResult.Lock(); - - - theWorkerThread = new WorkerThread(this); - - theWorkerThread->Create(); - theWorkerThread->Run(); - - //wait until the thread has locked readyToBeginProcessing - bool threadInitialized = false; - while (!threadInitialized) - { - theWorkerThread->sharedData.Enter(); - threadInitialized = theWorkerThread->threadIsInitialized; - theWorkerThread->sharedData.Leave(); - wxMilliSleep(5); - } //-> it's not nice, but works and is no issue -} - - -UpdateWhileExecuting::~UpdateWhileExecuting() -{ - //wait until thread is ready, then start and exit immediately - readyToReceiveResult.Unlock(); //avoid possible deadlock, when thread might be waiting to send the signal - - theWorkerThread->readyToBeginProcessing.Lock(); - //set flag to exit thread - theWorkerThread->threadExitIsRequested = true; - theWorkerThread->beginProcessing.Signal(); - - theWorkerThread->readyToBeginProcessing.Unlock(); - //theWorkerThread deletes itself! -} - - -void UpdateWhileExecuting::waitUntilReady() -{ - readyToReceiveResult.Unlock(); //avoid possible deadlock, when thread might be waiting to send the signal (if abort was pressed) - - theWorkerThread->readyToBeginProcessing.Lock(); - - workDone = false; //no mutex needed here (worker thread that changes this variable is in waiting state) -} -// /|\ \|/ must be called directly after each other - -void UpdateWhileExecuting::execute(StatusHandler* statusUpdater) -{ - readyToReceiveResult.Lock(); - - theWorkerThread->beginProcessing.Signal(); - theWorkerThread->readyToBeginProcessing.Unlock(); - - while (receivingResult.WaitTimeout(UI_UPDATE_INTERVAL) == wxCOND_TIMEOUT) - { - statusUpdater->requestUiRefresh(false); //don't allow throwing exception within this call - - if (workDone) //workaround for a bug in wxWidgets v2.8.9 class wxCondition: signals might get lost - break; //no mutex for workDone needed here: it is changed only when mainthread is in WaitTimeout() - } -} - - - -// ------------------------------------------------------ -// |Pattern: workload queue and multiple worker threads | -// ------------------------------------------------------ -//typedef std::vector Workload; -// -//class ThreadSorting : public wxThread -//{ -//public: -// ThreadSorting(wxCriticalSection& syncWorkload, Workload& workload) : -// wxThread(wxTHREAD_JOINABLE), -// syncWorkload_(syncWorkload), -// workload_(workload) -// { -// if (Create() != wxTHREAD_NO_ERROR) -// throw RuntimeException(wxString(wxT("Error creating thread for sorting!"))); -// } -// -// ~ThreadSorting() {} -// -// -// ExitCode Entry() -// { -// while (true) -// { -// DirectoryDescrType* descr = NULL; -// { //see if there is work to do... -// wxCriticalSectionLocker dummy(syncWorkload_); -// if (workload_.empty()) -// return 0; -// else -// { -// descr = workload_.back(); -// workload_.pop_back(); -// } -// } -// //do work -// std::sort(descr->begin(), descr->end()); -// } -// } -// -//private: -// wxCriticalSection& syncWorkload_; -// Workload& workload_; -//}; -// -// -//void DirectoryDescrBuffer::preFillBuffers(const std::vector& fpConfigFormatted) -//{ -// //assemble workload -// ... -// -// //we use binary search when comparing the directory structures: so sort() first -// const int CPUCount = wxThread::GetCPUCount(); -// if (CPUCount >= 2) //do it the multithreaded way: -// { -// wxCriticalSection syncWorkload; -// -// typedef std::vector > ThreadContainer; -// ThreadContainer sortThreads; -// sortThreads.reserve(CPUCount); -// -// //start CPUCount worker threads -// for (size_t i = 0; i < std::min(static_cast(CPUCount), workload.size()); ++i) -// { -// boost::shared_ptr newWorker(new ThreadSorting(syncWorkload, workload)); -// -// if (newWorker->Run() != wxTHREAD_NO_ERROR) -// throw RuntimeException(wxString(wxT("Error starting thread for sorting!"))); -// -// sortThreads.push_back(newWorker); -// } -// -// //wait until all worker are finished -// for (ThreadContainer::iterator i = sortThreads.begin(); i != sortThreads.end(); ++i) -// { -// if ((*i)->Wait() != 0) -// throw RuntimeException(wxString(wxT("Error waiting for thread (sorting)!"))); -// } -// } -// else //single threaded -// { -// for (Workload::iterator i = workload.begin(); i != workload.end(); ++i) -// std::sort((*i)->begin(), (*i)->end()); -// } -//} diff --git a/library/multithreading.h b/library/multithreading.h deleted file mode 100644 index 9017bf41..00000000 --- a/library/multithreading.h +++ /dev/null @@ -1,41 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) 2008-2010 ZenJu (zhnmju123 AT gmx.de) * -// ************************************************************************** -// -#ifndef MULTITHREADING_H_INCLUDED -#define MULTITHREADING_H_INCLUDED - -#include - -class StatusHandler; -class WorkerThread; - - -//class handling execution of a method while updating the UI -class UpdateWhileExecuting -{ - friend class WorkerThread; - -public: - UpdateWhileExecuting(); - - virtual ~UpdateWhileExecuting(); - - void waitUntilReady(); - void execute(StatusHandler* statusUpdater); - - -private: - //implement a longrunning method without dependencies (e.g. copy file function); share input/output parameters as instance variables - virtual void longRunner() = 0; - - WorkerThread* theWorkerThread; - - wxMutex readyToReceiveResult; - wxCondition receivingResult; - bool workDone; //workaround for a bug in wxWidgets v2.8.9 class wxCondition: signals might get lost -}; - -#endif // MULTITHREADING_H_INCLUDED diff --git a/library/pch.h b/library/pch.h index 1fb71f00..573ae73f 100644 --- a/library/pch.h +++ b/library/pch.h @@ -18,6 +18,10 @@ do NOT use in release build! #define WX_PRECOMP #endif +#ifdef _MSC_VER +#pragma warning(disable:4996) //"warning C4996: 'std::copy': Function call with parameters that may be unsafe" +#endif + #include //##################################################### diff --git a/library/processXml.cpp b/library/processXml.cpp index 4ecc0350..c9b641fb 100644 --- a/library/processXml.cpp +++ b/library/processXml.cpp @@ -215,7 +215,26 @@ bool readXmlElement(const std::string& name, const TiXmlElement* parent , FreeFi return true; } + return false; +} + + +bool readXmlElement(const std::string& name, const TiXmlElement* parent , FreeFileSync::SymLinkHandling& output) +{ + std::string dummy; + if (xmlAccess::readXmlElement(name, parent, dummy)) + { + if (dummy == "Ignore") + output = FreeFileSync::SYMLINK_IGNORE; + else if (dummy == "UseDirectly") + output = FreeFileSync::SYMLINK_USE_DIRECTLY; + else if (dummy == "FollowLink") + output = FreeFileSync::SYMLINK_FOLLOW_LINK; + else + return false; + return true; + } return false; } @@ -233,7 +252,7 @@ bool readXmlElement(const std::string& name, const TiXmlElement* parent, Zstring bool readXmlAttribute(const std::string& name, const TiXmlElement* node, xmlAccess::ColumnTypes& output) { - int dummy; + int dummy = 0; if (xmlAccess::readXmlAttribute(name, node, dummy)) { output = static_cast(dummy); @@ -303,10 +322,7 @@ void FfsXmlParser::readXmlMainConfig(MainConfiguration& mainCfg) readXmlElementLogging("FileTimeTolerance", cmpSettings, mainCfg.hidden.fileTimeTolerance); //include symbolic links at all? - readXmlElementLogging("IncludeSymlinks", cmpSettings, mainCfg.processSymlinks); - - //traverse into symbolic links (to folders) - readXmlElementLogging("TraverseDirectorySymlinks", cmpSettings, mainCfg.traverseDirectorySymlinks); + readXmlElementLogging("HandleSymlinks", cmpSettings, mainCfg.handleSymlinks); //########################################################### const TiXmlElement* syncCfg = hRoot.FirstChild("MainConfig").FirstChild("Synchronization").ToElement(); @@ -324,9 +340,6 @@ void FfsXmlParser::readXmlMainConfig(MainConfiguration& mainCfg) //########################################################### const TiXmlElement* syncConfig = hRoot.FirstChild("MainConfig").FirstChild("Synchronization").ToElement(); - //copy symbolic links to files - readXmlElementLogging("CopyFileSymlinks", syncConfig, mainCfg.copyFileSymlinks); - //verify file copying readXmlElementLogging("VerifyCopiedFiles", syncConfig, mainCfg.hidden.verifyFileCopy); @@ -607,6 +620,23 @@ void addXmlElement(const std::string& name, const FreeFileSync::DeletionPolicy v } +void addXmlElement(const std::string& name, const FreeFileSync::SymLinkHandling value, TiXmlElement* parent) +{ + switch (value) + { + case FreeFileSync::SYMLINK_IGNORE: + xmlAccess::addXmlElement(name, std::string("Ignore"), parent); + break; + case FreeFileSync::SYMLINK_USE_DIRECTLY: + xmlAccess::addXmlElement(name, std::string("UseDirectly"), parent); + break; + case FreeFileSync::SYMLINK_FOLLOW_LINK: + xmlAccess::addXmlElement(name, std::string("FollowLink"), parent); + break; + } +} + + void addXmlElement(const std::string& name, const Zstring& value, TiXmlElement* parent) { xmlAccess::addXmlElement(name, wxString(zToWx(value)), parent); @@ -696,10 +726,7 @@ bool writeXmlMainConfig(const MainConfiguration& mainCfg, TiXmlDocument& doc) addXmlElement("FileTimeTolerance", mainCfgLocal.hidden.fileTimeTolerance, cmpSettings); //include symbolic links at all? - addXmlElement("IncludeSymlinks", mainCfgLocal.processSymlinks, cmpSettings); - - //traverse into symbolic links (to folders) - addXmlElement("TraverseDirectorySymlinks", mainCfgLocal.traverseDirectorySymlinks, cmpSettings); + addXmlElement("HandleSymlinks", mainCfgLocal.handleSymlinks, cmpSettings); //########################################################### TiXmlElement* syncSettings = new TiXmlElement("Synchronization"); @@ -719,9 +746,6 @@ bool writeXmlMainConfig(const MainConfiguration& mainCfg, TiXmlDocument& doc) addXmlElement("Conflict", mainCfgLocal.syncConfiguration.conflict, syncDirections); //########################################################### - //copy symbolic links to files - addXmlElement("CopyFileSymlinks", mainCfgLocal.copyFileSymlinks, syncSettings); - //verify file copying addXmlElement("VerifyCopiedFiles", mainCfgLocal.hidden.verifyFileCopy, syncSettings); diff --git a/library/statistics.cpp b/library/statistics.cpp index fc140add..3a6970d9 100644 --- a/library/statistics.cpp +++ b/library/statistics.cpp @@ -31,11 +31,12 @@ RetrieveStatistics::~RetrieveStatistics() for (std::vector::const_iterator i = data.begin(); i != data.end(); ++i) { - outputFile.Write(FreeFileSync::numberToWxString(static_cast(i->time), false)); + using globalFunctions::numberToString; + outputFile.Write(numberToString(i->time)); outputFile.Write(wxT(";")); - outputFile.Write(FreeFileSync::numberToWxString(i->objects, false)); + outputFile.Write(numberToString(i->objects)); outputFile.Write(wxT(";")); - outputFile.Write(FreeFileSync::numberToWxString(static_cast(i->value), false)); + outputFile.Write(numberToString(i->value)); outputFile.Write(wxT("\n")); } } @@ -63,6 +64,10 @@ bool isNull(double number) inline wxString Statistics::formatRemainingTime(double timeInMs) const { +#ifndef _MSC_VER +#warning adapt units "%x sec" +#endif + bool unitSec = true; double remainingTime = timeInMs / 1000; wxString unit = _(" sec"); @@ -83,7 +88,6 @@ wxString Statistics::formatRemainingTime(double timeInMs) const } } - int formattedTime = globalFunctions::round(remainingTime); //reduce precision to 5 seconds @@ -104,7 +108,7 @@ wxString Statistics::formatRemainingTime(double timeInMs) const } remainingTimeLast = formattedTime; - return FreeFileSync::numberToWxString(formattedTime, false) + unit; + return globalFunctions::numberToString(formattedTime) + unit; //+ wxT("(") + globalFunctions::numberToWxString(globalFunctions::round(timeInMs / 1000)) + wxT(")"); } diff --git a/resource.rc b/resource.rc index 21c8b8ce..ce3074e7 100644 --- a/resource.rc +++ b/resource.rc @@ -1,6 +1,32 @@ +#define IDR_VERSION1 1 + #include "wx/msw/wx.rc" +#include "version/version.rc" + -//naming convention to set icon sequence in executable file A_PROGRAM_ICON ICON DISCARDABLE "library/FreeFileSync.ico" B_BATCH_ICON ICON DISCARDABLE "library/Batch.ico" C_SYNC_DB_ICON ICON DISCARDABLE "library/SyncDB.ico" + +IDR_VERSION1 VERSIONINFO +FILEVERSION VER_FREEFILESYNC +PRODUCTVERSION VER_FREEFILESYNC +FILEOS 0x00000004 +FILETYPE 0x00000001 +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "FFFF04B0" + BEGIN + VALUE "ProductVersion", VER_FREEFILESYNC_STR + VALUE "FileDescription", "Open Source Synchronization Software\0" + VALUE "LegalCopyright", "(c) 2008 - 2010 ZenJu\0" + VALUE "ProductName", "FreeFileSync\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0xFFFF, 0x04B0 + END +END + diff --git a/shared/IFileOperation/FileOperation_Vista.vcproj b/shared/IFileOperation/FileOperation_Vista.vcproj deleted file mode 100644 index 1d224649..00000000 --- a/shared/IFileOperation/FileOperation_Vista.vcproj +++ /dev/null @@ -1,409 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shared/IFileOperation/FileOperation_Vista.vcxproj b/shared/IFileOperation/FileOperation_Vista.vcxproj new file mode 100644 index 00000000..1cbb4a28 --- /dev/null +++ b/shared/IFileOperation/FileOperation_Vista.vcxproj @@ -0,0 +1,234 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + Vista IFileOperation + {70394AEF-5897-4911-AFA1-82EAF0581EFA} + ShadowDll + Win32Proj + + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + true + Windows7.1SDK + + + DynamicLibrary + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + FileOperation_$(Platform) + FileOperation_$(Platform) + FileOperation_$(Platform) + FileOperation_$(Platform) + + + + $(IntDir)Build.html + + + Disabled + _DEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + EditAndContinue + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + true + $(IntDir)$(TargetName).pdb + Windows + + + $(IntDir)$(TargetName).lib + MachineX86 + + + + + $(IntDir)Build.html + + + X64 + + + Disabled + _DEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + ProgramDatabase + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + true + $(IntDir)$(TargetName).pdb + Windows + + + $(IntDir)$(TargetName).lib + MachineX64 + + + + + $(IntDir)Build.html + + + MaxSpeed + true + NDEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + ProgramDatabase + Speed + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + false + Windows + true + true + UseLinkTimeCodeGeneration + + + $(IntDir)$(TargetName).lib + MachineX86 + + + + + $(IntDir)Build.html + + + X64 + + + MaxSpeed + true + NDEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + ProgramDatabase + Speed + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + false + Windows + true + true + UseLinkTimeCodeGeneration + + + $(IntDir)$(TargetName).lib + MachineX64 + + + + + + + false + + + false + + + false + + + false + + + + + + + + + + \ No newline at end of file diff --git a/shared/IFileOperation/dllmain.cpp b/shared/IFileOperation/dllmain.cpp index 7db39bff..8dae897a 100644 --- a/shared/IFileOperation/dllmain.cpp +++ b/shared/IFileOperation/dllmain.cpp @@ -14,7 +14,7 @@ BOOL APIENTRY DllMain( HMODULE hModule, LPVOID lpReserved ) { - switch (ul_reason_for_call) + switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: diff --git a/shared/IFileOperation/fileOp.cpp b/shared/IFileOperation/fileOp.cpp index 732fb9b5..761ec06d 100644 --- a/shared/IFileOperation/fileOp.cpp +++ b/shared/IFileOperation/fileOp.cpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include void writeString(const std::wstring& input, wchar_t* output, size_t outputBufferLen) @@ -57,6 +57,8 @@ public: item_->Release(); } private: + ReleaseAtExit(const ReleaseAtExit&); + ReleaseAtExit& operator=(const ReleaseAtExit&); T*& item_; }; diff --git a/shared/ShadowCopy/Shadow_2003.vcproj b/shared/ShadowCopy/Shadow_2003.vcproj deleted file mode 100644 index 49730440..00000000 --- a/shared/ShadowCopy/Shadow_2003.vcproj +++ /dev/null @@ -1,413 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shared/ShadowCopy/Shadow_2003.vcxproj b/shared/ShadowCopy/Shadow_2003.vcxproj new file mode 100644 index 00000000..b7d31ae4 --- /dev/null +++ b/shared/ShadowCopy/Shadow_2003.vcxproj @@ -0,0 +1,238 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + Server2003 + {2F2994D6-FB89-4BAA-A5DF-03BAF7337FF2} + ShadowDll + Win32Proj + + + + DynamicLibrary + Unicode + true + false + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + true + Windows7.1SDK + + + DynamicLibrary + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + Shadow_$(ProjectName)_$(Platform) + Shadow_$(ProjectName)_$(Platform) + Shadow_$(ProjectName)_$(Platform) + Shadow_$(ProjectName)_$(Platform) + + + + $(IntDir)Build.html + + + Disabled + _DEBUG;_WINDOWS;_USRDLL;SHADOWDLL_EXPORTS;USE_SHADOW_2003;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + EditAndContinue + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + true + $(IntDir)$(TargetName).pdb + Windows + + + $(IntDir)$(TargetName).lib + MachineX86 + + + + + $(IntDir)Build.html + + + X64 + + + Disabled + _DEBUG;_WINDOWS;_USRDLL;SHADOWDLL_EXPORTS;USE_SHADOW_2003;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + ProgramDatabase + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + true + $(IntDir)$(TargetName).pdb + Windows + + + $(IntDir)$(TargetName).lib + MachineX64 + + + + + $(IntDir)Build.html + + + MaxSpeed + true + NDEBUG;_WINDOWS;_USRDLL;SHADOWDLL_EXPORTS;USE_SHADOW_2003;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + ProgramDatabase + Speed + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + false + Windows + true + true + UseLinkTimeCodeGeneration + + + $(IntDir)$(TargetName).lib + MachineX86 + + + + + $(IntDir)Build.html + + + X64 + + + MaxSpeed + true + NDEBUG;_WINDOWS;_USRDLL;SHADOWDLL_EXPORTS;USE_SHADOW_2003;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + ProgramDatabase + Speed + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + false + Windows + true + true + UseLinkTimeCodeGeneration + + + $(IntDir)$(TargetName).lib + MachineX64 + + + + + + + false + + + false + + + false + + + false + + + + + + + + + + + + + \ No newline at end of file diff --git a/shared/ShadowCopy/Shadow_XP.vcproj b/shared/ShadowCopy/Shadow_XP.vcproj deleted file mode 100644 index 74b231de..00000000 --- a/shared/ShadowCopy/Shadow_XP.vcproj +++ /dev/null @@ -1,413 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shared/ShadowCopy/Shadow_XP.vcxproj b/shared/ShadowCopy/Shadow_XP.vcxproj new file mode 100644 index 00000000..5c531a27 --- /dev/null +++ b/shared/ShadowCopy/Shadow_XP.vcxproj @@ -0,0 +1,239 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + XP + {70394AEF-5897-4911-AFA1-82EAF0581EFA} + ShadowDll + Win32Proj + + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + true + Windows7.1SDK + + + DynamicLibrary + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + Shadow_$(ProjectName)_$(Platform) + Shadow_$(ProjectName)_$(Platform) + Shadow_$(ProjectName)_$(Platform) + Shadow_$(ProjectName)_$(Platform) + + + + $(IntDir)Build.html + + + Disabled + _DEBUG;_WINDOWS;_USRDLL;SHADOWDLL_EXPORTS;USE_SHADOW_XP;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + EditAndContinue + Neither + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + true + $(IntDir)$(TargetName).pdb + Windows + + + $(IntDir)$(TargetName).lib + MachineX86 + + + + + $(IntDir)Build.html + + + X64 + + + Disabled + _DEBUG;_WINDOWS;_USRDLL;SHADOWDLL_EXPORTS;USE_SHADOW_XP;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + ProgramDatabase + Neither + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + true + $(IntDir)$(TargetName).pdb + Windows + + + $(IntDir)$(TargetName).lib + MachineX64 + + + + + $(IntDir)Build.html + + + MaxSpeed + true + NDEBUG;_WINDOWS;_USRDLL;SHADOWDLL_EXPORTS;USE_SHADOW_XP;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + ProgramDatabase + Speed + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + false + Windows + true + true + UseLinkTimeCodeGeneration + + + $(IntDir)$(TargetName).lib + MachineX86 + + + + + $(IntDir)Build.html + + + X64 + + + MaxSpeed + true + NDEBUG;_WINDOWS;_USRDLL;SHADOWDLL_EXPORTS;USE_SHADOW_XP;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + ProgramDatabase + Speed + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + false + Windows + true + true + UseLinkTimeCodeGeneration + + + $(IntDir)$(TargetName).lib + MachineX64 + + + + + + + false + + + false + + + false + + + false + + + + + + + + + + + + + \ No newline at end of file diff --git a/shared/ShadowCopy/dllmain.cpp b/shared/ShadowCopy/dllmain.cpp index 7db39bff..8dae897a 100644 --- a/shared/ShadowCopy/dllmain.cpp +++ b/shared/ShadowCopy/dllmain.cpp @@ -14,7 +14,7 @@ BOOL APIENTRY DllMain( HMODULE hModule, LPVOID lpReserved ) { - switch (ul_reason_for_call) + switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: diff --git a/shared/ShadowCopy/shadow.cpp b/shared/ShadowCopy/shadow.cpp index b15bd4f9..1fb78769 100644 --- a/shared/ShadowCopy/shadow.cpp +++ b/shared/ShadowCopy/shadow.cpp @@ -15,7 +15,7 @@ #include "xp/inc/vsbackup.h" #elif defined USE_SHADOW_2003 -#include "Server 2003/inc/vss.h" +#include "Server 2003/inc/vss.h" #include "Server 2003/inc/vswriter.h" #include "Server 2003/inc/vsbackup.h" #else @@ -30,6 +30,37 @@ adapt! //typedef GUID VSS_ID; + +//IShellItem resource management: better handled with boost::shared_ptr or CComPtr, but we avoid dependency with boost and ATL in this case +template +class ItemHolder +{ +public: + ItemHolder(T* item) : item_(item) {} + ~ItemHolder() + { + if (item_) + item_->Release(); + } + + T* release() +{ +T* rv = item_; +item_ = 0; + return rv; + } + + T* operator->() const +{ + return item_; + } +private: + ItemHolder(const ItemHolder&); + ItemHolder& operator=(const ItemHolder&); + T* item_; +}; + + void writeString(const wchar_t* input, wchar_t* output, unsigned int outputBufferLen) { const size_t newSize = min(wcslen(input) + 1, outputBufferLen); //including null-termination @@ -59,7 +90,7 @@ void writeErrorMsg(const wchar_t* input, HRESULT hr, wchar_t* output, unsigned i } -bool shadow::createShadowCopy(const wchar_t* volumeName, +bool Shadow::createShadowCopy(const wchar_t* volumeName, wchar_t* shadowVolName, unsigned int shadowBufferLen, void** backupHandle, @@ -70,8 +101,8 @@ bool shadow::createShadowCopy(const wchar_t* volumeName, *backupHandle = NULL; HRESULT hr = NULL; - IVssBackupComponents* pBackupComponents = NULL; - if (FAILED(hr = CreateVssBackupComponents(&pBackupComponents))) + IVssBackupComponents* pBackupPtr = NULL; + if (FAILED(hr = CreateVssBackupComponents(&pBackupPtr))) { if (hr == E_ACCESSDENIED) writeErrorMsg(L"The caller does not have sufficient backup privileges or is not an administrator.", hr, errorMessage, errorBufferLen); @@ -80,19 +111,25 @@ bool shadow::createShadowCopy(const wchar_t* volumeName, return false; } + ItemHolder pBackupComponents(pBackupPtr); if (FAILED(hr = pBackupComponents->InitializeForBackup())) { - releaseShadowCopy(pBackupComponents); writeErrorMsg(L"Error calling \"InitializeForBackup\".", hr, errorMessage, errorBufferLen); return false; } + if (FAILED(hr = pBackupComponents->SetBackupState(false, false, VSS_BT_FULL))) + { + writeErrorMsg(L"Error calling \"SetBackupState\".", hr, errorMessage, errorBufferLen); + return false; + } + + IVssAsync* pWriteMetaData = NULL; if (FAILED(hr = pBackupComponents->GatherWriterMetadata( &pWriteMetaData ))) { //this can happen if XP-version of VSS is used on Windows Vista (which needs at least VSS-Server2003 build) - releaseShadowCopy(pBackupComponents); writeErrorMsg(L"Error calling \"GatherWriterMetadata\".", hr, errorMessage, errorBufferLen); return false; } @@ -105,7 +142,6 @@ bool shadow::createShadowCopy(const wchar_t* volumeName, pWriteMetaData->Release(); if (FAILED(hr)) { - releaseShadowCopy(pBackupComponents); writeErrorMsg(L"Error calling \"ppWriteMetaData->Wait\".", hr, errorMessage, errorBufferLen); return false; } @@ -114,7 +150,6 @@ bool shadow::createShadowCopy(const wchar_t* volumeName, VSS_ID snapshotSetId = {0}; if (FAILED(hr = pBackupComponents->StartSnapshotSet( &snapshotSetId ))) { - releaseShadowCopy(pBackupComponents); writeErrorMsg(L"Error calling \"StartSnapshotSet\".", hr, errorMessage, errorBufferLen); return false; } @@ -123,24 +158,14 @@ bool shadow::createShadowCopy(const wchar_t* volumeName, VSS_ID SnapShotId = {0}; if (FAILED(hr = pBackupComponents->AddToSnapshotSet(const_cast(volumeName), GUID_NULL, &SnapShotId))) { - releaseShadowCopy(pBackupComponents); writeErrorMsg(L"Error calling \"AddToSnapshotSet\".", hr, errorMessage, errorBufferLen); return false; } - if (FAILED(hr = pBackupComponents->SetBackupState( false, false, VSS_BT_FULL ))) - { - releaseShadowCopy(pBackupComponents); - writeErrorMsg(L"Error calling \"SetBackupState\".", hr, errorMessage, errorBufferLen); - return false; - } - - IVssAsync* pPrepare = NULL; if (FAILED(hr = pBackupComponents->PrepareForBackup( &pPrepare ))) { - releaseShadowCopy(pBackupComponents); writeErrorMsg(L"Error calling \"PrepareForBackup\".", hr, errorMessage, errorBufferLen); return false; } @@ -152,16 +177,14 @@ bool shadow::createShadowCopy(const wchar_t* volumeName, pPrepare->Release(); if (FAILED(hr)) { - releaseShadowCopy(pBackupComponents); writeErrorMsg(L"Error calling \"pPrepare->Wait\".", hr, errorMessage, errorBufferLen); return false; } IVssAsync* pDoShadowCopy = NULL; - if (FAILED(hr = pBackupComponents->DoSnapshotSet( &pDoShadowCopy ))) + if (FAILED(hr = pBackupComponents->DoSnapshotSet(&pDoShadowCopy))) { - releaseShadowCopy(pBackupComponents); writeErrorMsg(L"Error calling \"DoSnapshotSet\".", hr, errorMessage, errorBufferLen); return false; } @@ -173,7 +196,6 @@ bool shadow::createShadowCopy(const wchar_t* volumeName, pDoShadowCopy->Release(); if (FAILED(hr)) { - releaseShadowCopy(pBackupComponents); writeErrorMsg(L"Error calling \"pPrepare->Wait\".", hr, errorMessage, errorBufferLen); return false; } @@ -181,7 +203,6 @@ bool shadow::createShadowCopy(const wchar_t* volumeName, VSS_SNAPSHOT_PROP props; if (FAILED(hr = pBackupComponents->GetSnapshotProperties( SnapShotId, &props ))) { - releaseShadowCopy(pBackupComponents); writeErrorMsg(L"Error calling \"GetSnapshotProperties\".", hr, errorMessage, errorBufferLen); return false; } @@ -191,13 +212,13 @@ bool shadow::createShadowCopy(const wchar_t* volumeName, VssFreeSnapshotProperties(&props); - *backupHandle = pBackupComponents; + *backupHandle = pBackupComponents.release(); //release ownership return true; } -void shadow::releaseShadowCopy(void* backupHandle) +void Shadow::releaseShadowCopy(void* backupHandle) { if (backupHandle != NULL) static_cast(backupHandle)->Release(); diff --git a/shared/Taskbar_Seven/Taskbar_Seven.vcproj b/shared/Taskbar_Seven/Taskbar_Seven.vcproj deleted file mode 100644 index bf8e0993..00000000 --- a/shared/Taskbar_Seven/Taskbar_Seven.vcproj +++ /dev/null @@ -1,409 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shared/Taskbar_Seven/Taskbar_Seven.vcxproj b/shared/Taskbar_Seven/Taskbar_Seven.vcxproj new file mode 100644 index 00000000..db8b6feb --- /dev/null +++ b/shared/Taskbar_Seven/Taskbar_Seven.vcxproj @@ -0,0 +1,233 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {70394AEF-5897-4911-AFA1-82EAF0581EFA} + ShadowDll + Win32Proj + + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + true + Windows7.1SDK + + + DynamicLibrary + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + .\ + OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ + false + Taskbar7_$(Platform) + Taskbar7_$(Platform) + Taskbar7_$(Platform) + Taskbar7_$(Platform) + + + + $(IntDir)Build.html + + + Disabled + _DEBUG;_WINDOWS;_USRDLL;TASKBAR_SEVEN_DLL_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + EditAndContinue + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + true + $(IntDir)$(TargetName).pdb + Windows + + + $(IntDir)$(TargetName).lib + MachineX86 + + + + + $(IntDir)Build.html + + + X64 + + + Disabled + _DEBUG;_WINDOWS;_USRDLL;TASKBAR_SEVEN_DLL_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + ProgramDatabase + 4100 + + + $(OutDir)$(TargetName)$(TargetExt) + true + true + $(IntDir)$(TargetName).pdb + Windows + + + $(IntDir)$(TargetName).lib + MachineX64 + + + + + $(IntDir)Build.html + + + MaxSpeed + true + NDEBUG;_WINDOWS;_USRDLL;TASKBAR_SEVEN_DLL_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + ProgramDatabase + 4100 + Speed + + + $(OutDir)$(TargetName)$(TargetExt) + true + false + Windows + true + true + UseLinkTimeCodeGeneration + + + $(IntDir)$(TargetName).lib + MachineX86 + + + + + $(IntDir)Build.html + + + X64 + + + MaxSpeed + true + NDEBUG;_WINDOWS;_USRDLL;TASKBAR_SEVEN_DLL_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + ProgramDatabase + 4100 + Speed + + + $(OutDir)$(TargetName)$(TargetExt) + true + false + Windows + true + true + UseLinkTimeCodeGeneration + + + $(IntDir)$(TargetName).lib + MachineX64 + + + + + + + false + + + false + + + false + + + false + + + + + + + + + + \ No newline at end of file diff --git a/shared/Taskbar_Seven/dllmain.cpp b/shared/Taskbar_Seven/dllmain.cpp index 7db39bff..18bb453d 100644 --- a/shared/Taskbar_Seven/dllmain.cpp +++ b/shared/Taskbar_Seven/dllmain.cpp @@ -7,7 +7,7 @@ #define WIN32_LEAN_AND_MEAN #include - + BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, @@ -21,7 +21,7 @@ BOOL APIENTRY DllMain( HMODULE hModule, case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; - } + } return TRUE; } diff --git a/shared/Taskbar_Seven/taskbar.cpp b/shared/Taskbar_Seven/taskbar.cpp index 4baf2392..f5249e08 100644 --- a/shared/Taskbar_Seven/taskbar.cpp +++ b/shared/Taskbar_Seven/taskbar.cpp @@ -11,7 +11,7 @@ #include #include -#include +#include #include diff --git a/shared/checkExist.cpp b/shared/checkExist.cpp new file mode 100644 index 00000000..3f71afb8 --- /dev/null +++ b/shared/checkExist.cpp @@ -0,0 +1,54 @@ +#include "checkExist.h" +#include "parallelCall.h" +#include "fileHandling.h" + + +namespace +{ +template +class CheckObjectExists : public Async::Procedure +{ +public: + CheckObjectExists(const Zstring& filename) : + filename_(filename.c_str()), //deep copy: worker thread may run longer than main! Avoid shared data + isExisting(false) {} + + virtual void doWork() + { + isExisting = testExist(filename_); //throw() + } + + bool doesExist() const //retrieve result + { + return isExisting; + } + +private: + const Zstring filename_; //no reference, lifetime not known + bool isExisting; +}; + + +template +inline +Utility::ResultExist objExists(const Zstring& filename, size_t timeout) //timeout in ms +{ + typedef CheckObjectExists CheckObjEx; + boost::shared_ptr proc(new CheckObjEx(filename)); + + return Async::execute(proc, timeout) == Async::TIMEOUT ? Utility::EXISTING_TIMEOUT : + (proc->doesExist() ? Utility::EXISTING_TRUE : Utility::EXISTING_FALSE); +} +} + + +Utility::ResultExist Utility::fileExists(const Zstring& filename, size_t timeout) //timeout in ms +{ + return objExists(filename, timeout); +} + + +Utility::ResultExist Utility::dirExists(const Zstring& dirname, size_t timeout) //timeout in ms +{ + return objExists(dirname, timeout); +} diff --git a/shared/checkExist.h b/shared/checkExist.h new file mode 100644 index 00000000..bae5580c --- /dev/null +++ b/shared/checkExist.h @@ -0,0 +1,19 @@ +#ifndef CHECKEXIST_H_INCLUDED +#define CHECKEXIST_H_INCLUDED + +#include "zstring.h" + +namespace Utility +{ +enum ResultExist +{ + EXISTING_TRUE, + EXISTING_FALSE, + EXISTING_TIMEOUT +}; + +ResultExist fileExists(const Zstring& filename, size_t timeout); //timeout in ms +ResultExist dirExists( const Zstring& dirname, size_t timeout); //timeout in ms +} + +#endif // CHECKEXIST_H_INCLUDED diff --git a/shared/customTooltip.cpp b/shared/customTooltip.cpp index 105feabf..e483f7c7 100644 --- a/shared/customTooltip.cpp +++ b/shared/customTooltip.cpp @@ -10,7 +10,7 @@ #include -class PopupFrameGenerated : public wxFrame +class CustomTooltip::PopupFrameGenerated : public wxFrame { public: PopupFrameGenerated(wxWindow* parent, @@ -25,7 +25,7 @@ public: }; -PopupFrameGenerated::PopupFrameGenerated( +CustomTooltip::PopupFrameGenerated::PopupFrameGenerated( wxWindow* parent, wxWindowID id, const wxString& title, @@ -53,6 +53,10 @@ PopupFrameGenerated::PopupFrameGenerated( CustomTooltip::CustomTooltip() : tipWindow(new PopupFrameGenerated(NULL)), lastBmp(NULL) { +#ifdef FFS_WIN //neither looks good nor works at all on Linux + tipWindow->Disable(); //prevent window stealing focus! +#endif + hide(); } diff --git a/shared/customTooltip.h b/shared/customTooltip.h index d448254e..c6bf6cd6 100644 --- a/shared/customTooltip.h +++ b/shared/customTooltip.h @@ -9,9 +9,6 @@ #include -class PopupFrameGenerated; - - class CustomTooltip { public: @@ -22,6 +19,7 @@ public: void hide(); private: + class PopupFrameGenerated; PopupFrameGenerated* tipWindow; const wxBitmap* lastBmp; //buffer last used bitmap pointer }; diff --git a/shared/dllLoader.cpp b/shared/dllLoader.cpp index 1ecfcb76..f5242d83 100644 --- a/shared/dllLoader.cpp +++ b/shared/dllLoader.cpp @@ -7,7 +7,7 @@ #include "dllLoader.h" #include //includes "windows.h" #include -#include +#include namespace { diff --git a/shared/dragAndDrop.cpp b/shared/dragAndDrop.cpp index 581aac96..c5919e76 100644 --- a/shared/dragAndDrop.cpp +++ b/shared/dragAndDrop.cpp @@ -13,6 +13,8 @@ #include #include "fileHandling.h" #include "stringConv.h" +#include "checkExist.h" + //define new event type const wxEventType FFS_DROP_FILE_EVENT = wxNewEventType(); @@ -128,7 +130,8 @@ void DragDropOnMainDlg::OnFilesDropped(FFSFileDropEvent& event) void DragDropOnMainDlg::OnWriteDirManually(wxCommandEvent& event) { const Zstring newDir = getFormattedDirectoryName(wxToZ(event.GetString())); - if (dirExists(newDir)) + + if (Utility::dirExists(newDir, 100) == Utility::EXISTING_TRUE) //potentially slow network access: wait 100 ms at most dirPicker_->SetPath(zToWx(newDir)); event.Skip(); @@ -196,7 +199,7 @@ void DragDropOnDlg::OnFilesDropped(FFSFileDropEvent& event) void DragDropOnDlg::OnWriteDirManually(wxCommandEvent& event) { const Zstring newDir = FreeFileSync::getFormattedDirectoryName(wxToZ(event.GetString())); - if (dirExists(newDir)) + if (Utility::dirExists(newDir, 100) == Utility::EXISTING_TRUE) //potentially slow network access: wait 100 ms at most dirPicker_->SetPath(zToWx(newDir)); event.Skip(); @@ -210,4 +213,3 @@ void DragDropOnDlg::OnDirSelected(wxFileDirPickerEvent& event) event.Skip(); } - diff --git a/shared/fileHandling.cpp b/shared/fileHandling.cpp index 1abe640e..2a8af46a 100644 --- a/shared/fileHandling.cpp +++ b/shared/fileHandling.cpp @@ -31,7 +31,8 @@ #include "fileIO.h" #include #include -#include +#include +#include #endif using FreeFileSync::FileError; @@ -256,9 +257,7 @@ wxULongLong getFileSizeSymlink(const Zstring& linkName) //throw (FileError) BY_HANDLE_FILE_INFORMATION fileInfoByHandle; if (::GetFileInformationByHandle(hFile, &fileInfoByHandle)) - { return wxULongLong(fileInfoByHandle.nFileSizeHigh, fileInfoByHandle.nFileSizeLow); - } } const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + FreeFileSync::zToWx(linkName) + wxT("\""); @@ -681,17 +680,24 @@ public: m_files(filesShort), m_dirs(dirsShort) {} - virtual ReturnValue onFile(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink, const FileInfo& details) + virtual void onFile(const DefaultChar* shortName, const Zstring& fullName, const FileInfo& details) { m_files.push_back(std::make_pair(Zstring(shortName), fullName)); - return TRAVERSING_CONTINUE; } - virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink) + virtual void onSymlink(const DefaultChar* shortName, const Zstring& fullName, const SymlinkInfo& details) + { + if (details.dirLink) + m_dirs.push_back(std::make_pair(Zstring(shortName), fullName)); + else + m_files.push_back(std::make_pair(Zstring(shortName), fullName)); + } + + virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName) { m_dirs.push_back(std::make_pair(Zstring(shortName), fullName)); return Loki::Int2Type(); //DON'T traverse into subdirs; moveDirectory works recursively! } - virtual ReturnValue onError(const wxString& errorText) + virtual void onError(const wxString& errorText) { throw FileError(errorText); } @@ -714,9 +720,9 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool return; } - if (dirExists(targetDir)) + if (somethingExists(targetDir)) { - if (!ignoreExistingDirs) //directory or symlink exists + if (!ignoreExistingDirs) //directory or symlink exists (or even a file... this error will be caught later) { const wxString errorMessage = wxString(_("Error moving directory:")) + wxT("\n\"") + zToWx(sourceDir) + wxT("\" ->\n\"") + zToWx(targetDir) + wxT("\""); throw FileError(errorMessage + wxT("\n\n") + _("Target directory already existing!")); @@ -755,7 +761,7 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool //traverse source directory one level TraverseOneLevel traverseCallback(fileList, dirList); - traverseFolder(sourceDir, &traverseCallback); //traverse one level + traverseFolder(sourceDir, false, &traverseCallback); //traverse one level, don't follow symlinks const Zstring targetDirFormatted = targetDir.EndsWith(globalFunctions::FILE_NAME_SEPARATOR) ? //ends with path separator targetDir : @@ -804,17 +810,23 @@ public: m_files(files), m_dirs(dirs) {} - virtual ReturnValue onFile(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink, const FileInfo& details) + virtual void onFile(const DefaultChar* shortName, const Zstring& fullName, const FileInfo& details) { m_files.push_back(fullName); - return TRAVERSING_CONTINUE; } - virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink) + virtual void onSymlink(const DefaultChar* shortName, const Zstring& fullName, const SymlinkInfo& details) + { + if (details.dirLink) + m_dirs.push_back(fullName); + else + m_files.push_back(fullName); + } + virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName) { m_dirs.push_back(fullName); return Loki::Int2Type(); //DON'T traverse into subdirs; removeDirectory works recursively! } - virtual ReturnValue onError(const wxString& errorText) + virtual void onError(const wxString& errorText) { throw FileError(errorText); } @@ -865,7 +877,7 @@ void FreeFileSync::removeDirectory(const Zstring& directory) //get all files and directories from current directory (WITHOUT subdirectories!) FilesDirsOnlyTraverser traverser(fileList, dirList); - FreeFileSync::traverseFolder(directory, &traverser); + FreeFileSync::traverseFolder(directory, false, &traverser); //don't follow symlinks //delete files std::for_each(fileList.begin(), fileList.end(), removeFile); @@ -887,53 +899,106 @@ void FreeFileSync::removeDirectory(const Zstring& directory) //optionally: copy directory last change date, DO NOTHING if something fails -void FreeFileSync::copyFileTimes(const Zstring& sourceDir, const Zstring& targetDir) +bool FreeFileSync::copyFileTimes(const Zstring& sourceDir, const Zstring& targetDir, bool deRefSymlinks) //throw() { - if (symlinkExists(sourceDir)) //don't handle symlinks (yet) - return; - #ifdef FFS_WIN - WIN32_FILE_ATTRIBUTE_DATA sourceAttr; - if (!::GetFileAttributesEx(applyLongPathPrefix(sourceDir).c_str(), //__in LPCTSTR lpFileName, - GetFileExInfoStandard, //__in GET_FILEEX_INFO_LEVELS fInfoLevelId, - &sourceAttr)) //__out LPVOID lpFileInformation - return; + FILETIME creationTime = {0}; + FILETIME lastAccessTime = {0}; + FILETIME lastWriteTime = {0}; + + { + WIN32_FILE_ATTRIBUTE_DATA sourceAttr; + if (!::GetFileAttributesEx(applyLongPathPrefix(sourceDir).c_str(), //__in LPCTSTR lpFileName, + GetFileExInfoStandard, //__in GET_FILEEX_INFO_LEVELS fInfoLevelId, + &sourceAttr)) //__out LPVOID lpFileInformation + return false; + + if ((sourceAttr.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) && deRefSymlinks) //we have a symlink AND need to dereference... + { + HANDLE hDirRead = ::CreateFile(applyLongPathPrefix(sourceDir).c_str(), + FILE_READ_ATTRIBUTES, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory; no FILE_FLAG_OPEN_REPARSE_POINT => deref symlinks + NULL); + if (hDirRead == INVALID_HANDLE_VALUE) + return false; + + boost::shared_ptr dummy(hDirRead, ::CloseHandle); + + if (!::GetFileTime(hDirRead, //__in HANDLE hFile, + &creationTime, //__out_opt LPFILETIME lpCreationTime, + &lastAccessTime, //__out_opt LPFILETIME lpLastAccessTime, + &lastWriteTime)) //__out_opt LPFILETIME lpLastWriteTime + return false; + } + else + { + creationTime = sourceAttr.ftCreationTime; + lastAccessTime = sourceAttr.ftLastAccessTime; + lastWriteTime = sourceAttr.ftLastWriteTime; + } + } + HANDLE hDirWrite = ::CreateFile(applyLongPathPrefix(targetDir).c_str(), FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory + FILE_FLAG_BACKUP_SEMANTICS | //needed to open a directory + (deRefSymlinks ? 0 : FILE_FLAG_OPEN_REPARSE_POINT), //process symlinks NULL); if (hDirWrite == INVALID_HANDLE_VALUE) - return; + return false; boost::shared_ptr dummy(hDirWrite, ::CloseHandle); - //(try to) set new "last write time" - ::SetFileTime(hDirWrite, - &sourceAttr.ftCreationTime, - &sourceAttr.ftLastAccessTime, - &sourceAttr.ftLastWriteTime); //return value not evalutated! -#elif defined FFS_LINUX + if (!::SetFileTime(hDirWrite, + &creationTime, + &lastAccessTime, + &lastWriteTime)) //return value not evalutated! + return false; - struct stat dirInfo; - if (::stat(sourceDir.c_str(), &dirInfo) == 0) //read file attributes from source directory +#elif defined FFS_LINUX + if (deRefSymlinks) { - //adapt file modification time: + struct stat dirInfo; + if (::stat(sourceDir.c_str(), &dirInfo) != 0) //read file attributes from source directory + return false; + struct utimbuf newTimes; - //::time(&newTimes.actime); //set file access time to current time newTimes.actime = dirInfo.st_atime; newTimes.modtime = dirInfo.st_mtime; //(try to) set new "last write time" - ::utime(targetDir.c_str(), &newTimes); //return value not evalutated! + if (::utime(targetDir.c_str(), &newTimes) != 0) //return value not evalutated! + return false; + } + else + { + struct stat dirInfo; + if (::lstat(sourceDir.c_str(), &dirInfo) != 0) //read file attributes from source directory + return false; + + struct timeval newTimes[2]; + newTimes[0].tv_sec = dirInfo.st_atime; /* seconds */ + newTimes[0].tv_usec = 0; /* microseconds */ + + newTimes[1].tv_sec = dirInfo.st_mtime; /* seconds */ + newTimes[1].tv_usec = 0; /* microseconds */ + + if (::lutimes(targetDir.c_str(), newTimes) != 0) //return value not evalutated! + return false; } #endif + return true; } +namespace +{ #ifdef FFS_WIN Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target path of symbolic link to a directory { @@ -1021,8 +1086,44 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa // } // //} -#endif +#elif defined FFS_LINUX +void copySymlinkInternal(const Zstring& sourceLink, const Zstring& targetLink) //throw (FileError) +{ + using namespace FreeFileSync; + + //copy symbolic link + const int BUFFER_SIZE = 10000; + char buffer[BUFFER_SIZE]; + const int bytesWritten = ::readlink(sourceLink.c_str(), buffer, BUFFER_SIZE); + if (bytesWritten < 0 || bytesWritten == BUFFER_SIZE) + { + wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zToWx(sourceLink) + wxT("\""); + if (bytesWritten < 0) errorMessage += wxString(wxT("\n\n")) + FreeFileSync::getLastErrorFormatted(); + throw FileError(errorMessage); + } + //set null-terminating char + buffer[bytesWritten] = 0; + + if (::symlink(buffer, targetLink.c_str()) != 0) + { + const wxString errorMessage = wxString(_("Error copying symbolic link:")) + wxT("\n\"") + zToWx(sourceLink) + wxT("\" ->\n\"") + zToWx(targetLink) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + + //allow only consistent objects to be created -> don't place before ::symlink, targetLink may already exist + Loki::ScopeGuard guardTargetLink = Loki::MakeGuard(::unlink, targetLink); + + if (!copyFileTimes(sourceLink, targetLink, false)) + { + wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetLink) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + + guardTargetLink.Dismiss(); +} +#endif +} void createDirectoryRecursively(const Zstring& directory, const Zstring& templateDir, const bool copyDirectorySymLinks, const int level) { @@ -1059,8 +1160,10 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat } else { + const bool isSymlink = (templateAttr & FILE_ATTRIBUTE_REPARSE_POINT) != 0; //syntax required to shut MSVC up + //symbolic link handling - if (!copyDirectorySymLinks && templateAttr & FILE_ATTRIBUTE_REPARSE_POINT) //create directory based on target of symbolic link + if (!copyDirectorySymLinks && isSymlink) //create directory based on target of symbolic link { //get target directory of symbolic link const Zstring linkPath = resolveDirectorySymlink(templateDir); @@ -1091,7 +1194,7 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat applyLongPathPrefixCreateDir(directory).c_str(), // pointer to a directory path string NULL) && level == 0) { - const wxString errorMessage = templateAttr & FILE_ATTRIBUTE_REPARSE_POINT ? + const wxString errorMessage = isSymlink ? //give a more meaningful errormessage if copying a symbolic link failed, e.g. "C:\Users\ZenJu\Application Data" (wxString(_("Error copying symbolic link:")) + wxT("\n\"") + templateDir.c_str() + wxT("\" ->\n\"") + directory.c_str() + wxT("\"")) : @@ -1099,38 +1202,43 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); } + + if (copyDirectorySymLinks && isSymlink) //we need to copy the Symbolic Link's change date manually + { + struct TryCleanUp + { + static void tryDeleteLink(const Zstring& linkname) //throw () + { + try + { + removeDirectory(linkname); + } + catch (...) {} + } + }; + //allow only consistent objects to be created -> don't place before ::CreateDirectoryEx, targetLink may already exist + Loki::ScopeGuard guardTargetLink = Loki::MakeGuard(&TryCleanUp::tryDeleteLink, directory); + + if (!copyFileTimes(templateDir, directory, false)) + { + wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(directory) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + + guardTargetLink.Dismiss(); + } + //(try to) copy additional metadata like last modification time: no measurable performance drawback //copyAdditionalMetadata(templateDir, directory); } } #elif defined FFS_LINUX //symbolic link handling - if (copyDirectorySymLinks) - { - if ( !templateDir.empty() && //test if templateDir is a symbolic link - symlinkExists(templateDir)) - { - //copy symbolic link - const int BUFFER_SIZE = 10000; - char buffer[BUFFER_SIZE]; - const int bytesWritten = readlink(templateDir.c_str(), buffer, BUFFER_SIZE); - if (bytesWritten < 0 || bytesWritten >= BUFFER_SIZE) - { - wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zToWx(templateDir) + wxT("\""); - if (bytesWritten < 0) errorMessage += wxString(wxT("\n\n")) + FreeFileSync::getLastErrorFormatted(); - throw FileError(errorMessage); - } - //set null-terminating char - buffer[bytesWritten] = 0; - - if (::symlink(buffer, directory.c_str()) != 0) - { - const wxString errorMessage = wxString(_("Error copying symbolic link:")) + wxT("\n\"") + zToWx(templateDir) + wxT("\" ->\n\"") + zToWx(directory) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); - } - return; //symlink created successfully - } - } + if ( copyDirectorySymLinks && + !templateDir.empty() && + symlinkExists(templateDir)) + //there is no directory-type symlink in Linux! => just copy as file + return copySymlinkInternal(templateDir, directory); //throw (FileError) //default directory creation if (::mkdir(directory.c_str(), 0755) != 0 && level == 0) @@ -1163,7 +1271,7 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat } -void FreeFileSync::createDirectory(const Zstring& directory, const Zstring& templateDir, const bool copyDirectorySymLinks) +void FreeFileSync::createDirectory(const Zstring& directory, const Zstring& templateDir, bool copyDirectorySymLinks) { //remove trailing separator const Zstring dirFormatted = directory.EndsWith(globalFunctions::FILE_NAME_SEPARATOR) ? @@ -1319,7 +1427,7 @@ void FreeFileSync::copyFile(const Zstring& sourceFile, if (!::CopyFileEx( //same performance as CopyFile() applyLongPathPrefix(sourceFile).c_str(), applyLongPathPrefix(temporary).c_str(), - copyCallbackInternal, + callback != NULL ? copyCallbackInternal : NULL, callback, NULL, copyFlags)) @@ -1351,8 +1459,8 @@ void FreeFileSync::copyFile(const Zstring& sourceFile, guardTempFile.Dismiss(); //no need to delete temp file anymore - //copy creation date (last modification date is redundantly written, too) - copyFileTimes(sourceFile, targetFile); //throw() + //copy creation date (last modification date is redundantly written, too, even for symlinks) + copyFileTimes(sourceFile, targetFile, !copyFileSymLinks); //throw() } @@ -1365,32 +1473,9 @@ void FreeFileSync::copyFile(const Zstring& sourceFile, using FreeFileSync::CopyFileCallback; //symbolic link handling - if (copyFileSymLinks) - { - if (symlinkExists(sourceFile)) - { - //copy symbolic link - const int BUFFER_SIZE = 10000; - char buffer[BUFFER_SIZE]; - const int bytesWritten = readlink(sourceFile.c_str(), buffer, BUFFER_SIZE); - if (bytesWritten < 0 || bytesWritten == BUFFER_SIZE) - { - wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\""); - if (bytesWritten < 0) errorMessage += wxString(wxT("\n\n")) + FreeFileSync::getLastErrorFormatted(); - throw FileError(errorMessage); - } - //set null-terminating char - buffer[bytesWritten] = 0; - - if (symlink(buffer, targetFile.c_str()) != 0) - { - const wxString errorMessage = wxString(_("Error copying symbolic link:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\" ->\n\"") + zToWx(targetFile) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); - } - - return; //symlink created successfully - } - } + if ( copyFileSymLinks && + symlinkExists(sourceFile)) + return copySymlinkInternal(sourceFile, targetFile); //throw (FileError) //begin of regular file copy struct stat fileInfo; @@ -1444,10 +1529,7 @@ void FreeFileSync::copyFile(const Zstring& sourceFile, fileOut.close(); //adapt file modification time: - struct utimbuf newTimes; - ::time(&newTimes.actime); //set file access time to current time - newTimes.modtime = fileInfo.st_mtime; - if (::utime(temporary.c_str(), &newTimes) != 0) + if (!copyFileTimes(sourceFile, temporary, true)) //throw() { wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\""); throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); diff --git a/shared/fileHandling.h b/shared/fileHandling.h index 7e1b3de0..6c57e8e4 100644 --- a/shared/fileHandling.h +++ b/shared/fileHandling.h @@ -35,8 +35,9 @@ enum ResponseSameVol }; ResponseSameVol onSameVolume(const Zstring& folderLeft, const Zstring& folderRight); //throw() -//optionally: copy creation/last change date, DOES NOTHING if something fails -void copyFileTimes(const Zstring& sourceDir, const Zstring& targetDir); //throw() +//optionally: copy file or directory create/last change date, DOES NOTHING if something fails +//does NOT dereference symlinks! +bool copyFileTimes(const Zstring& sourceDir, const Zstring& targetDir, bool deRefSymlinks); //throw(); returns true on success //symlink handling: always evaluate target wxULongLong getFilesize(const Zstring& filename); //throw (FileError) @@ -70,7 +71,7 @@ void moveFile(const Zstring& sourceFile, const Zstring& targetFile, MoveFileCall void moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExistingDirs, MoveFileCallback* callback = NULL); //throw (FileError); //creates superdirectories automatically: -void createDirectory(const Zstring& directory, const Zstring& templateDir = Zstring(), const bool copyDirectorySymLinks = false); //throw (FileError); +void createDirectory(const Zstring& directory, const Zstring& templateDir = Zstring(), bool copyDirectorySymLinks = false); //throw (FileError); struct CopyFileCallback //callback functionality { diff --git a/shared/fileIO.h b/shared/fileIO.h index 313ceece..a04d8a0e 100644 --- a/shared/fileIO.h +++ b/shared/fileIO.h @@ -12,7 +12,7 @@ #ifdef FFS_WIN #include //includes "windows.h" #elif defined FFS_LINUX -#include +#include #endif #include "zstring.h" diff --git a/shared/fileTraverser.cpp b/shared/fileTraverser.cpp index eec4dcaf..465c2f8f 100644 --- a/shared/fileTraverser.cpp +++ b/shared/fileTraverser.cpp @@ -10,19 +10,20 @@ #include #include "stringConv.h" #include +#include #ifdef FFS_WIN #include //includes "windows.h" +#include "WinIoCtl.h" #include "longPathPrefix.h" #elif defined FFS_LINUX #include #include -#include +#include #endif -#ifdef FFS_WIN //Note: this class is superfluous for 64 bit applications! //class DisableWow64Redirection //{ @@ -54,19 +55,118 @@ // PVOID oldValue; //}; +#ifdef _MSC_VER //I don't have Windows Driver Kit at hands right now, so unfortunately we need to redefine this structures and cross fingers... +typedef struct _REPARSE_DATA_BUFFER +{ + ULONG ReparseTag; + USHORT ReparseDataLength; + USHORT Reserved; + union + { + struct + { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + ULONG Flags; + WCHAR PathBuffer[1]; + } SymbolicLinkReparseBuffer; + struct + { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + WCHAR PathBuffer[1]; + } MountPointReparseBuffer; + struct + { + UCHAR DataBuffer[1]; + } GenericReparseBuffer; + }; +} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; +#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer) +#endif + + +Zstring getSymlinkTarget(const Zstring& linkPath) //throw(); returns empty string on error +{ +#ifdef FFS_WIN +//FSCTL_GET_REPARSE_POINT: http://msdn.microsoft.com/en-us/library/aa364571(VS.85).aspx + + const HANDLE hLink = ::CreateFile(linkPath.c_str(), + GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, + NULL); + if (hLink == INVALID_HANDLE_VALUE) + return Zstring(); + + boost::shared_ptr dummy(hLink, ::CloseHandle); + + //respect alignment issues... + const size_t bufferSize = REPARSE_DATA_BUFFER_HEADER_SIZE + MAXIMUM_REPARSE_DATA_BUFFER_SIZE; + boost::scoped_array buffer(new char[bufferSize]); + + DWORD bytesReturned; //dummy value required by FSCTL_GET_REPARSE_POINT! + if (!::DeviceIoControl(hLink, //__in HANDLE hDevice, + FSCTL_GET_REPARSE_POINT, //__in DWORD dwIoControlCode, + NULL, //__in_opt LPVOID lpInBuffer, + 0, //__in DWORD nInBufferSize, + buffer.get(), //__out_opt LPVOID lpOutBuffer, + bufferSize, //__in DWORD nOutBufferSize, + &bytesReturned, //__out_opt LPDWORD lpBytesReturned, + NULL)) //__inout_opt LPOVERLAPPED lpOverlapped + return Zstring(); + + REPARSE_DATA_BUFFER& reparseData = *reinterpret_cast(buffer.get()); //REPARSE_DATA_BUFFER needs to be artificially enlarged! + + if (reparseData.ReparseTag == IO_REPARSE_TAG_SYMLINK) + return Zstring(reparseData.SymbolicLinkReparseBuffer.PathBuffer + reparseData.SymbolicLinkReparseBuffer.SubstituteNameOffset / sizeof(WCHAR), + reparseData.SymbolicLinkReparseBuffer.SubstituteNameLength / sizeof(WCHAR)); + else if (reparseData.ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) + return Zstring(reparseData.MountPointReparseBuffer.PathBuffer + reparseData.MountPointReparseBuffer.SubstituteNameOffset / sizeof(WCHAR), + reparseData.MountPointReparseBuffer.SubstituteNameLength / sizeof(WCHAR)); + else + return Zstring(); //unknown reparse point + +#elif defined FFS_LINUX + const int BUFFER_SIZE = 10000; + char buffer[BUFFER_SIZE]; + + const int bytesWritten = ::readlink(linkPath.c_str(), buffer, BUFFER_SIZE); + if (bytesWritten < 0 || bytesWritten >= BUFFER_SIZE) + return Zstring(); //error + + buffer[bytesWritten] = 0; //set null-terminating char + + return buffer; +#endif +} + +#ifdef FFS_WIN inline -void setWin32FileInformation(const FILETIME& lastWriteTime, - const DWORD fileSizeHigh, - const DWORD fileSizeLow, - FreeFileSync::TraverseCallback::FileInfo& output) +wxLongLong getWin32TimeInformation(const FILETIME& lastWriteTime) { //convert UTC FILETIME to ANSI C format (number of seconds since Jan. 1st 1970 UTC) wxLongLong writeTimeLong(wxInt32(lastWriteTime.dwHighDateTime), lastWriteTime.dwLowDateTime); writeTimeLong /= 10000000; //reduce precision to 1 second (FILETIME has unit 10^-7 s) writeTimeLong -= wxLongLong(2, 3054539008UL); //timeshift between ansi C time and FILETIME in seconds == 11644473600s - output.lastWriteTimeRaw = writeTimeLong; + return writeTimeLong; +} + +inline +void setWin32FileInformation(const FILETIME& lastWriteTime, + const DWORD fileSizeHigh, + const DWORD fileSizeLow, + FreeFileSync::TraverseCallback::FileInfo& output) +{ + output.lastWriteTimeRaw = getWin32TimeInformation(lastWriteTime); output.fileSize = wxULongLong(fileSizeHigh, fileSizeLow); } @@ -98,19 +198,15 @@ bool setWin32FileInformationFromSymlink(const Zstring& linkName, FreeFileSync::T #endif -bool traverseDirectory(const Zstring& directory, FreeFileSync::TraverseCallback* sink, const int level) +template +void traverseDirectory(const Zstring& directory, FreeFileSync::TraverseCallback* sink, int level) { using namespace FreeFileSync; if (level == 100) //catch endless recursion { - switch (sink->onError(wxString(_("Endless loop when traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\""))) - { - case TraverseCallback::TRAVERSING_STOP: - return false; - case TraverseCallback::TRAVERSING_CONTINUE: - return true; - } + sink->onError(wxString(_("Endless loop when traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"")); + return; } #ifdef FFS_WIN @@ -128,19 +224,14 @@ bool traverseDirectory(const Zstring& directory, FreeFileSync::TraverseCallback* { const DWORD lastError = ::GetLastError(); if (lastError == ERROR_FILE_NOT_FOUND) - return true; + return; //else: we have a problem... report it: const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") + wxT("\n\n") + FreeFileSync::getLastErrorFormatted(lastError); - switch (sink->onError(errorMessage)) - { - case TraverseCallback::TRAVERSING_STOP: - return false; - case TraverseCallback::TRAVERSING_CONTINUE: - return true; - } + sink->onError(errorMessage); + return; } boost::shared_ptr dummy(searchHandle, ::FindClose); @@ -149,32 +240,37 @@ bool traverseDirectory(const Zstring& directory, FreeFileSync::TraverseCallback* { //don't return "." and ".." const wxChar* const shortName = fileMetaData.cFileName; - if ( shortName[0] == wxChar('.') && - ((shortName[1] == wxChar('.') && shortName[2] == wxChar('\0')) || - shortName[1] == wxChar('\0'))) + if ( shortName[0] == wxChar('.') && + ((shortName[1] == wxChar('.') && shortName[2] == wxChar('\0')) || + shortName[1] == wxChar('\0'))) continue; const Zstring fullName = directoryFormatted + shortName; + const bool isSymbolicLink = (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; - if (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... (for directory symlinks this flag is set too!) + if (isSymbolicLink && !followSymlinks) //evaluate symlink directly + { + TraverseCallback::SymlinkInfo details; + details.lastWriteTimeRaw = getWin32TimeInformation(fileMetaData.ftLastWriteTime); + details.targetPath = getSymlinkTarget(fullName); //throw(); returns empty string on error + details.dirLink = (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; //directory symlinks have this flag on Windows + sink->onSymlink(shortName, fullName, details); + } + else if (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... or symlink that needs to be followed (for directory symlinks this flag is set too!) { - const TraverseCallback::ReturnValDir rv = sink->onDir(shortName, fullName, isSymbolicLink); + const TraverseCallback::ReturnValDir rv = sink->onDir(shortName, fullName); switch (rv.returnCode) { - case TraverseCallback::ReturnValDir::TRAVERSING_DIR_STOP: - return false; - case TraverseCallback::ReturnValDir::TRAVERSING_DIR_IGNORE: break; case TraverseCallback::ReturnValDir::TRAVERSING_DIR_CONTINUE: - if (!traverseDirectory(fullName, rv.subDirCb, level + 1)) - return false; + traverseDirectory(fullName, rv.subDirCb, level + 1); break; } } - else //a file... + else //a file or symlink that is followed... { TraverseCallback::FileInfo details; @@ -190,13 +286,7 @@ bool traverseDirectory(const Zstring& directory, FreeFileSync::TraverseCallback* else setWin32FileInformation(fileMetaData.ftLastWriteTime, fileMetaData.nFileSizeHigh, fileMetaData.nFileSizeLow, details); - switch (sink->onFile(shortName, fullName, isSymbolicLink, details)) - { - case TraverseCallback::TRAVERSING_STOP: - return false; - case TraverseCallback::TRAVERSING_CONTINUE: - break; - } + sink->onFile(shortName, fullName, details); } } while (::FindNextFile(searchHandle, // handle to search @@ -204,30 +294,20 @@ bool traverseDirectory(const Zstring& directory, FreeFileSync::TraverseCallback* const DWORD lastError = ::GetLastError(); if (lastError == ERROR_NO_MORE_FILES) - return true; //everything okay + return; //everything okay //else: we have a problem... report it: const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") ; - switch (sink->onError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted(lastError))) - { - case TraverseCallback::TRAVERSING_STOP: - return false; - case TraverseCallback::TRAVERSING_CONTINUE: - return true; - } + sink->onError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted(lastError)); + return; #elif defined FFS_LINUX DIR* dirObj = ::opendir(directory.c_str()); //directory must NOT end with path separator, except "/" if (dirObj == NULL) { const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") ; - switch (sink->onError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted())) - { - case TraverseCallback::TRAVERSING_STOP: - return false; - case TraverseCallback::TRAVERSING_CONTINUE: - return true; - } + sink->onError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + return; } boost::shared_ptr dummy(dirObj, &::closedir); //never close NULL handles! -> crash @@ -239,17 +319,12 @@ bool traverseDirectory(const Zstring& directory, FreeFileSync::TraverseCallback* if (dirEntry == NULL) { if (errno == 0) - return true; //everything okay + return; //everything okay //else: we have a problem... report it: const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") ; - switch (sink->onError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted())) - { - case TraverseCallback::TRAVERSING_STOP: - return false; - case TraverseCallback::TRAVERSING_CONTINUE: - return true; - } + sink->onError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + return; } //don't return "." and ".." @@ -264,80 +339,70 @@ bool traverseDirectory(const Zstring& directory, FreeFileSync::TraverseCallback* directory + globalFunctions::FILE_NAME_SEPARATOR + shortName; struct stat fileInfo; - if (lstat(fullName.c_str(), &fileInfo) != 0) //lstat() does not resolve symlinks + if (::lstat(fullName.c_str(), &fileInfo) != 0) //lstat() does not resolve symlinks { const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(fullName) + wxT("\""); - switch (sink->onError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted())) - { - case TraverseCallback::TRAVERSING_STOP: - return false; - case TraverseCallback::TRAVERSING_CONTINUE: - break; - } + sink->onError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); continue; } const bool isSymbolicLink = S_ISLNK(fileInfo.st_mode); - if (isSymbolicLink) //dereference symbolic links + + if (isSymbolicLink) { - if (stat(fullName.c_str(), &fileInfo) != 0) //stat() resolves symlinks + if (followSymlinks) //on Linux Symlinks need to be followed to evaluate whether they point to a file or directory { - //a broken symbolic link - TraverseCallback::FileInfo details; - details.lastWriteTimeRaw = 0; //we are not interested in the modifiation time of the link - details.fileSize = 0; - - switch (sink->onFile(shortName, fullName, isSymbolicLink, details)) + if (::stat(fullName.c_str(), &fileInfo) != 0) //stat() resolves symlinks { - case TraverseCallback::TRAVERSING_STOP: - return false; - case TraverseCallback::TRAVERSING_CONTINUE: - break; + //a broken symbolic link + TraverseCallback::FileInfo details; + details.lastWriteTimeRaw = 0; //we are not interested in the modifiation time of the link + details.fileSize = 0; + sink->onFile(shortName, fullName, details); //report broken symlink as file! + continue; } + } + else //evaluate symlink directly + { + TraverseCallback::SymlinkInfo details; + details.lastWriteTimeRaw = fileInfo.st_mtime; //UTC time(ANSI C format); unit: 1 second + details.targetPath = getSymlinkTarget(fullName); //throw(); returns empty string on error + details.dirLink = ::stat(fullName.c_str(), &fileInfo) == 0 && S_ISDIR(fileInfo.st_mode); //S_ISDIR and S_ISLNK are mutually exclusive on Linux => need to follow link + sink->onSymlink(shortName, fullName, details); continue; } } + //fileInfo contains dereferenced data in any case from here on - if (S_ISDIR(fileInfo.st_mode)) //a directory... (note: symbolic links need to be dereferenced to test whether they point to a directory!) + if (S_ISDIR(fileInfo.st_mode)) //a directory... cannot be a symlink on Linux in this case { - const TraverseCallback::ReturnValDir rv = sink->onDir(shortName, fullName, isSymbolicLink); + const TraverseCallback::ReturnValDir rv = sink->onDir(shortName, fullName); switch (rv.returnCode) { - case TraverseCallback::ReturnValDir::TRAVERSING_DIR_STOP: - return false; - case TraverseCallback::ReturnValDir::TRAVERSING_DIR_IGNORE: break; case TraverseCallback::ReturnValDir::TRAVERSING_DIR_CONTINUE: - if (!traverseDirectory(fullName, rv.subDirCb, level + 1)) - return false; + traverseDirectory(fullName, rv.subDirCb, level + 1); break; } } - else //a file... + else //a file... (or symlink; pathological!) { TraverseCallback::FileInfo details; details.lastWriteTimeRaw = fileInfo.st_mtime; //UTC time(ANSI C format); unit: 1 second details.fileSize = fileInfo.st_size; - switch (sink->onFile(shortName, fullName, isSymbolicLink, details)) - { - case TraverseCallback::TRAVERSING_STOP: - return false; - case TraverseCallback::TRAVERSING_CONTINUE: - break; - } + sink->onFile(shortName, fullName, details); } } #endif - - return true; //dummy value } void FreeFileSync::traverseFolder(const Zstring& directory, + bool followSymlinks, TraverseCallback* sink) { #ifdef FFS_WIN @@ -349,5 +414,8 @@ void FreeFileSync::traverseFolder(const Zstring& directory, directory; #endif - traverseDirectory(directoryFormatted, sink, 0); + if (followSymlinks) + traverseDirectory(directoryFormatted, sink, 0); + else + traverseDirectory(directoryFormatted, sink, 0); } diff --git a/shared/fileTraverser.h b/shared/fileTraverser.h index f765bb5b..b9cd3ff1 100644 --- a/shared/fileTraverser.h +++ b/shared/fileTraverser.h @@ -8,8 +8,6 @@ #define FILETRAVERSER_H_INCLUDED #include "zstring.h" -#include -#include #include #include "loki/TypeManip.h" @@ -22,16 +20,17 @@ class TraverseCallback public: virtual ~TraverseCallback() {} - enum ReturnValue + struct FileInfo { - TRAVERSING_STOP, - TRAVERSING_CONTINUE + wxULongLong fileSize; //unit: bytes! + wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC }; - struct FileInfo + struct SymlinkInfo { - wxULongLong fileSize; //unit: bytes! wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC + Zstring targetPath; //may be empty if something goes wrong + bool dirLink; //"true": point to dir; "false": point to file (or broken Link on Linux) }; class ReturnValDir @@ -39,29 +38,30 @@ public: public: enum ReturnValueEnh { - TRAVERSING_DIR_STOP, TRAVERSING_DIR_IGNORE, TRAVERSING_DIR_CONTINUE }; - ReturnValDir(Loki::Int2Type) : returnCode(TRAVERSING_DIR_STOP), subDirCb(NULL) {} ReturnValDir(Loki::Int2Type) : returnCode(TRAVERSING_DIR_IGNORE), subDirCb(NULL) {} ReturnValDir(Loki::Int2Type, TraverseCallback* subDirCallback) : returnCode(TRAVERSING_DIR_CONTINUE), subDirCb(subDirCallback) {} - const ReturnValueEnh returnCode; TraverseCallback* const subDirCb; }; //overwrite these virtual methods - virtual ReturnValue onError(const wxString& errorText) = 0; - virtual ReturnValue onFile(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink, const FileInfo& details) = 0; - virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName, bool isSymlink) = 0; + virtual void onError(const wxString& errorText) = 0; + virtual void onFile( const DefaultChar* shortName, const Zstring& fullName, const FileInfo& details) = 0; + virtual void onSymlink( const DefaultChar* shortName, const Zstring& fullName, const SymlinkInfo& details) = 0; + virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName) = 0; }; //custom traverser with detail information about files //directory may end with PATH_SEPARATOR -void traverseFolder(const Zstring& directory, TraverseCallback* sink); //throw() +void traverseFolder(const Zstring& directory, bool followSymlinks, TraverseCallback* sink); //throw(); +//followSymlinks: +//"true": Symlinks dereferenced and reported via onFile() and onDir() => onSymlink not used! +//"false": Symlinks directly reported via onSymlink() } #endif // FILETRAVERSER_H_INCLUDED diff --git a/shared/globalFunctions.cpp b/shared/globalFunctions.cpp index c02a1d77..63831e1a 100644 --- a/shared/globalFunctions.cpp +++ b/shared/globalFunctions.cpp @@ -8,30 +8,9 @@ #include #include #include -#include #include "systemConstants.h" -int globalFunctions::wxStringToInt(const wxString& number) -{ - long result = 0; - if (number.ToLong(&result)) - return result; - else - return 0; //don't throw exceptions here: wxEmptyString shall be interpreted as 0 -} - - -double globalFunctions::wxStringToDouble(const wxString& number) -{ - double result = 0; - if (number.ToDouble(&result)) - return result; - else - return 0; //don't throw exceptions here: wxEmptyString shall be interpreted as 0 -} - - size_t globalFunctions::getDigitCount(size_t number) //count number of digits { return number == 0 ? 1 : static_cast(::log10(static_cast(number))) + 1; diff --git a/shared/globalFunctions.h b/shared/globalFunctions.h index daf495b5..fe65889f 100644 --- a/shared/globalFunctions.h +++ b/shared/globalFunctions.h @@ -37,19 +37,22 @@ T abs(const T& d) //absolute value return(d < 0 ? -d : d); } -template -std::string numberToString(const T& number); //convert number to string the C++ way -template -void stringToNumber(const std::string& input, T& number); //convert string to number the C++ way +//number conversion C++ ANSI/wide char versions +template +std::basic_string numberToString(const T& number); //convert number to string the C++ way + +template +T stringToNumber(const std::basic_string& input); //convert number to string the C++ way +//number conversion wxWidgets +template wxString numberToString(const T& number); +template T stringToNumber(const wxString& input); -int wxStringToInt( const wxString& number); //convert wxString to number -double wxStringToDouble(const wxString& number); //convert wxString to number size_t getDigitCount(size_t number); //count number of digits -//read/write numbers: int, long, unsigned int ... ect +//serialization: read/write numbers: int, long, unsigned int ... ect template T readNumber(std::istream& stream); template void writeNumber(std::ostream& stream, T number); @@ -64,10 +67,6 @@ wxLongLong convertToSigned(const wxULongLong number) template void removeRowsFromVector(const std::set& rowsToRemove, std::vector& grid); -//bubble sort using swap() instead of assignment: useful if assignment is very expensive -template -void bubbleSwapSort(VectorData& folderCmp, CompareFct compare); - //enhanced binary search template: returns an iterator template ForwardIterator custom_binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp = std::less()); @@ -135,22 +134,41 @@ wxString getCodeLocation(const wxString file, const int line); //---------------Inline Implementation--------------------------------------------------- -template +template inline -std::string globalFunctions::numberToString(const T& number) //convert number to string the C++ way +std::basic_string globalFunctions::numberToString(const T& number) //convert number to string the C++ way { - std::ostringstream ss; + std::basic_ostringstream ss; ss << number; return ss.str(); } -template +template inline -void globalFunctions::stringToNumber(const std::string& input, T& number) //convert number to string the C++ way +T globalFunctions::stringToNumber(const std::basic_string& input) //convert number to string the C++ way { - std::istringstream ss(input); + std::basic_istringstream ss(input); + T number; ss >> number; + return number; +} + + +template +inline +wxString globalFunctions::numberToString(const T& number) +{ + return numberToString(number).c_str(); +} + + +template +inline +T globalFunctions::stringToNumber(const wxString& input) +{ + const std::basic_string inputConv = input.c_str(); + return stringToNumber(inputConv); } @@ -187,26 +205,6 @@ void globalFunctions::removeRowsFromVector(const std::set& rowsToRemove, } -//bubble sort using swap() instead of assignment: useful if assignment is very expensive -template -void globalFunctions::bubbleSwapSort(VectorData& folderCmp, CompareFct compare) -{ - for (int i = folderCmp.size() - 2; i >= 0; --i) - { - bool swapped = false; - for (int j = 0; j <= i; ++j) - if (compare(folderCmp[j + 1], folderCmp[j])) - { - folderCmp[j + 1].swap(folderCmp[j]); - swapped = true; - } - - if (!swapped) - return; - } -} - - //enhanced binary search template: returns an iterator template inline diff --git a/shared/guid.cpp b/shared/guid.cpp index 785ab200..7a2ec68f 100644 --- a/shared/guid.cpp +++ b/shared/guid.cpp @@ -5,116 +5,56 @@ // ************************************************************************** // #include "guid.h" -#include - -#ifdef FFS_WIN -#include "Objbase.h" - -#elif defined FFS_LINUX -#include "ossp_uuid/uuid++.hh" -#endif +#include +#include +#include +#include +#include using namespace Utility; - - -#ifdef FFS_WIN + + struct UniqueId::IntData -{ - GUID nativeRep; +{ + boost::uuids::uuid nativeRep; }; -#elif defined FFS_LINUX -struct UniqueId::IntData -{ - uuid nativeRep; //ossp uuid -}; -#endif - + -UniqueId::UniqueId() : - pData(new IntData) +UniqueId::UniqueId() : pData(new IntData) { -#ifdef FFS_WIN - if (FAILED(::CoCreateGuid(&pData->nativeRep))) - throw std::runtime_error("Error creating UUID!"); -#elif defined FFS_LINUX - pData->nativeRep.make(UUID_MAKE_V1); -#endif + pData->nativeRep = boost::uuids::random_generator()(); } bool UniqueId::operator==(const UniqueId rhs) const { -#ifdef FFS_WIN - //return ::IsEqualGUID(pData->nativeRep, rhs.pData->nativeRep); -> harmonize with operator< - - const GUID& guidL = pData->nativeRep; - const GUID& guidR = rhs.pData->nativeRep; - - return guidL.Data1 == guidR.Data1 && - guidL.Data2 == guidR.Data2 && - guidL.Data3 == guidR.Data3 && - ::memcmp(guidL.Data4, guidR.Data4, sizeof(guidR.Data4)) == 0; -#elif defined FFS_LINUX return pData->nativeRep == rhs.pData->nativeRep; -#endif } bool UniqueId::operator<(const UniqueId rhs) const { -#ifdef FFS_WIN - const GUID& guidL = pData->nativeRep; - const GUID& guidR = rhs.pData->nativeRep; - - if (guidL.Data1 != guidR.Data1) - return guidL.Data1 < guidR.Data1; - if (guidL.Data2 != guidR.Data2) - return guidL.Data2 < guidR.Data2; - if (guidL.Data3 != guidR.Data3) - return guidL.Data3 < guidR.Data3; - - return ::memcmp(guidL.Data4, guidR.Data4, sizeof(guidR.Data4)) < 0; -#elif defined FFS_LINUX return pData->nativeRep < rhs.pData->nativeRep; -#endif -} +} UniqueId::UniqueId(wxInputStream& stream) : //read pData(new IntData) { -#ifdef FFS_WIN - stream.Read(&pData->nativeRep, sizeof(GUID)); -#elif defined FFS_LINUX - char buffer[UUID_LEN_BIN] = {0}; - stream.Read(buffer, sizeof(buffer)); + std::vector rawData(boost::uuids::uuid::static_size()); + stream.Read(&rawData[0], rawData.size()); - pData->nativeRep.import(static_cast(buffer)); //warning: import is overloaded with void*/char*! -#endif + std::copy(rawData.begin(), rawData.end(), pData->nativeRep.begin()); } -#ifdef FFS_LINUX -struct MallocDeleter -{ - void operator() (void* ptr) - { - free(ptr); - } -}; -#endif - - void UniqueId::toStream(wxOutputStream& stream) const //write { -#ifdef FFS_WIN - stream.Write(&pData->nativeRep, sizeof(GUID)); -#elif defined FFS_LINUX - boost::shared_ptr buffer(pData->nativeRep.binary(), //caller has to "free" memory (of size UUID_LEN_BIN) - MallocDeleter()); + std::vector rawData; + std::copy(pData->nativeRep.begin(), pData->nativeRep.end(), std::back_inserter(rawData)); - stream.Write(buffer.get(), UUID_LEN_BIN); -#endif -} + assert(boost::uuids::uuid::static_size() == rawData.size()); + stream.Write(&rawData[0], rawData.size()); +} diff --git a/shared/localization.cpp b/shared/localization.cpp index 843e0484..1ff7f6bd 100644 --- a/shared/localization.cpp +++ b/shared/localization.cpp @@ -46,6 +46,18 @@ const std::vector& LocalizationInfo::getMapping() } +namespace +{ +struct CompareByName +{ + bool operator()(const FreeFileSync::LocInfoLine& lhs, const FreeFileSync::LocInfoLine& rhs) const + { + return lhs.languageName < rhs.languageName; + } +}; +} + + LocalizationInfo::LocalizationInfo() { FreeFileSync::LocInfoLine newEntry; @@ -176,6 +188,20 @@ LocalizationInfo::LocalizationInfo() newEntry.languageFlag = wxT("turkey.png"); locMapping.push_back(newEntry); +// newEntry.languageID = wxLANGUAGE_HEBREW; +// newEntry.languageName = wxT("עִבְרִית"); +// newEntry.languageFile = wxT("hebrew.lng"); +// newEntry.translatorName = wxT("Moshe Olshevsky"); +// newEntry.languageFlag = wxT("isreal.png"); +// locMapping.push_back(newEntry); + +// newEntry.languageID = wxLANGUAGE_ARABIC; +// newEntry.languageName = wxT("العربية"); +// newEntry.languageFile = wxT("arabic.lng"); +// newEntry.translatorName = wxT("Yousef Shamshoum"); +// newEntry.languageFlag = wxT("arabic-language.png"); +// locMapping.push_back(newEntry); + newEntry.languageID = wxLANGUAGE_JAPANESE; newEntry.languageName = wxT("日本語"); newEntry.languageFile = wxT("japanese.lng"); @@ -183,6 +209,13 @@ LocalizationInfo::LocalizationInfo() newEntry.languageFlag = wxT("japan.png"); locMapping.push_back(newEntry); + newEntry.languageID = wxLANGUAGE_CHINESE_TRADITIONAL; + newEntry.languageName = wxT("正體中文"); + newEntry.languageFile = wxT("chinese_traditional.lng"); + newEntry.translatorName = wxT("Carlos"); + newEntry.languageFlag = wxT("taiwan.png"); + locMapping.push_back(newEntry); + newEntry.languageID = wxLANGUAGE_CHINESE_SIMPLIFIED; newEntry.languageName = wxT("简体中文"); newEntry.languageFile = wxT("chinese_simple.lng"); @@ -190,12 +223,7 @@ LocalizationInfo::LocalizationInfo() newEntry.languageFlag = wxT("china.png"); locMapping.push_back(newEntry); - newEntry.languageID = wxLANGUAGE_CHINESE_TRADITIONAL; - newEntry.languageName = wxT("正體中文"); - newEntry.languageFile = wxT("chinese_traditional.lng"); - newEntry.translatorName = wxT("Carlos"); - newEntry.languageFlag = wxT("taiwan.png"); - locMapping.push_back(newEntry); + //std::sort(locMapping.begin(), locMapping.end(), CompareByName()); } @@ -278,7 +306,7 @@ int mapLanguageDialect(const int language) //case wxLANGUAGE_PORTUGUESE: //case wxLANGUAGE_PORTUGUESE_BRAZILIAN: - //variants of wxLANGUAGE_ARABIC -> needed to detect RTL languages + //variants of wxLANGUAGE_ARABIC (also needed to detect RTL languages) case wxLANGUAGE_ARABIC_ALGERIA: case wxLANGUAGE_ARABIC_BAHRAIN: case wxLANGUAGE_ARABIC_EGYPT: @@ -335,16 +363,16 @@ CustomLocale::CustomLocale() : translationDB(new Translation), currentLanguage(wxLANGUAGE_ENGLISH) { - //avoid RTL mirroring (for now) by mapping Hebrew and Arabic to English - const int mappedSystemLang = mapLanguageDialect(wxLocale::GetSystemLanguage()); - const bool isRTLLanguage = mappedSystemLang == wxLANGUAGE_HEBREW || - mappedSystemLang == wxLANGUAGE_ARABIC; - Init(isRTLLanguage ? wxLANGUAGE_ENGLISH : wxLANGUAGE_DEFAULT); //setting a different language needn't be supported on all systems! + Init(wxLANGUAGE_DEFAULT); //setting a different language needn't be supported on all systems! //actually these two parameters are language dependent, but we take system setting to handle all kinds of language derivations const lconv* localInfo = localeconv(); THOUSANDS_SEPARATOR = wxString::FromUTF8(localInfo->thousands_sep); DECIMAL_POINT = wxString::FromUTF8(localInfo->decimal_point); + + // why not working? + // THOUSANDS_SEPARATOR = std::use_facet >(std::locale("")).thousands_sep(); + // DECIMAL_POINT = std::use_facet >(std::locale("")).decimal_point(); } @@ -503,9 +531,6 @@ void CustomLocale::setLanguage(const int language) } else ; //if languageFile is empty texts will be english per default - - //static const wxString dummy1 = std::use_facet >(std::locale("")).decimal_point(); - //static const wxString dummy2 = std::use_facet >(std::locale("")).thousands_sep(); } diff --git a/shared/lock.cpp b/shared/lock.cpp new file mode 100644 index 00000000..e8e027c2 --- /dev/null +++ b/shared/lock.cpp @@ -0,0 +1,22 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2010 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#include "lock.h" +#include "fileHandling.h" +// +// +//Utility::LockDirectory::LockDirectory(const Zstring& dirname) +//{ +// +//} +// +// +//Utility::LockDirectory::~LockDirectory() +//{ +//} +// +// +//bool Utility::LockDirectoryisLocked(const Zstring& dirname); diff --git a/shared/lock.h b/shared/lock.h new file mode 100644 index 00000000..f416f994 --- /dev/null +++ b/shared/lock.h @@ -0,0 +1,26 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2010 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef LOCK_H_INCLUDED +#define LOCK_H_INCLUDED + +#include "zstring.h" +#include + +//namespace Utility +//{ +//class LockDirectory +//{ +//public: +// LockDirectory(const Zstring& dirname); +// ~LockDirectory(); +// +//private: +// std::vector toBeReleased; //list of files that will be deleted +//}; +//} + +#endif //LOCK_H_INCLUDED diff --git a/shared/ossp_uuid/.libs/libuuid++.a b/shared/ossp_uuid/.libs/libuuid++.a deleted file mode 100644 index 754820e7..00000000 Binary files a/shared/ossp_uuid/.libs/libuuid++.a and /dev/null differ diff --git a/shared/ossp_uuid/.libs/libuuid++.la b/shared/ossp_uuid/.libs/libuuid++.la deleted file mode 100644 index d48c6189..00000000 --- a/shared/ossp_uuid/.libs/libuuid++.la +++ /dev/null @@ -1,41 +0,0 @@ -# libuuid++.la - a libtool library file -# Generated by ltmain.sh (GNU libtool) 2.2.4 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libuuid++.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs='' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libuuid++. -current=16 -age=0 -revision=22 - -# Is this an already installed library? -installed=no - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/lib' diff --git a/shared/ossp_uuid/.libs/libuuid++.lai b/shared/ossp_uuid/.libs/libuuid++.lai deleted file mode 100644 index aeac1af1..00000000 --- a/shared/ossp_uuid/.libs/libuuid++.lai +++ /dev/null @@ -1,41 +0,0 @@ -# libuuid++.la - a libtool library file -# Generated by ltmain.sh (GNU libtool) 2.2.4 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libuuid++.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs='' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libuuid++. -current=16 -age=0 -revision=22 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/lib' diff --git a/shared/ossp_uuid/.libs/libuuid.a b/shared/ossp_uuid/.libs/libuuid.a deleted file mode 100644 index b1357ab1..00000000 Binary files a/shared/ossp_uuid/.libs/libuuid.a and /dev/null differ diff --git a/shared/ossp_uuid/.libs/libuuid.la b/shared/ossp_uuid/.libs/libuuid.la deleted file mode 100644 index 8cd05ef9..00000000 --- a/shared/ossp_uuid/.libs/libuuid.la +++ /dev/null @@ -1,41 +0,0 @@ -# libuuid.la - a libtool library file -# Generated by ltmain.sh (GNU libtool) 2.2.4 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libuuid.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs='' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libuuid. -current=16 -age=0 -revision=22 - -# Is this an already installed library? -installed=no - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/lib' diff --git a/shared/ossp_uuid/.libs/libuuid.lai b/shared/ossp_uuid/.libs/libuuid.lai deleted file mode 100644 index 86bc99bd..00000000 --- a/shared/ossp_uuid/.libs/libuuid.lai +++ /dev/null @@ -1,41 +0,0 @@ -# libuuid.la - a libtool library file -# Generated by ltmain.sh (GNU libtool) 2.2.4 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libuuid.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs='' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libuuid. -current=16 -age=0 -revision=22 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/lib' diff --git a/shared/ossp_uuid/AUTHORS b/shared/ossp_uuid/AUTHORS deleted file mode 100644 index 9f9d65e7..00000000 --- a/shared/ossp_uuid/AUTHORS +++ /dev/null @@ -1,15 +0,0 @@ - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - - AUTHORS - - This is a list of authors who have written - or edited major parts of the OSSP uuid sources. - - Ralf S. Engelschall - diff --git a/shared/ossp_uuid/BINDINGS b/shared/ossp_uuid/BINDINGS deleted file mode 100644 index 7342f810..00000000 --- a/shared/ossp_uuid/BINDINGS +++ /dev/null @@ -1,35 +0,0 @@ - - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - - LANGUAGE BINDINGS - - Various programming language bindings exist for OSSP uuid. - The following is the list of known bindings: - - o C - (native API) - - o C++ - (addon API; part of the OSSP uuid distribution; see uuid++.* files) - - o Perl - (addon API; part of the OSSP uuid distribution; see perl/ directory) - - o PHP - (addon API; part of the OSSP uuid distribution; see php/ directory) - - o PostgreSQL - (addon API; part of the OSSP uuid distribution; see pgsql/ directory) - - o GNU Guile GEE (Scheme) - https://gna.org/projects/gee - - o Chicken (Scheme) - http://www.call-with-current-continuation.org/eggs/uuid-ossp.html - diff --git a/shared/ossp_uuid/ChangeLog b/shared/ossp_uuid/ChangeLog deleted file mode 100644 index eadc313d..00000000 --- a/shared/ossp_uuid/ChangeLog +++ /dev/null @@ -1,624 +0,0 @@ - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - - CHANGELOG - - This is a list of all changes to OSSP uuid. - For a more brief summary please have a look at the NEWS file. - - Changes between 1.6.1 and 1.6.2 (21-Feb-2008 to 04-Jul-2008) - - o Adjust "devtool.func" for latest GNU Libtool compatibility. - [Ralf S. Engelschall] - - o Improve PRNG under Win32. - [Hiroshi Saito] - - o Consistently annotate "RFC-XXXX" with "IETF" to clearly - indicate from which standards body this comes from. - [Ralf S. Engelschall] - - o Resolve namespace conflicts of recently introduced time_xxx() - functions by using a propoer "uuid_" prefix. - [Ralf S. Engelschall] - - o Remove unused "struct timezone" from time_gettimeofday() in - order to simplify portability. - [Ralf S. Engelschall] - - o Add support for POSIX clock_gettime(3) in case the Unix/POSIX - gettimeofday(3) is not available. - [Ralf S. Engelschall] - - o Upgrade build environment to GNU autoconf 2.62. - [Ralf S. Engelschall] - - o Upgrade build environment to GNU libtool 2.2.4. - [Ralf S. Engelschall] - - Changes between 1.6.0 and 1.6.1 (19-May-2007 to 21-Feb-2008) - - o Port to Win32 API. - [Hiroshi Saito, Wu Yongwei, Ralf S. Engelschall] - - o Adjust copyright messages for new year 2008. - [Ralf S. Engelschall] - - o Fix __VA_COPY_USE_{CSP,CPP} fallback macros for va_copy. - [Mark A. Lindner ] - - o PostgreSQL bindings: use SET_VARSIZE() instead - of assigning to bytea->v_len under PostgreSQL >= 8.3 - [Ralf S. Engelschall] - - o Upgrade build environment to GNU libtool 1.5.26 - [Ralf S. Engelschall] - - Changes between 1.5.1 and 1.6.0 (31-Jul-2006 to 19-May-2007) - - o Expand unused "datarootdir" in Makefile.in and uuid-config.in to - make newer GNU autoconf versions happy. - [Ralf S. Engelschall] - - o Upgrade build environment to GNU shtool 2.0.7 - [Ralf S. Engelschall] - - o Make GNU autoconf procedure of PHP binding more robust by using - -Wl,-Bsymbolic only on platforms where uuid_create(3) actually - exists and where -Wl,-Bsymbolic is really accepted by the tool - chain. This especially unbreaks MacOS X. - [Ralf S. Engelschall] - - o Fix "uuid_export" function in PHP bindings under - UUID_FMT_SIV, UUID_FMT_STR and UUID_FMT_TXT where the - NUL-termination character should be not passed back to PHP. - [Neil Caunt , Ralf S. Engelschall] - - o Adjust copyright messages for new year 2007. - [Ralf S. Engelschall] - - o Upgrade build environment to GNU autoconf 2.61 - [Ralf S. Engelschall] - - o Disable PostgreSQL "(CSTRING AS uuid)" and "(uuid AS CSTRING)" - CASTS as PostgreSQL 8.2 and higher explicitly disallow this. - [David Wheeler , Ralf S. Engelschall] - - o Fix PostgreSQL bindings by mapping the correct DSO symbol - to the functions "uuid_send" and "uuid_recv". - [Ralf S. Engelschall] - - o Silence PostgreSQL processing messages - [David Wheeler ] - - o Support MacOS X (aka Darwin) in PostgreSQL bindings by passing - a "-bundle_loader" option to the linker in order to resolve the - "undefined symbols" problem. - [David Wheeler , Ralf S. Engelschall] - - o Pass the correct type to PostgreSQL's errmsg(). - [David Wheeler , Ralf S. Engelschall] - - o Added PostgreSQL 8.2 PG_MODULE_MAGIC support. - [David Wheeler ] - - o Fix the Data::UUID::to_b64string() function of the Perl backward - compatibility API: an empty string was not supplied as the EOL - marker to MIME::Base64::encode_base64() and hence the returned - string ended with a newline character (which in turn breaks many - applications using Data::UUID). - [Piotr Roszatycki ] - - o Change type of "data_ptr" argument in uuid_export() API signature - from "void **" to "void *" as there is unfortunately no - "generic pointer to pointer type" in ISO C (see also - http://c-faq.com/ptrs/genericpp.html) and "void **" is just a - "pointer to a 'void *'". - - The "void **" especially had the nasty side-effect that it breaks - strict pointer aliasing rules of ISO C and hence would require - fiddling with temporary variables on all uuid_export() calls if - one would be 100% correct and avoid aliasing related compiler - warnings. Instead, as uuid_export() internally has to cast the - "data_ptr" to the particular expected type anyway, it is better - to have "data_ptr" just be a really generic "void *" in the API - signature. - - Keep in mind that although this is an API change, it doesn't cause - any incompatibilities as the function still expects the same - "pointer to a pointer of a particular type". This expected pointer - is just now passed the more correct although less intuitive way. - [Hrvoje Niksic , Ralf S. Engelschall] - - o Optional DMALLOC based memory debugging support. - [Ralf S. Engelschall] - - o Consistently include "uuid_ac.h" in all source files to have GNU - autoconf results and standard system defines available everywhere. - [Ralf S. Engelschall] - - Changes between 1.5.0 and 1.5.1 (28-Jul-2006 to 31-Jul-2006) - - o Use "MODULE_PATHNAME" instead of "@MODULE_PATHNAME@" in - uuid.sql.in to be more aligned to the PostgreSQL styles. - [Simon "janus" Dassow ] - - o Use the available variables $(LIB_NAME), $(DCE_NAME) and - $(CXX_NAME) more consistently in Makefile.in to allow packagers to - override the library name with less patching. - [Piotr Roszatycki ] - - o Fix the "make distclean" target of php/Makefile.local - to make sure the ".deps" file is not left over. - [Ralf S. Engelschall] - - o Fix the tarball rolling procedure to make sure we - do not distribute binary files again. This now especially uses - a MANIFEST file which explicitly lists all files which form the - distribution tarball. We compare the tarball and the MANIFEST file - for differences in the "devtool dist" now. - [Ralf S. Engelschall] - - Changes between 1.4.2 and 1.5.0 (13-Mar-2006 to 28-Jul-2006) - - o Fixed potential memory leak in uuid_create() as spotted by SPLINT. - [Ralf S. Engelschall] - - o Cleanup source code according to complains by SPLINT. - [Ralf S. Engelschall] - - o Cleanup internal uuid_mac.h header. - [Ralf S. Engelschall] - - o Numerous fixed to the error handling in the PostgreSQL bindings. - [Neil Conway ] - - o Add Hash indexing support UUID data type of PostgreSQL bindings. - [Ralf S. Engelschall] - - o Add comparison operators and B-Tree indexing support UUID data - type of PostgreSQL bindings. - [Roman Neuhauser ] - - o Fix PHP bindings: the wrong argument to uuid_create() - was forced to a reference - [Roman Neuhauser ] - - o Add full support for Single Integer Value (SIV) UUID representation - for both importing and exporting in C/C++/Perl/PHP APIs. - [Ralf S. Engelschall] - - o Upgrade build environment to GNU shtool 2.0.6 and GNU autoconf 2.60 - [Ralf S. Engelschall] - - o Added an "OVERVIEW" file which tries to give the "big picture" - about UUIDs and allows to survice during the nasty UUID bit fiddling. - [Ralf S. Engelschall] - - o Replaced "clock_seq_and_reserved" with - "clock_seq_high_and_reserved" in uuid.pod to already reflect the - description in the forthcoming RFC. - [Ralf S. Engelschall] - - o Speed up processing in uuid_str.c by reducing va_copy() calls from - two to just one per formatting. - [Ralf S. Engelschall] - - Changes between 1.4.1 and 1.4.2 (07-Feb-2006 to 13-Mar-2006) - - o Fix uuid_export() function by fixing the internal - uuid_s[ar]printf() functions which require the backup of va_list - arguments between subsequent processing. - [Ralf S. Engelschall, Thomas Lotterer ] - - o Fix Perl API's "export" function by not taking over NUL-termination - character under UUID_FMT_TXT. - [Thomas Lotterer ] - - o Declare "install", "uninstall" and "clean" make(1) targets - ".PHONY". This especially workarounds problems on case insensitive - filesystems (like MacOS X' filesystem) where the "INSTALL" document - conflicts with the "install" target. - [Ralf S. Engelschall, David Wheeler ] - - Changes between 1.4.0 and 1.4.1 (15-Jan-2006 to 07-Feb-2006) - - o Upgrade to GNU shtool 2.0.5 - [Ralf S. Engelschall] - - o Apply workaround to uuid.h to avoid conflicts with - vendor UUID implementations where uuid_t (Darwin/MacOSX) - or uuid_create/uuid_compare (POSIX) might exist. - [Ralf S. Engelschall] - - Changes between 1.3.2 and 1.4.0 (06-Dec-2005 to 15-Jan-2006) - - o Created a top-level Perl ExtUtils::MakeMaker wrapper script - [Ralf S. Engelschall] - - o Adjust copyright messages for new year 2006. - [Ralf S. Engelschall] - - o Added experimental PostgreSQL bindings. - [Ralf S. Engelschall] - - o Fixed documentation of uuid_make() function. - [Ralf S. Engelschall] - - o Upgrade build environment to GNU libtool 1.5.22 - [Ralf S. Engelschall] - - Changes between 1.3.1 and 1.3.2 (24-Sep-2005 to 06-Dec-2005) - - o Cleaned up and speed optimized perl/uuid_compat.pm - (the Data::UUID compatibility module for Perl) - [David Wheeler ] - - o Upgrade to GNU shtool 2.0.3 - [Ralf S. Engelschall] - - o Consistently use "return" in uuid++.cc - [Ralf S. Engelschall] - - Changes between 1.3.0 and 1.3.1 (02-Sep-2005 to 24-Sep-2005) - - o Fix two incorrect casts, detected by compiling the C code - under C++ constraints. - [Ralf S. Engelschall] - - o Remove a compiler warning in the PHP bindings. - [Ralf S. Engelschall] - - o Plug memory leak in PRNG sub-library. - [Ralf S. Engelschall] - - o Add VPATH/srcdir support for at the default - build procedure plus at least C++ and DCE build options. - [Ralf S. Engelschall] - - Changes between 1.2.1 and 1.3.0 (30-Aug-2005 to 02-Sep-2005) - - o Add an experimental PHP 4/5 language API binding which - can be enabled under build-time with opption --with-php. - [Ralf S. Engelschall] - - o Upgrade to GNU libtool 1.5.20 - [Ralf S. Engelschall] - - o Add missing "const" in manual page. - [Ralf S. Engelschall] - - o Add an experimental C++ API binding which can be - enabled under build-time with option --with-cxx. - [Ralf S. Engelschall] - - o Cleanup the internals of the uuid_create() function and - add a new corresponding uuid_clone() API function. - [Ralf S. Engelschall] - - o Cleanup some Makefile parts. - [Ralf S. Engelschall] - - o Added a pkg-config(1) specification uuid.pc which is also - installed by default in addition to the old-style uuid-config tool. - [Ralf S. Engelschall] - - o Added optional Data::UUID backward compatibility Perl API which can - be enabled with the build-time option --with-perl-compat. - [Piotr Roszatycki , Ralf S. Engelschall] - - o Add a functionality-reduced TIE-style Perl API OSSP::uuid::tie, - intended for very high-level convenience programming. - [Ralf S. Engelschall] - - o Reference the new officially published RFC 4122. - [Ralf S. Engelschall] - - Changes between 1.2.0 and 1.2.1 (23-Jan-2005 to 30-Aug-2005) - - o Add SEEALSO document which references all known - UUID implementations. - [Ralf S. Engelschall] - - o Improve the PRNG in case no stronger system PRNG device is - available by passing time and rand(3) based entropy into the MD5 - one-way hash function to achieve at least some sort of weaker PRN data. - [Ralf S. Engelschall] - - o Fix MAC address determination under Solaris by using the result of - ioctl(...,SIOCGARP,...) only if arp_flags had ATF_COM set. - [Ralf S. Engelschall] - - o Upgrade to GNU libtool 1.5.18 and GNU shtool 2.0.2. - [Ralf S. Engelschall] - - o Cleanup the source code even more by following a large - set of FlexeLint's suggestions. - [Ralf S. Engelschall] - - o Fixed generated "section" number in uuid-config(1). - [Piotr Roszatycki ] - - Changes between 1.1.2 and 1.2.0 (13-Jan-2005 to 23-Jan-2005) - - o Added support for new version 5 UUIDs (name-based, SHA-1) - according to latest draft-mealling-uuid-urn-05.txt. - [Ralf S. Engelschall] - - o Reference new ISO/IEC 9834-8:2004 / ITU-T Rec. X.667 2004 standard - and latest IETF draft-mealling-uuid-urn-05.txt. - [Ralf S. Engelschall] - - Changes between 1.1.1 and 1.1.2 (18-Nov-2004 to 13-Jan-2005) - - o Fix generation of v3 UUIDs by adding support for 64-bit platforms - to the underlying uuid_md5.c code (which internally is based on - the RFC reference code which in turn assumes a 32-bit environment). - [Ralf S. Engelschall, Piotr Roszatycki ] - - o Optimize internal md5_store() function by directly finalizing MD5 - calculation on buffer copy instead of finalizing original buffer - and having to restore it from the buffer copy. - [Ralf S. Engelschall] - - o Adjust copyright messages for new year 2005. - [Ralf S. Engelschall] - - o Do not rebuild the Perl API if there were no actual changes. - [Ralf S. Engelschall] - - Changes between 1.1.0 and 1.1.1 (03-Nov-2004 to 18-Nov-2004) - - o Apply the FreeBSD libc uuid_create() related workaround - in the Perl bindings also under FreeBSD 6.0-CURRENT. - [Ralf S. Engelschall] - - o Fix --with-perl configure option processing: Perl is - only required if --with-perl is used although we search for Perl - always in order to provide the PERL variable substitution. - [Ralf S. Engelschall] - - Changes between 1.0.4 and 1.1.0 (16-Oct-2004 to 03-Nov-2004) - - o Add --with-perl configure option for optionally enabling - the Perl language bindings. - [Ralf S. Engelschall] - - o Add Perl language bindings providing both a C-style and OO-style API. - [Ralf S. Engelschall] - - Changes between 1.0.3 and 1.0.4 (15-Oct-2004 to 16-Oct-2004) - - o Fix version detection from uuid_vers.h - [Ralf S. Engelschall] - - Changes between 1.0.2 and 1.0.3 (12-Sep-2004 to 15-Oct-2004) - - o Support configuring/building/installing from an arbitrary - directory via srcdir/top_srcdir/VPATH. - [David Lee , Ralf S. Engelschall] - - o Upgrade build environment to GNU libtool 1.5.10. - [Ralf S. Engelschall] - - Changes between 1.0.1 and 1.0.2 (16-Jul-2004 to 12-Sep-2004) - - o Upgrade build environment to GNU libtool 1.5.8 and GNU shtool 2.0.1 - [Ralf S. Engelschall] - - Changes between 1.0.0 and 1.0.1 (16-Feb-2004 to 16-Jul-2004) - - o Made documentation of uuid_export() more clear. - [Ralf S. Engelschall] - - o Upgrade build environment to GNU libtool 1.5.6 and GNU shtool 2.0.0 - [Ralf S. Engelschall] - - o Remove some warnings occurring under GCC 3.5 - [Ralf S. Engelschall] - - Changes between 0.9.7 and 1.0.0 (13-Feb-2004 to 16-Feb-2004) - - o Replace remaining (old) UUID_VERSIONX names with UUID_MAKE_VX - in the documentation (uuid.pod). - [Ralf S. Engelschall] - - o Resolve namespace conflicts with GCC 3.4 internal pow10() and round() - functions within uuid_str.c. - [Ralf S. Engelschall] - - o Fix buffer handling in "uuid_export(..., UUID_FMT_TXT, vp, ...)" in - case "vp" is not NULL. - [Fuyuki ] - - Changes between 0.9.6 and 0.9.7 (11-Feb-2004 to 13-Feb-2004) - - o remove --with-rfc2518 option and functionality because - even the IETF/IESG has finally approved our report about the broken - random multicast MAC address generation in the standard (and - will fix it in new versions of the draft-mealling-uuid-urn). So, - finally get rid of this broken-by-design backward compatibility - functionality. - [Ralf S. Engelschall] - - o Add support to uuid(1) CLI for decoding from stdin for - both binary and string representations. - [Ralf S. Engelschall] - - o Add missing documentation entries for UUID_XXXX API constants and - uuid_version() function. - [Fuyuki ] - - o Adjust references for new draft-mealling-uuid-urn-02.txt. - [Fuyuki ] - - o Replaced overlooked references to old - uuid_{unpack,pack,parse,format,dump}() functions with their - current uuid_{import,export}() replacements. - [Fuyuki ] - - o Fixed "uuid -h" command. - [Fuyuki ] - - Changes between 0.9.5 and 0.9.6 (06-Feb-2004 to 11-Feb-2004) - - o Added an experimental additional DCE 1.1 API for backward - compatibility with existing applications. - [Ralf S. Engelschall] - - Changes between 0.9.4 and 0.9.5 (19-Jan-2004 to 06-Feb-2004) - - o Fixed filedescriptor leak in the PRNG sub-API. - [Guerry Semones ] - - o Upgraded build environment to GNU libtool 1.5.2. - [Ralf S. Engelschall] - - Changes between 0.9.3 and 0.9.4 (16-Jan-2004 to 19-Jan-2004) - - o Include in uuid.h because of size_t usage. - [Ralf S. Engelschall] - - o INCOMPATIBILITY: Refactor the API and rename uuid_generate() - to uuid_make() and use a "uuid_t" pointer for the namespace - on UUID_VERSION3 generation. To allow access to the internal - pre-defined namespace UUIDs, provide a new uuid_load() function. - Because uuid_load() now also allows the loading of the "nil" UUID, - remove uuid_nil() from the API. After this second refactoring the - API is now the one we originally wished for the forthcoming version - 1.0 of OSSP uuid. - [Ralf S. Engelschall] - - o INCOMPATIBILITY: rename UUID_VERSIONx to UUID_MAKE_Vx and - UUID_MCASTRND to UUID_MAKE_MC to be more consistent throughout API. - [Ralf S. Engelschall] - - o Add version support to API via UUID_VERSION (compile-time) - and uuid_version() (link-time). - [Ralf S. Engelschall] - - o INCOMPATIBILITY: Refactor the API by merging - uuid_{unpack,pack,parse,format,dump}() functions into unified - uuid_{import,export}() functions. This allows us to easily add - support for other formats (e.g. XML) in the future without having - the change the API in principle. - [Ralf S. Engelschall] - - o Document what DCE 1.1 UUID versions exist and what they are - intended for. - [Ralf S. Engelschall] - - o Cleanup the C code to also pass warning-free a C++ compiler. - [Ralf S. Engelschall] - - o Support C++ by enclosing the C API declarations in - 'extern "C" {...}' within uuid.h. - [Guerry Semones ] - - o Improvide decoding in uuid_dump() by at least hex-dumping the - binary representation in case of v3, v4 and Nil UUIDs. Also, - annotate with better hints. - [Ralf S. Engelschall] - - o Recognize special "Nil UUID" on decoding in uuid_dump(). - [Ralf S. Engelschall] - - Changes between 0.9.2 and 0.9.3 (15-Jan-2004 to 16-Jan-2004) - - o Tested OSSP uuid on 16 particular Unix platforms and list - those in the new PORTING file. - [Ralf S. Engelschall] - - o Fixed minor formatting bug in call to str_rsprintf(). - [Ralf S. Engelschall] - - o Fix syntax error in uuid.ac. - [Ralf S. Engelschall] - - Changes between 0.9.1 and 0.9.2 (13-Jan-2004 to 15-Jan-2004) - - o Provide both incorrect RFC2518-based and correct IEEE 802 - multicast address generation. The default now is the correct - IEEE 802 multicast address generation but compile-time option - --with-rfc2518 selects the broken variant. - [Ralf S. Engelschall] - - o Decode also the IEEE 802 MAC address local/global bit. - [Ralf S. Engelschall] - - o Added missing documentation for uuid_dump(). - [Ralf S. Engelschall] - - o Fixed BM_POW2() macro implementation. - [Ralf S. Engelschall] - - o Use BM_XXX() and str_xxx() APIs throughout internal implementation. - [Ralf S. Engelschall] - - o Added missing manual page uuid-config(1). - [Ralf S. Engelschall] - - o Fixed output of "uuid-config --version" - [Ralf S. Engelschall] - - o Fixed typos in uuid.pod - [Ralf S. Engelschall] - - o Cleanup uuid.ac for unused elements. - [Ralf S. Engelschall] - - o Moved uuid_[u]int{8,16,32}_t auto-configuration into - own internal header uuid_ac.h. - [Ralf S. Engelschall] - - o Fixed portability by replacing accidentally introduced - uint{8,16,32}_t with the portable uuid_uint{8,16,32}_t. - [Guerry Semones ] - - o Prefix all variable symbols in uuid.h with underscores - to avoid namespace conflicts. - [Ralf S. Engelschall] - - o Add decoding examples to uuid(1) manual page. - [Ralf S. Engelschall] - - Changes between 0.9.0 and 0.9.1 (11-Jan-2004 to 13-Jan-2004) - - o Make "md5_init" and "mac_address" symbols namespace clean - by adding correct embedding support via "uuid_" prefix. - [Ralf S. Engelschall] - - o Implement uuid_dump() and corresponding uuid CLI "-d" - option for dumping a given UUID into clear text. For convenience - reasons add uuid_bm.h (bit mask API) and uuid_str (string - formatting API) sub-modules. - [Ralf S. Engelschall] - - o Add "-m" option to CLI for allowing to generate v1 UUIDs - with random multi-cast addresses (API UUID_MCASTRND option). - [Ralf S. Engelschall] - - o Disable the C++ and F77 checks in GNU libtool. - [Ralf S. Engelschall] - - o Print involved option character (instead of '?') on invalid - option for uuid(1) CLI. - [Matthias Andree ] - - o Fixed "make install" and "make uninstall": the uuid(1) CLI - has to be [un]installed through GNU libtool, too. - [Matthias Andree ] - - o Document in uuid(1) [uuid_cli.pod] that for version 3 - UUIDs additional arguments are required and what pre-defined - namespace ids are known. - [Ralf S. Engelschall, M.Daniel ] - - o cleaned up source tree documentation files. - [Ralf S. Engelschall] - diff --git a/shared/ossp_uuid/HISTORY b/shared/ossp_uuid/HISTORY deleted file mode 100644 index 74ab1d31..00000000 --- a/shared/ossp_uuid/HISTORY +++ /dev/null @@ -1,358 +0,0 @@ - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - - HISTORY - - During OSSP uuid we were totally puzzled by a subtle bug in the UUID - standards related to the generation of multi-cast MAC addresses. - This part of the history shows a very interesting technical bug, - the unusual way of having to fix a standard (which was multiple - times revised by different standard authorities, including the - IETF, the OpenGroup and ISO/IEC) afterwards plus the fixing of six - implementations into which the bug was inherited similarly. Below are - some snapshot of this part of history: the first implementation fix - (for FreeBSD) and the notification of the IETF standards authors. - - ___________________________________________________________________________ - - Date: Fri, 13 Feb 2004 16:09:31 +0100 - From: "Ralf S. Engelschall" - To: paulle@microsoft.com, michael@neonym.net, rsalz@datapower.com - Subject: [PATCH] draft-mealling-uuid-urn-02.txt - Message-ID: <20040213150931.GA7656@engelschall.com> - - During implementation of OSSP uuid (a flexible CLI and C API for - generation and partial decoding of version 1, 3 and 4 UUIDs, see - http://www.ossp.org/pkg/lib/uuid/ for details), I discovered a nasty bug - in the generation of random multicast MAC addresses. It is present in - all standards and drafts (both expired ones and current ones) and was - also inherited (until I fixed it by submitting patches to the authors - recently) by all six freely available UUID implementations (Apache APR, - FreeBSD uuidgen(2), Java JUG, Linux's libuuid from e2fsutil, Perl's - Data::UUID and WINE's UUID generator)). - - In case no real/physical IEEE 802 address is available, both the - expired "draft-leach-uuids-guids-01" (section "4. Node IDs when no IEEE - 802 network card is available"), RFC 2518 (section "6.4.1 Node Field - Generation Without the IEEE 802 Address") and now even your current - "draft-mealling-uuid-urn-02.txt" (section "4.5 Node IDs that do not - identify the host") recommend: - - "A better solution is to obtain a 47-bit cryptographic quality - random number, and use it as the low 47 bits of the node ID, with - the _most_ significant bit of the first octet of the node ID set to - one. This bit is the unicast/multicast bit, which will never be set - in IEEE 802 addresses obtained from network cards; hence, there can - never be a conflict between UUIDs generated by machines with and - without network cards." - - Unfortunately, this incorrectly explains how to implement this and even - the example implementation (draft-mealling-uuid-urn-02.txt, "Appendix - A. Appendix A - Sample Implementation") inherited this. Correct is - "the _least_ significant bit of the first octet of the node ID" as the - multicast bit in a memory and hexadecimal string representation of a - 48-bit IEEE 802 MAC address. - - This standards bug arised from a false interpretation, as the multicast - bit is actually the _most_ significant bit in IEEE 802.3 (Ethernet) - _transmission order_ of an IEEE 802 MAC address. But you forgot that the - bitwise order of an _octet_ from a MAC address _memory_ and hexadecimal - string representation is still always from left (MSB, bit 7) to right - (LSB, bit 0). And the standard deals with memory representations only, - so the transmission order of a MAC doesnt' matter here. - - As mentioned, OSSP uuid already implements this correctly. The FreeBSD - uuidgen(2) and Apache APR generators I've also fixed myself recently in - CVS. And for the remaining implementations I've submitted patches to the - authors and they all (except for WINE) responded that they took over the - patch. So the results of this long-standing bug we were able to fix -- - at least for the free software world ;-). What is now remaining is that - you finally also should fix this in your standard so the bug does not - spread any longer into other implementations. - - Here is the minimal required patch against your draft: - - --- draft-mealling-uuid-urn-02.txt.orig Mon Feb 2 21:50:35 2004 - +++ draft-mealling-uuid-urn-02.txt Fri Feb 13 15:41:49 2004 - @@ -751,7 +751,7 @@ - [6], and the cost was US$550. - - A better solution is to obtain a 47-bit cryptographic quality random - - number, and use it as the low 47 bits of the node ID, with the most - + number, and use it as the low 47 bits of the node ID, with the least - significant bit of the first octet of the node ID set to one. This - bit is the unicast/multicast bit, which will never be set in IEEE 802 - addresses obtained from network cards; hence, there can never be a - @@ -1369,7 +1369,7 @@ - } - else { - get_random_info(seed); - - seed[0] |= 0x80; - + seed[0] |= 0x01; - memcpy(&saved_node, seed, sizeof saved_node); - fp = fopen("nodeid", "wb"); - if (fp) { - - But I recommend you to perhaps also add one or two sentences which - explain what I explained above (the difference between memory and - transmission order), just to make sure people are not confused in the - other direction and then think there is a bug (in the then fixed and - correct) standard, because they know about the transmission order of MAC - addresses. - - Yours, - Ralf S. Engelschall - rse@engelschall.com - www.engelschall.com - - Date: Fri, 13 Feb 2004 11:05:51 -0500 - From: Rich Salz - To: rse@engelschall.com - Cc: paulle@microsoft.com, michael@neonym.net - Message-ID: <402CF5DF.4020601@datapower.com> - Subject: Re: [PATCH] draft-mealling-uuid-urn-02.txt - References: <20040213150931.GA7656@engelschall.com> - Content-Length: 431 - Lines: 11 - - Thanks for writing, Ralf. - - You're correct, and this has been noted by the IESG and will be fixed in - the next draft. It's unfortunate we made it this far with the bug. - - /r$ - -- - Rich Salz, Chief Security Architect - DataPower Technology http://www.datapower.com - XS40 XML Security Gateway http://www.datapower.com/products/xs40.html - XML Security Overview http://www.datapower.com/xmldev/xmlsecurity.html - - Date: Thu, 22 Jan 2004 05:34:11 -0800 (PST) - From: "Ralf S. Engelschall" - Message-Id: <200401221334.i0MDYB1K018137@repoman.freebsd.org> - To: src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org - Subject: cvs commit: src/sys/kern kern_uuid.c - X-FreeBSD-CVS-Branch: HEAD - X-Loop: FreeBSD.ORG - Content-Length: 1907 - Lines: 42 - - rse 2004/01/22 05:34:11 PST - - FreeBSD src repository - - Modified files: - sys/kern kern_uuid.c - Log: - Fix generation of random multicast MAC address. - - In case no real/physical IEEE 802 address is available, both the expired - "draft-leach-uuids-guids-01" (section "4. Node IDs when no IEEE 802 - network card is available") and RFC 2518 (section "6.4.1 Node Field - Generation Without the IEEE 802 Address") recommend (quoted from RFC - 2518): - - "The ideal solution is to obtain a 47 bit cryptographic quality random - number, and use it as the low 47 bits of the node ID, with the _most_ - significant bit of the first octet of the node ID set to 1. This bit - is the unicast/multicast bit, which will never be set in IEEE 802 - addresses obtained from network cards; hence, there can never be a - conflict between UUIDs generated by machines with and without network - cards." - - Unfortunately, this incorrectly explains how to implement this and - the FreeBSD UUID generator code inherited this generation bug from - the broken reference code in the standards draft. They should instead - specify the "_least_ significant bit of the first octet of the node ID" - as the multicast bit in a memory and hexadecimal string representation - of a 48-bit IEEE 802 MAC address. - - This standards bug arised from a false interpretation, as the multicast - bit is actually the _most_ significant bit in IEEE 802.3 (Ethernet) - _transmission order_ of an IEEE 802 MAC address. The standards authors - forgot that the bitwise order of an _octet_ from a MAC address _memory_ - and hexadecimal string representation is still always from left (MSB, - bit 7) to right (LSB, bit 0). - - Fortunately, this UUID generation bug could have occurred on systems - without any Ethernet NICs only. - - Revision Changes Path - 1.7 +1 -1 src/sys/kern/kern_uuid.c - - Date: Thu, 22 Jan 2004 15:20:22 -0800 - From: Marcel Moolenaar - To: "Ralf S. Engelschall" - Cc: src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org - Subject: Re: cvs commit: src/sys/kern kern_uuid.c - Message-ID: <20040122232022.GA77798@ns1.xcllnt.net> - References: <200401221334.i0MDYB1K018137@repoman.freebsd.org> - Content-Length: 380 - Lines: 14 - - On Thu, Jan 22, 2004 at 05:34:11AM -0800, Ralf S. Engelschall wrote: - > rse 2004/01/22 05:34:11 PST - > - > FreeBSD src repository - > - > Modified files: - > sys/kern kern_uuid.c - > Log: - > Fix generation of random multicast MAC address. - - An excellent catch and an outstanding commit log. Chapeau! - - -- - Marcel Moolenaar USPA: A-39004 marcel@xcllnt.net - - ___________________________________________________________________________ - - Index: ChangeLog - =================================================================== - RCS file: /e/ossp/cvs/ossp-pkg/uuid/ChangeLog,v - retrieving revision 1.42 - diff -u -d -r1.42 ChangeLog - --- ChangeLog 13 Feb 2004 16:17:07 -0000 1.42 - +++ ChangeLog 13 Feb 2004 21:01:07 -0000 - @@ -13,6 +13,14 @@ - - Changes between 0.9.6 and 0.9.7 (11-Feb-2004 to 13-Feb-2004) - - + o remove --with-rfc2518 option and functionality because - + even the IETF/IESG has finally approved our report about the broken - + random multicast MAC address generation in the standard (and - + will fix it in new versions of the draft-mealling-uuid-urn). So, - + finally get rid of this broken-by-design backward compatibility - + functionality. - + [Ralf S. Engelschall] - + - o Add support to uuid(1) CLI for decoding from stdin for - both binary and string representations. - [Ralf S. Engelschall] - Index: uuid.ac - =================================================================== - RCS file: /e/ossp/cvs/ossp-pkg/uuid/uuid.ac,v - retrieving revision 1.10 - diff -u -d -r1.10 uuid.ac - --- uuid.ac 11 Feb 2004 14:38:40 -0000 1.10 - +++ uuid.ac 13 Feb 2004 19:20:32 -0000 - @@ -71,12 +71,6 @@ - AC_CHECK_SIZEOF(unsigned long long, 8) - - dnl # options - - AC_ARG_WITH(rfc2518, - - AC_HELP_STRING([--with-rfc2518], [use incorrect generation of IEEE 802 multicast addresses according to RFC2518]), - - [ac_cv_with_rfc2518=$withval], [ac_cv_with_rfc2518=no]) - - if test ".$ac_cv_with_rfc2518" = ".yes"; then - - AC_DEFINE(WITH_RFC2518, 1, [whether to use incorrect generation of IEEE 802 multicast addresses according to RFC2518]) - - fi - AC_ARG_WITH(dce, - AC_HELP_STRING([--with-dce], [build DCE 1.1 backward compatibility API]), - [ac_cv_with_dce=$withval], [ac_cv_with_dce=no]) - Index: uuid.c - =================================================================== - RCS file: /e/ossp/cvs/ossp-pkg/uuid/uuid.c,v - retrieving revision 1.44 - diff -u -d -r1.44 uuid.c - --- uuid.c 19 Jan 2004 14:56:35 -0000 1.44 - +++ uuid.c 13 Feb 2004 19:22:01 -0000 - @@ -61,69 +61,9 @@ - Unix UTC base time is January 1, 1970) */ - #define UUID_TIMEOFFSET "01B21DD213814000" - - -/* IEEE 802 MAC address encoding/decoding bit fields - - - - ATTENTION: - - - - In case no real/physical IEEE 802 address is available, both - - "draft-leach-uuids-guids-01" (section "4. Node IDs when no IEEE 802 - - network card is available") and RFC 2518 (section "6.4.1 Node Field - - Generation Without the IEEE 802 Address") recommend (quoted from RFC - - 2518): - - - - "The ideal solution is to obtain a 47 bit cryptographic quality - - random number, and use it as the low 47 bits of the node ID, with - - the most significant bit of the first octet of the node ID set to - - 1. This bit is the unicast/multicast bit, which will never be set - - in IEEE 802 addresses obtained from network cards; hence, there can - - never be a conflict between UUIDs generated by machines with and - - without network cards." - - - - This passage clearly explains the intention to use IEEE 802 multicast - - addresses. Unfortunately, it incorrectly explains how to implement - - this! It should instead specify the "*LEAST* significant bit of the - - first octet of the node ID" as the multicast bit in a memory and - - hexadecimal string representation of a 48-bit IEEE 802 MAC address. - - - - Unfortunately, even the reference implementation included in the - - expired IETF "draft-leach-uuids-guids-01" incorrectly set the - - multicast bit with an OR bit operation and an incorrect mask of - - 0x80. Hence, several other UUID implementations found on the - - Internet have inherited this bug. - - - - Luckily, neither DCE 1.1 nor ISO/IEC 11578:1996 are affected by this - - problem. They disregard the topic of missing IEEE 802 addresses - - entirely, and thus avoid adopting this bug from the original draft - - and code ;-) - - - - It seems that this standards bug arises from a false interpretation, - - as the multicast bit is actually the *MOST* significant bit in IEEE - - 802.3 (Ethernet) _transmission order_ of an IEEE 802 MAC address. The - - authors were likely not aware that the bitwise order of an octet from - - a MAC address memory and hexadecimal string representation is still - - always from left (MSB, bit 7) to right (LSB, bit 0). - - - - For more information, see "Understanding Physical Addresses" in - - "Ethernet -- The Definitive Guide", p.43, and the section "ETHERNET - - MULTICAST ADDRESSES" in http://www.iana.org/assignments/ethernet-numbers. - - - - At OSSP, we do it the intended/correct way and generate a real - - IEEE 802 multicast address. Those wanting to encode broken IEEE - - 802 MAC addresses (as specified) can nevertheless use a brain dead - - compile-time option to switch off the correct behavior. When decoding - - we always use the correct behavior of course. */ - - - -/* encoding */ - -#ifdef WITH_RFC2518 - -#define IEEE_MAC_MCBIT_ENC BM_OCTET(1,0,0,0,0,0,0,0) - -#else - -#define IEEE_MAC_MCBIT_ENC BM_OCTET(0,0,0,0,0,0,0,1) - -#endif - -#define IEEE_MAC_LOBIT_ENC BM_OCTET(0,0,0,0,0,0,1,0) - - - -/* decoding */ - -#define IEEE_MAC_MCBIT_DEC BM_OCTET(0,0,0,0,0,0,0,1) - -#define IEEE_MAC_LOBIT_DEC BM_OCTET(0,0,0,0,0,0,1,0) - +/* IEEE 802 MAC address encoding/decoding bit fields */ - +#define IEEE_MAC_MCBIT BM_OCTET(0,0,0,0,0,0,0,1) - +#define IEEE_MAC_LOBIT BM_OCTET(0,0,0,0,0,0,1,0) - - /* IEEE 802 MAC address octet length */ - #define IEEE_MAC_OCTETS 6 - @@ -622,8 +562,8 @@ - (unsigned int)uuid->obj.node[3], - (unsigned int)uuid->obj.node[4], - (unsigned int)uuid->obj.node[5], - - (uuid->obj.node[0] & IEEE_MAC_LOBIT_DEC ? "local" : "global"), - - (uuid->obj.node[0] & IEEE_MAC_MCBIT_DEC ? "multicast" : "unicast")); - + (uuid->obj.node[0] & IEEE_MAC_LOBIT ? "local" : "global"), - + (uuid->obj.node[0] & IEEE_MAC_MCBIT ? "multicast" : "unicast")); - } - else { - /* decode anything else as hexadecimal byte-string only */ - @@ -843,8 +783,8 @@ - if ((mode & UUID_MAKE_MC) || (uuid->mac[0] & BM_OCTET(1,0,0,0,0,0,0,0))) { - /* generate random IEEE 802 local multicast MAC address */ - prng_data(uuid->prng, (void *)&(uuid->obj.node), sizeof(uuid->obj.node)); - - uuid->obj.node[0] |= IEEE_MAC_MCBIT_ENC; - - uuid->obj.node[0] |= IEEE_MAC_LOBIT_ENC; - + uuid->obj.node[0] |= IEEE_MAC_MCBIT; - + uuid->obj.node[0] |= IEEE_MAC_LOBIT; - } - else { - /* use real regular MAC address */ diff --git a/shared/ossp_uuid/INSTALL b/shared/ossp_uuid/INSTALL deleted file mode 100644 index 938a4dad..00000000 --- a/shared/ossp_uuid/INSTALL +++ /dev/null @@ -1,23 +0,0 @@ - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - - INSTALLATION - - To install OSSP uuid into /path/to/uuid/ perform - the following steps in your shell: - - $ ./configure - --prefix=/path/to/uuid - [--with-dce] - [--with-perl[=/path/to/[bin[/perl] - --with-perl-compat]] - [--with-php] - $ make - $ make check - $ make install [DESTDIR=/path/to/temp/root] - diff --git a/shared/ossp_uuid/MANIFEST b/shared/ossp_uuid/MANIFEST deleted file mode 100644 index faed3974..00000000 --- a/shared/ossp_uuid/MANIFEST +++ /dev/null @@ -1,83 +0,0 @@ -AUTHORS -BINDINGS -ChangeLog -HISTORY -INSTALL -MANIFEST -Makefile.PL -Makefile.in -NEWS -OVERVIEW -PORTING -README -SEEALSO -THANKS -TODO -USERS -aclocal.m4 -config.guess -config.h.in -config.sub -configure -configure.ac -libtool.m4 -ltmain.sh -perl/MANIFEST -perl/Makefile.PL -perl/uuid.pm -perl/uuid.pod -perl/uuid.tm -perl/uuid.ts -perl/uuid.xs -perl/uuid_compat.pm -perl/uuid_compat.pod -perl/uuid_compat.ts -pgsql/Makefile -pgsql/uuid.c -pgsql/uuid.sql.in -pgsql/uuid.txt -php/Makefile.local -php/config.m4 -php/package.xml -php/uuid.c -php/uuid.php4 -php/uuid.php5 -php/uuid.ts -shtool -uuid++.3 -uuid++.cc -uuid++.hh -uuid++.pod -uuid-config.1 -uuid-config.in -uuid-config.pod -uuid.1 -uuid.3 -uuid.ac -uuid.c -uuid.h.in -uuid.pc.in -uuid.pod -uuid_ac.h -uuid_bm.h -uuid_cli.c -uuid_cli.pod -uuid_dce.c -uuid_dce.h -uuid_mac.c -uuid_mac.h -uuid_md5.c -uuid_md5.h -uuid_prng.c -uuid_prng.h -uuid_sha1.c -uuid_sha1.h -uuid_str.c -uuid_str.h -uuid_time.c -uuid_time.h -uuid_ui128.c -uuid_ui128.h -uuid_ui64.c -uuid_ui64.h -uuid_vers.h diff --git a/shared/ossp_uuid/Makefile b/shared/ossp_uuid/Makefile deleted file mode 100644 index c5fdd41d..00000000 --- a/shared/ossp_uuid/Makefile +++ /dev/null @@ -1,357 +0,0 @@ -## -## OSSP uuid - Universally Unique Identifier -## Copyright (c) 2004-2008 Ralf S. Engelschall -## Copyright (c) 2004-2008 The OSSP Project -## -## This file is part of OSSP uuid, a library for the generation -## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/ -## -## Permission to use, copy, modify, and distribute this software for -## any purpose with or without fee is hereby granted, provided that -## the above copyright notice and this permission notice appear in all -## copies. -## -## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR -## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -## SUCH DAMAGE. -## -## Makefile.in: make(1) build procedure -## - - - - -srcdir = . -top_srcdir = . -S = $(srcdir) -C = . - -DESTDIR = -prefix = /usr/local -exec_prefix = ${prefix} -datarootdir = ${prefix}/share -bindir = ${exec_prefix}/bin -libdir = ${exec_prefix}/lib -includedir = ${prefix}/include -mandir = ${datarootdir}/man - -CC = gcc -CXX = g++ -CPPFLAGS = -I. -I$(S) -DHAVE_CONFIG_H -CFLAGS = -O2 -pipe -CXXFLAGS = -g -O2 -LDFLAGS = -LIBS = -lnsl -RM = rm -f -CP = cp -RMDIR = rmdir -SHTOOL = $(S)/shtool -LIBTOOL = $(C)/libtool -TRUE = true -POD2MAN = pod2man -PERL = /usr/bin/perl -PHP = NA -PG_CONFIG = NA - -LIB_NAME = libuuid.la -LIB_OBJS = uuid.lo uuid_md5.lo uuid_sha1.lo uuid_prng.lo uuid_mac.lo uuid_time.lo uuid_ui64.lo uuid_ui128.lo uuid_str.lo - -DCE_NAME = libuuid_dce.la -DCE_OBJS = uuid_dce.lo $(LIB_OBJS) - -CXX_NAME = libuuid++.la -CXX_OBJS = uuid++.lo $(LIB_OBJS) - -PRG_NAME = uuid -PRG_OBJS = uuid_cli.o - -MAN_NAME = uuid.3 uuid++.3 uuid.1 - -PERL_NAME = $(S)/perl/blib/lib/OSSP/uuid.pm -PERL_OBJS = $(S)/perl/uuid.pm - -PHP_NAME = $(S)/php/modules/uuid.so -PHP_OBJS = $(S)/php/uuid.c - -PGSQL_NAME = $(S)/pgsql/libuuid.so -PGSQL_OBJS = $(S)/pgsql/uuid.c - -TARGETS = $(LIB_NAME) $(CXX_NAME) $(PRG_NAME) - -WITH_DCE = no -WITH_CXX = yes -WITH_PERL = no -WITH_PERL_COMPAT = 0 -WITH_PHP = no -WITH_PGSQL = no - -.SUFFIXES: -.SUFFIXES: .c .cc .o .lo - -all: $(TARGETS) - -.c.o: - $(CC) $(CPPFLAGS) $(CFLAGS) -c $< - -.cc.o: - $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< - -.c.lo: - @$(LIBTOOL) --mode=compile $(CC) $(CPPFLAGS) $(CFLAGS) -c $< - -.cc.lo: - @$(LIBTOOL) --mode=compile $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< - -$(LIB_NAME): $(LIB_OBJS) - @$(LIBTOOL) --mode=link $(CC) -o $(LIB_NAME) $(LIB_OBJS) -rpath $(libdir) \ - -version-info `$(SHTOOL) version -l c -d libtool $(S)/uuid_vers.h` - -$(DCE_NAME): $(DCE_OBJS) - @$(LIBTOOL) --mode=link $(CC) -o $(DCE_NAME) $(DCE_OBJS) -rpath $(libdir) \ - -version-info `$(SHTOOL) version -l c -d libtool $(S)/uuid_vers.h` - -$(CXX_NAME): $(CXX_OBJS) - @$(LIBTOOL) --mode=link $(CXX) -o $(CXX_NAME) $(CXX_OBJS) -rpath $(libdir) \ - -version-info `$(SHTOOL) version -l c -d libtool $(S)/uuid_vers.h` - -$(PRG_NAME): $(PRG_OBJS) $(LIB_NAME) - @$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $(PRG_NAME) $(PRG_OBJS) $(LIB_NAME) $(LIBS) - -$(PERL_NAME): $(PERL_OBJS) $(LIB_NAME) - @cd $(S)/perl && $(PERL) Makefile.PL PREFIX=$(prefix) COMPAT=$(WITH_PERL_COMPAT) && $(MAKE) $(MFLAGS) all - @touch $(PERL_NAME) - -$(PHP_NAME): $(PHP_OBJS) $(LIB_NAME) - @cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local PHP=$(PHP) - @touch $(PHP_NAME) - -$(PGSQL_NAME): $(PGSQL_OBJS) $(LIB_NAME) - @cd $(S)/pgsql && $(MAKE) $(MFLAGS) PG_CONFIG=$(PG_CONFIG) - @touch $(PGSQL_NAME) - -uuid.lo: $(S)/uuid.c uuid.h $(S)/uuid_md5.h $(S)/uuid_sha1.h $(S)/uuid_prng.h $(S)/uuid_mac.h $(S)/uuid_ui64.h $(S)/uuid_ui128.h $(S)/uuid_str.h $(S)/uuid_bm.h $(S)/uuid_ac.h -uuid_mac.lo: $(S)/uuid_mac.c $(S)/uuid_mac.h -uuid_md5.lo: $(S)/uuid_md5.c $(S)/uuid_md5.h -uuid_sha1.lo: $(S)/uuid_sha1.c $(S)/uuid_sha1.h -uuid_prng.lo: $(S)/uuid_prng.c $(S)/uuid_prng.h -uuid_str.lo: $(S)/uuid_str.c $(S)/uuid_str.h -uuid_ui64.lo: $(S)/uuid_ui64.c $(S)/uuid_ui64.h -uuid_ui128.lo: $(S)/uuid_ui64.c $(S)/uuid_ui128.h -uuid_dce.lo: $(S)/uuid_dce.c uuid.h $(S)/uuid_dce.h -uuid_cli.o: $(S)/uuid_cli.c uuid.h -uuid++.lo: $(S)/uuid++.cc $(S)/uuid++.hh - -man: uuid.3 uuid++.3 uuid-config.1 uuid.1 -uuid.3: uuid.pod - V1=`$(SHTOOL) version -l c -d short $(S)/uuid_vers.h`; \ - V2=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h`; \ - D=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h | sed -e 's;.*(;;' -e 's;).*;;'`; \ - $(POD2MAN) --quotes=none \ - --section=3 --center="Universally Unique Identifier" \ - --release="$$D" --date="OSSP uuid $$V1" $(S)/uuid.pod | \ - sed -e "s;UUID_VERSION_STR;$$V2;" >uuid.3 -uuid++.3: uuid++.pod - V1=`$(SHTOOL) version -l c -d short $(S)/uuid_vers.h`; \ - V2=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h`; \ - D=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h | sed -e 's;.*(;;' -e 's;).*;;'`; \ - $(POD2MAN) --quotes=none \ - --section=3 --center="Universally Unique Identifier" \ - --release="$$D" --date="OSSP uuid $$V1" $(S)/uuid++.pod | \ - sed -e "s;UUID_VERSION_STR;$$V2;" >uuid++.3 -uuid-config.1: uuid-config.pod - V1=`$(SHTOOL) version -l c -d short $(S)/uuid_vers.h`; \ - V2=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h`; \ - D=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h | sed -e 's;.*(;;' -e 's;).*;;'`; \ - $(POD2MAN) --quotes=none \ - --section=1 --center="Universally Unique Identifier" \ - --release="$$D" --date="OSSP uuid $$V1" $(S)/uuid-config.pod | \ - sed -e "s;UUID_VERSION_STR;$$V2;" >uuid-config.1 -uuid.1: uuid_cli.pod - V1=`$(SHTOOL) version -l c -d short $(S)/uuid_vers.h`; \ - V2=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h`; \ - D=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h | sed -e 's;.*(;;' -e 's;).*;;'`; \ - $(CP) $(S)/uuid_cli.pod /tmp/uuid.pod; \ - $(POD2MAN) --quotes=none \ - --section=1 --center="Universally Unique Identifier" \ - --release="$$D" --date="OSSP uuid $$V1" /tmp/uuid.pod | \ - sed -e "s;UUID_VERSION_STR;$$V2;" >uuid.1; \ - $(RM) /tmp/uuid.pod - -check: all - @echo "==== UUID version 1 (time and node based): 4 single iterations"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v1 -n 4 -1 - @echo "==== UUID version 1 (time and node based): 4 subsequent iterations"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v1 -n 4 - @echo "==== UUID version 3 (name based, MD5): 2 times repeated"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v3 -n 2 ns:URL http://www.ossp.org/ - @echo "==== UUID version 5 (name based, SHA-1): 2 times repeated"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v5 -n 2 ns:URL http://www.ossp.org/ - @echo "==== UUID version 4 (random data based): 4 single iterations"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v4 -n 4 -1 - @echo "==== UUID version 4 (random data based): 4 subsequent iterations"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v4 -n 4 - @echo "==== UUID version 1 generation and decoding"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v1`; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v1 -m` - @echo "==== UUID version 3 generation and decoding"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v3 ns:URL http://www.ossp.org/` - @echo "==== UUID version 5 generation and decoding"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v5 ns:URL http://www.ossp.org/` - @echo "==== UUID version 3 generation and decoding"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v4` - -@if [ ".$(WITH_PERL)" = .yes ]; then \ - echo "==== Perl bindings to C API"; \ - (cd $(S)/perl && $(MAKE) $(MFLAGS) test); \ - fi - -@if [ ".$(WITH_PHP)" = .yes ]; then \ - echo "==== PHP bindings to C API"; \ - (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local test PHP=$(PHP)); \ - fi - -@if [ ".$(WITH_PGSQL)" = .yes ]; then \ - echo "==== PGSQL bindings to C API"; \ - (cd $(S)/pgsql && $(MAKE) $(MFLAGS) test PG_CONFIG=$(PG_CONFIG)); \ - fi - -.PHONY: install -install: - $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(prefix) - $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(bindir) - $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(includedir) - $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(libdir)/pkgconfig - $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(mandir)/man3 - $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(mandir)/man1 - $(SHTOOL) install -c -m 755 uuid-config $(DESTDIR)$(bindir)/ - $(SHTOOL) install -c -m 644 $(S)/uuid-config.1 $(DESTDIR)$(mandir)/man1/ - $(SHTOOL) install -c -m 644 $(S)/uuid.pc $(DESTDIR)$(libdir)/pkgconfig/ - $(SHTOOL) install -c -m 644 uuid.h $(DESTDIR)$(includedir)/ - -@if [ ".$(WITH_DCE)" = .yes ]; then \ - echo "$(SHTOOL) install -c -m 644 $(S)/uuid_dce.h $(DESTDIR)$(includedir)/"; \ - $(SHTOOL) install -c -m 644 $(S)/uuid_dce.h $(DESTDIR)$(includedir)/; \ - fi - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - echo "$(SHTOOL) install -c -m 644 $(S)/uuid++.hh $(DESTDIR)$(includedir)/"; \ - $(SHTOOL) install -c -m 644 $(S)/uuid++.hh $(DESTDIR)$(includedir)/; \ - fi - $(SHTOOL) install -c -m 644 $(S)/uuid.3 $(DESTDIR)$(mandir)/man3/ - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - echo "$(SHTOOL) install -c -m 644 $(S)/uuid++.3 $(DESTDIR)$(mandir)/man3/"; \ - $(SHTOOL) install -c -m 644 $(S)/uuid++.3 $(DESTDIR)$(mandir)/man3/; \ - fi - @$(LIBTOOL) --mode=install $(SHTOOL) install -c -m 644 $(LIB_NAME) $(DESTDIR)$(libdir)/ - -@if [ ".$(WITH_DCE)" = .yes ]; then \ - $(LIBTOOL) --mode=install $(SHTOOL) install -c -m 644 $(DCE_NAME) $(DESTDIR)$(libdir)/; \ - fi - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - $(LIBTOOL) --mode=install $(SHTOOL) install -c -m 644 $(CXX_NAME) $(DESTDIR)$(libdir)/; \ - fi - @$(LIBTOOL) --mode=install $(SHTOOL) install -c -s -m 755 uuid $(DESTDIR)$(bindir)/ - $(SHTOOL) install -c -m 644 $(S)/uuid.1 $(DESTDIR)$(mandir)/man1/ - -@if [ ".$(WITH_PERL)" = .yes ]; then \ - (cd $(S)/perl && $(MAKE) $(MFLAGS) install DESTDIR=$(DESTDIR)); \ - fi - -@if [ ".$(WITH_PHP)" = .yes ]; then \ - (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local install EXTDIR=$(prefix)/lib/php PHP=$(PHP) DESTDIR=$(DESTDIR)); \ - fi - -@if [ ".$(WITH_PGSQL)" = .yes ]; then \ - (cd $(S)/pgsql && $(MAKE) $(MFLAGS) install DESTDIR=$(DESTDIR) PG_CONFIG=$(PG_CONFIG)); \ - fi - -.PHONY: uninstall -uninstall: - -$(RM) $(DESTDIR)$(mandir)/man1/uuid.1 - -@$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(bindir)/uuid - -@$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(LIB_NAME) - -@if [ ".$(WITH_DCE)" = .yes ]; then \ - $(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(DCE_NAME); \ - fi - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - $(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(CXX_NAME); \ - fi - -$(RM) $(DESTDIR)$(mandir)/man3/uuid.3 - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - echo "$(RM) $(DESTDIR)$(mandir)/man3/uuid++.3"; \ - $(RM) $(DESTDIR)$(mandir)/man3/uuid++.3; \ - fi - -$(RM) $(DESTDIR)$(includedir)/uuid.h - -@if [ ".$(WITH_DCE)" = .yes ]; then \ - echo "$(RM) $(DESTDIR)$(includedir)/uuid_dce.h"; \ - $(RM) $(DESTDIR)$(includedir)/uuid_dce.h; \ - fi - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - echo "$(RM) $(DESTDIR)$(includedir)/uuid++.hh"; \ - $(RM) $(DESTDIR)$(includedir)/uuid++.hh; \ - fi - -$(RM) $(DESTDIR)$(libdir)/pkgconfig/uuid.pc - -$(RM) $(DESTDIR)$(mandir)/man1/uuid-config.1 - -$(RM) $(DESTDIR)$(bindir)/uuid-config - -$(RMDIR) $(DESTDIR)$(mandir)/man1 >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(mandir)/man3 >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(mandir) >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(libdir)/pkgconfig >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(libdir) >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(includedir) >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(bindir) >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(prefix) >/dev/null 2>&1 || $(TRUE) - -.PHONY: clean -clean: - -$(RM) $(LIB_NAME) $(LIB_OBJS) - -@if [ ".$(WITH_DCE)" = .yes ]; then \ - echo "$(RM) $(DCE_NAME) $(DCE_OBJS)"; \ - $(RM) $(DCE_NAME) $(DCE_OBJS); \ - fi - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - echo "$(RM) $(CXX_NAME) $(CXX_OBJS)"; \ - $(RM) $(CXX_NAME) $(CXX_OBJS); \ - fi - -$(RM) $(PRG_NAME) $(PRG_OBJS) - -$(RM) -r .libs >/dev/null 2>&1 || $(TRUE) - -$(RM) *.o *.lo - -@if [ ".$(WITH_PERL)" = .yes ]; then \ - (cd $(S)/perl && $(MAKE) $(MFLAGS) clean || true); \ - fi - -@if [ ".$(WITH_PHP)" = .yes ]; then \ - (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local clean || true); \ - fi - -@if [ ".$(WITH_PGSQL)" = .yes ]; then \ - (cd $(S)/pgsql && $(MAKE) $(MFLAGS) clean PG_CONFIG=$(PG_CONFIG) || true); \ - fi - -distclean: clean - -$(RM) config.log config.status config.cache - -$(RM) Makefile config.h uuid-config uuid.h uuid.pc - -$(RM) libtool - -@if [ ".$(WITH_PERL)" = .yes ]; then \ - (cd $(S)/perl && $(MAKE) $(MFLAGS) distclean || true; rm -f Makefile.old); \ - fi - -@if [ ".$(WITH_PHP)" = .yes ]; then \ - (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local distclean || true); \ - fi - -@if [ ".$(WITH_PGSQL)" = .yes ]; then \ - (cd $(S)/pgsql && $(MAKE) $(MFLAGS) distclean PG_CONFIG=$(PG_CONFIG) || true); \ - fi - -realclean: distclean - -$(RM) uuid.3 uuid.1 - -$(RM) configure config.h.in - -$(RM) shtool - -$(RM) ltmain.sh libtool.m4 config.guess config.sub - -@if [ ".$(WITH_PERL)" = .yes ]; then \ - (cd $(S)/perl && $(MAKE) $(MFLAGS) realclean || true; rm -f Makefile.old); \ - fi - -@if [ ".$(WITH_PHP)" = .yes ]; then \ - (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local realclean || true); \ - fi - -@if [ ".$(WITH_PGSQL)" = .yes ]; then \ - (cd $(S)/pgsql && $(MAKE) $(MFLAGS) realclean PG_CONFIG=$(PG_CONFIG) || true); \ - fi - diff --git a/shared/ossp_uuid/Makefile.PL b/shared/ossp_uuid/Makefile.PL deleted file mode 100644 index a6d9cc8f..00000000 --- a/shared/ossp_uuid/Makefile.PL +++ /dev/null @@ -1,67 +0,0 @@ -## -## OSSP uuid - Universally Unique Identifier -## Copyright (c) 2004-2008 Ralf S. Engelschall -## Copyright (c) 2004-2008 The OSSP Project -## -## This file is part of OSSP uuid, a library for the generation -## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/ -## -## Permission to use, copy, modify, and distribute this software for -## any purpose with or without fee is hereby granted, provided that -## the above copyright notice and this permission notice appear in all -## copies. -## -## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR -## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -## SUCH DAMAGE. -## -## Makefile.PL: top-level Perl ExtUtils::MakeMaker wrapper script -## - -require 5.008; -use IO::File; - -my $ARGS = join(" ", @ARGV); - -print "++ writing Makefile\n"; - -my $mk = new IO::File ">Makefile" or die; -$mk->print(<< "EOF"); - -PERL = $^X -FULLPERL = $^X -ARGS = $ARGS - -all pure_all: - \@if [ ! -d build ]; then mkdir build; fi - \@if [ ! -f build/Makefile ]; then (cd build && ../configure --disable-shared); fi - \@if [ ! -f build/libuuid.la ]; then (cd build && \$(MAKE) \$(MFLAGS) libuuid.la); fi - \@if [ ! -f perl/Makefile ]; then (cd perl && \$(PERL) Makefile.PL \$(ARGS)); fi - \@cd perl && \$(MAKE) \$(MFLAGS) \$\@ - -install pure_install test: - \@cd perl && \$(MAKE) \$(MFLAGS) \$\@ - -clean: - \@cd build && \$(MAKE) \$(MFLAGS) \$\@ - \@cd perl && \$(MAKE) \$(MFLAGS) \$\@ - -distclean realclean: - \@cd build && \$(MAKE) \$(MFLAGS) \$\@ - \@cd perl && \$(MAKE) \$(MFLAGS) \$\@ - -rm -rf build || true - -rm -rf Makefile || true - -EOF - -$mk->close(); - diff --git a/shared/ossp_uuid/Makefile.in b/shared/ossp_uuid/Makefile.in deleted file mode 100644 index d28f4be8..00000000 --- a/shared/ossp_uuid/Makefile.in +++ /dev/null @@ -1,357 +0,0 @@ -## -## OSSP uuid - Universally Unique Identifier -## Copyright (c) 2004-2008 Ralf S. Engelschall -## Copyright (c) 2004-2008 The OSSP Project -## -## This file is part of OSSP uuid, a library for the generation -## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/ -## -## Permission to use, copy, modify, and distribute this software for -## any purpose with or without fee is hereby granted, provided that -## the above copyright notice and this permission notice appear in all -## copies. -## -## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR -## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -## SUCH DAMAGE. -## -## Makefile.in: make(1) build procedure -## - -@SET_MAKE@ - -VPATH = @srcdir@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -S = $(srcdir) -C = . - -DESTDIR = -prefix = @prefix@ -exec_prefix = @exec_prefix@ -datarootdir = @datarootdir@ -bindir = @bindir@ -libdir = @libdir@ -includedir = @includedir@ -mandir = @mandir@ - -CC = @CC@ -CXX = @CXX@ -CPPFLAGS = -I. -I$(S) @CPPFLAGS@ @DEFS@ -CFLAGS = @CFLAGS@ -CXXFLAGS = @CXXFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -RM = rm -f -CP = cp -RMDIR = rmdir -SHTOOL = $(S)/shtool -LIBTOOL = $(C)/libtool -TRUE = true -POD2MAN = pod2man -PERL = @PERL@ -PHP = @PHP@ -PG_CONFIG = @PG_CONFIG@ - -LIB_NAME = libuuid.la -LIB_OBJS = uuid.lo uuid_md5.lo uuid_sha1.lo uuid_prng.lo uuid_mac.lo uuid_time.lo uuid_ui64.lo uuid_ui128.lo uuid_str.lo - -DCE_NAME = libuuid_dce.la -DCE_OBJS = uuid_dce.lo $(LIB_OBJS) - -CXX_NAME = libuuid++.la -CXX_OBJS = uuid++.lo $(LIB_OBJS) - -PRG_NAME = uuid -PRG_OBJS = uuid_cli.o - -MAN_NAME = uuid.3 uuid++.3 uuid.1 - -PERL_NAME = $(S)/perl/blib/lib/OSSP/uuid.pm -PERL_OBJS = $(S)/perl/uuid.pm - -PHP_NAME = $(S)/php/modules/uuid.so -PHP_OBJS = $(S)/php/uuid.c - -PGSQL_NAME = $(S)/pgsql/libuuid.so -PGSQL_OBJS = $(S)/pgsql/uuid.c - -TARGETS = $(LIB_NAME) @DCE_NAME@ @CXX_NAME@ $(PRG_NAME) @PERL_NAME@ @PHP_NAME@ @PGSQL_NAME@ - -WITH_DCE = @WITH_DCE@ -WITH_CXX = @WITH_CXX@ -WITH_PERL = @WITH_PERL@ -WITH_PERL_COMPAT = @WITH_PERL_COMPAT@ -WITH_PHP = @WITH_PHP@ -WITH_PGSQL = @WITH_PGSQL@ - -.SUFFIXES: -.SUFFIXES: .c .cc .o .lo - -all: $(TARGETS) - -.c.o: - $(CC) $(CPPFLAGS) $(CFLAGS) -c $< - -.cc.o: - $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< - -.c.lo: - @$(LIBTOOL) --mode=compile $(CC) $(CPPFLAGS) $(CFLAGS) -c $< - -.cc.lo: - @$(LIBTOOL) --mode=compile $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< - -$(LIB_NAME): $(LIB_OBJS) - @$(LIBTOOL) --mode=link $(CC) -o $(LIB_NAME) $(LIB_OBJS) -rpath $(libdir) \ - -version-info `$(SHTOOL) version -l c -d libtool $(S)/uuid_vers.h` - -$(DCE_NAME): $(DCE_OBJS) - @$(LIBTOOL) --mode=link $(CC) -o $(DCE_NAME) $(DCE_OBJS) -rpath $(libdir) \ - -version-info `$(SHTOOL) version -l c -d libtool $(S)/uuid_vers.h` - -$(CXX_NAME): $(CXX_OBJS) - @$(LIBTOOL) --mode=link $(CXX) -o $(CXX_NAME) $(CXX_OBJS) -rpath $(libdir) \ - -version-info `$(SHTOOL) version -l c -d libtool $(S)/uuid_vers.h` - -$(PRG_NAME): $(PRG_OBJS) $(LIB_NAME) - @$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $(PRG_NAME) $(PRG_OBJS) $(LIB_NAME) $(LIBS) - -$(PERL_NAME): $(PERL_OBJS) $(LIB_NAME) - @cd $(S)/perl && $(PERL) Makefile.PL PREFIX=$(prefix) COMPAT=$(WITH_PERL_COMPAT) && $(MAKE) $(MFLAGS) all - @touch $(PERL_NAME) - -$(PHP_NAME): $(PHP_OBJS) $(LIB_NAME) - @cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local PHP=$(PHP) - @touch $(PHP_NAME) - -$(PGSQL_NAME): $(PGSQL_OBJS) $(LIB_NAME) - @cd $(S)/pgsql && $(MAKE) $(MFLAGS) PG_CONFIG=$(PG_CONFIG) - @touch $(PGSQL_NAME) - -uuid.lo: $(S)/uuid.c uuid.h $(S)/uuid_md5.h $(S)/uuid_sha1.h $(S)/uuid_prng.h $(S)/uuid_mac.h $(S)/uuid_ui64.h $(S)/uuid_ui128.h $(S)/uuid_str.h $(S)/uuid_bm.h $(S)/uuid_ac.h -uuid_mac.lo: $(S)/uuid_mac.c $(S)/uuid_mac.h -uuid_md5.lo: $(S)/uuid_md5.c $(S)/uuid_md5.h -uuid_sha1.lo: $(S)/uuid_sha1.c $(S)/uuid_sha1.h -uuid_prng.lo: $(S)/uuid_prng.c $(S)/uuid_prng.h -uuid_str.lo: $(S)/uuid_str.c $(S)/uuid_str.h -uuid_ui64.lo: $(S)/uuid_ui64.c $(S)/uuid_ui64.h -uuid_ui128.lo: $(S)/uuid_ui64.c $(S)/uuid_ui128.h -uuid_dce.lo: $(S)/uuid_dce.c uuid.h $(S)/uuid_dce.h -uuid_cli.o: $(S)/uuid_cli.c uuid.h -uuid++.lo: $(S)/uuid++.cc $(S)/uuid++.hh - -man: uuid.3 uuid++.3 uuid-config.1 uuid.1 -uuid.3: uuid.pod - V1=`$(SHTOOL) version -l c -d short $(S)/uuid_vers.h`; \ - V2=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h`; \ - D=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h | sed -e 's;.*(;;' -e 's;).*;;'`; \ - $(POD2MAN) --quotes=none \ - --section=3 --center="Universally Unique Identifier" \ - --release="$$D" --date="OSSP uuid $$V1" $(S)/uuid.pod | \ - sed -e "s;UUID_VERSION_STR;$$V2;" >uuid.3 -uuid++.3: uuid++.pod - V1=`$(SHTOOL) version -l c -d short $(S)/uuid_vers.h`; \ - V2=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h`; \ - D=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h | sed -e 's;.*(;;' -e 's;).*;;'`; \ - $(POD2MAN) --quotes=none \ - --section=3 --center="Universally Unique Identifier" \ - --release="$$D" --date="OSSP uuid $$V1" $(S)/uuid++.pod | \ - sed -e "s;UUID_VERSION_STR;$$V2;" >uuid++.3 -uuid-config.1: uuid-config.pod - V1=`$(SHTOOL) version -l c -d short $(S)/uuid_vers.h`; \ - V2=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h`; \ - D=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h | sed -e 's;.*(;;' -e 's;).*;;'`; \ - $(POD2MAN) --quotes=none \ - --section=1 --center="Universally Unique Identifier" \ - --release="$$D" --date="OSSP uuid $$V1" $(S)/uuid-config.pod | \ - sed -e "s;UUID_VERSION_STR;$$V2;" >uuid-config.1 -uuid.1: uuid_cli.pod - V1=`$(SHTOOL) version -l c -d short $(S)/uuid_vers.h`; \ - V2=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h`; \ - D=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h | sed -e 's;.*(;;' -e 's;).*;;'`; \ - $(CP) $(S)/uuid_cli.pod /tmp/uuid.pod; \ - $(POD2MAN) --quotes=none \ - --section=1 --center="Universally Unique Identifier" \ - --release="$$D" --date="OSSP uuid $$V1" /tmp/uuid.pod | \ - sed -e "s;UUID_VERSION_STR;$$V2;" >uuid.1; \ - $(RM) /tmp/uuid.pod - -check: all - @echo "==== UUID version 1 (time and node based): 4 single iterations"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v1 -n 4 -1 - @echo "==== UUID version 1 (time and node based): 4 subsequent iterations"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v1 -n 4 - @echo "==== UUID version 3 (name based, MD5): 2 times repeated"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v3 -n 2 ns:URL http://www.ossp.org/ - @echo "==== UUID version 5 (name based, SHA-1): 2 times repeated"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v5 -n 2 ns:URL http://www.ossp.org/ - @echo "==== UUID version 4 (random data based): 4 single iterations"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v4 -n 4 -1 - @echo "==== UUID version 4 (random data based): 4 subsequent iterations"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v4 -n 4 - @echo "==== UUID version 1 generation and decoding"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v1`; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v1 -m` - @echo "==== UUID version 3 generation and decoding"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v3 ns:URL http://www.ossp.org/` - @echo "==== UUID version 5 generation and decoding"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v5 ns:URL http://www.ossp.org/` - @echo "==== UUID version 3 generation and decoding"; \ - $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v4` - -@if [ ".$(WITH_PERL)" = .yes ]; then \ - echo "==== Perl bindings to C API"; \ - (cd $(S)/perl && $(MAKE) $(MFLAGS) test); \ - fi - -@if [ ".$(WITH_PHP)" = .yes ]; then \ - echo "==== PHP bindings to C API"; \ - (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local test PHP=$(PHP)); \ - fi - -@if [ ".$(WITH_PGSQL)" = .yes ]; then \ - echo "==== PGSQL bindings to C API"; \ - (cd $(S)/pgsql && $(MAKE) $(MFLAGS) test PG_CONFIG=$(PG_CONFIG)); \ - fi - -.PHONY: install -install: - $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(prefix) - $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(bindir) - $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(includedir) - $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(libdir)/pkgconfig - $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(mandir)/man3 - $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(mandir)/man1 - $(SHTOOL) install -c -m 755 uuid-config $(DESTDIR)$(bindir)/ - $(SHTOOL) install -c -m 644 $(S)/uuid-config.1 $(DESTDIR)$(mandir)/man1/ - $(SHTOOL) install -c -m 644 $(S)/uuid.pc $(DESTDIR)$(libdir)/pkgconfig/ - $(SHTOOL) install -c -m 644 uuid.h $(DESTDIR)$(includedir)/ - -@if [ ".$(WITH_DCE)" = .yes ]; then \ - echo "$(SHTOOL) install -c -m 644 $(S)/uuid_dce.h $(DESTDIR)$(includedir)/"; \ - $(SHTOOL) install -c -m 644 $(S)/uuid_dce.h $(DESTDIR)$(includedir)/; \ - fi - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - echo "$(SHTOOL) install -c -m 644 $(S)/uuid++.hh $(DESTDIR)$(includedir)/"; \ - $(SHTOOL) install -c -m 644 $(S)/uuid++.hh $(DESTDIR)$(includedir)/; \ - fi - $(SHTOOL) install -c -m 644 $(S)/uuid.3 $(DESTDIR)$(mandir)/man3/ - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - echo "$(SHTOOL) install -c -m 644 $(S)/uuid++.3 $(DESTDIR)$(mandir)/man3/"; \ - $(SHTOOL) install -c -m 644 $(S)/uuid++.3 $(DESTDIR)$(mandir)/man3/; \ - fi - @$(LIBTOOL) --mode=install $(SHTOOL) install -c -m 644 $(LIB_NAME) $(DESTDIR)$(libdir)/ - -@if [ ".$(WITH_DCE)" = .yes ]; then \ - $(LIBTOOL) --mode=install $(SHTOOL) install -c -m 644 $(DCE_NAME) $(DESTDIR)$(libdir)/; \ - fi - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - $(LIBTOOL) --mode=install $(SHTOOL) install -c -m 644 $(CXX_NAME) $(DESTDIR)$(libdir)/; \ - fi - @$(LIBTOOL) --mode=install $(SHTOOL) install -c -s -m 755 uuid $(DESTDIR)$(bindir)/ - $(SHTOOL) install -c -m 644 $(S)/uuid.1 $(DESTDIR)$(mandir)/man1/ - -@if [ ".$(WITH_PERL)" = .yes ]; then \ - (cd $(S)/perl && $(MAKE) $(MFLAGS) install DESTDIR=$(DESTDIR)); \ - fi - -@if [ ".$(WITH_PHP)" = .yes ]; then \ - (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local install EXTDIR=$(prefix)/lib/php PHP=$(PHP) DESTDIR=$(DESTDIR)); \ - fi - -@if [ ".$(WITH_PGSQL)" = .yes ]; then \ - (cd $(S)/pgsql && $(MAKE) $(MFLAGS) install DESTDIR=$(DESTDIR) PG_CONFIG=$(PG_CONFIG)); \ - fi - -.PHONY: uninstall -uninstall: - -$(RM) $(DESTDIR)$(mandir)/man1/uuid.1 - -@$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(bindir)/uuid - -@$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(LIB_NAME) - -@if [ ".$(WITH_DCE)" = .yes ]; then \ - $(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(DCE_NAME); \ - fi - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - $(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(CXX_NAME); \ - fi - -$(RM) $(DESTDIR)$(mandir)/man3/uuid.3 - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - echo "$(RM) $(DESTDIR)$(mandir)/man3/uuid++.3"; \ - $(RM) $(DESTDIR)$(mandir)/man3/uuid++.3; \ - fi - -$(RM) $(DESTDIR)$(includedir)/uuid.h - -@if [ ".$(WITH_DCE)" = .yes ]; then \ - echo "$(RM) $(DESTDIR)$(includedir)/uuid_dce.h"; \ - $(RM) $(DESTDIR)$(includedir)/uuid_dce.h; \ - fi - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - echo "$(RM) $(DESTDIR)$(includedir)/uuid++.hh"; \ - $(RM) $(DESTDIR)$(includedir)/uuid++.hh; \ - fi - -$(RM) $(DESTDIR)$(libdir)/pkgconfig/uuid.pc - -$(RM) $(DESTDIR)$(mandir)/man1/uuid-config.1 - -$(RM) $(DESTDIR)$(bindir)/uuid-config - -$(RMDIR) $(DESTDIR)$(mandir)/man1 >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(mandir)/man3 >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(mandir) >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(libdir)/pkgconfig >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(libdir) >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(includedir) >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(bindir) >/dev/null 2>&1 || $(TRUE) - -$(RMDIR) $(DESTDIR)$(prefix) >/dev/null 2>&1 || $(TRUE) - -.PHONY: clean -clean: - -$(RM) $(LIB_NAME) $(LIB_OBJS) - -@if [ ".$(WITH_DCE)" = .yes ]; then \ - echo "$(RM) $(DCE_NAME) $(DCE_OBJS)"; \ - $(RM) $(DCE_NAME) $(DCE_OBJS); \ - fi - -@if [ ".$(WITH_CXX)" = .yes ]; then \ - echo "$(RM) $(CXX_NAME) $(CXX_OBJS)"; \ - $(RM) $(CXX_NAME) $(CXX_OBJS); \ - fi - -$(RM) $(PRG_NAME) $(PRG_OBJS) - -$(RM) -r .libs >/dev/null 2>&1 || $(TRUE) - -$(RM) *.o *.lo - -@if [ ".$(WITH_PERL)" = .yes ]; then \ - (cd $(S)/perl && $(MAKE) $(MFLAGS) clean || true); \ - fi - -@if [ ".$(WITH_PHP)" = .yes ]; then \ - (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local clean || true); \ - fi - -@if [ ".$(WITH_PGSQL)" = .yes ]; then \ - (cd $(S)/pgsql && $(MAKE) $(MFLAGS) clean PG_CONFIG=$(PG_CONFIG) || true); \ - fi - -distclean: clean - -$(RM) config.log config.status config.cache - -$(RM) Makefile config.h uuid-config uuid.h uuid.pc - -$(RM) libtool - -@if [ ".$(WITH_PERL)" = .yes ]; then \ - (cd $(S)/perl && $(MAKE) $(MFLAGS) distclean || true; rm -f Makefile.old); \ - fi - -@if [ ".$(WITH_PHP)" = .yes ]; then \ - (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local distclean || true); \ - fi - -@if [ ".$(WITH_PGSQL)" = .yes ]; then \ - (cd $(S)/pgsql && $(MAKE) $(MFLAGS) distclean PG_CONFIG=$(PG_CONFIG) || true); \ - fi - -realclean: distclean - -$(RM) uuid.3 uuid.1 - -$(RM) configure config.h.in - -$(RM) shtool - -$(RM) ltmain.sh libtool.m4 config.guess config.sub - -@if [ ".$(WITH_PERL)" = .yes ]; then \ - (cd $(S)/perl && $(MAKE) $(MFLAGS) realclean || true; rm -f Makefile.old); \ - fi - -@if [ ".$(WITH_PHP)" = .yes ]; then \ - (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local realclean || true); \ - fi - -@if [ ".$(WITH_PGSQL)" = .yes ]; then \ - (cd $(S)/pgsql && $(MAKE) $(MFLAGS) realclean PG_CONFIG=$(PG_CONFIG) || true); \ - fi - diff --git a/shared/ossp_uuid/NEWS b/shared/ossp_uuid/NEWS deleted file mode 100644 index 015a42cc..00000000 --- a/shared/ossp_uuid/NEWS +++ /dev/null @@ -1,42 +0,0 @@ - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - - NEWS - - This is a list of major changes to OSSP uuid. For more detailed - change descriptions, please have a look at the ChangeLog file. - - Major changes between 1.4 and 1.5 - - o Many internal code cleanups and fixes. - o Improved and fixed PostgreSQL API. - o Improved and fixed PHP API. - - Major changes between 1.3 and 1.4 - - o Added PostgreSQL API. - - Major changes between 1.2 and 1.3 - - o Added Perl TIE-style API. - o Added Perl Data::UUID backward compatibility API. - o Added C++ API. - o Added PHP API. - - Major changes between 1.1 and 1.2 - - o Added support for version 5 UUIDs (name-based, SHA-1) - - Major changes between 1.0 and 1.1 - - o Added Perl API - - Major changes between 0.9 and 1.0 - - o Initial functionality - diff --git a/shared/ossp_uuid/OVERVIEW b/shared/ossp_uuid/OVERVIEW deleted file mode 100644 index 2fb518f1..00000000 --- a/shared/ossp_uuid/OVERVIEW +++ /dev/null @@ -1,81 +0,0 @@ - - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - - OVERVIEW - - A UUID consists of 128 bits (16-octets) which are split into 6 - octet-bounded unsigned integer fields ("time_low", "time_mid", - "time_hi_and_version", "clk_seq_hi_res", "clk_seq_low" and "node") and - where two fields are multiplexed with a fixed size 4-bit "version" and - a variable sized 2-3 bit "variant" field. - - The UUID octets are counted from left to right 15 to 0 and the bits - in each octet are counted from left to right 7 to 0 (most significant - bit first, least significant bit last). The unsigned integer fields - formed out of multiple octets are stored in "network byte order" (most - significant octet first, least significant octet last). A UUID is - stored and transmitted from left to right, i.e., in "network byte - order" with the most significant octet first and the least significant - octet last. - - Illustration 1: - (single octet array, less compact, more annotations) - - - Bits: [4] [2-3] - Field: version variant - MSO -->| |<-- -->| |<-- LSO - \ | | | | / - Octet: 15 14 13 12 11 10 | |9 8 | | 7 6 5 4 3 2 1 0 - +------++------++------++------++------++------++------++------++------++------++------++------++------++------++------++------+ - UUID: | || || || || || |#### || |##: || || || || || || || | - +------++------++------++------++------++------++------++------++------++------++------++------++------++------++------++------+ - Bit: 76543210765432107654321076543210765432107654321076543210765432107654321076543210765432107654321076543210765432107654321076543210 - /| || || || || || |\ - MSB | || || || || || | LSB - |<---------------------------->||<------------>||<------------>||<---->||<---->||<-------------------------------------------->| - time_hi clk_seq clk_seq - Field: time_low time_mid _and_version _hi_res _low node - Bits: [32] [16] [16] [5-6] [8] [48] - - - Illustration 2: - (two octet arrays, more compact, less annotations) - - [4] - version - -->| |<-- - | | - | | [16] - [32] [16] | |time_hi - time_low time_mid | _and_version - |<---------------------------->||<------------>||<------------>| - | MSO || || | | - | / || || | | - | 15 14 13 12 || 11 10 || |9 8 | - 7654321076543210765432107654321076543210765432107654321076543210 - /+------++------++------++------++------++------++------++------+~ - MSB | || || || || || |#### || | ... - +------++------++------++------++------++------++------++------+~ - ~+------++------++------++------++------++------++------++------+ - ... ##: || || || || || || || | LSB - ~+------++------++------++------++------++------++------++------+/ - 7654321076543210765432107654321076543210765432107654321076543210 - | | 7 || 6 || 5 4 3 2 1 0 | - | | || || / | - | | || || LSO | - |<---->||<---->||<-------------------------------------------->| - |clk_seq clk_seq node - |_hi_res _low [48] - |[5-6] [8] - | | - -->| |<-- - variant - [2-3] - diff --git a/shared/ossp_uuid/PORTING b/shared/ossp_uuid/PORTING deleted file mode 100644 index b507a7fd..00000000 --- a/shared/ossp_uuid/PORTING +++ /dev/null @@ -1,33 +0,0 @@ - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - - PORTING - - OSSP uuid was already written with maximum portability in mind, so - there should be no great effort required to get it running on any Unix - platform with a reasonable POSIX API. Additionally, the portability - was tested by successfully building and running it on the following - particular Unix platforms (syntax is "- ()"): - - alpha-tru644.0 (cc) - alpha-tru645.1 (gcc, cc) - hppa-hpux11.11 (cc) - ia64-hpux11.23 (cc) - ix86-debian2.2 (gcc, icc) - ix86-debian3.0 (gcc) - ix86-debian3.1 (gcc) - ix86-freebsd4.9 (gcc) - ix86-freebsd5.2 (gcc, icc) - ix86-netbsd1.6 (gcc) - ix86-qnx6.2 (gcc) - ix86-solaris10 (gcc) - ix86-unixware7.1.3 (cc) - mips64-irix6.5 (gcc) - sparc64-solaris8 (gcc, forte) - sparc64-solaris9 (gcc) - diff --git a/shared/ossp_uuid/README b/shared/ossp_uuid/README deleted file mode 100644 index 53933060..00000000 --- a/shared/ossp_uuid/README +++ /dev/null @@ -1,62 +0,0 @@ - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - Version 1.6.2 (04-Jul-2008) - - ABSTRACT - - OSSP uuid is a ISO-C:1999 application programming interface (API) - and corresponding command line interface (CLI) for the generation of - DCE 1.1, ISO/IEC 11578:1996 and IETF RFC-4122 compliant Universally - Unique Identifier (UUID). It supports DCE 1.1 variant UUIDs of version - 1 (time and node based), version 3 (name based, MD5), version 4 - (random number based) and version 5 (name based, SHA-1). Additional - API bindings are provided for the languages ISO-C++:1998, Perl:5 and - PHP:4/5. Optional backward compatibility exists for the ISO-C DCE-1.1 - and Perl Data::UUID APIs. - - UUIDs are 128 bit numbers which are intended to have a high likelihood - of uniqueness over space and time and are computationally difficult - to guess. They are globally unique identifiers which can be locally - generated without contacting a global registration authority. UUIDs - are intended as unique identifiers for both mass tagging objects - with an extremely short lifetime and to reliably identifying very - persistent objects across a network. - - COPYRIGHT AND LICENSE - - Copyright (c) 2004-2008 Ralf S. Engelschall - Copyright (c) 2004-2008 The OSSP Project - - This file is part of OSSP uuid, a library for the generation - of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/ - - Permission to use, copy, modify, and distribute this software for - any purpose with or without fee is hereby granted, provided that - the above copyright notice and this permission notice appear in all - copies. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - - HOME AND DOCUMENTATION - - The documentation and latest release can be found on - - o http://www.ossp.org/pkg/lib/uuid/ - o ftp://ftp.ossp.org/pkg/lib/uuid/ - diff --git a/shared/ossp_uuid/SEEALSO b/shared/ossp_uuid/SEEALSO deleted file mode 100644 index f5a8af1e..00000000 --- a/shared/ossp_uuid/SEEALSO +++ /dev/null @@ -1,52 +0,0 @@ - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - - SEE ALSO - - Although we consider OSSP uuid the ultimate reference implementation - of an UUID generator, there are multiple alternatives available. - Following is a short reference of all currently known UUID - implementations for platforms with an Unix/POSIX API: - - o OSSP uuid (ISO-C), OSSP::uuid (Perl) - http://www.ossp.org/pkg/lib/uuid/ - http://cvs.ossp.org/ossp-pkg/uuid/ - - o FreeBSD libc (ISO-C) - http://www.freebsd.org/ - http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/uuid/ - - o Sun Solaris libc (ISO-C), DCE::UUID (Perl/XS) - http://www.opensolaris.org/ - http://cvs.opensolaris.org/source/xref/usr/src/lib/libuuid/ - - o APR libaprutil (ISO-C), APR::UUID (Perl/XS) - http://svn.apache.org/repos/asf/apr/apr-util/trunk/crypto/ - - o e2fsprogs/libuuid (ISO-C), UUID (Perl/XS) - http://e2fsprogs.sourceforge.net/ - http://thunk.org/hg/e2fsprogs/ - - o Wine rpcrt4 DLL (ISO-C) - http://www.winehq.org/ - - o Data::UUID (Perl/XS) - http://search.cpan.org/src/AGOLOMSH/ - http://www.cpan.org/modules/by-module/Data/ - - o JUG (Java/JNI) - http://www.doomdark.org/doomdark/proj/jug/ - - o Mozilla (ISO-C, ISO-C++) - http://www.mozilla.org/ - http://lxr.mozilla.org/mozilla1.7/source/calendar/libxpical/token.c - - o HelixPlayer (ISO-C, ISO-C++) - https://player.helixcommunity.org/ - common/util/chxuuid.cpp - diff --git a/shared/ossp_uuid/THANKS b/shared/ossp_uuid/THANKS deleted file mode 100644 index c126239f..00000000 --- a/shared/ossp_uuid/THANKS +++ /dev/null @@ -1,29 +0,0 @@ - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - - THANKS - - Credit has to be given to the following people who contributed ideas, - bugfixes, hints, gave platform feedback, etc. (in alphabetical order): - - o Matthias Andree - o Neil Caunt - o Neil Conway - o M. Daniel - o Simon "janus" Dassow - o Fuyuki - o Thomas Lotterer - o Roman Neuhauser - o Hrvoje Niksic - o Piotr Roszatycki - o Hiroshi Saito - o Michael Schloh - o Guerry Semones - o David Wheeler - o Wu Yongwei - diff --git a/shared/ossp_uuid/TODO b/shared/ossp_uuid/TODO deleted file mode 100644 index 9bf2bdb6..00000000 --- a/shared/ossp_uuid/TODO +++ /dev/null @@ -1,23 +0,0 @@ - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - - TODO - ==== - - - - - CANDO - ===== - - - allow to re-create version 1 UUIDs by specifying time, etc. - - getopt_long support for CLI? - - a more sophisticated test suite with UUID references?! - - more platform support in uuid_mac.c?! - - global memory locking according to standard hints?? - - persistent/non-volatile state writing according to standard hints?? - diff --git a/shared/ossp_uuid/USERS b/shared/ossp_uuid/USERS deleted file mode 100644 index 9ce7ed4f..00000000 --- a/shared/ossp_uuid/USERS +++ /dev/null @@ -1,49 +0,0 @@ - _ ___ ____ ____ ____ _ _ - |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| | - _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` | - |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| | - |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_| - - OSSP uuid - Universally Unique Identifier - - USERS - - OSSP uuid is known to be used by at least the following - Open Source software packages: - - o PostgreSQL - Relational Database Management System (RDBMS) - http://www.postgresql.org/ - - o Aegis - Software Configuration Management (SCM) System - http://aegis.sourceforge.net/ - - o Heartbeat - Core component of the High-Availability Linux (Linux-HA) project - http://linux-ha.org/heartbeat/ - - o GAT - Grid Application Toolkit (GAT) - https://www.gridlab.org/WorkPackages/wp-1/ - - o Menes - High-Level C++ Library for mutexes, networking, etc. - http://www.saurik.com/ - http://svn.saurik.com/repos/menes/trunk/ - - o OpenAether OAPR - C++ wrapper for NSPR - http://www.openaether.org/oapr.html - - o Gauche Scheme Interpreter, UUID extension - http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/gauche/Gauche-uuid/ - http://www.shiro.dreamhost.com/scheme/gauche/ - - o Guile Extension Examples (GEE) - https://gna.org/projects/gee - - o CGI::Session::ID::uuid - UUID based ID generator backend for CGI::Session - http://www.cpan.org/modules/by-authors/id/RSE/ - diff --git a/shared/ossp_uuid/aclocal.m4 b/shared/ossp_uuid/aclocal.m4 deleted file mode 100644 index b7204ce7..00000000 --- a/shared/ossp_uuid/aclocal.m4 +++ /dev/null @@ -1,352 +0,0 @@ -dnl ## -dnl ## SA - OSSP Socket Abstraction Library -dnl ## Copyright (c) 2001-2003 Ralf S. Engelschall -dnl ## Copyright (c) 2001-2003 The OSSP Project -dnl ## Copyright (c) 2001-2003 Cable & Wireless Deutschland -dnl ## -dnl ## This file is part of OSSP SA, a socket abstraction library which -dnl ## can be found at http://www.ossp.org/pkg/sa/. -dnl ## -dnl ## Permission to use, copy, modify, and distribute this software for -dnl ## any purpose with or without fee is hereby granted, provided that -dnl ## the above copyright notice and this permission notice appear in all -dnl ## copies. -dnl ## -dnl ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -dnl ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -dnl ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -dnl ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR -dnl ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -dnl ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -dnl ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -dnl ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -dnl ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -dnl ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -dnl ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -dnl ## SUCH DAMAGE. -dnl ## -dnl ## aclocal.m4: GNU Autoconf local macro definitions -dnl ## - -dnl ## -dnl ## Check whether compiler option works -dnl ## -dnl ## configure.in: -dnl ## AC_COMPILER_OPTION(, ,