diff options
298 files changed, 10500 insertions, 6690 deletions
diff --git a/Application.cpp b/Application.cpp index 6b17bc19..7e11b4d1 100644 --- a/Application.cpp +++ b/Application.cpp @@ -1,9 +1,9 @@ -/*************************************************************** - * Purpose: Code for Application Class - * Author: ZenJu (zhnmju123@gmx.de) - * Created: 2008-07-16 - **************************************************************/ - +// ************************************************************************** +// * 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 "application.h" #include "ui/mainDialog.h" #include <wx/msgdlg.h> @@ -31,7 +31,7 @@ using FreeFileSync::CustomLocale; -IMPLEMENT_APP(Application); +IMPLEMENT_APP(Application) bool Application::OnInit() { @@ -70,16 +70,7 @@ void Application::OnStartApplication(wxIdleEvent&) SetAppName(wxT("FreeFileSync")); #ifdef FFS_LINUX - ::gtk_rc_parse("styles.rc"); //remove inner border from bitmap buttons -#endif - - //initialize help controller - helpController.reset(new wxHelpController); - helpController->Initialize(FreeFileSync::getInstallationDir() + -#ifdef FFS_WIN - wxT("FreeFileSync.chm")); -#elif defined FFS_LINUX - wxT("Help/FreeFileSync.hhp")); + ::gtk_rc_parse(FreeFileSync::wxToZ(FreeFileSync::getResourceDir()) + "styles.rc"); //remove inner border from bitmap buttons #endif //test if FFS is to be started on UI with config file passed as commandline parameter @@ -111,7 +102,7 @@ void Application::OnStartApplication(wxIdleEvent&) } catch (const xmlAccess::XmlError& error) { - if (wxFileExists(FreeFileSync::getGlobalConfigFile())) + if (wxFileExists(xmlAccess::getGlobalConfigFile())) { //show messagebox and continue if (error.getSeverity() == xmlAccess::XmlError::WARNING) @@ -167,7 +158,7 @@ int Application::OnRun() catch (const std::exception& e) //catch all STL exceptions { //unfortunately it's not always possible to display a message box in this erroneous situation, however (non-stream) file output always works! - wxFile safeOutput(FreeFileSync::getLastErrorTxtFile(), wxFile::write); + wxFile safeOutput(FreeFileSync::getConfigDir() + wxT("LastError.txt"), wxFile::write); safeOutput.Write(wxString::FromAscii(e.what())); wxMessageBox(wxString::FromAscii(e.what()), _("An exception occured!"), wxOK | wxICON_ERROR); @@ -192,16 +183,13 @@ int Application::OnExit() wxMessageBox(error.show(), _("Error"), wxOK | wxICON_ERROR); } - //delete help provider: "Cross-Platform GUI Programming with wxWidgets" says this should be done here... - helpController.reset(); - return 0; } void Application::runGuiMode(const wxString& cfgFileName, xmlAccess::XmlGlobalSettings& settings) { - MainDialog* frame = new MainDialog(NULL, cfgFileName, settings, *helpController); + MainDialog* frame = new MainDialog(NULL, cfgFileName, settings); frame->SetIcon(*GlobalResources::getInstance().programIcon); //set application icon frame->Show(); @@ -227,26 +215,24 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet } //all settings have been read successfully... - //regular check for program updates - if (!batchCfg.silent) - FreeFileSync::checkForUpdatePeriodically(globSettings.lastUpdateCheck); - + //regular check for program updates -> disabled for batch + //if (!batchCfg.silent) + // FreeFileSync::checkForUpdatePeriodically(globSettings.lastUpdateCheck); try //begin of synchronization process (all in one try-catch block) { //class handling status updates and error messages std::auto_ptr<BatchStatusHandler> statusHandler; //delete object automatically if (batchCfg.silent) - statusHandler.reset(new BatchStatusHandler(true, &batchCfg.logFileDirectory, batchCfg.handleError, returnValue)); + statusHandler.reset(new BatchStatusHandler(true, filename, &batchCfg.logFileDirectory, batchCfg.handleError, returnValue)); else - statusHandler.reset(new BatchStatusHandler(false, NULL, batchCfg.handleError, returnValue)); + statusHandler.reset(new BatchStatusHandler(false, filename, NULL, batchCfg.handleError, returnValue)); //COMPARE DIRECTORIES FreeFileSync::FolderComparison folderCmp; FreeFileSync::CompareProcess comparison(batchCfg.mainCfg.hidden.traverseDirectorySymlinks, batchCfg.mainCfg.hidden.fileTimeTolerance, globSettings.ignoreOneHourDiff, - globSettings.detectRenameThreshold, globSettings.optDialogs, statusHandler.get()); @@ -276,7 +262,7 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet synchronization.startSynchronizationProcess(syncProcessCfg, folderCmp); //play (optional) sound notification after sync has completed (GUI and batch mode) - const wxString soundFile = FreeFileSync::getInstallationDir() + wxT("Sync_Complete.wav"); + const wxString soundFile = FreeFileSync::getResourceDir() + wxT("Sync_Complete.wav"); if (FreeFileSync::fileExists(FreeFileSync::wxToZ(soundFile))) wxSound::Play(soundFile, wxSOUND_ASYNC); } diff --git a/Application.h b/Application.h index 8d5a0fcf..8287b9be 100644 --- a/Application.h +++ b/Application.h @@ -1,16 +1,14 @@ -/*************************************************************** - * Name: FreeFileSyncApp.h - * Purpose: Defines Application Class - * Author: ZenJu (zhnmju123@gmx.de) - * Created: 2008-07-16 - **************************************************************/ - +// ************************************************************************** +// * 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 FREEFILESYNCAPP_H #define FREEFILESYNCAPP_H #include <wx/app.h> #include "library/processXml.h" -#include <wx/help.h> class Application : public wxApp @@ -27,8 +25,6 @@ private: void runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSettings& globSettings); xmlAccess::XmlGlobalSettings globalSettings; //settings used by GUI, batch mode or both - - boost::shared_ptr<wxHelpController> helpController; //global help controller int returnValue; }; diff --git a/BUILD/Changelog.txt b/BUILD/Changelog.txt index 5bc1a41b..9507ff6f 100644 --- a/BUILD/Changelog.txt +++ b/BUILD/Changelog.txt @@ -2,6 +2,27 @@ |FreeFileSync| -------------- +Changelog v3.4 +-------------- +Performance: Reduced Recycle Bin access time by 90% +Recycle Bin support for Linux +Performance: Reduced binary comparison sequential read time (by up to 75% for CD/DVD access) +Improved synchronization sequence to avoid disk space shortage: overwrite large files by small ones first +Fixed problems with file renaming on Samba share +New free text grid search via shortcuts CTRL + F and F3 +Show number of processed files at end of synchronization +New optional grid column: file extension +New comparison category icons +Fixed handling sync-config of first folder pair +Allow moving main dialog by dragging client area instead of title bar only +Enhanced helpfile: Run RealtimeSync as Service +Prefix logfiles with name of batchjob +Fixed GUI right-to-left mirroring for locales Hebrew and Arabic +Portable version: save configuration in installation folder +Many small GUI enhancements +Updated translation files + + Changelog v3.3 -------------- New installer package for portable/local/32/64-bit versions diff --git a/BUILD/FreeFileSync.chm b/BUILD/FreeFileSync.chm Binary files differindex 139df0e1..1e1b085f 100644 --- a/BUILD/FreeFileSync.chm +++ b/BUILD/FreeFileSync.chm diff --git a/BUILD/Help/FreeFileSync.hhp b/BUILD/Help/FreeFileSync.hhp index a59f966c..96e57799 100644 --- a/BUILD/Help/FreeFileSync.hhp +++ b/BUILD/Help/FreeFileSync.hhp @@ -27,6 +27,7 @@ html\advanced\DaylightSavingTime.html html\advanced\EnvironmentVariables.html html\advanced\RealtimeSync.html html\advanced\ShadowCopy.html +html\advanced\RunAsService.html [INFOTYPES] diff --git a/BUILD/Help/Table of Contents.hhc b/BUILD/Help/Table of Contents.hhc index 01f73ef5..f262f543 100644 --- a/BUILD/Help/Table of Contents.hhc +++ b/BUILD/Help/Table of Contents.hhc @@ -61,6 +61,10 @@ <param name="Local" value="html\advanced\RealtimeSync.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> + <param name="Name" value="Run as Service"> + <param name="Local" value="html\advanced\RunAsService.html"> + </OBJECT> + <LI> <OBJECT type="text/sitemap"> <param name="Name" value="Schedule a Batch Job"> <param name="Local" value="html\advanced\ScheduleBatch.html"> </OBJECT> diff --git a/BUILD/Help/html/Features.html b/BUILD/Help/html/Features.html index 7a40fcdb..195794b2 100644 --- a/BUILD/Help/html/Features.html +++ b/BUILD/Help/html/Features.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.1 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20100124;542600"> + <META NAME="CHANGED" CONTENT="20100207;17105100"> <STYLE TYPE="text/css"> <!-- @page { margin: 2cm } @@ -98,7 +98,7 @@ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Handle daylight saving time changes on FAT/FAT32 volumes correctly.</FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Portable - version (.zip) available.</FONT></P> + version available.</FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Native 64-Bit version.</FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Check diff --git a/BUILD/Help/html/advanced/069dee95-d329-4e99-ab3d-678edf80fbca.jpeg b/BUILD/Help/html/advanced/069dee95-d329-4e99-ab3d-678edf80fbca.jpeg Binary files differnew file mode 100644 index 00000000..3a7b7565 --- /dev/null +++ b/BUILD/Help/html/advanced/069dee95-d329-4e99-ab3d-678edf80fbca.jpeg diff --git a/BUILD/Help/html/advanced/17e8fbfe-a994-4860-abaa-e00e0289b44c.jpeg b/BUILD/Help/html/advanced/17e8fbfe-a994-4860-abaa-e00e0289b44c.jpeg Binary files differnew file mode 100644 index 00000000..78274f6d --- /dev/null +++ b/BUILD/Help/html/advanced/17e8fbfe-a994-4860-abaa-e00e0289b44c.jpeg diff --git a/BUILD/Help/html/advanced/7aa44556-38dc-467e-9902-2c9143cd0116.jpeg b/BUILD/Help/html/advanced/7aa44556-38dc-467e-9902-2c9143cd0116.jpeg Binary files differnew file mode 100644 index 00000000..f158af02 --- /dev/null +++ b/BUILD/Help/html/advanced/7aa44556-38dc-467e-9902-2c9143cd0116.jpeg diff --git a/BUILD/Help/html/advanced/93f0cb09-bd16-4d76-b764-e30042a8e123.jpeg b/BUILD/Help/html/advanced/93f0cb09-bd16-4d76-b764-e30042a8e123.jpeg Binary files differnew file mode 100644 index 00000000..673b074c --- /dev/null +++ b/BUILD/Help/html/advanced/93f0cb09-bd16-4d76-b764-e30042a8e123.jpeg diff --git a/BUILD/Help/html/advanced/EnvironmentVariables.html b/BUILD/Help/html/advanced/EnvironmentVariables.html index c3e80ce7..a85be8fd 100644 --- a/BUILD/Help/html/advanced/EnvironmentVariables.html +++ b/BUILD/Help/html/advanced/EnvironmentVariables.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.0 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20091217;17435700"> + <META NAME="CHANGED" CONTENT="20100218;65300"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -37,10 +37,10 @@ environment variables can also be used.</FONT></P> <P><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> <UL> <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">C:\Backup\%USERNAME%_Config </FONT>expands + <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">C:\Backup\%USERNAME%_Config </FONT>expands to<FONT FACE="Courier New, monospace"><BR>C:\Backup\ZenJu_Config</FONT></FONT></P> <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">%APPDATA%\FreeFileSync </FONT>expands + <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">%APPDATA%\FreeFileSync </FONT>expands to<FONT FACE="Courier New, monospace"><BR>C:\Documents and Settings\ZenJu\Application Data\FreeFileSync</FONT></FONT></P> </UL> @@ -69,7 +69,7 @@ batch configuration file <FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batc MyVar=C:\Target<BR>cd "C:\Program files\FreeFileSync"<BR>FreeFileSync.exe C:\SyncJob.ffs_batch </FONT>(-><FONT FACE="Courier New, monospace">%MyVar% </FONT>is - replaced with <FONT FACE="Courier New, monospace">C:\Target </FONT>during + replaced by <FONT FACE="Courier New, monospace">C:\Target </FONT>during execution)</FONT></P> </UL> </SPAN><BR CLEAR=LEFT> diff --git a/BUILD/Help/html/advanced/RunAsService.html b/BUILD/Help/html/advanced/RunAsService.html new file mode 100644 index 00000000..ea1e4f2c --- /dev/null +++ b/BUILD/Help/html/advanced/RunAsService.html @@ -0,0 +1,116 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> + <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> + <TITLE></TITLE> + <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.0 (Win32)"> + <META NAME="CREATED" CONTENT="20091206;16574000"> + <META NAME="CHANGED" CONTENT="20100218;105200"> + <META NAME="Info 1" CONTENT=""> + <META NAME="Info 2" CONTENT=""> + <META NAME="Info 3" CONTENT=""> + <META NAME="Info 4" CONTENT=""> + <STYLE TYPE="text/css"> + <!-- + @page { margin: 2cm } + P { margin-bottom: 0.21cm } + H3 { margin-bottom: 0.21cm } + H3.western { font-family: "Arial", sans-serif } + H3.cjk { font-family: "MS Mincho" } + A:link { so-language: zxx } + --> + </STYLE> +</HEAD> +<BODY LANG="en-US" DIR="LTR"> +<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Run RealtimeSync +as a Service <SPAN STYLE="font-weight: normal">(Windows only)</SPAN></FONT></H3> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The +following step-by-step guide describes how to setup RealtimeSync (or +any other application) as a Windows Service. This can be useful if +the tool shall run on a SYSTEM account without necessarily requiring +a user to log in.</FONT></P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">1. Get +access to the command-line tools "</FONT><FONT FACE="Courier New, monospace">instsrv.exe</FONT><FONT FACE="Tahoma, sans-serif">" +and "</FONT><FONT FACE="Courier New, monospace">srvany.exe</FONT><FONT FACE="Tahoma, sans-serif">" +which come with the Windows Server 2003 Resource Kit Tools:</FONT></P> +<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Download: +<A HREF="http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en">http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en</A></FONT></P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">2. +Create and register a new Service via command line:</FONT></P> +<UL> + <P STYLE="margin-right: 0.98cm"><SPAN ID="Rahmen4" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Courier New, monospace">instsrv <ServiceName> + <PathToResourceKit>\srvany.exe</FONT></P> + </SPAN><BR CLEAR=LEFT> <BR><IMG SRC="RunAsService_html_4f230a46.jpg" NAME="Grafik9" ALIGN=BOTTOM WIDTH=430 HEIGHT=107 BORDER=0></P> +</UL> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">3. Link +the new Service with RealtimeSync:</FONT></P> +<UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open + the Registry editor (Regedit.exe) and navigate to key + "</FONT><FONT FACE="Courier New, monospace">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<ServiceName></FONT><FONT FACE="Tahoma, sans-serif">"</FONT></P> + <P STYLE="margin-bottom: 0cm"></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Add + a new key "</FONT><FONT FACE="Courier New, monospace">Parameters</FONT><FONT FACE="Tahoma, sans-serif">".<BR><IMG SRC="bf02de4e-7b45-4353-97e8-85b55cff3ac5.jpeg" NAME="Grafik8" ALIGN=BOTTOM WIDTH=249 HEIGHT=101 BORDER=0></FONT></P> + <P STYLE="margin-bottom: 0cm"></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Add + a new String value named "</FONT><FONT FACE="Courier New, monospace">Application</FONT><FONT FACE="Tahoma, sans-serif">" + and specify a command line that shall be executed as value.<BR><IMG SRC="RunAsService_html_m3be0f332.jpg" NAME="Grafik10" ALIGN=BOTTOM WIDTH=620 HEIGHT=58 BORDER=0></FONT></P> +</UL> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">That's +it!</FONT></P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The new +service can now be started via commandline or Windows Service +administration:</FONT></P> +<UL> + <P STYLE="margin-right: 0.98cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif">net start <ServiceName></FONT></P> + </SPAN><BR CLEAR=LEFT> <BR><IMG SRC="17e8fbfe-a994-4860-abaa-e00e0289b44c.jpeg" NAME="Grafik5" ALIGN=BOTTOM WIDTH=640 HEIGHT=55 BORDER=0><BR> <BR><IMG SRC="7aa44556-38dc-467e-9902-2c9143cd0116.jpeg" NAME="Grafik1" ALIGN=BOTTOM WIDTH=548 HEIGHT=291 BORDER=0></P> +</UL> +<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><BR> +</P> +<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen7" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif"><B>Note:</B><BR>By default the + service is created with startup type "automatic" which + runs it on Windows start. This behavior can be changed in Windows + Service administration.</FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><IMG SRC="RunAsService_html_m3e56d901.jpg" NAME="Grafik6" ALIGN=BOTTOM WIDTH=410 HEIGHT=468 BORDER=0></P> +<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><BR> +</P> +<P ALIGN=LEFT STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If the +Service shall be removed from the system, enter via command line:</FONT></P> +<UL> + <P STYLE="margin-right: 0.98cm"><SPAN ID="Rahmen6" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif">instsrv <ServiceName> remove</FONT></P> + </SPAN><BR CLEAR=LEFT> <BR><IMG SRC="RunAsService_html_68e0fe53.jpg" NAME="Grafik7" ALIGN=MIDDLE WIDTH=640 HEIGHT=52 BORDER=0></P> +</UL> +<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><BR> +</P> +<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">(Reference: +<A HREF="http://support.microsoft.com/kb/137890">http://support.microsoft.com/kb/137890</A>)</FONT></P> +</BODY> +</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/advanced/RunAsService_html_4f230a46.jpg b/BUILD/Help/html/advanced/RunAsService_html_4f230a46.jpg Binary files differnew file mode 100644 index 00000000..df346c8f --- /dev/null +++ b/BUILD/Help/html/advanced/RunAsService_html_4f230a46.jpg diff --git a/BUILD/Help/html/advanced/RunAsService_html_68e0fe53.jpg b/BUILD/Help/html/advanced/RunAsService_html_68e0fe53.jpg Binary files differnew file mode 100644 index 00000000..9b0638ba --- /dev/null +++ b/BUILD/Help/html/advanced/RunAsService_html_68e0fe53.jpg diff --git a/BUILD/Help/html/advanced/RunAsService_html_m3be0f332.jpg b/BUILD/Help/html/advanced/RunAsService_html_m3be0f332.jpg Binary files differnew file mode 100644 index 00000000..93e70d1b --- /dev/null +++ b/BUILD/Help/html/advanced/RunAsService_html_m3be0f332.jpg diff --git a/BUILD/Help/html/advanced/RunAsService_html_m3e56d901.jpg b/BUILD/Help/html/advanced/RunAsService_html_m3e56d901.jpg Binary files differnew file mode 100644 index 00000000..e02d95d9 --- /dev/null +++ b/BUILD/Help/html/advanced/RunAsService_html_m3e56d901.jpg diff --git a/BUILD/Help/html/advanced/ScheduleBatch.html b/BUILD/Help/html/advanced/ScheduleBatch.html index bb956401..4df27850 100644 --- a/BUILD/Help/html/advanced/ScheduleBatch.html +++ b/BUILD/Help/html/advanced/ScheduleBatch.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.0 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20100118;18123600"> + <META NAME="CHANGED" CONTENT="20100301;18020000"> <STYLE TYPE="text/css"> <!-- @page { margin: 2cm } @@ -30,8 +30,12 @@ XP)</SPAN></FONT></H3> it, for example, as "<FONT FACE="Courier New, monospace">C:\SyncJob.ffs_ batch</FONT>".</FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Make - sure you enable checkbox "<I>silent mode</I>" to prevent + sure you enable checkbox "<I>Silent mode</I>" to prevent showing a status dialog at the end of the process.</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If + you want to avoid error or warning popup messages from stopping the + process set "<I>Error handling</I>" to either "<I>Exit + instantly</I>" or "<I>Ignore errors</I>".</FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start Windows Task Scheduler: Go to <I>Start->Control Panel->Scheduled Tasks</I> and select "<I>Add Scheduled Task</I>".</FONT></P> @@ -40,27 +44,16 @@ XP)</SPAN></FONT></H3> as program to run.</FONT></P> <UL> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If - you are using the installer-based version of FreeFileSync, + you are using the locally installed version of FreeFileSync, </FONT><FONT FACE="Courier New, monospace">*.ffs_batch</FONT> <FONT FACE="Tahoma, sans-serif">files are automatically associated with the tool and field "</FONT><FONT FACE="Tahoma, sans-serif"><I>Run:</I></FONT><FONT FACE="Tahoma, sans-serif">" - can be filled with the filename directly:<BR>"</FONT><FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch</FONT><FONT FACE="Tahoma, sans-serif">"<BR><IMG SRC="scheduleBatch_html_m22c860a2.gif" NAME="Grafik1" ALIGN=BOTTOM WIDTH=406 HEIGHT=455 BORDER=0></FONT></P> + can be directly filled with the filename:<BR>"</FONT><FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch</FONT><FONT FACE="Tahoma, sans-serif">"<BR><IMG SRC="ScheduleBatch_html_372f0f3.gif" NAME="Grafik1" ALIGN=BOTTOM WIDTH=406 HEIGHT=455 BORDER=0></FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If - file associations have not been set (portable/zip-version),</FONT> + file associations have not been set (portable installation),</FONT> "<FONT FACE="Tahoma, sans-serif"><I>Run:</I></FONT><FONT FACE="Tahoma, sans-serif">" has to be prefixed with the executable:<BR>"D</FONT><FONT FACE="Courier New, monospace">:\FreeFileSync\FreeFileSync.exe" - "C:\SyncJob.ffs_batch</FONT><FONT FACE="Tahoma, sans-serif">"<BR><IMG SRC="scheduleBatch_html_28bb3203.gif" NAME="Grafik2" ALIGN=BOTTOM WIDTH=406 HEIGHT=455 BORDER=0></FONT></P> - <P><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif"><B>Attention:</B><BR>The portable - version of FreeFileSync reads/writes all global settings from the - current working directory, while the installer based version uses - "<FONT FACE="Courier New, monospace">%appdata%\FreeFileSync</FONT>". - So in former case make sure the working directory is filled - appropriately in field "<I>Start in:</I>" to point to - the directory containing respective GlobalSettings.xml.</FONT></P> - </SPAN><BR CLEAR=LEFT> - </P> + "C:\SyncJob.ffs_batch</FONT><FONT FACE="Tahoma, sans-serif">"<BR><IMG SRC="ScheduleBatch_html_m10bf0d36.gif" NAME="Grafik2" ALIGN=BOTTOM WIDTH=406 HEIGHT=455 BORDER=0></FONT></P> </UL> </OL> </BODY> diff --git a/BUILD/Help/html/advanced/ScheduleBatch_html_372f0f3.gif b/BUILD/Help/html/advanced/ScheduleBatch_html_372f0f3.gif Binary files differnew file mode 100644 index 00000000..4cddbc19 --- /dev/null +++ b/BUILD/Help/html/advanced/ScheduleBatch_html_372f0f3.gif diff --git a/BUILD/Help/html/advanced/ScheduleBatch_html_m10bf0d36.gif b/BUILD/Help/html/advanced/ScheduleBatch_html_m10bf0d36.gif Binary files differnew file mode 100644 index 00000000..ed8f077f --- /dev/null +++ b/BUILD/Help/html/advanced/ScheduleBatch_html_m10bf0d36.gif diff --git a/BUILD/Help/html/advanced/SendMail.html b/BUILD/Help/html/advanced/SendMail.html index 0946de2b..d8fc7e9d 100644 --- a/BUILD/Help/html/advanced/SendMail.html +++ b/BUILD/Help/html/advanced/SendMail.html @@ -3,9 +3,9 @@ <HEAD> <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> <TITLE></TITLE> - <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.1 (Win32)"> + <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20091231;16373900"> + <META NAME="CHANGED" CONTENT="20100228;21172600"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -28,13 +28,14 @@ Batch Mode and send error notification via email</FONT></H3> </P> <OL> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Create - a FreeFileSync batch file using "<I>silent mode</I>".</FONT></P> + a FreeFileSync batch file using "<I>Si</I><I>lent mode</I>".</FONT></P> + <P STYLE="margin-bottom: 0cm"></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Set - error handling to "<I>Exit with Returncode < 0</I>" or - "<I>ignore errors</I>" to avoid having a popup stop the - program flow. In case errors occur FreeFileSync will exit with a - returncode < 0 which can be checked via the ERRORLEVEL batch - command.</FONT></P> + error handling to "<I>Exit instantly</I>" or "<I>Ig</I><I>nore + errors</I>" to avoid having a popup stop the program flow. In + case errors occur FreeFileSync will exit with a returncode < 0 + that can be checked via the ERRORLEVEL batch command.</FONT></P> + <P STYLE="margin-bottom: 0cm"></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Create a *.cmd or *.bat file to specify the location of FreeFileSync.exe and pass the name of the FreeFileSync batch file as first argument; diff --git a/BUILD/Help/html/advanced/VariableDrive.html b/BUILD/Help/html/advanced/VariableDrive.html index 975995cf..10e26e57 100644 --- a/BUILD/Help/html/advanced/VariableDrive.html +++ b/BUILD/Help/html/advanced/VariableDrive.html @@ -3,9 +3,9 @@ <HEAD> <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> <TITLE></TITLE> - <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.0 (Win32)"> + <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20091213;19170300"> + <META NAME="CHANGED" CONTENT="20100228;21090900"> <STYLE TYPE="text/css"> <!-- @page { margin: 2cm } @@ -38,19 +38,11 @@ the following workflow is possible:</FONT></P> one:<BR>E.g. "<FONT FACE="Courier New, monospace">E:\SyncDir</FONT>" -> "<FONT FACE="Courier New, monospace">\SyncDir</FONT>"</FONT></P> <P STYLE="margin-bottom: 0cm"></P> - </OL> -</UL> -<UL> - <OL> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Save and copy synchronization settings to the USB stick: - "<FONT FACE="Courier New, monospace">E:\settings.ffs_gui</FONT>"</FONT></P> - </OL> -</UL> -<UL> - <OL> + "</FONT><FONT COLOR="#000000"><FONT FACE="Courier New, monospace"><FONT SIZE=3>E:\settings.ffs_gui"</FONT></FONT></FONT></P> <P STYLE="margin-bottom: 0cm"></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">"Start FreeFileSync by double-clicking on "</FONT><FONT FACE="Courier New, monospace">E:\settings.ffs_gui</FONT><FONT FACE="Tahoma, sans-serif">"<BR>=> Working directory automatically is set to "</FONT><FONT FACE="Courier New, monospace">E:\</FONT><FONT FACE="Tahoma, sans-serif">" by the operating system so that "</FONT><FONT FACE="Courier New, monospace">\SyncDir</FONT><FONT FACE="Tahoma, sans-serif">" diff --git a/BUILD/Help/html/advanced/bf02de4e-7b45-4353-97e8-85b55cff3ac5.jpeg b/BUILD/Help/html/advanced/bf02de4e-7b45-4353-97e8-85b55cff3ac5.jpeg Binary files differnew file mode 100644 index 00000000..289665f6 --- /dev/null +++ b/BUILD/Help/html/advanced/bf02de4e-7b45-4353-97e8-85b55cff3ac5.jpeg diff --git a/BUILD/Help/html/advanced/ce1ccceb-e3c6-4fab-adac-ef16f36698b0.jpeg b/BUILD/Help/html/advanced/ce1ccceb-e3c6-4fab-adac-ef16f36698b0.jpeg Binary files differnew file mode 100644 index 00000000..2508296c --- /dev/null +++ b/BUILD/Help/html/advanced/ce1ccceb-e3c6-4fab-adac-ef16f36698b0.jpeg diff --git a/BUILD/Help/html/advanced/f1d462c4-3bd9-4463-a858-ae3de5f6af9e.jpeg b/BUILD/Help/html/advanced/f1d462c4-3bd9-4463-a858-ae3de5f6af9e.jpeg Binary files differnew file mode 100644 index 00000000..00b66c40 --- /dev/null +++ b/BUILD/Help/html/advanced/f1d462c4-3bd9-4463-a858-ae3de5f6af9e.jpeg diff --git a/BUILD/Languages/chinese_simple.lng b/BUILD/Languages/chinese_simple.lng index 1d7b11dc..a8d02a01 100644 --- a/BUILD/Languages/chinese_simple.lng +++ b/BUILD/Languages/chinese_simple.lng @@ -40,26 +40,26 @@ 关于(&A)... &Advanced 高级(&A) -&Apply -应用(&Y) &Cancel å–消(&C) &Check for new version 检查更新(&C) &Content 内容(&C) -&Create batch job -创建批处ç†ä½œä¸š(&C) +&Create batch job... +创建批处ç†ä½œä¸š(&C)... &Default 默认(&D) &Exit 退出(&E) -&Export file list -导出文件列表(&E) +&Export file list... +导出文件列表(&E)... &File 文件(&F) -&Global settings -全局设置(&G) +&Find next +查找下一个(&F) +&Global settings... +全局设置(&G)... &Help 帮助(&H) &Ignore @@ -68,8 +68,8 @@ 切æ¢è¯è¨€(&L) &Load åŠ è½½(&L) -&Load configuration -åŠ è½½é…ç½®(&L) +&Load configuration... +åŠ è½½é…ç½®(&L)... &New 新建(&N) &No @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: FreeFileSync 有新版å¯ç”¨: Abort requested: Waiting for current operation to finish... å–消请求: æ£åœ¨ç‰å¾…当å‰æ“作完æˆ... +Abort synchronization immediately +ç«‹å³ä¸æ¢åŒæ¥ Aborted å·²å–消 About @@ -202,14 +204,12 @@ Browse æµè§ˆ Build: å¼€å‘: -Cancel -å–消 Cannot determine sync-direction: ä¸èƒ½æ£€æµ‹åŒæ¥æ–¹å‘: +Cannot find %x +找ä¸åˆ° %x Category 分类 -Change direction -改å˜æ–¹å‘ Comma separated list 逗å·åˆ†éš”的列表 Command line @@ -274,8 +274,8 @@ Copy locked files å¤åˆ¶è¢«é”定的文件 Copy new or updated files to right folder. å¤åˆ¶æ–°çš„或修改过的文件到å³ä¾§æ–‡ä»¶å¤¹ -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 å¤åˆ¶åˆ°å‰ªè´´æ¿\tCTRL+C Copying file %x to %y @@ -308,6 +308,8 @@ DECISION TREE 决ç–æ ‘ Data remaining: 剩余数æ®: +Data transferred: +å·²ä¼ é€çš„æ•°æ®: Data verification error: Source and target file have different content! æ•°æ®æ ¡éªŒé”™è¯¯:æºæ–‡ä»¶å’Œç›®æ ‡æ–‡ä»¶å†…容ä¸åŒ! Date @@ -326,8 +328,8 @@ Delete on both sides ä»Žä¸¤ä¾§åˆ é™¤ Delete on both sides even if the file is selected on one side only ä»Žä¸¤ä¾§åˆ é™¤(å³ä½¿ä»…在一侧选择文件) -Delete or overwrite files permanently. -æ°¸ä¹…æ€§åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶ã€‚ +Delete or overwrite files permanently +æ°¸ä¹…æ€§åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶ Delete permanently æ°¸ä¹…æ€§åˆ é™¤ Deleting file %x @@ -376,6 +378,8 @@ Error copying file: å¤åˆ¶æ–‡ä»¶å‡ºé”™: Error copying locked file %x! å¤åˆ¶å·²é”定的文件时出错 %x! +Error copying symbolic link: +å¤åˆ¶ç¬¦å·é“¾æŽ¥æ—¶å‡ºé”™: Error creating directory: 创建目录出错: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: 读å–文件出错: Error reading from synchronization database: 从åŒæ¥æ•°æ®åº“ä¸è¯»å–时出错: -Error resolving full path name: -解决完整路径时出错: Error resolving symbolic link: 解决符å·é“¾æŽ¥å‡ºé”™: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily 暂时排除 Exclude via filter: 通过过滤器排除: -Exit immediately and set returncode < 0 -ç«‹å³é€€å‡ºï¼Œå¹¶è®¾ç½®è¿”回ç <0 -Exit with RC < 0 -退出并设置返回ç <0 +Exit instantly +ç«‹å³é€€å‡º +Extension +扩展å External applications å¤–éƒ¨åº”ç”¨ç¨‹åº Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de 文件 %x 的时间差异å°äºŽ1å°æ—¶ï¼\n\n由于å¤ä»¤æ—¶çš„é—®é¢˜å› æ¤ä¸èƒ½å®‰å…¨åœ°åˆ¤æ–哪一个比较新. Files %x have the same date but a different size! 文件 %x 日期相åŒä½†å¤§å°ä¸åŒ! -Files are found equal if\n - file content\nis the same. +Files are found equal if\n - file content\nis the same 如果文件内容相åŒåˆ™è®¤ä¸ºä¸¤è€…ç›¸åŒ -Files are found equal if\n - filesize\n - last write time and date\nare the same. -如果文件大å°å’Œæœ€åŽä¿®æ”¹æ—¶é—´å’Œæ—¥æœŸç›¸åŒåˆ™è®¤ä¸ºä¸¤è€…相åŒ. +Files are found equal if\n - filesize\n - last write time and date\nare the same +如果文件大å°å’Œæœ€åŽä¿®æ”¹æ—¶é—´å’Œæ—¥æœŸç›¸åŒåˆ™è®¤ä¸ºä¸¤è€…ç›¸åŒ Files remaining: 剩余文件: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer 两侧都有,å³ä¾§è¾ƒæ–°çš„文件 Files/folders found: 找到的文件/文件夹数: +Files/folders processed: +已处ç†çš„文件/文件夹: Files/folders remaining: 文件/文件夹剩余: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view 过滤查看 Filtering is deactivated 过滤为éžæ´»è·ƒçŠ¶æ€ +Find +查找 +Find what: +è¦æŸ¥æ‰¾ä»€ä¹ˆ: Folder Comparison and Synchronization 文件夹比较与åŒæ¥ Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: åˆå§‹åŒ–åŒæ¥: Integrate external applications into context menu. The following macros are available: 集æˆå¤–部应用程åºåˆ°å³é”®èœå•. 如下å®å¯ç”¨: +Last synchronization not completed! +最åŽä¸€æ¬¡åŒæ¥æœªå®Œæˆ! Leave as unresolved conflict é—ç•™ä¸ºæœªè§£å†³çš„å†²çª Left @@ -610,6 +620,8 @@ Logging 记录 Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. ä¸æ”¯æŒåœ¨WOW64上使用å·å½±å¤åˆ¶. 请使用 FreeFileSync 64ä½ç‰ˆæœ¬. +Match case +匹é…大å°å†™ Mirror ->> é•œåƒ ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,8 +634,8 @@ Move column down 下移一行 Move column up 上移一行 -Move files into a time-stamped subdirectory. -ç§»åŠ¨æ–‡ä»¶åˆ°æ—¶é—´æ ‡è®°å目录. +Move files into a time-stamped subdirectory +ç§»åŠ¨æ–‡ä»¶åˆ°æ—¶é—´æ ‡è®°å目录 Moving %x to Recycle Bin 移动 %x 到回收站 Moving file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted ä¸€äº›æ–‡ä»¶å’Œç›®å½•å°†è¢«åˆ é™¤ Number of files that will be overwritten 一些文件和目录将被覆盖 -OK -确定 +One of the FreeFileSync database entries within the following file is not yet existing: +以下文件ä¸çš„FreeFileSyncæ•°æ®åº“å…¥å£å…¶ä¸ä¸€ä¸ªä¸å˜åœ¨ï¼š +One of the FreeFileSync database files is not yet existing: +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. åªæœ‰é€šè¿‡è¿‡æ»¤çš„文件/文件夹能被选择用于åŒæ¥. 过滤ä¸çš„路径å‡ä¸ºåŒæ¥åŸºç¡€æ–‡ä»¶å¤¹çš„相对路径. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization 实时åŒæ¥ - 自动åŒæ¥ RealtimeSync configuration 实时åŒæ¥é…ç½® +Recycle Bin not yet supported for this system! + Relative path 相对路径 Remove alternate settings @@ -702,8 +718,8 @@ Right å³ä¾§ Run minimized and write status information to a logfile 最å°åŒ–è¿è¡Œå¹¶å°†çŠ¶æ€ä¿¡æ¯å†™åˆ°ä¸€ä¸ªè®°å½•æ–‡ä»¶ä¸ -S&ave configuration -ä¿å˜é…ç½®(&A) +S&ave configuration... +ä¿å˜é…ç½®(&A)... S&witch view 切æ¢è§†å›¾(&W) Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: 选择日志ä¿å˜ä½ç½®: Select variant: 选择å˜åŒ–çš„: -Setting default synchronization directions. Please check whether they are appropriate for you. -设置默认åŒæ¥æ–¹å‘. 请检查是å¦é€‚åˆ. +Set direction: +设置方å‘: +Setting default synchronization directions: Old files will be overwritten by newer files. +设置默认的åŒæ¥æ–¹å‘:旧文件会被新文件覆盖. Show conflicts æ˜¾ç¤ºå†²çª -Show file icons -æ˜¾ç¤ºæ–‡ä»¶å›¾æ ‡ Show files that are different 显示ä¸åŒçš„文件 Show files that are equal @@ -796,10 +812,8 @@ Synchronization status åŒæ¥çŠ¶æ€ Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". åŒæ¥æ‰€æœ‰ .doc, .zipå’Œ .exe 文件, 除了\"temp\"ä¸çš„一切. -Synchronize both sides simultaneously: Copy new or updated files in both directions. -åŒæ—¶åŒæ¥ä¸¤ä¾§: åŒå‘å¤åˆ¶æ–°çš„或更新的文件. -Synchronize both sides using a database. Deletions are detected automatically. -使用数æ®åº“åŒæ¥ä¸¤ä¾§. åˆ é™¤ä¼šè¢«è‡ªåŠ¨æ£€æµ‹åˆ°. +Synchronize both sides using a database. Deletions are detected automatically +使用数æ®åº“åŒæ¥ä¸¤ä¾§. åˆ é™¤ä¼šè¢«è‡ªåŠ¨æ£€æµ‹åˆ° Synchronize... åŒæ¥... Synchronizing... @@ -810,14 +824,10 @@ Target directory already existing! ç›®æ ‡ç›®å½•å·²ç»å˜åœ¨! Target file already existing! ç›®æ ‡æ–‡ä»¶å·²ç»å˜åœ¨! -The command line is executed each time:\n- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -命令行会被执行æ¯å½“:\n- 这些目录(或å目录)里é¢çš„文件有修改\n- 相应的盘符å˜æˆå¯ç”¨(æ’å…¥U盘) -The database file is not yet existing, but will be created during synchronization: -æ•°æ®åº“文件未å˜åœ¨, 但在åŒæ¥æœŸé—´ä¼šè¢«åˆ›å»º: +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 file does not contain a valid configuration: 该文件ä¸åŒ…å«æœ‰æ•ˆçš„é…ç½®: -The required database entry is not yet existing, but will be created during 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. æ¤å˜åŒ–评估两个文件å相åŒçš„文件,åªæœ‰å½“他们有åŒæ ·çš„文件大å°å¹¶ä¸”最åŽä¿®æ”¹æ—¥æœŸå’Œæ—¶é—´ä¹Ÿç›¸åŒ\næ—¶æ‰è®¤ä¸ºå®ƒä»¬æ˜¯ç›¸åŒçš„. Time @@ -832,28 +842,22 @@ 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. -对文件时间差异在精确的+/-1å°æ—¶çš„文件认为是相åŒçš„,å°äºŽ1å°æ—¶çš„认为是冲çªä»¥æ¤æ¥å¤„ç†å¤ä»¤æ—¶çš„å˜åŒ–. -Two way <-> -åŒå‘ <-> +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 +对文件时间差异在精确的+/-1å°æ—¶çš„文件认为是相åŒçš„,å°äºŽ1å°æ—¶çš„认为是冲çªä»¥æ¤æ¥å¤„ç†å¤ä»¤æ—¶çš„å˜åŒ– Unable to connect to sourceforge.net! æ— æ³•é“¾æŽ¥åˆ° Sourceforge.net! Unable to create logfile! æ— æ³•åˆ›å»ºæ—¥å¿—! -Unable to initialize Recycle Bin! -æ— æ³•åˆå§‹åŒ–回收站! Unresolved conflicts existing! å˜åœ¨ä¸å¯è§£å†³çš„冲çª! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -å˜åœ¨ä¸å¯è§£å†³çš„冲çª!\n\nä½ å¯å¿½ç•¥å†²çªå¹¶ç»§ç»åŒæ¥. Update -> å‡çº§ -> Usage: 用法: Use Recycle Bin 使用回收站 -Use Recycle Bin when deleting or overwriting files. -å½“åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶æ—¶ä½¿ç”¨å›žæ”¶ç«™. +Use Recycle Bin when deleting or overwriting files +å½“åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶æ—¶ä½¿ç”¨å›žæ”¶ç«™ User-defined directory 用户定义目录 User-defined directory for deletion was not specified! @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. ä½ å¯å¿½ç•¥å†²çªå¹¶ç»§ç»åŒæ¥. You can ignore the error to consider not existing directories as empty. 您å¯å¿½ç•¥æ¤é”™è¯¯è€Œå°†ä¸å˜åœ¨çš„目录视为空. -You can ignore the error to skip current folder pair. -ä½ å¯å¿½ç•¥æ¤é”™è¯¯ä»¥è·³è¿‡å½“å‰æ–‡ä»¶å¤¹å¯¹. You may try to synchronize remaining items again (WITHOUT having to re-compare)! 您å¯èƒ½ä¼šå°è¯•å†æ¬¡åŒæ¥å‰©ä½™çš„项目(而ä¸å¿…é‡æ–°æ¯”较)! different diff --git a/BUILD/Languages/chinese_traditional.lng b/BUILD/Languages/chinese_traditional.lng index d4e4e7b1..b4e69adc 100644 --- a/BUILD/Languages/chinese_traditional.lng +++ b/BUILD/Languages/chinese_traditional.lng @@ -40,26 +40,26 @@ 關於(&A)... &Advanced 進階(&A) -&Apply -套用(&Y) &Cancel å–消(&C) &Check for new version 檢查更新(&C) &Content 內容 -&Create batch job -新建批次處ç†ä½œæ¥(&C) +&Create batch job... +新建批次處ç†ä½œæ¥(&C)... &Default é è¨(&D) &Exit çµæŸ(&E) -&Export file list -匯出檔案清單(&E) +&Export file list... +匯出檔案清單(&E)... &File 檔案(&F) -&Global settings -æ•´é«”è¨å®š(&G) +&Find next +找下一個(&F) +&Global settings... +æ•´é«”è¨å®š(&G)... &Help 說明(&H) &Ignore @@ -68,8 +68,8 @@ 語言(&L) &Load 載入(&L) -&Load configuration -載入é…ç½®(&L) +&Load configuration... +載入é…ç½®(&L)... &New 新增專案(&N) &No @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: 有較新版本的 FreeFileSync å¯ç”¨ï¼š Abort requested: Waiting for current operation to finish... ä¸æ¢è«‹æ±‚:æ£åœ¨ç‰å¾…ç›®å‰æ“作完æˆ... +Abort synchronization immediately +ç«‹å³ä¸æ¢åŒæ¥ Aborted å·²ä¸æ¢ About @@ -202,14 +204,12 @@ Browse ç€è¦½ Build: 建立: -Cancel -å–消 Cannot determine sync-direction: 無法判斷åŒæ¥æ–¹å‘: +Cannot find %x +找ä¸åˆ° %x Category 分類 -Change direction -æ”¹è®Šæ–¹å‘ Comma separated list 逗號分隔清單 Command line @@ -274,8 +274,8 @@ Copy locked files 複製被鎖定的檔案 Copy new or updated files to right folder. 將新的或更新éŽçš„檔案複製到å³é‚Šçš„資料夾ä¸ã€‚ -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 複製到剪貼簿\tCTRL+C Copying file %x to %y @@ -308,6 +308,8 @@ DECISION TREE 決ç–樹 Data remaining: 剩餘資料: +Data transferred: +已傳輸資料: Data verification error: Source and target file have different content! 資料驗è‰éŒ¯èª¤ï¼šä¾†æºå’Œç›®çš„檔案內容ä¸åŒï¼ Date @@ -326,8 +328,8 @@ Delete on both sides 兩邊都刪除 Delete on both sides even if the file is selected on one side only å³ä½¿åªåœ¨ä¸€é‚Šä¸é¸å¥½æª”案,還是刪除兩邊檔案。 -Delete or overwrite files permanently. -永久刪除或覆蓋檔案。 +Delete or overwrite files permanently +永久刪除或覆蓋檔案 Delete permanently 永久刪除 Deleting file %x @@ -376,6 +378,8 @@ Error copying file: 複製檔案錯誤: Error copying locked file %x! 複製已鎖定檔案錯誤 %xï¼ +Error copying symbolic link: +複製符號連çµéŒ¯èª¤ï¼š Error creating directory: 新建目錄錯誤: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: 讀å–檔案錯誤: Error reading from synchronization database: 讀å–åŒæ¥è³‡æ–™åº«éŒ¯èª¤ï¼š -Error resolving full path name: -完整路徑å稱解æžéŒ¯èª¤ï¼š Error resolving symbolic link: 解决符號連çµéŒ¯èª¤ï¼š Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily 暫時排除 Exclude via filter: 使用篩é¸å™¨æŽ’除: -Exit immediately and set returncode < 0 -ç«‹å³çµæŸï¼Œä¸¦è¨å®šè¿”回碼 <0 -Exit with RC < 0 -çµæŸä¸¦è¨å®šè¿”回碼 <0 +Exit instantly +ç«‹å³é€€å‡º +Extension +擴展 External applications å¤–éƒ¨æ‡‰ç”¨ç¨‹å¼ Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de 檔案 %x 有一個檔案時差在1å°æ™‚å…§ï¼\n\n這ä¸æ˜¯å®‰å…¨çš„決定,其ä¸ä¹‹ä¸€æ˜¯ç”±æ–¼æ–°çš„日光節約時間的å•é¡Œã€‚ Files %x have the same date but a different size! 檔案 %x 日期相åŒä½†å¤§å°ä¸åŒï¼ -Files are found equal if\n - file content\nis the same. -如果檔案内容相åŒå‰‡åˆ¤æ–·å…©è€…相åŒã€‚ -Files are found equal if\n - filesize\n - last write time and date\nare the same. -如果檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ™‚間和日期相åŒå‰‡åˆ¤æ–·å…©è€…相åŒã€‚ +Files are found equal if\n - file content\nis the same +如果檔案内容相åŒå‰‡åˆ¤æ–·å…©è€…ç›¸åŒ +Files are found equal if\n - filesize\n - last write time and date\nare the same +如果檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ™‚間和日期相åŒå‰‡åˆ¤æ–·å…©è€…ç›¸åŒ Files remaining: 剩餘檔案: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer 檔案å˜åœ¨æ–¼å…©é‚Šï¼Œå³é‚Šæª”案較新 Files/folders found: 找到的檔案/資料夾: +Files/folders processed: +已處ç†çš„檔案/資料夾: Files/folders remaining: 剩餘的檔案/資料夾: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view 篩é¸æª¢è¦– Filtering is deactivated 篩é¸å·²åœç”¨ +Find +尋找 +Find what: +尋找內容: Folder Comparison and Synchronization 資料夾比å°å’ŒåŒæ¥ Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: åˆå§‹åŒ–åŒæ¥ï¼š Integrate external applications into context menu. The following macros are available: æ•´åˆä¸Šä¸‹æ–‡åŠŸèƒ½è¡¨ä¸çš„外部應用程å¼ã€‚å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„巨集: +Last synchronization not completed! +最後一次åŒæ¥æœªå®Œæˆï¼ Leave as unresolved conflict ä¿ç•™çµ¦æœªè§£æ±ºçš„è¡çª Left @@ -610,6 +620,8 @@ Logging 日誌記錄 Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. ä¸æ”¯æ´è£½ä½œ WOW64 上的å·å½±å‰¯æœ¬ã€‚請使用 FreeFileSync 64ä½å…ƒç‰ˆæœ¬ã€‚ +Match case +å€åˆ†å¤§å°å¯« Mirror ->> é¡åƒ ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,8 +634,8 @@ Move column down 下移一行 Move column up 上移一行 -Move files into a time-stamped subdirectory. -移動檔案到一個時間標記的å目錄。 +Move files into a time-stamped subdirectory +移動檔案到一個時間標記的å目錄 Moving %x to Recycle Bin 移動 %x 到資æºå›žæ”¶ç’ Moving file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted 一些檔案和目錄將被刪除 Number of files that will be overwritten 一些檔案和目錄將被覆蓋 -OK -確定 +One of the FreeFileSync database entries within the following file is not yet existing: +以下數據庫æ¢ç›®çš„å…¶ä¸ä¸€å€‹ FreeFileSync 檔案ä¸å˜åœ¨ï¼š +One of the FreeFileSync database files is not yet existing: +å…¶ä¸ä¸€å€‹ 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. åªæœ‰è¢«é¸ä¸ç¯©é¸çš„檔案/目錄會進行åŒæ¥ã€‚篩é¸å™¨å°‡å¥—用到基本åŒæ¥ç›®éŒ„的相å°å稱。 Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization å³æ™‚åŒæ¥ - 自動åŒæ¥ RealtimeSync configuration å³æ™‚åŒæ¥é…ç½® +Recycle Bin not yet supported for this system! + Relative path 相å°è·¯å¾‘ Remove alternate settings @@ -702,8 +718,8 @@ Right å³é‚Š Run minimized and write status information to a logfile 執行最å°åŒ–和狀態資訊寫入到日誌檔 -S&ave configuration -儲å˜é…ç½®(&A) +S&ave configuration... +儲å˜é…ç½®(&A)... S&witch view 切æ›æª¢è¦–(&W) Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: é¸æ“‡æ—¥èªŒæª”目錄: Select variant: é¸æ“‡è®Šæ•¸ï¼š -Setting default synchronization directions. Please check whether they are appropriate for you. -è¨å®šé è¨åŒæ¥æ–¹å‘。請檢查這些è¨å®šæ˜¯å¦é©åˆæ–¼ä½ 。 +Set direction: +è¨å®šæ–¹å‘: +Setting default synchronization directions: Old files will be overwritten by newer files. +è¨å®šé è¨åŒæ¥æ–¹å‘:舊檔案會被較新的檔案覆蓋。 Show conflicts 顯示è¡çª -Show file icons -顯示檔案圖示 Show files that are different 顯示ä¸åŒçš„檔案 Show files that are equal @@ -796,10 +812,8 @@ Synchronization status åŒæ¥ç‹€æ…‹ Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". åŒæ¥æ‰€æœ‰ .doc, .zip å’Œ .exe 檔案,除了\"temp\"ä¸çš„一切。 -Synchronize both sides simultaneously: Copy new or updated files in both directions. -åŒæ™‚é›™å‘åŒæ¥ï¼šé›™å‘複製新的或已更新的檔案。 -Synchronize both sides using a database. Deletions are detected automatically. -é›™å‘åŒæ¥ä½¿ç”¨ä¸€å€‹è³‡æ–™åº«ã€‚自動檢測è¦åˆªé™¤çš„檔案。 +Synchronize both sides using a database. Deletions are detected automatically +é›™å‘åŒæ¥ä½¿ç”¨ä¸€å€‹è³‡æ–™åº«ã€‚自動檢測è¦åˆªé™¤çš„檔案 Synchronize... åŒæ¥... Synchronizing... @@ -810,14 +824,10 @@ Target directory already existing! 目標目錄已å˜åœ¨ï¼ Target file already existing! 目標檔案已å˜åœ¨ï¼ -The command line is executed each time:\n- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -命令行æ¯æ¬¡åŸ·è¡Œæ™‚:\n- 檔案在這些目錄(或å目錄)會被修改\n- å¯ä¾›ä½¿ç”¨ç›¸æ‡‰çš„ç£ç¢Ÿæ©Ÿä»£è™Ÿ(USBæ’å…¥) -The database file is not yet existing, but will be created during synchronization: -資料庫檔未å˜åœ¨ï¼Œä½†æœƒåœ¨åŒæ¥éŽç¨‹ä¸æ–°å»ºï¼š +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 file does not contain a valid configuration: 該檔案ä¸åŒ…å«æœ‰æ•ˆçš„é…置: -The required database entry is not yet existing, but will be created during 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 @@ -832,28 +842,22 @@ 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. -å°æª”案時差在精確的+/-1å°æ™‚的檔案判斷視為相åŒçš„,以å°æ–¼1å°æ™‚作為è¡çªï¼Œæ˜¯ç‚ºäº†è™•ç†æ—¥å…‰ç¯€ç´„時間的變化。 -Two way <-> -é›™å‘ <-> +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 +å°æª”案時差在精確的+/-1å°æ™‚的檔案判斷視為相åŒçš„,以å°æ–¼1å°æ™‚作為è¡çªï¼Œæ˜¯ç‚ºäº†è™•ç†æ—¥å…‰ç¯€ç´„時間的變化 Unable to connect to sourceforge.net! 無法連接到 sourceforge.netï¼ Unable to create logfile! ç„¡æ³•æ–°å»ºæ—¥èªŒæª”ï¼ -Unable to initialize Recycle Bin! -無法åˆå§‹åŒ–資æºå›žæ”¶ç’ï¼ Unresolved conflicts existing! å˜åœ¨æœªè§£æ±ºçš„è¡çªï¼ -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -å˜åœ¨æœªè§£æ±ºçš„è¡çªï¼\n\nä½ å¯ä»¥å¿½ç•¥è¡çªï¼Œä¸¦ç¹¼çºŒåŒæ¥ã€‚ Update -> æ›´æ–° -> Usage: 使用é‡ï¼š Use Recycle Bin 使用資æºå›žæ”¶ç’ -Use Recycle Bin when deleting or overwriting files. -當刪除或覆蓋檔案時使用資æºå›žæ”¶ç’。 +Use Recycle Bin when deleting or overwriting files +當刪除或覆蓋檔案時使用資æºå›žæ”¶ç’ User-defined directory 自定義目錄 User-defined directory for deletion was not specified! @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. ä½ å¯ä»¥å¿½ç•¥è¡çªï¼Œä¸¦ç¹¼çºŒåŒæ¥ã€‚ You can ignore the error to consider not existing directories as empty. ä½ å¯ä»¥å¿½ç•¥è©²éŒ¯èª¤è€Œå°‡ä¸å˜åœ¨çš„目錄視為空目錄。 -You can ignore the error to skip current folder pair. -您å¯ä»¥å¿½ç•¥è·³éŽç›®å‰å…©å€‹è³‡æ–™å¤¾çš„錯誤。 You may try to synchronize remaining items again (WITHOUT having to re-compare)! 您å¯èƒ½æœƒå˜—試å†æ¬¡åŒæ¥å‰©é¤˜é …ç›®(ä¸ç”¨é‡æ–°æ¯”å°)ï¼ different diff --git a/BUILD/Languages/czech.lng b/BUILD/Languages/czech.lng index 56778c7b..a5ea8e98 100644 --- a/BUILD/Languages/czech.lng +++ b/BUILD/Languages/czech.lng @@ -40,26 +40,26 @@ souborů: %x; &O Programu... &Advanced &UpÅ™esnit -&Apply -&PoužÃt &Cancel &ZruÅ¡it &Check for new version Zkontrolovat &aktualizace &Content &Obsah -&Create batch job -&VytvoÅ™it dávku +&Create batch job... +&VytvoÅ™it dávku... &Default &PÅ™eddefinované &Exit &Konec -&Export file list -&Exportovat seznam souborů +&Export file list... +&Exportovat seznam souborů... &File &Soubor -&Global settings -&Nastavenà +&Find next +&NajÃt dalÅ¡Ã +&Global settings... +&NastavenÃ... &Help &Pomoc &Ignore @@ -68,8 +68,8 @@ Zkontrolovat &aktualizace &Jazyk &Load &NaÄÃst -&Load configuration -&NaÄÃst konfiguraci +&Load configuration... +&NaÄÃst konfiguraci... &New &Nový &No @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: je dostupná novÄ›jÅ¡Ã verze FreeFileSync: Abort requested: Waiting for current operation to finish... Požadavek na pÅ™eruÅ¡enÃ: ÄŒekánà na ukonÄenà aktuálnà operace... +Abort synchronization immediately +PÅ™eruÅ¡it synchronizaci ihned Aborted PÅ™eruÅ¡eno About @@ -202,14 +204,12 @@ Browse Procházet Build: Build: -Cancel -ZruÅ¡it Cannot determine sync-direction: Nelze urÄit smÄ›r synchronizace: +Cannot find %x +Nelze najÃt %x Category Kategorie -Change direction -ZmÄ›nit akci Comma separated list Text oddÄ›lený Äárkami Command line @@ -274,8 +274,8 @@ Copy locked files KopÃrovat zamÄené soubory Copy new or updated files to right folder. KopÃrovat nové nebo aktualizované soubory do adresáře vpravo. -Copy shared or locked files using Volume Shadow Copy Service. -KopÃrovat sdÃlené nebo zamÄené soubory pomocà Volume Shadow Copy Service. +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 file %x to %y @@ -308,6 +308,8 @@ DECISION TREE ROZHODOVÃNà Data remaining: Zbývá dat: +Data transferred: +PÅ™eneseno dat: Data verification error: Source and target file have different content! Chyba verifikace dat: Zdrojový a cÃlový soubor majà rozdÃlný obsah! Date @@ -326,8 +328,8 @@ Delete on both sides Smazat z obou stran Delete on both sides even if the file is selected on one side only Smazat na obou stranách i když je soubor vybrán pouze na jedné z nich -Delete or overwrite files permanently. -Smazat nebo pÅ™epsat soubory trvale. +Delete or overwrite files permanently +Smazat nebo pÅ™epsat soubory trvale Delete permanently Odstranit trvale Deleting file %x @@ -376,6 +378,8 @@ Error copying file: Chyba kopÃrovánà souboru: Error copying locked file %x! Chyba kopÃrovánà zamÄeného souboru %x! +Error copying symbolic link: +Chyba kopÃrovánà zástupce: Error creating directory: Chyba vytvoÅ™enà adresáře: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Chyba Ätenà souboru: Error reading from synchronization database: Chyba Ätenà synchronizaÄnà databáze: -Error resolving full path name: -Chyba názvu plné cesty: Error resolving symbolic link: Chyba odkazu zástupce: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Vynechat doÄasnÄ› Exclude via filter: Vynechat pomocà filtru: -Exit immediately and set returncode < 0 -UkonÄit okamžitÄ› a nastavit návratový kód < 0 -Exit with RC < 0 -UkonÄit s RC < 0 +Exit instantly +UkonÄit ihned +Extension +PÅ™Ãpona External applications Externà aplikace Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de Soubory %x se liÅ¡Ã o ménÄ› než 1 hodinu.\n\nnenà možné bezpeÄnÄ› rozhodnout, který z nich je novÄ›jÅ¡Ã kvůli použÃvánà LetnÃho Äasu. Files %x have the same date but a different size! Soubory %x majà stejné datum a Äas ale rozdÃlnou velikost! -Files are found equal if\n - file content\nis the same. -Soubory jsou shodné jestliže\n - obsah souboru\nje stejný. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -Soubory jsou shodné jestliže\n - velikost souboru\n - datum i Äas poslednà zmÄ›ny\njsou stejné. +Files are found equal if\n - file content\nis the same +Soubory jsou shodné jestliže\n - obsah souboru\nje stejný +Files are found equal if\n - filesize\n - last write time and date\nare the same +Soubory jsou shodné jestliže\n - velikost souboru\n - datum i Äas poslednà zmÄ›ny\njsou stejné Files remaining: Zbývá souborů: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Soubory, které existujà na obou stranách, z nichž vpravo je novÄ›jÅ¡Ã Files/folders found: Nalezené soubory/adresáře: +Files/folders processed: +Zpracované soubory/adresáře: Files/folders remaining: Zbývá souborů/adresářů: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view Filtrovat seznam Filtering is deactivated Filtr je vypnut +Find +NajÃt +Find what: +NajÃt: Folder Comparison and Synchronization Porovnánà a Synchronizace adresářů Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: Prvotnà synchronizace: Integrate external applications into context menu. The following macros are available: Integrace externà aplikace do kontextového menu. K dispozici jsou následujÃcà makra: +Last synchronization not completed! +Poslednà synchronizace nebyla dokonÄena! Leave as unresolved conflict Ponechat jako nevyÅ™eÅ¡ený konflikt Left @@ -610,6 +620,8 @@ Logging Zaznamenávánà Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. Vytvářenà stÃnových kopÃà na WOW64 nenà podporováno. ProsÃm použijte 64 bitovou verzi FreeFileSync. +Match case +RozliÅ¡ovat malá a velká pÃsmena Mirror ->> Zrcadlenà ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,8 +634,8 @@ Move column down PÅ™esunout sloupec dolů Move column up PÅ™esunout sloupec nahoru -Move files into a time-stamped subdirectory. -PÅ™esunout soubory do ÄasovÄ› oznaÄeného podadresáře. +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 file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted PoÄet souborů a adresářů ke smazánà Number of files that will be overwritten PoÄet souborů a adresářů k pÅ™epsánà -OK -OK +One of the FreeFileSync database entries within the following file is not yet existing: +NÄ›která z položek databáze FreeFileSync k následujÃcÃmu souboru jeÅ¡tÄ› neexistuje: +One of the FreeFileSync database files is not yet existing: +NÄ›který z databázových souborů FreeFileSync neexistuje: 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. Pouze soubory/adresáře odpovÃdajÃcà nastavenému filtru budou vybrány pro synchronizaci. Filtr je aplikován relativnÄ›(!) k cestÄ› synchronizovaných adresářů. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Automatická synchronizace RealtimeSync configuration Konfigurace RealtimeSync +Recycle Bin not yet supported for this system! + Relative path Relativnà cesta Remove alternate settings @@ -702,8 +718,8 @@ Right Pravý Run minimized and write status information to a logfile Spustit minimalizovaný a zapisovat informace do souboru -S&ave configuration -&Uloženà konfigurace +S&ave configuration... +&Uloženà konfigurace... S&witch view &ZmÄ›nit zobrazenà Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: Vyberte adresář pro záznamy: Select variant: Vyberte variantu: -Setting default synchronization directions. Please check whether they are appropriate for you. -Nastaven výchozà způsob synchronizace. ProsÃm zkontrolujte, zda odpovÃdá VaÅ¡im požadavkům. +Set direction: +Nastavit asresář: +Setting default synchronization directions: Old files will be overwritten by newer files. +Nastaven výchozà způsob synchronizace: Staré soubory budou nahrazeny novými. Show conflicts Zobrazit konflikty -Show file icons -Zobrazit ikony souborů Show files that are different Zobrazit rozdÃlené soubory Show files that are equal @@ -796,10 +812,8 @@ Synchronization status Stav synchronizace Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". Synchronizovat vÅ¡echny soubory .doc, .zip a .exe s výjimkou vÅ¡eho v podadresáři \"temp\" -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Synchronizovat obÄ› strany zároveň: KopÃrovat nové nebo aktualizované soubory z obou adresářů. -Synchronize both sides using a database. Deletions are detected automatically. -Synchronizovat obÄ› strany pomocà databáze. Mazánà je urÄeno automaticky. +Synchronize both sides using a database. Deletions are detected automatically +Synchronizovat obÄ› strany pomocà databáze. Mazánà je urÄeno automaticky Synchronize... Synchronizace... Synchronizing... @@ -810,14 +824,10 @@ 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- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -PÅ™Ãkazová řádka je spuÅ¡tÄ›na pokaždé když:\n- dojde ke zmÄ›nÄ› souborů v adresáři (nebo podadresářÃch)\n- je pÅ™ipojen odpovÃdajÃcà disk (vloženÃm USB disku) -The database file is not yet existing, but will be created during synchronization: -Databáze jeÅ¡tÄ› neexistuje, ale bude bÄ›hem synchronizace vytvoÅ™ena: +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 file does not contain a valid configuration: Soubor neobsahuje platnou konfiguraci: -The required database entry is not yet existing, but will be created during synchronization: -Požadovaný záznam v databázi jeÅ¡tÄ› neexistuje, ale bude bÄ›hem synchronizace vztvoÅ™en: 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. Tato varianta vyhodnotà dva stejnÄ› pojmenované soubory jako shodné pokud majà i stejnou velikost A ZÃROVEŇ i datum a Äas poslednà zmÄ›ny. Time @@ -832,28 +842,22 @@ Total required free disk space: Požadované volné mÃsto na disku: Total time: Celkový Äas: -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. -Považovat Äas souboru liÅ¡Ãcà se pÅ™esnÄ› o +/- 1 hodinu jako shodný, ménÄ› než 1 hodinu jako konflikt, kvůli zpracovánà a pÅ™echodům na Letnà Äas. -Two way <-> -ObousmÄ›rná <-> +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 +Považovat Äas souboru liÅ¡Ãcà se pÅ™esnÄ› o +/- 1 hodinu jako shodný, ménÄ› než 1 hodinu jako konflikt, kvůli zpracovánà a pÅ™echodům na Letnà Äas Unable to connect to sourceforge.net! Nenà možné se pÅ™ipojit k sourceforge.net! Unable to create logfile! nenà možné vytvoÅ™it záznamový soubor! -Unable to initialize Recycle Bin! -Nenà možné použÃt KoÅ¡! Unresolved conflicts existing! NevyÅ™eÅ¡ené konflikty! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -NevyÅ™eÅ¡ené konflikty! \n\nJe možné konflikt ignorovat a pokraÄovat v synchronizaci. Update -> Aktualizuj -> Usage: PoužitÃ: Use Recycle Bin PoužÃt KoÅ¡ -Use Recycle Bin when deleting or overwriting files. -PoužÃt KoÅ¡ pÅ™i mazánà nebo pÅ™episu souborů. +Use Recycle Bin when deleting or overwriting files +PoužÃt KoÅ¡ pÅ™i mazánà nebo pÅ™episu souborů User-defined directory Uživatelsky definovaný adresář User-defined directory for deletion was not specified! @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. Je možné konflikt ignorovat a pokraÄovat v synchronizaci. You can ignore the error to consider not existing directories as empty. Pro považovánà neexistujÃcÃch adresářů jako prázdných můžete chybu ignorovat. -You can ignore the error to skip current folder pair. -Pro pÅ™eskoÄenà aktuálnÃho páru adresářů můžete chybu ignorovat. You may try to synchronize remaining items again (WITHOUT having to re-compare)! Můžete se pokusit synchronizovat zbývajÃcà položky (BEZ nutnosti znovuporovnávánÃ)! different diff --git a/BUILD/Languages/dutch.lng b/BUILD/Languages/dutch.lng index 0aaf8f61..78af082b 100644 --- a/BUILD/Languages/dutch.lng +++ b/BUILD/Languages/dutch.lng @@ -40,26 +40,26 @@ &Informatie... &Advanced &Geavanceerd -&Apply -&Toepassen &Cancel &Annuleren &Check for new version &Controleer op nieuwe versie &Content &Help artikelen -&Create batch job -&Creëer batchjob +&Create batch job... +&Creëer batchjob... &Default &Standaard &Exit &Afsluiten -&Export file list -&Exporteer bestandslijst +&Export file list... +&Exporteer bestandslijst... &File &Bestand -&Global settings -&Algemene instellingen +&Find next + +&Global settings... +&Algemene instellingen... &Help &Help &Ignore @@ -68,8 +68,8 @@ &Taal &Load &Laden -&Load configuration -&Laad de configuratie +&Load configuration... +&Laad de configuratie... &New &Nieuw &No @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: Een nieuwe versie van FreeFileSync is beschikbaar: Abort requested: Waiting for current operation to finish... Bezig met afbreken: wachten op beëindigen huidige handeling... +Abort synchronization immediately + Aborted Afgebroken About @@ -202,14 +204,12 @@ Browse Map opzoeken Build: Gebouwd: -Cancel -Annuleren Cannot determine sync-direction: Kan de synchronisatie-richting niet bepalen: +Cannot find %x + Category Categorie -Change direction -Zijdes omwisselen Comma separated list Komma gescheiden lijst Command line @@ -274,8 +274,8 @@ Copy locked files Kopieer 'alleen lezen' bestanden Copy new or updated files to right folder. Kopieer nieuwe of geupdate bestanden naar de rechter map. -Copy shared or locked files using Volume Shadow Copy Service. -Kopieer gedeelde of alleen-lezen bestanden met Volume Shadow Copy Service. +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 file %x to %y @@ -308,6 +308,8 @@ DECISION TREE BESLISSINGSBOOM Data remaining: Resterende data: +Data transferred: + Data verification error: Source and target file have different content! Dataverificatie-fout: Bron en doelbestand hebben verschillende inhoud! Date @@ -326,8 +328,8 @@ Delete on both sides Verwijder aan beide kanten Delete on both sides even if the file is selected on one side only Verwijder aan beide kanten ookal is het bestand maar aan één kant geselecteerd -Delete or overwrite files permanently. -Verwijder of overschrijf bestanden onomkeerbaar. +Delete or overwrite files permanently +Verwijder of overschrijf bestanden onomkeerbaar Delete permanently Verwijder onomkeerbaar Deleting file %x @@ -376,6 +378,8 @@ Error copying file: Er is een fout opgetreden bij het kopiëren van bestand: Error copying locked file %x! Er is een fout opgetreden bij het kopiëren van %x omdat het bestand in gebruik is! +Error copying symbolic link: + Error creating directory: Er is een fout opgetreden bij het aanmaken van pad: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Er is een fout opgetreden bij het lezen van het bestand: Error reading from synchronization database: Er is een fout opgetreden bij het lezen van de synchronisatie-database: -Error resolving full path name: -Er is een fout opgetreden bij het ophalen van de locatie van bestand: Error resolving symbolic link: Er is een fout opgetreden bij het ophalen van een symbolische koppeling: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Tijdelijk uitsluiten Exclude via filter: Uitsluiten door filter: -Exit immediately and set returncode < 0 -Onmiddelijk afsluiten en zet de returncode < 0 -Exit with RC < 0 -Afsluiten met RC < 0 +Exit instantly + +Extension + External applications Externe applicaties Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de De bestanden %x hebben een bestandstijd verschil van minder dan één uur!\n\nHet is niet veilig te bepalen welke nieuwer is vanwege zomertijd instellingen Files %x have the same date but a different size! De bestanden %x hebben dezelfde data maar een afwijkende grootte! -Files are found equal if\n - file content\nis the same. -Bestanden worden gelijk beschouwd als,\n - de inhoud\novereenkomt. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -Bestanden worden gelijk beschouwd als,\n - de grootte\n - datum en tijdstip van de laatste wijziging\novereenkomt. +Files are found equal if\n - file content\nis the same +Bestanden worden gelijk beschouwd als,\n - de inhoud\novereenkomt +Files are found equal if\n - filesize\n - last write time and date\nare the same +Bestanden worden gelijk beschouwd als,\n - de grootte\n - datum en tijdstip van de laatste wijziging\novereenkomt Files remaining: Resterende bestanden: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Bestanden die aan beide kanten bestaan, maar waarvan de rechterkant nieuwer is Files/folders found: Gevonden bestanden/mappen: +Files/folders processed: + Files/folders remaining: Resterende bestanden/mappen: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view Bekijk het filter Filtering is deactivated Filteren is uitgeschakeld +Find + +Find what: + Folder Comparison and Synchronization Mappen vergelijken en synchroniseren Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: Initiële synchronisatie: Integrate external applications into context menu. The following macros are available: Integreer externe applicaties in het context menu. De volgende macros zijn beschikbaar: +Last synchronization not completed! + Leave as unresolved conflict Beschouwen als onopgelost conflict Left @@ -610,6 +620,8 @@ Logging Loggen Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. Schaduw kopieen op WOW64 worden niet ondersteund. Gebruik alstublieft de 64-bit versie van FreeFileSync. +Match case + Mirror ->> Spiegelen ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,8 +634,8 @@ Move column down Verplaats kolom naar beneden Move column up Verplaats kolom naar boven -Move files into a time-stamped subdirectory. -Verplaats de bestanden in een tijd-gemarkeerde sublocatie. +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 file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted Aantal mappen en bestanden die zullen worden verwijderd Number of files that will be overwritten Aantal bestanden dat zal worden overschreven -OK -Oke +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. Alleen bestanden /locatie die niet worden gefilterd zullen worden gesynchroniseerd. Het filter word toegepast op de relatieve(!) naam van de basislocatie van de synchronisatie. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Automatische Synchronisatie RealtimeSync configuration RealtimeSync configuratie +Recycle Bin not yet supported for this system! + Relative path Relatieve pad Remove alternate settings @@ -702,8 +718,8 @@ Right Rechts Run minimized and write status information to a logfile Tijdens het synchroniseren het venster minimaliseren en alle informatie opslaan in een log-bestand -S&ave configuration -S&la de instellingen op +S&ave configuration... +S&la de instellingen op... S&witch view &Wijzig weergave Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: Selecteer een map voor het logbestand: Select variant: Selecteer een variant: -Setting default synchronization directions. Please check whether they are appropriate for you. -De standaard synchronisatie-richtingen worden gebruikt. Controleer alstublieft of dit geschikt is voor u. +Set direction: + +Setting default synchronization directions: Old files will be overwritten by newer files. + Show conflicts Geef conflicten weer -Show file icons -Geef bestandsiconen weer Show files that are different Geef bestanden die verschillend zijn weer Show files that are equal @@ -796,10 +812,8 @@ Synchronization status Synchronisatie: status Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". Synchroniseer alle .doc, .zip en .exe bestanden uitgezonderd alles in submap \"temp\" -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Synchroniseer beide zijde tegelijkertijd: kopieer nieuwe of geüpdatete bestanden in beide richtingen. -Synchronize both sides using a database. Deletions are detected automatically. -Synchroniseer beide zijdes met gebruik van een database. Verwijderde bestanden worden automatisch opgemerkt. +Synchronize both sides using a database. Deletions are detected automatically +Synchroniseer beide zijdes met gebruik van een database. Verwijderde bestanden worden automatisch opgemerkt Synchronize... Synchroniseer... Synchronizing... @@ -810,14 +824,10 @@ Target directory already existing! Doellocatie bestaal al! Target file already existing! Doelbestand bestaat al! -The command line is executed each time:\n- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -De opdrachtregel wordt elke keer uitgevoerd als:\n- Bestanden in deze folders (of subfolders) zijn gewijzigd\n- De gekoppelde schijf beschikbaar wordt (USB-invoegen) -The database file is not yet existing, but will be created during synchronization: -Database-bestand bestaat nog niet, maar zal worden aangemaakt tijdens het synchroniseren: +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 file does not contain a valid configuration: Het bestand bevat geen geldige configuratie: -The required database entry is not yet existing, but will be created during synchronization: -De nodige database-informatie bestaan nog niet, maar zal worden aangemaakt tijdens synchroniseren: 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. Deze variant ziet twee gelijknamige bestanden als gelijk wanneer ze dezelfde bestandsgrootte EN tijdstempel hebben. Time @@ -832,27 +842,21 @@ Total required free disk space: Benodigde hoeveelheid vrije schijfruimte: Total time: Totale tijd: -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. -Behandel bestandstijden die verschillen met precies +/- 1 uur als gelijk en minder als 1 uur als conflict om zomertijd veranderingen te verwerken. -Two way <-> -Beide zijden <-> +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 +Behandel bestandstijden die verschillen met precies +/- 1 uur als gelijk en minder als 1 uur als conflict om zomertijd veranderingen te verwerken Unable to connect to sourceforge.net! Niet in staat verbinding te maken met sourceforge.net! Unable to create logfile! Niet mogelijk om een logbestand aan te maken! -Unable to initialize Recycle Bin! -De prullenbak kon niet worden geïnitialiseerd! Unresolved conflicts existing! Er bestaan onopgeloste conflicten! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -Er bestaan onopgeloste conflicten! \n\nU kunt de conflicten negeren en doorgaan met synchroniseren. Update -> Overschrijven -> Usage: Gebruik: Use Recycle Bin Gebruik de prullenbak -Use Recycle Bin when deleting or overwriting files. +Use Recycle Bin when deleting or overwriting files Gebruik de prullenbak bij verwijderen of overschrijven van bestanden User-defined directory Door de gebruiker te definiëren locatie @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. U kunt de conflicten negeren en doorgaan met synchroniseren. You can ignore the error to consider not existing directories as empty. U kunt de fout negeren om niet bestaande locaties als leeg te beschouwen. -You can ignore the error to skip current folder pair. -U kunt de foutmelding om de huidige mappencombinatie over te slaan negeren. You may try to synchronize remaining items again (WITHOUT having to re-compare)! U kunt proberen om de resterende bestanden opnieuw te synchroniseren (ZONDER opnieuw te hoeven vergelijken)! different diff --git a/BUILD/Languages/finnish.lng b/BUILD/Languages/finnish.lng index f988eed6..968f34c6 100644 --- a/BUILD/Languages/finnish.lng +++ b/BUILD/Languages/finnish.lng @@ -40,26 +40,26 @@ &Ohje... &Advanced &Laajennettu -&Apply -&Käytä &Cancel &Lopeta &Check for new version Etsi &uusi versio &Content - -&Create batch job -&Tee eräajo +&Sisältö +&Create batch job... +&Tee eräajo... &Default &Vakio &Exit &Poistu -&Export file list -&Vie tiedostojoukko +&Export file list... +&Vie tiedostojoukko... &File &Tiedosto -&Global settings -&Yleiset asetukset +&Find next +&Esi seuraava +&Global settings... +&Yleiset asetukset... &Help &Ohje &Ignore @@ -68,8 +68,8 @@ Etsi &uusi versio &Kieli &Load &Lataa -&Load configuration -Asetusten &lataus +&Load configuration... +Asetusten &lataus... &New &Uusi &No @@ -91,7 +91,7 @@ Asetusten &lataus (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!) - +(Vaatii Internet-yhteyden!) , . - Other side's counterpart to %dir @@ -137,17 +137,17 @@ Asetusten &lataus 1. Enter relative file or directory names separated by ';' or a new line. 1. Anna tiedostojen tai hakemistojen suhteelliset nimet eroteltuina ';' tai rivivaihto 1. Select directories to monitor. - +1. Valitse seurattavat hakemistot 2. &Synchronize... 2. &Täsmäytä... 2. Enter a command line. - +2. Anna komentokehoite 2. Use wildcard characters '*' and '?'. 2. Käytä jokerimerkkejä '*' ja '?' . 3. Exclude files directly on main grid via context menu. 3. Sulje tiedostoja pois suoraan pääikkunassa viite hakemiston avulla. 3. Press 'Start'. - +3. Paina 'Käynnistä'. <Automatic> <- Automaattinen -> <Directory> @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: 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 Aborted Keskeytetty About @@ -183,7 +185,7 @@ Nimensä mukaisesti, tiedostot joilla on sama nimi, merkitään samoiksi vain jo 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 <batchfile>. This can also be scheduled in your operating system's task planner. Luo automaattiseen täsmäytykseen eräajon komentotiedosto. Käynnistä eräajo liittämällä FreeFileSyn ohjelmalle komentotiedosto: FreeFileSync.exe <eräajotiedosto>. Tehtävän suoritusta voit ajoittaa käyttöjärjestelmän toimilla. At least one directory input field is empty. - +Vähintäin yksi hakemiston syöttökenttä on tyhjä. Auto-adjust columns Säädä sarakeleveys automaattisesti Automatic mode @@ -202,20 +204,18 @@ Browse Selaa Build: Luotu: -Cancel -Keskeytä Cannot determine sync-direction: - +Täsmäytys suuntä tuntematon: +Cannot find %x +En löydä %x Category Luokka -Change direction -Vaihda suunta Comma separated list CSV-muotoinen lista Command line Komentokehote Command line is empty! - +Tyhjä komentokehoite! Compare Vertaile Compare both sides @@ -271,11 +271,11 @@ Kopioidaan oikea -> vasen Copy from right to left overwriting Kopioidaan oikea -> vasen ylikirjoittaen Copy locked files - +Kopioi lukitut tiedostot Copy new or updated files to right folder. Kopioidaan uudet tai muuttuneet tiedostot oikeaan hakemistoon. -Copy shared or locked files using Volume Shadow Copy Service. - +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 file %x to %y @@ -287,7 +287,7 @@ Levyasemaa ei tunnistettu tiedostolle: Could not initialize directory monitoring: Ei voitu käynnistää hakemiston tarkkailua: Could not load a required DLL: - +Tarvittu DLL ei lataudu: Could not read values for the following XML nodes: Tietoja lukeminen epäonnistui, XML jäsen: Create a batch job @@ -308,6 +308,8 @@ DECISION TREE PÄÄTÖSPUU Data remaining: Dataa jäljellä: +Data transferred: +Siirrettyä dataa: Data verification error: Source and target file have different content! Tiedon varmennusvirhe: Lähteellä ja kohteella on eri sisältö! Date @@ -326,7 +328,7 @@ Delete on both sides Poista molemmilta puolilta Delete on both sides even if the file is selected on one side only Poista molemmilta puolilta vaikka tiedosto valittu vain toisella puolella -Delete or overwrite files permanently. +Delete or overwrite files permanently Poista tai ylikirjoita tiedostoja pysyvästi Delete permanently Poista pysyvästi @@ -376,6 +378,8 @@ Error copying file: Virhe kopioitaessa tiedostoa: Error copying locked file %x! Virhe kopioitaessa lukittua tiedostoa %x! +Error copying symbolic link: +Symboolisen linkin kopiointi epäonnistui: Error creating directory: Virhe tapahtui hakemistoa luotassa: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Virhe lukiessa tiedostoa: Error reading from synchronization database: Virhe lukiessa täsmäytyksen tietokantaa: -Error resolving full path name: - Error resolving symbolic link: Virhe selvittäessä symbolista linkkiä: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Sulje pois tilapäisesti Exclude via filter: Sulje pois suotimella: -Exit immediately and set returncode < 0 -Välitön poistuminen ja aseta paluukoodi < 0 -Exit with RC < 0 -Poistu ja RC < 0 +Exit instantly +Poistu välittömästi +Extension +Laajennus External applications Ulkopuolinen sovellus Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de Tiedostojen %x aikaleima poikkeaa alle tunnin!\n\nEi voida päättää turvallisesti, kesäajan takia, kumpi on uudempi. Files %x have the same date but a different size! Tiedostot %x samalta päivältä mutta koko poikkeaa! -Files are found equal if\n - file content\nis the same. -Tiedostot samat jos, \n - tiedoston sisältö\non sama. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -Tiedosto samat jos, \n - koko\n - viimeinen aikaleima\non sama. +Files are found equal if\n - file content\nis the same +Tiedostot samat jos, \n - tiedoston sisältö\non sama +Files are found equal if\n - filesize\n - last write time and date\nare the same +Tiedosto samat jos, \n - koko\n - viimeinen aikaleima\non sama Files remaining: Tiedostoja jäljellä: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Tiedosto löytyy molemmilla puolilla, oikea on uudempi Files/folders found: Löydetty tiedostoja/hakemistoja: +Files/folders processed: +Käsiteltyjä tiedostoja/hakemistoja: Files/folders remaining: Tiedostoja/hakemistoja jäljellä: Files/folders that exist on left side only @@ -485,11 +489,15 @@ Suodata tiedostoja Filter has been selected Suodin valittu Filter settings have changed! - +Suodinasetukset muutettu! Filter view Näytä suodattimet Filtering is deactivated Suodatus pois päältä +Find +Etsi +Find what: +Etsi: Folder Comparison and Synchronization Hakemistojen vertailu ja täsmäytys Free disk space available: @@ -565,11 +573,11 @@ Tunnista ja monista muutokset molemmilla puolilla tietokannalla. Poistot ja rist If you like FFS Jos pidät FFS:tä Ignore 1-hour file time difference -Älä huomioi 1n tunnin poikkeamaa +Älä huomioi 1. tunnin poikkeamaa Ignore errors Älä huomioi virheitä Ignore subsequent errors -Jätä huomioimatta toistuvia virheitä +Jätä toistuvia virheitä huomiotta Ignore this error, retry or abort synchronization? Jätä virhe huomiotta, kokeile uudestaan tai keskeytä täsmäytys? Ignore this error, retry or abort? @@ -592,6 +600,8 @@ Initial synchronization: Ensi täsmäytys: Integrate external applications into context menu. The following macros are available: Liitä ulkoinen sovellus viitekehysvalikkoon. Seuraavat makrot ovat valittavissa: +Last synchronization not completed! +Viimeine täsmäytys jäi kesken! Leave as unresolved conflict Jätä ratkaisemattomana virheenä Left @@ -609,21 +619,23 @@ Lokin viestit: Logging Kirjaa Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. - +WOW64 varjokopiointia ei tueta. Käytä FreeFileSync 64-bittistä versiota. +Match case +Täsmää kirjainkoko Mirror ->> Peilaava ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. Vasemman hakemiston varmuuskopio: Oikea ylikirjoitetaan ja on täsmäytyksen jälkeen vasemman tarkka kopio. Monitoring active... - +Seuranta käynnissä... More than 50% of the total number of files will be copied or deleted! Enemmän kuin 50% tiedostoista kopioidaan tai poistetaan! Move column down Siirrä sarake alas Move column up Siirrä sarake ylös -Move files into a time-stamped subdirectory. - +Move files into a time-stamped subdirectory +Siirrä tiedostot aikaleimattuun hakemistoon Moving %x to Recycle Bin Siirrä %x Roskakoriin Moving file %x to user-defined directory %y @@ -633,7 +645,7 @@ Siirrä hakemisto %x valittuun hakemistoon %y Multiple... Moninkertainen... No change since last synchronization! - +Ei muutoksia edellisen täsmäytyksen jälkeen! No filter selected Suodin valitsematta Not enough free disk space available in: @@ -646,8 +658,10 @@ Number of files and directories that will be deleted Poistetaan tiedostojen ja hakemistojen lukumäärää Number of files that will be overwritten Ylikirjoitettavien tiedostojen ja hakemistojen lukumäärä -OK -OK +One of the FreeFileSync database entries within the following file is not yet existing: +Jokin FreeFileSynk tietokannan olioista puuttuu vielä tiedostossa: +One of the FreeFileSync database files is not yet existing: +Jokin FreeFileSynk tietokannan tiedostoista puuttuu vielä: 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. Täsmäytykseen valitaan vain suodatetut tiedostot/hakemistot. Suodatus suoritetaan täsmäytyksen perus hakemistojen mukaisiin suhteellisiin nimiin. Open directly @@ -669,7 +683,7 @@ Pysäytetty Please run a Compare first before synchronizing! Aja tarkistus ennen täsmäytystä. Processing folder pair: - +Käsitellään hakemistoparia: Published under the GNU General Public License: Julkaistu lisenssillä GNU General Public License: Question @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Automaattinen täsmäytys RealtimeSync configuration RealtimeSync Asetukset +Recycle Bin not yet supported for this system! + Relative path Suhteellinen polku Remove alternate settings @@ -693,7 +709,7 @@ Poista hakemistopari Remove local filter settings Poista paikalliset suotimet Renaming file %x to %y - +Nimeän tiedostoa %x nimellä %y Report translation error Ilmoita käännösvirheestä Reset @@ -702,8 +718,8 @@ Right Oikea Run minimized and write status information to a logfile Suorita pienenettynä vie status tiedot lokiin -S&ave configuration -Asetukset t&allennetaan +S&ave configuration... +Asetukset t&allennetaan... S&witch view Vaihda &näkymää Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: Hakemisto lokitiedostoille: Select variant: Valitse vaihtoehto: -Setting default synchronization directions. Please check whether they are appropriate for you. -Oletus täsmäytys kansioille valittu. Tarkista soveltuvuus. +Set direction: +Aseta suunta: +Setting default synchronization directions: Old files will be overwritten by newer files. +Aseta oletu suunta täsmäytykselle: Vanhat tiedostot ylikirjoitetaan uudemilla tiedostoilla. Show conflicts Näytä ristiriidat -Show file icons -Näytä tiedostokuvakkeet Show files that are different Näytä poikkeavat tiedostot Show files that are equal @@ -796,10 +812,8 @@ Synchronization status Täsmäytyksen status Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". Täsmäytä kaikki .doc, .zip und .exe tiedostot paitsi hakemistossa \"temp\" oleva. -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Täsmäytetään molemmat puolet: Kopioidaan uudet tai päivitetyt tiedostot molempiin hakemistoihin. -Synchronize both sides using a database. Deletions are detected automatically. -Täsmäytetään molemmat puolet käyttäen tietokantaa. Poistot suoritetaan automaattisesti. +Synchronize both sides using a database. Deletions are detected automatically +Täsmäytetään molemmat puolet käyttäen tietokantaa. Poistot suoritetaan automaattisesti Synchronize... Täsmäytä... Synchronizing... @@ -810,14 +824,10 @@ 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- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) - -The database file is not yet existing, but will be created during synchronization: -Tietokanta puuttuu, luodaan täsmäytyksen aikana. +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 file does not contain a valid configuration: Asetustiedosto ei ole kelvollinen: -The required database entry is not yet existing, but will be created during synchronization: -Tarvittava alkio puuttuu tietokannasta, se luodaan täsmäytyksen aikana: 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. Tämä vaihtoehto todennetaan kaksi samannimistä tiedostoa samaksi, jos koko JA viimeinen tallennusaika on sama. Time @@ -832,28 +842,22 @@ Total required free disk space: Vaadittu vapaa levytila: Total time: Kokonaisaika: -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. -Kohtele tiedostoja jolla aikaleima on tasan +/- tunti samoina, korjaa kesäajan siirtoa. -Two way <-> -Molempiin suuntiin <-> +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 +Kohtele tiedostoja jolla aikaleima on tasan +/- tunti samoina, korjaa kesäajan siirtoa Unable to connect to sourceforge.net! Kytkeytyminen ei onnistu kohteeseen sourceforge.net! Unable to create logfile! Lokitiedostoa ei pystytä luomaan! -Unable to initialize Recycle Bin! -Roskakorin initialisointi ei onnistu! Unresolved conflicts existing! - -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -Ristiriita sovittamatta! \n\nVoit ohittaa ristiriita ja jatkaa täsmäytystä. +Ratkaisemattomia poikkeamia! Update -> Päivittävä -> Usage: - +Käyttöaste: Use Recycle Bin Käytä Roskakoria -Use Recycle Bin when deleting or overwriting files. -Käytä Roskakoria kun poistat tai ylikirjoitat tiedostoja. +Use Recycle Bin when deleting or overwriting files +Käytä Roskakoria kun poistat tai ylikirjoitat tiedostoja User-defined directory Käytä valittua hakemistoa User-defined directory for deletion was not specified! @@ -871,11 +875,9 @@ Varoitus: täsmäytys epäonnistui %x kohdassa: When the comparison is started with this option set the following decision tree is processed: Käynnistäessä täsmäytystä näillä asetuksilla ottaa käyttöön tämä päätöspuu: You can ignore conflicts and continue synchronization. - +Voit jatkaa poikkeamista huolimatta täsmäytystä. You can ignore the error to consider not existing directories as empty. Sivuta virhe ja kohtele puuttuvat hakemistot tyhjinä. -You can ignore the error to skip current folder pair. -Sivuta virhe ja hylkää tämä hakemistopari. You may try to synchronize remaining items again (WITHOUT having to re-compare)! Yritä täsmäytystä lopuille uudestaan (ILMAN uutta vertailua)! different diff --git a/BUILD/Languages/french.lng b/BUILD/Languages/french.lng index bae3af5d..5ead6ef5 100644 --- a/BUILD/Languages/french.lng +++ b/BUILD/Languages/french.lng @@ -35,31 +35,31 @@ %x of 1 row in view %x sur 1 ligne affichée &Abort -&Abandon +&Abandonner &About... &A propos de... &Advanced &Avancé -&Apply -&Appliquer &Cancel &Annuler &Check for new version &Rechercher une nouvelle version &Content &Contenu -&Create batch job -&Créer un fichier de commandes +&Create batch job... +&Créer une tâche de traitement par lots... &Default &Défaut &Exit &Quitter -&Export file list -&Exportation de la liste des fichiers +&Export file list... +&Exportation de la liste des fichiers... &File &Fichier -&Global settings -&Paramètres généraux +&Find next +&Chercher le suivant +&Global settings... +&Paramètres généraux... &Help &Aide &Ignore @@ -68,8 +68,8 @@ &Langue &Load &Charger -&Load configuration -&Charger la configuration +&Load configuration... +&Charger la configuration... &New &Nouveau &No @@ -89,7 +89,7 @@ &Yes &Oui (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 touchées par ce problème ! \ NDans les autres cas, vous pouvez désactiver le paramètre \ "ignorer la différence d'une heure \".) +(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) , @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: Une version plus récente de FreeFileSync est disponible : Abort requested: Waiting for current operation to finish... Abandon demandé : En attente de la fin de l'opération en cours... +Abort synchronization immediately +Abandon immédiat de la synchronisation Aborted Abandonné About @@ -173,15 +175,15 @@ Ajout d'un dossier Add folder pair Ajout d'un couple de dossiers All directories in sync! -Tous les répertoires en synchro ! +Tous les répertoires sont synchronisés ! An exception occured! -Une violation s'est produite ! +Une erreur s'est produite ! As a result the files are separated into the following categories: En conclusion, les fichiers sont répartis dans les catégories suivantes : 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: Comme le nom le suggère, deux fichiers qui ont le même nom sont considérés comme identiques si, et seulement si, leur contenu est identique. Cette option est utile pour les contrôles de cohérence plutôt que pour les opérations de sauvegarde. Toutefois, les dates et heures ne sont pas du tout prises en compte.\n\nAvec cette option, l'arbre de décision est plus simple : 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 <batchfile>. This can also be scheduled in your operating system's task planner. -Créer un fichier de commandespour une synchronisation automatique. Pour démarrer en mode batch, indiquer le nom du fichier à l'exécutable FreeFileSync : freefilesync.exe <fichier de commandes>. Ceci peut aussi être programmé dans le plannificateur de tâches. +Crée un fichier de traitement par lots pour une synchronisation automatique. Pour démarrer en mode de traitement par lots, indiquer le nom du fichier à l'exécutable FreeFileSync : freefilesync.exe <fichier de commandes>. Ceci peut aussi être programmé dans le plannificateur de tâches. At least one directory input field is empty. Au moins un champ répertoire est vide. Auto-adjust columns @@ -189,9 +191,9 @@ Auto-ajustement des colonnes Automatic mode Mode automatique Batch execution -Exécution du fichier de commandes +Exécution du traitement par lots Batch file created successfully! -Fichier de commandes créé avec succès ! +Fichier de traitement par lots créé avec succès ! Batch job Fichier de commandes Big thanks for localizing FreeFileSync goes out to: @@ -202,14 +204,12 @@ Browse Parcourir Build: Créé le : -Cancel -Annuler Cannot determine sync-direction: Impossible de déterminer le sens de la synchro : +Cannot find %x +Impossible de trouver %x Category Catégorie -Change direction -Changer la direction Comma separated list Liste d'éléments séparés par une virgule Command line @@ -233,7 +233,7 @@ Comparaison du contenu des fichiers %x Comparing content... Comparaison du contenu... Comparing files by content failed. -La comparaison des fichiers par leur contenu a échouée. +La comparaison des fichiers par leur contenu a échoué. Comparison Result Résultat de la comparaison Comparison settings @@ -271,10 +271,10 @@ Copie de droite à gauche Copy from right to left overwriting Copie de droite à gauche avec remplacement Copy locked files -Copier les fichiers verrouilés +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. -Copy shared or locked files using Volume Shadow Copy Service. +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 @@ -285,13 +285,13 @@ 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: -Impossible d'initialiser la surveillance des dossiers: +Impossible d'initialiser la surveillance des dossiers : Could not load a required DLL: Impossible de charger une DLL : Could not read values for the following XML nodes: Impossible de lire les valeurs des noeuds XML suivants : Create a batch job -Création du fichier de commandes +Créer une tâche de traitement par lots Creating folder %x Création du dossier %x Current operation: @@ -308,12 +308,14 @@ DECISION TREE ARBRE DE DECISION Data remaining: Données restantes : +Data transferred: +Données transférées Data verification error: Source and target file have different content! Erreur lors du contrôle des données : Les fichiers source et destination ont des contenus différents ! Date Date Delay -délai +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 @@ -325,9 +327,9 @@ Suppression des fichiers\tDEL Delete on both sides Suppression des deux côtés Delete on both sides even if the file is selected on one side only -Suppression des deux côtés même si le fichier est sélectionné d'un seul côté -Delete or overwrite files permanently. -Supprimer ou écraser les fichiers définitivement. +Suppression des deux côtés même si le fichier n'est sélectionné que d'un seul côté +Delete or overwrite files permanently +Supprimer ou écraser les fichiers définitivement Delete permanently Suppression définitive Deleting file %x @@ -347,7 +349,7 @@ Répertoire Directory does not exist: Le répertoire n'existe pas : Do not show this dialog again -Ne pas afficher cette boîte de dialogue +Ne plus afficher ce message les prochaines fois Do nothing Ne rien faire Do you really want to delete the following objects(s)? @@ -367,7 +369,7 @@ Email Enable filter to exclude files from synchronization Activer le filtrage pour exclure les fichiers de la synchronisation Endless loop when traversing directory: -Boucle sans fin lors de la sucration du dossier +Boucle sans fin lors du parcours du répertoire : Error Erreur Error changing modification time: @@ -376,6 +378,8 @@ Error copying file: Erreur lors de la copie du fichier : Error copying locked file %x! Erreur lors de la copie du fichier verrouillé %x ! +Error copying symbolic link: +Erreur lors de la copie du lien symbolique : Error creating directory: Erreur lors de la création d'un répertoire : Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Erreur lors de la lecture du fichier : Error reading from synchronization database: Erreur lors de la lecture de la base de données de synchro : -Error resolving full path name: -Erreur lors de la résolution du chemin : Error resolving symbolic link: Erreur lors de la résolution du lien symbolique : Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Exclure temporairement Exclude via filter: Exclure à l'aide du filtre : -Exit immediately and set returncode < 0 -Sortie immédiate avec le returncode < 0 -Exit with RC < 0 -Sortie avec RC < 0 +Exit instantly +Sortie immédiate +Extension +Extension External applications Applications externes Fatal Error @@ -453,13 +455,13 @@ Taille et date du fichier Filename Nom du fichier 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. -Les fichiers %x ont une différence de date inférieure à 1 heure !\n\nIl n'est pas sain de décider quelle est la plus récente à cause de l'heure d'été. +Les fichiers %x ont une différence de date inférieure à 1 heure !\n\nIl est dangereux de décider quel est le plus récent à cause de l'heure d'été. Files %x have the same date but a different size! -Les fichiers %x ont la même data mais une taille différente ! -Files are found equal if\n - file content\nis the same. -Les fichiers sont considérés comme identiques, si\n - leur contenu est identique. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -Les fichiers sont considérés comme identiques, si\n - leur taille\n - leur date et heure sont identiques. +Les fichiers %x ont la même date mais une taille différente ! +Files are found equal if\n - file content\nis the same +Les fichiers sont considérés comme identiques, si\n - leur contenu\nest identique +Files are found equal if\n - filesize\n - last write time and date\nare the same +Les fichiers sont considérés comme identiques, si\n - leur taille\n - leur date et heure de dernière modification\nsont identiques Files remaining: Fichiers restants : Files that are equal on both sides @@ -472,12 +474,14 @@ Files that exist on both sides, right one is newer Fichiers existants des deux côtés, celui de droite est plus récent Files/folders found: Fichiers/Dossiers trouvés : +Files/folders processed: +Fichiers/dossiers traités : Files/folders remaining: Fichiers/dossiers restants : Files/folders that exist on left side only -Fichiers/répertoires existants seulement à gauche +Fichiers/répertoires existant seulement à gauche Files/folders that exist on right side only -Fichiers/répertoires existants seulement à droite +Fichiers/répertoires existant seulement à droite Filter Filtrage Filter files @@ -490,6 +494,10 @@ Filter view Filtrage de la vue Filtering is deactivated Le filtrage est désactivé +Find +Chercher +Find what: +Chercher cela : Folder Comparison and Synchronization Comparaison de Dossiers et Synchronisation Free disk space available: @@ -505,7 +513,7 @@ FreeFileSync fichier de commandes FreeFileSync configuration FreeFileSync configuration FreeFileSync is up to date! -FreeFileSync a été mis à jour ! +FreeFileSync est à jour ! Full path Chemin complet Generating database... @@ -523,7 +531,7 @@ Boîtes de dialogue masquées : Hide all error and warning messages Masquer tous les messages d'erreurs et les avertissements Hide conflicts -Conflits sur le masquage +Masquer les conflits Hide excluded items Masquer les éléments exclus Hide files that are different @@ -535,7 +543,7 @@ Masquer les fichiers plus récents à gauche Hide files that are newer on right Masquer les fichiers plus récents à droite Hide files that exist on left side only -Masquer les fichiers existant des deux côtés +Masquer les fichiers n'existant qu'à gauche Hide files that exist on right side only Masquer les fichiers n'existant qu'à droite Hide files that will be created on the left side @@ -581,7 +589,7 @@ Inclure toutes les lignes Include temporarily Inclure temporairement Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Inclure : *.doc;*.zip;*.exe\nExclure : \\stuff\\temp\\* +Inclure : *.doc;*.zip;*.exe\nExclure : \\truc\\temp\\* Incompatible synchronization database format: Format de la base de données de synchro incompatible : Info @@ -589,9 +597,11 @@ Info Information Information Initial synchronization: -Première synchronisation: +Première synchronisation : Integrate external applications into context menu. The following macros are available: Inclure les applications externes dans le menu contextuel. Les macros suivantes sont disponibles : +Last synchronization not completed! +La dernière syncronisation n'a pas été totalement terminée ! Leave as unresolved conflict Abandonner en tant que conflit non résolu Left @@ -601,7 +611,7 @@ Légende Load configuration from file Charger la configuration à partir du fichier Load configuration history (press DEL to delete items) -Charger l'historique des configuration (appuyez sur Suppr pour supprimer des éléments) +Charger l'historique des configurations (appuyez sur Suppr pour supprimer des éléments) Local filter Filtre local Log-messages: @@ -610,8 +620,10 @@ Logging Connexion Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. La copie en tâche de fond sur WOW64 n'est pas possible. Utilisez pour cela la version 64 bits de FreeFileSync. +Match case +Respecter la casse Mirror ->> -Mirroir ->> +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. Monitoring active... @@ -622,8 +634,8 @@ Move column down Déplacer la colonne vers le bas Move column up Déplacer la colonne vers le haut -Move files into a time-stamped subdirectory. -Déplacer les fichiers vers un sous-répertoire daté. +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 file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted Nombre de fichiers et de répertoires qui seront supprimés Number of files that will be overwritten Nombre de fichiers qui seront remplacés -OK -OK +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'exite 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'exite 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. Open directly @@ -667,23 +681,25 @@ Pause Paused En pause Please run a Compare first before synchronizing! -Veuillez cliquer sur "Compareré avant de lancer la synchronisation ! +Veuillez lancer une Comparaison avant de lancer la synchronisation ! Processing folder pair: Traitement de la paire de dossiers : Published under the GNU General Public License: -Publié sous la licence GNU General Public : +Publié sous licence GNU General Public License : Question Question Quit Quitter Re-enable all hidden dialogs? -Ré-autoriser les boîtes de dialogues masquées ? +Réactiver les boîtes de dialogues masquées ? RealtimeSync - Automated Synchronization RealtimeSync - Synchronisation Automatisée RealtimeSync configuration -RealtimeSync configuration +Configuration RealtimeSync +Recycle Bin not yet supported for this system! + Relative path -Chemin +Chemin relatif Remove alternate settings Supprimer les paramètres de rechange Remove folder @@ -691,25 +707,25 @@ Supprimer le dossier Remove folder pair Supprimer le couple de dossiers Remove local filter settings -Supprimer la configuration du filtre local +Supprimer la configuration locale de filtrage Renaming file %x to %y Renommage des fichiers %x en %y Report translation error -Etat d'erreurs de transfert +Etat des erreurs de transfert Reset Réinitialiser Right Droite Run minimized and write status information to a logfile -Exécution en mode réduit. Les informations d'état sont enregitrées dans un fichier .log -S&ave configuration -S&auvegarder la configuration +Exécution en mode réduit. Les informations d'état sont enregistrées dans un fichier .log +S&ave configuration... +S&auvegarder la configuration... S&witch view Changer de &vue Save changes to current configuration? -Voulez-vous enregistrer les modifications dans la configuration courante ? +Voulez-vous enregistrer les modifications dans la configuration actuelle ? Save current configuration to file -Enregistrer la configuration courante +Enregistrer la configuration actuelle Scanning... Lecture en cours... Scanning: @@ -722,12 +738,12 @@ Select logfile directory: Choisissez un dossier pour le fichier .log : Select variant: Choisissez une variante : -Setting default synchronization directions. Please check whether they are appropriate for you. -Configuration de synchronisation par défaut. Veuillez vérifiez si elles vous conviennent. +Set direction: +Choix de la direction : +Setting default synchronization directions: Old files will be overwritten by newer files. +Directions de la synchronisation par défaut : les anciens fichiers seront remplacés par les nouveaux. Show conflicts Afficher les conflits -Show file icons -Afficher les icônes Show files that are different Afficher les fichiers différents Show files that are equal @@ -737,29 +753,29 @@ Afficher les fichiers de gauche plus récents que ceux de droite Show files that are newer on right Afficher les fichiers de droite plus récents que ceux de gauche Show files that exist on left side only -Afficher les fichiers existants seulement à gauche +Afficher les fichiers existant seulement à gauche Show files that exist on right side only -Afficher les fichiers existants seulement à droite +Afficher les fichiers existant seulement à droite Show files that will be created on the left side -Afficher les ficgier qui seront créés à gauche +Afficher les fichiers qui seront créés à gauche Show files that will be created on the right side -Afficher les ficgier qui seront créés à droite +Afficher les fichiers qui seront créés à droite Show files that will be deleted on the left side -Afficher les ficgier qui seront supprimiés à gauche +Afficher les fichiers qui seront supprimés à gauche Show files that will be deleted on the right side -Afficher les ficgier qui seront supprimiés à droite +Afficher les fichiers qui seront supprimés à droite Show files that will be overwritten on left side Afficher les fichiers qui seront écrasés à gauche Show files that will be overwritten on right side Afficher les fichiers qui seront écrasés à droite Show files that won't be copied -Afficher les ficgier qui ne seront pas copiés +Afficher les fichiers qui ne seront pas copiés Show hidden dialogs Afficher les boîtes de dialogue masquées Show popup Afficher la boîte de dialogue Show popup on errors or warnings -Affiche une boîte de dialogue pour chaque erreur ou avertissement +Affiche la boîte de dialogue pour chaque erreur ou avertissement Significant difference detected: Différence significative détectée : Silent mode @@ -767,7 +783,7 @@ Mode silencieux Size Taille Source code written completely in C++ utilizing: -Code source écrit totalement en C++ et utilisant : +Code source écrit entièrement en C++ et utilisant : Source directory does not exist anymore: Le répertoire source n'existe plus : Speed: @@ -783,7 +799,7 @@ Arrêt Swap sides Permuter les côtés Synchronization Preview -Prévisualisation de la synchronisation +Prévisualisation de la Synchronisation Synchronization aborted! Synchronisation abandonnée ! Synchronization completed successfully! @@ -795,31 +811,25 @@ Paramétrage de la synchronisation Synchronization status Etat de la synchronisation Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Synchroniser rous les fichiers .doc, .zip et .exe sauf ceux du dossier \"temp\". -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Synchronisation simultanée des deux côtés : Copie des fichiers nouveaux ou mis à jour. -Synchronize both sides using a database. Deletions are detected automatically. -Synchronisation des deux côtés à l'aide d'une base de données. Les suppressions sont détectées automatiquement. +Synchroniser tous les fichiers .doc, .zip et .exe sauf ceux du dossier \"temp\". +Synchronize both sides using a database. Deletions are detected automatically +Synchronisation des deux côtés à l'aide d'une base de données. Les suppressions sont détectées automatiquement Synchronize... Synchroniser... Synchronizing... Synchronisation en cours... System out of memory! -Erreur mémoire système ! +Plus de mémoire disponible dans le système ! 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- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -La ligne de commande est exécutée chque fois que :\n- Les fichiers de ces répertoires (ou sous-répertoires sont modifiés\n- La lettre correspondant au disque devient accessible (insertion USB) -The database file is not yet existing, but will be created during synchronization: -La base de données n'existe pas encore, mais elle sera créée pendant la synchronisation : +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 file does not contain a valid configuration: Le fichier ne contient pas de configuration valide : -The required database entry is not yet existing, but will be created during synchronization: -L'entrée demandée de la base de données n'existe pas encore, mais elle sera créée pendant la 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 le même date et heure de modification. Time Heure Time elapsed: @@ -831,33 +841,27 @@ Volume de données à transférer Total required free disk space: Espace disque nécessaire : Total time: -Temps 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. -Traiter les heures qui différent exactement de +/- 1 heure comme égales, et celles qui diffèrent de moins d'une heure comme conflit sur la gestion de l'heure d'été. -Two way <-> -Des 2 côtés <-> +Durée totale : +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 +Traiter les heures qui diffèrent exactement de +/- 1 heure comme égales, et celles qui diffèrent de moins d'une heure comme conflit sur la gestion de l'heure d'été Unable to connect to sourceforge.net! Impossible de se connecter à sourceforge.net ! Unable to create logfile! Impossible de créer un fichier log ! -Unable to initialize Recycle Bin! -Impossible d'initialiser la corbeille ! Unresolved conflicts existing! Il y a des conflits non résolus ! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -Il y a des conflits non résolus !\n\nVous pouvez ignorer ces conflits et continuer la synchronisation. Update -> Mise à Jour -> Usage: Utilisation : Use Recycle Bin Utilisation de la corbeille -Use Recycle Bin when deleting or overwriting files. -Utiliser la Corbeille lors de la suppression ou du remplacement d'un fichier. +Use Recycle Bin when deleting or overwriting files +Utiliser la Corbeille lors de la suppression ou du remplacement d'un fichier User-defined directory -Réoertoire défini par l'utilisateur +Répertoire défini par l'utilisateur User-defined directory for deletion was not specified! -Le réoertoire défini par l'utilisateur pour la suppression n'a pas été indiqué ! +Le répertoire défini par l'utilisateur pour la suppression n'a pas été indiqué ! Variant Variante Verifying file %x @@ -867,20 +871,18 @@ Le nom de volume %x ne fait pas partie du nom de fichier %y ! Warning Attention Warning: Synchronization failed for %x item(s): -Attention : La synchronisation a échouée pour %x élément(s) : +Attention : La synchronisation a échoué pour %x élément(s) : When the comparison is started with this option set the following decision tree is processed: Lorsque la comparaison démarre avec cette option, l'arbre de décision suivant est exécuté : You can ignore conflicts and continue synchronization. Vous pouvez ignorer ces conflits et continuer la synchronisation. You can ignore the error to consider not existing directories as empty. Vous pouvez ignorer l'erreur considérant qu'un dossier inexistant est vide. -You can ignore the error to skip current folder pair. -Vous pouvez ignorer l'erreur pour sauter la paire de dossiers courante. You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Vous pouvez essayer de synchroniser à nouveau les éléments restants (SANS avoir à les re-comparer) ! +Vous pouvez essayer de synchroniser à nouveau les éléments restants (SANS avoir à les comparer à nouveau) ! different fichiers différents file exists on both sides -Le fichier existe des deux côtés +le fichier existe des deux côtés on one side only -Le fichier existe sur un seul côté seulement +le fichier existe sur un seul côté seulement diff --git a/BUILD/Languages/german.lng b/BUILD/Languages/german.lng index cc82a8ad..0c8a3616 100644 --- a/BUILD/Languages/german.lng +++ b/BUILD/Languages/german.lng @@ -31,35 +31,35 @@ %x is not a valid FreeFileSync batch file! %x ist keine gültige FreeFileSync-Batchdatei! %x of %y rows in view -%x von %y Zeilen in Ansicht +%x von %y Zeilen zur Ansicht %x of 1 row in view -%x von 1 Zeile in Ansicht +%x von 1 Zeile zur Ansicht &Abort &Abbrechen &About... &Ãœber... &Advanced &Erweitert -&Apply -&Anwenden &Cancel &Abbrechen &Check for new version &Auf neuere Version prüfen &Content &Inhalt -&Create batch job -&Batch-Job erstellen +&Create batch job... +&Batch-Job erstellen... &Default &Standard &Exit &Beenden -&Export file list -Dateiliste e&xportieren +&Export file list... +Dateiliste e&xportieren... &File &Datei -&Global settings -&Globale Einstellungen +&Find next +&Weitersuchen +&Global settings... +&Globale Einstellungen... &Help &Hilfe &Ignore @@ -68,8 +68,8 @@ Dateiliste e&xportieren &Sprache &Load &Laden -&Load configuration -Konfiguration &laden +&Load configuration... +Konfiguration &laden... &New &Neu &No @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: Eine neuere Version von FreeFileSync ist verfügbar: Abort requested: Waiting for current operation to finish... Abbruch initiiert: Warte, bis aktuelle Operation beendet ist... +Abort synchronization immediately +Synchronisation sofort abbrechen Aborted Abgebrochen About @@ -202,14 +204,12 @@ Browse Auswählen Build: Build: -Cancel -Abbrechen Cannot determine sync-direction: Die Synchronisationsrichtung konnte nicht bestimmt werden: +Cannot find %x +%x wurde nicht gefunden. Category Kategorie -Change direction -Richtung ändern Comma separated list Kommagetrennte Liste Command line @@ -274,8 +274,8 @@ Copy locked files Gesperrte Dateien kopieren Copy new or updated files to right folder. Neue oder aktualisierte Dateien vom linken in das rechte Verzeichnis kopieren. -Copy shared or locked files using Volume Shadow Copy Service. -Gesperrte oder gemeinsam verwendete Dateien mit Hilfe des Volume Shadow Copy Service kopieren. +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 file %x to %y @@ -308,6 +308,8 @@ DECISION TREE ENTSCHEIDUNGSBAUM Data remaining: Verbleibende Daten: +Data transferred: +Kopierte Daten: Data verification error: Source and target file have different content! Verifizierungsfehler: Quell- und Zieldatei haben unterschiedlichen Inhalt! Date @@ -326,8 +328,8 @@ Delete on both sides Auf beiden Seiten löschen Delete on both sides even if the file is selected on one side only Lösche auf beiden Seiten, auch wenn die Datei nur auf einer Seite markiert ist -Delete or overwrite files permanently. -Dateien endgültig löschen oder überschreiben. +Delete or overwrite files permanently +Dateien endgültig löschen oder überschreiben Delete permanently Endgültig löschen Deleting file %x @@ -376,6 +378,8 @@ Error copying file: Fehler beim Kopieren der Datei: Error copying locked file %x! Fehler beim Kopieren der gesperrten Datei %x! +Error copying symbolic link: +Fehler beim Kopieren des Symbolischen Links: Error creating directory: Fehler beim Erstellen des Verzeichnisses: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Fehler beim Lesen der Datei: Error reading from synchronization database: Fehler beim Lesen der Synchronisationsdatenbank: -Error resolving full path name: -Fehler beim Ermitteln des vollen Pfadnamens: Error resolving symbolic link: Fehler beim Auflösen des Symbolischen Links: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Temporär ausschließen Exclude via filter: Ãœber Filter ausschließen: -Exit immediately and set returncode < 0 -Sofort beenden und Returncode < 0 setzen -Exit with RC < 0 -Beenden mit RC < 0 +Exit instantly +Sofort beenden +Extension +Dateiendung External applications Externe Anwendungen Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de Die Dateien %x haben eine Abweichung der Dateizeit von unter einer Stunde!\n\nAufgrund der Zeitumstellungsproblematik kann nicht zweifelsfrei festgestellt werden, welche die aktuellere ist. Files %x have the same date but a different size! Die Dateien %x haben dasselbe Datum, aber eine unterschiedliche Größe! -Files are found equal if\n - file content\nis the same. -Dateien gelten als gleich, wenn\n - der Inhalt\ngleich ist. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -Dateien gelten als gleich, wenn\n - die Größe\n - Datum und Uhrzeit der letzten Änderung\ngleich sind. +Files are found equal if\n - file content\nis the same +Dateien gelten als gleich, wenn\n - der Inhalt\ngleich ist +Files are found equal if\n - filesize\n - last write time and date\nare the same +Dateien gelten als gleich, wenn\n - die Größe\n - Datum und Uhrzeit der letzten Änderung\ngleich sind Files remaining: Verbleibende Dateien: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Auf beiden Seiten existierende Dateien; rechte Datei ist neuer Files/folders found: Gefundene Dateien/Ordner: +Files/folders processed: +Verarbeitete Dateien/Ordner: Files/folders remaining: Verbleibende Dateien/Ordner: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view Ansicht filtern Filtering is deactivated Filter ist deaktiviert +Find +Suchen +Find what: +Suchen nach: Folder Comparison and Synchronization Verzeichnisvergleich und Synchronisation Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: Erstmalige Synchronisation: Integrate external applications into context menu. The following macros are available: Integriert externe Anwendungen in das Kontextmenu. Die folgenden Makros stehen zur Verfügung: +Last synchronization not completed! +Letzte Synchronisation nicht vollendet! Leave as unresolved conflict Als unbehandelten Konflikt belassen Left @@ -610,6 +620,8 @@ Logging Protokoll Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. Das Erstellen von Schattenkopien unter WOW64 wird nicht unterstützt. Bitte benutzen Sie die FreeFileSync 64-Bit Version. +Match case +Groß-/Kleinschreibung Mirror ->> Spiegeln ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,8 +634,8 @@ Move column down Spalte nach unten verschieben Move column up Spalte nach oben verschieben -Move files into a time-stamped subdirectory. -Verschiebe Dateien in ein Unterverzeichnis mit Zeitstempel. +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 file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted Anzahl der zu löschenden Dateien und Verzeichnisse Number of files that will be overwritten Anzahl der zu überschreibenden Dateien -OK -OK +One of the FreeFileSync database entries within the following file is not yet existing: +Einer der FreeFileSync Datenbankeinträge innerhalb der folgenden Datei existiert noch nicht: +One of the FreeFileSync database files is not yet existing: +Eine der FreeFileSync Datenbankdateien existiert noch nicht: 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. Für die Synchronisation werden nur die Dateien/Verzeichnisse berücksichtigt, die den Filtereinstellungen genügen. Der Filter wird dabei auf den Dateinamen relativ(!) zu den Basis-Synchronisationsverzeichnissen angewandt. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Automatisierte Synchronisation RealtimeSync configuration RealtimeSync Konfiguration +Recycle Bin not yet supported for this system! + Relative path Relativer Pfad Remove alternate settings @@ -702,8 +718,8 @@ Right Rechts Run minimized and write status information to a logfile Minimiert ausführen und Statusinformationen in eine Logdatei schreiben -S&ave configuration -Konfiguration s&peichern +S&ave configuration... +Konfiguration s&peichern ... S&witch view Ansicht &wechseln Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: Verzeichnis für Logdatei wählen: Select variant: Variante auswählen: -Setting default synchronization directions. Please check whether they are appropriate for you. -Setze Standardsynchronisationsrichtungen. Bitte prüfen Sie, ob diese für Sie passend gewählt wurden. +Set direction: +Setze Richtung: +Setting default synchronization directions: Old files will be overwritten by newer files. +Setze Standardwerte für Synchronisationsrichtungen: Alte Dateien werden durch neuere überschrieben. Show conflicts Konflikte zeigen -Show file icons -Zeige Dateisymbole Show files that are different Ungleiche Dateien anzeigen Show files that are equal @@ -796,10 +812,8 @@ Synchronization status Synchronisationsstatus Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". Alle .doc, .zip und .exe Dateien mit Ausnahme des Verzeichnisses \"temp\" werden synchronisiert. -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Beide Seiten gleichzeitig synchronisieren: Neue oder aktualisierte Dateien werden in beide Richtungen kopiert. -Synchronize both sides using a database. Deletions are detected automatically. -Beide Seiten mit Hilfe einer Datenbank synchronisieren. Löschungen werden automatisch erkannt. +Synchronize both sides using a database. Deletions are detected automatically +Beide Seiten mit Hilfe einer Datenbank synchronisieren. Löschungen werden automatisch erkannt Synchronize... Synchronisieren Synchronizing... @@ -810,14 +824,10 @@ Target directory already existing! Zielverzeichnis existiert bereits! Target file already existing! Die Zieldatei existiert bereits! -The command line is executed each time:\n- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -Die Befehlszeile wird ausgeführt wenn:\n- Dateien innerhalb dieser Verzeichnisse (oder Unterverzeichnisse) geändert werden\n- der zugehörige Laufwerksbuchstabe verfügbar wird (USB-Anschluss) -The database file is not yet existing, but will be created during synchronization: -Die Datenbankdatei existiert noch nicht, wird jedoch während der Synchronisation erzeugt werden: +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 file does not contain a valid configuration: Die Datei enthält keine gültige Konfiguration: -The required database entry is not yet existing, but will be created during synchronization: -Der benötigte Datenbankeintrag existiert noch nicht, wird jedoch während der Synchronisation erzeugt werden. 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. Diese Variante identifiziert zwei gleichnamige Dateien als gleich, wenn sie die gleiche Dateigröße haben UND der Zeitpunkt der letzten Änderung derselbe ist. Time @@ -832,28 +842,22 @@ Total required free disk space: Insgesamt benötigter freier Speicherplatz: Total time: Gesamtzeit: -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. -Betrachte Dateizeiten mit einer Differenz von genau +/- einer Stunde als gleich, mit weniger als einer Stunde als Konflikt, um Zeitumstellungen richtig zu behandeln. -Two way <-> -Beidseitig <-> +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 +Betrachte Dateizeiten mit einer Differenz von genau +/- einer Stunde als gleich, mit weniger als einer Stunde als Konflikt, um Zeitumstellungen richtig zu behandeln Unable to connect to sourceforge.net! Es konnte keine Verbindung zu sourceforge.net aufgebaut werden! Unable to create logfile! Die Protokolldatei konnte nicht erstellt werden! -Unable to initialize Recycle Bin! -Der Papierkorb konnte nicht initialisiert werden! Unresolved conflicts existing! Es existieren ungelöste Konflikte! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -Es existieren ungelöste Konflikte! \n\nDie Konflikte können ignoriert und die Synchronisation fortgesetzt werden. Update -> Aktualisieren -> Usage: Verwendung: Use Recycle Bin Papierkorb verwenden -Use Recycle Bin when deleting or overwriting files. -Papierkorb für zu löschende oder zu überschreibende Dateien nutzen. +Use Recycle Bin when deleting or overwriting files +Papierkorb für zu löschende oder zu überschreibende Dateien nutzen User-defined directory Benutzerdefiniertes Verzeichnis User-defined directory for deletion was not specified! @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. Die Konflikte können ignoriert und die Synchronisation fortgesetzt werden. You can ignore the error to consider not existing directories as empty. Dieser Fehler kann ignoriert werden, um nicht existierende Verzeichnisse als leer anzusehen. -You can ignore the error to skip current folder pair. -Der Fehler kann ignoriert und das aktuelle Verzeichnispaar übersprungen werden. You may try to synchronize remaining items again (WITHOUT having to re-compare)! Verbliebene Elemente können nochmals synchronisiert werden (OHNE dass ein erneuter Vergleich notwendig ist)! different diff --git a/BUILD/Languages/hungarian.lng b/BUILD/Languages/hungarian.lng index b2d32ead..2c865d7c 100644 --- a/BUILD/Languages/hungarian.lng +++ b/BUILD/Languages/hungarian.lng @@ -40,26 +40,26 @@ A(z) %x nem megfelelÅ‘ FreeFileSync kötegelt feladat fájl! &A programról... &Advanced &Haladó -&Apply -&Alkalmaz &Cancel &Mégsem &Check for new version &Új verzió keresése &Content &Tartalom -&Create batch job -&Kötegelt feladat létrehozása +&Create batch job... +&Kötegelt feladat létrehozása... &Default &Alapértelmezett &Exit &Kilépés -&Export file list -&Fájllista exportálása +&Export file list... +&Fájllista exportálása... &File &Fájl -&Global settings -&Globális beállÃtások +&Find next + +&Global settings... +&Globális beállÃtások... &Help &Súgó &Ignore @@ -68,8 +68,8 @@ A(z) %x nem megfelelÅ‘ FreeFileSync kötegelt feladat fájl! &Nyelv &Load &Betöltés -&Load configuration -&BeállÃtások betöltése +&Load configuration... +&BeállÃtások betöltése... &New &Új &No @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: 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 + Aborted MegszakÃtva About @@ -202,14 +204,12 @@ Browse Tallózás Build: Build: -Cancel -Mégsem Cannot determine sync-direction: Nem lehet meghatározni a szinkronizáció irányát: +Cannot find %x + Category Kategória -Change direction -Irány megváltoztatása Comma separated list Comma separated values Command line @@ -274,8 +274,8 @@ Copy locked files Zárolt fájlok másolása Copy new or updated files to right folder. Új vagy frissÃtett fájlok másolása a jobb oldali mappába. -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 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 file %x to %y @@ -308,6 +308,8 @@ DECISION TREE DÖNTÉSI FA Data remaining: HátralévÅ‘ adat: +Data transferred: + Data verification error: Source and target file have different content! AdatellenÅ‘rzési hiba: A forrás és cél fájl tartalma különbözik! Date @@ -326,8 +328,8 @@ Delete on both sides Törlés mindkét oldalon Delete on both sides even if the file is selected on one side only Törlés mindkét oldalon, még akkor is, ha csak egyik oldalon lett kijelölve -Delete or overwrite files permanently. -A fájlok folyamatos törlése vagy felülÃrása. +Delete or overwrite files permanently +A fájlok folyamatos törlése vagy felülÃrása Delete permanently Folyamatosan törölni Deleting file %x @@ -376,6 +378,8 @@ Error copying file: 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: + Error creating directory: A mappa létrehozása sikertelen: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: A fájl olvasása sikertelen: Error reading from synchronization database: Hiba történt a szinkronizációs adatbázis olvasása közben: -Error resolving full path name: -A teljes útvonal feloldása sikertelen: Error resolving symbolic link: A szimbolikus link feloldása sikertelen: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Ideiglenesen kizár Exclude via filter: Kizárás szűrÅ‘ segÃtségével: -Exit immediately and set returncode < 0 -Azonnali kilépés és a visszatérési érték < 0 -Exit with RC < 0 -Kilépés (visszatérési érték < 0) +Exit instantly + +Extension + External applications KülsÅ‘ alkalmazások Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de A(z) %x fájlok dátuma kevesebb mint 1 órával eltér!\n\nA nyári idÅ‘számÃtás miatt nem biztonságos annak eldöntése, hogy melyik az újabb közülük. Files %x have the same date but a different size! A(z) %x fájlok dátuma megegyezik, de a mérete nem! -Files are found equal if\n - file content\nis the same. -A fájlok megegyezÅ‘ ha\n - a fájlok tartalma\nmegegyezik. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -A fájlok megegyezÅ‘ ha\n - a fájlméret\n - az utolsó módosÃtás dátuma\nmegegyezik. +Files are found equal if\n - file content\nis the same +A fájlok megegyezÅ‘ ha\n - a fájlok tartalma\nmegegyezik +Files are found equal if\n - filesize\n - last write time and date\nare the same +A fájlok megegyezÅ‘ ha\n - a fájlméret\n - az utolsó módosÃtás dátuma\nmegegyezik Files remaining: HátralévÅ‘ fájlok: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Mindkét oldalon létezÅ‘ fájlok, de a jobb oldali újabb Files/folders found: Talált fájlok/mappák: +Files/folders processed: + Files/folders remaining: HátralévÅ‘ fájlok/mappák: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view SzűrÅ‘ nézet Filtering is deactivated A szűrés kikapcsolva +Find + +Find what: + Folder Comparison and Synchronization Mappa összehasonlÃtás és szinkronizáció Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: ElsÅ‘ szinkronizáció: Integrate external applications into context menu. The following macros are available: KülsÅ‘ alkalmazás integrálása a helyi menübe. Az elérhetÅ‘ makrók a következÅ‘k: +Last synchronization not completed! + Leave as unresolved conflict Feloldatlan ütközésként hagyni Left @@ -610,6 +620,8 @@ Logging 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 + Mirror ->> Tükrözés ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,8 +634,8 @@ Move column down Oszlop mozgatása lefelé Move column up Oszlop mozgatása felfelé -Move files into a time-stamped subdirectory. -Fájlok másolása idÅ‘bélyeggel ellátott almappába. +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 Moving file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted 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 -OK -OK +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. 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 directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Automatikus szinkronizálás RealtimeSync configuration RealtimeSync beállÃtások +Recycle Bin not yet supported for this system! + Relative path RelatÃv útvonal Remove alternate settings @@ -702,8 +718,8 @@ Right Jobb oldal Run minimized and write status information to a logfile Futtatás lekicsinyÃtve és a státuszinformációk mentése naplófájlba -S&ave configuration -BeállÃtások mentés&e +S&ave configuration... +BeállÃtások mentés&e... S&witch view Nézet v&áltása Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: Naplófájl mappájának kiválasztása: Select variant: Változat kiválasztása: -Setting default synchronization directions. Please check whether they are appropriate for you. -Alapértelmezett szinkronizációs irányok beállÃtása. Kérjük, ellenÅ‘rizd a helyességüket. +Set direction: + +Setting default synchronization directions: Old files will be overwritten by newer files. + Show conflicts Ãœtközések mutatása -Show file icons -Fájlok ikonjainak mutatása Show files that are different EltérÅ‘ fájlok mutatása Show files that are equal @@ -796,10 +812,8 @@ Synchronization status Szinkronizáció állapota Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". Minden .doc, .zip és .exe fájl szinkronizálása a \"temp\" almappában találhatók kivételével. -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Mindkét oldal szinkronizálása egyszerre: Új és frissÃtett fájlok másolása mindkét irányban. -Synchronize both sides using a database. Deletions are detected automatically. -Mindkét oldal szinkronizálása adatbázis segÃtségével. A törlések automatikusan felismerÅ‘dnek. +Synchronize both sides using a database. Deletions are detected automatically +Mindkét oldal szinkronizálása adatbázis segÃtségével. A törlések automatikusan felismerÅ‘dnek Synchronize... Szinkronizálás Synchronizing... @@ -810,14 +824,10 @@ 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- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -A parancssor minden egyes alkalommal végrehajtódik, ha:\n- a megadott mappákban (vagy almappákban) lévÅ‘ fájlok megváltoznak\n- a megfelelÅ‘ meghajtójel elérhetÅ‘vé válik (USB-csatolás) -The database file is not yet existing, but will be created during synchronization: -Az adatbázisfájl nem létezik, de létre lesz hozva a szinkronizáció folyamán: +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 file does not contain a valid configuration: A következÅ‘ fájl nem tartalmaz érvényes beállÃtásokat: -The required database entry is not yet existing, but will be created during synchronization: -A szükséges adatbázisbejegyzés nem létezik, de létre lesz hozva a szinkronizáció folyamán: 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 @@ -832,28 +842,22 @@ Total required free disk space: Összes igényelt szabad lemezterület: Total time: Becsült idÅ‘: -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. -A fájlok dátumának pontosan +/- 1 órával való eltérése esetén a fájlok egyeznek, a kevesebb mint 1 órával való eltérés esetén pedig ütköznek, a Nyári IdÅ‘számÃtás kezeléséhez. -Two way <-> -Kétirányú <-> +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 +A fájlok dátumának pontosan +/- 1 órával való eltérése esetén a fájlok egyeznek, a kevesebb mint 1 órával való eltérés esetén pedig ütköznek, a Nyári IdÅ‘számÃtás kezeléséhez Unable to connect to sourceforge.net! A csatlakozás a sourceforge.net-hez sikertelen! Unable to create logfile! Nem lehet létrehozni a naplófájlt! -Unable to initialize Recycle Bin! -Nem lehet inicializálni a Lomtárat (Recycle Bin)! Unresolved conflicts existing! Feloldatlan ütközések vannak! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -Feloldatlan ütközések vannak! \n\nFigyelmen kÃvül hagyhatod az ütközéseket és folytathatod a szinkronizálást. Update -> FrissÃtés -> Usage: 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. +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 User-defined directory Felhasználó által megadott mappa User-defined directory for deletion was not specified! @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. Figyelmen kÃvül hagyhatod az ütközéseket és folytathatod a szinkronizálást. You can ignore the error to consider not existing directories as empty. Figyelmen kÃvül hagyhatja a hibákat a nem létezÅ‘ mappákat üresnek tekintve. -You can ignore the error to skip current folder pair. -Figyelmen kÃvül hagyhatja a hibát az aktuális mappapár átugrásához. You may try to synchronize remaining items again (WITHOUT having to re-compare)! Meg lehet próbálni újra a megmaradt elemek szinkronizálását (az összehasonlÃtás újbóli elvégzése NÉLKÃœL)! different diff --git a/BUILD/Languages/italian.lng b/BUILD/Languages/italian.lng index df56ba46..ac3c3903 100644 --- a/BUILD/Languages/italian.lng +++ b/BUILD/Languages/italian.lng @@ -40,26 +40,26 @@ &Informazioni... &Advanced &Avanzate -&Apply -&Applica &Cancel &Annulla &Check for new version &Controlla la presenza di nuove versioni &Content &Contenuto -&Create batch job -&Crea un job in batch +&Create batch job... +&Crea un job in batch... &Default &Default &Exit &Esci -&Export file list -&Esporta la lista dei file +&Export file list... +&Esporta la lista dei file... &File &File -&Global settings -&Preferenze +&Find next +&Trova successivo +&Global settings... +&Preferenze... &Help &Aiuto &Ignore @@ -68,8 +68,8 @@ &Lingua &Load &Carica -&Load configuration -&Carica la configurazione +&Load configuration... +&Carica la configurazione... &New &Nuovo &No @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: E' disponibile una nuova versione di FreeFileSync: Abort requested: Waiting for current operation to finish... Abbandono richiesto: in attesa della fine dell'operazione in corso... +Abort synchronization immediately +Interrompi immediatamente la sincronizzazione Aborted Abbandono riuscito About @@ -202,14 +204,12 @@ Browse Sfoglia Build: Build: -Cancel -Annulla Cannot determine sync-direction: Impossibile determinare direzione di sincronia: +Cannot find %x +Impossibile trovare %x Category Categoria -Change direction -Cambia direzione Comma separated list Lista di elementi separati da virgola Command line @@ -274,7 +274,7 @@ Copy locked files Copia file bloccati Copy new or updated files to right folder. Copia file nuovi o aggiornati nella cartella di destra. -Copy shared or locked files using Volume Shadow Copy Service. +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 @@ -308,6 +308,8 @@ DECISION TREE ALBERO DELLE DECISIONI Data remaining: Dati rimanenti: +Data transferred: +Dati trasferiti: Data verification error: Source and target file have different content! Errore in verifica data: I file sorgente e destinazione hanno differente contenuto! Date @@ -326,8 +328,8 @@ Delete on both sides Cancella su entrambi i lati Delete on both sides even if the file is selected on one side only Cancella su entrambi i lati anche se il file è selezionato su un solo lato. -Delete or overwrite files permanently. -Cancella o sovrascrivi file definitivamente. +Delete or overwrite files permanently +Cancella o sovrascrivi file definitivamente Delete permanently Cancella definitivamente Deleting file %x @@ -376,6 +378,8 @@ Error copying file: Errore durante la copia del file: Error copying locked file %x! Errore durante la copia del file bloccato %x! +Error copying symbolic link: +Errore durante la copia del link simbolico: Error creating directory: Errore durante la creazione della directory: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Errore durante la lettura del file: Error reading from synchronization database: Errore in lettura dal database di sincronizzione: -Error resolving full path name: -Errore nella risoluzione del nome di percorso completo: Error resolving symbolic link: Errore nella risoluzione di collegamento simbolico: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Escludi temporaneamente Exclude via filter: Escludi tramite filtro: -Exit immediately and set returncode < 0 -Esci immediatamente ed imposta returncode < 0 -Exit with RC < 0 -Esci con RC < 0 +Exit instantly +Esci istantaneamente +Extension +Estensione External applications Applicazioni esterne Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de La data dei file %x differisce per meno di 1 ora!\n\nNon è sicuro decidere quale dei due è il più recente con la funzione Daylight Saving Time. Files %x have the same date but a different size! I file %x hanno la stessa data ma dimensione diversa! -Files are found equal if\n - file content\nis the same. -I file sono considerati identici se\n - il contenuto\nè identico. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -I file sono considerati identici se\n - dimensione\n - data e ora sono identici. +Files are found equal if\n - file content\nis the same +I file sono considerati identici se\n - il contenuto\nè identico +Files are found equal if\n - filesize\n - last write time and date\nare the same +I file sono considerati identici se\n - dimensione\n - data e ora sono identici Files remaining: File rimanenti: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Files esistenti su entrambi i lati, più recenti a destra Files/folders found: Files/cartelle trovati: +Files/folders processed: +Files/cartelle processati: Files/folders remaining: Files/cartelle restanti: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view Filtro della vista Filtering is deactivated Filtro disattivato +Find +Trova +Find what: +Trova cosa: Folder Comparison and Synchronization Comparazione di Cartelle e Sincronizzazione Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: Prima sincronizzazione: Integrate external applications into context menu. The following macros are available: Integra applicazioni esterne nel menu contestuale. Sono disponibili le seguenti macro: +Last synchronization not completed! +Ultima sincronizzazione non completata! Leave as unresolved conflict Lascia come conflitti irrisolti Left @@ -610,6 +620,8 @@ Logging Logging Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. La creazione di copie shadow su WOW64 non e' supportata. Utilizzare FreeFileSync in versione 64-bit. +Match case +Corrispondenza Mirror ->> Mirror ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,8 +634,8 @@ Move column down Sposta colonna giu' Move column up Sposta colonna su' -Move files into a time-stamped subdirectory. -Sposta file in una sotto-cartella datata. +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 file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted Numero di file e cartelle che verranno eliminati Number of files that will be overwritten Numero di file che verranno sovrascritti -OK -OK +One of the FreeFileSync database entries within the following file is not yet existing: +Una voce del database di FreeFileSync nel seguente file non e' ancora stata creata: +One of the FreeFileSync database files is not yet existing: +Un file database di FreeFileSync non è ancora stato creato: 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. Solo file e directory che passano il filtro saranno selezionati per la sincronizzazione. Il filtro verrà applicato al nome relativo(!) sulla base delle directory di sincronizzazione. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Sincronizzazione Automatizzata RealtimeSync configuration Configurazione di RealtimeSync +Recycle Bin not yet supported for this system! + Relative path Percorso relativo Remove alternate settings @@ -702,8 +718,8 @@ Right Destra Run minimized and write status information to a logfile Lancia minimizzato e scrivi informazioni di stato in un log -S&ave configuration -S&alva la configurazione +S&ave configuration... +S&alva la configurazione... S&witch view C&ommuta vista Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: Seleziona cartella per il file di log: Select variant: Selezionare una variante: -Setting default synchronization directions. Please check whether they are appropriate for you. -Impostazione direzione standard di sincronizzazione. Prego controlla se sono adatte per te. +Set direction: +Imposta direzione: +Setting default synchronization directions: Old files will be overwritten by newer files. +Imposta direzioni di sincronizzazione di default: I vecchi file saranno sovrascritti dai nuovi. Show conflicts Mostra conflitti -Show file icons -Mostra icone dei file Show files that are different Mostra file differenti Show files that are equal @@ -796,10 +812,8 @@ Synchronization status Stato della sincronizzazione Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". Sincronizza tutti i file .doc, .zip e .exe eccetto tutti quelli nella cartella \"temp\". -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Sincronizza simultaneamente entrambi i lati: Copia file nuovi o aggiornati in entrambe le direzioni. -Synchronize both sides using a database. Deletions are detected automatically. -Sincronizza entrmbi i lati usando un database. Le cancellazioni sono rilevate automaticamente. +Synchronize both sides using a database. Deletions are detected automatically +Sincronizza entrmbi i lati usando un database. Le cancellazioni sono rilevate automaticamente Synchronize... Sincronizza... Synchronizing... @@ -810,14 +824,10 @@ 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- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -La linea di comando e' eseguita ogni volta che:\n- I file in queste cartelle (o sottocartelle) sono modificati\n- La corrispondente unita' disco e' disponibile (inserimento USB) -The database file is not yet existing, but will be created during synchronization: -Il database non e' ancora esistente, ma verra' creato durante la sincronizzazione: +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 file does not contain a valid configuration: Il file non contiene una configurazione valida -The required database entry is not yet existing, but will be created during synchronization: -Il database richiesto non e' ancora esistente, ma verra' creato durante la 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 @@ -832,28 +842,22 @@ Total required free disk space: Spazio libero su disco richiesto: Total time: Tempo totale: -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. -Tratta file time che differiscono di esattamente +/- 1 ora come uguali, meno di 1 ora come conflitto per gestire i cambiamenti di Daylight Saving Time. -Two way <-> -Dai 2 lati <-> +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 +Tratta file time che differiscono di esattamente +/- 1 ora come uguali, meno di 1 ora come conflitto per gestire i cambiamenti di Daylight Saving Time Unable to connect to sourceforge.net! Impossibile collegarsi a sourceforge.net! Unable to create logfile! Impossibile creaer il file di log! -Unable to initialize Recycle Bin! -Impossibile inizializzare il Cestino! Unresolved conflicts existing! Sono presenti conflitti irrisolti! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -Sono presenti conflitti irrisolti! \n\nPuoi ignorare i conflitti e continuare la sincronizzazione. Update -> Aggiorna -> Usage: Uso: Use Recycle Bin Usa il Cestino -Use Recycle Bin when deleting or overwriting files. -Usa il Cestino quando si cancella o sovrascrive un file. +Use Recycle Bin when deleting or overwriting files +Usa il Cestino quando si cancella o sovrascrive un file User-defined directory Directory personalizzata User-defined directory for deletion was not specified! @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. Puoi ignorare i conflitti e continuare la sincronizzazione. You can ignore the error to consider not existing directories as empty. Puoi ignorare l'errore per considerare directory inesistenti come vuote. -You can ignore the error to skip current folder pair. -Puoi ignorare l'errore per saltare la coppia di cartelle corrente. You may try to synchronize remaining items again (WITHOUT having to re-compare)! Puoi provare a sincronizzare di nuovo gli elementi restanti (SENZA doverli ri-comparare) ! different diff --git a/BUILD/Languages/japanese.lng b/BUILD/Languages/japanese.lng index f6a81d65..5e0e9077 100644 --- a/BUILD/Languages/japanese.lng +++ b/BUILD/Languages/japanese.lng @@ -40,26 +40,26 @@ æƒ…å ±(&A)... &Advanced æ‹¡å¼µ(&A) -&Apply -é©ç”¨(&A) &Cancel ã‚ャンセル(&C) &Check for new version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æ›´æ–°ã®ç¢ºèª(&C) &Content トピック(&C) -&Create batch job -一括ジョブを作æˆ(&C) +&Create batch job... +一括ジョブを作æˆ(&C)... &Default デフォルト(&D) &Exit 終了(&E) -&Export file list -ファイル一覧をエクスãƒãƒ¼ãƒˆ(&E) +&Export file list... +ファイル一覧をエクスãƒãƒ¼ãƒˆ(&E)... &File ファイル(&F) -&Global settings -全般的ãªè¨å®š(&G) +&Find next +次を検索(&F) +&Global settings... +全般的ãªè¨å®š(&G)... &Help ヘルプ(&H) &Ignore @@ -68,8 +68,8 @@ 使用言語(&L) &Load èªã¿è¾¼ã¿(&L) -&Load configuration -構æˆè¨å®šã®èªã¿è¾¼ã¿(&L) +&Load configuration... +構æˆè¨å®šã®èªã¿è¾¼ã¿(&L)... &New æ–°è¦(&N) &No @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: FreeFileSync ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™: Abort requested: Waiting for current operation to finish... ユーザã«ã‚ˆã‚‹ä¸æ–: ç¾åœ¨ã®å‡¦ç†ã‚’終了ã—ã¦ã„ã¾ã™.. ãŠå¾…ã¡ãã ã•ã„... +Abort synchronization immediately +今ã™ãã«åŒæœŸå‡¦ç†ã‚’ä¸æ– Aborted ä¸æ– About @@ -202,14 +204,12 @@ Browse å‚ç…§ Build: ビルド: -Cancel -ä¸æ¢ Cannot determine sync-direction: åŒæœŸæ–¹å‘ãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“: +Cannot find %x +%x ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ Category カテゴリ -Change direction -æ–¹å‘を変更 Comma separated list カンマ区切り Command line @@ -274,7 +274,7 @@ Copy locked files ãƒãƒƒã‚¯ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピー Copy new or updated files to right folder. æ–°ã—ã„(æ›´æ–°)ファイルをå³ãƒ•ã‚©ãƒ«ãƒ€ã«ã‚³ãƒ”ー -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 クリップボードã«ã‚³ãƒ”ー\tCTRL+C @@ -308,6 +308,8 @@ DECISION TREE [判定ツリー] Data remaining: 残りã®ãƒ‡ãƒ¼ã‚¿: +Data transferred: +転é€æ¸ˆãƒ‡ãƒ¼ã‚¿: Data verification error: Source and target file have different content! データ検証エラー: ソースã¨å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã«ç•°ãªã‚‹å†…容ãŒå«ã¾ã‚Œã¦ã„ã¾ã™! Date @@ -326,7 +328,7 @@ Delete on both sides 両方を削除 Delete on both sides even if the file is selected on one side only 片å´ã®ãƒšã‚¤ãƒ³ã®ã¿é¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã§ã‚‚両方を削除ã™ã‚‹ -Delete or overwrite files permanently. +Delete or overwrite files permanently ファイルを上書ãã€ã¾ãŸã¯å®Œå…¨ã«å‰Šé™¤ Delete permanently 完全ã«å‰Šé™¤ @@ -376,6 +378,8 @@ Error copying file: ファイルã®ã‚³ãƒ”ーã«å¤±æ•—: Error copying locked file %x! コピーã«å¤±æ•—! ファイル%x ã¯ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™! +Error copying symbolic link: +シンボリックリンクã®ã‚³ãƒ”ーã«å¤±æ•—: Error creating directory: ディレクトリ作æˆã‚¨ãƒ©ãƒ¼: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: ファイルèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: Error reading from synchronization database: åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‹ã‚‰ã®èªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: -Error resolving full path name: -フルパスåã®è§£æ±ºã‚¨ãƒ©ãƒ¼: Error resolving symbolic link: シンボリックリンクã®è§£æ±ºã«å¤±æ•—: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily 一時フォルダを除外 Exclude via filter: フィルターを通ã—ã¦é™¤å¤– -Exit immediately and set returncode < 0 -ã™ãã«çµ‚了ã™ã‚‹å ´åˆã®æˆ»ã‚Šå€¤è¨å®š < 0 -Exit with RC < 0 -RC ã§çµ‚了 < 0 +Exit instantly +ã™ãã«çµ‚了 +Extension +æ‹¡å¼µå External applications 外部アプリケーション Fatal Error @@ -456,9 +458,9 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de ファイル %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. +Files are found equal if\n - file content\nis the same ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ\n - ファイル内容\nã§åˆ¤æ–ã™ã‚‹ -Files are found equal if\n - filesize\n - last write time and date\nare the same. +Files are found equal if\n - filesize\n - last write time and date\nare the same ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ\n - ファイルサイズ\n - 最終書ãè¾¼ã¿æ™‚é–“ã¨æ—¥ä»˜\nã§åˆ¤æ–ã™ã‚‹ Files remaining: 残りã®ãƒ•ã‚¡ã‚¤ãƒ«: @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer 両å´ã«å˜åœ¨ã™ã‚‹ãŒã€å³å´ã®æ–¹ãŒã‚ˆã‚Šæ–°ã—ã„ Files/folders found: 発見ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«/フォルダ: +Files/folders processed: +処ç†æ¸ˆãƒ•ã‚¡ã‚¤ãƒ«/フォルダ: Files/folders remaining: リãƒãƒ¼ãƒ ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«/フォルダ: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view 表示フィルター Filtering is deactivated フィルタリングã¯éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã§ã™ +Find +検索 +Find what: +検索語: Folder Comparison and Synchronization フォルダã®æ¯”較ã¨åŒæœŸ Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: åŒæœŸå‡¦ç†ã®åˆæœŸåŒ–: Integrate external applications into context menu. The following macros are available: 外部ã®ã‚¢ãƒ—リケーションをコンテã‚ストメニューã«çµ±åˆã€ä»¥ä¸‹ã®ãƒžã‚¯ãƒãŒåˆ©ç”¨ã§ãã¾ã™: +Last synchronization not completed! +最後ã®åŒæœŸãŒå®Œäº†ã—ã¦ã„ã¾ã›ã‚“! Leave as unresolved conflict 未解決ã®ç«¶åˆã‚’残㙠Left @@ -610,6 +620,8 @@ Logging ãƒã‚° Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. WOW64 ã§ã¯ã€ãƒœãƒªãƒ¥ãƒ¼ãƒ シャドウコピーã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“ã€FreeFileSync 64-bit 版をãŠè©¦ã—ãã ã•ã„。 +Match case +æ–‡å—種を区別 Mirror ->> ミラー >> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,7 +634,7 @@ Move column down 列を下ã«ç§»å‹• Move column up 列を上ã«ç§»å‹• -Move files into a time-stamped subdirectory. +Move files into a time-stamped subdirectory ファイルをタイムスタンプåã®ã‚µãƒ–フォルダã«ç§»å‹• Moving %x to Recycle Bin %x をゴミ箱ã«ç§»å‹•ä¸ @@ -646,8 +658,10 @@ Number of files and directories that will be deleted 削除ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•° Number of files that will be overwritten 上書ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«æ•° -OK -OK +One of the FreeFileSync database entries within the following file is not yet existing: +FreeFileSync データベースã«ã€ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«é–¢ã™ã‚‹ã‚¨ãƒ³ãƒˆãƒªã¯å˜åœ¨ã—ã¾ã›ã‚“: +One of the FreeFileSync database files is not yet existing: +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. フィルターã«é©åˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/ディレクトリã®ã¿åŒæœŸå¯¾è±¡ã«é¸æŠžã•ã‚Œã¾ã™ã€‚ã“ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã¯ã€åŒæœŸåŸºæº–ディレクトリã¸ã®ç›¸å¯¾çš„(!)ãªåå‰ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚ Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization リアルタイムåŒæœŸ - 自動åŒæœŸ RealtimeSync configuration リアルタイムåŒæœŸã®æ§‹æˆè¨å®š +Recycle Bin not yet supported for this system! + Relative path 相対パス Remove alternate settings @@ -702,8 +718,8 @@ Right å³å´ Run minimized and write status information to a logfile 最å°åŒ–ã§èµ·å‹•ã—ã¦ã€ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹æƒ…å ±ã‚’ãƒã‚°ã«æ›¸ã込む -S&ave configuration -構æˆè¨å®šã‚’ä¿å˜(&A) +S&ave configuration... +構æˆè¨å®šã‚’ä¿å˜(&A)... S&witch view 表示切り替ãˆ(&W) Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å˜å…ˆã‚’é¸æŠž: Select variant: 変数をé¸æŠž: -Setting default synchronization directions. Please check whether they are appropriate for you. -デフォルトã®åŒæœŸæ–¹å‘ã‚’è¨å®šã—ã¾ã™ã€ãã—ã¦ãã®æ–¹å‘ãŒé©åˆ‡ã§ã‚ã‚‹ã‹ã‚’確èªã—ã¦ãã ã•ã„。 +Set direction: +æ–¹å‘ã®è¨å®š: +Setting default synchronization directions: Old files will be overwritten by newer files. +åŒæœŸæ–¹å‘ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨å®š: å¤ã„ファイルã«æ–°ã—ã„ファイルを上書ã Show conflicts ä¸ä¸€è‡´ã‚’表示 -Show file icons -アイコンを表示 Show files that are different 差異ã®ã‚るファイルを表示 Show files that are equal @@ -796,10 +812,8 @@ Synchronization status åŒæœŸå‡¦ç†: ステータス Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". \"temp\" ã®ã‚µãƒ–フォルダを除ã„ã¦ã€ã™ã¹ã¦ã®.docã€.zipã€ãŠã‚ˆã³.exeファイルをåŒæœŸ -Synchronize both sides simultaneously: Copy new or updated files in both directions. -両å´ã‚’åŒæ™‚ã«å‡¦ç†: 両方ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ã‚ˆã‚Šæ–°ã—ã„ファイルをコピー -Synchronize both sides using a database. Deletions are detected automatically. -データベースを利用ã—ã¦ä¸¡å´ã‚’åŒæœŸã€å‰Šé™¤ã•ã‚ŒãŸã‚‚ã®ã¯è‡ªå‹•çš„ã«æ¤œå‡ºã•ã‚Œã¾ã™ã€‚ +Synchronize both sides using a database. Deletions are detected automatically +データベースを利用ã—ã¦ä¸¡å´ã‚’åŒæœŸã€å‰Šé™¤ã•ã‚ŒãŸã‚‚ã®ã¯è‡ªå‹•çš„ã«æ¤œå‡ºã•ã‚Œã¾ã™ Synchronize... åŒæœŸå‡¦ç†... Synchronizing... @@ -810,14 +824,10 @@ Target directory already existing! 対象ディレクトリã¯ã™ã§ã«å˜åœ¨ã—ã¾ã™! Target file already existing! 対象ファイルã¯æ—¢ã«å˜åœ¨ã—ã¾ã™! -The command line is executed each time:\n- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -ã“ã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã¯é€æ¬¡å®Ÿè¡Œã•ã‚Œã¾ã™:\n- ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª(サブディレクトリ)内ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™ã€‚\n- 対応ã™ã‚‹ãƒ‰ãƒ©ã‚¤ãƒ–レターã¯ã€USB 挿入時ã«æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ -The database file is not yet existing, but will be created during synchronization: -ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ã¾ã å˜åœ¨ã—ã¾ã›ã‚“ãŒã€åŒæœŸå‡¦ç†ã®å®Ÿè¡Œä¸ã«ä½œæˆã•ã‚Œã¾ã™: +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 file does not contain a valid configuration: ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã¯æœ‰åŠ¹ãªæ§‹æˆãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“: -The required database entry is not yet existing, but will be created during 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 @@ -832,27 +842,21 @@ 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. +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 ファイルã®æ™‚é–“ã® +/- ã‚’æ£ç¢ºã« 1 時間以上ã®å·®ç•°ã¯ä¸ä¸€è‡´ã€1 時間未満ã®å·®ç•°ã¯åŒæ§˜ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦å–り扱ã„ã¾ã™(å¤æ™‚é–“ã¯å¤‰æ›ã•ã‚Œã¾ã™) -Two way <-> -ä¸¡æ–¹å‘ <-> Unable to connect to sourceforge.net! Sourceforge.net ã«æŽ¥ç¶šã§ãã¾ã›ã‚“! Unable to create logfile! ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆå‡ºæ¥ã¾ã›ã‚“! -Unable to initialize Recycle Bin! -ゴミ箱ã®åˆæœŸåŒ–ãŒå‡ºæ¥ã¾ã›ã‚“! Unresolved conflicts existing! 未解決ã®ä¸ä¸€è‡´ãŒã‚ã‚Šã¾ã™! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -未解決ã®ä¸ä¸€è‡´ãŒã‚ã‚Šã¾ã™! \n\nã“ã®ä¸ä¸€è‡´ã‚’無視ã—ã¦åŒæœŸã‚’続行ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ Update -> æ›´æ–° -> Usage: 使用方法: Use Recycle Bin ゴミ箱を使用 -Use Recycle Bin when deleting or overwriting files. +Use Recycle Bin when deleting or overwriting files ファイルã®å‰Šé™¤ã€ä¸Šæ›¸ã時ã«ã‚´ãƒŸç®±ã‚’使用ã™ã‚‹ User-defined directory ユーã§å®šç¾©ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. ã“ã®ä¸ä¸€è‡´ã‚’無視ã—ã¦åŒæœŸã‚’続行ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ You can ignore the error to consider not existing directories as empty. æ—¢å˜ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒç©ºã§ã¯ãªã„ã¨ã„ã†ã‚¨ãƒ©ãƒ¼ã¯ç„¡è¦–ã§ãã¾ã™ã€‚ -You can ignore the error to skip current folder pair. -ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒšã‚¢ã®ã‚¨ãƒ©ãƒ¼ã‚’無視ã—ã¦ã‚¹ã‚ップã§ãã¾ã™ã€‚ You may try to synchronize remaining items again (WITHOUT having to re-compare)! 残ã£ã¦ã„るファイルã¯ã€å†ã³åŒæœŸã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ (å†æ¯”較ã¨ã¯åˆ¥ã®å‹•ä½œ)! different diff --git a/BUILD/Languages/polish.lng b/BUILD/Languages/polish.lng index 90499bee..bb276c1e 100644 --- a/BUILD/Languages/polish.lng +++ b/BUILD/Languages/polish.lng @@ -40,26 +40,26 @@ &O Programie... &Advanced &Zaawansowane -&Apply -&Zastosuj &Cancel &Anuluj &Check for new version &Aktualizuj &Content &Zawartość -&Create batch job -&Twórz plik wsadowy +&Create batch job... +&Twórz plik wsadowy... &Default &DomyÅ›lne &Exit &WyjÅ›cie -&Export file list -&Eksportuj listÄ™ plików +&Export file list... +&Eksportuj listÄ™ plików... &File &Plik -&Global settings -&Ustawienia programu +&Find next + +&Global settings... +&Ustawienia programu... &Help &Pomoc &Ignore @@ -68,8 +68,8 @@ &JÄ™zyk &Load &Wczytaj -&Load configuration -&Wczytaj konfiguracjÄ™ +&Load configuration... +&Wczytaj konfiguracjÄ™... &New &Nowy &No @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: DostÄ™pna jest nowa wersja FreeFileSync: Abort requested: Waiting for current operation to finish... Żądanie przerwania: Czekaj na koniec aktualnie wykonywanego zadania... +Abort synchronization immediately + Aborted Przerwana About @@ -202,14 +204,12 @@ Browse PrzeglÄ…daj Build: Buduj: -Cancel -Anuluj Cannot determine sync-direction: Nie można okreÅ›lić kierunku synchronizacji: +Cannot find %x + Category Kategoria -Change direction -ZmieÅ„ kierunek Comma separated list Lista oddzielona przecinkami Command line @@ -274,8 +274,8 @@ Copy locked files Kopiuj zablokowane pliki Copy new or updated files to right folder. Kopiuj nowe lub aktualniejsze pliki na prawÄ… stronÄ™. -Copy shared or locked files using Volume Shadow Copy Service. -Kopiuj współdzielone lub zablokowane pliki używajÄ…c Volume Shadow Copy Service. +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 file %x to %y @@ -308,6 +308,8 @@ DECISION TREE DRZEWO DECYZYJNE Data remaining: PozostaÅ‚e dane: +Data transferred: + Data verification error: Source and target file have different content! BÅ‚Ä…d weryfikacji danych: Plik źródÅ‚owy i docelowy różniÄ… siÄ™ zawartoÅ›ciÄ…! Date @@ -326,8 +328,8 @@ Delete on both sides UsuÅ„ po obu stronach Delete on both sides even if the file is selected on one side only UsuÅ„ po obu stronach nawet jeżeli plik zaznaczony jest tylko po jednej stronie -Delete or overwrite files permanently. -UsuÅ„ lub nadpisz pliki na staÅ‚e. +Delete or overwrite files permanently +UsuÅ„ lub nadpisz pliki na staÅ‚e Delete permanently UsuÅ„ na staÅ‚e Deleting file %x @@ -376,6 +378,8 @@ Error copying file: BÅ‚Ä…d podczas kopiowania pliku: Error copying locked file %x! BÅ‚Ä…d podczas kopiowania zablokowanego pliku %x! +Error copying symbolic link: + Error creating directory: BÅ‚Ä…d podczas tworzenia katalogu: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: BÅ‚Ä…d odczytu pliku: Error reading from synchronization database: BÅ‚Ä…d odczytu z bazy danych synchronizacji: -Error resolving full path name: -BÅ‚ad odczytu peÅ‚nej nazwy dla Å›cieżki: Error resolving symbolic link: BÅ‚Ä…d odczytu dowiÄ…zania symbolicznego: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Wyklucz tymczasowo Exclude via filter: Dodaj filtr: -Exit immediately and set returncode < 0 -ZakoÅ„cz natychmiastowo i zwróć wartość < 0 -Exit with RC < 0 -ZakoÅ„cz z RC < 0 +Exit instantly + +Extension + External applications Aplikacje zewnÄ™trzne Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de Pliki %x różniÄ… siÄ™ mniej niż 1 godzinÄ™.\n\nNie można bezpiecznie okreÅ›lić, który plik jest nowszy zgodnie z przesuniÄ™ciem czasu letniego. Files %x have the same date but a different size! Pliki %x majÄ… tÄ… samÄ… datÄ™ lecz różne rozmiary! -Files are found equal if\n - file content\nis the same. -Pliki sÄ… jednakowe jeżeli\n - zawartość pliku\njest identyczna. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -Pliki sÄ… jednakowe jeżeli\n - rozmiar pliku\n - czas i data modyfikacji\nsÄ… identyczne. +Files are found equal if\n - file content\nis the same +Pliki sÄ… jednakowe jeżeli\n - zawartość pliku\njest identyczna +Files are found equal if\n - filesize\n - last write time and date\nare the same +Pliki sÄ… jednakowe jeżeli\n - rozmiar pliku\n - czas i data modyfikacji\nsÄ… identyczne Files remaining: PozostaÅ‚e pliki: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Pliki, które istniejÄ… po obu stronach, prawa strona jest nowsza Files/folders found: Znalezione pliki/katalogi: +Files/folders processed: + Files/folders remaining: PozostaÅ‚e Pliki/katalogi: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view Filtr podglÄ…du Filtering is deactivated Filtrowanie jest wyÅ‚Ä…czone +Find + +Find what: + Folder Comparison and Synchronization Porównywanie i Synchronizacja folderów Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: WstÄ™pna synchronizacja: Integrate external applications into context menu. The following macros are available: DoÅ‚Ä…cz zewnÄ™trznÄ… aplikacjÄ™ do menu kontekstowego. DostÄ™pne macra: +Last synchronization not completed! + Leave as unresolved conflict Zostaw jako nierozwiÄ…zany konflikt Left @@ -610,6 +620,8 @@ Logging Tworzenie logów Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. Tworzenie Shadow Copies dla WOW64 nie jest obsÅ‚ugiwane. Zainstaluj 64 bitowÄ… wersjÄ™ FreeFileSync. +Match case + Mirror ->> Lustrzana ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,8 +634,8 @@ Move column down PrzesuÅ„ kolumnÄ™ w dół Move column up PrzesuÅ„ kolumnÄ™ do góry -Move files into a time-stamped subdirectory. -PrzenieÅ› pliki do oznaczonego podkatalogu. +Move files into a time-stamped subdirectory +PrzenieÅ› pliki do oznaczonego podkatalogu Moving %x to Recycle Bin Przenoszenie %x do kosza. Moving file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted Liczba plików i katalogów, które zostanÄ… usuniÄ™te Number of files that will be overwritten Liczba plików, które zostanÄ… nadpisane -OK -OK +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. Tylko pliki/katalogi zaakceptowane przez filtr bÄ™dÄ… synchronizowane. Filtr dziaÅ‚a dla nazw nazw relatywnych(!) wzglÄ™dem katalogu bazowego. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Automatyczna Synchronizacja RealtimeSync configuration RealtimeSync konfiguracja +Recycle Bin not yet supported for this system! + Relative path Relatywna Å›cieżka Remove alternate settings @@ -702,8 +718,8 @@ Right Prawy Run minimized and write status information to a logfile Uruchom w trybie ukrytym i zapisz informacje w logu -S&ave configuration -Z&apisz konfiguracjÄ™ +S&ave configuration... +Z&apisz konfiguracjÄ™... S&witch view P&rzeÅ‚Ä…cz widok Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: Wybierz katalog z logami: Select variant: Wybierz wariant: -Setting default synchronization directions. Please check whether they are appropriate for you. -Ustawiono domyÅ›lne kierunki synchronizacji. Sprawdź czy sÄ… dla Ciebie odpowiednie. +Set direction: + +Setting default synchronization directions: Old files will be overwritten by newer files. + Show conflicts Pokaż konflikty -Show file icons -Ukryj ikony plików Show files that are different Pokaż pliki, które siÄ™ różniÄ… Show files that are equal @@ -796,10 +812,8 @@ Synchronization status Status synchronizacji Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". Synchronizuj wszystkie pliki .doc, .zip i exe z wyjÄ…tkiem folderu \"temp\" -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Synchronizuj obie strony jednoczeÅ›nie: Kopiuj nowe albo uaktualniaj w obu folderach. -Synchronize both sides using a database. Deletions are detected automatically. -Synchronizuj strony przy użyciu bazy danych. UsuniÄ™cia wykrywane sÄ… automatycznie. +Synchronize both sides using a database. Deletions are detected automatically +Synchronizuj strony przy użyciu bazy danych. UsuniÄ™cia wykrywane sÄ… automatycznie Synchronize... Synchronizuj... Synchronizing... @@ -810,14 +824,10 @@ Target directory already existing! Katalog docelowy już istnieje! Target file already existing! Plik docelowy już istnieje! -The command line is executed each time:\n- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -Komenda ta jest wykonywana za każdym razem gdy:\n- Pliki w tych katalogach (lub podkatalogach) sÄ… modyfikowane\n- Odpowiednia litera dysku jest aktywna (PodÅ‚Ä…czenie USB) -The database file is not yet existing, but will be created during synchronization: -Plik bazy danych nie istnieje, ale zostanie utworzony podczas synchronizacji: +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 file does not contain a valid configuration: NieprawidÅ‚owy format pliku: -The required database entry is not yet existing, but will be created during synchronization: -Wymagany wpis bazy danych nie istnieje, ale zostanie utworzony podczas synchronizacji: 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. Ten wariant traktuje dwa pliki jako równe w przypadku gdy majÄ… jednakowy rozmiar oraz tÄ… samÄ… datÄ™ i czas ostatniej modyfikacji. Time @@ -832,28 +842,22 @@ Total required free disk space: CaÅ‚kowita wymagana przestrzeÅ„ dyskowa: Total time: CaÅ‚kowity czas: -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. -Traktuj pliki różniÄ…ce siÄ™ dokÅ‚adnie +/- 1 godzinÄ™ jako równe, mniej niż 1 godzinÄ™ jako konflikt by uwzglÄ™dnić zmiane czasu letniego. -Two way <-> -Obustronna <-> +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 +Traktuj pliki różniÄ…ce siÄ™ dokÅ‚adnie +/- 1 godzinÄ™ jako równe, mniej niż 1 godzinÄ™ jako konflikt by uwzglÄ™dnić zmiane czasu letniego Unable to connect to sourceforge.net! Nie można siÄ™ poÅ‚Ä…czyć z sourceforge.net! Unable to create logfile! Nie można utworzyć pliku z logami! -Unable to initialize Recycle Bin! -Nie można zainicjalizować Kosz! Unresolved conflicts existing! IstniejÄ… nierozwiÄ…zane konflikty! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -IstniejÄ… nierozwiÄ…zane konflikty! \n\nMożesz je zignorować i kontynuÅ‚ować synchronizacjÄ™. Update -> Uaktualnij -> Usage: Użycie: Use Recycle Bin Użyj kosza -Use Recycle Bin when deleting or overwriting files. -Używaj Kosza podczas usuwania lub nadpisywania plików. +Use Recycle Bin when deleting or overwriting files +Używaj Kosza podczas usuwania lub nadpisywania plików User-defined directory Katalog użytkownika User-defined directory for deletion was not specified! @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. Możesz je zignorować i kontynuÅ‚ować synchronizacjÄ™. You can ignore the error to consider not existing directories as empty. Możesz zignorować ten bÅ‚Ä…d i uznać nieistniejÄ…cy katalog za pusty. -You can ignore the error to skip current folder pair. -Możesz zignorować problem i przejść do aktualnej pary folderów. You may try to synchronize remaining items again (WITHOUT having to re-compare)! Możesz spróbować synchronizować pozostaÅ‚e elementy ponownie (bez koniecznoÅ›ci ponownego porównywania)! different diff --git a/BUILD/Languages/portuguese.lng b/BUILD/Languages/portuguese.lng index 09acd77e..30ea57f6 100644 --- a/BUILD/Languages/portuguese.lng +++ b/BUILD/Languages/portuguese.lng @@ -40,26 +40,26 @@ &Sobre... &Advanced &Avançado -&Apply -&Aplicar &Cancel &Cancelar &Check for new version &Procurar actualizações &Content -&Create batch job -&Criar um ficheiro batch +&Create batch job... +&Criar um ficheiro batch... &Default &Config. Iniciais &Exit &Sair -&Export file list -&Exportar lista de ficheiros +&Export file list... +&Exportar lista de ficheiros... &File &Ficheiro -&Global settings -&Opções... +&Find next + +&Global settings... +&Opções...... &Help &Ajuda &Ignore @@ -68,8 +68,8 @@ &LÃngua &Load &Carregar -&Load configuration -&Carregar configuração +&Load configuration... +&Carregar configuração... &New &Novo &No @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: Mais recente versão do FreeFileSync disponÃvel: Abort requested: Waiting for current operation to finish... Abortar pedido: À espera do fim da operação... +Abort synchronization immediately + Aborted Abortado About @@ -202,14 +204,12 @@ Browse Procurar Build: Criado: -Cancel -Cancelar Cannot determine sync-direction: +Cannot find %x + Category Categoria -Change direction -Mudar direcção Comma separated list Lista de itens separados por virgula Command line @@ -274,7 +274,7 @@ Copy locked files Copy new or updated files to right folder. Copiar ficheiros novos ou actualizados para a direita -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 Copiar para a Ãrea de transferência\tCTRL+C @@ -308,6 +308,8 @@ DECISION TREE ÃRVORE DE DECISÃO Data remaining: Dados em falta: +Data transferred: + Data verification error: Source and target file have different content! Erro na verificação de dados: ficheiro fonte e de destino têm conteúdo diferente! Date @@ -326,8 +328,8 @@ Delete on both sides Eliminar em ambos os lados Delete on both sides even if the file is selected on one side only Eliminar em ambos os lados mesmo se o ficheiro só está seleccionado num lado -Delete or overwrite files permanently. -Apagar ou substituir ficheiros permanentemente. +Delete or overwrite files permanently +Apagar ou substituir ficheiros permanentemente Delete permanently Apagar permanentemente Deleting file %x @@ -376,6 +378,8 @@ Error copying file: Erro ao copiar ficheiro: Error copying locked file %x! Erro ao copiar ficheiro bloqueado %x! +Error copying symbolic link: + Error creating directory: Erro ao criar a pasta: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Erro de leitura de ficheiro: Error reading from synchronization database: Erro ao ler a base de dados de sincronização: -Error resolving full path name: - Error resolving symbolic link: Erro na resolução do link simbólico: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Excluir temporariamente Exclude via filter: Excluir por filtro: -Exit immediately and set returncode < 0 -Sair imediatamente e enviar o código < 0 -Exit with RC < 0 -Sair com RC < 0 +Exit instantly + +Extension + External applications Aplicações externas Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de Os ficheiros %x têm uma diferença de tempo inferior a 1 hora!\n\nNão é seguro decidir qual o mais novo devido à s mudanças de Hora de Verão. Files %x have the same date but a different size! Os ficheiros %x têm a mesma data, mas tamanho diferente! -Files are found equal if\n - file content\nis the same. -Os ficheiros são considerados iguais se\n - o conteúdo é o mesmo. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -Os ficheiros são considerados iguais se\n - o tamanho\n - data e hora são iguais. +Files are found equal if\n - file content\nis the same +Os ficheiros são considerados iguais se\n - o conteúdo é o mesmo +Files are found equal if\n - filesize\n - last write time and date\nare the same +Os ficheiros são considerados iguais se\n - o tamanho\n - data e hora são iguais Files remaining: Ficheiros restantes: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Ficheiros existentes dos dois lados, à direita é mais recente Files/folders found: Ficheiros/pastas encontrados: +Files/folders processed: + Files/folders remaining: Ficheiros/pastas restantes: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view Filtrar vista Filtering is deactivated +Find + +Find what: + Folder Comparison and Synchronization Comparação e Sincronização de pastas Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: Sincronização inicial: Integrate external applications into context menu. The following macros are available: Integrar aplicações externas no menu de contexto. As seguintes macros estão disponÃveis: +Last synchronization not completed! + Leave as unresolved conflict Deixar como conflito Left @@ -610,6 +620,8 @@ Logging A escrever em log Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. +Match case + Mirror ->> Espelhar ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,7 +634,7 @@ Move column down Mover coluna para baixo Move column up Mover coluna para cima -Move files into a time-stamped subdirectory. +Move files into a time-stamped subdirectory Moving %x to Recycle Bin A mover %x para a Reciclagem @@ -646,8 +658,10 @@ Number of files and directories that will be deleted Número de itens a ser eliminados Number of files that will be overwritten Número de ficheiros substituidos -OK -OK +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. Apenas ficheiros/directórios que passem o filtro serão seleccionados para sincronização. O filtro será aplicado ao nome relativo(!) ao directório base de sincronização. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Sincronização Automática RealtimeSync configuration Configuração do RealtimeSync +Recycle Bin not yet supported for this system! + Relative path Caminho Remove alternate settings @@ -702,8 +718,8 @@ Right Direita Run minimized and write status information to a logfile -S&ave configuration -G&uardar a configuração +S&ave configuration... +G&uardar a configuração... S&witch view &Mudar vista Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: Seleccione directório para ficheiro log: Select variant: Seleccione uma variante: -Setting default synchronization directions. Please check whether they are appropriate for you. +Set direction: + +Setting default synchronization directions: Old files will be overwritten by newer files. Show conflicts Mostrar conflitos -Show file icons -Mostrar icones dos ficheiros Show files that are different Mostrar ficheiros diferentes Show files that are equal @@ -796,10 +812,8 @@ Synchronization status Estado da sincronização Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". Sincronizar todos os ficheiros .doc, .zip e .exe excepto os da pasta \"temp\". -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Sincronizar ambos os lados simultaneamente: Copiar os ficheiros novos ou mais recentes em ambas as direcções. -Synchronize both sides using a database. Deletions are detected automatically. -Sincronizar ambos os lados usando uma base de dados. Eliminações são detectadas automaticamente. +Synchronize both sides using a database. Deletions are detected automatically +Sincronizar ambos os lados usando uma base de dados. Eliminações são detectadas automaticamente Synchronize... Sincronizar... Synchronizing... @@ -810,14 +824,10 @@ 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- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) - -The database file is not yet existing, but will be created during synchronization: +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 file does not contain a valid configuration: O ficheiro não contém uma configuração válida: -The required database entry is not yet existing, but will be created during 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. Esta variante avalia dois ficheiros de nome igual como iguais quando têm o mesmo tamanho e a mesma data e hora de modificação. Time @@ -832,28 +842,22 @@ Total required free disk space: Espaço livre necessário: Total time: Tempo 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. -Tratar ficheiros com exactamente +/- 1 hora como iguais, e menos de 1 hora como conflito, para salvaguardar a alteração da Hora de Verão. -Two way <-> -2 sentidos <-> +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 +Tratar ficheiros com exactamente +/- 1 hora como iguais, e menos de 1 hora como conflito, para salvaguardar a alteração da Hora de Verão Unable to connect to sourceforge.net! Não é possÃvel ligar a sourceforge.net! Unable to create logfile! Não é possÃvel criar ficheiro log! -Unable to initialize Recycle Bin! -Não é possÃvel iniciar a Reciclagem! Unresolved conflicts existing! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -Existem conflitos não resolvidos! \n\nPode ignorá-los e continuar a sincronização. Update -> Actualizar -> Usage: Use Recycle Bin Utilizar Reciclagem -Use Recycle Bin when deleting or overwriting files. -Utilizar Reciclagem ao apagar ou substituir ficheiros. +Use Recycle Bin when deleting or overwriting files +Utilizar Reciclagem ao apagar ou substituir ficheiros User-defined directory Directório definido pelo utilizador User-defined directory for deletion was not specified! @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. You can ignore the error to consider not existing directories as empty. Pode ignorar o erro para considerar directórios não existentes como vazios. -You can ignore the error to skip current folder pair. -Pode ignorar o erro para saltar o par de pastas actual. You may try to synchronize remaining items again (WITHOUT having to re-compare)! Pode tentar sincronizar os restantes elementos outra vez (SEM TER QUE comparar de novo) ! different diff --git a/BUILD/Languages/portuguese_br.lng b/BUILD/Languages/portuguese_br.lng index 7783f823..ea1df759 100644 --- a/BUILD/Languages/portuguese_br.lng +++ b/BUILD/Languages/portuguese_br.lng @@ -40,26 +40,26 @@ &Sobre... &Advanced &Avançado -&Apply -&Aplicar &Cancel &Cancelar &Check for new version &Procurar novas versões &Content Conteúdo -&Create batch job -&Criar um arquivo batch +&Create batch job... +&Criar um arquivo batch... &Default &Config. Padrão &Exit &Sair -&Export file list -&Exportar lista de arquivos +&Export file list... +&Exportar lista de arquivos... &File &Arquivo -&Global settings -&Configurações +&Find next +&Localizar próxima +&Global settings... +&Configurações... &Help &Ajuda &Ignore @@ -68,8 +68,8 @@ Conteúdo &Idioma &Load &Carregar -&Load configuration -&Carregar configuração +&Load configuration... +&Carregar configuração... &New &Novo &No @@ -159,7 +159,9 @@ Conteúdo A newer version of FreeFileSync is available: Uma nova versão do FreeFileSync foi encontrada: Abort requested: Waiting for current operation to finish... -Cancelar pedido: Esperando fim da operação... +Cancelar solicitado: Esperando fim da operação... +Abort synchronization immediately +Cancelar a sincronização imediatamente Aborted Cancelado About @@ -202,14 +204,12 @@ Browse Procurar Build: Criado: -Cancel -Cancelar Cannot determine sync-direction: Não foi possÃvel determinar a direção de sincronização: +Cannot find %x +Não foi possÃvel encontrar %x Category Categoria -Change direction -Inverter sentido Comma separated list Lista de itens separada por vÃrgula Command line @@ -274,8 +274,8 @@ Copy locked files Copiar arquivos bloqueados (em uso) Copy new or updated files to right folder. Copiar arquivos novos ou atualizados para a pasta da direita -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 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 file %x to %y @@ -308,6 +308,8 @@ DECISION TREE ÃRVORE DE DECISÃO Data remaining: Dados faltantes: +Data transferred: +Dados transferidos: Data verification error: Source and target file have different content! Erro de verificação de dados: Arquivo de origem e destino têm o mesmo conteúdo! Date @@ -326,8 +328,8 @@ Delete on both sides 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. +Delete or overwrite files permanently +Apagar ou sobrescrever arquivos permanentemente Delete permanently Apagar permanentemente Deleting file %x @@ -376,6 +378,8 @@ Error copying file: Erro ao copiar arquivo: Error copying locked file %x! Erro ao copiar arquivo bloqueado %x! +Error copying symbolic link: +Erro ao copiar links simbólicos: Error creating directory: Erro ao criar diretório: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Erro ao ler arquivo: Error reading from synchronization database: Erro ao ler do banco de dados de sincronização: -Error resolving full path name: -Erro na resolução do caminho completo: Error resolving symbolic link: Erro na resolução de link simbólico: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Excluir temporariamente Exclude via filter: Excluir por filtro: -Exit immediately and set returncode < 0 -Sair imediatamente e setar\nreturncode < 0 -Exit with RC < 0 -Sair com RC < 0 +Exit instantly +Sair instantaneamente +Extension +Extensão External applications Aplicações externas Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de Arquivos %x têm diferença no horário de criação menor do que 1 hora!\n\nNão é seguro decidir qual é o mais novo devido a problemas relacionados com o Horário de Verão. Files %x have the same date but a different size! Arquivos %x têm a mesma data mas tamanhos diferentes! -Files are found equal if\n - file content\nis the same. -Os arquivos são considerados iguais se\n - o conteúdo do arquivo\né o mesmo. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -Os arquivos são considerados iguais se\n - o tamanho\n - e a data e hora da última modificação\nsão iguais. +Files are found equal if\n - file content\nis the same +Os arquivos são considerados iguais se\n - o conteúdo do arquivo\né o mesmo +Files are found equal if\n - filesize\n - last write time and date\nare the same +Os arquivos são considerados iguais se\n - o tamanho\n - e a data e hora da última modificação\nsão iguais Files remaining: Arquivos restantes: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Arquivos que existem nos dois lados, sendo à direita mais recentes Files/folders found: Arquivos/pastas encontrados: +Files/folders processed: +Arquivos/pastas processadas: Files/folders remaining: Arquivos/pastas restantes: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view Filtrar vista Filtering is deactivated Filtragem está desativada +Find +Localizar +Find what: +Localizar o que: Folder Comparison and Synchronization Comparação e Sincronização de Pastas Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: Sincronização inicial: Integrate external applications into context menu. The following macros are available: Integrar aplicações externas no menu de contexto. As seguintes macros estão disponÃveis: +Last synchronization not completed! +Última sincronização não completada! Leave as unresolved conflict Deixar como conflito não resolvido Left @@ -610,6 +620,8 @@ Logging Gravando log Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. Cópias de sombra no WOW64 não são suportadas. Por favor use a versão 64-bits do FreeFileSync. +Match case +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. @@ -622,8 +634,8 @@ Move column down Mover coluna para baixo Move column up Mover coluna para cima -Move files into a time-stamped subdirectory. -Mover arquivos para um subdiretório com carimbo de tempo. +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 file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted Número de arquivos e diretórios que serão apagados Number of files that will be overwritten Número de arquivos que serão substituÃdos -OK -OK +One of the FreeFileSync database entries within the following file is not yet existing: +Um das entradas do bancos de dados do FreeFileSync dentro do seguinte arquivo ainda não existe: +One of the FreeFileSync database files is not yet existing: +Um dos arquivos de bancos de dados do FreeFileSync ainda não existe: 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. Apenas arquivos/diretórios que passarem o filtro serão selecionados para sincronização. O filtro será aplicado ao nome relativo(!) aos diretórios base de sincronização. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Sincronização Automátizada RealtimeSync configuration Configuração do RealtimeSync +Recycle Bin not yet supported for this system! + Relative path Caminho relativo Remove alternate settings @@ -702,8 +718,8 @@ Right Direita Run minimized and write status information to a logfile Executar minimizado e escrever informações de status em um arquivo log -S&ave configuration -S&alvar configuração +S&ave configuration... +S&alvar configuração... S&witch view A<erar visualização Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: Escolha um diretório para salvar o arquivo log: Select variant: Selecione uma variante: -Setting default synchronization directions. Please check whether they are appropriate for you. -Ajustando direções padrões de sincronização. Por favor verifique se são apropriadas para você. +Set direction: +Configurar direção +Setting default synchronization directions: Old files will be overwritten by newer files. +Configurando direções padrões de sincronização: Arquivos antigos serão substituÃdos por arquivos mais novos. Show conflicts Mostrar conflitos -Show file icons -Mostrar Ãcones dos arquivos Show files that are different Mostrar arquivos que são diferentes Show files that are equal @@ -796,10 +812,8 @@ Synchronization status Estado da sincronização Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". Sincronizar todos arquivos .doc, .zip e .exe exceto tudo que estiver na subpasta \"temp\". -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Sincronizar ambos os lados simultaneamente: Copia os arquivos novos ou mais recentes em ambas as direções. -Synchronize both sides using a database. Deletions are detected automatically. -Sincronizar ambos os lados usando um banco de dados. Eliminações são detectadas automaticamente. +Synchronize both sides using a database. Deletions are detected automatically +Sincronizar ambos os lados usando um banco de dados. Eliminações são detectadas automaticamente Synchronize... Sincronizar... Synchronizing... @@ -810,14 +824,10 @@ 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- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -A linha de comando é executada cada vez que:\n- Arquivos dentro desses diretórios (ou subdiretórios) são modificados\n- A letra correspondente do disco se torna disponÃvel (inserção de USB) -The database file is not yet existing, but will be created during synchronization: -O arquivo de banco de dados ainda não existe, mas será criado durante a sincronização: +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 file does not contain a valid configuration: O arquivo não contém uma configuração válida: -The required database entry is not yet existing, but will be created during synchronization: -A entrada de banco de dados requerida ainda não existe, mas será criada durante a sincronização: 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. Esta variante avalia dois arquivos de nomes equivalentes como sendo iguais quando têm o mesmo tamanho E a mesma data e hora de modificação. Time @@ -832,28 +842,22 @@ Total required free disk space: Espaço livre total requerido: Total time: Tempo 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. -Tratar tempo dos arquivos que diferem exatamente por +/- 1 hora como igual, menor que 1 hora como conflito para lidar com mudanças de Horário de Verão. -Two way <-> -Dois sentidos <-> +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 +Tratar tempo dos arquivos que diferem exatamente por +/- 1 hora como igual, menor que 1 hora como conflito para lidar com mudanças de Horário de Verão Unable to connect to sourceforge.net! Não foi possÃvel conectar a sourceforge.net! Unable to create logfile! Não foi possÃvel criar arquivo log! -Unable to initialize Recycle Bin! -Não foi possÃvel abrir a Lixeira! Unresolved conflicts existing! Conflitos não resolvidos existentes! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -Conflitos não resolvidos existentes! \n\nVocê pode ignorar os conflitos e continuar a sincronização. Update -> Atualizar -> Usage: Uso: Use Recycle Bin Utilizar Lixeira -Use Recycle Bin when deleting or overwriting files. -Usar a Lixeira quando apagar ou substituir arquivos. +Use Recycle Bin when deleting or overwriting files +Usar a Lixeira quando apagar ou substituir arquivos User-defined directory Diretório especificado User-defined directory for deletion was not specified! @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. Você pode ignorar os conflitos e continuar a sincronização. You can ignore the error to consider not existing directories as empty. Você pode ignorar o erro para considerar diretórios não existente como vazios. -You can ignore the error to skip current folder pair. -Você pode ignorar o erro para pular o par de pastas atual. You may try to synchronize remaining items again (WITHOUT having to re-compare)! Você pode tentar sincronizar os elementos restantes outra vez (SEM ter que comparar novamente)! different diff --git a/BUILD/Languages/romanian.lng b/BUILD/Languages/romanian.lng index 52f715a6..3111590b 100644 --- a/BUILD/Languages/romanian.lng +++ b/BUILD/Languages/romanian.lng @@ -40,26 +40,26 @@ &Despre... &Advanced &Avansate -&Apply -&Aplică &Cancel &Anulează &Check for new version &Caută Versiune Nouă &Content &ConÈ›inut -&Create batch job -&Creează o Sarcină Lot +&Create batch job... +&Creează o Sarcină Lot... &Default &Implicite &Exit &IeÈ™i -&Export file list -&Exportă Lista de FiÈ™iere +&Export file list... +&Exportă Lista de FiÈ™iere... &File &FiÈ™ier -&Global settings -&Setări Globale +&Find next +&GăseÈ™te Următorul +&Global settings... +&Setări Globale... &Help &Ajutor &Ignore @@ -68,8 +68,8 @@ &Limbă &Load &Deschide -&Load configuration -&Deschide ConfiguraÈ›ia +&Load configuration... +&Deschide ConfiguraÈ›ia... &New &Nou &No @@ -160,8 +160,10 @@ A newer version of FreeFileSync is available: Este disponibilă o versiune nouă de FreeFileSync: Abort requested: Waiting for current operation to finish... Abandonare solicitată: Se aÈ™teaptă terminarea operaÈ›iunii în curs... +Abort synchronization immediately +Abandonează imediat sincronizarea Aborted -Abandonat +Abandonată About Despre Action @@ -179,7 +181,7 @@ 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: 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 luaÈ›i deloc în considerare.\n\nCu această opÈ›iune activată, arborele de decizie e mai simplu: +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: 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 <batchfile>. 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 <fiÈ™ier lot>. Această operaÈ›iune poate fi programată în planificatorul de sarcini al sistemului de operare [task scheduler]. At least one directory input field is empty. @@ -187,7 +189,7 @@ Cel puÈ›in un cîmp de introducere a dosarului este gol. Auto-adjust columns Autoajustează Coloanele Automatic mode -Mod Inteligent +Mod inteligent Batch execution Execută FiÈ™ierul Lot Batch file created successfully! @@ -202,14 +204,12 @@ Browse Explorează Build: Compilat la: -Cancel -Anulează Cannot determine sync-direction: Nu se poate determina sensul de sincronizare: +Cannot find %x +Nu pot găsi %x Category Categorie -Change direction -Schimbă în Sensul IconiÈ›ei Comma separated list Listă de elemente separate prin virgulă Command line @@ -251,7 +251,7 @@ ConfiguraÈ›ie salvată ! Configure filter Configurează Filtrul Configure your own synchronization rules. -Reguli de sincronizare definite de utilizator pentru fiecare situaÈ›ie. Definirea se face cu butoanele colorate din partea dreaptă a panoului, care apar la clicarea pe Clonare sau Actualizare. +Reguli de sincronizare definite de utilizator pentru fiecare situaÈ›ie. Confirm Confirmare Conflict detected: @@ -274,8 +274,8 @@ Copy locked files Copiază fiÈ™ierele zăvorîte [locked] Copy new or updated files to right folder. Copiere în dosarul din dreapta a fiÈ™ierelor 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. +Copy shared or locked files using Volume Shadow Copy Service +Copiază fiÈ™ierele partajate sau zăvorîte folosind serviciul de salvgardare din Windows Copy to clipboard\tCTRL+C Copiază în CliplanÈ™etă\tCTRL+C Copying file %x to %y @@ -295,7 +295,7 @@ Creează o Sarcină Lot Creating folder %x Creez dosarul %x Current operation: -OperaÈ›ia Curentă: +OperaÈ›iunea Curentă: Custom Sincronizare Personalizată Customize columns @@ -308,6 +308,8 @@ DECISION TREE ARBORE DECIZIONAL Data remaining: Date Rămase: +Data transferred: +Date Transferate: Data verification error: Source and target file have different content! Eroare la verificarea datelor: FiÈ™ierele sursă È™i È›intă au conÈ›inut diferit! Date @@ -326,8 +328,8 @@ 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 -Delete or overwrite files permanently. -FiÈ™ierele sînt È™terse sau suprascrise în mod definitiv. +Delete or overwrite files permanently +FiÈ™ierele sînt È™terse sau suprascrise în mod definitiv Delete permanently Șterge definitiv Deleting file %x @@ -376,6 +378,8 @@ Error copying file: Eroare la copierea fiÈ™ierului: Error copying locked file %x! Eroare la copierea fiÈ™ierului zăvorît %x! +Error copying symbolic link: +Eroare la copierea legăturii simbolice: Error creating directory: Eroare la crearea dosarului: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Eroare la citirea fiÈ™ierului: Error reading from synchronization database: Eroare la citirea din baza de date a sincronizării: -Error resolving full path name: -Eroare la rezolvarea numelui căii complete: Error resolving symbolic link: Eroare la rezolvarea legăturii simbolice: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Exclude Temporar Exclude via filter: Exclude prin Filtru: -Exit immediately and set returncode < 0 -Programul se închide imediat È™i se setează returncode < 0 -Exit with RC < 0 -IeÈ™i cu RC < 0 +Exit instantly +IeÈ™i imediat +Extension +Extensie External applications AplicaÈ›ii Externe Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de 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ă. Files %x have the same date but a different size! FiÈ™ierele %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. -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. +Files are found equal if\n - file content\nis the same +FiÈ™ierele 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 Files remaining: FiÈ™iere Rămase: Files that are equal on both sides @@ -472,6 +474,8 @@ 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 Files/folders found: FiÈ™iere/dosare găsite: +Files/folders processed: +FiÈ™iere/dosare procesate: Files/folders remaining: Itemuri Rămase: Files/folders that exist on left side only @@ -490,10 +494,14 @@ Filter view Filtru de Vedere Filtering is deactivated Filtrarea este dezactivată +Find +GăseÈ™te +Find what: +GăseÈ™te Asta: Folder Comparison and Synchronization Comparare È™i Sincronizare de Dosare Free disk space available: -SpaÈ›iu disponibil pe hardisc: +SpaÈ›iu de stocare disponibil: FreeFileSync - Folder Comparison and Synchronization FreeFileSync - Comparare È™i Sincronizare de Dosare FreeFileSync Batch Job @@ -581,7 +589,7 @@ Include Toate Rîndurile Include temporarily Include Temporar Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Incluse: *.doc;*.zip;*.exe\nExcluse: \\stuff\\temp\\* +Incluse: *.doc;*.zip;*.exe\nExcluse: \\chestii\\temp\\* Incompatible synchronization database format: Format incompatibil al bazei de date a sincronizării: Info @@ -592,6 +600,8 @@ Initial synchronization: Sincronizare iniÈ›ială: Integrate external applications into context menu. The following macros are available: Include aplicaÈ›iile externe în meniul contextual. Sînt disponibile următoarele macrocomenzi: +Last synchronization not completed! +Ultima sinconizare nu a fost terminată! Leave as unresolved conflict Lasă ca Conflict Nerezolvat Left @@ -610,6 +620,8 @@ 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. +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. @@ -622,8 +634,8 @@ 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. +Move files into a time-stamped subdirectory +Mută fiÈ™ierele într-un subdosar cu marcaj de timp Moving %x to Recycle Bin Mut %x în Reciclator Moving file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted Numărul de fiÈ™iere È™i dosare care vor fi È™terse Number of files that will be overwritten Numărul de fiÈ™iere care vor fi suprascrise -OK -OK +One of the FreeFileSync database entries within the following file is not yet existing: +Una din intrările în baza de date FreeFileSync din fiÈ™ierul următor nu există: +One of the FreeFileSync database files is not yet existing: +Una din părÈ›i nu are un fiÈ™ier 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. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Sincronizare Inteligentă RealtimeSync configuration RealtimeSync configuraÈ›ie +Recycle Bin not yet supported for this system! + Relative path Calea Relativă Remove alternate settings @@ -702,8 +718,8 @@ Right Dreapta Run minimized and write status information to a logfile Rulează minimizat È™i scrie informaÈ›iile de stare într-un jurnal -S&ave configuration -S&alvează ConfiguraÈ›ia +S&ave configuration... +S&alvează ConfiguraÈ›ia... S&witch view Schimbă &Vederea Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: SelectaÈ›i un dosar pentru fiÈ™ierul .log: Select variant: SelectaÈ›i Varianta de Sincronizare: -Setting default synchronization directions. Please check whether they are appropriate for you. -Va fi setat sensul implicit de sincronizare. VerificaÈ›i dacă se potriveÈ™te cu ceea ce doriÈ›i. +Set direction: +Setează AcÈ›iunea ca în IconiÈ›a Alăturată: +Setting default synchronization directions: Old files will be overwritten by newer files. +Va fi setat sensul implicit de sincronizare: FiÈ™ierele vechi vor fi suprascrise de cele noi. Show conflicts Arată conflictele -Show file icons -Arată iconiÈ›ele fiÈ™ierelor Show files that are different Arată fiÈ™ierele diferite Show files that are equal @@ -796,10 +812,8 @@ 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\". -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Sincronizare simultană a celor două părÈ›i: copiere în ambele sensuri a fiÈ™ierelor noi sau actualizate. -Synchronize both sides using a database. Deletions are detected automatically. -Sincronizare simultană a celor două părÈ›i folosind o bază de date. Ștergerile sînt detectate automat. +Synchronize both sides using a database. Deletions are detected automatically +Sincronizare simultană a celor două părÈ›i folosind o bază de date. Ștergerile sînt detectate automat Synchronize... Sincronizează Synchronizing... @@ -810,14 +824,10 @@ 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- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -Linia de comandă este executată de fiecare dată:\n- FiÈ™ierele din aceste dosare (sau subdosare) sînt modificate\n- Litera corespunzătoare a dispozitivului devine disponibilă (introducere-USB) -The database file is not yet existing, but will be created during synchronization: -FiÈ™ierul cu baza de date nu există încă, dar va fi creat în cursul sincronizării: +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 The file does not contain a valid configuration: FiÈ™ierul nu conÈ›ine o configuraÈ›ie validă: -The required database entry is not yet existing, but will be created during synchronization: -Intrarea solicitată din baza de date nu există încă, dar va fi creată în cursul sincronizării: 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. Time @@ -832,28 +842,22 @@ Total required free disk space: 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 gestiunea orei de vară. -Two way <-> -Ambele Sensuri <=> +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ă 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! -Unable to initialize Recycle Bin! -Reciclatorul nu poate fi iniÈ›ializat! Unresolved conflicts existing! Există conflicte nerezolvate! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -Există conflicte nerezolvate!\n\nPuteÈ›i ignora conflictele pentru a continua cu sincronizarea. Update -> Actualizare => Usage: 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. +Use Recycle Bin when deleting or overwriting files +Se foloseÈ™te Reciclatorul [Recycle Bin] cu ocazia È™tergerii sau suprascrierii unui fiÈ™ier User-defined directory Mută într-un dosar personalizat User-defined directory for deletion was not specified! @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. PuteÈ›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. -You can ignore the error to skip current folder pair. -PuteÈ›i ignora eroarea pentru a sări perechea de dosare curentă. 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) ! different diff --git a/BUILD/Languages/russian.lng b/BUILD/Languages/russian.lng index fc461c2e..5af9b57e 100644 --- a/BUILD/Languages/russian.lng +++ b/BUILD/Languages/russian.lng @@ -29,7 +29,7 @@ %x files, %x файл(ов), %x is not a valid FreeFileSync batch file! -%x не ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° FreeFileSync файл! +%x не корректный файл пакетного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ FreeFileSync! %x of %y rows in view %x из %y Ñтрок(и) показано %x of 1 row in view @@ -40,25 +40,25 @@ &О программе... &Advanced &Дополнительно -&Apply -&ПринÑÑ‚ÑŒ &Cancel &Отмена &Check for new version &Проверить наличие новой верÑии &Content &Справка -&Create batch job +&Create batch job... &Создать задание... &Default &По-умолчанию &Exit &Выход -&Export file list +&Export file list... &ÐкÑпортировать ÑпиÑок файлов... &File &Файл -&Global settings +&Find next +&Ðайти далее +&Global settings... &Глобальные наÑтройки... &Help &Помощь @@ -68,7 +68,7 @@ &Язык &Load &Загрузить -&Load configuration +&Load configuration... &Загрузить конфигурацию... &New &ÐÐ¾Ð²Ð°Ñ @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ FreeFileSync: Abort requested: Waiting for current operation to finish... Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹: Ожидайте, пока Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚ÑÑ... +Abort synchronization immediately +Отменить Ñинхронизацию немедленно Aborted Отменено About @@ -202,14 +204,12 @@ Browse Обзор Build: Сборка: -Cancel -Отмена Cannot determine sync-direction: Ðевозможно определить направление Ñинхронизации: +Cannot find %x +Ðевозможно найти %x Category ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ -Change direction -ПоменÑÑ‚ÑŒ направление Comma separated list СпиÑок, разделÑемый запÑтыми Command line @@ -274,8 +274,8 @@ Copy locked files Копировать заблокированные файлы Copy new or updated files to right folder. Копировать новые или обновлÑÑ‚ÑŒ файлы на правой Ñтороне. -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 Копировать в буфер обмена\tCTRL+C Copying file %x to %y @@ -308,6 +308,8 @@ DECISION TREE Древо решений Data remaining: ОÑталоÑÑŒ: +Data transferred: +Данных передано: Data verification error: Source and target file have different content! Ошибка проверки данных: иÑходный и конечный файлы имеют разное Ñодержание! Date @@ -326,7 +328,7 @@ Delete on both sides Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон Delete on both sides even if the file is selected on one side only Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон, еÑли даже файл выделен только на одной Ñтороне -Delete or overwrite files permanently. +Delete or overwrite files permanently УдалÑÑ‚ÑŒ или перезапиÑать файлы, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину" Delete permanently УдалÑÑ‚ÑŒ, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину" @@ -376,6 +378,8 @@ Error copying file: Ошибка при копировании файла: Error copying locked file %x! Ошибка при копировании заблокированного файла %x! +Error copying symbolic link: +Ошибка при копировании Ñимвольной ÑÑылки: Error creating directory: Ошибка при Ñоздании папки: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Ошибка при чтении файла: Error reading from synchronization database: Ошибка при чтении из базы данных Ñинхронизации: -Error resolving full path name: -Ошибка при воÑÑтановлении абÑолютного пути из отноÑительного: Error resolving symbolic link: Ошибка при решении ÑимволичеÑкой ÑÑылки: Error starting Volume Shadow Copy Service! @@ -421,17 +423,17 @@ Error writing to synchronization database: Example Пример Exclude -ИÑÐºÐ»ÑŽÑ‡Ð°Ñ +ИÑключить Exclude all rows -ИÑключить вÑе Ñтроки +Ðе отмечать ничего Exclude temporarily -ИÑключить временные +ИÑключить Exclude via filter: ИÑключить через фильтр: -Exit immediately and set returncode < 0 -Выйти немедленно и уÑтановить код возврата <0 -Exit with RC < 0 -Выход Ñ RC <0 +Exit instantly +Выйти немедленно +Extension +РаÑширение External applications Внешние Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Fatal Error @@ -456,9 +458,9 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de Файлы %x имеют Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÑŽÑ‰ÐµÐµÑÑ Ð¼ÐµÐ½ÐµÐµ чем на 1 чаÑ!\n\nРешать какой новее небезопаÑно ввиду перехода на летнее времÑ. Files %x have the same date but a different size! Файлы %x имеют одинаковую дату, но различаютÑÑ Ð¿Ð¾ размеру! -Files are found equal if\n - file content\nis the same. +Files are found equal if\n - file content\nis the same Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли Ñодержание файлов одинаковое -Files are found equal if\n - filesize\n - last write time and date\nare the same. +Files are found equal if\n - filesize\n - last write time and date\nare the same Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли одинаковые\n - размер файла\n - дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Files remaining: Файлов оÑталоÑÑŒ: @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Файлы, ÑущеÑтвующие на обоих Ñторонах, правый новее Files/folders found: Файлов/папок найдено: +Files/folders processed: +Файлов/папок обработано: Files/folders remaining: Файлов/папок оÑталоÑÑŒ: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view Вид фильтра Filtering is deactivated Ð¤Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð° +Find +Ðайти +Find what: +Ðайти: Folder Comparison and Synchronization Сравнение и ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Free disk space available: @@ -575,13 +583,13 @@ Ignore this error, retry or abort synchronization? Ignore this error, retry or abort? Игнорировать Ñту ошибку, повторить или отменить? Include -Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ +Включить Include all rows -Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²Ñе Ñтроки +Отметить вÑе Include temporarily -Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ðµ +Включить Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -ВключаÑ: *.doc;*.zip;*.exe\nИÑключаÑ: \\stuff\\temp\\* +Включить: *.doc;*.zip;*.exe\nИÑключить: \\stuff\\temp\\* Incompatible synchronization database format: ÐеÑовмеÑтимый формат базы данных Ñинхронизации: Info @@ -592,6 +600,8 @@ Initial synchronization: ÐŸÐµÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ ÑинхронизациÑ: Integrate external applications into context menu. The following macros are available: Интегрирует внешние Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² контекÑтное меню.\nСледующие команды доÑтупны: +Last synchronization not completed! +ПоÑледнÑÑ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ðµ была завершена! Leave as unresolved conflict ОÑтавить как нерешенный конфликт Left @@ -610,6 +620,8 @@ Logging Лог-файлы Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. Создание теневых копий на WOW64 не поддерживаетÑÑ. ПожалуйÑта, иÑпользуйте FreeFileSync 64-разрÑдной верÑии. +Match case +Учитывать региÑÑ‚Ñ€ Mirror ->> Зеркало ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,8 +634,8 @@ Move column down ПеремеÑтить вниз Move column up ПеремеÑтить вверх -Move files into a time-stamped subdirectory. -ПеремеÑтить файлы во временно-отмеченную подпапку. +Move files into a time-stamped subdirectory +ПеремеÑтить файлы во временно-отмеченную подпапку Moving %x to Recycle Bin Отправка %x в "Корзину" Moving file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted ЧиÑло файлов и папок, которые будут удалены Number of files that will be overwritten ЧиÑло файлов, которые будут перезапиÑаны -OK -OK +One of the FreeFileSync database entries within the following file is not yet existing: +ЗапиÑей, отноÑÑщихÑÑ Ðº Ñледующим файлам, в базе данных FreeFileSync еще не ÑущеÑтвует: +One of the FreeFileSync database files is not yet existing: +Файла базы данных 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. Только файлы/папки, которые проходÑÑ‚ фильтрацию будут отобраны Ð´Ð»Ñ Ñинхронизации. Фильтр будет применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем именам, отноÑÑщимÑÑ Ðº оÑновным Ñинхронизируемым папкам. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - ÐвтоматичеÑÐºÐ°Ñ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ RealtimeSync configuration ÐаÑтройка RealtimeSync +Recycle Bin not yet supported for this system! + Relative path ОтноÑительный путь Remove alternate settings @@ -702,7 +718,7 @@ Right Справа Run minimized and write status information to a logfile ЗапуÑтить Ñвернутым и пиÑать информацию по ÑтатуÑу в лог-файл -S&ave configuration +S&ave configuration... Сохранить конфигурацию... S&witch view Переключить вид @@ -722,12 +738,12 @@ Select logfile directory: Выберите папку Ð´Ð»Ñ Ð»Ð¾Ð³-файлов: Select variant: Выберите вариант: -Setting default synchronization directions. Please check whether they are appropriate for you. -Ðаправление Ñинхронизации выÑтавлено по умолчанию. ПожалуйÑта, проверьте, подходит ли оно Ð´Ð»Ñ Ð’Ð°Ñ. +Set direction: +Выберите направление: +Setting default synchronization directions: Old files will be overwritten by newer files. +ÐаÑтройка Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñинхронизации по умолчанию:\nСтарые файлы будут заменены более новыми файлами. Show conflicts Показать конфликтующие файлы -Show file icons -Показывать иконки файлов Show files that are different Показать различающиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹ Show files that are equal @@ -796,9 +812,7 @@ Synchronization status Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñинхронизации Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". Синхронизировать вÑе .doc, .zip и .exe файлы, за иÑключением вÑех файлов из подпапки \"temp\" -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Синхронизировать обе Ñтороны одновременно: копировать новые или обновлÑÑ‚ÑŒ файлы в обоих направлениÑÑ…. -Synchronize both sides using a database. Deletions are detected automatically. +Synchronize both sides using a database. Deletions are detected automatically Синхронизировать обе Ñтороны, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð±Ð°Ð·Ñƒ данных\nУдаленные файлы/папки определÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Synchronize... Синхронизировать @@ -810,14 +824,10 @@ Target directory already existing! ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° уже ÑущеÑтвует! Target file already existing! Конечный файл уже ÑущеÑтвует! -The command line is executed each time:\n- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока выполнÑетÑÑ ÐºÐ¾Ð³Ð´Ð°:\n- Файлы в Ñтих папках (или подпапках) были изменены\n- СоответÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð±ÑƒÐºÐ²Ð° диÑка ÑтановитÑÑ Ð´Ð¾Ñтупной (добавление USB уÑтройÑтва) -The database file is not yet existing, but will be created during synchronization: -Файл базы данных еще не ÑущеÑтвует, но будет Ñоздан во Ð²Ñ€ÐµÐ¼Ñ Ñинхронизации: +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 file does not contain a valid configuration: Файл не Ñодержит дейÑтвительную конфигурацию: -The required database entry is not yet existing, but will be created during 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 @@ -832,27 +842,21 @@ 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. +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 Учитывать файлы, которые отличаютÑÑ Ð¿Ð¾ времени на 1 чаÑ, как равные, менее чем на 1 чаÑ, как конфликтные, чтобы учеÑÑ‚ÑŒ переход на летнее Ð²Ñ€ÐµÐ¼Ñ -Two way <-> -Ð’ обоих направлениÑÑ… <-> Unable to connect to sourceforge.net! Ðевозможно ÑоединитьÑÑ Ñ sourceforge.net! Unable to create logfile! Ðевозможно Ñоздать лог! -Unable to initialize Recycle Bin! -Ðевозможно инициализировать "Корзину"! Unresolved conflicts existing! СущеÑтвуют нерешенные конфликты -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -СущеÑтвуют нерешенные конфликты! \n\nÐ’Ñ‹ можете проигнорировать их и продолжить Ñинхронизацию. Update -> Обновить -> Usage: ИнÑтрукциÑ: Use Recycle Bin ИÑпользовать "Корзину" -Use Recycle Bin when deleting or overwriting files. +Use Recycle Bin when deleting or overwriting files ИÑпользовать "Корзину" при удалении или перезапиÑи файлов User-defined directory ИÑпользовать заданную пользователем папку @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. Ð’Ñ‹ можете проигнорировать их и продолжить Ñинхронизацию. You can ignore the error to consider not existing directories as empty. Ð’Ñ‹ можете проигнорировать ошибку, принÑв неÑущеÑтвующие папки за пуÑтые. -You can ignore the error to skip current folder pair. -Ð’Ñ‹ можете проигнорировать ошибку, чтобы пропуÑтить текущую пару папок и продолжить. You may try to synchronize remaining items again (WITHOUT having to re-compare)! Ð’Ñ‹ можете попытатьÑÑ Ñинхронизировать оÑтавшиеÑÑ Ð¿ÑƒÐ½ÐºÑ‚Ñ‹ Ñнова (без повторного ÑравнениÑ)! different diff --git a/BUILD/Languages/slovenian.lng b/BUILD/Languages/slovenian.lng index 59daefa7..15d30fe4 100644 --- a/BUILD/Languages/slovenian.lng +++ b/BUILD/Languages/slovenian.lng @@ -40,26 +40,26 @@ &O programu... &Advanced &Napredno -&Apply -&Uveljavi &Cancel &PrekliÄi &Check for new version &Preveri za novo razliÄico &Content &Vsebina -&Create batch job -&Ustvari batch opravilo +&Create batch job... +&Ustvari batch opravilo... &Default &Privzeto &Exit &Izhod -&Export file list -&Izvozi seznam datotek +&Export file list... +&Izvozi seznam datotek... &File &Datoteka -&Global settings -&Globalne nastavitve +&Find next +&Najdi naslednje +&Global settings... +&Globalne nastavitve... &Help &PomoÄ &Ignore @@ -68,8 +68,8 @@ &Jezik &Load &Naloži -&Load configuration -Na&loži konfiguracijo +&Load configuration... +Na&loži konfiguracijo... &New &Novo &No @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: 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 Aborted Prekinitev uspela About @@ -202,14 +204,12 @@ Browse Brskaj Build: Izgradnja: -Cancel -PrekliÄi Cannot determine sync-direction: Ne morem doloÄiti sinhronizacijske smeri. +Cannot find %x +Ne najdem %x Category Kategorija -Change direction -Spremeni smer Comma separated list Seznam loÄen z vejico Command line @@ -274,8 +274,8 @@ Copy locked files Kopiraj zaklenjene datoteke Copy new or updated files to right folder. Kopiraj nove ali posodobljene datoteke v desno mapo. -Copy shared or locked files using Volume Shadow Copy Service. -Kopiraj deljene ali zaklenjene datoteke z uporabo servisa Volume Shadow Copy. +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 file %x to %y @@ -308,6 +308,8 @@ DECISION TREE DREVO ODLOÄŒITEV Data remaining: Preostanek podatkov: +Data transferred: +Prenesenih podatkov: Data verification error: Source and target file have different content! Napaka pri preverjanju podatkov: izvorna in tarÄna datoteka imata razliÄno vsebino! Date @@ -326,8 +328,8 @@ Delete on both sides IzbriÅ¡i na obeh straneh Delete on both sides even if the file is selected on one side only IzbriÅ¡i na obeh straneh, Äetudi je datoteka izbrana na samo eni strani -Delete or overwrite files permanently. -Trajno izbriÅ¡i ali prepiÅ¡i datoteke. +Delete or overwrite files permanently +Trajno izbriÅ¡i ali prepiÅ¡i datoteke Delete permanently Trajno izbriÅ¡i Deleting file %x @@ -376,6 +378,8 @@ Error copying file: Napaka pri kopiranju datoteke: Error copying locked file %x! Napaka pri kopiranju zaklenjene datoteke %x! +Error copying symbolic link: +Napaka pri kopiranju simboliÄnih povezav: Error creating directory: Napaka pri ustvarjanju imenika: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Napaka pri branju datoteke: Error reading from synchronization database: Napaka pri branju iz sinhronizacijske podatkovne baze: -Error resolving full path name: -Napaka pri razreÅ¡evanju polnega imena poti: Error resolving symbolic link: Napaka pri razreÅ¡evanju simboliÄne povezave: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily ZaÄasno izkljuÄi Exclude via filter: IzkljuÄi preko filtra: -Exit immediately and set returncode < 0 -Takoj zapusti in vrni povratno kodo < 0 -Exit with RC < 0 -Zapusti z RC < 0 +Exit instantly +Zapusti v trenutku +Extension +RazÅ¡iritev External applications Zunanje aplikacije Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de Datoteki %x imata razliko v Äasu spremembe manj kot 1 uro!\n\nNi se varno odloÄiti katera je novejÅ¡a zaradi vpraÅ¡anj v zvezi s Poletnim Äasom. Files %x have the same date but a different size! Datoteki %x imata enak datum ampak razliÄno velikost! -Files are found equal if\n - file content\nis the same. -Datoteki sta enaki, Äe\n - je vsebina datoteke\nenaka. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -Datoteki sta enaki, Äe so\n - velikost datoteke\n - zadnji Äas spremembe in datum\nenaki. +Files are found equal if\n - file content\nis the same +Datoteki sta enaki, Äe\n - je vsebina datoteke\nenaka +Files are found equal if\n - filesize\n - last write time and date\nare the same +Datoteki sta enaki, Äe so\n - velikost datoteke\n - zadnji Äas spremembe in datum\nenaki Files remaining: Preostale datoteke: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Datoteke, ki obstajajo na obeh straneh, desna je novejÅ¡a Files/folders found: Najdene datoteke/mape: +Files/folders processed: +Obdelane datoteke/mape: Files/folders remaining: Preostale datoteke/mape: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view Filtriran pogled Filtering is deactivated Filter je deaktiviran +Find +Najdi +Find what: +Najdi kaj Folder Comparison and Synchronization Primerjava in sinhronizacija imenika Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: ZaÄetna sinhronizacija: Integrate external applications into context menu. The following macros are available: Integriraj zunanje aplikacije v kontekstni menu. Na voljo so naslednji makri: +Last synchronization not completed! +Zadnja sinhronizacija se ni zakljuÄila! Leave as unresolved conflict Pusti kot nereÅ¡eni spor Left @@ -610,6 +620,8 @@ Logging Beležim Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. Ustvarjanje senÄnih kopij na WOW63 ni podprto. Prosimo uporabite 64-bitno FreeFileSync razliÄico. +Match case +Ujemaj se s primerom Mirror ->> Zrcalno ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,8 +634,8 @@ Move column down Premakni stolpec dol Move column up Premakni stolpec gor -Move files into a time-stamped subdirectory. -Premakni datoteke v Äasovno-oznaÄen podimenik. +Move files into a time-stamped subdirectory +Premakni datoteke v Äasovno-oznaÄen podimenik Moving %x to Recycle Bin Premikam %x v KoÅ¡ Moving file %x to user-defined directory %y @@ -646,8 +658,10 @@ Number of files and directories that will be deleted Å tevilo datotek in imenikov, ki bodo izbrisani Number of files that will be overwritten Å tevilo datotek, ki bodo prepisane -OK -V redu +One of the FreeFileSync database entries within the following file is not yet existing: +Eden od FreeFileSync vnosov v podatkovni bazi znotraj naslednje datoteke Å¡e ne obstaja: +One of the FreeFileSync database files is not yet existing: +Ena od FreeFileSync datotek podatkovne baze Å¡e en obstaja: 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. Samo datoteke/imeniki, ki preidejo filtriranje bodo izbrani za sinhronizacijo. Filter bo uveljavljnen k imenu relativno(!) na bazo sinhroniziranih imenikov. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Avtomatizirana sinhronizacija RealtimeSync configuration RealtimeSync nastavitve +Recycle Bin not yet supported for this system! + Relative path Relativna pot Remove alternate settings @@ -702,8 +718,8 @@ Right Desno Run minimized and write status information to a logfile Poženi minimizirano in zapisuj statusne informacije v dnevniÅ¡ko datoteko -S&ave configuration -Shr&ani konfiguracijo +S&ave configuration... +Shr&ani konfiguracijo... S&witch view Sp&remeni pogled Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: Izberite imenik datoteke za beleženje: Select variant: Izberite varianto: -Setting default synchronization directions. Please check whether they are appropriate for you. -Nastavljam privzete sinhronizacijske smeri. Prosim preverite ali vam ustrezajo. +Set direction: +Nastavi smer: +Setting default synchronization directions: Old files will be overwritten by newer files. +Nastavljanje privzetih smeri sinhronizacije: Stare datoteke bodo prepisane z novimi datotekami. Show conflicts Prikaži spore -Show file icons -Prikaži ikone datotek Show files that are different Prikaži datoteke, ki so razliÄne Show files that are equal @@ -796,10 +812,8 @@ Synchronization status Status sinhronizacije Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". Sinhroniziraj vse .doc, .zip in .exe datoteke, razen iz podmape \"temp\". -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Sinhroniziraj obe strani istoÄasno: Kopiraj nove ali posodobljene datoteke v obe smeri. -Synchronize both sides using a database. Deletions are detected automatically. -Sinhroniziraj obe strani z uporabo podatkovne baze. Izbrisi so zaznani samodejno. +Synchronize both sides using a database. Deletions are detected automatically +Sinhroniziraj obe strani z uporabo podatkovne baze. Izbrisi so zaznani samodejno Synchronize... Sinhroniziraj... Synchronizing... @@ -810,14 +824,10 @@ Target directory already existing! Ciljni imenik že obstaja! Target file already existing! Ciljna datoteka že obstaja! -The command line is executed each time:\n- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -Ta ukazna-vrstica se izvede vsakiÄ:\n- Datoteke znotraj teh imenikov (ali podimenikov) so spremenjene\n- Ustrezna Ärka pogona postane na razpolago (vstavitev USB-ja) -The database file is not yet existing, but will be created during synchronization: -Datoteka podatkovne baze Å¡e ne obstaja, ampak bo ustvarjena med sinhronizacijo: +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 file does not contain a valid configuration: Datoteka ne vsebuje veljavne konfiguracije: -The required database entry is not yet existing, but will be created during synchronization: -Zahteavan vnos v podatkovni bazi Å¡e en obstaja, ampak bo ustvarjen med sinhronizacijo: 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. Ta varianta oceni dve datoteki z enakim imenom kot enaki, ko imata enako velikost IN enak datum ter Äas zadnjega spreminjanja. Time @@ -832,28 +842,22 @@ Total required free disk space: Skupno zahtevani prosti prostor na disku: Total time: Celoten Äas: -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. -Obravnavaj Äas spremembe datoteke, ki se razlikuje za toÄno +/- 1 uro kot enak, Äe pa je manjÅ¡i kot 1 ura, pa kot spor, da lahko obravnavamo spremembe Poletnega Äasa. -Two way <-> -Obojesmerno <-> +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 +Obravnavaj Äas spremembe datoteke, ki se razlikuje za toÄno +/- 1 uro kot enak, Äe pa je manjÅ¡i kot 1 ura, pa kot spor, da lahko obravnavamo spremembe Poletnega Äasa Unable to connect to sourceforge.net! Ne morem se povezati na sourceforge.net! Unable to create logfile! Ne morem ustvariti datoteko za beleženje! -Unable to initialize Recycle Bin! -Ne morem inicializirati KoÅ¡a! Unresolved conflicts existing! Obstajajo nereÅ¡eni spori! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -Obstajajo nereÅ¡eni spori! \n\nLahko ignorirate spore in nadaljujete s sinhronizacijo. Update -> Posodobi -> Usage: Uporaba: Use Recycle Bin Uporabi KoÅ¡ -Use Recycle Bin when deleting or overwriting files. -Uporabi KoÅ¡ pri brisanju ali prepisovanju datotek. +Use Recycle Bin when deleting or overwriting files +Uporabi KoÅ¡ pri brisanju ali prepisovanju datotek User-defined directory UporabniÅ¡ko-doloÄen imenik User-defined directory for deletion was not specified! @@ -873,9 +877,7 @@ Ko se primerjava zažene s tem setom možnosti, se obdela naslednje drevo odloÄ You can ignore conflicts and continue synchronization. Lahko ignorirate spore in nadaljujete s sinhronizacijo. You can ignore the error to consider not existing directories as empty. -Ignoriraj napako za smatranje neobstojeÄih imenikv kot praznih. -You can ignore the error to skip current folder pair. -Ignoriraj napako tako, da se spusti trenutni par map. +Ignoriraj napako za smatranje neobstojeÄih imenikov kot praznih. You may try to synchronize remaining items again (WITHOUT having to re-compare)! Naslednje predmete lahko ponovno poskusite sinhronizirati (BREZ ponovne primerjave) ! different diff --git a/BUILD/Languages/spanish.lng b/BUILD/Languages/spanish.lng index 0c33f4bd..763be45d 100644 --- a/BUILD/Languages/spanish.lng +++ b/BUILD/Languages/spanish.lng @@ -40,26 +40,26 @@ &Acerca de... &Advanced &Avanzado -&Apply -&Aplicar &Cancel &Cancelar &Check for new version &Comprobar si existe una nueva versión &Content &Contenido -&Create batch job -&Crear un archivo batch +&Create batch job... +&Crear tarea batch... &Default &Configuración por defecto &Exit &Salir -&Export file list -&Exportar lista de archivos +&Export file list... +&Exportar lista de archivos... &File &Archivo -&Global settings -&Opciones globales +&Find next +&Buscar siguiente +&Global settings... +&Opciones globales... &Help &Ayuda &Ignore @@ -68,8 +68,8 @@ &Idioma &Load &Cargar -&Load configuration -&Cargar configuración +&Load configuration... +&Cargar configuración... &New &Nuevo &No @@ -95,13 +95,13 @@ , , - Other side's counterpart to %dir - +- El otro lado equivale a %dir - Other side's counterpart to %name - +- El otro lado equivale a %name - conflict - conflicto - conflict (same date, different size) -- conflicto (misma fecha, distinto tamaño) +- conflicto (misma fecha, diferente tamaño) - different - diferentes - directory part only @@ -113,7 +113,7 @@ - exists right only - existe sólo en la derecha - full file or directory name -- archivo completo o nombre del directorio +- nombre completo del archivo o directorio - left - izquierda - left newer @@ -143,7 +143,7 @@ 2. Enter a command line. 2. Introduzca una lÃnea de comando. 2. Use wildcard characters '*' and '?'. -2. Usar los caracteres comodÃn '*' y '?'. +2. Usar caracteres comodÃn '*' y '?'. 3. Exclude files directly on main grid via context menu. 3. Excluir directamente archivos sobre las celdas a través del menú de contexto. 3. Press 'Start'. @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: Una nueva versión de FreeFileSync está disponible: Abort requested: Waiting for current operation to finish... Solicitud de aborto: Esperando a que la operación actual finalice... +Abort synchronization immediately +Abortar sincronización inmediatamente Aborted Abortado About @@ -171,17 +173,17 @@ Activar filtro Add folder Añadir carpeta Add folder pair -Añadir un par de carpetas +Añadir múltiples carpetas All directories in sync! ¡Todos los directorios en sincronización! An exception occured! -¡Se ha producido una excepción! +¡Ha ocurrido una excepción! As a result the files are separated into the following categories: Como resultado, los archivos están separados en las siguientes categorÃas: 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: -Como el tÃtulo sugiere, dos archivos que comparten el mismo nombre son marcados como iguales sólo si tienen el mismo contenido. Esta opción es útil para las comprobaciones de consistencia más que en operaciones de "backup". Por lo tanto, las fechas de los archivos no se tienen en cuenta.\n\nCon esta opción habilitada el árbol de decisiones se reduce a: +Como el tÃtulo sugiere, dos archivos que comparten el mismo nombre son marcados como iguales sólo si tienen el mismo contenido. Esta opción es útil para las comprobaciones de consistencia más que en operaciones de backup. Por lo tanto, las fechas de los archivos no se tienen en cuenta.\n\nCon esta opción habilitada el árbol de decisiones se reduce a: 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 <batchfile>. This can also be scheduled in your operating system's task planner. -Crear un archivo batch para una sincronización automática. Para empezar en modo batch simplemente pasar el nombre del archivo por el ejecutable FreeFileSync en la ventana de comandos (CMD): FreeFileSync.exe <archivo batch>. También se puede planificar en el Administrador de Tareas de su Sistema Operativo. +Crear un archivo batch para una sincronización automática. Para empezar en modo batch simplemente pasar el nombre del archivo por el ejecutable FreeFileSync en la ventana de comandos (CMD): FreeFileSync.exe <archivo batch>. También se puede planificar en el administrador de tareas de su sistema operativo. At least one directory input field is empty. Almenos un campo de entrada del directorio está vacÃo. Auto-adjust columns @@ -199,17 +201,15 @@ Agradecimientos por la traducción de FreeFileSync a: Both sides have changed since last synchronization! ¡Ambos lados han cambiado desde la última sincronizacion! Browse -Navegar +Examinar Build: Realizado: -Cancel -Cancelar Cannot determine sync-direction: No se puede determinar la dirección de la sincronización: +Cannot find %x +No se puede encontrar %x Category CategorÃa -Change direction -Cambiar dirección Comma separated list Lista separada por comas Command line @@ -229,9 +229,9 @@ Comparar por... Comparing content Comparación del contenido Comparing content of files %x -Comparación del contenido de %x archivos +Comparación del contenido de los archivos %x Comparing content... -Comparando el contenido... +Comparando contenido... Comparing files by content failed. La comparación de archivos por el contenido ha fallado. Comparison Result @@ -257,7 +257,7 @@ Confirmar Conflict detected: Conflicto detectado: Conflicts/files that cannot be categorized -Conflictos/archivos que no pueden ser categorizados +Conflictos/archivos que no pueden ser clasificados Continue Continuar Conversion error: @@ -274,14 +274,14 @@ Copy locked files Copiar archivos bloqueados Copy new or updated files to right folder. Copiar archivos nuevos o actualizados a la carpeta de la derecha. -Copy shared or locked files using Volume Shadow Copy Service. -Copiar archivos compartidos o bloqueados usando el servicio "Volume Shadow Copy". +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 file %x to %y Copiar archivo %x a %y Copying file %x to %y overwriting target -Copiar archivo %x a %y sobreescribiendo el objetivo +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: @@ -293,7 +293,7 @@ No se ha podido leer los valores para los siguientes nodos XML: Create a batch job Crear una tarea batch Creating folder %x -Creando la carpeta %x +Creando carpeta %x Current operation: Operación actual: Custom @@ -303,13 +303,15 @@ Personalizar columnas Customize... Personalizar... D-Click -D-Click +Doble click DECISION TREE ÃRBOL DE DECISIÓN Data remaining: -Datos que faltan: +Datos restantes: +Data transferred: +Datos transferidos: Data verification error: Source and target file have different content! -Error de verificación de datos: Los archivos origen y objetivo tienen un contenido diferente! +Error de verificación de datos: ¡Los archivos de origen y destino tienen un contenido diferente! Date Fecha Delay @@ -326,8 +328,8 @@ Delete on both sides Borrar en ambos lados Delete on both sides even if the file is selected on one side only Borrar en ambos lados incluso si el archivo está seleccionado en un solo lado -Delete or overwrite files permanently. -Borrar o sobreescribir archivos permanentemente. +Delete or overwrite files permanently +Borrar o sobreescribir archivos permanentemente Delete permanently Borrar permanentemente Deleting file %x @@ -335,11 +337,11 @@ Borrar archivo %x Deleting folder %x Borrar carpeta %x Deletion handling -Gestión de eliminación +Gestión de borrado Description Descripción Directories are dependent! Be careful when setting up synchronization rules: -¡Los directorios son dependientes! Cuidado al establecer las reglas de sincronización: +¡Los directorios son dependientes! Tenga cuidado al establecer las reglas de sincronización: Directories to watch Directorios a visualizar Directory @@ -351,31 +353,33 @@ No volver a mostrar este diálogo Do nothing No hacer nada Do you really want to delete the following objects(s)? -¿Está seguro de querer borrar el/los siguiente(s) objeto(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? -¿Está seguro de querer mover el/los siguiente(s) objeto(s) a la Papelera de Reciclaje? +¿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 nuevas actualizaciones cada semana? +¿Quiere que FreeFileSync detecte automáticamente actualizaciones cada semana? Donate with PayPal Donar a través de PayPal Download now? ¿Descargar ahora? Drag && drop -Arrastrar && Soltar -Email +Arrastrar && soltar Email +Correo electrónico Enable filter to exclude files from synchronization Activar filtro para excluir archivos de la sincronización Endless loop when traversing directory: - +Bucle infinito al buscar en el directorio: Error Error Error changing modification time: -Error al modificar hora: +Error al cambiar hora de modificación: Error copying file: Error al copiar archivo: Error copying locked file %x! ¡Error al copiar archivo bloqueado %x! +Error copying symbolic link: +Error al copiar enlace simbólico: Error creating directory: Error al crear directorio: Error deleting directory: @@ -395,25 +399,23 @@ Error al mover a la Papelera de Reciclaje: Error opening file: Error al abrir archivo: Error parsing configuration file: -Error en el análisis sintáctico del archivo de configuración: +Error al analizar el archivo de configuración: Error reading file attributes: Error al leer atributos del archivo: Error reading file: -Error al leer el archivo: +Error al leer archivo: Error reading from synchronization database: Error al leer de la base de datos de sincronización: -Error resolving full path name: -Error al resolver el nombre completo de ruta: Error resolving symbolic link: Error al resolver enlace simbólico: Error starting Volume Shadow Copy Service! ¡Error al iniciar el servicio "Volume Shadow Copy"! Error traversing directory: - +Error al buscar en el directorio: Error when monitoring directories. Error al visualizar los directorios. Error writing file attributes: -Error al escribir atributos del archivos: +Error al escribir atributos de archivo: Error writing file: Error al escribir archivo: Error writing to synchronization database: @@ -428,10 +430,10 @@ Exclude temporarily Excluir temporalmente Exclude via filter: Excluir a través del filtro: -Exit immediately and set returncode < 0 -Salir inmediatamente y establecer el código de retorno < 0 -Exit with RC < 0 -Salir con RC < 0 +Exit instantly +Salir inmediatamente +Extension +Extensión External applications Aplicaciones externas Fatal Error @@ -439,7 +441,7 @@ Error fatal Feedback and suggestions are welcome at: Comentarios y sugerencias son bienvenidos en: File %x has an invalid date! -¡Archivo %x tiene una fecha inválida! +¡El archivo %x tiene una fecha inválida! File already exists. Overwrite? El archivo ya existe. ¿Sobreescribir? File content @@ -453,25 +455,27 @@ Fecha y tamaño del archivo Filename Nombre del archivo 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. -Los archivos %x tienen un archivo de tiempo diferente o menor que una hora!\n\nNo es seguro decidir cual de ellos es más reciente por cuestiones con el horario de verano. +Los archivos %x tienen un archivo de tiempo diferente o menor que una hora!\n\nNo es seguro decidir cual de ellos es más reciente por cuestiones referentes al horario de verano. Files %x have the same date but a different size! ¡Los archivos %x tienen la misma fecha pero un tamaño diferente! -Files are found equal if\n - file content\nis the same. -Los archivos serán considerados iguales si\n - el contenido del archivo\nes el mismo. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -Los archivos serán considerados iguales si\n - tamaño del archivo\n - la hora y fecha de la última escritura\nson iguales. +Files are found equal if\n - file content\nis the same +Los archivos serán considerados iguales si\n - el contenido del archivo\nes el mismo +Files are found equal if\n - filesize\n - last write time and date\nare the same +Los archivos serán considerados iguales si\n - tamaño del archivo\n - la hora y fecha de la última escritura\nson iguales Files remaining: Archivos restantes: Files that are equal on both sides Archivos que son iguales en ambos lados Files that exist on both sides and have different content -Archivos que existen en ambos lados y tienen contenido diferente +Archivos que existen en ambos lados y tienen un contenido diferente Files that exist on both sides, left one is newer Archivos que existen en ambos lados, el de la izquierda es más reciente Files that exist on both sides, right one is newer Archivos que existen en ambos lados, el de la derecha es más reciente Files/folders found: Archivos/carpetas encontrados: +Files/folders processed: +Archivos/carpetas procesadas: Files/folders remaining: Archivos/carpetas restantes: Files/folders that exist on left side only @@ -487,23 +491,27 @@ El filtro ha sido seleccionado Filter settings have changed! ¡Las opciones de filtrado han cambiado! Filter view -Vista de filtros +Vista del filtro Filtering is deactivated -Filtrado desactivado +El filtrado está desactivado +Find +Buscar +Find what: +Buscar: Folder Comparison and Synchronization -Comparación y Sincronización de carpetas +Comparación y Sincronización de Carpetas Free disk space available: -Espacio de disco libre disponible: +Espacio de disco disponible: FreeFileSync - Folder Comparison and Synchronization -FreeFileSync - Comparación y Sincronización de carpetas +FreeFileSync - Comparación y Sincronización de Carpetas FreeFileSync Batch Job -FreeFileSync Tarea Batch +Tarea batch de FreeFileSync FreeFileSync at Sourceforge FreeFileSync en Sourceforge FreeFileSync batch file -FreeFileSync archivo batch +archivo batch de FreeFileSync FreeFileSync configuration -FreeFileSync configuración +configuración de FreeFileSync FreeFileSync is up to date! ¡FreeFileSync está actualizado! Full path @@ -561,7 +569,7 @@ Consejos: Homepage Página de inicio Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Identificar y aplicar cambios en ambos lados usando una base de datos. Los borrados y conflictos son detectados automáticamente. +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 1-hour file time difference @@ -583,7 +591,7 @@ Incluir temporalmente Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* Incluir: *.doc;*.zip;*.exe\nExcluir: \\stuff\\temp\\* Incompatible synchronization database format: -Formato de sincronización de base de datos incompatible: +Formato de base de datos de sincronización incompatible: Info Info Information @@ -591,7 +599,9 @@ Información Initial synchronization: Sincronización inicial: Integrate external applications into context menu. The following macros are available: -Integrar aplicaciones externas en el menú de contexto. Las siguientes macros están disponibles: +Integrar aplicaciones externas en el menú de contexto. Los siguientes macros están disponibles: +Last synchronization not completed! +¡La última sincronización no se ha completado! Leave as unresolved conflict Dejar como conflicto sin resolver Left @@ -609,21 +619,23 @@ Registro de mensajes: Logging Iniciando sesión Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -La realización de copias shadow en WOW64 no está soportado. Por favor, use la versión de 64-bit de FreeFileSync. +La realización de copias shadow en WOW64 no está soportado. Por favor, use la versión 64-bit de FreeFileSync. +Match case +Distinción entre mayúsculas y minúsculas Mirror ->> Espejo ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. -Backup espejo de la carpeta de la izquierda: La carpeta de la derecha será sustituÃda y coincidirá exactamente con la carpeta de la izquierda después de la sincronización. +Copia de seguridad de la carpeta de la izquierda: La carpeta de la derecha será sustituÃda y coincidirá exactamente con la carpeta de la izquierda después de la sincronización. Monitoring active... Visualización activa... More than 50% of the total number of files will be copied or deleted! -¡Más del 50% del número total de archivos serán copiados o borrados! +¡Más del 50% del número total de archivos serán copiados o eliminados! Move column down -Mover columna abajo +Mover abajo la columna Move column up -Mover columna arriba -Move files into a time-stamped subdirectory. -Mover archivos a un subdirectorio con marca de tiempo. +Mover arriba la columna +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 file %x to user-defined directory %y @@ -637,17 +649,19 @@ No change since last synchronization! No filter selected Ningún filtro seleccionado Not enough free disk space available in: -Espacio en disco disponible insuficiente en: +Espacio en disco insuficiente en: Nothing to synchronize according to configuration! ¡Nada que sincronizar de acuerdo con la configuración! Number of files and directories that will be created Número de archivos y directorios que serán creados Number of files and directories that will be deleted -Número de archivos y directorios que serán borrados +Número de archivos y directorios que serán eliminados Number of files that will be overwritten Número de archivos que serán sobreescritos -OK -OK +One of the FreeFileSync database entries within the following file is not yet existing: +Una de las entradas de la base de datos de FreeFileSync con el siguiente archivo aún no existe: +One of the FreeFileSync database files is not yet existing: +Uno de los archivos de la base de datos de FreeFileSync aún no existe: 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. Sólo los archivos/directorios que pasen el filtrado serán seleccionados para la sincronización. El filtro será aplicado al nombre relativo(!) a la base de directorios de sincronización. Open directly @@ -669,7 +683,7 @@ Pausado Please run a Compare first before synchronizing! ¡Por favor, ejecute la comparación antes de la sincronización! Processing folder pair: -Procesar un par de carpetas: +Procesar múltiples carpetas: Published under the GNU General Public License: Publicado bajo "GNU General Public License": Question @@ -679,9 +693,11 @@ Salir Re-enable all hidden dialogs? ¿Reactivar todos los diálogos ocultos? RealtimeSync - Automated Synchronization -Sincronización automática de RealtimeSync +RealtimeSync - Sincronización Automática RealtimeSync configuration Configuración de RealtimeSync +Recycle Bin not yet supported for this system! + Relative path Ruta relativa Remove alternate settings @@ -689,7 +705,7 @@ Eliminar opciones alternativas Remove folder Eliminar carpeta Remove folder pair -Eliminar un par de carpetas +Eliminar múltiples carpetas Remove local filter settings Eliminar las opciones locales de filtrado Renaming file %x to %y @@ -701,9 +717,9 @@ Reiniciar Right Derecha Run minimized and write status information to a logfile -Ejecutar minimizado y escribir información del estado en un archivo de registro -S&ave configuration -G&uardar configuración +Ejecución minimizada y escritura de información del estado en un archivo de registro +S&ave configuration... +G&uardar configuración... S&witch view C&ambiar vista Save changes to current configuration? @@ -711,23 +727,23 @@ Save changes to current configuration? Save current configuration to file Guardar la configuración actual en un archivo Scanning... -Analizando... +Escanenado... Scanning: -Analizar: +Escanear: Select a folder Seleccione una carpeta Select alternate synchronization settings Seleccione opciones alternativas de sincronización Select logfile directory: -Seleccione directorio del archivo de registro: +Seleccione directorio para el archivo de registro: Select variant: Seleccione un tipo: -Setting default synchronization directions. Please check whether they are appropriate for you. -Configurar direcciones de sincronización por defecto. Por favor, compruebe que son correctas. +Set direction: +Indicar dirección: +Setting default synchronization directions: Old files will be overwritten by newer files. +Fijando direcciones de sincronización por defecto: Los archivos viejos serán sobreescritos por los archivos nuevos. Show conflicts Mostrar conflictos -Show file icons -Mostrar icono de los archivos Show files that are different Mostrar archivos diferentes Show files that are equal @@ -757,9 +773,9 @@ Mostrar archivos que no serán copiados Show hidden dialogs Mostrar diálogos ocultos Show popup -Mostrar popup +Mostrar ventanas emergentes Show popup on errors or warnings -Mostrar popup de errores o avisos +Mostrar ventanas emergentes de errores o avisos Significant difference detected: Diferencia significante detectada: Silent mode @@ -795,11 +811,9 @@ Opciones de sincronización Synchronization status Estado de la sincronización Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Sincronizar todos los archivos .doc, .zip and .exe excepto el contenido de la subcarpeta \"temp\". -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Sincronizar ambos lados simultáneamente: Copiar archivos nuevos o actualizados en ambas direcciones. -Synchronize both sides using a database. Deletions are detected automatically. -Sincronizar ambos lados usando una base de datos. Los borrados son detectados automáticamente. +Sincronizar todos los archivos .doc, .zip y .exe excepto el contenido de la subcarpeta \"temp\". +Synchronize both sides using a database. Deletions are detected automatically +Sincronizar ambos lados usando una base de datos. Las eliminaciones son detectadas automáticamente. Synchronize... Sincronizar... Synchronizing... @@ -807,17 +821,13 @@ Sincronizando... System out of memory! ¡Sistema sin memoria! Target directory already existing! -¡El directorio objetivo ya existe! +¡El directorio de destino ya existe! Target file already existing! -¡El archivo objetivo ya existe! -The command line is executed each time:\n- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -La lÃnea de comandos es ejecutada cada vez:\n- Archivos con estos directorios (o subdirectorios) son modificados\n- La letra de la unidad correspondiente se muestra disponible (inserción USB) -The database file is not yet existing, but will be created during synchronization: -El archivo de base de datos no existe aún pero será creado durante la sincronización: +¡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 file does not contain a valid configuration: El archivo no contiene una configuración válida: -The required database entry is not yet existing, but will be created during synchronization: -La entrada a la base de datos no existe aún pero será creada durante la sincronización: 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. Este tipo evalúa dos archivos con el mismo nombre como iguales cuando tienen el mismo tamaño de archivo y la misma fecha de modificación. Time @@ -832,50 +842,42 @@ Total required free disk space: Espacio total de disco necesario: Total time: Tiempo 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. - -Two way <-> -Doble sentido <-> +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 +El archivo en cuestión tiene una diferencia de tiempo de +/- 1 hora, menos de una hora entra en conflicto para gestionar los cambios referentes al horario de verano Unable to connect to sourceforge.net! ¡Incapaz de conectar con sourceforge.net! Unable to create logfile! ¡Incapaz de crear un archivo de registro! -Unable to initialize Recycle Bin! -¡Incapaz de iniciar la Papelera de Reciclaje! Unresolved conflicts existing! ¡Existen conflictos sin resolver! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. - Update -> Actualizar -> Usage: Uso: Use Recycle Bin Utilizar Papelera de Reciclaje -Use Recycle Bin when deleting or overwriting files. -Utilitzar Papelera de Reciclaje al borrar o sobreescribir archivos. +Use Recycle Bin when deleting or overwriting files +Utilitzar Papelera de Reciclaje al eliminar o sobreescribir archivos User-defined directory Directorio definido por el usuario User-defined directory for deletion was not specified! -¡El directorio definido por el usuario para el borrado no ha sido indicado! +¡No se ha indicado el directorio definido por el usuario para el borrado! Variant Tipo Verifying file %x Verificación del archivo %x Volume name %x not part of filename %y! -El nombre del volumen %x no es una parte del nombre del archivo %y +El nombre del volumen %x no es una parte del nombre de archivo %y Warning Atención Warning: Synchronization failed for %x item(s): -Atención: La sincronización falló para %x item(s): +Atención: La sincronización falló para %x elemento(s): When the comparison is started with this option set the following decision tree is processed: Cuando la comparación se inicia con este conjunto de opciones se procesa el siguiente árbol de decisiones: You can ignore conflicts and continue synchronization. Puede ignorar conflictos y continuar con la sincronización. You can ignore the error to consider not existing directories as empty. -Puede ignorar el error al considerar que no existen directorios como vacÃos. -You can ignore the error to skip current folder pair. -Puede ignorar el error omitiendo el par de carpetas actuales. +Puede ignorar el error al considerar que no existen directorios vacÃos. You may try to synchronize remaining items again (WITHOUT having to re-compare)! ¡Puede intentar sincronizar los elementos restantes otra vez (SIN tener que volver a comparar)! different diff --git a/BUILD/Languages/swedish.lng b/BUILD/Languages/swedish.lng index 9211ce99..19528a48 100644 --- a/BUILD/Languages/swedish.lng +++ b/BUILD/Languages/swedish.lng @@ -40,26 +40,26 @@ &Om... &Advanced &Avancerat -&Apply -&Verkställ &Cancel &Avbryt &Check for new version &Sök efter uppdatering &Content &InnehÃ¥ll -&Create batch job -&Skapa batch-jobb +&Create batch job... +&Skapa batch-jobb... &Default &Standard &Exit &Avsluta -&Export file list -&Exportera fillista +&Export file list... +&Exportera fillista... &File &Arkiv -&Global settings -&Allmäna inställningar +&Find next +&Sök nästa +&Global settings... +&Allmäna inställningar... &Help &Hjälp &Ignore @@ -68,8 +68,8 @@ &SprÃ¥k &Load &Läs frÃ¥n fil -&Load configuration -&Hämta inställningar frÃ¥n fil +&Load configuration... +&Hämta inställningar frÃ¥n fil... &New &Nytt &No @@ -93,7 +93,7 @@ (Requires an Internet connection!) (Kräver Internetuppkoppling!) , -. +, - Other side's counterpart to %dir - Andra sidans motsvarighet till %dir - Other side's counterpart to %name @@ -125,7 +125,7 @@ -Open-Source file synchronization- -Öppen källkod filsynkronisering- . -, +. /sec /s 1 directory @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: En nyare version av FreeFileSync finns tillgänglig: Abort requested: Waiting for current operation to finish... Avbryter: Väntar pÃ¥ att aktuell process skall slutföras... +Abort synchronization immediately +Avbryt synkronisering omedelbart Aborted Användaren avbröt About @@ -202,14 +204,12 @@ Browse Bläddra Build: Bygg: -Cancel -Avbryt Cannot determine sync-direction: Kan inte bestämma synk-riktning: +Cannot find %x +Kan inte hitta %x Category Kategori -Change direction -Ändra riktning Comma separated list Komma-separerad lista Command line @@ -274,8 +274,8 @@ Copy locked files Kopiera lÃ¥sta filer Copy new or updated files to right folder. Kopiera nya och uppdaterade filer till höger katalog. -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 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 file %x to %y @@ -308,6 +308,8 @@ DECISION TREE BESLUTSTRÄD Data remaining: Ã…terstÃ¥ende data: +Data transferred: +Överförd data: Data verification error: Source and target file have different content! Verifikationsfel: Källfil och mÃ¥lfil har olika innehÃ¥ll! Date @@ -326,7 +328,7 @@ Delete on both sides Ta bort pÃ¥ bÃ¥da sidor Delete on both sides even if the file is selected on one side only Ta bort pÃ¥ bÃ¥da sidor, även om filen är markerad pÃ¥ endast en sida -Delete or overwrite files permanently. +Delete or overwrite files permanently Ta bort eller skriv över permanent Delete permanently Ta bort permanent @@ -376,6 +378,8 @@ Error copying file: Kan inte kopiera fil: Error copying locked file %x! Kan inte kopiera lÃ¥st fil %x! +Error copying symbolic link: +Kan inte kopiera symbolisk länk: Error creating directory: Kan inte skapa katalog: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Kan inte läsa fil: Error reading from synchronization database: Kan inte läsa frÃ¥n databasen: -Error resolving full path name: -Kan inte läsa in full sökväg: Error resolving symbolic link: Kan inte tyda symbolisk länk: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Undanta tillfälligt Exclude via filter: Lägg till i undantag: -Exit immediately and set returncode < 0 -Avsluta omedelbart och sätt returkod < 0 -Exit with RC < 0 -Avsluta med RC < 0 +Exit instantly +Avsluta omedelbart +Extension +Filformat External applications Externa program Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de Filerna %x har en tidsstämpling som skiljer mindre än en timme!\n\nDet är inte helt säkert att avgöra vilken som är nyast, p.g.a sommartids-problem. Files %x have the same date but a different size! Filerna %x har samma datum men olika storlek! -Files are found equal if\n - file content\nis the same. -Filerna betecknas som lika om, \n - filinnehÃ¥llet\när lika. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -Filerna betecknas som lika om, \n - filstorlek\n - 'senast använd' och datum\när lika. +Files are found equal if\n - file content\nis the same +Filerna betecknas som lika om, \n - filinnehÃ¥llet\när lika +Files are found equal if\n - filesize\n - last write time and date\nare the same +Filerna betecknas som lika om, \n - filstorlek\n - 'senast använd' och datum\när lika Files remaining: Filer kvar: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Filer som finns pÃ¥ bÃ¥da sidor, höger är nyare Files/folders found: Funna filer/kataloger: +Files/folders processed: +Filer/kataloger klara: Files/folders remaining: Filer/kataloger kvar: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view Filtervy Filtering is deactivated Filter inaktiverat +Find +Sök +Find what: +Sök efter: Folder Comparison and Synchronization Katalogjämförelse och synkronisering Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: Initial synkronisering: Integrate external applications into context menu. The following macros are available: Integrera externa program i högerklicksmeny. Följande variabler finns tillgängliga: +Last synchronization not completed! +Senaste synkronisering ej slutförd! Leave as unresolved conflict Ignorera konflikt Left @@ -610,6 +620,8 @@ Logging Loggar Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. Skuggkopior av wow64 stöds ej. Använd FreeFileSync x64 istället! +Match case +Matcha gemener/VERSALER Mirror ->> Spegla ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,7 +634,7 @@ Move column down Flytta ner kollumn Move column up Flytta upp kollumn -Move files into a time-stamped subdirectory. +Move files into a time-stamped subdirectory Flytta filer till en tidsstämplad underkatalog Moving %x to Recycle Bin Flyttar %x till papperskorgen @@ -646,8 +658,10 @@ Number of files and directories that will be deleted Antal filer och kataloger som kommer att tas bort Number of files that will be overwritten Antal filer som kommer att skrivas över -OK -OK +One of the FreeFileSync database entries within the following file is not yet existing: +Ett av FreeFileSync´s databasobjekt i följande fil saknas: +One of the FreeFileSync database files is not yet existing: +En av FreeFileSync´s databasfiler saknas: 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. Endast filer/kataloger som kvarstÃ¥r efter filtrering, kommer att markeras för synkronisering. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Automatiserad synkronisering RealtimeSync configuration RealtimeSync konfiguration +Recycle Bin not yet supported for this system! + Relative path Sökväg Remove alternate settings @@ -702,8 +718,8 @@ Right Höger Run minimized and write status information to a logfile Kör minimerad och skriv statusinformation till loggfil -S&ave configuration -S¶ inställningar +S&ave configuration... +S¶ inställningar... S&witch view B&yt sida Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: Välj loggfilsdestination: Select variant: Välj variant: -Setting default synchronization directions. Please check whether they are appropriate for you. -Kontrollera om standard synkroniseringskataloger passar dina önskemÃ¥l. +Set direction: +Ange riktning: +Setting default synchronization directions: Old files will be overwritten by newer files. +Standardsynkronisering: Gamla filer kommer att skrivas över av nyare versioner. Show conflicts Visa konflikter -Show file icons -Visa filikoner Show files that are different Visa filer som är olika Show files that are equal @@ -796,10 +812,8 @@ Synchronization status Synkroniseringsstatus Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". Synkronisera alla filer, .doc, .zip och .exe men inga undermappar \"temp\". -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Synkronisera bÃ¥da sidor simultant: Kopiera nya eller uppdaterade filer i bägge riktningar. -Synchronize both sides using a database. Deletions are detected automatically. -Synkronisera bÃ¥da sidor med hjälp av databas. Borttagningar upptäcks automatiskt. +Synchronize both sides using a database. Deletions are detected automatically +Synkronisera bÃ¥da sidor med hjälp av databas. Borttagningar upptäcks automatiskt Synchronize... Synkronisera Synchronizing... @@ -810,14 +824,10 @@ Target directory already existing! MÃ¥lkatalogen finns redan! Target file already existing! Filen finns redan! -The command line is executed each time:\n- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) -Kommandot kommer att exekveras varje gÃ¥ng:\n- InnehÃ¥llet i dessa kataloger (eller underkataloger) ändras\n- Enheten med aktuell enhetsbokstav ansluts (USB-anslutning) -The database file is not yet existing, but will be created during synchronization: -Databasfilen finns inte ännu, men kommer att skapas under synkroniseringen. +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 file does not contain a valid configuration: Filen är ingen giltig konfigureringsfil: -The required database entry is not yet existing, but will be created during synchronization: -Databasobjektet finns inte ännu, men kommer att skapas under synkroniseringen: 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. Denna variant betecknar 2 filer med samma namn som lika, när dom har samma storlek OCH samma tidsstämpling. Time @@ -832,28 +842,22 @@ Total required free disk space: Ledigt diskutrymme som krävs: Total time: Total tid: -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. -Betrakta tidsstämplar som skiljer exakt +/- 1 timme som lika, och mindre än 1 timme som konflikt, för att hantera sommartid. -Two way <-> -Bägge riktningar <-> +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 +Betrakta tidsstämplar som skiljer exakt +/- 1 timme som lika, och mindre än 1 timme som konflikt, för att hantera sommartid Unable to connect to sourceforge.net! Kan inte ansluta sourceforge.net! Unable to create logfile! Kan inte skapa loggfil! -Unable to initialize Recycle Bin! -Kan inte initiera papperskorgen! Unresolved conflicts existing! Obehandlad konflikt upptäckt! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -Obehandlad konflikt upptäckt! \n\nDu kan ignorera konflikter och fortsätta synkroniseringen. Update -> Uppdatera -> Usage: Användning: Use Recycle Bin Använd papperskorgen -Use Recycle Bin when deleting or overwriting files. -Use Volume Shadow Copy Service to copy locked or shared files. +Use Recycle Bin when deleting or overwriting files +Use Volume Shadow Copy Service to copy locked or shared files User-defined directory Användardefinierad katalog User-defined directory for deletion was not specified! @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. Du kan ignorera konflikter och fortsätta synkroniseringen. You can ignore the error to consider not existing directories as empty. Du kan ignorera felet att inte betrakta befintliga kataloger som tomma. -You can ignore the error to skip current folder pair. -Du kan ignorera felet att hoppa över aktuellt katalogpar. You may try to synchronize remaining items again (WITHOUT having to re-compare)! Du kan försöka synkronisera Ã¥terstÃ¥ende objekt igen (utan att trycka \"Jämför\")! different diff --git a/BUILD/Languages/turkish.lng b/BUILD/Languages/turkish.lng index 3bc006f1..94edb764 100644 --- a/BUILD/Languages/turkish.lng +++ b/BUILD/Languages/turkish.lng @@ -40,26 +40,26 @@ Va&zgeç &Hakkında... &Advanced &GeliÅŸmiÅŸ -&Apply -&Uygula &Cancel &Ä°ptal &Check for new version &Yeni sürüm kontrolü yap &Content -&Create batch job -&Komut (batch) görevi oluÅŸtur +&Create batch job... +&Komut (batch) görevi oluÅŸtur... &Default &Varsayılan &Exit Çı&kış -&Export file list -Dosya list&esini dışarı aktar +&Export file list... +Dosya list&esini dışarı aktar... &File &Dosya -&Global settings -&Genel ayarlar +&Find next + +&Global settings... +&Genel ayarlar... &Help &Yardım &Ignore @@ -68,8 +68,8 @@ Dosya list&esini dışarı aktar &Dil &Load &Yükle -&Load configuration -Konfigürasyon &yükle +&Load configuration... +Konfigürasyon &yükle... &New &Yeni &No @@ -160,6 +160,8 @@ A newer version of FreeFileSync is available: FreeFileSync'in yeni bir sürümü var: Abort requested: Waiting for current operation to finish... Vazgeçildi: Devam eden iÅŸlemin bitmesi bekleniyor... +Abort synchronization immediately + Aborted Vazgeçildi About @@ -202,14 +204,12 @@ Browse AraÅŸtır Build: Derleme: -Cancel -Ä°ptal Cannot determine sync-direction: +Cannot find %x + Category Kategori -Change direction -Yönü deÄŸiÅŸtir Comma separated list Virgül ile ayrılmış liste Command line @@ -274,7 +274,7 @@ Copy locked files Copy new or updated files to right folder. Yeni veya güncellenmiÅŸ dosyaları saÄŸdaki klasöre kopyala. -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 Hafızaya kopyala\tCTRL+C @@ -308,6 +308,8 @@ DECISION TREE Karar Åžeması Data remaining: Kalan veri: +Data transferred: + Data verification error: Source and target file have different content! Veri doÄŸrulama hatası: Kaynak ve hedef dosyası içeriÄŸi farklı! Date @@ -326,8 +328,8 @@ Delete on both sides Her iki taraftakini sil Delete on both sides even if the file is selected on one side only Dosya sadece bir tarafta seçili olsa bile her iki taraftakini de sil -Delete or overwrite files permanently. -Kalıcı olarak üzerine yaz veya sil. +Delete or overwrite files permanently +Kalıcı olarak üzerine yaz veya sil Delete permanently Kalıcı olarak sil Deleting file %x @@ -376,6 +378,8 @@ Error copying file: Dosya kopyalarken hata: Error copying locked file %x! Kilitli dosya %x'i kopyalarken hata! +Error copying symbolic link: + Error creating directory: Dizin oluÅŸtururken hata: Error deleting directory: @@ -402,8 +406,6 @@ Error reading file: Dosyayı okurken hata: Error reading from synchronization database: Senkronizasyon veri tabanýndan okuma hatasý: -Error resolving full path name: - Error resolving symbolic link: Sembolik baÄŸlantıyı çözümlerken hata: Error starting Volume Shadow Copy Service! @@ -428,10 +430,10 @@ Exclude temporarily Geçici olarak dışarda bırak Exclude via filter: Filtrelemeyle dışarda bırak: -Exit immediately and set returncode < 0 -Hemen çık ve 'returncode < 0' gerçekleÅŸtir -Exit with RC < 0 -RC < 0 ile çık +Exit instantly + +Extension + External applications Harici uygulamalar Fatal Error @@ -456,10 +458,10 @@ Files %x have a file time difference of less than 1 hour!\n\nIt's not safe to de %X dosyaları 1 saat'ten daha az tarih farkına sahip!\n\Gün ışığından yararlanma ayarına baÄŸlı olarak hangisinin daha yeni olduÄŸuna karar vermek güvenli deÄŸil. Files %x have the same date but a different size! %x dosyalarının tarihleri aynı fakat ebatları farklı! -Files are found equal if\n - file content\nis the same. -\n - dosya içeriÄŸi\naynı ise dosyalar eÅŸit kabul edilir. -Files are found equal if\n - filesize\n - last write time and date\nare the same. -\n - dosya ebadı\n - son deÄŸiÅŸiklik tarihi\naynı ise dosyalar eÅŸit kabul edilir. +Files are found equal if\n - file content\nis the same +\n - dosya içeriÄŸi\naynı ise dosyalar eÅŸit kabul edilir +Files are found equal if\n - filesize\n - last write time and date\nare the same +\n - dosya ebadı\n - son deÄŸiÅŸiklik tarihi\naynı ise dosyalar eÅŸit kabul edilir Files remaining: Kalan dosyalar: Files that are equal on both sides @@ -472,6 +474,8 @@ Files that exist on both sides, right one is newer Her iki tarafta mevcut olup saÄŸda olanı yeni olan dosyalar Files/folders found: Bulunan dosyalar/klasörler: +Files/folders processed: + Files/folders remaining: Kalan dosyalar/klasörler: Files/folders that exist on left side only @@ -490,6 +494,10 @@ Filter view Filtre görünümü Filtering is deactivated +Find + +Find what: + Folder Comparison and Synchronization Klasör KarşılaÅŸtırması ve Senkronizasyonu Free disk space available: @@ -592,6 +600,8 @@ Initial synchronization: Baþlangýç senkronizasyonu: Integrate external applications into context menu. The following macros are available: Harici uygulamaları içerik menüsüne ekle. Åžu makro’lar temin edilebilir: +Last synchronization not completed! + Leave as unresolved conflict ÇözülmemiÅŸ tutarsızlık olarak bırak Left @@ -610,6 +620,8 @@ Logging Kayıt tutma Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. +Match case + Mirror ->> Yedekleme ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -622,7 +634,7 @@ Move column down Kolonu aÅŸağı taşı Move column up Kolonu yukarı taşı -Move files into a time-stamped subdirectory. +Move files into a time-stamped subdirectory Moving %x to Recycle Bin %x geri dönüşüm kutusuna taşınıyor @@ -646,8 +658,10 @@ Number of files and directories that will be deleted Silinecek dosya ve dizinlerin sayısı Number of files that will be overwritten Ãœzerine yazılacak dosyaların sayısı -OK -TAMAM +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. Senkronizasyon için sadece filtrelenmiÅŸ dosyalar/dizinler seçilecek. Senkronizasyon taban dizinlerine göreceli isimlere filtereleme uygulanacaktır. Open directly @@ -682,6 +696,8 @@ RealtimeSync - Automated Synchronization RealtimeSync - Otomatik senkronizasyon RealtimeSync configuration RealtimeSync Konfigürasyon +Recycle Bin not yet supported for this system! + Relative path Göreceli dizin yolu Remove alternate settings @@ -702,8 +718,8 @@ Right SaÄŸ Run minimized and write status information to a logfile -S&ave configuration -Konfigürasyonu &kaydet +S&ave configuration... +Konfigürasyonu &kaydet... S&witch view Görünümü &deÄŸiÅŸtir Save changes to current configuration? @@ -722,12 +738,12 @@ Select logfile directory: Kayıt dosyası dizinini seç: Select variant: DeÄŸiÅŸkeni seç: -Setting default synchronization directions. Please check whether they are appropriate for you. +Set direction: + +Setting default synchronization directions: Old files will be overwritten by newer files. Show conflicts Tutarsızlıkları göster -Show file icons -Dosya simgelerini göster Show files that are different Farklı olan dosyaları göster Show files that are equal @@ -796,10 +812,8 @@ Synchronization status Senkronizasyon durumu Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". \"temp\" alt klasöründeki herÅŸey hariç, tüm .doc, .zip ve .exe dosyalarını senkronize et. -Synchronize both sides simultaneously: Copy new or updated files in both directions. -Her iki tarafı eÅŸzamanlı olarak senkronize et: Yeni veya güncellenmiÅŸ dosyaları her iki yönede kopyala. -Synchronize both sides using a database. Deletions are detected automatically. -Bir veritabaný kullanarak iki tarafý senkronize et. Silmeler otomatik olarak algýlanýr. +Synchronize both sides using a database. Deletions are detected automatically +Bir veritabaný kullanarak iki tarafý senkronize et. Silmeler otomatik olarak algýlanýr Synchronize... Senkronize et... Synchronizing... @@ -810,14 +824,10 @@ Target directory already existing! Hedef dizin zaten mevcut! Target file already existing! Hedef dosya zaten mevcut! -The command line is executed each time:\n- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert) - -The database file is not yet existing, but will be created during synchronization: +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 file does not contain a valid configuration: Dosya geçerli bir konfigürasyon içermiyor: -The required database entry is not yet existing, but will be created during 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. Bu deÄŸiÅŸken, aynı isimli iki dosyanın, aynı ebata ve aynı son deÄŸiÅŸikik tarihine sahip olması durumunda eÅŸit olması anlamına gelir. Time @@ -832,27 +842,21 @@ Total required free disk space: Toplam gerekli boÅŸ disk alanı: Total time: Toplam zaman: -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. -Dosya tarihleri tam olarak +/- 1 saat farklı olduÄŸunda dosyaları eÅŸit olarak algıla. 1 saatten az tarih farklılıklarını ise tutarsızlık olarak belirt (Gün ışığından yararlanma durumu). -Two way <-> -Ä°ki yönlü <-> +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 +Dosya tarihleri tam olarak +/- 1 saat farklı olduÄŸunda dosyaları eÅŸit olarak algıla. 1 saatten az tarih farklılıklarını ise tutarsızlık olarak belirt (Gün ışığından yararlanma durumu) Unable to connect to sourceforge.net! sourceforge.net’e baÄŸlanılamıyor! Unable to create logfile! Kayıt dosyası yaratılamıyor! -Unable to initialize Recycle Bin! -Geri dönüşüm kutusu baÅŸlatılamıyor! Unresolved conflicts existing! -Unresolved conflicts existing! \n\nYou can ignore conflicts and continue synchronization. -Çözülemeyen tutarsızlık mevcut! \n\nTutarsızlıkları yoksayıp senkronizasyona devam edebilirsiniz. Update -> Güncelle -> Usage: Use Recycle Bin Geri dönüşüm kutusunu kullan -Use Recycle Bin when deleting or overwriting files. +Use Recycle Bin when deleting or overwriting files Silme ve üzerine yazma sırasında geri dönüşüm kutusunu kullan User-defined directory Kullanıcı tanımlı dizin @@ -874,8 +878,6 @@ You can ignore conflicts and continue synchronization. You can ignore the error to consider not existing directories as empty. Var olamayan dizinleri boÅŸ olarak tanımlama hatasını yoksay. -You can ignore the error to skip current folder pair. -Halihazýrdaki klasör çiftini es geçmek için hatayý yok sayabilirsiniz. You may try to synchronize remaining items again (WITHOUT having to re-compare)! Kalan öğeleri tekrar senkronize etmeyi deneyebilirsiniz (Tekrar kaşılaÅŸtırma yapmadan)! different diff --git a/BUILD/Resources.dat b/BUILD/Resources.dat Binary files differindex ff81f194..cd781a2b 100644 --- a/BUILD/Resources.dat +++ b/BUILD/Resources.dat diff --git a/Cleanup.cmd b/Cleanup.cmd index 298a8ed7..b570fa15 100644 --- a/Cleanup.cmd +++ b/Cleanup.cmd @@ -15,13 +15,23 @@ attrib FreeFileSync.suo -h del FreeFileSync.suo attrib RealtimeSync\RealtimeSync.suo -h del RealtimeSync\RealtimeSync.suo -del FreeFileSync.vcproj.*.user -del RealtimeSync\RealtimeSync.vcproj.*.user -del BUILD\FreeFileSync.pdb -del BUILD\FreeFileSync.ilk -del BUILD\RealtimeSync.pdb -del BUILD\RealtimeSync.ilk +del BUILD\FreeFileSync*.pdb +del BUILD\FreeFileSync*.ilk +del BUILD\FreeFileSync*.lib +del BUILD\FreeFileSync*.exp + +del BUILD\RealtimeSync*.pdb +del BUILD\RealtimeSync*.ilk +del BUILD\RealtimeSync*.lib +del BUILD\RealtimeSync*.exp + +del BUILD\FreeFileSync.exe +del BUILD\FreeFileSync_Win32.exe +del BUILD\FreeFileSync_x64.exe +del BUILD\RealtimeSync.exe +del BUILD\RealtimeSync_Win32.exe +del BUILD\RealtimeSync_x64.exe del library\ShadowCopy\ShadowCopy.ncb attrib library\ShadowCopy\ShadowCopy.suo -h @@ -36,6 +46,8 @@ del library\ShadowCopy\Shadow.lib del library\ShadowCopy\ShadowTest.ilk del library\ShadowCopy\ShadowTest.pdb -::remove precompiled headers -del library\pch.h.gch -del RealtimeSync\pch.h.gch
\ No newline at end of file +del library\Recycler\Recycler_Vista.ncb +attrib library\Recycler\Recycler_Vista.suo -h +del library\Recycler\Recycler_Vista.suo +del library\Recycler\Recycler_Vista.vcproj.*.user +del library\Recycler\Test.vcproj.*.user diff --git a/FreeFileSync.cbp b/FreeFileSync.cbp index fc06b084..f21e35ea 100644 --- a/FreeFileSync.cbp +++ b/FreeFileSync.cbp @@ -85,8 +85,10 @@ </Build> <Compiler> <Add option="-Wshadow" /> + <Add option="-Winit-self" /> <Add option="-Wredundant-decls" /> <Add option="-Wcast-align" /> + <Add option="-Wmissing-include-dirs" /> <Add option="-Wswitch-enum" /> <Add option="-Wall" /> <Add option="-pipe" /> @@ -140,6 +142,8 @@ </Unit> <Unit filename="fileHierarchy.cpp" /> <Unit filename="fileHierarchy.h" /> + <Unit filename="library\binary.cpp" /> + <Unit filename="library\binary.h" /> <Unit filename="library\customGrid.cpp"> <Option target="Debug" /> <Option target="Release" /> @@ -163,19 +167,10 @@ <Unit filename="library\gtest\main.cpp"> <Option target="Unit Test" /> </Unit> - <Unit filename="library\gtest\src\gtest-death-test.cc"> + <Unit filename="library\gtest\src\gtest-all.cc"> <Option target="Unit Test" /> </Unit> - <Unit filename="library\gtest\src\gtest-filepath.cc"> - <Option target="Unit Test" /> - </Unit> - <Unit filename="library\gtest\src\gtest-port.cc"> - <Option target="Unit Test" /> - </Unit> - <Unit filename="library\gtest\src\gtest-typed-test.cc"> - <Option target="Unit Test" /> - </Unit> - <Unit filename="library\gtest\src\gtest.cc"> + <Unit filename="library\gtest\src\gtest-internal-inl.h"> <Option target="Unit Test" /> </Unit> <Unit filename="library\gtest\unittest.h"> @@ -280,6 +275,14 @@ <Unit filename="shared\globalFunctions.h" /> <Unit filename="shared\guid.cpp" /> <Unit filename="shared\guid.h" /> + <Unit filename="shared\helpProvider.cpp"> + <Option target="Debug" /> + <Option target="Release" /> + </Unit> + <Unit filename="shared\helpProvider.h"> + <Option target="Debug" /> + <Option target="Release" /> + </Unit> <Unit filename="shared\localization.cpp" /> <Unit filename="shared\localization.h" /> <Unit filename="shared\longPathPrefix.cpp" /> @@ -321,10 +324,6 @@ <Unit filename="synchronization.h"> <Option target="<{~None~}>" /> </Unit> - <Unit filename="ui\appMain.h"> - <Option target="Debug" /> - <Option target="Release" /> - </Unit> <Unit filename="ui\batchStatusHandler.cpp"> <Option target="Debug" /> <Option target="Release" /> @@ -369,6 +368,23 @@ <Unit filename="ui\mainDialog.h"> <Option target="<{~None~}>" /> </Unit> + <Unit filename="ui\messagePopup.cpp"> + <Option target="Debug" /> + <Option target="Release" /> + </Unit> + <Unit filename="ui\messagePopup.h" /> + <Unit filename="ui\mouseMoveWindow.cpp" /> + <Unit filename="ui\mouseMoveWindow.h" /> + <Unit filename="ui\progressIndicator.cpp"> + <Option target="Debug" /> + <Option target="Release" /> + </Unit> + <Unit filename="ui\progressIndicator.h" /> + <Unit filename="ui\search.cpp"> + <Option target="Debug" /> + <Option target="Release" /> + </Unit> + <Unit filename="ui\search.h" /> <Unit filename="ui\settingsDialog.cpp"> <Option target="Debug" /> <Option target="Release" /> diff --git a/FreeFileSync.vcproj b/FreeFileSync.vcproj index 9af3ce87..fa01bd2b 100644 --- a/FreeFileSync.vcproj +++ b/FreeFileSync.vcproj @@ -49,7 +49,7 @@ PreprocessorDefinitions="wxUSE_UNICODE;__WXMSW__;FFS_WIN;__WXDEBUG__;TIXML_USE_STL;ZSTRING_WIDE_CHAR" MinimalRebuild="true" BasicRuntimeChecks="3" - RuntimeLibrary="1" + RuntimeLibrary="3" UsePrecompiledHeader="0" WarningLevel="4" Detect64BitPortabilityProblems="false" @@ -74,6 +74,7 @@ LinkIncremental="2" AdditionalLibraryDirectories="C:\Programme\C++\wxWidgets\lib\vc_lib" GenerateManifest="true" + IgnoreAllDefaultLibraries="false" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1" @@ -134,7 +135,7 @@ PreprocessorDefinitions="wxUSE_UNICODE;__WXMSW__;FFS_WIN;__WXDEBUG__;TIXML_USE_STL;ZSTRING_WIDE_CHAR" MinimalRebuild="true" BasicRuntimeChecks="3" - RuntimeLibrary="1" + RuntimeLibrary="3" UsePrecompiledHeader="0" WarningLevel="4" Detect64BitPortabilityProblems="false" @@ -382,6 +383,10 @@ > </File> <File + RelativePath=".\library\binary.cpp" + > + </File> + <File RelativePath=".\ui\checkVersion.cpp" > </File> @@ -458,6 +463,10 @@ > </File> <File + RelativePath=".\shared\helpProvider.cpp" + > + </File> + <File RelativePath=".\library\iconBuffer.cpp" > </File> @@ -474,10 +483,22 @@ > </File> <File + RelativePath=".\ui\messagePopup.cpp" + > + </File> + <File + RelativePath=".\ui\mouseMoveWindow.cpp" + > + </File> + <File RelativePath=".\library\processXml.cpp" > </File> <File + RelativePath=".\ui\progressIndicator.cpp" + > + </File> + <File RelativePath=".\shared\recycler.cpp" > </File> @@ -486,6 +507,10 @@ > </File> <File + RelativePath=".\ui\search.cpp" + > + </File> + <File RelativePath=".\shared\serialize.cpp" > </File> @@ -1,4 +1,11 @@ -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 +APPNAME = FreeFileSync + +prefix = /usr +BINDIR = $(DESTDIR)$(prefix)/bin +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 FILE_LIST= #internal list of all *.cpp files needed for compilation @@ -17,6 +24,9 @@ FILE_LIST+=ui/checkVersion.cpp FILE_LIST+=ui/batchStatusHandler.cpp FILE_LIST+=ui/guiStatusHandler.cpp FILE_LIST+=ui/trayIcon.cpp +FILE_LIST+=ui/search.cpp +FILE_LIST+=ui/messagePopup.cpp +FILE_LIST+=ui/progressIndicator.cpp FILE_LIST+=library/customGrid.cpp FILE_LIST+=library/errorLogging.cpp FILE_LIST+=library/statusHandler.cpp @@ -25,6 +35,7 @@ FILE_LIST+=ui/smallDialogs.cpp FILE_LIST+=library/processXml.cpp FILE_LIST+=library/statistics.cpp FILE_LIST+=library/filter.cpp +FILE_LIST+=library/binary.cpp FILE_LIST+=shared/dragAndDrop.cpp FILE_LIST+=shared/localization.cpp FILE_LIST+=shared/guid.cpp @@ -46,6 +57,8 @@ FILE_LIST+=shared/toggleButton.cpp FILE_LIST+=shared/customComboBox.cpp FILE_LIST+=shared/serialize.cpp FILE_LIST+=shared/fileID.cpp +FILE_LIST+=shared/recycler.cpp +FILE_LIST+=shared/helpProvider.cpp #list of all *.o files OBJECT_LIST=$(foreach file, $(FILE_LIST), OBJ/$(subst .cpp,.o,$(notdir $(file)))) @@ -53,6 +66,21 @@ 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 @@ -65,14 +93,29 @@ removeBOM: tools/removeBOM.cpp ./removeBOM shared/localization.cpp osspUUID: - cd shared/ossp_uuid && chmod +x configure && chmod +x shtool && ./configure --with-cxx --disable-shared && make clean && make && make check + cd shared/ossp_uuid && \ + chmod +x configure && \ + chmod +x shtool && \ + ./configure --with-cxx --disable-shared && \ + make && \ + make check %.dep : %.cpp - #strip path information - g++ $(CPPFLAGS) $< -o OBJ/$(subst .cpp,.o,$(notdir $<)) +#strip path information + g++ $(FFS_CPPFLAGS) $< -o OBJ/$(subst .cpp,.o,$(notdir $<)) FreeFileSync: init removeBOM osspUUID $(DEP_LIST) - g++ -o BUILD/FreeFileSync $(OBJECT_LIST) $(LINKFLAGS) + g++ -o BUILD/$(APPNAME) $(OBJECT_LIST) $(LINKFLAGS) clean: - find OBJ -type f -exec rm {} \; + rm -rf OBJ + rm -f BUILD/$(APPNAME) + cd shared/ossp_uuid && make clean + rm -f removeBOM + +install: + if [ ! -d $(BINDIR) ] ; then mkdir -p $(BINDIR); fi + if [ ! -d $(APPSHAREDIR) ] ; then mkdir -p $(APPSHAREDIR); fi + + cp BUILD/$(APPNAME) $(BINDIR) + cp -R BUILD/Languages/ BUILD/Help/ BUILD/Compare_Complete.wav BUILD/Sync_Complete.wav BUILD/Resources.dat BUILD/Changelog.txt BUILD/License.txt BUILD/styles.rc $(APPSHAREDIR) diff --git a/RealtimeSync/RealtimeSync.cbp b/RealtimeSync/RealtimeSync.cbp index 76eccb5e..6d5760fd 100644 --- a/RealtimeSync/RealtimeSync.cbp +++ b/RealtimeSync/RealtimeSync.cbp @@ -132,6 +132,7 @@ <Unit filename="..\shared\fileTraverser.cpp" /> <Unit filename="..\shared\globalFunctions.cpp" /> <Unit filename="..\shared\globalFunctions.h" /> + <Unit filename="..\shared\helpProvider.cpp" /> <Unit filename="..\shared\localization.cpp" /> <Unit filename="..\shared\localization.h" /> <Unit filename="..\shared\longPathPrefix.cpp" /> diff --git a/RealtimeSync/RealtimeSync.vcproj b/RealtimeSync/RealtimeSync.vcproj index ddf293ea..d84e8525 100644 --- a/RealtimeSync/RealtimeSync.vcproj +++ b/RealtimeSync/RealtimeSync.vcproj @@ -49,11 +49,11 @@ PreprocessorDefinitions="wxUSE_UNICODE;__WXMSW__;FFS_WIN;__WXDEBUG__;TIXML_USE_STL;ZSTRING_WIDE_CHAR" MinimalRebuild="true" BasicRuntimeChecks="3" - RuntimeLibrary="1" + RuntimeLibrary="3" UsePrecompiledHeader="0" - WarningLevel="3" + WarningLevel="4" DebugInformationFormat="4" - DisableSpecificWarnings="4804" + DisableSpecificWarnings="4804;4100" /> <Tool Name="VCManagedResourceCompilerTool" @@ -133,11 +133,11 @@ PreprocessorDefinitions="wxUSE_UNICODE;__WXMSW__;FFS_WIN;__WXDEBUG__;TIXML_USE_STL;ZSTRING_WIDE_CHAR" MinimalRebuild="true" BasicRuntimeChecks="3" - RuntimeLibrary="1" + RuntimeLibrary="3" UsePrecompiledHeader="0" - WarningLevel="3" + WarningLevel="4" DebugInformationFormat="3" - DisableSpecificWarnings="4804" + DisableSpecificWarnings="4804;4100" /> <Tool Name="VCManagedResourceCompilerTool" @@ -219,9 +219,9 @@ RuntimeLibrary="0" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" - WarningLevel="3" + WarningLevel="4" DebugInformationFormat="3" - DisableSpecificWarnings="4804" + DisableSpecificWarnings="4804;4100" /> <Tool Name="VCManagedResourceCompilerTool" @@ -303,10 +303,10 @@ RuntimeLibrary="0" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" - WarningLevel="3" + WarningLevel="4" SuppressStartupBanner="false" DebugInformationFormat="3" - DisableSpecificWarnings="4804" + DisableSpecificWarnings="4804;4100" /> <Tool Name="VCManagedResourceCompilerTool" @@ -404,6 +404,10 @@ > </File> <File + RelativePath="..\shared\helpProvider.cpp" + > + </File> + <File RelativePath="..\shared\localization.cpp" > </File> diff --git a/RealtimeSync/application.cpp b/RealtimeSync/application.cpp index 68cebae0..a48369b4 100644 --- a/RealtimeSync/application.cpp +++ b/RealtimeSync/application.cpp @@ -1,10 +1,9 @@ -/*************************************************************** - * Purpose: Code for Application Class - * Author: ZenJu (zhnmju123@gmx.de) - * Created: 2009-07-06 - * Copyright: ZenJu (http://sourceforge.net/projects/freefilesync/) - **************************************************************/ - +// ************************************************************************** +// * 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 "application.h" #include "mainDialog.h" #include <wx/event.h> @@ -14,6 +13,7 @@ #include "xmlFreeFileSync.h" #include "../shared/standardPaths.h" #include <wx/file.h> +#include "../shared/stringConv.h" #ifdef FFS_LINUX #include <gtk/gtk.h> @@ -41,16 +41,7 @@ void Application::OnStartApplication(wxIdleEvent& event) SetAppName(wxT("FreeFileSync")); //use a different app name, to have "GetUserDataDir()" return the same directory as for FreeFileSync #ifdef FFS_LINUX - ::gtk_rc_parse("styles.rc"); //remove inner border from bitmap buttons -#endif - - //initialize help controller - helpController.reset(new wxHelpController); - helpController->Initialize(FreeFileSync::getInstallationDir() + -#ifdef FFS_WIN - wxT("FreeFileSync.chm")); -#elif defined FFS_LINUX - wxT("Help/FreeFileSync.hhp")); + ::gtk_rc_parse(FreeFileSync::wxToZ(FreeFileSync::getResourceDir()) + "styles.rc"); //remove inner border from bitmap buttons #endif //set program language @@ -77,7 +68,7 @@ void Application::OnStartApplication(wxIdleEvent& event) GlobalResources::getInstance().load(); //loads bitmap resources on program startup - MainDialog* frame = new MainDialog(NULL, cfgFilename, *helpController); + MainDialog* frame = new MainDialog(NULL, cfgFilename); frame->SetIcon(*GlobalResources::getInstance().programIcon); //set application icon frame->Show(); } @@ -98,7 +89,7 @@ int Application::OnRun() catch (const std::exception& e) //catch all STL exceptions { //unfortunately it's not always possible to display a message box in this erroneous situation, however (non-stream) file output always works! - wxFile safeOutput(FreeFileSync::getLastErrorTxtFile(), wxFile::write); + wxFile safeOutput(FreeFileSync::getConfigDir() + wxT("LastError.txt"), wxFile::write); safeOutput.Write(wxString::FromAscii(e.what())); wxMessageBox(wxString::FromAscii(e.what()), _("An exception occured!"), wxOK | wxICON_ERROR); diff --git a/RealtimeSync/application.h b/RealtimeSync/application.h index d95cb3b4..38303857 100644 --- a/RealtimeSync/application.h +++ b/RealtimeSync/application.h @@ -1,15 +1,13 @@ -/*************************************************************** - * Purpose: Defines Application Class - * Author: ZenJu (zhnmju123@gmx.de) - * Created: 2009-07-06 - * Copyright: ZenJu (http://sourceforge.net/projects/freefilesync/) - **************************************************************/ - +// ************************************************************************** +// * 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 REALTIMESYNCAPP_H #define REALTIMESYNCAPP_H #include <wx/app.h> -#include <wx/help.h> #include <memory> class Application : public wxApp @@ -21,8 +19,6 @@ public: private: void OnStartApplication(wxIdleEvent& event); - - std::auto_ptr<wxHelpController> helpController; //global help controller }; #endif // REALTIMESYNCAPP_H diff --git a/RealtimeSync/functions.cpp b/RealtimeSync/functions.cpp index 93d075c0..15461cc4 100644 --- a/RealtimeSync/functions.cpp +++ b/RealtimeSync/functions.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "functions.h" #include <wx/textctrl.h> #include <wx/filepicker.h> diff --git a/RealtimeSync/functions.h b/RealtimeSync/functions.h index 0001a7ec..e8c03a93 100644 --- a/RealtimeSync/functions.h +++ b/RealtimeSync/functions.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 FUNCTIONS_H_INCLUDED #define FUNCTIONS_H_INCLUDED diff --git a/RealtimeSync/guiGenerated.cpp b/RealtimeSync/guiGenerated.cpp index aa4a8261..3252b0c5 100644 --- a/RealtimeSync/guiGenerated.cpp +++ b/RealtimeSync/guiGenerated.cpp @@ -18,11 +18,11 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_menubar1 = new wxMenuBar( 0 ); m_menuFile = new wxMenu(); wxMenuItem* m_menuItem14; - m_menuItem14 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("S&ave configuration") ) + wxT('\t') + wxT("CTRL-S"), wxEmptyString, wxITEM_NORMAL ); + m_menuItem14 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("S&ave configuration...") ) + wxT('\t') + wxT("CTRL-S"), wxEmptyString, wxITEM_NORMAL ); m_menuFile->Append( m_menuItem14 ); wxMenuItem* m_menuItem13; - m_menuItem13 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&Load configuration") ) + wxT('\t') + wxT("CTRL-L"), wxEmptyString, wxITEM_NORMAL ); + m_menuItem13 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&Load configuration...") ) + wxT('\t') + wxT("CTRL-L"), wxEmptyString, wxITEM_NORMAL ); m_menuFile->Append( m_menuItem13 ); m_menuFile->AppendSeparator(); @@ -40,7 +40,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_menuHelp->AppendSeparator(); - m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About...") ) + wxT('\t') + wxT("SHIFT-F1"), wxEmptyString, wxITEM_NORMAL ); m_menuHelp->Append( m_menuItemAbout ); m_menubar1->Append( m_menuHelp, _("&Help") ); @@ -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- Files within these directories (or subdirectories) are modified\n- The corresponding drive letter becomes available (USB-insert)"), wxDefaultPosition, wxDefaultSize, 0 ); + 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->Wrap( -1 ); sbSizer41->Add( m_staticText21, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); @@ -158,7 +158,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr wxStaticBoxSizer* sbSizer4; sbSizer4 = new wxStaticBoxSizer( new wxStaticBox( m_panelMain, wxID_ANY, _("Delay") ), wxVERTICAL ); - m_spinCtrlDelay = new wxSpinCtrl( m_panelMain, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP, 0, 2000000000, 0 ); + m_spinCtrlDelay = new wxSpinCtrl( m_panelMain, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); m_spinCtrlDelay->SetToolTip( _("Delay between detection of changes and execution of command line in seconds") ); sbSizer4->Add( m_spinCtrlDelay, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 ); diff --git a/RealtimeSync/mainDialog.cpp b/RealtimeSync/mainDialog.cpp index 81af1ce0..ec53cd02 100644 --- a/RealtimeSync/mainDialog.cpp +++ b/RealtimeSync/mainDialog.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "mainDialog.h" #include "resources.h" #include "../shared/customButton.h" @@ -14,15 +20,14 @@ #include "../shared/stringConv.h" #include "../shared/staticAssert.h" #include "../shared/buildInfo.h" +#include "../shared/helpProvider.h" using namespace FreeFileSync; MainDialog::MainDialog(wxDialog *dlg, - const wxString& cfgFilename, - wxHelpController& helpController) - : MainDlgGenerated(dlg), - helpController_(helpController) + const wxString& cfgFilename) + : MainDlgGenerated(dlg) { wxWindowUpdateLocker dummy(this); //avoid display distortion @@ -118,9 +123,7 @@ void MainDialog::OnQuit(wxCommandEvent &event) const wxString& MainDialog::lastConfigFileName() { - static wxString instance = FreeFileSync::getConfigDir().EndsWith(zToWx(globalFunctions::FILE_NAME_SEPARATOR)) ? - FreeFileSync::getConfigDir() + wxT("LastRun.ffs_real") : - FreeFileSync::getConfigDir() + zToWx(globalFunctions::FILE_NAME_SEPARATOR) + wxT("LastRun.ffs_real"); + static wxString instance = FreeFileSync::getConfigDir() + wxT("LastRun.ffs_real"); return instance; } @@ -128,9 +131,9 @@ const wxString& MainDialog::lastConfigFileName() void MainDialog::OnShowHelp(wxCommandEvent& event) { #ifdef FFS_WIN - helpController_.DisplaySection(wxT("html\\advanced\\RealtimeSync.html")); + FreeFileSync::displayHelpEntry(wxT("html\\advanced\\RealtimeSync.html")); #elif defined FFS_LINUX - helpController_.DisplaySection(wxT("html/advanced/RealtimeSync.html")); + FreeFileSync::displayHelpEntry(wxT("html/advanced/RealtimeSync.html")); #endif } @@ -388,8 +391,8 @@ void MainDialog::addFolder(const std::vector<wxString>& newFolders, bool addFron } //set size of scrolled window - const int additionalRows = std::min(additionalFolders.size(), MAX_ADD_FOLDERS); //up to MAX_ADD_FOLDERS additional folders shall be shown - m_scrolledWinFolders->SetMinSize(wxSize( -1, folderHeight * additionalRows)); + const size_t additionalRows = std::min(additionalFolders.size(), MAX_ADD_FOLDERS); //up to MAX_ADD_FOLDERS additional folders shall be shown + m_scrolledWinFolders->SetMinSize(wxSize( -1, folderHeight * static_cast<int>(additionalRows))); //adapt delete top folder pair button m_bpButtonRemoveTopFolder->Show(); @@ -419,8 +422,8 @@ void MainDialog::removeAddFolder(const int pos) //set size of scrolled window - const int additionalRows = std::min(additionalFolders.size(), MAX_ADD_FOLDERS); //up to MAX_ADD_FOLDERS additional folders shall be shown - m_scrolledWinFolders->SetMinSize(wxSize( -1, folderHeight * additionalRows)); + const size_t additionalRows = std::min(additionalFolders.size(), MAX_ADD_FOLDERS); //up to MAX_ADD_FOLDERS additional folders shall be shown + m_scrolledWinFolders->SetMinSize(wxSize( -1, folderHeight * static_cast<int>(additionalRows))); //adapt delete top folder pair button if (additionalFolders.size() == 0) diff --git a/RealtimeSync/mainDialog.h b/RealtimeSync/mainDialog.h index 8a5e87bf..8b83b058 100644 --- a/RealtimeSync/mainDialog.h +++ b/RealtimeSync/mainDialog.h @@ -1,10 +1,9 @@ -/*************************************************************** - * Purpose: Defines Application Frame - * Author: ZenJu (zhnmju123@gmx.de) - * Created: 2009-07-06 - * Copyright: ZenJu (http://sourceforge.net/projects/freefilesync/) - **************************************************************/ - +// ************************************************************************** +// * 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 REALTIMESYNCMAIN_H #define REALTIMESYNCMAIN_H @@ -12,7 +11,6 @@ #include <vector> #include <memory> #include "../shared/dragAndDrop.h" -#include <wx/help.h> namespace xmlAccess { @@ -37,7 +35,7 @@ private: class MainDialog: public MainDlgGenerated { public: - MainDialog(wxDialog *dlg, const wxString& cfgFilename, wxHelpController& helpController); + MainDialog(wxDialog *dlg, const wxString& cfgFilename); ~MainDialog(); void loadConfig(const wxString& filename); @@ -70,7 +68,6 @@ private: //additional folders std::vector<FolderPanel*> additionalFolders; //additional pairs to the standard pair - wxHelpController& helpController_; //support for drag and drop on main folder std::auto_ptr<FreeFileSync::DragDropOnDlg> dragDropOnFolder; }; diff --git a/RealtimeSync/makefile b/RealtimeSync/makefile index 25dd373f..59e4a25e 100644 --- a/RealtimeSync/makefile +++ b/RealtimeSync/makefile @@ -1,4 +1,9 @@ -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 -I../shared/boost_1_x +APPNAME = RealtimeSync + +prefix = /usr +BINDIR = $(DESTDIR)$(prefix)/bin + +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 -I../shared/boost_1_x LINKFLAGS=`wx-config --libs --debug=no --unicode=yes` -O3 -pthread FILE_LIST= #internal list of all *.cpp files needed for compilation @@ -28,6 +33,7 @@ FILE_LIST+=../shared/fileHandling.cpp FILE_LIST+=../shared/fileTraverser.cpp FILE_LIST+=../shared/localization.cpp FILE_LIST+=../shared/standardPaths.cpp +FILE_LIST+=../shared/helpProvider.cpp #list of all *.o files OBJECT_LIST=$(foreach file, $(FILE_LIST), OBJ/$(subst .cpp,.o,$(notdir $(file)))) @@ -48,10 +54,17 @@ removeBOM: ../tools/removeBOM.cpp %.dep : %.cpp #strip path information - g++ $(CPPFLAGS) $< -o OBJ/$(subst .cpp,.o,$(notdir $<)) + g++ $(FFS_CPPFLAGS) $< -o OBJ/$(subst .cpp,.o,$(notdir $<)) RealtimeSync: init removeBOM $(DEP_LIST) - g++ $(LINKFLAGS) -o ../BUILD/RealtimeSync $(OBJECT_LIST) + g++ $(LINKFLAGS) -o ../BUILD/$(APPNAME) $(OBJECT_LIST) clean: - find OBJ -type f -exec rm {} \; + rm -rf OBJ + rm -f ../BUILD/$(APPNAME) + rm -f removeBOM + +install: + if [ ! -d $(BINDIR) ] ; then mkdir -p $(BINDIR); fi + + cp ../BUILD/$(APPNAME) $(BINDIR) diff --git a/RealtimeSync/pch.h b/RealtimeSync/pch.h index 22ed251f..aaee9032 100644 --- a/RealtimeSync/pch.h +++ b/RealtimeSync/pch.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 FFS_PRECOMPILED_HEADER #define FFS_PRECOMPILED_HEADER diff --git a/RealtimeSync/resources.cpp b/RealtimeSync/resources.cpp index eeb89563..c2678878 100644 --- a/RealtimeSync/resources.cpp +++ b/RealtimeSync/resources.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "resources.h" #include <wx/wfstream.h> #include <wx/zipstrm.h> @@ -36,7 +42,7 @@ GlobalResources::~GlobalResources() void GlobalResources::load() const { - wxFFileInputStream input(FreeFileSync::getInstallationDir() + wxT("Resources.dat")); + wxFFileInputStream input(FreeFileSync::getResourceDir() + wxT("Resources.dat")); if (input.IsOk()) //if not... we don't want to react too harsh here { //activate support for .png files diff --git a/RealtimeSync/resources.h b/RealtimeSync/resources.h index 6a6cd976..5a9f780b 100644 --- a/RealtimeSync/resources.h +++ b/RealtimeSync/resources.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 RESOURCES_H_INCLUDED #define RESOURCES_H_INCLUDED diff --git a/RealtimeSync/trayMenu.cpp b/RealtimeSync/trayMenu.cpp index 01bcda48..ff88a950 100644 --- a/RealtimeSync/trayMenu.cpp +++ b/RealtimeSync/trayMenu.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "trayMenu.h" #include <wx/msgdlg.h> #include <wx/taskbar.h> @@ -12,6 +18,7 @@ #include <wx/log.h> #include "../shared/staticAssert.h" #include "../shared/buildInfo.h" +#include <wx/icon.h> //Linux needs this class RtsTrayIcon; @@ -46,7 +53,13 @@ public: RtsTrayIcon(WaitCallbackImpl* callback) : m_callback(callback) { - wxTaskBarIcon::SetIcon(*GlobalResources::getInstance().programIcon, wxString(wxT("RealtimeSync")) + wxT(" - ") + _("Monitoring active...")); +#ifdef FFS_WIN + const wxIcon& realtimeIcon = *GlobalResources::getInstance().programIcon; +#elif defined FFS_LINUX + wxIcon realtimeIcon; + realtimeIcon.CopyFromBitmap(GlobalResources::getInstance().getImageByName(wxT("RTS_tray_linux.png"))); //use a 22x22 bitmap for perfect fit +#endif + wxTaskBarIcon::SetIcon(realtimeIcon, wxString(wxT("RealtimeSync")) + wxT(" - ") + _("Monitoring active...")); //register double-click Connect(wxEVT_TASKBAR_LEFT_DCLICK, wxCommandEventHandler(RtsTrayIcon::resumeToMain), NULL, this); @@ -216,3 +229,4 @@ RealtimeSync::MonitorResponse RealtimeSync::startDirectoryMonitor(const xmlAcces return RESUME; } + diff --git a/RealtimeSync/trayMenu.h b/RealtimeSync/trayMenu.h index 99f2f90a..8bf73a47 100644 --- a/RealtimeSync/trayMenu.h +++ b/RealtimeSync/trayMenu.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 TRAYMENU_H_INCLUDED #define TRAYMENU_H_INCLUDED diff --git a/RealtimeSync/watcher.cpp b/RealtimeSync/watcher.cpp index 67dae521..2bb91b8a 100644 --- a/RealtimeSync/watcher.cpp +++ b/RealtimeSync/watcher.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "watcher.h" #include "../shared/systemFunctions.h" #include "functions.h" @@ -253,7 +259,7 @@ public: virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName) { m_dirs.push_back(fullName.c_str()); - return ReturnValDir(ReturnValDir::Continue(), this); + return ReturnValDir(Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_CONTINUE>(), this); } virtual ReturnValue onError(const wxString& errorText) { @@ -354,7 +360,7 @@ void RealtimeSync::waitForChanges(const std::vector<wxString>& dirNames, WaitCal if (notifications.getSize() > 0) { const DWORD rv = ::WaitForMultipleObjects( //NOTE: notifications.getArray() returns valid pointer, because it cannot be empty in this context - notifications.getSize(), //__in DWORD nCount, + static_cast<DWORD>(notifications.getSize()), //__in DWORD nCount, notifications.getArray(), //__in const HANDLE *lpHandles, false, //__in BOOL bWaitAll, UI_UPDATE_INTERVAL); //__in DWORD dwMilliseconds @@ -450,9 +456,3 @@ void RealtimeSync::waitForChanges(const std::vector<wxString>& dirNames, WaitCal #endif } - - - - - - diff --git a/RealtimeSync/watcher.h b/RealtimeSync/watcher.h index 2f3990c2..87edde86 100644 --- a/RealtimeSync/watcher.h +++ b/RealtimeSync/watcher.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 WATCHER_H_INCLUDED #define WATCHER_H_INCLUDED diff --git a/RealtimeSync/xmlFreeFileSync.cpp b/RealtimeSync/xmlFreeFileSync.cpp index d09e7a7a..ac4c1e3a 100644 --- a/RealtimeSync/xmlFreeFileSync.cpp +++ b/RealtimeSync/xmlFreeFileSync.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "xmlFreeFileSync.h" #include "../shared/standardPaths.h" #include "../shared/globalFunctions.h" @@ -47,7 +53,7 @@ xmlAccess::XmlRealConfig convertBatchToReal(const xmlAccess::XmlBatchConfig& bat output.directories.insert(output.directories.end(), uniqueFolders.begin(), uniqueFolders.end()); - output.commandline = FreeFileSync::getInstallationDir() + + output.commandline = FreeFileSync::getBinaryDir() + #ifdef FFS_WIN wxT("FreeFileSync.exe") + #elif defined FFS_LINUX diff --git a/RealtimeSync/xmlFreeFileSync.h b/RealtimeSync/xmlFreeFileSync.h index 55687d93..8955ccf1 100644 --- a/RealtimeSync/xmlFreeFileSync.h +++ b/RealtimeSync/xmlFreeFileSync.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 XMLFREEFILESYNC_H_INCLUDED #define XMLFREEFILESYNC_H_INCLUDED diff --git a/RealtimeSync/xmlProcessing.cpp b/RealtimeSync/xmlProcessing.cpp index 7b640455..7cf78c7a 100644 --- a/RealtimeSync/xmlProcessing.cpp +++ b/RealtimeSync/xmlProcessing.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "xmlProcessing.h" #include <wx/filefn.h> #include <wx/intl.h> diff --git a/RealtimeSync/xmlProcessing.h b/RealtimeSync/xmlProcessing.h index b8207973..f50849b1 100644 --- a/RealtimeSync/xmlProcessing.h +++ b/RealtimeSync/xmlProcessing.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 XMLPROCESSING_H_INCLUDED #define XMLPROCESSING_H_INCLUDED diff --git a/algorithm.cpp b/algorithm.cpp index 0940674d..c6690185 100644 --- a/algorithm.cpp +++ b/algorithm.cpp @@ -1,9 +1,16 @@ +// ************************************************************************** +// * 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 "algorithm.h" #include <wx/intl.h> #include <stdexcept> #include <wx/log.h> #include "library/resources.h" #include "shared/fileHandling.h" +#include "shared/recycler.h" #include <wx/msgdlg.h> #include "library/filter.h" #include <boost/bind.hpp> @@ -152,22 +159,14 @@ public: lastWriteTime_(NULL), fileSize_(NULL) { - if (!fileObj.isEmpty<LEFT_SIDE>()) - { - lastWriteTime_ = &fileObj.getLastWriteTime<LEFT_SIDE>(); - fileSize_ = &fileObj.getFileSize<LEFT_SIDE>(); - } + init<LEFT_SIDE>(fileObj); } DataSetFile(const FileMapping& fileObj, Loki::Int2Type<RIGHT_SIDE>) : lastWriteTime_(NULL), fileSize_(NULL) { - if (!fileObj.isEmpty<RIGHT_SIDE>()) - { - lastWriteTime_ = &fileObj.getLastWriteTime<RIGHT_SIDE>(); - fileSize_ = &fileObj.getFileSize<RIGHT_SIDE>(); - } + init<RIGHT_SIDE>(fileObj); } @@ -207,6 +206,16 @@ public: } private: + template <SelectedSide side> + void init(const FileMapping& fileObj) + { + if (!fileObj.isEmpty<side>()) + { + lastWriteTime_ = &fileObj.getLastWriteTime<side>(); + fileSize_ = &fileObj.getFileSize<side>(); + } + } + const wxLongLong* lastWriteTime_; //optional const wxULongLong* fileSize_; //optional }; @@ -246,7 +255,7 @@ DataSetFile retrieveDataSetFile(const Zstring& objShortName, const DirContainer* { if (dbDirectory) { - const DirContainer::SubFileList& fileList = dbDirectory->getSubFiles(); + const DirContainer::SubFileList& fileList = dbDirectory->getSubFiles(); const DirContainer::SubFileList::const_iterator j = fileList.find(objShortName); if (j != fileList.end()) return DataSetFile(&j->second); @@ -294,6 +303,10 @@ private: void operator()(FileMapping& fileObj) const { const CompareFilesResult cat = fileObj.getCategory(); + + if (cat == FILE_EQUAL) + return; + if (cat == FILE_LEFT_SIDE_ONLY) fileObj.setSyncDir(SYNC_DIR_RIGHT); else if (cat == FILE_RIGHT_SIDE_ONLY) @@ -347,7 +360,7 @@ public: { //use standard settings: SyncConfiguration defaultSync; - defaultSync.setVariant(SyncConfiguration::TWOWAY); + FreeFileSync::setTwoWay(defaultSync); Redetermine(defaultSync).execute(baseDirectory); return; } @@ -387,7 +400,7 @@ private: catch (FileError& error) //e.g. incompatible database version { if (handler_) handler_->reportWarning(error.show() + wxT(" \n\n") + - _("Setting default synchronization directions. Please check whether they are appropriate for you.")); + _("Setting default synchronization directions: Old files will be overwritten by newer files.")); } return std::pair<DirInfoPtr, DirInfoPtr>(); //NULL } @@ -514,7 +527,7 @@ private: dirObj.setSyncDir(SYNC_DIR_LEFT); break; case DIR_EQUAL: - assert(false); + ; //assert(false); } SetDirChangedFilter().execute(dirObj); //filter issue for this directory => treat subfiles/-dirs the same @@ -525,15 +538,15 @@ private: const std::pair<DataSetDir, const DirContainer*> dataDbLeftStuff = retrieveDataSetDir(dirObj.getObjShortName(), dbDirectoryLeft); const std::pair<DataSetDir, const DirContainer*> dataDbRightStuff = retrieveDataSetDir(dirObj.getObjShortName(), dbDirectoryRight); - const DataSetDir dataCurrentLeft( dirObj, Loki::Int2Type<LEFT_SIDE>()); - const DataSetDir dataCurrentRight(dirObj, Loki::Int2Type<RIGHT_SIDE>()); - - //evaluation - const bool changeOnLeft = dataDbLeftStuff.first != dataCurrentLeft; - const bool changeOnRight = dataDbRightStuff.first != dataCurrentRight; - if (cat != DIR_EQUAL) { + const DataSetDir dataCurrentLeft( dirObj, Loki::Int2Type<LEFT_SIDE>()); + const DataSetDir dataCurrentRight(dirObj, Loki::Int2Type<RIGHT_SIDE>()); + + //evaluation + const bool changeOnLeft = dataDbLeftStuff.first != dataCurrentLeft; + const bool changeOnRight = dataDbRightStuff.first != dataCurrentRight; + if (dataDbLeftStuff.first == dataDbRightStuff.first) //last sync seems to have been successful { if (changeOnLeft) @@ -882,46 +895,40 @@ void deleteFromGridAndHDOneSide(std::vector<FileSystemObject*>& rowsToDeleteOneS { for (std::vector<FileSystemObject*>::const_iterator i = rowsToDeleteOneSide.begin(); i != rowsToDeleteOneSide.end(); ++i) { - if (!(*i)->isEmpty<side>()) + while (true) { - while (true) + try { - try + FileSystemObject* const fsObj = *i; //all pointers are required(!) to be bound + if (!fsObj->isEmpty<side>()) { - FileMapping* fileObj = dynamic_cast<FileMapping*>(*i); - if (fileObj != NULL) - { - FreeFileSync::removeFile(fileObj->getFullName<side>(), useRecycleBin); - fileObj->removeObject<side>(); - statusHandler->deletionSuccessful(); //notify successful file/folder deletion - } + if (useRecycleBin) + FreeFileSync::moveToRecycleBin(fsObj->getFullName<side>()); //throw (FileError) else { - DirMapping* dirObj = dynamic_cast<DirMapping*>(*i); - if (dirObj != NULL) - { - FreeFileSync::removeDirectory(dirObj->getFullName<side>(), useRecycleBin); - dirObj->removeObject<side>(); //directory: removes recursively! - statusHandler->deletionSuccessful(); //notify successful file/folder deletion - } + if (isDirectoryMapping(*fsObj)) + FreeFileSync::removeDirectory(fsObj->getFullName<side>()); else - assert(!"It's no file, no dir, what is it then?"); + FreeFileSync::removeFile(fsObj->getFullName<side>()); } - break; + fsObj->removeObject<side>(); //if directory: removes recursively! } - catch (const FileError& error) - { - DeleteFilesHandler::Response rv = statusHandler->reportError(error.show()); + statusHandler->deletionSuccessful(); //notify successful file/folder deletion - if (rv == DeleteFilesHandler::IGNORE_ERROR) - break; + break; + } + catch (const FileError& error) + { + DeleteFilesHandler::Response rv = statusHandler->reportError(error.show()); - else if (rv == DeleteFilesHandler::RETRY) - ; //continue in loop - else - assert (false); - } + if (rv == DeleteFilesHandler::IGNORE_ERROR) + break; + + else if (rv == DeleteFilesHandler::RETRY) + ; //continue in loop + else + assert (false); } } } @@ -1146,13 +1153,3 @@ void FreeFileSync::checkForDSTChange(const FileCompareResult& gridData, #endif //FFS_WIN */ - - - - - - - - - - diff --git a/algorithm.h b/algorithm.h index dbe5dd35..902750d0 100644 --- a/algorithm.h +++ b/algorithm.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 ALGORITHM_H_INCLUDED #define ALGORITHM_H_INCLUDED diff --git a/comparison.cpp b/comparison.cpp index 120a96c3..7c3f3b9a 100644 --- a/comparison.cpp +++ b/comparison.cpp @@ -1,14 +1,18 @@ +// ************************************************************************** +// * 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 "comparison.h" #include <stdexcept> #include "shared/globalFunctions.h" #include <wx/intl.h> #include <wx/timer.h> -#include <wx/ffile.h> #include <wx/msgdlg.h> #include <wx/log.h> #include "algorithm.h" #include "ui/util.h" -#include <wx/thread.h> #include <memory> #include "shared/stringConv.h" #include "library/statusHandler.h" @@ -19,11 +23,7 @@ #include <map> #include "fileHierarchy.h" #include <boost/bind.hpp> -#include <boost/scoped_array.hpp> - -#ifdef FFS_WIN -#include "shared/longPathPrefix.h" -#endif +#include "library/binary.h" using namespace FreeFileSync; @@ -95,11 +95,9 @@ class BaseDirCallback : public DirCallback public: BaseDirCallback(DirContainer& output, const BaseFilter::FilterRef& filter, - unsigned int detectRenameThreshold, StatusHandler* handler) : DirCallback(this, Zstring(), output, handler), textScanning(wxToZ(wxString(_("Scanning:")) + wxT(" \n"))), - detectRenameThreshold_(detectRenameThreshold), filterInstance(filter) {} virtual TraverseCallback::ReturnValue onFile(const DefaultChar* shortName, const Zstring& fullName, const TraverseCallback::FileInfo& details); @@ -110,7 +108,6 @@ private: const Zstring textScanning; std::vector<CallbackPointer> callBackBox; //collection of callback pointers to handle ownership - const unsigned int detectRenameThreshold_; const BaseFilter::FilterRef filterInstance; //always bound! }; @@ -188,10 +185,10 @@ TraverseCallback::ReturnValDir DirCallback::onDir(const DefaultChar* shortName, baseCallback_->callBackBox.push_back(BaseDirCallback::CallbackPointer(subDirCallback)); //handle ownership //attention: ensure directory filtering is applied later to exclude actually filtered directories - return ReturnValDir(ReturnValDir::Continue(), subDirCallback); + return ReturnValDir(Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_CONTINUE>(), subDirCallback); } else - return ReturnValDir::Ignore(); //do NOT traverse subdirs + return Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_IGNORE>(); //do NOT traverse subdirs } @@ -205,7 +202,7 @@ TraverseCallback::ReturnValDir DirCallback::onDir(const DefaultChar* shortName, DirCallback* subDirCallback = new DirCallback(baseCallback_, relName += FILE_NAME_SEPARATOR, subDir, statusHandler); baseCallback_->callBackBox.push_back(BaseDirCallback::CallbackPointer(subDirCallback)); //handle ownership - return ReturnValDir(ReturnValDir::Continue(), subDirCallback); + return ReturnValDir(Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_CONTINUE>(), subDirCallback); } @@ -232,11 +229,7 @@ TraverseCallback::ReturnValue BaseDirCallback::onFile( const TraverseCallback::FileInfo& details) { //do not list the database file sync.ffs_db -#ifdef FFS_WIN - if (getSyncDBFilename().CmpNoCase(shortName) == 0) -#elif defined FFS_LINUX - if (getSyncDBFilename().Cmp(shortName) == 0) -#endif + if (getSyncDBFilename().cmpFileName(shortName) == 0) return TraverseCallback::TRAVERSING_CONTINUE; return DirCallback::onFile(shortName, fullName, details); @@ -249,20 +242,16 @@ struct DirBufferKey DirBufferKey(const Zstring& dirname, const BaseFilter::FilterRef& filterIn) : //filter interface: always bound by design! directoryName(dirname), - filter(filterIn->isNull() ? //some optimization of "Null" filter + filter(filterIn->isNull() ? //some optimization for "Null" filter BaseFilter::FilterRef(new NullFilter) : filterIn) {} const Zstring directoryName; const BaseFilter::FilterRef filter; //buffering has to consider filtering! - bool operator < (const DirBufferKey& b) const + bool operator<(const DirBufferKey& b) const { -#ifdef FFS_WIN //Windows does NOT distinguish between upper/lower-case - const int rv = directoryName.CmpNoCase(b.directoryName); -#elif defined FFS_LINUX //Linux DOES distinguish between upper/lower-case - const int rv = directoryName.Cmp(b.directoryName); -#endif + const int rv = directoryName.cmpFileName(b.directoryName); if (rv != 0) return rv < 0; @@ -276,10 +265,8 @@ class CompareProcess::DirectoryBuffer //buffer multiple scans of the same direc { public: DirectoryBuffer(const bool traverseDirectorySymlinks, - const unsigned int detectRenameThreshold, StatusHandler* statusUpdater) : m_traverseDirectorySymlinks(traverseDirectorySymlinks), - detectRenameThreshold_(detectRenameThreshold), m_statusUpdater(statusUpdater) {} const DirContainer& getDirectoryDescription(const Zstring& directoryPostfixed, const BaseFilter::FilterRef& filter); @@ -293,7 +280,6 @@ private: BufferType buffer; const bool m_traverseDirectorySymlinks; - const unsigned int detectRenameThreshold_; StatusHandler* m_statusUpdater; }; //------------------------------------------------------------------------------------------ @@ -307,7 +293,6 @@ DirContainer& CompareProcess::DirectoryBuffer::insertIntoBuffer(const DirBufferK { std::auto_ptr<TraverseCallback> traverser(new BaseDirCallback(*baseContainer, newKey.filter, - detectRenameThreshold_, m_statusUpdater)); //get all files and folders from directoryPostfixed (and subdirectories) @@ -397,16 +382,8 @@ bool dependencyExists(const std::set<Zstring>& folders, const Zstring& newFolder { for (std::set<Zstring>::const_iterator i = folders.begin(); i != folders.end(); ++i) { - Zstring newFolderFmt = newFolder; - Zstring refFolderFmt = *i; -#ifdef FFS_WIN //Windows does NOT distinguish between upper/lower-case - newFolderFmt.MakeUpper(); - refFolderFmt.MakeUpper(); -#elif defined FFS_LINUX //Linux DOES distinguish between upper/lower-case - //nothing to do here -#endif - - if (newFolderFmt.StartsWith(refFolderFmt) || refFolderFmt.StartsWith(newFolderFmt)) + const size_t commonLen = std::min(newFolder.length(), i->length()); + if (Zstring(newFolder.c_str(), commonLen).cmpFileName(Zstring(i->c_str(), commonLen)) == 0) //test wheter i begins with newFolder or the other way round { warningMessage = wxString(_("Directories are dependent! Be careful when setting up synchronization rules:")) + wxT("\n") + wxT("\"") + zToWx(*i) + wxT("\"\n") + @@ -447,7 +424,6 @@ bool foldersHaveDependencies(const std::vector<FolderPairCfg>& folderPairsFrom, CompareProcess::CompareProcess(const bool traverseSymLinks, const unsigned int fileTimeTol, const bool ignoreOneHourDiff, - const unsigned int detectRenameThreshold, xmlAccess::OptionalDialogs& warnings, StatusHandler* handler) : fileTimeTolerance(fileTimeTol), @@ -456,64 +432,7 @@ CompareProcess::CompareProcess(const bool traverseSymLinks, statusUpdater(handler), txtComparingContentOfFiles(wxToZ(_("Comparing content of files %x")).Replace(DefaultStr("%x"), DefaultStr("\n\"%x\""), false)) { - directoryBuffer.reset(new DirectoryBuffer(traverseSymLinks, detectRenameThreshold, handler)); -} - - -//callback functionality for status updates while comparing -class CompareCallback -{ -public: - virtual ~CompareCallback() {} - virtual void updateCompareStatus(const wxLongLong& totalBytesTransferred) = 0; -}; - - -bool filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback* callback) -{ - const unsigned int BUFFER_SIZE = 512 * 1024; //512 kb seems to be the perfect buffer size - static boost::scoped_array<unsigned char> memory1(new unsigned char[BUFFER_SIZE]); - static boost::scoped_array<unsigned char> memory2(new unsigned char[BUFFER_SIZE]); - -#ifdef FFS_WIN - wxFFile file1(FreeFileSync::applyLongPathPrefix(filename1).c_str(), DefaultStr("rb")); -#elif defined FFS_LINUX - wxFFile file1(::fopen(filename1.c_str(), DefaultStr("rb"))); //utilize UTF-8 filename -#endif - if (!file1.IsOpened()) - throw FileError(wxString(_("Error opening file:")) + wxT(" \"") + zToWx(filename1) + wxT("\"")); - -#ifdef FFS_WIN - wxFFile file2(FreeFileSync::applyLongPathPrefix(filename2).c_str(), DefaultStr("rb")); -#elif defined FFS_LINUX - wxFFile file2(::fopen(filename2.c_str(), DefaultStr("rb"))); //utilize UTF-8 filename -#endif - if (!file2.IsOpened()) //NO cleanup necessary for (wxFFile) file1 - throw FileError(wxString(_("Error opening file:")) + wxT(" \"") + zToWx(filename2) + wxT("\"")); - - wxLongLong bytesCompared; - do - { - const size_t length1 = file1.Read(memory1.get(), BUFFER_SIZE); - if (file1.Error()) throw FileError(wxString(_("Error reading file:")) + wxT(" \"") + zToWx(filename1) + wxT("\"")); - - const size_t length2 = file2.Read(memory2.get(), BUFFER_SIZE); - if (file2.Error()) throw FileError(wxString(_("Error reading file:")) + wxT(" \"") + zToWx(filename2) + wxT("\"")); - - if (length1 != length2 || ::memcmp(memory1.get(), memory2.get(), length1) != 0) - return false; - - bytesCompared += length1 * 2; - - //send progress updates - callback->updateCompareStatus(bytesCompared); - } - while (!file1.Eof()); - - if (!file2.Eof()) - return false; - - return true; + directoryBuffer.reset(new DirectoryBuffer(traverseSymLinks, handler)); } @@ -977,99 +896,115 @@ public: MergeSides(std::vector<FileMapping*>& appendUndefinedOut) : appendUndefined(appendUndefinedOut) {} - void execute(const DirContainer& leftSide, const DirContainer& rightSide, HierarchyObject& output) + void execute(const DirContainer& leftSide, const DirContainer& rightSide, HierarchyObject& output); + +private: + template <SelectedSide side> + void fillOneSide(const DirContainer& dirCont, HierarchyObject& output); + + std::vector<FileMapping*>& appendUndefined; +}; + + +template <> +void MergeSides::fillOneSide<LEFT_SIDE>(const DirContainer& dirCont, HierarchyObject& output) +{ + //reserve() fulfills two task here: 1. massive performance improvement! 2. ensure references in appendUndefined remain valid! + output.subFiles.reserve(dirCont.getSubFiles().size()); + output.subDirs.reserve( dirCont.getSubDirs(). size()); + + for (DirContainer::SubFileList::const_iterator i = dirCont.getSubFiles().begin(); i != dirCont.getSubFiles().end(); ++i) + output.addSubFile(i->second.getData(), i->first); + + for (DirContainer::SubDirList::const_iterator i = dirCont.getSubDirs().begin(); i != dirCont.getSubDirs().end(); ++i) { - //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) - //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! + DirMapping& newDirMap = output.addSubDir(true, i->first, false); + fillOneSide<LEFT_SIDE>(i->second, newDirMap); //recurse into subdirectories + } +} - //reserve() fulfills two task here: 1. massive performance improvement! 2. ensure references in appendUndefined remain valid! - output.subFiles.reserve(leftSide.getSubFiles().size() + rightSide.getSubFiles().size()); //assume worst case! - output.subDirs.reserve( leftSide.getSubDirs().size() + rightSide.getSubDirs().size()); // - for (DirContainer::SubFileList::const_iterator i = leftSide.getSubFiles().begin(); i != leftSide.getSubFiles().end(); ++i) - { - DirContainer::SubFileList::const_iterator j = rightSide.getSubFiles().find(i->first); +template <> +void MergeSides::fillOneSide<RIGHT_SIDE>(const DirContainer& dirCont, HierarchyObject& output) +{ + //reserve() fulfills two task here: 1. massive performance improvement! 2. ensure references in appendUndefined remain valid! + output.subFiles.reserve(dirCont.getSubFiles().size()); + output.subDirs.reserve( dirCont.getSubDirs(). size()); - //find files that exist on left but not on right - if (j == rightSide.getSubFiles().end()) - output.addSubFile(i->second.getData(), i->first); - //find files that exist on left and right - else - { - appendUndefined.push_back( - &output.addSubFile(i->second.getData(), i->first, FILE_EQUAL, j->second.getData())); //FILE_EQUAL is just a dummy-value here - } - } + for (DirContainer::SubFileList::const_iterator i = dirCont.getSubFiles().begin(); i != dirCont.getSubFiles().end(); ++i) + output.addSubFile(i->first, i->second.getData()); - //find files that exist on right but not on left - for (DirContainer::SubFileList::const_iterator j = rightSide.getSubFiles().begin(); j != rightSide.getSubFiles().end(); ++j) - { - if (leftSide.getSubFiles().find(j->first) == leftSide.getSubFiles().end()) - output.addSubFile(j->first, j->second.getData()); - } + for (DirContainer::SubDirList::const_iterator i = dirCont.getSubDirs().begin(); i != dirCont.getSubDirs().end(); ++i) + { + DirMapping& newDirMap = output.addSubDir(false, i->first, true); + fillOneSide<RIGHT_SIDE>(i->second, newDirMap); //recurse into subdirectories + } +} -//----------------------------------------------------------------------------------------------- - for (DirContainer::SubDirList::const_iterator i = leftSide.getSubDirs().begin(); i != leftSide.getSubDirs().end(); ++i) - { - DirContainer::SubDirList::const_iterator j = rightSide.getSubDirs().find(i->first); +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) + //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! - //find directories that exist on left but not on right - if (j == rightSide.getSubDirs().end()) - { - DirMapping& newDirMap = output.addSubDir(true, i->first, false); - fillOneSide<true>(i->second, newDirMap); //recurse into subdirectories - } - else //directories that exist on both sides - { - DirMapping& newDirMap = output.addSubDir(true, i->first, true); - execute(i->second, j->second, newDirMap); //recurse into subdirectories - } - } + //reserve() fulfills two task here: 1. massive performance improvement! 2. ensure references in appendUndefined remain valid! + output.subFiles.reserve(leftSide.getSubFiles().size() + rightSide.getSubFiles().size()); //assume worst case! + output.subDirs.reserve( leftSide.getSubDirs().size() + rightSide.getSubDirs().size()); // + + for (DirContainer::SubFileList::const_iterator i = leftSide.getSubFiles().begin(); i != leftSide.getSubFiles().end(); ++i) + { + DirContainer::SubFileList::const_iterator j = rightSide.getSubFiles().find(i->first); - //find directories that exist on right but not on left - for (DirContainer::SubDirList::const_iterator j = rightSide.getSubDirs().begin(); j != rightSide.getSubDirs().end(); ++j) + //find files that exist on left but not on right + if (j == rightSide.getSubFiles().end()) + output.addSubFile(i->second.getData(), i->first); + //find files that exist on left and right + else { - if (leftSide.getSubDirs().find(j->first) == leftSide.getSubDirs().end()) - { - DirMapping& newDirMap = output.addSubDir(false, j->first, true); - fillOneSide<false>(j->second, newDirMap); //recurse into subdirectories - } + appendUndefined.push_back( + &output.addSubFile(i->second.getData(), i->first, FILE_EQUAL, j->second.getData())); //FILE_EQUAL is just a dummy-value here } } -private: - template <bool leftSide> - void fillOneSide(const DirContainer& dirCont, HierarchyObject& output) + //find files that exist on right but not on left + for (DirContainer::SubFileList::const_iterator j = rightSide.getSubFiles().begin(); j != rightSide.getSubFiles().end(); ++j) + { + if (leftSide.getSubFiles().find(j->first) == leftSide.getSubFiles().end()) + output.addSubFile(j->first, j->second.getData()); + } + + +//----------------------------------------------------------------------------------------------- + for (DirContainer::SubDirList::const_iterator i = leftSide.getSubDirs().begin(); i != leftSide.getSubDirs().end(); ++i) { - //reserve() fulfills two task here: 1. massive performance improvement! 2. ensure references in appendUndefined remain valid! - output.subFiles.reserve(dirCont.getSubFiles().size()); - output.subDirs.reserve( dirCont.getSubDirs(). size()); + DirContainer::SubDirList::const_iterator j = rightSide.getSubDirs().find(i->first); - for (DirContainer::SubFileList::const_iterator i = dirCont.getSubFiles().begin(); i != dirCont.getSubFiles().end(); ++i) + //find directories that exist on left but not on right + if (j == rightSide.getSubDirs().end()) { - if (leftSide) - output.addSubFile(i->second.getData(), i->first); - else - output.addSubFile(i->first, i->second.getData()); + DirMapping& newDirMap = output.addSubDir(true, i->first, false); + fillOneSide<LEFT_SIDE>(i->second, newDirMap); //recurse into subdirectories } - - for (DirContainer::SubDirList::const_iterator i = dirCont.getSubDirs().begin(); i != dirCont.getSubDirs().end(); ++i) + else //directories that exist on both sides { - DirMapping& newDirMap = leftSide ? - output.addSubDir(true, i->first, false) : - output.addSubDir(false, i->first, true); - - fillOneSide<leftSide>(i->second, newDirMap); //recurse into subdirectories + DirMapping& newDirMap = output.addSubDir(true, i->first, true); + execute(i->second, j->second, newDirMap); //recurse into subdirectories } } - - std::vector<FileMapping*>& appendUndefined; -}; + //find directories that exist on right but not on left + for (DirContainer::SubDirList::const_iterator j = rightSide.getSubDirs().begin(); j != rightSide.getSubDirs().end(); ++j) + { + if (leftSide.getSubDirs().find(j->first) == leftSide.getSubDirs().end()) + { + DirMapping& newDirMap = output.addSubDir(false, j->first, true); + fillOneSide<RIGHT_SIDE>(j->second, newDirMap); //recurse into subdirectories + } + } +} void CompareProcess::performBaseComparison(BaseDirMapping& output, std::vector<FileMapping*>& appendUndefined) diff --git a/comparison.h b/comparison.h index 59ee582c..9c2cf71a 100644 --- a/comparison.h +++ b/comparison.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 COMPARISON_H_INCLUDED #define COMPARISON_H_INCLUDED @@ -37,10 +43,6 @@ public: CompareProcess(bool traverseSymLinks, unsigned int fileTimeTol, bool ignoreOneHourDiff, -#ifndef _MSC_VER -#warning remove threshold, if not used! -#endif - unsigned int detectRenameThreshold, xmlAccess::OptionalDialogs& warnings, StatusHandler* handler); @@ -53,12 +55,12 @@ private: void compareByContent(const std::vector<FolderPairCfg>& directoryPairsFormatted, FolderComparison& output); - //create comparison result table and fill relation except for files existing on both sides + //create comparison result table and fill category except for files existing on both sides void performBaseComparison(BaseDirMapping& output, std::vector<FileMapping*>& appendUndefined); //buffer accesses to the same directories; useful when multiple folder pairs are used class DirectoryBuffer; - boost::shared_ptr<DirectoryBuffer> directoryBuffer; //std::auto_ptr does not work with forward declarations! + boost::shared_ptr<DirectoryBuffer> directoryBuffer; //std::auto_ptr does not work with forward declarations (Or we need a non-inline ~CompareProcess())! const unsigned int fileTimeTolerance; //max allowed file time deviation const bool ignoreOneHourDifference; diff --git a/fileHierarchy.cpp b/fileHierarchy.cpp index 6316edf9..25ee618d 100644 --- a/fileHierarchy.cpp +++ b/fileHierarchy.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "fileHierarchy.h" #include <wx/wfstream.h> #include <wx/zstream.h> @@ -301,9 +307,9 @@ public: DbStreamData loadFile(const Zstring& filename) //throw (FileError) { if (!FreeFileSync::fileExists(filename)) - throw FileError(wxString(_("Initial synchronization:")) + wxT(" ") + - _("The database file is not yet existing, but will be created during synchronization:") + wxT("\n") + - wxT(" \"") + zToWx(filename) + wxT("\"")); + throw FileError(wxString(_("Initial synchronization:")) + wxT(" \n\n") + + _("One of the FreeFileSync database files is not yet existing:") + wxT(" \n") + + wxT("\"") + zToWx(filename) + wxT("\"")); //read format description (uncompressed) @@ -338,15 +344,15 @@ std::pair<DirInfoPtr, DirInfoPtr> FreeFileSync::loadFromDisk(const BaseDirMappin //find associated DirInfo-streams DirectoryTOC::const_iterator dbLeft = dbEntriesLeft.second.find(dbEntriesRight.first); //find left db-entry that corresponds to right database if (dbLeft == dbEntriesLeft.second.end()) - throw FileError(wxString(_("Initial synchronization:")) + wxT(" ") + - _("The required database entry is not yet existing, but will be created during synchronization:") + wxT("\n") + - wxT(" \"") + zToWx(fileNameLeft) + wxT("\"")); + throw FileError(wxString(_("Initial synchronization:")) + wxT(" \n\n") + + _("One of the FreeFileSync database entries within the following file is not yet existing:") + wxT(" \n") + + wxT("\"") + zToWx(fileNameLeft) + wxT("\"")); DirectoryTOC::const_iterator dbRight = dbEntriesRight.second.find(dbEntriesLeft.first); //find left db-entry that corresponds to right database if (dbRight == dbEntriesRight.second.end()) - throw FileError(wxString(_("Initial synchronization:")) + wxT(" ") + - _("The required database entry is not yet existing, but will be created during synchronization:") + wxT("\n") + - wxT(" \"") + zToWx(fileNameRight) + wxT("\"")); + throw FileError(wxString(_("Initial synchronization:")) + wxT(" \n\n") + + _("One of the FreeFileSync database entries within the following file is not yet existing:") + wxT(" \n") + + wxT("\"") + zToWx(fileNameRight) + wxT("\"")); //read streams into DirInfo boost::shared_ptr<DirInformation> dirInfoLeft(new DirInformation); @@ -488,8 +494,8 @@ void FreeFileSync::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileEr const Zstring fileNameRightTmp = baseMapping.getDBFilename<RIGHT_SIDE>() + DefaultStr(".tmp");; //delete old tmp file, if necessary -> throws if deletion fails! - removeFile(fileNameLeftTmp, false); - removeFile(fileNameRightTmp, false); + removeFile(fileNameLeftTmp); + removeFile(fileNameRightTmp); try { @@ -541,17 +547,21 @@ void FreeFileSync::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileEr //operation finished: rename temp files -> this should work transactionally: //if there were no write access, creation of temp files would have failed - removeFile(baseMapping.getDBFilename<LEFT_SIDE>(), false); - removeFile(baseMapping.getDBFilename<RIGHT_SIDE>(), false); + removeFile(baseMapping.getDBFilename<LEFT_SIDE>()); + removeFile(baseMapping.getDBFilename<RIGHT_SIDE>()); renameFile(fileNameLeftTmp, baseMapping.getDBFilename<LEFT_SIDE>()); //throw (FileError); renameFile(fileNameRightTmp, baseMapping.getDBFilename<RIGHT_SIDE>()); //throw (FileError); } catch (...) { - try //clean up: (try to) delete old tmp file + try //clean up: (try to) delete old tmp files + { + removeFile(fileNameLeftTmp); + } + catch (...) {} + try { - removeFile(fileNameLeftTmp, false); - removeFile(fileNameRightTmp, false); + removeFile(fileNameRightTmp); } catch (...) {} diff --git a/fileHierarchy.h b/fileHierarchy.h index ca029354..9bd0b7f2 100644 --- a/fileHierarchy.h +++ b/fileHierarchy.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 FILEHIERARCHY_H_INCLUDED #define FILEHIERARCHY_H_INCLUDED @@ -316,6 +322,7 @@ class FileMapping : public FileSystemObject public: template <SelectedSide side> const wxLongLong& getLastWriteTime() const; template <SelectedSide side> const wxULongLong& getFileSize() const; + template <SelectedSide side> const Zstring getExtension() const; //template <SelectedSide side> const Utility::FileID& getFileID() const; virtual CompareFilesResult getCategory() const; @@ -443,11 +450,7 @@ bool DirContainer::CmpFilename::operator()(const Zstring& a, const Zstring& b) c // if (aLength != bLength) // return aLength < bLength; -#ifdef FFS_WIN //Windows does NOT distinguish between upper/lower-case - return a.CmpNoCase(b) < 0; -#elif defined FFS_LINUX //Linux DOES distinguish between upper/lower-case - return a.Cmp(b) < 0; -#endif + return a.cmpFileName(b) < 0; } inline @@ -960,6 +963,20 @@ const wxULongLong& FileMapping::getFileSize<RIGHT_SIDE>() const } +template <SelectedSide side> +inline +const Zstring FileMapping::getExtension() const +{ + //attention: Zstring::AfterLast() returns whole string if char not found! -> don't use + const Zstring& shortName = getShortName<side>(); + + const size_t pos = shortName.Find(DefaultChar('.'), true); + return pos == Zstring::npos ? + Zstring() : + Zstring(shortName.c_str() + pos + 1); +} + + //template <> //inline //const Utility::FileID& FileMapping::getFileID<LEFT_SIDE>() const diff --git a/library/CustomGrid.cpp b/library/CustomGrid.cpp index cba76f57..a04548a3 100644 --- a/library/CustomGrid.cpp +++ b/library/CustomGrid.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "customGrid.h" #include "../shared/systemConstants.h" #include "resources.h" @@ -217,7 +223,7 @@ public: virtual int GetNumberCols() { - return columnPositions.size(); + return static_cast<int>(columnPositions.size()); } virtual wxString GetColLabelValue( int col ) @@ -270,6 +276,8 @@ protected: return _("<Directory>"); case xmlAccess::DATE: //date return wxEmptyString; + case xmlAccess::EXTENSION: //file extension + return wxEmptyString; } } else @@ -291,6 +299,8 @@ protected: return FreeFileSync::includeNumberSeparator(fileObj->getFileSize<side>().ToString()); case xmlAccess::DATE: //date return FreeFileSync::utcTimeToLocalString(fileObj->getLastWriteTime<side>(), fileObj->getFullName<side>()); + case xmlAccess::EXTENSION: //file extension + return zToWx(fileObj->getExtension<side>()); } } } @@ -492,6 +502,10 @@ 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); @@ -525,6 +539,7 @@ void CustomGrid::initSettings(CustomGridLeft* gridLeft, Connect(wxEVT_SCROLLWIN_THUMBTRACK, wxEventHandler(CustomGrid::onGridAccess), NULL, this); Connect(wxEVT_SCROLLWIN_THUMBRELEASE, wxEventHandler(CustomGrid::onGridAccess), NULL, this); Connect(wxEVT_GRID_LABEL_LEFT_CLICK, wxEventHandler(CustomGrid::onGridAccess), NULL, this); + Connect(wxEVT_SET_FOCUS, wxEventHandler(CustomGrid::onGridAccess), NULL, this); //used by grid text-search GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(CustomGrid::onGridAccess), NULL, this); GetGridWindow()->Connect(wxEVT_RIGHT_DOWN, wxEventHandler(CustomGrid::onGridAccess), NULL, this); @@ -600,149 +615,139 @@ void execGridCommands(wxEvent& event, wxGrid* grid) const int cursorOldPos = std::max(std::min(grid->GetGridCursorRow(), grid->GetNumberRows() - 1), 0); const int cursorOldColumn = std::max(std::min(grid->GetGridCursorCol(), grid->GetNumberCols() - 1), 0); - if (keyEvent->ShiftDown()) + const bool shiftPressed = keyEvent->ShiftDown(); + const bool altPressed = keyEvent->AltDown(); + const bool ctrlPressed = keyEvent->ControlDown(); + const bool noModPressed = !shiftPressed && !altPressed && !ctrlPressed; + const int keyCode = keyEvent->GetKeyCode(); + + + //SHIFT + X + if (shiftPressed && keyCode == WXK_UP) { - //support for shift + PageUp and shift + PageDown - switch (keyEvent->GetKeyCode()) - { - case WXK_UP: //move grid cursor also - { - const int cursorNewPos = std::max(cursorOldPos - 1, 0); - moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); - } + const int cursorNewPos = std::max(cursorOldPos - 1, 0); + moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); return; //no event.Skip() - - case WXK_DOWN: //move grid cursor also - { - const int cursorNewPos = std::min(cursorOldPos + 1, grid->GetNumberRows() - 1); - moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); - } + } + else if (shiftPressed && keyCode == WXK_DOWN) + { + const int cursorNewPos = std::min(cursorOldPos + 1, grid->GetNumberRows() - 1); + moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); return; //no event.Skip() - - case WXK_LEFT: //move grid cursor also - { - const int cursorColumn = std::max(cursorOldColumn - 1, 0); - grid->SetGridCursor(cursorOldPos, cursorColumn); - grid->MakeCellVisible(cursorOldPos, cursorColumn); - } + } + else if (shiftPressed && keyCode == WXK_LEFT) + { + const int cursorColumn = std::max(cursorOldColumn - 1, 0); + grid->SetGridCursor(cursorOldPos, cursorColumn); + grid->MakeCellVisible(cursorOldPos, cursorColumn); return; //no event.Skip() - - case WXK_RIGHT: //move grid cursor also - { - const int cursorColumn = std::min(cursorOldColumn + 1, grid->GetNumberCols() - 1); - grid->SetGridCursor(cursorOldPos, cursorColumn); - grid->MakeCellVisible(cursorOldPos, cursorColumn); - } + } + else if (shiftPressed && keyCode == WXK_RIGHT) + { + const int cursorColumn = std::min(cursorOldColumn + 1, grid->GetNumberCols() - 1); + grid->SetGridCursor(cursorOldPos, cursorColumn); + grid->MakeCellVisible(cursorOldPos, cursorColumn); return; //no event.Skip() - - - case WXK_PAGEUP: - case WXK_NUMPAD_PAGEUP: - { - const int rowsPerPage = grid->GetGridWindow()->GetSize().GetHeight() / grid->GetDefaultRowSize(); - const int cursorNewPos = std::max(cursorOldPos - rowsPerPage, 0); - moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); - } + } + else if (shiftPressed && (keyCode == WXK_PAGEUP || keyCode == WXK_NUMPAD_PAGEUP)) + { + const int rowsPerPage = grid->GetGridWindow()->GetSize().GetHeight() / grid->GetDefaultRowSize(); + const int cursorNewPos = std::max(cursorOldPos - rowsPerPage, 0); + moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); return; //no event.Skip() - - case WXK_PAGEDOWN: - case WXK_NUMPAD_PAGEDOWN: - { - const int rowsPerPage = grid->GetGridWindow()->GetSize().GetHeight() / grid->GetDefaultRowSize(); - const int cursorNewPos = std::min(cursorOldPos + rowsPerPage, grid->GetNumberRows() - 1); - moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); - } + } + else if (shiftPressed && (keyCode == WXK_PAGEDOWN || keyCode == WXK_NUMPAD_PAGEDOWN)) + { + const int rowsPerPage = grid->GetGridWindow()->GetSize().GetHeight() / grid->GetDefaultRowSize(); + const int cursorNewPos = std::min(cursorOldPos + rowsPerPage, grid->GetNumberRows() - 1); + moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); return; //no event.Skip() - - case WXK_HOME: - case WXK_NUMPAD_HOME: - { - const int cursorNewPos = 0; - moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); - } + } + else if (shiftPressed && (keyCode == WXK_HOME || keyCode == WXK_NUMPAD_HOME)) + { + const int cursorNewPos = 0; + moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); return; //no event.Skip() - - case WXK_END: - case WXK_NUMPAD_END: - { - const int cursorNewPos = grid->GetNumberRows() - 1; - moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); - } + } + else if (shiftPressed && (keyCode == WXK_END || keyCode == WXK_NUMPAD_END)) + { + const int cursorNewPos = grid->GetNumberRows() - 1; + moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); return; //no event.Skip() + } - } + //CTRL + X + else if (ctrlPressed && keyCode == WXK_LEFT) + { + grid->SetGridCursor(grid->GetGridCursorRow(), 0); + grid->MakeCellVisible(grid->GetGridCursorRow(), 0); + return; //no event.Skip() } - else if (keyEvent->AltDown()) - ; - else if (keyEvent->ControlDown()) - ; - else //button without additonal control keys pressed + else if (ctrlPressed && keyCode == WXK_RIGHT) { - switch (keyEvent->GetKeyCode()) - { - case WXK_UP: //move grid cursor also - { - const int cursorNewPos = std::max(cursorOldPos - 1, 0); - grid->SetGridCursor(cursorNewPos, grid->GetGridCursorCol()); - grid->MakeCellVisible(cursorNewPos, grid->GetGridCursorCol()); - } + grid->SetGridCursor(grid->GetGridCursorRow(), grid->GetNumberCols() - 1); + grid->MakeCellVisible(grid->GetGridCursorRow(), grid->GetNumberCols() - 1); return; //no event.Skip() - case WXK_DOWN: //move grid cursor also - { - const int cursorNewPos = std::min(cursorOldPos + 1, grid->GetNumberRows() - 1); - grid->SetGridCursor(cursorNewPos, grid->GetGridCursorCol()); - grid->MakeCellVisible(cursorNewPos, grid->GetGridCursorCol()); - } + } + else if ((ctrlPressed && keyCode == WXK_UP) || + ((noModPressed || ctrlPressed) && (keyCode == WXK_HOME || keyCode == WXK_NUMPAD_HOME))) + { + grid->SetGridCursor(0, grid->GetGridCursorCol()); + grid->MakeCellVisible(0, grid->GetGridCursorCol()); return; //no event.Skip() + } + else if ((ctrlPressed && keyCode == WXK_DOWN) || + ((noModPressed || ctrlPressed) && (keyCode == WXK_END || keyCode == WXK_NUMPAD_END))) + { + grid->SetGridCursor(grid->GetNumberRows() - 1, grid->GetGridCursorCol()); + grid->MakeCellVisible(grid->GetNumberRows() - 1, grid->GetGridCursorCol()); + return; //no event.Skip() + } - case WXK_LEFT: //move grid cursor also - { - const int cursorColumn = std::max(cursorOldColumn - 1, 0); - grid->SetGridCursor(cursorOldPos, cursorColumn); - grid->MakeCellVisible(cursorOldPos, cursorColumn); - } + //button without additonal control keys pressed + else if (noModPressed && keyCode == WXK_UP) + { + const int cursorNewPos = std::max(cursorOldPos - 1, 0); + grid->SetGridCursor(cursorNewPos, grid->GetGridCursorCol()); + grid->MakeCellVisible(cursorNewPos, grid->GetGridCursorCol()); return; //no event.Skip() - case WXK_RIGHT: //move grid cursor also - { - const int cursorColumn = std::min(cursorOldColumn + 1, grid->GetNumberCols() - 1); - grid->SetGridCursor(cursorOldPos, cursorColumn); - grid->MakeCellVisible(cursorOldPos, cursorColumn); - } + } + else if (noModPressed && keyCode == WXK_DOWN) + { + const int cursorNewPos = std::min(cursorOldPos + 1, grid->GetNumberRows() - 1); + grid->SetGridCursor(cursorNewPos, grid->GetGridCursorCol()); + grid->MakeCellVisible(cursorNewPos, grid->GetGridCursorCol()); return; //no event.Skip() - - - case WXK_PAGEUP: - case WXK_NUMPAD_PAGEUP: - { - const int rowsPerPage = grid->GetGridWindow()->GetSize().GetHeight() / grid->GetDefaultRowSize(); - const int cursorNewPos = std::max(cursorOldPos - rowsPerPage, 0); - grid->SetGridCursor(cursorNewPos, grid->GetGridCursorCol()); - grid->MakeCellVisible(cursorNewPos, grid->GetGridCursorCol()); - } + } + else if (noModPressed && keyCode == WXK_LEFT) + { + const int cursorColumn = std::max(cursorOldColumn - 1, 0); + grid->SetGridCursor(cursorOldPos, cursorColumn); + grid->MakeCellVisible(cursorOldPos, cursorColumn); return; //no event.Skip() - - case WXK_PAGEDOWN: - case WXK_NUMPAD_PAGEDOWN: - { - const int rowsPerPage = grid->GetGridWindow()->GetSize().GetHeight() / grid->GetDefaultRowSize(); - const int cursorNewPos = std::min(cursorOldPos + rowsPerPage, grid->GetNumberRows() - 1); - grid->SetGridCursor(cursorNewPos, grid->GetGridCursorCol()); - grid->MakeCellVisible(cursorNewPos, grid->GetGridCursorCol()); - } + } + else if (noModPressed && keyCode == WXK_RIGHT) + { + const int cursorColumn = std::min(cursorOldColumn + 1, grid->GetNumberCols() - 1); + grid->SetGridCursor(cursorOldPos, cursorColumn); + grid->MakeCellVisible(cursorOldPos, cursorColumn); + return; //no event.Skip() + } + else if ((noModPressed || ctrlPressed) && (keyCode == WXK_PAGEUP || keyCode == WXK_NUMPAD_PAGEUP)) + { + const int rowsPerPage = grid->GetGridWindow()->GetSize().GetHeight() / grid->GetDefaultRowSize(); + const int cursorNewPos = std::max(cursorOldPos - rowsPerPage, 0); + grid->SetGridCursor(cursorNewPos, grid->GetGridCursorCol()); + grid->MakeCellVisible(cursorNewPos, grid->GetGridCursorCol()); + return; //no event.Skip() + } + else if ((noModPressed || ctrlPressed) && (keyCode == WXK_PAGEDOWN || keyCode == WXK_NUMPAD_PAGEDOWN)) + { + const int rowsPerPage = grid->GetGridWindow()->GetSize().GetHeight() / grid->GetDefaultRowSize(); + const int cursorNewPos = std::min(cursorOldPos + rowsPerPage, grid->GetNumberRows() - 1); + grid->SetGridCursor(cursorNewPos, grid->GetGridCursorCol()); + grid->MakeCellVisible(cursorNewPos, grid->GetGridCursorCol()); return; //no event.Skip() - - case WXK_HOME: - case WXK_NUMPAD_HOME: - grid->SetGridCursor(0, grid->GetGridCursorCol()); - grid->MakeCellVisible(0, grid->GetGridCursorCol()); - return; //no event.Skip() - - case WXK_END: - case WXK_NUMPAD_END: - grid->SetGridCursor(grid->GetNumberRows() - 1, grid->GetGridCursorCol()); - grid->MakeCellVisible(grid->GetNumberRows() - 1, grid->GetGridCursorCol()); - return; //no event.Skip() - } } } @@ -1128,6 +1133,12 @@ xmlAccess::ColumnAttributes CustomGridRim::getDefaultColumnAttributes() newEntry.width = 113; defaultColumnSettings.push_back(newEntry); + newEntry.type = xmlAccess::EXTENSION; + newEntry.visible = false; + newEntry.position = 6; + newEntry.width = 60; + defaultColumnSettings.push_back(newEntry); + return defaultColumnSettings; } @@ -1177,10 +1188,10 @@ void CustomGridRim::setColumnAttributes(const xmlAccess::ColumnAttributes& attr) if (i < attr.size()) newEntry = attr[i]; - else + else //fix corrupted data: { - newEntry.type = xmlAccess::FILENAME; - newEntry.visible = true; + newEntry.type = static_cast<xmlAccess::ColumnTypes>(xmlAccess::COLUMN_TYPE_COUNT); //sort additional rows to the end + newEntry.visible = false; newEntry.position = i; newEntry.width = 100; } @@ -1189,7 +1200,7 @@ void CustomGridRim::setColumnAttributes(const xmlAccess::ColumnAttributes& attr) std::sort(columnSettings.begin(), columnSettings.end(), xmlAccess::sortByType); for (unsigned int i = 0; i < xmlAccess::COLUMN_TYPE_COUNT; ++i) //just be sure that each type exists only once - columnSettings[i].type = xmlAccess::ColumnTypes(i); + columnSettings[i].type = static_cast<xmlAccess::ColumnTypes>(i); std::sort(columnSettings.begin(), columnSettings.end(), xmlAccess::sortByPositionOnly); for (unsigned int i = 0; i < xmlAccess::COLUMN_TYPE_COUNT; ++i) //just be sure that positions are numbered correctly @@ -1248,6 +1259,8 @@ wxString CustomGridRim::getTypeName(xmlAccess::ColumnTypes colType) return _("Size"); case xmlAccess::DATE: return _("Date"); + case xmlAccess::EXTENSION: + return _("Extension"); } return wxEmptyString; //dummy @@ -1418,6 +1431,9 @@ IconUpdater::IconUpdater(CustomGridLeft* leftGrid, CustomGridRight* rightGrid) : } +IconUpdater::~IconUpdater() {} //non-inline destructor for std::auto_ptr to work with forward declaration + + void IconUpdater::loadIconsAsynchronously(wxEvent& event) //loads all (not yet) drawn icons { std::vector<Zstring> iconsLeft; @@ -1576,13 +1592,16 @@ CustomGridMiddle::CustomGridMiddle(wxWindow *parent, toolTip(new CustomTooltip) { //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); - GetGridWindow()->Connect(wxEVT_LEFT_UP, wxMouseEventHandler(CustomGridMiddle::OnLeftMouseUp), NULL, this); - GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(CustomGridMiddle::OnLeftMouseDown), NULL, this); + GetGridWindow()->Connect(wxEVT_MOTION, wxMouseEventHandler(CustomGridMiddle::OnMouseMovement), NULL, this); + GetGridWindow()->Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(CustomGridMiddle::OnLeaveWindow), NULL, this); + GetGridWindow()->Connect(wxEVT_LEFT_UP, wxMouseEventHandler(CustomGridMiddle::OnLeftMouseUp), NULL, this); + GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(CustomGridMiddle::OnLeftMouseDown), NULL, this); } +CustomGridMiddle::~CustomGridMiddle() {} //non-inline destructor for std::auto_ptr to work with forward declaration + + bool CustomGridMiddle::CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode) { gridDataTable = new CustomGridTableMiddle; @@ -1999,12 +2018,3 @@ const wxBitmap& FreeFileSync::getSyncOpImage(SyncOperation syncOp) return wxNullBitmap; //dummy } - - - - - - - - - diff --git a/library/CustomGrid.h b/library/CustomGrid.h index 2b78a6c3..7a0d1b10 100644 --- a/library/CustomGrid.h +++ b/library/CustomGrid.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 CUSTOMGRID_H_INCLUDED #define CUSTOMGRID_H_INCLUDED @@ -67,7 +73,7 @@ public: enum SortDirection { ASCENDING, - DESCENDING, + DESCENDING }; typedef std::pair<SortColumn, SortDirection> SortMarker; @@ -111,6 +117,7 @@ class IconUpdater : private wxEvtHandler //update file icons periodically: use S { public: IconUpdater(CustomGridLeft* leftGrid, CustomGridRight* rightGrid); + ~IconUpdater(); //non-inline destructor for std::auto_ptr to work with forward declaration private: void loadIconsAsynchronously(wxEvent& event); //loads all (not yet) drawn icons @@ -240,6 +247,8 @@ public: long style = wxWANTS_CHARS, const wxString& name = wxGridNameStr); + ~CustomGridMiddle(); //non-inline destructor for std::auto_ptr to work with forward declaration + virtual bool CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode = wxGrid::wxGridSelectCells); void enableSyncPreview(bool value); diff --git a/library/Recycler/Recycler_Vista.vcproj b/library/Recycler_Vista/Recycler_Vista.vcproj index 65ab6609..65ab6609 100644 --- a/library/Recycler/Recycler_Vista.vcproj +++ b/library/Recycler_Vista/Recycler_Vista.vcproj diff --git a/library/Recycler/dllmain.cpp b/library/Recycler_Vista/dllmain.cpp index 834b4f88..7db39bff 100644 --- a/library/Recycler/dllmain.cpp +++ b/library/Recycler_Vista/dllmain.cpp @@ -1,4 +1,9 @@ -// dllmain.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung. +// ************************************************************************** +// * 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) * +// ************************************************************************** +// #define WIN32_LEAN_AND_MEAN #include <windows.h> diff --git a/library/Recycler/recycler.cpp b/library/Recycler_Vista/recycler.cpp index b551d4d0..7858267b 100644 --- a/library/Recycler/recycler.cpp +++ b/library/Recycler_Vista/recycler.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "recycler.h" #define WIN32_LEAN_AND_MEAN diff --git a/library/Recycler/recycler.h b/library/Recycler_Vista/recycler.h index 59bec9dc..697221c3 100644 --- a/library/Recycler/recycler.h +++ b/library/Recycler_Vista/recycler.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 RECYCLER_DLL_H #define RECYCLER_DLL_H diff --git a/library/ShadowCopy/dllmain.cpp b/library/ShadowCopy/dllmain.cpp index 834b4f88..7db39bff 100644 --- a/library/ShadowCopy/dllmain.cpp +++ b/library/ShadowCopy/dllmain.cpp @@ -1,4 +1,9 @@ -// dllmain.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung. +// ************************************************************************** +// * 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) * +// ************************************************************************** +// #define WIN32_LEAN_AND_MEAN #include <windows.h> diff --git a/library/ShadowCopy/shadow.cpp b/library/ShadowCopy/shadow.cpp index 0693815f..b15bd4f9 100644 --- a/library/ShadowCopy/shadow.cpp +++ b/library/ShadowCopy/shadow.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "shadow.h" #define WIN32_LEAN_AND_MEAN diff --git a/library/ShadowCopy/shadow.h b/library/ShadowCopy/shadow.h index e25c6a32..cc82e8e0 100644 --- a/library/ShadowCopy/shadow.h +++ b/library/ShadowCopy/shadow.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 SHADOWCOPY_H #define SHADOWCOPY_H diff --git a/library/binary.cpp b/library/binary.cpp new file mode 100644 index 00000000..bc5ba814 --- /dev/null +++ b/library/binary.cpp @@ -0,0 +1,122 @@ +// ************************************************************************** +// * 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 "binary.h" +#include <boost/scoped_array.hpp> +#include <wx/intl.h> +#include "../shared/stringConv.h" + +#ifdef FFS_WIN +#include "../shared/longPathPrefix.h" +#include <wx/msw/wrapwin.h> //includes "windows.h" +#include <boost/shared_ptr.hpp> + +#elif defined FFS_LINUX +#include <wx/ffile.h> +#endif + + +bool FreeFileSync::filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback* callback) +{ + const size_t BUFFER_SIZE = 512 * 1024; //512 kb seems to be the perfect buffer size + static boost::scoped_array<unsigned char> memory1(new unsigned char[BUFFER_SIZE]); + static boost::scoped_array<unsigned char> memory2(new unsigned char[BUFFER_SIZE]); + +#ifdef FFS_WIN + const HANDLE hFile1 = ::CreateFile(FreeFileSync::applyLongPathPrefix(filename1).c_str(), + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_SEQUENTIAL_SCAN, + NULL); + if (hFile1 == INVALID_HANDLE_VALUE) + throw FileError(wxString(_("Error opening file:")) + wxT(" \"") + zToWx(filename1) + wxT("\"")); + + boost::shared_ptr<void> dummy1(hFile1, &::CloseHandle); + + const HANDLE hFile2 = ::CreateFile(FreeFileSync::applyLongPathPrefix(filename2).c_str(), + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_SEQUENTIAL_SCAN, + NULL); + if (hFile2 == INVALID_HANDLE_VALUE) + throw FileError(wxString(_("Error opening file:")) + wxT(" \"") + zToWx(filename2) + wxT("\"")); + + boost::shared_ptr<void> dummy2(hFile2, &::CloseHandle); + + wxLongLong bytesCompared; + DWORD length1 = 0; + do + { + if (!::ReadFile( + hFile1, //__in HANDLE hFile, + memory1.get(), //__out LPVOID lpBuffer, + BUFFER_SIZE, //__in DWORD nNumberOfBytesToRead, + &length1, //__out_opt LPDWORD lpNumberOfBytesRead, + NULL)) //__inout_opt LPOVERLAPPED lpOverlapped + throw FileError(wxString(_("Error reading file:")) + wxT(" \"") + zToWx(filename1) + wxT("\"")); + + DWORD length2 = 0; + if (!::ReadFile( + hFile2, //__in HANDLE hFile, + memory2.get(), //__out LPVOID lpBuffer, + BUFFER_SIZE, //__in DWORD nNumberOfBytesToRead, + &length2, //__out_opt LPDWORD lpNumberOfBytesRead, + NULL)) //__inout_opt LPOVERLAPPED lpOverlapped + throw FileError(wxString(_("Error reading file:")) + wxT(" \"") + zToWx(filename2) + wxT("\"")); + + if (length1 != length2 || ::memcmp(memory1.get(), memory2.get(), length1) != 0) + return false; + + bytesCompared += length1 * 2; + + //send progress updates + callback->updateCompareStatus(bytesCompared); + } + while (length1 == BUFFER_SIZE); + + return true; + + +#elif defined FFS_LINUX + wxFFile file1(::fopen(filename1.c_str(), DefaultStr("rb,type=record,noseek"))); //utilize UTF-8 filename + if (!file1.IsOpened()) + throw FileError(wxString(_("Error opening file:")) + wxT(" \"") + zToWx(filename1) + wxT("\"")); + + wxFFile file2(::fopen(filename2.c_str(), DefaultStr("rb,type=record,noseek"))); //utilize UTF-8 filename + if (!file2.IsOpened()) + throw FileError(wxString(_("Error opening file:")) + wxT(" \"") + zToWx(filename2) + wxT("\"")); + + wxLongLong bytesCompared; + do + { + const size_t length1 = file1.Read(memory1.get(), BUFFER_SIZE); + if (file1.Error()) + throw FileError(wxString(_("Error reading file:")) + wxT(" \"") + zToWx(filename1) + wxT("\"")); + + const size_t length2 = file2.Read(memory2.get(), BUFFER_SIZE); + if (file2.Error()) + throw FileError(wxString(_("Error reading file:")) + wxT(" \"") + zToWx(filename2) + wxT("\"")); + + if (length1 != length2 || ::memcmp(memory1.get(), memory2.get(), length1) != 0) + return false; + + bytesCompared += length1 * 2; + + //send progress updates + callback->updateCompareStatus(bytesCompared); + } + while (!file1.Eof()); + + if (!file2.Eof()) //highly unlikely, but theoretically possible! (but then again, not in this context where both files have same size...) + return false; + + return true; +#endif +} diff --git a/library/binary.h b/library/binary.h new file mode 100644 index 00000000..c4e9c928 --- /dev/null +++ b/library/binary.h @@ -0,0 +1,28 @@ +// ************************************************************************** +// * 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 BINARY_H_INCLUDED +#define BINARY_H_INCLUDED + +#include "../shared/zstring.h" +#include <wx/longlong.h> +#include "../shared/fileError.h" + +namespace FreeFileSync +{ + +//callback functionality for status updates while comparing +class CompareCallback +{ +public: + virtual ~CompareCallback() {} + virtual void updateCompareStatus(const wxLongLong& totalBytesTransferred) = 0; +}; + +bool filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback* callback); //throw FileError +} + +#endif // BINARY_H_INCLUDED diff --git a/library/detectRenaming.cpp b/library/detectRenaming.cpp index d2b4a62c..bd25874b 100644 --- a/library/detectRenaming.cpp +++ b/library/detectRenaming.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "detectRenaming.h" #include <map> #include <vector> diff --git a/library/detectRenaming.h b/library/detectRenaming.h index 82cb543e..ecfa0344 100644 --- a/library/detectRenaming.h +++ b/library/detectRenaming.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 DETECTRENAMING_H_INCLUDED #define DETECTRENAMING_H_INCLUDED diff --git a/library/errorLogging.cpp b/library/errorLogging.cpp index 9424a6c5..7e73f005 100644 --- a/library/errorLogging.cpp +++ b/library/errorLogging.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "errorLogging.h" #include <wx/datetime.h> #include <wx/intl.h> diff --git a/library/errorLogging.h b/library/errorLogging.h index 24b4a992..6b27e1c1 100644 --- a/library/errorLogging.h +++ b/library/errorLogging.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 ERRORLOGGING_H_INCLUDED #define ERRORLOGGING_H_INCLUDED @@ -23,20 +29,16 @@ public: return errorCount; } - const std::vector<wxString>& getFormattedMessages() const + typedef std::vector<wxString> MessageEntry; + const MessageEntry& getFormattedMessages() const { return formattedMessages; } - size_t messageCount() - { - return formattedMessages.size(); - } - private: wxString assembleMessage(const wxString& prefix, const wxString& message); - std::vector<wxString> formattedMessages; //list of non-resolved errors and warnings + MessageEntry formattedMessages; //list of non-resolved errors and warnings int errorCount; }; } diff --git a/library/filter.cpp b/library/filter.cpp index 25877513..b1b67b86 100644 --- a/library/filter.cpp +++ b/library/filter.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "filter.h" #include "../shared/zstring.h" #include <wx/string.h> diff --git a/library/filter.h b/library/filter.h index ea725291..6ec5a3d5 100644 --- a/library/filter.h +++ b/library/filter.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 FFS_FILTER_H_INCLUDED #define FFS_FILTER_H_INCLUDED diff --git a/library/iconBuffer.cpp b/library/iconBuffer.cpp index 21f85372..338f53df 100644 --- a/library/iconBuffer.cpp +++ b/library/iconBuffer.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "iconBuffer.h" #include <wx/thread.h> #include <wx/bitmap.h> @@ -56,7 +62,7 @@ struct CmpFilenameWin { bool operator()(const Zstring& a, const Zstring& b) const { - return a.CmpNoCase(b) < 0; + return a.cmpFileName(b) < 0; } }; @@ -83,10 +89,43 @@ bool isPriceyExtension(const Zstring& extension) } //################################################################################################################################################ + +class IconBuffer::IconHolder //handle HICON ownership WITHOUT ref-counting to allow a deep-copy (in contrast to wxIcon) +{ +public: + IconHolder(HICON handle = 0) : handle_(handle) {} + + ~IconHolder() + { + if (handle_ != 0) + ::DestroyIcon(handle_); + } + + HICON clone() const //copy HICON, caller needs to take ownership! + { + return handle_ != 0 ? ::CopyIcon(handle_) : 0; + } + + void swap(IconHolder& other) //throw() + { + std::swap(handle_, other.handle_); + } + +private: + IconHolder(const IconHolder&); + IconHolder& operator=(const IconHolder&); + + HICON handle_; +}; + + +//--------------------------------------------------------------------------------------------------- typedef std::vector<DefaultChar> 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) +//--------------------------------------------------------------------------------------------------- -class WorkerThread : public wxThread +class IconBuffer::WorkerThread : public wxThread { public: WorkerThread(IconBuffer* iconBuff); @@ -116,7 +155,7 @@ private: }; -WorkerThread::WorkerThread(IconBuffer* iconBuff) : +IconBuffer::WorkerThread::WorkerThread(IconBuffer* iconBuff) : wxThread(wxTHREAD_JOINABLE), threadHasMutex(false), threadExitIsRequested(false), @@ -141,7 +180,7 @@ WorkerThread::WorkerThread(IconBuffer* iconBuff) : } -void WorkerThread::setWorkload(const std::vector<Zstring>& load) //(re-)set new workload of icons to be retrieved +void IconBuffer::WorkerThread::setWorkload(const std::vector<Zstring>& load) //(re-)set new workload of icons to be retrieved { wxCriticalSectionLocker dummy(lockWorkload); @@ -154,7 +193,7 @@ void WorkerThread::setWorkload(const std::vector<Zstring>& load) //(re-)set new } -void WorkerThread::quitThread() +void IconBuffer::WorkerThread::quitThread() { { wxMutexLocker dummy(threadIsListening); //wait until thread is in waiting state @@ -165,7 +204,7 @@ void WorkerThread::quitThread() } -wxThread::ExitCode WorkerThread::Entry() +wxThread::ExitCode IconBuffer::WorkerThread::Entry() { try { @@ -196,9 +235,9 @@ wxThread::ExitCode WorkerThread::Entry() } -void WorkerThread::doWork() +void IconBuffer::WorkerThread::doWork() { - FileName fileName; //don't use Zstring: reference-counted objects are NOT THREADSAFE!!! e.g. double deletion might happen + Zstring fileName; //do work: get the file icon. while (true) @@ -207,11 +246,11 @@ void WorkerThread::doWork() wxCriticalSectionLocker dummy(lockWorkload); if (workload.empty()) break; //enter waiting state - fileName = workload.back(); + fileName = &workload.back()[0]; //deep copy: fileName is NOT empty (includes NULL-termination) workload.pop_back(); } - if (iconBuffer->requestFileIcon(Zstring(&fileName[0]))) //thread safety: Zstring okay, won't be reference-counted in requestIcon(), fileName is NOT empty + 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" @@ -219,62 +258,41 @@ void WorkerThread::doWork() //load icon SHFILEINFO fileInfo; - fileInfo.hIcon = 0; //initialize hIcon + 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 - const Zstring extension = getFileExtension(&fileName[0]); //thread-safe: no sharing! + 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! - if (::SHGetFileInfo(&fileName[0], //FreeFileSync::removeLongPathPrefix(&fileName[0]), //::SHGetFileInfo() can't handle \\?\-prefix! - 0, - &fileInfo, - sizeof(fileInfo), - SHGFI_ICON | SHGFI_SMALLICON) && - fileInfo.hIcon != 0) //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 - - wxIcon newIcon; //attention: wxIcon uses reference counting! - newIcon.SetHICON(fileInfo.hIcon); - newIcon.SetSize(IconBuffer::ICON_SIZE, IconBuffer::ICON_SIZE); - - iconBuffer->insertIntoBuffer(&fileName[0], newIcon); //thread safety: icon buffer is written by this thread and this call only, so - //newIcon can safely go out of scope without race-condition because of ref-counting + ::SHGetFileInfo(fileName.c_str(), //FreeFileSync::removeLongPathPrefix(fileName), //::SHGetFileInfo() can't handle \\?\-prefix! + 0, + &fileInfo, + sizeof(fileInfo), + SHGFI_ICON | SHGFI_SMALLICON); - //freeing of icon handle seems to happen somewhere beyond wxIcon destructor - //if (!DestroyIcon(fileInfo.hIcon)) - // throw RuntimeException(wxString(wxT("Error deallocating Icon handle!\n\n")) + FreeFileSync::getLastErrorFormatted()); - continue; - } + IconBuffer::IconHolder newIcon(fileInfo.hIcon); //pass icon ownership (may be 0) + iconBuffer->insertIntoBuffer(fileName, newIcon); } else //no read-access to disk! determine icon by extension { - if (::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) && - fileInfo.hIcon != 0) //fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! - { - wxIcon newIcon; //attention: wxIcon uses reference counting! - newIcon.SetHICON(fileInfo.hIcon); - newIcon.SetSize(IconBuffer::ICON_SIZE, IconBuffer::ICON_SIZE); + ::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->insertIntoBuffer(extension.c_str(), newIcon); //thread safety: icon buffer is written by this thread and this call only, so - continue; - } + IconBuffer::IconHolder newIcon(fileInfo.hIcon); //pass icon ownership (may be 0) + iconBuffer->insertIntoBuffer(extension, newIcon); } - - //if loading of icon fails for whatever reason, just save a dummy icon to avoid re-loading - iconBuffer->insertIntoBuffer(&fileName[0], wxNullIcon); } } -//--------------------------------------------------------------------------------------------------- -class IconDB : public std::map<Zstring, wxIcon> {}; // entryName/icon -class IconDbSequence : public std::queue<Zstring> {}; // entryName //--------------------------------------------------------------------------------------------------- +class IconBuffer::IconDB : public std::map<Zstring, IconBuffer::CountedIconPtr> {}; //entryName/icon -> ATTENTION: consider ref-counting for this shared data structure!!! +class IconBuffer::IconDbSequence : public std::queue<Zstring> {}; //entryName +//--------------------------------------------------------------------------------------------------- IconBuffer& IconBuffer::getInstance() @@ -294,6 +312,8 @@ IconBuffer::IconBuffer() : IconBuffer::~IconBuffer() { + //keep non-inline destructor for std::auto_ptr to work with forward declarations + worker->quitThread(); } @@ -311,7 +331,19 @@ bool IconBuffer::requestFileIcon(const Zstring& fileName, wxIcon* icon) if (i != buffer->end()) { if (icon != NULL) - *icon = i->second; + { + 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; } @@ -325,31 +357,28 @@ void IconBuffer::setWorkload(const std::vector<Zstring>& load) } -void IconBuffer::insertIntoBuffer(const DefaultChar* entryName, const wxIcon& icon) //called by worker thread +void IconBuffer::insertIntoBuffer(const DefaultChar* entryName, IconHolder& icon) //called by worker thread { - if (icon.IsOk()) //this check won't hurt - { - wxCriticalSectionLocker dummy(*lockIconDB); + wxCriticalSectionLocker dummy(*lockIconDB); - const Zstring fileNameZ = entryName; + //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<IconDB::iterator, bool> rc = buffer->insert(IconDB::value_type(fileNameZ, icon)); + const std::pair<IconDB::iterator, bool> rc = buffer->insert(IconDB::value_type(fileNameZ, newIcon)); //thread saftey: icon uses ref-counting! But is NOT shared with main thread! - if (rc.second) //if insertion took place - bufSequence->push(fileNameZ); + if (rc.second) //if insertion took place + bufSequence->push(fileNameZ); //note: sharing Zstring with IconDB!!! - assert(buffer->size() == bufSequence->size()); + assert(buffer->size() == bufSequence->size()); - //remove elements if buffer becomes too big: - if (buffer->size() > BUFFER_SIZE) //limit buffer size: critical because GDI resources are limited (e.g. 10000 on XP per process) - { - //remove oldest element - buffer->erase(bufSequence->front()); - bufSequence->pop(); - } + //remove elements if buffer becomes too big: + if (buffer->size() > BUFFER_SIZE) //limit buffer size: critical because GDI resources are limited (e.g. 10000 on XP per process) + { + //remove oldest element + buffer->erase(bufSequence->front()); + bufSequence->pop(); } } - - - diff --git a/library/iconBuffer.h b/library/iconBuffer.h index 703f7eb7..cb2d809f 100644 --- a/library/iconBuffer.h +++ b/library/iconBuffer.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 ICONBUFFER_H_INCLUDED #define ICONBUFFER_H_INCLUDED @@ -8,25 +14,21 @@ header should be used in the windows build only! #include <vector> #include "../shared/zstring.h" #include <memory> +#include <boost/shared_ptr.hpp> class wxCriticalSection; -class WorkerThread; -class IconDB; -class IconDbSequence; class wxIcon; namespace FreeFileSync { + class IconBuffer { - friend class ::WorkerThread; - public: - static IconBuffer& getInstance(); - static const wxIcon& getDirectoryIcon(); //one folder icon should be sufficient... + static IconBuffer& getInstance(); bool requestFileIcon(const Zstring& fileName, wxIcon* icon = NULL); //returns false if icon is not in buffer void setWorkload(const std::vector<Zstring>& load); //(re-)set new workload of icons to be retrieved; @@ -37,16 +39,24 @@ private: IconBuffer(); ~IconBuffer(); + class WorkerThread; + friend class WorkerThread; + + class IconDB; + class IconHolder; + class IconDbSequence; + typedef boost::shared_ptr<IconHolder> CountedIconPtr; + + //methods used by worker thread - void insertIntoBuffer(const DefaultChar* entryName, const wxIcon& icon); + void insertIntoBuffer(const DefaultChar* entryName, IconHolder& icon); //icon is invalidated by this call!! //---------------------- Shared Data ------------------------- std::auto_ptr<wxCriticalSection> lockIconDB; std::auto_ptr<IconDB> buffer; //use synchronisation when accessing this! + std::auto_ptr<IconDbSequence> bufSequence; //save sequence of buffer entry to delete oldest elements (implicitly shared by sharing Zstring with IconDB!!!) //------------------------------------------------------------ - std::auto_ptr<IconDbSequence> bufSequence; //save sequence of buffer entry to delte olderst elements - std::auto_ptr<WorkerThread> worker; }; } diff --git a/library/multithreading.cpp b/library/multithreading.cpp index aea4821b..252884a2 100644 --- a/library/multithreading.cpp +++ b/library/multithreading.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 <wx/utils.h> diff --git a/library/multithreading.h b/library/multithreading.h index 21c5bcf2..9017bf41 100644 --- a/library/multithreading.h +++ b/library/multithreading.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 diff --git a/library/pch.h b/library/pch.h index af086418..44a3b574 100644 --- a/library/pch.h +++ b/library/pch.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 FFS_PRECOMPILED_HEADER #define FFS_PRECOMPILED_HEADER @@ -86,6 +92,7 @@ do NOT use in release build! #include <wx/scrolwin.h> #include <wx/notebook.h> #include <wx/help.h> +#include <wx/event.h> //other #include "../shared/tinyxml/tinyxml.h" @@ -93,6 +100,9 @@ do NOT use in release build! //Boost #include <boost/shared_ptr.hpp> +//#include <boost/bind.hpp> <- conflict with #include <boost/lambda/bind.hpp> +#include <boost/scoped_array.hpp> +#include <boost/lambda/lambda.hpp> #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" diff --git a/library/processXml.cpp b/library/processXml.cpp index 4773fb72..69cf8baf 100644 --- a/library/processXml.cpp +++ b/library/processXml.cpp @@ -1,9 +1,14 @@ +// ************************************************************************** +// * 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 "processXml.h" #include "../shared/xmlBase.h" #include <wx/filefn.h> #include <wx/intl.h> #include "../shared/globalFunctions.h" -#include "../shared/fileHandling.h" #include "../shared/standardPaths.h" #include "../shared/stringConv.h" @@ -89,18 +94,18 @@ void xmlAccess::readBatchConfig(const wxString& filename, xmlAccess::XmlBatchCon void xmlAccess::readGlobalSettings(xmlAccess::XmlGlobalSettings& config) { //load XML - if (!wxFileExists(FreeFileSync::getGlobalConfigFile())) - throw XmlError(wxString(_("File does not exist:")) + wxT(" \"") + FreeFileSync::getGlobalConfigFile() + wxT("\"")); + if (!wxFileExists(getGlobalConfigFile())) + throw XmlError(wxString(_("File does not exist:")) + wxT(" \"") + getGlobalConfigFile() + wxT("\"")); TiXmlDocument doc; - if (!loadXmlDocument(FreeFileSync::getGlobalConfigFile(), XML_GLOBAL_SETTINGS, doc)) - throw XmlError(wxString(_("Error reading file:")) + wxT(" \"") + FreeFileSync::getGlobalConfigFile() + wxT("\"")); + if (!loadXmlDocument(getGlobalConfigFile(), XML_GLOBAL_SETTINGS, doc)) + throw XmlError(wxString(_("Error reading file:")) + wxT(" \"") + getGlobalConfigFile() + wxT("\"")); FfsXmlParser parser(doc.RootElement()); parser.readXmlGlobalSettings(config); //read GUI layout configuration if (parser.errorsOccured()) - throw XmlError(wxString(_("Error parsing configuration file:")) + wxT(" \"") + FreeFileSync::getGlobalConfigFile() + wxT("\"\n\n") + + throw XmlError(wxString(_("Error parsing configuration file:")) + wxT(" \"") + getGlobalConfigFile() + wxT("\"\n\n") + parser.getErrorMessageFormatted(), XmlError::WARNING); } @@ -138,8 +143,8 @@ void xmlAccess::writeGlobalSettings(const XmlGlobalSettings& outputCfg) //populate and write XML tree if ( !writeXmlGlobalSettings(outputCfg, doc) || //add GUI layout configuration settings - !saveXmlDocument(FreeFileSync::getGlobalConfigFile(), doc)) //save XML - throw XmlError(wxString(_("Error writing file:")) + wxT(" \"") + FreeFileSync::getGlobalConfigFile() + wxT("\"")); + !saveXmlDocument(getGlobalConfigFile(), doc)) //save XML + throw XmlError(wxString(_("Error writing file:")) + wxT(" \"") + getGlobalConfigFile() + wxT("\"")); return; } @@ -416,9 +421,6 @@ void FfsXmlParser::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg //last update check readXmlElementLogging("LastCheckForUpdates", global, outputCfg.lastUpdateCheck); - //minimum size (in bytes) for files to be considered for rename-detection - readXmlElementLogging("DetectRenameThreshold", global, outputCfg.detectRenameThreshold); - const TiXmlElement* optionalDialogs = TiXmlHandleConst(root).FirstChild("Shared").FirstChild("ShowOptionalDialogs").ToElement(); @@ -450,12 +452,13 @@ void FfsXmlParser::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg readXmlElementLogging("ManualDeletionOnBothSides", mainWindow, outputCfg.gui.deleteOnBothSides); readXmlElementLogging("ManualDeletionUseRecycler", mainWindow, outputCfg.gui.useRecyclerForManualDeletion); - readXmlElementLogging("ShowFileIconsLeft", mainWindow, outputCfg.gui.showFileIconsLeft); - readXmlElementLogging("ShowFileIconsRight", mainWindow, outputCfg.gui.showFileIconsRight); + + readXmlElementLogging("RespectCaseOnSearch", mainWindow, outputCfg.gui.textSearchRespectCase); //########################################################### //read column attributes readXmlAttributeLogging("AutoAdjust", TiXmlHandleConst(mainWindow).FirstChild("LeftColumns").ToElement(), outputCfg.gui.autoAdjustColumnsLeft); + readXmlAttributeLogging("ShowFileIcons", TiXmlHandleConst(mainWindow).FirstChild("LeftColumns").ToElement(), outputCfg.gui.showFileIconsLeft); const TiXmlElement* leftColumn = TiXmlHandleConst(mainWindow).FirstChild("LeftColumns").FirstChild("Column").ToElement(); unsigned int colPos = 0; @@ -472,6 +475,7 @@ void FfsXmlParser::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg } readXmlAttributeLogging("AutoAdjust", TiXmlHandleConst(mainWindow).FirstChild("RightColumns").ToElement(), outputCfg.gui.autoAdjustColumnsRight); + readXmlAttributeLogging("ShowFileIcons", TiXmlHandleConst(mainWindow).FirstChild("RightColumns").ToElement(), outputCfg.gui.showFileIconsRight); const TiXmlElement* rightColumn = TiXmlHandleConst(mainWindow).FirstChild("RightColumns").FirstChild("Column").ToElement(); colPos = 0; @@ -817,9 +821,6 @@ bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlD //last update check addXmlElement("LastCheckForUpdates", inputCfg.lastUpdateCheck, global); - //minimum size (in bytes) for files to be considered for rename-detection - addXmlElement("DetectRenameThreshold", inputCfg.detectRenameThreshold, global); - //optional dialogs TiXmlElement* optionalDialogs = new TiXmlElement("ShowOptionalDialogs"); @@ -866,14 +867,15 @@ bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlD addXmlElement("ManualDeletionOnBothSides", inputCfg.gui.deleteOnBothSides, mainWindow); addXmlElement("ManualDeletionUseRecycler", inputCfg.gui.useRecyclerForManualDeletion, mainWindow); - addXmlElement("ShowFileIconsLeft", inputCfg.gui.showFileIconsLeft, mainWindow); - addXmlElement("ShowFileIconsRight", inputCfg.gui.showFileIconsRight, mainWindow); + + addXmlElement("RespectCaseOnSearch", inputCfg.gui.textSearchRespectCase, mainWindow); //write column attributes TiXmlElement* leftColumn = new TiXmlElement("LeftColumns"); mainWindow->LinkEndChild(leftColumn); addXmlAttribute("AutoAdjust", inputCfg.gui.autoAdjustColumnsLeft, leftColumn); + addXmlAttribute("ShowFileIcons", inputCfg.gui.showFileIconsLeft, leftColumn); ColumnAttributes columnAtrribLeftCopy = inputCfg.gui.columnAttribLeft; //can't change const vector sort(columnAtrribLeftCopy.begin(), columnAtrribLeftCopy.end(), xmlAccess::sortByPositionOnly); @@ -892,6 +894,7 @@ bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlD mainWindow->LinkEndChild(rightColumn); addXmlAttribute("AutoAdjust", inputCfg.gui.autoAdjustColumnsRight, rightColumn); + addXmlAttribute("ShowFileIcons", inputCfg.gui.showFileIconsRight, rightColumn); ColumnAttributes columnAtrribRightCopy = inputCfg.gui.columnAttribRight; sort(columnAtrribRightCopy.begin(), columnAtrribRightCopy.end(), xmlAccess::sortByPositionOnly); @@ -956,12 +959,6 @@ int xmlAccess::retrieveSystemLanguage() } -bool xmlAccess::recycleBinAvailable() -{ - return FreeFileSync::recycleBinExists(); -} - - void xmlAccess::OptionalDialogs::resetDialogs() { warningDependentFolders = true; @@ -1007,3 +1004,9 @@ void xmlAccess::readGuiOrBatchConfig(const wxString& filename, XmlGuiConfig& con config = convertBatchToGui(batchCfg); } + + +wxString xmlAccess::getGlobalConfigFile() +{ + return FreeFileSync::getConfigDir() + wxT("GlobalSettings.xml"); +} diff --git a/library/processXml.h b/library/processXml.h index 9cb920d9..ad8465ff 100644 --- a/library/processXml.h +++ b/library/processXml.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 PROCESSXML_H_INCLUDED #define PROCESSXML_H_INCLUDED @@ -20,9 +26,10 @@ enum ColumnTypes REL_PATH, FILENAME, SIZE, - DATE + DATE, + EXTENSION }; -const unsigned int COLUMN_TYPE_COUNT = 6; +const unsigned int COLUMN_TYPE_COUNT = 7; struct ColumnAttrib { @@ -79,7 +86,6 @@ struct XmlBatchConfig }; int retrieveSystemLanguage(); -bool recycleBinAvailable(); struct OptionalDialogs @@ -101,6 +107,8 @@ struct OptionalDialogs }; +wxString getGlobalConfigFile(); + struct XmlGlobalSettings { //--------------------------------------------------------------------- @@ -109,14 +117,12 @@ struct XmlGlobalSettings programLanguage(retrieveSystemLanguage()), ignoreOneHourDiff(false), copyLockedFiles(true), - detectRenameThreshold(1024 *1024), lastUpdateCheck(0) {} int programLanguage; bool ignoreOneHourDiff; //ignore +/- 1 hour due to DST change bool copyLockedFiles; //VSS usage - unsigned int detectRenameThreshold; //minimum size (in bytes) for files to be considered for rename-detection long lastUpdateCheck; //time of last update check OptionalDialogs optDialogs; @@ -125,10 +131,10 @@ struct XmlGlobalSettings struct _Gui { _Gui() : - widthNotMaximized(wxDefaultCoord), + widthNotMaximized( wxDefaultCoord), heightNotMaximized(wxDefaultCoord), - posXNotMaximized(wxDefaultCoord), - posYNotMaximized(wxDefaultCoord), + posXNotMaximized( wxDefaultCoord), + posYNotMaximized( wxDefaultCoord), isMaximized(false), autoAdjustColumnsLeft(false), autoAdjustColumnsRight(false), @@ -137,15 +143,24 @@ struct XmlGlobalSettings folderHistRightMax(12), selectedTabBottomLeft(0), deleteOnBothSides(false), - useRecyclerForManualDeletion(recycleBinAvailable()), //enable if OS supports it; else user will have to activate first and then get an error message + useRecyclerForManualDeletion(true), //enable if OS supports it; else user will have to activate first and then get an error message +#ifdef FFS_WIN + textSearchRespectCase(false), +#elif defined FFS_LINUX + textSearchRespectCase(true), +#endif showFileIconsLeft(true), showFileIconsRight(true) { + //default external apps will be translated "on the fly"!!! #ifdef FFS_WIN - externelApplications.push_back(std::make_pair(_("Open with Explorer"), wxT("explorer /select, \"%name\""))); - externelApplications.push_back(std::make_pair(_("Open directly"), wxT("cmd /c start \"\" \"%name\""))); + externelApplications.push_back(std::make_pair(wxT("Open with Explorer"), //mark for extraction: _("Open with Explorer") + wxT("explorer /select, \"%name\""))); + externelApplications.push_back(std::make_pair(wxT("Open directly"), //mark for extraction: _("Open directly") + wxT("cmd /c start \"\" \"%name\""))); #elif defined FFS_LINUX - externelApplications.push_back(std::make_pair(_("Open with Konqueror"), wxT("konqueror \"%dir\""))); + externelApplications.push_back(std::make_pair(wxT("Open with Konqueror"), //mark for extraction: _("Open with Konqueror") + wxT("konqueror \"%dir\""))); #endif } @@ -176,6 +191,7 @@ struct XmlGlobalSettings bool deleteOnBothSides; bool useRecyclerForManualDeletion; + bool textSearchRespectCase; bool showFileIconsLeft; bool showFileIconsRight; } gui; diff --git a/library/resources.cpp b/library/resources.cpp index 3b44a361..ae39d9e7 100644 --- a/library/resources.cpp +++ b/library/resources.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "resources.h" #include <wx/wfstream.h> #include <wx/zipstrm.h> @@ -61,7 +67,7 @@ void loadAnimFromZip(wxZipInputStream& zipInput, wxAnimation* animation) void GlobalResources::load() const { - wxFFileInputStream input(FreeFileSync::getInstallationDir() + wxT("Resources.dat")); + wxFFileInputStream input(FreeFileSync::getResourceDir() + wxT("Resources.dat")); if (input.IsOk()) //if not... we don't want to react too harsh here { //activate support for .png files diff --git a/library/resources.h b/library/resources.h index c6424dbb..d2e7ce49 100644 --- a/library/resources.h +++ b/library/resources.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 RESOURCES_H_INCLUDED #define RESOURCES_H_INCLUDED diff --git a/library/statistics.cpp b/library/statistics.cpp index f4319686..ac968d1f 100644 --- a/library/statistics.cpp +++ b/library/statistics.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "statistics.h" #include <wx/ffile.h> @@ -16,6 +22,8 @@ RetrieveStatistics::RetrieveStatistics() : RetrieveStatistics::~RetrieveStatistics() { + //keep non-inline destructor for std::auto_ptr to work with forward declaration + //write statistics to a file wxFFile outputFile(wxT("statistics.dat"), wxT("w")); diff --git a/library/statistics.h b/library/statistics.h index a8aa140f..f7bec519 100644 --- a/library/statistics.h +++ b/library/statistics.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 STATISTICS_H_INCLUDED #define STATISTICS_H_INCLUDED diff --git a/library/statusHandler.cpp b/library/statusHandler.cpp index 78dba057..7ac46134 100644 --- a/library/statusHandler.cpp +++ b/library/statusHandler.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "statusHandler.h" #include <wx/app.h> #include <wx/timer.h> diff --git a/library/statusHandler.h b/library/statusHandler.h index cefb129b..a1226c54 100644 --- a/library/statusHandler.h +++ b/library/statusHandler.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 STATUSHANDLER_H_INCLUDED #define STATUSHANDLER_H_INCLUDED diff --git a/shared/appMain.cpp b/shared/appMain.cpp index fe6d3af5..a8eb969f 100644 --- a/shared/appMain.cpp +++ b/shared/appMain.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "appMain.h" #include <wx/window.h> #include <wx/app.h> diff --git a/shared/appMain.h b/shared/appMain.h index 130a6e2a..a4222a75 100644 --- a/shared/appMain.h +++ b/shared/appMain.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 APPMAIN_H_INCLUDED #define APPMAIN_H_INCLUDED diff --git a/shared/buildInfo.h b/shared/buildInfo.h index 1c14caa5..7b031dfa 100644 --- a/shared/buildInfo.h +++ b/shared/buildInfo.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 BUILDINFO_H_INCLUDED #define BUILDINFO_H_INCLUDED diff --git a/shared/customButton.cpp b/shared/customButton.cpp index 73b9d1ee..4e897844 100644 --- a/shared/customButton.cpp +++ b/shared/customButton.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "customButton.h" #include <wx/dcmemory.h> #include <wx/image.h> @@ -149,7 +155,7 @@ wxBitmap wxButtonWithImage::createBitmapFromText(const wxString& text) if ((accelPos = text.find(wxT("&"))) != wxString::npos) { textLabelFormatted.Replace(wxT("&"), wxT(""), false); //remove accelerator - indexAccel = accelPos; + indexAccel = static_cast<int>(accelPos); } dc.SetTextForeground(textColor); diff --git a/shared/customButton.h b/shared/customButton.h index ce43828a..b50dd4da 100644 --- a/shared/customButton.h +++ b/shared/customButton.h @@ -1,9 +1,9 @@ -/*************************************************************** - * Purpose: wxButton with bitmap label - * Author: ZenJu (zhnmju123@gmx.de) - * Created: Feb. 2009 - **************************************************************/ - +// ************************************************************************** +// * 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 CUSTOMBUTTON_H_INCLUDED #define CUSTOMBUTTON_H_INCLUDED diff --git a/shared/customComboBox.cpp b/shared/customComboBox.cpp index e21e915c..722683a5 100644 --- a/shared/customComboBox.cpp +++ b/shared/customComboBox.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "customComboBox.h" diff --git a/shared/customComboBox.h b/shared/customComboBox.h index b6af43bf..7db8cecf 100644 --- a/shared/customComboBox.h +++ b/shared/customComboBox.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 CUSTOMCOMBOBOX_H_INCLUDED #define CUSTOMCOMBOBOX_H_INCLUDED @@ -14,7 +20,7 @@ public: const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, int n = 0, - const wxString choices[] = (const wxString *) NULL, + const wxString choices[] = NULL, long style = 0, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxComboBoxNameStr); diff --git a/shared/customTooltip.cpp b/shared/customTooltip.cpp index cd9fbf05..105feabf 100644 --- a/shared/customTooltip.cpp +++ b/shared/customTooltip.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "customTooltip.h" #include <wx/stattext.h> #include <wx/sizer.h> @@ -78,7 +84,7 @@ void CustomTooltip::show(const wxString& text, wxPoint pos, const wxBitmap* bmp) if (pos != tipWindow->GetScreenPosition()) tipWindow->SetSize(pos.x + 30, pos.y, wxDefaultCoord, wxDefaultCoord); //attention!!! possible endless loop: mouse pointer must NOT be within tipWindow! - //Else it will trigger a wxEVT_LEAVE_WINDOW which will hide the window, causing the window to be shown again in via this method, etc. + //Else it will trigger a wxEVT_LEAVE_WINDOW which will hide the window, causing the window to be shown again via this method, etc. if (!tipWindow->IsShown()) tipWindow->Show(); diff --git a/shared/customTooltip.h b/shared/customTooltip.h index 886c6130..d448254e 100644 --- a/shared/customTooltip.h +++ b/shared/customTooltip.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 CUSTOMTOOLTIP_H_INCLUDED #define CUSTOMTOOLTIP_H_INCLUDED diff --git a/shared/dllLoader.cpp b/shared/dllLoader.cpp index fbfa5b11..1ecfcb76 100644 --- a/shared/dllLoader.cpp +++ b/shared/dllLoader.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "dllLoader.h" #include <wx/msw/wrapwin.h> //includes "windows.h" #include <map> diff --git a/shared/dllLoader.h b/shared/dllLoader.h index 5b561c5a..318997d5 100644 --- a/shared/dllLoader.h +++ b/shared/dllLoader.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 DLLLOADER_H_INCLUDED #define DLLLOADER_H_INCLUDED diff --git a/shared/dragAndDrop.cpp b/shared/dragAndDrop.cpp index 89f4da4d..581aac96 100644 --- a/shared/dragAndDrop.cpp +++ b/shared/dragAndDrop.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "dragAndDrop.h" #include <wx/dnd.h> #include <wx/window.h> @@ -5,7 +11,8 @@ #include <wx/textctrl.h> #include <wx/filepicker.h> #include <wx/filename.h> - +#include "fileHandling.h" +#include "stringConv.h" //define new event type const wxEventType FFS_DROP_FILE_EVENT = wxNewEventType(); @@ -115,24 +122,14 @@ void DragDropOnMainDlg::OnFilesDropped(FFSFileDropEvent& event) } else //should never be reached event.Skip(); -}; - - -wxString formatDirectory(const wxString& dirname) -{ - wxString dirnameTmp = dirname; - dirnameTmp.Trim(true); //remove whitespace characters from right - dirnameTmp.Trim(false); //remove whitespace characters from left - - return dirnameTmp; } void DragDropOnMainDlg::OnWriteDirManually(wxCommandEvent& event) { - const wxString newDir = formatDirectory(event.GetString()); - if (wxDirExists(newDir)) - dirPicker_->SetPath(newDir); + const Zstring newDir = getFormattedDirectoryName(wxToZ(event.GetString())); + if (dirExists(newDir)) + dirPicker_->SetPath(zToWx(newDir)); event.Skip(); } @@ -193,14 +190,14 @@ void DragDropOnDlg::OnFilesDropped(FFSFileDropEvent& event) } else //should never be reached event.Skip(); -}; +} void DragDropOnDlg::OnWriteDirManually(wxCommandEvent& event) { - const wxString newDir = formatDirectory(event.GetString()); - if (wxDirExists(newDir)) - dirPicker_->SetPath(newDir); + const Zstring newDir = FreeFileSync::getFormattedDirectoryName(wxToZ(event.GetString())); + if (dirExists(newDir)) + dirPicker_->SetPath(zToWx(newDir)); event.Skip(); } diff --git a/shared/dragAndDrop.h b/shared/dragAndDrop.h index 4e6bbd31..4fc839c0 100644 --- a/shared/dragAndDrop.h +++ b/shared/dragAndDrop.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 DRAGANDDROP_H_INCLUDED #define DRAGANDDROP_H_INCLUDED diff --git a/shared/fileError.h b/shared/fileError.h index daf97910..ac47dfed 100644 --- a/shared/fileError.h +++ b/shared/fileError.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 FILEERROR_H_INCLUDED #define FILEERROR_H_INCLUDED diff --git a/shared/fileHandling.cpp b/shared/fileHandling.cpp index ef1d3e6c..6713b205 100644 --- a/shared/fileHandling.cpp +++ b/shared/fileHandling.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "fileHandling.h" #include <wx/intl.h> #include "systemFunctions.h" @@ -5,7 +11,6 @@ #include "systemConstants.h" #include "fileTraverser.h" #include <wx/file.h> -#include <stdexcept> #include <boost/bind.hpp> #include <algorithm> #include <wx/log.h> @@ -14,11 +19,12 @@ #include <wx/utils.h> #ifdef FFS_WIN -#include "recycler.h" #include "dllLoader.h" #include <wx/msw/wrapwin.h> //includes "windows.h" #include "shadow.h" #include "longPathPrefix.h" +#include <boost/scoped_array.hpp> +#include <boost/shared_ptr.hpp> #elif defined FFS_LINUX #include <sys/stat.h> @@ -29,11 +35,46 @@ #include <unistd.h> #include <dirent.h> #include <errno.h> +#include <stdlib.h> #endif using FreeFileSync::FileError; + +namespace +{ +#ifdef FFS_WIN +Zstring resolveRelativePath(const Zstring& relativeName, DWORD proposedBufferSize = 1000) +{ + boost::scoped_array<DefaultChar> fullPath(new DefaultChar[proposedBufferSize]); + const DWORD rv = ::GetFullPathName( + relativeName.c_str(), //__in LPCTSTR lpFileName, + proposedBufferSize, //__in DWORD nBufferLength, + fullPath.get(), //__out LPTSTR lpBuffer, + NULL); //__out LPTSTR *lpFilePart + if (rv == 0 || rv == proposedBufferSize) + //ERROR! Don't do anything + return relativeName; + if (rv > proposedBufferSize) + return resolveRelativePath(relativeName, rv); + + return fullPath.get(); +} + +#elif defined FFS_LINUX +Zstring resolveRelativePath(const Zstring& relativeName) //additional: resolves symbolic links!!! +{ + char absolutePath[PATH_MAX + 1]; + if (::realpath(relativeName.c_str(), absolutePath) == NULL) + //ERROR! Don't do anything + return relativeName; + + return Zstring(absolutePath); +} +#endif + + bool replaceMacro(wxString& macro) //macro without %-characters, return true if replaced successfully { if (macro.IsEmpty()) @@ -92,6 +133,7 @@ void expandMacros(wxString& text) } } } +} Zstring FreeFileSync::getFormattedDirectoryName(const Zstring& dirname) @@ -109,16 +151,16 @@ Zstring FreeFileSync::getFormattedDirectoryName(const Zstring& dirname) //replace macros expandMacros(dirnameTmp); -#ifdef FFS_WIN /* resolve relative names; required by: + WINDOWS: - \\?\-prefix which needs absolute names - Volume Shadow Copy: volume name needs to be part of each filename - - file icon buffer (at least for extensions that are acutally read from disk, e.g. "exe") + - file icon buffer (at least for extensions that are actually read from disk, e.g. "exe") + WINDOWS/LINUX: - detection of dependent directories, e.g. "\" and "C:\test" */ - dirnameTmp = resolveRelativePath(dirnameTmp.c_str()).c_str(); -#endif + dirnameTmp = zToWx(resolveRelativePath(wxToZ(dirnameTmp))); if (!dirnameTmp.EndsWith(zToWx(globalFunctions::FILE_NAME_SEPARATOR))) dirnameTmp += zToWx(globalFunctions::FILE_NAME_SEPARATOR); @@ -127,30 +169,6 @@ Zstring FreeFileSync::getFormattedDirectoryName(const Zstring& dirname) } -bool FreeFileSync::recycleBinExists() -{ -#ifdef FFS_WIN - return true; -#else - return false; -#endif // FFS_WIN -} - - -inline -void moveToRecycleBin(const Zstring& filename) //throw (std::logic_error), throw (FileError) -{ - if (!FreeFileSync::recycleBinExists()) //this method should ONLY be called if recycle bin is available - throw std::logic_error("Initialization of Recycle Bin failed!"); - -#ifdef FFS_WIN - FreeFileSync::moveToWindowsRecycler(filename); //throw (FileError) -#else - throw std::logic_error("No Recycler for Linux available at the moment!"); -#endif -} - - bool FreeFileSync::fileExists(const DefaultChar* filename) { //symbolic links (broken or not) are also treated as existing files! @@ -214,8 +232,8 @@ bool FreeFileSync::isMovable(const Zstring& pathFrom, const Zstring& pathTo) pathTo + globalFunctions::FILE_NAME_SEPARATOR + DefaultStr("DeleteMe.tmp"); try { - removeFile(dummyFileSource, false); - removeFile(dummyFileTarget, false); + removeFile(dummyFileSource); + removeFile(dummyFileTarget); } catch (...) {} @@ -232,15 +250,15 @@ bool FreeFileSync::isMovable(const Zstring& pathFrom, const Zstring& pathTo) #ifdef FFS_WIN ::MoveFileEx(applyLongPathPrefix(dummyFileSource).c_str(), //__in LPCTSTR lpExistingFileName, applyLongPathPrefix(dummyFileTarget).c_str(), //__in_opt LPCTSTR lpNewFileName, - 0) != 0; //__in DWORD dwFlags + 0) != 0; //__in DWORD dwFlags #elif defined FFS_LINUX ::rename(dummyFileSource.c_str(), dummyFileTarget.c_str()) == 0; #endif try { - removeFile(dummyFileSource, false); - removeFile(dummyFileTarget, false); + removeFile(dummyFileSource); + removeFile(dummyFileTarget); } catch (...) {} @@ -248,7 +266,7 @@ bool FreeFileSync::isMovable(const Zstring& pathFrom, const Zstring& pathTo) } -void FreeFileSync::removeFile(const Zstring& filename, const bool useRecycleBin) //throw (FileError, std::logic_error); +void FreeFileSync::removeFile(const Zstring& filename) //throw (FileError, std::logic_error); { //no error situation if file is not existing! manual deletion relies on it! #ifdef FFS_WIN @@ -263,25 +281,23 @@ void FreeFileSync::removeFile(const Zstring& filename, const bool useRecycleBin) return; //neither file nor any other object (e.g. broken symlink) with that name existing #endif - if (useRecycleBin) - { - ::moveToRecycleBin(filename); - return; - } - #ifdef FFS_WIN - //initialize file attributes - if (!::SetFileAttributes( - filenameFmt.c_str(), //address of filename - FILE_ATTRIBUTE_NORMAL)) //attributes to set - { - wxString errorMessage = wxString(_("Error deleting file:")) + wxT("\n\"") + zToWx(filename) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); - } - //remove file, support for \\?\-prefix if (!::DeleteFile(filenameFmt.c_str())) { + //optimization: change file attributes ONLY when necessary! + if (::GetLastError() == ERROR_ACCESS_DENIED) //function fails if file is read-only + { + //initialize file attributes + if (::SetFileAttributes(filenameFmt.c_str(), //address of filename + FILE_ATTRIBUTE_NORMAL)) //attributes to set + { + //now try again... + if (::DeleteFile(filenameFmt.c_str())) + return; + } + } + wxString errorMessage = wxString(_("Error deleting file:")) + wxT("\n\"") + zToWx(filename) + wxT("\""); throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); } @@ -295,25 +311,77 @@ void FreeFileSync::removeFile(const Zstring& filename, const bool useRecycleBin) } -//rename file: no copying!!! -void FreeFileSync::renameFile(const Zstring& oldName, const Zstring& newName) //throw (FileError); +namespace +{ +//(low-level) wrapper for file system rename function: last error code may be retrieved directly after this call! +//Windows: ::GetLastError() Linux: errno +bool renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw (); { #ifdef FFS_WIN - if (!::MoveFileEx(applyLongPathPrefix(oldName).c_str(), //__in LPCTSTR lpExistingFileName, - applyLongPathPrefix(newName).c_str(), //__in_opt LPCTSTR lpNewFileName, - 0)) //__in DWORD dwFlags + using namespace FreeFileSync; + + const Zstring oldNameFmt = applyLongPathPrefix(oldName); + const Zstring newNameFmt = applyLongPathPrefix(newName); + + if (!::MoveFileEx(oldNameFmt.c_str(), //__in LPCTSTR lpExistingFileName, + newNameFmt.c_str(), //__in_opt LPCTSTR lpNewFileName, + 0)) //__in DWORD dwFlags { - const wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(oldName) + wxT("\" ->\n\"") + zToWx(newName) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + if (::GetLastError() == ERROR_ACCESS_DENIED) //MoveFileEx may fail to rename a read-only file on a SAMBA-share -> (try to) handle this + { + const DWORD oldNameAttrib = ::GetFileAttributes(oldNameFmt.c_str()); + if (oldNameAttrib != INVALID_FILE_ATTRIBUTES) + { + if (::SetFileAttributes(oldNameFmt.c_str(), //address of filename + FILE_ATTRIBUTE_NORMAL)) //remove readonly-attribute + { + //try again... + if (::MoveFileEx(oldNameFmt.c_str(), //__in LPCTSTR lpExistingFileName, + newNameFmt.c_str(), //__in_opt LPCTSTR lpNewFileName, + 0)) //__in DWORD dwFlags + { + //(try to) restore file attributes + ::SetFileAttributes(newNameFmt.c_str(), + oldNameAttrib); + //don't handle error + return true; + } + else + { + const DWORD errorCode = ::GetLastError(); + //cleanup: (try to) restore file attributes: assume oldName is still existing + ::SetFileAttributes(oldNameFmt.c_str(), + oldNameAttrib); + + ::SetLastError(errorCode); //set error code from ::MoveFileEx() + } + } + } + } + + return false; } + return true; + #elif defined FFS_LINUX //rename temporary file if (::rename(oldName.c_str(), newName.c_str()) != 0) + return false; + + return true; +#endif +} +} + + +//rename file: no copying!!! +void FreeFileSync::renameFile(const Zstring& oldName, const Zstring& newName) //throw (FileError); +{ + if (!renameFileInternal(oldName, newName)) { const wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(oldName) + wxT("\" ->\n\"") + zToWx(newName) + wxT("\""); throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); } -#endif } @@ -354,41 +422,19 @@ void FreeFileSync::moveFile(const Zstring& sourceFile, const Zstring& targetFile //moving of symbolic links should work correctly: -#ifdef FFS_WIN //first try to move the file directly without copying - if (::MoveFileEx(applyLongPathPrefix(sourceFile).c_str(), //__in LPCTSTR lpExistingFileName, - applyLongPathPrefix(targetFile).c_str(), //__in_opt LPCTSTR lpNewFileName, - 0)) //__in DWORD dwFlags + if (::renameFileInternal(sourceFile, + targetFile)) //throw (); return; - //if moving failed treat as error (except when it tried to move to a different volume: in this case we will copy the file) - const DWORD lastError = ::GetLastError(); - if (lastError != ERROR_NOT_SAME_DEVICE) - { - const wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\" ->\n\"") + - zToWx(targetFile) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted(lastError)); - } - - //file is on a different volume: let's copy it - std::auto_ptr<CopyCallbackImpl> copyCallback(callback != NULL ? new CopyCallbackImpl(callback) : NULL); - - copyFile(sourceFile, - targetFile, - true, //copy symbolic links - NULL, //supply handler for making shadow copies - copyCallback.get()); //throw (FileError); - +#ifdef FFS_WIN + if (::GetLastError() != ERROR_NOT_SAME_DEVICE) #elif defined FFS_LINUX - //first try to move the file directly without copying - if (::rename(sourceFile.c_str(), targetFile.c_str()) == 0) - return; - - //if moving failed treat as error (except when it tried to move to a different volume: in this case we will copy the file) if (errno != EXDEV) +#endif { - const wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\" ->\n\"") + - zToWx(targetFile) + wxT("\""); + const wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + + zToWx(sourceFile) + wxT("\" ->\n\"") + zToWx(targetFile) + wxT("\""); throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); } @@ -398,12 +444,14 @@ void FreeFileSync::moveFile(const Zstring& sourceFile, const Zstring& targetFile copyFile(sourceFile, targetFile, true, //copy symbolic links - copyCallback.get()); //throw (FileError); +#ifdef FFS_WIN + NULL, //supply handler for making shadow copies #endif + copyCallback.get()); //throw (FileError); //attention: if copy-operation was cancelled an exception is thrown => sourcefile is not deleted, as we wish! - removeFile(sourceFile, false); + removeFile(sourceFile); } @@ -424,7 +472,7 @@ public: virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName) { m_dirs.push_back(std::make_pair(Zstring(shortName), fullName)); - return ReturnValDir::Ignore(); //DON'T traverse into subdirs; moveDirectory works recursively! + return Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_IGNORE>(); //DON'T traverse into subdirs; moveDirectory works recursively! } virtual ReturnValue onError(const wxString& errorText) { @@ -445,7 +493,7 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool if (symlinkExists(sourceDir)) { createDirectory(targetDir, sourceDir, true); //copy symbolic link - removeDirectory(sourceDir, false); //if target is already another symlink or directory, sourceDir-symlink is silently deleted + removeDirectory(sourceDir); //if target is already another symlink or directory, sourceDir-symlink is silently deleted return; } @@ -461,32 +509,21 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool else { //first try to move the directory directly without copying -#ifdef FFS_WIN - if (::MoveFileEx(applyLongPathPrefix(sourceDir).c_str(), //__in LPCTSTR lpExistingFileName, - applyLongPathPrefix(targetDir).c_str(), //__in_opt LPCTSTR lpNewFileName, - 0)) //__in DWORD dwFlags + if (::renameFileInternal(sourceDir, + targetDir)) //throw (); return; //if moving failed treat as error (except when it tried to move to a different volume: in this case we will copy the directory) - const DWORD lastError = ::GetLastError(); - if (lastError != ERROR_NOT_SAME_DEVICE) - { - const wxString errorMessage = wxString(_("Error moving directory:")) + wxT("\n\"") + zToWx(sourceDir) + wxT("\" ->\n\"") + - zToWx(targetDir) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted(lastError)); - } +#ifdef FFS_WIN + if (::GetLastError() != ERROR_NOT_SAME_DEVICE) #elif defined FFS_LINUX - if (::rename(sourceDir.c_str(), targetDir.c_str()) == 0) - return; - - //if moving failed treat as error (except when it tried to move to a different volume: in this case we will copy the directory) if (errno != EXDEV) +#endif { const wxString errorMessage = wxString(_("Error moving directory:")) + wxT("\n\"") + zToWx(sourceDir) + wxT("\" ->\n\"") + zToWx(targetDir) + wxT("\""); throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); } -#endif //create target createDirectory(targetDir, sourceDir, false); //throw (FileError); @@ -527,7 +564,7 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool //attention: if move-operation was cancelled an exception is thrown => sourceDir is not deleted, as we wish! //delete source - removeDirectory(sourceDir, false); //throw (FileError); + removeDirectory(sourceDir); //throw (FileError); } @@ -536,6 +573,7 @@ void FreeFileSync::moveDirectory(const Zstring& sourceDir, const Zstring& target #ifdef FFS_WIN const Zstring& sourceDirFormatted = sourceDir; const Zstring& targetDirFormatted = targetDir; + #elif defined FFS_LINUX const Zstring sourceDirFormatted = //remove trailing slash sourceDir.size() > 1 && sourceDir.EndsWith(globalFunctions::FILE_NAME_SEPARATOR) ? //exception: allow '/' @@ -566,7 +604,7 @@ public: virtual ReturnValDir onDir(const DefaultChar* shortName, const Zstring& fullName) { m_dirs.push_back(fullName); - return ReturnValDir::Ignore(); //DON'T traverse into subdirs; removeDirectory works recursively! + return Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_IGNORE>(); //DON'T traverse into subdirs; removeDirectory works recursively! } virtual ReturnValue onError(const wxString& errorText) { @@ -579,7 +617,7 @@ private: }; -void FreeFileSync::removeDirectory(const Zstring& directory, const bool useRecycleBin) +void FreeFileSync::removeDirectory(const Zstring& directory) { //no error situation if directory is not existing! manual deletion relies on it! #ifdef FFS_WIN @@ -591,21 +629,15 @@ void FreeFileSync::removeDirectory(const Zstring& directory, const bool useRecyc #elif defined FFS_LINUX struct stat dirInfo; - if (lstat(directory.c_str(), &dirInfo) != 0) + if (::lstat(directory.c_str(), &dirInfo) != 0) return; //neither directory nor any other object (e.g. broken symlink) with that name existing #endif - if (useRecycleBin) - { - ::moveToRecycleBin(directory); - return; - } - #ifdef FFS_WIN //initialize file attributes if (!::SetFileAttributes( // initialize file attributes: actually NEEDED for symbolic links also! - directoryFmt.c_str(), // address of directory name + directoryFmt.c_str(), // address of directory name FILE_ATTRIBUTE_NORMAL)) // attributes to set { wxString errorMessage = wxString(_("Error deleting directory:")) + wxT("\n\"") + directory.c_str() + wxT("\""); @@ -644,10 +676,10 @@ void FreeFileSync::removeDirectory(const Zstring& directory, const bool useRecyc FreeFileSync::traverseFolder(directory, false, &traverser); //delete files - std::for_each(fileList.begin(), fileList.end(), boost::bind(removeFile, _1, false)); + std::for_each(fileList.begin(), fileList.end(), removeFile); //delete directories recursively - std::for_each(dirList.begin(), dirList.end(), boost::bind(removeDirectory, _1, false)); //call recursively to correctly handle symbolic links + std::for_each(dirList.begin(), dirList.end(), removeDirectory); //call recursively to correctly handle symbolic links //parent directory is deleted last #ifdef FFS_WIN @@ -663,23 +695,6 @@ void FreeFileSync::removeDirectory(const Zstring& directory, const bool useRecyc } -#ifdef FFS_WIN -class CloseHandleOnExit -{ -public: - CloseHandleOnExit(HANDLE fileHandle) : fileHandle_(fileHandle) {} - - ~CloseHandleOnExit() - { - ::CloseHandle(fileHandle_); - } - -private: - HANDLE fileHandle_; -}; -#endif - - //optionally: copy directory last change date, DO NOTHING if something fails void FreeFileSync::copyFileTimes(const Zstring& sourceDir, const Zstring& targetDir) { @@ -696,7 +711,8 @@ void FreeFileSync::copyFileTimes(const Zstring& sourceDir, const Zstring& target NULL); if (hDirRead == INVALID_HANDLE_VALUE) return; - CloseHandleOnExit dummy(hDirRead); + + boost::shared_ptr<void> dummy(hDirRead, ::CloseHandle); FILETIME creationTime; FILETIME accessTime; @@ -715,7 +731,8 @@ void FreeFileSync::copyFileTimes(const Zstring& sourceDir, const Zstring& target NULL); if (hDirWrite == INVALID_HANDLE_VALUE) return; - CloseHandleOnExit dummy2(hDirWrite); + + boost::shared_ptr<void> dummy2(hDirWrite, ::CloseHandle); //(try to) set new "last write time" ::SetFileTime(hDirWrite, @@ -755,7 +772,7 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa if (hDir == INVALID_HANDLE_VALUE) return Zstring(); - CloseHandleOnExit dummy(hDir); + boost::shared_ptr<void> dummy(hDir, ::CloseHandle); const unsigned int BUFFER_SIZE = 10000; TCHAR targetPath[BUFFER_SIZE]; @@ -785,7 +802,6 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa return targetPath; } -//#warning teste //#include <aclapi.h> ////optionally: copy additional metadata, DO NOTHING if something fails //void copyAdditionalMetadata(const Zstring& sourceDir, const Zstring& targetDir) @@ -1156,7 +1172,7 @@ void FreeFileSync::copyFile(const Zstring& sourceFile, { try { - removeFile(temporary, false); //throw (FileError, std::logic_error); + removeFile(temporary); //throw (FileError, std::logic_error); } catch(...) {} @@ -1368,4 +1384,3 @@ bool FreeFileSync::isFatDrive(const Zstring& directoryName) } #endif //FFS_WIN */ - diff --git a/shared/fileHandling.h b/shared/fileHandling.h index 95d8fddd..bb33bd0e 100644 --- a/shared/fileHandling.h +++ b/shared/fileHandling.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 RECYCLER2_H_INCLUDED #define RECYCLER2_H_INCLUDED @@ -20,12 +26,9 @@ bool isMovable(const Zstring& pathFrom, const Zstring& pathTo); //throw() //optionally: copy creation/last change date, DOES NOTHING if something fails void copyFileTimes(const Zstring& sourceDir, const Zstring& targetDir); //throw() -//recycler -bool recycleBinExists(); //test existence of Recycle Bin API on current system - //file handling -void removeFile(const Zstring& filename, const bool useRecycleBin); //throw (FileError, std::logic_error) -void removeDirectory(const Zstring& directory, const bool useRecycleBin); //throw (FileError) +void removeFile(const Zstring& filename); //throw (FileError, std::logic_error) +void removeDirectory(const Zstring& directory); //throw (FileError) struct MoveFileCallback //callback functionality @@ -40,7 +43,7 @@ struct MoveFileCallback //callback functionality virtual Response requestUiRefresh() = 0; //DON'T throw exceptions here, at least in Windows build! }; -//rename file: no copying!!! +//rename file or directory: no copying!!! void renameFile(const Zstring& oldName, const Zstring& newName); //throw (FileError); //move source to target; expectations: target not existing, all super-directories of target exist @@ -72,7 +75,7 @@ void copyFile(const Zstring& sourceFile, const Zstring& targetFile, const bool copyFileSymLinks, ShadowCopy* shadowCopyHandler = NULL, //supply handler for making shadow copies - CopyFileCallback* callback = NULL); //throw (FileError); + CopyFileCallback* callback = NULL); //throw (FileError); #elif defined FFS_LINUX void copyFile(const Zstring& sourceFile, diff --git a/shared/fileID.cpp b/shared/fileID.cpp index 005707dc..09c63c2e 100644 --- a/shared/fileID.cpp +++ b/shared/fileID.cpp @@ -1,9 +1,16 @@ +// ************************************************************************** +// * 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 "fileID.h" #ifdef FFS_WIN #include "staticAssert.h" #include <wx/msw/wrapwin.h> //includes "windows.h" #include "longPathPrefix.h" +#include <boost/shared_ptr.hpp> #elif defined FFS_LINUX @@ -12,21 +19,6 @@ #ifdef FFS_WIN -class CloseHandleOnExit -{ -public: - CloseHandleOnExit(HANDLE fileHandle) : fileHandle_(fileHandle) {} - - ~CloseHandleOnExit() - { - ::CloseHandle(fileHandle_); - } - -private: - HANDLE fileHandle_; -}; - - Utility::FileID Utility::retrieveFileID(const Zstring& filename) { //ensure our DWORD_FFS really is the same as DWORD @@ -44,7 +36,7 @@ Utility::FileID Utility::retrieveFileID(const Zstring& filename) NULL); if (hFile != INVALID_HANDLE_VALUE) { - CloseHandleOnExit dummy(hFile); + boost::shared_ptr<void> dummy(hFile, ::CloseHandle); BY_HANDLE_FILE_INFORMATION info; if (::GetFileInformationByHandle(hFile, &info)) diff --git a/shared/fileID.h b/shared/fileID.h index 7944b368..7b48412a 100644 --- a/shared/fileID.h +++ b/shared/fileID.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 FILEID_H_INCLUDED #define FILEID_H_INCLUDED diff --git a/shared/fileTraverser.cpp b/shared/fileTraverser.cpp index 7d2615bf..1657f66c 100644 --- a/shared/fileTraverser.cpp +++ b/shared/fileTraverser.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "fileTraverser.h" #include "systemConstants.h" #include "systemFunctions.h" @@ -7,6 +13,7 @@ #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" #include "longPathPrefix.h" +#include <boost/shared_ptr.hpp> #elif defined FFS_LINUX #include <sys/stat.h> @@ -16,36 +23,6 @@ #ifdef FFS_WIN -class CloseHandleOnExit -{ -public: - CloseHandleOnExit(HANDLE fileHandle) : fileHandle_(fileHandle) {} - - ~CloseHandleOnExit() - { - ::CloseHandle(fileHandle_); - } - -private: - HANDLE fileHandle_; -}; - - -class CloseFindHandleOnExit -{ -public: - CloseFindHandleOnExit(HANDLE searchHandle) : searchHandle_(searchHandle) {} - - ~CloseFindHandleOnExit() - { - FindClose(searchHandle_); - } - -private: - HANDLE searchHandle_; -}; - - inline void setWin32FileInformation(const FILETIME& lastWriteTime, const DWORD fileSizeHigh, @@ -76,7 +53,7 @@ bool setWin32FileInformationFromSymlink(const Zstring linkName, FreeFileSync::Tr if (hFile == INVALID_HANDLE_VALUE) return false; - CloseHandleOnExit dummy(hFile); + boost::shared_ptr<void> dummy(hFile, ::CloseHandle); BY_HANDLE_FILE_INFORMATION fileInfoByHandle; @@ -152,7 +129,8 @@ bool traverseDirectory(const Zstring& directory, FreeFileSync::TraverseCallback* return true; } } - CloseFindHandleOnExit dummy(searchHandle); + +boost::shared_ptr<void> dummy(searchHandle, ::FindClose); do { @@ -170,13 +148,13 @@ bool traverseDirectory(const Zstring& directory, FreeFileSync::TraverseCallback* const TraverseCallback::ReturnValDir rv = sink->onDir(shortName, fullName); switch (rv.returnCode) { - case TraverseCallback::ReturnValDir::TRAVERSING_STOP: + case TraverseCallback::ReturnValDir::TRAVERSING_DIR_STOP: return false; - case TraverseCallback::ReturnValDir::TRAVERSING_IGNORE_DIR: + case TraverseCallback::ReturnValDir::TRAVERSING_DIR_IGNORE: break; - case TraverseCallback::ReturnValDir::TRAVERSING_CONTINUE: + case TraverseCallback::ReturnValDir::TRAVERSING_DIR_CONTINUE: //traverse into symbolic links, junctions, etc. if requested only: if (traverseDirectorySymlinks || (~fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) if (!traverseDirectory<traverseDirectorySymlinks>(fullName, rv.subDirCb, level + 1)) @@ -312,13 +290,13 @@ bool traverseDirectory(const Zstring& directory, FreeFileSync::TraverseCallback* const TraverseCallback::ReturnValDir rv = sink->onDir(shortName, fullName); switch (rv.returnCode) { - case TraverseCallback::ReturnValDir::TRAVERSING_STOP: + case TraverseCallback::ReturnValDir::TRAVERSING_DIR_STOP: return false; - case TraverseCallback::ReturnValDir::TRAVERSING_IGNORE_DIR: + case TraverseCallback::ReturnValDir::TRAVERSING_DIR_IGNORE: break; - case TraverseCallback::ReturnValDir::TRAVERSING_CONTINUE: + case TraverseCallback::ReturnValDir::TRAVERSING_DIR_CONTINUE: //traverse into symbolic links, junctions, etc. if requested only: if (traverseDirectorySymlinks || !isSymbolicLink) //traverse into symbolic links if requested only if (!traverseDirectory<traverseDirectorySymlinks>(fullName, rv.subDirCb, level + 1)) @@ -365,6 +343,3 @@ void FreeFileSync::traverseFolder(const Zstring& directory, else traverseDirectory<false>(directoryFormatted, sink, 0); } - - - diff --git a/shared/fileTraverser.h b/shared/fileTraverser.h index c1277d87..dc5d75e0 100644 --- a/shared/fileTraverser.h +++ b/shared/fileTraverser.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 FILETRAVERSER_H_INCLUDED #define FILETRAVERSER_H_INCLUDED @@ -5,6 +11,7 @@ #include <set> #include <memory> #include <wx/longlong.h> +#include "loki/TypeManip.h" //advanced file traverser returning metadata and hierarchical information on files and directories @@ -30,23 +37,18 @@ public: class ReturnValDir { public: - //some proxy classes - class Stop {}; - class Ignore {}; - class Continue {}; - - ReturnValDir(const Stop&) : returnCode(TRAVERSING_STOP), subDirCb(NULL) {} - ReturnValDir(const Ignore&) : returnCode(TRAVERSING_IGNORE_DIR), subDirCb(NULL) {} - ReturnValDir(const Continue&, TraverseCallback* subDirCallback) : returnCode(TRAVERSING_CONTINUE), subDirCb(subDirCallback) {} - - enum ReturnValueEnh { - TRAVERSING_STOP, - TRAVERSING_IGNORE_DIR, - TRAVERSING_CONTINUE + TRAVERSING_DIR_STOP, + TRAVERSING_DIR_IGNORE, + TRAVERSING_DIR_CONTINUE }; + ReturnValDir(Loki::Int2Type<TRAVERSING_DIR_STOP>) : returnCode(TRAVERSING_DIR_STOP), subDirCb(NULL) {} + ReturnValDir(Loki::Int2Type<TRAVERSING_DIR_IGNORE>) : returnCode(TRAVERSING_DIR_IGNORE), subDirCb(NULL) {} + ReturnValDir(Loki::Int2Type<TRAVERSING_DIR_CONTINUE>, TraverseCallback* subDirCallback) : returnCode(TRAVERSING_DIR_CONTINUE), subDirCb(subDirCallback) {} + + const ReturnValueEnh returnCode; TraverseCallback* const subDirCb; }; diff --git a/shared/globalFunctions.cpp b/shared/globalFunctions.cpp index a5ebba68..029d542a 100644 --- a/shared/globalFunctions.cpp +++ b/shared/globalFunctions.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "globalFunctions.h" #include <wx/msgdlg.h> #include <wx/file.h> @@ -43,6 +49,8 @@ Performance::Performance() : Performance::~Performance() { + //keep non-inline destructor for std::auto_ptr to work with forward declaration + if (!resultWasShown) showResult(); } diff --git a/shared/globalFunctions.h b/shared/globalFunctions.h index 06238236..781e2dec 100644 --- a/shared/globalFunctions.h +++ b/shared/globalFunctions.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 GLOBALFUNCTIONS_H_INCLUDED #define GLOBALFUNCTIONS_H_INCLUDED diff --git a/shared/guid.cpp b/shared/guid.cpp index 70282efa..785ab200 100644 --- a/shared/guid.cpp +++ b/shared/guid.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "guid.h" #include <stdexcept> diff --git a/shared/guid.h b/shared/guid.h index b2718d7f..d639fff5 100644 --- a/shared/guid.h +++ b/shared/guid.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 GUID_H_INCLUDED #define GUID_H_INCLUDED diff --git a/shared/helpProvider.cpp b/shared/helpProvider.cpp new file mode 100644 index 00000000..9cc4aeed --- /dev/null +++ b/shared/helpProvider.cpp @@ -0,0 +1,44 @@ +// ************************************************************************** +// * 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 "helpProvider.h" +#include <wx/help.h> +#include "standardPaths.h" + + +namespace +{ +class HelpProvider +{ +public: + HelpProvider() + { + controller.Initialize(FreeFileSync::getResourceDir() + +#ifdef FFS_WIN + wxT("FreeFileSync.chm")); +#elif defined FFS_LINUX + wxT("Help/FreeFileSync.hhp")); +#endif + } + + void showHelp(const wxString& section) + { + if (section.empty()) + controller.DisplayContents(); + else + controller.DisplaySection(section); + } + +private: + wxHelpController controller; +}; +} + +void FreeFileSync::displayHelpEntry(const wxString& section) +{ + static HelpProvider provider; + provider.showHelp(section); +} diff --git a/shared/helpProvider.h b/shared/helpProvider.h new file mode 100644 index 00000000..538e151c --- /dev/null +++ b/shared/helpProvider.h @@ -0,0 +1,17 @@ +// ************************************************************************** +// * 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 HELPPROVIDER_H_INCLUDED +#define HELPPROVIDER_H_INCLUDED + +#include <wx/string.h> + +namespace FreeFileSync +{ +void displayHelpEntry(const wxString& section = wxEmptyString); +} + +#endif // HELPPROVIDER_H_INCLUDED diff --git a/shared/inotify/CHANGELOG b/shared/inotify/CHANGELOG index 8830d918..5c3940fa 100644 --- a/shared/inotify/CHANGELOG +++ b/shared/inotify/CHANGELOG @@ -1,3 +1,6 @@ +0.7.3 2009-12-09 + * cleanup of includes + 0.7.2 2007-04-18 * added #include <stdint.h> (required for Debian Sarge, #0000155) diff --git a/shared/inotify/COPYING b/shared/inotify/COPYING index 272a9567..17959846 100644 --- a/shared/inotify/COPYING +++ b/shared/inotify/COPYING @@ -1,6 +1,6 @@ inotify C++ interface -Copyright (C) 2006, 2007 Lukas Jelinek, <lukas@aiken.cz> +Copyright (C) 2006, 2007, 2009 Lukas Jelinek, <lukas@aiken.cz> This program is free software; you can redistribute it and/or modify it under the terms of one of the following licenses: diff --git a/shared/inotify/LICENSE-X11 b/shared/inotify/LICENSE-X11 index d632087f..c2db7930 100644 --- a/shared/inotify/LICENSE-X11 +++ b/shared/inotify/LICENSE-X11 @@ -1,4 +1,4 @@ -Copyright (c) 2006, 2007 Lukas Jelinek +Copyright (c) 2006, 2007, 2009 Lukas Jelinek Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation diff --git a/shared/inotify/README b/shared/inotify/README index f3dc0db0..2e8e2aa2 100644 --- a/shared/inotify/README +++ b/shared/inotify/README @@ -1,7 +1,7 @@ inotify C++ interface -(c) Lukas Jelinek, 2006, 2007 +(c) Lukas Jelinek, 2006, 2007, 2009 1. About 2. Requirements diff --git a/shared/inotify/VERSION b/shared/inotify/VERSION deleted file mode 100644 index 7486fdbc..00000000 --- a/shared/inotify/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.7.2 diff --git a/shared/inotify/doc/html/annotated.html b/shared/inotify/doc/html/annotated.html index 29fc335f..4f67400b 100644 --- a/shared/inotify/doc/html/annotated.html +++ b/shared/inotify/doc/html/annotated.html @@ -1,29 +1,34 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Class List</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li id="current"><a href="annotated.html"><span>Class List</span></a></li> - <li><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> -<h1>inotify-cxx Class List</h1>Here are the classes, structs, unions and interfaces with brief descriptions:<table> - <tr><td class="indexkey"><a class="el" href="classInotify.html">Inotify</a></td><td class="indexvalue"><a class="el" href="classInotify.html">Inotify</a> class </td></tr> - <tr><td class="indexkey"><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td class="indexvalue"><a class="el" href="classInotify.html">Inotify</a> event class </td></tr> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li class="current"><a href="annotated.html"><span>Class List</span></a></li> + <li><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> +<h1>Class List</h1>Here are the classes, structs, unions and interfaces with brief descriptions:<table> + <tr><td class="indexkey"><a class="el" href="classInotify.html">Inotify</a></td><td class="indexvalue"><a class="el" href="classInotify.html" title="inotify class">Inotify</a> class </td></tr> + <tr><td class="indexkey"><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td class="indexvalue"><a class="el" href="classInotify.html" title="inotify class">Inotify</a> event class </td></tr> <tr><td class="indexkey"><a class="el" href="classInotifyException.html">InotifyException</a></td><td class="indexvalue">Class for inotify exceptions </td></tr> - <tr><td class="indexkey"><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td class="indexvalue"><a class="el" href="classInotify.html">Inotify</a> watch class </td></tr> + <tr><td class="indexkey"><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td class="indexvalue"><a class="el" href="classInotify.html" title="inotify class">Inotify</a> watch class </td></tr> </table> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/classInotify-members.html b/shared/inotify/doc/html/classInotify-members.html index 45fd612d..3370bb6c 100644 --- a/shared/inotify/doc/html/classInotify-members.html +++ b/shared/inotify/doc/html/classInotify-members.html @@ -1,21 +1,26 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Member List</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="annotated.html"><span>Class List</span></a></li> - <li><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> <h1>Inotify Member List</h1>This is the complete list of members for <a class="el" href="classInotify.html">Inotify</a>, including all inherited members.<p><table> <tr class="memlist"><td><a class="el" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83">Add</a>(InotifyWatch *pWatch)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#35dab56d3e10bf28b5e457871adddb58">Add</a>(InotifyWatch &rWatch)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr> @@ -23,17 +28,23 @@ <tr class="memlist"><td><a class="el" href="classInotify.html#182d19b667c9e0899802b70a579eff40">FindWatch</a>(int iDescriptor)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#a4d6b9d1a9a496862febbe5bffd798c2">FindWatch</a>(const std::string &rPath)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b">GetCapability</a>(InotifyCapability_t cap)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [static]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotify.html#678271faf4799840ad71805163a24b13">GetDescriptor</a>() const</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotify.html#9bf5f7716649d5b5f468c2242fb5e099">GetEnabledCount</a>() const</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotify.html#0233ddfe40844d729505fdfd709d22cc">GetCapabilityPath</a>(InotifyCapability_t cap)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [private, static]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9">GetDescriptor</a>() const </td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063">GetEnabledCount</a>() const </td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008">GetEvent</a>(InotifyEvent *pEvt)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#b028c8fa988f6bbb2ef773db3ea3a2d3">GetEvent</a>(InotifyEvent &rEvt)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#a3c533f956871f904949832ac8f5fbde">GetEventCount</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42">GetMaxEvents</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline, static]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51">GetMaxInstances</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline, static]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f">GetMaxWatches</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline, static]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotify.html#b53b7935bda7425b002946d78bfe5863">GetWatchCount</a>() const</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075">GetWatchCount</a>() const </td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#a6fe6e9cb3343665eb968fcd5170cfb9">Inotify</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#10880f490c33acd8bd24664fc7bce4ae">InotifyWatch</a> class</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [friend]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotify.html#eee7847efd93b681fddac56860fc7958">m_buf</a></td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [private]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">m_events</a></td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [private]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">m_fd</a></td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [private]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">m_paths</a></td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [private]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">m_watches</a></td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [private]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#19cde43d082ff92bd02654610019300d">PeekEvent</a>(InotifyEvent *pEvt)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#287dc0d238fa6edc3269441cb284f979">PeekEvent</a>(InotifyEvent &rEvt)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84">Remove</a>(InotifyWatch *pWatch)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr> @@ -47,8 +58,8 @@ <tr class="memlist"><td><a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b">SetNonBlock</a>(bool fNonBlock)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b">WaitForEvents</a>(bool fNoIntr=false)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classInotify.html#f19dd5e491395673e4798eb9dbf5f682">~Inotify</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr> -</table><hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</table></div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/classInotify.html b/shared/inotify/doc/html/classInotify.html index f37e55f6..1842796c 100644 --- a/shared/inotify/doc/html/classInotify.html +++ b/shared/inotify/doc/html/classInotify.html @@ -1,25 +1,32 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Inotify Class Reference</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="annotated.html"><span>Class List</span></a></li> - <li><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> <h1>Inotify Class Reference</h1><!-- doxytag: class="Inotify" -->inotify class <a href="#_details">More...</a> <p> -<code>#include <<a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a>></code> +<code>#include <<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>></code> +<p> + <p> <a href="classInotify-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0"> <tr><td></td></tr> @@ -48,12 +55,12 @@ <tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#bc1fd5830ca561efb69bcd2283981741">RemoveAll</a> ()</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Removes all watches. <a href="#bc1fd5830ca561efb69bcd2283981741"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#b53b7935bda7425b002946d78bfe5863">GetWatchCount</a> () const</td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075">GetWatchCount</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the count of watches. <a href="#b53b7935bda7425b002946d78bfe5863"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#9bf5f7716649d5b5f468c2242fb5e099">GetEnabledCount</a> () const</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the count of watches. <a href="#716ae90a00dd4895709ea9b8f7959075"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063">GetEnabledCount</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the count of enabled watches. <a href="#9bf5f7716649d5b5f468c2242fb5e099"></a><br></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the count of enabled watches. <a href="#6f432affb46f85f7bc19661d5bc77063"></a><br></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b">WaitForEvents</a> (bool fNoIntr=false) throw (InotifyException)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Waits for inotify events. <a href="#139c27c6643bb199619f3eae9b32e53b"></a><br></td></tr> @@ -78,9 +85,9 @@ <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#a4d6b9d1a9a496862febbe5bffd798c2">FindWatch</a> (const std::string &rPath)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Searches for a watch by a filesystem path. <a href="#a4d6b9d1a9a496862febbe5bffd798c2"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#678271faf4799840ad71805163a24b13">GetDescriptor</a> () const</td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9">GetDescriptor</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the file descriptor. <a href="#678271faf4799840ad71805163a24b13"></a><br></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the file descriptor. <a href="#abab7015203bf36d0256e75d4f4861f9"></a><br></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b">SetNonBlock</a> (bool fNonBlock) throw (InotifyException)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Enables/disables non-blocking mode. <a href="#b2c8ab8ad4322fb6f0dae0eae442402b"></a><br></td></tr> @@ -112,6 +119,25 @@ <tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a">SetMaxWatches</a> (uint32_t val) throw (InotifyException)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Sets the maximum number of inotify watches per instance. <a href="#5064380cdb4a726ab33f3fa18d15c77a"></a><br></td></tr> +<tr><td colspan="2"><br><h2>Static Private Member Functions</h2></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">static std::string </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#0233ddfe40844d729505fdfd709d22cc">GetCapabilityPath</a> (<a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a> cap) throw (InotifyException)</td></tr> + +<tr><td colspan="2"><br><h2>Private Attributes</h2></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">m_fd</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">file descriptor <a href="#95d6d0ecefff77bd3ee50f1586a4552b"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">IN_WATCH_MAP</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">m_watches</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">watches (by descriptors) <a href="#4d07f3a4412028d687936d2479d9a976"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">IN_WP_MAP</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">m_paths</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">watches (by paths) <a href="#62f275db6375a366023b2e46f73e3ecc"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#eee7847efd93b681fddac56860fc7958">m_buf</a> [INOTIFY_BUFLEN]</td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">buffer for events <a href="#eee7847efd93b681fddac56860fc7958"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">std::deque< <a class="el" href="classInotifyEvent.html">InotifyEvent</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">m_events</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">event queue <a href="#0c1d6c969292dbb7c8c1283a3d8f55e0"></a><br></td></tr> <tr><td colspan="2"><br><h2>Friends</h2></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#10880f490c33acd8bd24664fc7bce4ae">InotifyWatch</a></td></tr> @@ -120,9 +146,7 @@ inotify class <p> It holds information about the inotify device descriptor and manages the event queue.<p> -If the INOTIFY_THREAD_SAFE is defined this class is thread-safe. -<p> -<hr><h2>Constructor & Destructor Documentation</h2> +If the INOTIFY_THREAD_SAFE is defined this class is thread-safe. <hr><h2>Constructor & Destructor Documentation</h2> <a class="anchor" name="a6fe6e9cb3343665eb968fcd5170cfb9"></a><!-- doxytag: member="Inotify::Inotify" ref="a6fe6e9cb3343665eb968fcd5170cfb9" args="()" --> <div class="memitem"> <div class="memproto"> @@ -132,7 +156,7 @@ If the INOTIFY_THREAD_SAFE is defined this class is thread-safe. <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> </tr> </table> </div> @@ -144,7 +168,7 @@ Constructor. Creates and initializes an instance of inotify communication object (opens the inotify device).<p> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if inotify isn't available </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if inotify isn't available </td></tr> </table> </dl> @@ -159,7 +183,7 @@ Creates and initializes an instance of inotify communication object (opens the i <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"></td> + <td></td> </tr> </table> </div> @@ -168,28 +192,39 @@ Creates and initializes an instance of inotify communication object (opens the i <p> Destructor. <p> -Calls <a class="el" href="classInotify.html#86ae86c43ea1a72f562ca46393309635">Close()</a> due to clean-up. +Calls <a class="el" href="classInotify.html#86ae86c43ea1a72f562ca46393309635" title="Removes all watches and closes the inotify device.">Close()</a> due to clean-up. </div> </div><p> <hr><h2>Member Function Documentation</h2> -<a class="anchor" name="86ae86c43ea1a72f562ca46393309635"></a><!-- doxytag: member="Inotify::Close" ref="86ae86c43ea1a72f562ca46393309635" args="()" --> +<a class="anchor" name="35dab56d3e10bf28b5e457871adddb58"></a><!-- doxytag: member="Inotify::Add" ref="35dab56d3e10bf28b5e457871adddb58" args="(InotifyWatch &rWatch)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">void Inotify::Close </td> + <td class="memname">void Inotify::Add </td> <td>(</td> - <td class="paramname"> </td> + <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> & </td> + <td class="paramname"> <em>rWatch</em> </td> <td> ) </td> - <td width="100%"></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Removes all watches and closes the inotify device. +Adds a new watch. <p> +<dl compact><dt><b>Parameters:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>rWatch</em> </td><td>inotify watch</td></tr> + </table> +</dl> +<dl compact><dt><b>Exceptions:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if adding failed </td></tr> + </table> +</dl> </div> </div><p> @@ -203,7 +238,7 @@ Removes all watches and closes the inotify device. <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> * </td> <td class="paramname"> <em>pWatch</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> </tr> </table> </div> @@ -219,156 +254,197 @@ Adds a new watch. </dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if adding failed </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if adding failed </td></tr> </table> </dl> +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.png" border="0" usemap="#classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph_map" alt=""></center> +<map name="classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph_map"> +<area shape="rect" href="classInotify.html#35dab56d3e10bf28b5e457871adddb58" title="Adds a new watch." alt="" coords="143,5,228,32"></map> +</div> + </div> </div><p> -<a class="anchor" name="35dab56d3e10bf28b5e457871adddb58"></a><!-- doxytag: member="Inotify::Add" ref="35dab56d3e10bf28b5e457871adddb58" args="(InotifyWatch &rWatch)" --> +<a class="anchor" name="86ae86c43ea1a72f562ca46393309635"></a><!-- doxytag: member="Inotify::Close" ref="86ae86c43ea1a72f562ca46393309635" args="()" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">void Inotify::Add </td> + <td class="memname">void Inotify::Close </td> <td>(</td> - <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> & </td> - <td class="paramname"> <em>rWatch</em> </td> + <td class="paramname"> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline]</code></td> + <td></td> </tr> </table> </div> <div class="memdoc"> <p> -Adds a new watch. +Removes all watches and closes the inotify device. +<p> + +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.png" border="0" usemap="#classInotify_86ae86c43ea1a72f562ca46393309635_icgraph_map" alt=""></center> +<map name="classInotify_86ae86c43ea1a72f562ca46393309635_icgraph_map"> +<area shape="rect" href="classInotify.html#f19dd5e491395673e4798eb9dbf5f682" title="Destructor." alt="" coords="151,5,255,32"></map> +</div> + +</div> +</div><p> +<a class="anchor" name="a4d6b9d1a9a496862febbe5bffd798c2"></a><!-- doxytag: member="Inotify::FindWatch" ref="a4d6b9d1a9a496862febbe5bffd798c2" args="(const std::string &rPath)" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> * Inotify::FindWatch </td> + <td>(</td> + <td class="paramtype">const std::string & </td> + <td class="paramname"> <em>rPath</em> </td> + <td> ) </td> + <td></td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +Searches for a watch by a filesystem path. <p> +It tries to find a watch by the given filesystem path.<p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>rWatch</em> </td><td>inotify watch</td></tr> - </table> -</dl> -<dl compact><dt><b>Exceptions:</b></dt><dd> - <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if adding failed </td></tr> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>rPath</em> </td><td>filesystem path </td></tr> </table> </dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>pointer to a watch; NULL if no such watch exists</dd></dl> +<dl class="attention" compact><dt><b>Attention:</b></dt><dd>The path must be exactly identical to the one used for the searched watch. Be careful about absolute/relative and case-insensitive paths. </dd></dl> </div> </div><p> -<a class="anchor" name="21c39bb8e5bbc1941b945c18f9005b84"></a><!-- doxytag: member="Inotify::Remove" ref="21c39bb8e5bbc1941b945c18f9005b84" args="(InotifyWatch *pWatch)" --> +<a class="anchor" name="182d19b667c9e0899802b70a579eff40"></a><!-- doxytag: member="Inotify::FindWatch" ref="182d19b667c9e0899802b70a579eff40" args="(int iDescriptor)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">void Inotify::Remove </td> + <td class="memname"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> * Inotify::FindWatch </td> <td>(</td> - <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> * </td> - <td class="paramname"> <em>pWatch</em> </td> + <td class="paramtype">int </td> + <td class="paramname"> <em>iDescriptor</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> + <td></td> </tr> </table> </div> <div class="memdoc"> <p> -Removes a watch. +Searches for a watch by a watch descriptor. <p> -If the given watch is not present it does nothing.<p> +It tries to find a watch by the given descriptor.<p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>pWatch</em> </td><td>inotify watch</td></tr> - </table> -</dl> -<dl compact><dt><b>Exceptions:</b></dt><dd> - <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if removing failed </td></tr> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>iDescriptor</em> </td><td>watch descriptor </td></tr> </table> </dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>pointer to a watch; NULL if no such watch exists </dd></dl> </div> </div><p> -<a class="anchor" name="ac1a52b2ff6bfec07021a44e55d496a6"></a><!-- doxytag: member="Inotify::Remove" ref="ac1a52b2ff6bfec07021a44e55d496a6" args="(InotifyWatch &rWatch)" --> +<a class="anchor" name="70b3b57e8661fbb4c5bc404b86225c3b"></a><!-- doxytag: member="Inotify::GetCapability" ref="70b3b57e8661fbb4c5bc404b86225c3b" args="(InotifyCapability_t cap)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">void Inotify::Remove </td> + <td class="memname">uint32_t Inotify::GetCapability </td> <td>(</td> - <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> & </td> - <td class="paramname"> <em>rWatch</em> </td> + <td class="paramtype"><a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a> </td> + <td class="paramname"> <em>cap</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline]</code></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [static]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Removes a watch. +Acquires a particular inotify capability/limit. <p> -If the given watch is not present it does nothing.<p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>rWatch</em> </td><td>inotify watch</td></tr> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>cap</em> </td><td>capability/limit identifier </td></tr> </table> </dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>capability/limit value </dd></dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if removing failed </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if the given value cannot be acquired </td></tr> </table> </dl> +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.png" border="0" usemap="#classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph_map" alt=""></center> +<map name="classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph_map"> +<area shape="rect" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42" title="Returns the maximum number of events in the kernel queue." alt="" coords="204,5,351,32"><area shape="rect" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51" title="Returns the maximum number of inotify instances per process." alt="" coords="195,56,360,83"><area shape="rect" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f" title="Returns the maximum number of inotify watches per instance." alt="" coords="197,107,357,133"></map> +</div> + </div> </div><p> -<a class="anchor" name="bc1fd5830ca561efb69bcd2283981741"></a><!-- doxytag: member="Inotify::RemoveAll" ref="bc1fd5830ca561efb69bcd2283981741" args="()" --> +<a class="anchor" name="0233ddfe40844d729505fdfd709d22cc"></a><!-- doxytag: member="Inotify::GetCapabilityPath" ref="0233ddfe40844d729505fdfd709d22cc" args="(InotifyCapability_t cap)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">void Inotify::RemoveAll </td> + <td class="memname">std::string Inotify::GetCapabilityPath </td> <td>(</td> - <td class="paramname"> </td> + <td class="paramtype"><a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a> </td> + <td class="paramname"> <em>cap</em> </td> <td> ) </td> - <td width="100%"></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [static, private]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Removes all watches. -<p> </div> </div><p> -<a class="anchor" name="b53b7935bda7425b002946d78bfe5863"></a><!-- doxytag: member="Inotify::GetWatchCount" ref="b53b7935bda7425b002946d78bfe5863" args="() const" --> +<a class="anchor" name="abab7015203bf36d0256e75d4f4861f9"></a><!-- doxytag: member="Inotify::GetDescriptor" ref="abab7015203bf36d0256e75d4f4861f9" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">size_t Inotify::GetWatchCount </td> + <td class="memname">int Inotify::GetDescriptor </td> <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Returns the count of watches. +Returns the file descriptor. <p> -This is the total count of all watches (regardless whether enabled or not).<p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>count of watches</dd></dl> -<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#9bf5f7716649d5b5f468c2242fb5e099">GetEnabledCount()</a> </dd></dl> +The descriptor can be used in standard low-level file functions (poll(), select(), fcntl() etc.).<p> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>valid file descriptor or -1 for inactive object</dd></dl> +<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b" title="Enables/disables non-blocking mode.">SetNonBlock()</a> </dd></dl> </div> </div><p> -<a class="anchor" name="9bf5f7716649d5b5f468c2242fb5e099"></a><!-- doxytag: member="Inotify::GetEnabledCount" ref="9bf5f7716649d5b5f468c2242fb5e099" args="() const" --> +<a class="anchor" name="6f432affb46f85f7bc19661d5bc77063"></a><!-- doxytag: member="Inotify::GetEnabledCount" ref="6f432affb46f85f7bc19661d5bc77063" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -377,7 +453,7 @@ This is the total count of all watches (regardless whether enabled or not).<p> <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> @@ -387,64 +463,40 @@ This is the total count of all watches (regardless whether enabled or not).<p> Returns the count of enabled watches. <p> <dl class="return" compact><dt><b>Returns:</b></dt><dd>count of enabled watches</dd></dl> -<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#b53b7935bda7425b002946d78bfe5863">GetWatchCount()</a> </dd></dl> +<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075" title="Returns the count of watches.">GetWatchCount()</a> </dd></dl> </div> </div><p> -<a class="anchor" name="139c27c6643bb199619f3eae9b32e53b"></a><!-- doxytag: member="Inotify::WaitForEvents" ref="139c27c6643bb199619f3eae9b32e53b" args="(bool fNoIntr=false)" --> +<a class="anchor" name="b028c8fa988f6bbb2ef773db3ea3a2d3"></a><!-- doxytag: member="Inotify::GetEvent" ref="b028c8fa988f6bbb2ef773db3ea3a2d3" args="(InotifyEvent &rEvt)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">void Inotify::WaitForEvents </td> + <td class="memname">bool Inotify::GetEvent </td> <td>(</td> - <td class="paramtype">bool </td> - <td class="paramname"> <em>fNoIntr</em> = <code>false</code> </td> + <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> & </td> + <td class="paramname"> <em>rEvt</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Waits for inotify events. +Extracts a queued inotify event. <p> -It waits until one or more events occur. When called in nonblocking mode it only retrieves occurred events to the internal queue and exits.<p> +The extracted event is removed from the queue.<p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>fNoIntr</em> </td><td>if true it re-calls the system call after a handled signal</td></tr> + <tr><td valign="top"><tt>[in,out]</tt> </td><td valign="top"><em>rEvt</em> </td><td>event object</td></tr> </table> </dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if reading events failed</td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown only in very anomalous cases </td></tr> </table> </dl> -<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b">SetNonBlock()</a> </dd></dl> - -</div> -</div><p> -<a class="anchor" name="a3c533f956871f904949832ac8f5fbde"></a><!-- doxytag: member="Inotify::GetEventCount" ref="a3c533f956871f904949832ac8f5fbde" args="()" --> -<div class="memitem"> -<div class="memproto"> - <table class="memname"> - <tr> - <td class="memname">size_t Inotify::GetEventCount </td> - <td>(</td> - <td class="paramname"> </td> - <td> ) </td> - <td width="100%"><code> [inline]</code></td> - </tr> - </table> -</div> -<div class="memdoc"> - -<p> -Returns the count of received and queued events. -<p> -This number is related to the events in the queue inside this object, not to the events pending in the kernel.<p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>count of events </dd></dl> </div> </div><p> @@ -458,7 +510,7 @@ This number is related to the events in the queue inside this object, not to the <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> * </td> <td class="paramname"> <em>pEvt</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> </tr> </table> </div> @@ -475,295 +527,329 @@ The extracted event is removed from the queue. If the pointer is NULL it does no </dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if the provided pointer is NULL </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if the provided pointer is NULL </td></tr> </table> </dl> +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.png" border="0" usemap="#classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph_map" alt=""></center> +<map name="classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph_map"> +<area shape="rect" href="classInotify.html#b028c8fa988f6bbb2ef773db3ea3a2d3" title="Extracts a queued inotify event." alt="" coords="172,5,287,32"></map> +</div> + </div> </div><p> -<a class="anchor" name="b028c8fa988f6bbb2ef773db3ea3a2d3"></a><!-- doxytag: member="Inotify::GetEvent" ref="b028c8fa988f6bbb2ef773db3ea3a2d3" args="(InotifyEvent &rEvt)" --> +<a class="anchor" name="a3c533f956871f904949832ac8f5fbde"></a><!-- doxytag: member="Inotify::GetEventCount" ref="a3c533f956871f904949832ac8f5fbde" args="()" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">bool Inotify::GetEvent </td> + <td class="memname">size_t Inotify::GetEventCount </td> <td>(</td> - <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> & </td> - <td class="paramname"> <em>rEvt</em> </td> + <td class="paramname"> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline]</code></td> + <td><code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Extracts a queued inotify event. +Returns the count of received and queued events. <p> -The extracted event is removed from the queue.<p> -<dl compact><dt><b>Parameters:</b></dt><dd> - <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in,out]</tt> </td><td valign="top"><em>rEvt</em> </td><td>event object</td></tr> - </table> -</dl> -<dl compact><dt><b>Exceptions:</b></dt><dd> - <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown only in very anomalous cases </td></tr> - </table> -</dl> +This number is related to the events in the queue inside this object, not to the events pending in the kernel.<p> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>count of events </dd></dl> </div> </div><p> -<a class="anchor" name="19cde43d082ff92bd02654610019300d"></a><!-- doxytag: member="Inotify::PeekEvent" ref="19cde43d082ff92bd02654610019300d" args="(InotifyEvent *pEvt)" --> +<a class="anchor" name="d8e4a4a87d005c71c0b5ea9c6dd53c42"></a><!-- doxytag: member="Inotify::GetMaxEvents" ref="d8e4a4a87d005c71c0b5ea9c6dd53c42" args="()" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">bool Inotify::PeekEvent </td> + <td class="memname">static uint32_t Inotify::GetMaxEvents </td> <td>(</td> - <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> * </td> - <td class="paramname"> <em>pEvt</em> </td> + <td class="paramname"> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Extracts a queued inotify event (without removing). +Returns the maximum number of events in the kernel queue. <p> -The extracted event stays in the queue. If the pointer is NULL it does nothing.<p> -<dl compact><dt><b>Parameters:</b></dt><dd> - <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in,out]</tt> </td><td valign="top"><em>pEvt</em> </td><td>event object</td></tr> - </table> -</dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>maximum number of events in the kernel queue </dd></dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if the provided pointer is NULL </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if the given value cannot be acquired </td></tr> </table> </dl> </div> </div><p> -<a class="anchor" name="287dc0d238fa6edc3269441cb284f979"></a><!-- doxytag: member="Inotify::PeekEvent" ref="287dc0d238fa6edc3269441cb284f979" args="(InotifyEvent &rEvt)" --> +<a class="anchor" name="c18b7732f67832260fbbd47aebb8af51"></a><!-- doxytag: member="Inotify::GetMaxInstances" ref="c18b7732f67832260fbbd47aebb8af51" args="()" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">bool Inotify::PeekEvent </td> + <td class="memname">static uint32_t Inotify::GetMaxInstances </td> <td>(</td> - <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> & </td> - <td class="paramname"> <em>rEvt</em> </td> + <td class="paramname"> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline]</code></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Extracts a queued inotify event (without removing). +Returns the maximum number of inotify instances per process. <p> -The extracted event stays in the queue.<p> -<dl compact><dt><b>Parameters:</b></dt><dd> - <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in,out]</tt> </td><td valign="top"><em>rEvt</em> </td><td>event object</td></tr> - </table> -</dl> +It means the maximum number of open inotify file descriptors per running process.<p> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>maximum number of inotify instances </dd></dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown only in very anomalous cases </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if the given value cannot be acquired </td></tr> </table> </dl> </div> </div><p> -<a class="anchor" name="182d19b667c9e0899802b70a579eff40"></a><!-- doxytag: member="Inotify::FindWatch" ref="182d19b667c9e0899802b70a579eff40" args="(int iDescriptor)" --> +<a class="anchor" name="86dae1b7a72c0d8fc2a632444a0f2f1f"></a><!-- doxytag: member="Inotify::GetMaxWatches" ref="86dae1b7a72c0d8fc2a632444a0f2f1f" args="()" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> * Inotify::FindWatch </td> + <td class="memname">static uint32_t Inotify::GetMaxWatches </td> <td>(</td> - <td class="paramtype">int </td> - <td class="paramname"> <em>iDescriptor</em> </td> + <td class="paramname"> </td> <td> ) </td> - <td width="100%"></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Searches for a watch by a watch descriptor. +Returns the maximum number of inotify watches per instance. <p> -It tries to find a watch by the given descriptor.<p> -<dl compact><dt><b>Parameters:</b></dt><dd> +It means the maximum number of inotify watches per inotify file descriptor.<p> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>maximum number of inotify watches </dd></dl> +<dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>iDescriptor</em> </td><td>watch descriptor </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if the given value cannot be acquired </td></tr> </table> </dl> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>pointer to a watch; NULL if no such watch exists </dd></dl> </div> </div><p> -<a class="anchor" name="a4d6b9d1a9a496862febbe5bffd798c2"></a><!-- doxytag: member="Inotify::FindWatch" ref="a4d6b9d1a9a496862febbe5bffd798c2" args="(const std::string &rPath)" --> +<a class="anchor" name="716ae90a00dd4895709ea9b8f7959075"></a><!-- doxytag: member="Inotify::GetWatchCount" ref="716ae90a00dd4895709ea9b8f7959075" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> * Inotify::FindWatch </td> + <td class="memname">size_t Inotify::GetWatchCount </td> <td>(</td> - <td class="paramtype">const std::string & </td> - <td class="paramname"> <em>rPath</em> </td> + <td class="paramname"> </td> <td> ) </td> - <td width="100%"></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Searches for a watch by a filesystem path. +Returns the count of watches. <p> -It tries to find a watch by the given filesystem path.<p> -<dl compact><dt><b>Parameters:</b></dt><dd> - <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>rPath</em> </td><td>filesystem path </td></tr> - </table> -</dl> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>pointer to a watch; NULL if no such watch exists</dd></dl> -<dl class="attention" compact><dt><b>Attention:</b></dt><dd>The path must be exactly identical to the one used for the searched watch. Be careful about absolute/relative and case-insensitive paths. </dd></dl> +This is the total count of all watches (regardless whether enabled or not).<p> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>count of watches</dd></dl> +<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063" title="Returns the count of enabled watches.">GetEnabledCount()</a> </dd></dl> </div> </div><p> -<a class="anchor" name="678271faf4799840ad71805163a24b13"></a><!-- doxytag: member="Inotify::GetDescriptor" ref="678271faf4799840ad71805163a24b13" args="() const" --> +<a class="anchor" name="287dc0d238fa6edc3269441cb284f979"></a><!-- doxytag: member="Inotify::PeekEvent" ref="287dc0d238fa6edc3269441cb284f979" args="(InotifyEvent &rEvt)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">int Inotify::GetDescriptor </td> + <td class="memname">bool Inotify::PeekEvent </td> <td>(</td> - <td class="paramname"> </td> + <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> & </td> + <td class="paramname"> <em>rEvt</em> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Returns the file descriptor. +Extracts a queued inotify event (without removing). <p> -The descriptor can be used in standard low-level file functions (poll(), select(), fcntl() etc.).<p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>valid file descriptor or -1 for inactive object</dd></dl> -<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b">SetNonBlock()</a> </dd></dl> +The extracted event stays in the queue.<p> +<dl compact><dt><b>Parameters:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"><tt>[in,out]</tt> </td><td valign="top"><em>rEvt</em> </td><td>event object</td></tr> + </table> +</dl> +<dl compact><dt><b>Exceptions:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown only in very anomalous cases </td></tr> + </table> +</dl> </div> </div><p> -<a class="anchor" name="b2c8ab8ad4322fb6f0dae0eae442402b"></a><!-- doxytag: member="Inotify::SetNonBlock" ref="b2c8ab8ad4322fb6f0dae0eae442402b" args="(bool fNonBlock)" --> +<a class="anchor" name="19cde43d082ff92bd02654610019300d"></a><!-- doxytag: member="Inotify::PeekEvent" ref="19cde43d082ff92bd02654610019300d" args="(InotifyEvent *pEvt)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">void Inotify::SetNonBlock </td> + <td class="memname">bool Inotify::PeekEvent </td> <td>(</td> - <td class="paramtype">bool </td> - <td class="paramname"> <em>fNonBlock</em> </td> + <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> * </td> + <td class="paramname"> <em>pEvt</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> </tr> </table> </div> <div class="memdoc"> <p> -Enables/disables non-blocking mode. +Extracts a queued inotify event (without removing). <p> -Use this mode if you want to monitor the descriptor (acquired thru <a class="el" href="classInotify.html#678271faf4799840ad71805163a24b13">GetDescriptor()</a>) in functions such as poll(), select() etc.<p> -Non-blocking mode is disabled by default.<p> +The extracted event stays in the queue. If the pointer is NULL it does nothing.<p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>fNonBlock</em> </td><td>enable/disable non-blocking mode</td></tr> + <tr><td valign="top"><tt>[in,out]</tt> </td><td valign="top"><em>pEvt</em> </td><td>event object</td></tr> </table> </dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if setting mode failed</td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if the provided pointer is NULL </td></tr> </table> </dl> -<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#678271faf4799840ad71805163a24b13">GetDescriptor()</a>, <a class="el" href="classInotify.html#124dd5816205900af61034d47ae65255">SetCloseOnExec()</a> </dd></dl> + +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotify_19cde43d082ff92bd02654610019300d_icgraph.png" border="0" usemap="#classInotify_19cde43d082ff92bd02654610019300d_icgraph_map" alt=""></center> +<map name="classInotify_19cde43d082ff92bd02654610019300d_icgraph_map"> +<area shape="rect" href="classInotify.html#287dc0d238fa6edc3269441cb284f979" title="Extracts a queued inotify event (without removing)." alt="" coords="179,5,304,32"></map> +</div> </div> </div><p> -<a class="anchor" name="124dd5816205900af61034d47ae65255"></a><!-- doxytag: member="Inotify::SetCloseOnExec" ref="124dd5816205900af61034d47ae65255" args="(bool fClOnEx)" --> +<a class="anchor" name="ac1a52b2ff6bfec07021a44e55d496a6"></a><!-- doxytag: member="Inotify::Remove" ref="ac1a52b2ff6bfec07021a44e55d496a6" args="(InotifyWatch &rWatch)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">void Inotify::SetCloseOnExec </td> + <td class="memname">void Inotify::Remove </td> <td>(</td> - <td class="paramtype">bool </td> - <td class="paramname"> <em>fClOnEx</em> </td> + <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> & </td> + <td class="paramname"> <em>rWatch</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Enables/disables closing on exec. +Removes a watch. <p> -Enable this if you want to close the descriptor when executing another program. Otherwise, the descriptor will be inherited.<p> -Closing on exec is disabled by default.<p> +If the given watch is not present it does nothing.<p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>fClOnEx</em> </td><td>enable/disable closing on exec</td></tr> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>rWatch</em> </td><td>inotify watch</td></tr> </table> </dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if setting failed</td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if removing failed </td></tr> </table> </dl> -<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#678271faf4799840ad71805163a24b13">GetDescriptor()</a>, <a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b">SetNonBlock()</a> </dd></dl> </div> </div><p> -<a class="anchor" name="70b3b57e8661fbb4c5bc404b86225c3b"></a><!-- doxytag: member="Inotify::GetCapability" ref="70b3b57e8661fbb4c5bc404b86225c3b" args="(InotifyCapability_t cap)" --> +<a class="anchor" name="21c39bb8e5bbc1941b945c18f9005b84"></a><!-- doxytag: member="Inotify::Remove" ref="21c39bb8e5bbc1941b945c18f9005b84" args="(InotifyWatch *pWatch)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">uint32_t Inotify::GetCapability </td> + <td class="memname">void Inotify::Remove </td> <td>(</td> - <td class="paramtype"><a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a> </td> - <td class="paramname"> <em>cap</em> </td> + <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> * </td> + <td class="paramname"> <em>pWatch</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [static]</code></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> </tr> </table> </div> <div class="memdoc"> <p> -Acquires a particular inotify capability/limit. +Removes a watch. <p> +If the given watch is not present it does nothing.<p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>cap</em> </td><td>capability/limit identifier </td></tr> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>pWatch</em> </td><td>inotify watch</td></tr> </table> </dl> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>capability/limit value </dd></dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if the given value cannot be acquired </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if removing failed </td></tr> </table> </dl> +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.png" border="0" usemap="#classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph_map" alt=""></center> +<map name="classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph_map"> +<area shape="rect" href="classInotify.html#ac1a52b2ff6bfec07021a44e55d496a6" title="Removes a watch." alt="" coords="163,5,272,32"></map> +</div> + +</div> +</div><p> +<a class="anchor" name="bc1fd5830ca561efb69bcd2283981741"></a><!-- doxytag: member="Inotify::RemoveAll" ref="bc1fd5830ca561efb69bcd2283981741" args="()" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void Inotify::RemoveAll </td> + <td>(</td> + <td class="paramname"> </td> + <td> ) </td> + <td></td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +Removes all watches. +<p> + +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.png" border="0" usemap="#classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph_map" alt=""></center> +<map name="classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph_map"> +<area shape="rect" href="classInotify.html#86ae86c43ea1a72f562ca46393309635" title="Removes all watches and closes the inotify device." alt="" coords="179,5,275,32"><area shape="rect" href="classInotify.html#f19dd5e491395673e4798eb9dbf5f682" title="Destructor." alt="" coords="324,5,428,32"></map> +</div> + </div> </div><p> <a class="anchor" name="734538233ba2136164f76f4df6c3654e"></a><!-- doxytag: member="Inotify::SetCapability" ref="734538233ba2136164f76f4df6c3654e" args="(InotifyCapability_t cap, uint32_t val)" --> @@ -785,7 +871,7 @@ Acquires a particular inotify capability/limit. <tr> <td></td> <td>)</td> - <td></td><td></td><td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [static]</code></td> + <td></td><td></td><td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [static]</code></td> </tr> </table> </div> @@ -802,37 +888,54 @@ Modifies a particular inotify capability/limit. </dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if the given value cannot be set </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if the given value cannot be set </td></tr> </table> </dl> <dl class="attention" compact><dt><b>Attention:</b></dt><dd>Using this function requires root privileges. Beware of setting extensive values - it may seriously affect system performance and/or stability. </dd></dl> +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotify_734538233ba2136164f76f4df6c3654e_icgraph.png" border="0" usemap="#classInotify_734538233ba2136164f76f4df6c3654e_icgraph_map" alt=""></center> +<map name="classInotify_734538233ba2136164f76f4df6c3654e_icgraph_map"> +<area shape="rect" href="classInotify.html#66d90ebfa516d4bd1463749def2b58f9" title="Sets the maximum number of events in the kernel queue." alt="" coords="204,5,351,32"><area shape="rect" href="classInotify.html#620c891962fe5acd26485c64e9b28d19" title="Sets the maximum number of inotify instances per process." alt="" coords="196,56,359,83"><area shape="rect" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a" title="Sets the maximum number of inotify watches per instance." alt="" coords="197,107,357,133"></map> +</div> + </div> </div><p> -<a class="anchor" name="d8e4a4a87d005c71c0b5ea9c6dd53c42"></a><!-- doxytag: member="Inotify::GetMaxEvents" ref="d8e4a4a87d005c71c0b5ea9c6dd53c42" args="()" --> +<a class="anchor" name="124dd5816205900af61034d47ae65255"></a><!-- doxytag: member="Inotify::SetCloseOnExec" ref="124dd5816205900af61034d47ae65255" args="(bool fClOnEx)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">static uint32_t Inotify::GetMaxEvents </td> + <td class="memname">void Inotify::SetCloseOnExec </td> <td>(</td> - <td class="paramname"> </td> + <td class="paramtype">bool </td> + <td class="paramname"> <em>fClOnEx</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> </tr> </table> </div> <div class="memdoc"> <p> -Returns the maximum number of events in the kernel queue. +Enables/disables closing on exec. <p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>maximum number of events in the kernel queue </dd></dl> +Enable this if you want to close the descriptor when executing another program. Otherwise, the descriptor will be inherited.<p> +Closing on exec is disabled by default.<p> +<dl compact><dt><b>Parameters:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>fClOnEx</em> </td><td>enable/disable closing on exec</td></tr> + </table> +</dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if the given value cannot be acquired </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if setting failed</td></tr> </table> </dl> +<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9" title="Returns the file descriptor.">GetDescriptor()</a>, <a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b" title="Enables/disables non-blocking mode.">SetNonBlock()</a> </dd></dl> </div> </div><p> @@ -846,7 +949,7 @@ Returns the maximum number of events in the kernel queue. <td class="paramtype">uint32_t </td> <td class="paramname"> <em>val</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td> </tr> </table> </div> @@ -862,59 +965,64 @@ Sets the maximum number of events in the kernel queue. </dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if the given value cannot be set </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if the given value cannot be set </td></tr> </table> </dl> <dl class="attention" compact><dt><b>Attention:</b></dt><dd>Using this function requires root privileges. Beware of setting extensive values - the greater value is set here the more physical memory may be used for the inotify infrastructure. </dd></dl> </div> </div><p> -<a class="anchor" name="c18b7732f67832260fbbd47aebb8af51"></a><!-- doxytag: member="Inotify::GetMaxInstances" ref="c18b7732f67832260fbbd47aebb8af51" args="()" --> +<a class="anchor" name="620c891962fe5acd26485c64e9b28d19"></a><!-- doxytag: member="Inotify::SetMaxInstances" ref="620c891962fe5acd26485c64e9b28d19" args="(uint32_t val)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">static uint32_t Inotify::GetMaxInstances </td> + <td class="memname">static void Inotify::SetMaxInstances </td> <td>(</td> - <td class="paramname"> </td> + <td class="paramtype">uint32_t </td> + <td class="paramname"> <em>val</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Returns the maximum number of inotify instances per process. +Sets the maximum number of inotify instances per process. <p> -It means the maximum number of open inotify file descriptors per running process.<p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>maximum number of inotify instances </dd></dl> +<dl compact><dt><b>Parameters:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>val</em> </td><td>new value </td></tr> + </table> +</dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if the given value cannot be acquired </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if the given value cannot be set </td></tr> </table> </dl> +<dl class="attention" compact><dt><b>Attention:</b></dt><dd>Using this function requires root privileges. Beware of setting extensive values - the greater value is set here the more physical memory may be used for the inotify infrastructure. </dd></dl> </div> </div><p> -<a class="anchor" name="620c891962fe5acd26485c64e9b28d19"></a><!-- doxytag: member="Inotify::SetMaxInstances" ref="620c891962fe5acd26485c64e9b28d19" args="(uint32_t val)" --> +<a class="anchor" name="5064380cdb4a726ab33f3fa18d15c77a"></a><!-- doxytag: member="Inotify::SetMaxWatches" ref="5064380cdb4a726ab33f3fa18d15c77a" args="(uint32_t val)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">static void Inotify::SetMaxInstances </td> + <td class="memname">static void Inotify::SetMaxWatches </td> <td>(</td> <td class="paramtype">uint32_t </td> <td class="paramname"> <em>val</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Sets the maximum number of inotify instances per process. +Sets the maximum number of inotify watches per instance. <p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> @@ -923,71 +1031,79 @@ Sets the maximum number of inotify instances per process. </dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if the given value cannot be set </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if the given value cannot be set </td></tr> </table> </dl> <dl class="attention" compact><dt><b>Attention:</b></dt><dd>Using this function requires root privileges. Beware of setting extensive values - the greater value is set here the more physical memory may be used for the inotify infrastructure. </dd></dl> </div> </div><p> -<a class="anchor" name="86dae1b7a72c0d8fc2a632444a0f2f1f"></a><!-- doxytag: member="Inotify::GetMaxWatches" ref="86dae1b7a72c0d8fc2a632444a0f2f1f" args="()" --> +<a class="anchor" name="b2c8ab8ad4322fb6f0dae0eae442402b"></a><!-- doxytag: member="Inotify::SetNonBlock" ref="b2c8ab8ad4322fb6f0dae0eae442402b" args="(bool fNonBlock)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">static uint32_t Inotify::GetMaxWatches </td> + <td class="memname">void Inotify::SetNonBlock </td> <td>(</td> - <td class="paramname"> </td> + <td class="paramtype">bool </td> + <td class="paramname"> <em>fNonBlock</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> </tr> </table> </div> <div class="memdoc"> <p> -Returns the maximum number of inotify watches per instance. +Enables/disables non-blocking mode. <p> -It means the maximum number of inotify watches per inotify file descriptor.<p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>maximum number of inotify watches </dd></dl> +Use this mode if you want to monitor the descriptor (acquired thru <a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9" title="Returns the file descriptor.">GetDescriptor()</a>) in functions such as poll(), select() etc.<p> +Non-blocking mode is disabled by default.<p> +<dl compact><dt><b>Parameters:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>fNonBlock</em> </td><td>enable/disable non-blocking mode</td></tr> + </table> +</dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if the given value cannot be acquired </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if setting mode failed</td></tr> </table> </dl> +<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9" title="Returns the file descriptor.">GetDescriptor()</a>, <a class="el" href="classInotify.html#124dd5816205900af61034d47ae65255" title="Enables/disables closing on exec.">SetCloseOnExec()</a> </dd></dl> </div> </div><p> -<a class="anchor" name="5064380cdb4a726ab33f3fa18d15c77a"></a><!-- doxytag: member="Inotify::SetMaxWatches" ref="5064380cdb4a726ab33f3fa18d15c77a" args="(uint32_t val)" --> +<a class="anchor" name="139c27c6643bb199619f3eae9b32e53b"></a><!-- doxytag: member="Inotify::WaitForEvents" ref="139c27c6643bb199619f3eae9b32e53b" args="(bool fNoIntr=false)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">static void Inotify::SetMaxWatches </td> + <td class="memname">void Inotify::WaitForEvents </td> <td>(</td> - <td class="paramtype">uint32_t </td> - <td class="paramname"> <em>val</em> </td> + <td class="paramtype">bool </td> + <td class="paramname"> <em>fNoIntr</em> = <code>false</code> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> </tr> </table> </div> <div class="memdoc"> <p> -Sets the maximum number of inotify watches per instance. +Waits for inotify events. <p> +It waits until one or more events occur. When called in nonblocking mode it only retrieves occurred events to the internal queue and exits.<p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>val</em> </td><td>new value </td></tr> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>fNoIntr</em> </td><td>if true it re-calls the system call after a handled signal</td></tr> </table> </dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if the given value cannot be set </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if reading events failed</td></tr> </table> </dl> -<dl class="attention" compact><dt><b>Attention:</b></dt><dd>Using this function requires root privileges. Beware of setting extensive values - the greater value is set here the more physical memory may be used for the inotify infrastructure. </dd></dl> +<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b" title="Enables/disables non-blocking mode.">SetNonBlock()</a> </dd></dl> </div> </div><p> @@ -1007,10 +1123,96 @@ Sets the maximum number of inotify watches per instance. </div> </div><p> +<hr><h2>Member Data Documentation</h2> +<a class="anchor" name="eee7847efd93b681fddac56860fc7958"></a><!-- doxytag: member="Inotify::m_buf" ref="eee7847efd93b681fddac56860fc7958" args="[INOTIFY_BUFLEN]" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">unsigned char <a class="el" href="classInotify.html#eee7847efd93b681fddac56860fc7958">Inotify::m_buf</a>[INOTIFY_BUFLEN]<code> [private]</code> </td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +buffer for events +<p> + +</div> +</div><p> +<a class="anchor" name="0c1d6c969292dbb7c8c1283a3d8f55e0"></a><!-- doxytag: member="Inotify::m_events" ref="0c1d6c969292dbb7c8c1283a3d8f55e0" args="" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">std::deque<<a class="el" href="classInotifyEvent.html">InotifyEvent</a>> <a class="el" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">Inotify::m_events</a><code> [private]</code> </td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +event queue +<p> + +</div> +</div><p> +<a class="anchor" name="95d6d0ecefff77bd3ee50f1586a4552b"></a><!-- doxytag: member="Inotify::m_fd" ref="95d6d0ecefff77bd3ee50f1586a4552b" args="" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int <a class="el" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">Inotify::m_fd</a><code> [private]</code> </td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +file descriptor +<p> + +</div> +</div><p> +<a class="anchor" name="62f275db6375a366023b2e46f73e3ecc"></a><!-- doxytag: member="Inotify::m_paths" ref="62f275db6375a366023b2e46f73e3ecc" args="" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">IN_WP_MAP</a> <a class="el" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">Inotify::m_paths</a><code> [private]</code> </td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +watches (by paths) +<p> + +</div> +</div><p> +<a class="anchor" name="4d07f3a4412028d687936d2479d9a976"></a><!-- doxytag: member="Inotify::m_watches" ref="4d07f3a4412028d687936d2479d9a976" args="" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">IN_WATCH_MAP</a> <a class="el" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">Inotify::m_watches</a><code> [private]</code> </td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +watches (by descriptors) +<p> + +</div> +</div><p> <hr>The documentation for this class was generated from the following files:<ul> -<li><a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a><li><a class="el" href="inotify-cxx_8cpp.html">inotify-cxx.cpp</a></ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +<li><a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a><li><a class="el" href="inotify-cxx_8cpp.html">inotify-cxx.cpp</a></ul> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/classInotifyEvent-members.html b/shared/inotify/doc/html/classInotifyEvent-members.html index 47f8fdc1..6b7bcc31 100644 --- a/shared/inotify/doc/html/classInotifyEvent-members.html +++ b/shared/inotify/doc/html/classInotifyEvent-members.html @@ -1,39 +1,48 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Member List</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="annotated.html"><span>Class List</span></a></li> - <li><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> <h1>InotifyEvent Member List</h1>This is the complete list of members for <a class="el" href="classInotifyEvent.html">InotifyEvent</a>, including all inherited members.<p><table> <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5">DumpTypes</a>(uint32_t uValue, std::string &rStr)</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [static]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#517abc6bd54c57cb767107187ea6a8fd">DumpTypes</a>(std::string &rStr) const</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#441dfd50abda0e81eb7e4f6d33c68e96">GetCookie</a>() const</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#83958af6b634d47173bde81b3bd5bbe6">GetDescriptor</a>() const</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#111954d74f0320745a68ef030064e987">GetLength</a>() const</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#2aadeb49530a62b06d98e22c335b1ec8">GetMask</a>() const</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea">DumpTypes</a>(std::string &rStr) const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17">GetCookie</a>() const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341">GetDescriptor</a>() const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a">GetLength</a>() const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f">GetMask</a>() const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#eced3a88a6dea190c5df19c2a6599010">GetMaskByName</a>(const std::string &rName)</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [static]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#a0524029d360591567c88595cb31df66">GetName</a>() const</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#e053c52feebf6dae5a762e6baeba93db">GetName</a>(std::string &rName) const</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097">GetName</a>() const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f">GetName</a>(std::string &rName) const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">GetWatch</a>()</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046">InotifyEvent</a>()</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#6d7f3fc0f51580da4a3ec2348609df64">InotifyEvent</a>(const struct inotify_event *pEvt, InotifyWatch *pWatch)</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">IsType</a>(uint32_t uValue, uint32_t uType)</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline, static]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#7fdee6664ec63ccc87ff1221abba9abc">IsType</a>(uint32_t uType) const</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#477ae71116ec393434a1f62a7170a156">IsType</a>(uint32_t uType) const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">m_name</a></td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [private]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">m_pWatch</a></td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [private]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">m_uCookie</a></td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [private]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">m_uMask</a></td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [private]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888">~InotifyEvent</a>()</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr> -</table><hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</table></div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/classInotifyEvent.html b/shared/inotify/doc/html/classInotifyEvent.html index 7b864a5c..ccc3c517 100644 --- a/shared/inotify/doc/html/classInotifyEvent.html +++ b/shared/inotify/doc/html/classInotifyEvent.html @@ -1,25 +1,39 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: InotifyEvent Class Reference</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="annotated.html"><span>Class List</span></a></li> - <li><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> <h1>InotifyEvent Class Reference</h1><!-- doxytag: class="InotifyEvent" -->inotify event class <a href="#_details">More...</a> <p> -<code>#include <<a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a>></code> +<code>#include <<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>></code> +<p> +<div class="dynheader"> +Collaboration diagram for InotifyEvent:</div> +<div class="dynsection"> +<p><center><img src="classInotifyEvent__coll__graph.png" border="0" usemap="#InotifyEvent__coll__map" alt="Collaboration graph"></center> +<map name="InotifyEvent__coll__map"> +<area shape="rect" href="classInotifyWatch.html" title="inotify watch class" alt="" coords="5,96,99,123"><area shape="rect" href="classInotify.html" title="inotify class" alt="" coords="24,5,80,32"></map> +<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center></div> + <p> <a href="classInotifyEvent-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0"> <tr><td></td></tr> @@ -33,33 +47,33 @@ <tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888">~InotifyEvent</a> ()</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <a href="#a48030da1d3a1b1741ca791c9e129888"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#83958af6b634d47173bde81b3bd5bbe6">GetDescriptor</a> () const</td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341">GetDescriptor</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the event watch descriptor. <a href="#83958af6b634d47173bde81b3bd5bbe6"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#2aadeb49530a62b06d98e22c335b1ec8">GetMask</a> () const</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the event watch descriptor. <a href="#463aacc1f660fbc1c39108feb2601341"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f">GetMask</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the event mask. <a href="#2aadeb49530a62b06d98e22c335b1ec8"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#7fdee6664ec63ccc87ff1221abba9abc">IsType</a> (uint32_t uType) const</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the event mask. <a href="#c7160544f6f4f24611df57a4422ac47f"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#477ae71116ec393434a1f62a7170a156">IsType</a> (uint32_t uType) const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Checks for the event type. <a href="#7fdee6664ec63ccc87ff1221abba9abc"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#441dfd50abda0e81eb7e4f6d33c68e96">GetCookie</a> () const</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Checks for the event type. <a href="#477ae71116ec393434a1f62a7170a156"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17">GetCookie</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the event cookie. <a href="#441dfd50abda0e81eb7e4f6d33c68e96"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#111954d74f0320745a68ef030064e987">GetLength</a> () const</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the event cookie. <a href="#7e65e49f7d0f11c71442e31d688e4b17"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a">GetLength</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the event name length. <a href="#111954d74f0320745a68ef030064e987"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">const std::string & </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#a0524029d360591567c88595cb31df66">GetName</a> () const</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the event name length. <a href="#30c8c2e1e490b8968ab9cb3364fe579a"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">const std::string & </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097">GetName</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the event name. <a href="#a0524029d360591567c88595cb31df66"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#e053c52feebf6dae5a762e6baeba93db">GetName</a> (std::string &rName) const</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the event name. <a href="#5ab91d587bdc7ab3c18c6cdff73f3097"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f">GetName</a> (std::string &rName) const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Extracts the event name. <a href="#e053c52feebf6dae5a762e6baeba93db"></a><br></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Extracts the event name. <a href="#3aea2437ba8553be703d91b45247a68f"></a><br></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">GetWatch</a> ()</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the source watch. <a href="#979cd46f53ed674331a5a6d47d1cde92"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#517abc6bd54c57cb767107187ea6a8fd">DumpTypes</a> (std::string &rStr) const</td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea">DumpTypes</a> (std::string &rStr) const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Fills the string with all types contained in the event mask. <a href="#517abc6bd54c57cb767107187ea6a8fd"></a><br></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Fills the string with all types contained in the event mask. <a href="#3e5d18ff8dea01d14286e4b44a2b76ea"></a><br></td></tr> <tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">IsType</a> (uint32_t uValue, uint32_t uType)</td></tr> @@ -70,14 +84,25 @@ <tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5">DumpTypes</a> (uint32_t uValue, std::string &rStr)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Fills the string with all types contained in an event mask value. <a href="#c08a0a26ea33dbe94aaf1ac830c103a5"></a><br></td></tr> +<tr><td colspan="2"><br><h2>Private Attributes</h2></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">m_uMask</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">mask <a href="#739a943357af0c3fafd58466803e04fa"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">m_uCookie</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">cookie <a href="#bf417d466fb0173d337cc66539ee55af"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">std::string </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">m_name</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">name <a href="#6c507a3466515aedc266bdc267079604"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">m_pWatch</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">source watch <a href="#2d151cdcc547ee4ce49cfd44328d87ac"></a><br></td></tr> </table> <hr><a name="_details"></a><h2>Detailed Description</h2> inotify event class <p> It holds all information about inotify event and provides access to its particular values.<p> -This class is not (and is not intended to be) thread-safe and therefore it must not be used concurrently in multiple threads. -<p> -<hr><h2>Constructor & Destructor Documentation</h2> +This class is not (and is not intended to be) thread-safe and therefore it must not be used concurrently in multiple threads. <hr><h2>Constructor & Destructor Documentation</h2> <a class="anchor" name="f416dbbd4e6ddd3c0eea6cb540f0b046"></a><!-- doxytag: member="InotifyEvent::InotifyEvent" ref="f416dbbd4e6ddd3c0eea6cb540f0b046" args="()" --> <div class="memitem"> <div class="memproto"> @@ -87,7 +112,7 @@ This class is not (and is not intended to be) thread-safe and therefore it must <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"><code> [inline]</code></td> + <td><code> [inline]</code></td> </tr> </table> </div> @@ -118,7 +143,7 @@ Creates a plain event. <tr> <td></td> <td>)</td> - <td></td><td></td><td width="100%"><code> [inline]</code></td> + <td></td><td></td><td><code> [inline]</code></td> </tr> </table> </div> @@ -127,7 +152,7 @@ Creates a plain event. <p> Constructor. <p> -Creates an event based on inotify event data. For NULL pointers it works the same way as <a class="el" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046">InotifyEvent()</a>.<p> +Creates an event based on inotify event data. For NULL pointers it works the same way as <a class="el" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046" title="Constructor.">InotifyEvent()</a>.<p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>pEvt</em> </td><td>event data </td></tr> @@ -146,7 +171,7 @@ Creates an event based on inotify event data. For NULL pointers it works the sam <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"><code> [inline]</code></td> + <td><code> [inline]</code></td> </tr> </table> </div> @@ -159,58 +184,39 @@ Destructor. </div> </div><p> <hr><h2>Member Function Documentation</h2> -<a class="anchor" name="83958af6b634d47173bde81b3bd5bbe6"></a><!-- doxytag: member="InotifyEvent::GetDescriptor" ref="83958af6b634d47173bde81b3bd5bbe6" args="() const" --> +<a class="anchor" name="3e5d18ff8dea01d14286e4b44a2b76ea"></a><!-- doxytag: member="InotifyEvent::DumpTypes" ref="3e5d18ff8dea01d14286e4b44a2b76ea" args="(std::string &rStr) const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">int32_t InotifyEvent::GetDescriptor </td> - <td>(</td> - <td class="paramname"> </td> - <td> ) </td> - <td width="100%"> const</td> - </tr> - </table> -</div> -<div class="memdoc"> - -<p> -Returns the event watch descriptor. -<p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>watch descriptor</dd></dl> -<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotifyWatch.html#df771e1f81e2a6cc2780c9d2470e34c6">InotifyWatch::GetDescriptor()</a> </dd></dl> - -</div> -</div><p> -<a class="anchor" name="2aadeb49530a62b06d98e22c335b1ec8"></a><!-- doxytag: member="InotifyEvent::GetMask" ref="2aadeb49530a62b06d98e22c335b1ec8" args="() const" --> -<div class="memitem"> -<div class="memproto"> - <table class="memname"> - <tr> - <td class="memname">uint32_t InotifyEvent::GetMask </td> + <td class="memname">void InotifyEvent::DumpTypes </td> <td>(</td> - <td class="paramname"> </td> + <td class="paramtype">std::string & </td> + <td class="paramname"> <em>rStr</em> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const</td> </tr> </table> </div> <div class="memdoc"> <p> -Returns the event mask. +Fills the string with all types contained in the event mask. <p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>event mask</dd></dl> -<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotifyWatch.html#bab761a989c9fdf73aaad2a58e1ba7a0">InotifyWatch::GetMask()</a> </dd></dl> +<dl compact><dt><b>Parameters:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"><tt>[out]</tt> </td><td valign="top"><em>rStr</em> </td><td>dumped event types </td></tr> + </table> +</dl> </div> </div><p> -<a class="anchor" name="309ebf3c5b131522295185a926d551bb"></a><!-- doxytag: member="InotifyEvent::IsType" ref="309ebf3c5b131522295185a926d551bb" args="(uint32_t uValue, uint32_t uType)" --> +<a class="anchor" name="c08a0a26ea33dbe94aaf1ac830c103a5"></a><!-- doxytag: member="InotifyEvent::DumpTypes" ref="c08a0a26ea33dbe94aaf1ac830c103a5" args="(uint32_t uValue, std::string &rStr)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">static bool InotifyEvent::IsType </td> + <td class="memname">void InotifyEvent::DumpTypes </td> <td>(</td> <td class="paramtype">uint32_t </td> <td class="paramname"> <em>uValue</em>, </td> @@ -218,82 +224,85 @@ Returns the event mask. <tr> <td class="paramkey"></td> <td></td> - <td class="paramtype">uint32_t </td> - <td class="paramname"> <em>uType</em></td><td> </td> + <td class="paramtype">std::string & </td> + <td class="paramname"> <em>rStr</em></td><td> </td> </tr> <tr> <td></td> <td>)</td> - <td></td><td></td><td width="100%"><code> [inline, static]</code></td> + <td></td><td></td><td><code> [static]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Checks a value for the event type. +Fills the string with all types contained in an event mask value. <p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>uValue</em> </td><td>checked value </td></tr> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>uType</em> </td><td>type which is checked for </td></tr> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>uValue</em> </td><td>event mask value </td></tr> + <tr><td valign="top"><tt>[out]</tt> </td><td valign="top"><em>rStr</em> </td><td>dumped event types </td></tr> </table> </dl> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>true = the value contains the given type, false = otherwise </dd></dl> + +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.png" border="0" usemap="#classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph_map" alt=""></center> +<map name="classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph_map"> +<area shape="rect" href="classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea" title="Fills the string with all types contained in the event mask." alt="" coords="220,5,383,32"></map> +</div> </div> </div><p> -<a class="anchor" name="7fdee6664ec63ccc87ff1221abba9abc"></a><!-- doxytag: member="InotifyEvent::IsType" ref="7fdee6664ec63ccc87ff1221abba9abc" args="(uint32_t uType) const" --> +<a class="anchor" name="7e65e49f7d0f11c71442e31d688e4b17"></a><!-- doxytag: member="InotifyEvent::GetCookie" ref="7e65e49f7d0f11c71442e31d688e4b17" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">bool InotifyEvent::IsType </td> + <td class="memname">uint32_t InotifyEvent::GetCookie </td> <td>(</td> - <td class="paramtype">uint32_t </td> - <td class="paramname"> <em>uType</em> </td> + <td class="paramname"> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Checks for the event type. +Returns the event cookie. <p> -<dl compact><dt><b>Parameters:</b></dt><dd> - <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>uType</em> </td><td>type which is checked for </td></tr> - </table> -</dl> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>true = event mask contains the given type, false = otherwise </dd></dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>event cookie </dd></dl> </div> </div><p> -<a class="anchor" name="441dfd50abda0e81eb7e4f6d33c68e96"></a><!-- doxytag: member="InotifyEvent::GetCookie" ref="441dfd50abda0e81eb7e4f6d33c68e96" args="() const" --> +<a class="anchor" name="463aacc1f660fbc1c39108feb2601341"></a><!-- doxytag: member="InotifyEvent::GetDescriptor" ref="463aacc1f660fbc1c39108feb2601341" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">uint32_t InotifyEvent::GetCookie </td> + <td class="memname">int32_t InotifyEvent::GetDescriptor </td> <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const</td> </tr> </table> </div> <div class="memdoc"> <p> -Returns the event cookie. +Returns the event watch descriptor. <p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>event cookie </dd></dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>watch descriptor</dd></dl> +<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59" title="Returns the watch descriptor.">InotifyWatch::GetDescriptor()</a> </dd></dl> </div> </div><p> -<a class="anchor" name="111954d74f0320745a68ef030064e987"></a><!-- doxytag: member="InotifyEvent::GetLength" ref="111954d74f0320745a68ef030064e987" args="() const" --> +<a class="anchor" name="30c8c2e1e490b8968ab9cb3364fe579a"></a><!-- doxytag: member="InotifyEvent::GetLength" ref="30c8c2e1e490b8968ab9cb3364fe579a" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -302,7 +311,7 @@ Returns the event cookie. <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> @@ -315,29 +324,67 @@ Returns the event name length. </div> </div><p> -<a class="anchor" name="a0524029d360591567c88595cb31df66"></a><!-- doxytag: member="InotifyEvent::GetName" ref="a0524029d360591567c88595cb31df66" args="() const" --> +<a class="anchor" name="c7160544f6f4f24611df57a4422ac47f"></a><!-- doxytag: member="InotifyEvent::GetMask" ref="c7160544f6f4f24611df57a4422ac47f" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">const std::string& InotifyEvent::GetName </td> + <td class="memname">uint32_t InotifyEvent::GetMask </td> <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Returns the event name. +Returns the event mask. <p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>event name </dd></dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>event mask</dd></dl> +<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009" title="Returns the watch event mask.">InotifyWatch::GetMask()</a> </dd></dl> + +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.png" border="0" usemap="#classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph_map" alt=""></center> +<map name="classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph_map"> +<area shape="rect" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="204,5,351,32"></map> +</div> </div> </div><p> -<a class="anchor" name="e053c52feebf6dae5a762e6baeba93db"></a><!-- doxytag: member="InotifyEvent::GetName" ref="e053c52feebf6dae5a762e6baeba93db" args="(std::string &rName) const" --> +<a class="anchor" name="eced3a88a6dea190c5df19c2a6599010"></a><!-- doxytag: member="InotifyEvent::GetMaskByName" ref="eced3a88a6dea190c5df19c2a6599010" args="(const std::string &rName)" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t InotifyEvent::GetMaskByName </td> + <td>(</td> + <td class="paramtype">const std::string & </td> + <td class="paramname"> <em>rName</em> </td> + <td> ) </td> + <td><code> [static]</code></td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +Finds the appropriate mask for a name. +<p> +<dl compact><dt><b>Parameters:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>rName</em> </td><td>mask name </td></tr> + </table> +</dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>mask for name; 0 on failure </dd></dl> + +</div> +</div><p> +<a class="anchor" name="3aea2437ba8553be703d91b45247a68f"></a><!-- doxytag: member="InotifyEvent::GetName" ref="3aea2437ba8553be703d91b45247a68f" args="(std::string &rName) const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -347,7 +394,7 @@ Returns the event name. <td class="paramtype">std::string & </td> <td class="paramname"> <em>rName</em> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> @@ -364,6 +411,37 @@ Extracts the event name. </div> </div><p> +<a class="anchor" name="5ab91d587bdc7ab3c18c6cdff73f3097"></a><!-- doxytag: member="InotifyEvent::GetName" ref="5ab91d587bdc7ab3c18c6cdff73f3097" args="() const " --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">const std::string& InotifyEvent::GetName </td> + <td>(</td> + <td class="paramname"> </td> + <td> ) </td> + <td> const<code> [inline]</code></td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +Returns the event name. +<p> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>event name </dd></dl> + +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.png" border="0" usemap="#classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph_map" alt=""></center> +<map name="classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph_map"> +<area shape="rect" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f" title="Extracts the event name." alt="" coords="207,5,356,32"></map> +</div> + +</div> +</div><p> <a class="anchor" name="979cd46f53ed674331a5a6d47d1cde92"></a><!-- doxytag: member="InotifyEvent::GetWatch" ref="979cd46f53ed674331a5a6d47d1cde92" args="()" --> <div class="memitem"> <div class="memproto"> @@ -373,7 +451,7 @@ Extracts the event name. <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"><code> [inline]</code></td> + <td><code> [inline]</code></td> </tr> </table> </div> @@ -386,40 +464,40 @@ Returns the source watch. </div> </div><p> -<a class="anchor" name="eced3a88a6dea190c5df19c2a6599010"></a><!-- doxytag: member="InotifyEvent::GetMaskByName" ref="eced3a88a6dea190c5df19c2a6599010" args="(const std::string &rName)" --> +<a class="anchor" name="477ae71116ec393434a1f62a7170a156"></a><!-- doxytag: member="InotifyEvent::IsType" ref="477ae71116ec393434a1f62a7170a156" args="(uint32_t uType) const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">uint32_t InotifyEvent::GetMaskByName </td> + <td class="memname">bool InotifyEvent::IsType </td> <td>(</td> - <td class="paramtype">const std::string & </td> - <td class="paramname"> <em>rName</em> </td> + <td class="paramtype">uint32_t </td> + <td class="paramname"> <em>uType</em> </td> <td> ) </td> - <td width="100%"><code> [static]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Finds the appropriate mask for a name. +Checks for the event type. <p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>rName</em> </td><td>mask name </td></tr> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>uType</em> </td><td>type which is checked for </td></tr> </table> </dl> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>mask for name; 0 on failure </dd></dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>true = event mask contains the given type, false = otherwise </dd></dl> </div> </div><p> -<a class="anchor" name="c08a0a26ea33dbe94aaf1ac830c103a5"></a><!-- doxytag: member="InotifyEvent::DumpTypes" ref="c08a0a26ea33dbe94aaf1ac830c103a5" args="(uint32_t uValue, std::string &rStr)" --> +<a class="anchor" name="309ebf3c5b131522295185a926d551bb"></a><!-- doxytag: member="InotifyEvent::IsType" ref="309ebf3c5b131522295185a926d551bb" args="(uint32_t uValue, uint32_t uType)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">void InotifyEvent::DumpTypes </td> + <td class="memname">static bool InotifyEvent::IsType </td> <td>(</td> <td class="paramtype">uint32_t </td> <td class="paramname"> <em>uValue</em>, </td> @@ -427,61 +505,113 @@ Finds the appropriate mask for a name. <tr> <td class="paramkey"></td> <td></td> - <td class="paramtype">std::string & </td> - <td class="paramname"> <em>rStr</em></td><td> </td> + <td class="paramtype">uint32_t </td> + <td class="paramname"> <em>uType</em></td><td> </td> </tr> <tr> <td></td> <td>)</td> - <td></td><td></td><td width="100%"><code> [static]</code></td> + <td></td><td></td><td><code> [inline, static]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Fills the string with all types contained in an event mask value. +Checks a value for the event type. <p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>uValue</em> </td><td>event mask value </td></tr> - <tr><td valign="top"><tt>[out]</tt> </td><td valign="top"><em>rStr</em> </td><td>dumped event types </td></tr> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>uValue</em> </td><td>checked value </td></tr> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>uType</em> </td><td>type which is checked for </td></tr> </table> </dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>true = the value contains the given type, false = otherwise </dd></dl> + +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.png" border="0" usemap="#classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph_map" alt=""></center> +<map name="classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph_map"> +<area shape="rect" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5" title="Fills the string with all types contained in an event mask value." alt="" coords="188,5,351,32"><area shape="rect" href="classInotifyEvent.html#477ae71116ec393434a1f62a7170a156" title="Checks for the event type." alt="" coords="203,56,336,83"><area shape="rect" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="196,107,343,133"><area shape="rect" href="classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea" title="Fills the string with all types contained in the event mask." alt="" coords="401,5,564,32"></map> +</div> </div> </div><p> -<a class="anchor" name="517abc6bd54c57cb767107187ea6a8fd"></a><!-- doxytag: member="InotifyEvent::DumpTypes" ref="517abc6bd54c57cb767107187ea6a8fd" args="(std::string &rStr) const" --> +<hr><h2>Member Data Documentation</h2> +<a class="anchor" name="6c507a3466515aedc266bdc267079604"></a><!-- doxytag: member="InotifyEvent::m_name" ref="6c507a3466515aedc266bdc267079604" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">void InotifyEvent::DumpTypes </td> - <td>(</td> - <td class="paramtype">std::string & </td> - <td class="paramname"> <em>rStr</em> </td> - <td> ) </td> - <td width="100%"> const</td> + <td class="memname">std::string <a class="el" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">InotifyEvent::m_name</a><code> [private]</code> </td> </tr> </table> </div> <div class="memdoc"> <p> -Fills the string with all types contained in the event mask. +name +<p> + +</div> +</div><p> +<a class="anchor" name="2d151cdcc547ee4ce49cfd44328d87ac"></a><!-- doxytag: member="InotifyEvent::m_pWatch" ref="2d151cdcc547ee4ce49cfd44328d87ac" args="" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="classInotifyWatch.html">InotifyWatch</a>* <a class="el" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">InotifyEvent::m_pWatch</a><code> [private]</code> </td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +source watch +<p> + +</div> +</div><p> +<a class="anchor" name="bf417d466fb0173d337cc66539ee55af"></a><!-- doxytag: member="InotifyEvent::m_uCookie" ref="bf417d466fb0173d337cc66539ee55af" args="" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t <a class="el" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">InotifyEvent::m_uCookie</a><code> [private]</code> </td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +cookie +<p> + +</div> +</div><p> +<a class="anchor" name="739a943357af0c3fafd58466803e04fa"></a><!-- doxytag: member="InotifyEvent::m_uMask" ref="739a943357af0c3fafd58466803e04fa" args="" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t <a class="el" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">InotifyEvent::m_uMask</a><code> [private]</code> </td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +mask <p> -<dl compact><dt><b>Parameters:</b></dt><dd> - <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[out]</tt> </td><td valign="top"><em>rStr</em> </td><td>dumped event types </td></tr> - </table> -</dl> </div> </div><p> <hr>The documentation for this class was generated from the following files:<ul> -<li><a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a><li><a class="el" href="inotify-cxx_8cpp.html">inotify-cxx.cpp</a></ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +<li><a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a><li><a class="el" href="inotify-cxx_8cpp.html">inotify-cxx.cpp</a></ul> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.map b/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.map new file mode 100644 index 00000000..e31ea0ca --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.map @@ -0,0 +1,4 @@ +<area shape="rect" href="$classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5" title="Fills the string with all types contained in an event mask value." alt="" coords="188,5,351,32"> +<area shape="rect" href="$classInotifyEvent.html#477ae71116ec393434a1f62a7170a156" title="Checks for the event type." alt="" coords="203,56,336,83"> +<area shape="rect" href="$classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="196,107,343,133"> +<area shape="rect" href="$classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea" title="Fills the string with all types contained in the event mask." alt="" coords="401,5,564,32"> diff --git a/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.md5 b/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.md5 new file mode 100644 index 00000000..c108d32f --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.md5 @@ -0,0 +1 @@ +80a24dfdb3ffd06ee1dfd925cc6feb7e
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.png b/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.png Binary files differnew file mode 100644 index 00000000..72a734da --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.png diff --git a/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.map b/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.map new file mode 100644 index 00000000..61683c0b --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.map @@ -0,0 +1 @@ +<area shape="rect" href="$classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f" title="Extracts the event name." alt="" coords="207,5,356,32"> diff --git a/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.md5 b/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.md5 new file mode 100644 index 00000000..390b7f98 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.md5 @@ -0,0 +1 @@ +eeb67887bd904a352d248b3a661c09ac
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.png b/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.png Binary files differnew file mode 100644 index 00000000..66409056 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.png diff --git a/shared/inotify/doc/html/classInotifyEvent__coll__graph.map b/shared/inotify/doc/html/classInotifyEvent__coll__graph.map new file mode 100644 index 00000000..fc3ab859 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent__coll__graph.map @@ -0,0 +1,2 @@ +<area shape="rect" href="$classInotifyWatch.html" title="inotify watch class" alt="" coords="5,96,99,123"> +<area shape="rect" href="$classInotify.html" title="inotify class" alt="" coords="24,5,80,32"> diff --git a/shared/inotify/doc/html/classInotifyEvent__coll__graph.md5 b/shared/inotify/doc/html/classInotifyEvent__coll__graph.md5 new file mode 100644 index 00000000..6d1a7d05 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent__coll__graph.md5 @@ -0,0 +1 @@ +10fc9c98fa3b1e02aafb36817e9e1285
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotifyEvent__coll__graph.png b/shared/inotify/doc/html/classInotifyEvent__coll__graph.png Binary files differnew file mode 100644 index 00000000..8c7ee763 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent__coll__graph.png diff --git a/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.map b/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.map new file mode 100644 index 00000000..1d81e141 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.map @@ -0,0 +1 @@ +<area shape="rect" href="$classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea" title="Fills the string with all types contained in the event mask." alt="" coords="220,5,383,32"> diff --git a/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.md5 b/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.md5 new file mode 100644 index 00000000..2875d2e2 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.md5 @@ -0,0 +1 @@ +ebd2a62891a75f2964da29826a4d947b
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.png b/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.png Binary files differnew file mode 100644 index 00000000..85b50381 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.png diff --git a/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.map b/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.map new file mode 100644 index 00000000..15b19bcc --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.map @@ -0,0 +1 @@ +<area shape="rect" href="$classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="204,5,351,32"> diff --git a/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.md5 b/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.md5 new file mode 100644 index 00000000..97058b10 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.md5 @@ -0,0 +1 @@ +c6ebbbab9c151deb92ff69c8b2dd93a1
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.png b/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.png Binary files differnew file mode 100644 index 00000000..6ede661d --- /dev/null +++ b/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.png diff --git a/shared/inotify/doc/html/classInotifyException-members.html b/shared/inotify/doc/html/classInotifyException-members.html index edd5ac6b..27079a8a 100644 --- a/shared/inotify/doc/html/classInotifyException-members.html +++ b/shared/inotify/doc/html/classInotifyException-members.html @@ -1,31 +1,36 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Member List</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="annotated.html"><span>Class List</span></a></li> - <li><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> <h1>InotifyException Member List</h1>This is the complete list of members for <a class="el" href="classInotifyException.html">InotifyException</a>, including all inherited members.<p><table> - <tr class="memlist"><td><a class="el" href="classInotifyException.html#3fda7827f1561f610e40bcd217bdc6fe">GetErrorNumber</a>() const</td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [inline]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyException.html#1c19a6c919c76332c95970ce7983d016">GetMessage</a>() const</td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [inline]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyException.html#568200b75da77cc24927922760b3a5d3">GetSource</a>() const</td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d">GetErrorNumber</a>() const </td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyException.html#6364ea375697356805d47cff957dd757">GetMessage</a>() const </td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408">GetSource</a>() const </td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb">InotifyException</a>(const std::string &rMsg="", int iErr=0, void *pSrc=NULL)</td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">m_err</a></td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [protected]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">m_msg</a></td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [protected]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">m_pSrc</a></td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [mutable, protected]</code></td></tr> -</table><hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</table></div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/classInotifyException.html b/shared/inotify/doc/html/classInotifyException.html index 6e5f01e5..6b3b55bf 100644 --- a/shared/inotify/doc/html/classInotifyException.html +++ b/shared/inotify/doc/html/classInotifyException.html @@ -1,25 +1,32 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: InotifyException Class Reference</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="annotated.html"><span>Class List</span></a></li> - <li><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> <h1>InotifyException Class Reference</h1><!-- doxytag: class="InotifyException" -->Class for inotify exceptions. <a href="#_details">More...</a> <p> -<code>#include <<a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a>></code> +<code>#include <<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>></code> +<p> + <p> <a href="classInotifyException-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0"> <tr><td></td></tr> @@ -27,15 +34,15 @@ <tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb">InotifyException</a> (const std::string &rMsg="", int iErr=0, void *pSrc=NULL)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <a href="#900dc29e5cfb3ece6c1651d04773b2bb"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">const std::string & </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#1c19a6c919c76332c95970ce7983d016">GetMessage</a> () const</td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">const std::string & </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#6364ea375697356805d47cff957dd757">GetMessage</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the exception message. <a href="#1c19a6c919c76332c95970ce7983d016"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#3fda7827f1561f610e40bcd217bdc6fe">GetErrorNumber</a> () const</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the exception message. <a href="#6364ea375697356805d47cff957dd757"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d">GetErrorNumber</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the exception error number. <a href="#3fda7827f1561f610e40bcd217bdc6fe"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#568200b75da77cc24927922760b3a5d3">GetSource</a> () const</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the exception error number. <a href="#60d885f998a6cb97d06111e6aded155d"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408">GetSource</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the exception source. <a href="#568200b75da77cc24927922760b3a5d3"></a><br></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the exception source. <a href="#619e8b963faebdefb283d79b5ae5c408"></a><br></td></tr> <tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">std::string </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">m_msg</a></td></tr> @@ -51,9 +58,7 @@ Class for inotify exceptions. <p> This class allows to acquire information about exceptional events. It makes easier to log or display error messages and to identify problematic code locations.<p> -Although this class is basically thread-safe it is not intended to be shared between threads. -<p> -<hr><h2>Constructor & Destructor Documentation</h2> +Although this class is basically thread-safe it is not intended to be shared between threads. <hr><h2>Constructor & Destructor Documentation</h2> <a class="anchor" name="900dc29e5cfb3ece6c1651d04773b2bb"></a><!-- doxytag: member="InotifyException::InotifyException" ref="900dc29e5cfb3ece6c1651d04773b2bb" args="(const std::string &rMsg="", int iErr=0, void *pSrc=NULL)" --> <div class="memitem"> <div class="memproto"> @@ -79,7 +84,7 @@ Although this class is basically thread-safe it is not intended to be shared bet <tr> <td></td> <td>)</td> - <td></td><td></td><td width="100%"><code> [inline]</code></td> + <td></td><td></td><td><code> [inline]</code></td> </tr> </table> </div> @@ -99,52 +104,52 @@ Constructor. </div> </div><p> <hr><h2>Member Function Documentation</h2> -<a class="anchor" name="1c19a6c919c76332c95970ce7983d016"></a><!-- doxytag: member="InotifyException::GetMessage" ref="1c19a6c919c76332c95970ce7983d016" args="() const" --> +<a class="anchor" name="60d885f998a6cb97d06111e6aded155d"></a><!-- doxytag: member="InotifyException::GetErrorNumber" ref="60d885f998a6cb97d06111e6aded155d" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">const std::string& InotifyException::GetMessage </td> + <td class="memname">int InotifyException::GetErrorNumber </td> <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Returns the exception message. +Returns the exception error number. <p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>message </dd></dl> +If not applicable this value is 0 (zero).<p> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>error number (standardized; see errno.h) </dd></dl> </div> </div><p> -<a class="anchor" name="3fda7827f1561f610e40bcd217bdc6fe"></a><!-- doxytag: member="InotifyException::GetErrorNumber" ref="3fda7827f1561f610e40bcd217bdc6fe" args="() const" --> +<a class="anchor" name="6364ea375697356805d47cff957dd757"></a><!-- doxytag: member="InotifyException::GetMessage" ref="6364ea375697356805d47cff957dd757" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">int InotifyException::GetErrorNumber </td> + <td class="memname">const std::string& InotifyException::GetMessage </td> <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Returns the exception error number. +Returns the exception message. <p> -If not applicable this value is 0 (zero).<p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>error number (standardized; see errno.h) </dd></dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>message </dd></dl> </div> </div><p> -<a class="anchor" name="568200b75da77cc24927922760b3a5d3"></a><!-- doxytag: member="InotifyException::GetSource" ref="568200b75da77cc24927922760b3a5d3" args="() const" --> +<a class="anchor" name="619e8b963faebdefb283d79b5ae5c408"></a><!-- doxytag: member="InotifyException::GetSource" ref="619e8b963faebdefb283d79b5ae5c408" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -153,7 +158,7 @@ If not applicable this value is 0 (zero).<p> <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> @@ -167,36 +172,36 @@ Returns the exception source. </div> </div><p> <hr><h2>Member Data Documentation</h2> -<a class="anchor" name="c113719bd6f4352e12876b2322f1c92c"></a><!-- doxytag: member="InotifyException::m_msg" ref="c113719bd6f4352e12876b2322f1c92c" args="" --> +<a class="anchor" name="aa8a163c661ce70e34b3e3e7ad700854"></a><!-- doxytag: member="InotifyException::m_err" ref="aa8a163c661ce70e34b3e3e7ad700854" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">std::string <a class="el" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">InotifyException::m_msg</a><code> [protected]</code> </td> + <td class="memname">int <a class="el" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">InotifyException::m_err</a><code> [protected]</code> </td> </tr> </table> </div> <div class="memdoc"> <p> -message +error number <p> </div> </div><p> -<a class="anchor" name="aa8a163c661ce70e34b3e3e7ad700854"></a><!-- doxytag: member="InotifyException::m_err" ref="aa8a163c661ce70e34b3e3e7ad700854" args="" --> +<a class="anchor" name="c113719bd6f4352e12876b2322f1c92c"></a><!-- doxytag: member="InotifyException::m_msg" ref="c113719bd6f4352e12876b2322f1c92c" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">int <a class="el" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">InotifyException::m_err</a><code> [protected]</code> </td> + <td class="memname">std::string <a class="el" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">InotifyException::m_msg</a><code> [protected]</code> </td> </tr> </table> </div> <div class="memdoc"> <p> -error number +message <p> </div> @@ -219,9 +224,9 @@ source </div> </div><p> <hr>The documentation for this class was generated from the following file:<ul> -<li><a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a></ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +<li><a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a></ul> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/classInotifyWatch-members.html b/shared/inotify/doc/html/classInotifyWatch-members.html index 1809af8b..00668fc3 100644 --- a/shared/inotify/doc/html/classInotifyWatch-members.html +++ b/shared/inotify/doc/html/classInotifyWatch-members.html @@ -1,35 +1,46 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Member List</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="annotated.html"><span>Class List</span></a></li> - <li><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> <h1>InotifyWatch Member List</h1>This is the complete list of members for <a class="el" href="classInotifyWatch.html">InotifyWatch</a>, including all inherited members.<p><table> - <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#df771e1f81e2a6cc2780c9d2470e34c6">GetDescriptor</a>() const</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#804cdc1e9579a075a60c239b202559f4">__Disable</a>()</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [private]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59">GetDescriptor</a>() const </td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0">GetInotify</a>()</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#bab761a989c9fdf73aaad2a58e1ba7a0">GetMask</a>() const</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#89f897a4d98fa54de27730dd8be67966">GetPath</a>() const</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009">GetMask</a>() const </td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2">GetPath</a>() const </td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#94bfb861dc18ca5d16abfcff90db8c86">Inotify</a> class</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [friend]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9">InotifyWatch</a>(const std::string &rPath, int32_t uMask, bool fEnabled=true)</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#3d2a5c58a07449bc6ff192f6c14c4de0">IsEnabled</a>() const</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> - <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#1c8ab316b54cb7d1d0b17cbbe6b7d2f8">IsRecursive</a>() const</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324">IsEnabled</a>() const </td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55">IsRecursive</a>() const </td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">m_fEnabled</a></td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [private]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">m_path</a></td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [private]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">m_pInotify</a></td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [private]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">m_uMask</a></td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [private]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">m_wd</a></td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [private]</code></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#a71aff8650fadff32a3c655ca50945f1">SetEnabled</a>(bool fEnabled)</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#3ad7fbc55c21b3fcd08c2d1d388e14b6">SetMask</a>(uint32_t uMask)</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">~InotifyWatch</a>()</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr> -</table><hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</table></div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/classInotifyWatch.html b/shared/inotify/doc/html/classInotifyWatch.html index 119c7873..bc4f53e9 100644 --- a/shared/inotify/doc/html/classInotifyWatch.html +++ b/shared/inotify/doc/html/classInotifyWatch.html @@ -1,25 +1,39 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: InotifyWatch Class Reference</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="annotated.html"><span>Class List</span></a></li> - <li><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> <h1>InotifyWatch Class Reference</h1><!-- doxytag: class="InotifyWatch" -->inotify watch class <a href="#_details">More...</a> <p> -<code>#include <<a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a>></code> +<code>#include <<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>></code> +<p> +<div class="dynheader"> +Collaboration diagram for InotifyWatch:</div> +<div class="dynsection"> +<p><center><img src="classInotifyWatch__coll__graph.png" border="0" usemap="#InotifyWatch__coll__map" alt="Collaboration graph"></center> +<map name="InotifyWatch__coll__map"> +<area shape="rect" href="classInotify.html" title="inotify class" alt="" coords="24,5,80,32"></map> +<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center></div> + <p> <a href="classInotifyWatch-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0"> <tr><td></td></tr> @@ -30,15 +44,15 @@ <tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">~InotifyWatch</a> ()</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <a href="#871c16b01aa8841b36246e5b629ecaef"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#df771e1f81e2a6cc2780c9d2470e34c6">GetDescriptor</a> () const</td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59">GetDescriptor</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the watch descriptor. <a href="#df771e1f81e2a6cc2780c9d2470e34c6"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">const std::string & </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#89f897a4d98fa54de27730dd8be67966">GetPath</a> () const</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the watch descriptor. <a href="#855f982421402dd63d064dde328f2a59"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">const std::string & </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2">GetPath</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the watched file path. <a href="#89f897a4d98fa54de27730dd8be67966"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#bab761a989c9fdf73aaad2a58e1ba7a0">GetMask</a> () const</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the watched file path. <a href="#2e659c699e7d43bd0a218fe4905784d2"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009">GetMask</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the watch event mask. <a href="#bab761a989c9fdf73aaad2a58e1ba7a0"></a><br></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the watch event mask. <a href="#f759f9baca6f4abbbaae57e076486009"></a><br></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#3ad7fbc55c21b3fcd08c2d1d388e14b6">SetMask</a> (uint32_t uMask) throw (InotifyException)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Sets the watch event mask. <a href="#3ad7fbc55c21b3fcd08c2d1d388e14b6"></a><br></td></tr> @@ -48,12 +62,32 @@ <tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#a71aff8650fadff32a3c655ca50945f1">SetEnabled</a> (bool fEnabled) throw (InotifyException)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Enables/disables the watch. <a href="#a71aff8650fadff32a3c655ca50945f1"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#3d2a5c58a07449bc6ff192f6c14c4de0">IsEnabled</a> () const</td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324">IsEnabled</a> () const </td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">Checks whether the watch is enabled. <a href="#5ab551a912e5acff6a9c74baaf9ea324"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55">IsRecursive</a> () const </td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Checks whether the watch is enabled. <a href="#3d2a5c58a07449bc6ff192f6c14c4de0"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#1c8ab316b54cb7d1d0b17cbbe6b7d2f8">IsRecursive</a> () const</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Checks whether the watch is recursive. <a href="#222c911ef0e8d6f61570489ed6042e55"></a><br></td></tr> +<tr><td colspan="2"><br><h2>Private Member Functions</h2></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">IN_LOCK_DECL void </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#804cdc1e9579a075a60c239b202559f4">__Disable</a> ()</td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Checks whether the watch is recursive. <a href="#1c8ab316b54cb7d1d0b17cbbe6b7d2f8"></a><br></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Disables the watch (due to removing by the kernel). <a href="#804cdc1e9579a075a60c239b202559f4"></a><br></td></tr> +<tr><td colspan="2"><br><h2>Private Attributes</h2></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">std::string </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">m_path</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">watched file path <a href="#a63ba30ffdb8b9db27970bb1099e4db5"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">m_uMask</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">event mask <a href="#f725ea61e3252adae6153ecb80de23a8"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">m_wd</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">watch descriptor <a href="#90a78898dc850b238e713e0db284fb0a"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classInotify.html">Inotify</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">m_pInotify</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">inotify object <a href="#ea695aa11f6105184df1ef265be3f1b9"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">m_fEnabled</a></td></tr> + +<tr><td class="mdescLeft"> </td><td class="mdescRight">events enabled yes/no <a href="#b0c23c89cc2996bdf6f41b8ef1f1ed18"></a><br></td></tr> <tr><td colspan="2"><br><h2>Friends</h2></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#94bfb861dc18ca5d16abfcff90db8c86">Inotify</a></td></tr> @@ -62,9 +96,7 @@ inotify watch class <p> It holds information about the inotify watch on a particular inode.<p> -If the INOTIFY_THREAD_SAFE is defined this class is thread-safe. -<p> -<hr><h2>Constructor & Destructor Documentation</h2> +If the INOTIFY_THREAD_SAFE is defined this class is thread-safe. <hr><h2>Constructor & Destructor Documentation</h2> <a class="anchor" name="c9c02f1dbd143eebd711eba03ac366e9"></a><!-- doxytag: member="InotifyWatch::InotifyWatch" ref="c9c02f1dbd143eebd711eba03ac366e9" args="(const std::string &rPath, int32_t uMask, bool fEnabled=true)" --> <div class="memitem"> <div class="memproto"> @@ -90,7 +122,7 @@ If the INOTIFY_THREAD_SAFE is defined this class is thread-safe. <tr> <td></td> <td>)</td> - <td></td><td></td><td width="100%"><code> [inline]</code></td> + <td></td><td></td><td><code> [inline]</code></td> </tr> </table> </div> @@ -119,7 +151,7 @@ Creates an inotify watch. Because this watch is inactive it has an invalid descr <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"><code> [inline]</code></td> + <td><code> [inline]</code></td> </tr> </table> </div> @@ -132,7 +164,37 @@ Destructor. </div> </div><p> <hr><h2>Member Function Documentation</h2> -<a class="anchor" name="df771e1f81e2a6cc2780c9d2470e34c6"></a><!-- doxytag: member="InotifyWatch::GetDescriptor" ref="df771e1f81e2a6cc2780c9d2470e34c6" args="() const" --> +<a class="anchor" name="804cdc1e9579a075a60c239b202559f4"></a><!-- doxytag: member="InotifyWatch::__Disable" ref="804cdc1e9579a075a60c239b202559f4" args="()" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void InotifyWatch::__Disable </td> + <td>(</td> + <td class="paramname"> </td> + <td> ) </td> + <td><code> [private]</code></td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +Disables the watch (due to removing by the kernel). +<p> +This method must be called after receiving an event. It ensures the watch object is consistent with the kernel data. +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.png" border="0" usemap="#classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph_map" alt=""></center> +<map name="classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph_map"> +<area shape="rect" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="215,5,361,32"></map> +</div> + +</div> +</div><p> +<a class="anchor" name="855f982421402dd63d064dde328f2a59"></a><!-- doxytag: member="InotifyWatch::GetDescriptor" ref="855f982421402dd63d064dde328f2a59" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -141,7 +203,7 @@ Destructor. <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> @@ -152,31 +214,40 @@ Returns the watch descriptor. <p> <dl class="return" compact><dt><b>Returns:</b></dt><dd>watch descriptor; -1 for inactive watch </dd></dl> +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.png" border="0" usemap="#classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph_map" alt=""></center> +<map name="classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph_map"> +<area shape="rect" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341" title="Returns the event watch descriptor." alt="" coords="235,5,411,32"></map> +</div> + </div> </div><p> -<a class="anchor" name="89f897a4d98fa54de27730dd8be67966"></a><!-- doxytag: member="InotifyWatch::GetPath" ref="89f897a4d98fa54de27730dd8be67966" args="() const" --> +<a class="anchor" name="cbf0042d06841f9503405b104e4c35d0"></a><!-- doxytag: member="InotifyWatch::GetInotify" ref="cbf0042d06841f9503405b104e4c35d0" args="()" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">const std::string& InotifyWatch::GetPath </td> + <td class="memname"><a class="el" href="classInotify.html">Inotify</a>* InotifyWatch::GetInotify </td> <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td><code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Returns the watched file path. +Returns the appropriate inotify class instance. <p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>file path </dd></dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>inotify instance </dd></dl> </div> </div><p> -<a class="anchor" name="bab761a989c9fdf73aaad2a58e1ba7a0"></a><!-- doxytag: member="InotifyWatch::GetMask" ref="bab761a989c9fdf73aaad2a58e1ba7a0" args="() const" --> +<a class="anchor" name="f759f9baca6f4abbbaae57e076486009"></a><!-- doxytag: member="InotifyWatch::GetMask" ref="f759f9baca6f4abbbaae57e076486009" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -185,7 +256,7 @@ Returns the watched file path. <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> @@ -196,60 +267,91 @@ Returns the watch event mask. <p> <dl class="return" compact><dt><b>Returns:</b></dt><dd>event mask </dd></dl> +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.png" border="0" usemap="#classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph_map" alt=""></center> +<map name="classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph_map"> +<area shape="rect" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch." alt="" coords="240,5,325,32"><area shape="rect" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="209,56,356,83"><area shape="rect" href="classInotify.html#35dab56d3e10bf28b5e457871adddb58" title="Adds a new watch." alt="" coords="407,5,492,32"></map> +</div> + </div> </div><p> -<a class="anchor" name="3ad7fbc55c21b3fcd08c2d1d388e14b6"></a><!-- doxytag: member="InotifyWatch::SetMask" ref="3ad7fbc55c21b3fcd08c2d1d388e14b6" args="(uint32_t uMask)" --> +<a class="anchor" name="2e659c699e7d43bd0a218fe4905784d2"></a><!-- doxytag: member="InotifyWatch::GetPath" ref="2e659c699e7d43bd0a218fe4905784d2" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">void InotifyWatch::SetMask </td> + <td class="memname">const std::string& InotifyWatch::GetPath </td> <td>(</td> - <td class="paramtype">uint32_t </td> - <td class="paramname"> <em>uMask</em> </td> + <td class="paramname"> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> + <td> const<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Sets the watch event mask. +Returns the watched file path. <p> -If the watch is active (added to an instance of <a class="el" href="classInotify.html">Inotify</a>) this method may fail due to unsuccessful re-setting the watch in the kernel.<p> -<dl compact><dt><b>Parameters:</b></dt><dd> - <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>uMask</em> </td><td>event mask</td></tr> - </table> -</dl> -<dl compact><dt><b>Exceptions:</b></dt><dd> - <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if changing fails </td></tr> - </table> -</dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>file path </dd></dl> + +<p> +<div class="dynheader"> +Here is the caller graph for this function:</div> +<div class="dynsection"> +<p><center><img src="classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.png" border="0" usemap="#classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph_map" alt=""></center> +<map name="classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph_map"> +<area shape="rect" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch." alt="" coords="204,5,289,32"><area shape="rect" href="classInotify.html#35dab56d3e10bf28b5e457871adddb58" title="Adds a new watch." alt="" coords="340,5,425,32"></map> +</div> </div> </div><p> -<a class="anchor" name="cbf0042d06841f9503405b104e4c35d0"></a><!-- doxytag: member="InotifyWatch::GetInotify" ref="cbf0042d06841f9503405b104e4c35d0" args="()" --> +<a class="anchor" name="5ab551a912e5acff6a9c74baaf9ea324"></a><!-- doxytag: member="InotifyWatch::IsEnabled" ref="5ab551a912e5acff6a9c74baaf9ea324" args="() const " --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname"><a class="el" href="classInotify.html">Inotify</a>* InotifyWatch::GetInotify </td> + <td class="memname">bool InotifyWatch::IsEnabled </td> <td>(</td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"><code> [inline]</code></td> + <td> const<code> [inline]</code></td> </tr> </table> </div> <div class="memdoc"> <p> -Returns the appropriate inotify class instance. +Checks whether the watch is enabled. <p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>inotify instance </dd></dl> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>true = enables, false = disabled </dd></dl> + +</div> +</div><p> +<a class="anchor" name="222c911ef0e8d6f61570489ed6042e55"></a><!-- doxytag: member="InotifyWatch::IsRecursive" ref="222c911ef0e8d6f61570489ed6042e55" args="() const " --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">bool InotifyWatch::IsRecursive </td> + <td>(</td> + <td class="paramname"> </td> + <td> ) </td> + <td> const<code> [inline]</code></td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +Checks whether the watch is recursive. +<p> +A recursive watch monitors a directory itself and all its subdirectories. This watch is a logical object which may have many underlying kernel watches.<p> +<dl class="return" compact><dt><b>Returns:</b></dt><dd>currently always false (recursive watches not yet supported) </dd></dl> +<dl class="attention" compact><dt><b>Attention:</b></dt><dd>Recursive watches are currently NOT supported. They are planned for future versions. </dd></dl> </div> </div><p> @@ -263,7 +365,7 @@ Returns the appropriate inotify class instance. <td class="paramtype">bool </td> <td class="paramname"> <em>fEnabled</em> </td> <td> ) </td> - <td width="100%"> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> </tr> </table> </div> @@ -272,7 +374,7 @@ Returns the appropriate inotify class instance. <p> Enables/disables the watch. <p> -If the watch is active (added to an instance of <a class="el" href="classInotify.html">Inotify</a>) this method may fail due to unsuccessful re-setting the watch in the kernel.<p> +If the watch is active (added to an instance of <a class="el" href="classInotify.html" title="inotify class">Inotify</a>) this method may fail due to unsuccessful re-setting the watch in the kernel.<p> Re-setting the current state has no effect.<p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> @@ -281,78 +383,151 @@ Re-setting the current state has no effect.<p> </dl> <dl compact><dt><b>Exceptions:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> - <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html">InotifyException</a></em> </td><td>thrown if enabling/disabling fails </td></tr> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if enabling/disabling fails </td></tr> </table> </dl> </div> </div><p> -<a class="anchor" name="3d2a5c58a07449bc6ff192f6c14c4de0"></a><!-- doxytag: member="InotifyWatch::IsEnabled" ref="3d2a5c58a07449bc6ff192f6c14c4de0" args="() const" --> +<a class="anchor" name="3ad7fbc55c21b3fcd08c2d1d388e14b6"></a><!-- doxytag: member="InotifyWatch::SetMask" ref="3ad7fbc55c21b3fcd08c2d1d388e14b6" args="(uint32_t uMask)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">bool InotifyWatch::IsEnabled </td> + <td class="memname">void InotifyWatch::SetMask </td> <td>(</td> - <td class="paramname"> </td> + <td class="paramtype">uint32_t </td> + <td class="paramname"> <em>uMask</em> </td> <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td> </tr> </table> </div> <div class="memdoc"> <p> -Checks whether the watch is enabled. +Sets the watch event mask. <p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>true = enables, false = disabled </dd></dl> +If the watch is active (added to an instance of <a class="el" href="classInotify.html" title="inotify class">Inotify</a>) this method may fail due to unsuccessful re-setting the watch in the kernel.<p> +<dl compact><dt><b>Parameters:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"><tt>[in]</tt> </td><td valign="top"><em>uMask</em> </td><td>event mask</td></tr> + </table> +</dl> +<dl compact><dt><b>Exceptions:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em> </td><td>thrown if changing fails </td></tr> + </table> +</dl> </div> </div><p> -<a class="anchor" name="1c8ab316b54cb7d1d0b17cbbe6b7d2f8"></a><!-- doxytag: member="InotifyWatch::IsRecursive" ref="1c8ab316b54cb7d1d0b17cbbe6b7d2f8" args="() const" --> +<hr><h2>Friends And Related Function Documentation</h2> +<a class="anchor" name="94bfb861dc18ca5d16abfcff90db8c86"></a><!-- doxytag: member="InotifyWatch::Inotify" ref="94bfb861dc18ca5d16abfcff90db8c86" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">bool InotifyWatch::IsRecursive </td> - <td>(</td> - <td class="paramname"> </td> - <td> ) </td> - <td width="100%"> const<code> [inline]</code></td> + <td class="memname">friend class <a class="el" href="classInotify.html">Inotify</a><code> [friend]</code> </td> </tr> </table> </div> <div class="memdoc"> <p> -Checks whether the watch is recursive. + +</div> +</div><p> +<hr><h2>Member Data Documentation</h2> +<a class="anchor" name="b0c23c89cc2996bdf6f41b8ef1f1ed18"></a><!-- doxytag: member="InotifyWatch::m_fEnabled" ref="b0c23c89cc2996bdf6f41b8ef1f1ed18" args="" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">bool <a class="el" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">InotifyWatch::m_fEnabled</a><code> [private]</code> </td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +events enabled yes/no <p> -A recursive watch monitors a directory itself and all its subdirectories. This watch is a logical object which may have many underlying kernel watches.<p> -<dl class="return" compact><dt><b>Returns:</b></dt><dd>currently always false (recursive watches not yet supported) </dd></dl> -<dl class="attention" compact><dt><b>Attention:</b></dt><dd>Recursive watches are currently NOT supported. They are planned for future versions. </dd></dl> </div> </div><p> -<hr><h2>Friends And Related Function Documentation</h2> -<a class="anchor" name="94bfb861dc18ca5d16abfcff90db8c86"></a><!-- doxytag: member="InotifyWatch::Inotify" ref="94bfb861dc18ca5d16abfcff90db8c86" args="" --> +<a class="anchor" name="a63ba30ffdb8b9db27970bb1099e4db5"></a><!-- doxytag: member="InotifyWatch::m_path" ref="a63ba30ffdb8b9db27970bb1099e4db5" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> - <td class="memname">friend class <a class="el" href="classInotify.html">Inotify</a><code> [friend]</code> </td> + <td class="memname">std::string <a class="el" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">InotifyWatch::m_path</a><code> [private]</code> </td> </tr> </table> </div> <div class="memdoc"> <p> +watched file path +<p> + +</div> +</div><p> +<a class="anchor" name="ea695aa11f6105184df1ef265be3f1b9"></a><!-- doxytag: member="InotifyWatch::m_pInotify" ref="ea695aa11f6105184df1ef265be3f1b9" args="" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="classInotify.html">Inotify</a>* <a class="el" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">InotifyWatch::m_pInotify</a><code> [private]</code> </td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +inotify object +<p> + +</div> +</div><p> +<a class="anchor" name="f725ea61e3252adae6153ecb80de23a8"></a><!-- doxytag: member="InotifyWatch::m_uMask" ref="f725ea61e3252adae6153ecb80de23a8" args="" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t <a class="el" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">InotifyWatch::m_uMask</a><code> [private]</code> </td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +event mask +<p> + +</div> +</div><p> +<a class="anchor" name="90a78898dc850b238e713e0db284fb0a"></a><!-- doxytag: member="InotifyWatch::m_wd" ref="90a78898dc850b238e713e0db284fb0a" args="" --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int32_t <a class="el" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">InotifyWatch::m_wd</a><code> [private]</code> </td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p> +watch descriptor +<p> </div> </div><p> <hr>The documentation for this class was generated from the following files:<ul> -<li><a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a><li><a class="el" href="inotify-cxx_8cpp.html">inotify-cxx.cpp</a></ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +<li><a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a><li><a class="el" href="inotify-cxx_8cpp.html">inotify-cxx.cpp</a></ul> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.map b/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.map new file mode 100644 index 00000000..f27ca8a7 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.map @@ -0,0 +1,2 @@ +<area shape="rect" href="$classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch." alt="" coords="204,5,289,32"> +<area shape="rect" href="$classInotify.html#35dab56d3e10bf28b5e457871adddb58" title="Adds a new watch." alt="" coords="340,5,425,32"> diff --git a/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.md5 b/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.md5 new file mode 100644 index 00000000..fbd2ff03 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.md5 @@ -0,0 +1 @@ +620e1e417c7b3a584d9a02e4d00e9a65
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.png b/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.png Binary files differnew file mode 100644 index 00000000..a8cfc58a --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.png diff --git a/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.map b/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.map new file mode 100644 index 00000000..45f1c8f4 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.map @@ -0,0 +1 @@ +<area shape="rect" href="$classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="215,5,361,32"> diff --git a/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.md5 b/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.md5 new file mode 100644 index 00000000..f49498f5 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.md5 @@ -0,0 +1 @@ +74fca07ef5cdde676f9befabdba3c390
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.png b/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.png Binary files differnew file mode 100644 index 00000000..9adcc985 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.png diff --git a/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.map b/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.map new file mode 100644 index 00000000..dff1f4a3 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.map @@ -0,0 +1 @@ +<area shape="rect" href="$classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341" title="Returns the event watch descriptor." alt="" coords="235,5,411,32"> diff --git a/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.md5 b/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.md5 new file mode 100644 index 00000000..17145c3b --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.md5 @@ -0,0 +1 @@ +9338607b3d3a0e2804e6ced197d5c9cc
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.png b/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.png Binary files differnew file mode 100644 index 00000000..5e7dd132 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.png diff --git a/shared/inotify/doc/html/classInotifyWatch__coll__graph.map b/shared/inotify/doc/html/classInotifyWatch__coll__graph.map new file mode 100644 index 00000000..59ebb091 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch__coll__graph.map @@ -0,0 +1 @@ +<area shape="rect" href="$classInotify.html" title="inotify class" alt="" coords="24,5,80,32"> diff --git a/shared/inotify/doc/html/classInotifyWatch__coll__graph.md5 b/shared/inotify/doc/html/classInotifyWatch__coll__graph.md5 new file mode 100644 index 00000000..f8ab3a5e --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch__coll__graph.md5 @@ -0,0 +1 @@ +4b0e82ffc859966b60e2fb5b19162d43
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotifyWatch__coll__graph.png b/shared/inotify/doc/html/classInotifyWatch__coll__graph.png Binary files differnew file mode 100644 index 00000000..b2a5567f --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch__coll__graph.png diff --git a/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.map b/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.map new file mode 100644 index 00000000..ae5eb580 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.map @@ -0,0 +1,3 @@ +<area shape="rect" href="$classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch." alt="" coords="240,5,325,32"> +<area shape="rect" href="$classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="209,56,356,83"> +<area shape="rect" href="$classInotify.html#35dab56d3e10bf28b5e457871adddb58" title="Adds a new watch." alt="" coords="407,5,492,32"> diff --git a/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.md5 b/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.md5 new file mode 100644 index 00000000..30d2f7a4 --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.md5 @@ -0,0 +1 @@ +126051def76cebe39a5ea1e3b30484e7
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.png b/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.png Binary files differnew file mode 100644 index 00000000..104b6dbb --- /dev/null +++ b/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.png diff --git a/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.map b/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.map new file mode 100644 index 00000000..c916a719 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.map @@ -0,0 +1 @@ +<area shape="rect" href="$classInotify.html#287dc0d238fa6edc3269441cb284f979" title="Extracts a queued inotify event (without removing)." alt="" coords="179,5,304,32"> diff --git a/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.md5 b/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.md5 new file mode 100644 index 00000000..4dc02268 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.md5 @@ -0,0 +1 @@ +867a37f8a90b3c381b26aff122c509e1
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.png b/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.png Binary files differnew file mode 100644 index 00000000..368ea909 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.png diff --git a/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.map b/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.map new file mode 100644 index 00000000..ee280ed5 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.map @@ -0,0 +1 @@ +<area shape="rect" href="$classInotify.html#ac1a52b2ff6bfec07021a44e55d496a6" title="Removes a watch." alt="" coords="163,5,272,32"> diff --git a/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.md5 b/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.md5 new file mode 100644 index 00000000..631afbc4 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.md5 @@ -0,0 +1 @@ +587f8ec5057bea5f3b570a712828014d
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.png b/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.png Binary files differnew file mode 100644 index 00000000..0c72efe9 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.png diff --git a/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.map b/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.map new file mode 100644 index 00000000..57880c92 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.map @@ -0,0 +1 @@ +<area shape="rect" href="$classInotify.html#35dab56d3e10bf28b5e457871adddb58" title="Adds a new watch." alt="" coords="143,5,228,32"> diff --git a/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.md5 b/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.md5 new file mode 100644 index 00000000..44962c4b --- /dev/null +++ b/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.md5 @@ -0,0 +1 @@ +8d7a6b2b3b84fb672bc0326258ff14f6
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.png b/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.png Binary files differnew file mode 100644 index 00000000..65078cda --- /dev/null +++ b/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.png diff --git a/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.map b/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.map new file mode 100644 index 00000000..dc7351fd --- /dev/null +++ b/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.map @@ -0,0 +1 @@ +<area shape="rect" href="$classInotify.html#b028c8fa988f6bbb2ef773db3ea3a2d3" title="Extracts a queued inotify event." alt="" coords="172,5,287,32"> diff --git a/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.md5 b/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.md5 new file mode 100644 index 00000000..2cdfd2b4 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.md5 @@ -0,0 +1 @@ +04c6a964e2bb5f8eaec7dbb9c83b2bc7
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.png b/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.png Binary files differnew file mode 100644 index 00000000..fd43491a --- /dev/null +++ b/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.png diff --git a/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.map b/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.map new file mode 100644 index 00000000..30031126 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.map @@ -0,0 +1,3 @@ +<area shape="rect" href="$classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42" title="Returns the maximum number of events in the kernel queue." alt="" coords="204,5,351,32"> +<area shape="rect" href="$classInotify.html#c18b7732f67832260fbbd47aebb8af51" title="Returns the maximum number of inotify instances per process." alt="" coords="195,56,360,83"> +<area shape="rect" href="$classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f" title="Returns the maximum number of inotify watches per instance." alt="" coords="197,107,357,133"> diff --git a/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.md5 b/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.md5 new file mode 100644 index 00000000..cf32572b --- /dev/null +++ b/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.md5 @@ -0,0 +1 @@ +d00e8e6b410a8b99056c20c2ae513bab
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.png b/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.png Binary files differnew file mode 100644 index 00000000..5102409d --- /dev/null +++ b/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.png diff --git a/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.map b/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.map new file mode 100644 index 00000000..37e43de7 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.map @@ -0,0 +1,3 @@ +<area shape="rect" href="$classInotify.html#66d90ebfa516d4bd1463749def2b58f9" title="Sets the maximum number of events in the kernel queue." alt="" coords="204,5,351,32"> +<area shape="rect" href="$classInotify.html#620c891962fe5acd26485c64e9b28d19" title="Sets the maximum number of inotify instances per process." alt="" coords="196,56,359,83"> +<area shape="rect" href="$classInotify.html#5064380cdb4a726ab33f3fa18d15c77a" title="Sets the maximum number of inotify watches per instance." alt="" coords="197,107,357,133"> diff --git a/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.md5 b/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.md5 new file mode 100644 index 00000000..9017da9c --- /dev/null +++ b/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.md5 @@ -0,0 +1 @@ +1d28be277b69710e355fb579217e5b78
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.png b/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.png Binary files differnew file mode 100644 index 00000000..a58ed2be --- /dev/null +++ b/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.png diff --git a/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.map b/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.map new file mode 100644 index 00000000..9ddf26fa --- /dev/null +++ b/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.map @@ -0,0 +1 @@ +<area shape="rect" href="$classInotify.html#f19dd5e491395673e4798eb9dbf5f682" title="Destructor." alt="" coords="151,5,255,32"> diff --git a/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.md5 b/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.md5 new file mode 100644 index 00000000..5cb8482f --- /dev/null +++ b/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.md5 @@ -0,0 +1 @@ +2ac402c3a1e1f917bb08f0f7203eb443
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.png b/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.png Binary files differnew file mode 100644 index 00000000..83f1c6d4 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.png diff --git a/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.map b/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.map new file mode 100644 index 00000000..0ab98b58 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.map @@ -0,0 +1,2 @@ +<area shape="rect" href="$classInotify.html#86ae86c43ea1a72f562ca46393309635" title="Removes all watches and closes the inotify device." alt="" coords="179,5,275,32"> +<area shape="rect" href="$classInotify.html#f19dd5e491395673e4798eb9dbf5f682" title="Destructor." alt="" coords="324,5,428,32"> diff --git a/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.md5 b/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.md5 new file mode 100644 index 00000000..ca0e1018 --- /dev/null +++ b/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.md5 @@ -0,0 +1 @@ +d6ad52008b7d418d0c5f4e495df76a6f
\ No newline at end of file diff --git a/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.png b/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.png Binary files differnew file mode 100644 index 00000000..edba755d --- /dev/null +++ b/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.png diff --git a/shared/inotify/doc/html/classes.html b/shared/inotify/doc/html/classes.html new file mode 100644 index 00000000..604cbade --- /dev/null +++ b/shared/inotify/doc/html/classes.html @@ -0,0 +1,32 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> +<title>inotify-cxx: Alphabetical List</title> +<link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> +</head><body> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> +<h1>Class Index</h1><p><div class="qindex"><a class="qindex" href="#letter_I">I</a></div><p> +<table align="center" width="95%" border="0" cellspacing="0" cellpadding="0"> +<tr><td><a name="letter_I"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah"> I </div></td></tr></table> +</td><td><a class="el" href="classInotify.html">Inotify</a> </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a> </td><td><a class="el" href="classInotifyException.html">InotifyException</a> </td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a> </td></tr></table><p><div class="qindex"><a class="qindex" href="#letter_I">I</a></div><p> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> +</body> +</html> diff --git a/shared/inotify/doc/html/doxygen.css b/shared/inotify/doc/html/doxygen.css index c7db1a8a..3767dc95 100644 --- a/shared/inotify/doc/html/doxygen.css +++ b/shared/inotify/doc/html/doxygen.css @@ -1,358 +1,441 @@ -BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { - font-family: Geneva, Arial, Helvetica, sans-serif; +body, table, div, p, dl { + font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; + font-size: 12px; } -BODY,TD { - font-size: 90%; -} -H1 { + +/* @group Heading Levels */ + +h1 { text-align: center; - font-size: 160%; + font-size: 150%; } -H2 { - font-size: 120%; + +h2 { + font-size: 120%; } -H3 { - font-size: 100%; + +h3 { + font-size: 100%; } -CAPTION { font-weight: bold } -DIV.qindex { - width: 100%; + +/* @end */ + +caption { + font-weight: bold; +} + +div.qindex, div.navtab{ background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; padding: 2px; - line-height: 140%; } -DIV.nav { + +div.qindex, div.navpath { width: 100%; - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - padding: 2px; line-height: 140%; } -DIV.navtab { - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; + +div.navtab { + margin-right: 15px; } -TD.navtab { - font-size: 70%; + +/* @group Link Styling */ + +a { + color: #153788; + font-weight: normal; + text-decoration: none; } -A.qindex { - text-decoration: none; - font-weight: bold; - color: #1A419D; + +.contents a:visited { + color: #1b77c5; } -A.qindex:visited { - text-decoration: none; - font-weight: bold; - color: #1A419D + +a:hover { + text-decoration: underline; } -A.qindex:hover { - text-decoration: none; - background-color: #ddddff; + +a.qindex { + font-weight: bold; } -A.qindexHL { - text-decoration: none; + +a.qindexHL { font-weight: bold; background-color: #6666cc; color: #ffffff; border: 1px double #9295C2; } -A.qindexHL:hover { - text-decoration: none; - background-color: #6666cc; - color: #ffffff; + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { } -A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } -A.el { text-decoration: none; font-weight: bold } -A.elRef { font-weight: bold } -A.code:link { text-decoration: none; font-weight: normal; color: #0000FF} -A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF} -A.codeRef:link { font-weight: normal; color: #0000FF} -A.codeRef:visited { font-weight: normal; color: #0000FF} -A:hover { text-decoration: none; background-color: #f2f2ff } -DL.el { margin-left: -1cm } + +a.code { +} + +a.codeRef { +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + .fragment { - font-family: monospace, fixed; - font-size: 95%; + font-family: monospace, fixed; + font-size: 105%; } -PRE.fragment { + +pre.fragment { border: 1px solid #CCCCCC; background-color: #f5f5f5; - margin-top: 4px; - margin-bottom: 4px; - margin-left: 2px; - margin-right: 8px; - padding-left: 6px; - padding-right: 6px; - padding-top: 4px; - padding-bottom: 4px; -} -DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } - -DIV.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: bold; -} -DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% } -BODY { + padding: 4px 6px; + margin: 4px 8px 4px 2px; +} + +div.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { background: white; color: black; margin-right: 20px; margin-left: 20px; } -TD.indexkey { + +td.indexkey { background-color: #e8eef2; font-weight: bold; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px; border: 1px solid #CCCCCC; + margin: 2px 0px 2px 0; + padding: 2px 10px; } -TD.indexvalue { + +td.indexvalue { background-color: #e8eef2; - font-style: italic; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px; border: 1px solid #CCCCCC; + padding: 2px 10px; + margin: 2px 0px; } -TR.memlist { - background-color: #f0f0f0; -} -P.formulaDsp { text-align: center; } -IMG.formulaDsp { } -IMG.formulaInl { vertical-align: middle; } -SPAN.keyword { color: #008000 } -SPAN.keywordtype { color: #604020 } -SPAN.keywordflow { color: #e08000 } -SPAN.comment { color: #800000 } -SPAN.preprocessor { color: #806020 } -SPAN.stringliteral { color: #002080 } -SPAN.charliteral { color: #008080 } -.mdescLeft { - padding: 0px 8px 4px 8px; - font-size: 80%; - font-style: italic; - background-color: #FAFAFA; - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; + +tr.memlist { + background-color: #f0f0f0; } -.mdescRight { - padding: 0px 8px 4px 8px; - font-size: 80%; - font-style: italic; - background-color: #FAFAFA; - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; + +p.formulaDsp { + text-align: center; } -.memItemLeft { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: solid; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-size: 80%; + +img.formulaDsp { + } -.memItemRight { - padding: 1px 8px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: solid; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-size: 80%; + +img.formulaInl { + vertical-align: middle; } -.memTemplItemLeft { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: none; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-size: 80%; + +/* @group Code Colorization */ + +span.keyword { + color: #008000 } -.memTemplItemRight { - padding: 1px 8px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: none; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-size: 80%; + +span.keywordtype { + color: #604020 } -.memTemplParams { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: solid; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - color: #606060; - background-color: #FAFAFA; - font-size: 80%; + +span.keywordflow { + color: #e08000 } -.search { color: #003399; - font-weight: bold; + +span.comment { + color: #800000 } -FORM.search { - margin-bottom: 0px; - margin-top: 0px; + +span.preprocessor { + color: #806020 } -INPUT.search { font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; + +span.stringliteral { + color: #002080 } -TD.tiny { font-size: 75%; + +span.charliteral { + color: #008080 } -a { - color: #1A41A8; + +span.vhdldigit { + color: #ff00ff } -a:visited { - color: #2A3798; + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +/* @end */ + +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; } -.dirtab { padding: 4px; - border-collapse: collapse; - border: 1px solid #84b0c7; + +td.tiny { + font-size: 75%; } -TH.dirtab { background: #e8eef2; - font-weight: bold; + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #84b0c7; +} + +th.dirtab { + background: #e8eef2; + font-weight: bold; } -HR { height: 1px; - border: none; - border-top: 1px solid black; + +hr { + height: 0; + border: none; + border-top: 1px solid #666; +} + +/* @group Member Descriptions */ + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #FAFAFA; + border: none; + margin: 4px; + padding: 1px 0 0 8px; } -/* Style for detailed member documentation */ +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memItemLeft, .memItemRight, .memTemplParams { + border-top: 1px solid #ccc; +} + +.memTemplParams { + color: #606060; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + .memtemplate { - font-size: 80%; - color: #606060; - font-weight: normal; -} -.memnav { - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; + font-size: 80%; + color: #606060; + font-weight: normal; + margin-left: 3px; } + +.memnav { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + .memitem { - padding: 4px; - background-color: #eef3f5; - border-width: 1px; - border-style: solid; - border-color: #dedeee; - -moz-border-radius: 8px 8px 8px 8px; + padding: 0; } + .memname { - white-space: nowrap; - font-weight: bold; + white-space: nowrap; + font-weight: bold; } -.memdoc{ - padding-left: 10px; + +.memproto, .memdoc { + border: 1px solid #84b0c7; } + .memproto { - background-color: #d5e1e8; - width: 100%; - border-width: 1px; - border-style: solid; - border-color: #84b0c7; - font-weight: bold; - -moz-border-radius: 8px 8px 8px 8px; + padding: 0; + background-color: #d5e1e8; + font-weight: bold; + -webkit-border-top-left-radius: 8px; + -webkit-border-top-right-radius: 8px; + -moz-border-radius-topleft: 8px; + -moz-border-radius-topright: 8px; } + +.memdoc { + padding: 2px 5px; + background-color: #eef3f5; + border-top-width: 0; + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; +} + .paramkey { - text-align: right; + text-align: right; } + .paramtype { - white-space: nowrap; + white-space: nowrap; } + .paramname { - color: #602020; - font-style: italic; - white-space: nowrap; + color: #602020; + white-space: nowrap; } -/* End Styling for detailed member documentation */ +.paramname em { + font-style: normal; +} + +/* @end */ + +/* @group Directory (tree) */ /* for the tree view */ + .ftvtree { font-family: sans-serif; - margin:0.5em; -} -.directory { font-size: 9pt; font-weight: bold; } -.directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } -.directory > h3 { margin-top: 0; } -.directory p { margin: 0px; white-space: nowrap; } -.directory div { display: none; margin: 0px; } -.directory img { vertical-align: -30%; } + margin: 0.5em; +} + +/* these are for tree view when used as main index */ + +.directory { + font-size: 9pt; + font-weight: bold; +} + +.directory h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +/* +The following two styles can be used to replace the root node title +with an image of your choice. Simply uncomment the next two styles, +specify the name of your image and be sure to set 'height' to the +proper pixel height of your image. +*/ + +/* +.directory h3.swap { + height: 61px; + background-repeat: no-repeat; + background-image: url("yourimage.gif"); +} +.directory h3.swap span { + display: none; +} +*/ + +.directory > h3 { + margin-top: 0; +} + +.directory p { + margin: 0px; + white-space: nowrap; +} + +.directory div { + display: none; + margin: 0px; +} + +.directory img { + vertical-align: -30%; +} + +/* these are for tree view when not used as main index */ + +.directory-alt { + font-size: 100%; + font-weight: bold; +} + +.directory-alt h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +.directory-alt > h3 { + margin-top: 0; +} + +.directory-alt p { + margin: 0px; + white-space: nowrap; +} + +.directory-alt div { + display: none; + margin: 0px; +} + +.directory-alt img { + vertical-align: -30%; +} + +/* @end */ + +address { + font-style: normal; + color: #333; +} diff --git a/shared/inotify/doc/html/files.html b/shared/inotify/doc/html/files.html index de3d916f..5c6b0baf 100644 --- a/shared/inotify/doc/html/files.html +++ b/shared/inotify/doc/html/files.html @@ -1,27 +1,32 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: File Index</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li><a href="annotated.html"><span>Classes</span></a></li> - <li id="current"><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li id="current"><a href="files.html"><span>File List</span></a></li> - <li><a href="globals.html"><span>File Members</span></a></li> - </ul></div> -<h1>inotify-cxx File List</h1>Here is a list of all files with brief descriptions:<table> - <tr><td class="indexkey"><a class="el" href="inotify-cxx_8cpp.html">inotify-cxx.cpp</a></td><td class="indexvalue"><a class="el" href="classInotify.html">Inotify</a> C++ interface implementation </td></tr> - <tr><td class="indexkey"><a class="el" href="inotify-cxx_8h.html">inotify-cxx.h</a> <a href="inotify-cxx_8h-source.html">[code]</a></td><td class="indexvalue"><a class="el" href="classInotify.html">Inotify</a> C++ interface header </td></tr> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Classes</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>File Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> +<h1>File List</h1>Here is a list of all files with brief descriptions:<table> + <tr><td class="indexkey"><a class="el" href="inotify-cxx_8cpp.html">inotify-cxx.cpp</a></td><td class="indexvalue"><a class="el" href="classInotify.html" title="inotify class">Inotify</a> C++ interface implementation </td></tr> + <tr><td class="indexkey"><a class="el" href="inotify-cxx_8h.html">inotify-cxx.h</a> <a href="inotify-cxx_8h_source.html">[code]</a></td><td class="indexvalue"><a class="el" href="classInotify.html" title="inotify class">Inotify</a> C++ interface header </td></tr> </table> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/functions.html b/shared/inotify/doc/html/functions.html index e6c66f90..00a99ed4 100644 --- a/shared/inotify/doc/html/functions.html +++ b/shared/inotify/doc/html/functions.html @@ -1,49 +1,57 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Class Members</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="annotated.html"><span>Class List</span></a></li> - <li id="current"><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li id="current"><a href="functions.html"><span>All</span></a></li> - <li><a href="functions_func.html"><span>Functions</span></a></li> - <li><a href="functions_vars.html"><span>Variables</span></a></li> - <li><a href="functions_rela.html"><span>Related Functions</span></a></li> - </ul> -</div> -<div class="tabs"> - <ul> - <li><a href="#index_a"><span>a</span></a></li> - <li><a href="#index_c"><span>c</span></a></li> - <li><a href="#index_d"><span>d</span></a></li> - <li><a href="#index_f"><span>f</span></a></li> - <li><a href="#index_g"><span>g</span></a></li> - <li><a href="#index_i"><span>i</span></a></li> - <li><a href="#index_m"><span>m</span></a></li> - <li><a href="#index_p"><span>p</span></a></li> - <li><a href="#index_r"><span>r</span></a></li> - <li><a href="#index_s"><span>s</span></a></li> - <li><a href="#index_w"><span>w</span></a></li> - <li><a href="#index_~"><span>~</span></a></li> - </ul> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li class="current"><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li class="current"><a href="functions.html"><span>All</span></a></li> + <li><a href="functions_func.html"><span>Functions</span></a></li> + <li><a href="functions_vars.html"><span>Variables</span></a></li> + <li><a href="functions_rela.html"><span>Related Functions</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="#index__"><span>_</span></a></li> + <li><a href="#index_a"><span>a</span></a></li> + <li><a href="#index_c"><span>c</span></a></li> + <li><a href="#index_d"><span>d</span></a></li> + <li><a href="#index_f"><span>f</span></a></li> + <li><a href="#index_g"><span>g</span></a></li> + <li><a href="#index_i"><span>i</span></a></li> + <li><a href="#index_m"><span>m</span></a></li> + <li><a href="#index_p"><span>p</span></a></li> + <li><a href="#index_r"><span>r</span></a></li> + <li><a href="#index_s"><span>s</span></a></li> + <li><a href="#index_w"><span>w</span></a></li> + <li><a href="#index_~"><span>~</span></a></li> + </ul> + </div> </div> - -<p> +<div class="contents"> Here is a list of all class members with links to the classes they belong to: <p> +<h3><a class="anchor" name="index__">- _ -</a></h3><ul> +<li>__Disable() +: <a class="el" href="classInotifyWatch.html#804cdc1e9579a075a60c239b202559f4">InotifyWatch</a> +</ul> <h3><a class="anchor" name="index_a">- a -</a></h3><ul> <li>Add() : <a class="el" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83">Inotify</a> @@ -63,16 +71,18 @@ Here is a list of all class members with links to the classes they belong to: <h3><a class="anchor" name="index_g">- g -</a></h3><ul> <li>GetCapability() : <a class="el" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b">Inotify</a> +<li>GetCapabilityPath() +: <a class="el" href="classInotify.html#0233ddfe40844d729505fdfd709d22cc">Inotify</a> <li>GetCookie() -: <a class="el" href="classInotifyEvent.html#441dfd50abda0e81eb7e4f6d33c68e96">InotifyEvent</a> +: <a class="el" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17">InotifyEvent</a> <li>GetDescriptor() -: <a class="el" href="classInotify.html#678271faf4799840ad71805163a24b13">Inotify</a> -, <a class="el" href="classInotifyEvent.html#83958af6b634d47173bde81b3bd5bbe6">InotifyEvent</a> -, <a class="el" href="classInotifyWatch.html#df771e1f81e2a6cc2780c9d2470e34c6">InotifyWatch</a> +: <a class="el" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341">InotifyEvent</a> +, <a class="el" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59">InotifyWatch</a> +, <a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9">Inotify</a> <li>GetEnabledCount() -: <a class="el" href="classInotify.html#9bf5f7716649d5b5f468c2242fb5e099">Inotify</a> +: <a class="el" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063">Inotify</a> <li>GetErrorNumber() -: <a class="el" href="classInotifyException.html#3fda7827f1561f610e40bcd217bdc6fe">InotifyException</a> +: <a class="el" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d">InotifyException</a> <li>GetEvent() : <a class="el" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008">Inotify</a> <li>GetEventCount() @@ -80,10 +90,10 @@ Here is a list of all class members with links to the classes they belong to: <li>GetInotify() : <a class="el" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0">InotifyWatch</a> <li>GetLength() -: <a class="el" href="classInotifyEvent.html#111954d74f0320745a68ef030064e987">InotifyEvent</a> +: <a class="el" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a">InotifyEvent</a> <li>GetMask() -: <a class="el" href="classInotifyEvent.html#2aadeb49530a62b06d98e22c335b1ec8">InotifyEvent</a> -, <a class="el" href="classInotifyWatch.html#bab761a989c9fdf73aaad2a58e1ba7a0">InotifyWatch</a> +: <a class="el" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009">InotifyWatch</a> +, <a class="el" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f">InotifyEvent</a> <li>GetMaskByName() : <a class="el" href="classInotifyEvent.html#eced3a88a6dea190c5df19c2a6599010">InotifyEvent</a> <li>GetMaxEvents() @@ -93,17 +103,17 @@ Here is a list of all class members with links to the classes they belong to: <li>GetMaxWatches() : <a class="el" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f">Inotify</a> <li>GetMessage() -: <a class="el" href="classInotifyException.html#1c19a6c919c76332c95970ce7983d016">InotifyException</a> +: <a class="el" href="classInotifyException.html#6364ea375697356805d47cff957dd757">InotifyException</a> <li>GetName() -: <a class="el" href="classInotifyEvent.html#a0524029d360591567c88595cb31df66">InotifyEvent</a> +: <a class="el" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f">InotifyEvent</a> <li>GetPath() -: <a class="el" href="classInotifyWatch.html#89f897a4d98fa54de27730dd8be67966">InotifyWatch</a> +: <a class="el" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2">InotifyWatch</a> <li>GetSource() -: <a class="el" href="classInotifyException.html#568200b75da77cc24927922760b3a5d3">InotifyException</a> +: <a class="el" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408">InotifyException</a> <li>GetWatch() : <a class="el" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">InotifyEvent</a> <li>GetWatchCount() -: <a class="el" href="classInotify.html#b53b7935bda7425b002946d78bfe5863">Inotify</a> +: <a class="el" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075">Inotify</a> </ul> <h3><a class="anchor" name="index_i">- i -</a></h3><ul> <li>Inotify @@ -113,23 +123,50 @@ Here is a list of all class members with links to the classes they belong to: : <a class="el" href="classInotifyEvent.html#6d7f3fc0f51580da4a3ec2348609df64">InotifyEvent</a> <li>InotifyException() : <a class="el" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb">InotifyException</a> -<li>InotifyWatch -: <a class="el" href="classInotify.html#10880f490c33acd8bd24664fc7bce4ae">Inotify</a> -, <a class="el" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9">InotifyWatch</a> +<li>InotifyWatch() +: <a class="el" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9">InotifyWatch</a> +, <a class="el" href="classInotify.html#10880f490c33acd8bd24664fc7bce4ae">Inotify</a> <li>IsEnabled() -: <a class="el" href="classInotifyWatch.html#3d2a5c58a07449bc6ff192f6c14c4de0">InotifyWatch</a> +: <a class="el" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324">InotifyWatch</a> <li>IsRecursive() -: <a class="el" href="classInotifyWatch.html#1c8ab316b54cb7d1d0b17cbbe6b7d2f8">InotifyWatch</a> +: <a class="el" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55">InotifyWatch</a> <li>IsType() -: <a class="el" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">InotifyEvent</a> +: <a class="el" href="classInotifyEvent.html#477ae71116ec393434a1f62a7170a156">InotifyEvent</a> </ul> <h3><a class="anchor" name="index_m">- m -</a></h3><ul> +<li>m_buf +: <a class="el" href="classInotify.html#eee7847efd93b681fddac56860fc7958">Inotify</a> <li>m_err : <a class="el" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">InotifyException</a> +<li>m_events +: <a class="el" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">Inotify</a> +<li>m_fd +: <a class="el" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">Inotify</a> +<li>m_fEnabled +: <a class="el" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">InotifyWatch</a> <li>m_msg : <a class="el" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">InotifyException</a> +<li>m_name +: <a class="el" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">InotifyEvent</a> +<li>m_path +: <a class="el" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">InotifyWatch</a> +<li>m_paths +: <a class="el" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">Inotify</a> +<li>m_pInotify +: <a class="el" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">InotifyWatch</a> <li>m_pSrc : <a class="el" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">InotifyException</a> +<li>m_pWatch +: <a class="el" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">InotifyEvent</a> +<li>m_uCookie +: <a class="el" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">InotifyEvent</a> +<li>m_uMask +: <a class="el" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">InotifyWatch</a> +, <a class="el" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">InotifyEvent</a> +<li>m_watches +: <a class="el" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">Inotify</a> +<li>m_wd +: <a class="el" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">InotifyWatch</a> </ul> <h3><a class="anchor" name="index_p">- p -</a></h3><ul> <li>PeekEvent() @@ -171,8 +208,8 @@ Here is a list of all class members with links to the classes they belong to: <li>~InotifyWatch() : <a class="el" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">InotifyWatch</a> </ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/functions_func.html b/shared/inotify/doc/html/functions_func.html index eee3f008..dad8c830 100644 --- a/shared/inotify/doc/html/functions_func.html +++ b/shared/inotify/doc/html/functions_func.html @@ -1,48 +1,56 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Class Members - Functions</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="annotated.html"><span>Class List</span></a></li> - <li id="current"><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="functions.html"><span>All</span></a></li> - <li id="current"><a href="functions_func.html"><span>Functions</span></a></li> - <li><a href="functions_vars.html"><span>Variables</span></a></li> - <li><a href="functions_rela.html"><span>Related Functions</span></a></li> - </ul> -</div> -<div class="tabs"> - <ul> - <li><a href="#index_a"><span>a</span></a></li> - <li><a href="#index_c"><span>c</span></a></li> - <li><a href="#index_d"><span>d</span></a></li> - <li><a href="#index_f"><span>f</span></a></li> - <li><a href="#index_g"><span>g</span></a></li> - <li><a href="#index_i"><span>i</span></a></li> - <li><a href="#index_p"><span>p</span></a></li> - <li><a href="#index_r"><span>r</span></a></li> - <li><a href="#index_s"><span>s</span></a></li> - <li><a href="#index_w"><span>w</span></a></li> - <li><a href="#index_~"><span>~</span></a></li> - </ul> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li class="current"><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="functions.html"><span>All</span></a></li> + <li class="current"><a href="functions_func.html"><span>Functions</span></a></li> + <li><a href="functions_vars.html"><span>Variables</span></a></li> + <li><a href="functions_rela.html"><span>Related Functions</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="#index__"><span>_</span></a></li> + <li><a href="#index_a"><span>a</span></a></li> + <li><a href="#index_c"><span>c</span></a></li> + <li><a href="#index_d"><span>d</span></a></li> + <li><a href="#index_f"><span>f</span></a></li> + <li><a href="#index_g"><span>g</span></a></li> + <li><a href="#index_i"><span>i</span></a></li> + <li><a href="#index_p"><span>p</span></a></li> + <li><a href="#index_r"><span>r</span></a></li> + <li><a href="#index_s"><span>s</span></a></li> + <li><a href="#index_w"><span>w</span></a></li> + <li><a href="#index_~"><span>~</span></a></li> + </ul> + </div> </div> - -<p> +<div class="contents"> <p> +<h3><a class="anchor" name="index__">- _ -</a></h3><ul> +<li>__Disable() +: <a class="el" href="classInotifyWatch.html#804cdc1e9579a075a60c239b202559f4">InotifyWatch</a> +</ul> <h3><a class="anchor" name="index_a">- a -</a></h3><ul> <li>Add() : <a class="el" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83">Inotify</a> @@ -62,16 +70,18 @@ <h3><a class="anchor" name="index_g">- g -</a></h3><ul> <li>GetCapability() : <a class="el" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b">Inotify</a> +<li>GetCapabilityPath() +: <a class="el" href="classInotify.html#0233ddfe40844d729505fdfd709d22cc">Inotify</a> <li>GetCookie() -: <a class="el" href="classInotifyEvent.html#441dfd50abda0e81eb7e4f6d33c68e96">InotifyEvent</a> +: <a class="el" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17">InotifyEvent</a> <li>GetDescriptor() -: <a class="el" href="classInotify.html#678271faf4799840ad71805163a24b13">Inotify</a> -, <a class="el" href="classInotifyEvent.html#83958af6b634d47173bde81b3bd5bbe6">InotifyEvent</a> -, <a class="el" href="classInotifyWatch.html#df771e1f81e2a6cc2780c9d2470e34c6">InotifyWatch</a> +: <a class="el" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341">InotifyEvent</a> +, <a class="el" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59">InotifyWatch</a> +, <a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9">Inotify</a> <li>GetEnabledCount() -: <a class="el" href="classInotify.html#9bf5f7716649d5b5f468c2242fb5e099">Inotify</a> +: <a class="el" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063">Inotify</a> <li>GetErrorNumber() -: <a class="el" href="classInotifyException.html#3fda7827f1561f610e40bcd217bdc6fe">InotifyException</a> +: <a class="el" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d">InotifyException</a> <li>GetEvent() : <a class="el" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008">Inotify</a> <li>GetEventCount() @@ -79,10 +89,10 @@ <li>GetInotify() : <a class="el" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0">InotifyWatch</a> <li>GetLength() -: <a class="el" href="classInotifyEvent.html#111954d74f0320745a68ef030064e987">InotifyEvent</a> +: <a class="el" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a">InotifyEvent</a> <li>GetMask() -: <a class="el" href="classInotifyEvent.html#2aadeb49530a62b06d98e22c335b1ec8">InotifyEvent</a> -, <a class="el" href="classInotifyWatch.html#bab761a989c9fdf73aaad2a58e1ba7a0">InotifyWatch</a> +: <a class="el" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009">InotifyWatch</a> +, <a class="el" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f">InotifyEvent</a> <li>GetMaskByName() : <a class="el" href="classInotifyEvent.html#eced3a88a6dea190c5df19c2a6599010">InotifyEvent</a> <li>GetMaxEvents() @@ -92,17 +102,17 @@ <li>GetMaxWatches() : <a class="el" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f">Inotify</a> <li>GetMessage() -: <a class="el" href="classInotifyException.html#1c19a6c919c76332c95970ce7983d016">InotifyException</a> +: <a class="el" href="classInotifyException.html#6364ea375697356805d47cff957dd757">InotifyException</a> <li>GetName() -: <a class="el" href="classInotifyEvent.html#a0524029d360591567c88595cb31df66">InotifyEvent</a> +: <a class="el" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f">InotifyEvent</a> <li>GetPath() -: <a class="el" href="classInotifyWatch.html#89f897a4d98fa54de27730dd8be67966">InotifyWatch</a> +: <a class="el" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2">InotifyWatch</a> <li>GetSource() -: <a class="el" href="classInotifyException.html#568200b75da77cc24927922760b3a5d3">InotifyException</a> +: <a class="el" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408">InotifyException</a> <li>GetWatch() : <a class="el" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">InotifyEvent</a> <li>GetWatchCount() -: <a class="el" href="classInotify.html#b53b7935bda7425b002946d78bfe5863">Inotify</a> +: <a class="el" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075">Inotify</a> </ul> <h3><a class="anchor" name="index_i">- i -</a></h3><ul> <li>Inotify() @@ -114,9 +124,9 @@ <li>InotifyWatch() : <a class="el" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9">InotifyWatch</a> <li>IsEnabled() -: <a class="el" href="classInotifyWatch.html#3d2a5c58a07449bc6ff192f6c14c4de0">InotifyWatch</a> +: <a class="el" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324">InotifyWatch</a> <li>IsRecursive() -: <a class="el" href="classInotifyWatch.html#1c8ab316b54cb7d1d0b17cbbe6b7d2f8">InotifyWatch</a> +: <a class="el" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55">InotifyWatch</a> <li>IsType() : <a class="el" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">InotifyEvent</a> </ul> @@ -160,8 +170,8 @@ <li>~InotifyWatch() : <a class="el" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">InotifyWatch</a> </ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/functions_rela.html b/shared/inotify/doc/html/functions_rela.html index c7108d04..c59a2852 100644 --- a/shared/inotify/doc/html/functions_rela.html +++ b/shared/inotify/doc/html/functions_rela.html @@ -1,29 +1,34 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Class Members - Related Functions</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="annotated.html"><span>Class List</span></a></li> - <li id="current"><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="functions.html"><span>All</span></a></li> - <li><a href="functions_func.html"><span>Functions</span></a></li> - <li><a href="functions_vars.html"><span>Variables</span></a></li> - <li id="current"><a href="functions_rela.html"><span>Related Functions</span></a></li> - </ul> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li class="current"><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="functions.html"><span>All</span></a></li> + <li><a href="functions_func.html"><span>Functions</span></a></li> + <li><a href="functions_vars.html"><span>Variables</span></a></li> + <li class="current"><a href="functions_rela.html"><span>Related Functions</span></a></li> + </ul> + </div> </div> +<div class="contents"> <p> <ul> @@ -32,8 +37,8 @@ <li>InotifyWatch : <a class="el" href="classInotify.html#10880f490c33acd8bd24664fc7bce4ae">Inotify</a> </ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/functions_vars.html b/shared/inotify/doc/html/functions_vars.html index 56dfc9b5..c6f76bf7 100644 --- a/shared/inotify/doc/html/functions_vars.html +++ b/shared/inotify/doc/html/functions_vars.html @@ -1,41 +1,73 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Class Members - Variables</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li id="current"><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="annotated.html"><span>Class List</span></a></li> - <li id="current"><a href="functions.html"><span>Class Members</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="functions.html"><span>All</span></a></li> - <li><a href="functions_func.html"><span>Functions</span></a></li> - <li id="current"><a href="functions_vars.html"><span>Variables</span></a></li> - <li><a href="functions_rela.html"><span>Related Functions</span></a></li> - </ul> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="annotated.html"><span>Class List</span></a></li> + <li class="current"><a href="functions.html"><span>Class Members</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="functions.html"><span>All</span></a></li> + <li><a href="functions_func.html"><span>Functions</span></a></li> + <li class="current"><a href="functions_vars.html"><span>Variables</span></a></li> + <li><a href="functions_rela.html"><span>Related Functions</span></a></li> + </ul> + </div> </div> +<div class="contents"> <p> <ul> +<li>m_buf +: <a class="el" href="classInotify.html#eee7847efd93b681fddac56860fc7958">Inotify</a> <li>m_err : <a class="el" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">InotifyException</a> +<li>m_events +: <a class="el" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">Inotify</a> +<li>m_fd +: <a class="el" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">Inotify</a> +<li>m_fEnabled +: <a class="el" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">InotifyWatch</a> <li>m_msg : <a class="el" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">InotifyException</a> +<li>m_name +: <a class="el" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">InotifyEvent</a> +<li>m_path +: <a class="el" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">InotifyWatch</a> +<li>m_paths +: <a class="el" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">Inotify</a> +<li>m_pInotify +: <a class="el" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">InotifyWatch</a> <li>m_pSrc : <a class="el" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">InotifyException</a> +<li>m_pWatch +: <a class="el" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">InotifyEvent</a> +<li>m_uCookie +: <a class="el" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">InotifyEvent</a> +<li>m_uMask +: <a class="el" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">InotifyWatch</a> +, <a class="el" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">InotifyEvent</a> +<li>m_watches +: <a class="el" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">Inotify</a> +<li>m_wd +: <a class="el" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">InotifyWatch</a> </ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/globals.html b/shared/inotify/doc/html/globals.html index c7601336..52989e59 100644 --- a/shared/inotify/doc/html/globals.html +++ b/shared/inotify/doc/html/globals.html @@ -1,30 +1,35 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Class Members</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li><a href="annotated.html"><span>Classes</span></a></li> - <li id="current"><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="files.html"><span>File List</span></a></li> - <li id="current"><a href="globals.html"><span>File Members</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li id="current"><a href="globals.html"><span>All</span></a></li> - <li><a href="globals_type.html"><span>Typedefs</span></a></li> - <li><a href="globals_enum.html"><span>Enumerations</span></a></li> - <li><a href="globals_eval.html"><span>Enumerator</span></a></li> - <li><a href="globals_defs.html"><span>Defines</span></a></li> - </ul> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Classes</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>File Members</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Defines</span></a></li> + </ul> + </div> </div> +<div class="contents"> Here is a list of all file members with links to the files they belong to: <p> <ul> @@ -69,8 +74,8 @@ Here is a list of all file members with links to the files they belong to: <li>PROCFS_INOTIFY_BASE : <a class="el" href="inotify-cxx_8cpp.html#481097f28678020b2cbb26dd071a0085">inotify-cxx.cpp</a> </ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/globals_defs.html b/shared/inotify/doc/html/globals_defs.html index 33cb5703..6b434a97 100644 --- a/shared/inotify/doc/html/globals_defs.html +++ b/shared/inotify/doc/html/globals_defs.html @@ -1,30 +1,35 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Class Members</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li><a href="annotated.html"><span>Classes</span></a></li> - <li id="current"><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="files.html"><span>File List</span></a></li> - <li id="current"><a href="globals.html"><span>File Members</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="globals.html"><span>All</span></a></li> - <li><a href="globals_type.html"><span>Typedefs</span></a></li> - <li><a href="globals_enum.html"><span>Enumerations</span></a></li> - <li><a href="globals_eval.html"><span>Enumerator</span></a></li> - <li id="current"><a href="globals_defs.html"><span>Defines</span></a></li> - </ul> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Classes</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>File Members</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li class="current"><a href="globals_defs.html"><span>Defines</span></a></li> + </ul> + </div> </div> +<div class="contents"> <p> <ul> @@ -57,8 +62,8 @@ <li>PROCFS_INOTIFY_BASE : <a class="el" href="inotify-cxx_8cpp.html#481097f28678020b2cbb26dd071a0085">inotify-cxx.cpp</a> </ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/globals_enum.html b/shared/inotify/doc/html/globals_enum.html index f5505c8a..58f68878 100644 --- a/shared/inotify/doc/html/globals_enum.html +++ b/shared/inotify/doc/html/globals_enum.html @@ -1,38 +1,43 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Class Members</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li><a href="annotated.html"><span>Classes</span></a></li> - <li id="current"><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="files.html"><span>File List</span></a></li> - <li id="current"><a href="globals.html"><span>File Members</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="globals.html"><span>All</span></a></li> - <li><a href="globals_type.html"><span>Typedefs</span></a></li> - <li id="current"><a href="globals_enum.html"><span>Enumerations</span></a></li> - <li><a href="globals_eval.html"><span>Enumerator</span></a></li> - <li><a href="globals_defs.html"><span>Defines</span></a></li> - </ul> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Classes</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>File Members</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li class="current"><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Defines</span></a></li> + </ul> + </div> </div> +<div class="contents"> <p> <ul> <li>InotifyCapability_t : <a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">inotify-cxx.h</a> </ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/globals_eval.html b/shared/inotify/doc/html/globals_eval.html index 3e27eec9..53cb2d59 100644 --- a/shared/inotify/doc/html/globals_eval.html +++ b/shared/inotify/doc/html/globals_eval.html @@ -1,30 +1,35 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Class Members</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li><a href="annotated.html"><span>Classes</span></a></li> - <li id="current"><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="files.html"><span>File List</span></a></li> - <li id="current"><a href="globals.html"><span>File Members</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="globals.html"><span>All</span></a></li> - <li><a href="globals_type.html"><span>Typedefs</span></a></li> - <li><a href="globals_enum.html"><span>Enumerations</span></a></li> - <li id="current"><a href="globals_eval.html"><span>Enumerator</span></a></li> - <li><a href="globals_defs.html"><span>Defines</span></a></li> - </ul> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Classes</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>File Members</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li class="current"><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Defines</span></a></li> + </ul> + </div> </div> +<div class="contents"> <p> <ul> @@ -35,8 +40,8 @@ <li>IN_MAX_WATCHES : <a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429">inotify-cxx.h</a> </ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/globals_type.html b/shared/inotify/doc/html/globals_type.html index 1e371ed2..3e2f0b63 100644 --- a/shared/inotify/doc/html/globals_type.html +++ b/shared/inotify/doc/html/globals_type.html @@ -1,30 +1,35 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Class Members</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li><a href="annotated.html"><span>Classes</span></a></li> - <li id="current"><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="files.html"><span>File List</span></a></li> - <li id="current"><a href="globals.html"><span>File Members</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="globals.html"><span>All</span></a></li> - <li id="current"><a href="globals_type.html"><span>Typedefs</span></a></li> - <li><a href="globals_enum.html"><span>Enumerations</span></a></li> - <li><a href="globals_eval.html"><span>Enumerator</span></a></li> - <li><a href="globals_defs.html"><span>Defines</span></a></li> - </ul> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Classes</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>File Members</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="globals.html"><span>All</span></a></li> + <li class="current"><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Defines</span></a></li> + </ul> + </div> </div> +<div class="contents"> <p> <ul> @@ -33,8 +38,8 @@ <li>IN_WP_MAP : <a class="el" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">inotify-cxx.h</a> </ul> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/graph_legend.dot b/shared/inotify/doc/html/graph_legend.dot new file mode 100644 index 00000000..9a09018a --- /dev/null +++ b/shared/inotify/doc/html/graph_legend.dot @@ -0,0 +1,22 @@ +digraph G +{ + edge [fontname="FreeSans",fontsize="10",labelfontname="FreeSans",labelfontsize="10"]; + node [fontname="FreeSans",fontsize="10",shape=record]; + Node9 [shape="box",label="Inherited",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",fillcolor="grey75",style="filled" fontcolor="black"]; + Node10 -> Node9 [dir=back,color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"]; + Node10 [shape="box",label="PublicBase",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPublicBase.html"]; + Node11 -> Node10 [dir=back,color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"]; + Node11 [shape="box",label="Truncated",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="red",URL="$classTruncated.html"]; + Node13 -> Node9 [dir=back,color="darkgreen",fontsize="10",style="solid",fontname="FreeSans"]; + Node13 [shape="box",label="ProtectedBase",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classProtectedBase.html"]; + Node14 -> Node9 [dir=back,color="firebrick4",fontsize="10",style="solid",fontname="FreeSans"]; + Node14 [shape="box",label="PrivateBase",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPrivateBase.html"]; + Node15 -> Node9 [dir=back,color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"]; + Node15 [shape="box",label="Undocumented",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="grey75"]; + Node16 -> Node9 [dir=back,color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"]; + Node16 [shape="box",label="Templ< int >",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; + Node17 -> Node16 [dir=back,color="orange",fontsize="10",style="dashed",label="< int >",fontname="FreeSans"]; + Node17 [shape="box",label="Templ< T >",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; + Node18 -> Node9 [dir=back,color="darkorchid3",fontsize="10",style="dashed",label="m_usedClass",fontname="FreeSans"]; + Node18 [shape="box",label="Used",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classUsed.html"]; +} diff --git a/shared/inotify/doc/html/graph_legend.html b/shared/inotify/doc/html/graph_legend.html new file mode 100644 index 00000000..e86c0cf9 --- /dev/null +++ b/shared/inotify/doc/html/graph_legend.html @@ -0,0 +1,84 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> +<title>inotify-cxx: Graph Legend</title> +<link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> +</head><body> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> +</div> +<div class="contents"> +<h1>Graph Legend</h1>This page explains how to interpret the graphs that are generated by doxygen.<p> +Consider the following example: <div class="fragment"><pre class="fragment"><span class="comment">/*! Invisible class because of truncation */</span> +<span class="keyword">class </span>Invisible { }; +<span class="comment"></span> +<span class="comment">/*! Truncated class, inheritance relation is hidden */</span> +<span class="keyword">class </span>Truncated : <span class="keyword">public</span> Invisible { }; + +<span class="comment">/* Class not documented with doxygen comments */</span> +<span class="keyword">class </span>Undocumented { }; +<span class="comment"></span> +<span class="comment">/*! Class that is inherited using public inheritance */</span> +<span class="keyword">class </span>PublicBase : <span class="keyword">public</span> Truncated { }; +<span class="comment"></span> +<span class="comment">/*! A template class */</span> +<span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">class </span>Templ { }; +<span class="comment"></span> +<span class="comment">/*! Class that is inherited using protected inheritance */</span> +<span class="keyword">class </span>ProtectedBase { }; +<span class="comment"></span> +<span class="comment">/*! Class that is inherited using private inheritance */</span> +<span class="keyword">class </span>PrivateBase { }; +<span class="comment"></span> +<span class="comment">/*! Class that is used by the Inherited class */</span> +<span class="keyword">class </span>Used { }; +<span class="comment"></span> +<span class="comment">/*! Super class that inherits a number of other classes */</span> +<span class="keyword">class </span>Inherited : <span class="keyword">public</span> PublicBase, + <span class="keyword">protected</span> ProtectedBase, + <span class="keyword">private</span> PrivateBase, + <span class="keyword">public</span> Undocumented, + <span class="keyword">public</span> Templ<int> +{ + <span class="keyword">private</span>: + Used *m_usedClass; +}; +</pre></div> This will result in the following graph:<p> +<center><div align="center"> +<img src="graph_legend.png" alt="graph_legend.png"> +</div> +</center> <p> +The boxes in the above graph have the following meaning: <ul> +<li> +A filled gray box represents the struct or class for which the graph is generated. </li> +<li> +A box with a black border denotes a documented struct or class. </li> +<li> +A box with a grey border denotes an undocumented struct or class. </li> +<li> +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries. </li> +</ul> +The arrows have the following meaning: <ul> +<li> +A dark blue arrow is used to visualize a public inheritance relation between two classes. </li> +<li> +A dark green arrow is used for protected inheritance. </li> +<li> +A dark red arrow is used for private inheritance. </li> +<li> +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible. </li> +<li> +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance. </li> +</ul> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> +</body> +</html> diff --git a/shared/inotify/doc/html/graph_legend.png b/shared/inotify/doc/html/graph_legend.png Binary files differnew file mode 100644 index 00000000..67057ca1 --- /dev/null +++ b/shared/inotify/doc/html/graph_legend.png diff --git a/shared/inotify/doc/html/index.html b/shared/inotify/doc/html/index.html index aa2d9b87..94cae8a5 100644 --- a/shared/inotify/doc/html/index.html +++ b/shared/inotify/doc/html/index.html @@ -1,20 +1,24 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: Main Page</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li id="current"><a href="index.html"><span>Main Page</span></a></li> - <li><a href="annotated.html"><span>Classes</span></a></li> - <li><a href="files.html"><span>Files</span></a></li> - </ul></div> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li class="current"><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Classes</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> +</div> +<div class="contents"> <h1>inotify-cxx Documentation</h1> <p> -<h3 align="center">0.7.2 </h3><hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +<h3 align="center">0.7.3 </h3></div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/inotify-cxx_8cpp.html b/shared/inotify/doc/html/inotify-cxx_8cpp.html index 3fdd5140..c307e1ca 100644 --- a/shared/inotify/doc/html/inotify-cxx_8cpp.html +++ b/shared/inotify/doc/html/inotify-cxx_8cpp.html @@ -1,27 +1,45 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: inotify-cxx.cpp File Reference</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li><a href="annotated.html"><span>Classes</span></a></li> - <li id="current"><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="files.html"><span>File List</span></a></li> - <li><a href="globals.html"><span>File Members</span></a></li> - </ul></div> -<h1>inotify-cxx.cpp File Reference</h1>inotify C++ interface implementation <a href="#_details">More...</a> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Classes</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>File Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> +<h1>inotify-cxx.cpp File Reference</h1>inotify C++ interface implementation +<a href="#_details">More...</a> <p> <code>#include <errno.h></code><br> <code>#include <unistd.h></code><br> <code>#include <fcntl.h></code><br> -<code>#include "<a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a>"</code><br> +<code>#include <fstream></code><br> +<code>#include <sys/syscall.h></code><br> +<code>#include <sys/inotify-syscalls.h></code><br> +<code>#include "<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>"</code><br> + +<p> +<div class="dynheader"> +Include dependency graph for inotify-cxx.cpp:</div> +<div class="dynsection"> +<p><center><img src="inotify-cxx_8cpp__incl.png" border="0" usemap="#inotify-cxx.cpp_map" alt=""></center> +<map name="inotify-cxx.cpp_map"> +<area shape="rect" href="inotify-cxx_8h.html" title="inotify C++ interface header" alt="" coords="640,80,731,107"></map> +</div> <table border="0" cellpadding="0" cellspacing="0"> <tr><td></td></tr> <tr><td colspan="2"><br><h2>Defines</h2></td></tr> @@ -32,19 +50,20 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">dump separator (between particular entries) <a href="#6e5d8f74743466e712bbaf3b1de1e93d"></a><br></td></tr> </table> -<hr><a name="_details"></a><h2>Detailed Description</h2> +<hr><h2>Detailed Description</h2> inotify C++ interface implementation <p> inotify C++ interface<p> -Copyright (C) 2006, 2007 Lukas Jelinek <<a href="mailto:lukas@aiken.cz">lukas@aiken.cz</a>><p> +Copyright (C) 2006, 2007, 2009 Lukas Jelinek <<a href="mailto:lukas@aiken.cz">lukas@aiken.cz</a>><p> This program is free software; you can redistribute it and/or modify it under the terms of one of the following licenses:<p> <ul> <li>1. X11-style license (see LICENSE-X11) </li> <li>2. GNU Lesser General Public License, version 2.1 (see LICENSE-LGPL) </li> <li>3. GNU General Public License, version 2 (see LICENSE-GPL)</li> </ul> -If you want to help with choosing the best license for you, please visit <a href="http://www.gnu.org/licenses/license-list.html.">http://www.gnu.org/licenses/license-list.html.</a> <hr><h2>Define Documentation</h2> -<a class="anchor" name="6e5d8f74743466e712bbaf3b1de1e93d"></a><!-- doxytag: member="inotify-cxx.cpp::DUMP_SEP" ref="6e5d8f74743466e712bbaf3b1de1e93d" args="" --> +If you want to help with choosing the best license for you, please visit <a href="http://www.gnu.org/licenses/license-list.html.">http://www.gnu.org/licenses/license-list.html.</a><p> +Credits: Mike Frysinger (cleanup of includes) <hr><h2>Define Documentation</h2> +<a class="anchor" name="6e5d8f74743466e712bbaf3b1de1e93d"></a><!-- doxytag: member="inotify-cxx.cpp::DUMP_SEP" ref="6e5d8f74743466e712bbaf3b1de1e93d" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -66,7 +85,7 @@ If you want to help with choosing the best license for you, please visit <a href </div> </div><p> -<a class="anchor" name="481097f28678020b2cbb26dd071a0085"></a><!-- doxytag: member="inotify-cxx.cpp::PROCFS_INOTIFY_BASE" ref="481097f28678020b2cbb26dd071a0085" args="" --> +<a class="anchor" name="481097f28678020b2cbb26dd071a0085"></a><!-- doxytag: member="inotify-cxx.cpp::PROCFS_INOTIFY_BASE" ref="481097f28678020b2cbb26dd071a0085" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -83,8 +102,8 @@ procfs inotify base path </div> </div><p> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/inotify-cxx_8cpp__incl.map b/shared/inotify/doc/html/inotify-cxx_8cpp__incl.map new file mode 100644 index 00000000..7f997b6b --- /dev/null +++ b/shared/inotify/doc/html/inotify-cxx_8cpp__incl.map @@ -0,0 +1 @@ +<area shape="rect" href="$inotify-cxx_8h.html" title="inotify C++ interface header" alt="" coords="640,80,731,107"> diff --git a/shared/inotify/doc/html/inotify-cxx_8cpp__incl.md5 b/shared/inotify/doc/html/inotify-cxx_8cpp__incl.md5 new file mode 100644 index 00000000..9c28c7ef --- /dev/null +++ b/shared/inotify/doc/html/inotify-cxx_8cpp__incl.md5 @@ -0,0 +1 @@ +579c4ee16d330d2021fb9eb25831f079
\ No newline at end of file diff --git a/shared/inotify/doc/html/inotify-cxx_8cpp__incl.png b/shared/inotify/doc/html/inotify-cxx_8cpp__incl.png Binary files differnew file mode 100644 index 00000000..ce7631c7 --- /dev/null +++ b/shared/inotify/doc/html/inotify-cxx_8cpp__incl.png diff --git a/shared/inotify/doc/html/inotify-cxx_8h-source.html b/shared/inotify/doc/html/inotify-cxx_8h-source.html deleted file mode 100644 index 5500b217..00000000 --- a/shared/inotify/doc/html/inotify-cxx_8h-source.html +++ /dev/null @@ -1,505 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> -<title>inotify-cxx: inotify-cxx.h Source File</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> -<link href="tabs.css" rel="stylesheet" type="text/css"> -</head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li><a href="annotated.html"><span>Classes</span></a></li> - <li id="current"><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="files.html"><span>File List</span></a></li> - <li><a href="globals.html"><span>File Members</span></a></li> - </ul></div> -<h1>inotify-cxx.h</h1><a href="inotify-cxx_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 -<a name="l00003"></a>00003 -<a name="l00026"></a>00026 <span class="preprocessor">#ifndef _INOTIFYCXX_H_</span> -<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#define _INOTIFYCXX_H_</span> -<a name="l00028"></a>00028 <span class="preprocessor"></span> -<a name="l00029"></a>00029 <span class="preprocessor">#include <stdint.h></span> -<a name="l00030"></a>00030 <span class="preprocessor">#include <string></span> -<a name="l00031"></a>00031 <span class="preprocessor">#include <deque></span> -<a name="l00032"></a>00032 <span class="preprocessor">#include <map></span> -<a name="l00033"></a>00033 -<a name="l00034"></a>00034 <span class="comment">// Please ensure that the following headers take the right place</span> -<a name="l00035"></a>00035 <span class="preprocessor">#include <sys/syscall.h></span> -<a name="l00036"></a>00036 <span class="preprocessor">#include <sys/inotify.h></span> -<a name="l00037"></a>00037 -<a name="l00038"></a>00038 <span class="comment">// Use this if syscalls not defined</span> -<a name="l00039"></a>00039 <span class="preprocessor">#ifndef __NR_inotify_init</span> -<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#include <sys/inotify-syscalls.h></span> -<a name="l00041"></a>00041 <span class="preprocessor">#endif // __NR_inotify_init</span> -<a name="l00042"></a>00042 <span class="preprocessor"></span> -<a name="l00044"></a><a class="code" href="inotify-cxx_8h.html#f64b4cc985ba26f31a9cb242153a5014">00044</a> <span class="preprocessor">#define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event))</span> -<a name="l00045"></a>00045 <span class="preprocessor"></span> -<a name="l00047"></a><a class="code" href="inotify-cxx_8h.html#a84911f8e42d71161b60d4a28940abb4">00047</a> <span class="preprocessor">#define INOTIFY_BUFLEN (1024 * (INOTIFY_EVENT_SIZE + 16))</span> -<a name="l00048"></a>00048 <span class="preprocessor"></span> -<a name="l00050"></a>00050 -<a name="l00053"></a><a class="code" href="inotify-cxx_8h.html#fe6b93f7e09db7022f1f9dd102932e12">00053</a> <span class="preprocessor">#define IN_EXC_MSG(msg) (std::string(__PRETTY_FUNCTION__) + ": " + msg)</span> -<a name="l00054"></a>00054 <span class="preprocessor"></span> -<a name="l00056"></a><a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">00056</a> <span class="keyword">typedef</span> <span class="keyword">enum</span> -<a name="l00057"></a>00057 { -<a name="l00058"></a>00058 <a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1">IN_MAX_EVENTS</a> = 0, -<a name="l00059"></a>00059 <a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9">IN_MAX_INSTANCES</a> = 1, -<a name="l00060"></a><a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429">00060</a> <a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429">IN_MAX_WATCHES</a> = 2 -<a name="l00061"></a>00061 } <a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a>; -<a name="l00062"></a>00062 -<a name="l00064"></a>00064 -<a name="l00082"></a>00082 <span class="preprocessor">#ifdef INOTIFY_THREAD_SAFE</span> -<a name="l00083"></a>00083 <span class="preprocessor"></span> -<a name="l00084"></a>00084 <span class="preprocessor">#include <pthread.h></span> -<a name="l00085"></a>00085 -<a name="l00086"></a>00086 <span class="preprocessor">#define IN_LOCK_DECL mutable pthread_rwlock_t __m_lock;</span> -<a name="l00087"></a>00087 <span class="preprocessor"></span> -<a name="l00088"></a>00088 <span class="preprocessor">#define IN_LOCK_INIT \</span> -<a name="l00089"></a>00089 <span class="preprocessor"> { \</span> -<a name="l00090"></a>00090 <span class="preprocessor"> pthread_rwlockattr_t attr; \</span> -<a name="l00091"></a>00091 <span class="preprocessor"> int res = 0; \</span> -<a name="l00092"></a>00092 <span class="preprocessor"> if ((res = pthread_rwlockattr_init(&attr)) != 0) \</span> -<a name="l00093"></a>00093 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("cannot initialize lock attributes"), res, this); \</span> -<a name="l00094"></a>00094 <span class="preprocessor"> if ((res = pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NP)) != 0) \</span> -<a name="l00095"></a>00095 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("cannot set lock kind"), res, this); \</span> -<a name="l00096"></a>00096 <span class="preprocessor"> if ((res = pthread_rwlock_init(&__m_lock, &attr)) != 0) \</span> -<a name="l00097"></a>00097 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("cannot initialize lock"), res, this); \</span> -<a name="l00098"></a>00098 <span class="preprocessor"> pthread_rwlockattr_destroy(&attr); \</span> -<a name="l00099"></a>00099 <span class="preprocessor"> }</span> -<a name="l00100"></a>00100 <span class="preprocessor"></span> -<a name="l00101"></a>00101 <span class="preprocessor">#define IN_LOCK_DONE pthread_rwlock_destroy(&__m_lock);</span> -<a name="l00102"></a>00102 <span class="preprocessor"></span> -<a name="l00103"></a>00103 <span class="preprocessor">#define IN_READ_BEGIN \</span> -<a name="l00104"></a>00104 <span class="preprocessor"> { \</span> -<a name="l00105"></a>00105 <span class="preprocessor"> int res = pthread_rwlock_rdlock(&__m_lock); \</span> -<a name="l00106"></a>00106 <span class="preprocessor"> if (res != 0) \</span> -<a name="l00107"></a>00107 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("locking for reading failed"), res, (void*) this); \</span> -<a name="l00108"></a>00108 <span class="preprocessor"> }</span> -<a name="l00109"></a>00109 <span class="preprocessor"></span> -<a name="l00110"></a>00110 <span class="preprocessor">#define IN_READ_END \</span> -<a name="l00111"></a>00111 <span class="preprocessor"> { \</span> -<a name="l00112"></a>00112 <span class="preprocessor"> int res = pthread_rwlock_unlock(&__m_lock); \</span> -<a name="l00113"></a>00113 <span class="preprocessor"> if (res != 0) \</span> -<a name="l00114"></a>00114 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("unlocking failed"), res, (void*) this); \</span> -<a name="l00115"></a>00115 <span class="preprocessor"> }</span> -<a name="l00116"></a>00116 <span class="preprocessor"></span> -<a name="l00117"></a>00117 <span class="preprocessor">#define IN_READ_END_NOTHROW pthread_rwlock_unlock(&__m_lock);</span> -<a name="l00118"></a>00118 <span class="preprocessor"></span> -<a name="l00119"></a>00119 <span class="preprocessor">#define IN_WRITE_BEGIN \</span> -<a name="l00120"></a>00120 <span class="preprocessor"> { \</span> -<a name="l00121"></a>00121 <span class="preprocessor"> int res = pthread_rwlock_wrlock(&__m_lock); \</span> -<a name="l00122"></a>00122 <span class="preprocessor"> if (res != 0) \</span> -<a name="l00123"></a>00123 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("locking for writing failed"), res, (void*) this); \</span> -<a name="l00124"></a>00124 <span class="preprocessor"> }</span> -<a name="l00125"></a>00125 <span class="preprocessor"></span> -<a name="l00126"></a>00126 <span class="preprocessor">#define IN_WRITE_END IN_READ_END</span> -<a name="l00127"></a>00127 <span class="preprocessor"></span><span class="preprocessor">#define IN_WRITE_END_NOTHROW IN_READ_END_NOTHROW</span> -<a name="l00128"></a>00128 <span class="preprocessor"></span> -<a name="l00129"></a>00129 <span class="preprocessor">#else // INOTIFY_THREAD_SAFE</span> -<a name="l00130"></a>00130 <span class="preprocessor"></span> -<a name="l00131"></a><a class="code" href="inotify-cxx_8h.html#904d25c0fd931e1bad4f9d5cd346a766">00131</a> <span class="preprocessor">#define IN_LOCK_DECL</span> -<a name="l00132"></a><a class="code" href="inotify-cxx_8h.html#981aa546075fba39715fd2f63a41f575">00132</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_LOCK_INIT</span> -<a name="l00133"></a><a class="code" href="inotify-cxx_8h.html#08422ec66fb587c1684afbaa575a53dd">00133</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_LOCK_DONE</span> -<a name="l00134"></a><a class="code" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">00134</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_READ_BEGIN</span> -<a name="l00135"></a><a class="code" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">00135</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_READ_END</span> -<a name="l00136"></a><a class="code" href="inotify-cxx_8h.html#5c6a5be1898ef17662795cc4b420c851">00136</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_READ_END_NOTHROW</span> -<a name="l00137"></a><a class="code" href="inotify-cxx_8h.html#c3a6d87ace9403f7ac58f931bbcd9599">00137</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_WRITE_BEGIN</span> -<a name="l00138"></a><a class="code" href="inotify-cxx_8h.html#f8aeac51b3b4ef56f1791c5c1a2e9cf5">00138</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_WRITE_END</span> -<a name="l00139"></a><a class="code" href="inotify-cxx_8h.html#7e68c4884137939c5e3301f40c198dc7">00139</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_WRITE_END_NOTHROW</span> -<a name="l00140"></a>00140 <span class="preprocessor"></span> -<a name="l00141"></a>00141 <span class="preprocessor">#endif // INOTIFY_THREAD_SAFE</span> -<a name="l00142"></a>00142 <span class="preprocessor"></span> -<a name="l00143"></a>00143 -<a name="l00144"></a>00144 -<a name="l00145"></a>00145 -<a name="l00146"></a>00146 <span class="comment">// forward declaration</span> -<a name="l00147"></a>00147 <span class="keyword">class </span><a class="code" href="classInotifyWatch.html">InotifyWatch</a>; -<a name="l00148"></a>00148 <span class="keyword">class </span><a class="code" href="classInotify.html">Inotify</a>; -<a name="l00149"></a>00149 -<a name="l00150"></a>00150 -<a name="l00152"></a>00152 -<a name="l00160"></a><a class="code" href="classInotifyException.html">00160</a> <span class="keyword">class </span><a class="code" href="classInotifyException.html">InotifyException</a> -<a name="l00161"></a>00161 { -<a name="l00162"></a>00162 <span class="keyword">public</span>: -<a name="l00164"></a>00164 -<a name="l00169"></a><a class="code" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb">00169</a> <a class="code" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb">InotifyException</a>(<span class="keyword">const</span> std::string& rMsg = <span class="stringliteral">""</span>, <span class="keywordtype">int</span> iErr = 0, <span class="keywordtype">void</span>* pSrc = NULL) -<a name="l00170"></a>00170 : <a class="code" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">m_msg</a>(rMsg), -<a name="l00171"></a>00171 <a class="code" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">m_err</a>(iErr) -<a name="l00172"></a>00172 { -<a name="l00173"></a>00173 <a class="code" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">m_pSrc</a> = pSrc; -<a name="l00174"></a>00174 } -<a name="l00175"></a>00175 -<a name="l00177"></a>00177 -<a name="l00180"></a><a class="code" href="classInotifyException.html#1c19a6c919c76332c95970ce7983d016">00180</a> <span class="keyword">inline</span> <span class="keyword">const</span> std::string& <a class="code" href="classInotifyException.html#1c19a6c919c76332c95970ce7983d016">GetMessage</a>()<span class="keyword"> const</span> -<a name="l00181"></a>00181 <span class="keyword"> </span>{ -<a name="l00182"></a>00182 <span class="keywordflow">return</span> <a class="code" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">m_msg</a>; -<a name="l00183"></a>00183 } -<a name="l00184"></a>00184 -<a name="l00186"></a>00186 -<a name="l00191"></a><a class="code" href="classInotifyException.html#3fda7827f1561f610e40bcd217bdc6fe">00191</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classInotifyException.html#3fda7827f1561f610e40bcd217bdc6fe">GetErrorNumber</a>()<span class="keyword"> const</span> -<a name="l00192"></a>00192 <span class="keyword"> </span>{ -<a name="l00193"></a>00193 <span class="keywordflow">return</span> <a class="code" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">m_err</a>; -<a name="l00194"></a>00194 } -<a name="l00195"></a>00195 -<a name="l00197"></a>00197 -<a name="l00200"></a><a class="code" href="classInotifyException.html#568200b75da77cc24927922760b3a5d3">00200</a> <span class="keyword">inline</span> <span class="keywordtype">void</span>* <a class="code" href="classInotifyException.html#568200b75da77cc24927922760b3a5d3">GetSource</a>()<span class="keyword"> const</span> -<a name="l00201"></a>00201 <span class="keyword"> </span>{ -<a name="l00202"></a>00202 <span class="keywordflow">return</span> <a class="code" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">m_pSrc</a>; -<a name="l00203"></a>00203 } -<a name="l00204"></a>00204 -<a name="l00205"></a>00205 <span class="keyword">protected</span>: -<a name="l00206"></a><a class="code" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">00206</a> std::string <a class="code" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">m_msg</a>; -<a name="l00207"></a><a class="code" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">00207</a> <span class="keywordtype">int</span> <a class="code" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">m_err</a>; -<a name="l00208"></a><a class="code" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">00208</a> <span class="keyword">mutable</span> <span class="keywordtype">void</span>* <a class="code" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">m_pSrc</a>; -<a name="l00209"></a>00209 }; -<a name="l00210"></a>00210 -<a name="l00211"></a>00211 -<a name="l00213"></a>00213 -<a name="l00221"></a><a class="code" href="classInotifyEvent.html">00221</a> <span class="keyword">class </span><a class="code" href="classInotifyEvent.html">InotifyEvent</a> -<a name="l00222"></a>00222 { -<a name="l00223"></a>00223 <span class="keyword">public</span>: -<a name="l00225"></a>00225 -<a name="l00228"></a><a class="code" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046">00228</a> <a class="code" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046">InotifyEvent</a>() -<a name="l00229"></a>00229 : m_uMask(0), -<a name="l00230"></a>00230 m_uCookie(0) -<a name="l00231"></a>00231 { -<a name="l00232"></a>00232 m_pWatch = NULL; -<a name="l00233"></a>00233 } -<a name="l00234"></a>00234 -<a name="l00236"></a>00236 -<a name="l00243"></a><a class="code" href="classInotifyEvent.html#6d7f3fc0f51580da4a3ec2348609df64">00243</a> <a class="code" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046">InotifyEvent</a>(<span class="keyword">const</span> <span class="keyword">struct</span> inotify_event* pEvt, <a class="code" href="classInotifyWatch.html">InotifyWatch</a>* pWatch) -<a name="l00244"></a>00244 : m_uMask(0), -<a name="l00245"></a>00245 m_uCookie(0) -<a name="l00246"></a>00246 { -<a name="l00247"></a>00247 <span class="keywordflow">if</span> (pEvt != NULL) { -<a name="l00248"></a>00248 m_uMask = (uint32_t) pEvt->mask; -<a name="l00249"></a>00249 m_uCookie = (uint32_t) pEvt->cookie; -<a name="l00250"></a>00250 <span class="keywordflow">if</span> (pEvt->name != NULL) { -<a name="l00251"></a>00251 m_name = pEvt->len > 0 -<a name="l00252"></a>00252 ? pEvt->name -<a name="l00253"></a>00253 : <span class="stringliteral">""</span>; -<a name="l00254"></a>00254 } -<a name="l00255"></a>00255 m_pWatch = pWatch; -<a name="l00256"></a>00256 } -<a name="l00257"></a>00257 <span class="keywordflow">else</span> { -<a name="l00258"></a>00258 m_pWatch = NULL; -<a name="l00259"></a>00259 } -<a name="l00260"></a>00260 } -<a name="l00261"></a>00261 -<a name="l00263"></a><a class="code" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888">00263</a> <a class="code" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888">~InotifyEvent</a>() {} -<a name="l00264"></a>00264 -<a name="l00266"></a>00266 -<a name="l00271"></a>00271 int32_t <a class="code" href="classInotifyEvent.html#83958af6b634d47173bde81b3bd5bbe6">GetDescriptor</a>() <span class="keyword">const</span>; -<a name="l00272"></a>00272 -<a name="l00274"></a>00274 -<a name="l00279"></a><a class="code" href="classInotifyEvent.html#2aadeb49530a62b06d98e22c335b1ec8">00279</a> <span class="keyword">inline</span> uint32_t <a class="code" href="classInotifyEvent.html#2aadeb49530a62b06d98e22c335b1ec8">GetMask</a>()<span class="keyword"> const</span> -<a name="l00280"></a>00280 <span class="keyword"> </span>{ -<a name="l00281"></a>00281 <span class="keywordflow">return</span> m_uMask; -<a name="l00282"></a>00282 } -<a name="l00283"></a>00283 -<a name="l00285"></a>00285 -<a name="l00290"></a><a class="code" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">00290</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">IsType</a>(uint32_t uValue, uint32_t uType) -<a name="l00291"></a>00291 { -<a name="l00292"></a>00292 <span class="keywordflow">return</span> ((uValue & uType) != 0) && ((~uValue & uType) == 0); -<a name="l00293"></a>00293 } -<a name="l00294"></a>00294 -<a name="l00296"></a>00296 -<a name="l00300"></a><a class="code" href="classInotifyEvent.html#7fdee6664ec63ccc87ff1221abba9abc">00300</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">IsType</a>(uint32_t uType)<span class="keyword"> const</span> -<a name="l00301"></a>00301 <span class="keyword"> </span>{ -<a name="l00302"></a>00302 <span class="keywordflow">return</span> <a class="code" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">IsType</a>(m_uMask, uType); -<a name="l00303"></a>00303 } -<a name="l00304"></a>00304 -<a name="l00306"></a>00306 -<a name="l00309"></a><a class="code" href="classInotifyEvent.html#441dfd50abda0e81eb7e4f6d33c68e96">00309</a> <span class="keyword">inline</span> uint32_t <a class="code" href="classInotifyEvent.html#441dfd50abda0e81eb7e4f6d33c68e96">GetCookie</a>()<span class="keyword"> const</span> -<a name="l00310"></a>00310 <span class="keyword"> </span>{ -<a name="l00311"></a>00311 <span class="keywordflow">return</span> m_uCookie; -<a name="l00312"></a>00312 } -<a name="l00313"></a>00313 -<a name="l00315"></a>00315 -<a name="l00318"></a><a class="code" href="classInotifyEvent.html#111954d74f0320745a68ef030064e987">00318</a> <span class="keyword">inline</span> uint32_t <a class="code" href="classInotifyEvent.html#111954d74f0320745a68ef030064e987">GetLength</a>()<span class="keyword"> const</span> -<a name="l00319"></a>00319 <span class="keyword"> </span>{ -<a name="l00320"></a>00320 <span class="keywordflow">return</span> (uint32_t) m_name.length(); -<a name="l00321"></a>00321 } -<a name="l00322"></a>00322 -<a name="l00324"></a>00324 -<a name="l00327"></a><a class="code" href="classInotifyEvent.html#a0524029d360591567c88595cb31df66">00327</a> <span class="keyword">inline</span> <span class="keyword">const</span> std::string& <a class="code" href="classInotifyEvent.html#a0524029d360591567c88595cb31df66">GetName</a>()<span class="keyword"> const</span> -<a name="l00328"></a>00328 <span class="keyword"> </span>{ -<a name="l00329"></a>00329 <span class="keywordflow">return</span> m_name; -<a name="l00330"></a>00330 } -<a name="l00331"></a>00331 -<a name="l00333"></a>00333 -<a name="l00336"></a><a class="code" href="classInotifyEvent.html#e053c52feebf6dae5a762e6baeba93db">00336</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classInotifyEvent.html#a0524029d360591567c88595cb31df66">GetName</a>(std::string& rName)<span class="keyword"> const</span> -<a name="l00337"></a>00337 <span class="keyword"> </span>{ -<a name="l00338"></a>00338 rName = <a class="code" href="classInotifyEvent.html#a0524029d360591567c88595cb31df66">GetName</a>(); -<a name="l00339"></a>00339 } -<a name="l00340"></a>00340 -<a name="l00342"></a>00342 -<a name="l00345"></a><a class="code" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">00345</a> <span class="keyword">inline</span> <a class="code" href="classInotifyWatch.html">InotifyWatch</a>* <a class="code" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">GetWatch</a>() -<a name="l00346"></a>00346 { -<a name="l00347"></a>00347 <span class="keywordflow">return</span> m_pWatch; -<a name="l00348"></a>00348 } -<a name="l00349"></a>00349 -<a name="l00351"></a>00351 -<a name="l00355"></a>00355 <span class="keyword">static</span> uint32_t <a class="code" href="classInotifyEvent.html#eced3a88a6dea190c5df19c2a6599010">GetMaskByName</a>(<span class="keyword">const</span> std::string& rName); -<a name="l00356"></a>00356 -<a name="l00358"></a>00358 -<a name="l00362"></a>00362 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5">DumpTypes</a>(uint32_t uValue, std::string& rStr); -<a name="l00363"></a>00363 -<a name="l00365"></a>00365 -<a name="l00368"></a>00368 <span class="keywordtype">void</span> <a class="code" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5">DumpTypes</a>(std::string& rStr) <span class="keyword">const</span>; -<a name="l00369"></a>00369 -<a name="l00370"></a>00370 <span class="keyword">private</span>: -<a name="l00371"></a>00371 uint32_t m_uMask; -<a name="l00372"></a>00372 uint32_t m_uCookie; -<a name="l00373"></a>00373 std::string m_name; -<a name="l00374"></a>00374 <a class="code" href="classInotifyWatch.html">InotifyWatch</a>* m_pWatch; -<a name="l00375"></a>00375 }; -<a name="l00376"></a>00376 -<a name="l00377"></a>00377 -<a name="l00378"></a>00378 -<a name="l00380"></a>00380 -<a name="l00386"></a><a class="code" href="classInotifyWatch.html">00386</a> <span class="keyword">class </span><a class="code" href="classInotifyWatch.html">InotifyWatch</a> -<a name="l00387"></a>00387 { -<a name="l00388"></a>00388 <span class="keyword">public</span>: -<a name="l00390"></a>00390 -<a name="l00398"></a><a class="code" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9">00398</a> <a class="code" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9">InotifyWatch</a>(<span class="keyword">const</span> std::string& rPath, int32_t uMask, <span class="keywordtype">bool</span> fEnabled = <span class="keyword">true</span>) -<a name="l00399"></a>00399 : m_path(rPath), -<a name="l00400"></a>00400 m_uMask(uMask), -<a name="l00401"></a>00401 m_wd((int32_t) -1), -<a name="l00402"></a>00402 m_fEnabled(fEnabled) -<a name="l00403"></a>00403 { -<a name="l00404"></a>00404 <a class="code" href="inotify-cxx_8h.html#981aa546075fba39715fd2f63a41f575">IN_LOCK_INIT</a> -<a name="l00405"></a>00405 } -<a name="l00406"></a>00406 -<a name="l00408"></a><a class="code" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">00408</a> <a class="code" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">~InotifyWatch</a>() -<a name="l00409"></a>00409 { -<a name="l00410"></a>00410 <a class="code" href="inotify-cxx_8h.html#08422ec66fb587c1684afbaa575a53dd">IN_LOCK_DONE</a> -<a name="l00411"></a>00411 } -<a name="l00412"></a>00412 -<a name="l00414"></a>00414 -<a name="l00417"></a><a class="code" href="classInotifyWatch.html#df771e1f81e2a6cc2780c9d2470e34c6">00417</a> <span class="keyword">inline</span> int32_t <a class="code" href="classInotifyWatch.html#df771e1f81e2a6cc2780c9d2470e34c6">GetDescriptor</a>()<span class="keyword"> const</span> -<a name="l00418"></a>00418 <span class="keyword"> </span>{ -<a name="l00419"></a>00419 <span class="keywordflow">return</span> m_wd; -<a name="l00420"></a>00420 } -<a name="l00421"></a>00421 -<a name="l00423"></a>00423 -<a name="l00426"></a><a class="code" href="classInotifyWatch.html#89f897a4d98fa54de27730dd8be67966">00426</a> <span class="keyword">inline</span> <span class="keyword">const</span> std::string& <a class="code" href="classInotifyWatch.html#89f897a4d98fa54de27730dd8be67966">GetPath</a>()<span class="keyword"> const</span> -<a name="l00427"></a>00427 <span class="keyword"> </span>{ -<a name="l00428"></a>00428 <span class="keywordflow">return</span> m_path; -<a name="l00429"></a>00429 } -<a name="l00430"></a>00430 -<a name="l00432"></a>00432 -<a name="l00435"></a><a class="code" href="classInotifyWatch.html#bab761a989c9fdf73aaad2a58e1ba7a0">00435</a> <span class="keyword">inline</span> uint32_t <a class="code" href="classInotifyWatch.html#bab761a989c9fdf73aaad2a58e1ba7a0">GetMask</a>()<span class="keyword"> const</span> -<a name="l00436"></a>00436 <span class="keyword"> </span>{ -<a name="l00437"></a>00437 <span class="keywordflow">return</span> (uint32_t) m_uMask; -<a name="l00438"></a>00438 } -<a name="l00439"></a>00439 -<a name="l00441"></a>00441 -<a name="l00450"></a>00450 <span class="keywordtype">void</span> <a class="code" href="classInotifyWatch.html#3ad7fbc55c21b3fcd08c2d1d388e14b6">SetMask</a>(uint32_t uMask) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00451"></a>00451 -<a name="l00453"></a>00453 -<a name="l00456"></a><a class="code" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0">00456</a> <span class="keyword">inline</span> <a class="code" href="classInotify.html">Inotify</a>* <a class="code" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0">GetInotify</a>() -<a name="l00457"></a>00457 { -<a name="l00458"></a>00458 <span class="keywordflow">return</span> m_pInotify; -<a name="l00459"></a>00459 } -<a name="l00460"></a>00460 -<a name="l00462"></a>00462 -<a name="l00473"></a>00473 <span class="keywordtype">void</span> <a class="code" href="classInotifyWatch.html#a71aff8650fadff32a3c655ca50945f1">SetEnabled</a>(<span class="keywordtype">bool</span> fEnabled) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00474"></a>00474 -<a name="l00476"></a>00476 -<a name="l00479"></a><a class="code" href="classInotifyWatch.html#3d2a5c58a07449bc6ff192f6c14c4de0">00479</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classInotifyWatch.html#3d2a5c58a07449bc6ff192f6c14c4de0">IsEnabled</a>()<span class="keyword"> const</span> -<a name="l00480"></a>00480 <span class="keyword"> </span>{ -<a name="l00481"></a>00481 <span class="keywordflow">return</span> m_fEnabled; -<a name="l00482"></a>00482 } -<a name="l00483"></a>00483 -<a name="l00485"></a>00485 -<a name="l00494"></a><a class="code" href="classInotifyWatch.html#1c8ab316b54cb7d1d0b17cbbe6b7d2f8">00494</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classInotifyWatch.html#1c8ab316b54cb7d1d0b17cbbe6b7d2f8">IsRecursive</a>()<span class="keyword"> const</span> -<a name="l00495"></a>00495 <span class="keyword"> </span>{ -<a name="l00496"></a>00496 <span class="keywordflow">return</span> <span class="keyword">false</span>; -<a name="l00497"></a>00497 } -<a name="l00498"></a>00498 -<a name="l00499"></a>00499 <span class="keyword">private</span>: -<a name="l00500"></a><a class="code" href="classInotifyWatch.html#94bfb861dc18ca5d16abfcff90db8c86">00500</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classInotify.html">Inotify</a>; -<a name="l00501"></a>00501 -<a name="l00502"></a>00502 std::string m_path; -<a name="l00503"></a>00503 uint32_t m_uMask; -<a name="l00504"></a>00504 int32_t m_wd; -<a name="l00505"></a>00505 <a class="code" href="classInotify.html">Inotify</a>* m_pInotify; -<a name="l00506"></a>00506 <span class="keywordtype">bool</span> m_fEnabled; -<a name="l00507"></a>00507 -<a name="l00508"></a>00508 <a class="code" href="inotify-cxx_8h.html#904d25c0fd931e1bad4f9d5cd346a766">IN_LOCK_DECL</a> -<a name="l00509"></a>00509 -<a name="l00511"></a>00511 -<a name="l00516"></a>00516 <span class="keywordtype">void</span> __Disable(); -<a name="l00517"></a>00517 }; -<a name="l00518"></a>00518 -<a name="l00519"></a>00519 -<a name="l00521"></a><a class="code" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">00521</a> <span class="keyword">typedef</span> std::map<int32_t, InotifyWatch*> <a class="code" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">IN_WATCH_MAP</a>; -<a name="l00522"></a>00522 -<a name="l00524"></a><a class="code" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">00524</a> <span class="keyword">typedef</span> std::map<std::string, InotifyWatch*> <a class="code" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">IN_WP_MAP</a>; -<a name="l00525"></a>00525 -<a name="l00526"></a>00526 -<a name="l00528"></a>00528 -<a name="l00534"></a><a class="code" href="classInotify.html">00534</a> <span class="keyword">class </span><a class="code" href="classInotify.html">Inotify</a> -<a name="l00535"></a>00535 { -<a name="l00536"></a>00536 <span class="keyword">public</span>: -<a name="l00538"></a>00538 -<a name="l00544"></a>00544 <a class="code" href="classInotify.html#a6fe6e9cb3343665eb968fcd5170cfb9">Inotify</a>() <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00545"></a>00545 -<a name="l00547"></a>00547 -<a name="l00550"></a>00550 <a class="code" href="classInotify.html#f19dd5e491395673e4798eb9dbf5f682">~Inotify</a>(); -<a name="l00551"></a>00551 -<a name="l00553"></a>00553 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#86ae86c43ea1a72f562ca46393309635">Close</a>(); -<a name="l00554"></a>00554 -<a name="l00556"></a>00556 -<a name="l00561"></a>00561 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83">Add</a>(<a class="code" href="classInotifyWatch.html">InotifyWatch</a>* pWatch) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00562"></a>00562 -<a name="l00564"></a>00564 -<a name="l00569"></a><a class="code" href="classInotify.html#35dab56d3e10bf28b5e457871adddb58">00569</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83">Add</a>(<a class="code" href="classInotifyWatch.html">InotifyWatch</a>& rWatch) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>) -<a name="l00570"></a>00570 { -<a name="l00571"></a>00571 <a class="code" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83">Add</a>(&rWatch); -<a name="l00572"></a>00572 } -<a name="l00573"></a>00573 -<a name="l00575"></a>00575 -<a name="l00582"></a>00582 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84">Remove</a>(<a class="code" href="classInotifyWatch.html">InotifyWatch</a>* pWatch) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00583"></a>00583 -<a name="l00585"></a>00585 -<a name="l00592"></a><a class="code" href="classInotify.html#ac1a52b2ff6bfec07021a44e55d496a6">00592</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84">Remove</a>(<a class="code" href="classInotifyWatch.html">InotifyWatch</a>& rWatch) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>) -<a name="l00593"></a>00593 { -<a name="l00594"></a>00594 <a class="code" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84">Remove</a>(&rWatch); -<a name="l00595"></a>00595 } -<a name="l00596"></a>00596 -<a name="l00598"></a>00598 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#bc1fd5830ca561efb69bcd2283981741">RemoveAll</a>(); -<a name="l00599"></a>00599 -<a name="l00601"></a>00601 -<a name="l00609"></a><a class="code" href="classInotify.html#b53b7935bda7425b002946d78bfe5863">00609</a> <span class="keyword">inline</span> size_t <a class="code" href="classInotify.html#b53b7935bda7425b002946d78bfe5863">GetWatchCount</a>()<span class="keyword"> const</span> -<a name="l00610"></a>00610 <span class="keyword"> </span>{ -<a name="l00611"></a>00611 <a class="code" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">IN_READ_BEGIN</a> -<a name="l00612"></a>00612 size_t n = (size_t) m_paths.size(); -<a name="l00613"></a>00613 <a class="code" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">IN_READ_END</a> -<a name="l00614"></a>00614 <span class="keywordflow">return</span> n; -<a name="l00615"></a>00615 } -<a name="l00616"></a>00616 -<a name="l00618"></a>00618 -<a name="l00623"></a><a class="code" href="classInotify.html#9bf5f7716649d5b5f468c2242fb5e099">00623</a> <span class="keyword">inline</span> size_t <a class="code" href="classInotify.html#9bf5f7716649d5b5f468c2242fb5e099">GetEnabledCount</a>()<span class="keyword"> const</span> -<a name="l00624"></a>00624 <span class="keyword"> </span>{ -<a name="l00625"></a>00625 <a class="code" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">IN_READ_BEGIN</a> -<a name="l00626"></a>00626 size_t n = (size_t) m_watches.size(); -<a name="l00627"></a>00627 <a class="code" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">IN_READ_END</a> -<a name="l00628"></a>00628 <span class="keywordflow">return</span> n; -<a name="l00629"></a>00629 } -<a name="l00630"></a>00630 -<a name="l00632"></a>00632 -<a name="l00643"></a>00643 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b">WaitForEvents</a>(<span class="keywordtype">bool</span> fNoIntr = <span class="keyword">false</span>) throw (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00644"></a>00644 -<a name="l00646"></a>00646 -<a name="l00652"></a><a class="code" href="classInotify.html#a3c533f956871f904949832ac8f5fbde">00652</a> inline size_t <a class="code" href="classInotify.html#a3c533f956871f904949832ac8f5fbde">GetEventCount</a>() -<a name="l00653"></a>00653 { -<a name="l00654"></a>00654 <a class="code" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">IN_READ_BEGIN</a> -<a name="l00655"></a>00655 size_t n = (size_t) m_events.size(); -<a name="l00656"></a>00656 <a class="code" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">IN_READ_END</a> -<a name="l00657"></a>00657 <span class="keywordflow">return</span> n; -<a name="l00658"></a>00658 } -<a name="l00659"></a>00659 -<a name="l00661"></a>00661 -<a name="l00669"></a>00669 <span class="keywordtype">bool</span> <a class="code" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008">GetEvent</a>(<a class="code" href="classInotifyEvent.html">InotifyEvent</a>* pEvt) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00670"></a>00670 -<a name="l00672"></a>00672 -<a name="l00679"></a><a class="code" href="classInotify.html#b028c8fa988f6bbb2ef773db3ea3a2d3">00679</a> <span class="keywordtype">bool</span> <a class="code" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008">GetEvent</a>(<a class="code" href="classInotifyEvent.html">InotifyEvent</a>& rEvt) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>) -<a name="l00680"></a>00680 { -<a name="l00681"></a>00681 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008">GetEvent</a>(&rEvt); -<a name="l00682"></a>00682 } -<a name="l00683"></a>00683 -<a name="l00685"></a>00685 -<a name="l00693"></a>00693 <span class="keywordtype">bool</span> <a class="code" href="classInotify.html#19cde43d082ff92bd02654610019300d">PeekEvent</a>(<a class="code" href="classInotifyEvent.html">InotifyEvent</a>* pEvt) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00694"></a>00694 -<a name="l00696"></a>00696 -<a name="l00703"></a><a class="code" href="classInotify.html#287dc0d238fa6edc3269441cb284f979">00703</a> <span class="keywordtype">bool</span> <a class="code" href="classInotify.html#19cde43d082ff92bd02654610019300d">PeekEvent</a>(<a class="code" href="classInotifyEvent.html">InotifyEvent</a>& rEvt) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>) -<a name="l00704"></a>00704 { -<a name="l00705"></a>00705 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#19cde43d082ff92bd02654610019300d">PeekEvent</a>(&rEvt); -<a name="l00706"></a>00706 } -<a name="l00707"></a>00707 -<a name="l00709"></a>00709 -<a name="l00715"></a>00715 <a class="code" href="classInotifyWatch.html">InotifyWatch</a>* <a class="code" href="classInotify.html#182d19b667c9e0899802b70a579eff40">FindWatch</a>(<span class="keywordtype">int</span> iDescriptor); -<a name="l00716"></a>00716 -<a name="l00718"></a>00718 -<a name="l00728"></a>00728 <a class="code" href="classInotifyWatch.html">InotifyWatch</a>* <a class="code" href="classInotify.html#182d19b667c9e0899802b70a579eff40">FindWatch</a>(<span class="keyword">const</span> std::string& rPath); -<a name="l00729"></a>00729 -<a name="l00731"></a>00731 -<a name="l00739"></a><a class="code" href="classInotify.html#678271faf4799840ad71805163a24b13">00739</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classInotify.html#678271faf4799840ad71805163a24b13">GetDescriptor</a>()<span class="keyword"> const</span> -<a name="l00740"></a>00740 <span class="keyword"> </span>{ -<a name="l00741"></a>00741 <span class="keywordflow">return</span> m_fd; -<a name="l00742"></a>00742 } -<a name="l00743"></a>00743 -<a name="l00745"></a>00745 -<a name="l00758"></a>00758 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b">SetNonBlock</a>(<span class="keywordtype">bool</span> fNonBlock) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00759"></a>00759 -<a name="l00761"></a>00761 -<a name="l00774"></a>00774 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#124dd5816205900af61034d47ae65255">SetCloseOnExec</a>(<span class="keywordtype">bool</span> fClOnEx) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00775"></a>00775 -<a name="l00777"></a>00777 -<a name="l00782"></a>00782 <span class="keyword">static</span> uint32_t <a class="code" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b">GetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a> cap) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00783"></a>00783 -<a name="l00785"></a>00785 -<a name="l00793"></a>00793 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#734538233ba2136164f76f4df6c3654e">SetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a> cap, uint32_t val) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00794"></a>00794 -<a name="l00796"></a>00796 -<a name="l00800"></a><a class="code" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42">00800</a> <span class="keyword">inline</span> <span class="keyword">static</span> uint32_t <a class="code" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42">GetMaxEvents</a>() throw (<a class="code" href="classInotifyException.html">InotifyException</a>) -<a name="l00801"></a>00801 { -<a name="l00802"></a>00802 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b">GetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1">IN_MAX_EVENTS</a>); -<a name="l00803"></a>00803 } -<a name="l00804"></a>00804 -<a name="l00806"></a>00806 -<a name="l00814"></a><a class="code" href="classInotify.html#66d90ebfa516d4bd1463749def2b58f9">00814</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#66d90ebfa516d4bd1463749def2b58f9">SetMaxEvents</a>(uint32_t val) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>) -<a name="l00815"></a>00815 { -<a name="l00816"></a>00816 <a class="code" href="classInotify.html#734538233ba2136164f76f4df6c3654e">SetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1">IN_MAX_EVENTS</a>, val); -<a name="l00817"></a>00817 } -<a name="l00818"></a>00818 -<a name="l00820"></a>00820 -<a name="l00827"></a><a class="code" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51">00827</a> <span class="keyword">inline</span> <span class="keyword">static</span> uint32_t <a class="code" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51">GetMaxInstances</a>() throw (<a class="code" href="classInotifyException.html">InotifyException</a>) -<a name="l00828"></a>00828 { -<a name="l00829"></a>00829 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b">GetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9">IN_MAX_INSTANCES</a>); -<a name="l00830"></a>00830 } -<a name="l00831"></a>00831 -<a name="l00833"></a>00833 -<a name="l00841"></a><a class="code" href="classInotify.html#620c891962fe5acd26485c64e9b28d19">00841</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#620c891962fe5acd26485c64e9b28d19">SetMaxInstances</a>(uint32_t val) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>) -<a name="l00842"></a>00842 { -<a name="l00843"></a>00843 <a class="code" href="classInotify.html#734538233ba2136164f76f4df6c3654e">SetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9">IN_MAX_INSTANCES</a>, val); -<a name="l00844"></a>00844 } -<a name="l00845"></a>00845 -<a name="l00847"></a>00847 -<a name="l00854"></a><a class="code" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f">00854</a> <span class="keyword">inline</span> <span class="keyword">static</span> uint32_t <a class="code" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f">GetMaxWatches</a>() throw (<a class="code" href="classInotifyException.html">InotifyException</a>) -<a name="l00855"></a>00855 { -<a name="l00856"></a>00856 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b">GetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429">IN_MAX_WATCHES</a>); -<a name="l00857"></a>00857 } -<a name="l00858"></a>00858 -<a name="l00860"></a>00860 -<a name="l00868"></a><a class="code" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a">00868</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a">SetMaxWatches</a>(uint32_t val) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>) -<a name="l00869"></a>00869 { -<a name="l00870"></a>00870 <a class="code" href="classInotify.html#734538233ba2136164f76f4df6c3654e">SetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429">IN_MAX_WATCHES</a>, val); -<a name="l00871"></a>00871 } -<a name="l00872"></a>00872 -<a name="l00873"></a>00873 <span class="keyword">private</span>: -<a name="l00874"></a>00874 <span class="keywordtype">int</span> m_fd; -<a name="l00875"></a>00875 IN_WATCH_MAP m_watches; -<a name="l00876"></a>00876 IN_WP_MAP m_paths; -<a name="l00877"></a>00877 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> m_buf[<a class="code" href="inotify-cxx_8h.html#a84911f8e42d71161b60d4a28940abb4">INOTIFY_BUFLEN</a>]; -<a name="l00878"></a>00878 std::deque<InotifyEvent> m_events; -<a name="l00879"></a>00879 -<a name="l00880"></a>00880 <a class="code" href="inotify-cxx_8h.html#904d25c0fd931e1bad4f9d5cd346a766">IN_LOCK_DECL</a> -<a name="l00881"></a>00881 -<a name="l00882"></a><a class="code" href="classInotify.html#10880f490c33acd8bd24664fc7bce4ae">00882</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classInotifyWatch.html">InotifyWatch</a>; -<a name="l00883"></a>00883 -<a name="l00884"></a>00884 <span class="keyword">static</span> std::string GetCapabilityPath(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a> cap) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html">InotifyException</a>); -<a name="l00885"></a>00885 }; -<a name="l00886"></a>00886 -<a name="l00887"></a>00887 -<a name="l00888"></a>00888 <span class="preprocessor">#endif //_INOTIFYCXX_H_</span> -<a name="l00889"></a>00889 <span class="preprocessor"></span> -</pre></div><hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> -</body> -</html> diff --git a/shared/inotify/doc/html/inotify-cxx_8h.html b/shared/inotify/doc/html/inotify-cxx_8h.html index 1d6f065e..e189937d 100644 --- a/shared/inotify/doc/html/inotify-cxx_8h.html +++ b/shared/inotify/doc/html/inotify-cxx_8h.html @@ -1,33 +1,53 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>inotify-cxx: inotify-cxx.h File Reference</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.5.1 --> -<div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li><a href="annotated.html"><span>Classes</span></a></li> - <li id="current"><a href="files.html"><span>Files</span></a></li> - </ul></div> -<div class="tabs"> - <ul> - <li><a href="files.html"><span>File List</span></a></li> - <li><a href="globals.html"><span>File Members</span></a></li> - </ul></div> -<h1>inotify-cxx.h File Reference</h1>inotify C++ interface header <a href="#_details">More...</a> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Classes</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>File Members</span></a></li> + </ul> + </div> +</div> +<div class="contents"> +<h1>inotify-cxx.h File Reference</h1>inotify C++ interface header +<a href="#_details">More...</a> <p> <code>#include <stdint.h></code><br> <code>#include <string></code><br> <code>#include <deque></code><br> <code>#include <map></code><br> -<code>#include <sys/syscall.h></code><br> <code>#include <sys/inotify.h></code><br> -<code>#include <sys/inotify-syscalls.h></code><br> <p> -<a href="inotify-cxx_8h-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0"> +<div class="dynheader"> +Include dependency graph for inotify-cxx.h:</div> +<div class="dynsection"> +<p><center><img src="inotify-cxx_8h__incl.png" border="0" usemap="#inotify-cxx.h_map" alt=""></center> +</div> + +<p> +<div class="dynheader"> +This graph shows which files directly or indirectly include this file:</div> +<div class="dynsection"> +<p><center><img src="inotify-cxx_8h__dep__incl.png" border="0" usemap="#inotify-cxx.hdep_map" alt=""></center> +<map name="inotify-cxx.hdep_map"> +<area shape="rect" href="inotify-cxx_8cpp.html" title="inotify C++ interface implementation" alt="" coords="5,80,109,107"></map> +</div> + +<p> +<a href="inotify-cxx_8h_source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0"> <tr><td></td></tr> <tr><td colspan="2"><br><h2>Classes</h2></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html">InotifyException</a></td></tr> @@ -72,12 +92,12 @@ <tr><td class="memItemLeft" nowrap align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#7e68c4884137939c5e3301f40c198dc7">IN_WRITE_END_NOTHROW</a></td></tr> <tr><td colspan="2"><br><h2>Typedefs</h2></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef std::map< int32_t,<br> - <a class="el" href="classInotifyWatch.html">InotifyWatch</a> * > </td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">IN_WATCH_MAP</a></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef std::map< int32_t, <br class="typebreak"> +<a class="el" href="classInotifyWatch.html">InotifyWatch</a> * > </td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">IN_WATCH_MAP</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Mapping from watch descriptors to watch objects. <a href="#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef std::map< std::string,<br> - <a class="el" href="classInotifyWatch.html">InotifyWatch</a> * > </td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">IN_WP_MAP</a></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef std::map< std::string, <br class="typebreak"> +<a class="el" href="classInotifyWatch.html">InotifyWatch</a> * > </td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">IN_WP_MAP</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Mapping from paths to watch objects. <a href="#5dd7761ff5a6b7cc7271950aebb7ddf6"></a><br></td></tr> <tr><td colspan="2"><br><h2>Enumerations</h2></td></tr> @@ -88,19 +108,20 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">inotify capability/limit identifiers <a href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">More...</a><br></td></tr> </table> -<hr><a name="_details"></a><h2>Detailed Description</h2> +<hr><h2>Detailed Description</h2> inotify C++ interface header <p> inotify C++ interface<p> -Copyright (C) 2006, 2007 Lukas Jelinek, <<a href="mailto:lukas@aiken.cz">lukas@aiken.cz</a>><p> +Copyright (C) 2006, 2007, 2009 Lukas Jelinek, <<a href="mailto:lukas@aiken.cz">lukas@aiken.cz</a>><p> This program is free software; you can redistribute it and/or modify it under the terms of one of the following licenses:<p> <ul> <li>1. X11-style license (see LICENSE-X11) </li> <li>2. GNU Lesser General Public License, version 2.1 (see LICENSE-LGPL) </li> <li>3. GNU General Public License, version 2 (see LICENSE-GPL)</li> </ul> -If you want to help with choosing the best license for you, please visit <a href="http://www.gnu.org/licenses/license-list.html.">http://www.gnu.org/licenses/license-list.html.</a> <hr><h2>Define Documentation</h2> -<a class="anchor" name="fe6b93f7e09db7022f1f9dd102932e12"></a><!-- doxytag: member="inotify-cxx.h::IN_EXC_MSG" ref="fe6b93f7e09db7022f1f9dd102932e12" args="(msg)" --> +If you want to help with choosing the best license for you, please visit <a href="http://www.gnu.org/licenses/license-list.html.">http://www.gnu.org/licenses/license-list.html.</a><p> +Credits: Mike Frysinger (cleanup of includes) <hr><h2>Define Documentation</h2> +<a class="anchor" name="fe6b93f7e09db7022f1f9dd102932e12"></a><!-- doxytag: member="inotify-cxx.h::IN_EXC_MSG" ref="fe6b93f7e09db7022f1f9dd102932e12" args="(msg)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -110,7 +131,7 @@ If you want to help with choosing the best license for you, please visit <a href <td class="paramtype">msg </td> <td class="paramname"> </td> <td> ) </td> - <td width="100%"> (std::string(__PRETTY_FUNCTION__) + ": " + msg)</td> + <td> (std::string(__PRETTY_FUNCTION__) + ": " + msg)</td> </tr> </table> </div> @@ -122,7 +143,7 @@ Helper macro for creating exception messages. It prepends the message by the function name. </div> </div><p> -<a class="anchor" name="904d25c0fd931e1bad4f9d5cd346a766"></a><!-- doxytag: member="inotify-cxx.h::IN_LOCK_DECL" ref="904d25c0fd931e1bad4f9d5cd346a766" args="" --> +<a class="anchor" name="904d25c0fd931e1bad4f9d5cd346a766"></a><!-- doxytag: member="inotify-cxx.h::IN_LOCK_DECL" ref="904d25c0fd931e1bad4f9d5cd346a766" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -142,7 +163,7 @@ You need not to define INOTIFY_THREAD_SAFE in that cases where the application i Locking may fail (it is very rare but not impossible). In this case an exception is thrown. But if unlocking fails in case of an error it does nothing (this failure is ignored). </div> </div><p> -<a class="anchor" name="08422ec66fb587c1684afbaa575a53dd"></a><!-- doxytag: member="inotify-cxx.h::IN_LOCK_DONE" ref="08422ec66fb587c1684afbaa575a53dd" args="" --> +<a class="anchor" name="08422ec66fb587c1684afbaa575a53dd"></a><!-- doxytag: member="inotify-cxx.h::IN_LOCK_DONE" ref="08422ec66fb587c1684afbaa575a53dd" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -157,7 +178,7 @@ Locking may fail (it is very rare but not impossible). In this case an exception </div> </div><p> -<a class="anchor" name="981aa546075fba39715fd2f63a41f575"></a><!-- doxytag: member="inotify-cxx.h::IN_LOCK_INIT" ref="981aa546075fba39715fd2f63a41f575" args="" --> +<a class="anchor" name="981aa546075fba39715fd2f63a41f575"></a><!-- doxytag: member="inotify-cxx.h::IN_LOCK_INIT" ref="981aa546075fba39715fd2f63a41f575" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -172,7 +193,7 @@ Locking may fail (it is very rare but not impossible). In this case an exception </div> </div><p> -<a class="anchor" name="963a97dc42487e86715b4e04639b0db8"></a><!-- doxytag: member="inotify-cxx.h::IN_READ_BEGIN" ref="963a97dc42487e86715b4e04639b0db8" args="" --> +<a class="anchor" name="963a97dc42487e86715b4e04639b0db8"></a><!-- doxytag: member="inotify-cxx.h::IN_READ_BEGIN" ref="963a97dc42487e86715b4e04639b0db8" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -187,7 +208,7 @@ Locking may fail (it is very rare but not impossible). In this case an exception </div> </div><p> -<a class="anchor" name="0b82080ab6709175341b97e1f3c3955d"></a><!-- doxytag: member="inotify-cxx.h::IN_READ_END" ref="0b82080ab6709175341b97e1f3c3955d" args="" --> +<a class="anchor" name="0b82080ab6709175341b97e1f3c3955d"></a><!-- doxytag: member="inotify-cxx.h::IN_READ_END" ref="0b82080ab6709175341b97e1f3c3955d" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -202,7 +223,7 @@ Locking may fail (it is very rare but not impossible). In this case an exception </div> </div><p> -<a class="anchor" name="5c6a5be1898ef17662795cc4b420c851"></a><!-- doxytag: member="inotify-cxx.h::IN_READ_END_NOTHROW" ref="5c6a5be1898ef17662795cc4b420c851" args="" --> +<a class="anchor" name="5c6a5be1898ef17662795cc4b420c851"></a><!-- doxytag: member="inotify-cxx.h::IN_READ_END_NOTHROW" ref="5c6a5be1898ef17662795cc4b420c851" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -217,7 +238,7 @@ Locking may fail (it is very rare but not impossible). In this case an exception </div> </div><p> -<a class="anchor" name="c3a6d87ace9403f7ac58f931bbcd9599"></a><!-- doxytag: member="inotify-cxx.h::IN_WRITE_BEGIN" ref="c3a6d87ace9403f7ac58f931bbcd9599" args="" --> +<a class="anchor" name="c3a6d87ace9403f7ac58f931bbcd9599"></a><!-- doxytag: member="inotify-cxx.h::IN_WRITE_BEGIN" ref="c3a6d87ace9403f7ac58f931bbcd9599" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -232,7 +253,7 @@ Locking may fail (it is very rare but not impossible). In this case an exception </div> </div><p> -<a class="anchor" name="f8aeac51b3b4ef56f1791c5c1a2e9cf5"></a><!-- doxytag: member="inotify-cxx.h::IN_WRITE_END" ref="f8aeac51b3b4ef56f1791c5c1a2e9cf5" args="" --> +<a class="anchor" name="f8aeac51b3b4ef56f1791c5c1a2e9cf5"></a><!-- doxytag: member="inotify-cxx.h::IN_WRITE_END" ref="f8aeac51b3b4ef56f1791c5c1a2e9cf5" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -247,7 +268,7 @@ Locking may fail (it is very rare but not impossible). In this case an exception </div> </div><p> -<a class="anchor" name="7e68c4884137939c5e3301f40c198dc7"></a><!-- doxytag: member="inotify-cxx.h::IN_WRITE_END_NOTHROW" ref="7e68c4884137939c5e3301f40c198dc7" args="" --> +<a class="anchor" name="7e68c4884137939c5e3301f40c198dc7"></a><!-- doxytag: member="inotify-cxx.h::IN_WRITE_END_NOTHROW" ref="7e68c4884137939c5e3301f40c198dc7" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -262,7 +283,7 @@ Locking may fail (it is very rare but not impossible). In this case an exception </div> </div><p> -<a class="anchor" name="a84911f8e42d71161b60d4a28940abb4"></a><!-- doxytag: member="inotify-cxx.h::INOTIFY_BUFLEN" ref="a84911f8e42d71161b60d4a28940abb4" args="" --> +<a class="anchor" name="a84911f8e42d71161b60d4a28940abb4"></a><!-- doxytag: member="inotify-cxx.h::INOTIFY_BUFLEN" ref="a84911f8e42d71161b60d4a28940abb4" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -279,7 +300,7 @@ Event buffer length. </div> </div><p> -<a class="anchor" name="f64b4cc985ba26f31a9cb242153a5014"></a><!-- doxytag: member="inotify-cxx.h::INOTIFY_EVENT_SIZE" ref="f64b4cc985ba26f31a9cb242153a5014" args="" --> +<a class="anchor" name="f64b4cc985ba26f31a9cb242153a5014"></a><!-- doxytag: member="inotify-cxx.h::INOTIFY_EVENT_SIZE" ref="f64b4cc985ba26f31a9cb242153a5014" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -297,7 +318,7 @@ Event struct size. </div> </div><p> <hr><h2>Typedef Documentation</h2> -<a class="anchor" name="e6b5ebcb4e0d6a9f5ca8da26bc00cc2a"></a><!-- doxytag: member="inotify-cxx.h::IN_WATCH_MAP" ref="e6b5ebcb4e0d6a9f5ca8da26bc00cc2a" args="" --> +<a class="anchor" name="e6b5ebcb4e0d6a9f5ca8da26bc00cc2a"></a><!-- doxytag: member="inotify-cxx.h::IN_WATCH_MAP" ref="e6b5ebcb4e0d6a9f5ca8da26bc00cc2a" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -314,7 +335,7 @@ Mapping from watch descriptors to watch objects. </div> </div><p> -<a class="anchor" name="5dd7761ff5a6b7cc7271950aebb7ddf6"></a><!-- doxytag: member="inotify-cxx.h::IN_WP_MAP" ref="5dd7761ff5a6b7cc7271950aebb7ddf6" args="" --> +<a class="anchor" name="5dd7761ff5a6b7cc7271950aebb7ddf6"></a><!-- doxytag: member="inotify-cxx.h::IN_WP_MAP" ref="5dd7761ff5a6b7cc7271950aebb7ddf6" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -332,7 +353,7 @@ Mapping from paths to watch objects. </div> </div><p> <hr><h2>Enumeration Type Documentation</h2> -<a class="anchor" name="bccd39d32dd83905178cf42edaae5c4d"></a><!-- doxytag: member="inotify-cxx.h::InotifyCapability_t" ref="bccd39d32dd83905178cf42edaae5c4d" args="" --> +<a class="anchor" name="bccd39d32dd83905178cf42edaae5c4d"></a><!-- doxytag: member="inotify-cxx.h::InotifyCapability_t" ref="bccd39d32dd83905178cf42edaae5c4d" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> @@ -359,8 +380,8 @@ max. watches per file descriptor </td></tr> </div> </div><p> -<hr size="1"><address style="align: right;"><small>Generated on Wed Apr 18 18:26:40 2007 for inotify-cxx by -<a href="http://www.doxygen.org/index.html"> -<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address> +</div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> </body> </html> diff --git a/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.map b/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.map new file mode 100644 index 00000000..4ed3629d --- /dev/null +++ b/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.map @@ -0,0 +1 @@ +<area shape="rect" href="$inotify-cxx_8cpp.html" title="inotify C++ interface implementation" alt="" coords="5,80,109,107"> diff --git a/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.md5 b/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.md5 new file mode 100644 index 00000000..c00ff796 --- /dev/null +++ b/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.md5 @@ -0,0 +1 @@ +4b9719ddb81e282b353a01d00e7fc79f
\ No newline at end of file diff --git a/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.png b/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.png Binary files differnew file mode 100644 index 00000000..85d373cf --- /dev/null +++ b/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.png diff --git a/shared/inotify/doc/html/inotify-cxx_8h__incl.map b/shared/inotify/doc/html/inotify-cxx_8h__incl.map new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/shared/inotify/doc/html/inotify-cxx_8h__incl.map diff --git a/shared/inotify/doc/html/inotify-cxx_8h__incl.md5 b/shared/inotify/doc/html/inotify-cxx_8h__incl.md5 new file mode 100644 index 00000000..c9425ce6 --- /dev/null +++ b/shared/inotify/doc/html/inotify-cxx_8h__incl.md5 @@ -0,0 +1 @@ +98ce5d48dec51633b940ca16d76c825f
\ No newline at end of file diff --git a/shared/inotify/doc/html/inotify-cxx_8h__incl.png b/shared/inotify/doc/html/inotify-cxx_8h__incl.png Binary files differnew file mode 100644 index 00000000..ae9be329 --- /dev/null +++ b/shared/inotify/doc/html/inotify-cxx_8h__incl.png diff --git a/shared/inotify/doc/html/inotify-cxx_8h_source.html b/shared/inotify/doc/html/inotify-cxx_8h_source.html new file mode 100644 index 00000000..99b4b37a --- /dev/null +++ b/shared/inotify/doc/html/inotify-cxx_8h_source.html @@ -0,0 +1,503 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> +<title>inotify-cxx: inotify-cxx.h Source File</title> +<link href="tabs.css" rel="stylesheet" type="text/css"> +<link href="doxygen.css" rel="stylesheet" type="text/css"> +</head><body> +<!-- Generated by Doxygen 1.5.9 --> +<div class="navigation" id="top"> + <div class="tabs"> + <ul> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Classes</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div class="tabs"> + <ul> + <li><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>File Members</span></a></li> + </ul> + </div> +<h1>inotify-cxx.h</h1><a href="inotify-cxx_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 +<a name="l00003"></a>00003 +<a name="l00029"></a>00029 <span class="preprocessor">#ifndef _INOTIFYCXX_H_</span> +<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define _INOTIFYCXX_H_</span> +<a name="l00031"></a>00031 <span class="preprocessor"></span> +<a name="l00032"></a>00032 <span class="preprocessor">#include <stdint.h></span> +<a name="l00033"></a>00033 <span class="preprocessor">#include <string></span> +<a name="l00034"></a>00034 <span class="preprocessor">#include <deque></span> +<a name="l00035"></a>00035 <span class="preprocessor">#include <map></span> +<a name="l00036"></a>00036 +<a name="l00037"></a>00037 <span class="comment">// Please ensure that the following header file takes the right place</span> +<a name="l00038"></a>00038 <span class="preprocessor">#include <sys/inotify.h></span> +<a name="l00039"></a>00039 +<a name="l00040"></a>00040 +<a name="l00042"></a><a class="code" href="inotify-cxx_8h.html#f64b4cc985ba26f31a9cb242153a5014">00042</a> <span class="preprocessor">#define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event))</span> +<a name="l00043"></a>00043 <span class="preprocessor"></span> +<a name="l00045"></a><a class="code" href="inotify-cxx_8h.html#a84911f8e42d71161b60d4a28940abb4">00045</a> <span class="preprocessor">#define INOTIFY_BUFLEN (1024 * (INOTIFY_EVENT_SIZE + 16))</span> +<a name="l00046"></a>00046 <span class="preprocessor"></span> +<a name="l00048"></a>00048 +<a name="l00051"></a><a class="code" href="inotify-cxx_8h.html#fe6b93f7e09db7022f1f9dd102932e12">00051</a> <span class="preprocessor">#define IN_EXC_MSG(msg) (std::string(__PRETTY_FUNCTION__) + ": " + msg)</span> +<a name="l00052"></a>00052 <span class="preprocessor"></span> +<a name="l00054"></a><a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">00054</a> <span class="keyword">typedef</span> <span class="keyword">enum</span> +<a name="l00055"></a>00055 { +<a name="l00056"></a><a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1">00056</a> <a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1" title="max. events in the kernel queue">IN_MAX_EVENTS</a> = 0, +<a name="l00057"></a><a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9">00057</a> <a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9" title="max. inotify file descriptors per process">IN_MAX_INSTANCES</a> = 1, +<a name="l00058"></a><a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429">00058</a> <a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429" title="max. watches per file descriptor">IN_MAX_WATCHES</a> = 2 +<a name="l00059"></a>00059 } <a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d" title="inotify capability/limit identifiers">InotifyCapability_t</a>; +<a name="l00060"></a>00060 +<a name="l00062"></a>00062 +<a name="l00080"></a>00080 <span class="preprocessor">#ifdef INOTIFY_THREAD_SAFE</span> +<a name="l00081"></a>00081 <span class="preprocessor"></span> +<a name="l00082"></a>00082 <span class="preprocessor">#include <pthread.h></span> +<a name="l00083"></a>00083 +<a name="l00084"></a>00084 <span class="preprocessor">#define IN_LOCK_DECL mutable pthread_rwlock_t __m_lock;</span> +<a name="l00085"></a>00085 <span class="preprocessor"></span> +<a name="l00086"></a>00086 <span class="preprocessor">#define IN_LOCK_INIT \</span> +<a name="l00087"></a>00087 <span class="preprocessor"> { \</span> +<a name="l00088"></a>00088 <span class="preprocessor"> pthread_rwlockattr_t attr; \</span> +<a name="l00089"></a>00089 <span class="preprocessor"> int res = 0; \</span> +<a name="l00090"></a>00090 <span class="preprocessor"> if ((res = pthread_rwlockattr_init(&attr)) != 0) \</span> +<a name="l00091"></a>00091 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("cannot initialize lock attributes"), res, this); \</span> +<a name="l00092"></a>00092 <span class="preprocessor"> if ((res = pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NP)) != 0) \</span> +<a name="l00093"></a>00093 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("cannot set lock kind"), res, this); \</span> +<a name="l00094"></a>00094 <span class="preprocessor"> if ((res = pthread_rwlock_init(&__m_lock, &attr)) != 0) \</span> +<a name="l00095"></a>00095 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("cannot initialize lock"), res, this); \</span> +<a name="l00096"></a>00096 <span class="preprocessor"> pthread_rwlockattr_destroy(&attr); \</span> +<a name="l00097"></a>00097 <span class="preprocessor"> }</span> +<a name="l00098"></a>00098 <span class="preprocessor"></span> +<a name="l00099"></a>00099 <span class="preprocessor">#define IN_LOCK_DONE pthread_rwlock_destroy(&__m_lock);</span> +<a name="l00100"></a>00100 <span class="preprocessor"></span> +<a name="l00101"></a>00101 <span class="preprocessor">#define IN_READ_BEGIN \</span> +<a name="l00102"></a>00102 <span class="preprocessor"> { \</span> +<a name="l00103"></a>00103 <span class="preprocessor"> int res = pthread_rwlock_rdlock(&__m_lock); \</span> +<a name="l00104"></a>00104 <span class="preprocessor"> if (res != 0) \</span> +<a name="l00105"></a>00105 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("locking for reading failed"), res, (void*) this); \</span> +<a name="l00106"></a>00106 <span class="preprocessor"> }</span> +<a name="l00107"></a>00107 <span class="preprocessor"></span> +<a name="l00108"></a>00108 <span class="preprocessor">#define IN_READ_END \</span> +<a name="l00109"></a>00109 <span class="preprocessor"> { \</span> +<a name="l00110"></a>00110 <span class="preprocessor"> int res = pthread_rwlock_unlock(&__m_lock); \</span> +<a name="l00111"></a>00111 <span class="preprocessor"> if (res != 0) \</span> +<a name="l00112"></a>00112 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("unlocking failed"), res, (void*) this); \</span> +<a name="l00113"></a>00113 <span class="preprocessor"> }</span> +<a name="l00114"></a>00114 <span class="preprocessor"></span> +<a name="l00115"></a>00115 <span class="preprocessor">#define IN_READ_END_NOTHROW pthread_rwlock_unlock(&__m_lock);</span> +<a name="l00116"></a>00116 <span class="preprocessor"></span> +<a name="l00117"></a>00117 <span class="preprocessor">#define IN_WRITE_BEGIN \</span> +<a name="l00118"></a>00118 <span class="preprocessor"> { \</span> +<a name="l00119"></a>00119 <span class="preprocessor"> int res = pthread_rwlock_wrlock(&__m_lock); \</span> +<a name="l00120"></a>00120 <span class="preprocessor"> if (res != 0) \</span> +<a name="l00121"></a>00121 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("locking for writing failed"), res, (void*) this); \</span> +<a name="l00122"></a>00122 <span class="preprocessor"> }</span> +<a name="l00123"></a>00123 <span class="preprocessor"></span> +<a name="l00124"></a>00124 <span class="preprocessor">#define IN_WRITE_END IN_READ_END</span> +<a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor">#define IN_WRITE_END_NOTHROW IN_READ_END_NOTHROW</span> +<a name="l00126"></a>00126 <span class="preprocessor"></span> +<a name="l00127"></a>00127 <span class="preprocessor">#else // INOTIFY_THREAD_SAFE</span> +<a name="l00128"></a>00128 <span class="preprocessor"></span> +<a name="l00129"></a><a class="code" href="inotify-cxx_8h.html#904d25c0fd931e1bad4f9d5cd346a766">00129</a> <span class="preprocessor">#define IN_LOCK_DECL</span> +<a name="l00130"></a><a class="code" href="inotify-cxx_8h.html#981aa546075fba39715fd2f63a41f575">00130</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_LOCK_INIT</span> +<a name="l00131"></a><a class="code" href="inotify-cxx_8h.html#08422ec66fb587c1684afbaa575a53dd">00131</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_LOCK_DONE</span> +<a name="l00132"></a><a class="code" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">00132</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_READ_BEGIN</span> +<a name="l00133"></a><a class="code" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">00133</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_READ_END</span> +<a name="l00134"></a><a class="code" href="inotify-cxx_8h.html#5c6a5be1898ef17662795cc4b420c851">00134</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_READ_END_NOTHROW</span> +<a name="l00135"></a><a class="code" href="inotify-cxx_8h.html#c3a6d87ace9403f7ac58f931bbcd9599">00135</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_WRITE_BEGIN</span> +<a name="l00136"></a><a class="code" href="inotify-cxx_8h.html#f8aeac51b3b4ef56f1791c5c1a2e9cf5">00136</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_WRITE_END</span> +<a name="l00137"></a><a class="code" href="inotify-cxx_8h.html#7e68c4884137939c5e3301f40c198dc7">00137</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_WRITE_END_NOTHROW</span> +<a name="l00138"></a>00138 <span class="preprocessor"></span> +<a name="l00139"></a>00139 <span class="preprocessor">#endif // INOTIFY_THREAD_SAFE</span> +<a name="l00140"></a>00140 <span class="preprocessor"></span> +<a name="l00141"></a>00141 +<a name="l00142"></a>00142 +<a name="l00143"></a>00143 +<a name="l00144"></a>00144 <span class="comment">// forward declaration</span> +<a name="l00145"></a>00145 <span class="keyword">class </span><a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>; +<a name="l00146"></a>00146 <span class="keyword">class </span><a class="code" href="classInotify.html" title="inotify class">Inotify</a>; +<a name="l00147"></a>00147 +<a name="l00148"></a>00148 +<a name="l00150"></a>00150 +<a name="l00158"></a><a class="code" href="classInotifyException.html">00158</a> <span class="keyword">class </span><a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a> +<a name="l00159"></a>00159 { +<a name="l00160"></a>00160 <span class="keyword">public</span>: +<a name="l00162"></a>00162 +<a name="l00167"></a><a class="code" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb">00167</a> <a class="code" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb" title="Constructor.">InotifyException</a>(<span class="keyword">const</span> std::string& rMsg = <span class="stringliteral">""</span>, <span class="keywordtype">int</span> iErr = 0, <span class="keywordtype">void</span>* pSrc = NULL) +<a name="l00168"></a>00168 : <a class="code" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c" title="message">m_msg</a>(rMsg), +<a name="l00169"></a>00169 <a class="code" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854" title="error number">m_err</a>(iErr) +<a name="l00170"></a>00170 { +<a name="l00171"></a>00171 <a class="code" href="classInotifyException.html#dd106c2255890025561245cf91fe1427" title="source">m_pSrc</a> = pSrc; +<a name="l00172"></a>00172 } +<a name="l00173"></a>00173 +<a name="l00175"></a>00175 +<a name="l00178"></a><a class="code" href="classInotifyException.html#6364ea375697356805d47cff957dd757">00178</a> <span class="keyword">inline</span> <span class="keyword">const</span> std::string& <a class="code" href="classInotifyException.html#6364ea375697356805d47cff957dd757" title="Returns the exception message.">GetMessage</a>()<span class="keyword"> const</span> +<a name="l00179"></a>00179 <span class="keyword"> </span>{ +<a name="l00180"></a>00180 <span class="keywordflow">return</span> <a class="code" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c" title="message">m_msg</a>; +<a name="l00181"></a>00181 } +<a name="l00182"></a>00182 +<a name="l00184"></a>00184 +<a name="l00189"></a><a class="code" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d">00189</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d" title="Returns the exception error number.">GetErrorNumber</a>()<span class="keyword"> const</span> +<a name="l00190"></a>00190 <span class="keyword"> </span>{ +<a name="l00191"></a>00191 <span class="keywordflow">return</span> <a class="code" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854" title="error number">m_err</a>; +<a name="l00192"></a>00192 } +<a name="l00193"></a>00193 +<a name="l00195"></a>00195 +<a name="l00198"></a><a class="code" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408">00198</a> <span class="keyword">inline</span> <span class="keywordtype">void</span>* <a class="code" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408" title="Returns the exception source.">GetSource</a>()<span class="keyword"> const</span> +<a name="l00199"></a>00199 <span class="keyword"> </span>{ +<a name="l00200"></a>00200 <span class="keywordflow">return</span> <a class="code" href="classInotifyException.html#dd106c2255890025561245cf91fe1427" title="source">m_pSrc</a>; +<a name="l00201"></a>00201 } +<a name="l00202"></a>00202 +<a name="l00203"></a>00203 <span class="keyword">protected</span>: +<a name="l00204"></a><a class="code" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">00204</a> std::string <a class="code" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c" title="message">m_msg</a>; +<a name="l00205"></a><a class="code" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">00205</a> <span class="keywordtype">int</span> <a class="code" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854" title="error number">m_err</a>; +<a name="l00206"></a><a class="code" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">00206</a> <span class="keyword">mutable</span> <span class="keywordtype">void</span>* <a class="code" href="classInotifyException.html#dd106c2255890025561245cf91fe1427" title="source">m_pSrc</a>; +<a name="l00207"></a>00207 }; +<a name="l00208"></a>00208 +<a name="l00209"></a>00209 +<a name="l00211"></a>00211 +<a name="l00219"></a><a class="code" href="classInotifyEvent.html">00219</a> <span class="keyword">class </span><a class="code" href="classInotifyEvent.html" title="inotify event class">InotifyEvent</a> +<a name="l00220"></a>00220 { +<a name="l00221"></a>00221 <span class="keyword">public</span>: +<a name="l00223"></a>00223 +<a name="l00226"></a><a class="code" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046">00226</a> <a class="code" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046" title="Constructor.">InotifyEvent</a>() +<a name="l00227"></a>00227 : <a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa" title="mask">m_uMask</a>(0), +<a name="l00228"></a>00228 <a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af" title="cookie">m_uCookie</a>(0) +<a name="l00229"></a>00229 { +<a name="l00230"></a>00230 <a class="code" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac" title="source watch">m_pWatch</a> = NULL; +<a name="l00231"></a>00231 } +<a name="l00232"></a>00232 +<a name="l00234"></a>00234 +<a name="l00241"></a><a class="code" href="classInotifyEvent.html#6d7f3fc0f51580da4a3ec2348609df64">00241</a> <a class="code" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046" title="Constructor.">InotifyEvent</a>(<span class="keyword">const</span> <span class="keyword">struct</span> inotify_event* pEvt, <a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* pWatch) +<a name="l00242"></a>00242 : <a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa" title="mask">m_uMask</a>(0), +<a name="l00243"></a>00243 <a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af" title="cookie">m_uCookie</a>(0) +<a name="l00244"></a>00244 { +<a name="l00245"></a>00245 <span class="keywordflow">if</span> (pEvt != NULL) { +<a name="l00246"></a>00246 <a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa" title="mask">m_uMask</a> = (uint32_t) pEvt->mask; +<a name="l00247"></a>00247 <a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af" title="cookie">m_uCookie</a> = (uint32_t) pEvt->cookie; +<a name="l00248"></a>00248 <span class="keywordflow">if</span> (pEvt->name != NULL) { +<a name="l00249"></a>00249 <a class="code" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604" title="name">m_name</a> = pEvt->len > 0 +<a name="l00250"></a>00250 ? pEvt->name +<a name="l00251"></a>00251 : <span class="stringliteral">""</span>; +<a name="l00252"></a>00252 } +<a name="l00253"></a>00253 <a class="code" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac" title="source watch">m_pWatch</a> = pWatch; +<a name="l00254"></a>00254 } +<a name="l00255"></a>00255 <span class="keywordflow">else</span> { +<a name="l00256"></a>00256 <a class="code" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac" title="source watch">m_pWatch</a> = NULL; +<a name="l00257"></a>00257 } +<a name="l00258"></a>00258 } +<a name="l00259"></a>00259 +<a name="l00261"></a><a class="code" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888">00261</a> <a class="code" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888" title="Destructor.">~InotifyEvent</a>() {} +<a name="l00262"></a>00262 +<a name="l00264"></a>00264 +<a name="l00269"></a>00269 int32_t <a class="code" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341" title="Returns the event watch descriptor.">GetDescriptor</a>() <span class="keyword">const</span>; +<a name="l00270"></a>00270 +<a name="l00272"></a>00272 +<a name="l00277"></a><a class="code" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f">00277</a> <span class="keyword">inline</span> uint32_t <a class="code" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f" title="Returns the event mask.">GetMask</a>()<span class="keyword"> const</span> +<a name="l00278"></a>00278 <span class="keyword"> </span>{ +<a name="l00279"></a>00279 <span class="keywordflow">return</span> <a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa" title="mask">m_uMask</a>; +<a name="l00280"></a>00280 } +<a name="l00281"></a>00281 +<a name="l00283"></a>00283 +<a name="l00288"></a><a class="code" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">00288</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb" title="Checks a value for the event type.">IsType</a>(uint32_t uValue, uint32_t uType) +<a name="l00289"></a>00289 { +<a name="l00290"></a>00290 <span class="keywordflow">return</span> ((uValue & uType) != 0) && ((~uValue & uType) == 0); +<a name="l00291"></a>00291 } +<a name="l00292"></a>00292 +<a name="l00294"></a>00294 +<a name="l00298"></a><a class="code" href="classInotifyEvent.html#477ae71116ec393434a1f62a7170a156">00298</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb" title="Checks a value for the event type.">IsType</a>(uint32_t uType)<span class="keyword"> const</span> +<a name="l00299"></a>00299 <span class="keyword"> </span>{ +<a name="l00300"></a>00300 <span class="keywordflow">return</span> <a class="code" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb" title="Checks a value for the event type.">IsType</a>(<a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa" title="mask">m_uMask</a>, uType); +<a name="l00301"></a>00301 } +<a name="l00302"></a>00302 +<a name="l00304"></a>00304 +<a name="l00307"></a><a class="code" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17">00307</a> <span class="keyword">inline</span> uint32_t <a class="code" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17" title="Returns the event cookie.">GetCookie</a>()<span class="keyword"> const</span> +<a name="l00308"></a>00308 <span class="keyword"> </span>{ +<a name="l00309"></a>00309 <span class="keywordflow">return</span> <a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af" title="cookie">m_uCookie</a>; +<a name="l00310"></a>00310 } +<a name="l00311"></a>00311 +<a name="l00313"></a>00313 +<a name="l00316"></a><a class="code" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a">00316</a> <span class="keyword">inline</span> uint32_t <a class="code" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a" title="Returns the event name length.">GetLength</a>()<span class="keyword"> const</span> +<a name="l00317"></a>00317 <span class="keyword"> </span>{ +<a name="l00318"></a>00318 <span class="keywordflow">return</span> (uint32_t) <a class="code" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604" title="name">m_name</a>.length(); +<a name="l00319"></a>00319 } +<a name="l00320"></a>00320 +<a name="l00322"></a>00322 +<a name="l00325"></a><a class="code" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097">00325</a> <span class="keyword">inline</span> <span class="keyword">const</span> std::string& <a class="code" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097" title="Returns the event name.">GetName</a>()<span class="keyword"> const</span> +<a name="l00326"></a>00326 <span class="keyword"> </span>{ +<a name="l00327"></a>00327 <span class="keywordflow">return</span> <a class="code" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604" title="name">m_name</a>; +<a name="l00328"></a>00328 } +<a name="l00329"></a>00329 +<a name="l00331"></a>00331 +<a name="l00334"></a><a class="code" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f">00334</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097" title="Returns the event name.">GetName</a>(std::string& rName)<span class="keyword"> const</span> +<a name="l00335"></a>00335 <span class="keyword"> </span>{ +<a name="l00336"></a>00336 rName = <a class="code" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097" title="Returns the event name.">GetName</a>(); +<a name="l00337"></a>00337 } +<a name="l00338"></a>00338 +<a name="l00340"></a>00340 +<a name="l00343"></a><a class="code" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">00343</a> <span class="keyword">inline</span> <a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* <a class="code" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92" title="Returns the source watch.">GetWatch</a>() +<a name="l00344"></a>00344 { +<a name="l00345"></a>00345 <span class="keywordflow">return</span> <a class="code" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac" title="source watch">m_pWatch</a>; +<a name="l00346"></a>00346 } +<a name="l00347"></a>00347 +<a name="l00349"></a>00349 +<a name="l00353"></a>00353 <span class="keyword">static</span> uint32_t <a class="code" href="classInotifyEvent.html#eced3a88a6dea190c5df19c2a6599010" title="Finds the appropriate mask for a name.">GetMaskByName</a>(<span class="keyword">const</span> std::string& rName); +<a name="l00354"></a>00354 +<a name="l00356"></a>00356 +<a name="l00360"></a>00360 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5" title="Fills the string with all types contained in an event mask value.">DumpTypes</a>(uint32_t uValue, std::string& rStr); +<a name="l00361"></a>00361 +<a name="l00363"></a>00363 +<a name="l00366"></a>00366 <span class="keywordtype">void</span> <a class="code" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5" title="Fills the string with all types contained in an event mask value.">DumpTypes</a>(std::string& rStr) <span class="keyword">const</span>; +<a name="l00367"></a>00367 +<a name="l00368"></a>00368 <span class="keyword">private</span>: +<a name="l00369"></a><a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">00369</a> uint32_t <a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa" title="mask">m_uMask</a>; +<a name="l00370"></a><a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">00370</a> uint32_t <a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af" title="cookie">m_uCookie</a>; +<a name="l00371"></a><a class="code" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">00371</a> std::string <a class="code" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604" title="name">m_name</a>; +<a name="l00372"></a><a class="code" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">00372</a> <a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* <a class="code" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac" title="source watch">m_pWatch</a>; +<a name="l00373"></a>00373 }; +<a name="l00374"></a>00374 +<a name="l00375"></a>00375 +<a name="l00376"></a>00376 +<a name="l00378"></a>00378 +<a name="l00384"></a><a class="code" href="classInotifyWatch.html">00384</a> <span class="keyword">class </span><a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a> +<a name="l00385"></a>00385 { +<a name="l00386"></a>00386 <span class="keyword">public</span>: +<a name="l00388"></a>00388 +<a name="l00396"></a><a class="code" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9">00396</a> <a class="code" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9" title="Constructor.">InotifyWatch</a>(<span class="keyword">const</span> std::string& rPath, int32_t uMask, <span class="keywordtype">bool</span> fEnabled = <span class="keyword">true</span>) +<a name="l00397"></a>00397 : <a class="code" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5" title="watched file path">m_path</a>(rPath), +<a name="l00398"></a>00398 <a class="code" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8" title="event mask">m_uMask</a>(uMask), +<a name="l00399"></a>00399 <a class="code" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a" title="watch descriptor">m_wd</a>((int32_t) -1), +<a name="l00400"></a>00400 <a class="code" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18" title="events enabled yes/no">m_fEnabled</a>(fEnabled) +<a name="l00401"></a>00401 { +<a name="l00402"></a>00402 <a class="code" href="inotify-cxx_8h.html#981aa546075fba39715fd2f63a41f575">IN_LOCK_INIT</a> +<a name="l00403"></a>00403 } +<a name="l00404"></a>00404 +<a name="l00406"></a><a class="code" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">00406</a> <a class="code" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef" title="Destructor.">~InotifyWatch</a>() +<a name="l00407"></a>00407 { +<a name="l00408"></a>00408 <a class="code" href="inotify-cxx_8h.html#08422ec66fb587c1684afbaa575a53dd">IN_LOCK_DONE</a> +<a name="l00409"></a>00409 } +<a name="l00410"></a>00410 +<a name="l00412"></a>00412 +<a name="l00415"></a><a class="code" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59">00415</a> <span class="keyword">inline</span> int32_t <a class="code" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59" title="Returns the watch descriptor.">GetDescriptor</a>()<span class="keyword"> const</span> +<a name="l00416"></a>00416 <span class="keyword"> </span>{ +<a name="l00417"></a>00417 <span class="keywordflow">return</span> <a class="code" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a" title="watch descriptor">m_wd</a>; +<a name="l00418"></a>00418 } +<a name="l00419"></a>00419 +<a name="l00421"></a>00421 +<a name="l00424"></a><a class="code" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2">00424</a> <span class="keyword">inline</span> <span class="keyword">const</span> std::string& <a class="code" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2" title="Returns the watched file path.">GetPath</a>()<span class="keyword"> const</span> +<a name="l00425"></a>00425 <span class="keyword"> </span>{ +<a name="l00426"></a>00426 <span class="keywordflow">return</span> <a class="code" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5" title="watched file path">m_path</a>; +<a name="l00427"></a>00427 } +<a name="l00428"></a>00428 +<a name="l00430"></a>00430 +<a name="l00433"></a><a class="code" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009">00433</a> <span class="keyword">inline</span> uint32_t <a class="code" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009" title="Returns the watch event mask.">GetMask</a>()<span class="keyword"> const</span> +<a name="l00434"></a>00434 <span class="keyword"> </span>{ +<a name="l00435"></a>00435 <span class="keywordflow">return</span> (uint32_t) <a class="code" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8" title="event mask">m_uMask</a>; +<a name="l00436"></a>00436 } +<a name="l00437"></a>00437 +<a name="l00439"></a>00439 +<a name="l00448"></a>00448 <span class="keywordtype">void</span> <a class="code" href="classInotifyWatch.html#3ad7fbc55c21b3fcd08c2d1d388e14b6" title="Sets the watch event mask.">SetMask</a>(uint32_t uMask) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00449"></a>00449 +<a name="l00451"></a>00451 +<a name="l00454"></a><a class="code" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0">00454</a> <span class="keyword">inline</span> <a class="code" href="classInotify.html" title="inotify class">Inotify</a>* <a class="code" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0" title="Returns the appropriate inotify class instance.">GetInotify</a>() +<a name="l00455"></a>00455 { +<a name="l00456"></a>00456 <span class="keywordflow">return</span> <a class="code" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9" title="inotify object">m_pInotify</a>; +<a name="l00457"></a>00457 } +<a name="l00458"></a>00458 +<a name="l00460"></a>00460 +<a name="l00471"></a>00471 <span class="keywordtype">void</span> <a class="code" href="classInotifyWatch.html#a71aff8650fadff32a3c655ca50945f1" title="Enables/disables the watch.">SetEnabled</a>(<span class="keywordtype">bool</span> fEnabled) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00472"></a>00472 +<a name="l00474"></a>00474 +<a name="l00477"></a><a class="code" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324">00477</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324" title="Checks whether the watch is enabled.">IsEnabled</a>()<span class="keyword"> const</span> +<a name="l00478"></a>00478 <span class="keyword"> </span>{ +<a name="l00479"></a>00479 <span class="keywordflow">return</span> <a class="code" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18" title="events enabled yes/no">m_fEnabled</a>; +<a name="l00480"></a>00480 } +<a name="l00481"></a>00481 +<a name="l00483"></a>00483 +<a name="l00492"></a><a class="code" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55">00492</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55" title="Checks whether the watch is recursive.">IsRecursive</a>()<span class="keyword"> const</span> +<a name="l00493"></a>00493 <span class="keyword"> </span>{ +<a name="l00494"></a>00494 <span class="keywordflow">return</span> <span class="keyword">false</span>; +<a name="l00495"></a>00495 } +<a name="l00496"></a>00496 +<a name="l00497"></a>00497 <span class="keyword">private</span>: +<a name="l00498"></a><a class="code" href="classInotifyWatch.html#94bfb861dc18ca5d16abfcff90db8c86">00498</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classInotify.html" title="inotify class">Inotify</a>; +<a name="l00499"></a>00499 +<a name="l00500"></a><a class="code" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">00500</a> std::string <a class="code" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5" title="watched file path">m_path</a>; +<a name="l00501"></a><a class="code" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">00501</a> uint32_t <a class="code" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8" title="event mask">m_uMask</a>; +<a name="l00502"></a><a class="code" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">00502</a> int32_t <a class="code" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a" title="watch descriptor">m_wd</a>; +<a name="l00503"></a><a class="code" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">00503</a> <a class="code" href="classInotify.html" title="inotify class">Inotify</a>* <a class="code" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9" title="inotify object">m_pInotify</a>; +<a name="l00504"></a><a class="code" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">00504</a> <span class="keywordtype">bool</span> <a class="code" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18" title="events enabled yes/no">m_fEnabled</a>; +<a name="l00505"></a>00505 +<a name="l00506"></a>00506 <a class="code" href="inotify-cxx_8h.html#904d25c0fd931e1bad4f9d5cd346a766" title="inotify-cxx thread safety">IN_LOCK_DECL</a> +<a name="l00507"></a>00507 +<a name="l00509"></a>00509 +<a name="l00514"></a>00514 <span class="keywordtype">void</span> <a class="code" href="classInotifyWatch.html#804cdc1e9579a075a60c239b202559f4" title="Disables the watch (due to removing by the kernel).">__Disable</a>(); +<a name="l00515"></a>00515 }; +<a name="l00516"></a>00516 +<a name="l00517"></a>00517 +<a name="l00519"></a><a class="code" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">00519</a> <span class="keyword">typedef</span> std::map<int32_t, InotifyWatch*> <a class="code" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a" title="Mapping from watch descriptors to watch objects.">IN_WATCH_MAP</a>; +<a name="l00520"></a>00520 +<a name="l00522"></a><a class="code" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">00522</a> <span class="keyword">typedef</span> std::map<std::string, InotifyWatch*> <a class="code" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6" title="Mapping from paths to watch objects.">IN_WP_MAP</a>; +<a name="l00523"></a>00523 +<a name="l00524"></a>00524 +<a name="l00526"></a>00526 +<a name="l00532"></a><a class="code" href="classInotify.html">00532</a> <span class="keyword">class </span><a class="code" href="classInotify.html" title="inotify class">Inotify</a> +<a name="l00533"></a>00533 { +<a name="l00534"></a>00534 <span class="keyword">public</span>: +<a name="l00536"></a>00536 +<a name="l00542"></a>00542 <a class="code" href="classInotify.html#a6fe6e9cb3343665eb968fcd5170cfb9" title="Constructor.">Inotify</a>() <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00543"></a>00543 +<a name="l00545"></a>00545 +<a name="l00548"></a>00548 <a class="code" href="classInotify.html#f19dd5e491395673e4798eb9dbf5f682" title="Destructor.">~Inotify</a>(); +<a name="l00549"></a>00549 +<a name="l00551"></a>00551 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#86ae86c43ea1a72f562ca46393309635" title="Removes all watches and closes the inotify device.">Close</a>(); +<a name="l00552"></a>00552 +<a name="l00554"></a>00554 +<a name="l00559"></a>00559 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch.">Add</a>(<a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* pWatch) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00560"></a>00560 +<a name="l00562"></a>00562 +<a name="l00567"></a><a class="code" href="classInotify.html#35dab56d3e10bf28b5e457871adddb58">00567</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch.">Add</a>(<a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>& rWatch) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>) +<a name="l00568"></a>00568 { +<a name="l00569"></a>00569 <a class="code" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch.">Add</a>(&rWatch); +<a name="l00570"></a>00570 } +<a name="l00571"></a>00571 +<a name="l00573"></a>00573 +<a name="l00580"></a>00580 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84" title="Removes a watch.">Remove</a>(<a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* pWatch) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00581"></a>00581 +<a name="l00583"></a>00583 +<a name="l00590"></a><a class="code" href="classInotify.html#ac1a52b2ff6bfec07021a44e55d496a6">00590</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84" title="Removes a watch.">Remove</a>(<a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>& rWatch) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>) +<a name="l00591"></a>00591 { +<a name="l00592"></a>00592 <a class="code" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84" title="Removes a watch.">Remove</a>(&rWatch); +<a name="l00593"></a>00593 } +<a name="l00594"></a>00594 +<a name="l00596"></a>00596 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#bc1fd5830ca561efb69bcd2283981741" title="Removes all watches.">RemoveAll</a>(); +<a name="l00597"></a>00597 +<a name="l00599"></a>00599 +<a name="l00607"></a><a class="code" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075">00607</a> <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075" title="Returns the count of watches.">GetWatchCount</a>()<span class="keyword"> const</span> +<a name="l00608"></a>00608 <span class="keyword"> </span>{ +<a name="l00609"></a>00609 <a class="code" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">IN_READ_BEGIN</a> +<a name="l00610"></a>00610 <span class="keywordtype">size_t</span> n = (size_t) <a class="code" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc" title="watches (by paths)">m_paths</a>.size(); +<a name="l00611"></a>00611 <a class="code" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">IN_READ_END</a> +<a name="l00612"></a>00612 <span class="keywordflow">return</span> n; +<a name="l00613"></a>00613 } +<a name="l00614"></a>00614 +<a name="l00616"></a>00616 +<a name="l00621"></a><a class="code" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063">00621</a> <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063" title="Returns the count of enabled watches.">GetEnabledCount</a>()<span class="keyword"> const</span> +<a name="l00622"></a>00622 <span class="keyword"> </span>{ +<a name="l00623"></a>00623 <a class="code" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">IN_READ_BEGIN</a> +<a name="l00624"></a>00624 <span class="keywordtype">size_t</span> n = (size_t) <a class="code" href="classInotify.html#4d07f3a4412028d687936d2479d9a976" title="watches (by descriptors)">m_watches</a>.size(); +<a name="l00625"></a>00625 <a class="code" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">IN_READ_END</a> +<a name="l00626"></a>00626 <span class="keywordflow">return</span> n; +<a name="l00627"></a>00627 } +<a name="l00628"></a>00628 +<a name="l00630"></a>00630 +<a name="l00641"></a>00641 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events.">WaitForEvents</a>(<span class="keywordtype">bool</span> fNoIntr = <span class="keyword">false</span>) throw (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00642"></a>00642 +<a name="l00644"></a>00644 +<a name="l00650"></a><a class="code" href="classInotify.html#a3c533f956871f904949832ac8f5fbde">00650</a> inline <span class="keywordtype">size_t</span> <a class="code" href="classInotify.html#a3c533f956871f904949832ac8f5fbde" title="Returns the count of received and queued events.">GetEventCount</a>() +<a name="l00651"></a>00651 { +<a name="l00652"></a>00652 <a class="code" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">IN_READ_BEGIN</a> +<a name="l00653"></a>00653 <span class="keywordtype">size_t</span> n = (size_t) <a class="code" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0" title="event queue">m_events</a>.size(); +<a name="l00654"></a>00654 <a class="code" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">IN_READ_END</a> +<a name="l00655"></a>00655 <span class="keywordflow">return</span> n; +<a name="l00656"></a>00656 } +<a name="l00657"></a>00657 +<a name="l00659"></a>00659 +<a name="l00667"></a>00667 <span class="keywordtype">bool</span> <a class="code" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008" title="Extracts a queued inotify event.">GetEvent</a>(<a class="code" href="classInotifyEvent.html" title="inotify event class">InotifyEvent</a>* pEvt) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00668"></a>00668 +<a name="l00670"></a>00670 +<a name="l00677"></a><a class="code" href="classInotify.html#b028c8fa988f6bbb2ef773db3ea3a2d3">00677</a> <span class="keywordtype">bool</span> <a class="code" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008" title="Extracts a queued inotify event.">GetEvent</a>(<a class="code" href="classInotifyEvent.html" title="inotify event class">InotifyEvent</a>& rEvt) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>) +<a name="l00678"></a>00678 { +<a name="l00679"></a>00679 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008" title="Extracts a queued inotify event.">GetEvent</a>(&rEvt); +<a name="l00680"></a>00680 } +<a name="l00681"></a>00681 +<a name="l00683"></a>00683 +<a name="l00691"></a>00691 <span class="keywordtype">bool</span> <a class="code" href="classInotify.html#19cde43d082ff92bd02654610019300d" title="Extracts a queued inotify event (without removing).">PeekEvent</a>(<a class="code" href="classInotifyEvent.html" title="inotify event class">InotifyEvent</a>* pEvt) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00692"></a>00692 +<a name="l00694"></a>00694 +<a name="l00701"></a><a class="code" href="classInotify.html#287dc0d238fa6edc3269441cb284f979">00701</a> <span class="keywordtype">bool</span> <a class="code" href="classInotify.html#19cde43d082ff92bd02654610019300d" title="Extracts a queued inotify event (without removing).">PeekEvent</a>(<a class="code" href="classInotifyEvent.html" title="inotify event class">InotifyEvent</a>& rEvt) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>) +<a name="l00702"></a>00702 { +<a name="l00703"></a>00703 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#19cde43d082ff92bd02654610019300d" title="Extracts a queued inotify event (without removing).">PeekEvent</a>(&rEvt); +<a name="l00704"></a>00704 } +<a name="l00705"></a>00705 +<a name="l00707"></a>00707 +<a name="l00713"></a>00713 <a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* <a class="code" href="classInotify.html#182d19b667c9e0899802b70a579eff40" title="Searches for a watch by a watch descriptor.">FindWatch</a>(<span class="keywordtype">int</span> iDescriptor); +<a name="l00714"></a>00714 +<a name="l00716"></a>00716 +<a name="l00726"></a>00726 <a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* <a class="code" href="classInotify.html#182d19b667c9e0899802b70a579eff40" title="Searches for a watch by a watch descriptor.">FindWatch</a>(<span class="keyword">const</span> std::string& rPath); +<a name="l00727"></a>00727 +<a name="l00729"></a>00729 +<a name="l00737"></a><a class="code" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9">00737</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9" title="Returns the file descriptor.">GetDescriptor</a>()<span class="keyword"> const</span> +<a name="l00738"></a>00738 <span class="keyword"> </span>{ +<a name="l00739"></a>00739 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b" title="file descriptor">m_fd</a>; +<a name="l00740"></a>00740 } +<a name="l00741"></a>00741 +<a name="l00743"></a>00743 +<a name="l00756"></a>00756 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b" title="Enables/disables non-blocking mode.">SetNonBlock</a>(<span class="keywordtype">bool</span> fNonBlock) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00757"></a>00757 +<a name="l00759"></a>00759 +<a name="l00772"></a>00772 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#124dd5816205900af61034d47ae65255" title="Enables/disables closing on exec.">SetCloseOnExec</a>(<span class="keywordtype">bool</span> fClOnEx) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00773"></a>00773 +<a name="l00775"></a>00775 +<a name="l00780"></a>00780 <span class="keyword">static</span> uint32_t <a class="code" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b" title="Acquires a particular inotify capability/limit.">GetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d" title="inotify capability/limit identifiers">InotifyCapability_t</a> cap) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00781"></a>00781 +<a name="l00783"></a>00783 +<a name="l00791"></a>00791 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#734538233ba2136164f76f4df6c3654e" title="Modifies a particular inotify capability/limit.">SetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d" title="inotify capability/limit identifiers">InotifyCapability_t</a> cap, uint32_t val) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00792"></a>00792 +<a name="l00794"></a>00794 +<a name="l00798"></a><a class="code" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42">00798</a> <span class="keyword">inline</span> <span class="keyword">static</span> uint32_t <a class="code" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42" title="Returns the maximum number of events in the kernel queue.">GetMaxEvents</a>() throw (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>) +<a name="l00799"></a>00799 { +<a name="l00800"></a>00800 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b" title="Acquires a particular inotify capability/limit.">GetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1" title="max. events in the kernel queue">IN_MAX_EVENTS</a>); +<a name="l00801"></a>00801 } +<a name="l00802"></a>00802 +<a name="l00804"></a>00804 +<a name="l00812"></a><a class="code" href="classInotify.html#66d90ebfa516d4bd1463749def2b58f9">00812</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#66d90ebfa516d4bd1463749def2b58f9" title="Sets the maximum number of events in the kernel queue.">SetMaxEvents</a>(uint32_t val) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>) +<a name="l00813"></a>00813 { +<a name="l00814"></a>00814 <a class="code" href="classInotify.html#734538233ba2136164f76f4df6c3654e" title="Modifies a particular inotify capability/limit.">SetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1" title="max. events in the kernel queue">IN_MAX_EVENTS</a>, val); +<a name="l00815"></a>00815 } +<a name="l00816"></a>00816 +<a name="l00818"></a>00818 +<a name="l00825"></a><a class="code" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51">00825</a> <span class="keyword">inline</span> <span class="keyword">static</span> uint32_t <a class="code" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51" title="Returns the maximum number of inotify instances per process.">GetMaxInstances</a>() throw (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>) +<a name="l00826"></a>00826 { +<a name="l00827"></a>00827 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b" title="Acquires a particular inotify capability/limit.">GetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9" title="max. inotify file descriptors per process">IN_MAX_INSTANCES</a>); +<a name="l00828"></a>00828 } +<a name="l00829"></a>00829 +<a name="l00831"></a>00831 +<a name="l00839"></a><a class="code" href="classInotify.html#620c891962fe5acd26485c64e9b28d19">00839</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#620c891962fe5acd26485c64e9b28d19" title="Sets the maximum number of inotify instances per process.">SetMaxInstances</a>(uint32_t val) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>) +<a name="l00840"></a>00840 { +<a name="l00841"></a>00841 <a class="code" href="classInotify.html#734538233ba2136164f76f4df6c3654e" title="Modifies a particular inotify capability/limit.">SetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9" title="max. inotify file descriptors per process">IN_MAX_INSTANCES</a>, val); +<a name="l00842"></a>00842 } +<a name="l00843"></a>00843 +<a name="l00845"></a>00845 +<a name="l00852"></a><a class="code" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f">00852</a> <span class="keyword">inline</span> <span class="keyword">static</span> uint32_t <a class="code" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f" title="Returns the maximum number of inotify watches per instance.">GetMaxWatches</a>() throw (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>) +<a name="l00853"></a>00853 { +<a name="l00854"></a>00854 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b" title="Acquires a particular inotify capability/limit.">GetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429" title="max. watches per file descriptor">IN_MAX_WATCHES</a>); +<a name="l00855"></a>00855 } +<a name="l00856"></a>00856 +<a name="l00858"></a>00858 +<a name="l00866"></a><a class="code" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a">00866</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a" title="Sets the maximum number of inotify watches per instance.">SetMaxWatches</a>(uint32_t val) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>) +<a name="l00867"></a>00867 { +<a name="l00868"></a>00868 <a class="code" href="classInotify.html#734538233ba2136164f76f4df6c3654e" title="Modifies a particular inotify capability/limit.">SetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429" title="max. watches per file descriptor">IN_MAX_WATCHES</a>, val); +<a name="l00869"></a>00869 } +<a name="l00870"></a>00870 +<a name="l00871"></a>00871 <span class="keyword">private</span>: +<a name="l00872"></a><a class="code" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">00872</a> <span class="keywordtype">int</span> <a class="code" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b" title="file descriptor">m_fd</a>; +<a name="l00873"></a><a class="code" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">00873</a> IN_WATCH_MAP <a class="code" href="classInotify.html#4d07f3a4412028d687936d2479d9a976" title="watches (by descriptors)">m_watches</a>; +<a name="l00874"></a><a class="code" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">00874</a> IN_WP_MAP <a class="code" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc" title="watches (by paths)">m_paths</a>; +<a name="l00875"></a><a class="code" href="classInotify.html#eee7847efd93b681fddac56860fc7958">00875</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="classInotify.html#eee7847efd93b681fddac56860fc7958" title="buffer for events">m_buf</a>[<a class="code" href="inotify-cxx_8h.html#a84911f8e42d71161b60d4a28940abb4" title="Event buffer length.">INOTIFY_BUFLEN</a>]; +<a name="l00876"></a><a class="code" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">00876</a> std::deque<InotifyEvent> <a class="code" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0" title="event queue">m_events</a>; +<a name="l00877"></a>00877 +<a name="l00878"></a>00878 <a class="code" href="inotify-cxx_8h.html#904d25c0fd931e1bad4f9d5cd346a766" title="inotify-cxx thread safety">IN_LOCK_DECL</a> +<a name="l00879"></a>00879 +<a name="l00880"></a><a class="code" href="classInotify.html#10880f490c33acd8bd24664fc7bce4ae">00880</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>; +<a name="l00881"></a>00881 +<a name="l00882"></a>00882 <span class="keyword">static</span> std::string <a class="code" href="classInotify.html#0233ddfe40844d729505fdfd709d22cc">GetCapabilityPath</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d" title="inotify capability/limit identifiers">InotifyCapability_t</a> cap) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>); +<a name="l00883"></a>00883 }; +<a name="l00884"></a>00884 +<a name="l00885"></a>00885 +<a name="l00886"></a>00886 <span class="preprocessor">#endif //_INOTIFYCXX_H_</span> +<a name="l00887"></a>00887 <span class="preprocessor"></span> +</pre></div></div> +<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address> +</body> +</html> diff --git a/shared/inotify/doc/html/tabs.css b/shared/inotify/doc/html/tabs.css index a61552a6..ab02c624 100644 --- a/shared/inotify/doc/html/tabs.css +++ b/shared/inotify/doc/html/tabs.css @@ -32,7 +32,7 @@ DIV.tabs A float : left; background : url("tab_r.gif") no-repeat right top; border-bottom : 1px solid #84B0C7; - font-size : x-small; + font-size : 80%; font-weight : bold; text-decoration : none; } @@ -66,7 +66,7 @@ DIV.tabs INPUT DIV.tabs TD { - font-size : x-small; + font-size : 80%; font-weight : bold; text-decoration : none; } @@ -82,21 +82,24 @@ DIV.tabs A:hover SPAN background-position: 0% -150px; } -DIV.tabs LI#current A +DIV.tabs LI.current A { background-position: 100% -150px; border-width : 0px; } -DIV.tabs LI#current SPAN +DIV.tabs LI.current SPAN { background-position: 0% -150px; padding-bottom : 6px; } -DIV.nav +DIV.navpath { background : none; border : none; border-bottom : 1px solid #84B0C7; + text-align : center; + margin : 2px; + padding : 2px; } diff --git a/shared/inotify/doc/man/man3/Inotify.3 b/shared/inotify/doc/man/man3/Inotify.3 index 23188784..84579325 100644 --- a/shared/inotify/doc/man/man3/Inotify.3 +++ b/shared/inotify/doc/man/man3/Inotify.3 @@ -1,4 +1,4 @@ -.TH "Inotify" 3 "18 Apr 2007" "Version 0.7.2" "inotify-cxx" \" -*- nroff -*- +.TH "Inotify" 3 "9 Dec 2009" "Version 0.7.3" "inotify-cxx" \" -*- nroff -*- .ad l .nh .SH NAME @@ -46,11 +46,11 @@ Inotify \- inotify class .br .RI "\fIRemoves all watches. \fP" .ti -1c -.RI "size_t \fBGetWatchCount\fP () const" +.RI "size_t \fBGetWatchCount\fP () const " .br .RI "\fIReturns the count of watches. \fP" .ti -1c -.RI "size_t \fBGetEnabledCount\fP () const" +.RI "size_t \fBGetEnabledCount\fP () const " .br .RI "\fIReturns the count of enabled watches. \fP" .ti -1c @@ -86,7 +86,7 @@ Inotify \- inotify class .br .RI "\fISearches for a watch by a filesystem path. \fP" .ti -1c -.RI "int \fBGetDescriptor\fP () const" +.RI "int \fBGetDescriptor\fP () const " .br .RI "\fIReturns the file descriptor. \fP" .ti -1c @@ -134,6 +134,37 @@ Inotify \- inotify class .br .RI "\fISets the maximum number of inotify watches per instance. \fP" .in -1c +.SS "Static Private Member Functions" + +.in +1c +.ti -1c +.RI "static std::string \fBGetCapabilityPath\fP (\fBInotifyCapability_t\fP cap) throw (InotifyException)" +.br +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "int \fBm_fd\fP" +.br +.RI "\fIfile descriptor \fP" +.ti -1c +.RI "\fBIN_WATCH_MAP\fP \fBm_watches\fP" +.br +.RI "\fIwatches (by descriptors) \fP" +.ti -1c +.RI "\fBIN_WP_MAP\fP \fBm_paths\fP" +.br +.RI "\fIwatches (by paths) \fP" +.ti -1c +.RI "unsigned char \fBm_buf\fP [INOTIFY_BUFLEN]" +.br +.RI "\fIbuffer for events \fP" +.ti -1c +.RI "std::deque< \fBInotifyEvent\fP > \fBm_events\fP" +.br +.RI "\fIevent queue \fP" +.in -1c .SS "Friends" .in +1c @@ -148,7 +179,6 @@ inotify class It holds information about the inotify device descriptor and manages the event queue. .PP If the INOTIFY_THREAD_SAFE is defined this class is thread-safe. -.PP .SH "Constructor & Destructor Documentation" .PP .SS "Inotify::Inotify () throw (\fBInotifyException\fP)" @@ -170,17 +200,13 @@ Destructor. Calls \fBClose()\fP due to clean-up. .SH "Member Function Documentation" .PP -.SS "void Inotify::Close ()" -.PP -Removes all watches and closes the inotify device. -.PP -.SS "void Inotify::Add (\fBInotifyWatch\fP * pWatch) throw (\fBInotifyException\fP)" +.SS "void Inotify::Add (\fBInotifyWatch\fP & rWatch) throw (\fBInotifyException\fP)\fC [inline]\fP" .PP Adds a new watch. .PP \fBParameters:\fP .RS 4 -\fIpWatch\fP inotify watch +\fIrWatch\fP inotify watch .RE .PP \fBExceptions:\fP @@ -189,13 +215,13 @@ Adds a new watch. .RE .PP -.SS "void Inotify::Add (\fBInotifyWatch\fP & rWatch) throw (\fBInotifyException\fP)\fC [inline]\fP" +.SS "void Inotify::Add (\fBInotifyWatch\fP * pWatch) throw (\fBInotifyException\fP)" .PP Adds a new watch. .PP \fBParameters:\fP .RS 4 -\fIrWatch\fP inotify watch +\fIpWatch\fP inotify watch .RE .PP \fBExceptions:\fP @@ -204,58 +230,85 @@ Adds a new watch. .RE .PP -.SS "void Inotify::Remove (\fBInotifyWatch\fP * pWatch) throw (\fBInotifyException\fP)" +.SS "void Inotify::Close ()" .PP -Removes a watch. +Removes all watches and closes the inotify device. .PP -If the given watch is not present it does nothing. +.SS "\fBInotifyWatch\fP * Inotify::FindWatch (const std::string & rPath)" +.PP +Searches for a watch by a filesystem path. +.PP +It tries to find a watch by the given filesystem path. .PP \fBParameters:\fP .RS 4 -\fIpWatch\fP inotify watch +\fIrPath\fP filesystem path .RE .PP -\fBExceptions:\fP +\fBReturns:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown if removing failed +pointer to a watch; NULL if no such watch exists +.RE +.PP +\fBAttention:\fP +.RS 4 +The path must be exactly identical to the one used for the searched watch. Be careful about absolute/relative and case-insensitive paths. .RE .PP -.SS "void Inotify::Remove (\fBInotifyWatch\fP & rWatch) throw (\fBInotifyException\fP)\fC [inline]\fP" +.SS "\fBInotifyWatch\fP * Inotify::FindWatch (int iDescriptor)" .PP -Removes a watch. +Searches for a watch by a watch descriptor. .PP -If the given watch is not present it does nothing. +It tries to find a watch by the given descriptor. .PP \fBParameters:\fP .RS 4 -\fIrWatch\fP inotify watch +\fIiDescriptor\fP watch descriptor .RE .PP -\fBExceptions:\fP +\fBReturns:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown if removing failed +pointer to a watch; NULL if no such watch exists .RE .PP -.SS "void Inotify::RemoveAll ()" +.SS "uint32_t Inotify::GetCapability (\fBInotifyCapability_t\fP cap) throw (\fBInotifyException\fP)\fC [static]\fP" .PP -Removes all watches. +Acquires a particular inotify capability/limit. .PP -.SS "size_t Inotify::GetWatchCount () const\fC [inline]\fP" +\fBParameters:\fP +.RS 4 +\fIcap\fP capability/limit identifier +.RE .PP -Returns the count of watches. +\fBReturns:\fP +.RS 4 +capability/limit value +.RE .PP -This is the total count of all watches (regardless whether enabled or not). +\fBExceptions:\fP +.RS 4 +\fI\fBInotifyException\fP\fP thrown if the given value cannot be acquired +.RE +.PP + +.SS "std::string Inotify::GetCapabilityPath (\fBInotifyCapability_t\fP cap) throw (\fBInotifyException\fP)\fC [static, private]\fP" +.PP +.SS "int Inotify::GetDescriptor () const\fC [inline]\fP" +.PP +Returns the file descriptor. +.PP +The descriptor can be used in standard low-level file functions (poll(), select(), fcntl() etc.). .PP \fBReturns:\fP .RS 4 -count of watches +valid file descriptor or -1 for inactive object .RE .PP \fBSee also:\fP .RS 4 -\fBGetEnabledCount()\fP +\fBSetNonBlock()\fP .RE .PP @@ -274,37 +327,20 @@ count of enabled watches .RE .PP -.SS "void Inotify::WaitForEvents (bool fNoIntr = \fCfalse\fP) throw (\fBInotifyException\fP)" +.SS "bool Inotify::GetEvent (\fBInotifyEvent\fP & rEvt) throw (\fBInotifyException\fP)\fC [inline]\fP" .PP -Waits for inotify events. +Extracts a queued inotify event. .PP -It waits until one or more events occur. When called in nonblocking mode it only retrieves occurred events to the internal queue and exits. +The extracted event is removed from the queue. .PP \fBParameters:\fP .RS 4 -\fIfNoIntr\fP if true it re-calls the system call after a handled signal +\fIrEvt\fP event object .RE .PP \fBExceptions:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown if reading events failed -.RE -.PP -\fBSee also:\fP -.RS 4 -\fBSetNonBlock()\fP -.RE -.PP - -.SS "size_t Inotify::GetEventCount ()\fC [inline]\fP" -.PP -Returns the count of received and queued events. -.PP -This number is related to the events in the queue inside this object, not to the events pending in the kernel. -.PP -\fBReturns:\fP -.RS 4 -count of events +\fI\fBInotifyException\fP\fP thrown only in very anomalous cases .RE .PP @@ -325,181 +361,156 @@ The extracted event is removed from the queue. If the pointer is NULL it does no .RE .PP -.SS "bool Inotify::GetEvent (\fBInotifyEvent\fP & rEvt) throw (\fBInotifyException\fP)\fC [inline]\fP" -.PP -Extracts a queued inotify event. +.SS "size_t Inotify::GetEventCount ()\fC [inline]\fP" .PP -The extracted event is removed from the queue. +Returns the count of received and queued events. .PP -\fBParameters:\fP -.RS 4 -\fIrEvt\fP event object -.RE +This number is related to the events in the queue inside this object, not to the events pending in the kernel. .PP -\fBExceptions:\fP +\fBReturns:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown only in very anomalous cases +count of events .RE .PP -.SS "bool Inotify::PeekEvent (\fBInotifyEvent\fP * pEvt) throw (\fBInotifyException\fP)" -.PP -Extracts a queued inotify event (without removing). +.SS "static uint32_t Inotify::GetMaxEvents () throw (\fBInotifyException\fP)\fC [inline, static]\fP" .PP -The extracted event stays in the queue. If the pointer is NULL it does nothing. +Returns the maximum number of events in the kernel queue. .PP -\fBParameters:\fP +\fBReturns:\fP .RS 4 -\fIpEvt\fP event object +maximum number of events in the kernel queue .RE .PP \fBExceptions:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown if the provided pointer is NULL +\fI\fBInotifyException\fP\fP thrown if the given value cannot be acquired .RE .PP -.SS "bool Inotify::PeekEvent (\fBInotifyEvent\fP & rEvt) throw (\fBInotifyException\fP)\fC [inline]\fP" +.SS "static uint32_t Inotify::GetMaxInstances () throw (\fBInotifyException\fP)\fC [inline, static]\fP" .PP -Extracts a queued inotify event (without removing). +Returns the maximum number of inotify instances per process. .PP -The extracted event stays in the queue. +It means the maximum number of open inotify file descriptors per running process. .PP -\fBParameters:\fP +\fBReturns:\fP .RS 4 -\fIrEvt\fP event object +maximum number of inotify instances .RE .PP \fBExceptions:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown only in very anomalous cases +\fI\fBInotifyException\fP\fP thrown if the given value cannot be acquired .RE .PP -.SS "\fBInotifyWatch\fP * Inotify::FindWatch (int iDescriptor)" +.SS "static uint32_t Inotify::GetMaxWatches () throw (\fBInotifyException\fP)\fC [inline, static]\fP" .PP -Searches for a watch by a watch descriptor. +Returns the maximum number of inotify watches per instance. .PP -It tries to find a watch by the given descriptor. +It means the maximum number of inotify watches per inotify file descriptor. .PP -\fBParameters:\fP +\fBReturns:\fP .RS 4 -\fIiDescriptor\fP watch descriptor +maximum number of inotify watches .RE .PP -\fBReturns:\fP +\fBExceptions:\fP .RS 4 -pointer to a watch; NULL if no such watch exists +\fI\fBInotifyException\fP\fP thrown if the given value cannot be acquired .RE .PP -.SS "\fBInotifyWatch\fP * Inotify::FindWatch (const std::string & rPath)" -.PP -Searches for a watch by a filesystem path. +.SS "size_t Inotify::GetWatchCount () const\fC [inline]\fP" .PP -It tries to find a watch by the given filesystem path. +Returns the count of watches. .PP -\fBParameters:\fP -.RS 4 -\fIrPath\fP filesystem path -.RE +This is the total count of all watches (regardless whether enabled or not). .PP \fBReturns:\fP .RS 4 -pointer to a watch; NULL if no such watch exists +count of watches .RE .PP -\fBAttention:\fP +\fBSee also:\fP .RS 4 -The path must be exactly identical to the one used for the searched watch. Be careful about absolute/relative and case-insensitive paths. +\fBGetEnabledCount()\fP .RE .PP -.SS "int Inotify::GetDescriptor () const\fC [inline]\fP" +.SS "bool Inotify::PeekEvent (\fBInotifyEvent\fP & rEvt) throw (\fBInotifyException\fP)\fC [inline]\fP" .PP -Returns the file descriptor. +Extracts a queued inotify event (without removing). .PP -The descriptor can be used in standard low-level file functions (poll(), select(), fcntl() etc.). +The extracted event stays in the queue. .PP -\fBReturns:\fP +\fBParameters:\fP .RS 4 -valid file descriptor or -1 for inactive object +\fIrEvt\fP event object .RE .PP -\fBSee also:\fP +\fBExceptions:\fP .RS 4 -\fBSetNonBlock()\fP +\fI\fBInotifyException\fP\fP thrown only in very anomalous cases .RE .PP -.SS "void Inotify::SetNonBlock (bool fNonBlock) throw (\fBInotifyException\fP)" -.PP -Enables/disables non-blocking mode. +.SS "bool Inotify::PeekEvent (\fBInotifyEvent\fP * pEvt) throw (\fBInotifyException\fP)" .PP -Use this mode if you want to monitor the descriptor (acquired thru \fBGetDescriptor()\fP) in functions such as poll(), select() etc. +Extracts a queued inotify event (without removing). .PP -Non-blocking mode is disabled by default. +The extracted event stays in the queue. If the pointer is NULL it does nothing. .PP \fBParameters:\fP .RS 4 -\fIfNonBlock\fP enable/disable non-blocking mode +\fIpEvt\fP event object .RE .PP \fBExceptions:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown if setting mode failed -.RE -.PP -\fBSee also:\fP -.RS 4 -\fBGetDescriptor()\fP, \fBSetCloseOnExec()\fP +\fI\fBInotifyException\fP\fP thrown if the provided pointer is NULL .RE .PP -.SS "void Inotify::SetCloseOnExec (bool fClOnEx) throw (\fBInotifyException\fP)" -.PP -Enables/disables closing on exec. +.SS "void Inotify::Remove (\fBInotifyWatch\fP & rWatch) throw (\fBInotifyException\fP)\fC [inline]\fP" .PP -Enable this if you want to close the descriptor when executing another program. Otherwise, the descriptor will be inherited. +Removes a watch. .PP -Closing on exec is disabled by default. +If the given watch is not present it does nothing. .PP \fBParameters:\fP .RS 4 -\fIfClOnEx\fP enable/disable closing on exec +\fIrWatch\fP inotify watch .RE .PP \fBExceptions:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown if setting failed -.RE -.PP -\fBSee also:\fP -.RS 4 -\fBGetDescriptor()\fP, \fBSetNonBlock()\fP +\fI\fBInotifyException\fP\fP thrown if removing failed .RE .PP -.SS "uint32_t Inotify::GetCapability (\fBInotifyCapability_t\fP cap) throw (\fBInotifyException\fP)\fC [static]\fP" +.SS "void Inotify::Remove (\fBInotifyWatch\fP * pWatch) throw (\fBInotifyException\fP)" .PP -Acquires a particular inotify capability/limit. +Removes a watch. .PP -\fBParameters:\fP -.RS 4 -\fIcap\fP capability/limit identifier -.RE +If the given watch is not present it does nothing. .PP -\fBReturns:\fP +\fBParameters:\fP .RS 4 -capability/limit value +\fIpWatch\fP inotify watch .RE .PP \fBExceptions:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown if the given value cannot be acquired +\fI\fBInotifyException\fP\fP thrown if removing failed .RE .PP +.SS "void Inotify::RemoveAll ()" +.PP +Removes all watches. +.PP .SS "void Inotify::SetCapability (\fBInotifyCapability_t\fP cap, uint32_t val) throw (\fBInotifyException\fP)\fC [static]\fP" .PP Modifies a particular inotify capability/limit. @@ -522,18 +533,27 @@ Using this function requires root privileges. Beware of setting extensive values .RE .PP -.SS "static uint32_t Inotify::GetMaxEvents () throw (\fBInotifyException\fP)\fC [inline, static]\fP" +.SS "void Inotify::SetCloseOnExec (bool fClOnEx) throw (\fBInotifyException\fP)" .PP -Returns the maximum number of events in the kernel queue. +Enables/disables closing on exec. .PP -\fBReturns:\fP +Enable this if you want to close the descriptor when executing another program. Otherwise, the descriptor will be inherited. +.PP +Closing on exec is disabled by default. +.PP +\fBParameters:\fP .RS 4 -maximum number of events in the kernel queue +\fIfClOnEx\fP enable/disable closing on exec .RE .PP \fBExceptions:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown if the given value cannot be acquired +\fI\fBInotifyException\fP\fP thrown if setting failed +.RE +.PP +\fBSee also:\fP +.RS 4 +\fBGetDescriptor()\fP, \fBSetNonBlock()\fP .RE .PP @@ -557,26 +577,29 @@ Using this function requires root privileges. Beware of setting extensive values .RE .PP -.SS "static uint32_t Inotify::GetMaxInstances () throw (\fBInotifyException\fP)\fC [inline, static]\fP" -.PP -Returns the maximum number of inotify instances per process. +.SS "static void Inotify::SetMaxInstances (uint32_t val) throw (\fBInotifyException\fP)\fC [inline, static]\fP" .PP -It means the maximum number of open inotify file descriptors per running process. +Sets the maximum number of inotify instances per process. .PP -\fBReturns:\fP +\fBParameters:\fP .RS 4 -maximum number of inotify instances +\fIval\fP new value .RE .PP \fBExceptions:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown if the given value cannot be acquired +\fI\fBInotifyException\fP\fP thrown if the given value cannot be set +.RE +.PP +\fBAttention:\fP +.RS 4 +Using this function requires root privileges. Beware of setting extensive values - the greater value is set here the more physical memory may be used for the inotify infrastructure. .RE .PP -.SS "static void Inotify::SetMaxInstances (uint32_t val) throw (\fBInotifyException\fP)\fC [inline, static]\fP" +.SS "static void Inotify::SetMaxWatches (uint32_t val) throw (\fBInotifyException\fP)\fC [inline, static]\fP" .PP -Sets the maximum number of inotify instances per process. +Sets the maximum number of inotify watches per instance. .PP \fBParameters:\fP .RS 4 @@ -594,40 +617,49 @@ Using this function requires root privileges. Beware of setting extensive values .RE .PP -.SS "static uint32_t Inotify::GetMaxWatches () throw (\fBInotifyException\fP)\fC [inline, static]\fP" +.SS "void Inotify::SetNonBlock (bool fNonBlock) throw (\fBInotifyException\fP)" .PP -Returns the maximum number of inotify watches per instance. +Enables/disables non-blocking mode. .PP -It means the maximum number of inotify watches per inotify file descriptor. +Use this mode if you want to monitor the descriptor (acquired thru \fBGetDescriptor()\fP) in functions such as poll(), select() etc. .PP -\fBReturns:\fP +Non-blocking mode is disabled by default. +.PP +\fBParameters:\fP .RS 4 -maximum number of inotify watches +\fIfNonBlock\fP enable/disable non-blocking mode .RE .PP \fBExceptions:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown if the given value cannot be acquired +\fI\fBInotifyException\fP\fP thrown if setting mode failed +.RE +.PP +\fBSee also:\fP +.RS 4 +\fBGetDescriptor()\fP, \fBSetCloseOnExec()\fP .RE .PP -.SS "static void Inotify::SetMaxWatches (uint32_t val) throw (\fBInotifyException\fP)\fC [inline, static]\fP" +.SS "void Inotify::WaitForEvents (bool fNoIntr = \fCfalse\fP) throw (\fBInotifyException\fP)" .PP -Sets the maximum number of inotify watches per instance. +Waits for inotify events. +.PP +It waits until one or more events occur. When called in nonblocking mode it only retrieves occurred events to the internal queue and exits. .PP \fBParameters:\fP .RS 4 -\fIval\fP new value +\fIfNoIntr\fP if true it re-calls the system call after a handled signal .RE .PP \fBExceptions:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown if the given value cannot be set +\fI\fBInotifyException\fP\fP thrown if reading events failed .RE .PP -\fBAttention:\fP +\fBSee also:\fP .RS 4 -Using this function requires root privileges. Beware of setting extensive values - the greater value is set here the more physical memory may be used for the inotify infrastructure. +\fBSetNonBlock()\fP .RE .PP @@ -635,6 +667,28 @@ Using this function requires root privileges. Beware of setting extensive values .PP .SS "friend class \fBInotifyWatch\fP\fC [friend]\fP" .PP +.SH "Member Data Documentation" +.PP +.SS "unsigned char \fBInotify::m_buf\fP[INOTIFY_BUFLEN]\fC [private]\fP" +.PP +buffer for events +.PP +.SS "std::deque<\fBInotifyEvent\fP> \fBInotify::m_events\fP\fC [private]\fP" +.PP +event queue +.PP +.SS "int \fBInotify::m_fd\fP\fC [private]\fP" +.PP +file descriptor +.PP +.SS "\fBIN_WP_MAP\fP \fBInotify::m_paths\fP\fC [private]\fP" +.PP +watches (by paths) +.PP +.SS "\fBIN_WATCH_MAP\fP \fBInotify::m_watches\fP\fC [private]\fP" +.PP +watches (by descriptors) +.PP .SH "Author" diff --git a/shared/inotify/doc/man/man3/InotifyEvent.3 b/shared/inotify/doc/man/man3/InotifyEvent.3 index 51899460..c45eaba9 100644 --- a/shared/inotify/doc/man/man3/InotifyEvent.3 +++ b/shared/inotify/doc/man/man3/InotifyEvent.3 @@ -1,4 +1,4 @@ -.TH "InotifyEvent" 3 "18 Apr 2007" "Version 0.7.2" "inotify-cxx" \" -*- nroff -*- +.TH "InotifyEvent" 3 "9 Dec 2009" "Version 0.7.3" "inotify-cxx" \" -*- nroff -*- .ad l .nh .SH NAME @@ -26,31 +26,31 @@ InotifyEvent \- inotify event class .br .RI "\fIDestructor. \fP" .ti -1c -.RI "int32_t \fBGetDescriptor\fP () const" +.RI "int32_t \fBGetDescriptor\fP () const " .br .RI "\fIReturns the event watch descriptor. \fP" .ti -1c -.RI "uint32_t \fBGetMask\fP () const" +.RI "uint32_t \fBGetMask\fP () const " .br .RI "\fIReturns the event mask. \fP" .ti -1c -.RI "bool \fBIsType\fP (uint32_t uType) const" +.RI "bool \fBIsType\fP (uint32_t uType) const " .br .RI "\fIChecks for the event type. \fP" .ti -1c -.RI "uint32_t \fBGetCookie\fP () const" +.RI "uint32_t \fBGetCookie\fP () const " .br .RI "\fIReturns the event cookie. \fP" .ti -1c -.RI "uint32_t \fBGetLength\fP () const" +.RI "uint32_t \fBGetLength\fP () const " .br .RI "\fIReturns the event name length. \fP" .ti -1c -.RI "const std::string & \fBGetName\fP () const" +.RI "const std::string & \fBGetName\fP () const " .br .RI "\fIReturns the event name. \fP" .ti -1c -.RI "void \fBGetName\fP (std::string &rName) const" +.RI "void \fBGetName\fP (std::string &rName) const " .br .RI "\fIExtracts the event name. \fP" .ti -1c @@ -58,7 +58,7 @@ InotifyEvent \- inotify event class .br .RI "\fIReturns the source watch. \fP" .ti -1c -.RI "void \fBDumpTypes\fP (std::string &rStr) const" +.RI "void \fBDumpTypes\fP (std::string &rStr) const " .br .RI "\fIFills the string with all types contained in the event mask. \fP" .in -1c @@ -78,6 +78,26 @@ InotifyEvent \- inotify event class .br .RI "\fIFills the string with all types contained in an event mask value. \fP" .in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "uint32_t \fBm_uMask\fP" +.br +.RI "\fImask \fP" +.ti -1c +.RI "uint32_t \fBm_uCookie\fP" +.br +.RI "\fIcookie \fP" +.ti -1c +.RI "std::string \fBm_name\fP" +.br +.RI "\fIname \fP" +.ti -1c +.RI "\fBInotifyWatch\fP * \fBm_pWatch\fP" +.br +.RI "\fIsource watch \fP" +.in -1c .SH "Detailed Description" .PP inotify event class @@ -85,7 +105,6 @@ inotify event class It holds all information about inotify event and provides access to its particular values. .PP This class is not (and is not intended to be) thread-safe and therefore it must not be used concurrently in multiple threads. -.PP .SH "Constructor & Destructor Documentation" .PP .SS "InotifyEvent::InotifyEvent ()\fC [inline]\fP" @@ -113,95 +132,90 @@ Destructor. .PP .SH "Member Function Documentation" .PP -.SS "int32_t InotifyEvent::GetDescriptor () const" -.PP -Returns the event watch descriptor. +.SS "void InotifyEvent::DumpTypes (std::string & rStr) const" .PP -\fBReturns:\fP -.RS 4 -watch descriptor -.RE +Fills the string with all types contained in the event mask. .PP -\fBSee also:\fP +\fBParameters:\fP .RS 4 -\fBInotifyWatch::GetDescriptor()\fP +\fIrStr\fP dumped event types .RE .PP -.SS "uint32_t InotifyEvent::GetMask () const\fC [inline]\fP" -.PP -Returns the event mask. +.SS "void InotifyEvent::DumpTypes (uint32_t uValue, std::string & rStr)\fC [static]\fP" .PP -\fBReturns:\fP -.RS 4 -event mask -.RE +Fills the string with all types contained in an event mask value. .PP -\fBSee also:\fP +\fBParameters:\fP .RS 4 -\fBInotifyWatch::GetMask()\fP +\fIuValue\fP event mask value +.br +\fIrStr\fP dumped event types .RE .PP -.SS "static bool InotifyEvent::IsType (uint32_t uValue, uint32_t uType)\fC [inline, static]\fP" -.PP -Checks a value for the event type. +.SS "uint32_t InotifyEvent::GetCookie () const\fC [inline]\fP" .PP -\fBParameters:\fP -.RS 4 -\fIuValue\fP checked value -.br -\fIuType\fP type which is checked for -.RE +Returns the event cookie. .PP \fBReturns:\fP .RS 4 -true = the value contains the given type, false = otherwise +event cookie .RE .PP -.SS "bool InotifyEvent::IsType (uint32_t uType) const\fC [inline]\fP" +.SS "int32_t InotifyEvent::GetDescriptor () const" .PP -Checks for the event type. +Returns the event watch descriptor. .PP -\fBParameters:\fP +\fBReturns:\fP .RS 4 -\fIuType\fP type which is checked for +watch descriptor .RE .PP -\fBReturns:\fP +\fBSee also:\fP .RS 4 -true = event mask contains the given type, false = otherwise +\fBInotifyWatch::GetDescriptor()\fP .RE .PP -.SS "uint32_t InotifyEvent::GetCookie () const\fC [inline]\fP" +.SS "uint32_t InotifyEvent::GetLength () const\fC [inline]\fP" .PP -Returns the event cookie. +Returns the event name length. .PP \fBReturns:\fP .RS 4 -event cookie +event name length .RE .PP -.SS "uint32_t InotifyEvent::GetLength () const\fC [inline]\fP" +.SS "uint32_t InotifyEvent::GetMask () const\fC [inline]\fP" .PP -Returns the event name length. +Returns the event mask. .PP \fBReturns:\fP .RS 4 -event name length +event mask +.RE +.PP +\fBSee also:\fP +.RS 4 +\fBInotifyWatch::GetMask()\fP .RE .PP -.SS "const std::string& InotifyEvent::GetName () const\fC [inline]\fP" +.SS "uint32_t InotifyEvent::GetMaskByName (const std::string & rName)\fC [static]\fP" .PP -Returns the event name. +Finds the appropriate mask for a name. +.PP +\fBParameters:\fP +.RS 4 +\fIrName\fP mask name +.RE .PP \fBReturns:\fP .RS 4 -event name +mask for name; 0 on failure .RE .PP @@ -215,6 +229,16 @@ Extracts the event name. .RE .PP +.SS "const std::string& InotifyEvent::GetName () const\fC [inline]\fP" +.PP +Returns the event name. +.PP +\fBReturns:\fP +.RS 4 +event name +.RE +.PP + .SS "\fBInotifyWatch\fP* InotifyEvent::GetWatch ()\fC [inline]\fP" .PP Returns the source watch. @@ -225,41 +249,55 @@ source watch .RE .PP -.SS "uint32_t InotifyEvent::GetMaskByName (const std::string & rName)\fC [static]\fP" +.SS "bool InotifyEvent::IsType (uint32_t uType) const\fC [inline]\fP" .PP -Finds the appropriate mask for a name. +Checks for the event type. .PP \fBParameters:\fP .RS 4 -\fIrName\fP mask name +\fIuType\fP type which is checked for .RE .PP \fBReturns:\fP .RS 4 -mask for name; 0 on failure +true = event mask contains the given type, false = otherwise .RE .PP -.SS "void InotifyEvent::DumpTypes (uint32_t uValue, std::string & rStr)\fC [static]\fP" +.SS "static bool InotifyEvent::IsType (uint32_t uValue, uint32_t uType)\fC [inline, static]\fP" .PP -Fills the string with all types contained in an event mask value. +Checks a value for the event type. .PP \fBParameters:\fP .RS 4 -\fIuValue\fP event mask value +\fIuValue\fP checked value .br -\fIrStr\fP dumped event types +\fIuType\fP type which is checked for +.RE +.PP +\fBReturns:\fP +.RS 4 +true = the value contains the given type, false = otherwise .RE .PP -.SS "void InotifyEvent::DumpTypes (std::string & rStr) const" +.SH "Member Data Documentation" +.PP +.SS "std::string \fBInotifyEvent::m_name\fP\fC [private]\fP" .PP -Fills the string with all types contained in the event mask. +name .PP -\fBParameters:\fP -.RS 4 -\fIrStr\fP dumped event types -.RE +.SS "\fBInotifyWatch\fP* \fBInotifyEvent::m_pWatch\fP\fC [private]\fP" +.PP +source watch +.PP +.SS "uint32_t \fBInotifyEvent::m_uCookie\fP\fC [private]\fP" +.PP +cookie +.PP +.SS "uint32_t \fBInotifyEvent::m_uMask\fP\fC [private]\fP" +.PP +mask .PP diff --git a/shared/inotify/doc/man/man3/InotifyException.3 b/shared/inotify/doc/man/man3/InotifyException.3 index 90c5990d..57bc1bec 100644 --- a/shared/inotify/doc/man/man3/InotifyException.3 +++ b/shared/inotify/doc/man/man3/InotifyException.3 @@ -1,4 +1,4 @@ -.TH "InotifyException" 3 "18 Apr 2007" "Version 0.7.2" "inotify-cxx" \" -*- nroff -*- +.TH "InotifyException" 3 "9 Dec 2009" "Version 0.7.3" "inotify-cxx" \" -*- nroff -*- .ad l .nh .SH NAME @@ -18,15 +18,15 @@ InotifyException \- Class for inotify exceptions. .br .RI "\fIConstructor. \fP" .ti -1c -.RI "const std::string & \fBGetMessage\fP () const" +.RI "const std::string & \fBGetMessage\fP () const " .br .RI "\fIReturns the exception message. \fP" .ti -1c -.RI "int \fBGetErrorNumber\fP () const" +.RI "int \fBGetErrorNumber\fP () const " .br .RI "\fIReturns the exception error number. \fP" .ti -1c -.RI "void * \fBGetSource\fP () const" +.RI "void * \fBGetSource\fP () const " .br .RI "\fIReturns the exception source. \fP" .in -1c @@ -53,7 +53,6 @@ Class for inotify exceptions. This class allows to acquire information about exceptional events. It makes easier to log or display error messages and to identify problematic code locations. .PP Although this class is basically thread-safe it is not intended to be shared between threads. -.PP .SH "Constructor & Destructor Documentation" .PP .SS "InotifyException::InotifyException (const std::string & rMsg = \fC''\fP, int iErr = \fC0\fP, void * pSrc = \fCNULL\fP)\fC [inline]\fP" @@ -72,25 +71,25 @@ Constructor. .SH "Member Function Documentation" .PP -.SS "const std::string& InotifyException::GetMessage () const\fC [inline]\fP" +.SS "int InotifyException::GetErrorNumber () const\fC [inline]\fP" .PP -Returns the exception message. +Returns the exception error number. +.PP +If not applicable this value is 0 (zero). .PP \fBReturns:\fP .RS 4 -message +error number (standardized; see errno.h) .RE .PP -.SS "int InotifyException::GetErrorNumber () const\fC [inline]\fP" -.PP -Returns the exception error number. +.SS "const std::string& InotifyException::GetMessage () const\fC [inline]\fP" .PP -If not applicable this value is 0 (zero). +Returns the exception message. .PP \fBReturns:\fP .RS 4 -error number (standardized; see errno.h) +message .RE .PP @@ -106,14 +105,14 @@ source .SH "Member Data Documentation" .PP -.SS "std::string \fBInotifyException::m_msg\fP\fC [protected]\fP" -.PP -message -.PP .SS "int \fBInotifyException::m_err\fP\fC [protected]\fP" .PP error number .PP +.SS "std::string \fBInotifyException::m_msg\fP\fC [protected]\fP" +.PP +message +.PP .SS "void* \fBInotifyException::m_pSrc\fP\fC [mutable, protected]\fP" .PP source diff --git a/shared/inotify/doc/man/man3/InotifyWatch.3 b/shared/inotify/doc/man/man3/InotifyWatch.3 index ea352997..cac74012 100644 --- a/shared/inotify/doc/man/man3/InotifyWatch.3 +++ b/shared/inotify/doc/man/man3/InotifyWatch.3 @@ -1,4 +1,4 @@ -.TH "InotifyWatch" 3 "18 Apr 2007" "Version 0.7.2" "inotify-cxx" \" -*- nroff -*- +.TH "InotifyWatch" 3 "9 Dec 2009" "Version 0.7.3" "inotify-cxx" \" -*- nroff -*- .ad l .nh .SH NAME @@ -22,15 +22,15 @@ InotifyWatch \- inotify watch class .br .RI "\fIDestructor. \fP" .ti -1c -.RI "int32_t \fBGetDescriptor\fP () const" +.RI "int32_t \fBGetDescriptor\fP () const " .br .RI "\fIReturns the watch descriptor. \fP" .ti -1c -.RI "const std::string & \fBGetPath\fP () const" +.RI "const std::string & \fBGetPath\fP () const " .br .RI "\fIReturns the watched file path. \fP" .ti -1c -.RI "uint32_t \fBGetMask\fP () const" +.RI "uint32_t \fBGetMask\fP () const " .br .RI "\fIReturns the watch event mask. \fP" .ti -1c @@ -46,14 +46,46 @@ InotifyWatch \- inotify watch class .br .RI "\fIEnables/disables the watch. \fP" .ti -1c -.RI "bool \fBIsEnabled\fP () const" +.RI "bool \fBIsEnabled\fP () const " .br .RI "\fIChecks whether the watch is enabled. \fP" .ti -1c -.RI "bool \fBIsRecursive\fP () const" +.RI "bool \fBIsRecursive\fP () const " .br .RI "\fIChecks whether the watch is recursive. \fP" .in -1c +.SS "Private Member Functions" + +.in +1c +.ti -1c +.RI "IN_LOCK_DECL void \fB__Disable\fP ()" +.br +.RI "\fIDisables the watch (due to removing by the kernel). \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "std::string \fBm_path\fP" +.br +.RI "\fIwatched file path \fP" +.ti -1c +.RI "uint32_t \fBm_uMask\fP" +.br +.RI "\fIevent mask \fP" +.ti -1c +.RI "int32_t \fBm_wd\fP" +.br +.RI "\fIwatch descriptor \fP" +.ti -1c +.RI "\fBInotify\fP * \fBm_pInotify\fP" +.br +.RI "\fIinotify object \fP" +.ti -1c +.RI "bool \fBm_fEnabled\fP" +.br +.RI "\fIevents enabled yes/no \fP" +.in -1c .SS "Friends" .in +1c @@ -68,7 +100,6 @@ inotify watch class It holds information about the inotify watch on a particular inode. .PP If the INOTIFY_THREAD_SAFE is defined this class is thread-safe. -.PP .SH "Constructor & Destructor Documentation" .PP .SS "InotifyWatch::InotifyWatch (const std::string & rPath, int32_t uMask, bool fEnabled = \fCtrue\fP)\fC [inline]\fP" @@ -93,6 +124,11 @@ Destructor. .PP .SH "Member Function Documentation" .PP +.SS "void InotifyWatch::__Disable ()\fC [private]\fP" +.PP +Disables the watch (due to removing by the kernel). +.PP +This method must be called after receiving an event. It ensures the watch object is consistent with the kernel data. .SS "int32_t InotifyWatch::GetDescriptor () const\fC [inline]\fP" .PP Returns the watch descriptor. @@ -103,13 +139,13 @@ watch descriptor; -1 for inactive watch .RE .PP -.SS "const std::string& InotifyWatch::GetPath () const\fC [inline]\fP" +.SS "\fBInotify\fP* InotifyWatch::GetInotify ()\fC [inline]\fP" .PP -Returns the watched file path. +Returns the appropriate inotify class instance. .PP \fBReturns:\fP .RS 4 -file path +inotify instance .RE .PP @@ -123,30 +159,40 @@ event mask .RE .PP -.SS "void InotifyWatch::SetMask (uint32_t uMask) throw (\fBInotifyException\fP)" -.PP -Sets the watch event mask. +.SS "const std::string& InotifyWatch::GetPath () const\fC [inline]\fP" .PP -If the watch is active (added to an instance of \fBInotify\fP) this method may fail due to unsuccessful re-setting the watch in the kernel. +Returns the watched file path. .PP -\fBParameters:\fP +\fBReturns:\fP .RS 4 -\fIuMask\fP event mask +file path .RE .PP -\fBExceptions:\fP + +.SS "bool InotifyWatch::IsEnabled () const\fC [inline]\fP" +.PP +Checks whether the watch is enabled. +.PP +\fBReturns:\fP .RS 4 -\fI\fBInotifyException\fP\fP thrown if changing fails +true = enables, false = disabled .RE .PP -.SS "\fBInotify\fP* InotifyWatch::GetInotify ()\fC [inline]\fP" +.SS "bool InotifyWatch::IsRecursive () const\fC [inline]\fP" .PP -Returns the appropriate inotify class instance. +Checks whether the watch is recursive. +.PP +A recursive watch monitors a directory itself and all its subdirectories. This watch is a logical object which may have many underlying kernel watches. .PP \fBReturns:\fP .RS 4 -inotify instance +currently always false (recursive watches not yet supported) +.RE +.PP +\fBAttention:\fP +.RS 4 +Recursive watches are currently NOT supported. They are planned for future versions. .RE .PP @@ -169,30 +215,20 @@ Re-setting the current state has no effect. .RE .PP -.SS "bool InotifyWatch::IsEnabled () const\fC [inline]\fP" -.PP -Checks whether the watch is enabled. -.PP -\fBReturns:\fP -.RS 4 -true = enables, false = disabled -.RE -.PP - -.SS "bool InotifyWatch::IsRecursive () const\fC [inline]\fP" +.SS "void InotifyWatch::SetMask (uint32_t uMask) throw (\fBInotifyException\fP)" .PP -Checks whether the watch is recursive. +Sets the watch event mask. .PP -A recursive watch monitors a directory itself and all its subdirectories. This watch is a logical object which may have many underlying kernel watches. +If the watch is active (added to an instance of \fBInotify\fP) this method may fail due to unsuccessful re-setting the watch in the kernel. .PP -\fBReturns:\fP +\fBParameters:\fP .RS 4 -currently always false (recursive watches not yet supported) +\fIuMask\fP event mask .RE .PP -\fBAttention:\fP +\fBExceptions:\fP .RS 4 -Recursive watches are currently NOT supported. They are planned for future versions. +\fI\fBInotifyException\fP\fP thrown if changing fails .RE .PP @@ -200,6 +236,28 @@ Recursive watches are currently NOT supported. They are planned for future versi .PP .SS "friend class \fBInotify\fP\fC [friend]\fP" .PP +.SH "Member Data Documentation" +.PP +.SS "bool \fBInotifyWatch::m_fEnabled\fP\fC [private]\fP" +.PP +events enabled yes/no +.PP +.SS "std::string \fBInotifyWatch::m_path\fP\fC [private]\fP" +.PP +watched file path +.PP +.SS "\fBInotify\fP* \fBInotifyWatch::m_pInotify\fP\fC [private]\fP" +.PP +inotify object +.PP +.SS "uint32_t \fBInotifyWatch::m_uMask\fP\fC [private]\fP" +.PP +event mask +.PP +.SS "int32_t \fBInotifyWatch::m_wd\fP\fC [private]\fP" +.PP +watch descriptor +.PP .SH "Author" diff --git a/shared/inotify/doc/man/man3/inotify-cxx.cpp.3 b/shared/inotify/doc/man/man3/inotify-cxx.cpp.3 index dd326b47..aed8e808 100644 --- a/shared/inotify/doc/man/man3/inotify-cxx.cpp.3 +++ b/shared/inotify/doc/man/man3/inotify-cxx.cpp.3 @@ -1,8 +1,10 @@ -.TH "inotify-cxx.cpp" 3 "18 Apr 2007" "Version 0.7.2" "inotify-cxx" \" -*- nroff -*- +.TH "inotify-cxx.cpp" 3 "9 Dec 2009" "Version 0.7.3" "inotify-cxx" \" -*- nroff -*- .ad l .nh .SH NAME -inotify-cxx.cpp \- inotify C++ interface implementation +inotify-cxx.cpp \- inotify C++ interface implementation + +.PP .SH SYNOPSIS .br .PP @@ -12,6 +14,12 @@ inotify-cxx.cpp \- inotify C++ interface implementation .br \fC#include <fcntl.h>\fP .br +\fC#include <fstream>\fP +.br +\fC#include <sys/syscall.h>\fP +.br +\fC#include <sys/inotify-syscalls.h>\fP +.br \fC#include 'inotify-cxx.h'\fP .br @@ -33,7 +41,7 @@ inotify C++ interface implementation inotify C++ interface .PP -Copyright (C) 2006, 2007 Lukas Jelinek <lukas@aiken.cz> +Copyright (C) 2006, 2007, 2009 Lukas Jelinek <lukas@aiken.cz> .PP This program is free software; you can redistribute it and/or modify it under the terms of one of the following licenses: .PP @@ -45,7 +53,9 @@ This program is free software; you can redistribute it and/or modify it under th .IP "\(bu" 2 3. GNU General Public License, version 2 (see LICENSE-GPL) .PP -If you want to help with choosing the best license for you, please visit http://www.gnu.org/licenses/license-list.html. +If you want to help with choosing the best license for you, please visit http://www.gnu.org/licenses/license-list.html. +.PP +Credits: Mike Frysinger (cleanup of includes) .SH "Define Documentation" .PP .SS "#define DUMP_SEP" diff --git a/shared/inotify/doc/man/man3/inotify-cxx.h.3 b/shared/inotify/doc/man/man3/inotify-cxx.h.3 index 4e0ec8b3..8c729b37 100644 --- a/shared/inotify/doc/man/man3/inotify-cxx.h.3 +++ b/shared/inotify/doc/man/man3/inotify-cxx.h.3 @@ -1,8 +1,10 @@ -.TH "inotify-cxx.h" 3 "18 Apr 2007" "Version 0.7.2" "inotify-cxx" \" -*- nroff -*- +.TH "inotify-cxx.h" 3 "9 Dec 2009" "Version 0.7.3" "inotify-cxx" \" -*- nroff -*- .ad l .nh .SH NAME -inotify-cxx.h \- inotify C++ interface header +inotify-cxx.h \- inotify C++ interface header + +.PP .SH SYNOPSIS .br .PP @@ -14,12 +16,8 @@ inotify-cxx.h \- inotify C++ interface header .br \fC#include <map>\fP .br -\fC#include <sys/syscall.h>\fP -.br \fC#include <sys/inotify.h>\fP .br -\fC#include <sys/inotify-syscalls.h>\fP -.br .SS "Classes" @@ -111,7 +109,7 @@ inotify C++ interface header inotify C++ interface .PP -Copyright (C) 2006, 2007 Lukas Jelinek, <lukas@aiken.cz> +Copyright (C) 2006, 2007, 2009 Lukas Jelinek, <lukas@aiken.cz> .PP This program is free software; you can redistribute it and/or modify it under the terms of one of the following licenses: .PP @@ -123,7 +121,9 @@ This program is free software; you can redistribute it and/or modify it under th .IP "\(bu" 2 3. GNU General Public License, version 2 (see LICENSE-GPL) .PP -If you want to help with choosing the best license for you, please visit http://www.gnu.org/licenses/license-list.html. +If you want to help with choosing the best license for you, please visit http://www.gnu.org/licenses/license-list.html. +.PP +Credits: Mike Frysinger (cleanup of includes) .SH "Define Documentation" .PP .SS "#define IN_EXC_MSG(msg) (std::string(__PRETTY_FUNCTION__) + ': ' + msg)" diff --git a/shared/inotify/inotify-cxx.cpp b/shared/inotify/inotify-cxx.cpp index 7c523afb..689612ac 100644 --- a/shared/inotify/inotify-cxx.cpp +++ b/shared/inotify/inotify-cxx.cpp @@ -5,7 +5,7 @@ * * inotify C++ interface * - * Copyright (C) 2006, 2007 Lukas Jelinek <lukas@aiken.cz> + * Copyright (C) 2006, 2007, 2009 Lukas Jelinek <lukas@aiken.cz> * * This program is free software; you can redistribute it and/or * modify it under the terms of one of the following licenses: @@ -16,15 +16,24 @@ * * If you want to help with choosing the best license for you, * please visit http://www.gnu.org/licenses/license-list.html. + * + * Credits: + * Mike Frysinger (cleanup of includes) * */ - -//added by ZenJu -#include <cstdio> + #include <errno.h> #include <unistd.h> #include <fcntl.h> +#include <fstream> + +#include <sys/syscall.h> + +// Use this if syscalls not defined +#ifndef __NR_inotify_init +#include <sys/inotify-syscalls.h> +#endif // __NR_inotify_init #include "inotify-cxx.h" diff --git a/shared/inotify/inotify-cxx.h b/shared/inotify/inotify-cxx.h index 4170972f..34ae2212 100644 --- a/shared/inotify/inotify-cxx.h +++ b/shared/inotify/inotify-cxx.h @@ -5,7 +5,7 @@ * * inotify C++ interface * - * Copyright (C) 2006, 2007 Lukas Jelinek, <lukas@aiken.cz> + * Copyright (C) 2006, 2007, 2009 Lukas Jelinek, <lukas@aiken.cz> * * This program is free software; you can redistribute it and/or * modify it under the terms of one of the following licenses: @@ -16,7 +16,10 @@ * * If you want to help with choosing the best license for you, * please visit http://www.gnu.org/licenses/license-list.html. - * + * + * Credits: + * Mike Frysinger (cleanup of includes) + * */ @@ -31,14 +34,9 @@ #include <deque> #include <map> -// Please ensure that the following headers take the right place -#include <sys/syscall.h> +// Please ensure that the following header file takes the right place #include <sys/inotify.h> -// Use this if syscalls not defined -#ifndef __NR_inotify_init -#include <sys/inotify-syscalls.h> -#endif // __NR_inotify_init /// Event struct size #define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event)) diff --git a/shared/localization.cpp b/shared/localization.cpp index 5f017989..bcb594a6 100644 --- a/shared/localization.cpp +++ b/shared/localization.cpp @@ -1,4 +1,10 @@ -#include "localization.h" +// ************************************************************************** +// * 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 "localization.h" #include <wx/msgdlg.h> #include "../shared/standardPaths.h" #include "../shared/stringConv.h" @@ -250,6 +256,26 @@ int mapLanguageDialect(const int language) //case wxLANGUAGE_PORTUGUESE: //case wxLANGUAGE_PORTUGUESE_BRAZILIAN: +//variants of wxLANGUAGE_ARABIC -> needed to detect RTL languages + case wxLANGUAGE_ARABIC_ALGERIA: + case wxLANGUAGE_ARABIC_BAHRAIN: + case wxLANGUAGE_ARABIC_EGYPT: + case wxLANGUAGE_ARABIC_IRAQ: + case wxLANGUAGE_ARABIC_JORDAN: + case wxLANGUAGE_ARABIC_KUWAIT: + case wxLANGUAGE_ARABIC_LEBANON: + case wxLANGUAGE_ARABIC_LIBYA: + case wxLANGUAGE_ARABIC_MOROCCO: + case wxLANGUAGE_ARABIC_OMAN: + case wxLANGUAGE_ARABIC_QATAR: + case wxLANGUAGE_ARABIC_SAUDI_ARABIA: + case wxLANGUAGE_ARABIC_SUDAN: + case wxLANGUAGE_ARABIC_SYRIA: + case wxLANGUAGE_ARABIC_TUNISIA: + case wxLANGUAGE_ARABIC_UAE: + case wxLANGUAGE_ARABIC_YEMEN: + return wxLANGUAGE_ARABIC; + default: return language; } @@ -270,9 +296,18 @@ CustomLocale& CustomLocale::getInstance() CustomLocale::CustomLocale() : - wxLocale(wxLANGUAGE_DEFAULT), //setting a different language needn't be supported on all systems! translationDB(new Translation), - currentLanguage(wxLANGUAGE_ENGLISH) {} + 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! +} + + +CustomLocale::~CustomLocale() {} //non-inline destructor for std::auto_ptr to work with forward declaration inline @@ -397,7 +432,7 @@ void CustomLocale::setLanguage(const int language) translationDB->clear(); if (!languageFile.empty()) { - UnicodeFileReader langFile(FreeFileSync::getInstallationDir() + wxT("Languages") + + UnicodeFileReader langFile(FreeFileSync::getResourceDir() + wxT("Languages") + zToWx(globalFunctions::FILE_NAME_SEPARATOR) + languageFile); if (langFile.isOkay()) { @@ -408,7 +443,7 @@ void CustomLocale::setLanguage(const int language) { exchangeEscapeChars(tmpString); - if (rowNumber % 2 == 0) + if (rowNumber++ % 2 == 0) original = tmpString; else { @@ -417,8 +452,6 @@ void CustomLocale::setLanguage(const int language) if (!translation.empty()) translationDB->insert(std::make_pair(original, translation)); } - - ++rowNumber; } } else diff --git a/shared/localization.h b/shared/localization.h index 0a5ca4fb..157969cf 100644 --- a/shared/localization.h +++ b/shared/localization.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 MISC_H_INCLUDED #define MISC_H_INCLUDED @@ -55,8 +61,9 @@ public: private: CustomLocale(); + ~CustomLocale(); //non-inline destructor for std::auto_ptr to work with forward declaration -> superfluous in this case: singleton pattern! - std::auto_ptr<Translation> translationDB; + std::auto_ptr<Translation> translationDB; //careful with forward-declarations and auto_ptr! save in this case, 'cause full class info available int currentLanguage; }; } diff --git a/shared/loki/CHANGES b/shared/loki/CHANGES new file mode 100644 index 00000000..67f6505e --- /dev/null +++ b/shared/loki/CHANGES @@ -0,0 +1,446 @@ +_____________________________________ + +Version 0.1.7 +January 2009 +_____________________________________ + +General: + - Fixed makefiles for GNU/kFreeBSD, GNU/hurd. (lf) + - Fixed build errors with gcc 4.3 pre-release. (lf) + - Fixed compiler error that occurs when using 64 bit pointers. (rs) + - Added support for Code::Blocks and MSVC 9. (rs, pk) + - Added more unit tests (rs) + - Several other bug fixes (rs, pk) + +Checker: + - Added for this release. (rs) + - Added test project. (rs) + +CheckReturn: + - Added for this release. (rs, pk) + - Added test project. (rs + pk) + +flex_string: + - Fixed bugs in several functions and storage policies. (aa, rs, jfg) + +LevelMutex: + - Added for this release. (rs) + - Added unit tests for LevelMutex. (rs) + +SafeBits: + - Added for this release. (rs, fp) + - Added unit tests for SafeBits. (rs, fp) + +SmartPtr: + - Fixed double-delete race condition. (rs) + +StrongPtr: + - Fixed destructor so cleanup is only done once. (rs) + - Fixed test by using class level locking. (lf) + +Threads: + - Add possibility to enable recursive mutex support for pthread (pk) + - Added more atomic functions. (rs) + +Type Traits: + - Added 64 bit support. (cg) + +CVS commits by: + Andrei Alexandrescu (aa) + Guillaume Chatelet (cg) + Lukas Fittl (lf) + Peter Kümmel (pk) + Rich Sposato (rs) + +Contributions by: + Andrei Alexandrescu (aa) + Jean-Francois Bastien (jfb) + Guillaume Chatelet (cg) + Lukas Fittl (lf) + Fedor Pikus (fp) + Peter Kümmel (pk) + Rich Sposato (rs) + +_____________________________________ + +Version 0.1.6 +February 25, 2007 +_____________________________________ + +General: + - CacheFactory added by Guillaume Chatelet + - Factory documentation improved by Guillaume Chatelet + - migrated to subversion (pk) + - Mac linker errors fixed (lf) + - Makefiles can now be called from sub directories (lf) + - Makefiles know includes and recompile if they are changed (linux, macosx) (lf) + - Build all tests except SingletonDll with the static library (linux, macosx) (lf) + - use standard conforming naming, SUN's compiler needs it (pk) + - add Loki:: to LOKI_ macros + - several bug fixes. + +AbstractFactory: + - remove injected friends. (thanks to Sigoure Benoit, pk) + +AssocVector: + - remove injected friends. (thanks to Sigoure Benoit, pk) + +LockingPtr: + - constructor added which gets a std::pair of pointers + to the object and the mutex (pk) + +Pimpl: + - ImplT/PimplT/RimplT renamed to a more readable version: ImplOf (pk) + +Register: + - also produce a informative LOKI_CHECK_CLASS_IN_LIST error message with GCC (pk) + +SafeFormat: + - add writing to ostream, by Tom Browder (pk) + - add unsigned long version for Windows, (Thanks to ShenLei, pk) + +Sequence: + - Also compiles with Aix + - switched to recursive implementation + +Singleton + - example: move instantiation to the source file + fixes linker error with gcc 4.0.1 on the mac, + (Thanks to Idar Tollefsen and Sam Miller, pk) + - 64 bit linker error fixed (lf) + +SmallObj: + - compiler errors on SUN fixed (pk) + - more documentation (rs) + - more tests (rs) + - AIX fixed, (thanks to Dieter Rosch, pk) + +StrongPtr: + - Added typedef so LockableTwoRefCounts uses thread-safe allocator. (rs) + - AIX fixed, (thanks to Dieter Rosch, pk) + - linker error when using threads fixed (pk) + +Threads: + - reentrance support added to the pthread mutex (Thanks to Shen Lei, pk) + + +CVS commits by Guillaume Chatelet (gc), Lukas Fittl (lf), Peter Kümmel (pk), Rich Sposato (rs) + + +_____________________________________ + +Version 0.1.5 +June 19, 2006 +_____________________________________ + +General: + - operator== added to Functor, initiated by Eric Beyeler (pk) + - new Strong/Weak smart pointer added. (rs) + - loki.spec (Thanks to Regis Desgroppes and Andreas Scherer, pk) + - build shared lib also on mac osx (Thanks to Sam Miller, lf) + - added MinGW .dev files for the library (rs) + - some makefile improvements (Thanks to Sam Miller, lf) + - adding an XCode build project (kx) + + +flex_string: + - compare bug fixed in flex_string_shell.h (Thanks to David A. Capello, pk) + +Function: + - test is doesn't need boost any more (pk) + - wrong default parameter fixed (pk) + +OrderedStatic: + - undef all min/max macros (Thanks to Shen Lei, pk) + +Singleton: + - Singleton<> moved into correct namespace (Thanks to Sam Miller, pk) + +SmartPtr: + - patch for RedHat 9: undefined uintptr_t (Thanks to Regis Desgroppes, pk) + - more tests (rs) + - bugs 1452805 and 1451835 fixed (rs) + - addded HeapStorage policy as mentioned in Feature Request 1441024 (rs) + - added MinGW test project for SmartPtr (rs) + + +CVS commits by Rich Sposato (rs), Lukas Fittl (lf), +Christopher Knox (kx), and Peter Kümmel (pk) + + + +_____________________________________ + +Version 0.1.4 +March 8, 2006 +_____________________________________ + +General: + - helper templates for Pimpl/Rimpl implementations added (pk) + - improved Makefiles (lf) + - improved make.msvc.bat files (pk) + - cvs LOG keywords added (rs) + - removed old c style casts (lf) + - more warning enabled on gcc (lf) + - new header added: ConstPolicy.h (rs,pk) + - new header added: RefToValue.h (rs,pk) + - standard RPM specification file for integrated installation + on OpenSUSE Linux added (Thanks to Andreas Scherer, pk) + - using Loki as shared library is now possible (pk,lf) + - Register.h added (pk) + + +Function: + - guard including (pk) + - test stsic functions (pk) + - test LOKI_FUNCTOR_IS_NOT_A_SMALLOBJECT (pk) + +Functor: + - Added explicit call to base copy-constructor (rs) + - Changed base class from SmallObject to SmallValueObject. (Thanks to Sam Miller, rs) + - add possibility to disable inheritance from SmallValueObject: LOKI_FUNCTOR_IS_NOT_A_SMALLOBJECT (pk) + +ScopeGuard: + - naming conflict with SmartPtr removed (rs,pk) + - ByRef moved to RefByVale (rs,pk) + +Singleton: + - support of allocators with a standard interface added (Thanks to Miguel A. Figueroa-Villanueva, pk) + - convenience template Singleton added for shared libraries (Thanks to Marcus Lindblom, pk) + - example added which shows how to use Singletons with shared libraries added (Thanks to Marcus Lindblom, pk) + +SmartPtr: + - supports propagating constness by additional policy (rs,pk) + - ArrayStorage policy added (Thanks to Sam Miller, pk) + - fix in RefCounted for Mac OSX gcc 4.0.0 (Thanks to Sam Miller, pk) + - RefCounted ported to 64 bit (pk) + - add mutex policy (pk) + - new test code (rs) + - RecjectNullStrict const member function added (Thanks to Sam Miller, pk) + - Moved a monolithic RefLinkedBase class from header file to new source file. (rs) + - ByRef moved to RefToVale (rs,pk) + - Fixed bug 1425890. Last SmartPtr in linked chain NULLs its prev & next + pointers to prevent infinite recursion. Added asserts. (rs) + - Bug fix: infinite recursion in SmartPtr destructor (rs) + +LockingPtr: + - wrong return types fixed (rs) + - add mutex policy (rs,pk) + - supports now propagating constness (pk,rs) + - macro switch LOKI_DEFAULT_CONSTNESS added for propagating constness (pk) + - multi threaded example added + +SafeFormat: + - definition moved to src/SafeFormat.cpp, it's now part of the library + +Singleton: + - add mutex policy (pk) + +SmallObj: + - add mutex policy (pk) + - Added check for memory leak inside destructor. (Thanks to Kwak Jae Hyuk, rs) + +Threads: + - Mutex added (rs,pk) + - use Loki::Mutex instead of win32/posix mutexes in threading classes (rs,pk) + + +CVS commits by Rich Sposato (rs), Lukas Fittl (lf) +and Peter Kümmel (pk) + + + +_____________________________________ + +Version 0.1.3 +January 9, 2006 +_____________________________________ + +General: + - LockPtr added (rs) + - ScopeGuard added (pk,rs) + - improved Makefiles (lf,pk) + - several gcc fixes and removed warnings by Lukas Fittl (lf) + - tested on 64-bit Linux (pk) + - MS Visual C++ 2005 project files added (pk) + - now also the ms toolkit 2003 generates a library (pk) + +OrderedStatic: + - point operator added (pk) + +SafeFormat: + - moved into namespace Loki (pk) + - 64 bit problems fixed (Thanks to Zak Kipling) + - ported to 64-bit Windows, not tested (pk) + - Printf/SPrintfing of std::strings added (pk) + - all warnings removed gcc and msvc (pk) + - use snprintf for "%p" + - test program: speed comparison added (pk) + +SmallObject: + - added functions to check for memory corruption (rs) + - more fine tuning (rs) + - warnings removed (pk) + +TypeTraits: + - bug 1388477 fixed (pk) + +flex_string: + - fixed compare bug by updating (Thanks to Justin Matthews, pk) + - fixed seg faults on Linux and Windows (pk) + - improved error reporting of the test program (pk) + +SmartPtr: + - make object level locking possible (Thanks to Ryan Smith, pk) + +BindFirst: + - store Functor arguments by value (bug 1383566) (pk) + +Visitor: + - add support for visiting constant member functions (pk) + - example added (pk) + +ScopeGuard: + - example added (pk) + + +CVS commits by Rich Sposato (rs), Lukas Fittl (lf) +and Peter Kümmel (pk) + + +_____________________________________ + +Version 0.1.2 +November 16, 2005 +_____________________________________ + +General: + - changes to compile under Linux (Thanks to David Lawrence, pk) + - more doxygen documentation, modules added (rs, pk) + +SmartPtr: + - three year old bugs 626407 and 541846 fixed: + Assertion with SmartPtr<T, LinkedRef> (pk) + SmartPtr and COMRefCounted (Thanks to James Mclaren, pk) + +Typelists: + - it's now possible to completely disable the + LOKI_TYPELIST_ macros (pk) + - marco definitions moved to a separate file (pk) + +Factory: + - Factory now protects its private data (pk) + - new method to get the keys: + std::vector<IdType> RegisteredIds() (pk) + +Functor: + - TR1 methods added: empty() and clear() (pk) + +Function: + - boost/TR1 like Function template with + improved member function pointer usage (pk) + - tested with boost's function_test.cpp + +Sequence: + - small change in usage: use e.g. Functor<void,Seq<bool &> > + instead of Functor<void,Seq<bool &>::Type > + +SmallObjects: + - comparison of new/malloc/std::allocator/boost::object_pool (rs, pk) + - #undef LOKI_SMALL_OBJECT_USE_NEW_ARRAY when using a ms compiler (pk) + - new lifetimes in namespace LongevityLifetime to manage dependencies: + DieAsSmallObjectParent and DieAsSmallObjectClient (pk) + - no memory leaks when using SmallObjects (pk) + - new default lifetime is DieAsSmallObjectParent (pk) + +Threads: + - threads on POSIX systems (Thanks to Ilya Volvovski ,pk) + - small regression test program (pk) + +Singleton: + - new lifetime: FollowIntoDeath (pk) + - new namespace LongevityLifetime with lifetimes DieLast, DieFirst, + DieDirectlyBeforeLast, and function SingletonFixedLongevity (pk) + - new implementation for SetLongevity (pk) + - example programs (pk) + + +CVS commits by Rich Sposato (rs) and Peter Kümmel (pk) + + + +_____________________________________ + +Version 0.1.1 +October 17, 2005 +_____________________________________ + +Singleton: + - wrong ordered longevity fixed (Thanks to Kwak Jae Hyuk, pk) + - less warnings with msvc (Thanks to John Bates, pk) + - new policy, DeletableSingleton, from Curtis Krauskopf, + see also CUJ article 'Creating Dynamic Singletons & the Loki Library',(pk) + +AssocVector: + - hinted insert does now preserve ordering (Thanks to Christopher Twigg, pk) + - additional 'hinted insert' test for Regression test by Christopher Twigg (pk) + - fix name look up (Thanks to Markus Werle, pk) + +SmallObj: + - several improvements (rs) + - more documentation (rs) + - improved SmallBench (rs, pk) + +Longevity: + - example added (pk) + - additional example similar to that of the book, by Curtis Krauskopf (pk) + +OrderedStatic: + - a proposal to solve the 'static initialization ordered fiasco' problem (pk) + +Sequence: + - a proposal to replace the LOKI_TYPELIST_XX macros with a template implementation (pk) + - e.g.: LOKI_TYPELIST_1(int) becomes Seq<int>::Type + inspired by the functional language OPAL (pk) + + +CVS commits by Rich Sposato (rs) and Peter Kümmel (pk) + + + +_____________________________________ + +Version 0.1.0 +September 29, 2005 +_____________________________________ + +General: + - version numbering started + - new directory structure + - Andrei's yasli, flex_string, and SafePrint added (pk) + - all macros now in the LOKI "namespace", e.g.: + TYPLELIST_1 -> LOKI_TYPELIST_1 (rs, pk) + - Makefiles added: tested with gcc 3.4 (mingw, cygwin), + msvc 8.0, and the toolkit (pk) + - added some documentation (rs) + - several bug fixes (pk) + - added a cvs-list to sourceforge where you can see all changes (pk) + +SmallObjects: + - new implementation (rs) + +Factory: + - works now with parameters (pk) + - regression test added (Thanks to Kalle Rutanen, pk) + +TypeTraits: + - isMemberPointer, isFunction added (Thanks to Kalle Rutanen, pk) + - regression test added (Thanks to Kalle Rutanen, pk) + +Threading: + - new macros for better thread support (win32): + LOKI_CLASS_LEVEL_THREADING and LOKI_OBJECT_LEVEL_THREADING (pk) + + +CVS commits by Rich Sposato (rs) and Peter Kümmel (pk) + diff --git a/shared/longPathPrefix.cpp b/shared/longPathPrefix.cpp index 9ce74c8b..e8b14b90 100644 --- a/shared/longPathPrefix.cpp +++ b/shared/longPathPrefix.cpp @@ -1,45 +1,11 @@ +// ************************************************************************** +// * 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 "longPathPrefix.h" -#include <boost/scoped_array.hpp> #include <wx/msw/wrapwin.h> //includes "windows.h" -#include "fileError.h" -#include "systemFunctions.h" -#include "stringConv.h" -#include <wx/intl.h> - -namespace -{ -Zstring getFullPathName(const Zstring& relativeName, size_t proposedBufferSize = 1000) -{ - using namespace FreeFileSync; - - boost::scoped_array<DefaultChar> fullPath(new DefaultChar[proposedBufferSize]); - const DWORD rv = ::GetFullPathName( - relativeName.c_str(), //__in LPCTSTR lpFileName, - proposedBufferSize, //__in DWORD nBufferLength, - fullPath.get(), //__out LPTSTR lpBuffer, - NULL); //__out LPTSTR *lpFilePart - if (rv == 0 || rv == proposedBufferSize) - throw FileError(wxString(_("Error resolving full path name:")) + wxT("\n\"") + zToWx(relativeName) + wxT("\"") + - wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); - if (rv > proposedBufferSize) - return getFullPathName(relativeName, rv); - - return fullPath.get(); -} -} - - -Zstring FreeFileSync::resolveRelativePath(const Zstring& path) //throw() -{ - try - { - return getFullPathName(path); - } - catch (...) - { - return path; - } -} //there are two flavors of long path prefix: one for UNC paths, one for regular paths diff --git a/shared/longPathPrefix.h b/shared/longPathPrefix.h index e4834184..4ebe7a9d 100644 --- a/shared/longPathPrefix.h +++ b/shared/longPathPrefix.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 LONGPATHPREFIX_H_INCLUDED #define LONGPATHPREFIX_H_INCLUDED @@ -9,9 +15,6 @@ use in windows build only! namespace FreeFileSync { - -Zstring resolveRelativePath(const Zstring& path); //throw() - //handle filenames longer-equal 260 (== MAX_PATH) characters by applying \\?\-prefix (Reference: http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maxpath) /* 1. path must be absolute diff --git a/shared/recycler.cpp b/shared/recycler.cpp index b3bb87dd..4b5a4639 100644 --- a/shared/recycler.cpp +++ b/shared/recycler.cpp @@ -1,13 +1,38 @@ +// ************************************************************************** +// * 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 "recycler.h" -#include "dllLoader.h" +#include "stringConv.h" #include <wx/intl.h> +#include <stdexcept> + +#ifdef FFS_WIN +#include "dllLoader.h" #include <wx/msw/wrapwin.h> //includes "windows.h" #include "buildInfo.h" #include "staticAssert.h" #include <algorithm> #include <functional> -//#include "../shared/longPathPrefix.h" +#include <vector> +#include "longPathPrefix.h" + +#elif defined FFS_LINUX +#include <sys/stat.h> + +#ifdef RECYCLER_GIO +#include <gio/gio.h> +#include <boost/shared_ptr.hpp> +#endif +#endif + + +namespace +{ +#ifdef FFS_WIN const std::wstring& getRecyclerDllName() { static const std::wstring filename( @@ -49,16 +74,10 @@ IFileOperation - multiple files 2,1s Nevertheless, let's use IFileOperation for better error reporting! */ -void FreeFileSync::moveToWindowsRecycler(const Zstring& fileToDelete) //throw (FileError) +void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw (FileError) { - std::vector<Zstring> fileNames; - fileNames.push_back(fileToDelete); - moveToWindowsRecycler(fileNames); //throw (FileError) -} - + using FreeFileSync::FileError; -void FreeFileSync::moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw (FileError) -{ if (filesToDelete.empty()) return; @@ -93,8 +112,7 @@ void FreeFileSync::moveToWindowsRecycler(const std::vector<Zstring>& filesToDele errorMessage, 2000)) { - throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + fileNames[0] + wxT("\"") + //report first file only... better than nothing - + wxT("\n\n") + + throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + fileNames[0] + wxT("\"\n\n") + //report first file only... better than nothing wxT("(") + errorMessage + wxT(")")); } } @@ -125,4 +143,64 @@ void FreeFileSync::moveToWindowsRecycler(const std::vector<Zstring>& filesToDele } } } +#endif +} + +void FreeFileSync::moveToRecycleBin(const Zstring& fileToDelete) //throw (FileError) +{ +#ifdef FFS_WIN + const Zstring filenameFmt = applyLongPathPrefix(fileToDelete); + if (::GetFileAttributes(filenameFmt.c_str()) == INVALID_FILE_ATTRIBUTES) + return; //neither file nor any other object with that name existing: no error situation, manual deletion relies on it! + + std::vector<Zstring> fileNames; + fileNames.push_back(fileToDelete); + ::moveToWindowsRecycler(fileNames); //throw (FileError) + +#elif defined FFS_LINUX + struct stat fileInfo; + if (::lstat(fileToDelete.c_str(), &fileInfo) != 0) + return; //neither file nor any other object with that name existing: no error situation, manual deletion relies on it! + +#ifdef RECYCLER_GIO + boost::shared_ptr<GFile> fileObj(g_file_new_for_path(fileToDelete.c_str()), &g_object_unref); + GError* error = NULL; + if (g_file_trash(fileObj.get(), NULL, &error) == FALSE) + { + if (!error) + throw std::runtime_error("Recycle Bin failed but did not provide error information!"); + + boost::shared_ptr<GError> errorObj(error, &g_error_free); + + //assemble error message + const wxString errorMessage = wxString(wxT("Error Code ")) + wxString::Format(wxT("%i"), errorObj->code) + + + wxT(", ") + wxString::FromUTF8(g_quark_to_string(errorObj->domain)) + wxT(": ") + wxString::FromUTF8(errorObj->message); + throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + zToWx(fileToDelete) + wxT("\"\n\n") + + wxT("(") + errorMessage + wxT(")")); + } + +#elif defined RECYCLER_NONE + throw std::logic_error("No Recycler for this Linux version available at the moment!"); //user will never arrive here: recycler option cannot be activated in this case! +#endif + +#endif +} + + +bool FreeFileSync::recycleBinExists() +{ +#ifdef FFS_WIN + return true; +#elif defined FFS_LINUX + +#ifdef RECYCLER_GIO + return true; +#elif defined RECYCLER_NONE + return false; +#else +you have to choose a recycler! +#endif + +#endif +} diff --git a/shared/recycler.h b/shared/recycler.h index 14aff4c0..5699e529 100644 --- a/shared/recycler.h +++ b/shared/recycler.h @@ -1,21 +1,38 @@ +// ************************************************************************** +// * 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 RECYCLER_H_INCLUDED #define RECYCLER_H_INCLUDED #include "fileError.h" #include "zstring.h" -#include <vector> - -#ifndef FFS_WIN -use in windows build only! -#endif - namespace FreeFileSync { -//single-file processing -void moveToWindowsRecycler(const Zstring& fileToDelete); //throw (FileError) -//multi-file processing: about a factor of 15 faster than single-file -void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete); //throw (FileError) -> on error reports about first file only! +/* +-------------------- +|Recycle Bin Access| +-------------------- + +Windows +------- +Recycler always available: during runtime dynamically either SHFileOperation or (since Vista) IFileOperation will be selected + +Linux +----- +During compilation set: +RECYCLER_GIO if available ("pkg-config --exists gio-2.0") +or +RECYCLER_NONE to disable the recycler +*/ + +bool recycleBinExists(); //test existence of Recycle Bin API on current system + +//move a file or folder to Recycle Bin +void moveToRecycleBin(const Zstring& fileToDelete); //throw (FileError) } #endif // RECYCLER_H_INCLUDED diff --git a/shared/serialize.cpp b/shared/serialize.cpp index 616d244d..f819cb33 100644 --- a/shared/serialize.cpp +++ b/shared/serialize.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "serialize.h" #include <wx/intl.h> diff --git a/shared/serialize.h b/shared/serialize.h index 85f57370..0647524b 100644 --- a/shared/serialize.h +++ b/shared/serialize.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 SERIALIZE_H_INCLUDED #define SERIALIZE_H_INCLUDED diff --git a/shared/shadow.cpp b/shared/shadow.cpp index 7e3b34c0..fd99da16 100644 --- a/shared/shadow.cpp +++ b/shared/shadow.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "shadow.h" #include <wx/msw/wrapwin.h> //includes "windows.h" #include <wx/intl.h> @@ -135,8 +141,8 @@ Zstring ShadowCopy::makeShadowCopy(const Zstring& inputFile) wchar_t volumeNameRaw[1000]; if (!::GetVolumePathName(inputFile.c_str(), //__in LPCTSTR lpszFileName, - volumeNameRaw, //__out LPTSTR lpszVolumePathName, - 1000)) //__in DWORD cchBufferLength + volumeNameRaw, //__out LPTSTR lpszVolumePathName, + 1000)) //__in DWORD cchBufferLength { wxString errorMsg = _("Error copying locked file %x!"); errorMsg.Replace(wxT("%x"), wxString(wxT("\"")) + inputFile.c_str() + wxT("\"")); diff --git a/shared/shadow.h b/shared/shadow.h index 78100f78..ca373e40 100644 --- a/shared/shadow.h +++ b/shared/shadow.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 SHADOW_H_INCLUDED #define SHADOW_H_INCLUDED diff --git a/shared/standardPaths.cpp b/shared/standardPaths.cpp index 3c57f5b9..018e31d0 100644 --- a/shared/standardPaths.cpp +++ b/shared/standardPaths.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "standardPaths.h" #include <wx/stdpaths.h> #include <wx/filename.h> @@ -6,58 +12,75 @@ using namespace FreeFileSync; - -wxString assembleFileForUserData(const wxString fileName) +bool FreeFileSync::isPortableVersion() { - static const bool isPortableVersion = !wxFileExists(FreeFileSync::getInstallationDir() + wxT("uninstall.exe")); //this check is a bit lame... - - if (isPortableVersion) //use current working directory - return wxString(wxT(".")) + zToWx(globalFunctions::FILE_NAME_SEPARATOR) + fileName; - else //usen OS' standard paths - { - wxString userDirectory = wxStandardPathsBase::Get().GetUserDataDir(); - - if (!userDirectory.EndsWith(zToWx(globalFunctions::FILE_NAME_SEPARATOR))) - userDirectory += zToWx(globalFunctions::FILE_NAME_SEPARATOR); - - if (!wxDirExists(userDirectory)) - ::wxMkdir(userDirectory); //only top directory needs to be created: no recursion necessary - - return userDirectory + fileName; - } +#ifdef FFS_WIN + static const bool isPortable = !wxFileExists(FreeFileSync::getBinaryDir() + wxT("uninstall.exe")); //this check is a bit lame... +#elif defined FFS_LINUX + static const bool isPortable = !FreeFileSync::getBinaryDir().EndsWith(wxT("/bin/")); //this check is a bit lame... +#endif + return isPortable; } -const wxString& FreeFileSync::getGlobalConfigFile() +const wxString& FreeFileSync::getBinaryDir() { - static wxString instance = assembleFileForUserData(wxT("GlobalSettings.xml")); + static wxString instance = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath() + zToWx(globalFunctions::FILE_NAME_SEPARATOR); return instance; } -const wxString& FreeFileSync::getDefaultLogDirectory() +const wxString& FreeFileSync::getResourceDir() { - static wxString instance = assembleFileForUserData(wxT("Logs")); - return instance; -} +#ifdef FFS_WIN + return getBinaryDir(); +#elif defined FFS_LINUX + static wxString resourceDir; + static bool isInitalized = false; //poor man's singleton... + if (!isInitalized) + { + isInitalized = true; -const wxString& FreeFileSync::getLastErrorTxtFile() -{ - static wxString instance = assembleFileForUserData(wxT("LastError.txt")); - return instance; -} + if (isPortableVersion()) + return getBinaryDir(); + else //use OS' standard paths + { + resourceDir = wxStandardPathsBase::Get().GetResourcesDir(); + if (!resourceDir.EndsWith(zToWx(globalFunctions::FILE_NAME_SEPARATOR))) + resourceDir += zToWx(globalFunctions::FILE_NAME_SEPARATOR); + } + } -const wxString& FreeFileSync::getInstallationDir() -{ - static wxString instance = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath() + zToWx(globalFunctions::FILE_NAME_SEPARATOR); - return instance; + return resourceDir; +#endif } const wxString& FreeFileSync::getConfigDir() { - static wxString instance = assembleFileForUserData(wxEmptyString); - return instance; + static wxString userDirectory; + + static bool isInitalized = false; //poor man's singleton... + if (!isInitalized) + { + isInitalized = true; + + if (isPortableVersion()) + //userDirectory = wxString(wxT(".")) + zToWx(globalFunctions::FILE_NAME_SEPARATOR); //use current working directory + userDirectory = getBinaryDir(); //avoid surprises with GlobalSettings.xml being newly created in each working directory + else //use OS' standard paths + { + userDirectory = wxStandardPathsBase::Get().GetUserDataDir(); + + if (!wxDirExists(userDirectory)) + ::wxMkdir(userDirectory); //only top directory needs to be created: no recursion necessary + + if (!userDirectory.EndsWith(zToWx(globalFunctions::FILE_NAME_SEPARATOR))) + userDirectory += zToWx(globalFunctions::FILE_NAME_SEPARATOR); + } + } + + return userDirectory; } diff --git a/shared/standardPaths.h b/shared/standardPaths.h index 2af802a9..0ebeebd2 100644 --- a/shared/standardPaths.h +++ b/shared/standardPaths.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 STANDARDPATHS_H_INCLUDED #define STANDARDPATHS_H_INCLUDED @@ -7,14 +13,14 @@ namespace FreeFileSync { //------------------------------------------------------------------------------ -//global functions +//global program directories //------------------------------------------------------------------------------ -const wxString& getGlobalConfigFile(); -const wxString& getDefaultLogDirectory(); -const wxString& getLastErrorTxtFile(); -const wxString& getInstallationDir(); //FreeFileSync installation directory WITH path separator at end -const wxString& getConfigDir(); +const wxString& getBinaryDir(); //directory containing executable WITH path separator at end +const wxString& getResourceDir(); //resource directory WITH path separator at end +const wxString& getConfigDir(); //config directory WITH path separator at end //------------------------------------------------------------------------------ + +bool isPortableVersion(); } #endif // STANDARDPATHS_H_INCLUDED diff --git a/shared/staticAssert.h b/shared/staticAssert.h index 2be4cd58..f14ed68e 100644 --- a/shared/staticAssert.h +++ b/shared/staticAssert.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 STATICASSERT_H_INCLUDED #define STATICASSERT_H_INCLUDED diff --git a/shared/stringConv.h b/shared/stringConv.h index f4048aab..454a65f7 100644 --- a/shared/stringConv.h +++ b/shared/stringConv.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 STRINGCONV_H_INCLUDED #define STRINGCONV_H_INCLUDED diff --git a/shared/systemConstants.h b/shared/systemConstants.h index bae23d5a..d686ac50 100644 --- a/shared/systemConstants.h +++ b/shared/systemConstants.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 SYSTEMCONSTANTS_H_INCLUDED #define SYSTEMCONSTANTS_H_INCLUDED diff --git a/shared/systemFunctions.cpp b/shared/systemFunctions.cpp index 3d6915cd..6d945d67 100644 --- a/shared/systemFunctions.cpp +++ b/shared/systemFunctions.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "systemFunctions.h" #ifdef FFS_WIN @@ -30,7 +36,7 @@ wxString FreeFileSync::getLastErrorFormatted(int lastError) //try to get additio { //determine error code if none was specified if (lastError == 0) - lastError = errno; //don't use :: errno is a macro! + lastError = errno; //don't use "::", errno is a macro! wxString output = wxString(wxT("Linux Error Code ")) + wxString::Format(wxT("%i"), lastError); output += wxString(wxT(": ")) + wxString::FromUTF8(::strerror(lastError)); diff --git a/shared/systemFunctions.h b/shared/systemFunctions.h index bfeacdd4..0adec62a 100644 --- a/shared/systemFunctions.h +++ b/shared/systemFunctions.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 SYSTEMFUNCTIONS_H_INCLUDED #define SYSTEMFUNCTIONS_H_INCLUDED diff --git a/shared/toggleButton.cpp b/shared/toggleButton.cpp index b83143ea..6a35a85d 100644 --- a/shared/toggleButton.cpp +++ b/shared/toggleButton.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "toggleButton.h" void ToggleButton::init(const wxBitmap& activeBmp, diff --git a/shared/toggleButton.h b/shared/toggleButton.h index 1110ad5d..f3aaca26 100644 --- a/shared/toggleButton.h +++ b/shared/toggleButton.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 TOGGLEBUTTON_H_INCLUDED #define TOGGLEBUTTON_H_INCLUDED diff --git a/shared/xmlBase.cpp b/shared/xmlBase.cpp index c098f94a..759f24d2 100644 --- a/shared/xmlBase.cpp +++ b/shared/xmlBase.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "xmlBase.h" #include "globalFunctions.h" #include <wx/ffile.h> diff --git a/shared/xmlBase.h b/shared/xmlBase.h index 3a01c515..d8e389ad 100644 --- a/shared/xmlBase.h +++ b/shared/xmlBase.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 XMLBASE_H_INCLUDED #define XMLBASE_H_INCLUDED diff --git a/shared/zstring.cpp b/shared/zstring.cpp index c3d5ba8e..312f98e7 100644 --- a/shared/zstring.cpp +++ b/shared/zstring.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "zstring.h" #include <stdexcept> @@ -91,9 +97,9 @@ int compareFilenamesWin32(const wchar_t* a, const wchar_t* b, size_t sizeA, size { const int rv = (*ordinalCompare)( a, //pointer to first string - sizeA, //size, in bytes or characters, of first string + static_cast<int>(sizeA), //size, in bytes or characters, of first string b, //pointer to second string - sizeB, //size, in bytes or characters, of second string + static_cast<int>(sizeB), //size, in bytes or characters, of second string true); //ignore case if (rv == 0) throw std::runtime_error("Error comparing strings (ordinal)!"); @@ -102,13 +108,13 @@ int compareFilenamesWin32(const wchar_t* a, const wchar_t* b, size_t sizeA, size } else //fallback { -//do NOT use "CompareString"; this function is NOT accurate (even with LOCALE_INVARIANT and SORT_STRINGSORT): for example "weiß" == "weiss"!!! +//do NOT use "CompareString"; this function is NOT accurate (even with LOCALE_INVARIANT and SORT_STRINGSORT): for example "wei�" == "weiss"!!! //the only reliable way to compare filenames (with XP) is to call "CharUpper" or "LCMapString": const size_t minSize = std::min(sizeA, sizeB); if (minSize == 0) //LCMapString does not allow input sizes of 0! - return sizeA - sizeB; + return static_cast<int>(sizeA - sizeB); int rv = 0; //always initialize... if (minSize <= 5000) //performance optimization: stack @@ -120,13 +126,13 @@ int compareFilenamesWin32(const wchar_t* a, const wchar_t* b, size_t sizeA, size invariantLocale, //__in LCID Locale, LCMAP_UPPERCASE, //__in DWORD dwMapFlags, a, //__in LPCTSTR lpSrcStr, - minSize, //__in int cchSrc, + static_cast<int>(minSize), //__in int cchSrc, bufferA, //__out LPTSTR lpDestStr, 5000 //__in int cchDest ) == 0) throw std::runtime_error("Error comparing strings! (LCMapString)"); - if (::LCMapString(invariantLocale, LCMAP_UPPERCASE, b, minSize, bufferB, 5000) == 0) + if (::LCMapString(invariantLocale, LCMAP_UPPERCASE, b, static_cast<int>(minSize), bufferB, 5000) == 0) throw std::runtime_error("Error comparing strings! (LCMapString)"); rv = ::wmemcmp(bufferA, bufferB, minSize); @@ -136,17 +142,17 @@ int compareFilenamesWin32(const wchar_t* a, const wchar_t* b, size_t sizeA, size boost::scoped_array<wchar_t> bufferA(new wchar_t[minSize]); boost::scoped_array<wchar_t> bufferB(new wchar_t[minSize]); - if (::LCMapString(invariantLocale, LCMAP_UPPERCASE, a, minSize, bufferA.get(), minSize) == 0) + if (::LCMapString(invariantLocale, LCMAP_UPPERCASE, a, static_cast<int>(minSize), bufferA.get(), static_cast<int>(minSize)) == 0) throw std::runtime_error("Error comparing strings! (LCMapString: FS)"); - if (::LCMapString(invariantLocale, LCMAP_UPPERCASE, b, minSize, bufferB.get(), minSize) == 0) + if (::LCMapString(invariantLocale, LCMAP_UPPERCASE, b, static_cast<int>(minSize), bufferB.get(), static_cast<int>(minSize)) == 0) throw std::runtime_error("Error comparing strings! (LCMapString: FS)"); rv = ::wmemcmp(bufferA.get(), bufferB.get(), minSize); } return rv == 0 ? - sizeA - sizeB : + static_cast<int>(sizeA - sizeB) : rv; } @@ -166,18 +172,24 @@ int compareFilenamesWin32(const wchar_t* a, const wchar_t* b, size_t sizeA, size #endif -#ifdef FFS_WIN -int Zstring::CmpNoCase(const DefaultChar* other) const +int Zstring::cmpFileName(const Zstring& other) const { - return ::compareFilenamesWin32(c_str(), other, length(), ::wcslen(other)); //way faster than wxString::CmpNoCase() +#ifdef FFS_WIN + return ::compareFilenamesWin32(c_str(), other.c_str(), length(), other.length()); //way faster than wxString::CmpNoCase() +#elif defined FFS_LINUX + return this->compare(other); +#endif } -int Zstring::CmpNoCase(const Zstring& other) const +int Zstring::cmpFileName(const DefaultChar* other) const { - return ::compareFilenamesWin32(c_str(), other.c_str(), length(), other.length()); //way faster than wxString::CmpNoCase() -} +#ifdef FFS_WIN + return ::compareFilenamesWin32(c_str(), other, length(), ::wcslen(other)); //way faster than wxString::CmpNoCase() +#elif defined FFS_LINUX + return this->compare(other); #endif +} Zstring& Zstring::Replace(const DefaultChar* old, const DefaultChar* replacement, bool replaceAll) @@ -223,15 +235,15 @@ bool matchesHelper(const DefaultChar* string, const DefaultChar* mask) } while (ch == DefaultChar('*') || ch == DefaultChar('?')); //if match ends with '*': - if (ch == DefaultChar(0)) + if (ch == 0) return true; ++mask; while ((string = defaultStrFind(string, ch)) != NULL) { - if (matchesHelper(string + 1, mask)) - return true; ++string; + if (matchesHelper(string, mask)) + return true; } return false; @@ -349,7 +361,7 @@ Zstring& Zstring::MakeUpper() reserve(thisLen); //make unshared //use Windows' upper case conversion: faster than ::CharUpper() - if (::LCMapString(invariantLocale, LCMAP_UPPERCASE, data(), thisLen, data(), thisLen) == 0) + if (::LCMapString(invariantLocale, LCMAP_UPPERCASE, data(), static_cast<int>(thisLen), data(), static_cast<int>(thisLen)) == 0) throw std::runtime_error("Error converting to upper case! (LCMapString)"); return *this; @@ -520,9 +532,8 @@ void Zstring::reserve(size_t capacityNeeded) //make unshared and check capacity { //allocate a new string const size_t oldLength = length(); - assert(oldLength <= getCapacityToAllocate(capacityNeeded)); - StringDescriptor* newDescr = allocate(capacityNeeded); + StringDescriptor* newDescr = allocate(std::max(capacityNeeded, oldLength)); //reserve() must NEVER shrink the string newDescr->length = oldLength; ::memcpy(reinterpret_cast<DefaultChar*>(newDescr + 1), c_str(), (oldLength + 1) * sizeof(DefaultChar)); //include NULL-termination diff --git a/shared/zstring.h b/shared/zstring.h index cb047e15..f87918bc 100644 --- a/shared/zstring.h +++ b/shared/zstring.h @@ -1,9 +1,9 @@ -/*************************************************************** - * Purpose: High performance string class - * Author: ZenJu (zhnmju123@gmx.de) - * Created: Jan. 2009 - **************************************************************/ - +// ************************************************************************** +// * 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 ZSTRING_H_INCLUDED #define ZSTRING_H_INCLUDED @@ -41,6 +41,10 @@ public: operator const DefaultChar*() const; //implicit conversion to C string + //Compare filenames: Windows does NOT distinguish between upper/lower-case, while Linux DOES + int cmpFileName(const Zstring& other) const; + int cmpFileName(const DefaultChar* other) const; + //wxWidgets-like functions bool StartsWith(const DefaultChar* begin) const; bool StartsWith(DefaultChar begin) const; @@ -50,12 +54,9 @@ public: bool EndsWith(const Zstring& end) const; Zstring& Truncate(size_t newLen); #ifdef FFS_WIN - int CmpNoCase(const DefaultChar* other) const; - int CmpNoCase(const Zstring& other) const; Zstring& MakeUpper(); #endif - int Cmp(const DefaultChar* other) const; - int Cmp(const Zstring& other) const; + Zstring& Replace(const DefaultChar* old, const DefaultChar* replacement, bool replaceAll = true); Zstring AfterLast( DefaultChar ch) const; //returns the whole string if ch not found Zstring BeforeLast( DefaultChar ch) const; //returns empty string if ch not found @@ -83,6 +84,7 @@ public: size_t size() const; void reserve(size_t minCapacity); Zstring& assign(const DefaultChar* source, size_t len); + void resize(size_t newSize, DefaultChar fillChar = 0 ); Zstring& operator=(const Zstring& source); Zstring& operator=(const DefaultChar* source); @@ -194,7 +196,7 @@ inline bool defaultIsWhiteSpace(const char ch) { // some compilers (e.g. VC++ 6.0) return true for a call to isspace('\xEA') => exclude char(128) to char(255) - return (static_cast<unsigned char>(ch) < 128) && isspace((unsigned char)ch) != 0; + return (static_cast<unsigned char>(ch) < 128) && isspace(static_cast<unsigned char>(ch)) != 0; } //inline @@ -560,20 +562,6 @@ size_t Zstring::find(const DefaultChar ch, const size_t pos) const inline -int Zstring::Cmp(const DefaultChar* other) const -{ - return compare(other); -} - - -inline -int Zstring::Cmp(const Zstring& other) const -{ - return defaultCompare(c_str(), other.c_str()); //overload using strcmp(char*, char*) should be fastest! -} - - -inline bool Zstring::operator == (const Zstring& other) const { return length() != other.length() ? false : defaultCompare(c_str(), other.c_str()) == 0; @@ -708,6 +696,39 @@ const Zstring Zstring::operator+(const DefaultChar ch) const } +inline +void Zstring::resize(size_t newSize, DefaultChar fillChar) +{ + const size_t oldSize = length(); + if (oldSize < newSize) + { + reserve(newSize); //make unshared and ensure capacity + + //fill up... + DefaultChar* strPtr = data() + oldSize; + const DefaultChar* const strEnd = data() + newSize; + while (strPtr != strEnd) + { + *strPtr = fillChar; + ++strPtr; + } + + data()[newSize] = 0; + descr->length = newSize; + } + else if (oldSize > newSize) + { + if (descr->refCount > 1) + *this = Zstring(c_str(), newSize); //no need to reserve() and copy the old string completely! + else //overwrite this string + { + data()[newSize] = 0; + descr->length = newSize; + } + } +} + + template <class T> inline Zstring numberToZstring(const T& number) //convert number to string the C++ way diff --git a/structures.cpp b/structures.cpp index 4cf6b335..72a18ad3 100644 --- a/structures.cpp +++ b/structures.cpp @@ -1,10 +1,15 @@ +// ************************************************************************** +// * 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 "structures.h" -#include "shared/fileHandling.h" #include <wx/intl.h> #include "shared/systemConstants.h" +#include <stdexcept> -using FreeFileSync::SyncConfiguration; -using FreeFileSync::MainConfiguration; +using namespace FreeFileSync; Zstring FreeFileSync::standardExcludeFilter() @@ -22,12 +27,6 @@ Zstring FreeFileSync::standardExcludeFilter() } -bool FreeFileSync::recycleBinExistsWrap() -{ - return recycleBinExists(); -} - - wxString FreeFileSync::getVariantName(CompareVariant var) { switch (var) @@ -43,98 +42,93 @@ wxString FreeFileSync::getVariantName(CompareVariant var) } -SyncConfiguration::Variant SyncConfiguration::getVariant() const +wxString FreeFileSync::getVariantName(const SyncConfiguration& syncCfg) { - if (automatic == true) - return AUTOMATIC; //automatic mode - - if ( exLeftSideOnly == SYNC_DIR_RIGHT && - exRightSideOnly == SYNC_DIR_RIGHT && - leftNewer == SYNC_DIR_RIGHT && - rightNewer == SYNC_DIR_RIGHT && - different == SYNC_DIR_RIGHT && - conflict == SYNC_DIR_RIGHT) - return MIRROR; //one way -> - - else if (exLeftSideOnly == SYNC_DIR_RIGHT && - exRightSideOnly == SYNC_DIR_NONE && - leftNewer == SYNC_DIR_RIGHT && - rightNewer == SYNC_DIR_NONE && - different == SYNC_DIR_NONE && - conflict == SYNC_DIR_NONE) - return UPDATE; //Update -> - -// else if (exLeftSideOnly == SYNC_DIR_RIGHT && -> variant "twoway" is not selectable via gui anymore -// exRightSideOnly == SYNC_DIR_LEFT && -// leftNewer == SYNC_DIR_RIGHT && -// rightNewer == SYNC_DIR_LEFT && -// different == SYNC_DIR_NONE && -// conflict == SYNC_DIR_NONE) -// return TWOWAY; //two way <-> - else - return CUSTOM; //other + switch (getVariant(syncCfg)) + { + case SyncConfiguration::AUTOMATIC: + return _("<Automatic>"); + case SyncConfiguration::MIRROR: + return _("Mirror ->>"); + case SyncConfiguration::UPDATE: + return _("Update ->"); + case SyncConfiguration::CUSTOM: + return _("Custom"); + } + return _("Error"); } -void SyncConfiguration::setVariant(const Variant var) +void FreeFileSync::setTwoWay(SyncConfiguration& syncCfg) //helper method used by <Automatic> mode fallback to overwrite old with newer files { - switch (var) - { - case AUTOMATIC: - automatic = true; - break; - case MIRROR: - automatic = false; - exLeftSideOnly = SYNC_DIR_RIGHT; - exRightSideOnly = SYNC_DIR_RIGHT; - leftNewer = SYNC_DIR_RIGHT; - rightNewer = SYNC_DIR_RIGHT; - different = SYNC_DIR_RIGHT; - conflict = SYNC_DIR_RIGHT; - break; - case UPDATE: - automatic = false; - exLeftSideOnly = SYNC_DIR_RIGHT; - exRightSideOnly = SYNC_DIR_NONE; - leftNewer = SYNC_DIR_RIGHT; - rightNewer = SYNC_DIR_NONE; - different = SYNC_DIR_NONE; - conflict = SYNC_DIR_NONE; - break; - case TWOWAY: - automatic = false; - exLeftSideOnly = SYNC_DIR_RIGHT; - exRightSideOnly = SYNC_DIR_LEFT; - leftNewer = SYNC_DIR_RIGHT; - rightNewer = SYNC_DIR_LEFT; - different = SYNC_DIR_NONE; - conflict = SYNC_DIR_NONE; - break; - case CUSTOM: - assert(false); - break; - } + syncCfg.automatic = false; + syncCfg.exLeftSideOnly = SYNC_DIR_RIGHT; + syncCfg.exRightSideOnly = SYNC_DIR_LEFT; + syncCfg.leftNewer = SYNC_DIR_RIGHT; + syncCfg.rightNewer = SYNC_DIR_LEFT; + syncCfg.different = SYNC_DIR_NONE; + syncCfg.conflict = SYNC_DIR_NONE; +} + + +SyncConfiguration::Variant FreeFileSync::getVariant(const SyncConfiguration& syncCfg) +{ + if (syncCfg.automatic == true) + return SyncConfiguration::AUTOMATIC; //automatic mode + + if ( syncCfg.exLeftSideOnly == SYNC_DIR_RIGHT && + syncCfg.exRightSideOnly == SYNC_DIR_RIGHT && + syncCfg.leftNewer == SYNC_DIR_RIGHT && + syncCfg.rightNewer == SYNC_DIR_RIGHT && + syncCfg.different == SYNC_DIR_RIGHT && + syncCfg.conflict == SYNC_DIR_RIGHT) + return SyncConfiguration::MIRROR; //one way -> + + else if (syncCfg.exLeftSideOnly == SYNC_DIR_RIGHT && + syncCfg.exRightSideOnly == SYNC_DIR_NONE && + syncCfg.leftNewer == SYNC_DIR_RIGHT && + syncCfg.rightNewer == SYNC_DIR_NONE && + syncCfg.different == SYNC_DIR_NONE && + syncCfg.conflict == SYNC_DIR_NONE) + return SyncConfiguration::UPDATE; //Update -> + else + return SyncConfiguration::CUSTOM; //other } -wxString SyncConfiguration::getVariantName() const +void FreeFileSync::setVariant(SyncConfiguration& syncCfg, const SyncConfiguration::Variant var) { - switch (getVariant()) + switch (var) { case SyncConfiguration::AUTOMATIC: - return _("<Automatic>"); + syncCfg.automatic = true; + break; case SyncConfiguration::MIRROR: - return _("Mirror ->>"); + syncCfg.automatic = false; + syncCfg.exLeftSideOnly = SYNC_DIR_RIGHT; + syncCfg.exRightSideOnly = SYNC_DIR_RIGHT; + syncCfg.leftNewer = SYNC_DIR_RIGHT; + syncCfg.rightNewer = SYNC_DIR_RIGHT; + syncCfg.different = SYNC_DIR_RIGHT; + syncCfg.conflict = SYNC_DIR_RIGHT; + break; case SyncConfiguration::UPDATE: - return _("Update ->"); - case SyncConfiguration::TWOWAY: //variant "twoway" is not selectable via gui anymore + syncCfg.automatic = false; + syncCfg.exLeftSideOnly = SYNC_DIR_RIGHT; + syncCfg.exRightSideOnly = SYNC_DIR_NONE; + syncCfg.leftNewer = SYNC_DIR_RIGHT; + syncCfg.rightNewer = SYNC_DIR_NONE; + syncCfg.different = SYNC_DIR_NONE; + syncCfg.conflict = SYNC_DIR_NONE; + break; case SyncConfiguration::CUSTOM: - return _("Custom"); + assert(false); + break; } - return _("Error"); } + wxString MainConfiguration::getSyncVariantName() { const SyncConfiguration firstSyncCfg = @@ -142,22 +136,22 @@ wxString MainConfiguration::getSyncVariantName() firstPair.altSyncConfig->syncConfiguration : syncConfiguration; //fallback to main sync cfg - const SyncConfiguration::Variant firstVariant = firstSyncCfg.getVariant(); + const SyncConfiguration::Variant firstVariant = getVariant(firstSyncCfg); //test if there's a deviating variant within the additional folder pairs for (std::vector<FolderPairEnh>::const_iterator i = additionalPairs.begin(); i != additionalPairs.end(); ++i) { const SyncConfiguration::Variant thisVariant = i->altSyncConfig.get() ? - i->altSyncConfig->syncConfiguration.getVariant() : - syncConfiguration.getVariant(); + getVariant(i->altSyncConfig->syncConfiguration) : + getVariant(syncConfiguration); if (thisVariant != firstVariant) return _("Multiple..."); } //seems to be all in sync... - return firstSyncCfg.getVariantName(); + return getVariantName(firstSyncCfg); } @@ -257,7 +251,7 @@ wxString FreeFileSync::getSymbol(SyncOperation op) case SO_OVERWRITE_RIGHT: return wxT("->"); case SO_DO_NOTHING: - return wxT("-"); + return wxT(" -"); case SO_EQUAL: return wxT("'=="); //added quotation mark to avoid error in Excel cell when exporting to *.cvs case SO_UNRESOLVED_CONFLICT: diff --git a/structures.h b/structures.h index 212f9557..98db615e 100644 --- a/structures.h +++ b/structures.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 FREEFILESYNC_H_INCLUDED #define FREEFILESYNC_H_INCLUDED @@ -24,13 +30,83 @@ enum SyncDirection { SYNC_DIR_LEFT = 0, SYNC_DIR_RIGHT, - SYNC_DIR_NONE, //NOTE: align with SyncDirectionIntern before adding anything here! + SYNC_DIR_NONE //NOTE: align with SyncDirectionIntern before adding anything here! }; -class SyncConfiguration +enum CompareFilesResult +{ + FILE_LEFT_SIDE_ONLY = 0, + FILE_RIGHT_SIDE_ONLY, + FILE_LEFT_NEWER, + FILE_RIGHT_NEWER, + FILE_DIFFERENT, + FILE_EQUAL, + FILE_CONFLICT +}; +//attention make sure these /|\ \|/ two enums match!!! +enum CompareDirResult +{ + DIR_LEFT_SIDE_ONLY = FILE_LEFT_SIDE_ONLY, + DIR_RIGHT_SIDE_ONLY = FILE_RIGHT_SIDE_ONLY, + DIR_EQUAL = FILE_EQUAL +}; + + +inline +CompareFilesResult convertToFilesResult(CompareDirResult value) +{ + return static_cast<CompareFilesResult>(value); +} + + + +wxString getDescription(CompareFilesResult cmpRes); +wxString getSymbol(CompareFilesResult cmpRes); + + +enum SyncOperation +{ + SO_CREATE_NEW_LEFT, + SO_CREATE_NEW_RIGHT, + SO_DELETE_LEFT, + SO_DELETE_RIGHT, + SO_OVERWRITE_LEFT, + SO_OVERWRITE_RIGHT, + SO_DO_NOTHING, //= both sides differ, but nothing will be synced + SO_EQUAL, //= both sides are equal, so nothing will be synced + SO_UNRESOLVED_CONFLICT +}; + +wxString getDescription(SyncOperation op); +wxString getSymbol(SyncOperation op); + + +//Exception class used to abort the "compare" and "sync" process +class AbortThisProcess {}; + + +struct SyncConfigCustom //save last used custom config settings +{ + SyncConfigCustom() : + exLeftSideOnly( SYNC_DIR_NONE), + exRightSideOnly(SYNC_DIR_NONE), + leftNewer( SYNC_DIR_NONE), + rightNewer( SYNC_DIR_NONE), + different( SYNC_DIR_NONE), + conflict( SYNC_DIR_NONE) {} + + SyncDirection exLeftSideOnly; + SyncDirection exRightSideOnly; + SyncDirection leftNewer; + SyncDirection rightNewer; + SyncDirection different; + SyncDirection conflict; +}; + + +struct SyncConfiguration //technical representation of sync-config: not to be edited by GUI directly! { -public: SyncConfiguration() : automatic(true), exLeftSideOnly( SYNC_DIR_RIGHT), @@ -40,9 +116,18 @@ public: different( SYNC_DIR_NONE), conflict( SYNC_DIR_NONE) {} + enum Variant + { + AUTOMATIC, + MIRROR, + UPDATE, + CUSTOM + }; + bool operator==(const SyncConfiguration& other) const { - return exLeftSideOnly == other.exLeftSideOnly && + return automatic == other.automatic && + exLeftSideOnly == other.exLeftSideOnly && exRightSideOnly == other.exRightSideOnly && leftNewer == other.leftNewer && rightNewer == other.rightNewer && @@ -50,19 +135,6 @@ public: conflict == other.conflict; } - //get/set default configuration variants - enum Variant - { - AUTOMATIC, - MIRROR, - UPDATE, - TWOWAY, - CUSTOM - }; - Variant getVariant() const; - void setVariant(const Variant var); - wxString getVariantName() const; - bool automatic; //use sync-database SyncDirection exLeftSideOnly; SyncDirection exRightSideOnly; @@ -73,6 +145,12 @@ public: }; +SyncConfiguration::Variant getVariant(const SyncConfiguration& syncCfg); +void setVariant(SyncConfiguration& syncCfg, const SyncConfiguration::Variant var); +wxString getVariantName(const SyncConfiguration& syncCfg); +void setTwoWay(SyncConfiguration& syncCfg); //helper method used by <Automatic> mode fallback to overwrite old with newer files + + enum DeletionPolicy { DELETE_PERMANENTLY = 5, @@ -104,9 +182,6 @@ struct HiddenSettings }; -bool recycleBinExistsWrap(); - - struct AlternateSyncConfig { AlternateSyncConfig(const SyncConfiguration& syncCfg, @@ -117,7 +192,7 @@ struct AlternateSyncConfig customDeletionDirectory(customDelDir) {}; AlternateSyncConfig() : //construct with default values - handleDeletion(FreeFileSync::recycleBinExistsWrap() ? MOVE_TO_RECYCLE_BIN : DELETE_PERMANENTLY) {} //enable if OS supports it; else user will have to activate first and then get an error message + handleDeletion(MOVE_TO_RECYCLE_BIN) {} //Synchronisation settings SyncConfiguration syncConfiguration; @@ -198,7 +273,7 @@ struct MainConfiguration filterIsActive(true), includeFilter(DefaultStr("*")), excludeFilter(standardExcludeFilter()), - handleDeletion(FreeFileSync::recycleBinExistsWrap() ? MOVE_TO_RECYCLE_BIN : DELETE_PERMANENTLY) {} //enable if OS supports it; else user will have to activate first and then get an error message + handleDeletion(MOVE_TO_RECYCLE_BIN) {} FolderPairEnh firstPair; //there needs to be at least one pair! std::vector<FolderPairEnh> additionalPairs; @@ -236,58 +311,6 @@ struct MainConfiguration customDeletionDirectory == other.customDeletionDirectory; } }; - - -enum CompareFilesResult -{ - FILE_LEFT_SIDE_ONLY = 0, - FILE_RIGHT_SIDE_ONLY, - FILE_LEFT_NEWER, - FILE_RIGHT_NEWER, - FILE_DIFFERENT, - FILE_EQUAL, - FILE_CONFLICT -}; -//attention make sure these /|\ \|/ two enums match!!! -enum CompareDirResult -{ - DIR_LEFT_SIDE_ONLY = FILE_LEFT_SIDE_ONLY, - DIR_RIGHT_SIDE_ONLY = FILE_RIGHT_SIDE_ONLY, - DIR_EQUAL = FILE_EQUAL -}; - - -inline -CompareFilesResult convertToFilesResult(CompareDirResult value) -{ - return static_cast<CompareFilesResult>(value); -} - - - -wxString getDescription(CompareFilesResult cmpRes); -wxString getSymbol(CompareFilesResult cmpRes); - - -enum SyncOperation -{ - SO_CREATE_NEW_LEFT, - SO_CREATE_NEW_RIGHT, - SO_DELETE_LEFT, - SO_DELETE_RIGHT, - SO_OVERWRITE_LEFT, - SO_OVERWRITE_RIGHT, - SO_DO_NOTHING, //= both sides differ, but nothing will be synced - SO_EQUAL, //= both sides are equal, so nothing will be synced - SO_UNRESOLVED_CONFLICT -}; - -wxString getDescription(SyncOperation op); -wxString getSymbol(SyncOperation op); - - -//Exception class used to abort the "compare" and "sync" process -class AbortThisProcess {}; } #endif // FREEFILESYNC_H_INCLUDED diff --git a/synchronization.cpp b/synchronization.cpp index b00d35b7..9cb9054c 100644 --- a/synchronization.cpp +++ b/synchronization.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "synchronization.h" #include <stdexcept> #include <wx/intl.h> @@ -8,6 +14,7 @@ #include "shared/systemConstants.h" #include "library/statusHandler.h" #include "shared/fileHandling.h" +#include "shared/recycler.h" #include <wx/file.h> #include <boost/bind.hpp> #include "shared/globalFunctions.h" @@ -18,6 +25,7 @@ #ifdef FFS_WIN #include "shared/shadow.h" #include "shared/longPathPrefix.h" +#include <boost/scoped_ptr.hpp> #endif using namespace FreeFileSync; @@ -194,22 +202,30 @@ void SyncStatistics::getDirNumbers(const DirMapping& dirObj) std::vector<FreeFileSync::FolderPairSyncCfg> FreeFileSync::extractSyncCfg(const MainConfiguration& mainCfg) { - std::vector<FolderPairSyncCfg> output; + //merge first and additional pairs + std::vector<FolderPairEnh> allPairs; + allPairs.push_back(mainCfg.firstPair); + allPairs.insert(allPairs.end(), + mainCfg.additionalPairs.begin(), //add additional pairs + mainCfg.additionalPairs.end()); - //add main pair - output.push_back( - FolderPairSyncCfg(mainCfg.syncConfiguration.automatic, - mainCfg.handleDeletion, - wxToZ(mainCfg.customDeletionDirectory))); + std::vector<FolderPairSyncCfg> output; - //add additional pairs - for (std::vector<FolderPairEnh>::const_iterator i = mainCfg.additionalPairs.begin(); i != mainCfg.additionalPairs.end(); ++i) + //process all pairs + for (std::vector<FolderPairEnh>::const_iterator i = allPairs.begin(); i != allPairs.end(); ++i) output.push_back( - FolderPairSyncCfg(i->altSyncConfig.get() ? i->altSyncConfig->syncConfiguration.automatic : mainCfg.syncConfiguration.automatic, - i->altSyncConfig.get() ? i->altSyncConfig->handleDeletion : mainCfg.handleDeletion, - wxToZ(i->altSyncConfig.get() ? i->altSyncConfig->customDeletionDirectory : mainCfg.customDeletionDirectory))); + i->altSyncConfig.get() ? + + FolderPairSyncCfg(i->altSyncConfig->syncConfiguration.automatic, + i->altSyncConfig->handleDeletion, + wxToZ(i->altSyncConfig->customDeletionDirectory)) : + + FolderPairSyncCfg(mainCfg.syncConfiguration.automatic, + mainCfg.handleDeletion, + wxToZ(mainCfg.customDeletionDirectory))); return output; } +//------------------------------------------------------------------------------------------------------------ template <bool recyclerUsed> @@ -297,6 +313,7 @@ std::pair<wxLongLong, wxLongLong> freeDiskSpaceNeeded(const BaseDirMapping& base assert(false); return std::make_pair(2000000000, 2000000000); //dummy } +//------------------------------------------------------------------------------------------------------------ bool synchronizationNeeded(const SyncStatistics& statisticsTotal) @@ -336,27 +353,65 @@ bool significantDifferenceDetected(const SyncStatistics& folderPairStat) return changedRows >= 10 && changedRows > 0.5 * folderPairStat.getRowCount(); } +//################################################################################################################# -//################################################################################################################# +FolderPairSyncCfg::FolderPairSyncCfg(bool automaticMode, + const DeletionPolicy handleDel, + const Zstring& custDelDir) : + inAutomaticMode(automaticMode), + handleDeletion(handleDel), + custDelFolder(FreeFileSync::getFormattedDirectoryName(custDelDir)) {} +//----------------------------------------------------------------------------------------------------------- -/*add some postfix to alternate deletion directory: customDir\2009-06-30 12-59-12\ */ -Zstring getSessionDeletionDir(const Zstring& customDeletionDirectory) +template <typename Function> +inline +void tryReportingError(StatusHandler& handler, Function cmd) { - wxString timeNow = wxDateTime::Now().FormatISOTime(); - timeNow.Replace(wxT(":"), wxT("-")); + while (true) + { + try + { + cmd(); + break; + } + catch (FileError& error) + { + //User abort when copying files or moving files/directories into custom deletion directory: + //windows build: abort if requested, don't show error message if cancelled by user! + //linux build: this refresh is not necessary, because user abort triggers an AbortThisProcess() exception without a FileError() + handler.requestUiRefresh(true); //may throw! - const wxString sessionDir = wxDateTime::Now().FormatISODate() + wxChar(' ') + timeNow; + ErrorHandler::Response rv = handler.reportError(error.show()); //may throw! + if ( rv == ErrorHandler::IGNORE_ERROR) + break; + else if (rv == ErrorHandler::RETRY) + ; //continue with loop + else + throw std::logic_error("Programming Error: Unknown return value!"); + } + } +} - Zstring formattedDirectory = FreeFileSync::getFormattedDirectoryName(customDeletionDirectory); + +/* +add some postfix to alternate deletion directory: deletionDirectory\<prefix>2010-06-30 12-59-12\ +*/ +Zstring getSessionDeletionDir(const Zstring& deletionDirectory, const Zstring& prefix = Zstring()) +{ + Zstring formattedDirectory = deletionDirectory; if (formattedDirectory.empty()) return Zstring(); //no valid directory for deletion specified (checked later) if (!formattedDirectory.EndsWith(globalFunctions::FILE_NAME_SEPARATOR)) formattedDirectory += globalFunctions::FILE_NAME_SEPARATOR; - formattedDirectory += wxToZ(sessionDir); + wxString timeNow = wxDateTime::Now().FormatISOTime(); + timeNow.Replace(wxT(":"), wxT("-")); + + const wxString sessionName = wxDateTime::Now().FormatISODate() + wxChar(' ') + timeNow; + formattedDirectory += prefix + wxToZ(sessionName); //ensure that session directory does not yet exist (must be unique) if (FreeFileSync::dirExists(formattedDirectory)) @@ -386,63 +441,344 @@ SyncProcess::SyncProcess(bool copyFileSymLinks, copyLockedFiles_(copyLockedFiles), m_warnings(warnings), statusUpdater(handler) {} +//-------------------------------------------------------------------------------------------------------------- -struct DeletionHandling +class DeletionHandling { +public: DeletionHandling(const DeletionPolicy handleDel, - const Zstring& custDelFolder) : - handleDeletion(handleDel), - currentDelFolder(getSessionDeletionDir(custDelFolder)), //ends with path separator - txtMoveFileUserDefined( wxToZ(_("Moving file %x to user-defined directory %y")). Replace(DefaultStr("%x"), DefaultStr("\"%x\"\n"), false).Replace(DefaultStr("%y"), Zstring(DefaultStr("\"")) + custDelFolder + DefaultStr("\""), false)), - txtMoveFolderUserDefined(wxToZ(_("Moving folder %x to user-defined directory %y")).Replace(DefaultStr("%x"), DefaultStr("\"%x\"\n"), false).Replace(DefaultStr("%y"), Zstring(DefaultStr("\"")) + custDelFolder + DefaultStr("\""), false)) - {} - - DeletionPolicy handleDeletion; - Zstring currentDelFolder; //alternate deletion folder for current folder pair (with timestamp, ends with path separator) + const Zstring& custDelFolder, + const Zstring& baseDirLeft, + const Zstring& baseDirRight, + StatusHandler& statusUpdater); + ~DeletionHandling(); //always (try to) clean up, even if synchronization is aborted! + + //clean-up temporary directory (recycler bin optimization) + void tryCleanup() const; //throw FileError() -> call this in non-exceptional coding, i.e. after Sync somewhere! + + template <FreeFileSync::SelectedSide side> + void removeFile(const FileMapping& fileObj) const; //throw FileError() + + template <FreeFileSync::SelectedSide side> + void removeFolder(const DirMapping& dirObj) const; //throw FileError() + + const Zstring& getTxtRemovingFile() const; //status text templates + const Zstring& getTxtRemovingDir() const; //status text templates + +private: + template <SelectedSide side> + const Zstring& getSessionDir() const; + + void tryCleanupLeft() const; //throw FileError() + void tryCleanupRight() const; //throw FileError() + + const DeletionPolicy deletionType; + StatusHandler& statusUpdater_; + + Zstring sessionDelDirLeft; //target deletion folder for current folder pair (with timestamp, ends with path separator) + Zstring sessionDelDirRight; // + //preloaded status texts: - const Zstring txtMoveFileUserDefined; - const Zstring txtMoveFolderUserDefined; + Zstring txtRemovingFile; + Zstring txtRemovingDirectory; }; -template <typename Function> +DeletionHandling::DeletionHandling(const DeletionPolicy handleDel, + const Zstring& custDelFolder, + const Zstring& baseDirLeft, + const Zstring& baseDirRight, + StatusHandler& statusUpdater) : + deletionType(handleDel), + statusUpdater_(statusUpdater) +{ + switch (handleDel) + { + case DELETE_PERMANENTLY: + txtRemovingFile = wxToZ(_("Deleting file %x")).Replace(DefaultStr("%x"), DefaultStr("\n\"%x\""), false); + txtRemovingDirectory = wxToZ(_("Deleting folder %x")).Replace( DefaultStr("%x"), DefaultStr("\n\"%x\""), false); + break; + + case MOVE_TO_RECYCLE_BIN: + sessionDelDirLeft = getSessionDeletionDir(baseDirLeft, DefaultStr("FFS ")); + sessionDelDirRight = getSessionDeletionDir(baseDirRight, DefaultStr("FFS ")); + + txtRemovingFile = txtRemovingDirectory = wxToZ(_("Moving %x to Recycle Bin")).Replace(DefaultStr("%x"), DefaultStr("\"%x\""), false); + break; + + case MOVE_TO_CUSTOM_DIRECTORY: + sessionDelDirLeft = sessionDelDirRight = getSessionDeletionDir(custDelFolder); + + txtRemovingFile = wxToZ(_("Moving file %x to user-defined directory %y")). Replace(DefaultStr("%x"), DefaultStr("\"%x\"\n"), false).Replace(DefaultStr("%y"), Zstring(DefaultStr("\"")) + custDelFolder + DefaultStr("\""), false); + txtRemovingDirectory = wxToZ(_("Moving folder %x to user-defined directory %y")).Replace(DefaultStr("%x"), DefaultStr("\"%x\"\n"), false).Replace(DefaultStr("%y"), Zstring(DefaultStr("\"")) + custDelFolder + DefaultStr("\""), false); + break; + } +} + + +DeletionHandling::~DeletionHandling() +{ + try //always (try to) clean up, even if synchronization is aborted! + { + tryCleanupLeft(); + } + catch (...) {} + + try //always clean up BOTH sides separately! + { + tryCleanupRight(); + } + catch (...) {} +} + + +void DeletionHandling::tryCleanup() const //throw(AbortThisProcess) +{ + tryReportingError(statusUpdater_, boost::bind(&DeletionHandling::tryCleanupLeft, this)); + tryReportingError(statusUpdater_, boost::bind(&DeletionHandling::tryCleanupRight, this)); +} + + +void DeletionHandling::tryCleanupLeft() const //throw FileError() +{ + if (deletionType == MOVE_TO_RECYCLE_BIN) //clean-up temporary directory (recycle bin) + FreeFileSync::moveToRecycleBin(sessionDelDirLeft.BeforeLast(globalFunctions::FILE_NAME_SEPARATOR)); //throw (FileError) +} + + +void DeletionHandling::tryCleanupRight() const //throw FileError() +{ + if (deletionType == MOVE_TO_RECYCLE_BIN) //clean-up temporary directory (recycle bin) + FreeFileSync::moveToRecycleBin(sessionDelDirRight.BeforeLast(globalFunctions::FILE_NAME_SEPARATOR)); //throw (FileError) +} + + inline -void tryReportingError(StatusHandler& handler, Function cmd) +const Zstring& DeletionHandling::getTxtRemovingFile() const { - while (true) + return txtRemovingFile; +} + + +inline +const Zstring& DeletionHandling::getTxtRemovingDir() const +{ + return txtRemovingDirectory; +} + + +template <> +inline +const Zstring& DeletionHandling::getSessionDir<LEFT_SIDE>() const +{ + return sessionDelDirLeft; +} + +template <> +inline +const Zstring& DeletionHandling::getSessionDir<RIGHT_SIDE>() const +{ + return sessionDelDirRight; +} + + +class MoveFileCallbackImpl : public MoveFileCallback //callback functionality +{ +public: + MoveFileCallbackImpl(StatusHandler& handler) : statusHandler_(handler) {} + + virtual Response requestUiRefresh() //DON'T throw exceptions here, at least in Windows build! { - try +#ifdef FFS_WIN + statusHandler_.requestUiRefresh(false); //don't allow throwing exception within this call: windows copying callback can't handle this + if (statusHandler_.abortIsRequested()) + return MoveFileCallback::CANCEL; +#elif defined FFS_LINUX + statusHandler_.requestUiRefresh(); //exceptions may be thrown here! +#endif + return MoveFileCallback::CONTINUE; + } + +private: + StatusHandler& statusHandler_; +}; + + +template <FreeFileSync::SelectedSide side> +void DeletionHandling::removeFile(const FileMapping& fileObj) const +{ + switch (deletionType) + { + case FreeFileSync::DELETE_PERMANENTLY: + FreeFileSync::removeFile(fileObj.getFullName<side>()); + break; + + case FreeFileSync::MOVE_TO_RECYCLE_BIN: + if (FreeFileSync::fileExists(fileObj.getFullName<side>())) { - cmd(); - break; + const Zstring targetFile = getSessionDir<side>() + fileObj.getRelativeName<side>(); //altDeletionDir ends with path separator + const Zstring targetDir = targetFile.BeforeLast(globalFunctions::FILE_NAME_SEPARATOR); + + if (!FreeFileSync::dirExists(targetDir)) + { + if (!targetDir.empty()) //kind of pathological ? + //lazy creation of alternate deletion directory (including super-directories of targetFile) + FreeFileSync::createDirectory(targetDir, Zstring(), false); + } + + try //rename file: no copying!!! + { + //performance optimization!! Instead of moving each object into recycle bin separately, we rename them ony by one into a + //temporary directory and delete this directory only ONCE! + FreeFileSync::renameFile(fileObj.getFullName<side>(), targetFile); //throw (FileError); + } + catch (...) + { + //if anything went wrong, move to recycle bin the standard way (single file processing: slow) + FreeFileSync::moveToRecycleBin(fileObj.getFullName<side>()); //throw (FileError) + } } - catch (FileError& error) + break; + + case FreeFileSync::MOVE_TO_CUSTOM_DIRECTORY: + if (FreeFileSync::fileExists(fileObj.getFullName<side>())) { - //User abort when copying files or moving files/directories into custom deletion directory: - //windows build: abort if requested, don't show error message if cancelled by user! - //linux build: this refresh is not necessary, because user abort triggers an AbortThisProcess() exception without a FileError() - handler.requestUiRefresh(true); //may throw! + const Zstring targetFile = getSessionDir<side>() + fileObj.getRelativeName<side>(); //altDeletionDir ends with path separator + const Zstring targetDir = targetFile.BeforeLast(globalFunctions::FILE_NAME_SEPARATOR); - ErrorHandler::Response rv = handler.reportError(error.show()); //may throw! - if ( rv == ErrorHandler::IGNORE_ERROR) - break; - else if (rv == ErrorHandler::RETRY) - ; //continue with loop - else - throw std::logic_error("Programming Error: Unknown return value!"); + if (!FreeFileSync::dirExists(targetDir)) + { + if (!targetDir.empty()) //kind of pathological ? + //lazy creation of alternate deletion directory (including super-directories of targetFile) + FreeFileSync::createDirectory(targetDir, Zstring(), false); + /*symbolic link handling: + if "not traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs\leaf<symlink> + => setting irrelevant + if "traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs<symlinks>\leaf<symlink> + => setting NEEDS to be false: We want to move leaf, therefore symlinks in "some\dirs" must not interfere */ + } + + MoveFileCallbackImpl callBack(statusUpdater_); //if file needs to be copied we need callback functionality to update screen and offer abort + FreeFileSync::moveFile(fileObj.getFullName<side>(), targetFile, &callBack); + } + break; + } +} + + +template <FreeFileSync::SelectedSide side> +void DeletionHandling::removeFolder(const DirMapping& dirObj) const +{ + switch (deletionType) + { + case FreeFileSync::DELETE_PERMANENTLY: + FreeFileSync::removeDirectory(dirObj.getFullName<side>()); + break; + + case FreeFileSync::MOVE_TO_RECYCLE_BIN: + if (FreeFileSync::dirExists(dirObj.getFullName<side>())) + { + const Zstring targetDir = getSessionDir<side>() + dirObj.getRelativeName<side>(); + const Zstring targetSuperDir = targetDir.BeforeLast(globalFunctions::FILE_NAME_SEPARATOR); + + if (!FreeFileSync::dirExists(targetSuperDir)) + { + if (!targetSuperDir.empty()) //kind of pathological ? + //lazy creation of alternate deletion directory (including super-directories of targetFile) + FreeFileSync::createDirectory(targetSuperDir, Zstring(), false); + } + + try //rename directory: no copying!!! + { + //performance optimization!! Instead of moving each object into recycle bin separately, we rename them ony by one into a + //temporary directory and delete this directory only ONCE! + FreeFileSync::renameFile(dirObj.getFullName<side>(), targetDir); //throw (FileError); + } + catch (...) + { + //if anything went wrong, move to recycle bin the standard way (single file processing: slow) + FreeFileSync::moveToRecycleBin(dirObj.getFullName<side>()); //throw (FileError) + + } + } + break; + + case FreeFileSync::MOVE_TO_CUSTOM_DIRECTORY: + if (FreeFileSync::dirExists(dirObj.getFullName<side>())) + { + const Zstring targetDir = getSessionDir<side>() + dirObj.getRelativeName<side>(); + const Zstring targetSuperDir = targetDir.BeforeLast(globalFunctions::FILE_NAME_SEPARATOR); + + if (!FreeFileSync::dirExists(targetSuperDir)) + { + if (!targetSuperDir.empty()) //kind of pathological ? + //lazy creation of alternate deletion directory (including super-directories of targetFile) + FreeFileSync::createDirectory(targetSuperDir, Zstring(), false); + /*symbolic link handling: + if "not traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs\leaf<symlink> + => setting irrelevant + if "traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs<symlinks>\leaf<symlink> + => setting NEEDS to be false: We want to move leaf, therefore symlinks in "some\dirs" must not interfere */ + } + + MoveFileCallbackImpl callBack(statusUpdater_); //if files need to be copied, we need callback functionality to update screen and offer abort + FreeFileSync::moveDirectory(dirObj.getFullName<side>(), targetDir, true, &callBack); } + break; } } +//---------------------------------------------------------------------------------------- + +//test if current sync-line will result in deletion of files or +//big file is overwritten by smaller one -> used to avoid disc space bottlenecks (at least if permanent deletion is active) +inline +bool diskSpaceIsReduced(const FileMapping& fileObj) +{ + switch (fileObj.getSyncOperation()) //evaluate comparison result and sync direction + { + case SO_DELETE_LEFT: + case SO_DELETE_RIGHT: + return true; + + case SO_OVERWRITE_LEFT: + return fileObj.getFileSize<LEFT_SIDE>() > fileObj.getFileSize<RIGHT_SIDE>(); + case SO_OVERWRITE_RIGHT: + return fileObj.getFileSize<LEFT_SIDE>() < fileObj.getFileSize<RIGHT_SIDE>(); + + case SO_CREATE_NEW_LEFT: + case SO_CREATE_NEW_RIGHT: + case SO_DO_NOTHING: + case SO_EQUAL: + case SO_UNRESOLVED_CONFLICT: + return false; + } + return false; //dummy +} inline -bool deletionImminent(const FileSystemObject& fsObj) +bool diskSpaceIsReduced(const DirMapping& dirObj) { - //test if current sync-line will result in deletion of files -> used to avoid disc space bottlenecks - const SyncOperation op = fsObj.getSyncOperation(); - return op == FreeFileSync::SO_DELETE_LEFT || op == FreeFileSync::SO_DELETE_RIGHT; + switch (dirObj.getSyncOperation()) //evaluate comparison result and sync direction + { + case SO_DELETE_LEFT: + case SO_DELETE_RIGHT: + return true; + + case SO_OVERWRITE_LEFT: + case SO_OVERWRITE_RIGHT: + case SO_UNRESOLVED_CONFLICT: + assert(false); + case SO_CREATE_NEW_LEFT: + case SO_CREATE_NEW_RIGHT: + case SO_DO_NOTHING: + case SO_EQUAL: + return false; + } + return false; //dummy } +//---------------------------------------------------------------------------------------- class RemoveInvalid @@ -461,14 +797,14 @@ private: }; -class FreeFileSync::SyncRecursively +class FreeFileSync::SynchronizeFolderPair { public: - SyncRecursively(const SyncProcess& syncProc, + SynchronizeFolderPair(const SyncProcess& syncProc, #ifdef FFS_WIN - ShadowCopy* shadowCopyHandler, + ShadowCopy* shadowCopyHandler, #endif - const DeletionHandling& delHandling) : + const DeletionHandling& delHandling) : statusUpdater_(syncProc.statusUpdater), #ifdef FFS_WIN shadowCopyHandler_(shadowCopyHandler), @@ -480,66 +816,22 @@ public: txtCopyingFile(wxToZ(_("Copying file %x to %y")).Replace(DefaultStr("%x"), DefaultStr("\"%x\""), false).Replace(DefaultStr("%y"), DefaultStr("\n\"%y\""), false)), txtOverwritingFile(wxToZ(_("Copying file %x to %y overwriting target")).Replace(DefaultStr("%x"), DefaultStr("\"%x\""), false).Replace(DefaultStr("%y"), DefaultStr("\n\"%y\""), false)), txtCreatingFolder(wxToZ(_("Creating folder %x")).Replace(DefaultStr("%x"), DefaultStr("\n\"%x\""), false)), - txtDeletingFile(wxToZ(_("Deleting file %x")).Replace(DefaultStr("%x"), DefaultStr("\n\"%x\""), false)), - txtDeletingFolder(wxToZ(_("Deleting folder %x")).Replace( DefaultStr("%x"), DefaultStr("\n\"%x\""), false)), - txtMoveToRecycler(wxToZ(_("Moving %x to Recycle Bin")).Replace(DefaultStr("%x"), DefaultStr("\"%x\""), false)), txtVerifying(wxToZ(_("Verifying file %x")).Replace(DefaultStr("%x"), DefaultStr("\n\"%x\""), false)) {} - template <bool deleteOnly> //"true" if files deletion shall happen only - void execute(HierarchyObject& hierObj) - { - //synchronize files: - for (HierarchyObject::SubFileMapping::iterator i = hierObj.subFiles.begin(); i != hierObj.subFiles.end(); ++i) - { - if ( ( deleteOnly && deletionImminent(*i)) || - (!deleteOnly && !deletionImminent(*i))) - tryReportingError(statusUpdater_, boost::bind(&SyncRecursively::synchronizeFile, this, boost::ref(*i))); - } - - //synchronize folders: - for (HierarchyObject::SubDirMapping::iterator i = hierObj.subDirs.begin(); i != hierObj.subDirs.end(); ++i) - { - const SyncOperation syncOp = i->getSyncOperation(); - if ( ( deleteOnly && deletionImminent(*i)) || //ensure folder creation happens in second pass, to enable time adaption below - (!deleteOnly && !deletionImminent(*i))) // - tryReportingError(statusUpdater_, boost::bind(&SyncRecursively::synchronizeFolder, this, boost::ref(*i))); - - //recursive synchronization: - execute<deleteOnly>(*i); - - //adapt folder modification dates: apply AFTER all subobjects have been synced to preserve folder modification date! - switch (syncOp) - { - case SO_CREATE_NEW_LEFT: - copyFileTimes(i->getFullName<RIGHT_SIDE>(), i->getFullName<LEFT_SIDE>()); //throw() - break; - case SO_CREATE_NEW_RIGHT: - copyFileTimes(i->getFullName<LEFT_SIDE>(), i->getFullName<RIGHT_SIDE>()); //throw() - break; - case SO_OVERWRITE_RIGHT: - case SO_OVERWRITE_LEFT: - case SO_UNRESOLVED_CONFLICT: - assert(false); - case SO_DELETE_LEFT: - case SO_DELETE_RIGHT: - case SO_DO_NOTHING: - case SO_EQUAL: - break; - } - } + template <bool reduceDiskSpace> //"true" if files deletion shall happen only + void startSync(BaseDirMapping& baseMap) + { + execute<reduceDiskSpace>(baseMap); } private: + template <bool reduceDiskSpace> //"true" if files deletion shall happen only + void execute(HierarchyObject& hierObj); + void synchronizeFile(FileMapping& fileObj) const; void synchronizeFolder(DirMapping& dirObj) const; - template <FreeFileSync::SelectedSide side> - void removeFile(const FileMapping& fileObj, bool showStatusUpdate) const; - - template <FreeFileSync::SelectedSide side> - void removeFolder(const DirMapping& dirObj) const; - void copyFileUpdating(const Zstring& source, const Zstring& target, const wxULongLong& sourceFileSize) const; void verifyFileCopy(const Zstring& source, const Zstring& target) const; @@ -559,97 +851,57 @@ private: const Zstring txtCopyingFile; const Zstring txtOverwritingFile; const Zstring txtCreatingFolder; - const Zstring txtDeletingFile; - const Zstring txtDeletingFolder; - const Zstring txtMoveToRecycler; const Zstring txtVerifying; }; -class MoveFileCallbackImpl : public MoveFileCallback //callback functionality +template <bool reduceDiskSpace> //"true" if files deletion shall happen only +void SynchronizeFolderPair::execute(HierarchyObject& hierObj) { -public: - MoveFileCallbackImpl(StatusHandler& handler) : statusHandler_(handler) {} - - virtual Response requestUiRefresh() //DON'T throw exceptions here, at least in Windows build! + //synchronize files: + for (HierarchyObject::SubFileMapping::iterator i = hierObj.subFiles.begin(); i != hierObj.subFiles.end(); ++i) { -#ifdef FFS_WIN - statusHandler_.requestUiRefresh(false); //don't allow throwing exception within this call: windows copying callback can't handle this - if (statusHandler_.abortIsRequested()) - return MoveFileCallback::CANCEL; -#elif defined FFS_LINUX - statusHandler_.requestUiRefresh(); //exceptions may be thrown here! -#endif - return MoveFileCallback::CONTINUE; + if ( ( reduceDiskSpace && diskSpaceIsReduced(*i)) || + (!reduceDiskSpace && !diskSpaceIsReduced(*i))) + tryReportingError(statusUpdater_, boost::bind(&SynchronizeFolderPair::synchronizeFile, this, boost::ref(*i))); } -private: - StatusHandler& statusHandler_; -}; + //synchronize folders: + for (HierarchyObject::SubDirMapping::iterator i = hierObj.subDirs.begin(); i != hierObj.subDirs.end(); ++i) + { + const SyncOperation syncOp = i->getSyncOperation(); + if ( ( reduceDiskSpace && diskSpaceIsReduced(*i)) || //ensure folder creation happens in second pass, to enable time adaption below + (!reduceDiskSpace && !diskSpaceIsReduced(*i))) // + tryReportingError(statusUpdater_, boost::bind(&SynchronizeFolderPair::synchronizeFolder, this, boost::ref(*i))); -template <FreeFileSync::SelectedSide side> -inline -void SyncRecursively::removeFile(const FileMapping& fileObj, bool showStatusUpdate) const -{ - Zstring statusText; + //recursive synchronization: + execute<reduceDiskSpace>(*i); - switch (delHandling_.handleDeletion) - { - case FreeFileSync::DELETE_PERMANENTLY: - if (showStatusUpdate) //status information + //adapt folder modification dates: apply AFTER all subobjects have been synced to preserve folder modification date! + switch (syncOp) { - statusText = txtDeletingFile; - statusText.Replace(DefaultStr("%x"), fileObj.getFullName<side>(), false); - statusUpdater_.updateStatusText(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh - } - FreeFileSync::removeFile(fileObj.getFullName<side>(), false); - break; - case FreeFileSync::MOVE_TO_RECYCLE_BIN: - if (showStatusUpdate) //status information - { - statusText = txtMoveToRecycler; - statusText.Replace(DefaultStr("%x"), fileObj.getFullName<side>(), false); - statusUpdater_.updateStatusText(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh - } - FreeFileSync::removeFile(fileObj.getFullName<side>(), true); - break; - case FreeFileSync::MOVE_TO_CUSTOM_DIRECTORY: - if (FreeFileSync::fileExists(fileObj.getFullName<side>())) - { - if (showStatusUpdate) //status information - { - statusText = delHandling_.txtMoveFileUserDefined; - statusText.Replace(DefaultStr("%x"), fileObj.getFullName<side>(), false); - statusUpdater_.updateStatusText(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh - } - const Zstring targetFile = delHandling_.currentDelFolder + fileObj.getRelativeName<side>(); //altDeletionDir ends with path separator - const Zstring targetDir = targetFile.BeforeLast(globalFunctions::FILE_NAME_SEPARATOR); - - if (!FreeFileSync::dirExists(targetDir)) - { - if (!targetDir.empty()) //kind of pathological ? - //lazy creation of alternate deletion directory (including super-directories of targetFile) - FreeFileSync::createDirectory(targetDir, Zstring(), false); - /*symbolic link handling: - if "not traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs\leaf<symlink> - => setting irrelevant - if "traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs<symlinks>\leaf<symlink> - => setting NEEDS to be false: We want to move leaf, therefore symlinks in "some\dirs" must not interfere */ - } - - MoveFileCallbackImpl callBack(statusUpdater_); //if file needs to be copied we need callback functionality to update screen and offer abort - FreeFileSync::moveFile(fileObj.getFullName<side>(), targetFile, &callBack); + case SO_CREATE_NEW_LEFT: + copyFileTimes(i->getFullName<RIGHT_SIDE>(), i->getFullName<LEFT_SIDE>()); //throw() + break; + case SO_CREATE_NEW_RIGHT: + copyFileTimes(i->getFullName<LEFT_SIDE>(), i->getFullName<RIGHT_SIDE>()); //throw() + break; + case SO_OVERWRITE_RIGHT: + case SO_OVERWRITE_LEFT: + case SO_UNRESOLVED_CONFLICT: + assert(false); + case SO_DELETE_LEFT: + case SO_DELETE_RIGHT: + case SO_DO_NOTHING: + case SO_EQUAL: + break; } - break; } } -void SyncRecursively::synchronizeFile(FileMapping& fileObj) const +void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const { Zstring statusText; Zstring target; @@ -681,11 +933,21 @@ void SyncRecursively::synchronizeFile(FileMapping& fileObj) const break; case SO_DELETE_LEFT: - removeFile<LEFT_SIDE>(fileObj, true); //status updates in subroutine + statusText = delHandling_.getTxtRemovingFile(); + statusText.Replace(DefaultStr("%x"), fileObj.getFullName<LEFT_SIDE>(), false); + statusUpdater_.updateStatusText(statusText); + statusUpdater_.requestUiRefresh(); //trigger display refresh + + delHandling_.removeFile<LEFT_SIDE>(fileObj); //throw FileError() break; case SO_DELETE_RIGHT: - removeFile<RIGHT_SIDE>(fileObj, true); //status updates in subroutine + statusText = delHandling_.getTxtRemovingFile(); + statusText.Replace(DefaultStr("%x"), fileObj.getFullName<RIGHT_SIDE>(), false); + statusUpdater_.updateStatusText(statusText); + statusUpdater_.requestUiRefresh(); //trigger display refresh + + delHandling_.removeFile<RIGHT_SIDE>(fileObj); //throw FileError() break; case SO_OVERWRITE_RIGHT: @@ -697,7 +959,7 @@ void SyncRecursively::synchronizeFile(FileMapping& fileObj) const statusUpdater_.updateStatusText(statusText); statusUpdater_.requestUiRefresh(); //trigger display refresh - removeFile<RIGHT_SIDE>(fileObj, false); + delHandling_.removeFile<RIGHT_SIDE>(fileObj); //throw FileError() fileObj.removeObject<RIGHT_SIDE>(); //remove file from FileMapping, to keep in sync (if subsequent copying fails!!) copyFileUpdating(fileObj.getFullName<LEFT_SIDE>(), target, fileObj.getFileSize<LEFT_SIDE>()); @@ -712,7 +974,7 @@ void SyncRecursively::synchronizeFile(FileMapping& fileObj) const statusUpdater_.updateStatusText(statusText); statusUpdater_.requestUiRefresh(); //trigger display refresh - removeFile<LEFT_SIDE>(fileObj, false); + delHandling_.removeFile<LEFT_SIDE>(fileObj); //throw FileError() fileObj.removeObject<LEFT_SIDE>(); //remove file from FileMapping, to keep in sync (if subsequent copying fails!!) copyFileUpdating(fileObj.getFullName<RIGHT_SIDE>(), target, fileObj.getFileSize<RIGHT_SIDE>()); @@ -799,65 +1061,7 @@ void SyncRecursively::synchronizeFile(FileMapping& fileObj) const //} -template <FreeFileSync::SelectedSide side> -inline -void SyncRecursively::removeFolder(const DirMapping& dirObj) const -{ - Zstring statusText; - - switch (delHandling_.handleDeletion) - { - case FreeFileSync::DELETE_PERMANENTLY: - //status information - statusText = txtDeletingFolder; - statusText.Replace(DefaultStr("%x"), dirObj.getFullName<side>(), false); - statusUpdater_.updateStatusText(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh - - FreeFileSync::removeDirectory(dirObj.getFullName<side>(), false); - break; - case FreeFileSync::MOVE_TO_RECYCLE_BIN: - //status information - statusText = txtMoveToRecycler; - statusText.Replace(DefaultStr("%x"), dirObj.getFullName<side>(), false); - statusUpdater_.updateStatusText(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh - - FreeFileSync::removeDirectory(dirObj.getFullName<side>(), true); - break; - case FreeFileSync::MOVE_TO_CUSTOM_DIRECTORY: - if (FreeFileSync::dirExists(dirObj.getFullName<side>())) - { - //status information - statusText = delHandling_.txtMoveFolderUserDefined; - statusText.Replace(DefaultStr("%x"), dirObj.getFullName<side>(), false); - statusUpdater_.updateStatusText(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh - - const Zstring targetDir = delHandling_.currentDelFolder + dirObj.getRelativeName<side>(); - const Zstring targetSuperDir = targetDir.BeforeLast(globalFunctions::FILE_NAME_SEPARATOR);; - - if (!FreeFileSync::dirExists(targetSuperDir)) - { - if (!targetSuperDir.empty()) //kind of pathological ? - //lazy creation of alternate deletion directory (including super-directories of targetFile) - FreeFileSync::createDirectory(targetSuperDir, Zstring(), false); - /*symbolic link handling: - if "not traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs\leaf<symlink> - => setting irrelevant - if "traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs<symlinks>\leaf<symlink> - => setting NEEDS to be false: We want to move leaf, therefore symlinks in "some\dirs" must not interfere */ - } - - MoveFileCallbackImpl callBack(statusUpdater_); //if files need to be copied, we need callback functionality to update screen and offer abort - FreeFileSync::moveDirectory(dirObj.getFullName<side>(), targetDir, true, &callBack); - } - break; - } -} - - -void SyncRecursively::synchronizeFolder(DirMapping& dirObj) const +void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const { Zstring statusText; Zstring target; @@ -894,7 +1098,13 @@ void SyncRecursively::synchronizeFolder(DirMapping& dirObj) const break; case SO_DELETE_LEFT: - removeFolder<LEFT_SIDE>(dirObj); + //status information + statusText = delHandling_.getTxtRemovingDir(); + statusText.Replace(DefaultStr("%x"), dirObj.getFullName<LEFT_SIDE>(), false); + statusUpdater_.updateStatusText(statusText); + statusUpdater_.requestUiRefresh(); //trigger display refresh + + delHandling_.removeFolder<LEFT_SIDE>(dirObj); //throw FileError() { //progress indicator update: DON'T forget to notify about implicitly deleted objects! const SyncStatistics subObjects(dirObj); @@ -906,7 +1116,13 @@ void SyncRecursively::synchronizeFolder(DirMapping& dirObj) const break; case SO_DELETE_RIGHT: - removeFolder<RIGHT_SIDE>(dirObj); + //status information + statusText = delHandling_.getTxtRemovingDir(); + statusText.Replace(DefaultStr("%x"), dirObj.getFullName<RIGHT_SIDE>(), false); + statusUpdater_.updateStatusText(statusText); + statusUpdater_.requestUiRefresh(); //trigger display refresh + + delHandling_.removeFolder<RIGHT_SIDE>(dirObj); //throw FileError() { //progress indicator update: DON'T forget to notify about implicitly deleted objects! const SyncStatistics subObjects(dirObj); @@ -935,27 +1151,6 @@ void SyncRecursively::synchronizeFolder(DirMapping& dirObj) const } -class UpdateDatabase -{ -public: - UpdateDatabase(const BaseDirMapping& baseMap, StatusHandler& statusHandler) : - baseMap_(baseMap), - statusHandler_(statusHandler) {} - - //update sync database after synchronization is finished - void updateNow() - { - //these calls may throw in error-callbacks! - tryReportingError(statusHandler_, boost::bind(saveToDisk, boost::cref(baseMap_))); - }; - //_("You can ignore the error to skip current folder pair.")); - -private: - const BaseDirMapping& baseMap_; - StatusHandler& statusHandler_; -}; - - //avoid data loss when source directory doesn't (temporarily?) exist anymore AND user chose to ignore errors (else we wouldn't arrive here) bool dataLossPossible(const Zstring& dirName, const SyncStatistics& folderPairStat) { @@ -1007,14 +1202,14 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf //test existence of Recycle Bin if (folderPairCfg.handleDeletion == FreeFileSync::MOVE_TO_RECYCLE_BIN && !FreeFileSync::recycleBinExists()) { - statusUpdater.reportFatalError(_("Unable to initialize Recycle Bin!")); + statusUpdater.reportFatalError(_("Recycle Bin not yet supported for this system!")); return; //should be obsolete! } if (folderPairCfg.handleDeletion == FreeFileSync::MOVE_TO_CUSTOM_DIRECTORY) { //check if user-defined directory for deletion was specified - if (FreeFileSync::getFormattedDirectoryName(folderPairCfg.custDelFolder.c_str()).empty()) + if (folderPairCfg.custDelFolder.empty()) { statusUpdater.reportFatalError(_("User-defined directory for deletion was not specified!")); return; //should be obsolete! @@ -1080,7 +1275,12 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf const SyncStatistics::ConflictTexts& firstConflicts = statisticsTotal.getFirstConflicts(); //get first few sync conflicts for (SyncStatistics::ConflictTexts::const_iterator i = firstConflicts.begin(); i != firstConflicts.end(); ++i) - warningMessage += wxString(wxT("\"")) + zToWx(i->first) + wxT("\": \t") + i->second + wxT("\n"); + { + wxString conflictDescription = i->second; + conflictDescription.Replace(wxT("\n"), wxT(" ")); //remove line-breaks + + warningMessage += wxString(wxT("\"")) + zToWx(i->first) + wxT("\": ") + conflictDescription + wxT("\n"); + } if (statisticsTotal.getConflict() > static_cast<int>(firstConflicts.size())) warningMessage += wxT("[...]\n"); @@ -1096,7 +1296,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf #ifdef FFS_WIN //shadow copy buffer: per sync-instance, not folder pair - std::auto_ptr<ShadowCopy> shadowCopyHandler(copyLockedFiles_ ? new ShadowCopy : NULL); + boost::scoped_ptr<ShadowCopy> shadowCopyHandler(copyLockedFiles_ ? new ShadowCopy : NULL); #endif try @@ -1107,6 +1307,10 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf { const FolderPairSyncCfg& folderPairCfg = syncConfig[j - folderCmp.begin()]; + //exclude some pathological case (leftdir, rightdir are empty) + if (j->getBaseDir<LEFT_SIDE>() == j->getBaseDir<RIGHT_SIDE>()) + continue; + //------------------------------------------------------------------------------------------ //info about folder pair to be processed (useful for logfile) wxString left = wxString(_("Left")) + wxT(": "); @@ -1119,11 +1323,11 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf //------------------------------------------------------------------------------------------ //generate name of alternate deletion directory (unique for session AND folder pair) - const DeletionHandling currentDelHandling(folderPairCfg.handleDeletion, folderPairCfg.custDelFolder); + const DeletionHandling currentDelHandling(folderPairCfg.handleDeletion, + folderPairCfg.custDelFolder, + j->getBaseDir<LEFT_SIDE>(), j->getBaseDir<RIGHT_SIDE>(), + statusUpdater); - //exclude some pathological case (leftdir, rightdir are empty) - if (j->getBaseDir<LEFT_SIDE>() == j->getBaseDir<RIGHT_SIDE>()) - continue; //------------------------------------------------------------------------------------------ //execute synchronization recursively @@ -1134,26 +1338,28 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf // if (folderPairCfg.inAutomaticMode) // DetectRenamedFiles::execute(*j, statusUpdater); - //loop through all files twice; reason: first delete, then copy - SyncRecursively( *this, -#ifdef FFS_WIN - shadowCopyHandler.get(), -#endif - currentDelHandling).execute<true>(*j); - SyncRecursively(*this, + SynchronizeFolderPair syncFP( *this, #ifdef FFS_WIN - shadowCopyHandler.get(), + shadowCopyHandler.get(), #endif - currentDelHandling).execute<false>(*j); + currentDelHandling); + + //loop through all files twice; reason: first delete files (or overwrite big ones with smaller ones), then copy rest + syncFP.startSync<true>(*j); + syncFP.startSync<false>(*j); + + + //(try to gracefully) cleanup temporary folders (Recycle bin optimization) -> will be done in DeletionHandling anyway... + currentDelHandling.tryCleanup(); + //------------------------------------------------------------------------------------------ //update synchronization database (automatic sync only) if (folderPairCfg.inAutomaticMode) { - UpdateDatabase syncDB(*j, statusUpdater); statusUpdater.updateStatusText(wxToZ(_("Generating database..."))); statusUpdater.forceUiRefresh(); - syncDB.updateNow(); + tryReportingError(statusUpdater, boost::bind(FreeFileSync::saveToDisk, boost::cref(*j))); //these call may throw in error-callback! } } } @@ -1202,7 +1408,7 @@ private: //copy file while executing statusUpdater->requestUiRefresh() calls -void SyncRecursively::copyFileUpdating(const Zstring& source, const Zstring& target, const wxULongLong& totalBytesToCpy) const +void SynchronizeFolderPair::copyFileUpdating(const Zstring& source, const Zstring& target, const wxULongLong& totalBytesToCpy) const { //create folders first (see http://sourceforge.net/tracker/index.php?func=detail&aid=2628943&group_id=234430&atid=1093080) const Zstring targetDir = target.BeforeLast(globalFunctions::FILE_NAME_SEPARATOR); @@ -1319,7 +1525,7 @@ private: }; -void SyncRecursively::verifyFileCopy(const Zstring& source, const Zstring& target) const +void SynchronizeFolderPair::verifyFileCopy(const Zstring& source, const Zstring& target) const { Zstring statusText = txtVerifying; statusText.Replace(DefaultStr("%x"), target, false); @@ -1344,9 +1550,3 @@ void SyncRecursively::verifyFileCopy(const Zstring& source, const Zstring& targe } } - - - - - - diff --git a/synchronization.h b/synchronization.h index 9db4d112..a030590c 100644 --- a/synchronization.h +++ b/synchronization.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 SYNCHRONIZATION_H_INCLUDED #define SYNCHRONIZATION_H_INCLUDED @@ -46,20 +52,17 @@ private: bool synchronizationNeeded(const FolderComparison& folderCmp); -class SyncRecursively; +class SynchronizeFolderPair; struct FolderPairSyncCfg { FolderPairSyncCfg(bool automaticMode, const DeletionPolicy handleDel, - const Zstring& custDelDir) : - inAutomaticMode(automaticMode), - handleDeletion(handleDel), - custDelFolder(custDelDir) {} + const Zstring& custDelDir); bool inAutomaticMode; //update database if in automatic mode DeletionPolicy handleDeletion; - Zstring custDelFolder; + Zstring custDelFolder; //formatted directory name }; std::vector<FolderPairSyncCfg> extractSyncCfg(const MainConfiguration& mainCfg); @@ -79,7 +82,7 @@ public: void startSynchronizationProcess(const std::vector<FolderPairSyncCfg>& syncConfig, FolderComparison& folderCmp); private: - friend class SyncRecursively; + friend class SynchronizeFolderPair; const bool m_copyFileSymLinks; const bool m_traverseDirSymLinks; diff --git a/ui/MainDialog.cpp b/ui/MainDialog.cpp index 4d255950..932d0b4a 100644 --- a/ui/MainDialog.cpp +++ b/ui/MainDialog.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "mainDialog.h" #include <wx/filename.h> #include <stdexcept> @@ -19,6 +25,7 @@ #include "../shared/localization.h" #include "../shared/stringConv.h" #include "smallDialogs.h" +#include "messagePopup.h" #include "../shared/dragAndDrop.h" #include "../library/filter.h" #include "../structures.h" @@ -27,12 +34,15 @@ #include "gridView.h" #include "../library/resources.h" #include "../shared/fileHandling.h" +#include "../shared/recycler.h" #include "../shared/xmlBase.h" #include "../shared/standardPaths.h" #include "../shared/toggleButton.h" #include "folderPair.h" #include "../shared/globalFunctions.h" #include <wx/sound.h> +#include "search.h" +#include "../shared/helpProvider.h" using namespace FreeFileSync; using FreeFileSync::CustomLocale; @@ -241,23 +251,28 @@ struct DirNotFound //################################################################################################################################## MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, - xmlAccess::XmlGlobalSettings& settings, - wxHelpController& helpController) : + xmlAccess::XmlGlobalSettings& settings) : MainDialogGenerated(frame), globalSettings(settings), gridDataView(new FreeFileSync::GridView()), contextMenu(new wxMenu), //initialize right-click context menu; will be dynamically re-created on each R-mouse-click + compareStatus(*this), cleanedUp(false), lastSortColumn(-1), lastSortGrid(NULL), #ifdef FFS_WIN updateFileIcons(new IconUpdater(m_gridLeft, m_gridRight)), + moveWholeWindow(this), #endif - helpController_(helpController), syncPreview(this) { wxWindowUpdateLocker dummy(this); //avoid display distortion +//avoid mirroring this dialog in RTL languages like Hebrew or Arabic +SetLayoutDirection(wxLayout_LeftToRight); +m_panelStatusBar->SetLayoutDirection(wxLayout_LeftToRight); + + //init handling of first folder pair firstFolderPair.reset(new FirstFolderPairCfg(*this)); @@ -304,6 +319,17 @@ MainDialog::MainDialog(wxFrame* frame, MenuItemUpdater updateMenuHelp(m_menuHelp); updateMenuHelp.addForUpdate(m_menuItemAbout, GlobalResources::getInstance().getImageByName(wxT("aboutSmall"))); +#ifdef FFS_WIN + //allow moving main dialog by clicking (nearly) anywhere... + moveWholeWindow.connectSourceWindow(m_panel71); + moveWholeWindow.connectSourceWindow(m_panelBottom); + moveWholeWindow.connectSourceWindow(m_panelStatusBar); +#endif + +#ifdef FFS_LINUX + if (!FreeFileSync::isPortableVersion()) //disable update check for Linux installer-based version -> handled by .deb + m_menuItemCheckVer->Enable(false); +#endif //create language selection menu for (std::vector<LocInfoLine>::const_iterator i = LocalizationInfo::getMapping().begin(); i != LocalizationInfo::getMapping().end(); ++i) @@ -319,7 +345,7 @@ MainDialog::MainDialog(wxFrame* frame, m_menuLanguages->Append(newItem); } - //support for CTRL + C and DEL + //support for CTRL + C and DEL on grids m_gridLeft->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onGridLeftButtonEvent), NULL, this); m_gridRight->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onGridRightButtonEvent), NULL, this); m_gridMiddle->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onGridMiddleButtonEvent), NULL, this); @@ -346,11 +372,10 @@ MainDialog::MainDialog(wxFrame* frame, //mainly to update row label sizes... updateGuiGrid(); - //create the compare status panel in hidden state - compareStatus = new CompareStatus(this); - bSizer1->Insert(1, compareStatus, 0, wxEXPAND | wxBOTTOM, 5 ); + //integrate the compare status panel (in hidden state) + bSizer1->Insert(1, compareStatus.getAsWindow(), 0, wxEXPAND | wxBOTTOM, 5 ); Layout(); //avoid screen flicker when panel is shown later - compareStatus->Hide(); + compareStatus.getAsWindow()->Hide(); //correct width of swap button above middle grid const wxSize source = m_gridMiddle->GetSize(); @@ -385,6 +410,8 @@ MainDialog::MainDialog(wxFrame* frame, MainDialog::~MainDialog() { + //keep non-inline destructor for std::auto_ptr to work with forward declaration + cleanUp(); //do NOT include any other code here! cleanUp() is re-used when switching languages } @@ -398,7 +425,7 @@ void MainDialog::cleanUp() //no need for wxEventHandler::Disconnect() here; done automatically when window is destoyed! //save configuration - writeConfigurationToXml(lastConfigFileName()); //don't trow exceptions in destructors + writeConfigurationToXml(lastConfigFileName()); //don't throw exceptions in destructors writeGlobalSettings(); } } @@ -547,7 +574,7 @@ void MainDialog::OnIdleEvent(wxEvent& event) if (stackObjects.empty()) m_staticTextStatusMiddle->SetForegroundColour(*wxBLACK); //reset color - m_panel7->Layout(); + m_panelStatusBar->Layout(); } } @@ -672,7 +699,7 @@ public: statusMessage.Replace(wxT("%y"), globalFunctions::numberToWxString(totalObjToDelete), false); mainDlg->m_staticTextStatusMiddle->SetLabel(statusMessage); - mainDlg->m_panel7->Layout(); + mainDlg->m_panelStatusBar->Layout(); updateUiNow(); } @@ -714,17 +741,15 @@ void MainDialog::deleteSelectedFiles() int totalDeleteCount = 0; - DeleteDialog* confirmDeletion = new DeleteDialog(this, //no destruction needed; attached to main window - compRefLeft, - compRefRight, - globalSettings.gui.deleteOnBothSides, - globalSettings.gui.useRecyclerForManualDeletion, - totalDeleteCount); - if (confirmDeletion->ShowModal() == DeleteDialog::BUTTON_OKAY) + if (FreeFileSync::showDeleteDialog(compRefLeft, + compRefRight, + globalSettings.gui.deleteOnBothSides, + globalSettings.gui.useRecyclerForManualDeletion, + totalDeleteCount) == DefaultReturnCode::BUTTON_OKAY) { if (globalSettings.gui.useRecyclerForManualDeletion && !FreeFileSync::recycleBinExists()) { - wxMessageBox(_("Unable to initialize Recycle Bin!")); + wxMessageBox(_("Recycle Bin not yet supported for this system!")); return; } @@ -847,7 +872,7 @@ void MainDialog::pushStatusInformation(const wxString& text) stackObjects.push(m_staticTextStatusMiddle->GetLabel()); m_staticTextStatusMiddle->SetLabel(text); m_staticTextStatusMiddle->SetForegroundColour(wxColour(31, 57, 226)); //highlight color: blue - m_panel7->Layout(); + m_panelStatusBar->Layout(); } @@ -988,15 +1013,19 @@ void MainDialog::onGridLeftButtonEvent(wxKeyEvent& event) if (event.ControlDown()) switch (keyCode) { - case 67: + case 'C': case WXK_INSERT: //CTRL + C || CTRL + INS copySelectionToClipboard(m_gridLeft); break; - case 65: //CTRL + A + case 'A': //CTRL + A m_gridLeft->SelectAll(); break; + case 'F': //CTRL + F + FreeFileSync::startFind(*this, *m_gridLeft, *m_gridRight, globalSettings.gui.textSearchRespectCase); + break; + case WXK_NUMPAD_ADD: //CTRL + '+' m_gridLeft->autoSizeColumns(); break; @@ -1050,6 +1079,11 @@ void MainDialog::onGridLeftButtonEvent(wxKeyEvent& event) OnContextOpenWith(dummy); } break; + + case WXK_F3: //F3 + case WXK_NUMPAD_F3: // + FreeFileSync::findNext(*this, *m_gridLeft, *m_gridRight, globalSettings.gui.textSearchRespectCase); + break; } //event.Skip(); -> swallow event! don't allow default grid commands! @@ -1077,15 +1111,19 @@ void MainDialog::onGridRightButtonEvent(wxKeyEvent& event) if (event.ControlDown()) switch (keyCode) { - case 67: + case 'C': case WXK_INSERT: //CTRL + C || CTRL + INS copySelectionToClipboard(m_gridRight); break; - case 65: //CTRL + A + case 'A': //CTRL + A m_gridRight->SelectAll(); break; + case 'F': //CTRL + F + FreeFileSync::startFind(*this, *m_gridLeft, *m_gridRight, globalSettings.gui.textSearchRespectCase); + break; + case WXK_NUMPAD_ADD: //CTRL + '+' m_gridRight->autoSizeColumns(); break; @@ -1139,7 +1177,13 @@ void MainDialog::onGridRightButtonEvent(wxKeyEvent& event) OnContextOpenWith(dummy); } break; + + case WXK_F3: //F3 + case WXK_NUMPAD_F3: // + FreeFileSync::findNext(*this, *m_gridLeft, *m_gridRight, globalSettings.gui.textSearchRespectCase); + break; } + //event.Skip(); -> swallow event! don't allow default grid commands! } @@ -1218,17 +1262,23 @@ void MainDialog::OnContextRim(wxGridEvent& event) if (selectionLeft.size() + selectionRight.size() > 0) { //CONTEXT_SYNC_DIR_LEFT - wxMenuItem* menuItemSyncDirLeft = new wxMenuItem(contextMenu.get(), CONTEXT_SYNC_DIR_LEFT, wxString(_("Change direction")) + wxT("\tALT + LEFT")); + wxMenuItem* menuItemSyncDirLeft = new wxMenuItem(contextMenu.get(), CONTEXT_SYNC_DIR_LEFT, wxString(_("Set direction:")) + + wxT(" ") + getSymbol(fsObj->testSyncOperation(true, SYNC_DIR_LEFT)) + + wxT("\tALT + LEFT")); //Linux needs a direction, "<-", because it has no context menu icons! menuItemSyncDirLeft->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_LEFT))); contextMenu->Append(menuItemSyncDirLeft); //CONTEXT_SYNC_DIR_NONE - wxMenuItem* menuItemSyncDirNone = new wxMenuItem(contextMenu.get(), CONTEXT_SYNC_DIR_NONE, wxString(_("Change direction")) + wxT("\tALT + UP")); + wxMenuItem* menuItemSyncDirNone = new wxMenuItem(contextMenu.get(), CONTEXT_SYNC_DIR_NONE, wxString(_("Set direction:")) + + wxT(" ") + getSymbol(fsObj->testSyncOperation(true, SYNC_DIR_NONE)) + + wxT("\tALT + UP")); menuItemSyncDirNone->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_NONE))); contextMenu->Append(menuItemSyncDirNone); //CONTEXT_SYNC_DIR_RIGHT - wxMenuItem* menuItemSyncDirRight = new wxMenuItem(contextMenu.get(), CONTEXT_SYNC_DIR_RIGHT, wxString(_("Change direction")) + wxT("\tALT + RIGHT")); + wxMenuItem* menuItemSyncDirRight = new wxMenuItem(contextMenu.get(), CONTEXT_SYNC_DIR_RIGHT, wxString(_("Set direction:")) + + wxT(" ") + getSymbol(fsObj->testSyncOperation(true, SYNC_DIR_RIGHT)) + + wxT("\tALT + RIGHT")); menuItemSyncDirRight->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_RIGHT))); contextMenu->Append(menuItemSyncDirRight); @@ -1336,10 +1386,15 @@ void MainDialog::OnContextRim(wxGridEvent& event) i != globalSettings.gui.externelApplications.end(); ++i, ++newID) { + //some trick to translate default external apps on the fly: 1. "open in explorer" 2. "start directly" + wxString description = wxGetTranslation(i->first); + if (description.empty()) + description = wxT(" "); //wxWidgets doesn't like empty items + if (i == globalSettings.gui.externelApplications.begin()) - contextMenu->Append(newID, i->first + wxT("\t") + wxString(_("D-Click")) + wxT("; ENTER")); + contextMenu->Append(newID, description + wxT("\t") + wxString(_("D-Click")) + wxT("; ENTER")); else - contextMenu->Append(newID, i->first.empty() ? wxT(" ") : i->first); //wxWidgets doesn't like empty items + contextMenu->Append(newID, description); contextMenu->Enable(newID, externalAppEnabled); @@ -1433,7 +1488,7 @@ void MainDialog::OnContextExcludeObject(wxCommandEvent& event) if (!i->isDir) currentCfg.mainCfg.excludeFilter += Zstring() + globalFunctions::FILE_NAME_SEPARATOR + i->relativeName; else - currentCfg.mainCfg.excludeFilter += Zstring() + globalFunctions::FILE_NAME_SEPARATOR + i->relativeName + globalFunctions::FILE_NAME_SEPARATOR + DefaultStr("*"); + currentCfg.mainCfg.excludeFilter += Zstring() + globalFunctions::FILE_NAME_SEPARATOR + i->relativeName + globalFunctions::FILE_NAME_SEPARATOR; } m_checkBoxActivateFilter->SetValue(true); @@ -1549,13 +1604,10 @@ void MainDialog::OnContextRimLabelRight(wxGridEvent& event) void MainDialog::OnContextCustColumnLeft(wxCommandEvent& event) { xmlAccess::ColumnAttributes colAttr = m_gridLeft->getColumnAttributes(); - CustomizeColsDlg* customizeDlg = new CustomizeColsDlg(this, colAttr, globalSettings.gui.showFileIconsLeft); - if (customizeDlg->ShowModal() == CustomizeColsDlg::BUTTON_OKAY) + + if (FreeFileSync::showCustomizeColsDlg(colAttr) == DefaultReturnCode::BUTTON_OKAY) { m_gridLeft->setColumnAttributes(colAttr); -#ifdef FFS_WIN - m_gridLeft->enableFileIcons(globalSettings.gui.showFileIconsLeft); -#endif m_gridLeft->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING)); //hide sort direction indicator on GUI grids m_gridMiddle->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING)); @@ -1567,13 +1619,10 @@ void MainDialog::OnContextCustColumnLeft(wxCommandEvent& event) void MainDialog::OnContextCustColumnRight(wxCommandEvent& event) { xmlAccess::ColumnAttributes colAttr = m_gridRight->getColumnAttributes(); - CustomizeColsDlg* customizeDlg = new CustomizeColsDlg(this, colAttr, globalSettings.gui.showFileIconsRight); - if (customizeDlg->ShowModal() == CustomizeColsDlg::BUTTON_OKAY) + + if (FreeFileSync::showCustomizeColsDlg(colAttr) == DefaultReturnCode::BUTTON_OKAY) { m_gridRight->setColumnAttributes(colAttr); -#ifdef FFS_WIN - m_gridRight->enableFileIcons(globalSettings.gui.showFileIconsRight); -#endif m_gridLeft->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING)); //hide sort direction indicator on GUI grids m_gridMiddle->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING)); @@ -2121,9 +2170,7 @@ xmlAccess::XmlGuiConfig MainDialog::getCurrentConfiguration() const const wxString& MainDialog::lastConfigFileName() { - static wxString instance = FreeFileSync::getConfigDir().EndsWith(zToWx(globalFunctions::FILE_NAME_SEPARATOR)) ? - FreeFileSync::getConfigDir() + wxT("LastRun.ffs_gui") : - FreeFileSync::getConfigDir() + zToWx(globalFunctions::FILE_NAME_SEPARATOR) + wxT("LastRun.ffs_gui"); + static wxString instance = FreeFileSync::getConfigDir() + wxT("LastRun.ffs_gui"); return instance; } @@ -2175,12 +2222,10 @@ void MainDialog::OnHideFilteredButton(wxCommandEvent &event) void MainDialog::OnConfigureFilter(wxCommandEvent &event) { - FilterDlg* filterDlg = new FilterDlg(this, - true, //is main filter dialog - currentCfg.mainCfg.includeFilter, - currentCfg.mainCfg.excludeFilter, - m_checkBoxActivateFilter->GetValue()); - if (filterDlg->ShowModal() == FilterDlg::BUTTON_APPLY) + if (showFilterDialog(true, //is main filter dialog + currentCfg.mainCfg.includeFilter, + currentCfg.mainCfg.excludeFilter, + m_checkBoxActivateFilter->GetValue()) == DefaultReturnCode::BUTTON_OKAY) { updateFilterButtons(); //refresh global filter icon updateFilterConfig(); //re-apply filter @@ -2194,98 +2239,98 @@ void MainDialog::OnLeftOnlyFiles(wxCommandEvent& event) { m_bpButtonLeftOnly->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnLeftNewerFiles(wxCommandEvent& event) { m_bpButtonLeftNewer->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnDifferentFiles(wxCommandEvent& event) { m_bpButtonDifferent->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnRightNewerFiles(wxCommandEvent& event) { m_bpButtonRightNewer->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnRightOnlyFiles(wxCommandEvent& event) { m_bpButtonRightOnly->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnEqualFiles(wxCommandEvent& event) { m_bpButtonEqual->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnConflictFiles(wxCommandEvent& event) { m_bpButtonConflict->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnSyncCreateLeft(wxCommandEvent& event) { m_bpButtonSyncCreateLeft->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnSyncCreateRight(wxCommandEvent& event) { m_bpButtonSyncCreateRight->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnSyncDeleteLeft(wxCommandEvent& event) { m_bpButtonSyncDeleteLeft->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnSyncDeleteRight(wxCommandEvent& event) { m_bpButtonSyncDeleteRight->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnSyncDirLeft(wxCommandEvent& event) { m_bpButtonSyncDirOverwLeft->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnSyncDirRight(wxCommandEvent& event) { m_bpButtonSyncDirOverwRight->toggle(); updateGuiGrid(); -}; +} void MainDialog::OnSyncDirNone(wxCommandEvent& event) { m_bpButtonSyncDirNone->toggle(); updateGuiGrid(); -}; +} void MainDialog::initViewFilterButtons() @@ -2457,7 +2502,6 @@ void MainDialog::OnCompare(wxCommandEvent &event) FreeFileSync::CompareProcess comparison(currentCfg.mainCfg.hidden.traverseDirectorySymlinks, currentCfg.mainCfg.hidden.fileTimeTolerance, globalSettings.ignoreOneHourDiff, - globalSettings.detectRenameThreshold, globalSettings.optDialogs, &statusHandler); @@ -2472,7 +2516,7 @@ void MainDialog::OnCompare(wxCommandEvent &event) gridDataView->setData(newCompareData); //newCompareData is invalidated after this call //play (optional) sound notification after sync has completed (GUI and batch mode) - const wxString soundFile = FreeFileSync::getInstallationDir() + wxT("Compare_Complete.wav"); + const wxString soundFile = FreeFileSync::getResourceDir() + wxT("Compare_Complete.wav"); if (fileExists(wxToZ(soundFile))) wxSound::Play(soundFile, wxSOUND_ASYNC); } @@ -2609,8 +2653,7 @@ void MainDialog::OnCmpSettings(wxCommandEvent& event) wxPoint windowPos = m_bpButtonCmpConfig->GetScreenPosition(); windowPos.x += m_bpButtonCmpConfig->GetSize().GetWidth() + 5; - CompareCfgDialog* syncDlg = new CompareCfgDialog(this, windowPos, newCmpVariant); - if (syncDlg->ShowModal() == CompareCfgDialog::BUTTON_OKAY) + if (FreeFileSync::showCompareCfgDialog(windowPos, newCmpVariant) == DefaultReturnCode::BUTTON_OKAY) { if (currentCfg.mainCfg.compareVar != newCmpVariant) { @@ -2646,13 +2689,10 @@ void MainDialog::OnStartSync(wxCommandEvent& event) { bool dontShowAgain = false; - SyncPreviewDlg* preview = new SyncPreviewDlg( - this, - getCurrentConfiguration().mainCfg.getSyncVariantName(), - FreeFileSync::SyncStatistics(gridDataView->getDataTentative()), - dontShowAgain); - - if (preview->ShowModal() != SyncPreviewDlg::BUTTON_START) + if (FreeFileSync::showSyncPreviewDlg( + getCurrentConfiguration().mainCfg.getSyncVariantName(), + FreeFileSync::SyncStatistics(gridDataView->getDataTentative()), + dontShowAgain) != DefaultReturnCode::BUTTON_OKAY) return; globalSettings.optDialogs.showSummaryBeforeSync = !dontShowAgain; @@ -2694,7 +2734,7 @@ void MainDialog::OnStartSync(wxCommandEvent& event) synchronization.startSynchronizationProcess(syncProcessCfg, dataToSync); //play (optional) sound notification after sync has completed (GUI and batch mode) - const wxString soundFile = FreeFileSync::getInstallationDir() + wxT("Sync_Complete.wav"); + const wxString soundFile = FreeFileSync::getResourceDir() + wxT("Sync_Complete.wav"); if (fileExists(wxToZ(soundFile))) wxSound::Play(soundFile, wxSOUND_ASYNC); } @@ -2767,6 +2807,9 @@ void MainDialog::OnSortLeftGrid(wxGridEvent& event) case xmlAccess::DATE: gridDataView->sortView(GridView::SORT_BY_DATE, true, sortAscending); break; + case xmlAccess::EXTENSION: + gridDataView->sortView(GridView::SORT_BY_EXTENSION, true, sortAscending); + break; } updateGuiGrid(); //refresh gridDataView @@ -2842,6 +2885,9 @@ void MainDialog::OnSortRightGrid(wxGridEvent& event) case xmlAccess::DATE: gridDataView->sortView(GridView::SORT_BY_DATE, false, sortAscending); break; + case xmlAccess::EXTENSION: + gridDataView->sortView(GridView::SORT_BY_EXTENSION, false, sortAscending); + break; } updateGuiGrid(); //refresh gridDataView @@ -3129,7 +3175,7 @@ void MainDialog::updateGridViewData() if (m_staticTextStatusRight->GetLabel() != statusRightNew) m_staticTextStatusRight->SetLabel(statusRightNew); - m_panel7->Layout(); + m_panelStatusBar->Layout(); } @@ -3395,8 +3441,7 @@ void MainDialog::clearAddFolderPairs() //menu events void MainDialog::OnMenuGlobalSettings(wxCommandEvent& event) { - wxDialog* settingsDlg = new GlobalSettingsDlg(this, globalSettings); - settingsDlg->ShowModal(); + FreeFileSync::showGlobalSettingsDlg(globalSettings); //event.Skip(); } @@ -3436,7 +3481,7 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) exportString += wxString(wxT("\"")) + getDescription(SO_OVERWRITE_LEFT) + wxT("\";") + getSymbol(SO_OVERWRITE_LEFT) + wxT('\n'); exportString += wxString(wxT("\"")) + getDescription(SO_OVERWRITE_RIGHT) + wxT("\";") + getSymbol(SO_OVERWRITE_RIGHT) + wxT('\n'); exportString += wxString(wxT("\"")) + getDescription(SO_DO_NOTHING) + wxT("\";") + getSymbol(SO_DO_NOTHING) + wxT('\n'); - exportString += wxString(wxT("\"")) + getDescription(SO_DO_NOTHING) + wxT("\";") + getSymbol(SO_EQUAL) + wxT('\n'); + exportString += wxString(wxT("\"")) + getDescription(SO_EQUAL) + wxT("\";") + getSymbol(SO_EQUAL) + wxT('\n'); exportString += wxString(wxT("\"")) + getDescription(SO_UNRESOLVED_CONFLICT) + wxT("\";") + getSymbol(SO_UNRESOLVED_CONFLICT) + wxT('\n'); } else @@ -3562,15 +3607,13 @@ void MainDialog::OnLayoutWindowAsync(wxIdleEvent& event) void MainDialog::OnMenuAbout(wxCommandEvent& event) { - AboutDlg* aboutDlg = new AboutDlg(this); - aboutDlg->ShowModal(); + FreeFileSync::showAboutDialog(); } - void MainDialog::OnShowHelp(wxCommandEvent& event) { - helpController_.DisplayContents(); +FreeFileSync::displayHelpEntry(); } @@ -3593,7 +3636,7 @@ void MainDialog::switchProgramLanguage(const int langID) cleanUp(); //destructor's code: includes writing settings to HD //create new dialog with respect to new language - MainDialog* frame = new MainDialog(NULL, wxEmptyString, globalSettings, helpController_); + MainDialog* frame = new MainDialog(NULL, wxEmptyString, globalSettings); frame->SetIcon(*GlobalResources::getInstance().programIcon); //set application icon frame->Show(); @@ -3674,3 +3717,5 @@ bool MainDialog::SyncPreview::synchronizationIsEnabled() const + + diff --git a/ui/MainDialog.h b/ui/MainDialog.h index ff9fee09..7c30f8a3 100644 --- a/ui/MainDialog.h +++ b/ui/MainDialog.h @@ -1,10 +1,9 @@ -/*************************************************************** - * Name: mainDialog.h - * Purpose: Main Application Dialog - * Author: ZenJu (zhnmju123@gmx.de) - * Created: 2008-07-16 - **************************************************************/ - +// ************************************************************************** +// * 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 MAINDIALOG_H #define MAINDIALOG_H @@ -14,10 +13,10 @@ #include <memory> #include <map> #include <set> -#include <wx/help.h> +#include "mouseMoveWindow.h" +#include "progressIndicator.h" class CompareStatusHandler; -class CompareStatus; class MainFolderDragDrop; class CustomGrid; class FFSCheckRowsEvent; @@ -81,8 +80,7 @@ class MainDialog : public MainDialogGenerated public: MainDialog(wxFrame* frame, const wxString& cfgFileName, - xmlAccess::XmlGlobalSettings& settings, - wxHelpController& helpController); + xmlAccess::XmlGlobalSettings& settings); ~MainDialog(); @@ -206,7 +204,6 @@ private: bool trySaveConfig(); //return true if saved successfully bool saveOldConfig(); //return false on user abort - void loadConfiguration(const wxString& filename); void OnCfgHistoryKeyEvent( wxKeyEvent& event); void OnRegularUpdateCheck( wxIdleEvent& event); @@ -286,7 +283,7 @@ private: std::stack<wxString> stackObjects; //compare status panel (hidden on start, shown when comparing) - CompareStatus* compareStatus; + CompareStatus compareStatus; //save the last used config filename history std::vector<wxString> cfgFileNames; @@ -301,10 +298,10 @@ private: #ifdef FFS_WIN //update icons periodically: one updater instance for both left and right grids std::auto_ptr<IconUpdater> updateFileIcons; -#endif - //global help controller - wxHelpController& helpController_; + //enable moving window by clicking on sub-windows instead of header line + FreeFileSync::MouseMoveWindow moveWholeWindow; +#endif //encapsulation of handling of sync preview class SyncPreview //encapsulates MainDialog functionality for synchronization preview (friend class) diff --git a/ui/SmallDialogs.cpp b/ui/SmallDialogs.cpp index cab26472..346b0ae6 100644 --- a/ui/SmallDialogs.cpp +++ b/ui/SmallDialogs.cpp @@ -1,25 +1,39 @@ +// ************************************************************************** +// * 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 "guiGenerated.h" #include "smallDialogs.h" +#include "messagePopup.h" #include "../library/resources.h" #include "../algorithm.h" #include "../shared/stringConv.h" #include "util.h" #include "../synchronization.h" -#include <wx/msgdlg.h> #include "../library/customGrid.h" #include "../shared/customButton.h" -#include "../library/statistics.h" #include "../shared/localization.h" -#include "../shared/fileHandling.h" -#include "../library/statusHandler.h" -#include <wx/wupdlock.h> #include "../shared/globalFunctions.h" -#include "trayIcon.h" -#include "../shared/staticAssert.h" #include "../shared/buildInfo.h" +#include <wx/wupdlock.h> +#include <wx/msgdlg.h> using namespace FreeFileSync; +class AboutDlg : public AboutDlgGenerated +{ +public: + AboutDlg(wxWindow* window); + +private: + void OnClose(wxCloseEvent& event); + void OnOK(wxCommandEvent& event); +}; + + AboutDlg::AboutDlg(wxWindow* window) : AboutDlgGenerated(window) { m_bitmap9->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("website"))); @@ -84,9 +98,28 @@ void AboutDlg::OnOK(wxCommandEvent& event) { EndModal(0); } + + +void FreeFileSync::showAboutDialog() +{ + AboutDlg* aboutDlg = new AboutDlg(NULL); + aboutDlg->ShowModal(); + aboutDlg->Destroy(); +} //######################################################################################## +class HelpDlg : public HelpDlgGenerated +{ +public: + HelpDlg(wxWindow* window); + +private: + void OnClose(wxCloseEvent& event); + void OnOK(wxCommandEvent& event); +}; + + HelpDlg::HelpDlg(wxWindow* window) : HelpDlgGenerated(window) { m_notebook1->SetFocus(); @@ -137,7 +170,43 @@ void HelpDlg::OnOK(wxCommandEvent& event) } +void FreeFileSync::showHelpDialog() +{ + HelpDlg* helpDlg = new HelpDlg(NULL); + helpDlg->ShowModal(); + helpDlg->Destroy(); +} //######################################################################################## + + +class FilterDlg : public FilterDlgGenerated +{ +public: + FilterDlg(wxWindow* window, + bool isGlobalFilter, + Zstring& filterIncl, + Zstring& filterExcl, + bool filterActive); + ~FilterDlg() {} + + enum + { + BUTTON_APPLY = 1 + }; + +private: + void OnHelp(wxCommandEvent& event); + void OnDefault(wxCommandEvent& event); + void OnApply(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + void OnClose(wxCloseEvent& event); + + const bool isGlobalFilter_; + Zstring& includeFilter; + Zstring& excludeFilter; +}; + + FilterDlg::FilterDlg(wxWindow* window, bool isGlobalFilter, //global or local filter dialog? Zstring& filterIncl, @@ -227,7 +296,60 @@ void FilterDlg::OnClose(wxCloseEvent& event) } + +DefaultReturnCode::Response FreeFileSync::showFilterDialog(bool isGlobalFilter, + Zstring& filterIncl, + Zstring& filterExcl, + bool filterActive) +{ + DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; + FilterDlg* filterDlg = new FilterDlg(NULL, + isGlobalFilter, //is main filter dialog + filterIncl, + filterExcl, + filterActive); + if (filterDlg->ShowModal() == FilterDlg::BUTTON_APPLY) + rv = DefaultReturnCode::BUTTON_OKAY; + + filterDlg->Destroy(); + return rv; +} //######################################################################################## + + +class DeleteDialog : public DeleteDlgGenerated +{ +public: + DeleteDialog(wxWindow* main, + const std::vector<FreeFileSync::FileSystemObject*>& rowsOnLeft, + const std::vector<FreeFileSync::FileSystemObject*>& rowsOnRight, + bool& deleteOnBothSides, + bool& useRecycleBin, + int& totalDeleteCount); + + enum + { + BUTTON_OKAY = 1, + BUTTON_CANCEL + }; + +private: + void OnOK(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + void OnClose(wxCloseEvent& event); + void OnDelOnBothSides(wxCommandEvent& event); + void OnUseRecycler(wxCommandEvent& event); + + void updateTexts(); + + const std::vector<FreeFileSync::FileSystemObject*>& rowsToDeleteOnLeft; + const std::vector<FreeFileSync::FileSystemObject*>& rowsToDeleteOnRight; + bool& m_deleteOnBothSides; + bool& m_useRecycleBin; + int& totalDelCount; +}; + + DeleteDialog::DeleteDialog(wxWindow* main, const std::vector<FileSystemObject*>& rowsOnLeft, const std::vector<FileSystemObject*>& rowsOnRight, @@ -299,202 +421,60 @@ void DeleteDialog::OnDelOnBothSides(wxCommandEvent& event) void DeleteDialog::OnUseRecycler(wxCommandEvent& event) { - if (m_checkBoxUseRecycler->GetValue()) - { - if (!FreeFileSync::recycleBinExists()) - { - wxMessageBox(_("Unable to initialize Recycle Bin!"), _("Error") , wxOK | wxICON_ERROR); - m_checkBoxUseRecycler->SetValue(false); - } - } - m_useRecycleBin = m_checkBoxUseRecycler->GetValue(); updateTexts(); } -//######################################################################################## - - -ErrorDlg::ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString messageText, bool& ignoreNextErrors) : - ErrorDlgGenerated(parentWindow), - ignoreErrors(ignoreNextErrors) -{ - m_bitmap10->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("error"))); - m_textCtrl8->SetValue(messageText); - m_checkBoxIgnoreErrors->SetValue(ignoreNextErrors); - - if (~activeButtons & BUTTON_IGNORE) - { - m_buttonIgnore->Hide(); - m_checkBoxIgnoreErrors->Hide(); - } - - if (~activeButtons & BUTTON_RETRY) - m_buttonRetry->Hide(); - - if (~activeButtons & BUTTON_ABORT) - m_buttonAbort->Hide(); - - //set button focus precedence - if (activeButtons & BUTTON_RETRY) - m_buttonRetry->SetFocus(); - else if (activeButtons & BUTTON_IGNORE) - m_buttonIgnore->SetFocus(); - else if (activeButtons & BUTTON_ABORT) - m_buttonAbort->SetFocus(); -} - -ErrorDlg::~ErrorDlg() {} - - -void ErrorDlg::OnClose(wxCloseEvent& event) -{ - ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); - EndModal(BUTTON_ABORT); -} - - -void ErrorDlg::OnIgnore(wxCommandEvent& event) -{ - ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); - EndModal(BUTTON_IGNORE); -} - - -void ErrorDlg::OnRetry(wxCommandEvent& event) -{ - ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); - EndModal(BUTTON_RETRY); -} - - -void ErrorDlg::OnAbort(wxCommandEvent& event) -{ - ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); - EndModal(BUTTON_ABORT); -} -//######################################################################################## -WarningDlg::WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool& dontShowDlgAgain) : - WarningDlgGenerated(parentWindow), - dontShowAgain(dontShowDlgAgain) +DefaultReturnCode::Response FreeFileSync::showDeleteDialog(const std::vector<FreeFileSync::FileSystemObject*>& rowsOnLeft, + const std::vector<FreeFileSync::FileSystemObject*>& rowsOnRight, + bool& deleteOnBothSides, + bool& useRecycleBin, + int& totalDeleteCount) { - m_bitmap10->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("warning"))); - m_textCtrl8->SetValue(messageText); - m_checkBoxDontShowAgain->SetValue(dontShowAgain); - - if (~activeButtons & BUTTON_IGNORE) - { - m_buttonIgnore->Hide(); - m_checkBoxDontShowAgain->Hide(); - } - - if (~activeButtons & BUTTON_ABORT) - m_buttonAbort->Hide(); - - //set button focus precedence - if (activeButtons & BUTTON_IGNORE) - m_buttonIgnore->SetFocus(); - else if (activeButtons & BUTTON_ABORT) - m_buttonAbort->SetFocus(); -} - -WarningDlg::~WarningDlg() {} - - -void WarningDlg::OnClose(wxCloseEvent& event) -{ - dontShowAgain = m_checkBoxDontShowAgain->GetValue(); - EndModal(BUTTON_ABORT); -} - - -void WarningDlg::OnIgnore(wxCommandEvent& event) -{ - dontShowAgain = m_checkBoxDontShowAgain->GetValue(); - EndModal(BUTTON_IGNORE); -} + DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; + DeleteDialog* confirmDeletion = new DeleteDialog(NULL, + rowsOnLeft, + rowsOnRight, + deleteOnBothSides, + useRecycleBin, + totalDeleteCount); + if (confirmDeletion->ShowModal() == DeleteDialog::BUTTON_OKAY) + rv = DefaultReturnCode::BUTTON_OKAY; -void WarningDlg::OnAbort(wxCommandEvent& event) -{ - dontShowAgain = m_checkBoxDontShowAgain->GetValue(); - EndModal(BUTTON_ABORT); + confirmDeletion->Destroy(); + return rv; } - //######################################################################################## -QuestionDlg::QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool* dontShowDlgAgain) : - QuestionDlgGenerated(parentWindow), - dontShowAgain(dontShowDlgAgain) +class CustomizeColsDlg : public CustomizeColsDlgGenerated { - m_bitmap10->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("question"))); - m_textCtrl8->SetValue(messageText); - if (dontShowAgain) - m_checkBoxDontAskAgain->SetValue(*dontShowAgain); - else - m_checkBoxDontAskAgain->Hide(); +public: + CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes& attr); - if (~activeButtons & BUTTON_YES) - m_buttonYes->Hide(); - - if (~activeButtons & BUTTON_NO) + enum { - m_buttonNo->Hide(); - m_checkBoxDontAskAgain->Hide(); - } - - if (~activeButtons & BUTTON_CANCEL) - m_buttonCancel->Hide(); - - //set button focus precedence - if (activeButtons & BUTTON_YES) - m_buttonYes->SetFocus(); - else if (activeButtons & BUTTON_CANCEL) - m_buttonCancel->SetFocus(); - else if (activeButtons & BUTTON_NO) - m_buttonNo->SetFocus(); -} - - -void QuestionDlg::OnClose(wxCloseEvent& event) -{ - if (dontShowAgain) - *dontShowAgain = m_checkBoxDontAskAgain->GetValue(); - EndModal(BUTTON_CANCEL); -} - - -void QuestionDlg::OnCancel(wxCommandEvent& event) -{ - if (dontShowAgain) - *dontShowAgain = m_checkBoxDontAskAgain->GetValue(); - EndModal(BUTTON_CANCEL); -} + BUTTON_OKAY = 10 + }; +private: + void OnOkay(wxCommandEvent& event); + void OnDefault(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + void OnClose(wxCloseEvent& event); -void QuestionDlg::OnYes(wxCommandEvent& event) -{ - if (dontShowAgain) - *dontShowAgain = m_checkBoxDontAskAgain->GetValue(); - EndModal(BUTTON_YES); -} - -void QuestionDlg::OnNo(wxCommandEvent& event) -{ - if (dontShowAgain) - *dontShowAgain = m_checkBoxDontAskAgain->GetValue(); - EndModal(BUTTON_NO); -} + void OnMoveUp(wxCommandEvent& event); + void OnMoveDown(wxCommandEvent& event); -//######################################################################################## + xmlAccess::ColumnAttributes& output; +}; -CustomizeColsDlg::CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes& attr, bool& showFileIcons) : +CustomizeColsDlg::CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes& attr) : CustomizeColsDlgGenerated(window), - output(attr), - m_showFileIcons(showFileIcons) + output(attr) { m_bpButton29->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("moveUp"))); m_bpButton30->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("moveDown"))); @@ -509,12 +489,6 @@ CustomizeColsDlg::CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes m_checkListColumns->Check(i - columnSettings.begin(), i->visible); } -#ifdef FFS_LINUX //file icons currently supported on Windows only - m_checkBoxShowFileIcons->Hide(); -#endif - - m_checkBoxShowFileIcons->SetValue(m_showFileIcons); - m_checkListColumns->SetSelection(0); Fit(); } @@ -536,8 +510,6 @@ void CustomizeColsDlg::OnOkay(wxCommandEvent& event) } } - m_showFileIcons = m_checkBoxShowFileIcons->GetValue(); - EndModal(BUTTON_OKAY); } @@ -552,8 +524,6 @@ void CustomizeColsDlg::OnDefault(wxCommandEvent& event) m_checkListColumns->Append(CustomGridRim::getTypeName(i->type)); m_checkListColumns->Check(i - defaultColumnAttr.begin(), i->visible); } - - m_checkBoxShowFileIcons->SetValue(true); } @@ -602,9 +572,44 @@ void CustomizeColsDlg::OnMoveDown(wxCommandEvent& event) } } + +DefaultReturnCode::Response FreeFileSync::showCustomizeColsDlg(xmlAccess::ColumnAttributes& attr) +{ + DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; + + CustomizeColsDlg* customizeDlg = new CustomizeColsDlg(NULL, attr); + if (customizeDlg->ShowModal() == CustomizeColsDlg::BUTTON_OKAY) + rv = DefaultReturnCode::BUTTON_OKAY; + customizeDlg->Destroy(); + + return rv; +} //######################################################################################## +class SyncPreviewDlg : public SyncPreviewDlgGenerated +{ +public: + SyncPreviewDlg(wxWindow* parentWindow, + const wxString& variantName, + const FreeFileSync::SyncStatistics& statistics, + bool& dontShowAgain); + enum + { + BUTTON_START = 1, + BUTTON_CANCEL = 2 + }; + +private: + void OnClose(wxCloseEvent& event); + void OnCancel(wxCommandEvent& event); + void OnStartSync(wxCommandEvent& event); + + bool& m_dontShowAgain; +}; + + + SyncPreviewDlg::SyncPreviewDlg(wxWindow* parentWindow, const wxString& variantName, const FreeFileSync::SyncStatistics& statistics, @@ -658,8 +663,49 @@ void SyncPreviewDlg::OnStartSync(wxCommandEvent& event) } +DefaultReturnCode::Response FreeFileSync::showSyncPreviewDlg( + const wxString& variantName, + const FreeFileSync::SyncStatistics& statistics, + bool& dontShowAgain) +{ + DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; + + SyncPreviewDlg* preview = new SyncPreviewDlg(NULL, + variantName, + statistics, + dontShowAgain); + + if (preview->ShowModal() == SyncPreviewDlg::BUTTON_START) + rv = DefaultReturnCode::BUTTON_OKAY; + + preview->Destroy(); + + return rv; +} //######################################################################################## + +class CompareCfgDialog : public CmpCfgDlgGenerated +{ +public: + CompareCfgDialog(wxWindow* parentWindow, const wxPoint& position, FreeFileSync::CompareVariant& cmpVar); + + enum + { + BUTTON_OKAY = 10 + }; + +private: + void OnClose(wxCloseEvent& event); + void OnCancel(wxCommandEvent& event); + void OnTimeSize(wxCommandEvent& event); + void OnContent(wxCommandEvent& event); + void OnShowHelp(wxCommandEvent& event); + + FreeFileSync::CompareVariant& m_cmpVar; +}; + + CompareCfgDialog::CompareCfgDialog(wxWindow* parentWindow, const wxPoint& position, CompareVariant& cmpVar) : CmpCfgDlgGenerated(parentWindow), m_cmpVar(cmpVar) @@ -719,7 +765,47 @@ void CompareCfgDialog::OnShowHelp(wxCommandEvent& event) } +DefaultReturnCode::Response FreeFileSync::showCompareCfgDialog(const wxPoint& position, CompareVariant& cmpVar) +{ + DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; + + CompareCfgDialog* syncDlg = new CompareCfgDialog(NULL, position, cmpVar); + if (syncDlg->ShowModal() == CompareCfgDialog::BUTTON_OKAY) + rv = DefaultReturnCode::BUTTON_OKAY; + + syncDlg->Destroy(); + + return rv; +} //######################################################################################## + + +class GlobalSettingsDlg : public GlobalSettingsDlgGenerated +{ +public: + GlobalSettingsDlg(wxWindow* window, xmlAccess::XmlGlobalSettings& globalSettings); + + enum + { + BUTTON_OKAY = 10 + }; + +private: + void OnOkay(wxCommandEvent& event); + void OnResetDialogs(wxCommandEvent& event); + void OnDefault(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + void OnClose(wxCloseEvent& event); + void OnAddRow(wxCommandEvent& event); + void OnRemoveRow(wxCommandEvent& event); + + void set(const xmlAccess::ExternalApps& extApp); + xmlAccess::ExternalApps getExtApp(); + + xmlAccess::XmlGlobalSettings& settings; +}; + + GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* window, xmlAccess::XmlGlobalSettings& globalSettings) : GlobalSettingsDlgGenerated(window), settings(globalSettings) @@ -857,541 +943,16 @@ void GlobalSettingsDlg::OnRemoveRow(wxCommandEvent& event) } } -//######################################################################################## - -CompareStatus::CompareStatus(wxWindow* parentWindow) : - CompareStatusGenerated(parentWindow), - scannedObjects(0), - totalObjects(0), - totalData(0), - currentObjects(0), - currentData(0), - scalingFactor(0), - statistics(NULL), - lastStatCallSpeed(-1000000), //some big number - lastStatCallRemTime(-1000000) -{ - init(); -} - - -void CompareStatus::init() -{ - //initialize gauge - m_gauge2->SetRange(50000); - m_gauge2->SetValue(0); - - //initially hide status that's relevant for comparing bytewise only - bSizer42->Hide(sbSizer13); - m_gauge2->Hide(); - bSizer42->Layout(); - - scannedObjects = 0; - currentStatusText.clear(); - - totalObjects = 0; - totalData = 0; - currentObjects = 0; - currentData = 0; - scalingFactor = 0; - - statistics.reset(); - - timeElapsed.Start(); //measure total time - - updateStatusPanelNow(); -} - - -void CompareStatus::switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess) -{ - currentData = 0; - totalData = totalDataToProcess; - - currentObjects = 0; - totalObjects = totalObjectsToProcess; - - if (totalData != 0) - scalingFactor = 50000 / totalData.ToDouble(); //let's normalize to 50000 - else - scalingFactor = 0; - - //set new statistics handler: 10 seconds "window" for remaining time, 5 seconds for speed - statistics.reset(new Statistics(totalObjectsToProcess, totalDataToProcess.ToDouble(), 10000, 5000)); - lastStatCallSpeed = -1000000; //some big number - lastStatCallRemTime = -1000000; - - //show status for comparing bytewise - bSizer42->Show(sbSizer13); - m_gauge2->Show(); - bSizer42->Layout(); -} - - -void CompareStatus::incScannedObjects_NoUpdate(int number) -{ - scannedObjects += number; -} - - -void CompareStatus::incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed) -{ - currentData += dataProcessed; - currentObjects += objectsProcessed; -} - - -void CompareStatus::setStatusText_NoUpdate(const Zstring& text) -{ - currentStatusText = text; -} - - -void CompareStatus::updateStatusPanelNow() -{ - //static RetrieveStatistics statistic; - //statistic.writeEntry(currentData, currentObjects); - { - wxWindowUpdateLocker dummy(this); //reduce display distortion - - bool screenChanged = false; //avoid screen flicker by calling layout() only if necessary - - //remove linebreaks from currentStatusText - wxString formattedStatusText = zToWx(currentStatusText); - for (wxString::iterator i = formattedStatusText.begin(); i != formattedStatusText.end(); ++i) - if (*i == wxChar('\n')) - *i = wxChar(' '); - - //status texts - if (m_textCtrlStatus->GetValue() != formattedStatusText && (screenChanged = true)) //avoid screen flicker - m_textCtrlStatus->SetValue(formattedStatusText); - - //nr of scanned objects - const wxString scannedObjTmp = globalFunctions::numberToWxString(scannedObjects); - if (m_staticTextScanned->GetLabel() != scannedObjTmp && (screenChanged = true)) //avoid screen flicker - m_staticTextScanned->SetLabel(scannedObjTmp); - - //progress indicator for "compare file content" - m_gauge2->SetValue(int(currentData.ToDouble() * scalingFactor)); - - //remaining files left for file comparison - const wxString filesToCompareTmp = globalFunctions::numberToWxString(totalObjects - currentObjects); - if (m_staticTextFilesRemaining->GetLabel() != filesToCompareTmp && (screenChanged = true)) //avoid screen flicker - m_staticTextFilesRemaining->SetLabel(filesToCompareTmp); - - //remaining bytes left for file comparison - const wxString remainingBytesTmp = FreeFileSync::formatFilesizeToShortString(totalData - currentData); - if (m_staticTextDataRemaining->GetLabel() != remainingBytesTmp && (screenChanged = true)) //avoid screen flicker - m_staticTextDataRemaining->SetLabel(remainingBytesTmp); - - if (statistics.get()) - { - if (timeElapsed.Time() - lastStatCallSpeed >= 500) //call method every 500 ms - { - lastStatCallSpeed = timeElapsed.Time(); - - statistics->addMeasurement(currentObjects, currentData.ToDouble()); - - //current speed - const wxString speedTmp = statistics->getBytesPerSecond(); - if (m_staticTextSpeed->GetLabel() != speedTmp && (screenChanged = true)) //avoid screen flicker - m_staticTextSpeed->SetLabel(speedTmp); - - if (timeElapsed.Time() - lastStatCallRemTime >= 2000) //call method every two seconds only - { - lastStatCallRemTime = timeElapsed.Time(); - - //remaining time - const wxString timeRemainingTmp = statistics->getRemainingTime(); - if (m_staticTextTimeRemaining->GetLabel() != timeRemainingTmp && (screenChanged = true)) //avoid screen flicker - m_staticTextTimeRemaining->SetLabel(timeRemainingTmp); - } - } - } - - //time elapsed - const wxString timeElapsedTmp = (wxTimeSpan::Milliseconds(timeElapsed.Time())).Format(); - if (m_staticTextTimeElapsed->GetLabel() != timeElapsedTmp && (screenChanged = true)) //avoid screen flicker - m_staticTextTimeElapsed->SetLabel(timeElapsedTmp); - - //do the ui update - if (screenChanged) - bSizer42->Layout(); - } - updateUiNow(); -} - - -//######################################################################################## - -SyncStatus::SyncStatus(StatusHandler* updater, wxWindow* parentWindow) : - SyncStatusDlgGenerated(parentWindow, - wxID_ANY, - parentWindow ? wxEmptyString : _("FreeFileSync - Folder Comparison and Synchronization"), - wxDefaultPosition, wxSize(638, 376), - parentWindow ? - wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT : - wxDEFAULT_FRAME_STYLE | wxTAB_TRAVERSAL), - processStatusHandler(updater), - mainDialog(parentWindow), - totalObjects(0), - totalData(0), - currentObjects(0), - currentData(0), - scalingFactor(0), - processPaused(false), - currentStatus(SyncStatus::ABORTED), - statistics(NULL), - lastStatCallSpeed(-1000000), //some big number - lastStatCallRemTime(-1000000) -{ - m_animationControl1->SetAnimation(*GlobalResources::getInstance().animationSync); - m_animationControl1->Play(); - - //initialize gauge - m_gauge1->SetRange(50000); - m_gauge1->SetValue(0); - - m_buttonAbort->SetFocus(); - - if (mainDialog) //disable (main) window while this status dialog is shown - mainDialog->Disable(); - - timeElapsed.Start(); //measure total time - - - SetIcon(*GlobalResources::getInstance().programIcon); //set application icon - - //register key event - Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(SyncStatus::OnKeyPressed), NULL, this); - -} - - -SyncStatus::~SyncStatus() -{ - if (mainDialog) - { - mainDialog->Enable(); - mainDialog->Raise(); - mainDialog->SetFocus(); - } - - if (minimizedToSysTray.get()) - minimizedToSysTray->keepHidden(); //avoid window flashing shortly before it is destroyed -} - - -void SyncStatus::OnKeyPressed(wxKeyEvent& event) -{ - const int keyCode = event.GetKeyCode(); - if (keyCode == WXK_ESCAPE) - Close(); //generate close event: do NOT destroy window unconditionally! - - event.Skip(); -} - - -void SyncStatus::resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess) -{ - currentData = 0; - totalData = totalDataToProcess; - - currentObjects = 0; - totalObjects = totalObjectsToProcess; - - if (totalData != 0) - scalingFactor = 50000 / totalData.ToDouble(); //let's normalize to 50000 - else - scalingFactor = 0; - - //set new statistics handler: 10 seconds "window" for remaining time, 5 seconds for speed - statistics.reset(new Statistics(totalObjectsToProcess, totalDataToProcess.ToDouble(), 10000, 5000)); - lastStatCallSpeed = -1000000; //some big number - lastStatCallRemTime = -1000000; -} - - -void SyncStatus::incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed) -{ - currentData += dataProcessed; - currentObjects += objectsProcessed; -} - - -void SyncStatus::setStatusText_NoUpdate(const Zstring& text) -{ - currentStatusText = text; -} - - -void SyncStatus::updateStatusDialogNow() -{ - //static RetrieveStatistics statistic; - //statistic.writeEntry(currentData, currentObjects); - - //write status information systray, too, if window is minimized - if (minimizedToSysTray.get()) - switch (currentStatus) - { - case SCANNING: - minimizedToSysTray->setToolTip(wxString(wxT("FreeFileSync - ")) + wxString(_("Scanning..."))); - //+ wxT(" ") + globalFunctions::numberToWxString(currentObjects)); - break; - case COMPARING_CONTENT: - minimizedToSysTray->setToolTip(wxString(wxT("FreeFileSync - ")) + wxString(_("Comparing content...")) + wxT(" ") + - fromatPercentage(currentData, totalData), currentData.ToDouble() * 100 / totalData.ToDouble()); - break; - case SYNCHRONIZING: - minimizedToSysTray->setToolTip(wxString(wxT("FreeFileSync - ")) + wxString(_("Synchronizing...")) + wxT(" ") + - fromatPercentage(currentData, totalData), currentData.ToDouble() * 100 / totalData.ToDouble()); - break; - case ABORTED: - case FINISHED_WITH_SUCCESS: - case FINISHED_WITH_ERROR: - case PAUSE: - minimizedToSysTray->setToolTip(wxT("FreeFileSync")); - } - - //write regular status information (if dialog is visible or not) - { - wxWindowUpdateLocker dummy(this); //reduce display distortion - - bool screenChanged = false; //avoid screen flicker by calling layout() only if necessary - - //progress indicator - if (currentStatus == SCANNING) - m_gauge1->Pulse(); - else - m_gauge1->SetValue(globalFunctions::round(currentData.ToDouble() * scalingFactor)); - - //status text - const wxString statusTxt = zToWx(currentStatusText); - if (m_textCtrlInfo->GetValue() != statusTxt && (screenChanged = true)) //avoid screen flicker - m_textCtrlInfo->SetValue(statusTxt); - - //remaining objects - const wxString remainingObjTmp = globalFunctions::numberToWxString(totalObjects - currentObjects); - if (m_staticTextRemainingObj->GetLabel() != remainingObjTmp && (screenChanged = true)) //avoid screen flicker - m_staticTextRemainingObj->SetLabel(remainingObjTmp); - - //remaining bytes left for copy - const wxString remainingBytesTmp = FreeFileSync::formatFilesizeToShortString(totalData - currentData); - if (m_staticTextDataRemaining->GetLabel() != remainingBytesTmp && (screenChanged = true)) //avoid screen flicker - m_staticTextDataRemaining->SetLabel(remainingBytesTmp); - - if (statistics.get()) - { - if (timeElapsed.Time() - lastStatCallSpeed >= 500) //call method every 500 ms - { - lastStatCallSpeed = timeElapsed.Time(); - - statistics->addMeasurement(currentObjects, currentData.ToDouble()); - - //current speed - const wxString speedTmp = statistics->getBytesPerSecond(); - if (m_staticTextSpeed->GetLabel() != speedTmp && (screenChanged = true)) //avoid screen flicker - m_staticTextSpeed->SetLabel(speedTmp); - - if (timeElapsed.Time() - lastStatCallRemTime >= 2000) //call method every two seconds only - { - lastStatCallRemTime = timeElapsed.Time(); - - //remaining time - const wxString timeRemainingTmp = statistics->getRemainingTime(); - if (m_staticTextTimeRemaining->GetLabel() != timeRemainingTmp && (screenChanged = true)) //avoid screen flicker - m_staticTextTimeRemaining->SetLabel(timeRemainingTmp); - } - } - } - - //time elapsed - const wxString timeElapsedTmp = wxTimeSpan::Milliseconds(timeElapsed.Time()).Format(); - if (m_staticTextTimeElapsed->GetLabel() != timeElapsedTmp && (screenChanged = true)) //avoid screen flicker - m_staticTextTimeElapsed->SetLabel(timeElapsedTmp); - - - //do the ui update - if (screenChanged) - { - bSizer28->Layout(); - bSizer31->Layout(); - } - } - updateUiNow(); - -//support for pause button - while (processPaused && currentProcessIsRunning()) - { - wxMilliSleep(UI_UPDATE_INTERVAL); - updateUiNow(); - } -} - -bool SyncStatus::currentProcessIsRunning() +DefaultReturnCode::Response FreeFileSync::showGlobalSettingsDlg(xmlAccess::XmlGlobalSettings& globalSettings) { - return processStatusHandler != NULL; -} + DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; + wxDialog* settingsDlg = new GlobalSettingsDlg(NULL, globalSettings); + if (settingsDlg->ShowModal() == GlobalSettingsDlg::BUTTON_OKAY) + rv = DefaultReturnCode::BUTTON_OKAY; -void SyncStatus::setCurrentStatus(SyncStatusID id) -{ - switch (id) - { - case ABORTED: - m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusError"))); - m_staticTextStatus->SetLabel(_("Aborted")); - break; - - case FINISHED_WITH_SUCCESS: - m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusSuccess"))); - m_staticTextStatus->SetLabel(_("Completed")); - break; - - case FINISHED_WITH_ERROR: - m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusWarning"))); - m_staticTextStatus->SetLabel(_("Completed")); - break; - - case PAUSE: - m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusPause"))); - m_staticTextStatus->SetLabel(_("Paused")); - break; - - case SCANNING: - m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusScanning"))); - m_staticTextStatus->SetLabel(_("Scanning...")); - break; + settingsDlg->Destroy(); - case COMPARING_CONTENT: - m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusBinaryCompare"))); - m_staticTextStatus->SetLabel(_("Comparing content...")); - break; - - case SYNCHRONIZING: - m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusSyncing"))); - m_staticTextStatus->SetLabel(_("Synchronizing...")); - break; - } - - currentStatus = id; - Layout(); + return rv; } - - -void SyncStatus::processHasFinished(SyncStatusID id, const wxString& finalMessage) //essential to call this in StatusHandler derived class destructor -{ - //at the LATEST(!) to prevent access to currentStatusHandler - //enable okay and close events; may be set in this method ONLY - - processStatusHandler = NULL; //avoid callback to (maybe) deleted parent process - - setCurrentStatus(id); - - resumeFromSystray(); //if in tray mode... - - m_buttonAbort->Disable(); - m_buttonAbort->Hide(); - m_buttonPause->Disable(); - m_buttonPause->Hide(); - m_buttonOK->Show(); - m_buttonOK->SetFocus(); - - m_animationControl1->Stop(); - m_animationControl1->Hide(); - - bSizerSpeed->Show(false); - bSizerRemTime->Show(false); - - updateStatusDialogNow(); //keep this sequence to avoid display distortion, if e.g. only 1 item is sync'ed - m_textCtrlInfo->SetValue(finalMessage); - Layout(); // -} - - -void SyncStatus::OnOkay(wxCommandEvent& event) -{ - if (!currentProcessIsRunning()) Destroy(); -} - - -void SyncStatus::OnPause(wxCommandEvent& event) -{ - static SyncStatusID previousStatus = SyncStatus::ABORTED; - - if (processPaused) - { - setCurrentStatus(previousStatus); - processPaused = false; - m_buttonPause->SetLabel(_("Pause")); - m_animationControl1->Play(); - - //resume timers - timeElapsed.Resume(); - if (statistics.get()) - statistics->resumeTimer(); - } - else - { - previousStatus = currentStatus; //save current status - - setCurrentStatus(SyncStatus::PAUSE); - processPaused = true; - m_buttonPause->SetLabel(_("Continue")); - m_animationControl1->Stop(); - - //pause timers - timeElapsed.Pause(); - if (statistics.get()) - statistics->pauseTimer(); - } -} - - -void SyncStatus::OnAbort(wxCommandEvent& event) -{ - processPaused = false; - if (currentProcessIsRunning()) - { - m_buttonAbort->Disable(); - m_buttonAbort->Hide(); - m_buttonPause->Disable(); - m_buttonPause->Hide(); - - setStatusText_NoUpdate(wxToZ(_("Abort requested: Waiting for current operation to finish..."))); - //no Layout() or UI-update here to avoid cascaded Yield()-call - - processStatusHandler->requestAbortion(); - } -} - - -void SyncStatus::OnClose(wxCloseEvent& event) -{ - processPaused = false; - if (processStatusHandler) - processStatusHandler->requestAbortion(); - else - Destroy(); -} - - -void SyncStatus::OnIconize(wxIconizeEvent& event) -{ - if (event.Iconized()) //ATTENTION: iconize event is also triggered on "Restore"! (at least under Linux) - minimizeToTray(); -} - - -void SyncStatus::minimizeToTray() -{ - minimizedToSysTray.reset(new MinimizeToTray(this, mainDialog)); -} - - -void SyncStatus::resumeFromSystray() -{ - minimizedToSysTray.reset(); -} - diff --git a/ui/SmallDialogs.h b/ui/SmallDialogs.h index 22a271c9..73e4d13a 100644 --- a/ui/SmallDialogs.h +++ b/ui/SmallDialogs.h @@ -1,365 +1,57 @@ +// ************************************************************************** +// * 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 SMALLDIALOGS_H_INCLUDED #define SMALLDIALOGS_H_INCLUDED #include "../fileHierarchy.h" #include "../library/processXml.h" -#include "guiGenerated.h" -#include <wx/stopwatch.h> -#include <memory> - -class Statistics; -class StatusHandler; -class MinimizeToTray; namespace FreeFileSync { class SyncStatistics; -} - - -class AboutDlg : public AboutDlgGenerated -{ -public: - AboutDlg(wxWindow* window); - ~AboutDlg() {} - -private: - void OnClose(wxCloseEvent& event); - void OnOK(wxCommandEvent& event); -}; -class HelpDlg : public HelpDlgGenerated +struct DefaultReturnCode { -public: - HelpDlg(wxWindow* window); - -private: - void OnClose(wxCloseEvent& event); - void OnOK(wxCommandEvent& event); -}; - - -class FilterDlg : public FilterDlgGenerated -{ -public: - FilterDlg(wxWindow* window, - bool isGlobalFilter, - Zstring& filterIncl, - Zstring& filterExcl, - bool filterActive); - ~FilterDlg() {} - - enum - { - BUTTON_APPLY = 1 - }; - -private: - void OnHelp(wxCommandEvent& event); - void OnDefault(wxCommandEvent& event); - void OnApply(wxCommandEvent& event); - void OnCancel(wxCommandEvent& event); - void OnClose(wxCloseEvent& event); - - const bool isGlobalFilter_; - Zstring& includeFilter; - Zstring& excludeFilter; -}; - - -class DeleteDialog : public DeleteDlgGenerated -{ -public: - DeleteDialog(wxWindow* main, - const std::vector<FreeFileSync::FileSystemObject*>& rowsOnLeft, - const std::vector<FreeFileSync::FileSystemObject*>& rowsOnRight, - bool& deleteOnBothSides, - bool& useRecycleBin, - int& totalDeleteCount); - - ~DeleteDialog() {} - - enum - { - BUTTON_OKAY = 1, - BUTTON_CANCEL - }; - -private: - void OnOK(wxCommandEvent& event); - void OnCancel(wxCommandEvent& event); - void OnClose(wxCloseEvent& event); - void OnDelOnBothSides(wxCommandEvent& event); - void OnUseRecycler(wxCommandEvent& event); - - void updateTexts(); - - const std::vector<FreeFileSync::FileSystemObject*>& rowsToDeleteOnLeft; - const std::vector<FreeFileSync::FileSystemObject*>& rowsToDeleteOnRight; - bool& m_deleteOnBothSides; - bool& m_useRecycleBin; - int& totalDelCount; -}; - - -class ErrorDlg : public ErrorDlgGenerated -{ -public: - ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString messageText, bool& ignoreNextErrors); - ~ErrorDlg(); - - enum ReturnCodes - { - BUTTON_IGNORE = 1, - BUTTON_RETRY = 2, - BUTTON_ABORT = 4 - }; - -private: - void OnClose(wxCloseEvent& event); - void OnIgnore(wxCommandEvent& event); - void OnRetry(wxCommandEvent& event); - void OnAbort(wxCommandEvent& event); - - bool& ignoreErrors; -}; - - -class WarningDlg : public WarningDlgGenerated -{ -public: - WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool& dontShowAgain); - ~WarningDlg(); - enum Response { - BUTTON_IGNORE = 1, - BUTTON_ABORT = 2 - }; - -private: - void OnClose(wxCloseEvent& event); - void OnIgnore(wxCommandEvent& event); - void OnResolve(wxCommandEvent& event); - void OnAbort(wxCommandEvent& event); - void OnOkay(wxCommandEvent& event); - - bool& dontShowAgain; -}; - - -class QuestionDlg : public QuestionDlgGenerated -{ -public: - QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool* dontShowAgain = NULL); - - enum - { - BUTTON_YES = 1, - BUTTON_NO = 2, - BUTTON_CANCEL = 4 - }; - -private: - void OnClose(wxCloseEvent& event); - void OnCancel(wxCommandEvent& event); - void OnYes(wxCommandEvent& event); - void OnNo(wxCommandEvent& event); - - bool* dontShowAgain; //optional -}; - - -class CustomizeColsDlg : public CustomizeColsDlgGenerated -{ -public: - CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes& attr, bool& showFileIcons); - - enum - { - BUTTON_OKAY = 10 - }; - -private: - void OnOkay(wxCommandEvent& event); - void OnDefault(wxCommandEvent& event); - void OnCancel(wxCommandEvent& event); - void OnClose(wxCloseEvent& event); - - void OnMoveUp(wxCommandEvent& event); - void OnMoveDown(wxCommandEvent& event); - - xmlAccess::ColumnAttributes& output; - bool& m_showFileIcons; -}; - - -class SyncPreviewDlg : public SyncPreviewDlgGenerated -{ -public: - SyncPreviewDlg(wxWindow* parentWindow, - const wxString& variantName, - const FreeFileSync::SyncStatistics& statistics, - bool& dontShowAgain); - - enum - { - BUTTON_START = 1, - BUTTON_CANCEL = 2 - }; - -private: - void OnClose(wxCloseEvent& event); - void OnCancel(wxCommandEvent& event); - void OnStartSync(wxCommandEvent& event); - - bool& m_dontShowAgain; -}; - - -class CompareCfgDialog : public CmpCfgDlgGenerated -{ -public: - CompareCfgDialog(wxWindow* parentWindow, const wxPoint& position, FreeFileSync::CompareVariant& cmpVar); - - enum - { - BUTTON_OKAY = 10 - }; - -private: - void OnClose(wxCloseEvent& event); - void OnCancel(wxCommandEvent& event); - void OnTimeSize(wxCommandEvent& event); - void OnContent(wxCommandEvent& event); - void OnShowHelp(wxCommandEvent& event); - - FreeFileSync::CompareVariant& m_cmpVar; -}; - - -class GlobalSettingsDlg : public GlobalSettingsDlgGenerated -{ -public: - GlobalSettingsDlg(wxWindow* window, xmlAccess::XmlGlobalSettings& globalSettings); - ~GlobalSettingsDlg() {} - - enum - { - BUTTON_OKAY = 10 + BUTTON_OKAY, + BUTTON_CANCEL }; - -private: - void OnOkay(wxCommandEvent& event); - void OnResetDialogs(wxCommandEvent& event); - void OnDefault(wxCommandEvent& event); - void OnCancel(wxCommandEvent& event); - void OnClose(wxCloseEvent& event); - void OnAddRow(wxCommandEvent& event); - void OnRemoveRow(wxCommandEvent& event); - - void set(const xmlAccess::ExternalApps& extApp); - xmlAccess::ExternalApps getExtApp(); - - xmlAccess::XmlGlobalSettings& settings; -}; - - -class CompareStatus : public CompareStatusGenerated -{ -public: - CompareStatus(wxWindow* parentWindow); - - void init(); //initialize all status values - - void switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess); - void incScannedObjects_NoUpdate(int number); - void incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed); - void setStatusText_NoUpdate(const Zstring& text); - void updateStatusPanelNow(); - -private: - //status variables - unsigned int scannedObjects; - Zstring currentStatusText; - - wxStopWatch timeElapsed; - - //gauge variables - int totalObjects; - wxLongLong totalData; //each data element represents one byte for proper progress indicator scaling - int currentObjects; //each object represents a file or directory processed - wxLongLong currentData; - double scalingFactor; //nr of elements has to be normalized to smaller nr. because of range of int limitation - - //remaining time - std::auto_ptr<Statistics> statistics; - long lastStatCallSpeed; //used for calculating intervals between statistics update - long lastStatCallRemTime; // }; +void showAboutDialog(); -class SyncStatus : public SyncStatusDlgGenerated -{ -public: - SyncStatus(StatusHandler* updater, wxWindow* parentWindow); - ~SyncStatus(); - - enum SyncStatusID - { - ABORTED, - FINISHED_WITH_SUCCESS, - FINISHED_WITH_ERROR, - PAUSE, - SCANNING, - COMPARING_CONTENT, - SYNCHRONIZING - }; - - void resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess); - void incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed); - void setStatusText_NoUpdate(const Zstring& text); - void updateStatusDialogNow(); - - void setCurrentStatus(SyncStatusID id); - void processHasFinished(SyncStatusID id, const wxString& finalMessage); //essential to call this in StatusUpdater derived class destructor at the LATEST(!) to prevent access to currentStatusUpdater +void showHelpDialog(); - void minimizeToTray(); +DefaultReturnCode::Response showFilterDialog(bool isGlobalFilter, + Zstring& filterIncl, + Zstring& filterExcl, + bool filterActive); -private: - void OnKeyPressed(wxKeyEvent& event); - virtual void OnOkay(wxCommandEvent& event); - virtual void OnPause(wxCommandEvent& event); - virtual void OnAbort(wxCommandEvent& event); - virtual void OnClose(wxCloseEvent& event); - virtual void OnIconize(wxIconizeEvent& event); +DefaultReturnCode::Response showDeleteDialog( + const std::vector<FileSystemObject*>& rowsOnLeft, + const std::vector<FileSystemObject*>& rowsOnRight, + bool& deleteOnBothSides, + bool& useRecycleBin, + int& totalDeleteCount); - void resumeFromSystray(); - bool currentProcessIsRunning(); +DefaultReturnCode::Response showCustomizeColsDlg(xmlAccess::ColumnAttributes& attr); - wxStopWatch timeElapsed; +DefaultReturnCode::Response showSyncPreviewDlg( + const wxString& variantName, + const SyncStatistics& statistics, + bool& dontShowAgain); - StatusHandler* processStatusHandler; - wxWindow* mainDialog; +DefaultReturnCode::Response showCompareCfgDialog(const wxPoint& position, CompareVariant& cmpVar); - //gauge variables - int totalObjects; - wxLongLong totalData; - int currentObjects; //each object represents a file or directory processed - wxLongLong currentData; //each data element represents one byte for proper progress indicator scaling - double scalingFactor; //nr of elements has to be normalized to smaller nr. because of range of int limitation - - Zstring currentStatusText; - bool processPaused; - SyncStatusID currentStatus; +DefaultReturnCode::Response showGlobalSettingsDlg(xmlAccess::XmlGlobalSettings& globalSettings); +} - //remaining time - std::auto_ptr<Statistics> statistics; - long lastStatCallSpeed; //used for calculating intervals between statistics update - long lastStatCallRemTime; // +#endif // SMALLDIALOGS_H_INCLUDED - boost::shared_ptr<MinimizeToTray> minimizedToSysTray; //optional: if filled, hides all visible windows, shows again if destroyed -}; -#endif // SMALLDIALOGS_H_INCLUDED diff --git a/ui/appMain.h b/ui/appMain.h deleted file mode 100644 index 2922d093..00000000 --- a/ui/appMain.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef APPMAIN_H_INCLUDED -#define APPMAIN_H_INCLUDED - -#include <wx/app.h> - -namespace FreeFileSync -{ -class AppMainWindow -{ -public: - static void setMainWindow(wxWindow* window); - static bool mainWindowActive(); - -private: - static bool mainWndAct; -}; -} - - -#endif // APPMAIN_H_INCLUDED diff --git a/ui/batchStatusHandler.cpp b/ui/batchStatusHandler.cpp index 793f18fd..f6e59924 100644 --- a/ui/batchStatusHandler.cpp +++ b/ui/batchStatusHandler.cpp @@ -1,5 +1,12 @@ +// ************************************************************************** +// * 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 "batchStatusHandler.h" -#include "smallDialogs.h" +//#include "smallDialogs.h" +#include "messagePopup.h" #include <wx/ffile.h> #include <wx/msgdlg.h> #include "../shared/standardPaths.h" @@ -14,9 +21,9 @@ using namespace FreeFileSync; class LogFile { public: - LogFile(const wxString& logfileDirectory) //throw (FileError&) + LogFile(const wxString& logfileDirectory, const wxString& batchFilename) //throw (FileError&) { - const wxString logfileName = findUniqueLogname(logfileDirectory); + const wxString logfileName = findUniqueLogname(logfileDirectory, batchFilename); logFile.Open(logfileName, wxT("w")); if (!logFile.IsOpened()) @@ -42,8 +49,8 @@ public: void writeLog(const ErrorLogging& log) { //write actual logfile - const std::vector<wxString>& messages = log.getFormattedMessages(); - for (std::vector<wxString>::const_iterator i = messages.begin(); i != messages.end(); ++i) + const ErrorLogging::MessageEntry& messages = log.getFormattedMessages(); + for (ErrorLogging::MessageEntry::const_iterator i = messages.begin(); i != messages.end(); ++i) logFile.Write(*i + wxChar('\n')); } @@ -58,13 +65,23 @@ public: } private: - static wxString findUniqueLogname(const wxString& logfileDirectory) + static wxString extractJobName(const wxString& batchFilename) + { + using namespace globalFunctions; + + const wxString shortName = batchFilename.AfterLast(FILE_NAME_SEPARATOR); //returns the whole string if seperator not found + const wxString jobName = shortName.BeforeLast(wxChar('.')); //returns empty string if seperator not found + return jobName.IsEmpty() ? shortName : jobName; + } + + + static wxString findUniqueLogname(const wxString& logfileDirectory, const wxString& batchFilename) { using namespace globalFunctions; //create logfile directory Zstring logfileDir = logfileDirectory.empty() ? - wxToZ(FreeFileSync::getDefaultLogDirectory()) : + wxToZ(FreeFileSync::getConfigDir() + wxT("Logs")) : FreeFileSync::getFormattedDirectoryName(wxToZ(logfileDirectory)); if (!FreeFileSync::dirExists(logfileDir)) @@ -76,6 +93,10 @@ private: wxString logfileName = zToWx(logfileDir); + //add prefix + logfileName += extractJobName(batchFilename) + wxT(" "); + + //add timestamp wxString timeNow = wxDateTime::Now().FormatISOTime(); timeNow.Replace(wxT(":"), wxT("-")); logfileName += wxDateTime::Now().FormatISODate() + wxChar(' ') + timeNow; @@ -103,19 +124,21 @@ private: //############################################################################################################################## BatchStatusHandler::BatchStatusHandler(bool runSilent, + const wxString& batchFilename, const wxString* logfileDirectory, const xmlAccess::OnError handleError, int& returnVal) : exitWhenFinished(runSilent), //=> exit immediately when finished handleError_(handleError), currentProcess(StatusHandler::PROCESS_NONE), - returnValue(returnVal) + returnValue(returnVal), + syncStatusFrame(*this, NULL, runSilent) { if (logfileDirectory) { try { - logFile.reset(new LogFile(*logfileDirectory)); + logFile.reset(new LogFile(*logfileDirectory, batchFilename)); } catch (FreeFileSync::FileError& error) { @@ -126,12 +149,6 @@ BatchStatusHandler::BatchStatusHandler(bool runSilent, } assert(runSilent || handleError != xmlAccess::ON_ERROR_EXIT); //shouldn't be selectable from GUI settings - - syncStatusFrame = new SyncStatus(this, NULL); - if (runSilent) - syncStatusFrame->minimizeToTray(); - else - syncStatusFrame->Show(); } @@ -159,7 +176,7 @@ BatchStatusHandler::~BatchStatusHandler() logFile->writeLog(errorLog); //decide whether to stay on status screen or exit immediately... - if (!exitWhenFinished || syncStatusFrame->IsShown()) //warning: wxWindow::Show() is called within processHasFinished()! + if (!exitWhenFinished || syncStatusFrame.getAsWindow()->IsShown()) //warning: wxWindow::Show() is called within processHasFinished()! { //print the results list: GUI wxString finalMessage; @@ -170,36 +187,36 @@ BatchStatusHandler::~BatchStatusHandler() finalMessage += header + wxT("\n\n"); } - const std::vector<wxString>& messages = errorLog.getFormattedMessages(); - for (std::vector<wxString>::const_iterator i = messages.begin(); i != messages.end(); ++i) + const ErrorLogging::MessageEntry& messages = errorLog.getFormattedMessages(); + for (ErrorLogging::MessageEntry::const_iterator i = messages.begin(); i != messages.end(); ++i) { finalMessage += *i; - finalMessage += wxChar('\n'); + finalMessage += wxT("\n\n"); } //notify about (logical) application main window => program won't quit, but stay on this dialog - FreeFileSync::AppMainWindow::setMainWindow(syncStatusFrame); + FreeFileSync::AppMainWindow::setMainWindow(syncStatusFrame.getAsWindow()); //notify to syncStatusFrame that current process has ended if (abortIsRequested()) - syncStatusFrame->processHasFinished(SyncStatus::ABORTED, finalMessage); //enable okay and close events - else if (errorLog.errorsTotal()) - syncStatusFrame->processHasFinished(SyncStatus::FINISHED_WITH_ERROR, finalMessage); + syncStatusFrame.processHasFinished(SyncStatus::ABORTED, finalMessage); //enable okay and close events + else if (totalErrors) + syncStatusFrame.processHasFinished(SyncStatus::FINISHED_WITH_ERROR, finalMessage); else - syncStatusFrame->processHasFinished(SyncStatus::FINISHED_WITH_SUCCESS, finalMessage); + syncStatusFrame.processHasFinished(SyncStatus::FINISHED_WITH_SUCCESS, finalMessage); } else - syncStatusFrame->Destroy(); //syncStatusFrame is not main window => program will quit directly + syncStatusFrame.closeWindowDirectly(); //syncStatusFrame is main window => program will quit directly } inline void BatchStatusHandler::updateStatusText(const Zstring& text) { - if (currentProcess == StatusHandler::PROCESS_SYNCHRONIZING && logFile.get()) //write file transfer information to logfile + if (currentProcess == StatusHandler::PROCESS_SYNCHRONIZING && logFile.get()) //write file transfer information to log errorLog.logInfo(zToWx(text)); - syncStatusFrame->setStatusText_NoUpdate(text); + syncStatusFrame.setStatusText_NoUpdate(text); } @@ -210,16 +227,16 @@ void BatchStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal, switch (currentProcess) { case StatusHandler::PROCESS_SCANNING: - syncStatusFrame->resetGauge(0, 0); //dummy call to initialize some gui elements (remaining time, speed) - syncStatusFrame->setCurrentStatus(SyncStatus::SCANNING); + syncStatusFrame.resetGauge(0, 0); //dummy call to initialize some gui elements (remaining time, speed) + syncStatusFrame.setCurrentStatus(SyncStatus::SCANNING); break; case StatusHandler::PROCESS_COMPARING_CONTENT: - syncStatusFrame->resetGauge(objectsTotal, dataTotal); - syncStatusFrame->setCurrentStatus(SyncStatus::COMPARING_CONTENT); + syncStatusFrame.resetGauge(objectsTotal, dataTotal); + syncStatusFrame.setCurrentStatus(SyncStatus::COMPARING_CONTENT); break; case StatusHandler::PROCESS_SYNCHRONIZING: - syncStatusFrame->resetGauge(objectsTotal, dataTotal); - syncStatusFrame->setCurrentStatus(SyncStatus::SYNCHRONIZING); + syncStatusFrame.resetGauge(objectsTotal, dataTotal); + syncStatusFrame.setCurrentStatus(SyncStatus::SYNCHRONIZING); break; case StatusHandler::PROCESS_NONE: assert(false); @@ -237,7 +254,7 @@ void BatchStatusHandler::updateProcessedData(int objectsProcessed, wxLongLong da break; case StatusHandler::PROCESS_COMPARING_CONTENT: case StatusHandler::PROCESS_SYNCHRONIZING: - syncStatusFrame->incProgressIndicator_NoUpdate(objectsProcessed, dataProcessed); + syncStatusFrame.incProgressIndicator_NoUpdate(objectsProcessed, dataProcessed); break; case StatusHandler::PROCESS_NONE: assert(false); @@ -353,7 +370,7 @@ void BatchStatusHandler::reportFatalError(const wxString& errorMessage) inline void BatchStatusHandler::forceUiRefresh() { - syncStatusFrame->updateStatusDialogNow(); + syncStatusFrame.updateStatusDialogNow(); } diff --git a/ui/batchStatusHandler.h b/ui/batchStatusHandler.h index e4d0cae2..b2ef125b 100644 --- a/ui/batchStatusHandler.h +++ b/ui/batchStatusHandler.h @@ -1,9 +1,16 @@ +// ************************************************************************** +// * 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 BATCHSTATUSHANDLER_H_INCLUDED #define BATCHSTATUSHANDLER_H_INCLUDED #include "../library/statusHandler.h" #include "../library/processXml.h" #include "../library/errorLogging.h" +#include "progressIndicator.h" class LogFile; class SyncStatus; @@ -13,6 +20,7 @@ class BatchStatusHandler : public StatusHandler { public: BatchStatusHandler(bool runSilent, //defines: -start minimized and -quit immediately when finished + const wxString& batchFilename, const wxString* logfileDirectory, //optional: enable logging if available const xmlAccess::OnError handleError, int& returnVal); @@ -37,7 +45,7 @@ private: Process currentProcess; int& returnValue; - SyncStatus* syncStatusFrame; + SyncStatus syncStatusFrame; //the window managed by SyncStatus has longer lifetime than this handler! boost::shared_ptr<LogFile> logFile; //optional! }; diff --git a/ui/checkVersion.cpp b/ui/checkVersion.cpp index 9ecb8876..7a509204 100644 --- a/ui/checkVersion.cpp +++ b/ui/checkVersion.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "checkVersion.h" #include <wx/msgdlg.h> #include <wx/protocol/http.h> @@ -6,7 +12,9 @@ #include <wx/utils.h> #include <wx/timer.h> #include "../shared/globalFunctions.h" -#include "smallDialogs.h" +//#include "smallDialogs.h" +#include "messagePopup.h" +#include "../shared/standardPaths.h" class CloseConnectionOnExit @@ -108,6 +116,11 @@ void FreeFileSync::checkForUpdateNow() void FreeFileSync::checkForUpdatePeriodically(long& lastUpdateCheck) { +#ifdef FFS_LINUX + if (!FreeFileSync::isPortableVersion()) //don't check for updates in installer version -> else: handled by .deb + return; +#endif + if (lastUpdateCheck != -1) { if (lastUpdateCheck == 0) @@ -120,7 +133,7 @@ void FreeFileSync::checkForUpdatePeriodically(long& lastUpdateCheck) const bool checkRegularly = messageDlg->ShowModal() == QuestionDlg::BUTTON_YES; messageDlg->Destroy(); if (checkRegularly) - { + { lastUpdateCheck = 123; //some old date (few seconds after 1970) checkForUpdatePeriodically(lastUpdateCheck); //check for updates now diff --git a/ui/checkVersion.h b/ui/checkVersion.h index b7f7f2ee..5aeaeb3a 100644 --- a/ui/checkVersion.h +++ b/ui/checkVersion.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 UPDATEVERSION_H_INCLUDED #define UPDATEVERSION_H_INCLUDED diff --git a/ui/folderPair.h b/ui/folderPair.h index a67e5078..d20dde76 100644 --- a/ui/folderPair.h +++ b/ui/folderPair.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 FOLDERPAIR_H_INCLUDED #define FOLDERPAIR_H_INCLUDED @@ -62,7 +68,7 @@ public: { basicPanel_.m_bpButtonAltSyncCfg->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("syncConfigSmall"))); basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(wxString(_("Select alternate synchronization settings")) + wxT(" ") + globalFunctions::LINE_BREAK + - wxT("(") + altSyncConfig->syncConfiguration.getVariantName() + wxT(")")); + wxT("(") + getVariantName(altSyncConfig->syncConfiguration) + wxT(")")); } else { @@ -123,21 +129,31 @@ protected: private: void OnLocalFilterCfgRemove(wxCommandEvent& event) { + const int menuId = 1234; contextMenu.reset(new wxMenu); //re-create context menu - contextMenu->Append(wxID_ANY, _("Remove local filter settings")); + contextMenu->Append(menuId, _("Remove local filter settings")); contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfgRemoveConfirm), NULL, this); + + if (NameFilter(localFilter.includeFilter, localFilter.excludeFilter).isNull()) + contextMenu->Enable(menuId, false); //disable menu item, if clicking wouldn't make sense anyway + basicPanel_.PopupMenu(contextMenu.get()); //show context menu } void OnAltSyncCfgRemove(wxCommandEvent& event) { + const int menuId = 1234; contextMenu.reset(new wxMenu); //re-create context menu - contextMenu->Append(wxID_ANY, _("Remove alternate settings")); + contextMenu->Append(menuId, _("Remove alternate settings")); contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(FolderPairPanelBasic::OnAltSyncCfgRemoveConfirm), NULL, this); + + if (!altSyncConfig.get()) + contextMenu->Enable(menuId, false); //disable menu item, if clicking wouldn't make sense anyway + basicPanel_.PopupMenu(contextMenu.get()); //show context menu } - virtual MainConfiguration getMainConfig() const = 0; + virtual MainConfiguration getMainConfig() const = 0; virtual wxWindow* getParentWindow() = 0; virtual void OnAltSyncCfgChange() {}; @@ -170,12 +186,11 @@ private: void OnLocalFilterCfg(wxCommandEvent& event) { FilterConfig localFiltTmp = localFilter; - FilterDlg* filterDlg = new FilterDlg(getParentWindow(), - false, //is local filter dialog - localFiltTmp.includeFilter, - localFiltTmp.excludeFilter, - getMainConfig().filterIsActive); - if (filterDlg->ShowModal() == FilterDlg::BUTTON_APPLY) + + if (showFilterDialog(false, //is local filter dialog + localFiltTmp.includeFilter, + localFiltTmp.excludeFilter, + getMainConfig().filterIsActive) == DefaultReturnCode::BUTTON_OKAY) { localFilter = localFiltTmp; refreshButtons(); diff --git a/ui/gridView.cpp b/ui/gridView.cpp index 9b841e56..585296a9 100644 --- a/ui/gridView.cpp +++ b/ui/gridView.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "gridView.h" #include "sorting.h" #include "../synchronization.h" @@ -92,11 +98,11 @@ GridView::StatusCmpResult GridView::updateCmpResult(bool hideFiltered, //maps so } else { - if (!fsObj->isEmpty<LEFT_SIDE>()) - ++output.foldersOnLeftView; + if (!fsObj->isEmpty<LEFT_SIDE>()) + ++output.foldersOnLeftView; - if (!fsObj->isEmpty<RIGHT_SIDE>()) - ++output.foldersOnRightView; + if (!fsObj->isEmpty<RIGHT_SIDE>()) + ++output.foldersOnRightView; } viewRef.push_back(*j); @@ -206,11 +212,11 @@ GridView::StatusSyncPreview GridView::updateSyncPreview(bool hideFiltered, //map } else { - if (!fsObj->isEmpty<LEFT_SIDE>()) - ++output.foldersOnLeftView; + if (!fsObj->isEmpty<LEFT_SIDE>()) + ++output.foldersOnLeftView; - if (!fsObj->isEmpty<RIGHT_SIDE>()) - ++output.foldersOnRightView; + if (!fsObj->isEmpty<RIGHT_SIDE>()) + ++output.foldersOnRightView; } viewRef.push_back(*j); @@ -416,6 +422,28 @@ private: }; +template <bool ascending, FreeFileSync::SelectedSide side> +class GridView::SortByExtension : public std::binary_function<RefIndex, RefIndex, bool> +{ +public: + SortByExtension(const GridView& view) : m_view(view) {} + + bool operator()(const RefIndex a, const RefIndex b) const + { + const FileSystemObject* fsObjA = m_view.getReferencedRow(a); + const FileSystemObject* fsObjB = m_view.getReferencedRow(b); + if (fsObjA == NULL) //invalid rows shall appear at the end + return false; + else if (fsObjB == NULL) + return true; + + return sortByExtension<ascending, side>(*fsObjA, *fsObjB); + } +private: + const GridView& m_view; +}; + + template <bool ascending> class GridView::SortByCmpResult : public std::binary_function<RefIndex, RefIndex, bool> { @@ -490,6 +518,12 @@ void GridView::sortView(const SortType type, const bool onLeft, const bool ascen else if (!ascending && onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByDate<false, LEFT_SIDE >(*this)); else if (!ascending && !onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByDate<false, RIGHT_SIDE>(*this)); break; + case SORT_BY_EXTENSION: + if ( ascending && onLeft) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByExtension<true, LEFT_SIDE >(*this)); + else if ( ascending && !onLeft) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByExtension<true, RIGHT_SIDE>(*this)); + else if (!ascending && onLeft) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByExtension<false, LEFT_SIDE >(*this)); + else if (!ascending && !onLeft) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByExtension<false, RIGHT_SIDE>(*this)); + break; case SORT_BY_CMP_RESULT: if ( ascending) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByCmpResult<true >(*this)); else if (!ascending) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByCmpResult<false>(*this)); diff --git a/ui/gridView.h b/ui/gridView.h index eaa8ad8c..8cd21915 100644 --- a/ui/gridView.h +++ b/ui/gridView.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 GRIDVIEW_H_INCLUDED #define GRIDVIEW_H_INCLUDED @@ -99,6 +105,7 @@ public: SORT_BY_FILENAME, SORT_BY_FILESIZE, SORT_BY_DATE, + SORT_BY_EXTENSION, SORT_BY_CMP_RESULT, SORT_BY_DIRECTORY, SORT_BY_SYNC_DIRECTION @@ -150,6 +157,9 @@ private: template <bool ascending, SelectedSide side> class SortByDate; + template <bool ascending, SelectedSide side> + class SortByExtension; + template <bool ascending> class SortByCmpResult; diff --git a/ui/guiGenerated.cpp b/ui/guiGenerated.cpp index c522ccff..573c7b1c 100644 --- a/ui/guiGenerated.cpp +++ b/ui/guiGenerated.cpp @@ -36,10 +36,10 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_menuItemNew = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&New") ) + wxT('\t') + wxT("CTRL-N"), wxEmptyString, wxITEM_NORMAL ); m_menuFile->Append( m_menuItemNew ); - m_menuItemSave = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("S&ave configuration") ) + wxT('\t') + wxT("CTRL-S"), wxEmptyString, wxITEM_NORMAL ); + m_menuItemSave = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("S&ave configuration...") ) + wxT('\t') + wxT("CTRL-S"), wxEmptyString, wxITEM_NORMAL ); m_menuFile->Append( m_menuItemSave ); - m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&Load configuration") ) + wxT('\t') + wxT("CTRL-L"), wxEmptyString, wxITEM_NORMAL ); + m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&Load configuration...") ) + wxT('\t') + wxT("CTRL-L"), wxEmptyString, wxITEM_NORMAL ); m_menuFile->Append( m_menuItemLoad ); m_menuFile->AppendSeparator(); @@ -56,14 +56,14 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_menuAdvanced->AppendSeparator(); - m_menuItemGlobSett = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Global settings") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuItemGlobSett = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Global settings...") ) , wxEmptyString, wxITEM_NORMAL ); m_menuAdvanced->Append( m_menuItemGlobSett ); - m_menuItem7 = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Create batch job") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuItem7 = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Create batch job...") ) , wxEmptyString, wxITEM_NORMAL ); m_menuAdvanced->Append( m_menuItem7 ); wxMenuItem* m_menuItem5; - m_menuItem5 = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Export file list") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuItem5 = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Export file list...") ) , wxEmptyString, wxITEM_NORMAL ); m_menuAdvanced->Append( m_menuItem5 ); m_menubar1->Append( m_menuAdvanced, _("&Advanced") ); @@ -73,13 +73,12 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_menuItemReadme = new wxMenuItem( m_menuHelp, wxID_ANY, wxString( _("&Content") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); m_menuHelp->Append( m_menuItemReadme ); - wxMenuItem* m_menuItemCheckVer; m_menuItemCheckVer = new wxMenuItem( m_menuHelp, wxID_ANY, wxString( _("&Check for new version") ) , wxEmptyString, wxITEM_NORMAL ); m_menuHelp->Append( m_menuItemCheckVer ); m_menuHelp->AppendSeparator(); - m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About...") ) + wxT('\t') + wxT("SHIFT-F1"), wxEmptyString, wxITEM_NORMAL ); m_menuHelp->Append( m_menuItemAbout ); m_menubar1->Append( m_menuHelp, _("&Help") ); @@ -411,7 +410,6 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const bSizer1->Add( bSizer2, 1, wxEXPAND, 5 ); - wxPanel* m_panelBottom; m_panelBottom = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); bSizer3 = new wxBoxSizer( wxHORIZONTAL ); @@ -641,7 +639,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const bSizer3->Fit( m_panelBottom ); bSizer1->Add( m_panelBottom, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - m_panel7 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL ); + m_panelStatusBar = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL ); wxBoxSizer* bSizer451; bSizer451 = new wxBoxSizer( wxHORIZONTAL ); @@ -652,7 +650,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextStatusLeft = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusLeft = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextStatusLeft->Wrap( -1 ); m_staticTextStatusLeft->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); @@ -663,13 +661,13 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const bSizer451->Add( bSizer53, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - m_staticline9 = new wxStaticLine( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); bSizer451->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxEXPAND, 2 ); bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextStatusMiddle = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusMiddle = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextStatusMiddle->Wrap( -1 ); m_staticTextStatusMiddle->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); @@ -678,7 +676,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticline10 = new wxStaticLine( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); bSizer451->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 ); wxBoxSizer* bSizer52; @@ -687,7 +685,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextStatusRight = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusRight = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextStatusRight->Wrap( -1 ); m_staticTextStatusRight->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); @@ -699,17 +697,17 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const bSizer50->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmap15 = new wxStaticBitmap( m_panel7, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 10,10 ), 0 ); + m_bitmap15 = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 10,10 ), 0 ); bSizer50->Add( m_bitmap15, 0, wxALIGN_BOTTOM, 2 ); bSizer52->Add( bSizer50, 1, wxALIGN_BOTTOM|wxEXPAND, 5 ); bSizer451->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - m_panel7->SetSizer( bSizer451 ); - m_panel7->Layout(); - bSizer451->Fit( m_panel7 ); - bSizer1->Add( m_panel7, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + m_panelStatusBar->SetSizer( bSizer451 ); + m_panelStatusBar->Layout(); + bSizer451->Fit( m_panelStatusBar ); + bSizer1->Add( m_panelStatusBar, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); this->SetSizer( bSizer1 ); this->Layout(); @@ -1081,11 +1079,21 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer69->Add( 0, 5, 0, 0, 5 ); - m_staticText54 = new wxStaticText( this, wxID_ANY, _("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 <batchfile>. This can also be scheduled in your operating system's task planner."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText54->Wrap( 520 ); - m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Tahoma") ) ); + wxBoxSizer* bSizer70; + bSizer70 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText44 = new wxStaticText( this, wxID_ANY, _("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 <batchfile>. This can also be scheduled in your operating system's task planner."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText44->Wrap( 500 ); + bSizer70->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonHelp->SetToolTip( _("Help") ); - bSizer69->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + m_bpButtonHelp->SetToolTip( _("Help") ); + + bSizer70->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + bSizer69->Add( bSizer70, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); bSizer69->Add( 0, 5, 0, 0, 5 ); @@ -1244,12 +1252,12 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS m_radioBtnSizeDate = new wxRadioButton( m_panelOverview, wxID_ANY, _("File size and date"), wxDefaultPosition, wxDefaultSize, 0 ); m_radioBtnSizeDate->SetValue( true ); - m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same.") ); + m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same") ); sbSizer6->Add( m_radioBtnSizeDate, 0, 0, 5 ); m_radioBtnContent = new wxRadioButton( m_panelOverview, wxID_ANY, _("File content"), wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same.") ); + m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); sbSizer6->Add( m_radioBtnContent, 0, wxTOP, 5 ); @@ -1266,7 +1274,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS m_checkBoxAutomatic = new wxCheckBox( m_panelOverview, wxID_ANY, _("Automatic mode"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxAutomatic->SetToolTip( _("Synchronize both sides using a database. Deletions are detected automatically.") ); + m_checkBoxAutomatic->SetToolTip( _("Synchronize both sides using a database. Deletions are detected automatically") ); sbSizer24->Add( m_checkBoxAutomatic, 0, wxALL, 5 ); @@ -1591,6 +1599,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS // Connect Events this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); + m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnHelp ), NULL, this ); m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnAddFolderPair ), NULL, this ); m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRemoveTopFolderPair ), NULL, this ); m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); @@ -1615,6 +1624,7 @@ BatchDlgGenerated::~BatchDlgGenerated() { // Disconnect Events this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); + m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnHelp ), NULL, this ); m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnAddFolderPair ), NULL, this ); m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRemoveTopFolderPair ), NULL, this ); m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); @@ -1804,7 +1814,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const sbSizer7->Add( m_staticText1, 0, wxALL, 5 ); wxFlexGridSizer* fgSizer1; - fgSizer1 = new wxFlexGridSizer( 5, 3, 8, 5 ); + fgSizer1 = new wxFlexGridSizer( 4, 3, 8, 5 ); fgSizer1->SetFlexibleDirection( wxHORIZONTAL ); fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); @@ -1851,24 +1861,6 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const m_staticText101->Wrap( 300 ); fgSizer1->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - m_radioBtnTwoWay = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnTwoWay->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - m_radioBtnTwoWay->Hide(); - - fgSizer1->Add( m_radioBtnTwoWay, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonTwoWay = new wxButton( this, wxID_ANY, _("Two way <->"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonTwoWay->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - m_buttonTwoWay->Hide(); - - fgSizer1->Add( m_buttonTwoWay, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText10 = new wxStaticText( this, wxID_ANY, _("Synchronize both sides simultaneously: Copy new or updated files in both directions."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText10->Wrap( 300 ); - m_staticText10->Hide(); - - fgSizer1->Add( m_staticText10, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - m_radioBtnCustom = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_radioBtnCustom->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); m_radioBtnCustom->Enable( false ); @@ -1949,11 +1941,11 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxBoxSizer* bSizer291; bSizer291 = new wxBoxSizer( wxHORIZONTAL ); - m_buttonApply = new wxButton( this, wxID_OK, _("&Apply"), wxDefaultPosition, wxSize( 120,35 ), 0 ); - m_buttonApply->SetDefault(); - m_buttonApply->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,35 ), 0 ); + m_buttonOK->SetDefault(); + m_buttonOK->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - bSizer291->Add( m_buttonApply, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizer291->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); m_button16 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); m_button16->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); @@ -2111,11 +2103,10 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const m_buttonOneWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncLeftToRight ), NULL, this ); m_radioBtnUpdate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); m_buttonUpdate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); - m_radioBtnTwoWay->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncBothSides ), NULL, this ); - m_buttonTwoWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncBothSides ), NULL, this ); + m_radioBtnCustom->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); m_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); m_choiceHandleDeletion->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this ); - m_buttonApply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); m_button16->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnCancel ), NULL, this ); m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this ); m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this ); @@ -2135,11 +2126,10 @@ SyncCfgDlgGenerated::~SyncCfgDlgGenerated() m_buttonOneWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncLeftToRight ), NULL, this ); m_radioBtnUpdate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); m_buttonUpdate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); - m_radioBtnTwoWay->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncBothSides ), NULL, this ); - m_buttonTwoWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncBothSides ), NULL, this ); + m_radioBtnCustom->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); m_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); m_choiceHandleDeletion->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this ); - m_buttonApply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); + m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); m_button16->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnCancel ), NULL, this ); m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this ); m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this ); @@ -2169,34 +2159,34 @@ CmpCfgDlgGenerated::CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id, const w m_radioBtnSizeDate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); m_radioBtnSizeDate->SetValue( true ); - m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same.") ); + m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same") ); fgSizer16->Add( m_radioBtnSizeDate, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_bitmapByTime = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapByTime->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same.") ); + m_bitmapByTime->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same") ); fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); m_buttonTimeSize = new wxButton( this, wxID_ANY, _("File size and date"), wxDefaultPosition, wxSize( -1,42 ), 0 ); m_buttonTimeSize->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - m_buttonTimeSize->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same.") ); + m_buttonTimeSize->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same") ); fgSizer16->Add( m_buttonTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); m_radioBtnContent = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same.") ); + m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); fgSizer16->Add( m_radioBtnContent, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_bitmapByContent = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapByContent->SetToolTip( _("Files are found equal if\n - file content\nis the same.") ); + m_bitmapByContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); fgSizer16->Add( m_bitmapByContent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); m_buttonContent = new wxButton( this, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,42 ), 0 ); m_buttonContent->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - m_buttonContent->SetToolTip( _("Files are found equal if\n - file content\nis the same.") ); + m_buttonContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); fgSizer16->Add( m_buttonContent, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); @@ -2205,7 +2195,7 @@ CmpCfgDlgGenerated::CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id, const w m_staticline14 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); sbSizer6->Add( m_staticline14, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); - m_bpButtonHelp = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); m_bpButtonHelp->SetToolTip( _("Help") ); m_bpButtonHelp->SetToolTip( _("Help") ); @@ -2344,22 +2334,37 @@ SyncStatusDlgGenerated::SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id, wxBoxSizer* bSizer111; bSizer111 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer113; - bSizer113 = new wxBoxSizer( wxHORIZONTAL ); + bSizerObjectsRemaining = new wxBoxSizer( wxHORIZONTAL ); m_staticText25 = new wxStaticText( this, wxID_ANY, _("Files/folders remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText25->Wrap( -1 ); m_staticText25->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - bSizer113->Add( m_staticText25, 0, wxALIGN_BOTTOM, 5 ); + bSizerObjectsRemaining->Add( m_staticText25, 0, wxALIGN_BOTTOM, 5 ); m_staticTextRemainingObj = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_staticTextRemainingObj->Wrap( -1 ); m_staticTextRemainingObj->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); - bSizer113->Add( m_staticTextRemainingObj, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + bSizerObjectsRemaining->Add( m_staticTextRemainingObj, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + bSizer111->Add( bSizerObjectsRemaining, 0, 0, 5 ); + + bSizerObjectsProcessed = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText251 = new wxStaticText( this, wxID_ANY, _("Files/folders processed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText251->Wrap( -1 ); + m_staticText251->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - bSizer111->Add( bSizer113, 0, 0, 5 ); + bSizerObjectsProcessed->Add( m_staticText251, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextProcessedObj = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextProcessedObj->Wrap( -1 ); + m_staticTextProcessedObj->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); + + bSizerObjectsProcessed->Add( m_staticTextProcessedObj, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + bSizer111->Add( bSizerObjectsProcessed, 0, 0, 5 ); bSizerSpeed = new wxBoxSizer( wxHORIZONTAL ); @@ -2404,22 +2409,37 @@ SyncStatusDlgGenerated::SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id, wxBoxSizer* bSizer114; bSizer114 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer116; - bSizer116 = new wxBoxSizer( wxHORIZONTAL ); + bSizerDataRemaining = new wxBoxSizer( wxHORIZONTAL ); m_staticText26 = new wxStaticText( this, wxID_ANY, _("Data remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText26->Wrap( -1 ); m_staticText26->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - bSizer116->Add( m_staticText26, 0, wxALIGN_BOTTOM, 5 ); + bSizerDataRemaining->Add( m_staticText26, 0, wxALIGN_BOTTOM, 5 ); m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextDataRemaining->Wrap( -1 ); m_staticTextDataRemaining->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); - bSizer116->Add( m_staticTextDataRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + bSizerDataRemaining->Add( m_staticTextDataRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + bSizer114->Add( bSizerDataRemaining, 0, wxALIGN_RIGHT, 5 ); + + bSizerDataProcessed = new wxBoxSizer( wxHORIZONTAL ); - bSizer114->Add( bSizer116, 0, wxALIGN_RIGHT, 5 ); + m_staticText261 = new wxStaticText( this, wxID_ANY, _("Data transferred:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText261->Wrap( -1 ); + m_staticText261->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizerDataProcessed->Add( m_staticText261, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextDataProcessed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDataProcessed->Wrap( -1 ); + m_staticTextDataProcessed->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); + + bSizerDataProcessed->Add( m_staticTextDataProcessed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + bSizer114->Add( bSizerDataProcessed, 0, wxALIGN_RIGHT, 5 ); bSizerRemTime = new wxBoxSizer( wxHORIZONTAL ); @@ -2533,7 +2553,7 @@ HelpDlgGenerated::HelpDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_staticText61->Wrap( 500 ); bSizer70->Add( m_staticText61, 0, wxALL, 5 ); - m_treeCtrl1 = new wxTreeCtrl( m_scrolledWindow1, wxID_ANY, wxDefaultPosition, wxSize( -1,180 ), wxTR_DEFAULT_STYLE ); + m_treeCtrl1 = new wxTreeCtrl( m_scrolledWindow1, wxID_ANY, wxDefaultPosition, wxSize( -1,175 ), wxTR_DEFAULT_STYLE ); m_treeCtrl1->SetBackgroundColour( wxColour( 237, 236, 235 ) ); bSizer70->Add( m_treeCtrl1, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); @@ -2570,7 +2590,7 @@ HelpDlgGenerated::HelpDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_scrolledWindow1->Layout(); bSizer70->Fit( m_scrolledWindow1 ); m_notebook1->AddPage( m_scrolledWindow1, _("File size and date"), true ); - m_scrolledWindow5 = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_scrolledWindow5 = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxSIMPLE_BORDER|wxVSCROLL ); m_scrolledWindow5->SetScrollRate( 5, 5 ); m_scrolledWindow5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) ); @@ -2641,79 +2661,6 @@ HelpDlgGenerated::~HelpDlgGenerated() m_button8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HelpDlgGenerated::OnOK ), NULL, this ); } -ReadmeDlgGenerated::ReadmeDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer20; - bSizer20 = new wxBoxSizer( wxVERTICAL ); - - - bSizer20->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer85; - bSizer85 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap25 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer85->Add( m_bitmap25, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer72->Add( 20, 0, 0, 0, 5 ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("&Readme.txt"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer72->Add( 20, 0, 0, 0, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer85->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer85->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer20->Add( bSizer85, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_textCtrlMain = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxTE_RICH ); - m_textCtrlMain->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Courier") ) ); - m_textCtrlMain->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) ); - - bSizer20->Add( m_textCtrlMain, 1, wxALL|wxEXPAND, 5 ); - - m_buttonOkay = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer20->Add( m_buttonOkay, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer20 ); - this->Layout(); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ReadmeDlgGenerated::OnClose ) ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ReadmeDlgGenerated::OnOK ), NULL, this ); -} - -ReadmeDlgGenerated::~ReadmeDlgGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ReadmeDlgGenerated::OnClose ) ); - m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ReadmeDlgGenerated::OnOK ), NULL, this ); -} - AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { this->SetSizeHints( wxDefaultSize, wxDefaultSize ); @@ -2846,9 +2793,9 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer103->Add( 20, 0, 1, wxEXPAND, 5 ); - m_hyperlink6 = new wxHyperlinkCtrl( this, wxID_ANY, _("Report translation error"), wxT("http://sourceforge.net/forum/forum.php?forum_id=976976"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink6 = new wxHyperlinkCtrl( this, wxID_ANY, _("Report translation error"), wxT("http://sourceforge.net/projects/freefilesync/forums/forum/976976"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); m_hyperlink6->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); - m_hyperlink6->SetToolTip( _("https://sourceforge.net/forum/forum.php?forum_id=976976") ); + m_hyperlink6->SetToolTip( _("http://sourceforge.net/projects/freefilesync/forums/forum/976976") ); bSizer103->Add( m_hyperlink6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); @@ -2966,6 +2913,7 @@ ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer25 = new wxBoxSizer( wxHORIZONTAL ); m_buttonIgnore = new wxButton( this, wxID_OK, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonIgnore->SetDefault(); m_buttonIgnore->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); @@ -3038,6 +2986,7 @@ WarningDlgGenerated::WarningDlgGenerated( wxWindow* parent, wxWindowID id, const bSizer25 = new wxBoxSizer( wxHORIZONTAL ); m_buttonIgnore = new wxButton( this, wxID_IGNORE, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonIgnore->SetDefault(); m_buttonIgnore->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); @@ -3103,6 +3052,7 @@ QuestionDlgGenerated::QuestionDlgGenerated( wxWindow* parent, wxWindowID id, con bSizer25 = new wxBoxSizer( wxHORIZONTAL ); m_buttonYes = new wxButton( this, wxID_YES, _("&Yes"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonYes->SetDefault(); m_buttonYes->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); bSizer25->Add( m_buttonYes, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); @@ -3274,7 +3224,7 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w m_staticText44->Wrap( 400 ); bSizer70->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonHelp = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); m_bpButtonHelp->SetToolTip( _("Help") ); m_bpButtonHelp->SetToolTip( _("Help") ); @@ -3410,21 +3360,23 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - bSizer22->Add( m_button9, 0, wxALL, 5 ); + bSizer22->Add( m_button9, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer22->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer22->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_button10 = new wxButton( this, wxID_OK, _("&Apply"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button10 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); m_button10->SetDefault(); m_button10->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - bSizer22->Add( m_button10, 0, wxALL, 5 ); + bSizer22->Add( m_button10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_button17 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button17->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - m_button17 = new wxButton( this, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0,0 ), 0 ); - bSizer22->Add( m_button17, 0, wxALIGN_BOTTOM, 5 ); + bSizer22->Add( m_button17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - bSizer21->Add( bSizer22, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); + bSizer21->Add( bSizer22, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxEXPAND, 5 ); this->SetSizer( bSizer21 ); this->Layout(); @@ -3485,30 +3437,29 @@ CustomizeColsDlgGenerated::CustomizeColsDlgGenerated( wxWindow* parent, wxWindow bSizer96->Add( bSizer99, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - m_checkBoxShowFileIcons = new wxCheckBox( this, wxID_ANY, _("Show file icons"), wxDefaultPosition, wxDefaultSize, 0 ); - - bSizer96->Add( m_checkBoxShowFileIcons, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); - wxBoxSizer* bSizer97; bSizer97 = new wxBoxSizer( wxHORIZONTAL ); - m_button28 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button28->SetDefault(); - m_button28->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button28, 0, wxALL, 5 ); - m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); bSizer97->Add( m_button9, 0, wxALL, 5 ); - m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + + bSizer97->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_button28 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button28->SetDefault(); + m_button28->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button28, 0, wxALL, 5 ); + + m_button29 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); m_button29->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); bSizer97->Add( m_button29, 0, wxALL, 5 ); - bSizer96->Add( bSizer97, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizer96->Add( bSizer97, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); this->SetSizer( bSizer96 ); this->Layout(); @@ -3518,8 +3469,8 @@ CustomizeColsDlgGenerated::CustomizeColsDlgGenerated( wxWindow* parent, wxWindow this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); m_bpButton29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); m_bpButton30->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); - m_button28->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); + m_button28->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); } @@ -3529,8 +3480,8 @@ CustomizeColsDlgGenerated::~CustomizeColsDlgGenerated() this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); m_bpButton29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); m_bpButton30->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); - m_button28->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); + m_button28->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); } @@ -3580,7 +3531,7 @@ GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWind m_staticText114 = new wxStaticText( this, wxID_ANY, _("Ignore 1-hour file time difference"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText114->Wrap( -1 ); - m_staticText114->SetToolTip( _("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.") ); + m_staticText114->SetToolTip( _("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") ); bSizer120->Add( m_staticText114, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); @@ -3589,7 +3540,7 @@ GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWind m_checkBoxIgnoreOneHour = new wxCheckBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxIgnoreOneHour->SetToolTip( _("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.") ); + m_checkBoxIgnoreOneHour->SetToolTip( _("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") ); bSizer120->Add( m_checkBoxIgnoreOneHour, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); @@ -3600,7 +3551,7 @@ GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWind m_staticTextCopyLocked = new wxStaticText( this, wxID_ANY, _("Copy locked files"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextCopyLocked->Wrap( -1 ); - m_staticTextCopyLocked->SetToolTip( _("Copy shared or locked files using Volume Shadow Copy Service.") ); + m_staticTextCopyLocked->SetToolTip( _("Copy shared or locked files using Volume Shadow Copy Service") ); bSizer1201->Add( m_staticTextCopyLocked, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); @@ -3609,7 +3560,7 @@ GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWind m_checkBoxCopyLocked = new wxCheckBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxCopyLocked->SetToolTip( _("Copy shared or locked files using Volume Shadow Copy Service.") ); + m_checkBoxCopyLocked->SetToolTip( _("Copy shared or locked files using Volume Shadow Copy Service") ); bSizer1201->Add( m_checkBoxCopyLocked, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); @@ -3696,23 +3647,26 @@ GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWind wxBoxSizer* bSizer97; bSizer97 = new wxBoxSizer( wxHORIZONTAL ); - m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_buttonOkay, 0, wxALL, 5 ); - m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); bSizer97->Add( m_button9, 0, wxALL, 5 ); - m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + + bSizer97->Add( 0, 0, 1, 0, 5 ); + + m_buttonOkay = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_buttonOkay, 0, wxALL, 5 ); + + m_button29 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); m_button29->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); bSizer97->Add( m_button29, 0, wxALL, 5 ); - bSizer95->Add( bSizer97, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer95->Add( bSizer97, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); this->SetSizer( bSizer95 ); this->Layout(); @@ -3723,8 +3677,8 @@ GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWind m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetDialogs ), NULL, this ); m_bpButtonAddRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnAddRow ), NULL, this ); m_bpButtonRemoveRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnRemoveRow ), NULL, this ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); } @@ -3735,8 +3689,8 @@ GlobalSettingsDlgGenerated::~GlobalSettingsDlgGenerated() m_buttonResetDialogs->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetDialogs ), NULL, this ); m_bpButtonAddRow->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnAddRow ), NULL, this ); m_bpButtonRemoveRow->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnRemoveRow ), NULL, this ); - m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); + m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); } @@ -3964,3 +3918,70 @@ PopupFrameGenerated1::PopupFrameGenerated1( wxWindow* parent, wxWindowID id, con PopupFrameGenerated1::~PopupFrameGenerated1() { } + +SearchDialogGenerated::SearchDialogGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer161; + bSizer161 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer166; + bSizer166 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer162; + bSizer162 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText101 = new wxStaticText( this, wxID_ANY, _("Find what:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText101->Wrap( -1 ); + bSizer162->Add( m_staticText101, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlSearchTxt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220,-1 ), 0 ); + bSizer162->Add( m_textCtrlSearchTxt, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer166->Add( bSizer162, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer166->Add( 0, 10, 0, 0, 5 ); + + m_checkBoxMatchCase = new wxCheckBox( this, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 ); + + bSizer166->Add( m_checkBoxMatchCase, 0, wxALL, 5 ); + + bSizer161->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer97; + bSizer97 = new wxBoxSizer( wxVERTICAL ); + + m_buttonFindNext = new wxButton( this, wxID_OK, _("&Find next"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonFindNext->SetDefault(); + m_buttonFindNext->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_buttonFindNext, 0, wxALL|wxEXPAND, 5 ); + + m_button29 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button29->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button29, 0, wxALL|wxEXPAND, 5 ); + + bSizer161->Add( bSizer97, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + this->SetSizer( bSizer161 ); + this->Layout(); + bSizer161->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SearchDialogGenerated::OnClose ) ); + m_textCtrlSearchTxt->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( SearchDialogGenerated::OnText ), NULL, this ); + m_buttonFindNext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnFindNext ), NULL, this ); + m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnCancel ), NULL, this ); +} + +SearchDialogGenerated::~SearchDialogGenerated() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SearchDialogGenerated::OnClose ) ); + m_textCtrlSearchTxt->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( SearchDialogGenerated::OnText ), NULL, this ); + m_buttonFindNext->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnFindNext ), NULL, this ); + m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnCancel ), NULL, this ); +} diff --git a/ui/guiGenerated.h b/ui/guiGenerated.h index ab4d3c12..ff1c4ddc 100644 --- a/ui/guiGenerated.h +++ b/ui/guiGenerated.h @@ -75,6 +75,7 @@ class MainDialogGenerated : public wxFrame wxMenuItem* m_menuItemGlobSett; wxMenuItem* m_menuItem7; wxMenu* m_menuHelp; + wxMenuItem* m_menuItemCheckVer; wxMenuItem* m_menuItemAbout; wxBoxSizer* bSizer1; wxPanel* m_panel71; @@ -106,6 +107,7 @@ class MainDialogGenerated : public wxFrame wxPanel* m_panelMiddle; CustomGridMiddle* m_gridMiddle; CustomGridRight* m_gridRight; + wxPanel* m_panelBottom; wxBoxSizer* bSizer3; wxNotebook* m_notebookBottomLeft; wxPanel* m_panel30; @@ -145,7 +147,7 @@ class MainDialogGenerated : public wxFrame wxStaticBitmap* m_bitmapData; wxTextCtrl* m_textCtrlData; wxBitmapButton* m_bpButton10; - wxPanel* m_panel7; + wxPanel* m_panelStatusBar; wxStaticText* m_staticTextStatusLeft; @@ -300,7 +302,8 @@ class BatchDlgGenerated : public wxDialog wxStaticText* m_staticText56; - wxStaticText* m_staticText54; + wxStaticText* m_staticText44; + wxBitmapButton* m_bpButtonHelp; wxStaticLine* m_staticline10; wxStaticText* m_staticText531; @@ -368,6 +371,7 @@ class BatchDlgGenerated : public wxDialog // Virtual event handlers, overide them in your derived class virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnHelp( wxCommandEvent& event ){ event.Skip(); } virtual void OnAddFolderPair( wxCommandEvent& event ){ event.Skip(); } virtual void OnRemoveTopFolderPair( wxCommandEvent& event ){ event.Skip(); } virtual void OnChangeCompareVar( wxCommandEvent& event ){ event.Skip(); } @@ -456,9 +460,6 @@ class SyncCfgDlgGenerated : public wxDialog wxRadioButton* m_radioBtnUpdate; wxButton* m_buttonUpdate; wxStaticText* m_staticText101; - wxRadioButton* m_radioBtnTwoWay; - wxButton* m_buttonTwoWay; - wxStaticText* m_staticText10; wxRadioButton* m_radioBtnCustom; wxStaticText* m_staticText23; @@ -473,7 +474,7 @@ class SyncCfgDlgGenerated : public wxDialog wxTextCtrl* m_textCtrlCustomDelFolder; wxDirPickerCtrl* m_dirPickerCustomDelFolder; - wxButton* m_buttonApply; + wxButton* m_buttonOK; wxButton* m_button16; @@ -505,7 +506,7 @@ class SyncCfgDlgGenerated : public wxDialog virtual void OnSyncAutomatic( wxCommandEvent& event ){ event.Skip(); } virtual void OnSyncLeftToRight( wxCommandEvent& event ){ event.Skip(); } virtual void OnSyncUpdate( wxCommandEvent& event ){ event.Skip(); } - virtual void OnSyncBothSides( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSyncCustom( wxCommandEvent& event ){ event.Skip(); } virtual void OnChangeErrorHandling( wxCommandEvent& event ){ event.Skip(); } virtual void OnChangeDeletionHandling( wxCommandEvent& event ){ event.Skip(); } virtual void OnApply( wxCommandEvent& event ){ event.Skip(); } @@ -580,8 +581,12 @@ class SyncStatusDlgGenerated : public wxFrame wxStaticText* m_staticTextTimeElapsed; wxTextCtrl* m_textCtrlInfo; wxBoxSizer* bSizer28; + wxBoxSizer* bSizerObjectsRemaining; wxStaticText* m_staticText25; wxStaticText* m_staticTextRemainingObj; + wxBoxSizer* bSizerObjectsProcessed; + wxStaticText* m_staticText251; + wxStaticText* m_staticTextProcessedObj; wxBoxSizer* bSizerSpeed; wxStaticText* m_staticText108; wxStaticText* m_staticTextSpeed; @@ -590,8 +595,12 @@ class SyncStatusDlgGenerated : public wxFrame wxButton* m_buttonPause; wxButton* m_buttonAbort; + wxBoxSizer* bSizerDataRemaining; wxStaticText* m_staticText26; wxStaticText* m_staticTextDataRemaining; + wxBoxSizer* bSizerDataProcessed; + wxStaticText* m_staticText261; + wxStaticText* m_staticTextDataProcessed; wxBoxSizer* bSizerRemTime; wxStaticText* m_staticText106; wxStaticText* m_staticTextTimeRemaining; @@ -657,41 +666,12 @@ class HelpDlgGenerated : public wxDialog public: - HelpDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 565,501 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + HelpDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 579,543 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); ~HelpDlgGenerated(); }; /////////////////////////////////////////////////////////////////////////////// -/// Class ReadmeDlgGenerated -/////////////////////////////////////////////////////////////////////////////// -class ReadmeDlgGenerated : public wxDialog -{ - private: - - protected: - - wxStaticBitmap* m_bitmap25; - wxPanel* m_panel8; - - wxStaticText* m_staticText56; - - - wxTextCtrl* m_textCtrlMain; - wxButton* m_buttonOkay; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } - virtual void OnOK( wxCommandEvent& event ){ event.Skip(); } - - - public: - ReadmeDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 706,475 ), long style = wxCLOSE_BOX|wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); - ~ReadmeDlgGenerated(); - -}; - -/////////////////////////////////////////////////////////////////////////////// /// Class AboutDlgGenerated /////////////////////////////////////////////////////////////////////////////// class AboutDlgGenerated : public wxDialog @@ -933,17 +913,17 @@ class CustomizeColsDlgGenerated : public wxDialog wxCheckListBox* m_checkListColumns; wxBitmapButton* m_bpButton29; wxBitmapButton* m_bpButton30; - wxCheckBox* m_checkBoxShowFileIcons; - wxButton* m_button28; wxButton* m_button9; + + wxButton* m_button28; wxButton* m_button29; // Virtual event handlers, overide them in your derived class virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } virtual void OnMoveUp( wxCommandEvent& event ){ event.Skip(); } virtual void OnMoveDown( wxCommandEvent& event ){ event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ){ event.Skip(); } virtual void OnDefault( wxCommandEvent& event ){ event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ){ event.Skip(); } virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } @@ -982,8 +962,9 @@ class GlobalSettingsDlgGenerated : public wxDialog wxBitmapButton* m_bpButtonAddRow; wxBitmapButton* m_bpButtonRemoveRow; - wxButton* m_buttonOkay; wxButton* m_button9; + + wxButton* m_buttonOkay; wxButton* m_button29; // Virtual event handlers, overide them in your derived class @@ -991,8 +972,8 @@ class GlobalSettingsDlgGenerated : public wxDialog virtual void OnResetDialogs( wxCommandEvent& event ){ event.Skip(); } virtual void OnAddRow( wxCommandEvent& event ){ event.Skip(); } virtual void OnRemoveRow( wxCommandEvent& event ){ event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ){ event.Skip(); } virtual void OnDefault( wxCommandEvent& event ){ event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ){ event.Skip(); } virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } @@ -1065,4 +1046,32 @@ class PopupFrameGenerated1 : public wxFrame }; +/////////////////////////////////////////////////////////////////////////////// +/// Class SearchDialogGenerated +/////////////////////////////////////////////////////////////////////////////// +class SearchDialogGenerated : public wxDialog +{ + private: + + protected: + wxStaticText* m_staticText101; + wxTextCtrl* m_textCtrlSearchTxt; + + wxCheckBox* m_checkBoxMatchCase; + wxButton* m_buttonFindNext; + wxButton* m_button29; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnText( wxCommandEvent& event ){ event.Skip(); } + virtual void OnFindNext( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } + + + public: + SearchDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Find"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); + ~SearchDialogGenerated(); + +}; + #endif //__guiGenerated__ diff --git a/ui/guiStatusHandler.cpp b/ui/guiStatusHandler.cpp index 3cf6eb01..bd5f001e 100644 --- a/ui/guiStatusHandler.cpp +++ b/ui/guiStatusHandler.cpp @@ -1,9 +1,19 @@ +// ************************************************************************** +// * 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 "guiStatusHandler.h" #include "smallDialogs.h" +#include "messagePopup.h" #include "../shared/systemConstants.h" #include "mainDialog.h" #include <wx/wupdlock.h> #include "../shared/globalFunctions.h" +#include "../shared/stringConv.h" + +using namespace FreeFileSync; CompareStatusHandler::CompareStatusHandler(MainDialog* dlg) : @@ -17,8 +27,8 @@ CompareStatusHandler::CompareStatusHandler(MainDialog* dlg) : mainDialog->disableAllElements(); //display status panel during compare - mainDialog->compareStatus->init(); //clear old values - mainDialog->compareStatus->Show(); + mainDialog->compareStatus.init(); //clear old values + mainDialog->compareStatus.getAsWindow()->Show(); mainDialog->bSizer1->Layout(); //both sizers need to recalculate! mainDialog->bSizer6->Layout(); //adapt layout for wxBitmapWithImage @@ -40,7 +50,7 @@ CompareStatusHandler::~CompareStatusHandler() mainDialog->pushStatusInformation(_("Operation aborted!")); //hide status panel from main window - mainDialog->compareStatus->Hide(); + mainDialog->compareStatus.getAsWindow()->Hide(); mainDialog->bSizer6->Layout(); //adapt layout for wxBitmapWithImage mainDialog->Layout(); @@ -54,7 +64,7 @@ CompareStatusHandler::~CompareStatusHandler() inline void CompareStatusHandler::updateStatusText(const Zstring& text) { - mainDialog->compareStatus->setStatusText_NoUpdate(text); + mainDialog->compareStatus.setStatusText_NoUpdate(text); } @@ -67,7 +77,7 @@ void CompareStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal case StatusHandler::PROCESS_SCANNING: break; case StatusHandler::PROCESS_COMPARING_CONTENT: - mainDialog->compareStatus->switchToCompareBytewise(objectsTotal, dataTotal); + mainDialog->compareStatus.switchToCompareBytewise(objectsTotal, dataTotal); mainDialog->Layout(); break; case StatusHandler::PROCESS_SYNCHRONIZING: @@ -84,10 +94,10 @@ void CompareStatusHandler::updateProcessedData(int objectsProcessed, wxLongLong switch (currentProcess) { case StatusHandler::PROCESS_SCANNING: - mainDialog->compareStatus->incScannedObjects_NoUpdate(objectsProcessed); + mainDialog->compareStatus.incScannedObjects_NoUpdate(objectsProcessed); break; case StatusHandler::PROCESS_COMPARING_CONTENT: - mainDialog->compareStatus->incProcessedCmpData_NoUpdate(objectsProcessed, dataProcessed); + mainDialog->compareStatus.incProcessedCmpData_NoUpdate(objectsProcessed, dataProcessed); break; case StatusHandler::PROCESS_SYNCHRONIZING: case StatusHandler::PROCESS_NONE: @@ -102,7 +112,7 @@ ErrorHandler::Response CompareStatusHandler::reportError(const wxString& message if (ignoreErrors) return ErrorHandler::IGNORE_ERROR; - mainDialog->compareStatus->updateStatusPanelNow(); + mainDialog->compareStatus.updateStatusPanelNow(); bool ignoreNextErrors = false; const wxString errorMessage = message + wxT("\n\n\n") + _("Ignore this error, retry or abort?"); @@ -129,7 +139,7 @@ ErrorHandler::Response CompareStatusHandler::reportError(const wxString& message void CompareStatusHandler::reportFatalError(const wxString& errorMessage) { - mainDialog->compareStatus->updateStatusPanelNow(); + mainDialog->compareStatus.updateStatusPanelNow(); bool dummy = false; ErrorDlg* errorDlg = new ErrorDlg(mainDialog, @@ -145,7 +155,7 @@ void CompareStatusHandler::reportWarning(const wxString& warningMessage, bool& w if (!warningActive || ignoreErrors) //if errors are ignored, then warnings should also return; - mainDialog->compareStatus->updateStatusPanelNow(); + mainDialog->compareStatus.updateStatusPanelNow(); //show popup and ask user how to handle warning bool dontWarnAgain = false; @@ -169,7 +179,7 @@ void CompareStatusHandler::reportWarning(const wxString& warningMessage, bool& w inline void CompareStatusHandler::forceUiRefresh() { - mainDialog->compareStatus->updateStatusPanelNow(); + mainDialog->compareStatus.updateStatusPanelNow(); } @@ -182,66 +192,59 @@ void CompareStatusHandler::OnAbortCompare(wxCommandEvent& event) void CompareStatusHandler::abortThisProcess() { requestAbortion(); - throw FreeFileSync::AbortThisProcess(); //abort can be triggered by syncStatusFrame + throw FreeFileSync::AbortThisProcess(); } //######################################################################################################## SyncStatusHandler::SyncStatusHandler(wxWindow* dlg, bool ignoreAllErrors) : - ignoreErrors(ignoreAllErrors) -{ - syncStatusFrame = new SyncStatus(this, dlg); - syncStatusFrame->Show(); - updateUiNow(); -} + syncStatusFrame(*this, dlg, false), + ignoreErrors(ignoreAllErrors) {} SyncStatusHandler::~SyncStatusHandler() { - //print the results list - wxString result; - if (errorLog.messageCount() > 0) - { - if (errorLog.errorsTotal() > 0) - { - wxString header(_("Warning: Synchronization failed for %x item(s):")); - header.Replace(wxT("%x"), globalFunctions::numberToWxString(errorLog.errorsTotal()), false); - result += header + wxT("\n\n"); - } + const int totalErrors = errorLog.errorsTotal(); //evaluate before finalizing log - const std::vector<wxString>& messages = errorLog.getFormattedMessages(); - for (std::vector<wxString>::const_iterator i = messages.begin(); i != messages.end(); ++i) - { - result += *i; - result += wxChar('\n'); - } + //finalize error log + if (abortIsRequested()) + errorLog.logError(wxString(_("Synchronization aborted!")) + wxT(" ") + _("You may try to synchronize remaining items again (WITHOUT having to re-compare)!")); + else if (totalErrors) + errorLog.logWarning(wxString(_("Synchronization completed with errors!")) + wxT(" ") + _("You may try to synchronize remaining items again (WITHOUT having to re-compare)!")); + else + errorLog.logInfo(_("Synchronization completed successfully!")); - result += wxT("\n"); - } - //notify to syncStatusFrame that current process has ended - if (abortIsRequested()) + //print the results list + wxString finalMessage; + if (totalErrors > 0) { - result += wxString(_("Synchronization aborted!")) + wxT(" ") + _("You may try to synchronize remaining items again (WITHOUT having to re-compare)!"); - syncStatusFrame->processHasFinished(SyncStatus::ABORTED, result); //enable okay and close events + wxString header(_("Warning: Synchronization failed for %x item(s):")); + header.Replace(wxT("%x"), globalFunctions::numberToWxString(totalErrors), false); + finalMessage += header + wxT("\n\n"); } - else if (errorLog.errorsTotal() > 0) + + const ErrorLogging::MessageEntry& messages = errorLog.getFormattedMessages(); + for (ErrorLogging::MessageEntry::const_iterator i = messages.begin(); i != messages.end(); ++i) { - result += wxString(_("Synchronization completed with errors!")) + wxT(" ") + _("You may try to synchronize remaining items again (WITHOUT having to re-compare)!"); - syncStatusFrame->processHasFinished(SyncStatus::FINISHED_WITH_ERROR, result); + finalMessage += *i; + finalMessage += wxT("\n\n"); } + + //notify to syncStatusFrame that current process has ended + if (abortIsRequested()) + syncStatusFrame.processHasFinished(SyncStatus::ABORTED, finalMessage); //enable okay and close events + else if (totalErrors > 0) + syncStatusFrame.processHasFinished(SyncStatus::FINISHED_WITH_ERROR, finalMessage); else - { - result += _("Synchronization completed successfully!"); - syncStatusFrame->processHasFinished(SyncStatus::FINISHED_WITH_SUCCESS, result); - } + syncStatusFrame.processHasFinished(SyncStatus::FINISHED_WITH_SUCCESS, finalMessage); } inline void SyncStatusHandler::updateStatusText(const Zstring& text) { - syncStatusFrame->setStatusText_NoUpdate(text); + syncStatusFrame.setStatusText_NoUpdate(text); } @@ -250,8 +253,8 @@ void SyncStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal, P switch (processID) { case StatusHandler::PROCESS_SYNCHRONIZING: - syncStatusFrame->resetGauge(objectsTotal, dataTotal); - syncStatusFrame->setCurrentStatus(SyncStatus::SYNCHRONIZING); + syncStatusFrame.resetGauge(objectsTotal, dataTotal); + syncStatusFrame.setCurrentStatus(SyncStatus::SYNCHRONIZING); break; case StatusHandler::PROCESS_SCANNING: case StatusHandler::PROCESS_COMPARING_CONTENT: @@ -265,7 +268,7 @@ void SyncStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal, P inline void SyncStatusHandler::updateProcessedData(int objectsProcessed, wxLongLong dataProcessed) { - syncStatusFrame->incProgressIndicator_NoUpdate(objectsProcessed, dataProcessed); + syncStatusFrame.incProgressIndicator_NoUpdate(objectsProcessed, dataProcessed); } @@ -277,14 +280,17 @@ ErrorHandler::Response SyncStatusHandler::reportError(const wxString& errorMessa return ErrorHandler::IGNORE_ERROR; } - syncStatusFrame->updateStatusDialogNow(); + syncStatusFrame.updateStatusDialogNow(); bool ignoreNextErrors = false; - ErrorDlg* errorDlg = new ErrorDlg(syncStatusFrame, + ErrorDlg* errorDlg = new ErrorDlg(NULL, ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT, errorMessage + wxT("\n\n\n") + _("Ignore this error, retry or abort synchronization?"), ignoreNextErrors); - switch (static_cast<ErrorDlg::ReturnCodes>(errorDlg->ShowModal())) + const ErrorDlg::ReturnCodes rv = static_cast<ErrorDlg::ReturnCodes>(errorDlg->ShowModal()); + errorDlg->Destroy(); + + switch (rv) { case ErrorDlg::BUTTON_IGNORE: ignoreErrors = ignoreNextErrors; @@ -320,15 +326,18 @@ void SyncStatusHandler::reportWarning(const wxString& warningMessage, bool& warn return; else { - syncStatusFrame->updateStatusDialogNow(); + syncStatusFrame.updateStatusDialogNow(); //show popup and ask user how to handle warning bool dontWarnAgain = false; - WarningDlg* warningDlg = new WarningDlg(syncStatusFrame, + WarningDlg* warningDlg = new WarningDlg(NULL, WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_ABORT, warningMessage, dontWarnAgain); - switch (static_cast<WarningDlg::Response>(warningDlg->ShowModal())) + const WarningDlg::Response rv = static_cast<WarningDlg::Response>(warningDlg->ShowModal()); + warningDlg->Destroy(); + + switch (rv) { case WarningDlg::BUTTON_IGNORE: //no unhandled error situation! warningActive = !dontWarnAgain; @@ -346,7 +355,7 @@ void SyncStatusHandler::reportWarning(const wxString& warningMessage, bool& warn void SyncStatusHandler::forceUiRefresh() { - syncStatusFrame->updateStatusDialogNow(); + syncStatusFrame.updateStatusDialogNow(); } diff --git a/ui/guiStatusHandler.h b/ui/guiStatusHandler.h index eb067102..cb64069a 100644 --- a/ui/guiStatusHandler.h +++ b/ui/guiStatusHandler.h @@ -1,9 +1,16 @@ +// ************************************************************************** +// * 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 GUISTATUSHANDLER_H_INCLUDED #define GUISTATUSHANDLER_H_INCLUDED #include "../library/statusHandler.h" #include <wx/event.h> #include "../library/errorLogging.h" +#include "progressIndicator.h" class SyncStatus; class MainDialog; @@ -55,7 +62,7 @@ public: private: virtual void abortThisProcess(); - SyncStatus* syncStatusFrame; + SyncStatus syncStatusFrame; //the window managed by SyncStatus has longer lifetime than this handler! bool ignoreErrors; FreeFileSync::ErrorLogging errorLog; }; diff --git a/ui/messagePopup.cpp b/ui/messagePopup.cpp new file mode 100644 index 00000000..fe051eed --- /dev/null +++ b/ui/messagePopup.cpp @@ -0,0 +1,180 @@ +// ************************************************************************** +// * 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 "messagePopup.h" +#include "../library/resources.h" + + +ErrorDlg::ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString messageText, bool& ignoreNextErrors) : + ErrorDlgGenerated(parentWindow), + ignoreErrors(ignoreNextErrors) +{ + m_bitmap10->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("error"))); + m_textCtrl8->SetValue(messageText); + m_checkBoxIgnoreErrors->SetValue(ignoreNextErrors); + + if (~activeButtons & BUTTON_IGNORE) + { + m_buttonIgnore->Hide(); + m_checkBoxIgnoreErrors->Hide(); + } + + if (~activeButtons & BUTTON_RETRY) + m_buttonRetry->Hide(); + + if (~activeButtons & BUTTON_ABORT) + m_buttonAbort->Hide(); + + //set button focus precedence + if (activeButtons & BUTTON_RETRY) + m_buttonRetry->SetFocus(); + else if (activeButtons & BUTTON_IGNORE) + m_buttonIgnore->SetFocus(); + else if (activeButtons & BUTTON_ABORT) + m_buttonAbort->SetFocus(); +} + + +void ErrorDlg::OnClose(wxCloseEvent& event) +{ + ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); + EndModal(BUTTON_ABORT); +} + + +void ErrorDlg::OnIgnore(wxCommandEvent& event) +{ + ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); + EndModal(BUTTON_IGNORE); +} + + +void ErrorDlg::OnRetry(wxCommandEvent& event) +{ + ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); + EndModal(BUTTON_RETRY); +} + + +void ErrorDlg::OnAbort(wxCommandEvent& event) +{ + ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); + EndModal(BUTTON_ABORT); +} +//######################################################################################## + + +WarningDlg::WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool& dontShowDlgAgain) : + WarningDlgGenerated(parentWindow), + dontShowAgain(dontShowDlgAgain) +{ + m_bitmap10->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("warning"))); + m_textCtrl8->SetValue(messageText); + m_checkBoxDontShowAgain->SetValue(dontShowAgain); + + if (~activeButtons & BUTTON_IGNORE) + { + m_buttonIgnore->Hide(); + m_checkBoxDontShowAgain->Hide(); + } + + if (~activeButtons & BUTTON_ABORT) + m_buttonAbort->Hide(); + + //set button focus precedence + if (activeButtons & BUTTON_IGNORE) + m_buttonIgnore->SetFocus(); + else if (activeButtons & BUTTON_ABORT) + m_buttonAbort->SetFocus(); +} + +WarningDlg::~WarningDlg() {} + + +void WarningDlg::OnClose(wxCloseEvent& event) +{ + dontShowAgain = m_checkBoxDontShowAgain->GetValue(); + EndModal(BUTTON_ABORT); +} + + +void WarningDlg::OnIgnore(wxCommandEvent& event) +{ + dontShowAgain = m_checkBoxDontShowAgain->GetValue(); + EndModal(BUTTON_IGNORE); +} + + +void WarningDlg::OnAbort(wxCommandEvent& event) +{ + dontShowAgain = m_checkBoxDontShowAgain->GetValue(); + EndModal(BUTTON_ABORT); +} +//######################################################################################## + + +QuestionDlg::QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool* dontShowDlgAgain) : + QuestionDlgGenerated(parentWindow), + dontShowAgain(dontShowDlgAgain) +{ + m_bitmap10->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("question"))); + m_textCtrl8->SetValue(messageText); + if (dontShowAgain) + m_checkBoxDontAskAgain->SetValue(*dontShowAgain); + else + m_checkBoxDontAskAgain->Hide(); + + if (~activeButtons & BUTTON_YES) + m_buttonYes->Hide(); + + if (~activeButtons & BUTTON_NO) + { + m_buttonNo->Hide(); + m_checkBoxDontAskAgain->Hide(); + } + + if (~activeButtons & BUTTON_CANCEL) + m_buttonCancel->Hide(); + + //set button focus precedence + if (activeButtons & BUTTON_YES) + m_buttonYes->SetFocus(); + else if (activeButtons & BUTTON_CANCEL) + m_buttonCancel->SetFocus(); + else if (activeButtons & BUTTON_NO) + m_buttonNo->SetFocus(); +} + + +void QuestionDlg::OnClose(wxCloseEvent& event) +{ + if (dontShowAgain) + *dontShowAgain = m_checkBoxDontAskAgain->GetValue(); + EndModal(BUTTON_CANCEL); +} + + +void QuestionDlg::OnCancel(wxCommandEvent& event) +{ + if (dontShowAgain) + *dontShowAgain = m_checkBoxDontAskAgain->GetValue(); + EndModal(BUTTON_CANCEL); +} + + +void QuestionDlg::OnYes(wxCommandEvent& event) +{ + if (dontShowAgain) + *dontShowAgain = m_checkBoxDontAskAgain->GetValue(); + EndModal(BUTTON_YES); +} + +void QuestionDlg::OnNo(wxCommandEvent& event) +{ + if (dontShowAgain) + *dontShowAgain = m_checkBoxDontAskAgain->GetValue(); + EndModal(BUTTON_NO); +} diff --git a/ui/messagePopup.h b/ui/messagePopup.h new file mode 100644 index 00000000..e1fa58fb --- /dev/null +++ b/ui/messagePopup.h @@ -0,0 +1,80 @@ +// ************************************************************************** +// * 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 MESSAGEPOPUP_H_INCLUDED +#define MESSAGEPOPUP_H_INCLUDED + +#include "guiGenerated.h" + + +class ErrorDlg : public ErrorDlgGenerated +{ +public: + ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString messageText, bool& ignoreNextErrors); + + enum ReturnCodes + { + BUTTON_IGNORE = 1, + BUTTON_RETRY = 2, + BUTTON_ABORT = 4 + }; + +private: + void OnClose(wxCloseEvent& event); + void OnIgnore(wxCommandEvent& event); + void OnRetry(wxCommandEvent& event); + void OnAbort(wxCommandEvent& event); + + bool& ignoreErrors; +}; + + +class WarningDlg : public WarningDlgGenerated +{ +public: + WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool& dontShowAgain); + ~WarningDlg(); + + enum Response + { + BUTTON_IGNORE = 1, + BUTTON_ABORT = 2 + }; + +private: + void OnClose(wxCloseEvent& event); + void OnIgnore(wxCommandEvent& event); + void OnResolve(wxCommandEvent& event); + void OnAbort(wxCommandEvent& event); + void OnOkay(wxCommandEvent& event); + + bool& dontShowAgain; +}; + + +class QuestionDlg : public QuestionDlgGenerated +{ +public: + QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool* dontShowAgain = NULL); + + enum + { + BUTTON_YES = 1, + BUTTON_NO = 2, + BUTTON_CANCEL = 4 + }; + +private: + void OnClose(wxCloseEvent& event); + void OnCancel(wxCommandEvent& event); + void OnYes(wxCommandEvent& event); + void OnNo(wxCommandEvent& event); + + bool* dontShowAgain; //optional +}; + + +#endif // MESSAGEPOPUP_H_INCLUDED diff --git a/ui/mouseMoveWindow.cpp b/ui/mouseMoveWindow.cpp new file mode 100644 index 00000000..86064141 --- /dev/null +++ b/ui/mouseMoveWindow.cpp @@ -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) * +// ************************************************************************** +// +#include "mouseMoveWindow.h" +#include <wx/msw/wrapwin.h> //includes "windows.h" + +using namespace FreeFileSync; + + +void MouseMoveWindow::connectSourceWindow(wxWindow* sourceWindow) +{ + sourceWindow->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(MouseMoveWindow::LeftButtonDown), NULL, this); +} + + +void MouseMoveWindow::LeftButtonDown(wxMouseEvent& event) +{ + ::ReleaseCapture(); + //::SendMessage(GetHwndOf(dialogToMove_), WM_NCLBUTTONDOWN, HTCAPTION, 0); + ::SendMessage(static_cast<HWND>(dialogToMove_->GetHWND()), WM_NCLBUTTONDOWN, HTCAPTION, 0); + + //event.Skip(); -> swallow event, to avoid other windows losing focus +} diff --git a/ui/mouseMoveWindow.h b/ui/mouseMoveWindow.h new file mode 100644 index 00000000..bc7ee904 --- /dev/null +++ b/ui/mouseMoveWindow.h @@ -0,0 +1,36 @@ +// ************************************************************************** +// * 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 MOUSEMOVEWINDOW_H_INCLUDED +#define MOUSEMOVEWINDOW_H_INCLUDED + +#include <wx/window.h> + +namespace FreeFileSync +{ + +//move main dialog by mouse-dragging contained sub-windows: +//---------------------------------------------------------------------------------------- +//keep it as an attribute of the to-be-moved dialog and ensure that all connected source windows +//have a longer lifetime than the dialog which is moved (should be fulfilled naturally) +class MouseMoveWindow : private wxEvtHandler +{ +public: + MouseMoveWindow(wxWindow* dialogToMove) : + dialogToMove_(dialogToMove) {} + + void connectSourceWindow(wxWindow* sourceWindow); + +private: + void LeftButtonDown(wxMouseEvent& event); + + wxWindow* dialogToMove_; +}; + +} + + +#endif // MOUSEMOVEWINDOW_H_INCLUDED diff --git a/ui/progressIndicator.cpp b/ui/progressIndicator.cpp new file mode 100644 index 00000000..1ba70888 --- /dev/null +++ b/ui/progressIndicator.cpp @@ -0,0 +1,773 @@ +// ************************************************************************** +// * 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 "progressIndicator.h" +#include <memory> +#include "guiGenerated.h" +#include <wx/stopwatch.h> +#include "../library/resources.h" +#include "../shared/stringConv.h" +#include "util.h" +#include "../library/statistics.h" +#include "../library/statusHandler.h" +#include <wx/wupdlock.h> +#include "../shared/globalFunctions.h" +#include "trayIcon.h" +#include <boost/shared_ptr.hpp> + +using namespace FreeFileSync; + + +class CompareStatusImpl : public CompareStatusGenerated +{ +public: + CompareStatusImpl(wxWindow& parentWindow); + + void init(); //initialize all status values + + void switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess); + void incScannedObjects_NoUpdate(int number); + void incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed); + void setStatusText_NoUpdate(const Zstring& text); + void updateStatusPanelNow(); + +private: + //status variables + unsigned int scannedObjects; + Zstring currentStatusText; + + wxStopWatch timeElapsed; + + //gauge variables + int totalObjects; + wxLongLong totalData; //each data element represents one byte for proper progress indicator scaling + int currentObjects; //each object represents a file or directory processed + wxLongLong currentData; + double scalingFactor; //nr of elements has to be normalized to smaller nr. because of range of int limitation + + //remaining time + std::auto_ptr<Statistics> statistics; + long lastStatCallSpeed; //used for calculating intervals between statistics update + long lastStatCallRemTime; // +}; + +//redirect to implementation +CompareStatus::CompareStatus(wxWindow& parentWindow) : + pimpl(new CompareStatusImpl(parentWindow)) {} + +CompareStatus::~CompareStatus() +{ + //DON'T delete pimpl! it relies on wxWidgets destruction (parent window destroys child windows!) +} + +wxWindow* CompareStatus::getAsWindow() +{ + return pimpl; +} + +void CompareStatus::init() +{ + pimpl->init(); +} + +void CompareStatus::switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess) +{ + pimpl->switchToCompareBytewise(totalObjectsToProcess, totalDataToProcess); +} + +void CompareStatus::incScannedObjects_NoUpdate(int number) +{ + pimpl->incScannedObjects_NoUpdate(number); +} + +void CompareStatus::incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed) +{ + pimpl->incProcessedCmpData_NoUpdate(objectsProcessed, dataProcessed); +} + +void CompareStatus::setStatusText_NoUpdate(const Zstring& text) +{ + pimpl->setStatusText_NoUpdate(text); +} + +void CompareStatus::updateStatusPanelNow() +{ + pimpl->updateStatusPanelNow(); +} +//######################################################################################## + + +CompareStatusImpl::CompareStatusImpl(wxWindow& parentWindow) : + CompareStatusGenerated(&parentWindow), + scannedObjects(0), + totalObjects(0), + totalData(0), + currentObjects(0), + currentData(0), + scalingFactor(0), + statistics(NULL), + lastStatCallSpeed(-1000000), //some big number + lastStatCallRemTime(-1000000) +{ + init(); +} + + +void CompareStatusImpl::init() +{ + //initialize gauge + m_gauge2->SetRange(50000); + m_gauge2->SetValue(0); + + //initially hide status that's relevant for comparing bytewise only + bSizer42->Hide(sbSizer13); + m_gauge2->Hide(); + bSizer42->Layout(); + + scannedObjects = 0; + currentStatusText.clear(); + + totalObjects = 0; + totalData = 0; + currentObjects = 0; + currentData = 0; + scalingFactor = 0; + + statistics.reset(); + + timeElapsed.Start(); //measure total time + + updateStatusPanelNow(); +} + + +void CompareStatusImpl::switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess) +{ + currentData = 0; + totalData = totalDataToProcess; + + currentObjects = 0; + totalObjects = totalObjectsToProcess; + + if (totalData != 0) + scalingFactor = 50000 / totalData.ToDouble(); //let's normalize to 50000 + else + scalingFactor = 0; + + //set new statistics handler: 10 seconds "window" for remaining time, 5 seconds for speed + statistics.reset(new Statistics(totalObjectsToProcess, totalDataToProcess.ToDouble(), 10000, 5000)); + lastStatCallSpeed = -1000000; //some big number + lastStatCallRemTime = -1000000; + + //show status for comparing bytewise + bSizer42->Show(sbSizer13); + m_gauge2->Show(); + bSizer42->Layout(); +} + + +void CompareStatusImpl::incScannedObjects_NoUpdate(int number) +{ + scannedObjects += number; +} + + +void CompareStatusImpl::incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed) +{ + currentData += dataProcessed; + currentObjects += objectsProcessed; +} + + +void CompareStatusImpl::setStatusText_NoUpdate(const Zstring& text) +{ + currentStatusText = text; +} + + +void CompareStatusImpl::updateStatusPanelNow() +{ + //static RetrieveStatistics statistic; + //statistic.writeEntry(currentData, currentObjects); + { + wxWindowUpdateLocker dummy(this); //reduce display distortion + + bool screenChanged = false; //avoid screen flicker by calling layout() only if necessary + + //remove linebreaks from currentStatusText + wxString formattedStatusText = zToWx(currentStatusText); + for (wxString::iterator i = formattedStatusText.begin(); i != formattedStatusText.end(); ++i) + if (*i == wxChar('\n')) + *i = wxChar(' '); + + //status texts + if (m_textCtrlStatus->GetValue() != formattedStatusText && (screenChanged = true)) //avoid screen flicker + m_textCtrlStatus->SetValue(formattedStatusText); + + //nr of scanned objects + const wxString scannedObjTmp = globalFunctions::numberToWxString(scannedObjects); + if (m_staticTextScanned->GetLabel() != scannedObjTmp && (screenChanged = true)) //avoid screen flicker + m_staticTextScanned->SetLabel(scannedObjTmp); + + //progress indicator for "compare file content" + m_gauge2->SetValue(int(currentData.ToDouble() * scalingFactor)); + + //remaining files left for file comparison + const wxString filesToCompareTmp = globalFunctions::numberToWxString(totalObjects - currentObjects); + if (m_staticTextFilesRemaining->GetLabel() != filesToCompareTmp && (screenChanged = true)) //avoid screen flicker + m_staticTextFilesRemaining->SetLabel(filesToCompareTmp); + + //remaining bytes left for file comparison + const wxString remainingBytesTmp = FreeFileSync::formatFilesizeToShortString(totalData - currentData); + if (m_staticTextDataRemaining->GetLabel() != remainingBytesTmp && (screenChanged = true)) //avoid screen flicker + m_staticTextDataRemaining->SetLabel(remainingBytesTmp); + + if (statistics.get()) + { + if (timeElapsed.Time() - lastStatCallSpeed >= 500) //call method every 500 ms + { + lastStatCallSpeed = timeElapsed.Time(); + + statistics->addMeasurement(currentObjects, currentData.ToDouble()); + + //current speed + const wxString speedTmp = statistics->getBytesPerSecond(); + if (m_staticTextSpeed->GetLabel() != speedTmp && (screenChanged = true)) //avoid screen flicker + m_staticTextSpeed->SetLabel(speedTmp); + + if (timeElapsed.Time() - lastStatCallRemTime >= 2000) //call method every two seconds only + { + lastStatCallRemTime = timeElapsed.Time(); + + //remaining time + const wxString timeRemainingTmp = statistics->getRemainingTime(); + if (m_staticTextTimeRemaining->GetLabel() != timeRemainingTmp && (screenChanged = true)) //avoid screen flicker + m_staticTextTimeRemaining->SetLabel(timeRemainingTmp); + } + } + } + + //time elapsed + const wxString timeElapsedTmp = (wxTimeSpan::Milliseconds(timeElapsed.Time())).Format(); + if (m_staticTextTimeElapsed->GetLabel() != timeElapsedTmp && (screenChanged = true)) //avoid screen flicker + m_staticTextTimeElapsed->SetLabel(timeElapsedTmp); + + //do the ui update + if (screenChanged) + bSizer42->Layout(); + } + updateUiNow(); +} +//######################################################################################## + + +class SyncStatusImpl : public SyncStatusDlgGenerated +{ +public: + SyncStatusImpl(StatusHandler& updater, wxWindow* parentWindow); + ~SyncStatusImpl(); + + void resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess); + void incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed); + void setStatusText_NoUpdate(const Zstring& text); + void updateStatusDialogNow(); + + void setCurrentStatus(SyncStatus::SyncStatusID id); + void processHasFinished(SyncStatus::SyncStatusID id, const wxString& finalMessage); //essential to call this in StatusUpdater derived class destructor at the LATEST(!) to prevent access to currentStatusUpdater + + void minimizeToTray(); + +private: + void OnKeyPressed(wxKeyEvent& event); + virtual void OnOkay(wxCommandEvent& event); + virtual void OnPause(wxCommandEvent& event); + virtual void OnAbort(wxCommandEvent& event); + virtual void OnClose(wxCloseEvent& event); + virtual void OnIconize(wxIconizeEvent& event); + + void resumeFromSystray(); + bool currentProcessIsRunning(); + + wxStopWatch timeElapsed; + + StatusHandler* processStatusHandler; + wxWindow* mainDialog; + + //gauge variables + int totalObjects; + wxLongLong totalData; + int currentObjects; //each object represents a file or directory processed + wxLongLong currentData; //each data element represents one byte for proper progress indicator scaling + double scalingFactor; //nr of elements has to be normalized to smaller nr. because of range of int limitation + + Zstring currentStatusText; + bool processPaused; + SyncStatus::SyncStatusID currentStatus; + + //remaining time + std::auto_ptr<Statistics> statistics; + long lastStatCallSpeed; //used for calculating intervals between statistics update + long lastStatCallRemTime; // + + boost::shared_ptr<MinimizeToTray> minimizedToSysTray; //optional: if filled, hides all visible windows, shows again if destroyed +}; + + +//redirect to implementation +SyncStatus::SyncStatus(StatusHandler& updater, wxWindow* parentWindow, bool startSilent) : + pimpl(new SyncStatusImpl(updater, parentWindow)) +{ + if (startSilent) + pimpl->minimizeToTray(); + else + { + pimpl->Show(); + pimpl->updateStatusDialogNow(); //update visual statistics to get rid of "dummy" texts + } +} + +SyncStatus::~SyncStatus() +{ + //DON'T delete pimpl! it will be deleted by the user clicking "OK/Cancel" -> (wxWindow::Destroy()) +} + +wxWindow* SyncStatus::getAsWindow() +{ + return pimpl; +} + +void SyncStatus::closeWindowDirectly() //don't wait for user (silent mode) +{ + pimpl->Destroy(); +} + +void SyncStatus::resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess) +{ + pimpl->resetGauge(totalObjectsToProcess, totalDataToProcess); +} + +void SyncStatus::incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed) +{ + pimpl->incProgressIndicator_NoUpdate(objectsProcessed, dataProcessed); +} + +void SyncStatus::setStatusText_NoUpdate(const Zstring& text) +{ + pimpl->setStatusText_NoUpdate(text); +} + +void SyncStatus::updateStatusDialogNow() +{ + pimpl->updateStatusDialogNow(); +} + +void SyncStatus::setCurrentStatus(SyncStatusID id) +{ + pimpl->setCurrentStatus(id); +} + +void SyncStatus::processHasFinished(SyncStatusID id, const wxString& finalMessage) +{ + pimpl->processHasFinished(id, finalMessage); +} +//######################################################################################## + + +SyncStatusImpl::SyncStatusImpl(StatusHandler& updater, wxWindow* parentWindow) : + SyncStatusDlgGenerated(parentWindow, + wxID_ANY, + parentWindow ? wxEmptyString : _("FreeFileSync - Folder Comparison and Synchronization"), + wxDefaultPosition, wxSize(638, 376), + parentWindow ? + wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT : + wxDEFAULT_FRAME_STYLE | wxTAB_TRAVERSAL), + processStatusHandler(&updater), + mainDialog(parentWindow), + totalObjects(0), + totalData(0), + currentObjects(0), + currentData(0), + scalingFactor(0), + processPaused(false), + currentStatus(SyncStatus::ABORTED), + statistics(NULL), + lastStatCallSpeed(-1000000), //some big number + lastStatCallRemTime(-1000000) +{ + m_animationControl1->SetAnimation(*GlobalResources::getInstance().animationSync); + m_animationControl1->Play(); + + m_staticTextSpeed->SetLabel(wxT("-")); + m_staticTextTimeRemaining->SetLabel(wxT("-")); + + //initialize gauge + m_gauge1->SetRange(50000); + m_gauge1->SetValue(0); + + m_buttonAbort->SetFocus(); + + if (mainDialog) //disable (main) window while this status dialog is shown + mainDialog->Disable(); + + timeElapsed.Start(); //measure total time + + //hide "processed" statistics until end of process + bSizerObjectsProcessed->Show(false); + bSizerDataProcessed->Show(false); + + + SetIcon(*GlobalResources::getInstance().programIcon); //set application icon + + //register key event + Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(SyncStatusImpl::OnKeyPressed), NULL, this); +} + + +SyncStatusImpl::~SyncStatusImpl() +{ + if (mainDialog) + { + mainDialog->Enable(); + mainDialog->Raise(); + mainDialog->SetFocus(); + } + + if (minimizedToSysTray.get()) + minimizedToSysTray->keepHidden(); //avoid window flashing shortly before it is destroyed +} + + +void SyncStatusImpl::OnKeyPressed(wxKeyEvent& event) +{ + const int keyCode = event.GetKeyCode(); + if (keyCode == WXK_ESCAPE) + Close(); //generate close event: do NOT destroy window unconditionally! + + event.Skip(); +} + + +void SyncStatusImpl::resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess) +{ + currentData = 0; + totalData = totalDataToProcess; + + currentObjects = 0; + totalObjects = totalObjectsToProcess; + + if (totalData != 0) + scalingFactor = 50000 / totalData.ToDouble(); //let's normalize to 50000 + else + scalingFactor = 0; + + //set new statistics handler: 10 seconds "window" for remaining time, 5 seconds for speed + statistics.reset(new Statistics(totalObjectsToProcess, totalDataToProcess.ToDouble(), 10000, 5000)); + lastStatCallSpeed = -1000000; //some big number + lastStatCallRemTime = -1000000; +} + + +void SyncStatusImpl::incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed) +{ + currentData += dataProcessed; + currentObjects += objectsProcessed; +} + + +void SyncStatusImpl::setStatusText_NoUpdate(const Zstring& text) +{ + currentStatusText = text; +} + + +void SyncStatusImpl::updateStatusDialogNow() +{ + //static RetrieveStatistics statistic; + //statistic.writeEntry(currentData, currentObjects); + + //write status information to systray, if window is minimized + if (minimizedToSysTray.get()) + switch (currentStatus) + { + case SyncStatus::SCANNING: + minimizedToSysTray->setToolTip(wxString(wxT("FreeFileSync - ")) + wxString(_("Scanning..."))); + //+ wxT(" ") + globalFunctions::numberToWxString(currentObjects)); + break; + case SyncStatus::COMPARING_CONTENT: + minimizedToSysTray->setToolTip(wxString(wxT("FreeFileSync - ")) + wxString(_("Comparing content...")) + wxT(" ") + + formatPercentage(currentData, totalData), currentData.ToDouble() * 100 / totalData.ToDouble()); + break; + case SyncStatus::SYNCHRONIZING: + minimizedToSysTray->setToolTip(wxString(wxT("FreeFileSync - ")) + wxString(_("Synchronizing...")) + wxT(" ") + + formatPercentage(currentData, totalData), currentData.ToDouble() * 100 / totalData.ToDouble()); + break; + case SyncStatus::ABORTED: + case SyncStatus::FINISHED_WITH_SUCCESS: + case SyncStatus::FINISHED_WITH_ERROR: + case SyncStatus::PAUSE: + minimizedToSysTray->setToolTip(wxT("FreeFileSync")); + } + + //write regular status information (if dialog is visible or not) + { + wxWindowUpdateLocker dummy(this); //reduce display distortion + + bool screenChanged = false; //avoid screen flicker by calling layout() only if necessary + + //progress indicator + if (currentStatus == SyncStatus::SCANNING) + m_gauge1->Pulse(); + else + m_gauge1->SetValue(globalFunctions::round(currentData.ToDouble() * scalingFactor)); + + //status text + const wxString statusTxt = zToWx(currentStatusText); + if (m_textCtrlInfo->GetValue() != statusTxt && (screenChanged = true)) //avoid screen flicker + m_textCtrlInfo->SetValue(statusTxt); + + //remaining objects + const wxString remainingObjTmp = globalFunctions::numberToWxString(totalObjects - currentObjects); + if (m_staticTextRemainingObj->GetLabel() != remainingObjTmp && (screenChanged = true)) //avoid screen flicker + m_staticTextRemainingObj->SetLabel(remainingObjTmp); + + //remaining bytes left for copy + const wxString remainingBytesTmp = FreeFileSync::formatFilesizeToShortString(totalData - currentData); + if (m_staticTextDataRemaining->GetLabel() != remainingBytesTmp && (screenChanged = true)) //avoid screen flicker + m_staticTextDataRemaining->SetLabel(remainingBytesTmp); + + if (statistics.get()) + { + if (timeElapsed.Time() - lastStatCallSpeed >= 500) //call method every 500 ms + { + lastStatCallSpeed = timeElapsed.Time(); + + statistics->addMeasurement(currentObjects, currentData.ToDouble()); + + //current speed + const wxString speedTmp = statistics->getBytesPerSecond(); + if (m_staticTextSpeed->GetLabel() != speedTmp && (screenChanged = true)) //avoid screen flicker + m_staticTextSpeed->SetLabel(speedTmp); + + if (timeElapsed.Time() - lastStatCallRemTime >= 2000) //call method every two seconds only + { + lastStatCallRemTime = timeElapsed.Time(); + + //remaining time + const wxString timeRemainingTmp = statistics->getRemainingTime(); + if (m_staticTextTimeRemaining->GetLabel() != timeRemainingTmp && (screenChanged = true)) //avoid screen flicker + m_staticTextTimeRemaining->SetLabel(timeRemainingTmp); + } + } + } + + //time elapsed + const wxString timeElapsedTmp = wxTimeSpan::Milliseconds(timeElapsed.Time()).Format(); + if (m_staticTextTimeElapsed->GetLabel() != timeElapsedTmp && (screenChanged = true)) //avoid screen flicker + m_staticTextTimeElapsed->SetLabel(timeElapsedTmp); + + + //do the ui update + if (screenChanged) + { + bSizer28->Layout(); + bSizer31->Layout(); + } + } + updateUiNow(); + +//support for pause button + while (processPaused && currentProcessIsRunning()) + { + wxMilliSleep(UI_UPDATE_INTERVAL); + updateUiNow(); + } +} + + +bool SyncStatusImpl::currentProcessIsRunning() +{ + return processStatusHandler != NULL; +} + + +void SyncStatusImpl::setCurrentStatus(SyncStatus::SyncStatusID id) +{ + switch (id) + { + case SyncStatus::ABORTED: + m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusError"))); + m_staticTextStatus->SetLabel(_("Aborted")); + break; + + case SyncStatus::FINISHED_WITH_SUCCESS: + m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusSuccess"))); + m_staticTextStatus->SetLabel(_("Completed")); + break; + + case SyncStatus::FINISHED_WITH_ERROR: + m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusWarning"))); + m_staticTextStatus->SetLabel(_("Completed")); + break; + + case SyncStatus::PAUSE: + m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusPause"))); + m_staticTextStatus->SetLabel(_("Paused")); + break; + + case SyncStatus::SCANNING: + m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusScanning"))); + m_staticTextStatus->SetLabel(_("Scanning...")); + break; + + case SyncStatus::COMPARING_CONTENT: + m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusBinaryCompare"))); + m_staticTextStatus->SetLabel(_("Comparing content...")); + break; + + case SyncStatus::SYNCHRONIZING: + m_bitmapStatus->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("statusSyncing"))); + m_staticTextStatus->SetLabel(_("Synchronizing...")); + break; + } + + currentStatus = id; + Layout(); +} + + +void SyncStatusImpl::processHasFinished(SyncStatus::SyncStatusID id, const wxString& finalMessage) //essential to call this in StatusHandler derived class destructor +{ + //at the LATEST(!) to prevent access to currentStatusHandler + //enable okay and close events; may be set in this method ONLY + + processStatusHandler = NULL; //avoid callback to (maybe) deleted parent process + + setCurrentStatus(id); + + resumeFromSystray(); //if in tray mode... + + m_buttonAbort->Disable(); + m_buttonAbort->Hide(); + m_buttonPause->Disable(); + m_buttonPause->Hide(); + m_buttonOK->Show(); + m_buttonOK->SetFocus(); + + m_animationControl1->Stop(); + m_animationControl1->Hide(); + + //hide speed and remaining time + bSizerSpeed ->Show(false); + bSizerRemTime->Show(false); + + //if everything was processed successfully, hide remaining statistics (is 0 anyway) + if ( totalObjects == currentObjects && + totalData == currentData) + { + bSizerObjectsRemaining->Show(false); + bSizerDataRemaining ->Show(false); + + //show processed statistics at the end (but only if there was some work to be done) + if (totalObjects != 0 || totalData != 0) + { + bSizerObjectsProcessed->Show(true); + bSizerDataProcessed ->Show(true); + + m_staticTextProcessedObj->SetLabel(globalFunctions::numberToWxString(currentObjects)); + m_staticTextDataProcessed->SetLabel(FreeFileSync::formatFilesizeToShortString(currentData)); + } + } + + updateStatusDialogNow(); //keep this sequence to avoid display distortion, if e.g. only 1 item is sync'ed + m_textCtrlInfo->SetValue(finalMessage); // + Layout(); // +} + + +void SyncStatusImpl::OnOkay(wxCommandEvent& event) +{ + if (!currentProcessIsRunning()) Destroy(); +} + + +void SyncStatusImpl::OnPause(wxCommandEvent& event) +{ + static SyncStatus::SyncStatusID previousStatus = SyncStatus::ABORTED; + + if (processPaused) + { + setCurrentStatus(previousStatus); + processPaused = false; + m_buttonPause->SetLabel(_("Pause")); + m_animationControl1->Play(); + + //resume timers + timeElapsed.Resume(); + if (statistics.get()) + statistics->resumeTimer(); + } + else + { + previousStatus = currentStatus; //save current status + + setCurrentStatus(SyncStatus::PAUSE); + processPaused = true; + m_buttonPause->SetLabel(_("Continue")); + m_animationControl1->Stop(); + + //pause timers + timeElapsed.Pause(); + if (statistics.get()) + statistics->pauseTimer(); + } +} + + +void SyncStatusImpl::OnAbort(wxCommandEvent& event) +{ + processPaused = false; + if (currentProcessIsRunning()) + { + m_buttonAbort->Disable(); + m_buttonAbort->Hide(); + m_buttonPause->Disable(); + m_buttonPause->Hide(); + + setStatusText_NoUpdate(wxToZ(_("Abort requested: Waiting for current operation to finish..."))); + //no Layout() or UI-update here to avoid cascaded Yield()-call + + processStatusHandler->requestAbortion(); + } +} + + +void SyncStatusImpl::OnClose(wxCloseEvent& event) +{ + processPaused = false; + if (processStatusHandler) + processStatusHandler->requestAbortion(); + else + Destroy(); +} + + +void SyncStatusImpl::OnIconize(wxIconizeEvent& event) +{ + if (event.Iconized()) //ATTENTION: iconize event is also triggered on "Restore"! (at least under Linux) + minimizeToTray(); +} + + +void SyncStatusImpl::minimizeToTray() +{ + minimizedToSysTray.reset(new MinimizeToTray(this, mainDialog)); +} + + +void SyncStatusImpl::resumeFromSystray() +{ + minimizedToSysTray.reset(); +} diff --git a/ui/progressIndicator.h b/ui/progressIndicator.h new file mode 100644 index 00000000..78044653 --- /dev/null +++ b/ui/progressIndicator.h @@ -0,0 +1,76 @@ +// ************************************************************************** +// * 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 PROGRESSINDICATOR_H_INCLUDED +#define PROGRESSINDICATOR_H_INCLUDED + +#include "../shared/zstring.h" +#include <wx/window.h> + +class CompareStatusImpl; +class SyncStatusImpl; +class StatusHandler; + + +class CompareStatus +{ +public: + CompareStatus(wxWindow& parentWindow); //CompareStatus will be owned by parentWindow! + ~CompareStatus(); + + wxWindow* getAsWindow(); //convenience! don't abuse! + + void init(); //initialize all status values + + void switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess); + void incScannedObjects_NoUpdate(int number); + void incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed); + void setStatusText_NoUpdate(const Zstring& text); + void updateStatusPanelNow(); + +private: + CompareStatusImpl* const pimpl; +}; + + +class SyncStatus +{ +public: + SyncStatus(StatusHandler& updater, + wxWindow* parentWindow, //may be NULL + bool startSilent); + ~SyncStatus(); + + wxWindow* getAsWindow(); //convenience! don't abuse! + + enum SyncStatusID + { + ABORTED, + FINISHED_WITH_SUCCESS, + FINISHED_WITH_ERROR, + PAUSE, + SCANNING, + COMPARING_CONTENT, + SYNCHRONIZING + }; + + void resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess); + void incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed); + void setStatusText_NoUpdate(const Zstring& text); + void updateStatusDialogNow(); + + void setCurrentStatus(SyncStatusID id); + + //essential to call one of these two methods in StatusUpdater derived class destructor at the LATEST(!) + //to prevent access to callback to updater (e.g. request abort) + void processHasFinished(SyncStatusID id, const wxString& finalMessage); + void closeWindowDirectly(); //don't wait for user + +private: + SyncStatusImpl* const pimpl; +}; + +#endif // PROGRESSINDICATOR_H_INCLUDED diff --git a/ui/search.cpp b/ui/search.cpp new file mode 100644 index 00000000..494be608 --- /dev/null +++ b/ui/search.cpp @@ -0,0 +1,264 @@ +// ************************************************************************** +// * 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 "search.h" +#include "guiGenerated.h" +#include <wx/msgdlg.h> +#include <wx/utils.h> + + +class SearchDlg : public SearchDialogGenerated +{ +public: + SearchDlg(wxWindow& parentWindow, wxString& searchText, bool& respectCase); + + enum ReturnCodes + { + BUTTON_OKAY = 1 //mustn't be 0 + }; + +private: + void OnClose(wxCloseEvent& event); + void OnCancel(wxCommandEvent& event); + void OnFindNext(wxCommandEvent& event); + void OnText(wxCommandEvent& event); + + wxString& searchText_; + bool& respectCase_; +}; + + +SearchDlg::SearchDlg(wxWindow& parentWindow, wxString& searchText, bool& respectCase) : + SearchDialogGenerated(&parentWindow), + searchText_(searchText), + respectCase_(respectCase) +{ + m_checkBoxMatchCase->SetValue(respectCase_); + m_textCtrlSearchTxt->SetValue(searchText_); + + CentreOnParent(); //this requires a parent window! +} + + +void SearchDlg::OnClose(wxCloseEvent& event) +{ + EndModal(0); +} + + +void SearchDlg::OnCancel(wxCommandEvent& event) +{ + EndModal(0); +} + + +void SearchDlg::OnFindNext(wxCommandEvent& event) +{ + respectCase_ = m_checkBoxMatchCase->GetValue(); + searchText_ = m_textCtrlSearchTxt->GetValue(); + EndModal(BUTTON_OKAY); +} + + +void SearchDlg::OnText(wxCommandEvent& event) +{ + if (m_textCtrlSearchTxt->GetValue().Trim().IsEmpty()) + m_buttonFindNext->Disable(); + else + m_buttonFindNext->Enable(); + + event.Skip(); +} +//########################################################################################### + + +template <bool respectCase> +class FindInText +{ +public: + FindInText(const wxString& textToFind); + bool found(const wxString& phrase) const; + +private: + wxString textToFind_; +}; + + +template <> +FindInText<true>::FindInText(const wxString& textToFind) : + textToFind_(textToFind) {} + + +template <> +inline +bool FindInText<true>::found(const wxString& phrase) const +{ + return phrase.Find(textToFind_) != wxNOT_FOUND; +} + + +template <> +FindInText<false>::FindInText(const wxString& textToFind) : + textToFind_(textToFind) +{ + textToFind_.MakeUpper(); +} + + +template <> +inline +bool FindInText<false>::found(const wxString& phrase) const +{ + wxString phraseTmp = phrase; //wxWidgets::MakeUpper() is inefficient! + phraseTmp.MakeUpper(); //But performance is not THAT important for this high-level search functionality + return phraseTmp.Find(textToFind_) != wxNOT_FOUND; +} +//########################################################################################### + + +template <bool respectCase> +std::pair<int, int> searchGrid(const wxGrid& grid, + const wxString& searchString, + bool fromBeginToCursor, //specify area to search + bool afterCursorToEnd) // +{ + const int rowCount = const_cast<wxGrid&>(grid).GetNumberRows(); + const int columnCount = const_cast<wxGrid&>(grid).GetNumberCols(); + + //consistency checks on ints: wxGrid uses ints, so we have to use them, too + if (rowCount <= 0 || columnCount <= 0) + return std::make_pair(-1, -1); + + int cursorRow = const_cast<wxGrid&>(grid).GetGridCursorRow(); + int cursorColumn = const_cast<wxGrid&>(grid).GetGridCursorCol(); + + if ( cursorRow < 0 || + cursorRow >= rowCount || + cursorColumn < 0 || + cursorColumn >= columnCount) + { + //cursor not on valid position... + cursorRow = 0; + cursorColumn = 0; + } + + const FindInText<respectCase> searchTxt(searchString); + + if (fromBeginToCursor) + { + for (int row = 0; row < cursorRow; ++row) + for (int col = 0; col < columnCount; ++col) + if (searchTxt.found(const_cast<wxGrid&>(grid).GetCellValue(row, col))) + return std::make_pair(row, col); + + for (int col = 0; col <= cursorColumn; ++col) + if (searchTxt.found(const_cast<wxGrid&>(grid).GetCellValue(cursorRow, col))) + return std::make_pair(cursorRow, col); + } + + if (afterCursorToEnd) + { + //begin search after cursor cell... + for (int col = cursorColumn + 1; col < columnCount; ++col) + if (searchTxt.found(const_cast<wxGrid&>(grid).GetCellValue(cursorRow, col))) + return std::make_pair(cursorRow, col); + + for (int row = cursorRow + 1; row < rowCount; ++row) + for (int col = 0; col < columnCount; ++col) + if (searchTxt.found(const_cast<wxGrid&>(grid).GetCellValue(row, col))) + return std::make_pair(row, col); + } + + return std::make_pair(-1, -1); +} + + +//syntactic sugar... +std::pair<int, int> searchGrid(const wxGrid& grid, + bool respectCase, + const wxString& searchString, + bool fromBeginToCursor, //specify area to search + bool afterCursorToEnd) // +{ + return respectCase ? + searchGrid<true>( grid, searchString, fromBeginToCursor, afterCursorToEnd) : + searchGrid<false>(grid, searchString, fromBeginToCursor, afterCursorToEnd); +} + + +wxString lastSearchString; //this variable really is conceptionally global... + + +void executeSearch(bool forceShowDialog, + bool& respectCase, + wxWindow& parentWindow, + wxGrid& leftGrid, + wxGrid& rightGrid) +{ + if (forceShowDialog || lastSearchString.IsEmpty()) + { + SearchDlg* searchDlg = new SearchDlg(parentWindow, lastSearchString, respectCase); //wxWidgets deletion handling -> deleted by parentWindow + if (static_cast<SearchDlg::ReturnCodes>(searchDlg->ShowModal()) != SearchDlg::BUTTON_OKAY) + return; + } + + wxGrid* targetGrid = NULL; //filled if match is found + std::pair<int, int> targetPos; // + { + wxBusyCursor showHourGlass; + + const bool startLeft = wxWindow::FindFocus() != rightGrid.GetGridWindow(); + wxGrid& firstGrid = startLeft ? leftGrid : rightGrid; + wxGrid& secondGrid = startLeft ? rightGrid : leftGrid; + + //begin with first grid after cursor + targetGrid = &firstGrid; + targetPos = searchGrid(firstGrid, respectCase, lastSearchString, false, true); + if (targetPos.first == -1) + { + //scan second grid completely + targetGrid = &secondGrid; + targetPos = searchGrid(secondGrid, respectCase, lastSearchString, true, true); + + //scan first grid up to cursor + if (targetPos.first == -1) + { + targetGrid = &firstGrid; + targetPos = searchGrid(firstGrid, respectCase, lastSearchString, true, false); + } + } + } + + if (targetPos.first != -1 && targetPos.second != -1) //new position found + { + targetGrid->SetFocus(); + targetGrid->SetGridCursor( targetPos.first, targetPos.second); + targetGrid->SelectRow( targetPos.first); + targetGrid->MakeCellVisible(targetPos.first, targetPos.second); + } + else + { + wxString messageNotFound = _("Cannot find %x"); + messageNotFound.Replace(wxT("%x"), wxString(wxT("\"")) + lastSearchString + wxT("\""), false); + wxMessageBox(messageNotFound, _("Find"), wxOK); + + //show search dialog again + executeSearch(true, respectCase, parentWindow, leftGrid, rightGrid); + } +} +//########################################################################################### + + +void FreeFileSync::startFind(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase) //Strg + F +{ + executeSearch(true, respectCase, parentWindow, leftGrid, rightGrid); +} + + +void FreeFileSync::findNext(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase) //F3 +{ + executeSearch(false, respectCase, parentWindow, leftGrid, rightGrid); +} diff --git a/ui/search.h b/ui/search.h new file mode 100644 index 00000000..51604b8d --- /dev/null +++ b/ui/search.h @@ -0,0 +1,20 @@ +// ************************************************************************** +// * 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 SEARCH_H_INCLUDED +#define SEARCH_H_INCLUDED + +class wxGrid; +class wxWindow; + + +namespace FreeFileSync +{ +void startFind(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase); //Strg + F +void findNext( wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase); //F3 +} + +#endif // SEARCH_H_INCLUDED diff --git a/ui/settingsDialog.cpp b/ui/settingsDialog.cpp index fe037322..754f9e01 100644 --- a/ui/settingsDialog.cpp +++ b/ui/settingsDialog.cpp @@ -1,10 +1,15 @@ +// ************************************************************************** +// * 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 "settingsDialog.h" #include "../shared/systemConstants.h" #include "../library/resources.h" #include <wx/msgdlg.h> #include "../shared/customButton.h" #include "../synchronization.h" -//#include "../algorithm.h" #include "../shared/stringConv.h" #include "util.h" #include <wx/dnd.h> @@ -13,6 +18,8 @@ #include "../shared/xmlBase.h" #include <wx/wupdlock.h> #include "folderPair.h" +#include "messagePopup.h" +#include "../shared/helpProvider.h" using namespace FreeFileSync; @@ -25,7 +32,7 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* window, bool* ignoreErrors) : SyncCfgDlgGenerated(window), cmpVariant(compareVar), - localSyncConfiguration(syncConfiguration), //make working copy of syncConfiguration + currentSyncConfig(syncConfiguration), //make working copy of syncConfiguration refSyncConfiguration(syncConfiguration), refHandleDeletion(handleDeletion), refCustomDeletionDirectory(customDeletionDirectory), @@ -45,7 +52,7 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* window, } //set sync config icons - updateConfigIcons(cmpVariant, localSyncConfiguration); + updateConfigIcons(cmpVariant, currentSyncConfig); //set icons for this dialog m_bitmapLeftOnly->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("leftOnly"))); @@ -57,14 +64,14 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* window, bSizer201->Layout(); //wxButtonWithImage size might have changed - m_buttonApply->SetFocus(); + m_buttonOK->SetFocus(); Fit(); } //################################################################################################################# -SyncCfgDialog::~SyncCfgDialog() {} +SyncCfgDialog::~SyncCfgDialog() {} //non-inline destructor for std::auto_ptr to work with forward declaration void SyncCfgDialog::updateConfigIcons(const FreeFileSync::CompareVariant cmpVar, const FreeFileSync::SyncConfiguration& syncConfig) @@ -96,7 +103,7 @@ void SyncCfgDialog::updateConfigIcons(const FreeFileSync::CompareVariant cmpVar, sbSizerSyncDirections); //set radiobuttons -> have no parameter-ownership at all! - switch (localSyncConfiguration.getVariant()) + switch (FreeFileSync::getVariant(currentSyncConfig)) { case SyncConfiguration::AUTOMATIC: m_radioBtnAutomatic->SetValue(true); //automatic mode @@ -107,9 +114,6 @@ void SyncCfgDialog::updateConfigIcons(const FreeFileSync::CompareVariant cmpVar, case SyncConfiguration::UPDATE: m_radioBtnUpdate->SetValue(true); //Update -> break; - case SyncConfiguration::TWOWAY: - m_radioBtnTwoWay->SetValue(true); //two way <-> - break; case SyncConfiguration::CUSTOM: m_radioBtnCustom->SetValue(true); //custom break; @@ -285,7 +289,7 @@ void SyncCfgDialog::OnCancel(wxCommandEvent& event) void SyncCfgDialog::OnApply(wxCommandEvent& event) { //write configuration to main dialog - refSyncConfiguration = localSyncConfiguration; + refSyncConfiguration = currentSyncConfig; refHandleDeletion = getDeletionHandling(); refCustomDeletionDirectory = m_textCtrlCustomDelFolder->GetValue(); if (refIgnoreErrors) @@ -342,15 +346,15 @@ void updateToolTipDeletionHandling(wxChoice* choiceHandleError, wxPanel* customD switch (value) { case FreeFileSync::DELETE_PERMANENTLY: - choiceHandleError->SetToolTip(_("Delete or overwrite files permanently.")); + choiceHandleError->SetToolTip(_("Delete or overwrite files permanently")); break; case FreeFileSync::MOVE_TO_RECYCLE_BIN: - choiceHandleError->SetToolTip(_("Use Recycle Bin when deleting or overwriting files.")); + choiceHandleError->SetToolTip(_("Use Recycle Bin when deleting or overwriting files")); break; case FreeFileSync::MOVE_TO_CUSTOM_DIRECTORY: - choiceHandleError->SetToolTip(_("Move files into a time-stamped subdirectory.")); + choiceHandleError->SetToolTip(_("Move files into a time-stamped subdirectory")); customDir->Enable(); break; } @@ -406,29 +410,22 @@ void SyncCfgDialog::OnChangeDeletionHandling(wxCommandEvent& event) void SyncCfgDialog::OnSyncAutomatic(wxCommandEvent& event) { - localSyncConfiguration.setVariant(SyncConfiguration::AUTOMATIC); - updateConfigIcons(cmpVariant, localSyncConfiguration); + FreeFileSync::setVariant(currentSyncConfig, SyncConfiguration::AUTOMATIC); + updateConfigIcons(cmpVariant, currentSyncConfig); } void SyncCfgDialog::OnSyncLeftToRight(wxCommandEvent& event) { - localSyncConfiguration.setVariant(SyncConfiguration::MIRROR); - updateConfigIcons(cmpVariant, localSyncConfiguration); + FreeFileSync::setVariant(currentSyncConfig, SyncConfiguration::MIRROR); + updateConfigIcons(cmpVariant, currentSyncConfig); } void SyncCfgDialog::OnSyncUpdate(wxCommandEvent& event) { - localSyncConfiguration.setVariant(SyncConfiguration::UPDATE); - updateConfigIcons(cmpVariant, localSyncConfiguration); -} - - -void SyncCfgDialog::OnSyncBothSides(wxCommandEvent& event) -{ - localSyncConfiguration.setVariant(SyncConfiguration::TWOWAY); - updateConfigIcons(cmpVariant, localSyncConfiguration); + FreeFileSync::setVariant(currentSyncConfig, SyncConfiguration::UPDATE); + updateConfigIcons(cmpVariant, currentSyncConfig); } @@ -449,45 +446,45 @@ void toggleSyncDirection(SyncDirection& current) } -void SyncCfgDialog::OnExLeftSideOnly( wxCommandEvent& event ) +void SyncCfgDialog::OnExLeftSideOnly(wxCommandEvent& event ) { - toggleSyncDirection(localSyncConfiguration.exLeftSideOnly); - updateConfigIcons(cmpVariant, localSyncConfiguration); + toggleSyncDirection(currentSyncConfig.exLeftSideOnly); + updateConfigIcons(cmpVariant, currentSyncConfig); } -void SyncCfgDialog::OnExRightSideOnly( wxCommandEvent& event ) +void SyncCfgDialog::OnExRightSideOnly(wxCommandEvent& event ) { - toggleSyncDirection(localSyncConfiguration.exRightSideOnly); - updateConfigIcons(cmpVariant, localSyncConfiguration); + toggleSyncDirection(currentSyncConfig.exRightSideOnly); + updateConfigIcons(cmpVariant, currentSyncConfig); } -void SyncCfgDialog::OnLeftNewer( wxCommandEvent& event ) +void SyncCfgDialog::OnLeftNewer(wxCommandEvent& event ) { - toggleSyncDirection(localSyncConfiguration.leftNewer); - updateConfigIcons(cmpVariant, localSyncConfiguration); + toggleSyncDirection(currentSyncConfig.leftNewer); + updateConfigIcons(cmpVariant, currentSyncConfig); } -void SyncCfgDialog::OnRightNewer( wxCommandEvent& event ) +void SyncCfgDialog::OnRightNewer(wxCommandEvent& event ) { - toggleSyncDirection(localSyncConfiguration.rightNewer); - updateConfigIcons(cmpVariant, localSyncConfiguration); + toggleSyncDirection(currentSyncConfig.rightNewer); + updateConfigIcons(cmpVariant, currentSyncConfig); } -void SyncCfgDialog::OnDifferent( wxCommandEvent& event ) +void SyncCfgDialog::OnDifferent(wxCommandEvent& event ) { - toggleSyncDirection(localSyncConfiguration.different); - updateConfigIcons(cmpVariant, localSyncConfiguration); + toggleSyncDirection(currentSyncConfig.different); + updateConfigIcons(cmpVariant, currentSyncConfig); } void SyncCfgDialog::OnConflict(wxCommandEvent& event) { - toggleSyncDirection(localSyncConfiguration.conflict); - updateConfigIcons(cmpVariant, localSyncConfiguration); + toggleSyncDirection(currentSyncConfig.conflict); + updateConfigIcons(cmpVariant, currentSyncConfig); } @@ -620,10 +617,15 @@ BatchDialog::BatchDialog(wxWindow* window, const wxString& filename) : } +BatchDialog::~BatchDialog() {} //non-inline destructor for std::auto_ptr to work with forward declaration + + void BatchDialog::init() { wxWindowUpdateLocker dummy(this); //avoid display distortion + m_bpButtonHelp->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("help"))); + //init handling of first folder pair firstFolderPair.reset(new FirstBatchFolderPairCfg(*this)); @@ -681,7 +683,7 @@ void BatchDialog::updateToolTipErrorHandling(const xmlAccess::OnError value) m_choiceHandleError->SetToolTip(_("Hide all error and warning messages")); break; case xmlAccess::ON_ERROR_EXIT: - m_choiceHandleError->SetToolTip(_("Exit immediately and set returncode < 0")); + m_choiceHandleError->SetToolTip(_("Abort synchronization immediately")); break; } } @@ -693,7 +695,7 @@ void BatchDialog::setSelectionHandleError(const xmlAccess::OnError value) m_choiceHandleError->Append(_("Show popup")); m_choiceHandleError->Append(_("Ignore errors")); if (m_checkBoxSilent->GetValue()) //this option shall be available for silent mode only! - m_choiceHandleError->Append(_("Exit with RC < 0")); + m_choiceHandleError->Append(_("Exit instantly")); //default m_choiceHandleError->SetSelection(0); @@ -814,6 +816,16 @@ void BatchDialog::OnConflict(wxCommandEvent& event) } +void BatchDialog::OnHelp(wxCommandEvent& event) +{ +#ifdef FFS_WIN + FreeFileSync::displayHelpEntry(wxT("html\\advanced\\ScheduleBatch.html")); +#elif defined FFS_LINUX + FreeFileSync::displayHelpEntry(wxT("html/advanced/ScheduleBatch.html")); +#endif +} + + void BatchDialog::OnCheckFilter(wxCommandEvent& event) { updateVisibleTabs(); @@ -837,9 +849,6 @@ void BatchDialog::OnCheckAutomatic(wxCommandEvent& event) //toggle automatic setting localSyncConfiguration.automatic = !localSyncConfiguration.automatic; - if (localSyncConfiguration.automatic) - localSyncConfiguration.setVariant(SyncConfiguration::AUTOMATIC); //reset conflict-setting - updateConfigIcons(getCurrentCompareVar(), localSyncConfiguration); Fit(); } diff --git a/ui/settingsDialog.h b/ui/settingsDialog.h index 15d880f4..5a36b1c4 100644 --- a/ui/settingsDialog.h +++ b/ui/settingsDialog.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 SYNCDIALOG_H_INCLUDED #define SYNCDIALOG_H_INCLUDED @@ -8,6 +14,7 @@ class BatchFileDropEvent; class BatchFolderPairPanel; class FirstBatchFolderPairCfg; +class wxHelpController; namespace FreeFileSync { @@ -54,7 +61,6 @@ private: virtual void OnSyncAutomatic( wxCommandEvent& event); virtual void OnSyncLeftToRight( wxCommandEvent& event); virtual void OnSyncUpdate( wxCommandEvent& event); - virtual void OnSyncBothSides( wxCommandEvent& event); virtual void OnExLeftSideOnly( wxCommandEvent& event); virtual void OnExRightSideOnly( wxCommandEvent& event); @@ -83,7 +89,7 @@ private: const FreeFileSync::CompareVariant cmpVariant; //temporal copy of maindialog.cfg.syncConfiguration - FreeFileSync::SyncConfiguration localSyncConfiguration; + FreeFileSync::SyncConfiguration currentSyncConfig; //changing data FreeFileSync::SyncConfiguration& refSyncConfiguration; @@ -104,7 +110,7 @@ class BatchDialog: public BatchDlgGenerated public: BatchDialog(wxWindow* window, const xmlAccess::XmlBatchConfig& batchCfg); BatchDialog(wxWindow* window, const wxString& filename); - ~BatchDialog() {}; + ~BatchDialog(); enum { @@ -120,6 +126,7 @@ private: virtual void OnRightNewer( wxCommandEvent& event); virtual void OnDifferent( wxCommandEvent& event); virtual void OnConflict( wxCommandEvent& event); + virtual void OnHelp( wxCommandEvent& event); virtual void OnCheckAutomatic( wxCommandEvent& event); virtual void OnCheckFilter( wxCommandEvent& event); diff --git a/ui/sorting.h b/ui/sorting.h index 5771d7db..9592b36f 100644 --- a/ui/sorting.h +++ b/ui/sorting.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 SORTING_H_INCLUDED #define SORTING_H_INCLUDED @@ -12,11 +18,7 @@ namespace FreeFileSync inline int compareString(const Zstring& stringA, const Zstring& stringB) { -#ifdef FFS_WIN //Windows does NOT distinguish between upper/lower-case - return stringA.CmpNoCase(stringB); -#elif defined FFS_LINUX //Linux DOES distinguish between upper/lower-case - return stringA.Cmp(stringB); -#endif + return stringA.cmpFileName(stringB); } @@ -131,7 +133,7 @@ bool sortByFileSize(const FileSystemObject& a, const FileSystemObject& b) else if (fileObjB == NULL) return true; //directories last - //sortAscending shall result in list beginning with largest files first + //return list beginning with largest files first return Compare<!ascending>().isSmallerThan(fileObjA->getFileSize<side>(), fileObjB->getFileSize<side>()); } @@ -154,10 +156,33 @@ bool sortByDate(const FileSystemObject& a, const FileSystemObject& b) else if (fileObjB == NULL) return true; //directories last + //return list beginning with newest files first return Compare<!ascending>().isSmallerThan(fileObjA->getLastWriteTime<side>(), fileObjB->getLastWriteTime<side>()); } +template <bool ascending, SelectedSide side> +inline +bool sortByExtension(const FileSystemObject& a, const FileSystemObject& b) +{ + if (a.isEmpty<side>()) + return false; //empty rows always last + else if (b.isEmpty<side>()) + return true; //empty rows always last + + + const FileMapping* fileObjA = dynamic_cast<const FileMapping*>(&a); + const FileMapping* fileObjB = dynamic_cast<const FileMapping*>(&b); + + if (fileObjA == NULL) + return false; //directories last + else if (fileObjB == NULL) + return true; //directories last + + return Compare<ascending>().isSmallerThan(fileObjA->getExtension<side>(), fileObjB->getExtension<side>()); +} + + template <bool ascending> inline bool sortByCmpResult(const FileSystemObject& a, const FileSystemObject& b) diff --git a/ui/trayIcon.cpp b/ui/trayIcon.cpp index 921fe79f..b7f74d1d 100644 --- a/ui/trayIcon.cpp +++ b/ui/trayIcon.cpp @@ -1,10 +1,99 @@ +// ************************************************************************** +// * 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 "trayIcon.h" #include "../library/resources.h" #include "smallDialogs.h" #include <wx/taskbar.h> #include <cmath> +#include <wx/image.h> +#include <wx/menu.h> +#include <wx/icon.h> //req. by Linux + +namespace +{ +inline +int roundNum(double d) //little rounding function +{ + return static_cast<int>(d < 0 ? d - .5 : d + .5); +} +wxIcon generateIcon(size_t percent) //generate icon with progress indicator +{ + percent = std::min(percent, static_cast<size_t>(100u)); //handle invalid input + +#ifdef FFS_WIN + static const wxBitmap trayIcon = GlobalResources::getInstance().getImageByName(wxT("FFS_tray_win.png")); +#elif defined FFS_LINUX + static const wxBitmap trayIcon = GlobalResources::getInstance().getImageByName(wxT("FFS_tray_linux.png")); +#endif + + const int indicatorHeight = roundNum((trayIcon.GetHeight() * percent) / 100.0); + + //minor optimization + static std::pair<int, wxIcon> buffer = std::make_pair(-1, wxNullIcon); + if (buffer.first == indicatorHeight) + return buffer.second; + + if ( trayIcon.GetWidth() > 0 && + trayIcon.GetHeight() > 0) + { + static const int indicatorWidth = trayIcon.GetWidth() * .25; + const int indicatorXBegin = ceil((trayIcon.GetWidth() - indicatorWidth) / 2.0); + const int indicatorYBegin = trayIcon.GetHeight() - indicatorHeight; + + wxImage genImage(trayIcon.ConvertToImage()); + + //draw progress indicator: do NOT use wxDC::DrawRectangle! Doesn't respect alpha in Windows, but does in Linux! + //We need a simple, working solution: + unsigned char* const data = genImage.GetData(); + for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row) + { + for (int col = indicatorXBegin; col < indicatorXBegin + indicatorWidth; ++col) + { + unsigned char* const pixelBegin = data + (row * genImage.GetWidth() + col) * 3; + pixelBegin[0] = 255; //red + pixelBegin[1] = 255; //green + pixelBegin[2] = 0; //blue + } + } + + if (genImage.HasAlpha()) + { + unsigned char* const alpha = genImage.GetAlpha(); + //make progress indicator fully opaque: + for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row) + ::memset(alpha + row * genImage.GetWidth() + indicatorXBegin, wxIMAGE_ALPHA_OPAQUE, indicatorWidth); + } + + wxIcon genIcon; + genIcon.CopyFromBitmap(wxBitmap(genImage)); + + //fill buffer + buffer.first = indicatorHeight; + buffer.second = genIcon; + + return genIcon; + } + + //fallback + wxIcon defaultIcon; + defaultIcon.CopyFromBitmap(trayIcon); + + //fill buffer + buffer.first = indicatorHeight; + buffer.second = defaultIcon; + + return defaultIcon; +} +} + + +//------------------------------------------------------------------------------------------------ enum Selection { CONTEXT_RESTORE, @@ -46,7 +135,7 @@ MinimizeToTray::MinimizeToTray(wxTopLevelWindow* callerWnd, wxWindow* secondWnd) secondWnd_(secondWnd), trayIcon(new TaskBarImpl(this)) { - trayIcon->SetIcon(*GlobalResources::getInstance().programIcon, wxT("FreeFileSync")); + trayIcon->SetIcon(generateIcon(0), wxT("FreeFileSync")); trayIcon->Connect(wxEVT_TASKBAR_LEFT_DCLICK, wxCommandEventHandler(MinimizeToTray::OnDoubleClick), NULL, this); //register double-click if (callerWnd_) @@ -89,86 +178,6 @@ void MinimizeToTray::resumeFromTray() //remove trayIcon and restore windows: Mi } -namespace -{ -inline -int roundNum(double d) //little rounding function -{ - return static_cast<int>(d < 0 ? d - .5 : d + .5); -} - - -wxIcon generateIcon(size_t percent) //generate icon with progress indicator -{ - percent = std::min(percent, static_cast<size_t>(100u)); //handle invalid input - -#ifdef FFS_WIN - static const wxBitmap trayIcon = GlobalResources::getInstance().getImageByName(wxT("FFS_tray_win.png")); -#elif defined FFS_LINUX - static const wxBitmap trayIcon = GlobalResources::getInstance().getImageByName(wxT("FFS_tray_linux.png")); -#endif - - const int indicatorHeight = roundNum((trayIcon.GetHeight() * percent) / 100.0); - - //minor optimization - static std::pair<int, wxIcon> buffer = std::make_pair(-1, wxNullIcon); - if (buffer.first == indicatorHeight) - return buffer.second; - - if ( trayIcon.GetWidth() > 0 && - trayIcon.GetHeight() > 0) - { - static const int indicatorWidth = trayIcon.GetWidth() * .25; - const int indicatorXBegin = ceil((trayIcon.GetWidth() - indicatorWidth) / 2.0); - const int indicatorYBegin = trayIcon.GetHeight() - indicatorHeight; - - wxImage genImage(trayIcon.ConvertToImage()); - - //draw progress indicator: do NOT use wxDC::DrawRectangle! Doesn't respect alpha in Windows, but does in Linux! - //We need a simple, working solution: - unsigned char* const data = genImage.GetData(); - for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row) - { - for (int col = indicatorXBegin; col < indicatorXBegin + indicatorWidth; ++col) - { - unsigned char* const pixelBegin = data + (row * genImage.GetWidth() + col) * 3; - pixelBegin[0] = 255; //red - pixelBegin[1] = 255; //green - pixelBegin[2] = 0; //blue - } - } - - if (genImage.HasAlpha()) - { - unsigned char* const alpha = genImage.GetAlpha(); - //make progress indicator fully opaque: - for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row) - ::memset(alpha + row * genImage.GetWidth() + indicatorXBegin, wxIMAGE_ALPHA_OPAQUE, indicatorWidth); - } - - wxIcon genIcon; - genIcon.CopyFromBitmap(wxBitmap(genImage)); - - //fill buffer - buffer.first = indicatorHeight; - buffer.second = genIcon; - - return genIcon; - } - - //fallback - wxIcon defaultIcon; - defaultIcon.CopyFromBitmap(trayIcon); - - //fill buffer - buffer.first = indicatorHeight; - buffer.second = defaultIcon; - - return defaultIcon; -} -} - - void MinimizeToTray::setToolTip(const wxString& toolTipText, size_t percent) { if (trayIcon) @@ -189,12 +198,8 @@ void MinimizeToTray::OnContextMenuSelection(wxCommandEvent& event) switch (eventId) { case CONTEXT_ABOUT: - { - AboutDlg* aboutDlg = new AboutDlg(NULL); - aboutDlg->ShowModal(); - aboutDlg->Destroy(); - } - break; + FreeFileSync::showAboutDialog(); + break; case CONTEXT_RESTORE: resumeFromTray(); } diff --git a/ui/trayIcon.h b/ui/trayIcon.h index 8c8797d4..b351dfc8 100644 --- a/ui/trayIcon.h +++ b/ui/trayIcon.h @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 TRAYICON_H_INCLUDED #define TRAYICON_H_INCLUDED diff --git a/ui/util.cpp b/ui/util.cpp index 853bd91b..c611e252 100644 --- a/ui/util.cpp +++ b/ui/util.cpp @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 "util.h" #include <wx/scrolwin.h> #include <wx/textctrl.h> @@ -24,7 +30,7 @@ wxString FreeFileSync::formatFilesizeToShortString(const wxLongLong& filesize) wxString FreeFileSync::formatFilesizeToShortString(const wxULongLong& filesize) { return FreeFileSync::formatFilesizeToShortString(filesize.ToDouble()); -}; +} wxString FreeFileSync::formatFilesizeToShortString(const double filesize) @@ -85,9 +91,9 @@ wxString FreeFileSync::formatFilesizeToShortString(const double filesize) } -wxString FreeFileSync::fromatPercentage(const wxLongLong& dividend, const wxLongLong& divisor) +wxString FreeFileSync::formatPercentage(const wxLongLong& dividend, const wxLongLong& divisor) { - const double ratio = dividend.ToDouble() * 100 / divisor.ToDouble(); + const double ratio = divisor != 0 ? dividend.ToDouble() * 100 / divisor.ToDouble() : 0; wxString output = _("%x Percent"); output.Replace(wxT("%x"), wxString::Format(wxT("%3.2f"), ratio), false); return output; @@ -1,3 +1,9 @@ +// ************************************************************************** +// * 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 UTIL_H_INCLUDED #define UTIL_H_INCLUDED @@ -17,7 +23,7 @@ wxString formatFilesizeToShortString(const wxLongLong& filesize); wxString formatFilesizeToShortString(const wxULongLong& filesize); wxString formatFilesizeToShortString(const double filesize); -wxString fromatPercentage(const wxLongLong& dividend, const wxLongLong& divisor); +wxString formatPercentage(const wxLongLong& dividend, const wxLongLong& divisor); wxString includeNumberSeparator(const wxString& number); diff --git a/version/version.h b/version/version.h index 6f9095ce..f46f01bd 100644 --- a/version/version.h +++ b/version/version.h @@ -1,6 +1,12 @@ +// ************************************************************************** +// * 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 <wx/string.h> namespace FreeFileSync { - static const wxString currentVersion = wxT("3.3"); //internal linkage! + static const wxString currentVersion = wxT("3.4"); //internal linkage! } |