summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Wilhelm <daniel@wili.li>2014-04-18 17:05:30 +0200
committerDaniel Wilhelm <daniel@wili.li>2014-04-18 17:05:30 +0200
commitc0fce877c478ddbf71a1b651c789e5ea00a00144 (patch)
treede01b0ae8fd296bd24fbca54a80f2f0ba071d461
parent3.3 (diff)
downloadFreeFileSync-c0fce877c478ddbf71a1b651c789e5ea00a00144.tar.gz
FreeFileSync-c0fce877c478ddbf71a1b651c789e5ea00a00144.tar.bz2
FreeFileSync-c0fce877c478ddbf71a1b651c789e5ea00a00144.zip
3.4
-rw-r--r--Application.cpp48
-rw-r--r--Application.h16
-rw-r--r--BUILD/Changelog.txt21
-rw-r--r--BUILD/FreeFileSync.chmbin168410 -> 265290 bytes
-rw-r--r--BUILD/Help/FreeFileSync.hhp1
-rw-r--r--BUILD/Help/Table of Contents.hhc4
-rw-r--r--BUILD/Help/html/Features.html4
-rw-r--r--BUILD/Help/html/advanced/069dee95-d329-4e99-ab3d-678edf80fbca.jpegbin0 -> 35558 bytes
-rw-r--r--BUILD/Help/html/advanced/17e8fbfe-a994-4860-abaa-e00e0289b44c.jpegbin0 -> 7121 bytes
-rw-r--r--BUILD/Help/html/advanced/7aa44556-38dc-467e-9902-2c9143cd0116.jpegbin0 -> 67331 bytes
-rw-r--r--BUILD/Help/html/advanced/93f0cb09-bd16-4d76-b764-e30042a8e123.jpegbin0 -> 5576 bytes
-rw-r--r--BUILD/Help/html/advanced/EnvironmentVariables.html8
-rw-r--r--BUILD/Help/html/advanced/RunAsService.html116
-rw-r--r--BUILD/Help/html/advanced/RunAsService_html_4f230a46.jpgbin0 -> 11177 bytes
-rw-r--r--BUILD/Help/html/advanced/RunAsService_html_68e0fe53.jpgbin0 -> 4262 bytes
-rw-r--r--BUILD/Help/html/advanced/RunAsService_html_m3be0f332.jpgbin0 -> 7969 bytes
-rw-r--r--BUILD/Help/html/advanced/RunAsService_html_m3e56d901.jpgbin0 -> 30249 bytes
-rw-r--r--BUILD/Help/html/advanced/ScheduleBatch.html27
-rw-r--r--BUILD/Help/html/advanced/ScheduleBatch_html_372f0f3.gifbin0 -> 20148 bytes
-rw-r--r--BUILD/Help/html/advanced/ScheduleBatch_html_m10bf0d36.gifbin0 -> 20720 bytes
-rw-r--r--BUILD/Help/html/advanced/SendMail.html17
-rw-r--r--BUILD/Help/html/advanced/VariableDrive.html16
-rw-r--r--BUILD/Help/html/advanced/bf02de4e-7b45-4353-97e8-85b55cff3ac5.jpegbin0 -> 5829 bytes
-rw-r--r--BUILD/Help/html/advanced/ce1ccceb-e3c6-4fab-adac-ef16f36698b0.jpegbin0 -> 12654 bytes
-rw-r--r--BUILD/Help/html/advanced/f1d462c4-3bd9-4463-a858-ae3de5f6af9e.jpegbin0 -> 8929 bytes
-rw-r--r--BUILD/Languages/chinese_simple.lng120
-rw-r--r--BUILD/Languages/chinese_traditional.lng122
-rw-r--r--BUILD/Languages/czech.lng122
-rw-r--r--BUILD/Languages/dutch.lng120
-rw-r--r--BUILD/Languages/finnish.lng162
-rw-r--r--BUILD/Languages/french.lng232
-rw-r--r--BUILD/Languages/german.lng126
-rw-r--r--BUILD/Languages/hungarian.lng122
-rw-r--r--BUILD/Languages/italian.lng120
-rw-r--r--BUILD/Languages/japanese.lng108
-rw-r--r--BUILD/Languages/polish.lng122
-rw-r--r--BUILD/Languages/portuguese.lng114
-rw-r--r--BUILD/Languages/portuguese_br.lng124
-rw-r--r--BUILD/Languages/romanian.lng136
-rw-r--r--BUILD/Languages/russian.lng116
-rw-r--r--BUILD/Languages/slovenian.lng124
-rw-r--r--BUILD/Languages/spanish.lng258
-rw-r--r--BUILD/Languages/swedish.lng122
-rw-r--r--BUILD/Languages/turkish.lng112
-rw-r--r--BUILD/Resources.datbin275228 -> 291613 bytes
-rw-r--r--Cleanup.cmd30
-rw-r--r--FreeFileSync.cbp46
-rw-r--r--FreeFileSync.vcproj29
-rw-r--r--Makefile55
-rw-r--r--RealtimeSync/RealtimeSync.cbp1
-rw-r--r--RealtimeSync/RealtimeSync.vcproj24
-rw-r--r--RealtimeSync/application.cpp29
-rw-r--r--RealtimeSync/application.h16
-rw-r--r--RealtimeSync/functions.cpp6
-rw-r--r--RealtimeSync/functions.h6
-rw-r--r--RealtimeSync/guiGenerated.cpp10
-rw-r--r--RealtimeSync/mainDialog.cpp29
-rw-r--r--RealtimeSync/mainDialog.h17
-rw-r--r--RealtimeSync/makefile21
-rw-r--r--RealtimeSync/pch.h6
-rw-r--r--RealtimeSync/resources.cpp8
-rw-r--r--RealtimeSync/resources.h6
-rw-r--r--RealtimeSync/trayMenu.cpp16
-rw-r--r--RealtimeSync/trayMenu.h6
-rw-r--r--RealtimeSync/watcher.cpp16
-rw-r--r--RealtimeSync/watcher.h6
-rw-r--r--RealtimeSync/xmlFreeFileSync.cpp8
-rw-r--r--RealtimeSync/xmlFreeFileSync.h6
-rw-r--r--RealtimeSync/xmlProcessing.cpp6
-rw-r--r--RealtimeSync/xmlProcessing.h6
-rw-r--r--algorithm.cpp117
-rw-r--r--algorithm.h6
-rw-r--r--comparison.cpp275
-rw-r--r--comparison.h14
-rw-r--r--fileHierarchy.cpp42
-rw-r--r--fileHierarchy.h27
-rw-r--r--library/CustomGrid.cpp294
-rw-r--r--library/CustomGrid.h11
-rw-r--r--library/Recycler_Vista/Recycler_Vista.vcproj (renamed from library/Recycler/Recycler_Vista.vcproj)0
-rw-r--r--library/Recycler_Vista/dllmain.cpp (renamed from library/Recycler/dllmain.cpp)7
-rw-r--r--library/Recycler_Vista/recycler.cpp (renamed from library/Recycler/recycler.cpp)6
-rw-r--r--library/Recycler_Vista/recycler.h (renamed from library/Recycler/recycler.h)6
-rw-r--r--library/ShadowCopy/dllmain.cpp7
-rw-r--r--library/ShadowCopy/shadow.cpp6
-rw-r--r--library/ShadowCopy/shadow.h6
-rw-r--r--library/binary.cpp122
-rw-r--r--library/binary.h28
-rw-r--r--library/detectRenaming.cpp6
-rw-r--r--library/detectRenaming.h6
-rw-r--r--library/errorLogging.cpp6
-rw-r--r--library/errorLogging.h16
-rw-r--r--library/filter.cpp6
-rw-r--r--library/filter.h6
-rw-r--r--library/iconBuffer.cpp171
-rw-r--r--library/iconBuffer.h30
-rw-r--r--library/multithreading.cpp6
-rw-r--r--library/multithreading.h6
-rw-r--r--library/pch.h10
-rw-r--r--library/processXml.cpp51
-rw-r--r--library/processXml.h40
-rw-r--r--library/resources.cpp8
-rw-r--r--library/resources.h6
-rw-r--r--library/statistics.cpp8
-rw-r--r--library/statistics.h6
-rw-r--r--library/statusHandler.cpp6
-rw-r--r--library/statusHandler.h6
-rw-r--r--shared/appMain.cpp6
-rw-r--r--shared/appMain.h6
-rw-r--r--shared/buildInfo.h6
-rw-r--r--shared/customButton.cpp8
-rw-r--r--shared/customButton.h12
-rw-r--r--shared/customComboBox.cpp6
-rw-r--r--shared/customComboBox.h8
-rw-r--r--shared/customTooltip.cpp8
-rw-r--r--shared/customTooltip.h6
-rw-r--r--shared/dllLoader.cpp6
-rw-r--r--shared/dllLoader.h6
-rw-r--r--shared/dragAndDrop.cpp33
-rw-r--r--shared/dragAndDrop.h6
-rw-r--r--shared/fileError.h6
-rw-r--r--shared/fileHandling.cpp303
-rw-r--r--shared/fileHandling.h17
-rw-r--r--shared/fileID.cpp24
-rw-r--r--shared/fileID.h6
-rw-r--r--shared/fileTraverser.cpp57
-rw-r--r--shared/fileTraverser.h28
-rw-r--r--shared/globalFunctions.cpp8
-rw-r--r--shared/globalFunctions.h6
-rw-r--r--shared/guid.cpp6
-rw-r--r--shared/guid.h6
-rw-r--r--shared/helpProvider.cpp44
-rw-r--r--shared/helpProvider.h17
-rw-r--r--shared/inotify/CHANGELOG3
-rw-r--r--shared/inotify/COPYING2
-rw-r--r--shared/inotify/LICENSE-X112
-rw-r--r--shared/inotify/README2
-rw-r--r--shared/inotify/VERSION1
-rw-r--r--shared/inotify/doc/html/annotated.html47
-rw-r--r--shared/inotify/doc/html/classInotify-members.html51
-rw-r--r--shared/inotify/doc/html/classInotify.html744
-rw-r--r--shared/inotify/doc/html/classInotifyEvent-members.html59
-rw-r--r--shared/inotify/doc/html/classInotifyEvent.html404
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.map4
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.pngbin0 -> 9618 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.pngbin0 -> 3331 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyEvent__coll__graph.map2
-rw-r--r--shared/inotify/doc/html/classInotifyEvent__coll__graph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyEvent__coll__graph.pngbin0 -> 4658 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.pngbin0 -> 3424 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.pngbin0 -> 3681 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyException-members.html45
-rw-r--r--shared/inotify/doc/html/classInotifyException.html101
-rw-r--r--shared/inotify/doc/html/classInotifyWatch-members.html55
-rw-r--r--shared/inotify/doc/html/classInotifyWatch.html349
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.map2
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.pngbin0 -> 3258 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.pngbin0 -> 3724 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.pngbin0 -> 3963 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyWatch__coll__graph.map1
-rw-r--r--shared/inotify/doc/html/classInotifyWatch__coll__graph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyWatch__coll__graph.pngbin0 -> 3053 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.map3
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.pngbin0 -> 7077 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.pngbin0 -> 2766 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.pngbin0 -> 2751 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.pngbin0 -> 2377 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.pngbin0 -> 2675 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.map3
-rw-r--r--shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.pngbin0 -> 9913 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.map3
-rw-r--r--shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.pngbin0 -> 10284 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.pngbin0 -> 2364 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.map2
-rw-r--r--shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.pngbin0 -> 3286 bytes
-rw-r--r--shared/inotify/doc/html/classes.html32
-rw-r--r--shared/inotify/doc/html/doxygen.css645
-rw-r--r--shared/inotify/doc/html/files.html45
-rw-r--r--shared/inotify/doc/html/functions.html161
-rw-r--r--shared/inotify/doc/html/functions_func.html124
-rw-r--r--shared/inotify/doc/html/functions_rela.html53
-rw-r--r--shared/inotify/doc/html/functions_vars.html80
-rw-r--r--shared/inotify/doc/html/globals.html55
-rw-r--r--shared/inotify/doc/html/globals_defs.html55
-rw-r--r--shared/inotify/doc/html/globals_enum.html55
-rw-r--r--shared/inotify/doc/html/globals_eval.html55
-rw-r--r--shared/inotify/doc/html/globals_type.html55
-rw-r--r--shared/inotify/doc/html/graph_legend.dot22
-rw-r--r--shared/inotify/doc/html/graph_legend.html84
-rw-r--r--shared/inotify/doc/html/graph_legend.pngbin0 -> 18687 bytes
-rw-r--r--shared/inotify/doc/html/index.html28
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8cpp.html67
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8cpp__incl.map1
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8cpp__incl.md51
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8cpp__incl.pngbin0 -> 23669 bytes
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h-source.html505
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h.html109
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h__dep__incl.map1
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h__dep__incl.md51
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h__dep__incl.pngbin0 -> 2602 bytes
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h__incl.map0
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h__incl.md51
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h__incl.pngbin0 -> 8941 bytes
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h_source.html503
-rw-r--r--shared/inotify/doc/html/tabs.css13
-rw-r--r--shared/inotify/doc/man/man3/Inotify.3376
-rw-r--r--shared/inotify/doc/man/man3/InotifyEvent.3172
-rw-r--r--shared/inotify/doc/man/man3/InotifyException.333
-rw-r--r--shared/inotify/doc/man/man3/InotifyWatch.3134
-rw-r--r--shared/inotify/doc/man/man3/inotify-cxx.cpp.318
-rw-r--r--shared/inotify/doc/man/man3/inotify-cxx.h.316
-rw-r--r--shared/inotify/inotify-cxx.cpp17
-rw-r--r--shared/inotify/inotify-cxx.h14
-rw-r--r--shared/localization.cpp47
-rw-r--r--shared/localization.h9
-rw-r--r--shared/loki/CHANGES446
-rw-r--r--shared/longPathPrefix.cpp46
-rw-r--r--shared/longPathPrefix.h9
-rw-r--r--shared/recycler.cpp102
-rw-r--r--shared/recycler.h37
-rw-r--r--shared/serialize.cpp6
-rw-r--r--shared/serialize.h6
-rw-r--r--shared/shadow.cpp10
-rw-r--r--shared/shadow.h6
-rw-r--r--shared/standardPaths.cpp93
-rw-r--r--shared/standardPaths.h18
-rw-r--r--shared/staticAssert.h6
-rw-r--r--shared/stringConv.h6
-rw-r--r--shared/systemConstants.h6
-rw-r--r--shared/systemFunctions.cpp8
-rw-r--r--shared/systemFunctions.h6
-rw-r--r--shared/toggleButton.cpp6
-rw-r--r--shared/toggleButton.h6
-rw-r--r--shared/xmlBase.cpp6
-rw-r--r--shared/xmlBase.h6
-rw-r--r--shared/zstring.cpp53
-rw-r--r--shared/zstring.h71
-rw-r--r--structures.cpp170
-rw-r--r--structures.h171
-rw-r--r--synchronization.cpp790
-rw-r--r--synchronization.h17
-rw-r--r--ui/MainDialog.cpp213
-rw-r--r--ui/MainDialog.h29
-rw-r--r--ui/SmallDialogs.cpp1009
-rw-r--r--ui/SmallDialogs.h368
-rw-r--r--ui/appMain.h20
-rw-r--r--ui/batchStatusHandler.cpp87
-rw-r--r--ui/batchStatusHandler.h10
-rw-r--r--ui/checkVersion.cpp17
-rw-r--r--ui/checkVersion.h6
-rw-r--r--ui/folderPair.h35
-rw-r--r--ui/gridView.cpp50
-rw-r--r--ui/gridView.h10
-rw-r--r--ui/guiGenerated.cpp391
-rw-r--r--ui/guiGenerated.h93
-rw-r--r--ui/guiStatusHandler.cpp125
-rw-r--r--ui/guiStatusHandler.h9
-rw-r--r--ui/messagePopup.cpp180
-rw-r--r--ui/messagePopup.h80
-rw-r--r--ui/mouseMoveWindow.cpp26
-rw-r--r--ui/mouseMoveWindow.h36
-rw-r--r--ui/progressIndicator.cpp773
-rw-r--r--ui/progressIndicator.h76
-rw-r--r--ui/search.cpp264
-rw-r--r--ui/search.h20
-rw-r--r--ui/settingsDialog.cpp105
-rw-r--r--ui/settingsDialog.h13
-rw-r--r--ui/sorting.h37
-rw-r--r--ui/trayIcon.cpp179
-rw-r--r--ui/trayIcon.h6
-rw-r--r--ui/util.cpp12
-rw-r--r--ui/util.h8
-rw-r--r--version/version.h8
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
index 139df0e1..1e1b085f 100644
--- a/BUILD/FreeFileSync.chm
+++ b/BUILD/FreeFileSync.chm
Binary files differ
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
new file mode 100644
index 00000000..3a7b7565
--- /dev/null
+++ b/BUILD/Help/html/advanced/069dee95-d329-4e99-ab3d-678edf80fbca.jpeg
Binary files differ
diff --git a/BUILD/Help/html/advanced/17e8fbfe-a994-4860-abaa-e00e0289b44c.jpeg b/BUILD/Help/html/advanced/17e8fbfe-a994-4860-abaa-e00e0289b44c.jpeg
new file mode 100644
index 00000000..78274f6d
--- /dev/null
+++ b/BUILD/Help/html/advanced/17e8fbfe-a994-4860-abaa-e00e0289b44c.jpeg
Binary files differ
diff --git a/BUILD/Help/html/advanced/7aa44556-38dc-467e-9902-2c9143cd0116.jpeg b/BUILD/Help/html/advanced/7aa44556-38dc-467e-9902-2c9143cd0116.jpeg
new file mode 100644
index 00000000..f158af02
--- /dev/null
+++ b/BUILD/Help/html/advanced/7aa44556-38dc-467e-9902-2c9143cd0116.jpeg
Binary files differ
diff --git a/BUILD/Help/html/advanced/93f0cb09-bd16-4d76-b764-e30042a8e123.jpeg b/BUILD/Help/html/advanced/93f0cb09-bd16-4d76-b764-e30042a8e123.jpeg
new file mode 100644
index 00000000..673b074c
--- /dev/null
+++ b/BUILD/Help/html/advanced/93f0cb09-bd16-4d76-b764-e30042a8e123.jpeg
Binary files differ
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&nbsp;&nbsp;&nbsp;</FONT>expands
+ <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">C:\Backup\%USERNAME%_Config&nbsp;</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&nbsp;&nbsp;&nbsp;</FONT>expands
+ <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">%APPDATA%\FreeFileSync&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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 &quot;C:\Program
files\FreeFileSync&quot;<BR>FreeFileSync.exe C:\SyncJob.ffs_batch
</FONT>(-&gt;<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 &quot;</FONT><FONT FACE="Courier New, monospace">instsrv.exe</FONT><FONT FACE="Tahoma, sans-serif">&quot;
+and &quot;</FONT><FONT FACE="Courier New, monospace">srvany.exe</FONT><FONT FACE="Tahoma, sans-serif">&quot;
+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&amp;displaylang=en">http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&amp;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 &lt;ServiceName&gt;
+ &lt;PathToResourceKit&gt;\srvany.exe</FONT></P>
+ </SPAN><BR CLEAR=LEFT>&nbsp;<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
+ &quot;</FONT><FONT FACE="Courier New, monospace">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\&lt;ServiceName&gt;</FONT><FONT FACE="Tahoma, sans-serif">&quot;</FONT></P>
+ <P STYLE="margin-bottom: 0cm"></P>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Add
+ a new key &quot;</FONT><FONT FACE="Courier New, monospace">Parameters</FONT><FONT FACE="Tahoma, sans-serif">&quot;.<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 &quot;</FONT><FONT FACE="Courier New, monospace">Application</FONT><FONT FACE="Tahoma, sans-serif">&quot;
+ 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 &lt;ServiceName&gt;</FONT></P>
+ </SPAN><BR CLEAR=LEFT>&nbsp;<BR><IMG SRC="17e8fbfe-a994-4860-abaa-e00e0289b44c.jpeg" NAME="Grafik5" ALIGN=BOTTOM WIDTH=640 HEIGHT=55 BORDER=0><BR>&nbsp;<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 &quot;automatic&quot; 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 &lt;ServiceName&gt; remove</FONT></P>
+ </SPAN><BR CLEAR=LEFT>&nbsp;<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
new file mode 100644
index 00000000..df346c8f
--- /dev/null
+++ b/BUILD/Help/html/advanced/RunAsService_html_4f230a46.jpg
Binary files differ
diff --git a/BUILD/Help/html/advanced/RunAsService_html_68e0fe53.jpg b/BUILD/Help/html/advanced/RunAsService_html_68e0fe53.jpg
new file mode 100644
index 00000000..9b0638ba
--- /dev/null
+++ b/BUILD/Help/html/advanced/RunAsService_html_68e0fe53.jpg
Binary files differ
diff --git a/BUILD/Help/html/advanced/RunAsService_html_m3be0f332.jpg b/BUILD/Help/html/advanced/RunAsService_html_m3be0f332.jpg
new file mode 100644
index 00000000..93e70d1b
--- /dev/null
+++ b/BUILD/Help/html/advanced/RunAsService_html_m3be0f332.jpg
Binary files differ
diff --git a/BUILD/Help/html/advanced/RunAsService_html_m3e56d901.jpg b/BUILD/Help/html/advanced/RunAsService_html_m3e56d901.jpg
new file mode 100644
index 00000000..e02d95d9
--- /dev/null
+++ b/BUILD/Help/html/advanced/RunAsService_html_m3e56d901.jpg
Binary files differ
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 &quot;<FONT FACE="Courier New, monospace">C:\SyncJob.ffs_
batch</FONT>&quot;.</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Make
- sure you enable checkbox &quot;<I>silent mode</I>&quot; to prevent
+ sure you enable checkbox &quot;<I>Silent mode</I>&quot; 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 &quot;<I>Error handling</I>&quot; to either &quot;<I>Exit
+ instantly</I>&quot; or &quot;<I>Ignore errors</I>&quot;.</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start
Windows Task Scheduler: Go to <I>Start-&gt;Control Panel-&gt;Scheduled
Tasks</I> and select &quot;<I>Add Scheduled Task</I>&quot;.</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 &quot;</FONT><FONT FACE="Tahoma, sans-serif"><I>Run:</I></FONT><FONT FACE="Tahoma, sans-serif">&quot;
- can be filled with the filename directly:<BR>&quot;</FONT><FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch</FONT><FONT FACE="Tahoma, sans-serif">&quot;<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>&quot;</FONT><FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch</FONT><FONT FACE="Tahoma, sans-serif">&quot;<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>
&quot;<FONT FACE="Tahoma, sans-serif"><I>Run:</I></FONT><FONT FACE="Tahoma, sans-serif">&quot;
has to be prefixed with the
executable:<BR>&quot;D</FONT><FONT FACE="Courier New, monospace">:\FreeFileSync\FreeFileSync.exe&quot;
- &quot;C:\SyncJob.ffs_batch</FONT><FONT FACE="Tahoma, sans-serif">&quot;<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
- &quot;<FONT FACE="Courier New, monospace">%appdata%\FreeFileSync</FONT>&quot;.
- So in former case make sure the working directory is filled
- appropriately in field &quot;<I>Start in:</I>&quot; to point to
- the directory containing respective GlobalSettings.xml.</FONT></P>
- </SPAN><BR CLEAR=LEFT>
- </P>
+ &quot;C:\SyncJob.ffs_batch</FONT><FONT FACE="Tahoma, sans-serif">&quot;<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
new file mode 100644
index 00000000..4cddbc19
--- /dev/null
+++ b/BUILD/Help/html/advanced/ScheduleBatch_html_372f0f3.gif
Binary files differ
diff --git a/BUILD/Help/html/advanced/ScheduleBatch_html_m10bf0d36.gif b/BUILD/Help/html/advanced/ScheduleBatch_html_m10bf0d36.gif
new file mode 100644
index 00000000..ed8f077f
--- /dev/null
+++ b/BUILD/Help/html/advanced/ScheduleBatch_html_m10bf0d36.gif
Binary files differ
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 &quot;<I>silent mode</I>&quot;.</FONT></P>
+ a FreeFileSync batch file using &quot;<I>Si</I><I>lent mode</I>&quot;.</FONT></P>
+ <P STYLE="margin-bottom: 0cm"></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Set
- error handling to &quot;<I>Exit with Returncode &lt; 0</I>&quot; or
- &quot;<I>ignore errors</I>&quot; to avoid having a popup stop the
- program flow. In case errors occur FreeFileSync will exit with a
- returncode &lt; 0 which can be checked via the ERRORLEVEL batch
- command.</FONT></P>
+ error handling to &quot;<I>Exit instantly</I>&quot; or &quot;<I>Ig</I><I>nore
+ errors</I>&quot; to avoid having a popup stop the program flow. In
+ case errors occur FreeFileSync will exit with a returncode &lt; 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. &quot;<FONT FACE="Courier New, monospace">E:\SyncDir</FONT>&quot;
-&gt; &quot;<FONT FACE="Courier New, monospace">\SyncDir</FONT>&quot;</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:
- &quot;<FONT FACE="Courier New, monospace">E:\settings.ffs_gui</FONT>&quot;</FONT></P>
- </OL>
-</UL>
-<UL>
- <OL>
+ &quot;</FONT><FONT COLOR="#000000"><FONT FACE="Courier New, monospace"><FONT SIZE=3>E:\settings.ffs_gui&quot;</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">&quot;Start
FreeFileSync by double-clicking on &quot;</FONT><FONT FACE="Courier New, monospace">E:\settings.ffs_gui</FONT><FONT FACE="Tahoma, sans-serif">&quot;<BR>=&gt;
Working directory automatically is set to &quot;</FONT><FONT FACE="Courier New, monospace">E:\</FONT><FONT FACE="Tahoma, sans-serif">&quot;
by the operating system so that &quot;</FONT><FONT FACE="Courier New, monospace">\SyncDir</FONT><FONT FACE="Tahoma, sans-serif">&quot;
diff --git a/BUILD/Help/html/advanced/bf02de4e-7b45-4353-97e8-85b55cff3ac5.jpeg b/BUILD/Help/html/advanced/bf02de4e-7b45-4353-97e8-85b55cff3ac5.jpeg
new file mode 100644
index 00000000..289665f6
--- /dev/null
+++ b/BUILD/Help/html/advanced/bf02de4e-7b45-4353-97e8-85b55cff3ac5.jpeg
Binary files differ
diff --git a/BUILD/Help/html/advanced/ce1ccceb-e3c6-4fab-adac-ef16f36698b0.jpeg b/BUILD/Help/html/advanced/ce1ccceb-e3c6-4fab-adac-ef16f36698b0.jpeg
new file mode 100644
index 00000000..2508296c
--- /dev/null
+++ b/BUILD/Help/html/advanced/ce1ccceb-e3c6-4fab-adac-ef16f36698b0.jpeg
Binary files differ
diff --git a/BUILD/Help/html/advanced/f1d462c4-3bd9-4463-a858-ae3de5f6af9e.jpeg b/BUILD/Help/html/advanced/f1d462c4-3bd9-4463-a858-ae3de5f6af9e.jpeg
new file mode 100644
index 00000000..00b66c40
--- /dev/null
+++ b/BUILD/Help/html/advanced/f1d462c4-3bd9-4463-a858-ae3de5f6af9e.jpeg
Binary files differ
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&lterar 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&para inställningar
+S&ave configuration...
+S&para 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
index ff81f194..cd781a2b 100644
--- a/BUILD/Resources.dat
+++ b/BUILD/Resources.dat
Binary files differ
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="&lt;{~None~}&gt;" />
</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="&lt;{~None~}&gt;" />
</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>
diff --git a/Makefile b/Makefile
index 71c01a52..9b26c764 100644
--- a/Makefile
+++ b/Makefile
@@ -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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;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 &amp;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 &amp;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 &amp;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 &amp;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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;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 &lt;<a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a>&gt;</code>
+<code>#include &lt;<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>&gt;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#bc1fd5830ca561efb69bcd2283981741">RemoveAll</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</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&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075">GetWatchCount</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#9bf5f7716649d5b5f468c2242fb5e099">GetEnabledCount</a> () const</td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063">GetEnabledCount</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the count of enabled watches. <a href="#9bf5f7716649d5b5f468c2242fb5e099"></a><br></td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</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">&nbsp;</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> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#a4d6b9d1a9a496862febbe5bffd798c2">FindWatch</a> (const std::string &amp;rPath)</td></tr>
<tr><td class="mdescLeft">&nbsp;</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&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9">GetDescriptor</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the file descriptor. <a href="#678271faf4799840ad71805163a24b13"></a><br></td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</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">&nbsp;</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&nbsp;</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">&nbsp;</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&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">m_fd</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</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>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">m_watches</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</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>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">m_paths</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#eee7847efd93b681fddac56860fc7958">m_buf</a> [INOTIFY_BUFLEN]</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</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&lt; <a class="el" href="classInotifyEvent.html">InotifyEvent</a> &gt;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">m_events</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</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 &amp; Destructor Documentation</h2>
+If the INOTIFY_THREAD_SAFE is defined this class is thread-safe. <hr><h2>Constructor &amp; 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>&nbsp;)&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;)&nbsp;</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 &amp;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> &amp;&nbsp;</td>
+ <td class="paramname"> <em>rWatch</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>rWatch</em>&nbsp;</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>&nbsp;</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> *&nbsp;</td>
<td class="paramname"> <em>pWatch</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</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>&nbsp;</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 &amp;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> &amp;&nbsp;</td>
- <td class="paramname"> <em>rWatch</em> </td>
+ <td class="paramname"> </td>
<td>&nbsp;)&nbsp;</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 &amp;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 &amp;&nbsp;</td>
+ <td class="paramname"> <em>rPath</em> </td>
+ <td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>rWatch</em>&nbsp;</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>&nbsp;</td><td>thrown if adding failed </td></tr>
+ <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>rPath</em>&nbsp;</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> *&nbsp;</td>
- <td class="paramname"> <em>pWatch</em> </td>
+ <td class="paramtype">int&nbsp;</td>
+ <td class="paramname"> <em>iDescriptor</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>pWatch</em>&nbsp;</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>&nbsp;</td><td>thrown if removing failed </td></tr>
+ <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>iDescriptor</em>&nbsp;</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 &amp;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> &amp;&nbsp;</td>
- <td class="paramname"> <em>rWatch</em> </td>
+ <td class="paramtype"><a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a>&nbsp;</td>
+ <td class="paramname"> <em>cap</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>rWatch</em>&nbsp;</td><td>inotify watch</td></tr>
+ <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>cap</em>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</td>
+ <td class="paramname"> <em>cap</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;)&nbsp;</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>&nbsp;)&nbsp;</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 &amp;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&nbsp;</td>
- <td class="paramname"> <em>fNoIntr</em> = <code>false</code> </td>
+ <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> &amp;&nbsp;</td>
+ <td class="paramname"> <em>rEvt</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>fNoIntr</em>&nbsp;</td><td>if true it re-calls the system call after a handled signal</td></tr>
+ <tr><td valign="top"><tt>[in,out]</tt>&nbsp;</td><td valign="top"><em>rEvt</em>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;)&nbsp;</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> *&nbsp;</td>
<td class="paramname"> <em>pEvt</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</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>&nbsp;</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 &amp;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> &amp;&nbsp;</td>
- <td class="paramname"> <em>rEvt</em> </td>
+ <td class="paramname"> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>rEvt</em>&nbsp;</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>&nbsp;</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> *&nbsp;</td>
- <td class="paramname"> <em>pEvt</em> </td>
+ <td class="paramname"> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>pEvt</em>&nbsp;</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>&nbsp;</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>&nbsp;</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 &amp;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> &amp;&nbsp;</td>
- <td class="paramname"> <em>rEvt</em> </td>
+ <td class="paramname"> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>rEvt</em>&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;</td>
- <td class="paramname"> <em>iDescriptor</em> </td>
+ <td class="paramname"> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>iDescriptor</em>&nbsp;</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>&nbsp;</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 &amp;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 &amp;&nbsp;</td>
- <td class="paramname"> <em>rPath</em> </td>
+ <td class="paramname"> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>rPath</em>&nbsp;</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 &amp;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> &amp;&nbsp;</td>
+ <td class="paramname"> <em>rEvt</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>rEvt</em>&nbsp;</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>&nbsp;</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&nbsp;</td>
- <td class="paramname"> <em>fNonBlock</em> </td>
+ <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> *&nbsp;</td>
+ <td class="paramname"> <em>pEvt</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>fNonBlock</em>&nbsp;</td><td>enable/disable non-blocking mode</td></tr>
+ <tr><td valign="top"><tt>[in,out]</tt>&nbsp;</td><td valign="top"><em>pEvt</em>&nbsp;</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>&nbsp;</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>&nbsp;</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 &amp;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&nbsp;</td>
- <td class="paramname"> <em>fClOnEx</em> </td>
+ <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> &amp;&nbsp;</td>
+ <td class="paramname"> <em>rWatch</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>fClOnEx</em>&nbsp;</td><td>enable/disable closing on exec</td></tr>
+ <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>rWatch</em>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</td>
- <td class="paramname"> <em>cap</em> </td>
+ <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> *&nbsp;</td>
+ <td class="paramname"> <em>pWatch</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>cap</em>&nbsp;</td><td>capability/limit identifier </td></tr>
+ <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>pWatch</em>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;)&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;</td>
+ <td class="paramname"> <em>fClOnEx</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>fClOnEx</em>&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;</td>
<td class="paramname"> <em>val</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;</td>
+ <td class="paramname"> <em>val</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>val</em>&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;</td>
<td class="paramname"> <em>val</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;</td>
+ <td class="paramname"> <em>fNonBlock</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>fNonBlock</em>&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;</td>
- <td class="paramname"> <em>val</em> </td>
+ <td class="paramtype">bool&nbsp;</td>
+ <td class="paramname"> <em>fNoIntr</em> = <code>false</code> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>val</em>&nbsp;</td><td>new value </td></tr>
+ <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>fNoIntr</em>&nbsp;</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>&nbsp;</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>&nbsp;</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&lt;<a class="el" href="classInotifyEvent.html">InotifyEvent</a>&gt; <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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;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 &amp;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 &amp;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 &amp;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 &amp;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 &amp;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 &amp;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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;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 &lt;<a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a>&gt;</code>
+<code>#include &lt;<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>&gt;</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">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888">~InotifyEvent</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor. <a href="#a48030da1d3a1b1741ca791c9e129888"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int32_t&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341">GetDescriptor</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#2aadeb49530a62b06d98e22c335b1ec8">GetMask</a> () const</td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f">GetMask</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</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&nbsp;</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">&nbsp;</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&nbsp;</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">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#441dfd50abda0e81eb7e4f6d33c68e96">GetCookie</a> () const</td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17">GetCookie</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#111954d74f0320745a68ef030064e987">GetLength</a> () const</td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a">GetLength</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</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 &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#a0524029d360591567c88595cb31df66">GetName</a> () const</td></tr>
+<tr><td class="mdescLeft">&nbsp;</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 &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097">GetName</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#e053c52feebf6dae5a762e6baeba93db">GetName</a> (std::string &amp;rName) const</td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f">GetName</a> (std::string &amp;rName) const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Extracts the event name. <a href="#e053c52feebf6dae5a762e6baeba93db"></a><br></td></tr>
+<tr><td class="mdescLeft">&nbsp;</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> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">GetWatch</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#517abc6bd54c57cb767107187ea6a8fd">DumpTypes</a> (std::string &amp;rStr) const</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea">DumpTypes</a> (std::string &amp;rStr) const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</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">&nbsp;</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&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5">DumpTypes</a> (uint32_t uValue, std::string &amp;rStr)</td></tr>
<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">m_uMask</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">mask <a href="#739a943357af0c3fafd58466803e04fa"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">m_uCookie</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">cookie <a href="#bf417d466fb0173d337cc66539ee55af"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">std::string&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">m_name</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</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> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">m_pWatch</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</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 &amp; 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 &amp; 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>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>pEvt</em>&nbsp;</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>&nbsp;)&nbsp;</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 &amp;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>&nbsp;)&nbsp;</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 &amp;&nbsp;</td>
+ <td class="paramname"> <em>rStr</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>rStr</em>&nbsp;</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 &amp;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&nbsp;</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&nbsp;</td>
- <td class="paramname"> <em>uType</em></td><td>&nbsp;</td>
+ <td class="paramtype">std::string &amp;&nbsp;</td>
+ <td class="paramname"> <em>rStr</em></td><td>&nbsp;</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>&nbsp;</td><td valign="top"><em>uValue</em>&nbsp;</td><td>checked value </td></tr>
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>uType</em>&nbsp;</td><td>type which is checked for </td></tr>
+ <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>uValue</em>&nbsp;</td><td>event mask value </td></tr>
+ <tr><td valign="top"><tt>[out]</tt>&nbsp;</td><td valign="top"><em>rStr</em>&nbsp;</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&nbsp;</td>
- <td class="paramname"> <em>uType</em> </td>
+ <td class="paramname"> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>uType</em>&nbsp;</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>&nbsp;)&nbsp;</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>&nbsp;)&nbsp;</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&amp; InotifyEvent::GetName </td>
+ <td class="memname">uint32_t InotifyEvent::GetMask </td>
<td>(</td>
<td class="paramname"> </td>
<td>&nbsp;)&nbsp;</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 &amp;rName) const" -->
+<a class="anchor" name="eced3a88a6dea190c5df19c2a6599010"></a><!-- doxytag: member="InotifyEvent::GetMaskByName" ref="eced3a88a6dea190c5df19c2a6599010" args="(const std::string &amp;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 &amp;&nbsp;</td>
+ <td class="paramname"> <em>rName</em> </td>
+ <td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>rName</em>&nbsp;</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 &amp;rName) const " -->
<div class="memitem">
<div class="memproto">
<table class="memname">
@@ -347,7 +394,7 @@ Returns the event name.
<td class="paramtype">std::string &amp;&nbsp;</td>
<td class="paramname"> <em>rName</em> </td>
<td>&nbsp;)&nbsp;</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&amp; InotifyEvent::GetName </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</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>&nbsp;)&nbsp;</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 &amp;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 &amp;&nbsp;</td>
- <td class="paramname"> <em>rName</em> </td>
+ <td class="paramtype">uint32_t&nbsp;</td>
+ <td class="paramname"> <em>uType</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>rName</em>&nbsp;</td><td>mask name </td></tr>
+ <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>uType</em>&nbsp;</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 &amp;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&nbsp;</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 &amp;&nbsp;</td>
- <td class="paramname"> <em>rStr</em></td><td>&nbsp;</td>
+ <td class="paramtype">uint32_t&nbsp;</td>
+ <td class="paramname"> <em>uType</em></td><td>&nbsp;</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>&nbsp;</td><td valign="top"><em>uValue</em>&nbsp;</td><td>event mask value </td></tr>
- <tr><td valign="top"><tt>[out]</tt>&nbsp;</td><td valign="top"><em>rStr</em>&nbsp;</td><td>dumped event types </td></tr>
+ <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>uValue</em>&nbsp;</td><td>checked value </td></tr>
+ <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>uType</em>&nbsp;</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 &amp;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 &amp;&nbsp;</td>
- <td class="paramname"> <em>rStr</em> </td>
- <td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>rStr</em>&nbsp;</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&nbsp;
-<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
new file mode 100644
index 00000000..72a734da
--- /dev/null
+++ b/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..66409056
--- /dev/null
+++ b/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..8c7ee763
--- /dev/null
+++ b/shared/inotify/doc/html/classInotifyEvent__coll__graph.png
Binary files differ
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
new file mode 100644
index 00000000..85b50381
--- /dev/null
+++ b/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..6ede661d
--- /dev/null
+++ b/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.png
Binary files differ
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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;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 &amp;rMsg=&quot;&quot;, 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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;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 &lt;<a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a>&gt;</code>
+<code>#include &lt;<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>&gt;</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">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb">InotifyException</a> (const std::string &amp;rMsg=&quot;&quot;, int iErr=0, void *pSrc=NULL)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructor. <a href="#900dc29e5cfb3ece6c1651d04773b2bb"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">const std::string &amp;&nbsp;</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 &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#6364ea375697356805d47cff957dd757">GetMessage</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#3fda7827f1561f610e40bcd217bdc6fe">GetErrorNumber</a> () const</td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d">GetErrorNumber</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</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 *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#568200b75da77cc24927922760b3a5d3">GetSource</a> () const</td></tr>
+<tr><td class="mdescLeft">&nbsp;</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 *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408">GetSource</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the exception source. <a href="#568200b75da77cc24927922760b3a5d3"></a><br></td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</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 &amp; Destructor Documentation</h2>
+Although this class is basically thread-safe it is not intended to be shared between threads. <hr><h2>Constructor &amp; Destructor Documentation</h2>
<a class="anchor" name="900dc29e5cfb3ece6c1651d04773b2bb"></a><!-- doxytag: member="InotifyException::InotifyException" ref="900dc29e5cfb3ece6c1651d04773b2bb" args="(const std::string &amp;rMsg=&quot;&quot;, 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&amp; InotifyException::GetMessage </td>
+ <td class="memname">int InotifyException::GetErrorNumber </td>
<td>(</td>
<td class="paramname"> </td>
<td>&nbsp;)&nbsp;</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&amp; InotifyException::GetMessage </td>
<td>(</td>
<td class="paramname"> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;)&nbsp;</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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;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 &amp;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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;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 &lt;<a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a>&gt;</code>
+<code>#include &lt;<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>&gt;</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">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">~InotifyWatch</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor. <a href="#871c16b01aa8841b36246e5b629ecaef"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int32_t&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59">GetDescriptor</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</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 &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#89f897a4d98fa54de27730dd8be67966">GetPath</a> () const</td></tr>
+<tr><td class="mdescLeft">&nbsp;</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 &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2">GetPath</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#bab761a989c9fdf73aaad2a58e1ba7a0">GetMask</a> () const</td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009">GetMask</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the watch event mask. <a href="#bab761a989c9fdf73aaad2a58e1ba7a0"></a><br></td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</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">&nbsp;</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&nbsp;</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">&nbsp;</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&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324">IsEnabled</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55">IsRecursive</a> () const </td></tr>
-<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#1c8ab316b54cb7d1d0b17cbbe6b7d2f8">IsRecursive</a> () const</td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#804cdc1e9579a075a60c239b202559f4">__Disable</a> ()</td></tr>
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Checks whether the watch is recursive. <a href="#1c8ab316b54cb7d1d0b17cbbe6b7d2f8"></a><br></td></tr>
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">m_path</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">m_uMask</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">event mask <a href="#f725ea61e3252adae6153ecb80de23a8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">m_wd</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</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> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">m_pInotify</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">inotify object <a href="#ea695aa11f6105184df1ef265be3f1b9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">m_fEnabled</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</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&nbsp;</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 &amp; Destructor Documentation</h2>
+If the INOTIFY_THREAD_SAFE is defined this class is thread-safe. <hr><h2>Constructor &amp; Destructor Documentation</h2>
<a class="anchor" name="c9c02f1dbd143eebd711eba03ac366e9"></a><!-- doxytag: member="InotifyWatch::InotifyWatch" ref="c9c02f1dbd143eebd711eba03ac366e9" args="(const std::string &amp;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>&nbsp;)&nbsp;</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>&nbsp;)&nbsp;</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>&nbsp;)&nbsp;</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&amp; InotifyWatch::GetPath </td>
+ <td class="memname"><a class="el" href="classInotify.html">Inotify</a>* InotifyWatch::GetInotify </td>
<td>(</td>
<td class="paramname"> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;)&nbsp;</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&amp; InotifyWatch::GetPath </td>
<td>(</td>
- <td class="paramtype">uint32_t&nbsp;</td>
- <td class="paramname"> <em>uMask</em> </td>
+ <td class="paramname"> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>uMask</em>&nbsp;</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>&nbsp;</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>&nbsp;)&nbsp;</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>&nbsp;)&nbsp;</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&nbsp;</td>
<td class="paramname"> <em>fEnabled</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;</td>
+ <td class="paramname"> <em>uMask</em> </td>
<td>&nbsp;)&nbsp;</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>&nbsp;</td><td valign="top"><em>uMask</em>&nbsp;</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>&nbsp;</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>&nbsp;)&nbsp;</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&nbsp;
-<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
new file mode 100644
index 00000000..a8cfc58a
--- /dev/null
+++ b/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..9adcc985
--- /dev/null
+++ b/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..5e7dd132
--- /dev/null
+++ b/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..b2a5567f
--- /dev/null
+++ b/shared/inotify/doc/html/classInotifyWatch__coll__graph.png
Binary files differ
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
new file mode 100644
index 00000000..104b6dbb
--- /dev/null
+++ b/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..368ea909
--- /dev/null
+++ b/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..0c72efe9
--- /dev/null
+++ b/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..65078cda
--- /dev/null
+++ b/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..fd43491a
--- /dev/null
+++ b/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..5102409d
--- /dev/null
+++ b/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..a58ed2be
--- /dev/null
+++ b/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..83f1c6d4
--- /dev/null
+++ b/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.png
Binary files differ
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
new file mode 100644
index 00000000..edba755d
--- /dev/null
+++ b/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.png
Binary files differ
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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;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">&nbsp;&nbsp;I&nbsp;&nbsp;</div></td></tr></table>
+</td><td><a class="el" href="classInotify.html">Inotify</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classInotifyException.html">InotifyException</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a>&nbsp;&nbsp;&nbsp;</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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="globals.html"><span>File&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="globals.html"><span>File&nbsp;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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li id="current"><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li id="current"><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&nbsp;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&nbsp;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">
&nbsp;
<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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li id="current"><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&nbsp;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&nbsp;Functions</span></a></li>
+ </ul>
+ </div>
</div>
+<div class="contents">
&nbsp;
<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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li id="current"><a href="functions.html"><span>Class&nbsp;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&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&nbsp;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&nbsp;Functions</span></a></li>
+ </ul>
+ </div>
</div>
+<div class="contents">
&nbsp;
<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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li id="current"><a href="globals.html"><span>File&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&nbsp;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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li id="current"><a href="globals.html"><span>File&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&nbsp;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">
&nbsp;
<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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li id="current"><a href="globals.html"><span>File&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&nbsp;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">
&nbsp;
<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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li id="current"><a href="globals.html"><span>File&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&nbsp;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">
&nbsp;
<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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li id="current"><a href="globals.html"><span>File&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&nbsp;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">
&nbsp;
<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&nbsp;
-<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&nbsp;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>&lt;<span class="keyword">class</span> T&gt; <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&lt;int&gt;
+{
+ <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
new file mode 100644
index 00000000..67057ca1
--- /dev/null
+++ b/shared/inotify/doc/html/graph_legend.png
Binary files differ
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&nbsp;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&nbsp;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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="globals.html"><span>File&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="globals.html"><span>File&nbsp;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 &lt;errno.h&gt;</code><br>
<code>#include &lt;unistd.h&gt;</code><br>
<code>#include &lt;fcntl.h&gt;</code><br>
-<code>#include &quot;<a class="el" href="inotify-cxx_8h-source.html">inotify-cxx.h</a>&quot;</code><br>
+<code>#include &lt;fstream&gt;</code><br>
+<code>#include &lt;sys/syscall.h&gt;</code><br>
+<code>#include &lt;sys/inotify-syscalls.h&gt;</code><br>
+<code>#include &quot;<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>&quot;</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">&nbsp;</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 &lt;<a href="mailto:lukas@aiken.cz">lukas@aiken.cz</a>&gt;<p>
+Copyright (C) 2006, 2007, 2009 Lukas Jelinek &lt;<a href="mailto:lukas@aiken.cz">lukas@aiken.cz</a>&gt;<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&#45;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&#45;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&nbsp;
-<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
new file mode 100644
index 00000000..ce7631c7
--- /dev/null
+++ b/shared/inotify/doc/html/inotify-cxx_8cpp__incl.png
Binary files differ
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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="globals.html"><span>File&nbsp;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 &lt;stdint.h&gt;</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;string&gt;</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include &lt;deque&gt;</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include &lt;map&gt;</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 &lt;sys/syscall.h&gt;</span>
-<a name="l00036"></a>00036 <span class="preprocessor">#include &lt;sys/inotify.h&gt;</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 &lt;sys/inotify-syscalls.h&gt;</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 &lt;pthread.h&gt;</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(&amp;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(&amp;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(&amp;__m_lock, &amp;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(&amp;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(&amp;__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(&amp;__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(&amp;__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(&amp;__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(&amp;__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&amp; 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&amp; <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-&gt;mask;
-<a name="l00249"></a>00249 m_uCookie = (uint32_t) pEvt-&gt;cookie;
-<a name="l00250"></a>00250 <span class="keywordflow">if</span> (pEvt-&gt;name != NULL) {
-<a name="l00251"></a>00251 m_name = pEvt-&gt;len &gt; 0
-<a name="l00252"></a>00252 ? pEvt-&gt;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 &amp; uType) != 0) &amp;&amp; ((~uValue &amp; 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&amp; <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&amp; 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&amp; 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&amp; 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&amp; 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&amp; 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&amp; <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&lt;int32_t, InotifyWatch*&gt; <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&lt;std::string, InotifyWatch*&gt; <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>&amp; 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>(&amp;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>&amp; 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>(&amp;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>&amp; 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>(&amp;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>&amp; 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>(&amp;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&amp; 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&lt;InotifyEvent&gt; 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&nbsp;
-<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&nbsp;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&nbsp;List</span></a></li>
- <li><a href="globals.html"><span>File&nbsp;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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="globals.html"><span>File&nbsp;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 &lt;stdint.h&gt;</code><br>
<code>#include &lt;string&gt;</code><br>
<code>#include &lt;deque&gt;</code><br>
<code>#include &lt;map&gt;</code><br>
-<code>#include &lt;sys/syscall.h&gt;</code><br>
<code>#include &lt;sys/inotify.h&gt;</code><br>
-<code>#include &lt;sys/inotify-syscalls.h&gt;</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 &nbsp;</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&nbsp;</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&lt; int32_t,<br>
- <a class="el" href="classInotifyWatch.html">InotifyWatch</a> * &gt;&nbsp;</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&lt; int32_t, <br class="typebreak">
+<a class="el" href="classInotifyWatch.html">InotifyWatch</a> * &gt;&nbsp;</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">&nbsp;</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&lt; std::string,<br>
- <a class="el" href="classInotifyWatch.html">InotifyWatch</a> * &gt;&nbsp;</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&lt; std::string, <br class="typebreak">
+<a class="el" href="classInotifyWatch.html">InotifyWatch</a> * &gt;&nbsp;</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">&nbsp;</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">&nbsp;</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, &lt;<a href="mailto:lukas@aiken.cz">lukas@aiken.cz</a>&gt;<p>
+Copyright (C) 2006, 2007, 2009 Lukas Jelinek, &lt;<a href="mailto:lukas@aiken.cz">lukas@aiken.cz</a>&gt;<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&#45;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&nbsp;</td>
<td class="paramname"> </td>
<td>&nbsp;)&nbsp;</td>
- <td width="100%">&nbsp;&nbsp;&nbsp;(std::string(__PRETTY_FUNCTION__) + &quot;: &quot; + msg)</td>
+ <td>&nbsp;&nbsp;&nbsp;(std::string(__PRETTY_FUNCTION__) + &quot;: &quot; + 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&#45;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&#45;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&#45;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&#45;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&#45;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&#45;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&#45;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&#45;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&#45;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&#45;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&#45;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&#45;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&#45;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&#45;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&nbsp;
-<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
new file mode 100644
index 00000000..85d373cf
--- /dev/null
+++ b/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.png
Binary files differ
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
new file mode 100644
index 00000000..ae9be329
--- /dev/null
+++ b/shared/inotify/doc/html/inotify-cxx_8h__incl.png
Binary files differ
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&nbsp;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&nbsp;List</span></a></li>
+ <li><a href="globals.html"><span>File&nbsp;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 &lt;stdint.h&gt;</span>
+<a name="l00033"></a>00033 <span class="preprocessor">#include &lt;string&gt;</span>
+<a name="l00034"></a>00034 <span class="preprocessor">#include &lt;deque&gt;</span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;map&gt;</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 &lt;sys/inotify.h&gt;</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 &lt;pthread.h&gt;</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(&amp;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(&amp;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(&amp;__m_lock, &amp;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(&amp;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(&amp;__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(&amp;__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(&amp;__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(&amp;__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(&amp;__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&amp; 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&amp; <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-&gt;mask;
+<a name="l00247"></a>00247 <a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af" title="cookie">m_uCookie</a> = (uint32_t) pEvt-&gt;cookie;
+<a name="l00248"></a>00248 <span class="keywordflow">if</span> (pEvt-&gt;name != NULL) {
+<a name="l00249"></a>00249 <a class="code" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604" title="name">m_name</a> = pEvt-&gt;len &gt; 0
+<a name="l00250"></a>00250 ? pEvt-&gt;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 &amp; uType) != 0) &amp;&amp; ((~uValue &amp; 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&amp; <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&amp; 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&amp; 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&amp; 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&amp; 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&amp; 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&amp; <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&lt;int32_t, InotifyWatch*&gt; <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&lt;std::string, InotifyWatch*&gt; <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>&amp; 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>(&amp;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>&amp; 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>(&amp;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>&amp; 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>(&amp;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>&amp; 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>(&amp;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&amp; 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&lt;InotifyEvent&gt; <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;
diff --git a/ui/util.h b/ui/util.h
index df723fbb..de986554 100644
--- a/ui/util.h
+++ b/ui/util.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 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!
}
bgstack15